diff --git a/.github/workflows/appimage.yml b/.github/workflows/appimage.yml index 5f447fe8a..787b2822c 100644 --- a/.github/workflows/appimage.yml +++ b/.github/workflows/appimage.yml @@ -15,7 +15,7 @@ on: workflow_dispatch: env: - publish_pre_dev_labels: '["Beep6581:wbrefinement"]' + publish_pre_dev_labels: '[]' jobs: build: @@ -26,7 +26,7 @@ jobs: build_type: [release, debug] steps: - name: Checkout source - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 @@ -35,11 +35,24 @@ jobs: 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 libexpat1-dev libbrotli-dev zlib1g-dev libinih-dev + 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 libexpat1-dev libbrotli-dev zlib1g-dev libinih-dev adwaita-icon-theme-full gettext libarchive-tools zstd libgif-dev libwebp-dev libwebpdemux2 + + - name: Install makedeb + run: | + echo "Installing makedeb..." + curl -Ss -qgb "" -fLC - --retry 3 --retry-delay 3 -o makedeb.deb \ + "https://github.com/makedeb/makedeb/releases/download/v16.1.0-beta1/makedeb-beta_16.1.0-beta1_amd64_focal.deb" + DEBIAN_FRONTEND=noninteractive sudo dpkg -i makedeb.deb + + - name: Install libjxl + working-directory: tools/makedeb + run: | + echo "Building and installing libjxl..." + makedeb -si --no-confirm -p PKGBUILD.libjxl - name: Install Exiv2 run: | - EXIV2_VERSION='v0.28.1' + EXIV2_VERSION='v0.28.3' echo "Cloning Exiv2 $EXIV2_VERSION." git clone --depth 1 --branch "$EXIV2_VERSION" https://github.com/Exiv2/exiv2.git ext/exiv2 @@ -51,6 +64,26 @@ jobs: echo "Building and installing." sudo make -j$(nproc) install + - name: Install Librsvg required min. version + # Required min. version is not available for Ubuntu 20.04 LTS (but is for 22.04 LTS) so needs to be built manually + run: | + LIBRSVG2_VERSION='2.52.2' + echo "Cloning Librsvg2 $LIBRSVG2_VERSION." + git clone --depth 1 --branch "$LIBRSVG2_VERSION" https://gitlab.gnome.org/GNOME/librsvg.git ext/librsvg2 + + echo "Installing required dependencies with apt." + DEBIAN_FRONTEND=noninteractive sudo apt install -y rustc cargo gtk-doc-tools libgirepository1.0-dev + + echo "Updating PATH." + export PATH="$PATH:/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0" + + echo "Configuring build." + cd ext/librsvg2 + sh autogen.sh + + echo "Building and installing." + sudo make install + - name: Configure build run: | export REF_NAME_FILTERED="$(echo '${{github.ref_name}}' | sed 's/[^A-z0-9_.-]//g')" @@ -107,9 +140,30 @@ jobs: echo "Copying Lensfun database to the build directory." cp -R ~/.local/share/lensfun/updates/* build/AppDir/usr/share/lensfun/ + - name: Include Adwaita icon theme (partial) + run: | + mkdir build/AppDir/usr/bin/icons/Adwaita + icons_dir=('actions' 'devices' 'mimetypes' 'places' 'status' 'ui' 'devices') + for dir in "${icons_dir[@]}"; do + find_res=$(find /usr/share/icons/Adwaita -name "${dir}" -type d) + if [ -z "$find_res" ] + then + echo "-Warning: Icons folder '"${dir}"' not found in Adwaita theme." + else + new_dir=($(echo "$find_res" | awk -F/ '{print $(NF-1)"/"$NF}')) + for d in "${new_dir[@]}"; do + echo "-Copying '"${d}"' into 'AppDir/usr/bin/icons/Adwaita'." + mkdir -p "build/AppDir/usr/bin/icons/Adwaita/${d}" + cp -R "/usr/share/icons/Adwaita/${d}/." "build/AppDir/usr/bin/icons/Adwaita/${d}" + done + fi + done + echo "-Copying 'index.theme' into 'AppDir/usr/bin/icons/Adwaita'." + cp /usr/share/icons/Adwaita/index.theme build/AppDir/usr/bin/icons/Adwaita + - name: Restore AppImage tools from cache id: appimage-tools-cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: key: appimage-tools-1 path: | @@ -162,7 +216,7 @@ jobs: echo "ARTIFACT_NAME=$ARTIFACT_NAME" >> $GITHUB_ENV - name: Upload artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{env.ARTIFACT_NAME}}.AppImage path: ${{github.workspace}}/build/${{env.ARTIFACT_NAME}}.AppImage @@ -184,7 +238,7 @@ jobs: echo "PUBLISH_NAME=$PUBLISH_NAME" >> $GITHUB_ENV - name: Publish artifacts - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 if: ${{github.ref_type == 'tag' || github.ref_name == 'dev'}} with: tag_name: nightly-github-actions @@ -214,10 +268,11 @@ jobs: echo "PUBLISH_NAME=$PUBLISH_NAME" >> $GITHUB_ENV - name: Publish pre-dev artifacts - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 if: ${{steps.prepare-publish-pre-dev.outcome == 'success'}} with: tag_name: pre-dev-github-actions + repository: Beep6581/RawTherapee files: | ${{env.PUBLISH_NAME}}.AppImage ${{env.PUBLISH_NAME}}-AppImage-AboutThisBuild.txt diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index f57786098..38b66cb96 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -32,7 +32,7 @@ jobs: steps: - name: Checkout source - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: fetch-depth: 0 @@ -41,7 +41,17 @@ jobs: 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 libexiv2-dev + 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 libexiv2-dev libtcmalloc-minimal4 libhwy0 libhwy-dev + + - name: Install libjxl + run: | + echo "Downloading and installing libjxl..." + VERSION_UBUNTU=22.04 + VERSION_JXL=0.10.3 + curl -Ss -qgb "" -fLC - --retry 3 --retry-delay 3 -o libjxl-debs.tar.gz \ + "https://github.com/libjxl/libjxl/releases/download/v${VERSION_JXL}/jxl-debs-amd64-ubuntu-${VERSION_UBUNTU}-v${VERSION_JXL}.tar.gz" + tar xf libjxl-debs.tar.gz + DEBIAN_FRONTEND=noninteractive sudo dpkg -i jxl_${VERSION_JXL}_amd64.deb libjxl-dev_${VERSION_JXL}_amd64.deb libjxl_${VERSION_JXL}_amd64.deb - name: Configure build run: | @@ -77,7 +87,7 @@ jobs: echo "REF_NAME_FILTERED=$REF_NAME_FILTERED" >> $GITHUB_ENV - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} @@ -90,6 +100,6 @@ jobs: mv AppDir/usr/bin/share AppDir/usr/ - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 8755f7c66..6f601d4e8 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -18,42 +18,46 @@ jobs: build: runs-on: macos-12 steps: - - uses: actions/checkout@v3 + - name: Checkout Repository + uses: actions/checkout@v4 + with: + fetch-tags: '0' + fetch-depth: '0' - 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 exiv2 | tee -a depslog + brew install imagemagick create-dmg libtiff gtk+3 gtkmm3 gtk-mac-integration adwaita-icon-theme libsigc++@2 little-cms2 libiptcdata fftw lensfun expat pkgconfig llvm shared-mime-info exiv2 jpeg-xl libomp automake libtool | 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"' + zsh -c 'echo "Completed installation of dependencies in $(printf "%0.2f" $(($[$(date +%s)-$(cat build/stamp)]/$((60.))))) minutes"' >> $GITHUB_STEP_SUMMARY - name: Configure build system env: + IDENT: '-' 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 + -arch x86_64 -mtune=generic -Xpreprocessor -fopenmp /usr/local/opt/libomp/lib/libomp.dylib -I/usr/local/opt/libomp/include -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 RAW_THERAPEE_VERSION=$(git describe --tags | cut -f1,2 -d'.') 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}" \ + -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/libomp/lib -L/usr/local/opt/expat/lib" \ + -DCACHE_NAME_SUFFIX="${RAW_THERAPEE_VERSION}-${REF}" \ -DPROC_TARGET_NUMBER="1" \ -DPROC_LABEL="generic processor" \ -DCMAKE_OSX_ARCHITECTURES=$(uname -m) \ - -DWITH_LTO="OFF" \ + -DWITH_LTO="ON" \ -DLENSFUNDBDIR="/Applications/RawTherapee.app/Contents/Resources/share/lensfun" \ -DCMAKE_C_COMPILER=clang \ -DCMAKE_CXX_COMPILER=clang++ \ @@ -63,33 +67,35 @@ jobs: -DOpenMP_CXX_FLAGS="${C_FLAGS}" \ -DOpenMP_C_LIB_NAMES=libomp \ -DOpenMP_CXX_LIB_NAMES=libomp \ - -DOpenMP_libomp_LIBRARY=/usr/local/lib/libomp.dylib \ + -DOpenMP_libomp_LIBRARY=/usr/local/opt/libomp/lib/libomp.dylib \ -DCMAKE_AR=/usr/bin/ar \ -DCMAKE_RANLIB=/usr/bin/ranlib \ - -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 \ - -DOSX_CONTINUOUS=ON \ + -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 \ + -DCONTINUOUS=ON \ + -DCODESIGNID:STRING="$IDENT" \ + -DFANCY_DMG="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"' + zsh -c 'echo "Configured in $(printf "%0.2f" $(($[$(date +%s)-$(cat configstamp)]/$((60.))))) minutes"' >> $GITHUB_STEP_SUMMARY - 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"' + zsh -c 'echo "Compiled in $(printf "%0.2f" $(($[$(date +%s)-$(cat compilestamp)]/$((60.))))) minutes"' >> $GITHUB_STEP_SUMMARY - 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 + echo "Automated Build! WARNING:\nNot intended for end-user testing." > message + export REF=${GITHUB_REF##*/} && 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"' + zsh -c 'echo "Bundled in $(printf "%0.2f" $(($[$(date +%s)-$(cat bundlestamp)]/$((60.))))) minutes"' >> $GITHUB_STEP_SUMMARY printf '%s\n' \ "REF: ${REF}" \ "ARTIFACT: ${ARTIFACT}" \ @@ -97,17 +103,153 @@ jobs: "ARTIFACT_FILE: ${ARTIFACT_FILE}" \ "PUBLISH_NAME: ${PUBLISH_NAME}" exit - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 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"' + zsh -c 'echo "Build completed in $(printf "%0.2f" $(($[$(date +%s)-$(cat build/stamp)]/$((60.))))) minutes"' >> $GITHUB_STEP_SUMMARY + + - name: Test-launch the app + run: | + cd build + sudo cp -R RawTherapee.app /Applications + open -a /Applications/RawTherapee.app + sleep 5 + echo "Applications running: $(osascript -e 'tell application "Finder" to get the name of every process whose visible is true')" >> $GITHUB_STEP_SUMMARY + osascript -e 'if application "RawTherapee" is not running then do shell script "exit 1"' + osascript -e 'tell application "RawTherapee" to if it is running then quit' + + - name: Test the -cli + run: | + cd build + echo "$(RawTherapee*folder/rawtherapee-cli --version)" >> $GITHUB_STEP_SUMMARY - name: Publish artifacts - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 + if: ${{github.ref_type == 'tag' || github.ref_name == 'dev'}} + with: + tag_name: nightly-github-actions + files: | + ${{env.ARTIFACT_PATH}} + + + armbuild: + runs-on: macos-14 + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-tags: '0' + fetch-depth: '0' + - name: Install dependencies + run: | + date -u + mkdir build + date +%s > build/stamp + brew uninstall --ignore-dependencies libtiff + brew install imagemagick create-dmg libtiff gtk+3 gtkmm3 gtk-mac-integration adwaita-icon-theme libsigc++@2 little-cms2 libiptcdata fftw lensfun expat pkgconfig llvm shared-mime-info exiv2 jpeg-xl libomp automake libtool | 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"' >> $GITHUB_STEP_SUMMARY + - name: Configure build system + env: + IDENT: '-' + CMAKE_CXX_STANDARD: 11 + PKG_CONFIG_PATH: /opt/homebrew/opt/libtiff/lib/pkgconfig:opt/homebrew/opt/libffi/lib/pkgconfig:/ope/homebrew/opt/expat/lib/pkgconfig + C_FLAGS: > + -arch arm64 -Xpreprocessor -fopenmp /opt/homebrew/opt/libomp/lib/libomp.dylib -I/opt/homebrew/opt/libomp/include -I/opt/homebrew/include -I/opt/homebrew/opt/gdk-pixbuf/include -I/opt/homebrew/opt/libiconv/include -I/opt/homebrew/opt/libxml2/include -I/opt/homebrew/opt/expat/include -I/opt/homebrew/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 RAW_THERAPEE_VERSION=$(git describe --tags | cut -f1,2 -d'.') + 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/opt/homebrew/lib -Wl,-rpath -Wl,/opt/homebrew/lib -L/opt/homebrew/opt/gdk-pixbuf/lib -L/opt/homebrew/opt/libomp/lib -L/opt/homebrew/opt/expat/lib" \ + -DCACHE_NAME_SUFFIX="${RAW_THERAPEE_VERSION}-${REF}" \ + -DCMAKE_OSX_ARCHITECTURES=arm64 \ + -DWITH_LTO="ON" \ + -DLENSFUNDBDIR="/Applications/RawTherapee.app/Contents/Resources/share/lensfun" \ + -DCMAKE_C_COMPILER=clang \ + -DCMAKE_CXX_COMPILER=clang++ \ + -DCMAKE_C_FLAGS="-arch arm64 -Wno-pass-failed -Wno-deprecated-register -Wno-unused-command-line-argument" \ + -DCMAKE_CXX_FLAGS="-arch arm64 -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=/opt/homebrew/opt/libomp/lib/libomp.dylib \ + -DCMAKE_AR=/usr/bin/ar \ + -DCMAKE_RANLIB=/usr/bin/ranlib \ + -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 \ + -DCONTINUOUS=ON \ + -DCODESIGNID:STRING="$IDENT" \ + -DLOCAL_PREFIX=/opt/homebrew \ + -DFANCY_DMG="ON" \ + .. + zsh -c 'echo "Configured in $(printf "%0.2f" $(($[$(date +%s)-$(cat configstamp)]/$((60.))))) minutes"' >> $GITHUB_STEP_SUMMARY + - 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"' >> $GITHUB_STEP_SUMMARY + - name: Create application bundle + run: | + zsh + date +%s > build/bundlestamp && date -u && cd build + echo "Automated Build! WARNING:\nNot intended for end-user testing." > message + export REF=${GITHUB_REF##*/} && 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"' >> $GITHUB_STEP_SUMMARY + printf '%s\n' \ + "REF: ${REF}" \ + "ARTIFACT: ${ARTIFACT}" \ + "ARTIFACT_PATH: ${ARTIFACT_PATH}" \ + "ARTIFACT_FILE: ${ARTIFACT_FILE}" \ + "PUBLISH_NAME: ${PUBLISH_NAME}" + exit + + - uses: actions/upload-artifact@v4 + 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"' >> $GITHUB_STEP_SUMMARY + + - name: Test-launch the app + run: | + cd build + sudo cp -R RawTherapee.app /Applications + open -a /Applications/RawTherapee.app + sleep 5 + echo "Applications running: $(osascript -e 'tell application "Finder" to get the name of every process whose visible is true')" >> $GITHUB_STEP_SUMMARY + osascript -e 'if application "RawTherapee" is not running then do shell script "exit 1"' + osascript -e 'tell application "RawTherapee" to if it is running then quit' + + - name: Test the -cli + run: | + cd build + echo "$(RawTherapee*folder/rawtherapee-cli --version)" >> $GITHUB_STEP_SUMMARY + + - name: Publish artifacts + uses: softprops/action-gh-release@v2 if: ${{github.ref_type == 'tag' || github.ref_name == 'dev'}} with: tag_name: nightly-github-actions diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 2e1d3bc69..6e36f3b5e 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -15,7 +15,8 @@ on: workflow_dispatch: env: - publish_pre_dev_labels: '["Beep6581:wbrefinement"]' + publish_pre_dev_labels: '[]' + jobs: build: @@ -29,7 +30,7 @@ jobs: build_type: [release, debug] steps: - name: Checkout source - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 @@ -46,12 +47,14 @@ jobs: cc:p pkgconf:p cmake:p + autotools:p ninja:p gtkmm3:p lcms2:p fftw:p lensfun:p libiptcdata:p + libjxl:p exiv2:p - name: Configure build @@ -129,14 +132,6 @@ jobs: "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." @@ -196,14 +191,14 @@ jobs: 7z a -tzip "%ARTIFACT_NAME%.zip" "./%ARTIFACT_NAME%" - name: Upload artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 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@v3 + uses: actions/upload-artifact@v4 with: name: ${{env.ARTIFACT_NAME}}.exe path: build\${{env.ARTIFACT_NAME}}.exe @@ -229,7 +224,7 @@ jobs: echo "PUBLISH_NAME=$PUBLISH_NAME" >> "$(cygpath -u $GITHUB_ENV)" - name: Publish artifacts - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 if: ${{github.ref_type == 'tag' || github.ref_name == 'dev'}} with: tag_name: nightly-github-actions @@ -238,7 +233,7 @@ jobs: build/${{env.PUBLISH_NAME}}-AboutThisBuild.txt - name: Publish installer - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 if: ${{matrix.build_type == 'release' && (github.ref_type == 'tag' || github.ref_name == 'dev')}} with: tag_name: nightly-github-actions @@ -270,17 +265,19 @@ jobs: echo "PUBLISH_NAME=$PUBLISH_NAME" >> "$(cygpath -u $GITHUB_ENV)" - name: Publish pre-dev artifacts - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 if: ${{steps.prepare-publish-pre-dev.outcome == 'success'}} with: tag_name: pre-dev-github-actions + repository: Beep6581/RawTherapee files: | build/${{env.PUBLISH_NAME}}.zip build/${{env.PUBLISH_NAME}}-AboutThisBuild.txt - name: Publish pre-dev installer - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 if: ${{steps.prepare-publish-pre-dev.outcome == 'success' && matrix.build_type == 'release'}} with: tag_name: pre-dev-github-actions + repository: Beep6581/RawTherapee files: build/${{env.PUBLISH_NAME}}.exe diff --git a/.gitignore b/.gitignore index e67dc3511..dbb6d72ad 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ cmake_install.cmake install_manifest.txt build* +cmake-build* Build* Debug RelWithDebInfo diff --git a/AUTHORS.txt b/AUTHORS.txt index 0d5f9db64..f9aafd927 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -21,6 +21,7 @@ Development contributors, in last name alphabetical order: Rüdiger Franke Jean-Christophe Frisch Ilias Giarimis + Scott Gilbertson Alberto Griggio Steve Herrell Philippe Hupé diff --git a/AboutThisBuild.txt.in b/AboutThisBuild.txt.in index 4d8f4f3fe..7c42f244e 100644 --- a/AboutThisBuild.txt.in +++ b/AboutThisBuild.txt.in @@ -6,8 +6,9 @@ Compiler: ${COMPILER_INFO} Processor: ${PROC_LABEL} System: ${SYSTEM} Bit depth: ${PROC_BIT_DEPTH} -Gtkmm: V${GTKMM_VERSION} -Lensfun: V${LENSFUN_VERSION} +Gtkmm: ${GTKMM_VERSION} +Lensfun: ${LENSFUN_VERSION} +libjxl: ${JXL_VERSION} Build type: ${BUILD_TYPE} Build flags: ${CXX_FLAGS} Link flags: ${LFLAGS} diff --git a/CMakeLists.txt b/CMakeLists.txt index 7b7c797d9..fdfe60968 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -226,6 +226,7 @@ option(WITH_LTO "Build with link-time optimizations" OFF) 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(WITH_SYSTEM_LIBRAW "Build using system LibRaw library." OFF) option(OPTION_OMP "Build with OpenMP support" ON) option( STRICT_MUTEX @@ -247,6 +248,9 @@ set(TCMALLOC_LIB_DIR "" CACHE PATH "Custom path for the tcmalloc library") +set(WITH_JXL "AUTO" CACHE STRING "Build with JPEG XL support") +set_property(CACHE WITH_JXL PROPERTY STRINGS AUTO ON OFF) + # Set installation directories: if(WIN32 OR APPLE) if(BUILD_BUNDLE) @@ -462,13 +466,9 @@ endif() # Check for libraries: find_package(PkgConfig) -if(WIN32) - pkg_check_modules(GTK REQUIRED gtk+-3.0>=3.22.24) - pkg_check_modules(GTKMM REQUIRED gtkmm-3.0>=3.22) -else() - pkg_check_modules(GTK REQUIRED gtk+-3.0>=3.16) - pkg_check_modules(GTKMM REQUIRED gtkmm-3.0>=3.16) -endif() +# Gtk version shall be greater than 3.24.3 for fixed Hi-DPI support +pkg_check_modules(GTK REQUIRED gtk+-3.0>=3.24.3) +pkg_check_modules(GTKMM REQUIRED gtkmm-3.0>=3.24) if(GTK_VERSION VERSION_GREATER "3.24.1" AND GTK_VERSION VERSION_LESS "3.24.7") if(GTK_VERSION VERSION_EQUAL "3.24.5") @@ -495,7 +495,7 @@ 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) +pkg_check_modules(RSVG REQUIRED librsvg-2.0>=2.52) # Require exiv2 >= 0.24 to make sure everything we need is available #find_package(Exiv2 0.24 REQUIRED) @@ -522,6 +522,13 @@ foreach(l ${_exiv2_libs}) set(EXIV2_LIBRARIES ${EXIV2_LIBRARIES} ${_el}) endforeach() +if(NOT WITH_SYSTEM_LIBRAW) + set(LIBRAW_LIBRARIES "${CMAKE_CURRENT_BINARY_DIR}/rtengine/libraw/lib/.libs/libraw_r.a") + if(WIN32) + set(LIBRAW_LIBRARIES ${LIBRAW_LIBRARIES} -lws2_32) + endif() +endif() + if(WIN32) add_definitions(-DWIN32) add_definitions(-D_WIN32) @@ -555,6 +562,35 @@ find_package(ZLIB REQUIRED) if(WITH_SYSTEM_KLT) find_package(KLT REQUIRED) endif() +if(WITH_SYSTEM_LIBRAW) + pkg_check_modules(LIBRAW REQUIRED libraw_r>=0.21) +endif() + +if(WITH_JXL AND NOT WITH_JXL STREQUAL "AUTO") + set(JXL_REQUIRED "REQUIRED") +else() + set(JXL_REQUIRED "") +endif() +pkg_check_modules(JXL ${JXL_REQUIRED} IMPORTED_TARGET libjxl) +pkg_check_modules(JXLTHREADS ${JXL_REQUIRED} IMPORTED_TARGET libjxl_threads) +if(JXL_FOUND) + if(WITH_JXL OR WITH_JXL STREQUAL "AUTO") + add_definitions(-DLIBJXL) + list(APPEND JXL_INCLUDE_DIRS ${JXLTHREADS_INCLUDE_DIRS}) + list(APPEND JXL_LIBRARIES ${JXLTHREADS_LIBRARIES}) + else() + message(STATUS " JXL support disabled by WITH_JXL = ${WITH_JXL}") + string(APPEND JXL_VERSION " - Disabled") + set(JXL_INCLUDE_DIRS "") + set(JXL_LIBRARIES "") + set(JXLTHREADS_INCLUDE_DIRS "") + set(JXLTHREADS_LIBRARIES "") + endif() +elseif(WITH_JXL STREQUAL "AUTO") + set(JXL_VERSION "Disabled, Auto") +else() + set(JXL_VERSION "Disabled") +endif() # Check for libcanberra-gtk3 (sound events on Linux): if(UNIX AND (NOT APPLE)) @@ -736,6 +772,7 @@ if(NOT APPLE) -DGTKMM_VERSION:STRING=${GTKMM_VERSION} -DOPTION_OMP:STRING=${OPTION_OMP} -DWITH_MYFILE_MMAP:STRING=${WITH_MYFILE_MMAP} + -DJXL_VERSION:STRING=${JXL_VERSION} -DLENSFUN_VERSION:STRING=${LENSFUN_VERSION}) endif() @@ -765,6 +802,7 @@ elseif(APPLE) -DGTKMM_VERSION:STRING=${GTKMM_VERSION} -DOPTION_OMP:STRING=${OPTION_OMP} -DWITH_MYFILE_MMAP:STRING=${WITH_MYFILE_MMAP} + -DJXL_VERSION:STRING=${JXL_VERSION} -DLENSFUN_VERSION:STRING=${LENSFUN_VERSION} -P ${PROJECT_SOURCE_DIR}/UpdateInfo.cmake) else() diff --git a/ProcessorTargets.cmake b/ProcessorTargets.cmake index 60fd1e35f..fdd4bc40a 100644 --- a/ProcessorTargets.cmake +++ b/ProcessorTargets.cmake @@ -10,6 +10,8 @@ set(PROC_TARGET_2_LABEL native CACHE STRING "Processor-2 label - use it for your # 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") +elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "ppc|powerpc") + set(PROC_TARGET_2_FLAGS "-mtune=native" CACHE STRING "Processor-2 flags") else() set(PROC_TARGET_2_FLAGS "-march=native" CACHE STRING "Processor-2 flags") endif() diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt index 0ef0b255b..ca4beb576 100644 --- a/RELEASE_NOTES.txt +++ b/RELEASE_NOTES.txt @@ -1,6 +1,6 @@ -RAWTHERAPEE 5.10 RELEASE NOTES +RAWTHERAPEE 5.11-rc1 RELEASE NOTES -This is RawTherapee 5.10, released on 2024-02-16. +This is Release Candidate 1 of RawTherapee 5.11, released on 2025-08-11. This is not the final release yet. @@ -22,104 +22,62 @@ In order to use RawTherapee efficiently you should know that: -NEW FEATURES SINCE 5.9 +NEW FEATURES SINCE 5.10 -- Multiple custom external editors can be added and the external editor can be chosen in the Editor tab. -- The Favorites tab can be configured in Preferences. An option to display Favorite tools in their original location has been added. -- Metadata is now handled by Exiv2. CR3 metadata is supported. -- When saving images in the TIFF file format, there is a new option to use the BigTIFF format. -- The DCP and LCP file paths saved to processing profiles have better interoperability between Windows and Linux, and between different computers. -- The Tone Equalizer in Local Adjustments is now also available in the Exposure tab. They have a new Pivot adjuster to shift the range of affected tones. The Tone Equalizer in the Exposure tab can display a tonal map for visualizing the tones. -- The ICC profiles in the user configuration directory are recognized. -- The language selection in Preferences now show all language names in their own language. -- The Lensfun database directory can be changed in Preferences. -- The color pickers in Film Negative (Color tab) now have adjustable size. -- Dynamic Profile Rules now has a File path filter. -- The context menu for images (File Browser tab) received a new option to sort images by name, date, rank, color label, or EXIF. -- The Flat-Field tool (Raw tab) has a new From Metadata option for applying DNG gain maps. -- Temporary files generated by the external editor feature now have more private file permissions. -- The Color Appearance & Lighting tool (Advanced tab) received various improvements. -- The Abstract Profile in the Color Management tool (Color tab) received a Gamut control option. -- The L*a*b* Adjustments (Exposure tab) and Local Adjustments (Local tab) tools received improvements to the Avoid color shift option. -- The Highlight reconstruction in the Exposure tool (Exposure tab) has a new Inpaint Opposed method that usually offers better reconstructed details than the Blend method and higher reliability compared to the Color Propagation method. -- The Temperature correlation automatic white balance method in the White Balance tool (Color tab) received various improvements. -- The Denoise section of the Blur/Grain & Denoise tool in Local Adjustments (Local tab) has an improved interface. -- Raw files from OM Digital Solutions cameras are supported. -- The Dynamic Range Compression tool in the Exposure tab and in Local Adjustments (Local tab) has improved behavior. The tool in Local Adjustments received a Saturation control option. -- The default value for the Show additional settings option for new spots in Local Adjustments (Local tab) is now linked to the Default complexity for Local Adjustments set in Preferences. -- Added or improved support for cameras, raw formats and color profiles: - - Canon EOS 250D (DCP) - - Canon EOS 7D Mark II - - Canon EOS 800D (DCP) - - Canon EOS 90D - - Canon EOS Kiss X10 - - Canon EOS M100 - - Canon EOS M50 (DCP) - - Canon EOS M50m2 - - Canon EOS M6 Mark II - - Canon EOS R - - Canon EOS R10 - - Canon EOS R3 - - Canon EOS R5 - - Canon EOS R6 - - Canon EOS R6m2 - - Canon EOS R7 - - Canon EOS R8 - - Canon EOS RP - - Canon EOS Rebel SL3 - - Canon EOS-1D X Mark II - - Canon PowerShot G7 X Mark II - - Canon Powershot G5 X MARK II (DCP) - - FUJIFILM DBP for GX680 (DCP) - - FUJIFILM GFX 100 - - FUJIFILM GFX100S - - FUJIFILM X-A7 (DCP) - - FUJIFILM X-E3 (DCP) - - FUJIFILM X-H2 - - FUJIFILM X-PRO3 - - FUJIFILM X-S10 (DCP) - - FUJIFILM X-T3 - - FUJIFILM X-T30 - - FUJIFILM X-T30 II - - FUJIFILM X-T4 - - FUJIFILM X-T5 - - FUJIFILM X100V - - LEICA D-LUX 7 - - NIKON D3300 (DCP) - - NIKON Z 5 (DCP) - - NIKON Z 6_2 (DCP) - - NIKON Z 9 - - OLYMPUS E-M1 (DCP) - - OLYMPUS E-M10MarkIV - - OM Digital Solutions OM-1 - - OM Digital Solutions OM-5 - - PANASONIC DC-GX880 - - PANASONIC DMC-LX100 (DCP) - - Panasonic DC-G100 - - Panasonic DC-G110 - - Panasonic DC-LX100M2 - - Sony DSC-RX100M6 (DCP) - - Sony DSC-RX1RM2 - - Sony ILCE-7 (DCP) - - Sony ILCE-7C (DCP) - - Sony ILCE-7M4 - - Sony ILCE-7RM2 - - Sony ILCE-7S - - Sony ILCE-7SM2 - - Sony ILCE-7SM3 (DCP) - - Sony ZV-1 +- The path template for queue export supports more format specifiers, including dates and new path types. Additionally, there is a preview to show the path for the selected image. +- The maximum zoom for the editor is now configurable. +- Pseudo HiDPI is replaced by real HiDPI. +- The file browser has an option to show all images within subfolders too. +- The Use embedded option for the Input Profile is available for DNGs that have an embedded DCP. +- The Color appearance sub-tool in Selective Editing (formerly Local Adjustments) received various improvements, including simplification of the basic mode, addition of new tone mappers for Cam16, a black and white mode, and a highlight attenuation feature. +- The White balance Tint range is expanded. +- It is now possible to use Contrast by Detail Levels in Before Black-and-White mode while Color Appearance & Lighting is activated with CAM16. +- Ratings and color labels can be synchronized with XMPs. +- The Selective Editing tool received various improvements, such as a global mode for applying edits to the entire image uniformly, ΔE preview buttons for most sub-tools, and adjustable graduated filter feathering for each sub-tool. +- The EXIF modified date-time is now added to saved images. +- RawTherapee can now read 12-bit Panasonic raw files encoded in the v6 format, such as those from the DC-GH5M2. +- RawTherapee can now read Panasonic raw files encoded in the v8 format, such as those from the DC-GH6, DC-S5M2, and DC-S5M2X. +- RawTherapee can now read Fujifilm lossy-compressed raw files. +- JPEG XL images can now be opened. +- There is a new option to use lens corrections from the file metadata. It works for compatible raw images from Fujifilm, Olympus / OM Digital Solutions (distortion and chromatic aberration corrections only), and Sony. Corrections embedded in DNGs can also be used. +- RawTherapee can leverage LibRaw (enabled by default) to read raw images. It adds the ability to read additional raw formats, such as Sony lossless compression, and improved support for some cameras. +- Added or improved support for cameras, raw formats and color profiles (not including LibRaw and color matrices for dcraw): + - FUJIFILM GFX 100 (PDAF lines filter) + - FUJIFILM GFX 100S (DCP, PDAF lines filter) + - FUJIFILM GFX 100 II (PDAF lines filter) + - Fujifilm X-H2S + - Nikon Z 8 (DCP) + - Nikon Z 9 (DCP) + - Nikon Z f (DCP) + - OM Digital Solutions TG-7 + - Panasonic DC-G9M2 + - Panasonic DC-GH5M2 + - Panasonic DC-GH6 + - Panasonic DC-S5M2 + - Panasonic DC-S5M2X + - Sony ILCE-1 (Pixel shift) + - Sony ILCE-6700 + - Sony ILCE-7CR (PDAF lines filter) + - Sony ILCE-7RM4 (PDAF lines filter) + - Sony ILCE-7RM5 (PDAF lines filter) + - SONY ILCE-9M3 NEWS RELEVANT TO PACKAGE MAINTAINERS -New since 5.9: -- Dependency on Exiv2 >= 0.24. +New since 5.10: +- Requires GTK+ >= 3.24.3 (was >= 3.22.24 in Windows, or >= 3.16 in other operating systems). +- Requires librsvg-2.0 >= 2.52 (was >= 2.40). +- Optional dependency on libjxl. +- Optional dependency on LibRaw >= 0.21. In general: -- To get the source code, either clone from git or use the tarball from https://rawtherapee.com/shared/source/ . Do not use the auto-generated GitHub release tarballs. -- Requires GTK+ version >=3.22.24 in Windows, else >=3.16 (though >=3.22.24 is recommended). -- GTK+ versions 3.24.2 - 3.24.6 have an issue where combobox menu scroll-arrows are missing when the combobox list does not fit vertically on the screen. As a result, users would not be able to scroll in the following comboboxes: Processing Profiles, Film Simulation, and the camera and lens profiles in Profiled Lens Correction. +- To get the source code, either clone from git or use the tarball from https://rawtherapee.com/shared/source/. Do not use the auto-generated GitHub release tarballs. +- Requires GTK+ version >= 3.24.3. +- GTK+ versions 3.24.3 - 3.24.6 have an issue where combobox menu scroll-arrows are missing when the combobox list does not fit vertically on the screen. As a result, users would not be able to scroll in the following comboboxes: Processing Profiles, Film Simulation, and the camera and lens profiles in Profiled Lens Correction. +- JPEG XL read support depends on libjxl. By default, RawTherapee builds with JPEG XL support if and only if libjxl is present. Use -DWITH_JXL="ON" or DWITH_JXL="OFF" to explicitly enable or disable, respectively, JPEG XL support. +- RawTherapee builds with a custom version of LibRaw by default. To use the system LibRaw, use -DWITH_SYSTEM_LIBRAW="ON". Requires LibRaw >= 0.21. - RawTherapee 5 requires GCC-4.9 or higher, or Clang. - Do not use -ffast-math, it will not make RawTherapee faster but will introduce artifacts. - Use -O3, it will make RawTherapee faster with no known side-effects. diff --git a/UpdateInfo.cmake b/UpdateInfo.cmake index b0c2bdff6..350adc071 100644 --- a/UpdateInfo.cmake +++ b/UpdateInfo.cmake @@ -100,15 +100,15 @@ if(WIN32) if(BIT_DEPTH EQUAL 4) set(BUILD_BIT_DEPTH 32) # 32 bits builds has to be installable on 64 bits system, to support WinXP/64. - set(ARCHITECTURE_ALLOWED "x86 x64 ia64") + set(ARCHITECTURE_ALLOWED "x86 x64") # installing in 32 bits mode even on 64 bits OS and architecture set(INSTALL_MODE "") 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 arm64") + set(ARCHITECTURE_ALLOWED "x64 arm64") # installing in 64 bits mode for all 64 bits processors, even for itanium architecture - set(INSTALL_MODE "x64 ia64 arm64") + set(INSTALL_MODE "x64 arm64") endif() # set part of the output archive name set(SYSTEM_NAME "WinVista") diff --git a/com.rawtherapee.RawTherapee.appdata.xml b/com.rawtherapee.RawTherapee.appdata.xml index 7e30dc2f8..585d265ff 100644 --- a/com.rawtherapee.RawTherapee.appdata.xml +++ b/com.rawtherapee.RawTherapee.appdata.xml @@ -22,6 +22,7 @@ https://rawpedia.rawtherapee.com/Main_Page#Localization rawtherapee.desktop + diff --git a/rtdata/CMakeLists.txt b/rtdata/CMakeLists.txt index eb4b5e934..7ed0d95c7 100644 --- a/rtdata/CMakeLists.txt +++ b/rtdata/CMakeLists.txt @@ -3,14 +3,11 @@ file(GLOB SOUNDFILES "sounds/*") file(GLOB INPUTICCFILES "iccprofiles/input/*") file(GLOB OUTPUTICCFILES "iccprofiles/output/*") file(GLOB DCPFILES "dcpprofiles/*") -file(GLOB FONTS "fonts/*") set(PROFILESDIR "profiles") set(THEMEDIR "themes") - -file(GLOB IMG_SVG LIST_DIRECTORIES false "images/svg/*") -file(GLOB IMG_PNG LIST_DIRECTORIES false "images/png/*") -file(GLOB IMG_ICO LIST_DIRECTORIES false "images/*") +set(ICONTHEMEDIR "icons") +set(IMAGESDIR "images") if(WIN32) set(OPTIONSFILE "options/options.win") @@ -27,14 +24,13 @@ endif() if(UNIX) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/rawtherapee.desktop.in" "${CMAKE_CURRENT_BINARY_DIR}/rawtherapee.desktop") install(FILES "${CMAKE_CURRENT_BINARY_DIR}/rawtherapee.desktop" DESTINATION ${DESKTOPDIR}) - install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/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) + if(BUILD_BUNDLE) + install(DIRECTORY "${ICONTHEMEDIR}/hicolor" DESTINATION "${ICONSDIR}") + else() + # For theme 'hicolor' (containing app icon), 'index.theme' shall not be installed for Linux build with 'BUILD_BUNDLE=OFF' option + # (to avoid conflict with existing 'index.theme' distro file) + install(DIRECTORY "${ICONTHEMEDIR}/hicolor" DESTINATION "${ICONSDIR}" PATTERN "index.theme" EXCLUDE) + endif() endif() install(FILES ${LANGUAGEFILES} DESTINATION "${DATADIR}/languages") @@ -43,16 +39,11 @@ install(FILES ${INPUTICCFILES} DESTINATION "${DATADIR}/iccprofiles/input") install(FILES ${OUTPUTICCFILES} DESTINATION "${DATADIR}/iccprofiles/output") install(FILES ${DCPFILES} DESTINATION "${DATADIR}/dcpprofiles") install(FILES ${OPTIONSFILE} DESTINATION "${DATADIR}" PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ RENAME options) -if(WIN32) - install(FILES ${FONTS} DESTINATION "${DATADIR}/fonts") -endif() 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") -install(FILES ${IMG_ICO} DESTINATION "${DATADIR}/images") +install(DIRECTORY "${ICONTHEMEDIR}/rawtherapee" DESTINATION "${DATADIR}/${ICONTHEMEDIR}") +install(DIRECTORY "${IMAGESDIR}" DESTINATION "${DATADIR}") if(APPLE) # CMake escapes first item quote character. Do not remove 'DUMMY_VARIABLE=' diff --git a/rtdata/dcpprofiles/NIKON Z 8.dcp b/rtdata/dcpprofiles/NIKON Z 8.dcp new file mode 100644 index 000000000..cbd59f051 Binary files /dev/null and b/rtdata/dcpprofiles/NIKON Z 8.dcp differ diff --git a/rtdata/dcpprofiles/NIKON Z 9.dcp b/rtdata/dcpprofiles/NIKON Z 9.dcp new file mode 100644 index 000000000..9f644ae41 Binary files /dev/null and b/rtdata/dcpprofiles/NIKON Z 9.dcp differ diff --git a/rtdata/dcpprofiles/NIKON Z F.dcp b/rtdata/dcpprofiles/NIKON Z F.dcp new file mode 100644 index 000000000..f8f5c4bad Binary files /dev/null and b/rtdata/dcpprofiles/NIKON Z F.dcp differ diff --git a/rtdata/dcpprofiles/camera_model_aliases.json b/rtdata/dcpprofiles/camera_model_aliases.json index 49e981121..20b0592a6 100644 --- a/rtdata/dcpprofiles/camera_model_aliases.json +++ b/rtdata/dcpprofiles/camera_model_aliases.json @@ -20,6 +20,8 @@ "Canon EOS 2000D": ["Canon EOS 1500D", "Canon EOS Kiss X90", "Canon EOS Rebel T7"], "Canon EOS 4000D": ["Canon EOS 3000D", "Canon EOS Rebel T100"], + "FUJIFILM GFX 100": ["FUJIFILM GFX 100S", "FUJIFILM GFX100S"], + "MINOLTA DYNAX 5D": ["Minolta Maxxum 5D", "Minolta Alpha 5D", "Minolta Alpha Sweet"], "MINOLTA DYNAX 7D": ["Minolta Maxxum 7D", "Minolta Alpha 7D"], diff --git a/rtdata/fonts/DroidSansMonoSlashed.ttf b/rtdata/fonts/DroidSansMonoSlashed.ttf deleted file mode 100644 index 8c44b47ed..000000000 Binary files a/rtdata/fonts/DroidSansMonoSlashed.ttf and /dev/null differ diff --git a/rtdata/images/png/rawtherapee-logo-128.png b/rtdata/icons/hicolor/128x128/apps/rawtherapee.png similarity index 100% rename from rtdata/images/png/rawtherapee-logo-128.png rename to rtdata/icons/hicolor/128x128/apps/rawtherapee.png diff --git a/rtdata/images/png/rawtherapee-logo-16.png b/rtdata/icons/hicolor/16x16/apps/rawtherapee.png similarity index 100% rename from rtdata/images/png/rawtherapee-logo-16.png rename to rtdata/icons/hicolor/16x16/apps/rawtherapee.png diff --git a/rtdata/images/png/rawtherapee-logo-24.png b/rtdata/icons/hicolor/24x24/apps/rawtherapee.png similarity index 100% rename from rtdata/images/png/rawtherapee-logo-24.png rename to rtdata/icons/hicolor/24x24/apps/rawtherapee.png diff --git a/rtdata/images/png/rawtherapee-logo-256.png b/rtdata/icons/hicolor/256x256/apps/rawtherapee.png similarity index 100% rename from rtdata/images/png/rawtherapee-logo-256.png rename to rtdata/icons/hicolor/256x256/apps/rawtherapee.png diff --git a/rtdata/images/png/rawtherapee-logo-32.png b/rtdata/icons/hicolor/32x32/apps/rawtherapee.png similarity index 100% rename from rtdata/images/png/rawtherapee-logo-32.png rename to rtdata/icons/hicolor/32x32/apps/rawtherapee.png diff --git a/rtdata/images/png/rawtherapee-logo-48.png b/rtdata/icons/hicolor/48x48/apps/rawtherapee.png similarity index 100% rename from rtdata/images/png/rawtherapee-logo-48.png rename to rtdata/icons/hicolor/48x48/apps/rawtherapee.png diff --git a/rtdata/images/png/rawtherapee-logo-64.png b/rtdata/icons/hicolor/64x64/apps/rawtherapee.png similarity index 100% rename from rtdata/images/png/rawtherapee-logo-64.png rename to rtdata/icons/hicolor/64x64/apps/rawtherapee.png diff --git a/rtdata/icons/hicolor/index.theme b/rtdata/icons/hicolor/index.theme new file mode 100644 index 000000000..1215a9989 --- /dev/null +++ b/rtdata/icons/hicolor/index.theme @@ -0,0 +1,48 @@ +[Icon Theme] +Name=Hicolor +Comment=RawTherapee app icon +Hidden=true +Directories=16x16/apps,24x24/apps,32x32/apps,48x48/apps,64x64/apps,128x128/apps,256x256/apps,scalable/apps + + +[16x16/apps] +Size=16 +Context=ApplicationIcons +Type=Threshold + +[24x24/apps] +Size=24 +Context=ApplicationIcons +Type=Threshold + +[32x32/apps] +Size=32 +Context=ApplicationIcons +Type=Threshold + +[48x48/apps] +Size=48 +Context=ApplicationIcons +Type=Threshold + +[64x64/apps] +Size=64 +Context=ApplicationIcons +Type=Threshold + +[128x128/apps] +Size=128 +Context=ApplicationIcons +Type=Threshold + +[256x256/apps] +Size=256 +Context=ApplicationIcons +Type=Threshold + +[scalable/apps] +MinSize=16 +Size=128 +MaxSize=256 +Context=ApplicationIcons +Type=Scalable diff --git a/rtdata/images/rt-logo.svg b/rtdata/icons/hicolor/scalable/apps/rawtherapee.svg similarity index 100% rename from rtdata/images/rt-logo.svg rename to rtdata/icons/hicolor/scalable/apps/rawtherapee.svg diff --git a/rtdata/images/png/empty.png b/rtdata/icons/rawtherapee/24x24/apps/empty.png similarity index 100% rename from rtdata/images/png/empty.png rename to rtdata/icons/rawtherapee/24x24/apps/empty.png diff --git a/rtdata/icons/rawtherapee/index.theme b/rtdata/icons/rawtherapee/index.theme new file mode 100644 index 000000000..1095b2219 --- /dev/null +++ b/rtdata/icons/rawtherapee/index.theme @@ -0,0 +1,18 @@ +[Icon Theme] +Name=RawTherapee +Comment=RawTherapee icon theme +Inherits=Adwaita +Directories=24x24/apps,scalable/apps + + +[24x24/apps] +Size=24 +Context=Applications +Type=Threshold + +[scalable/apps] +MinSize=16 +Size=128 +MaxSize=256 +Context=Applications +Type=Scalable diff --git a/rtdata/icons/rawtherapee/scalable/apps/add-small.svg b/rtdata/icons/rawtherapee/scalable/apps/add-small.svg new file mode 100644 index 000000000..9d5cb01c6 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/add-small.svg @@ -0,0 +1,77 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/add.svg b/rtdata/icons/rawtherapee/scalable/apps/add.svg new file mode 100644 index 000000000..b8c21fdae --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/add.svg @@ -0,0 +1,74 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/aperture.svg b/rtdata/icons/rawtherapee/scalable/apps/aperture.svg similarity index 55% rename from rtdata/images/svg/aperture.svg rename to rtdata/icons/rawtherapee/scalable/apps/aperture.svg index 5820ee283..c08244c62 100644 --- a/rtdata/images/svg/aperture.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/aperture.svg @@ -2,68 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -107,289 +55,224 @@ + id="layer1"> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:0.95796239;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" + id="path870" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + id="path1175" /> + id="path1171" /> + id="path1167" /> + id="path1163" /> + id="path1159" /> + id="path994" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#ff8181;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#dfb220;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#20df20;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#20dfdf;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#2020df;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#ef8fef;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> diff --git a/rtdata/images/svg/arrow-down-small.svg b/rtdata/icons/rawtherapee/scalable/apps/arrow-down-small.svg similarity index 62% rename from rtdata/images/svg/arrow-down-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/arrow-down-small.svg index d17ba4329..2911187fc 100644 --- a/rtdata/images/svg/arrow-down-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/arrow-down-small.svg @@ -2,181 +2,122 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + id="ExperimentalArrow"> + style="fill:context-stroke;stroke:#000000;stroke-opacity:1.0" /> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> @@ -188,7 +129,7 @@ image/svg+xml - + Maciej Dworak @@ -222,11 +163,9 @@ diff --git a/rtdata/images/svg/arrow-left-small.svg b/rtdata/icons/rawtherapee/scalable/apps/arrow-left-small.svg similarity index 61% rename from rtdata/images/svg/arrow-left-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/arrow-left-small.svg index 54eafbc29..cb5194185 100644 --- a/rtdata/images/svg/arrow-left-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/arrow-left-small.svg @@ -2,181 +2,122 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + id="ExperimentalArrow"> + style="fill:context-stroke;stroke:#000000;stroke-opacity:1.0" /> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> @@ -188,7 +129,7 @@ image/svg+xml - + Maciej Dworak @@ -222,13 +163,10 @@ + id="rect1539" /> diff --git a/rtdata/images/svg/arrow-right-small.svg b/rtdata/icons/rawtherapee/scalable/apps/arrow-right-small.svg similarity index 61% rename from rtdata/images/svg/arrow-right-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/arrow-right-small.svg index 43bfdd4e8..1b6d484e8 100644 --- a/rtdata/images/svg/arrow-right-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/arrow-right-small.svg @@ -2,181 +2,122 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + id="ExperimentalArrow"> + style="fill:context-stroke;stroke:#000000;stroke-opacity:1.0" /> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> @@ -188,7 +129,7 @@ image/svg+xml - + Maciej Dworak @@ -222,13 +163,10 @@ + id="rect1539" /> diff --git a/rtdata/images/svg/arrow-up-small.svg b/rtdata/icons/rawtherapee/scalable/apps/arrow-up-small.svg similarity index 61% rename from rtdata/images/svg/arrow-up-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/arrow-up-small.svg index b5609c5d7..7f3314246 100644 --- a/rtdata/images/svg/arrow-up-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/arrow-up-small.svg @@ -2,181 +2,122 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + id="ExperimentalArrow"> + style="fill:context-stroke;stroke:#000000;stroke-opacity:1.0" /> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> @@ -188,7 +129,7 @@ image/svg+xml - + Maciej Dworak @@ -222,13 +163,10 @@ + id="rect1539" /> diff --git a/rtdata/icons/rawtherapee/scalable/apps/arrow-updown.svg b/rtdata/icons/rawtherapee/scalable/apps/arrow-updown.svg new file mode 100644 index 000000000..ed82879a5 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/arrow-updown.svg @@ -0,0 +1,68 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/arrow2-left.svg b/rtdata/icons/rawtherapee/scalable/apps/arrow2-left.svg new file mode 100644 index 000000000..817901f8e --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/arrow2-left.svg @@ -0,0 +1,64 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/arrow2-right.svg b/rtdata/icons/rawtherapee/scalable/apps/arrow2-right.svg new file mode 100644 index 000000000..4a8922d3a --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/arrow2-right.svg @@ -0,0 +1,64 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/atom.svg b/rtdata/icons/rawtherapee/scalable/apps/atom.svg similarity index 69% rename from rtdata/images/svg/atom.svg rename to rtdata/icons/rawtherapee/scalable/apps/atom.svg index 72fb97532..22533a9b4 100644 --- a/rtdata/images/svg/atom.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/atom.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -71,7 +30,7 @@ - + RawTherapee icon. @@ -96,26 +55,20 @@ + id="layer1"> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="M 6.4236453,1.0007171 C 5.1242162,1.0661783 4.2818956,1.3551405 3.4072861,2.1680463 2.0313377,3.6604057 2.0510559,6.0656441 2.8621368,8.5546635 3.6732254,11.043598 5.310644,13.766734 7.6001256,16.249906 c 2.2894736,2.483171 4.8041564,4.263447 7.0989664,5.143206 2.294838,0.879717 4.512477,0.901128 5.888414,-0.591274 1.459941,-1.892872 1.173357,-4.178274 0.629276,-6.11277 l -1.304751,1.308627 c 0.13995,1.28267 0.485305,2.529387 -0.444943,3.586763 -0.742315,0.805094 -2.239588,0.951586 -4.238937,0.184773 C 13.228945,19.002904 10.867343,17.361104 8.7224918,15.034753 6.5776052,12.708445 5.0659363,10.14926 4.3592931,7.9807808 3.8278563,5.7699345 3.7373603,4.2400511 5.122903,3.0223486 5.9515725,2.6063205 7.1829376,2.5856846 8.7705933,3.1940787 9.8156548,3.5945426 10.958198,4.2581661 12.117649,5.1091942 14.341642,6.72193 15.771084,8.4243253 17.384754,10.761068 L 18.45501,9.4589633 C 17.216394,7.4326758 15.418359,5.7024185 13.799195,4.3896672 12.282374,3.1596706 10.75444,2.1300889 9.2997088,1.5724257 8.2993769,1.1887878 7.3233517,0.98582573 6.4236453,1.0007171 Z" /> + id="ellipse4751" /> + style="opacity:1;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:3.77952719;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/rtdata/icons/rawtherapee/scalable/apps/bayer.svg b/rtdata/icons/rawtherapee/scalable/apps/bayer.svg new file mode 100644 index 000000000..10bd21541 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/bayer.svg @@ -0,0 +1,151 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/beforeafter.svg b/rtdata/icons/rawtherapee/scalable/apps/beforeafter.svg similarity index 60% rename from rtdata/images/svg/beforeafter.svg rename to rtdata/icons/rawtherapee/scalable/apps/beforeafter.svg index 8c4eaab48..798870b91 100644 --- a/rtdata/images/svg/beforeafter.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/beforeafter.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + + + + + + image/svg+xml + + + + + Lawrence + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/bidirectional-arrow-horizontal-prelight.svg b/rtdata/icons/rawtherapee/scalable/apps/bidirectional-arrow-horizontal-prelight.svg new file mode 100644 index 000000000..1692d094f --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/bidirectional-arrow-horizontal-prelight.svg @@ -0,0 +1,70 @@ + + + + + + + image/svg+xml + + + + + Lawrence + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/bidirectional-arrow-vertical-hicontrast.svg b/rtdata/icons/rawtherapee/scalable/apps/bidirectional-arrow-vertical-hicontrast.svg new file mode 100644 index 000000000..9ea09d595 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/bidirectional-arrow-vertical-hicontrast.svg @@ -0,0 +1,70 @@ + + + + + + + image/svg+xml + + + + + Lawrence + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/bidirectional-arrow-vertical-prelight.svg b/rtdata/icons/rawtherapee/scalable/apps/bidirectional-arrow-vertical-prelight.svg new file mode 100644 index 000000000..b2658187a --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/bidirectional-arrow-vertical-prelight.svg @@ -0,0 +1,70 @@ + + + + + + + image/svg+xml + + + + + Lawrence + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/box.svg b/rtdata/icons/rawtherapee/scalable/apps/box.svg similarity index 55% rename from rtdata/images/svg/box.svg rename to rtdata/icons/rawtherapee/scalable/apps/box.svg index 2ebee4b8c..bf31f9860 100644 --- a/rtdata/images/svg/box.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/box.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/cancel.svg b/rtdata/icons/rawtherapee/scalable/apps/cancel.svg new file mode 100644 index 000000000..899e2a5ec --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/cancel.svg @@ -0,0 +1,74 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/circle-black-small.svg b/rtdata/icons/rawtherapee/scalable/apps/circle-black-small.svg similarity index 54% rename from rtdata/images/svg/circle-black-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/circle-black-small.svg index 2b314c556..3cfc3579b 100644 --- a/rtdata/images/svg/circle-black-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/circle-black-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/circle-empty-blue-small.svg b/rtdata/icons/rawtherapee/scalable/apps/circle-empty-blue-small.svg similarity index 60% rename from rtdata/images/svg/circle-empty-blue-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/circle-empty-blue-small.svg index e9004ae63..568543846 100644 --- a/rtdata/images/svg/circle-empty-blue-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/circle-empty-blue-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -97,8 +56,6 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/circle-multicolor-small.svg b/rtdata/icons/rawtherapee/scalable/apps/circle-multicolor-small.svg new file mode 100644 index 000000000..ba109a903 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/circle-multicolor-small.svg @@ -0,0 +1,671 @@ + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/circle-orange-small.svg b/rtdata/icons/rawtherapee/scalable/apps/circle-orange-small.svg similarity index 54% rename from rtdata/images/svg/circle-orange-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/circle-orange-small.svg index addf840d1..a86be7111 100644 --- a/rtdata/images/svg/circle-orange-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/circle-orange-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/circle-red-small.svg b/rtdata/icons/rawtherapee/scalable/apps/circle-red-small.svg similarity index 61% rename from rtdata/images/svg/circle-red-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/circle-red-small.svg index a56b0d328..7e1536ac2 100644 --- a/rtdata/images/svg/circle-red-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/circle-red-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,120 +55,99 @@ + id="layer1"> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1.86396921;marker:none;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1.86396921;marker:none;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1.86396921;marker:none;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1.86396921;marker:none;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1.86396921;marker:none;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1.86396921;marker:none;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1.86396921;marker:none;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1.86396921;marker:none;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1.86396921;marker:none;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1.86396921;marker:none;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1.86396921;marker:none;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1.86396921;marker:none;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.55;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1.86396921;marker:none;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.35;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1.86396921;marker:none;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1.86396921;marker:none;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1.86396921;marker:none;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.45;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1.86396921;marker:none;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.65;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1.86396921;marker:none;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1.86396921;marker:none;enable-background:accumulate" /> diff --git a/rtdata/images/svg/color-picker-add-hicontrast.svg b/rtdata/icons/rawtherapee/scalable/apps/color-picker-add-hicontrast.svg similarity index 68% rename from rtdata/images/svg/color-picker-add-hicontrast.svg rename to rtdata/icons/rawtherapee/scalable/apps/color-picker-add-hicontrast.svg index 09870ff48..93b68b655 100644 --- a/rtdata/images/svg/color-picker-add-hicontrast.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/color-picker-add-hicontrast.svg @@ -2,59 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + id="rect2927" /> + id="path17041-7" /> + id="path822" /> + id="path3821" /> + id="path3823" /> diff --git a/rtdata/images/svg/color-picker-add.svg b/rtdata/icons/rawtherapee/scalable/apps/color-picker-add.svg similarity index 67% rename from rtdata/images/svg/color-picker-add.svg rename to rtdata/icons/rawtherapee/scalable/apps/color-picker-add.svg index b42b8371d..f35c8346a 100644 --- a/rtdata/images/svg/color-picker-add.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/color-picker-add.svg @@ -2,59 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.32020855" /> + id="path6419-3-9-4-4" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:0.32020855" /> + id="path822" /> diff --git a/rtdata/images/svg/color-picker-bars.svg b/rtdata/icons/rawtherapee/scalable/apps/color-picker-bars.svg similarity index 64% rename from rtdata/images/svg/color-picker-bars.svg rename to rtdata/icons/rawtherapee/scalable/apps/color-picker-bars.svg index f6c57ea40..0be923d08 100644 --- a/rtdata/images/svg/color-picker-bars.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/color-picker-bars.svg @@ -2,59 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.32020855" /> + id="path6419-3-9-4-4" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:0.32020855" /> + id="path822" /> diff --git a/rtdata/images/svg/color-picker-hicontrast.svg b/rtdata/icons/rawtherapee/scalable/apps/color-picker-hicontrast.svg similarity index 71% rename from rtdata/images/svg/color-picker-hicontrast.svg rename to rtdata/icons/rawtherapee/scalable/apps/color-picker-hicontrast.svg index 20ece03b7..8e70dc54f 100644 --- a/rtdata/images/svg/color-picker-hicontrast.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/color-picker-hicontrast.svg @@ -2,59 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + id="path17041-7" /> + id="path3821" /> + id="path3823" /> diff --git a/rtdata/images/svg/color-picker-hide.svg b/rtdata/icons/rawtherapee/scalable/apps/color-picker-hide.svg similarity index 67% rename from rtdata/images/svg/color-picker-hide.svg rename to rtdata/icons/rawtherapee/scalable/apps/color-picker-hide.svg index be180885e..bf6d31680 100644 --- a/rtdata/images/svg/color-picker-hide.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/color-picker-hide.svg @@ -2,59 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + id="path9921-9-3-9-8" /> + style="opacity:0.3;fill:#cccccc;fill-opacity:1.0;stroke:#cccccc;stroke-width:1.00151598;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1.0" /> + id="path17041" /> + id="path822" /> diff --git a/rtdata/images/svg/color-picker-small.svg b/rtdata/icons/rawtherapee/scalable/apps/color-picker-small.svg similarity index 68% rename from rtdata/images/svg/color-picker-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/color-picker-small.svg index d83400653..f085e9c2d 100644 --- a/rtdata/images/svg/color-picker-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/color-picker-small.svg @@ -2,59 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -99,21 +56,15 @@ + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:#cccccc;stroke-width:1.00151598;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1.0" /> + id="path822" /> @@ -121,13 +72,11 @@ id="path17041" transform="translate(0,8)" d="M 8.5996094,4.6132812 C 7.9891853,5.2309506 7.3674012,5.8422033 6.7597656,6.4707031 6.0490574,7.1848845 5.3334202,7.8974278 4.6464844,8.6445312 a 0.2448101,0.24497104 0 0 0 -0.035156,0.048828 C 4.4758783,8.9404628 4.4084807,9.1951286 4.328125,9.4121094 4.2477692,9.6290908 4.1597161,9.8016252 4.0136719,9.9238281 a 0.2448101,0.24497104 0 0 0 -0.037109,0.041016 c -0.414866,0.5579799 -0.1942661,1.3358159 0.3261715,1.7128899 0.4295663,0.352432 1.0465094,0.292563 1.4453125,-0.04492 l -0.017578,0.01367 c 0.2791087,-0.197793 0.554147,-0.364305 0.8417968,-0.414062 A 0.2448101,0.24497104 0 0 0 6.625,11.216797 C 7.4370634,10.886847 7.886835,10.1655 8.4121094,9.7011719 a 0.2448101,0.24497104 0 0 0 0.00977,-0.011719 C 9.3185591,8.7927604 10.214748,7.8962737 11.111328,7 11.098918,7.0008725 11.088758,7.00741 11.076168,7.00781 10.6583,6.9873298 10.291674,6.8102187 9.9609375,6.5683594 8.7783993,7.7536562 7.6035634,8.9481747 6.4023438,10.103516 c -0.1447329,0.07969 -0.3434276,0.127975 -0.5703126,0.193359 -0.2332819,0.06723 -0.5032928,0.164694 -0.7011718,0.408203 a 0.2448101,0.24497104 0 0 0 -0.013672,0.01953 c -0.018269,0.02776 -0.066987,0.06555 -0.1015625,0.07617 -0.034575,0.01062 -0.034649,0.0086 -0.044922,0 a 0.2448101,0.24497104 0 0 0 -0.035156,-0.02539 c -0.022238,-0.01269 -0.062217,-0.06429 -0.070312,-0.103516 -0.0081,-0.03923 -0.0087,-0.03651 0.00781,-0.04883 a 0.2448101,0.24497104 0 0 0 0.027344,-0.02149 c 0.2194594,-0.216848 0.450492,-0.497389 0.5,-0.8769526 L 5.3984375,9.75 C 5.4691719,9.4499134 5.5532474,9.1916878 5.7363281,9.0585938 A 0.2448101,0.24497104 0 0 0 5.765625,9.0332031 C 6.8638741,7.924874 7.9727833,6.823097 9.0761719,5.7167969 8.8267121,5.4055299 8.599334,5.0104373 8.5996094,4.6132812 Z" - style="opacity:0.7;fill:#2a7fff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.3266921" - inkscape:connector-curvature="0" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:0.3266921" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.3266921" /> diff --git a/rtdata/images/svg/color-picker.svg b/rtdata/icons/rawtherapee/scalable/apps/color-picker.svg similarity index 68% rename from rtdata/images/svg/color-picker.svg rename to rtdata/icons/rawtherapee/scalable/apps/color-picker.svg index d52d96633..22f4cda36 100644 --- a/rtdata/images/svg/color-picker.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/color-picker.svg @@ -2,59 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.32020855" /> + id="path6419-3-9-4-4" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:0.32020855" /> + id="path822" /> diff --git a/rtdata/icons/rawtherapee/scalable/apps/contrastmask-off.svg b/rtdata/icons/rawtherapee/scalable/apps/contrastmask-off.svg new file mode 100644 index 000000000..ae3d093ce --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/contrastmask-off.svg @@ -0,0 +1,85 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/contrastmask-on.svg b/rtdata/icons/rawtherapee/scalable/apps/contrastmask-on.svg new file mode 100644 index 000000000..24432898e --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/contrastmask-on.svg @@ -0,0 +1,85 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/copy.svg b/rtdata/icons/rawtherapee/scalable/apps/copy.svg similarity index 64% rename from rtdata/images/svg/copy.svg rename to rtdata/icons/rawtherapee/scalable/apps/copy.svg index 9471e1ea7..3903eae8c 100644 --- a/rtdata/images/svg/copy.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/copy.svg @@ -2,209 +2,146 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + style="overflow:visible"> + style="overflow:visible"> + id="ExperimentalArrow"> + style="fill:context-stroke;stroke:#000000;stroke-opacity:1.0" /> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> @@ -249,29 +186,26 @@ + id="layer1"> + id="path8807" /> diff --git a/rtdata/images/svg/crop-auto-small.svg b/rtdata/icons/rawtherapee/scalable/apps/crop-auto-small.svg similarity index 51% rename from rtdata/images/svg/crop-auto-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/crop-auto-small.svg index 6d8ac3ea7..5624463e2 100644 --- a/rtdata/images/svg/crop-auto-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/crop-auto-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -97,35 +56,27 @@ + id="rect1324" /> + id="path879" /> + id="path877" /> + style="display:inline;opacity:1;fill:#008000;fill-opacity:1.0;stroke:none;stroke-width:0.04999533" /> diff --git a/rtdata/images/svg/crop-auto.svg b/rtdata/icons/rawtherapee/scalable/apps/crop-auto.svg similarity index 52% rename from rtdata/images/svg/crop-auto.svg rename to rtdata/icons/rawtherapee/scalable/apps/crop-auto.svg index bc662e9ea..c74bc4a64 100644 --- a/rtdata/images/svg/crop-auto.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/crop-auto.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.97660822;paint-order:normal" /> + id="path849" /> + id="path847" /> + style="display:inline;opacity:1;fill:#008000;fill-opacity:1.0;stroke:none;stroke-width:0.04999533" /> diff --git a/rtdata/icons/rawtherapee/scalable/apps/crop-point-hicontrast.svg b/rtdata/icons/rawtherapee/scalable/apps/crop-point-hicontrast.svg new file mode 100644 index 000000000..7ddece7e0 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/crop-point-hicontrast.svg @@ -0,0 +1,114 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/crop-small.svg b/rtdata/icons/rawtherapee/scalable/apps/crop-small.svg new file mode 100644 index 000000000..0266ae19e --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/crop-small.svg @@ -0,0 +1,69 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/crop.svg b/rtdata/icons/rawtherapee/scalable/apps/crop.svg new file mode 100644 index 000000000..72653e0c0 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/crop.svg @@ -0,0 +1,68 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/crossed-arrows-in.svg b/rtdata/icons/rawtherapee/scalable/apps/crossed-arrows-in.svg similarity index 62% rename from rtdata/images/svg/crossed-arrows-in.svg rename to rtdata/icons/rawtherapee/scalable/apps/crossed-arrows-in.svg index 8a4c71dc8..17c4ea79a 100644 --- a/rtdata/images/svg/crossed-arrows-in.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/crossed-arrows-in.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> diff --git a/rtdata/images/svg/crossed-arrows-out.svg b/rtdata/icons/rawtherapee/scalable/apps/crossed-arrows-out.svg similarity index 58% rename from rtdata/images/svg/crossed-arrows-out.svg rename to rtdata/icons/rawtherapee/scalable/apps/crossed-arrows-out.svg index 5eb5ba4b1..6aa419d86 100644 --- a/rtdata/images/svg/crossed-arrows-out.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/crossed-arrows-out.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + id="path2876" /> + id="path2866" /> + id="path2864" /> + id="path2893" /> diff --git a/rtdata/images/svg/crosshair-adjust.svg b/rtdata/icons/rawtherapee/scalable/apps/crosshair-adjust.svg similarity index 56% rename from rtdata/images/svg/crosshair-adjust.svg rename to rtdata/icons/rawtherapee/scalable/apps/crosshair-adjust.svg index 4cde3415a..26e394a0f 100644 --- a/rtdata/images/svg/crosshair-adjust.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/crosshair-adjust.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,23 +55,18 @@ + id="layer1"> + id="path2866" /> + style="display:inline;opacity:0.9;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.0348262" /> + id="path1448-3" /> diff --git a/rtdata/images/svg/crosshair-hicontrast.svg b/rtdata/icons/rawtherapee/scalable/apps/crosshair-hicontrast.svg similarity index 67% rename from rtdata/images/svg/crosshair-hicontrast.svg rename to rtdata/icons/rawtherapee/scalable/apps/crosshair-hicontrast.svg index a4dcc2592..e27a576a8 100644 --- a/rtdata/images/svg/crosshair-hicontrast.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/crosshair-hicontrast.svg @@ -2,77 +2,25 @@ - - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="path3792" /> image/svg+xml - + Maciej Dworak @@ -116,24 +64,19 @@ + id="layer1"> + id="rect1419" /> + id="rect1440" /> + style="opacity:1;fill:#ffffff;fill-opacity:1.0;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0;paint-order:normal" + id="path1448" /> + style="opacity:1;fill:#ff0000;fill-opacity:1.0;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + id="path1481" /> + style="opacity:1;fill:#ffffff;fill-opacity:1.0;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0;paint-order:normal" /> diff --git a/rtdata/images/svg/crosshair-node-curve.svg b/rtdata/icons/rawtherapee/scalable/apps/crosshair-node-curve.svg similarity index 59% rename from rtdata/images/svg/crosshair-node-curve.svg rename to rtdata/icons/rawtherapee/scalable/apps/crosshair-node-curve.svg index d72c2a929..9630c0bd6 100644 --- a/rtdata/images/svg/crosshair-node-curve.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/crosshair-node-curve.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,39 +55,33 @@ + id="layer1"> + id="rect825" /> + id="rect829" /> + id="path853" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none"> + style="opacity:1;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.9;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> diff --git a/rtdata/icons/rawtherapee/scalable/apps/crosshair-small.svg b/rtdata/icons/rawtherapee/scalable/apps/crosshair-small.svg new file mode 100644 index 000000000..d86658cac --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/crosshair-small.svg @@ -0,0 +1,109 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/curve-catmullrom-small.svg b/rtdata/icons/rawtherapee/scalable/apps/curve-catmullrom-small.svg similarity index 63% rename from rtdata/images/svg/curve-catmullrom-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/curve-catmullrom-small.svg index bc6378bb4..137ad3e13 100644 --- a/rtdata/images/svg/curve-catmullrom-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/curve-catmullrom-small.svg @@ -2,66 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -106,54 +56,46 @@ + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:#cccccc;stroke-width:0.80000007;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1.0;paint-order:normal" /> + style="opacity:0.9;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1.0;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:#cccccc;stroke-width:0.80000007;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1.0;paint-order:normal" /> + style="opacity:0.9;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1.0;paint-order:normal" /> + id="circle4399" /> + id="circle4405" /> diff --git a/rtdata/images/svg/curve-catmullrom.svg b/rtdata/icons/rawtherapee/scalable/apps/curve-catmullrom.svg similarity index 63% rename from rtdata/images/svg/curve-catmullrom.svg rename to rtdata/icons/rawtherapee/scalable/apps/curve-catmullrom.svg index b59954885..2b9f2f9e8 100644 --- a/rtdata/images/svg/curve-catmullrom.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/curve-catmullrom.svg @@ -2,62 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -101,16 +55,13 @@ + id="layer1"> + id="circle817" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0;paint-order:normal" /> + style="opacity:0.7;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1.0;paint-order:normal" /> diff --git a/rtdata/images/svg/curve-controlpoints-small.svg b/rtdata/icons/rawtherapee/scalable/apps/curve-controlpoints-small.svg similarity index 63% rename from rtdata/images/svg/curve-controlpoints-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/curve-controlpoints-small.svg index fc85b8774..104d5ffc9 100644 --- a/rtdata/images/svg/curve-controlpoints-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/curve-controlpoints-small.svg @@ -2,63 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> @@ -116,17 +67,16 @@ cy="19" cx="-15" id="circle828" - style="opacity:0.7;fill:#2a7fff;fill-opacity:1;fill-rule:nonzero;stroke:#2a7fff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:#cccccc;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1.0;paint-order:normal" /> + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1.0;paint-order:normal" /> diff --git a/rtdata/images/svg/curve-controlpoints.svg b/rtdata/icons/rawtherapee/scalable/apps/curve-controlpoints.svg similarity index 61% rename from rtdata/images/svg/curve-controlpoints.svg rename to rtdata/icons/rawtherapee/scalable/apps/curve-controlpoints.svg index 2d432264c..c3121e735 100644 --- a/rtdata/images/svg/curve-controlpoints.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/curve-controlpoints.svg @@ -2,65 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -104,16 +55,13 @@ + id="path15207" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0;paint-order:normal" /> + id="path15253" /> + id="path15255" /> + style="opacity:0.5;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1.0;paint-order:normal" /> + style="opacity:0.5;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.5;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.3;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.3;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1;paint-order:normal" /> diff --git a/rtdata/icons/rawtherapee/scalable/apps/curve-flat-small.svg b/rtdata/icons/rawtherapee/scalable/apps/curve-flat-small.svg new file mode 100644 index 000000000..377a73269 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/curve-flat-small.svg @@ -0,0 +1,65 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/curve-flat.svg b/rtdata/icons/rawtherapee/scalable/apps/curve-flat.svg new file mode 100644 index 000000000..47d5af103 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/curve-flat.svg @@ -0,0 +1,64 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/curve-linear-small.svg b/rtdata/icons/rawtherapee/scalable/apps/curve-linear-small.svg new file mode 100644 index 000000000..286c9207b --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/curve-linear-small.svg @@ -0,0 +1,65 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/curve-linear.svg b/rtdata/icons/rawtherapee/scalable/apps/curve-linear.svg similarity index 54% rename from rtdata/images/svg/curve-linear.svg rename to rtdata/icons/rawtherapee/scalable/apps/curve-linear.svg index b016121aa..34a7207b8 100644 --- a/rtdata/images/svg/curve-linear.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/curve-linear.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + id="path7133" /> diff --git a/rtdata/images/svg/curve-nurbs-small.svg b/rtdata/icons/rawtherapee/scalable/apps/curve-nurbs-small.svg similarity index 57% rename from rtdata/images/svg/curve-nurbs-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/curve-nurbs-small.svg index 1ff3a1a76..6519af88b 100644 --- a/rtdata/images/svg/curve-nurbs-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/curve-nurbs-small.svg @@ -2,63 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -103,23 +56,19 @@ + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> diff --git a/rtdata/images/svg/curve-nurbs.svg b/rtdata/icons/rawtherapee/scalable/apps/curve-nurbs.svg similarity index 60% rename from rtdata/images/svg/curve-nurbs.svg rename to rtdata/icons/rawtherapee/scalable/apps/curve-nurbs.svg index 1d7ef10ce..e4b73b9ed 100644 --- a/rtdata/images/svg/curve-nurbs.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/curve-nurbs.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + id="path4882" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0;paint-order:normal" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> diff --git a/rtdata/icons/rawtherapee/scalable/apps/curve-parametric-small.svg b/rtdata/icons/rawtherapee/scalable/apps/curve-parametric-small.svg new file mode 100644 index 000000000..0b2f22b9b --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/curve-parametric-small.svg @@ -0,0 +1,86 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/curve-parametric.svg b/rtdata/icons/rawtherapee/scalable/apps/curve-parametric.svg new file mode 100644 index 000000000..ce228bec6 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/curve-parametric.svg @@ -0,0 +1,86 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/curve-spline-small.svg b/rtdata/icons/rawtherapee/scalable/apps/curve-spline-small.svg similarity index 59% rename from rtdata/images/svg/curve-spline-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/curve-spline-small.svg index 990df0c0d..63633af65 100644 --- a/rtdata/images/svg/curve-spline-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/curve-spline-small.svg @@ -2,63 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="path818" /> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + id="path815" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0;paint-order:normal" /> diff --git a/rtdata/images/svg/detail.svg b/rtdata/icons/rawtherapee/scalable/apps/detail.svg similarity index 63% rename from rtdata/images/svg/detail.svg rename to rtdata/icons/rawtherapee/scalable/apps/detail.svg index 89aab821b..9b1fe5acd 100644 --- a/rtdata/images/svg/detail.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/detail.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="opacity:0.7;fill:#cccccc;fill-rule:evenodd;stroke:none;fill-opacity:1.0" /> + style="opacity:0.1;fill:#cccccc;fill-rule:evenodd;stroke:none;fill-opacity:1.0" /> + style="opacity:0.7;fill:#cccccc;fill-rule:evenodd;stroke:none;fill-opacity:1.0" /> + style="opacity:0.7;fill:#cccccc;fill-rule:evenodd;stroke:none;stroke-width:0.02394956;fill-opacity:1.0" /> + style="opacity:0.2;fill:#cccccc;fill-rule:evenodd;stroke:none;stroke-width:0.02394956;fill-opacity:1.0" /> + style="opacity:0.2;fill:#cccccc;fill-rule:evenodd;stroke:none;stroke-width:0.02394956;fill-opacity:1.0" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke-width:0.75" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke-width:0.5" /> + style="opacity:0.2;fill:#cccccc;fill-opacity:1.0;stroke-width:0.75" /> + style="opacity:0.1;fill:#cccccc;fill-opacity:1.0;stroke-width:0.5" /> + style="opacity:0.1;fill:#cccccc;fill-opacity:1.0;stroke-width:0.5" /> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -99,17 +55,14 @@ + id="layer1"> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1;paint-order:normal" /> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -99,15 +55,13 @@ + id="layer1"> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -98,11 +55,9 @@ + id="layer1"> diff --git a/rtdata/images/svg/device-optical.svg b/rtdata/icons/rawtherapee/scalable/apps/device-optical.svg similarity index 76% rename from rtdata/images/svg/device-optical.svg rename to rtdata/icons/rawtherapee/scalable/apps/device-optical.svg index de73e9422..5b374de3a 100644 --- a/rtdata/images/svg/device-optical.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/device-optical.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,21 +55,18 @@ + id="layer1"> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> diff --git a/rtdata/images/svg/device-usb.svg b/rtdata/icons/rawtherapee/scalable/apps/device-usb.svg similarity index 66% rename from rtdata/images/svg/device-usb.svg rename to rtdata/icons/rawtherapee/scalable/apps/device-usb.svg index 116a6e1f5..bc68214eb 100644 --- a/rtdata/images/svg/device-usb.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/device-usb.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,11 +55,9 @@ + id="layer1"> diff --git a/rtdata/images/svg/distortion-auto-small.svg b/rtdata/icons/rawtherapee/scalable/apps/distortion-auto-small.svg similarity index 76% rename from rtdata/images/svg/distortion-auto-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/distortion-auto-small.svg index 6a8ac0a03..dd9726fb6 100644 --- a/rtdata/images/svg/distortion-auto-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/distortion-auto-small.svg @@ -2,66 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -106,36 +56,28 @@ + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1.0;paint-order:normal" + id="path1207" /> + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1.0;paint-order:normal" + id="path838" /> + style="display:inline;opacity:1;fill:#008000;fill-opacity:1.0;stroke:none;stroke-width:0.04999533" /> diff --git a/rtdata/images/svg/distortion-auto.svg b/rtdata/icons/rawtherapee/scalable/apps/distortion-auto.svg similarity index 76% rename from rtdata/images/svg/distortion-auto.svg rename to rtdata/icons/rawtherapee/scalable/apps/distortion-auto.svg index 8cfadb130..2d14f873f 100644 --- a/rtdata/images/svg/distortion-auto.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/distortion-auto.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.72779661;marker:none;enable-background:accumulate" /> + style="display:inline;opacity:1;fill:#008000;fill-opacity:1.0;stroke:none;stroke-width:0.04999533" /> diff --git a/rtdata/images/svg/distortion-barrel-small.svg b/rtdata/icons/rawtherapee/scalable/apps/distortion-barrel-small.svg similarity index 53% rename from rtdata/images/svg/distortion-barrel-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/distortion-barrel-small.svg index b769bd0aa..70bdae4ec 100644 --- a/rtdata/images/svg/distortion-barrel-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/distortion-barrel-small.svg @@ -2,68 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -108,20 +56,14 @@ + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1.0;paint-order:normal" + id="path1207" /> + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1.0;paint-order:normal" + d="m 1.5,17.5 c 4.3333333,0.666667 8.666667,0.666667 13,0 m -13,-3 c 4.3333333,-0.666667 8.666667,-0.666667 13,0 m -4,-4 c 0.650292,3.616036 0.682877,7.280165 0,11 m -5,-11 c -0.6584443,3.641034 -0.6748477,7.307062 0,11 M 2,11.5 c 4.2825076,-1.305586 7.61369,-1.360845 12,0 0.666667,3 0.666667,6 0,9 -4.413583,1.374278 -7.7421039,1.291863 -12,0 -0.676645,-3.026341 -0.6566267,-6.025562 0,-9 z" /> diff --git a/rtdata/images/svg/distortion-barrel.svg b/rtdata/icons/rawtherapee/scalable/apps/distortion-barrel.svg similarity index 60% rename from rtdata/images/svg/distortion-barrel.svg rename to rtdata/icons/rawtherapee/scalable/apps/distortion-barrel.svg index 012651e87..762f0771b 100644 --- a/rtdata/images/svg/distortion-barrel.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/distortion-barrel.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,13 +55,10 @@ + id="layer1"> diff --git a/rtdata/images/svg/distortion-pincushion-small.svg b/rtdata/icons/rawtherapee/scalable/apps/distortion-pincushion-small.svg similarity index 54% rename from rtdata/images/svg/distortion-pincushion-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/distortion-pincushion-small.svg index 8c26277d2..8f262e176 100644 --- a/rtdata/images/svg/distortion-pincushion-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/distortion-pincushion-small.svg @@ -2,66 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1.0;paint-order:normal" + id="path1207" /> + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1.0;paint-order:normal" + d="M 2.8112464,17.975283 C 7.1188978,17.315578 8.8287055,17.32088 13.188262,17.99448 M 2.7853074,13.943943 c 4.3076514,0.659705 6.0609769,0.7413 10.4205336,0.0677 m -2.922632,-2.196722 c -0.6422099,3.591664 -0.6435523,4.629432 0.04721,8.376771 M 5.7102407,11.813858 c 0.6666667,3.666667 0.5279002,4.730262 -0.1387665,8.396929 M 1.5,10.5 c 4.3333333,2 8.666667,2 13,0 -1.90259,3.567911 -2.095481,7.224565 0,11 -4.413626,-2.041021 -8.7421418,-1.958561 -13,0 2.0486318,-3.719835 1.9508767,-7.383964 0,-11 z" /> diff --git a/rtdata/images/svg/distortion-pincushion.svg b/rtdata/icons/rawtherapee/scalable/apps/distortion-pincushion.svg similarity index 75% rename from rtdata/images/svg/distortion-pincushion.svg rename to rtdata/icons/rawtherapee/scalable/apps/distortion-pincushion.svg index c893eb99a..50b3a923c 100644 --- a/rtdata/images/svg/distortion-pincushion.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/distortion-pincushion.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,15 +55,12 @@ + id="layer1"> diff --git a/rtdata/images/svg/draw.svg b/rtdata/icons/rawtherapee/scalable/apps/draw.svg similarity index 54% rename from rtdata/images/svg/draw.svg rename to rtdata/icons/rawtherapee/scalable/apps/draw.svg index 30ea04ea4..db922ba0c 100644 --- a/rtdata/images/svg/draw.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/draw.svg @@ -1,57 +1,15 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + id="path1658" /> diff --git a/rtdata/icons/rawtherapee/scalable/apps/edit-point.svg b/rtdata/icons/rawtherapee/scalable/apps/edit-point.svg new file mode 100644 index 000000000..24374ed02 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/edit-point.svg @@ -0,0 +1,106 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/edit-small.svg b/rtdata/icons/rawtherapee/scalable/apps/edit-small.svg new file mode 100644 index 000000000..359c1973f --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/edit-small.svg @@ -0,0 +1,77 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/edit.svg b/rtdata/icons/rawtherapee/scalable/apps/edit.svg new file mode 100644 index 000000000..c569c5ea0 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/edit.svg @@ -0,0 +1,86 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/equilizer-narrow.svg b/rtdata/icons/rawtherapee/scalable/apps/equilizer-narrow.svg new file mode 100644 index 000000000..758d248d1 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/equilizer-narrow.svg @@ -0,0 +1,264 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/equilizer-wide.svg b/rtdata/icons/rawtherapee/scalable/apps/equilizer-wide.svg new file mode 100644 index 000000000..8662e4bcb --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/equilizer-wide.svg @@ -0,0 +1,188 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/expander-closed-small.svg b/rtdata/icons/rawtherapee/scalable/apps/expander-closed-small.svg new file mode 100644 index 000000000..f050fd36e --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/expander-closed-small.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/expander-open-small.svg b/rtdata/icons/rawtherapee/scalable/apps/expander-open-small.svg new file mode 100644 index 000000000..957366a06 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/expander-open-small.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/exposure.svg b/rtdata/icons/rawtherapee/scalable/apps/exposure.svg new file mode 100644 index 000000000..cbcf4df6f --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/exposure.svg @@ -0,0 +1,78 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/filetype-hdr.svg b/rtdata/icons/rawtherapee/scalable/apps/filetype-hdr.svg similarity index 73% rename from rtdata/images/svg/filetype-hdr.svg rename to rtdata/icons/rawtherapee/scalable/apps/filetype-hdr.svg index bb5776d6f..5475fe302 100644 --- a/rtdata/images/svg/filetype-hdr.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/filetype-hdr.svg @@ -2,58 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.38199139px;font-family:'Arial Black';-inkscape-font-specification:'Arial Black, ';fill:#ffffff;fill-opacity:1.0;stroke-width:0.99999994px" + d="M 2.2878589,9.0000003 H 4.1418834 V 11.099591 H 6.1678042 V 9.0000003 h 1.86221 V 15 h -1.86221 V 12.572988 H 4.1418834 V 15 H 2.2878589 Z" /> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.38199139px;font-family:'Arial Black';-inkscape-font-specification:'Arial Black, ';fill:#ffffff;fill-opacity:1.0;stroke-width:0.99999994px" + d="m 9.2946799,9.0000003 h 2.7544341 q 0.814461,0 1.313779,0.2210095 0.50341,0.2210096 0.830832,0.6343793 0.327421,0.4133699 0.474761,0.9618009 0.14734,0.548431 0.14734,1.162346 0,0.961801 -0.22101,1.493861 -0.216917,0.527967 -0.60573,0.888131 -0.388813,0.356071 -0.834925,0.474761 Q 12.544339,15 12.049114,15 H 9.2946799 Z M 11.148704,10.3588 v 3.278308 h 0.454298 q 0.581173,0 0.826739,-0.126876 0.245566,-0.130969 0.38472,-0.450205 0.139155,-0.323328 0.139155,-1.043656 0,-0.953615 -0.311051,-1.305593 Q 12.331515,10.3588 11.611187,10.3588 Z" /> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.38199139px;font-family:'Arial Black';-inkscape-font-specification:'Arial Black, ';fill:#ffffff;fill-opacity:1.0;stroke-width:0.99999994px" + d="M 15.810368,15 V 9.0000003 h 3.090041 q 0.859481,0 1.313779,0.1473397 0.454297,0.1473397 0.732605,0.5484311 0.278309,0.3969989 0.278309,0.9699859 0,0.499318 -0.212824,0.863575 -0.212824,0.360163 -0.585266,0.585266 -0.237381,0.143247 -0.650751,0.23738 0.331515,0.110505 0.482947,0.22101 0.102319,0.07367 0.294679,0.315143 0.196453,0.241473 0.261938,0.372442 L 21.712141,15 h -2.095498 l -0.99045,-1.833561 Q 18.437926,12.810368 18.290586,12.703956 18.09004,12.564802 17.836289,12.564802 H 17.672578 V 15 Z m 1.86221,-3.568895 h 0.781719 q 0.126876,0 0.491132,-0.08186 0.184175,-0.03683 0.298772,-0.188268 0.118691,-0.151432 0.118691,-0.347885 0,-0.290587 -0.184175,-0.446112 -0.184175,-0.155525 -0.691678,-0.155525 h -0.814461 z" /> diff --git a/rtdata/images/svg/filetype-ps.svg b/rtdata/icons/rawtherapee/scalable/apps/filetype-ps.svg similarity index 72% rename from rtdata/images/svg/filetype-ps.svg rename to rtdata/icons/rawtherapee/scalable/apps/filetype-ps.svg index f10eabffd..56ecde611 100644 --- a/rtdata/images/svg/filetype-ps.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/filetype-ps.svg @@ -2,58 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.10554028px;font-family:'Arial Black';-inkscape-font-specification:'Arial Black, ';fill:#ffffff;fill-opacity:1.0;stroke-width:0.99999982px" + d="m 6.591689,9.098945 h 2.9802109 q 0.9736151,0 1.4564641,0.4630606 0.486808,0.4630604 0.486808,1.3179414 0,0.878628 -0.530343,1.373351 -0.526386,0.494723 -1.6108183,0.494723 H 8.3924805 v 2.153034 H 6.591689 Z m 1.8007915,2.473615 h 0.4393139 q 0.5184696,0 0.7282321,-0.178101 0.2097626,-0.182058 0.2097626,-0.46306 0,-0.273087 -0.1820581,-0.463061 -0.182058,-0.189974 -0.6846965,-0.189974 h -0.510554 z" /> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.10554028px;font-family:'Arial Black';-inkscape-font-specification:'Arial Black, ';fill:#ffffff;fill-opacity:1.0;stroke-width:0.99999982px" + d="m 12.144459,12.98153 1.705804,-0.10686 q 0.05541,0.415568 0.225594,0.633246 0.277045,0.352242 0.791557,0.352242 0.383905,0 0.58971,-0.1781 0.209762,-0.182058 0.209762,-0.419525 0,-0.225594 -0.197889,-0.403694 -0.197889,-0.1781 -0.918206,-0.336411 -1.179419,-0.265172 -1.682058,-0.704486 -0.506596,-0.439314 -0.506596,-1.120053 0,-0.447229 0.257256,-0.8430074 0.261214,-0.3997361 0.779683,-0.6253298 0.522428,-0.2295514 1.42876,-0.2295514 1.112137,0 1.693931,0.4155672 0.585752,0.4116095 0.69657,1.3139844 l -1.689973,0.09894 q -0.06728,-0.39182 -0.284961,-0.569921 -0.21372,-0.1781 -0.593667,-0.1781 -0.312665,0 -0.470976,0.134565 -0.158312,0.130607 -0.158312,0.32058 0,0.138523 0.130607,0.249341 0.126649,0.114775 0.601583,0.21372 1.175462,0.253298 1.682058,0.514512 0.510554,0.257256 0.740105,0.641161 0.23351,0.383905 0.23351,0.858839 0,0.558047 -0.308707,1.029023 -0.308707,0.470977 -0.862797,0.716359 Q 15.682717,15 14.839709,15 13.359498,15 12.789578,14.430079 12.219657,13.860158 12.144459,12.98153 Z" /> diff --git a/rtdata/images/svg/filter-clear.svg b/rtdata/icons/rawtherapee/scalable/apps/filter-clear.svg similarity index 62% rename from rtdata/images/svg/filter-clear.svg rename to rtdata/icons/rawtherapee/scalable/apps/filter-clear.svg index 27af953db..6ecaae628 100644 --- a/rtdata/images/svg/filter-clear.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/filter-clear.svg @@ -2,66 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -105,17 +55,13 @@ + id="layer1"> + style="fill:none;fill-rule:evenodd;stroke:#c00000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" + d="M 22,10 12,20 m 0,-10 10,10" /> diff --git a/rtdata/images/svg/filter-original.svg b/rtdata/icons/rawtherapee/scalable/apps/filter-original.svg similarity index 55% rename from rtdata/images/svg/filter-original.svg rename to rtdata/icons/rawtherapee/scalable/apps/filter-original.svg index c14a57a99..6c5b68cb6 100644 --- a/rtdata/images/svg/filter-original.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/filter-original.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,23 +55,17 @@ + id="layer1"> + id="path1049" /> + id="path1052" /> + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/filter.svg b/rtdata/icons/rawtherapee/scalable/apps/filter.svg similarity index 59% rename from rtdata/images/svg/filter.svg rename to rtdata/icons/rawtherapee/scalable/apps/filter.svg index 684ffc35e..c106ea0d2 100644 --- a/rtdata/images/svg/filter.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/filter.svg @@ -2,67 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + id="path816" /> diff --git a/rtdata/icons/rawtherapee/scalable/apps/flip-horizontal.svg b/rtdata/icons/rawtherapee/scalable/apps/flip-horizontal.svg new file mode 100644 index 000000000..53011fcd1 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/flip-horizontal.svg @@ -0,0 +1,88 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/flip-vertical.svg b/rtdata/icons/rawtherapee/scalable/apps/flip-vertical.svg new file mode 100644 index 000000000..a8bb5a435 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/flip-vertical.svg @@ -0,0 +1,88 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/focusscreen-off.svg b/rtdata/icons/rawtherapee/scalable/apps/focusscreen-off.svg similarity index 54% rename from rtdata/images/svg/focusscreen-off.svg rename to rtdata/icons/rawtherapee/scalable/apps/focusscreen-off.svg index 0197b8b5d..88694a939 100644 --- a/rtdata/images/svg/focusscreen-off.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/focusscreen-off.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,24 +55,20 @@ + id="layer1"> + id="path8457" /> + id="path8455" /> diff --git a/rtdata/images/svg/focusscreen-on.svg b/rtdata/icons/rawtherapee/scalable/apps/focusscreen-on.svg similarity index 55% rename from rtdata/images/svg/focusscreen-on.svg rename to rtdata/icons/rawtherapee/scalable/apps/focusscreen-on.svg index b6a6149f7..6d585c82d 100644 --- a/rtdata/images/svg/focusscreen-on.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/focusscreen-on.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,9 +55,7 @@ + id="layer1"> + style="opacity:0.3;fill:#1ce434;fill-opacity:1.0;stroke:none;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="opacity:0.8;fill:#1ce434;fill-opacity:1.0;stroke:none;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="opacity:0.5;fill:#1ce434;fill-opacity:1.0;stroke:none;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/rtdata/images/svg/folder-closed-home-small.svg b/rtdata/icons/rawtherapee/scalable/apps/folder-closed-home-small.svg similarity index 64% rename from rtdata/images/svg/folder-closed-home-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/folder-closed-home-small.svg index e2988a681..ab30d780c 100644 --- a/rtdata/images/svg/folder-closed-home-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/folder-closed-home-small.svg @@ -2,61 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2.85361719;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2.7568562;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + style="display:inline;opacity:0.5;fill:#ffffff;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:4.52244794pt" + d="M 4,21 H 6.9090909 V 17.363636 H 9.0909091 V 21 H 12 v -3.636364 h 1.454545 L 8,14 2.5454545,17.363636 H 4 C 3.99789,18.81946 3.927319,19.546354 4,21 Z" /> diff --git a/rtdata/images/svg/folder-closed-home.svg b/rtdata/icons/rawtherapee/scalable/apps/folder-closed-home.svg similarity index 62% rename from rtdata/images/svg/folder-closed-home.svg rename to rtdata/icons/rawtherapee/scalable/apps/folder-closed-home.svg index d4bf64e15..3fb5168b3 100644 --- a/rtdata/images/svg/folder-closed-home.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/folder-closed-home.svg @@ -2,58 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + id="path1047" /> + id="rect1030" /> + style="display:inline;opacity:0.5;fill:#ffffff;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:4.52244794pt" + d="m 6,19 h 4 v -5 h 3 v 5 h 4 v -5 h 2 L 11.5,8 4,14 h 2 c -0.0029,2.001757 -0.099937,3.001237 0,5 z" /> + style="opacity:0.5;fill:#cccccc;fill-opacity:1.0;stroke:#cccccc;stroke-width:1.99999988;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:#cccccc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0;paint-order:normal" /> + style="display:inline;opacity:0.7;fill:#ffffff;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:4.52244794pt" + id="path828" /> diff --git a/rtdata/images/svg/folder-closed-recent-small.svg b/rtdata/icons/rawtherapee/scalable/apps/folder-closed-recent-small.svg similarity index 67% rename from rtdata/images/svg/folder-closed-recent-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/folder-closed-recent-small.svg index e412e386c..b78ce69f0 100644 --- a/rtdata/images/svg/folder-closed-recent-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/folder-closed-recent-small.svg @@ -2,61 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2.85361719;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2.7568562;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> diff --git a/rtdata/images/svg/folder-closed-recent.svg b/rtdata/icons/rawtherapee/scalable/apps/folder-closed-recent.svg similarity index 67% rename from rtdata/images/svg/folder-closed-recent.svg rename to rtdata/icons/rawtherapee/scalable/apps/folder-closed-recent.svg index 84da8e236..8fab002eb 100644 --- a/rtdata/images/svg/folder-closed-recent.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/folder-closed-recent.svg @@ -2,58 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + id="path1047" /> + id="rect1030" /> + style="opacity:1;fill:#cccccc;fill-opacity:1.0;stroke:#cccccc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:#cccccc;stroke-width:1.99999988;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="display:inline;opacity:0.7;fill:#ffffff;fill-opacity:1.0;stroke:none;stroke-width:1;enable-background:new" /> diff --git a/rtdata/images/svg/folder-closed-small.svg b/rtdata/icons/rawtherapee/scalable/apps/folder-closed-small.svg similarity index 65% rename from rtdata/images/svg/folder-closed-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/folder-closed-small.svg index f86f2157f..b35e607ca 100644 --- a/rtdata/images/svg/folder-closed-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/folder-closed-small.svg @@ -2,61 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -101,25 +56,19 @@ + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2.85361719;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2.7568562;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> diff --git a/rtdata/images/svg/folder-closed.svg b/rtdata/icons/rawtherapee/scalable/apps/folder-closed.svg similarity index 66% rename from rtdata/images/svg/folder-closed.svg rename to rtdata/icons/rawtherapee/scalable/apps/folder-closed.svg index 74166166c..14aec7062 100644 --- a/rtdata/images/svg/folder-closed.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/folder-closed.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1.85864949;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1.79562616;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> diff --git a/rtdata/images/svg/folder-open-recent-small.svg b/rtdata/icons/rawtherapee/scalable/apps/folder-open-recent-small.svg similarity index 66% rename from rtdata/images/svg/folder-open-recent-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/folder-open-recent-small.svg index dc2f2ec3f..b6f98a566 100644 --- a/rtdata/images/svg/folder-open-recent-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/folder-open-recent-small.svg @@ -2,65 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="path1026" /> + id="rect1030-7" /> diff --git a/rtdata/images/svg/folder-open-recent.svg b/rtdata/icons/rawtherapee/scalable/apps/folder-open-recent.svg similarity index 65% rename from rtdata/images/svg/folder-open-recent.svg rename to rtdata/icons/rawtherapee/scalable/apps/folder-open-recent.svg index c0baf0ccf..6c787a733 100644 --- a/rtdata/images/svg/folder-open-recent.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/folder-open-recent.svg @@ -2,61 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="opacity:1;fill:#cccccc;fill-opacity:1.0;stroke:#cccccc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0;paint-order:normal" /> + style="display:inline;opacity:0.7;fill:#ffffff;fill-opacity:1.0;stroke:none;stroke-width:1;enable-background:new" /> + style="opacity:1;fill:#cccccc;fill-opacity:1.0;stroke:#cccccc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0;paint-order:normal" /> + id="path1026" /> + id="rect1030" /> diff --git a/rtdata/images/svg/folder-open-small.svg b/rtdata/icons/rawtherapee/scalable/apps/folder-open-small.svg similarity index 64% rename from rtdata/images/svg/folder-open-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/folder-open-small.svg index f25394737..cd46e4db6 100644 --- a/rtdata/images/svg/folder-open-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/folder-open-small.svg @@ -2,65 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="path1026" /> + id="rect1030-7" /> diff --git a/rtdata/images/svg/folder-open.svg b/rtdata/icons/rawtherapee/scalable/apps/folder-open.svg similarity index 65% rename from rtdata/images/svg/folder-open.svg rename to rtdata/icons/rawtherapee/scalable/apps/folder-open.svg index 324a4bb9e..21545f938 100644 --- a/rtdata/images/svg/folder-open.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/folder-open.svg @@ -2,61 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + id="path1026" /> + id="rect1030" /> diff --git a/rtdata/icons/rawtherapee/scalable/apps/folder-subfolder.svg b/rtdata/icons/rawtherapee/scalable/apps/folder-subfolder.svg new file mode 100644 index 000000000..eb858b543 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/folder-subfolder.svg @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/fullscreen-enter.svg b/rtdata/icons/rawtherapee/scalable/apps/fullscreen-enter.svg similarity index 57% rename from rtdata/images/svg/fullscreen-enter.svg rename to rtdata/icons/rawtherapee/scalable/apps/fullscreen-enter.svg index 33e8bf568..7f0d34909 100644 --- a/rtdata/images/svg/fullscreen-enter.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/fullscreen-enter.svg @@ -2,60 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + id="path2866" /> + style="display:inline;opacity:0.9;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.0348262" /> + id="path3607" /> + style="display:inline;opacity:0.9;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.0348262" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:#cccccc;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0;paint-order:normal" /> diff --git a/rtdata/images/svg/fullscreen-leave.svg b/rtdata/icons/rawtherapee/scalable/apps/fullscreen-leave.svg similarity index 57% rename from rtdata/images/svg/fullscreen-leave.svg rename to rtdata/icons/rawtherapee/scalable/apps/fullscreen-leave.svg index 3eee818a9..e5f4fef5d 100644 --- a/rtdata/images/svg/fullscreen-leave.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/fullscreen-leave.svg @@ -2,60 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + id="path2866" /> + style="display:inline;opacity:0.9;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.0348262" /> + id="path3607" /> + style="display:inline;opacity:0.9;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.0348262" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:#cccccc;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0;paint-order:normal" /> diff --git a/rtdata/icons/rawtherapee/scalable/apps/gamut-hist.svg b/rtdata/icons/rawtherapee/scalable/apps/gamut-hist.svg new file mode 100644 index 000000000..ae9fbbc6c --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/gamut-hist.svg @@ -0,0 +1,68 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/gamut-plus.svg b/rtdata/icons/rawtherapee/scalable/apps/gamut-plus.svg similarity index 52% rename from rtdata/images/svg/gamut-plus.svg rename to rtdata/icons/rawtherapee/scalable/apps/gamut-plus.svg index c27796b70..cf3a74db3 100644 --- a/rtdata/images/svg/gamut-plus.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/gamut-plus.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,16 +55,13 @@ + id="layer1"> + id="path17368" /> diff --git a/rtdata/images/svg/gamut-softproof.svg b/rtdata/icons/rawtherapee/scalable/apps/gamut-softproof.svg similarity index 61% rename from rtdata/images/svg/gamut-softproof.svg rename to rtdata/icons/rawtherapee/scalable/apps/gamut-softproof.svg index ca37ca2a0..5898265a3 100644 --- a/rtdata/images/svg/gamut-softproof.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/gamut-softproof.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,15 +55,11 @@ + id="layer1"> + id="path4674" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:0.02833264px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + style="opacity:0.5;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:0.02833264px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> diff --git a/rtdata/images/svg/gamut-warning.svg b/rtdata/icons/rawtherapee/scalable/apps/gamut-warning.svg similarity index 64% rename from rtdata/images/svg/gamut-warning.svg rename to rtdata/icons/rawtherapee/scalable/apps/gamut-warning.svg index 9924857c3..a4d3bac09 100644 --- a/rtdata/images/svg/gamut-warning.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/gamut-warning.svg @@ -2,58 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> ! + style="fill:#cccccc;fill-opacity:1;stroke-width:0.95393">! diff --git a/rtdata/images/svg/gamut_srgb_prophoto_xy.svg b/rtdata/icons/rawtherapee/scalable/apps/gamut_srgb_prophoto_xy.svg similarity index 54% rename from rtdata/images/svg/gamut_srgb_prophoto_xy.svg rename to rtdata/icons/rawtherapee/scalable/apps/gamut_srgb_prophoto_xy.svg index 951b6611d..9297e0b0d 100644 --- a/rtdata/images/svg/gamut_srgb_prophoto_xy.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/gamut_srgb_prophoto_xy.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,28 +55,23 @@ + id="layer1"> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:0.03138535px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:0.03138535px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:0.03138535px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> diff --git a/rtdata/images/svg/gears-pause.svg b/rtdata/icons/rawtherapee/scalable/apps/gears-pause.svg similarity index 78% rename from rtdata/images/svg/gears-pause.svg rename to rtdata/icons/rawtherapee/scalable/apps/gears-pause.svg index b472a82f4..abcec7081 100644 --- a/rtdata/images/svg/gears-pause.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/gears-pause.svg @@ -2,58 +2,16 @@ - - - + width="24px" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1" /> + id="path6600" /> + id="rect1457" /> + id="path6613" /> + id="path1555" /> + id="path1557" /> + id="rect3267" /> diff --git a/rtdata/images/svg/gears-play.svg b/rtdata/icons/rawtherapee/scalable/apps/gears-play.svg similarity index 78% rename from rtdata/images/svg/gears-play.svg rename to rtdata/icons/rawtherapee/scalable/apps/gears-play.svg index 83c23557d..ebd5472cf 100644 --- a/rtdata/images/svg/gears-play.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/gears-play.svg @@ -2,65 +2,16 @@ - - - + width="24px" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1" /> + id="path6684" /> + id="path6691" /> + transform="matrix(-0.55642817,-1.3172307,1.3172307,-0.55642817,9.8702419,42.575431)" /> + transform="matrix(-0.55642817,-1.3172307,1.3172307,-0.55642817,9.8702419,42.575431)" /> + id="path1557" /> + style="display:inline;opacity:1;fill:#008000;fill-opacity:1.0;stroke:none;stroke-width:0.04999533" /> diff --git a/rtdata/images/svg/gears-small.svg b/rtdata/icons/rawtherapee/scalable/apps/gears-small.svg similarity index 79% rename from rtdata/images/svg/gears-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/gears-small.svg index 60cfdc609..89032cd2b 100644 --- a/rtdata/images/svg/gears-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/gears-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -97,8 +56,6 @@ + id="rect3267" /> + id="rect1457" /> + style="display:block;overflow:visible;visibility:visible;opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2.38783646;marker:none;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:3.08768296;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> diff --git a/rtdata/images/svg/gears.svg b/rtdata/icons/rawtherapee/scalable/apps/gears.svg similarity index 78% rename from rtdata/images/svg/gears.svg rename to rtdata/icons/rawtherapee/scalable/apps/gears.svg index 3a7785a6f..18f4008b7 100644 --- a/rtdata/images/svg/gears.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/gears.svg @@ -2,58 +2,16 @@ - - - + width="24px" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -97,33 +55,28 @@ + id="layer1" /> + style="display:block;overflow:visible;visibility:visible;opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1.54668486;marker:none;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + id="path1555" /> + id="path1557" /> diff --git a/rtdata/icons/rawtherapee/scalable/apps/goto-end-small.svg b/rtdata/icons/rawtherapee/scalable/apps/goto-end-small.svg new file mode 100644 index 000000000..d1d961a17 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/goto-end-small.svg @@ -0,0 +1,76 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/goto-start-small.svg b/rtdata/icons/rawtherapee/scalable/apps/goto-start-small.svg new file mode 100644 index 000000000..73ea31011 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/goto-start-small.svg @@ -0,0 +1,75 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/hand-closed-hicontrast.svg b/rtdata/icons/rawtherapee/scalable/apps/hand-closed-hicontrast.svg similarity index 82% rename from rtdata/images/svg/hand-closed-hicontrast.svg rename to rtdata/icons/rawtherapee/scalable/apps/hand-closed-hicontrast.svg index 0d6b00f95..0f180564f 100644 --- a/rtdata/images/svg/hand-closed-hicontrast.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/hand-closed-hicontrast.svg @@ -2,63 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + id="rect2901" /> + id="path840" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke" /> + id="path852" /> + id="path844" /> + id="path861" /> diff --git a/rtdata/images/svg/hand-open-hicontrast.svg b/rtdata/icons/rawtherapee/scalable/apps/hand-open-hicontrast.svg similarity index 83% rename from rtdata/images/svg/hand-open-hicontrast.svg rename to rtdata/icons/rawtherapee/scalable/apps/hand-open-hicontrast.svg index 310eda2d1..996213632 100644 --- a/rtdata/images/svg/hand-open-hicontrast.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/hand-open-hicontrast.svg @@ -2,58 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -97,30 +55,22 @@ + id="layer1"> + id="path2954" /> + style="opacity:1;fill:#ffffff;fill-opacity:1.0;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0;paint-order:markers fill stroke" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + id="path825" /> diff --git a/rtdata/images/svg/hand-open.svg b/rtdata/icons/rawtherapee/scalable/apps/hand-open.svg similarity index 83% rename from rtdata/images/svg/hand-open.svg rename to rtdata/icons/rawtherapee/scalable/apps/hand-open.svg index a7597b482..d0dad0da7 100644 --- a/rtdata/images/svg/hand-open.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/hand-open.svg @@ -2,58 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + id="path2954" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + id="path825" /> diff --git a/rtdata/icons/rawtherapee/scalable/apps/histogram-bar-off-small.svg b/rtdata/icons/rawtherapee/scalable/apps/histogram-bar-off-small.svg new file mode 100644 index 000000000..7361523db --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/histogram-bar-off-small.svg @@ -0,0 +1,89 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/histogram-bar-on-small.svg b/rtdata/icons/rawtherapee/scalable/apps/histogram-bar-on-small.svg new file mode 100644 index 000000000..c8e8f10cf --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/histogram-bar-on-small.svg @@ -0,0 +1,89 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/histogram-blue-off-small.svg b/rtdata/icons/rawtherapee/scalable/apps/histogram-blue-off-small.svg similarity index 53% rename from rtdata/images/svg/histogram-blue-off-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/histogram-blue-off-small.svg index e78f3c19c..25e32d489 100644 --- a/rtdata/images/svg/histogram-blue-off-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/histogram-blue-off-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -97,11 +56,9 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -97,11 +56,9 @@ - - - + width="16" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + style="opacity:0.3;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-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.0" /> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -97,11 +56,9 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -97,11 +56,9 @@ + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/histogram-green-on-small.svg b/rtdata/icons/rawtherapee/scalable/apps/histogram-green-on-small.svg new file mode 100644 index 000000000..b8b28dce0 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/histogram-green-on-small.svg @@ -0,0 +1,68 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/histogram-mode-linear-small.svg b/rtdata/icons/rawtherapee/scalable/apps/histogram-mode-linear-small.svg similarity index 59% rename from rtdata/images/svg/histogram-mode-linear-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/histogram-mode-linear-small.svg index 52b914762..5517f2fff 100644 --- a/rtdata/images/svg/histogram-mode-linear-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/histogram-mode-linear-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> diff --git a/rtdata/images/svg/histogram-mode-logx-small.svg b/rtdata/icons/rawtherapee/scalable/apps/histogram-mode-logx-small.svg similarity index 63% rename from rtdata/images/svg/histogram-mode-logx-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/histogram-mode-logx-small.svg index 0eb016d00..cc1574aed 100644 --- a/rtdata/images/svg/histogram-mode-logx-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/histogram-mode-logx-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> diff --git a/rtdata/images/svg/histogram-mode-logxy-small.svg b/rtdata/icons/rawtherapee/scalable/apps/histogram-mode-logxy-small.svg similarity index 60% rename from rtdata/images/svg/histogram-mode-logxy-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/histogram-mode-logxy-small.svg index e0b69c4e5..7f72b1e55 100644 --- a/rtdata/images/svg/histogram-mode-logxy-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/histogram-mode-logxy-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> diff --git a/rtdata/images/svg/histogram-red-off-small.svg b/rtdata/icons/rawtherapee/scalable/apps/histogram-red-off-small.svg similarity index 53% rename from rtdata/images/svg/histogram-red-off-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/histogram-red-off-small.svg index ec4200483..60b67ddec 100644 --- a/rtdata/images/svg/histogram-red-off-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/histogram-red-off-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -97,11 +56,9 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -97,11 +56,9 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -97,11 +56,9 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -97,11 +56,9 @@ + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/histogram-type-histogram-small.svg b/rtdata/icons/rawtherapee/scalable/apps/histogram-type-histogram-small.svg similarity index 55% rename from rtdata/images/svg/histogram-type-histogram-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/histogram-type-histogram-small.svg index 1d2f6547e..f8399c527 100644 --- a/rtdata/images/svg/histogram-type-histogram-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/histogram-type-histogram-small.svg @@ -1,57 +1,15 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="path851" /> + style="opacity:0.3;fill:#cccccc;stroke-linecap:square;fill-opacity:1.0" /> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Lawrence Lee @@ -96,11 +54,9 @@ diff --git a/rtdata/images/svg/histogram-type-vectorscope-hc-small.svg b/rtdata/icons/rawtherapee/scalable/apps/histogram-type-vectorscope-hc-small.svg similarity index 52% rename from rtdata/images/svg/histogram-type-vectorscope-hc-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/histogram-type-vectorscope-hc-small.svg index ef2e8b51f..056197557 100644 --- a/rtdata/images/svg/histogram-type-vectorscope-hc-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/histogram-type-vectorscope-hc-small.svg @@ -1,57 +1,15 @@ - - - + width="16" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Lawrence Lee @@ -96,8 +54,6 @@ + style="opacity:0.3;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="opacity:1;fill:none;fill-opacity:1;stroke:#cccccc;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="fill:none;stroke:#cccccc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0" /> + 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.0" /> diff --git a/rtdata/images/svg/histogram-type-vectorscope-hs-small.svg b/rtdata/icons/rawtherapee/scalable/apps/histogram-type-vectorscope-hs-small.svg similarity index 51% rename from rtdata/images/svg/histogram-type-vectorscope-hs-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/histogram-type-vectorscope-hs-small.svg index 62bbf9586..46901f74c 100644 --- a/rtdata/images/svg/histogram-type-vectorscope-hs-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/histogram-type-vectorscope-hs-small.svg @@ -1,57 +1,15 @@ - - - + width="16" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Lawrence Lee @@ -96,8 +54,6 @@ + style="opacity:0.3;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="opacity:1;fill:none;fill-opacity:1;stroke:#cccccc;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="fill:none;stroke:#cccccc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0" /> + 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.0" /> diff --git a/rtdata/images/svg/histogram-type-waveform-small.svg b/rtdata/icons/rawtherapee/scalable/apps/histogram-type-waveform-small.svg similarity index 54% rename from rtdata/images/svg/histogram-type-waveform-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/histogram-type-waveform-small.svg index 5147ab2fc..1ea706e50 100644 --- a/rtdata/images/svg/histogram-type-waveform-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/histogram-type-waveform-small.svg @@ -1,57 +1,15 @@ - - - + width="16" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Lawrence Lee @@ -96,27 +54,24 @@ + style="fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + style="opacity:0.3;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-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.0" /> diff --git a/rtdata/images/svg/info.svg b/rtdata/icons/rawtherapee/scalable/apps/info.svg similarity index 62% rename from rtdata/images/svg/info.svg rename to rtdata/icons/rawtherapee/scalable/apps/info.svg index 8805fcad4..e18ec4f98 100644 --- a/rtdata/images/svg/info.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/info.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> i + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.522px;font-family:Georgia;-inkscape-font-specification:'Georgia Bold';fill:#ffffff;fill-opacity:1;stroke-width:1px">i diff --git a/rtdata/images/svg/intent-absolute.svg b/rtdata/icons/rawtherapee/scalable/apps/intent-absolute.svg similarity index 54% rename from rtdata/images/svg/intent-absolute.svg rename to rtdata/icons/rawtherapee/scalable/apps/intent-absolute.svg index 055759ad1..ba059358e 100644 --- a/rtdata/images/svg/intent-absolute.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/intent-absolute.svg @@ -2,67 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + id="path1194" /> + id="path1196" /> + id="path1198" /> + id="path1200" /> + id="path1202" /> + id="path1204" /> + id="path1206" /> + id="path1208" /> + id="path1210" /> + id="path1212" /> + id="path1214" /> + id="path1216" /> + id="path1234" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + id="path1326" /> diff --git a/rtdata/images/svg/intent-perceptual.svg b/rtdata/icons/rawtherapee/scalable/apps/intent-perceptual.svg similarity index 56% rename from rtdata/images/svg/intent-perceptual.svg rename to rtdata/icons/rawtherapee/scalable/apps/intent-perceptual.svg index 2e845cd39..4640e737f 100644 --- a/rtdata/images/svg/intent-perceptual.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/intent-perceptual.svg @@ -2,67 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + id="path1194" /> + id="path1196" /> + id="path1198" /> + id="path1200" /> + id="path1202" /> + id="path1204" /> + id="path1206" /> + id="path1208" /> + id="path1210" /> + id="path1212" /> + id="path1214" /> + id="path1216" /> + id="path1234" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + id="path1322" /> + id="path1324" /> + id="path1326" /> diff --git a/rtdata/images/svg/intent-relative.svg b/rtdata/icons/rawtherapee/scalable/apps/intent-relative.svg similarity index 54% rename from rtdata/images/svg/intent-relative.svg rename to rtdata/icons/rawtherapee/scalable/apps/intent-relative.svg index 04e553796..0ba10bbf8 100644 --- a/rtdata/images/svg/intent-relative.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/intent-relative.svg @@ -2,67 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + id="path1194" /> + id="path1196" /> + id="path1198" /> + id="path1200" /> + id="path1202" /> + id="path1204" /> + id="path1206" /> + id="path1208" /> + id="path1210" /> + id="path1212" /> + id="path1214" /> + id="path1216" /> + id="path1234" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + id="path1326" /> diff --git a/rtdata/images/svg/intent-saturation.svg b/rtdata/icons/rawtherapee/scalable/apps/intent-saturation.svg similarity index 56% rename from rtdata/images/svg/intent-saturation.svg rename to rtdata/icons/rawtherapee/scalable/apps/intent-saturation.svg index 569c54962..4ffd0c108 100644 --- a/rtdata/images/svg/intent-saturation.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/intent-saturation.svg @@ -2,67 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + id="path1194" /> + id="path1196" /> + id="path1198" /> + id="path1200" /> + id="path1202" /> + id="path1204" /> + id="path1206" /> + id="path1208" /> + id="path1210" /> + id="path1212" /> + id="path1214" /> + id="path1216" /> + id="path1234" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + id="path1322" /> + id="path1324" /> + id="path1326" /> diff --git a/rtdata/images/svg/magnifier-1to1-small.svg b/rtdata/icons/rawtherapee/scalable/apps/magnifier-1to1-small.svg similarity index 59% rename from rtdata/images/svg/magnifier-1to1-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/magnifier-1to1-small.svg index 68aa7d6c2..f75599891 100644 --- a/rtdata/images/svg/magnifier-1to1-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/magnifier-1to1-small.svg @@ -2,58 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -98,46 +56,36 @@ + id="circle818" /> + id="path846" /> + id="path848" /> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:125%;font-family:'Nimbus Sans L';-inkscape-font-specification:'Nimbus Sans L';letter-spacing:0px;word-spacing:0px;opacity:0.9;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:125%;font-family:'Nimbus Sans L';-inkscape-font-specification:'Nimbus Sans L';letter-spacing:0px;word-spacing:0px;opacity:0.9;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1.0;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:#cccccc;stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1.0;paint-order:normal" /> + id="path848" /> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:125%;font-family:'Nimbus Sans L';-inkscape-font-specification:'Nimbus Sans L';letter-spacing:0px;word-spacing:0px;opacity:0.9;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:125%;font-family:'Nimbus Sans L';-inkscape-font-specification:'Nimbus Sans L';letter-spacing:0px;word-spacing:0px;opacity:0.9;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> diff --git a/rtdata/images/svg/magnifier-crop.svg b/rtdata/icons/rawtherapee/scalable/apps/magnifier-crop.svg similarity index 56% rename from rtdata/images/svg/magnifier-crop.svg rename to rtdata/icons/rawtherapee/scalable/apps/magnifier-crop.svg index 54d6e3e9e..0578d3f2d 100644 --- a/rtdata/images/svg/magnifier-crop.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/magnifier-crop.svg @@ -2,59 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1.0;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:#cccccc;stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1.0;paint-order:normal" /> + id="rect1322" /> + style="opacity:0.9;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.97660822;paint-order:normal" /> + style="opacity:0.9;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.97660822;paint-order:normal" /> diff --git a/rtdata/images/svg/magnifier-fit.svg b/rtdata/icons/rawtherapee/scalable/apps/magnifier-fit.svg similarity index 65% rename from rtdata/images/svg/magnifier-fit.svg rename to rtdata/icons/rawtherapee/scalable/apps/magnifier-fit.svg index 1d531e2d7..41ecf8f96 100644 --- a/rtdata/images/svg/magnifier-fit.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/magnifier-fit.svg @@ -2,59 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1.0;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:#cccccc;stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1.0;paint-order:normal" /> + id="rect921" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.9;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + id="path819" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.9;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> diff --git a/rtdata/images/svg/magnifier-minus-small.svg b/rtdata/icons/rawtherapee/scalable/apps/magnifier-minus-small.svg similarity index 58% rename from rtdata/images/svg/magnifier-minus-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/magnifier-minus-small.svg index 08871ed77..cf8e5e61f 100644 --- a/rtdata/images/svg/magnifier-minus-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/magnifier-minus-small.svg @@ -2,58 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -98,24 +56,20 @@ + id="circle818" /> + style="opacity:0.9;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" + d="M 4.0142425,15 H 9.9857576" /> diff --git a/rtdata/images/svg/magnifier-minus.svg b/rtdata/icons/rawtherapee/scalable/apps/magnifier-minus.svg similarity index 59% rename from rtdata/images/svg/magnifier-minus.svg rename to rtdata/icons/rawtherapee/scalable/apps/magnifier-minus.svg index 567845d57..7580620c2 100644 --- a/rtdata/images/svg/magnifier-minus.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/magnifier-minus.svg @@ -2,59 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -98,11 +55,9 @@ + id="layer1"> + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1.0;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:#cccccc;stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1.0;paint-order:normal" /> + style="opacity:0.9;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" + d="m 6,10 h 8" /> diff --git a/rtdata/images/svg/magnifier-plus-small.svg b/rtdata/icons/rawtherapee/scalable/apps/magnifier-plus-small.svg similarity index 59% rename from rtdata/images/svg/magnifier-plus-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/magnifier-plus-small.svg index a93e8cd8e..99828597e 100644 --- a/rtdata/images/svg/magnifier-plus-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/magnifier-plus-small.svg @@ -2,58 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -98,24 +56,20 @@ + id="circle818" /> + style="opacity:0.9;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" + d="M 4.0142425,15 H 9.9857576 M 7.0000001,12.014242 v 5.971515" /> diff --git a/rtdata/images/svg/magnifier-plus.svg b/rtdata/icons/rawtherapee/scalable/apps/magnifier-plus.svg similarity index 59% rename from rtdata/images/svg/magnifier-plus.svg rename to rtdata/icons/rawtherapee/scalable/apps/magnifier-plus.svg index a98c19bad..8ff545e7a 100644 --- a/rtdata/images/svg/magnifier-plus.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/magnifier-plus.svg @@ -2,59 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -98,11 +55,9 @@ + id="layer1"> + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1.0;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:#cccccc;stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1.0;paint-order:normal" /> + style="opacity:0.9;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" + d="m 6,10 h 8 M 10,6 v 8" /> diff --git a/rtdata/images/svg/magnifier.svg b/rtdata/icons/rawtherapee/scalable/apps/magnifier.svg similarity index 63% rename from rtdata/images/svg/magnifier.svg rename to rtdata/icons/rawtherapee/scalable/apps/magnifier.svg index 3b7ae2fd2..2e216d703 100644 --- a/rtdata/images/svg/magnifier.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/magnifier.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1.0;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:#cccccc;stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1.0;paint-order:normal" /> diff --git a/rtdata/images/svg/metadata.svg b/rtdata/icons/rawtherapee/scalable/apps/metadata.svg similarity index 69% rename from rtdata/images/svg/metadata.svg rename to rtdata/icons/rawtherapee/scalable/apps/metadata.svg index 695d2af1a..78c9d8836 100644 --- a/rtdata/images/svg/metadata.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/metadata.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,9 +55,7 @@ + id="layer1"> @@ -108,16 +65,16 @@ height="310.3132" width="51.57206" id="rect3325-3" - style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#2a7fff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;marker:none" /> + style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:2;marker:none" /> + style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:2;marker:none" /> + style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:2;marker:none" /> diff --git a/rtdata/icons/rawtherapee/scalable/apps/node-move-nw-se-hicontrast.svg b/rtdata/icons/rawtherapee/scalable/apps/node-move-nw-se-hicontrast.svg new file mode 100644 index 000000000..e577c6293 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/node-move-nw-se-hicontrast.svg @@ -0,0 +1,78 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/node-move-sw-ne-hicontrast.svg b/rtdata/icons/rawtherapee/scalable/apps/node-move-sw-ne-hicontrast.svg new file mode 100644 index 000000000..707895b3b --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/node-move-sw-ne-hicontrast.svg @@ -0,0 +1,78 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/node-move-x-hicontrast.svg b/rtdata/icons/rawtherapee/scalable/apps/node-move-x-hicontrast.svg new file mode 100644 index 000000000..f62f5368e --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/node-move-x-hicontrast.svg @@ -0,0 +1,74 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/node-move-xy-hicontrast.svg b/rtdata/icons/rawtherapee/scalable/apps/node-move-xy-hicontrast.svg new file mode 100644 index 000000000..7d0bd110d --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/node-move-xy-hicontrast.svg @@ -0,0 +1,108 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/node-move-y-hicontrast.svg b/rtdata/icons/rawtherapee/scalable/apps/node-move-y-hicontrast.svg new file mode 100644 index 000000000..f0718b688 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/node-move-y-hicontrast.svg @@ -0,0 +1,78 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/one-to-one-small.svg b/rtdata/icons/rawtherapee/scalable/apps/one-to-one-small.svg similarity index 57% rename from rtdata/images/svg/one-to-one-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/one-to-one-small.svg index 8b08f99d0..7ff044aff 100644 --- a/rtdata/images/svg/one-to-one-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/one-to-one-small.svg @@ -2,58 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:550px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial Bold';letter-spacing:-60px;word-spacing:0px;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.02110476;stroke-opacity:1" + d="M 5.6806,21.24916 H 3.7403 v -7.37477 c -0.7089,0.66854 -0.8974,0.72796 -1.8595,1.04829 v -1.77579 c 0.5064,-0.16713 0.4095,-0.0478 1.0033,-0.51208 0.5938,-0.46889 1.0012,-1.0144 1.2222,-1.63651 h 1.5743 v 10.25086" /> + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:550px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial Bold';letter-spacing:-60px;word-spacing:0px;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.02110476;stroke-opacity:1" + id="path11693" /> + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:550px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial Bold';letter-spacing:-60px;word-spacing:0px;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.02110476;stroke-opacity:1" + id="path11687" /> + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:550px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial Bold';letter-spacing:-60px;word-spacing:0px;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.02110476;stroke-opacity:1" + d="M 7,17.95685 V 16 h 1.9403 v 1.95685 H 7" /> + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:550px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial Bold';letter-spacing:-60px;word-spacing:0px;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.02110476;stroke-opacity:1" + d="M 26.3822,20.10325 H 24.882 v -5.70208 c -0.5481,0.51691 -0.6939,0.56285 -1.4378,0.81053 v -1.37302 c 0.3916,-0.12922 0.3166,-0.037 0.7758,-0.39593 0.4591,-0.36254 0.7741,-0.78432 0.9449,-1.26533 h 1.2173 v 7.92583" /> + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:550px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial Bold';letter-spacing:-60px;word-spacing:0px;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.02110476;stroke-opacity:1" + id="path42317" /> + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:550px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial Bold';letter-spacing:-60px;word-spacing:0px;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.02110476;stroke-opacity:1" + id="path42319" /> + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:550px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial Bold';letter-spacing:-60px;word-spacing:0px;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.02110476;stroke-opacity:1" + d="m 27.3807,17.55768 v -1.51301 h 1.5002 v 1.51301 h -1.5002" /> + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:550px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial Bold';letter-spacing:-60px;word-spacing:0px;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.02110476;stroke-opacity:1" + d="m -14.5192,19.51664 v -1.33606 h 1.336 v 1.33606 h -1.336" /> + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:550px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial Bold';letter-spacing:-60px;word-spacing:0px;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.02110476;stroke-opacity:1" + id="path11695-3" /> + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:550px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial Bold';letter-spacing:-60px;word-spacing:0px;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.02110476;stroke-opacity:1" + d="m -10.2779,20.01486 h -1.5465 v -7.78227 h 1.5465 v 7.78227" /> + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:550px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial Bold';letter-spacing:-60px;word-spacing:0px;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.02110476;stroke-opacity:1" + id="path3061" /> + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:550px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial Bold';letter-spacing:-60px;word-spacing:0px;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.02110476;stroke-opacity:1" + id="path3861" /> + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:550px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial Bold';letter-spacing:-60px;word-spacing:0px;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.02110476;stroke-opacity:1" + d="m -34.7301,17.15962 v -1.83786 h 1.8378 v 1.83786 h -1.8378" /> + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:550px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial Bold';letter-spacing:-60px;word-spacing:0px;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.02110476;stroke-opacity:1" + id="path3865" /> + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:550px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial Bold';letter-spacing:-60px;word-spacing:0px;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.02110476;stroke-opacity:1" + d="m -36.5992,21.47631 h -2.1273 V 10.77115 h 2.1273 v 10.70516" /> + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial Bold';letter-spacing:-2px;word-spacing:0px;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1;paint-order:normal" /> + id="path848" /> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:125%;font-family:'Nimbus Sans L';-inkscape-font-specification:'Nimbus Sans L';letter-spacing:0px;word-spacing:0px;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;opacity:0.7" /> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:125%;font-family:'Nimbus Sans L';-inkscape-font-specification:'Nimbus Sans L';letter-spacing:0px;word-spacing:0px;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;opacity:0.7" /> diff --git a/rtdata/images/svg/padlock-locked-small.svg b/rtdata/icons/rawtherapee/scalable/apps/padlock-locked-small.svg similarity index 60% rename from rtdata/images/svg/padlock-locked-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/padlock-locked-small.svg index 27f1bc510..1ab5c85d4 100644 --- a/rtdata/images/svg/padlock-locked-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/padlock-locked-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.17045528;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/rtdata/images/svg/padlock-unlocked-small.svg b/rtdata/icons/rawtherapee/scalable/apps/padlock-unlocked-small.svg similarity index 60% rename from rtdata/images/svg/padlock-unlocked-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/padlock-unlocked-small.svg index 0c282c8cf..8e0f284c8 100644 --- a/rtdata/images/svg/padlock-unlocked-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/padlock-unlocked-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -97,31 +56,23 @@ + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.17045528;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/rtdata/images/svg/palette-brush.svg b/rtdata/icons/rawtherapee/scalable/apps/palette-brush.svg similarity index 62% rename from rtdata/images/svg/palette-brush.svg rename to rtdata/icons/rawtherapee/scalable/apps/palette-brush.svg index 30eaac0d6..79614edf9 100644 --- a/rtdata/images/svg/palette-brush.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/palette-brush.svg @@ -2,63 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -102,31 +55,22 @@ + id="layer1"> + id="path3964" /> + id="rect886" /> + id="rect889" /> + id="path892" /> diff --git a/rtdata/images/svg/panel-to-bottom.svg b/rtdata/icons/rawtherapee/scalable/apps/panel-to-bottom.svg similarity index 53% rename from rtdata/images/svg/panel-to-bottom.svg rename to rtdata/icons/rawtherapee/scalable/apps/panel-to-bottom.svg index 8e63c0309..63494a4a4 100644 --- a/rtdata/images/svg/panel-to-bottom.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/panel-to-bottom.svg @@ -2,59 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:#cccccc;stroke-width:1;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> diff --git a/rtdata/images/svg/perspective-horizontal-left-small.svg b/rtdata/icons/rawtherapee/scalable/apps/perspective-horizontal-left-small.svg similarity index 56% rename from rtdata/images/svg/perspective-horizontal-left-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/perspective-horizontal-left-small.svg index c4797a6a2..1a386806a 100644 --- a/rtdata/images/svg/perspective-horizontal-left-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/perspective-horizontal-left-small.svg @@ -2,58 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -98,26 +56,18 @@ + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1.0;paint-order:normal" + id="path1207" /> + id="rect1209" /> + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:1.00157475;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1.0;paint-order:normal" + d="m 6.6071429,11.622449 v 8.755102 m 5.1937041,-8.013144 v 7.271186 M 14.15,17.269231 2.3313953,17.918605 M 14.15,14.730769 2.3313953,14.081395 M 14.15,19.3 2.3313953,20.988372 V 11.011628 L 14.15,12.7 Z" /> diff --git a/rtdata/images/svg/perspective-horizontal-left.svg b/rtdata/icons/rawtherapee/scalable/apps/perspective-horizontal-left.svg similarity index 67% rename from rtdata/images/svg/perspective-horizontal-left.svg rename to rtdata/icons/rawtherapee/scalable/apps/perspective-horizontal-left.svg index 18ce37ea3..3c7939410 100644 --- a/rtdata/images/svg/perspective-horizontal-left.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/perspective-horizontal-left.svg @@ -2,58 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" + d="M 56,2 V 22 M 48,2 V 22 M 42,16 H 62 M 42,8 H 62 M 42,2 H 62 V 22 H 42 Z" /> diff --git a/rtdata/images/svg/perspective-horizontal-right-small.svg b/rtdata/icons/rawtherapee/scalable/apps/perspective-horizontal-right-small.svg similarity index 56% rename from rtdata/images/svg/perspective-horizontal-right-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/perspective-horizontal-right-small.svg index 4721117c8..e10aa2880 100644 --- a/rtdata/images/svg/perspective-horizontal-right-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/perspective-horizontal-right-small.svg @@ -2,58 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -98,26 +56,18 @@ + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1.0;paint-order:normal" + id="path1207" /> + id="rect1209" /> + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:1.00157475;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1.0;paint-order:normal" + d="m 9.8742524,11.622449 v 8.755102 M 4.6805483,12.364407 v 7.271186 M 2.3313953,17.269231 14.15,17.918605 M 2.3313953,14.730769 14.15,14.081395 M 2.3313953,19.3 14.15,20.988372 V 11.011628 L 2.3313953,12.7 Z" /> diff --git a/rtdata/images/svg/perspective-horizontal-right.svg b/rtdata/icons/rawtherapee/scalable/apps/perspective-horizontal-right.svg similarity index 67% rename from rtdata/images/svg/perspective-horizontal-right.svg rename to rtdata/icons/rawtherapee/scalable/apps/perspective-horizontal-right.svg index 809e94123..9e16927ae 100644 --- a/rtdata/images/svg/perspective-horizontal-right.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/perspective-horizontal-right.svg @@ -2,59 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" + d="M 56,2 V 22 M 48,2 V 22 M 42,16 H 62 M 42,8 H 62 M 42,2 H 62 V 22 H 42 Z" /> diff --git a/rtdata/images/svg/perspective-horizontal-vertical.svg b/rtdata/icons/rawtherapee/scalable/apps/perspective-horizontal-vertical.svg similarity index 67% rename from rtdata/images/svg/perspective-horizontal-vertical.svg rename to rtdata/icons/rawtherapee/scalable/apps/perspective-horizontal-vertical.svg index 0c5046879..fe267866f 100644 --- a/rtdata/images/svg/perspective-horizontal-vertical.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/perspective-horizontal-vertical.svg @@ -2,57 +2,16 @@ - - - + width="24px" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,21 +55,14 @@ + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" + d="M 56,2 V 22 M 48,2 V 22 M 42,16 H 62 M 42,8 H 62 M 42,2 H 62 V 22 H 42 Z" /> diff --git a/rtdata/images/svg/perspective-vertical-bottom-small.svg b/rtdata/icons/rawtherapee/scalable/apps/perspective-vertical-bottom-small.svg similarity index 56% rename from rtdata/images/svg/perspective-vertical-bottom-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/perspective-vertical-bottom-small.svg index 80f023b74..14e4c4474 100644 --- a/rtdata/images/svg/perspective-vertical-bottom-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/perspective-vertical-bottom-small.svg @@ -2,58 +2,16 @@ - - - + width="16" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -98,26 +56,18 @@ + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1.0;paint-order:normal" + d="m 21.5,18.5 h 13 m -13,-5 h 13 m -4,-3 v 11 m -5,-11 v 11 m -4,-11 h 13 v 11 h -13 z" /> + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1.0;paint-order:normal" + id="path992" /> + id="path1014" /> diff --git a/rtdata/images/svg/perspective-vertical-bottom.svg b/rtdata/icons/rawtherapee/scalable/apps/perspective-vertical-bottom.svg similarity index 67% rename from rtdata/images/svg/perspective-vertical-bottom.svg rename to rtdata/icons/rawtherapee/scalable/apps/perspective-vertical-bottom.svg index 4cc5bf0f3..aec86fbcd 100644 --- a/rtdata/images/svg/perspective-vertical-bottom.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/perspective-vertical-bottom.svg @@ -2,57 +2,16 @@ - - - + width="24px" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" + d="M 56,2 V 22 M 48,2 V 22 M 42,16 H 62 M 42,8 H 62 M 42,2 H 62 V 22 H 42 Z" /> diff --git a/rtdata/images/svg/perspective-vertical-top-small.svg b/rtdata/icons/rawtherapee/scalable/apps/perspective-vertical-top-small.svg similarity index 56% rename from rtdata/images/svg/perspective-vertical-top-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/perspective-vertical-top-small.svg index 1ec0fafa7..ba15938ce 100644 --- a/rtdata/images/svg/perspective-vertical-top-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/perspective-vertical-top-small.svg @@ -2,58 +2,16 @@ - - - + width="16" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -98,26 +56,18 @@ + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1.0;paint-order:normal" + d="m 21.5,18.5 h 13 m -13,-5 h 13 m -4,-3 v 11 m -5,-11 v 11 m -4,-11 h 13 v 11 h -13 z" /> + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1.0;paint-order:normal" + id="path992" /> + id="path1014" /> diff --git a/rtdata/images/svg/perspective-vertical-top.svg b/rtdata/icons/rawtherapee/scalable/apps/perspective-vertical-top.svg similarity index 67% rename from rtdata/images/svg/perspective-vertical-top.svg rename to rtdata/icons/rawtherapee/scalable/apps/perspective-vertical-top.svg index 34f75fe7f..d2fe215f7 100644 --- a/rtdata/images/svg/perspective-vertical-top.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/perspective-vertical-top.svg @@ -2,57 +2,16 @@ - - - + width="24px" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + style="opacity:0.7;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" + d="M 56,2 V 22 M 48,2 V 22 M 42,16 H 62 M 42,8 H 62 M 42,2 H 62 V 22 H 42 Z" /> diff --git a/rtdata/images/svg/power-inconsistent-small.svg b/rtdata/icons/rawtherapee/scalable/apps/power-inconsistent-small.svg similarity index 53% rename from rtdata/images/svg/power-inconsistent-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/power-inconsistent-small.svg index 305f504cd..4f3fc18d2 100644 --- a/rtdata/images/svg/power-inconsistent-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/power-inconsistent-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="path5608" /> + id="path2553" /> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,18 +54,14 @@ + id="path5608" /> + id="path2553" /> diff --git a/rtdata/images/svg/power-on-small.svg b/rtdata/icons/rawtherapee/scalable/apps/power-on-small.svg similarity index 64% rename from rtdata/images/svg/power-on-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/power-on-small.svg index 271c8e53e..a8b6e559a 100644 --- a/rtdata/images/svg/power-on-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/power-on-small.svg @@ -1,60 +1,15 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + transform="translate(0,-8)"> + id="path5608-3" /> + id="path2553-6" /> + id="path5608-36" /> + id="path2553-7" /> diff --git a/rtdata/images/svg/preferences.svg b/rtdata/icons/rawtherapee/scalable/apps/preferences.svg similarity index 58% rename from rtdata/images/svg/preferences.svg rename to rtdata/icons/rawtherapee/scalable/apps/preferences.svg index db6794736..e742d74a7 100644 --- a/rtdata/images/svg/preferences.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/preferences.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,15 +55,13 @@ + id="layer1"> + style="opacity:1;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.03404313" /> + style="opacity:0.9;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.04394949" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.03930962" /> + id="rect1095" /> diff --git a/rtdata/icons/rawtherapee/scalable/apps/profile-partial.svg b/rtdata/icons/rawtherapee/scalable/apps/profile-partial.svg new file mode 100644 index 000000000..5d58013ba --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/profile-partial.svg @@ -0,0 +1,92 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/questionmark.svg b/rtdata/icons/rawtherapee/scalable/apps/questionmark.svg similarity index 65% rename from rtdata/images/svg/questionmark.svg rename to rtdata/icons/rawtherapee/scalable/apps/questionmark.svg index 4c4b59590..855873047 100644 --- a/rtdata/images/svg/questionmark.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/questionmark.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,27 +55,24 @@ + id="layer1"> ? + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.522px;font-family:Georgia;-inkscape-font-specification:'Georgia Bold';fill:#ffffff;fill-opacity:1;stroke-width:1px">? diff --git a/rtdata/images/svg/redo-all.svg b/rtdata/icons/rawtherapee/scalable/apps/redo-all.svg similarity index 58% rename from rtdata/images/svg/redo-all.svg rename to rtdata/icons/rawtherapee/scalable/apps/redo-all.svg index f9dbaad23..0d9dac982 100644 --- a/rtdata/images/svg/redo-all.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/redo-all.svg @@ -2,66 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -105,28 +55,22 @@ + id="layer1"> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:#cccccc;stroke-width:1.58443224;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1.0;paint-order:normal" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.35;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1.58443224;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + style="opacity:0.35;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1.58443224;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1;paint-order:normal" /> diff --git a/rtdata/images/svg/redo-small.svg b/rtdata/icons/rawtherapee/scalable/apps/redo-small.svg similarity index 54% rename from rtdata/images/svg/redo-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/redo-small.svg index 639aebb42..6c0fabd46 100644 --- a/rtdata/images/svg/redo-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/redo-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="path815" /> diff --git a/rtdata/icons/rawtherapee/scalable/apps/redo.svg b/rtdata/icons/rawtherapee/scalable/apps/redo.svg new file mode 100644 index 000000000..394ae22e2 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/redo.svg @@ -0,0 +1,64 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/refresh-red-small.svg b/rtdata/icons/rawtherapee/scalable/apps/refresh-red-small.svg similarity index 57% rename from rtdata/images/svg/refresh-red-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/refresh-red-small.svg index 498faafe8..22222eb69 100644 --- a/rtdata/images/svg/refresh-red-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/refresh-red-small.svg @@ -2,62 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -102,39 +56,27 @@ + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#c00000;stroke-width:2.13567448;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0;paint-order:normal" /> + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#c00000;stroke-width:2.13567448;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0;paint-order:normal" /> + style="display:inline;opacity:0.7;fill:#c00000;fill-opacity:1.0;stroke:none;stroke-width:0.03718871" /> + id="path829" /> diff --git a/rtdata/images/svg/refresh-small.svg b/rtdata/icons/rawtherapee/scalable/apps/refresh-small.svg similarity index 56% rename from rtdata/images/svg/refresh-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/refresh-small.svg index d9ca603ef..d1c6c821f 100644 --- a/rtdata/images/svg/refresh-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/refresh-small.svg @@ -2,62 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + style="display:inline;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.04338683" /> + id="path829" /> diff --git a/rtdata/icons/rawtherapee/scalable/apps/refresh.svg b/rtdata/icons/rawtherapee/scalable/apps/refresh.svg new file mode 100644 index 000000000..8d4aa1c73 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/refresh.svg @@ -0,0 +1,76 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/remove-small.svg b/rtdata/icons/rawtherapee/scalable/apps/remove-small.svg new file mode 100644 index 000000000..796a415a7 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/remove-small.svg @@ -0,0 +1,77 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/remove.svg b/rtdata/icons/rawtherapee/scalable/apps/remove.svg new file mode 100644 index 000000000..b3487a896 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/remove.svg @@ -0,0 +1,74 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/rotate-aroundnode-hicontrast.svg b/rtdata/icons/rawtherapee/scalable/apps/rotate-aroundnode-hicontrast.svg similarity index 56% rename from rtdata/images/svg/rotate-aroundnode-hicontrast.svg rename to rtdata/icons/rawtherapee/scalable/apps/rotate-aroundnode-hicontrast.svg index fda645c55..28d0eecf3 100644 --- a/rtdata/images/svg/rotate-aroundnode-hicontrast.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/rotate-aroundnode-hicontrast.svg @@ -2,62 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -101,17 +55,15 @@ + id="layer1"> diff --git a/rtdata/images/svg/rotate-aroundnode.svg b/rtdata/icons/rawtherapee/scalable/apps/rotate-aroundnode.svg similarity index 56% rename from rtdata/images/svg/rotate-aroundnode.svg rename to rtdata/icons/rawtherapee/scalable/apps/rotate-aroundnode.svg index 67ac406fa..a515aae6a 100644 --- a/rtdata/images/svg/rotate-aroundnode.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/rotate-aroundnode.svg @@ -2,62 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + id="path1597" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + style="opacity:0.9;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1" /> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + id="path2866" /> + style="display:inline;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.0348262" /> + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0;paint-order:normal" /> + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2, 2;stroke-dashoffset:10;stroke-opacity:1.0;paint-order:normal" /> 90° + id="tspan16">90° diff --git a/rtdata/images/svg/rotate-left-small.svg b/rtdata/icons/rawtherapee/scalable/apps/rotate-left-small.svg similarity index 50% rename from rtdata/images/svg/rotate-left-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/rotate-left-small.svg index d85b5e8ea..fad01fe23 100644 --- a/rtdata/images/svg/rotate-left-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/rotate-left-small.svg @@ -2,65 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -105,49 +56,33 @@ + id="path1029" /> + style="opacity:0.9;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.54308969" /> + id="path1085" /> + id="path1096" /> + id="path1103" /> diff --git a/rtdata/images/svg/rotate-left.svg b/rtdata/icons/rawtherapee/scalable/apps/rotate-left.svg similarity index 55% rename from rtdata/images/svg/rotate-left.svg rename to rtdata/icons/rawtherapee/scalable/apps/rotate-left.svg index c66020379..7c1e5fa1c 100644 --- a/rtdata/images/svg/rotate-left.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/rotate-left.svg @@ -2,61 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -100,40 +55,30 @@ + id="layer1"> + id="path7246" /> + id="path7240" /> + id="path7236" /> + id="path7234" /> + id="path9832" /> + style="opacity:0.9;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.99999994" /> diff --git a/rtdata/images/svg/rotate-right-90.svg b/rtdata/icons/rawtherapee/scalable/apps/rotate-right-90.svg similarity index 64% rename from rtdata/images/svg/rotate-right-90.svg rename to rtdata/icons/rawtherapee/scalable/apps/rotate-right-90.svg index bb2e66482..edc9afa38 100644 --- a/rtdata/images/svg/rotate-right-90.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/rotate-right-90.svg @@ -2,63 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + id="path2866" /> + style="display:inline;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.0348262" /> + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0;paint-order:normal" /> + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2, 2;stroke-dashoffset:10;stroke-opacity:1.0;paint-order:normal" /> + id="path1734" /> 90° + id="tspan16">90° diff --git a/rtdata/images/svg/rotate-right-small.svg b/rtdata/icons/rawtherapee/scalable/apps/rotate-right-small.svg similarity index 51% rename from rtdata/images/svg/rotate-right-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/rotate-right-small.svg index 89e6d4ac2..ba1410815 100644 --- a/rtdata/images/svg/rotate-right-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/rotate-right-small.svg @@ -2,65 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -105,48 +56,34 @@ + id="path1029" /> + style="opacity:0.9;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.54308969" /> + id="path1085" /> + id="path1096" /> + id="path1103" /> diff --git a/rtdata/images/svg/rotate-right.svg b/rtdata/icons/rawtherapee/scalable/apps/rotate-right.svg similarity index 55% rename from rtdata/images/svg/rotate-right.svg rename to rtdata/icons/rawtherapee/scalable/apps/rotate-right.svg index 26a46a3f6..4d5763e1e 100644 --- a/rtdata/images/svg/rotate-right.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/rotate-right.svg @@ -2,61 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + id="path7246" /> + id="path7240" /> + id="path7236" /> + id="path7234" /> + id="path9832" /> + style="opacity:0.9;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.99999994" /> diff --git a/rtdata/icons/rawtherapee/scalable/apps/rotate-straighten-small.svg b/rtdata/icons/rawtherapee/scalable/apps/rotate-straighten-small.svg new file mode 100644 index 000000000..5a63b665e --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/rotate-straighten-small.svg @@ -0,0 +1,81 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/rotate-straighten.svg b/rtdata/icons/rawtherapee/scalable/apps/rotate-straighten.svg new file mode 100644 index 000000000..e833ae8b1 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/rotate-straighten.svg @@ -0,0 +1,160 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + 90° + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/template-24.svg b/rtdata/icons/rawtherapee/scalable/apps/rt-spot.svg similarity index 56% rename from rtdata/images/svg/template-24.svg rename to rtdata/icons/rawtherapee/scalable/apps/rt-spot.svg index 88d934fc5..240a8de35 100644 --- a/rtdata/images/svg/template-24.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/rt-spot.svg @@ -2,57 +2,20 @@ - - - + sodipodi:docname="rt-spot.svg" + inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - - Maciej Dworak + Lawrence37 @@ -74,9 +36,9 @@ - RawTherapee icon. + RawTherapee icon: RT spot. @@ -95,8 +57,42 @@ + + id="frame" + style="opacity:0.7"> + + + + + + diff --git a/rtdata/images/svg/save-small.svg b/rtdata/icons/rawtherapee/scalable/apps/save-small.svg similarity index 61% rename from rtdata/images/svg/save-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/save-small.svg index 3398e27c8..94de504b8 100644 --- a/rtdata/images/svg/save-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/save-small.svg @@ -2,58 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1;paint-order:normal" /> + id="path1601" /> + transform="matrix(1.4285714,0,0,-1.4285714,60.571429,23.428571)" /> + transform="matrix(1.4285714,0,0,-1.4285714,60.571429,23.428571)" /> + style="opacity:1;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1.14285719;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> diff --git a/rtdata/images/svg/save.svg b/rtdata/icons/rawtherapee/scalable/apps/save.svg similarity index 59% rename from rtdata/images/svg/save.svg rename to rtdata/icons/rawtherapee/scalable/apps/save.svg index eae40ed09..818b8d52d 100644 --- a/rtdata/images/svg/save.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/save.svg @@ -2,60 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + id="path35160" /> + id="path35158" /> + id="path35156" /> + id="rect34888" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1;paint-order:normal" /> + id="path8807-3" /> + id="path35172" /> + transform="matrix(1,0,0,-1,-20,24)" /> + transform="matrix(1,0,0,-1,-20,24)" /> + style="opacity:1;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:1.71428573;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + id="path35202" /> + transform="matrix(1,0,0,-1,-100,24)" /> + transform="matrix(1,0,0,-1,-100,24)" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1;paint-order:normal" /> + style="opacity:1;fill:#008000;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2.55999184;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + id="path35191" /> + transform="matrix(1,0,0,-1,-60,24)" /> + id="path35000" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1;paint-order:normal" /> + id="path35006" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1;paint-order:normal" /> + style="opacity:1;fill:#008000;fill-opacity:1.0;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:1;fill:#008000;fill-opacity:1.0;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + style="opacity:1;fill:#008000;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:3.83998775;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> @@ -343,30 +266,26 @@ height="5" width="3" id="rect35070" - style="opacity:0.7;fill:#2a7fff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1;paint-order:normal" /> + id="path35084" /> + id="path35092" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1;paint-order:normal" /> + style="opacity:1;fill:#008000;fill-opacity:1.0;stroke:none;stroke-width:1.28571427;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> diff --git a/rtdata/images/svg/saved-no-small.svg b/rtdata/icons/rawtherapee/scalable/apps/saved-no-small.svg similarity index 67% rename from rtdata/images/svg/saved-no-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/saved-no-small.svg index 02b245aa1..20b6dfb43 100644 --- a/rtdata/images/svg/saved-no-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/saved-no-small.svg @@ -2,58 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1;paint-order:normal" /> + id="path1631" /> + id="path1629" /> + id="path1627" /> + id="path1610" /> + style="fill:none;fill-rule:evenodd;stroke:#c00000;stroke-width:1.88826501;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" + d="m 10.832397,10.667603 -5.6647946,5.664794 m 0,-5.664794 5.6647946,5.664794" /> diff --git a/rtdata/images/svg/saved-yes-small.svg b/rtdata/icons/rawtherapee/scalable/apps/saved-yes-small.svg similarity index 64% rename from rtdata/images/svg/saved-yes-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/saved-yes-small.svg index f545e9b18..3dee64650 100644 --- a/rtdata/images/svg/saved-yes-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/saved-yes-small.svg @@ -2,58 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -98,8 +56,6 @@ + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1;paint-order:normal" /> + style="opacity:1;fill:#008000;fill-opacity:1.0;stroke:none;stroke-width:1.45144057" /> + id="path1677" /> + id="path1664" /> + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - @@ -43,13 +21,11 @@ image/svg+xml - + + style="fill:#ffffff;fill-opacity:0.58823532;stroke:none" /> diff --git a/rtdata/icons/rawtherapee/scalable/apps/spot-normal.svg b/rtdata/icons/rawtherapee/scalable/apps/spot-normal.svg new file mode 100644 index 000000000..67b954642 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/spot-normal.svg @@ -0,0 +1,44 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/rtdata/images/svg/spot-prelight.svg b/rtdata/icons/rawtherapee/scalable/apps/spot-prelight.svg similarity index 54% rename from rtdata/images/svg/spot-prelight.svg rename to rtdata/icons/rawtherapee/scalable/apps/spot-prelight.svg index 9cfc1acfa..e53acfcbf 100644 --- a/rtdata/images/svg/spot-prelight.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/spot-prelight.svg @@ -2,39 +2,17 @@ + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - @@ -48,8 +26,6 @@ + style="fill:#ffffff;fill-opacity:1.0;stroke:none" /> diff --git a/rtdata/images/svg/square-toggle-black-off-narrow.svg b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-black-off-narrow.svg similarity index 52% rename from rtdata/images/svg/square-toggle-black-off-narrow.svg rename to rtdata/icons/rawtherapee/scalable/apps/square-toggle-black-off-narrow.svg index 23d835032..86c7fa8c7 100644 --- a/rtdata/images/svg/square-toggle-black-off-narrow.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-black-off-narrow.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,11 +55,9 @@ + id="layer1"> + style="opacity:1;fill:#1a1a1a;fill-opacity:1.0;stroke:none;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/rtdata/images/svg/square-toggle-black-on-narrow.svg b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-black-on-narrow.svg similarity index 52% rename from rtdata/images/svg/square-toggle-black-on-narrow.svg rename to rtdata/icons/rawtherapee/scalable/apps/square-toggle-black-on-narrow.svg index 431f8bd58..43f6cee0e 100644 --- a/rtdata/images/svg/square-toggle-black-on-narrow.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-black-on-narrow.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,11 +55,9 @@ + id="layer1"> + style="opacity:1;fill:#1a1a1a;fill-opacity:1.0;stroke:none;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/rtdata/images/svg/square-toggle-blue-off-narrow.svg b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-blue-off-narrow.svg similarity index 52% rename from rtdata/images/svg/square-toggle-blue-off-narrow.svg rename to rtdata/icons/rawtherapee/scalable/apps/square-toggle-blue-off-narrow.svg index 4da563f36..201df582a 100644 --- a/rtdata/images/svg/square-toggle-blue-off-narrow.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-blue-off-narrow.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,11 +55,9 @@ + id="layer1"> + style="opacity:1;fill:#3030d0;fill-opacity:1.0;stroke:none;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/rtdata/images/svg/square-toggle-blue-on-narrow.svg b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-blue-on-narrow.svg similarity index 52% rename from rtdata/images/svg/square-toggle-blue-on-narrow.svg rename to rtdata/icons/rawtherapee/scalable/apps/square-toggle-blue-on-narrow.svg index 6aa7e2cb1..3e6d90887 100644 --- a/rtdata/images/svg/square-toggle-blue-on-narrow.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-blue-on-narrow.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,11 +55,9 @@ + id="layer1"> + style="opacity:1;fill:#3030d0;fill-opacity:1.0;stroke:none;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/rtdata/images/svg/square-toggle-gray-off-narrow.svg b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-gray-off-narrow.svg similarity index 52% rename from rtdata/images/svg/square-toggle-gray-off-narrow.svg rename to rtdata/icons/rawtherapee/scalable/apps/square-toggle-gray-off-narrow.svg index 3bc716d8e..779ec1b6e 100644 --- a/rtdata/images/svg/square-toggle-gray-off-narrow.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-gray-off-narrow.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,11 +55,9 @@ + id="layer1"> + style="opacity:1;fill:#777777;fill-opacity:1.0;stroke:none;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/rtdata/images/svg/square-toggle-gray-on-narrow.svg b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-gray-on-narrow.svg similarity index 52% rename from rtdata/images/svg/square-toggle-gray-on-narrow.svg rename to rtdata/icons/rawtherapee/scalable/apps/square-toggle-gray-on-narrow.svg index 6e3ddb2ed..cd7b044e8 100644 --- a/rtdata/images/svg/square-toggle-gray-on-narrow.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-gray-on-narrow.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,11 +55,9 @@ + id="layer1"> + style="opacity:1;fill:#777777;fill-opacity:1.0;stroke:none;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/rtdata/images/svg/square-toggle-green-off-narrow.svg b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-green-off-narrow.svg similarity index 57% rename from rtdata/images/svg/square-toggle-green-off-narrow.svg rename to rtdata/icons/rawtherapee/scalable/apps/square-toggle-green-off-narrow.svg index 814feedf6..695e41e04 100644 --- a/rtdata/images/svg/square-toggle-green-off-narrow.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-green-off-narrow.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,9 +55,7 @@ + id="layer1"> + style="opacity:1;fill:#30d043;fill-opacity:1.0;stroke:none;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/rtdata/images/svg/square-toggle-green-on-narrow.svg b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-green-on-narrow.svg similarity index 57% rename from rtdata/images/svg/square-toggle-green-on-narrow.svg rename to rtdata/icons/rawtherapee/scalable/apps/square-toggle-green-on-narrow.svg index ed178b3b0..e381a32f0 100644 --- a/rtdata/images/svg/square-toggle-green-on-narrow.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-green-on-narrow.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,9 +55,7 @@ + id="layer1"> + style="opacity:1;fill:#30d043;fill-opacity:1.0;stroke:none;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/rtdata/images/svg/square-toggle-luminosity-off-narrow.svg b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-luminosity-off-narrow.svg similarity index 58% rename from rtdata/images/svg/square-toggle-luminosity-off-narrow.svg rename to rtdata/icons/rawtherapee/scalable/apps/square-toggle-luminosity-off-narrow.svg index 9d5ad85ed..45dfafd9c 100644 --- a/rtdata/images/svg/square-toggle-luminosity-off-narrow.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-luminosity-off-narrow.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> L + id="tspan16">L diff --git a/rtdata/images/svg/square-toggle-luminosity-on-narrow.svg b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-luminosity-on-narrow.svg similarity index 58% rename from rtdata/images/svg/square-toggle-luminosity-on-narrow.svg rename to rtdata/icons/rawtherapee/scalable/apps/square-toggle-luminosity-on-narrow.svg index f7e83e8bb..7422df22c 100644 --- a/rtdata/images/svg/square-toggle-luminosity-on-narrow.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-luminosity-on-narrow.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> L + id="tspan12">L diff --git a/rtdata/images/svg/square-toggle-red-off-narrow.svg b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-red-off-narrow.svg similarity index 52% rename from rtdata/images/svg/square-toggle-red-off-narrow.svg rename to rtdata/icons/rawtherapee/scalable/apps/square-toggle-red-off-narrow.svg index b05b91ae5..7ccb866f2 100644 --- a/rtdata/images/svg/square-toggle-red-off-narrow.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-red-off-narrow.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,11 +55,9 @@ + id="layer1"> + style="opacity:1;fill:#d03030;fill-opacity:1.0;stroke:none;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/rtdata/images/svg/square-toggle-red-on-narrow.svg b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-red-on-narrow.svg similarity index 52% rename from rtdata/images/svg/square-toggle-red-on-narrow.svg rename to rtdata/icons/rawtherapee/scalable/apps/square-toggle-red-on-narrow.svg index 52382d0df..b5a36ac78 100644 --- a/rtdata/images/svg/square-toggle-red-on-narrow.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-red-on-narrow.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,11 +55,9 @@ + id="layer1"> + style="opacity:1;fill:#d03030;fill-opacity:1.0;stroke:none;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/rtdata/images/svg/square-toggle-theme-off-narrow.svg b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-theme-off-narrow.svg similarity index 58% rename from rtdata/images/svg/square-toggle-theme-off-narrow.svg rename to rtdata/icons/rawtherapee/scalable/apps/square-toggle-theme-off-narrow.svg index 311552709..b7a2f6ec1 100644 --- a/rtdata/images/svg/square-toggle-theme-off-narrow.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-theme-off-narrow.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> T + id="tspan12">T diff --git a/rtdata/images/svg/square-toggle-theme-on-narrow.svg b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-theme-on-narrow.svg similarity index 58% rename from rtdata/images/svg/square-toggle-theme-on-narrow.svg rename to rtdata/icons/rawtherapee/scalable/apps/square-toggle-theme-on-narrow.svg index 3c8efd85b..16983479e 100644 --- a/rtdata/images/svg/square-toggle-theme-on-narrow.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-theme-on-narrow.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> T + id="tspan12">T diff --git a/rtdata/images/svg/square-toggle-white-off-narrow.svg b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-white-off-narrow.svg similarity index 52% rename from rtdata/images/svg/square-toggle-white-off-narrow.svg rename to rtdata/icons/rawtherapee/scalable/apps/square-toggle-white-off-narrow.svg index 99e675f83..5290de8a6 100644 --- a/rtdata/images/svg/square-toggle-white-off-narrow.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-white-off-narrow.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,11 +55,9 @@ + id="layer1"> + style="opacity:1;fill:#e6e6e6;fill-opacity:1.0;stroke:none;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/rtdata/images/svg/square-toggle-white-on-narrow.svg b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-white-on-narrow.svg similarity index 52% rename from rtdata/images/svg/square-toggle-white-on-narrow.svg rename to rtdata/icons/rawtherapee/scalable/apps/square-toggle-white-on-narrow.svg index 97b5e5e41..15155f1ae 100644 --- a/rtdata/images/svg/square-toggle-white-on-narrow.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/square-toggle-white-on-narrow.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,11 +55,9 @@ + id="layer1"> + style="opacity:1;fill:#e6e6e6;fill-opacity:1.0;stroke:none;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/rtdata/images/svg/star-gold-hollow-narrow.svg b/rtdata/icons/rawtherapee/scalable/apps/star-gold-hollow-narrow.svg similarity index 51% rename from rtdata/images/svg/star-gold-hollow-narrow.svg rename to rtdata/icons/rawtherapee/scalable/apps/star-gold-hollow-narrow.svg index 82ab83a4a..e3f7b74d9 100644 --- a/rtdata/images/svg/star-gold-hollow-narrow.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/star-gold-hollow-narrow.svg @@ -2,64 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -104,25 +56,11 @@ + transform="matrix(0.56919272,-0.18374267,0.18494192,0.56550181,-2.5126125,8.8701237)" /> diff --git a/rtdata/images/svg/star-gold-hollow-small.svg b/rtdata/icons/rawtherapee/scalable/apps/star-gold-hollow-small.svg similarity index 52% rename from rtdata/images/svg/star-gold-hollow-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/star-gold-hollow-small.svg index ecdcf65f7..9914f9869 100644 --- a/rtdata/images/svg/star-gold-hollow-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/star-gold-hollow-small.svg @@ -2,64 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + transform="matrix(0.86350439,-0.28029946,0.28056958,0.86267304,-3.3971484,4.0671628)" /> diff --git a/rtdata/icons/rawtherapee/scalable/apps/star-gold-narrow.svg b/rtdata/icons/rawtherapee/scalable/apps/star-gold-narrow.svg new file mode 100644 index 000000000..56b18d5ae --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/star-gold-narrow.svg @@ -0,0 +1,66 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/star-gold-small.svg b/rtdata/icons/rawtherapee/scalable/apps/star-gold-small.svg new file mode 100644 index 000000000..fa588ae59 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/star-gold-small.svg @@ -0,0 +1,66 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/star-hollow-narrow.svg b/rtdata/icons/rawtherapee/scalable/apps/star-hollow-narrow.svg new file mode 100644 index 000000000..b305a320b --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/star-hollow-narrow.svg @@ -0,0 +1,66 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/star-hollow-small.svg b/rtdata/icons/rawtherapee/scalable/apps/star-hollow-small.svg new file mode 100644 index 000000000..03dd8e8b1 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/star-hollow-small.svg @@ -0,0 +1,66 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/star-narrow.svg b/rtdata/icons/rawtherapee/scalable/apps/star-narrow.svg new file mode 100644 index 000000000..8c8400439 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/star-narrow.svg @@ -0,0 +1,66 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/star-small.svg b/rtdata/icons/rawtherapee/scalable/apps/star-small.svg new file mode 100644 index 000000000..a1e44d60c --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/star-small.svg @@ -0,0 +1,66 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/star.svg b/rtdata/icons/rawtherapee/scalable/apps/star.svg similarity index 53% rename from rtdata/images/svg/star.svg rename to rtdata/icons/rawtherapee/scalable/apps/star.svg index af9ca870e..e5304fdf5 100644 --- a/rtdata/images/svg/star.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/star.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + transform="matrix(1.5183042,-0.49285198,0.49332694,1.5168424,-8.0396646,-7.2232632)" /> diff --git a/rtdata/images/svg/template-16.svg b/rtdata/icons/rawtherapee/scalable/apps/template-16.svg similarity index 56% rename from rtdata/images/svg/template-16.svg rename to rtdata/icons/rawtherapee/scalable/apps/template-16.svg index d38151609..2af54c644 100644 --- a/rtdata/images/svg/template-16.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/template-16.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> diff --git a/rtdata/icons/rawtherapee/scalable/apps/template-24.svg b/rtdata/icons/rawtherapee/scalable/apps/template-24.svg new file mode 100644 index 000000000..9d95f52af --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/template-24.svg @@ -0,0 +1,59 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/template-narrow.svg b/rtdata/icons/rawtherapee/scalable/apps/template-narrow.svg similarity index 51% rename from rtdata/images/svg/template-narrow.svg rename to rtdata/icons/rawtherapee/scalable/apps/template-narrow.svg index 9a6321317..dc8602564 100644 --- a/rtdata/images/svg/template-narrow.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/template-narrow.svg @@ -2,64 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -104,7 +56,5 @@ diff --git a/rtdata/images/svg/tick-green-hollow-small.svg b/rtdata/icons/rawtherapee/scalable/apps/tick-green-hollow-small.svg similarity index 58% rename from rtdata/images/svg/tick-green-hollow-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/tick-green-hollow-small.svg index fcac2954d..9ff9cbde8 100644 --- a/rtdata/images/svg/tick-green-hollow-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/tick-green-hollow-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -97,14 +56,10 @@ + style="opacity:0.7;fill:none;fill-opacity:1;stroke:#008000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> diff --git a/rtdata/images/svg/tick-green-hollow.svg b/rtdata/icons/rawtherapee/scalable/apps/tick-green-hollow.svg similarity index 57% rename from rtdata/images/svg/tick-green-hollow.svg rename to rtdata/icons/rawtherapee/scalable/apps/tick-green-hollow.svg index 9b1eca47d..0286260eb 100644 --- a/rtdata/images/svg/tick-green-hollow.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/tick-green-hollow.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="opacity:0.7;fill:none;fill-opacity:1;stroke:#008000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0;paint-order:normal" /> diff --git a/rtdata/images/svg/tick-green-small.svg b/rtdata/icons/rawtherapee/scalable/apps/tick-green-small.svg similarity index 55% rename from rtdata/images/svg/tick-green-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/tick-green-small.svg index edf2dd4b4..afe11e7c5 100644 --- a/rtdata/images/svg/tick-green-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/tick-green-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + style="opacity:0.7;fill:#008000;fill-opacity:1.0;stroke:none;stroke-width:2.30911016" /> diff --git a/rtdata/images/svg/tick-green.svg b/rtdata/icons/rawtherapee/scalable/apps/tick-green.svg similarity index 55% rename from rtdata/images/svg/tick-green.svg rename to rtdata/icons/rawtherapee/scalable/apps/tick-green.svg index fa250d9fe..158fd7d8b 100644 --- a/rtdata/images/svg/tick-green.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/tick-green.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="opacity:0.7;fill:#008000;fill-opacity:1.0;stroke:none;stroke-width:2.30911016" /> diff --git a/rtdata/images/svg/tick-hollow-small.svg b/rtdata/icons/rawtherapee/scalable/apps/tick-hollow-small.svg similarity index 54% rename from rtdata/images/svg/tick-hollow-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/tick-hollow-small.svg index 010fba31e..044caa1b5 100644 --- a/rtdata/images/svg/tick-hollow-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/tick-hollow-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -97,14 +56,10 @@ + style="opacity:0.7;fill:none;fill-opacity:1;stroke:#cccccc;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> diff --git a/rtdata/images/svg/tick-small.svg b/rtdata/icons/rawtherapee/scalable/apps/tick-small.svg similarity index 55% rename from rtdata/images/svg/tick-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/tick-small.svg index 943c61d76..0ed45e432 100644 --- a/rtdata/images/svg/tick-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/tick-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -97,14 +56,10 @@ + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:2.30911016" /> diff --git a/rtdata/images/svg/tick.svg b/rtdata/icons/rawtherapee/scalable/apps/tick.svg similarity index 55% rename from rtdata/images/svg/tick.svg rename to rtdata/icons/rawtherapee/scalable/apps/tick.svg index dd4ab4bdd..287d4121f 100644 --- a/rtdata/images/svg/tick.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/tick.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:2.30911016" /> diff --git a/rtdata/images/svg/transform.svg b/rtdata/icons/rawtherapee/scalable/apps/transform.svg similarity index 77% rename from rtdata/images/svg/transform.svg rename to rtdata/icons/rawtherapee/scalable/apps/transform.svg index 09b55309d..357504a7f 100644 --- a/rtdata/images/svg/transform.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/transform.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,9 +55,7 @@ + id="layer1"> + id="path1459-8-6" /> + id="path1452-5-3" /> + id="path5382" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1.01634204" /> diff --git a/rtdata/images/svg/trash-delete.svg b/rtdata/icons/rawtherapee/scalable/apps/trash-delete.svg similarity index 63% rename from rtdata/images/svg/trash-delete.svg rename to rtdata/icons/rawtherapee/scalable/apps/trash-delete.svg index 7593e6001..941db86c8 100644 --- a/rtdata/images/svg/trash-delete.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/trash-delete.svg @@ -2,228 +2,146 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - + style="overflow:visible"> + style="overflow:visible"> + id="ExperimentalArrow"> + style="fill:context-stroke;stroke:#000000;stroke-opacity:1.0" /> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> @@ -268,101 +186,78 @@ + id="layer1"> + id="path976" /> + id="path974" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1;paint-order:normal" /> + id="path1002" /> + id="path1014" /> + id="path1007" /> + style="opacity:0.9;fill:#ffffff;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1.80579805;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1;paint-order:normal" /> + style="opacity:0.9;fill:#ffffff;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1.88275099;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1;paint-order:normal" /> + id="path1017" /> + id="path1019" /> + style="opacity:0.9;fill:#000000;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1.21462178;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1;paint-order:normal" /> + id="path1028" /> + style="opacity:0.9;fill:#000000;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1.46620023;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2;stroke-opacity:1;paint-order:normal" /> diff --git a/rtdata/images/svg/trash-empty-show.svg b/rtdata/icons/rawtherapee/scalable/apps/trash-empty-show.svg similarity index 73% rename from rtdata/images/svg/trash-empty-show.svg rename to rtdata/icons/rawtherapee/scalable/apps/trash-empty-show.svg index 366b15bd6..2d618c7ac 100644 --- a/rtdata/images/svg/trash-empty-show.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/trash-empty-show.svg @@ -2,210 +2,146 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + style="overflow:visible"> + style="overflow:visible"> + id="ExperimentalArrow"> + style="fill:context-stroke;stroke:#000000;stroke-opacity:1.0" /> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> @@ -250,38 +186,32 @@ + id="layer1"> + style="opacity:0.7;fill:#cccccc;stroke:none;stroke-width:39.57666016;fill-opacity:1.0" /> + style="opacity:0.7;fill:#cccccc;stroke:none;stroke-width:39.57666016;fill-opacity:1.0" /> + id="path992" /> + id="path3803" /> diff --git a/rtdata/images/svg/trash-empty.svg b/rtdata/icons/rawtherapee/scalable/apps/trash-empty.svg similarity index 67% rename from rtdata/images/svg/trash-empty.svg rename to rtdata/icons/rawtherapee/scalable/apps/trash-empty.svg index 47ceae609..c943d8934 100644 --- a/rtdata/images/svg/trash-empty.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/trash-empty.svg @@ -2,210 +2,146 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + style="overflow:visible"> + style="overflow:visible"> + id="ExperimentalArrow"> + style="fill:context-stroke;stroke:#000000;stroke-opacity:1.0" /> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> @@ -217,7 +153,7 @@ image/svg+xml - + Maciej Dworak @@ -250,29 +186,24 @@ + id="layer1"> + style="opacity:0.7;fill:#cccccc;stroke:none;stroke-width:39.57666016;fill-opacity:1.0" /> + style="opacity:0.7;fill:#cccccc;stroke:none;stroke-width:39.57666016;fill-opacity:1.0" /> + style="opacity:0.7;fill:#cccccc;stroke:none;stroke-width:39.57666016;fill-opacity:1.0" /> diff --git a/rtdata/images/svg/trash-full-show.svg b/rtdata/icons/rawtherapee/scalable/apps/trash-full-show.svg similarity index 74% rename from rtdata/images/svg/trash-full-show.svg rename to rtdata/icons/rawtherapee/scalable/apps/trash-full-show.svg index 8ec3f9092..215e41a11 100644 --- a/rtdata/images/svg/trash-full-show.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/trash-full-show.svg @@ -2,211 +2,146 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + style="overflow:visible"> + style="overflow:visible"> + id="ExperimentalArrow"> + style="fill:context-stroke;stroke:#000000;stroke-opacity:1.0" /> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> @@ -218,7 +153,7 @@ image/svg+xml - + Maciej Dworak @@ -251,41 +186,38 @@ + id="layer1"> + id="path3803" /> diff --git a/rtdata/images/svg/trash-full.svg b/rtdata/icons/rawtherapee/scalable/apps/trash-full.svg similarity index 62% rename from rtdata/images/svg/trash-full.svg rename to rtdata/icons/rawtherapee/scalable/apps/trash-full.svg index eae5920e3..07a4a1e3e 100644 --- a/rtdata/images/svg/trash-full.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/trash-full.svg @@ -2,211 +2,146 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + style="overflow:visible"> + style="overflow:visible"> + id="ExperimentalArrow"> + style="fill:context-stroke;stroke:#000000;stroke-opacity:1.0" /> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> @@ -218,7 +153,7 @@ image/svg+xml - + Maciej Dworak @@ -251,39 +186,27 @@ + id="layer1"> + id="path5310" /> diff --git a/rtdata/images/svg/trash-hide-deleted.svg b/rtdata/icons/rawtherapee/scalable/apps/trash-hide-deleted.svg similarity index 71% rename from rtdata/images/svg/trash-hide-deleted.svg rename to rtdata/icons/rawtherapee/scalable/apps/trash-hide-deleted.svg index e70aa21e1..ff090598f 100644 --- a/rtdata/images/svg/trash-hide-deleted.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/trash-hide-deleted.svg @@ -2,210 +2,146 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + style="overflow:visible"> + style="overflow:visible"> + id="ExperimentalArrow"> + style="fill:context-stroke;stroke:#000000;stroke-opacity:1.0" /> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> @@ -250,43 +186,33 @@ + id="layer1"> + style="opacity:0.1;fill:#cccccc;stroke:none;stroke-width:1.34910131;fill-opacity:1.0" /> + style="opacity:0.7;fill:#cccccc;stroke:none;stroke-width:1.34910131;fill-opacity:1.0" /> + style="opacity:1;fill:none;fill-rule:evenodd;stroke:#c00000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" + d="m 18.58579,12.41421 -6.34316,6.343152 m 0,-6.343152 6.34316,6.343152" /> diff --git a/rtdata/images/svg/trash-remove-small.svg b/rtdata/icons/rawtherapee/scalable/apps/trash-remove-small.svg similarity index 70% rename from rtdata/images/svg/trash-remove-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/trash-remove-small.svg index a58bafd39..0afdaef37 100644 --- a/rtdata/images/svg/trash-remove-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/trash-remove-small.svg @@ -2,58 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="path8807" /> diff --git a/rtdata/images/svg/trash-remove.svg b/rtdata/icons/rawtherapee/scalable/apps/trash-remove.svg similarity index 66% rename from rtdata/images/svg/trash-remove.svg rename to rtdata/icons/rawtherapee/scalable/apps/trash-remove.svg index 31ca65a56..7d755261c 100644 --- a/rtdata/images/svg/trash-remove.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/trash-remove.svg @@ -2,210 +2,146 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + style="overflow:visible"> + style="overflow:visible"> + id="ExperimentalArrow"> + style="fill:context-stroke;stroke:#000000;stroke-opacity:1.0" /> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> + style="overflow:visible"> @@ -217,7 +153,7 @@ image/svg+xml - + Maciej Dworak @@ -250,39 +186,30 @@ + id="layer1"> + style="opacity:0.7;fill:#cccccc;stroke:none;stroke-width:1.34910131;fill-opacity:1.0" /> + style="opacity:1;fill:#008000;fill-opacity:1.0;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + d="M 20.551716,6.2800579 C 20.245041,5.5113706 19.590094,4.8663289 18.801432,4.5424787 18.403538,4.3782733 17.622605,4.2903615 17.270188,4.3661609 L 17,4.4242737 l 1.997606,9.2876033 1.997608,9.287602 0.205577,-0.04422 c 1.233464,-0.265297 2.27384,-1.628329 2.273116,-2.974575 6.52e-4,-0.225556 -0.420075,-2.267378 -1.43164,-6.941943 -0.788636,-3.6380797 -1.46127,-6.6796912 -1.490551,-6.7586861 z" /> + id="path5310-3" /> + id="rect1539-6" /> diff --git a/rtdata/images/svg/trash-small.svg b/rtdata/icons/rawtherapee/scalable/apps/trash-small.svg similarity index 68% rename from rtdata/images/svg/trash-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/trash-small.svg index 3d2e674c6..405ae1baa 100644 --- a/rtdata/images/svg/trash-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/trash-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -97,29 +56,24 @@ + style="opacity:0.7;fill:#cccccc;stroke:none;stroke-width:62.19189453;fill-opacity:1.0" /> + style="opacity:0.7;fill:#cccccc;stroke:none;stroke-width:62.19189453;fill-opacity:1.0" /> + style="opacity:0.7;fill:#cccccc;stroke:none;stroke-width:62.19189453;fill-opacity:1.0" /> diff --git a/rtdata/images/svg/undo-all.svg b/rtdata/icons/rawtherapee/scalable/apps/undo-all.svg similarity index 58% rename from rtdata/images/svg/undo-all.svg rename to rtdata/icons/rawtherapee/scalable/apps/undo-all.svg index e648588ef..82d3abaee 100644 --- a/rtdata/images/svg/undo-all.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/undo-all.svg @@ -2,66 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -105,21 +55,17 @@ + id="layer1"> + id="path815" /> diff --git a/rtdata/images/svg/undo-small.svg b/rtdata/icons/rawtherapee/scalable/apps/undo-small.svg similarity index 53% rename from rtdata/images/svg/undo-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/undo-small.svg index f06c73392..5d290f41b 100644 --- a/rtdata/images/svg/undo-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/undo-small.svg @@ -2,58 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="path815" /> diff --git a/rtdata/icons/rawtherapee/scalable/apps/undo.svg b/rtdata/icons/rawtherapee/scalable/apps/undo.svg new file mode 100644 index 000000000..2552d5b73 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/undo.svg @@ -0,0 +1,64 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/warning-highlights.svg b/rtdata/icons/rawtherapee/scalable/apps/warning-highlights.svg new file mode 100644 index 000000000..346385d6a --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/warning-highlights.svg @@ -0,0 +1,75 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/warning-shadows.svg b/rtdata/icons/rawtherapee/scalable/apps/warning-shadows.svg new file mode 100644 index 000000000..137cdebd2 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/warning-shadows.svg @@ -0,0 +1,75 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/warning.svg b/rtdata/icons/rawtherapee/scalable/apps/warning.svg new file mode 100644 index 000000000..74a7d1d23 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/warning.svg @@ -0,0 +1,75 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/wavelets.svg b/rtdata/icons/rawtherapee/scalable/apps/wavelets.svg similarity index 56% rename from rtdata/images/svg/wavelets.svg rename to rtdata/icons/rawtherapee/scalable/apps/wavelets.svg index 1d6de039c..9d92638ce 100644 --- a/rtdata/images/svg/wavelets.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/wavelets.svg @@ -2,62 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -101,35 +55,26 @@ + id="layer1"> + style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-mid:none;enable-background:accumulate" /> + style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-mid:none;enable-background:accumulate" /> + style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-mid:none;enable-background:accumulate" /> + style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:52.94812775;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-mid:none;enable-background:accumulate" /> + id="path4443" /> diff --git a/rtdata/images/svg/wb-auto-small.svg b/rtdata/icons/rawtherapee/scalable/apps/wb-auto-small.svg similarity index 71% rename from rtdata/images/svg/wb-auto-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/wb-auto-small.svg index 23e55f560..b0de28748 100644 --- a/rtdata/images/svg/wb-auto-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/wb-auto-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> diff --git a/rtdata/images/svg/wb-auto.svg b/rtdata/icons/rawtherapee/scalable/apps/wb-auto.svg similarity index 70% rename from rtdata/images/svg/wb-auto.svg rename to rtdata/icons/rawtherapee/scalable/apps/wb-auto.svg index 5914ee63e..7011cfe03 100644 --- a/rtdata/images/svg/wb-auto.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/wb-auto.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,16 +55,14 @@ + id="layer1"> diff --git a/rtdata/images/svg/wb-camera-small.svg b/rtdata/icons/rawtherapee/scalable/apps/wb-camera-small.svg similarity index 67% rename from rtdata/images/svg/wb-camera-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/wb-camera-small.svg index 2521d513e..19a241f64 100644 --- a/rtdata/images/svg/wb-camera-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/wb-camera-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -97,13 +56,10 @@ + style="display:inline;opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:37.76315689;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> diff --git a/rtdata/images/svg/wb-camera.svg b/rtdata/icons/rawtherapee/scalable/apps/wb-camera.svg similarity index 66% rename from rtdata/images/svg/wb-camera.svg rename to rtdata/icons/rawtherapee/scalable/apps/wb-camera.svg index f83342b6b..1f4d0d87d 100644 --- a/rtdata/images/svg/wb-camera.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/wb-camera.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,13 +55,10 @@ + id="layer1"> + style="display:inline;opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:37.76315689;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> diff --git a/rtdata/images/svg/wb-cloudy-small.svg b/rtdata/icons/rawtherapee/scalable/apps/wb-cloudy-small.svg similarity index 59% rename from rtdata/images/svg/wb-cloudy-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/wb-cloudy-small.svg index 0197eab4e..bc9e70be3 100644 --- a/rtdata/images/svg/wb-cloudy-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/wb-cloudy-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -97,14 +56,10 @@ + id="path10598" /> diff --git a/rtdata/images/svg/wb-cloudy.svg b/rtdata/icons/rawtherapee/scalable/apps/wb-cloudy.svg similarity index 59% rename from rtdata/images/svg/wb-cloudy.svg rename to rtdata/icons/rawtherapee/scalable/apps/wb-cloudy.svg index 5762fa37b..2d4fed852 100644 --- a/rtdata/images/svg/wb-cloudy.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/wb-cloudy.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,14 +55,10 @@ + id="layer1"> + id="path10598" /> diff --git a/rtdata/icons/rawtherapee/scalable/apps/wb-custom-small.svg b/rtdata/icons/rawtherapee/scalable/apps/wb-custom-small.svg new file mode 100644 index 000000000..f7f66a447 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/wb-custom-small.svg @@ -0,0 +1,80 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/curve-flat.svg b/rtdata/icons/rawtherapee/scalable/apps/wb-custom.svg similarity index 52% rename from rtdata/images/svg/curve-flat.svg rename to rtdata/icons/rawtherapee/scalable/apps/wb-custom.svg index 89888b4d1..199b55ad1 100644 --- a/rtdata/images/svg/curve-flat.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/wb-custom.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> - + id="layer1"> + + + + + diff --git a/rtdata/images/svg/wb-flash-small.svg b/rtdata/icons/rawtherapee/scalable/apps/wb-flash-small.svg similarity index 53% rename from rtdata/images/svg/wb-flash-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/wb-flash-small.svg index 634912538..13fb88b4b 100644 --- a/rtdata/images/svg/wb-flash-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/wb-flash-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -97,14 +56,10 @@ + id="path3360" /> diff --git a/rtdata/images/svg/wb-flash.svg b/rtdata/icons/rawtherapee/scalable/apps/wb-flash.svg similarity index 52% rename from rtdata/images/svg/wb-flash.svg rename to rtdata/icons/rawtherapee/scalable/apps/wb-flash.svg index fb4b0ca66..cafc33867 100644 --- a/rtdata/images/svg/wb-flash.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/wb-flash.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,14 +55,10 @@ + id="layer1"> + id="path3360" /> diff --git a/rtdata/icons/rawtherapee/scalable/apps/wb-fluorescent-small.svg b/rtdata/icons/rawtherapee/scalable/apps/wb-fluorescent-small.svg new file mode 100644 index 000000000..2b1598da1 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/wb-fluorescent-small.svg @@ -0,0 +1,109 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/wb-fluorescent.svg b/rtdata/icons/rawtherapee/scalable/apps/wb-fluorescent.svg new file mode 100644 index 000000000..e2274b902 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/wb-fluorescent.svg @@ -0,0 +1,104 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/wb-lamp-small.svg b/rtdata/icons/rawtherapee/scalable/apps/wb-lamp-small.svg similarity index 50% rename from rtdata/images/svg/wb-lamp-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/wb-lamp-small.svg index 32c172d7f..c553fafae 100644 --- a/rtdata/images/svg/wb-lamp-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/wb-lamp-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -97,76 +56,54 @@ + id="path10544" /> + style="display:inline;opacity:0.7;fill:none;stroke:#cccccc;stroke-width:1.54013252;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + id="path7762" /> + style="display:inline;opacity:0.7;fill:none;stroke:#cccccc;stroke-width:1.54013252;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + id="path7792" /> + style="display:inline;opacity:0.7;fill:none;stroke:#cccccc;stroke-width:1.54013252;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="display:inline;opacity:0.7;fill:none;stroke:#cccccc;stroke-width:1.54013252;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + id="path7764" /> + id="path7794" /> + style="display:inline;opacity:0.7;fill:none;stroke:#cccccc;stroke-width:1.54013252;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="display:inline;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none;stroke-width:0.02588202" /> diff --git a/rtdata/icons/rawtherapee/scalable/apps/wb-lamp.svg b/rtdata/icons/rawtherapee/scalable/apps/wb-lamp.svg new file mode 100644 index 000000000..59fd8777a --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/wb-lamp.svg @@ -0,0 +1,104 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/wb-led-small.svg b/rtdata/icons/rawtherapee/scalable/apps/wb-led-small.svg new file mode 100644 index 000000000..c4aadfc8f --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/wb-led-small.svg @@ -0,0 +1,113 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/icons/rawtherapee/scalable/apps/wb-led.svg b/rtdata/icons/rawtherapee/scalable/apps/wb-led.svg new file mode 100644 index 000000000..8d4343690 --- /dev/null +++ b/rtdata/icons/rawtherapee/scalable/apps/wb-led.svg @@ -0,0 +1,108 @@ + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/wb-shade-small.svg b/rtdata/icons/rawtherapee/scalable/apps/wb-shade-small.svg similarity index 52% rename from rtdata/images/svg/wb-shade-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/wb-shade-small.svg index 78ed1e6c6..e5c3514fb 100644 --- a/rtdata/images/svg/wb-shade-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/wb-shade-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -97,36 +56,26 @@ + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1.0;paint-order:normal" /> + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1.0;paint-order:normal" /> + style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1.0;paint-order:normal" /> diff --git a/rtdata/images/svg/wb-shade.svg b/rtdata/icons/rawtherapee/scalable/apps/wb-shade.svg similarity index 55% rename from rtdata/images/svg/wb-shade.svg rename to rtdata/icons/rawtherapee/scalable/apps/wb-shade.svg index 3ac24bd80..d9d775895 100644 --- a/rtdata/images/svg/wb-shade.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/wb-shade.svg @@ -2,64 +2,23 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -141,32 +100,22 @@ + id="layer1"> + id="path916" /> + id="path926" /> + id="path928" /> + id="path930" /> diff --git a/rtdata/images/svg/wb-sun-small.svg b/rtdata/icons/rawtherapee/scalable/apps/wb-sun-small.svg similarity index 52% rename from rtdata/images/svg/wb-sun-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/wb-sun-small.svg index 94abad681..3758cc387 100644 --- a/rtdata/images/svg/wb-sun-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/wb-sun-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -97,8 +56,6 @@ + id="path10542" /> + style="opacity:0.7;fill:none;stroke:#cccccc;stroke-width:55.93516922;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:none;stroke:#cccccc;stroke-width:41.95137787;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + id="path10560" /> + style="opacity:0.7;fill:none;stroke:#cccccc;stroke-width:41.95137787;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + id="path10566" /> + style="opacity:0.7;fill:none;stroke:#cccccc;stroke-width:55.93516922;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + id="path10572" /> + id="path10576" /> + style="opacity:0.7;fill:none;stroke:#cccccc;stroke-width:41.95137787;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + id="path10582" /> + style="opacity:0.7;fill:none;stroke:#cccccc;stroke-width:41.95137787;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:#cccccc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1.0;paint-order:normal" /> diff --git a/rtdata/images/svg/wb-sun.svg b/rtdata/icons/rawtherapee/scalable/apps/wb-sun.svg similarity index 51% rename from rtdata/images/svg/wb-sun.svg rename to rtdata/icons/rawtherapee/scalable/apps/wb-sun.svg index b9c71a3dc..0ea859e7c 100644 --- a/rtdata/images/svg/wb-sun.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/wb-sun.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,75 +55,61 @@ + id="layer1"> + style="opacity:0.7;fill:none;stroke:#cccccc;stroke-width:55.9351689;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + id="path10544" /> + id="path10558" /> + style="opacity:0.7;fill:none;stroke:#cccccc;stroke-width:41.95137668;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + id="path10564" /> + style="opacity:0.7;fill:none;stroke:#cccccc;stroke-width:41.95137668;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + id="path10570" /> + style="opacity:0.7;fill:none;stroke:#cccccc;stroke-width:55.9351689;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:none;stroke:#cccccc;stroke-width:41.95137668;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + id="path10578" /> + style="opacity:0.7;fill:none;stroke:#cccccc;stroke-width:41.95137668;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + id="path10584" /> - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -97,8 +56,6 @@ + style="opacity:0.7;fill:none;stroke:#cccccc;stroke-width:55.93516922;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + id="path10560" /> + style="opacity:0.7;fill:none;stroke:#cccccc;stroke-width:41.95137787;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + id="path10566" /> + style="opacity:0.7;fill:none;stroke:#cccccc;stroke-width:55.93516922;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + id="path10572" /> + style="opacity:0.7;fill:none;stroke:#cccccc;stroke-width:41.95137787;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + id="path10582" /> + style="opacity:0.7;fill:none;stroke:#cccccc;stroke-width:41.95137787;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + style="opacity:0.7;fill:#cccccc;fill-opacity:1.0;fill-rule:nonzero;stroke:#cccccc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1.0;paint-order:normal" /> diff --git a/rtdata/images/svg/wb-tungsten.svg b/rtdata/icons/rawtherapee/scalable/apps/wb-tungsten.svg similarity index 52% rename from rtdata/images/svg/wb-tungsten.svg rename to rtdata/icons/rawtherapee/scalable/apps/wb-tungsten.svg index 0dabc0935..28030eea7 100644 --- a/rtdata/images/svg/wb-tungsten.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/wb-tungsten.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,63 +55,50 @@ + id="layer1"> + id="path10544" /> + style="opacity:0.7;fill:none;stroke:#cccccc;stroke-width:41.95137668;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + id="path10564" /> + style="opacity:0.7;fill:none;stroke:#cccccc;stroke-width:41.95137668;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + id="path10570" /> + style="opacity:0.7;fill:none;stroke:#cccccc;stroke-width:55.9351689;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + id="path10578" /> + style="opacity:0.7;fill:none;stroke:#cccccc;stroke-width:41.95137668;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" /> + id="path10584" /> + id="path1023" /> diff --git a/rtdata/images/svg/wb-water-small.svg b/rtdata/icons/rawtherapee/scalable/apps/wb-water-small.svg similarity index 66% rename from rtdata/images/svg/wb-water-small.svg rename to rtdata/icons/rawtherapee/scalable/apps/wb-water-small.svg index 2cb62298a..a4d45eeab 100644 --- a/rtdata/images/svg/wb-water-small.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/wb-water-small.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -97,8 +56,6 @@ + style="display:inline;opacity:0.7;fill:#cccccc;fill-opacity:1.0;stroke:none" /> diff --git a/rtdata/images/svg/wb-water.svg b/rtdata/icons/rawtherapee/scalable/apps/wb-water.svg similarity index 64% rename from rtdata/images/svg/wb-water.svg rename to rtdata/icons/rawtherapee/scalable/apps/wb-water.svg index 55a98f099..c716f542f 100644 --- a/rtdata/images/svg/wb-water.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/wb-water.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + Maciej Dworak @@ -96,18 +55,14 @@ + id="layer1"> + id="path5961" /> diff --git a/rtdata/images/svg/window-add.svg b/rtdata/icons/rawtherapee/scalable/apps/window-add.svg similarity index 60% rename from rtdata/images/svg/window-add.svg rename to rtdata/icons/rawtherapee/scalable/apps/window-add.svg index da0651444..11982690a 100644 --- a/rtdata/images/svg/window-add.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/window-add.svg @@ -2,58 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="layer1"> + id="path850" /> + style="opacity:0.9;fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1.0" + d="m 3,17 h 8 M 7,13 v 8" /> diff --git a/rtdata/images/svg/ornament1.svg b/rtdata/images/ornament1.svg similarity index 96% rename from rtdata/images/svg/ornament1.svg rename to rtdata/images/ornament1.svg index af3d729e5..592caac39 100644 --- a/rtdata/images/svg/ornament1.svg +++ b/rtdata/images/ornament1.svg @@ -2,57 +2,16 @@ - - - + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + id="path4462" /> + id="path4462-1" /> + id="path4462-18" /> + id="path4462-1-3" /> diff --git a/rtdata/images/svg/splash.svg b/rtdata/images/splash.svg similarity index 70% rename from rtdata/images/svg/splash.svg rename to rtdata/images/splash.svg index 5d407161a..0fcfdea25 100644 --- a/rtdata/images/svg/splash.svg +++ b/rtdata/images/splash.svg @@ -7,7 +7,7 @@ viewBox="0 0 160 99.999999" version="1.1" id="svg783" - inkscape:version="1.3.1 (91b66b0783, 2023-11-16, custom)" + inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)" sodipodi:docname="splash.svg" inkscape:export-filename="/tmp/splash.png" inkscape:export-xdpi="96" @@ -26,15 +26,15 @@ + + + + + + + + + + + + - + + style="display:inline"> + + diff --git a/rtdata/images/svg/splash_template.svg b/rtdata/images/splash_template.svg similarity index 100% rename from rtdata/images/svg/splash_template.svg rename to rtdata/images/splash_template.svg diff --git a/rtdata/images/svg/add-small.svg b/rtdata/images/svg/add-small.svg deleted file mode 100644 index 13abbdc25..000000000 --- a/rtdata/images/svg/add-small.svg +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/add.svg b/rtdata/images/svg/add.svg deleted file mode 100644 index 41fa7cc39..000000000 --- a/rtdata/images/svg/add.svg +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/arrow-updown.svg b/rtdata/images/svg/arrow-updown.svg deleted file mode 100644 index d5b6c22a5..000000000 --- a/rtdata/images/svg/arrow-updown.svg +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/arrow2-left.svg b/rtdata/images/svg/arrow2-left.svg deleted file mode 100644 index f71ee83e3..000000000 --- a/rtdata/images/svg/arrow2-left.svg +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/arrow2-right.svg b/rtdata/images/svg/arrow2-right.svg deleted file mode 100644 index 8c3f60554..000000000 --- a/rtdata/images/svg/arrow2-right.svg +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/bayer.svg b/rtdata/images/svg/bayer.svg deleted file mode 100644 index 1718ce5c4..000000000 --- a/rtdata/images/svg/bayer.svg +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/bidirectional-arrow-horizontal-hicontrast.svg b/rtdata/images/svg/bidirectional-arrow-horizontal-hicontrast.svg deleted file mode 100644 index f2712cee9..000000000 --- a/rtdata/images/svg/bidirectional-arrow-horizontal-hicontrast.svg +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - 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 deleted file mode 100644 index 6382cc546..000000000 --- a/rtdata/images/svg/bidirectional-arrow-horizontal-prelight.svg +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - 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 deleted file mode 100644 index 93cb21a43..000000000 --- a/rtdata/images/svg/bidirectional-arrow-vertical-hicontrast.svg +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - 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 deleted file mode 100644 index 76f4312cb..000000000 --- a/rtdata/images/svg/bidirectional-arrow-vertical-prelight.svg +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - Lawrence - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/cancel-small.svg b/rtdata/images/svg/cancel-small.svg deleted file mode 100644 index 3bbe99bc1..000000000 --- a/rtdata/images/svg/cancel-small.svg +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/cancel.svg b/rtdata/images/svg/cancel.svg deleted file mode 100644 index c42837e61..000000000 --- a/rtdata/images/svg/cancel.svg +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/circle-darkgray-small.svg b/rtdata/images/svg/circle-darkgray-small.svg deleted file mode 100644 index 8183c820f..000000000 --- a/rtdata/images/svg/circle-darkgray-small.svg +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/circle-magenta-small.svg b/rtdata/images/svg/circle-magenta-small.svg deleted file mode 100644 index 9f2e485f9..000000000 --- a/rtdata/images/svg/circle-magenta-small.svg +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/circle-red-green-small.svg b/rtdata/images/svg/circle-red-green-small.svg deleted file mode 100644 index 96cc892dd..000000000 --- a/rtdata/images/svg/circle-red-green-small.svg +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/contrastmask-off.svg b/rtdata/images/svg/contrastmask-off.svg deleted file mode 100644 index ed76efbbb..000000000 --- a/rtdata/images/svg/contrastmask-off.svg +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/contrastmask-on.svg b/rtdata/images/svg/contrastmask-on.svg deleted file mode 100644 index 9e3504128..000000000 --- a/rtdata/images/svg/contrastmask-on.svg +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/crop-point-hicontrast.svg b/rtdata/images/svg/crop-point-hicontrast.svg deleted file mode 100644 index 4a06bfcba..000000000 --- a/rtdata/images/svg/crop-point-hicontrast.svg +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/crop-small.svg b/rtdata/images/svg/crop-small.svg deleted file mode 100644 index 94c0b43df..000000000 --- a/rtdata/images/svg/crop-small.svg +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/crop.svg b/rtdata/images/svg/crop.svg deleted file mode 100644 index 8fd598f60..000000000 --- a/rtdata/images/svg/crop.svg +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/crosshair-small.svg b/rtdata/images/svg/crosshair-small.svg deleted file mode 100644 index 2e5e6596a..000000000 --- a/rtdata/images/svg/crosshair-small.svg +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/curve-flat-small.svg b/rtdata/images/svg/curve-flat-small.svg deleted file mode 100644 index 59585c64a..000000000 --- a/rtdata/images/svg/curve-flat-small.svg +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/curve-linear-small.svg b/rtdata/images/svg/curve-linear-small.svg deleted file mode 100644 index c2a3f7915..000000000 --- a/rtdata/images/svg/curve-linear-small.svg +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/curve-parametric-small.svg b/rtdata/images/svg/curve-parametric-small.svg deleted file mode 100644 index 2334def2d..000000000 --- a/rtdata/images/svg/curve-parametric-small.svg +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/curve-parametric.svg b/rtdata/images/svg/curve-parametric.svg deleted file mode 100644 index 88a1f0389..000000000 --- a/rtdata/images/svg/curve-parametric.svg +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/edit-point.svg b/rtdata/images/svg/edit-point.svg deleted file mode 100644 index 9f686d6e9..000000000 --- a/rtdata/images/svg/edit-point.svg +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/edit-small.svg b/rtdata/images/svg/edit-small.svg deleted file mode 100644 index 6306f06df..000000000 --- a/rtdata/images/svg/edit-small.svg +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/edit.svg b/rtdata/images/svg/edit.svg deleted file mode 100644 index 71f3d0b06..000000000 --- a/rtdata/images/svg/edit.svg +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/equilizer-narrow.svg b/rtdata/images/svg/equilizer-narrow.svg deleted file mode 100644 index 52dcaed4b..000000000 --- a/rtdata/images/svg/equilizer-narrow.svg +++ /dev/null @@ -1,358 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/equilizer-wide.svg b/rtdata/images/svg/equilizer-wide.svg deleted file mode 100644 index 594cca2ab..000000000 --- a/rtdata/images/svg/equilizer-wide.svg +++ /dev/null @@ -1,263 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/expander-closed-small.svg b/rtdata/images/svg/expander-closed-small.svg deleted file mode 100644 index e9cea3b4d..000000000 --- a/rtdata/images/svg/expander-closed-small.svg +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/expander-open-small.svg b/rtdata/images/svg/expander-open-small.svg deleted file mode 100644 index 8355bc2f3..000000000 --- a/rtdata/images/svg/expander-open-small.svg +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/exposure.svg b/rtdata/images/svg/exposure.svg deleted file mode 100644 index c0edc9e9b..000000000 --- a/rtdata/images/svg/exposure.svg +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/filter-original2.svg b/rtdata/images/svg/filter-original2.svg deleted file mode 100644 index ce761302a..000000000 --- a/rtdata/images/svg/filter-original2.svg +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/flip-horizontal.svg b/rtdata/images/svg/flip-horizontal.svg deleted file mode 100644 index 67465657f..000000000 --- a/rtdata/images/svg/flip-horizontal.svg +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/flip-vertical.svg b/rtdata/images/svg/flip-vertical.svg deleted file mode 100644 index 39771286a..000000000 --- a/rtdata/images/svg/flip-vertical.svg +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/gamut-hist.svg b/rtdata/images/svg/gamut-hist.svg deleted file mode 100644 index 289dbf396..000000000 --- a/rtdata/images/svg/gamut-hist.svg +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/goto-end-small.svg b/rtdata/images/svg/goto-end-small.svg deleted file mode 100644 index 26d805c5d..000000000 --- a/rtdata/images/svg/goto-end-small.svg +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/goto-start-small.svg b/rtdata/images/svg/goto-start-small.svg deleted file mode 100644 index 35b4e9f8c..000000000 --- a/rtdata/images/svg/goto-start-small.svg +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/histogram-bar-off-small.svg b/rtdata/images/svg/histogram-bar-off-small.svg deleted file mode 100644 index 76016bf46..000000000 --- a/rtdata/images/svg/histogram-bar-off-small.svg +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/histogram-bar-on-small.svg b/rtdata/images/svg/histogram-bar-on-small.svg deleted file mode 100644 index 858569703..000000000 --- a/rtdata/images/svg/histogram-bar-on-small.svg +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/histogram-green-off-small.svg b/rtdata/images/svg/histogram-green-off-small.svg deleted file mode 100644 index 462b1b45f..000000000 --- a/rtdata/images/svg/histogram-green-off-small.svg +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/histogram-green-on-small.svg b/rtdata/images/svg/histogram-green-on-small.svg deleted file mode 100644 index 6c06531c6..000000000 --- a/rtdata/images/svg/histogram-green-on-small.svg +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/histogram-type-histogram-raw-small.svg b/rtdata/images/svg/histogram-type-histogram-raw-small.svg deleted file mode 100644 index d9ef178a5..000000000 --- a/rtdata/images/svg/histogram-type-histogram-raw-small.svg +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/node-move-nw-se-hicontrast.svg b/rtdata/images/svg/node-move-nw-se-hicontrast.svg deleted file mode 100644 index 375c8ea27..000000000 --- a/rtdata/images/svg/node-move-nw-se-hicontrast.svg +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/node-move-sw-ne-hicontrast.svg b/rtdata/images/svg/node-move-sw-ne-hicontrast.svg deleted file mode 100644 index fdda47505..000000000 --- a/rtdata/images/svg/node-move-sw-ne-hicontrast.svg +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/node-move-x-hicontrast.svg b/rtdata/images/svg/node-move-x-hicontrast.svg deleted file mode 100644 index a24af10ef..000000000 --- a/rtdata/images/svg/node-move-x-hicontrast.svg +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/node-move-xy-hicontrast.svg b/rtdata/images/svg/node-move-xy-hicontrast.svg deleted file mode 100644 index 05d291870..000000000 --- a/rtdata/images/svg/node-move-xy-hicontrast.svg +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/node-move-y-hicontrast.svg b/rtdata/images/svg/node-move-y-hicontrast.svg deleted file mode 100644 index 615f3f94a..000000000 --- a/rtdata/images/svg/node-move-y-hicontrast.svg +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/profile-partial.svg b/rtdata/images/svg/profile-partial.svg deleted file mode 100644 index 90d22c74a..000000000 --- a/rtdata/images/svg/profile-partial.svg +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/redo.svg b/rtdata/images/svg/redo.svg deleted file mode 100644 index 14f9f7c00..000000000 --- a/rtdata/images/svg/redo.svg +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/refresh.svg b/rtdata/images/svg/refresh.svg deleted file mode 100644 index 3b0b0cb72..000000000 --- a/rtdata/images/svg/refresh.svg +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/remove-small.svg b/rtdata/images/svg/remove-small.svg deleted file mode 100644 index 1bffa469c..000000000 --- a/rtdata/images/svg/remove-small.svg +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/remove.svg b/rtdata/images/svg/remove.svg deleted file mode 100644 index bccfdb160..000000000 --- a/rtdata/images/svg/remove.svg +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/rotate-straighten-small.svg b/rtdata/images/svg/rotate-straighten-small.svg deleted file mode 100644 index 00da936f8..000000000 --- a/rtdata/images/svg/rotate-straighten-small.svg +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/rotate-straighten.svg b/rtdata/images/svg/rotate-straighten.svg deleted file mode 100644 index 34765aa2b..000000000 --- a/rtdata/images/svg/rotate-straighten.svg +++ /dev/null @@ -1,237 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - 90° - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/spot-normal.svg b/rtdata/images/svg/spot-normal.svg deleted file mode 100644 index d0320e31f..000000000 --- a/rtdata/images/svg/spot-normal.svg +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/rtdata/images/svg/star-gold-narrow.svg b/rtdata/images/svg/star-gold-narrow.svg deleted file mode 100644 index ee54c8214..000000000 --- a/rtdata/images/svg/star-gold-narrow.svg +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/star-gold-small.svg b/rtdata/images/svg/star-gold-small.svg deleted file mode 100644 index 48694c3f1..000000000 --- a/rtdata/images/svg/star-gold-small.svg +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/star-hollow-narrow.svg b/rtdata/images/svg/star-hollow-narrow.svg deleted file mode 100644 index 66b1c233c..000000000 --- a/rtdata/images/svg/star-hollow-narrow.svg +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/star-hollow-small.svg b/rtdata/images/svg/star-hollow-small.svg deleted file mode 100644 index 6d63a6e8b..000000000 --- a/rtdata/images/svg/star-hollow-small.svg +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/star-narrow.svg b/rtdata/images/svg/star-narrow.svg deleted file mode 100644 index 90add16d5..000000000 --- a/rtdata/images/svg/star-narrow.svg +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/star-small.svg b/rtdata/images/svg/star-small.svg deleted file mode 100644 index cd7a9b8ef..000000000 --- a/rtdata/images/svg/star-small.svg +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/undo.svg b/rtdata/images/svg/undo.svg deleted file mode 100644 index bc4282693..000000000 --- a/rtdata/images/svg/undo.svg +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/warning-highlights.svg b/rtdata/images/svg/warning-highlights.svg deleted file mode 100644 index c7aaf80ce..000000000 --- a/rtdata/images/svg/warning-highlights.svg +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/warning-shadows.svg b/rtdata/images/svg/warning-shadows.svg deleted file mode 100644 index f9baa36c1..000000000 --- a/rtdata/images/svg/warning-shadows.svg +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/warning.svg b/rtdata/images/svg/warning.svg deleted file mode 100644 index c24ba0653..000000000 --- a/rtdata/images/svg/warning.svg +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/wb-custom-small.svg b/rtdata/images/svg/wb-custom-small.svg deleted file mode 100644 index f176458a8..000000000 --- a/rtdata/images/svg/wb-custom-small.svg +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/wb-custom.svg b/rtdata/images/svg/wb-custom.svg deleted file mode 100644 index f1d2ec8f7..000000000 --- a/rtdata/images/svg/wb-custom.svg +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/wb-fluorescent-small.svg b/rtdata/images/svg/wb-fluorescent-small.svg deleted file mode 100644 index 67c86ec71..000000000 --- a/rtdata/images/svg/wb-fluorescent-small.svg +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/wb-fluorescent.svg b/rtdata/images/svg/wb-fluorescent.svg deleted file mode 100644 index 8746978e1..000000000 --- a/rtdata/images/svg/wb-fluorescent.svg +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/wb-lamp.svg b/rtdata/images/svg/wb-lamp.svg deleted file mode 100644 index 39f2ccb94..000000000 --- a/rtdata/images/svg/wb-lamp.svg +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/wb-led-small.svg b/rtdata/images/svg/wb-led-small.svg deleted file mode 100644 index 7e20c4576..000000000 --- a/rtdata/images/svg/wb-led-small.svg +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/wb-led.svg b/rtdata/images/svg/wb-led.svg deleted file mode 100644 index 952f5f77f..000000000 --- a/rtdata/images/svg/wb-led.svg +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index 03353cdb7..9ce1d8f6d 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -51,7 +51,6 @@ EXIFPANEL_RESET;Reinicialitza EXIFPANEL_RESETALL;Reinic. tot EXIFPANEL_RESETALLHINT;Reinicialitza atributs als valors originals EXIFPANEL_RESETHINT;Reinic. atributs seleccionats als valors originals -EXIFPANEL_SUBDIRECTORY;Subdirectori EXPORT_BYPASS_ALL;Selecciona / Deselecciona tot EXPORT_BYPASS_DEFRINGE;Salta desserrellar EXPORT_BYPASS_DIRPYRDENOISE;Salta reducció de soroll @@ -555,6 +554,7 @@ PROFILEPANEL_TOOLTIPSAVE;Desa l'actual com a perfil.\nCtrl-click per sele PROGRESSBAR_LOADING;Carregant imatge... PROGRESSBAR_LOADINGTHUMBS;Carregant minifotos... PROGRESSBAR_LOADJPEG;Carregant fitxer JPEG... +PROGRESSBAR_LOADJXL;Carregant fitxer JXL... PROGRESSBAR_LOADPNG;Carregant fitxer PNG... PROGRESSBAR_LOADTIFF;Carregant fitxer TIFF... PROGRESSBAR_PROCESSING;Processant imatge... @@ -706,8 +706,6 @@ TP_ICM_TONECURVE_TOOLTIP;Habilita l'ús de corbes de to incloses en els perfils TP_ICM_WORKINGPROFILE;Perfil de treball TP_IMPULSEDENOISE_LABEL;Impuls Reducció de Soroll TP_IMPULSEDENOISE_THRESH;Llindar d'impuls RS -TP_LABCURVE_AVOIDCOLORSHIFT;Evita alteració de color -TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Fica colors al gamut de l'espai de color de treball\ni aplica la correcció Munsell TP_LABCURVE_BRIGHTNESS;Brillantor TP_LABCURVE_CHROMATICITY;Cromaticitat TP_LABCURVE_CONTRAST;Contrast @@ -954,6 +952,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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. +!FILEBROWSER_SHOWRECURSIVE;Show images in sub-folders recursively. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: 0 !FILECHOOSER_FILTER_ANY;All files !FILECHOOSER_FILTER_COLPROF;Color profiles (*.icc) @@ -1327,7 +1326,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_512;Local - SD - ΔE decay !HISTORY_MSG_513;Local - Spot - Excluding - Scope !HISTORY_MSG_514;Local - Spot structure -!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_515;Selective Editing !HISTORY_MSG_516;Local - Color and light !HISTORY_MSG_517;Local - Enable super !HISTORY_MSG_518;Local - Lightness @@ -1637,7 +1636,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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 - TG - Feather gradient +!HISTORY_MSG_833;Local - Mask 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 @@ -1880,7 +1879,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_1082;Local - CIECAM Auto threshold !HISTORY_MSG_1083;Local - CIECAM Hue !HISTORY_MSG_1084;Local - Uses Black Ev - White Ev !HISTORY_MSG_1085;Local - Jz lightness @@ -1996,16 +1995,23 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_ICM_AINTENT;Abstract profile intent !HISTORY_MSG_ICM_BLUX;Primaries Blue X !HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_CAT;Matrix adaptation !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_MIDTCIE;Midtones !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_PRESER;Preserve neutral !HISTORY_MSG_ICM_REDX;Primaries Red X !HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_REFI;Refinement Colors +!HISTORY_MSG_ICM_SHIFTX;Refinement Colors - Shift x +!HISTORY_MSG_ICM_SHIFTY;Refinement Colors - Shift y +!HISTORY_MSG_ICM_SMOOTHCIE;Smooth highlights +!HISTORY_MSG_ICM_TRCEXP;Abstract Profile !HISTORY_MSG_ICM_WORKING_GAMMA;TRC - Gamma !HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method !HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method @@ -2018,7 +2024,72 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_LOCALLAB_TE_PIVOT;Local - Equalizer pivot +!HISTORY_MSG_LOCAL_CIEMASK_BLURCONT;Local - CIECAM Mask blur contrast +!HISTORY_MSG_LOCAL_CIEMASK_BLURFFT;Local - CIECAM Mask blur FFTW +!HISTORY_MSG_LOCAL_CIEMASK_BLURRAD;Local - CIECAM Mask blur radius +!HISTORY_MSG_LOCAL_CIEMASK_CHH;Local - CIECAM Mask curve h(h) +!HISTORY_MSG_LOCAL_CIEMASK_HIGH;Local - CIECAM Mask highlights +!HISTORY_MSG_LOCAL_CIEMASK_SHAD;Local - CIECAM Mask shadows +!HISTORY_MSG_LOCAL_CIEMASK_STRU;Local - CIECAM Mask structure +!HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;Local - CIECAM Mask structure as tool +!HISTORY_MSG_LOCAL_CIEMASK_WLC;Local - CIECAM Mask wavelet L(L) +!HISTORY_MSG_LOCAL_CIEMASK_WLEV;Local - CIECAM Mask wavelet levels +!HISTORY_MSG_LOCAL_CIE_ANGGRAD;Local - CIECAM Gradient angle +!HISTORY_MSG_LOCAL_CIE_BLACKS;Local - CIECAM Blacks distribution +!HISTORY_MSG_LOCAL_CIE_BLUXL;Local - CIECAM Blue X +!HISTORY_MSG_LOCAL_CIE_BLUYL;Local - CIECAM Blue Y +!HISTORY_MSG_LOCAL_CIE_BRICOMP;Local - CIECAM Brightness compression +!HISTORY_MSG_LOCAL_CIE_BRICOMPTH;Local - CIECAM Brightness compression threshold +!HISTORY_MSG_LOCAL_CIE_BWCIE;Local - CIECAM Black and white +!HISTORY_MSG_LOCAL_CIE_CAT;Local - Matrix adaptation +!HISTORY_MSG_LOCAL_CIE_DETAILJZ;Local - JzCzHz Local contrast +!HISTORY_MSG_LOCAL_CIE_ENAMASKALL;Local - CIECAM All mask tools +!HISTORY_MSG_LOCAL_CIE_EXPPRECAM;Local - CIECAM Pre-Cam +!HISTORY_MSG_LOCAL_CIE_GAM;Local - CIECAM Gamma +!HISTORY_MSG_LOCAL_CIE_GAMUTCIE;Local - CIECAM Gamut +!HISTORY_MSG_LOCAL_CIE_GREXL;Local - CIECAM Green X +!HISTORY_MSG_LOCAL_CIE_GREYL;Local - CIECAM Green Y +!HISTORY_MSG_LOCAL_CIE_ILL;Local - CIECAM TRC Illuminant +!HISTORY_MSG_LOCAL_CIE_LOGCIEQ;Local - CIECAM Log encoding Q +!HISTORY_MSG_LOCAL_CIE_MIDT;Local - CIECAM Mid Tones +!HISTORY_MSG_LOCAL_CIE_NORM;Local - CIECAM Normalize L +!HISTORY_MSG_LOCAL_CIE_PRIM;Local - CIECAM TRC primaries +!HISTORY_MSG_LOCAL_CIE_REDXL;Local - CIECAM Red X +!HISTORY_MSG_LOCAL_CIE_REDYL;Local - CIECAM Red Y +!HISTORY_MSG_LOCAL_CIE_REFI;Local - CIECAM Refinement colors +!HISTORY_MSG_LOCAL_CIE_SATCIE;Local - CIECAM Saturation control +!HISTORY_MSG_LOCAL_CIE_SHIFTXL;Local - CIECAM Shift x +!HISTORY_MSG_LOCAL_CIE_SHIFTYL;Local - CIECAM Shift y +!HISTORY_MSG_LOCAL_CIE_SIG;Local - Sigmoid +!HISTORY_MSG_LOCAL_CIE_SIGADAP;Local - CIECAM Sigmoid adaptability +!HISTORY_MSG_LOCAL_CIE_SIGMET;Local - CIECAM Sigmoid method +!HISTORY_MSG_LOCAL_CIE_SLOP;Local - CIECAM Slope +!HISTORY_MSG_LOCAL_CIE_SLOPESMO;Local - CIECAM Gray balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOB;Local - CIECAM Blue balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOG;Local - CIECAM Green balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOR;Local - CIECAM Red balance +!HISTORY_MSG_LOCAL_CIE_SMOOTH;Local - CIECAM Scale Yb scene +!HISTORY_MSG_LOCAL_CIE_SMOOTHMET;Local - CIECAM Smooth lights method +!HISTORY_MSG_LOCAL_CIE_SMOOTHYB;Local - CIECAM Scale Yb viewing +!HISTORY_MSG_LOCAL_CIE_SMOOTH_LUM;Local - CIECAM Levels - Luminosity mode +!HISTORY_MSG_LOCAL_CIE_STRGRAD;Local - CIECAM Gradient strength L +!HISTORY_MSG_LOCAL_CIE_STRLOG;Local - CIECAM Log encoding strength +!HISTORY_MSG_LOCAL_CIE_TRC;Local - CIECAM TRC +!HISTORY_MSG_LOCAL_CIE_WHITES;Local - CIECAM Whites distribution +!HISTORY_MSG_LOCAL_DEHAZE_BLACK;Local - Dehaze Black +!HISTORY_MSG_LOCAL_FEATHERCIE;Local - CIECAM Gradient feather +!HISTORY_MSG_LOCAL_FEATHERCOL;Local - Color Gradient feather +!HISTORY_MSG_LOCAL_FEATHEREXE;Local - Exp Gradient feather +!HISTORY_MSG_LOCAL_FEATHERLOG;Local - Log Gradient feather +!HISTORY_MSG_LOCAL_FEATHERMAS;Local - Mask Common gradient feather +!HISTORY_MSG_LOCAL_FEATHERSH;Local - SH Gradient feather +!HISTORY_MSG_LOCAL_FEATHERVIB;Local - Vib Gradient feather +!HISTORY_MSG_LOCAL_FEATHERWAV;Local - Wav Gradient feather !HISTORY_MSG_LOCAL_GAMUTMUNSEL;Local - SC - Avoid Color Shift +!HISTORY_MSG_LOCAL_LOG_BLACKS;Local - Log Blacks distribution +!HISTORY_MSG_LOCAL_LOG_COMPR;Local - Log Compress brightness +!HISTORY_MSG_LOCAL_LOG_SAT;Local - Log Saturation control +!HISTORY_MSG_LOCAL_LOG_WHITES;Local - Log Whites distribution !HISTORY_MSG_LOCAL_TMO_SATUR;Local Exp Fattal Saturation !HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold @@ -2212,10 +2283,10 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !MAIN_TAB_FAVORITES;Favorites !MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !MAIN_TAB_INSPECT; Inspect -!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB;Selective Editing !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%. +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%, or when capture sharpening is enabled. !MONITOR_PROFILE_SYSTEM;System default !NAVIGATOR_B;B: !NAVIGATOR_G;G: @@ -2242,8 +2313,8 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !PARTIALPASTE_FLATFIELDFROMMETADATA;Flat-field from Metadata !PARTIALPASTE_GRADIENT;Graduated filter !PARTIALPASTE_LOCALCONTRAST;Local contrast -!PARTIALPASTE_LOCALLAB;Local Adjustments -!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings +!PARTIALPASTE_LOCALLAB;Selective Editing +!PARTIALPASTE_LOCALLABGROUP;Selective Editing Settings !PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -2267,13 +2338,15 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color !PREFERENCES_APPEARANCE_MAINFONT;Main font !PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator guide color -!PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode !PREFERENCES_APPEARANCE_THEME;Theme !PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit !PREFERENCES_BEHADDALL;All to 'Add' !PREFERENCES_BEHADDALLHINT;Set all parameters to the Add mode.\nAdjustments of parameters in the batch tool panel will be deltas to the stored values. !PREFERENCES_BEHSETALL;All to 'Set' !PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. +!PREFERENCES_BROWSERECURSIVEDEPTH;Browse sub-folders depth +!PREFERENCES_BROWSERECURSIVEFOLLOWLINKS;Follow symbolic links when browsing sub-folders +!PREFERENCES_BROWSERECURSIVEMAXDIRS;Maximum sub-folders !PREFERENCES_CACHECLEAR;Clear !PREFERENCES_CACHECLEAR_ALL;Clear all cached files: !PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: @@ -2292,7 +2365,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_COMPLEXITYLOC;Default complexity for Selective Editing !PREFERENCES_COMPLEXITY_EXP;Advanced !PREFERENCES_COMPLEXITY_NORM;Standard !PREFERENCES_COMPLEXITY_SIMP;Basic @@ -2337,6 +2410,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !PREFERENCES_LENSPROFILESDIR;Lens profiles directory !PREFERENCES_LENSPROFILESDIR_TOOLTIP;Directory containing Adobe Lens Correction Profiles (LCPs) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders +!PREFERENCES_MAX_ZOOM_TITLE;Maximum zoom !PREFERENCES_METADATA;Metadata !PREFERENCES_METADATA_SYNC;Metadata synchronization with XMP sidecars !PREFERENCES_METADATA_SYNC_NONE;Off @@ -2364,6 +2438,8 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !PREFERENCES_PROFILE_NONE;None !PREFERENCES_PRTINTENT;Rendering intent !PREFERENCES_PRTPROFILE;Color profile +!PREFERENCES_RAW_DECODER;Raw Decoder +!PREFERENCES_RAW_DECODER_ENABLE_LIBRAW;Use LibRaw !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in 'Single Editor Tab Mode' and when 'Demosaicing method used for the preview at <100% zoom' is set to 'As in PP3'. !PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now @@ -2371,7 +2447,8 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_SHOWTOOLTIP;Show Selective Editing advice tooltips +!PREFERENCES_SPOTLOC;Define Spot method for Selective Editing !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules !PREFERENCES_TAB_FAVORITES;Favorites !PREFERENCES_TAB_PERFORMANCE;Performance @@ -2379,6 +2456,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_THUMBNAIL_RANK_COLOR_MODE;Load/Save thumbnail rank and color from/to XMP sidecars !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. @@ -2419,6 +2497,27 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !QINFO_HDR;HDR / %2 frame(s) !QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) !QUEUE_DESTFILENAME;Path and file name +!QUEUE_DESTPREVIEW_TITLE;Select a thumbnail to preview its destination path here +!QUEUE_DESTPREVIEW_TOOLTIP;Destination path for the first selected image appears here +!QUEUE_LOCATION_TEMPLATE_HELP_BUTTON_TOOLTIP;Show or hide a help panel with instructions for creating location templates +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_BODY;If you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p-3/converted/%P-4/%f +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_TITLE;Common examples +!QUEUE_LOCATION_TEMPLATE_HELP_INTRO;The output template field allows you to to dynamically customize the destination folder and filename. When you include certain specifiers, which begin with %, they are replaced by the program when each file is being saved.\n\nThe sections below describe each type of specifier. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_1;Using this pathname as an example: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_2;The meanings of the formatting strings are: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_LINUX;/home/tom/photos/2010-10-31/photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_WINDOWS;D:\tom\photos\2010-10-31\photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO;The %dN, %d-N, %pN, %p-N, %PN and %P-N (N = 1..9) specifiers will be replaced by elements of the image file's directory path.\nThe format specifiers operate as follows:\n %dN = Nth directory from the end of the path\n %d-N = Nth directory from the start of the path\n %pN = all directories up to the Nth from the end of the path\n %p-N = the first N directories in the path\n %PN = the last N directories in the path\n %P-N = all directories from the Nth to the end of the path\n %f = base filename (no extension) +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO_WINDOWS;For Windows paths, %d-1 is the drive letter and colon, and %d-2 is the base directory on that drive. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_TITLE;Directories and partial paths +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_BODY;%r will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used. +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_TITLE;Rank +!QUEUE_LOCATION_TEMPLATE_HELP_RESULT_MISMATCH;ERROR: 2nd result is different: +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_BODY;%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'. +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_TITLE;Position/sequence in queue +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_BODY;Three different date/time values may be used in templates:\n %tE"%Y-%m-%d" = when export started\n %tF"%Y-%m-%d" = when file was last saved\n %tP"%Y-%m-%d" = when photo was taken\nThe quoted string defines the format of the resulting date and/or time. The format string %tF"%Y-%m-%d" is just one example. The string can use all conversion specifiers defined for the g_date_time_format function (see https://docs.gtk.org/glib/method.DateTime.format.html).\n\nExample format strings: +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_TITLE;Date and time +!QUEUE_LOCATION_TEMPLATE_HELP_TITLE;Creating an output template !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 @@ -2442,12 +2541,16 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !SORT_BY_NAME;By Name !SORT_BY_RANK;By Rank !SORT_DESCENDING;Descending +!TC_LOCALLAB_PRIM_SHIFTX;Shift x +!TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP;In combination with "Refine colors", allows you to:\n 1) for low values, adjust the image purity.\n 2) for higher values, carry out moderate color toning.\nBe careful not to go outside the CIE xy diagram. +!TC_LOCALLAB_PRIM_SHIFTY;Shift y !TC_PRIM_BLUX;Bx !TC_PRIM_BLUY;By !TC_PRIM_GREX;Gx !TC_PRIM_GREY;Gy !TC_PRIM_REDX;Rx !TC_PRIM_REDY;Ry +!TC_PRIM_REFI;Refine colors (white-point) !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 @@ -2799,6 +2902,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_BW;Black and White !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. @@ -2819,8 +2923,15 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_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 three main uses - channel mixer, restore image color (saturation), 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_CAT;Matrix adaptation +!TP_ICM_WORKING_CAT_BRAD;Bradford +!TP_ICM_WORKING_CAT_CAT02;Cat02 +!TP_ICM_WORKING_CAT_CAT16;Cat16 +!TP_ICM_WORKING_CAT_TOOLTIP;Performs the chromatic adaptation of the XYZ conversion matrix. Default: Bradford +!TP_ICM_WORKING_CAT_VK;Von Kries +!TP_ICM_WORKING_CAT_XYZ;XYZ scale !TP_ICM_WORKING_CIEDIAG;CIE xy diagram !TP_ICM_WORKING_ILLU;Illuminant !TP_ICM_WORKING_ILLU_1500;Tungsten 1500K @@ -2832,11 +2943,13 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_ICM_WORKING_ILLU_D65;D65 !TP_ICM_WORKING_ILLU_D80;D80 !TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_E;E !TP_ICM_WORKING_ILLU_NONE;Default !TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_NON;None !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_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination primaries' combo box, 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 @@ -2845,11 +2958,14 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_FREE;Custom LA (sliders) !TP_ICM_WORKING_PRIM_JDCMAX;JDC Max +!TP_ICM_WORKING_PRIM_JDCMAXSTDA;JDC Max stdA !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_TOOLTIP;Performs a gamut control. Destination primaries (Advanced) allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified.\nWhen 'Custom LA (sliders)' is selected, you can modify the values of the 3 primaries (Red, Green, and Blue) for x and y. !TP_ICM_WORKING_PRIM_WID;WideGamut !TP_ICM_WORKING_TRC;Tone response curve: !TP_ICM_WORKING_TRC_18;Prophoto g=1.8 @@ -2875,6 +2991,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected !TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file !TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected +!TP_LENSPROFILE_CORRECTION_METADATA;From file metadata !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 @@ -2893,9 +3010,9 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_AUTOGRAYCIE;Automatic !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_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab). Default: Munsell only.\n\nMunsell only: 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. The result is not the same as Lab. !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 @@ -2938,9 +3055,12 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_LOCALLAB_BUTTON_DUPL;Duplicate !TP_LOCALLAB_BUTTON_REN;Rename !TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWEVNONE;None +!TP_LOCALLAB_BWEVSIG;Activated +!TP_LOCALLAB_BWEVSIGLOG;Sigmoid & Log-Encoding !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_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16 (experimental). 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, for example, to match CAM16 processing with the maximum monitor brightness of 400cd/m2. !TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments !TP_LOCALLAB_CAMMODE;CAM model !TP_LOCALLAB_CAMMODE_CAM16;CAM 16 @@ -2980,6 +3100,12 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_SMOOTHFRAME;Highlight Attenuation & Levels +!TP_LOCALLAB_CIE_SMOOTH_EV;Ev based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA;Slope based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF;Gamma based +!TP_LOCALLAB_CIE_SMOOTH_LEVELS;Levels +!TP_LOCALLAB_CIE_SMOOTH_NONE;None !TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) !TP_LOCALLAB_CIRCRADIUS;Spot size !TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the 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. @@ -2995,8 +3121,9 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_COLORDEPREV_TOOLTIP;Preview ΔE button in Settings will only work if you have activated 'Sharpening', 'Soft Light and Original Retinex', 'Blur/Grain and Denoise', 'Dehaze and Retinex', or 'Contrast by Detail Levels' in the 'Add tool to current spot' menu.\nFor others tools, the Preview ΔE button is in the tool, which allows previewing ΔE with several tools enabled. Prefer using Mask and modifications. !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_COLORFRAME;Dominant color !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 @@ -3004,7 +3131,10 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_LOCALLAB_COL_NAME;Name !TP_LOCALLAB_COL_VIS;Status !TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPRCIE;Brightness compression +!TP_LOCALLAB_COMPRCIETH;Compression threshold !TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_COMPRLOG_TOOLTIP;This algorithm compress the data before log conversion, above the threshold slider value. To use in conjunction with Whites distribution. !TP_LOCALLAB_CONTCOL;Contrast threshold !TP_LOCALLAB_CONTFRA;Contrast by level !TP_LOCALLAB_CONTRAST;Contrast @@ -3019,7 +3149,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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 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 spot. -!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combo box 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. @@ -3028,13 +3158,14 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_LOCALLAB_DARKRETI;Darkness !TP_LOCALLAB_DEHAFRA;Dehaze !TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZE_BLACK;Black !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_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. @@ -3054,6 +3185,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_LOCALLAB_DETAILFRA;Edge detection - DCT !TP_LOCALLAB_DETAILSH;Details !TP_LOCALLAB_DETAILTHR;Lum/chrom detail threshold +!TP_LOCALLAB_DISAB_CIECAM;Disable Ciecam or Weak Jz surround !TP_LOCALLAB_DIVGR;Gamma !TP_LOCALLAB_DUPLSPOTNAME;Copy !TP_LOCALLAB_EDGFRA;Edge sharpness @@ -3062,6 +3194,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping !TP_LOCALLAB_ENABLE_MASK;Enable mask !TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENABLE_MASKALL;Enable all mask tools !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 @@ -3077,9 +3210,10 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all selective editing data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\nUse 'Scope' (Excluding) to set the exclusion intensity.\n\n'Full image' allows you to use the selective editing tools on the whole image.\nThe RT Spot delimiters are set beyond the image preview boundaries.\nThe 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.\nNote: 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.\n\n'Global' allows you to use the selective editing tools on the whole image, without using Delta E or transitions. !TP_LOCALLAB_EXECLU;Excluding spot !TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXMAIN;Global !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 @@ -3088,11 +3222,11 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Selective Editing 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 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_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. @@ -3114,7 +3248,8 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_LOCALLAB_FATSAT;Saturation control !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_FEATVALUE;Feather gradient +!TP_LOCALLAB_FEATVALUE_MASK;Feather gradient (Grad. Filters Mask) !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 @@ -3210,7 +3345,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_LABEL;Selective Editing !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 @@ -3255,8 +3390,10 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_LOGCIE;Log encoding +!TP_LOCALLAB_LOGCIEQ;Log Encoding Q (with Ciecam) +!TP_LOCALLAB_LOGCIEQ_TOOLTIP;Activating the checkbox allows you to switch between log encoding based on the 3 RGB channels, and log encoding based solely on Ciecam’s brightness (Q) channel.\nUsing the Q channel instead of the RGB channels helps avoid undesirable edge effects such as hue and saturation shifts.\nHowever, the settings are more difficult to optimise because Q is unbounded and Ciecam alters the data to take into account the surround conditions, simultaneous contrast, etc.\nYou may have to adjust the following:\n Scene conditions: Mean luminance (Yb), Whites & Blacks distribution, Black Ev, White Ev.\n Source Data Adjustments : Brightness compression, Strength.\n\nNote: when using Log Encoding (Q), be careful not to activate the Disable Ciecam option in the Scene Conditions, Surround menu. +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you to use Black Ev, White Ev, White and Black distribution, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using 'Log encoding' with Brightness compression. !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) @@ -3264,7 +3401,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_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 @@ -3277,6 +3414,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_LOGPFRA2;Log Encoding settings !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. @@ -3346,7 +3484,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_MASKUNUSABLE;Mask disabled (Enable in 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 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 @@ -3382,6 +3520,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_LOCALLAB_MERTWE;Exclusion !TP_LOCALLAB_MERTWO;Subtract !TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MIDTCIE;Midtones !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 @@ -3429,10 +3568,15 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_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_PRECAMGAMUT_TOOLTIP;If checked, ensures a gamut control just after primary conversion to XYZ. +!TP_LOCALLAB_PRECAMREFIMAIN_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. In combination with "Shift x" and "Shift y", allows you to carry out moderate color toning. +!TP_LOCALLAB_PRECAMREFI_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. +!TP_LOCALLAB_PRECAM_TOOLTIP;'Source Data Adjustments' modifies the Dynamic Range using Log encoding, the tones of the image and primaries (simplified Abstract Profile), and midtones, just before the Ciecam process. These values are adjustable:\nGamma: Acts mainly on light tones\nSlope: Acts mainly on dark tones. You 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.\nDestination primaries: Allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified. You can also finely adapt the primaries and the illuminant (white-point). Moving a primary away from the white point reduces saturation and vice versa. Pay attention to the gamut. !TP_LOCALLAB_PREVHIDE;Hide additional settings !TP_LOCALLAB_PREVIEW;Preview ΔE !TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PRIMILLFRAME;Primaries & Illuminant !TP_LOCALLAB_PROXI;ΔE decay !TP_LOCALLAB_QUAAGRES;Aggressive !TP_LOCALLAB_QUACONSER;Conservative @@ -3477,10 +3621,11 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_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_SATCIE;Saturation control !TP_LOCALLAB_SATUR;Saturation !TP_LOCALLAB_SATURV;Saturation (s) !TP_LOCALLAB_SCALEGR;Scale @@ -3501,7 +3646,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_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;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. @@ -3547,17 +3692,41 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_SIGBLACKSSCIE;Blacks distribution +!TP_LOCALLAB_SIGCIE;Sigmoid +!TP_LOCALLAB_SIGFRA;Sigmoid Q +!TP_LOCALLAB_SIGGAMJCIE;Gamma !TP_LOCALLAB_SIGJZFRA;Sigmoid Jz !TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOID16_TOOLTIP;Allows you to simulate a tone mapping appearance using both 'Ciecam' and 'Sigmoid Q'. Sigmoid Q has three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc) Adaptability weights the action of the sigmoid by action on the internal exponential function. !TP_LOCALLAB_SIGMOIDBL;Blend !TP_LOCALLAB_SIGMOIDLAMBDA;Contrast -!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDLOGAUTO;Auto threshold +!TP_LOCALLAB_SIGMOIDLOGEV_TOOLTIP;If the combo box selection 'Black Ev and White Ev' is 'Sigmoid and Log encoding' instead of 'Sigmoid only', the two algorithms 'Log encoding' and 'Sigmoid' are used together. +!TP_LOCALLAB_SIGMOIDNORMCIE;Normalize Luminance +!TP_LOCALLAB_SIGMOIDNORMCIEBLEND_TOOLTIP;Blend acts on the final aspect of the image, contrast and luminance. Ratio between original and output image. +!TP_LOCALLAB_SIGMOIDNORMCIE_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image take into account those of the original.\nAll the adjustments acting on J or Q are taken into account, including those which are not relative to Sigmoid Q. +!TP_LOCALLAB_SIGMOIDQJ;Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDQJCOMPRCIE_TOOLTIP;When the combo box selection 'Uses Black Ev and White Ev' is 'Sigmoid and Log encoding Q' or 'Log encoding instead of Sigmoid' checked. This algorithm compress the data above the threshold slider value. The last value stands for brightness (Q) and should be close as possible to the value 'Compression threshold' (calculate when 'Auto threshold" checked, often > 1). +!TP_LOCALLAB_SIGMOIDSENSI;Adaptability !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_SIGMOIDWHITESCIE_TOOLTIP;Allows you, in Automatic when the dynamic range of the image is high, to change the distribution of lights in whites and deep blacks.\nCan be used with Log encoding or Sigmoid with Black Ev and White Ev enabled.\n\nThe algorithm does not change the basic data, but acts on the components necessary to calculate the Dynamic range, Black Ev, White Ev and the Gray point. +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a tone mapping appearance using both the 'Jz' and 'Sigmoid' function. Three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SIGSLOPJCIE;Slope +!TP_LOCALLAB_SIGTRCCIE;Source Data Adjustments +!TP_LOCALLAB_SIGWHITESCIE;Whites distribution !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_SLOPESMOOTH;Gray balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHB;Blue balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHG;Green balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHR;Red balance (Slope) !TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SMOOTHCIE;Highlight Attenuation +!TP_LOCALLAB_SMOOTHCIE_LUM;Luminosity mode +!TP_LOCALLAB_SMOOTHCIE_SCA;Scale Yb Scene +!TP_LOCALLAB_SMOOTHCIE_TOOLTIP;Completes the processing carried out by gamma, slope and midtones by causing a slight lowering of lights. Please note this does not replace Highlight reconstruction.\n\nGamma based and Slope based (Standard and Advanced) allow you to simulate a tone mapping using:\na) Scene conditions: Black-Ev, White-Ev, Mean luminance (Yb%)\nb) Viewing conditions: Mean luminance (Yb%).\n\nScale Yb Scene is function of White-Ev. +!TP_LOCALLAB_SMOOTHCIE_YB;Scale Yb Viewing !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. @@ -3579,13 +3748,14 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_STRENGTHCIELOG;Strength !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_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. @@ -3617,11 +3787,12 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_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_TRCFRAME;Tone Response Curve & Midtones !TP_LOCALLAB_USEMASK;Laplacian !TP_LOCALLAB_VART;Variance (contrast) !TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool @@ -4180,7 +4351,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_WAVELET_WAVOFFSET;Offset !TP_WBALANCE_AUTOITCGREEN;Temperature correlation !TP_WBALANCE_AUTOOLD;RGB grey -!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement +!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement !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_ITCWALG_TOOLTIP;Allows you to switch to the other Alternative temperature (Alt_temp), when possible.\nInactive in the "single choice" case. @@ -4225,7 +4396,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_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).\nIn the rare case of a color drift with "Observer 2°" (probably due to the conversion matrix) "Observer 10°" must be selected. !TP_WBALANCE_PATCHLABEL;Read colors:%1 Patch: Chroma:%2 Size=%3 !TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colors (max=237).\nDisplay calculated Patch Chroma.\nAWB temperature bias, lets try to reduce this value, a minimum may seem to optimize the algorithm.\n\nPatch size matching chroma optimization. !TP_WBALANCE_PATCHLEVELLABEL;Patch: ΔE=%1 - datas x 9 Min:%2 Max=%3 diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index f18513c15..ee075d9b6 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -7,6 +7,8 @@ #006 2020-08-11 十一元人民币 #007 2021-09-24 十一元人民币 #008 2022-07-26 十一元人民币 +#009 2023-12-25 十一元人民币 +#010 2024-06-03 十一元人民币 #100 #101 @LANGUAGE_DISPLAY_NAME=简体中文 @@ -58,8 +60,8 @@ DYNPROFILEEDITOR_NEW;新建 DYNPROFILEEDITOR_NEW_RULE;新建动态配置规则 DYNPROFILEEDITOR_PROFILE;处理配置规则 EDITWINDOW_TITLE;图片修改 -EDIT_OBJECT_TOOLTIP;在预览窗口中显示一个允许你调整本工具的可视窗口 -EDIT_PIPETTE_TOOLTIP;若希望向曲线中添加一个调整点,请点击此按钮,按住Ctrl键并用鼠标左键点击图像预览中你想调整的地方。\n若要调整点的位置,请按住Ctrl键并用鼠标左键点击图像预览中的对应位置,然后松开Ctrl(除非你希望精调)同时按住鼠标左键,将鼠标向上/下移动以上下调整曲线中的点 +EDIT_OBJECT_TOOLTIP;在预览区显示一个允许你调整本工具的可视窗口 +EDIT_PIPETTE_TOOLTIP;若希望添加一个调整点,请单击此按钮,然后按住Ctrl键并用鼠标左键点击预览区中你想调整的地方。\n若要对该点做调整,请按住Ctrl键单击预览区中的对应位置,然后松开Ctrl(除非你希望精调)并按住鼠标左键,上/下移动鼠标即可调整曲线中的点 EXIFFILTER_APERTURE;光圈 EXIFFILTER_CAMERA;相机 EXIFFILTER_EXPOSURECOMPENSATION;曝光补偿值 (EV) @@ -69,6 +71,7 @@ EXIFFILTER_IMAGETYPE;图像类型 EXIFFILTER_ISO;感光度 EXIFFILTER_LENS;镜头 EXIFFILTER_METADATAFILTER;启用元数据过滤器 +EXIFFILTER_PATH;文件路径 EXIFFILTER_SHUTTER;快门 EXIFPANEL_ADDEDIT;添加/编辑 EXIFPANEL_ADDEDITHINT;添加/编辑标签 @@ -83,8 +86,6 @@ EXIFPANEL_RESET;重置 EXIFPANEL_RESETALL;全部重置 EXIFPANEL_RESETALLHINT;重置所有标签内容 EXIFPANEL_RESETHINT;重置所选标签内容 -EXIFPANEL_SHOWALL;显示所有 -EXIFPANEL_SUBDIRECTORY;子文件夹 EXPORT_BYPASS;要跳过的处理步骤 EXPORT_BYPASS_ALL;选择/取消选择全部选项 EXPORT_BYPASS_DEFRINGE;跳过去除色边处理 @@ -107,11 +108,11 @@ EXPORT_FASTEXPORTOPTIONS;快速导出选项 EXPORT_INSTRUCTIONS;快速导出选项提供跳过占用资源和时间的处理步骤的选项,并使用快速导出设定来进行队列处理。\n此方法推荐在优先追求速度,生成低分辨率图片时使用;或是调整尺寸的图片大小适合你想得到的图片,并且又不想修改这些照片的后期处理参数时使用。 EXPORT_MAXHEIGHT;最大高度: EXPORT_MAXWIDTH;最大宽度: -EXPORT_PIPELINE;输出流水线 +EXPORT_PIPELINE;输出流水线 EXPORT_PUTTOQUEUEFAST;放入快速导出队列 EXPORT_RAW_DMETHOD;去马赛克算法 EXPORT_USE_FAST_PIPELINE;专门(对缩放大小的图片应用全部处理) -EXPORT_USE_FAST_PIPELINE_TOOLTIP;使用专门的处理流水线来对图片进行处理,通过牺牲质量来换取速度。图片的缩小操作会提前,而非在正常流水线中那样在最后进行。这能够大幅提升速度,但是输出的图片中可能会杂点较多,画质较低。 +EXPORT_USE_FAST_PIPELINE_TOOLTIP;使用专门的处理流水线来处理图片,通过牺牲质量来换取速度。图片的缩小操作会提前,而不像正常情况那样在最后进行。这能够大幅提升速度,但是输出的图片可能画质较低且有较多杂点,。 EXPORT_USE_NORMAL_PIPELINE;标准(跳过某些步骤,并在最后缩放图片) EXTPROGTARGET_1;raw EXTPROGTARGET_2;队列已处理 @@ -397,12 +398,12 @@ HISTORY_MSG_148;微反差 HISTORY_MSG_149;微反差-3×3阵列 HISTORY_MSG_150;去马赛克后降噪/去杂点 HISTORY_MSG_151;鲜明度 -HISTORY_MSG_152;鲜明-欠饱和色 -HISTORY_MSG_153;鲜明-饱和色 +HISTORY_MSG_152;鲜明-低饱和色 +HISTORY_MSG_153;鲜明-高饱和色 HISTORY_MSG_154;鲜明-肤色保护 HISTORY_MSG_155;Vib-避免色彩偏移 -HISTORY_MSG_156;鲜明-饱和/欠饱和挂钩 -HISTORY_MSG_157;鲜明-饱/欠阈值 +HISTORY_MSG_156;鲜明-高/低饱和挂钩 +HISTORY_MSG_157;鲜明-高/低饱和阈值 HISTORY_MSG_158;色调映射-力度 HISTORY_MSG_159;色调映射-边缘 HISTORY_MSG_160;色调映射-规模度 @@ -548,7 +549,7 @@ HISTORY_MSG_309;小波-边缘锐度-细节 HISTORY_MSG_310;小波-残差图-肤色保护 HISTORY_MSG_311;小波-小波层级 HISTORY_MSG_312;小波-残差图-阴影阈值 -HISTORY_MSG_313;小波-色度-饱和/欠饱和 +HISTORY_MSG_313;小波-色度-高/低饱和 HISTORY_MSG_314;小波-色域-减少杂点 HISTORY_MSG_315;小波-残差图-反差 HISTORY_MSG_316;小波-色域-肤色针对 @@ -559,8 +560,8 @@ HISTORY_MSG_320;小波-反差-粗糙范围 HISTORY_MSG_321;小波-反差-粗糙等级 HISTORY_MSG_322;小波-色域-避免偏色 HISTORY_MSG_323;小波-边缘-局部反差 -HISTORY_MSG_324;小波-色度-欠饱和 -HISTORY_MSG_325;小波-色度-饱和 +HISTORY_MSG_324;小波-色度-低饱和 +HISTORY_MSG_325;小波-色度-高饱和 HISTORY_MSG_326;小波-色度-方法 HISTORY_MSG_327;小波-反差-应用到 HISTORY_MSG_328;小波-色度-力度挂钩 @@ -620,6 +621,7 @@ HISTORY_MSG_404;小波-边缘-放大基数 HISTORY_MSG_405;小波-去噪-第4级 HISTORY_MSG_406;小波-边缘-边缘像素 HISTORY_MSG_440;CbDL-方法 +HISTORY_MSG_444;白平衡-色温偏向 HISTORY_MSG_445;Raw子图像 HISTORY_MSG_449;像素偏移-ISO适应 HISTORY_MSG_452;像素偏移-显示动体 @@ -681,8 +683,8 @@ HISTORY_MSG_534;局部-冷暖 HISTORY_MSG_535;局部-曝补 范围 HISTORY_MSG_536;局部-曝光对比度曲线 HISTORY_MSG_537;局部-鲜明度 -HISTORY_MSG_538;局部-鲜明 饱和色 -HISTORY_MSG_539;局部-鲜明 欠饱和色 +HISTORY_MSG_538;局部-鲜明 高饱和色 +HISTORY_MSG_539;局部-鲜明 低饱和色 HISTORY_MSG_540;局部-鲜明 阈值 HISTORY_MSG_541;局部-鲜明 肤色保护 HISTORY_MSG_542;局部-鲜明 避免偏色 @@ -826,7 +828,7 @@ HISTORY_MSG_SOFTLIGHT_ENABLED;柔光 HISTORY_MSG_SOFTLIGHT_STRENGTH;柔光-力度 HISTORY_MSG_SPOT;污点移除 HISTORY_MSG_TM_FATTAL_ANCHOR;DRC-锚点 -HISTORY_MSG_TRANS_Method;几何-方法 +HISTORY_MSG_TRANS_METHOD;几何-方法 HISTORY_MSG_WAVLEVELSIGM;去噪-半径 HISTORY_MSG_WAVLEVSIGM;半径 HISTORY_MSG_WAVOFFSET;偏移 @@ -862,9 +864,10 @@ IPTCPANEL_RESETHINT;重置为默认配置 IPTCPANEL_SOURCE;来源 IPTCPANEL_TITLE;标题 MAIN_BUTTON_FULLSCREEN;全屏 +MAIN_BUTTON_NAVNEXT_TOOLTIP;跳转到当前编辑图片的下一张图像。\n快捷键:Shift-F4\n\n若要跳转到当前选中图片的下一张图像:\n快捷键: F4 +MAIN_BUTTON_NAVPREV_TOOLTIP;跳转到当前编辑图片的上一张图像。\n快捷键:Shift-F3\n\n若要跳转到当前选中图片的上一张图像:\nShortcut: F3 MAIN_BUTTON_PREFERENCES;参数设置 MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;将当前图片放入处理队列中\n快捷键:Ctrl+b -MAIN_BUTTON_SAVE;保存图片 MAIN_BUTTON_SAVE_TOOLTIP;保存当前图像\n快捷键:Ctrl+S MAIN_BUTTON_SENDTOEDITOR;发送到编辑器 MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;使用外部工具编辑当前图像\n快捷键:Ctrl+E @@ -874,17 +877,17 @@ MAIN_FRAME_EDITOR;编辑器 MAIN_FRAME_EDITOR_TOOLTIP;编辑器\n快捷键:Ctrl-F4 MAIN_FRAME_FILEBROWSER;文件浏览器 MAIN_FRAME_FILEBROWSER_TOOLTIP;文件浏览器\n快捷键:Ctrl-F2 -MAIN_FRAME_PLACES;位置 +MAIN_FRAME_PLACES;位置 MAIN_FRAME_PLACES_ADD;添加 MAIN_FRAME_PLACES_DEL;移除 -MAIN_FRAME_QUEUE;批处理队列 +MAIN_FRAME_QUEUE;批处理队列 MAIN_FRAME_QUEUE_TOOLTIP;处理队列\n快捷键:Ctrl-F3 -MAIN_FRAME_RECENT;最近使用的文件夹 +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_OPERATIONCANCELLED;取消 @@ -990,7 +993,7 @@ PARTIALPASTE_HSVEQUALIZER;HSV均衡器 PARTIALPASTE_ICMSETTINGS;ICM设置 PARTIALPASTE_IMPULSEDENOISE;脉冲噪声降低 PARTIALPASTE_IPTCINFO;IPTC 信息 -PARTIALPASTE_LABCURVE;Lab调整 +PARTIALPASTE_LABCURVE;L*a*b*调整 PARTIALPASTE_LENSGROUP;镜头相关设置 PARTIALPASTE_LENSPROFILE;镜片修正档案 PARTIALPASTE_LOCALCONTRAST;局部反差 @@ -1031,16 +1034,15 @@ PARTIALPASTE_SHARPENMICRO;微反差 PARTIALPASTE_SOFTLIGHT;柔光 PARTIALPASTE_SPOT;污点移除 PARTIALPASTE_TM_FATTAL;动态范围压缩 +PARTIALPASTE_VIBRANCE;鲜艳度 PARTIALPASTE_VIGNETTING;暗角矫正 PARTIALPASTE_WHITEBALANCE;白平衡 -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;使用操作系统主显示器的色彩档案 @@ -1165,13 +1167,13 @@ PREFERENCES_PREVDEMO_LABEL;小于100%缩放查看时使用的去马赛克算法 PREFERENCES_PREVDEMO_SIDECAR;与PP3相同 PREFERENCES_PRINTER;打印机 (软打样) PREFERENCES_PROFILEHANDLING;图片处理配置管理 -PREFERENCES_PROFILELOADPR;配置文件读取优先级 +PREFERENCES_PROFILELOADPR;优先读取的配置文件 PREFERENCES_PROFILEPRCACHE;缓存中的配置文件 PREFERENCES_PROFILEPRFILE;图片所在目录的配置文件 -PREFERENCES_PROFILESAVEBOTH;将配置文件存放到缓存和输入图片所在位置 -PREFERENCES_PROFILESAVECACHE;将配置文件存放到缓存 -PREFERENCES_PROFILESAVEINPUT;将配置文件与图片并列存放 -PREFERENCES_PROFILESAVELOCATION;将配置文件存放到缓存和输入图片所在目录 +PREFERENCES_PROFILESAVEBOTH;将配置文件向缓存和输入图片所在目录各存放一份 +PREFERENCES_PROFILESAVECACHE;将配置文件存放至缓存 +PREFERENCES_PROFILESAVEINPUT;将配置文件存放至与图片相同的目录 +PREFERENCES_PROFILESAVELOCATION;配置文件的保存位置 PREFERENCES_PROFILE_NONE;无 PREFERENCES_PROPERTY;属性 PREFERENCES_PRTINTENT;渲染意图 @@ -1201,6 +1203,7 @@ PREFERENCES_STARTUPIMDIR;启动时路径 PREFERENCES_TAB_BROWSER;文件浏览器 PREFERENCES_TAB_COLORMGR;色彩管理 PREFERENCES_TAB_DYNAMICPROFILE;动态预设规则 +PREFERENCES_TAB_FAVORITES;收藏 PREFERENCES_TAB_GENERAL;通用 PREFERENCES_TAB_IMPROC;图片处理 PREFERENCES_TAB_PERFORMANCE;性能 @@ -1209,9 +1212,13 @@ 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_TOOLPANEL_FAVORITE;收藏 +PREFERENCES_TOOLPANEL_FAVORITESPANEL;收藏栏 +PREFERENCES_TOOLPANEL_TOOL;工具 PREFERENCES_TP_LABEL;工具栏 PREFERENCES_TP_VSCROLLBAR;隐藏垂直滚动条 PREFERENCES_USEBUNDLEDPROFILES;启用内置预设 +PREFERENCES_WBA;白平衡 PREFERENCES_WORKFLOW;软件界面 PREFERENCES_ZOOMONSCROLL;滚动鼠标滚轮控制图片缩放 PROFILEPANEL_COPYPPASTE;要复制的参数 @@ -1241,6 +1248,7 @@ PROGRESSBAR_LINEDENOISE;线状噪点过滤... PROGRESSBAR_LOADING;图片加载中... PROGRESSBAR_LOADINGTHUMBS;读取缩略图... PROGRESSBAR_LOADJPEG;JPEG文件加载中... +PROGRESSBAR_LOADJXL;JXL文件加载中... PROGRESSBAR_LOADPNG;PNG文件加载中... PROGRESSBAR_LOADTIFF;TIFF文件加载中... PROGRESSBAR_NOIMAGES;未找到图片 @@ -1254,7 +1262,7 @@ PROGRESSBAR_SAVETIFF;TIFF文件保存中... PROGRESSBAR_SNAPSHOT_ADDED;快照已添加 QINFO_FRAMECOUNT;%2帧 QINFO_HDR;HDR / %2帧 -QINFO_ISO;ISO +QINFO_ISO;ISO QINFO_NOEXIF;Exif数据不可用 QINFO_PIXELSHIFT;像素偏移/ %2帧 QUEUE_AUTOSTART;自动开始 @@ -1310,12 +1318,12 @@ TP_BWMIX_FILTER_RED;红 TP_BWMIX_FILTER_REDYELLOW;红-黄 TP_BWMIX_FILTER_TOOLTIP;色彩过滤能模拟使用色彩滤片所拍摄出的照片。色彩滤片会减少某个波段的光的传入,因此影响到其亮度,比如:红色滤片会让蓝天变暗。 TP_BWMIX_FILTER_YELLOW;黄 -TP_BWMIX_GAMMA;伽马矫正 +TP_BWMIX_GAMMA;伽马矫正 TP_BWMIX_GAM_TOOLTIP;矫正红绿蓝三色通道(RGB)伽马 TP_BWMIX_LABEL;黑白 TP_BWMIX_MET;方法 TP_BWMIX_MET_CHANMIX;通道混合器 -TP_BWMIX_MET_DESAT;去饱和 +TP_BWMIX_MET_DESAT;降低饱和度 TP_BWMIX_MET_LUMEQUAL;亮度均衡器 TP_BWMIX_MIXC;通道混合器 TP_BWMIX_NEUTRAL;重置 @@ -1383,7 +1391,7 @@ 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_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 @@ -1402,7 +1410,7 @@ TP_COLORAPP_LABEL_CAM02;图像调整 TP_COLORAPP_LABEL_SCENE;场景条件 TP_COLORAPP_LABEL_VIEWING;观察条件 TP_COLORAPP_LIGHT;明度 (J) -TP_COLORAPP_LIGHT_TOOLTIP; CIECAM02/16中的“明度”指一个刺激物的清晰度与相似观察条件下的白色物体清晰度之相对值,与Lab和RGB的“明度”意义不同 +TP_COLORAPP_LIGHT_TOOLTIP; CIECAM02/16中的“明度”指一个刺激物的清晰度与相似观察条件下的白色物体清晰度之间的相对值,与Lab和RGB的“明度”意义不同 TP_COLORAPP_MEANLUMINANCE;平均亮度(Yb%) TP_COLORAPP_MODEL;白点模型 TP_COLORAPP_MODELCAT;色貌模型 @@ -1418,8 +1426,8 @@ 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_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;视彩度 @@ -1430,7 +1438,7 @@ 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_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;观察条件的绝对亮度(一般为16 cd/m²) TP_COLORAPP_WBCAM;白平衡[RT+CAT02/16]+[输出] TP_COLORAPP_WBRT;白平衡[RT]+[输出] TP_COLORTONING_AUTOSAT;自动 @@ -1522,7 +1530,7 @@ 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_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;当前预览处噪点:中位数= - 最大= - @@ -1537,7 +1545,7 @@ 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_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;模式 @@ -1594,7 +1602,6 @@ TP_EXPOSURE_COMPRHIGHLIGHTS;高光压缩 TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;高光压缩阈值 TP_EXPOSURE_COMPRSHADOWS;阴影压缩 TP_EXPOSURE_CONTRAST;对比度 -TP_EXPOSURE_CURVEEDITOR;色调曲线 TP_EXPOSURE_CURVEEDITOR1;色调曲线 1 TP_EXPOSURE_CURVEEDITOR2;色调曲线 2 TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;请在RawPedia的Exposure > Tone Curve文章中了解如何使用双色调曲线 @@ -1619,18 +1626,20 @@ TP_FILMNEGATIVE_COLORSPACE;反转色彩空间: TP_FILMNEGATIVE_COLORSPACE_INPUT;输入色彩空间 TP_FILMNEGATIVE_COLORSPACE_TOOLTIP;选择用于负片反转的色彩空间:\n输入色彩空间: 在输入档案被应用之前进行反转,与之前版本的RT相同\n工作色彩空间: 在输入档案被应用之后进行反转,使用当前所选的工作档案 TP_FILMNEGATIVE_COLORSPACE_WORKING;工作色彩空间 -TP_FILMNEGATIVE_GREEN;参照指数(反差) +TP_FILMNEGATIVE_GREEN;参照指数 TP_FILMNEGATIVE_GREENBALANCE;品红/绿 TP_FILMNEGATIVE_GUESS_TOOLTIP;通过选取原图中的两个中性色(没有色彩)色块来自动确定红与蓝色的比例。两个色块的亮度应当有所差别。 TP_FILMNEGATIVE_LABEL;胶片负片 TP_FILMNEGATIVE_OUT_LEVEL;输出亮度 TP_FILMNEGATIVE_PICK;选择(两个)中灰点 +TP_FILMNEGATIVE_PICK_SIZE;大小: TP_FILMNEGATIVE_RED;红色比例 TP_FILMNEGATIVE_REF_LABEL;输入RGB: %1 TP_FILMNEGATIVE_REF_PICK;选择白平衡点 +TP_FILMNEGATIVE_REF_SIZE;大小: 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_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;自动选择 @@ -1641,7 +1650,7 @@ TP_FLATFIELD_BT_HORIZONTAL;水平 TP_FLATFIELD_BT_VERTHORIZ;垂直+水平 TP_FLATFIELD_BT_VERTICAL;垂直 TP_FLATFIELD_CLIPCONTROL;溢出控制 -TP_FLATFIELD_CLIPCONTROL_TOOLTIP;溢出控制能够避免由于平场的应用而导致的高光溢出。如果在应用平场之前就有溢出的高光,数值就会为0 +TP_FLATFIELD_CLIPCONTROL_TOOLTIP;溢出控制能够避免使用平场而导致的高光溢出。如果在应用平场之前就有溢出的高光,数值就会为0 TP_FLATFIELD_LABEL;平场 TP_GENERAL_11SCALE_TOOLTIP;此工具的效果仅在以1:1大小预览时才可见/准确 TP_GRADIENT_CENTER;中心 @@ -1662,7 +1671,7 @@ TP_HLREC_COLOR;色彩延伸 TP_HLREC_ENA_TOOLTIP;可能会被自动色阶功能启用 TP_HLREC_LABEL;高光还原 TP_HLREC_LUMINANCE;亮度还原 -TP_HLREC_METHOD;方法: +TP_HLREC_METHOD;方法: TP_HSVEQUALIZER_CHANNEL;通道 TP_HSVEQUALIZER_HUE;H TP_HSVEQUALIZER_LABEL;HSV均衡器 @@ -1673,8 +1682,8 @@ TP_ICM_INPUTCAMERAICC;自适应相机档案 TP_ICM_INPUTCUSTOM;自定义 TP_ICM_INPUTCUSTOM_TOOLTIP;选择你自己的DCP/ICC色彩档案 TP_ICM_INPUTDLGLABEL;选择输入ICC配置... -TP_ICM_INPUTEMBEDDED;如可能, 使用内置 -TP_ICM_INPUTEMBEDDED_TOOLTIP;使用非raw文件内嵌的色彩档案 +TP_ICM_INPUTEMBEDDED;使用内置 +TP_ICM_INPUTEMBEDDED_TOOLTIP;使用非raw文件内嵌的色彩档案,若无内嵌档案则会自动使用“相机缺省”模式 TP_ICM_INPUTNONE;无档案 TP_ICM_INPUTNONE_TOOLTIP;不使用任何色彩档案。\n仅在特殊情况下使用此选项 TP_ICM_INPUTPROFILE;输入配置 @@ -1692,8 +1701,6 @@ 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;色度 TP_LABCURVE_CHROMA_TOOLTIP;若要应用黑白色调,将色度值降低为-100 @@ -1725,7 +1732,7 @@ TP_LENSPROFILE_CORRECTION_AUTOMATCH;自动选择 TP_LENSPROFILE_CORRECTION_LCPFILE;LCP文件 TP_LENSPROFILE_CORRECTION_MANUAL;手动选择 TP_LENSPROFILE_LABEL;镜头矫正档案 -TP_LENSPROFILE_LENS_WARNING;警告:制作镜头档案时相机所用的裁切系数比本图片拍摄时\n所使用的裁剪系数更大。矫正结果可能出现错误 +TP_LENSPROFILE_LENS_WARNING;警告:如果制作镜头档案时相机的裁切系数比本图片拍摄时\n所使用的裁剪系数更大。矫正结果可能出现错误 TP_LENSPROFILE_MODE_HEADER;镜头档案 TP_LENSPROFILE_USE_CA;色差 TP_LENSPROFILE_USE_GEOMETRIC;几何畸变 @@ -1813,7 +1820,7 @@ TP_LOCALLAB_DIVGR;伽马 TP_LOCALLAB_DUPLSPOTNAME;复制 TP_LOCALLAB_EDGFRA;边缘锐度 TP_LOCALLAB_EDGSHOW;显示所有工具 -TP_LOCALLAB_ELI;椭圆 +TP_LOCALLAB_ELI;椭圆 TP_LOCALLAB_ENABLE_AFTER_MASK;使用色调映射 TP_LOCALLAB_EPSBL;细节 TP_LOCALLAB_EV_NVIS;隐藏 @@ -1833,7 +1840,7 @@ TP_LOCALLAB_EXPCOMPINV;曝光补偿 TP_LOCALLAB_EXPCURV;曲线 TP_LOCALLAB_EXPGRAD;渐变滤镜 TP_LOCALLAB_EXPOSE;动态范围 & 曝光 -TP_LOCALLAB_EXPTOOL;曝光工具 +TP_LOCALLAB_EXPTOOL;曝光工具 TP_LOCALLAB_EXP_TOOLNAME;动态范围 & 曝光 TP_LOCALLAB_FATAMOUNT;数量 TP_LOCALLAB_FATANCHOR;锚点 @@ -1843,13 +1850,16 @@ 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_GAMUTMUNSELL;仅孟塞尔矫正 +TP_LOCALLAB_GAMUTNON;无 +TP_LOCALLAB_GAMUTXYZABSO;绝对XYZ +TP_LOCALLAB_GAMUTXYZRELA;相对XYZ TP_LOCALLAB_GRADANG;渐变角度 TP_LOCALLAB_GRADANG_TOOLTIP;旋转角度(单位为°):-180 0 +180 TP_LOCALLAB_GRADFRA;渐变滤镜蒙版 @@ -1887,7 +1897,7 @@ 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_LOGIMAGE_TOOLTIP;将CIECAM的相关参数一同加入计算,参数包括:对比度(J),饱和度(s),以及对比度(Q),视明度(Q),明度(J),视彩度(M)(在高级模式下) TP_LOCALLAB_LOGLIGHTL;明度 (J) TP_LOCALLAB_LOGLIGHTL_TOOLTIP;与L*a*b*的明度相近。会考虑到感知色彩的变化 TP_LOCALLAB_LOGLIGHTQ;视明度 (Q) @@ -2090,7 +2100,7 @@ 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_IMAGENUM_TOOLTIP;某些Raw文件包含多张子图像(宾得/索尼的像素偏移,宾得的3张合并HDR,佳能的双像素,富士的EXR)。\n\n当使用除像素偏移外的任意一个去马赛克算法时,本栏用来选择哪张子图像被处理。\n\n当在像素偏移Raw文件上使用像素偏移去马赛克算法时,所有子图像都会被使用,此时本栏用来选择哪张子图像被用来处理动体 TP_RAW_LABEL;去马赛克 TP_RAW_LMMSE;LMMSE TP_RAW_LMMSEITERATIONS;LMMSE优化步长 @@ -2125,7 +2135,7 @@ 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_PIXELSHIFTSMOOTH_TOOLTIP;让存在动体的区域与没有动体之间的区域之间顺滑地过渡。\n将此值设置为0以禁用顺滑过渡\n将此值设置为1以使用AMaZE/LMMSE算法(这取决于你是否选择了“使用LMMSE”)所解出的你所选择的那一张图像,如果你选择了“使用中值”,那么就会根据通过所有图像计算出的中值解出图像 TP_RAW_RCD;RCD TP_RAW_RCDVNG4;RCD+VNG4 TP_RAW_SENSOR_BAYER_LABEL;拜耳阵列传感器 @@ -2139,7 +2149,7 @@ 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;调整: @@ -2164,7 +2174,7 @@ TP_RGBCURVES_CHANNEL;通道 TP_RGBCURVES_GREEN;G TP_RGBCURVES_LABEL;RGB曲线 TP_RGBCURVES_LUMAMODE;亮度模式 -TP_RGBCURVES_LUMAMODE_TOOLTIP;亮度模式允许改变R、G、B三个通道的亮度分配而不影响色彩 +TP_RGBCURVES_LUMAMODE_TOOLTIP;亮度模式允许改变R、G、B三个通道的亮度分配而不影响色彩 TP_RGBCURVES_RED;R TP_ROTATE_DEGREE;角度 TP_ROTATE_LABEL;旋转 @@ -2214,6 +2224,15 @@ TP_TM_FATTAL_AMOUNT;数量 TP_TM_FATTAL_ANCHOR;锚点 TP_TM_FATTAL_LABEL;动态范围压缩 TP_TM_FATTAL_THRESHOLD;细节 +TP_TONE_EQUALIZER_BAND_0;黑点 +TP_TONE_EQUALIZER_BAND_1;阴影 +TP_TONE_EQUALIZER_BAND_2;中间调 +TP_TONE_EQUALIZER_BAND_3;高光 +TP_TONE_EQUALIZER_BAND_4;白点 +TP_TONE_EQUALIZER_DETAIL;正则化 +TP_TONE_EQUALIZER_LABEL;色调均衡器 +TP_TONE_EQUALIZER_PIVOT;锚点(Ev) +TP_TONE_EQUALIZER_SHOW_COLOR_MAP;显示各色调范围 TP_VIBRANCE_AVOIDCOLORSHIFT;避免偏色 TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;肤色 TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;红/紫 @@ -2222,14 +2241,14 @@ 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_PASTELS;低饱和色调 +TP_VIBRANCE_PASTSATTOG;将高饱和色与低饱和色挂钩 TP_VIBRANCE_PROTECTSKINS;保护肤色 -TP_VIBRANCE_PSTHRESHOLD;欠饱和/饱和色阈值 +TP_VIBRANCE_PSTHRESHOLD;低饱和/高饱和阈值 TP_VIBRANCE_PSTHRESHOLD_SATTHRESH;饱和度阈值 -TP_VIBRANCE_PSTHRESHOLD_TOOLTIP;纵向底部代表欠饱和色,顶部代表饱和色\n横轴代表整个饱和度范围 -TP_VIBRANCE_PSTHRESHOLD_WEIGTHING;欠饱和/饱和色过渡权重 -TP_VIBRANCE_SATURATED;饱和色调 +TP_VIBRANCE_PSTHRESHOLD_TOOLTIP;纵向底部代表低饱和色,顶部代表高饱和色\n横轴代表整个饱和度范围 +TP_VIBRANCE_PSTHRESHOLD_WEIGTHING;低饱和/高饱和过渡权重 +TP_VIBRANCE_SATURATED;高饱和色调 TP_VIGNETTING_AMOUNT;数量 TP_VIGNETTING_CENTER;中心 TP_VIGNETTING_CENTER_X;中心 X @@ -2316,7 +2335,7 @@ TP_WAVELET_EDVAL;力度 TP_WAVELET_FINAL;最终润色 TP_WAVELET_FINCFRAME;最终局部反差 TP_WAVELET_FINEST;最精细 -TP_WAVELET_HIGHLIGHT;精细层级范围 +TP_WAVELET_HIGHLIGHT;精细层级亮度范围 TP_WAVELET_HS1;全部亮度范围 TP_WAVELET_HS2;选择性亮度范围 TP_WAVELET_HUESKIN;肤色和其它色彩 @@ -2355,7 +2374,7 @@ TP_WAVELET_NPTYPE;临近像素 TP_WAVELET_OPACITY;蓝-黄不透明度 TP_WAVELET_OPACITYW;反差平衡 斜/纵-横曲线 TP_WAVELET_OPACITYWL;局部反差 -TP_WAVELET_PASTEL;欠饱和色 +TP_WAVELET_PASTEL;低饱和色 TP_WAVELET_PROC;处理 TP_WAVELET_QUAAGRES;激进 TP_WAVELET_QUACONSER;保守 @@ -2420,7 +2439,7 @@ TP_WBALANCE_SOLUX35;Solux 3500K TP_WBALANCE_SOLUX41;Solux 4100K TP_WBALANCE_SPOTWB;白平衡采样 TP_WBALANCE_TEMPBIAS;自动白平衡色温偏向 -TP_WBALANCE_TEMPBIAS_TOOLTIP;此功能允许你将色温向冷/暖偏移,\n以调整计算出的“自动白平衡”。这个偏移被表达为已计\n算出的色温的一个百分比,故最终的调整结果为“色温+色温*偏移” +TP_WBALANCE_TEMPBIAS_TOOLTIP;此功能允许你将色温向冷/暖偏移,以调整计算出的“自动白平衡”。\n这个偏移被表达为计算出的色温的一个百分比,故最终的调整结果为“色温+色温*偏移”。\n你可以使用“自动白平衡色温偏向”来调整“色温关联系数”。对其进行任何调整都会让软件重新计算色温,色调和关联系数 TP_WBALANCE_TEMPERATURE;色温 TP_WBALANCE_TUNGSTEN;白炽灯 TP_WBALANCE_WATER1;水下 1 @@ -2439,12 +2458,12 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !!!!!!!!!!!!!!!!!!!!!!!!! !ERROR_MSG_METADATA_VALUE;Metadata: error setting %1 to %2 -!EXIFFILTER_PATH;File path !EXIFPANEL_ACTIVATE_ALL_HINT;Select all tags !EXIFPANEL_ACTIVATE_NONE_HINT;Unselect all tags !EXIFPANEL_BASIC_GROUP;Basic !EXIFPANEL_VALUE_NOT_SHOWN;Not shown !FILEBROWSER_POPUPSORTBY;Sort Files +!FILEBROWSER_SHOWRECURSIVE;Show images in sub-folders recursively. !FILECHOOSER_FILTER_EXECUTABLE;Executable files !GENERAL_OTHER;Other !HISTORY_MSG_112;--unused-- @@ -2516,7 +2535,6 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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_446;--unused-- !HISTORY_MSG_447;--unused-- !HISTORY_MSG_448;--unused-- @@ -2784,7 +2802,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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 - TG - Feather gradient +!HISTORY_MSG_833;Local - Mask 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 @@ -3002,7 +3020,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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_1082;Local - CIECAM Auto threshold !HISTORY_MSG_1083;Local - CIECAM Hue !HISTORY_MSG_1084;Local - Uses Black Ev - White Ev !HISTORY_MSG_1086;Local - Jz contrast @@ -3080,15 +3098,22 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !HISTORY_MSG_ICM_AINTENT;Abstract profile intent !HISTORY_MSG_ICM_BLUX;Primaries Blue X !HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_CAT;Matrix adaptation !HISTORY_MSG_ICM_GAMUT;Gamut control !HISTORY_MSG_ICM_GREX;Primaries Green X !HISTORY_MSG_ICM_GREY;Primaries Green Y +!HISTORY_MSG_ICM_MIDTCIE;Midtones !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_PRESER;Preserve neutral !HISTORY_MSG_ICM_REDX;Primaries Red X !HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_REFI;Refinement Colors +!HISTORY_MSG_ICM_SHIFTX;Refinement Colors - Shift x +!HISTORY_MSG_ICM_SHIFTY;Refinement Colors - Shift y +!HISTORY_MSG_ICM_SMOOTHCIE;Smooth highlights +!HISTORY_MSG_ICM_TRCEXP;Abstract Profile !HISTORY_MSG_ICM_WORKING_GAMMA;TRC - Gamma !HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method !HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method @@ -3096,7 +3121,72 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !HISTORY_MSG_ICM_WORKING_TRC_METHOD;TRC method !HISTORY_MSG_ILLUM;CAL - SC - Illuminant !HISTORY_MSG_LOCALLAB_TE_PIVOT;Local - Equalizer pivot +!HISTORY_MSG_LOCAL_CIEMASK_BLURCONT;Local - CIECAM Mask blur contrast +!HISTORY_MSG_LOCAL_CIEMASK_BLURFFT;Local - CIECAM Mask blur FFTW +!HISTORY_MSG_LOCAL_CIEMASK_BLURRAD;Local - CIECAM Mask blur radius +!HISTORY_MSG_LOCAL_CIEMASK_CHH;Local - CIECAM Mask curve h(h) +!HISTORY_MSG_LOCAL_CIEMASK_HIGH;Local - CIECAM Mask highlights +!HISTORY_MSG_LOCAL_CIEMASK_SHAD;Local - CIECAM Mask shadows +!HISTORY_MSG_LOCAL_CIEMASK_STRU;Local - CIECAM Mask structure +!HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;Local - CIECAM Mask structure as tool +!HISTORY_MSG_LOCAL_CIEMASK_WLC;Local - CIECAM Mask wavelet L(L) +!HISTORY_MSG_LOCAL_CIEMASK_WLEV;Local - CIECAM Mask wavelet levels +!HISTORY_MSG_LOCAL_CIE_ANGGRAD;Local - CIECAM Gradient angle +!HISTORY_MSG_LOCAL_CIE_BLACKS;Local - CIECAM Blacks distribution +!HISTORY_MSG_LOCAL_CIE_BLUXL;Local - CIECAM Blue X +!HISTORY_MSG_LOCAL_CIE_BLUYL;Local - CIECAM Blue Y +!HISTORY_MSG_LOCAL_CIE_BRICOMP;Local - CIECAM Brightness compression +!HISTORY_MSG_LOCAL_CIE_BRICOMPTH;Local - CIECAM Brightness compression threshold +!HISTORY_MSG_LOCAL_CIE_BWCIE;Local - CIECAM Black and white +!HISTORY_MSG_LOCAL_CIE_CAT;Local - Matrix adaptation +!HISTORY_MSG_LOCAL_CIE_DETAILJZ;Local - JzCzHz Local contrast +!HISTORY_MSG_LOCAL_CIE_ENAMASKALL;Local - CIECAM All mask tools +!HISTORY_MSG_LOCAL_CIE_EXPPRECAM;Local - CIECAM Pre-Cam +!HISTORY_MSG_LOCAL_CIE_GAM;Local - CIECAM Gamma +!HISTORY_MSG_LOCAL_CIE_GAMUTCIE;Local - CIECAM Gamut +!HISTORY_MSG_LOCAL_CIE_GREXL;Local - CIECAM Green X +!HISTORY_MSG_LOCAL_CIE_GREYL;Local - CIECAM Green Y +!HISTORY_MSG_LOCAL_CIE_ILL;Local - CIECAM TRC Illuminant +!HISTORY_MSG_LOCAL_CIE_LOGCIEQ;Local - CIECAM Log encoding Q +!HISTORY_MSG_LOCAL_CIE_MIDT;Local - CIECAM Mid Tones +!HISTORY_MSG_LOCAL_CIE_NORM;Local - CIECAM Normalize L +!HISTORY_MSG_LOCAL_CIE_PRIM;Local - CIECAM TRC primaries +!HISTORY_MSG_LOCAL_CIE_REDXL;Local - CIECAM Red X +!HISTORY_MSG_LOCAL_CIE_REDYL;Local - CIECAM Red Y +!HISTORY_MSG_LOCAL_CIE_REFI;Local - CIECAM Refinement colors +!HISTORY_MSG_LOCAL_CIE_SATCIE;Local - CIECAM Saturation control +!HISTORY_MSG_LOCAL_CIE_SHIFTXL;Local - CIECAM Shift x +!HISTORY_MSG_LOCAL_CIE_SHIFTYL;Local - CIECAM Shift y +!HISTORY_MSG_LOCAL_CIE_SIG;Local - Sigmoid +!HISTORY_MSG_LOCAL_CIE_SIGADAP;Local - CIECAM Sigmoid adaptability +!HISTORY_MSG_LOCAL_CIE_SIGMET;Local - CIECAM Sigmoid method +!HISTORY_MSG_LOCAL_CIE_SLOP;Local - CIECAM Slope +!HISTORY_MSG_LOCAL_CIE_SLOPESMO;Local - CIECAM Gray balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOB;Local - CIECAM Blue balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOG;Local - CIECAM Green balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOR;Local - CIECAM Red balance +!HISTORY_MSG_LOCAL_CIE_SMOOTH;Local - CIECAM Scale Yb scene +!HISTORY_MSG_LOCAL_CIE_SMOOTHMET;Local - CIECAM Smooth lights method +!HISTORY_MSG_LOCAL_CIE_SMOOTHYB;Local - CIECAM Scale Yb viewing +!HISTORY_MSG_LOCAL_CIE_SMOOTH_LUM;Local - CIECAM Levels - Luminosity mode +!HISTORY_MSG_LOCAL_CIE_STRGRAD;Local - CIECAM Gradient strength L +!HISTORY_MSG_LOCAL_CIE_STRLOG;Local - CIECAM Log encoding strength +!HISTORY_MSG_LOCAL_CIE_TRC;Local - CIECAM TRC +!HISTORY_MSG_LOCAL_CIE_WHITES;Local - CIECAM Whites distribution +!HISTORY_MSG_LOCAL_DEHAZE_BLACK;Local - Dehaze Black +!HISTORY_MSG_LOCAL_FEATHERCIE;Local - CIECAM Gradient feather +!HISTORY_MSG_LOCAL_FEATHERCOL;Local - Color Gradient feather +!HISTORY_MSG_LOCAL_FEATHEREXE;Local - Exp Gradient feather +!HISTORY_MSG_LOCAL_FEATHERLOG;Local - Log Gradient feather +!HISTORY_MSG_LOCAL_FEATHERMAS;Local - Mask Common gradient feather +!HISTORY_MSG_LOCAL_FEATHERSH;Local - SH Gradient feather +!HISTORY_MSG_LOCAL_FEATHERVIB;Local - Vib Gradient feather +!HISTORY_MSG_LOCAL_FEATHERWAV;Local - Wav Gradient feather !HISTORY_MSG_LOCAL_GAMUTMUNSEL;Local - SC - Avoid Color Shift +!HISTORY_MSG_LOCAL_LOG_BLACKS;Local - Log Blacks distribution +!HISTORY_MSG_LOCAL_LOG_COMPR;Local - Log Compress brightness +!HISTORY_MSG_LOCAL_LOG_SAT;Local - Log Saturation control +!HISTORY_MSG_LOCAL_LOG_WHITES;Local - Log Whites distribution !HISTORY_MSG_LOCAL_TMO_SATUR;Local Exp Fattal Saturation !HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera !HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera @@ -3122,7 +3212,6 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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 @@ -3235,15 +3324,15 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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_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_MSG_IMAGEUNPROCESSED;This command requires all selected images to be queue-processed first. !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. !PARTIALPASTE_FLATFIELDFROMMETADATA;Flat-field from Metadata !PARTIALPASTE_RETINEX;Retinex !PARTIALPASTE_TONE_EQUALIZER;Tone equalizer -!PARTIALPASTE_VIBRANCE;Vibrance +!PREFERENCES_BROWSERECURSIVEDEPTH;Browse sub-folders depth +!PREFERENCES_BROWSERECURSIVEFOLLOWLINKS;Follow symbolic links when browsing sub-folders +!PREFERENCES_BROWSERECURSIVEMAXDIRS;Maximum sub-folders !PREFERENCES_CAMERAPROFILESDIR;Camera profiles directory !PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demosaic !PREFERENCES_CIE;Ciecam @@ -3264,19 +3353,19 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !PREFERENCES_LENSFUNDBDIR_TOOLTIP;Directory containing the Lensfun database. Leave empty to use the default directories. !PREFERENCES_LENSPROFILESDIR;Lens profiles directory !PREFERENCES_LENSPROFILESDIR_TOOLTIP;Directory containing Adobe Lens Correction Profiles (LCPs) +!PREFERENCES_MAX_ZOOM_TITLE;Maximum zoom !PREFERENCES_METADATA;Metadata !PREFERENCES_METADATA_SYNC;Metadata synchronization with XMP sidecars !PREFERENCES_METADATA_SYNC_NONE;Off !PREFERENCES_METADATA_SYNC_READ;Read only !PREFERENCES_METADATA_SYNC_READWRITE;Bidirectional -!PREFERENCES_TAB_FAVORITES;Favorites +!PREFERENCES_RAW_DECODER;Raw Decoder +!PREFERENCES_RAW_DECODER_ENABLE_LIBRAW;Use LibRaw +!PREFERENCES_SPOTLOC;Define Spot method for Selective Editing +!PREFERENCES_THUMBNAIL_RANK_COLOR_MODE;Load/Save thumbnail rank and color from/to XMP sidecars !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_WBA;White Balance !PREFERENCES_WBACORR;White Balance - Automatic temperature correlation !PREFERENCES_WBACORR_TOOLTIP;These settings allow, depending on the images (type of raw file, colorimetry, etc.), an adaptation of the " Temperature correlation " algorithm in order to obtain the best overall results. There is no absolute rule, linking these parameters to the results obtained.\n\nThe settings are of 3 types: \n* those accessible to the user from the GUI.\n* those accessible only in reading from each pp3 file : Itcwb_minsize=20, Itcwb_delta=4 Itcwb_rgreen=1 Itcwb_nopurple=false (See Rawpedia)\n* those accessible to the user in 'options' (see Rawpedia)\n You can use "Awb temperature bias" and "Green refinement" to adjust the results. Each movement of these commands brings a new calculation of temperature, tint and correlation.\n\nPlease note that the 3 indicators 'Correlation factor', 'Patch chroma' and ΔE are given for information only. It is not because one of these indicators is better that the result will necessarily be better. !PREFERENCES_WBAENA;Show White Balance Auto temperature correlation settings @@ -3292,6 +3381,27 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !PREFERENCES_XMP_SIDECAR_MODE_EXT;darktable-like (FILENAME.ext.xmp for FILENAME.ext) !PREFERENCES_XMP_SIDECAR_MODE_STD;Standard (FILENAME.xmp for FILENAME.ext) !PROGRESSDLG_PROFILECHANGEDINBROWSER;Processing profile changed in browser +!QUEUE_DESTPREVIEW_TITLE;Select a thumbnail to preview its destination path here +!QUEUE_DESTPREVIEW_TOOLTIP;Destination path for the first selected image appears here +!QUEUE_LOCATION_TEMPLATE_HELP_BUTTON_TOOLTIP;Show or hide a help panel with instructions for creating location templates +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_BODY;If you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p-3/converted/%P-4/%f +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_TITLE;Common examples +!QUEUE_LOCATION_TEMPLATE_HELP_INTRO;The output template field allows you to to dynamically customize the destination folder and filename. When you include certain specifiers, which begin with %, they are replaced by the program when each file is being saved.\n\nThe sections below describe each type of specifier. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_1;Using this pathname as an example: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_2;The meanings of the formatting strings are: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_LINUX;/home/tom/photos/2010-10-31/photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_WINDOWS;D:\tom\photos\2010-10-31\photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO;The %dN, %d-N, %pN, %p-N, %PN and %P-N (N = 1..9) specifiers will be replaced by elements of the image file's directory path.\nThe format specifiers operate as follows:\n %dN = Nth directory from the end of the path\n %d-N = Nth directory from the start of the path\n %pN = all directories up to the Nth from the end of the path\n %p-N = the first N directories in the path\n %PN = the last N directories in the path\n %P-N = all directories from the Nth to the end of the path\n %f = base filename (no extension) +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO_WINDOWS;For Windows paths, %d-1 is the drive letter and colon, and %d-2 is the base directory on that drive. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_TITLE;Directories and partial paths +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_BODY;%r will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used. +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_TITLE;Rank +!QUEUE_LOCATION_TEMPLATE_HELP_RESULT_MISMATCH;ERROR: 2nd result is different: +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_BODY;%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'. +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_TITLE;Position/sequence in queue +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_BODY;Three different date/time values may be used in templates:\n %tE"%Y-%m-%d" = when export started\n %tF"%Y-%m-%d" = when file was last saved\n %tP"%Y-%m-%d" = when photo was taken\nThe quoted string defines the format of the resulting date and/or time. The format string %tF"%Y-%m-%d" is just one example. The string can use all conversion specifiers defined for the g_date_time_format function (see https://docs.gtk.org/glib/method.DateTime.format.html).\n\nExample format strings: +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_TITLE;Date and time +!QUEUE_LOCATION_TEMPLATE_HELP_TITLE;Creating an output template !SAMPLEFORMAT_1;8-bit unsigned !SAMPLEFORMAT_2;16-bit unsigned !SAMPLEFORMAT_4;24-bit LogLuv @@ -3308,12 +3418,16 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !SORT_BY_NAME;By Name !SORT_BY_RANK;By Rank !SORT_DESCENDING;Descending +!TC_LOCALLAB_PRIM_SHIFTX;Shift x +!TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP;In combination with "Refine colors", allows you to:\n 1) for low values, adjust the image purity.\n 2) for higher values, carry out moderate color toning.\nBe careful not to go outside the CIE xy diagram. +!TC_LOCALLAB_PRIM_SHIFTY;Shift y !TC_PRIM_BLUX;Bx !TC_PRIM_BLUY;By !TC_PRIM_GREX;Gx !TC_PRIM_GREY;Gy !TC_PRIM_REDX;Rx !TC_PRIM_REDY;Ry +!TC_PRIM_REFI;Refine colors (white-point) !THRESHOLDSELECTOR_B;Bottom !THRESHOLDSELECTOR_BL;Bottom-left !THRESHOLDSELECTOR_BR;Bottom-right @@ -3370,8 +3484,6 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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_TOOLTIP;Attempts to reduce artifacts in the transitions between skin colors (hue, chroma, luma) and the rest of the image. -!TP_FILMNEGATIVE_PICK_SIZE;Size: -!TP_FILMNEGATIVE_REF_SIZE;Size: !TP_FLATFIELD_FROMMETADATA;From Metadata !TP_HLREC_COLOROPP;Inpaint Opposed !TP_HLREC_HLBLUR;Blur @@ -3383,6 +3495,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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_BW;Black and White !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. @@ -3403,8 +3516,15 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;Generally, apply the white balance when saving images to create ICC profiles, and do not apply the white balance to create DCP profiles. !TP_ICM_SAVEREFERENCE_TOOLTIP;Save the linear TIFF image before the input profile is applied. The result can be used for calibration purposes and generation of a camera profile. !TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only available if the selected DCP has a tone curve. -!TP_ICM_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_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 three main uses - channel mixer, restore image color (saturation), 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_CAT;Matrix adaptation +!TP_ICM_WORKING_CAT_BRAD;Bradford +!TP_ICM_WORKING_CAT_CAT02;Cat02 +!TP_ICM_WORKING_CAT_CAT16;Cat16 +!TP_ICM_WORKING_CAT_TOOLTIP;Performs the chromatic adaptation of the XYZ conversion matrix. Default: Bradford +!TP_ICM_WORKING_CAT_VK;Von Kries +!TP_ICM_WORKING_CAT_XYZ;XYZ scale !TP_ICM_WORKING_CIEDIAG;CIE xy diagram !TP_ICM_WORKING_ILLU;Illuminant !TP_ICM_WORKING_ILLU_1500;Tungsten 1500K @@ -3416,10 +3536,12 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_ICM_WORKING_ILLU_D65;D65 !TP_ICM_WORKING_ILLU_D80;D80 !TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_E;E !TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_NON;None !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_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination primaries' combo box, 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 @@ -3428,10 +3550,13 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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_FREE;Custom LA (sliders) !TP_ICM_WORKING_PRIM_JDCMAX;JDC Max +!TP_ICM_WORKING_PRIM_JDCMAXSTDA;JDC Max stdA !TP_ICM_WORKING_PRIM_PROP;ProPhoto !TP_ICM_WORKING_PRIM_REC;Rec2020 !TP_ICM_WORKING_PRIM_SRGB;sRGB +!TP_ICM_WORKING_PRIM_TOOLTIP;Performs a gamut control. Destination primaries (Advanced) allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified.\nWhen 'Custom LA (sliders)' is selected, you can modify the values of the 3 primaries (Red, Green, and Blue) for x and y. !TP_ICM_WORKING_PRIM_WID;WideGamut !TP_ICM_WORKING_TRC_18;Prophoto g=1.8 !TP_ICM_WORKING_TRC_22;Adobe g=2.2 @@ -3455,10 +3580,11 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_LABCURVE_CURVEEDITOR_CC_RANGE2;Dull !TP_LABCURVE_CURVEEDITOR_CC_RANGE3;Pastel !TP_LABCURVE_CURVEEDITOR_CC_RANGE4;Saturated +!TP_LENSPROFILE_CORRECTION_METADATA;From file metadata !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 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_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab). Default: Munsell only.\n\nMunsell only: 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. The result is not the same as Lab. !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 @@ -3482,9 +3608,12 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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_BWEVNONE;None +!TP_LOCALLAB_BWEVSIG;Activated +!TP_LOCALLAB_BWEVSIGLOG;Sigmoid & Log-Encoding !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_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16 (experimental). 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, for example, to match CAM16 processing with the maximum monitor brightness of 400cd/m2. !TP_LOCALLAB_CAMMODE_CAM16;CAM 16 !TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz !TP_LOCALLAB_CH;CL - LC @@ -3500,6 +3629,12 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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_CIE_SMOOTHFRAME;Highlight Attenuation & Levels +!TP_LOCALLAB_CIE_SMOOTH_EV;Ev based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA;Slope based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF;Gamma based +!TP_LOCALLAB_CIE_SMOOTH_LEVELS;Levels +!TP_LOCALLAB_CIE_SMOOTH_NONE;None !TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the 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 @@ -3511,10 +3646,14 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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_COLORDEPREV_TOOLTIP;Preview ΔE button in Settings will only work if you have activated 'Sharpening', 'Soft Light and Original Retinex', 'Blur/Grain and Denoise', 'Dehaze and Retinex', or 'Contrast by Detail Levels' in the 'Add tool to current spot' menu.\nFor others tools, the Preview ΔE button is in the tool, which allows previewing ΔE with several tools enabled. Prefer using Mask and modifications. !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_COLORFRAME;Dominant color !TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPRCIE;Brightness compression +!TP_LOCALLAB_COMPRCIETH;Compression threshold !TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_COMPRLOG_TOOLTIP;This algorithm compress the data before log conversion, above the threshold slider value. To use in conjunction with Whites distribution. !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. @@ -3525,16 +3664,17 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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 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 spot. -!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combo box 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_DEHAZE_BLACK;Black !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_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. @@ -3550,8 +3690,10 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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 spot size: 128x128. !TP_LOCALLAB_DETAILFRA;Edge detection - DCT !TP_LOCALLAB_DETAILTHR;Lum/chrom detail threshold +!TP_LOCALLAB_DISAB_CIECAM;Disable Ciecam or Weak Jz surround !TP_LOCALLAB_ENABLE_MASK;Enable mask !TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENABLE_MASKALL;Enable all mask tools !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 @@ -3559,13 +3701,14 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all selective editing data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\nUse 'Scope' (Excluding) to set the exclusion intensity.\n\n'Full image' allows you to use the selective editing tools on the whole image.\nThe RT Spot delimiters are set beyond the image preview boundaries.\nThe 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.\nNote: 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.\n\n'Global' allows you to use the selective editing tools on the whole image, without using Delta E or transitions. +!TP_LOCALLAB_EXMAIN;Global !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_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Selective Editing 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 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_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. @@ -3579,17 +3722,15 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_LOCALLAB_FATLEVEL;Sigma !TP_LOCALLAB_FATSAT;Saturation control !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_FEATVALUE;Feather gradient +!TP_LOCALLAB_FEATVALUE_MASK;Feather gradient (Grad. Filters Mask) !TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +!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_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_GAMUTLABRELA;Lab -!TP_LOCALLAB_GAMUTMUNSELL;Munsell only -!TP_LOCALLAB_GAMUTNON;None -!TP_LOCALLAB_GAMUTXYZABSO;XYZ Absolute -!TP_LOCALLAB_GAMUTXYZRELA;XYZ Relative !TP_LOCALLAB_GAMW;Gamma (wavelet pyramids) !TP_LOCALLAB_GRADGEN_TOOLTIP;Adjusts luminance gradient strength. !TP_LOCALLAB_GRADSTRAB_TOOLTIP;Adjusts chroma gradient strength. @@ -3675,8 +3816,10 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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_LOGCIE;Log encoding +!TP_LOCALLAB_LOGCIEQ;Log Encoding Q (with Ciecam) +!TP_LOCALLAB_LOGCIEQ_TOOLTIP;Activating the checkbox allows you to switch between log encoding based on the 3 RGB channels, and log encoding based solely on Ciecam’s brightness (Q) channel.\nUsing the Q channel instead of the RGB channels helps avoid undesirable edge effects such as hue and saturation shifts.\nHowever, the settings are more difficult to optimise because Q is unbounded and Ciecam alters the data to take into account the surround conditions, simultaneous contrast, etc.\nYou may have to adjust the following:\n Scene conditions: Mean luminance (Yb), Whites & Blacks distribution, Black Ev, White Ev.\n Source Data Adjustments : Brightness compression, Strength.\n\nNote: when using Log Encoding (Q), be careful not to activate the Disable Ciecam option in the Scene Conditions, Surround menu. +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you to use Black Ev, White Ev, White and Black distribution, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using 'Log encoding' with Brightness compression. !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) @@ -3684,13 +3827,14 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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_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_LOGPFRA2;Log Encoding settings !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. @@ -3751,7 +3895,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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_MASKUNUSABLE;Mask disabled (Enable in 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 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 @@ -3787,6 +3931,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_LOCALLAB_MERTWE;Exclusion !TP_LOCALLAB_MERTWO;Subtract !TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MIDTCIE;Midtones !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 @@ -3816,7 +3961,12 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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_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_PRECAMGAMUT_TOOLTIP;If checked, ensures a gamut control just after primary conversion to XYZ. +!TP_LOCALLAB_PRECAMREFIMAIN_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. In combination with "Shift x" and "Shift y", allows you to carry out moderate color toning. +!TP_LOCALLAB_PRECAMREFI_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. +!TP_LOCALLAB_PRECAM_TOOLTIP;'Source Data Adjustments' modifies the Dynamic Range using Log encoding, the tones of the image and primaries (simplified Abstract Profile), and midtones, just before the Ciecam process. These values are adjustable:\nGamma: Acts mainly on light tones\nSlope: Acts mainly on dark tones. You 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.\nDestination primaries: Allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified. You can also finely adapt the primaries and the illuminant (white-point). Moving a primary away from the white point reduces saturation and vice versa. Pay attention to the gamut. +!TP_LOCALLAB_PRIMILLFRAME;Primaries & Illuminant !TP_LOCALLAB_QUAL_METHOD;Global quality !TP_LOCALLAB_QUANONEALL;Off !TP_LOCALLAB_QUANONEWAV;Non-local means only @@ -3845,6 +3995,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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_SATCIE;Saturation control !TP_LOCALLAB_SCALEGR;Scale !TP_LOCALLAB_SCALERETI;Scale !TP_LOCALLAB_SCALTM;Scale @@ -3855,7 +4006,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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_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 @@ -3885,15 +4036,39 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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_SIGBLACKSSCIE;Blacks distribution +!TP_LOCALLAB_SIGCIE;Sigmoid +!TP_LOCALLAB_SIGFRA;Sigmoid Q +!TP_LOCALLAB_SIGGAMJCIE;Gamma !TP_LOCALLAB_SIGJZFRA;Sigmoid Jz +!TP_LOCALLAB_SIGMOID16_TOOLTIP;Allows you to simulate a tone mapping appearance using both 'Ciecam' and 'Sigmoid Q'. Sigmoid Q has three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc) Adaptability weights the action of the sigmoid by action on the internal exponential function. !TP_LOCALLAB_SIGMOIDBL;Blend -!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDLOGAUTO;Auto threshold +!TP_LOCALLAB_SIGMOIDLOGEV_TOOLTIP;If the combo box selection 'Black Ev and White Ev' is 'Sigmoid and Log encoding' instead of 'Sigmoid only', the two algorithms 'Log encoding' and 'Sigmoid' are used together. +!TP_LOCALLAB_SIGMOIDNORMCIE;Normalize Luminance +!TP_LOCALLAB_SIGMOIDNORMCIEBLEND_TOOLTIP;Blend acts on the final aspect of the image, contrast and luminance. Ratio between original and output image. +!TP_LOCALLAB_SIGMOIDNORMCIE_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image take into account those of the original.\nAll the adjustments acting on J or Q are taken into account, including those which are not relative to Sigmoid Q. +!TP_LOCALLAB_SIGMOIDQJ;Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDQJCOMPRCIE_TOOLTIP;When the combo box selection 'Uses Black Ev and White Ev' is 'Sigmoid and Log encoding Q' or 'Log encoding instead of Sigmoid' checked. This algorithm compress the data above the threshold slider value. The last value stands for brightness (Q) and should be close as possible to the value 'Compression threshold' (calculate when 'Auto threshold" checked, often > 1). +!TP_LOCALLAB_SIGMOIDSENSI;Adaptability !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_SIGMOIDWHITESCIE_TOOLTIP;Allows you, in Automatic when the dynamic range of the image is high, to change the distribution of lights in whites and deep blacks.\nCan be used with Log encoding or Sigmoid with Black Ev and White Ev enabled.\n\nThe algorithm does not change the basic data, but acts on the components necessary to calculate the Dynamic range, Black Ev, White Ev and the Gray point. +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a tone mapping appearance using both the 'Jz' and 'Sigmoid' function. Three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SIGSLOPJCIE;Slope +!TP_LOCALLAB_SIGTRCCIE;Source Data Adjustments +!TP_LOCALLAB_SIGWHITESCIE;Whites distribution !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_SLOPESMOOTH;Gray balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHB;Blue balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHG;Green balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHR;Red balance (Slope) !TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SMOOTHCIE;Highlight Attenuation +!TP_LOCALLAB_SMOOTHCIE_LUM;Luminosity mode +!TP_LOCALLAB_SMOOTHCIE_SCA;Scale Yb Scene +!TP_LOCALLAB_SMOOTHCIE_TOOLTIP;Completes the processing carried out by gamma, slope and midtones by causing a slight lowering of lights. Please note this does not replace Highlight reconstruction.\n\nGamma based and Slope based (Standard and Advanced) allow you to simulate a tone mapping using:\na) Scene conditions: Black-Ev, White-Ev, Mean luminance (Yb%)\nb) Viewing conditions: Mean luminance (Yb%).\n\nScale Yb Scene is function of White-Ev. +!TP_LOCALLAB_SMOOTHCIE_YB;Scale Yb Viewing !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 @@ -3903,12 +4078,13 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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_STRENGTHCIELOG;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_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. @@ -3931,11 +4107,12 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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_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_TRCFRAME;Tone Response Curve & Midtones !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. @@ -4081,15 +4258,6 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_RETINEX_VIEW_TRAN2;Transmission - Fixed !TP_SPOT_ENTRYCHANGED;Point changed !TP_TONE_EQUALIZER_BANDS;Bands -!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_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_CURVEEDITOR_SKINTONES;HH !TP_WAVELET_BALCHROM;Equalizer Color !TP_WAVELET_BALLUM;Denoise equalizer White-Black @@ -4243,7 +4411,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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_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).\nIn the rare case of a color drift with "Observer 2°" (probably due to the conversion matrix) "Observer 10°" must be selected. !TP_WBALANCE_PATCHLABEL;Read colors:%1 Patch: Chroma:%2 Size=%3 !TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colors (max=237).\nDisplay calculated Patch Chroma.\nAWB temperature bias, lets try to reduce this value, a minimum may seem to optimize the algorithm.\n\nPatch size matching chroma optimization. !TP_WBALANCE_PATCHLEVELLABEL;Patch: ΔE=%1 - datas x 9 Min:%2 Max=%3 diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index 232c094e0..34cd3bc5d 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -122,8 +122,6 @@ EXIFPANEL_RESET;Obnovit EXIFPANEL_RESETALL;Obnovit vše EXIFPANEL_RESETALLHINT;Obnoví původní hodnoty u všech štítků. EXIFPANEL_RESETHINT;Obnoví původní hodnoty u vybraných štítků. -EXIFPANEL_SHOWALL;Zobrazit vše -EXIFPANEL_SUBDIRECTORY;Podadresář EXPORT_BYPASS;Kroky zpracování pro přeskočení EXPORT_BYPASS_ALL;Vybrat / Zrušit výběr všeho EXPORT_BYPASS_DEFRINGE;Vynechat odstranění lemu @@ -1110,7 +1108,6 @@ 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 @@ -1306,6 +1303,7 @@ 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... +PROGRESSBAR_LOADJXL;Načítání JXL... PROGRESSBAR_LOADPNG;Načítání PNG... PROGRESSBAR_LOADTIFF;Načítání TIFF... PROGRESSBAR_NOIMAGES;Složka neobsahuje obrázky @@ -1801,8 +1799,6 @@ TP_ICM_WORKING_TRC_SLOPE;Sklon TP_ICM_WORKING_TRC_TOOLTIP;Pouze pro vložené profily. TP_IMPULSEDENOISE_LABEL;Redukce impulzního šumu TP_IMPULSEDENOISE_THRESH;Práh -TP_LABCURVE_AVOIDCOLORSHIFT;Zabránit posunu barev -TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Napasovat barvy do gamutu barevného pracovního prostoru a aplikovat Munsellovu korekci. TP_LABCURVE_BRIGHTNESS;Světlost TP_LABCURVE_CHROMATICITY;Barevnost TP_LABCURVE_CHROMA_TOOLTIP;Pro černobílé tónování nastavte barevnost na -100. @@ -2434,6 +2430,7 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !EXIFPANEL_VALUE_NOT_SHOWN;Not shown !FILEBROWSER_POPUPINSPECT;Inspect !FILEBROWSER_POPUPSORTBY;Sort Files +!FILEBROWSER_SHOWRECURSIVE;Show images in sub-folders recursively. !FILECHOOSER_FILTER_EXECUTABLE;Executable files !GENERAL_DELETE_ALL;Delete all !GENERAL_EDIT;Edit @@ -2482,7 +2479,7 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !HISTORY_MSG_512;Local - SD - ΔE decay !HISTORY_MSG_513;Local - Spot - Excluding - Scope !HISTORY_MSG_514;Local - Spot structure -!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_515;Selective Editing !HISTORY_MSG_516;Local - Color and light !HISTORY_MSG_517;Local - Enable super !HISTORY_MSG_518;Local - Lightness @@ -2792,7 +2789,7 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !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 - TG - Feather gradient +!HISTORY_MSG_833;Local - Mask 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 @@ -3035,7 +3032,7 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !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_1082;Local - CIECAM Auto threshold !HISTORY_MSG_1083;Local - CIECAM Hue !HISTORY_MSG_1084;Local - Uses Black Ev - White Ev !HISTORY_MSG_1085;Local - Jz lightness @@ -3122,17 +3119,89 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !HISTORY_MSG_ICM_AINTENT;Abstract profile intent !HISTORY_MSG_ICM_BLUX;Primaries Blue X !HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_CAT;Matrix adaptation !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_MIDTCIE;Midtones !HISTORY_MSG_ICM_PRESER;Preserve neutral !HISTORY_MSG_ICM_REDX;Primaries Red X !HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_REFI;Refinement Colors +!HISTORY_MSG_ICM_SHIFTX;Refinement Colors - Shift x +!HISTORY_MSG_ICM_SHIFTY;Refinement Colors - Shift y +!HISTORY_MSG_ICM_SMOOTHCIE;Smooth highlights +!HISTORY_MSG_ICM_TRCEXP;Abstract Profile !HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method !HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method !HISTORY_MSG_LOCALLAB_TE_PIVOT;Local - Equalizer pivot +!HISTORY_MSG_LOCAL_CIEMASK_BLURCONT;Local - CIECAM Mask blur contrast +!HISTORY_MSG_LOCAL_CIEMASK_BLURFFT;Local - CIECAM Mask blur FFTW +!HISTORY_MSG_LOCAL_CIEMASK_BLURRAD;Local - CIECAM Mask blur radius +!HISTORY_MSG_LOCAL_CIEMASK_CHH;Local - CIECAM Mask curve h(h) +!HISTORY_MSG_LOCAL_CIEMASK_HIGH;Local - CIECAM Mask highlights +!HISTORY_MSG_LOCAL_CIEMASK_SHAD;Local - CIECAM Mask shadows +!HISTORY_MSG_LOCAL_CIEMASK_STRU;Local - CIECAM Mask structure +!HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;Local - CIECAM Mask structure as tool +!HISTORY_MSG_LOCAL_CIEMASK_WLC;Local - CIECAM Mask wavelet L(L) +!HISTORY_MSG_LOCAL_CIEMASK_WLEV;Local - CIECAM Mask wavelet levels +!HISTORY_MSG_LOCAL_CIE_ANGGRAD;Local - CIECAM Gradient angle +!HISTORY_MSG_LOCAL_CIE_BLACKS;Local - CIECAM Blacks distribution +!HISTORY_MSG_LOCAL_CIE_BLUXL;Local - CIECAM Blue X +!HISTORY_MSG_LOCAL_CIE_BLUYL;Local - CIECAM Blue Y +!HISTORY_MSG_LOCAL_CIE_BRICOMP;Local - CIECAM Brightness compression +!HISTORY_MSG_LOCAL_CIE_BRICOMPTH;Local - CIECAM Brightness compression threshold +!HISTORY_MSG_LOCAL_CIE_BWCIE;Local - CIECAM Black and white +!HISTORY_MSG_LOCAL_CIE_CAT;Local - Matrix adaptation +!HISTORY_MSG_LOCAL_CIE_DETAILJZ;Local - JzCzHz Local contrast +!HISTORY_MSG_LOCAL_CIE_ENAMASKALL;Local - CIECAM All mask tools +!HISTORY_MSG_LOCAL_CIE_EXPPRECAM;Local - CIECAM Pre-Cam +!HISTORY_MSG_LOCAL_CIE_GAM;Local - CIECAM Gamma +!HISTORY_MSG_LOCAL_CIE_GAMUTCIE;Local - CIECAM Gamut +!HISTORY_MSG_LOCAL_CIE_GREXL;Local - CIECAM Green X +!HISTORY_MSG_LOCAL_CIE_GREYL;Local - CIECAM Green Y +!HISTORY_MSG_LOCAL_CIE_ILL;Local - CIECAM TRC Illuminant +!HISTORY_MSG_LOCAL_CIE_LOGCIEQ;Local - CIECAM Log encoding Q +!HISTORY_MSG_LOCAL_CIE_MIDT;Local - CIECAM Mid Tones +!HISTORY_MSG_LOCAL_CIE_NORM;Local - CIECAM Normalize L +!HISTORY_MSG_LOCAL_CIE_PRIM;Local - CIECAM TRC primaries +!HISTORY_MSG_LOCAL_CIE_REDXL;Local - CIECAM Red X +!HISTORY_MSG_LOCAL_CIE_REDYL;Local - CIECAM Red Y +!HISTORY_MSG_LOCAL_CIE_REFI;Local - CIECAM Refinement colors +!HISTORY_MSG_LOCAL_CIE_SATCIE;Local - CIECAM Saturation control +!HISTORY_MSG_LOCAL_CIE_SHIFTXL;Local - CIECAM Shift x +!HISTORY_MSG_LOCAL_CIE_SHIFTYL;Local - CIECAM Shift y +!HISTORY_MSG_LOCAL_CIE_SIG;Local - Sigmoid +!HISTORY_MSG_LOCAL_CIE_SIGADAP;Local - CIECAM Sigmoid adaptability +!HISTORY_MSG_LOCAL_CIE_SIGMET;Local - CIECAM Sigmoid method +!HISTORY_MSG_LOCAL_CIE_SLOP;Local - CIECAM Slope +!HISTORY_MSG_LOCAL_CIE_SLOPESMO;Local - CIECAM Gray balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOB;Local - CIECAM Blue balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOG;Local - CIECAM Green balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOR;Local - CIECAM Red balance +!HISTORY_MSG_LOCAL_CIE_SMOOTH;Local - CIECAM Scale Yb scene +!HISTORY_MSG_LOCAL_CIE_SMOOTHMET;Local - CIECAM Smooth lights method +!HISTORY_MSG_LOCAL_CIE_SMOOTHYB;Local - CIECAM Scale Yb viewing +!HISTORY_MSG_LOCAL_CIE_SMOOTH_LUM;Local - CIECAM Levels - Luminosity mode +!HISTORY_MSG_LOCAL_CIE_STRGRAD;Local - CIECAM Gradient strength L +!HISTORY_MSG_LOCAL_CIE_STRLOG;Local - CIECAM Log encoding strength +!HISTORY_MSG_LOCAL_CIE_TRC;Local - CIECAM TRC +!HISTORY_MSG_LOCAL_CIE_WHITES;Local - CIECAM Whites distribution +!HISTORY_MSG_LOCAL_DEHAZE_BLACK;Local - Dehaze Black +!HISTORY_MSG_LOCAL_FEATHERCIE;Local - CIECAM Gradient feather +!HISTORY_MSG_LOCAL_FEATHERCOL;Local - Color Gradient feather +!HISTORY_MSG_LOCAL_FEATHEREXE;Local - Exp Gradient feather +!HISTORY_MSG_LOCAL_FEATHERLOG;Local - Log Gradient feather +!HISTORY_MSG_LOCAL_FEATHERMAS;Local - Mask Common gradient feather +!HISTORY_MSG_LOCAL_FEATHERSH;Local - SH Gradient feather +!HISTORY_MSG_LOCAL_FEATHERVIB;Local - Vib Gradient feather +!HISTORY_MSG_LOCAL_FEATHERWAV;Local - Wav Gradient feather !HISTORY_MSG_LOCAL_GAMUTMUNSEL;Local - SC - Avoid Color Shift +!HISTORY_MSG_LOCAL_LOG_BLACKS;Local - Log Blacks distribution +!HISTORY_MSG_LOCAL_LOG_COMPR;Local - Log Compress brightness +!HISTORY_MSG_LOCAL_LOG_SAT;Local - Log Saturation control +!HISTORY_MSG_LOCAL_LOG_WHITES;Local - Log Whites distribution !HISTORY_MSG_LOCAL_TMO_SATUR;Local Exp Fattal Saturation !HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera !HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera @@ -3191,17 +3260,20 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !ICCPROFCREATOR_ILL_63;D63 : DCI-P3 Theater !ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 !INSPECTOR_WINDOW_TITLE;Inspector -!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB;Selective Editing !MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o !PARTIALPASTE_FLATFIELDFROMMETADATA;Flat-field from Metadata -!PARTIALPASTE_LOCALLAB;Local Adjustments -!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings +!PARTIALPASTE_LOCALLAB;Selective Editing +!PARTIALPASTE_LOCALLABGROUP;Selective Editing Settings !PARTIALPASTE_SPOT;Spot removal !PARTIALPASTE_TONE_EQUALIZER;Tone equalizer +!PREFERENCES_BROWSERECURSIVEDEPTH;Browse sub-folders depth +!PREFERENCES_BROWSERECURSIVEFOLLOWLINKS;Follow symbolic links when browsing sub-folders +!PREFERENCES_BROWSERECURSIVEMAXDIRS;Maximum sub-folders !PREFERENCES_CAMERAPROFILESDIR;Camera profiles directory !PREFERENCES_CIE;Ciecam !PREFERENCES_CIEARTIF;Avoid artifacts -!PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments +!PREFERENCES_COMPLEXITYLOC;Default complexity for Selective Editing !PREFERENCES_COMPLEXITY_EXP;Advanced !PREFERENCES_COMPLEXITY_NORM;Standard !PREFERENCES_COMPLEXITY_SIMP;Basic @@ -3221,13 +3293,18 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !PREFERENCES_LENSFUNDBDIR_TOOLTIP;Directory containing the Lensfun database. Leave empty to use the default directories. !PREFERENCES_LENSPROFILESDIR;Lens profiles directory !PREFERENCES_LENSPROFILESDIR_TOOLTIP;Directory containing Adobe Lens Correction Profiles (LCPs) +!PREFERENCES_MAX_ZOOM_TITLE;Maximum zoom !PREFERENCES_METADATA;Metadata !PREFERENCES_METADATA_SYNC;Metadata synchronization with XMP sidecars !PREFERENCES_METADATA_SYNC_NONE;Off !PREFERENCES_METADATA_SYNC_READ;Read only !PREFERENCES_METADATA_SYNC_READWRITE;Bidirectional -!PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips +!PREFERENCES_RAW_DECODER;Raw Decoder +!PREFERENCES_RAW_DECODER_ENABLE_LIBRAW;Use LibRaw +!PREFERENCES_SHOWTOOLTIP;Show Selective Editing advice tooltips +!PREFERENCES_SPOTLOC;Define Spot method for Selective Editing !PREFERENCES_TAB_FAVORITES;Favorites +!PREFERENCES_THUMBNAIL_RANK_COLOR_MODE;Load/Save thumbnail rank and color from/to XMP sidecars !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. @@ -3250,6 +3327,27 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !PREFERENCES_XMP_SIDECAR_MODE_EXT;darktable-like (FILENAME.ext.xmp for FILENAME.ext) !PREFERENCES_XMP_SIDECAR_MODE_STD;Standard (FILENAME.xmp for FILENAME.ext) !PREFERENCES_ZOOMONSCROLL;Zoom images by scrolling +!QUEUE_DESTPREVIEW_TITLE;Select a thumbnail to preview its destination path here +!QUEUE_DESTPREVIEW_TOOLTIP;Destination path for the first selected image appears here +!QUEUE_LOCATION_TEMPLATE_HELP_BUTTON_TOOLTIP;Show or hide a help panel with instructions for creating location templates +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_BODY;If you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p-3/converted/%P-4/%f +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_TITLE;Common examples +!QUEUE_LOCATION_TEMPLATE_HELP_INTRO;The output template field allows you to to dynamically customize the destination folder and filename. When you include certain specifiers, which begin with %, they are replaced by the program when each file is being saved.\n\nThe sections below describe each type of specifier. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_1;Using this pathname as an example: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_2;The meanings of the formatting strings are: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_LINUX;/home/tom/photos/2010-10-31/photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_WINDOWS;D:\tom\photos\2010-10-31\photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO;The %dN, %d-N, %pN, %p-N, %PN and %P-N (N = 1..9) specifiers will be replaced by elements of the image file's directory path.\nThe format specifiers operate as follows:\n %dN = Nth directory from the end of the path\n %d-N = Nth directory from the start of the path\n %pN = all directories up to the Nth from the end of the path\n %p-N = the first N directories in the path\n %PN = the last N directories in the path\n %P-N = all directories from the Nth to the end of the path\n %f = base filename (no extension) +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO_WINDOWS;For Windows paths, %d-1 is the drive letter and colon, and %d-2 is the base directory on that drive. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_TITLE;Directories and partial paths +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_BODY;%r will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used. +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_TITLE;Rank +!QUEUE_LOCATION_TEMPLATE_HELP_RESULT_MISMATCH;ERROR: 2nd result is different: +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_BODY;%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'. +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_TITLE;Position/sequence in queue +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_BODY;Three different date/time values may be used in templates:\n %tE"%Y-%m-%d" = when export started\n %tF"%Y-%m-%d" = when file was last saved\n %tP"%Y-%m-%d" = when photo was taken\nThe quoted string defines the format of the resulting date and/or time. The format string %tF"%Y-%m-%d" is just one example. The string can use all conversion specifiers defined for the g_date_time_format function (see https://docs.gtk.org/glib/method.DateTime.format.html).\n\nExample format strings: +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_TITLE;Date and time +!QUEUE_LOCATION_TEMPLATE_HELP_TITLE;Creating an output template !SAVEDLG_BIGTIFF;BigTIFF (no metadata support) !SORT_ASCENDING;Ascending !SORT_BY_DATE;By Date @@ -3258,12 +3356,16 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !SORT_BY_NAME;By Name !SORT_BY_RANK;By Rank !SORT_DESCENDING;Descending +!TC_LOCALLAB_PRIM_SHIFTX;Shift x +!TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP;In combination with "Refine colors", allows you to:\n 1) for low values, adjust the image purity.\n 2) for higher values, carry out moderate color toning.\nBe careful not to go outside the CIE xy diagram. +!TC_LOCALLAB_PRIM_SHIFTY;Shift y !TC_PRIM_BLUX;Bx !TC_PRIM_BLUY;By !TC_PRIM_GREX;Gx !TC_PRIM_GREY;Gy !TC_PRIM_REDX;Rx !TC_PRIM_REDY;Ry +!TC_PRIM_REFI;Refine colors (white-point) !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 @@ -3307,6 +3409,7 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !TP_HLREC_COLOROPP;Inpaint Opposed !TP_HLREC_HLBLUR;Blur !TP_HLREC_HLTH;Gain threshold +!TP_ICM_BW;Black and White !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)'. @@ -3319,8 +3422,15 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !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_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 three main uses - channel mixer, restore image color (saturation), 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_CAT;Matrix adaptation +!TP_ICM_WORKING_CAT_BRAD;Bradford +!TP_ICM_WORKING_CAT_CAT02;Cat02 +!TP_ICM_WORKING_CAT_CAT16;Cat16 +!TP_ICM_WORKING_CAT_TOOLTIP;Performs the chromatic adaptation of the XYZ conversion matrix. Default: Bradford +!TP_ICM_WORKING_CAT_VK;Von Kries +!TP_ICM_WORKING_CAT_XYZ;XYZ scale !TP_ICM_WORKING_CIEDIAG;CIE xy diagram !TP_ICM_WORKING_ILLU;Illuminant !TP_ICM_WORKING_ILLU_1500;Tungsten 1500K @@ -3332,11 +3442,13 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !TP_ICM_WORKING_ILLU_D65;D65 !TP_ICM_WORKING_ILLU_D80;D80 !TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_E;E !TP_ICM_WORKING_ILLU_NONE;Default !TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_NON;None !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_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination primaries' combo box, 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 @@ -3345,17 +3457,21 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !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_FREE;Custom LA (sliders) !TP_ICM_WORKING_PRIM_JDCMAX;JDC Max +!TP_ICM_WORKING_PRIM_JDCMAXSTDA;JDC Max stdA !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_TOOLTIP;Performs a gamut control. Destination primaries (Advanced) allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified.\nWhen 'Custom LA (sliders)' is selected, you can modify the values of the 3 primaries (Red, Green, and Blue) for x and y. !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_CORRECTION_METADATA;From file metadata !TP_LOCALLAB_ACTIV;Luminance only !TP_LOCALLAB_ACTIVSPOT;Enable Spot !TP_LOCALLAB_ADJ;Equalizer Color @@ -3363,9 +3479,9 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !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_AUTOGRAYCIE;Automatic !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_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab). Default: Munsell only.\n\nMunsell only: 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. The result is not the same as Lab. !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 @@ -3408,9 +3524,12 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !TP_LOCALLAB_BUTTON_DUPL;Duplicate !TP_LOCALLAB_BUTTON_REN;Rename !TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWEVNONE;None +!TP_LOCALLAB_BWEVSIG;Activated +!TP_LOCALLAB_BWEVSIGLOG;Sigmoid & Log-Encoding !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_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16 (experimental). 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, for example, to match CAM16 processing with the maximum monitor brightness of 400cd/m2. !TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments !TP_LOCALLAB_CAMMODE;CAM model !TP_LOCALLAB_CAMMODE_CAM16;CAM 16 @@ -3450,6 +3569,12 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !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_SMOOTHFRAME;Highlight Attenuation & Levels +!TP_LOCALLAB_CIE_SMOOTH_EV;Ev based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA;Slope based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF;Gamma based +!TP_LOCALLAB_CIE_SMOOTH_LEVELS;Levels +!TP_LOCALLAB_CIE_SMOOTH_NONE;None !TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) !TP_LOCALLAB_CIRCRADIUS;Spot size !TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the 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. @@ -3465,8 +3590,9 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !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_COLORDEPREV_TOOLTIP;Preview ΔE button in Settings will only work if you have activated 'Sharpening', 'Soft Light and Original Retinex', 'Blur/Grain and Denoise', 'Dehaze and Retinex', or 'Contrast by Detail Levels' in the 'Add tool to current spot' menu.\nFor others tools, the Preview ΔE button is in the tool, which allows previewing ΔE with several tools enabled. Prefer using Mask and modifications. !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_COLORFRAME;Dominant color !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 @@ -3474,7 +3600,10 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !TP_LOCALLAB_COL_NAME;Name !TP_LOCALLAB_COL_VIS;Status !TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPRCIE;Brightness compression +!TP_LOCALLAB_COMPRCIETH;Compression threshold !TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_COMPRLOG_TOOLTIP;This algorithm compress the data before log conversion, above the threshold slider value. To use in conjunction with Whites distribution. !TP_LOCALLAB_CONTCOL;Contrast threshold !TP_LOCALLAB_CONTFRA;Contrast by level !TP_LOCALLAB_CONTRAST;Contrast @@ -3489,7 +3618,7 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !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 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 spot. -!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combo box 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. @@ -3498,13 +3627,14 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !TP_LOCALLAB_DARKRETI;Darkness !TP_LOCALLAB_DEHAFRA;Dehaze !TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZE_BLACK;Black !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_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. @@ -3524,6 +3654,7 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !TP_LOCALLAB_DETAILFRA;Edge detection - DCT !TP_LOCALLAB_DETAILSH;Details !TP_LOCALLAB_DETAILTHR;Lum/chrom detail threshold +!TP_LOCALLAB_DISAB_CIECAM;Disable Ciecam or Weak Jz surround !TP_LOCALLAB_DIVGR;Gamma !TP_LOCALLAB_DUPLSPOTNAME;Copy !TP_LOCALLAB_EDGFRA;Edge sharpness @@ -3532,6 +3663,7 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping !TP_LOCALLAB_ENABLE_MASK;Enable mask !TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENABLE_MASKALL;Enable all mask tools !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 @@ -3547,9 +3679,10 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !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_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all selective editing data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\nUse 'Scope' (Excluding) to set the exclusion intensity.\n\n'Full image' allows you to use the selective editing tools on the whole image.\nThe RT Spot delimiters are set beyond the image preview boundaries.\nThe 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.\nNote: 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.\n\n'Global' allows you to use the selective editing tools on the whole image, without using Delta E or transitions. !TP_LOCALLAB_EXECLU;Excluding spot !TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXMAIN;Global !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 @@ -3558,11 +3691,11 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !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_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Selective Editing 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 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_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. @@ -3584,7 +3717,8 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !TP_LOCALLAB_FATSAT;Saturation control !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_FEATVALUE;Feather gradient +!TP_LOCALLAB_FEATVALUE_MASK;Feather gradient (Grad. Filters Mask) !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 @@ -3680,7 +3814,7 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !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_LABEL;Selective Editing !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 @@ -3725,8 +3859,10 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !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_LOGCIE;Log encoding +!TP_LOCALLAB_LOGCIEQ;Log Encoding Q (with Ciecam) +!TP_LOCALLAB_LOGCIEQ_TOOLTIP;Activating the checkbox allows you to switch between log encoding based on the 3 RGB channels, and log encoding based solely on Ciecam’s brightness (Q) channel.\nUsing the Q channel instead of the RGB channels helps avoid undesirable edge effects such as hue and saturation shifts.\nHowever, the settings are more difficult to optimise because Q is unbounded and Ciecam alters the data to take into account the surround conditions, simultaneous contrast, etc.\nYou may have to adjust the following:\n Scene conditions: Mean luminance (Yb), Whites & Blacks distribution, Black Ev, White Ev.\n Source Data Adjustments : Brightness compression, Strength.\n\nNote: when using Log Encoding (Q), be careful not to activate the Disable Ciecam option in the Scene Conditions, Surround menu. +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you to use Black Ev, White Ev, White and Black distribution, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using 'Log encoding' with Brightness compression. !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) @@ -3734,7 +3870,7 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !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_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 @@ -3747,6 +3883,7 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !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_LOGPFRA2;Log Encoding settings !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. @@ -3816,7 +3953,7 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !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_MASKUNUSABLE;Mask disabled (Enable in 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 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 @@ -3852,6 +3989,7 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !TP_LOCALLAB_MERTWE;Exclusion !TP_LOCALLAB_MERTWO;Subtract !TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MIDTCIE;Midtones !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 @@ -3899,10 +4037,15 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !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_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_PRECAMGAMUT_TOOLTIP;If checked, ensures a gamut control just after primary conversion to XYZ. +!TP_LOCALLAB_PRECAMREFIMAIN_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. In combination with "Shift x" and "Shift y", allows you to carry out moderate color toning. +!TP_LOCALLAB_PRECAMREFI_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. +!TP_LOCALLAB_PRECAM_TOOLTIP;'Source Data Adjustments' modifies the Dynamic Range using Log encoding, the tones of the image and primaries (simplified Abstract Profile), and midtones, just before the Ciecam process. These values are adjustable:\nGamma: Acts mainly on light tones\nSlope: Acts mainly on dark tones. You 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.\nDestination primaries: Allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified. You can also finely adapt the primaries and the illuminant (white-point). Moving a primary away from the white point reduces saturation and vice versa. Pay attention to the gamut. !TP_LOCALLAB_PREVHIDE;Hide additional settings !TP_LOCALLAB_PREVIEW;Preview ΔE !TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PRIMILLFRAME;Primaries & Illuminant !TP_LOCALLAB_PROXI;ΔE decay !TP_LOCALLAB_QUAAGRES;Aggressive !TP_LOCALLAB_QUACONSER;Conservative @@ -3947,10 +4090,11 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !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_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_SATCIE;Saturation control !TP_LOCALLAB_SATUR;Saturation !TP_LOCALLAB_SATURV;Saturation (s) !TP_LOCALLAB_SCALEGR;Scale @@ -3971,7 +4115,7 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !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_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;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. @@ -4017,17 +4161,41 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !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_SIGBLACKSSCIE;Blacks distribution +!TP_LOCALLAB_SIGCIE;Sigmoid +!TP_LOCALLAB_SIGFRA;Sigmoid Q +!TP_LOCALLAB_SIGGAMJCIE;Gamma !TP_LOCALLAB_SIGJZFRA;Sigmoid Jz !TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOID16_TOOLTIP;Allows you to simulate a tone mapping appearance using both 'Ciecam' and 'Sigmoid Q'. Sigmoid Q has three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc) Adaptability weights the action of the sigmoid by action on the internal exponential function. !TP_LOCALLAB_SIGMOIDBL;Blend !TP_LOCALLAB_SIGMOIDLAMBDA;Contrast -!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDLOGAUTO;Auto threshold +!TP_LOCALLAB_SIGMOIDLOGEV_TOOLTIP;If the combo box selection 'Black Ev and White Ev' is 'Sigmoid and Log encoding' instead of 'Sigmoid only', the two algorithms 'Log encoding' and 'Sigmoid' are used together. +!TP_LOCALLAB_SIGMOIDNORMCIE;Normalize Luminance +!TP_LOCALLAB_SIGMOIDNORMCIEBLEND_TOOLTIP;Blend acts on the final aspect of the image, contrast and luminance. Ratio between original and output image. +!TP_LOCALLAB_SIGMOIDNORMCIE_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image take into account those of the original.\nAll the adjustments acting on J or Q are taken into account, including those which are not relative to Sigmoid Q. +!TP_LOCALLAB_SIGMOIDQJ;Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDQJCOMPRCIE_TOOLTIP;When the combo box selection 'Uses Black Ev and White Ev' is 'Sigmoid and Log encoding Q' or 'Log encoding instead of Sigmoid' checked. This algorithm compress the data above the threshold slider value. The last value stands for brightness (Q) and should be close as possible to the value 'Compression threshold' (calculate when 'Auto threshold" checked, often > 1). +!TP_LOCALLAB_SIGMOIDSENSI;Adaptability !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_SIGMOIDWHITESCIE_TOOLTIP;Allows you, in Automatic when the dynamic range of the image is high, to change the distribution of lights in whites and deep blacks.\nCan be used with Log encoding or Sigmoid with Black Ev and White Ev enabled.\n\nThe algorithm does not change the basic data, but acts on the components necessary to calculate the Dynamic range, Black Ev, White Ev and the Gray point. +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a tone mapping appearance using both the 'Jz' and 'Sigmoid' function. Three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SIGSLOPJCIE;Slope +!TP_LOCALLAB_SIGTRCCIE;Source Data Adjustments +!TP_LOCALLAB_SIGWHITESCIE;Whites distribution !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_SLOPESMOOTH;Gray balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHB;Blue balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHG;Green balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHR;Red balance (Slope) !TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SMOOTHCIE;Highlight Attenuation +!TP_LOCALLAB_SMOOTHCIE_LUM;Luminosity mode +!TP_LOCALLAB_SMOOTHCIE_SCA;Scale Yb Scene +!TP_LOCALLAB_SMOOTHCIE_TOOLTIP;Completes the processing carried out by gamma, slope and midtones by causing a slight lowering of lights. Please note this does not replace Highlight reconstruction.\n\nGamma based and Slope based (Standard and Advanced) allow you to simulate a tone mapping using:\na) Scene conditions: Black-Ev, White-Ev, Mean luminance (Yb%)\nb) Viewing conditions: Mean luminance (Yb%).\n\nScale Yb Scene is function of White-Ev. +!TP_LOCALLAB_SMOOTHCIE_YB;Scale Yb Viewing !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. @@ -4049,13 +4217,14 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !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_STRENGTHCIELOG;Strength !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_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. @@ -4087,11 +4256,12 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !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_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_TRCFRAME;Tone Response Curve & Midtones !TP_LOCALLAB_USEMASK;Laplacian !TP_LOCALLAB_VART;Variance (contrast) !TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool @@ -4282,7 +4452,7 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !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_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).\nIn the rare case of a color drift with "Observer 2°" (probably due to the conversion matrix) "Observer 10°" must be selected. !TP_WBALANCE_PATCHLABEL;Read colors:%1 Patch: Chroma:%2 Size=%3 !TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colors (max=237).\nDisplay calculated Patch Chroma.\nAWB temperature bias, lets try to reduce this value, a minimum may seem to optimize the algorithm.\n\nPatch size matching chroma optimization. !TP_WBALANCE_PATCHLEVELLABEL;Patch: ΔE=%1 - datas x 9 Min:%2 Max=%3 diff --git a/rtdata/languages/Dansk b/rtdata/languages/Dansk index ed2e32616..1285895a4 100644 --- a/rtdata/languages/Dansk +++ b/rtdata/languages/Dansk @@ -15,11 +15,11 @@ CURVEEDITOR_AXIS_OUT;O: CURVEEDITOR_AXIS_RIGHT_TAN;RT: CURVEEDITOR_CATMULLROM;Fleksibel CURVEEDITOR_CURVE;Kurve +CURVEEDITOR_CURVES;Kurver 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... @@ -75,8 +75,6 @@ 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 @@ -761,7 +759,7 @@ 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_MSG_TRANS_METHOD;Geometri - Metode HISTORY_NEWSNAPSHOT;Tilføj HISTORY_NEWSNAPSHOT_TOOLTIP;Genvej: Alt-s HISTORY_SNAPSHOT;Snapshot @@ -1028,7 +1026,6 @@ 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 @@ -1224,6 +1221,7 @@ PROGRESSBAR_LINEDENOISE;Linje støjfilter... PROGRESSBAR_LOADING;Indlæser billede... PROGRESSBAR_LOADINGTHUMBS;Indlæser thumbnails... PROGRESSBAR_LOADJPEG; Indlæser JPEG fil... +PROGRESSBAR_LOADJXL; Indlæser JXL fil... PROGRESSBAR_LOADPNG; Indlæser PNG fil... PROGRESSBAR_LOADTIFF;Indlæser TIFF fil... PROGRESSBAR_NOIMAGES;Ingen billeder fundet @@ -1708,8 +1706,6 @@ 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. @@ -2278,7 +2274,6 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -!CURVEEDITOR_CURVES;Curves !ERROR_MSG_METADATA_VALUE;Metadata: error setting %1 to %2 !EXIFFILTER_PATH;File path !EXIFPANEL_ACTIVATE_ALL_HINT;Select all tags @@ -2287,6 +2282,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !EXIFPANEL_VALUE_NOT_SHOWN;Not shown !FILEBROWSER_POPUPINSPECT;Inspect !FILEBROWSER_POPUPSORTBY;Sort Files +!FILEBROWSER_SHOWRECURSIVE;Show images in sub-folders recursively. !FILECHOOSER_FILTER_EXECUTABLE;Executable files !GENERAL_DELETE_ALL;Delete all !GENERAL_EDIT;Edit @@ -2335,7 +2331,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !HISTORY_MSG_512;Local - SD - ΔE decay !HISTORY_MSG_513;Local - Spot - Excluding - Scope !HISTORY_MSG_514;Local - Spot structure -!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_515;Selective Editing !HISTORY_MSG_516;Local - Color and light !HISTORY_MSG_517;Local - Enable super !HISTORY_MSG_518;Local - Lightness @@ -2645,7 +2641,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !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 - TG - Feather gradient +!HISTORY_MSG_833;Local - Mask 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 @@ -2888,7 +2884,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !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_1082;Local - CIECAM Auto threshold !HISTORY_MSG_1083;Local - CIECAM Hue !HISTORY_MSG_1084;Local - Uses Black Ev - White Ev !HISTORY_MSG_1085;Local - Jz lightness @@ -2980,18 +2976,90 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !HISTORY_MSG_ICM_AINTENT;Abstract profile intent !HISTORY_MSG_ICM_BLUX;Primaries Blue X !HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_CAT;Matrix adaptation !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_MIDTCIE;Midtones !HISTORY_MSG_ICM_PRESER;Preserve neutral !HISTORY_MSG_ICM_REDX;Primaries Red X !HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_REFI;Refinement Colors +!HISTORY_MSG_ICM_SHIFTX;Refinement Colors - Shift x +!HISTORY_MSG_ICM_SHIFTY;Refinement Colors - Shift y +!HISTORY_MSG_ICM_SMOOTHCIE;Smooth highlights +!HISTORY_MSG_ICM_TRCEXP;Abstract Profile !HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method !HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method !HISTORY_MSG_ILLUM;CAL - SC - Illuminant !HISTORY_MSG_LOCALLAB_TE_PIVOT;Local - Equalizer pivot +!HISTORY_MSG_LOCAL_CIEMASK_BLURCONT;Local - CIECAM Mask blur contrast +!HISTORY_MSG_LOCAL_CIEMASK_BLURFFT;Local - CIECAM Mask blur FFTW +!HISTORY_MSG_LOCAL_CIEMASK_BLURRAD;Local - CIECAM Mask blur radius +!HISTORY_MSG_LOCAL_CIEMASK_CHH;Local - CIECAM Mask curve h(h) +!HISTORY_MSG_LOCAL_CIEMASK_HIGH;Local - CIECAM Mask highlights +!HISTORY_MSG_LOCAL_CIEMASK_SHAD;Local - CIECAM Mask shadows +!HISTORY_MSG_LOCAL_CIEMASK_STRU;Local - CIECAM Mask structure +!HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;Local - CIECAM Mask structure as tool +!HISTORY_MSG_LOCAL_CIEMASK_WLC;Local - CIECAM Mask wavelet L(L) +!HISTORY_MSG_LOCAL_CIEMASK_WLEV;Local - CIECAM Mask wavelet levels +!HISTORY_MSG_LOCAL_CIE_ANGGRAD;Local - CIECAM Gradient angle +!HISTORY_MSG_LOCAL_CIE_BLACKS;Local - CIECAM Blacks distribution +!HISTORY_MSG_LOCAL_CIE_BLUXL;Local - CIECAM Blue X +!HISTORY_MSG_LOCAL_CIE_BLUYL;Local - CIECAM Blue Y +!HISTORY_MSG_LOCAL_CIE_BRICOMP;Local - CIECAM Brightness compression +!HISTORY_MSG_LOCAL_CIE_BRICOMPTH;Local - CIECAM Brightness compression threshold +!HISTORY_MSG_LOCAL_CIE_BWCIE;Local - CIECAM Black and white +!HISTORY_MSG_LOCAL_CIE_CAT;Local - Matrix adaptation +!HISTORY_MSG_LOCAL_CIE_DETAILJZ;Local - JzCzHz Local contrast +!HISTORY_MSG_LOCAL_CIE_ENAMASKALL;Local - CIECAM All mask tools +!HISTORY_MSG_LOCAL_CIE_EXPPRECAM;Local - CIECAM Pre-Cam +!HISTORY_MSG_LOCAL_CIE_GAM;Local - CIECAM Gamma +!HISTORY_MSG_LOCAL_CIE_GAMUTCIE;Local - CIECAM Gamut +!HISTORY_MSG_LOCAL_CIE_GREXL;Local - CIECAM Green X +!HISTORY_MSG_LOCAL_CIE_GREYL;Local - CIECAM Green Y +!HISTORY_MSG_LOCAL_CIE_ILL;Local - CIECAM TRC Illuminant +!HISTORY_MSG_LOCAL_CIE_LOGCIEQ;Local - CIECAM Log encoding Q +!HISTORY_MSG_LOCAL_CIE_MIDT;Local - CIECAM Mid Tones +!HISTORY_MSG_LOCAL_CIE_NORM;Local - CIECAM Normalize L +!HISTORY_MSG_LOCAL_CIE_PRIM;Local - CIECAM TRC primaries +!HISTORY_MSG_LOCAL_CIE_REDXL;Local - CIECAM Red X +!HISTORY_MSG_LOCAL_CIE_REDYL;Local - CIECAM Red Y +!HISTORY_MSG_LOCAL_CIE_REFI;Local - CIECAM Refinement colors +!HISTORY_MSG_LOCAL_CIE_SATCIE;Local - CIECAM Saturation control +!HISTORY_MSG_LOCAL_CIE_SHIFTXL;Local - CIECAM Shift x +!HISTORY_MSG_LOCAL_CIE_SHIFTYL;Local - CIECAM Shift y +!HISTORY_MSG_LOCAL_CIE_SIG;Local - Sigmoid +!HISTORY_MSG_LOCAL_CIE_SIGADAP;Local - CIECAM Sigmoid adaptability +!HISTORY_MSG_LOCAL_CIE_SIGMET;Local - CIECAM Sigmoid method +!HISTORY_MSG_LOCAL_CIE_SLOP;Local - CIECAM Slope +!HISTORY_MSG_LOCAL_CIE_SLOPESMO;Local - CIECAM Gray balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOB;Local - CIECAM Blue balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOG;Local - CIECAM Green balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOR;Local - CIECAM Red balance +!HISTORY_MSG_LOCAL_CIE_SMOOTH;Local - CIECAM Scale Yb scene +!HISTORY_MSG_LOCAL_CIE_SMOOTHMET;Local - CIECAM Smooth lights method +!HISTORY_MSG_LOCAL_CIE_SMOOTHYB;Local - CIECAM Scale Yb viewing +!HISTORY_MSG_LOCAL_CIE_SMOOTH_LUM;Local - CIECAM Levels - Luminosity mode +!HISTORY_MSG_LOCAL_CIE_STRGRAD;Local - CIECAM Gradient strength L +!HISTORY_MSG_LOCAL_CIE_STRLOG;Local - CIECAM Log encoding strength +!HISTORY_MSG_LOCAL_CIE_TRC;Local - CIECAM TRC +!HISTORY_MSG_LOCAL_CIE_WHITES;Local - CIECAM Whites distribution +!HISTORY_MSG_LOCAL_DEHAZE_BLACK;Local - Dehaze Black +!HISTORY_MSG_LOCAL_FEATHERCIE;Local - CIECAM Gradient feather +!HISTORY_MSG_LOCAL_FEATHERCOL;Local - Color Gradient feather +!HISTORY_MSG_LOCAL_FEATHEREXE;Local - Exp Gradient feather +!HISTORY_MSG_LOCAL_FEATHERLOG;Local - Log Gradient feather +!HISTORY_MSG_LOCAL_FEATHERMAS;Local - Mask Common gradient feather +!HISTORY_MSG_LOCAL_FEATHERSH;Local - SH Gradient feather +!HISTORY_MSG_LOCAL_FEATHERVIB;Local - Vib Gradient feather +!HISTORY_MSG_LOCAL_FEATHERWAV;Local - Wav Gradient feather !HISTORY_MSG_LOCAL_GAMUTMUNSEL;Local - SC - Avoid Color Shift +!HISTORY_MSG_LOCAL_LOG_BLACKS;Local - Log Blacks distribution +!HISTORY_MSG_LOCAL_LOG_COMPR;Local - Log Compress brightness +!HISTORY_MSG_LOCAL_LOG_SAT;Local - Log Saturation control +!HISTORY_MSG_LOCAL_LOG_WHITES;Local - Log Whites distribution !HISTORY_MSG_LOCAL_TMO_SATUR;Local Exp Fattal Saturation !HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera !HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera @@ -3020,7 +3088,6 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !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 @@ -3079,18 +3146,21 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !ICCPROFCREATOR_ILL_63;D63 : DCI-P3 Theater !ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 !INSPECTOR_WINDOW_TITLE;Inspector -!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB;Selective Editing !MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o !PARTIALPASTE_FLATFIELDFROMMETADATA;Flat-field from Metadata -!PARTIALPASTE_LOCALLAB;Local Adjustments -!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings +!PARTIALPASTE_LOCALLAB;Selective Editing +!PARTIALPASTE_LOCALLABGROUP;Selective Editing Settings !PARTIALPASTE_PREPROCWB;Preprocess White Balance !PARTIALPASTE_SPOT;Spot removal !PARTIALPASTE_TONE_EQUALIZER;Tone equalizer +!PREFERENCES_BROWSERECURSIVEDEPTH;Browse sub-folders depth +!PREFERENCES_BROWSERECURSIVEFOLLOWLINKS;Follow symbolic links when browsing sub-folders +!PREFERENCES_BROWSERECURSIVEMAXDIRS;Maximum sub-folders !PREFERENCES_CAMERAPROFILESDIR;Camera profiles directory !PREFERENCES_CIE;Ciecam !PREFERENCES_CIEARTIF;Avoid artifacts -!PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments +!PREFERENCES_COMPLEXITYLOC;Default complexity for Selective Editing !PREFERENCES_COMPLEXITY_EXP;Advanced !PREFERENCES_COMPLEXITY_NORM;Standard !PREFERENCES_COMPLEXITY_SIMP;Basic @@ -3110,13 +3180,18 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !PREFERENCES_LENSFUNDBDIR_TOOLTIP;Directory containing the Lensfun database. Leave empty to use the default directories. !PREFERENCES_LENSPROFILESDIR;Lens profiles directory !PREFERENCES_LENSPROFILESDIR_TOOLTIP;Directory containing Adobe Lens Correction Profiles (LCPs) +!PREFERENCES_MAX_ZOOM_TITLE;Maximum zoom !PREFERENCES_METADATA;Metadata !PREFERENCES_METADATA_SYNC;Metadata synchronization with XMP sidecars !PREFERENCES_METADATA_SYNC_NONE;Off !PREFERENCES_METADATA_SYNC_READ;Read only !PREFERENCES_METADATA_SYNC_READWRITE;Bidirectional -!PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips +!PREFERENCES_RAW_DECODER;Raw Decoder +!PREFERENCES_RAW_DECODER_ENABLE_LIBRAW;Use LibRaw +!PREFERENCES_SHOWTOOLTIP;Show Selective Editing advice tooltips +!PREFERENCES_SPOTLOC;Define Spot method for Selective Editing !PREFERENCES_TAB_FAVORITES;Favorites +!PREFERENCES_THUMBNAIL_RANK_COLOR_MODE;Load/Save thumbnail rank and color from/to XMP sidecars !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. @@ -3139,6 +3214,27 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !PREFERENCES_XMP_SIDECAR_MODE_EXT;darktable-like (FILENAME.ext.xmp for FILENAME.ext) !PREFERENCES_XMP_SIDECAR_MODE_STD;Standard (FILENAME.xmp for FILENAME.ext) !PREFERENCES_ZOOMONSCROLL;Zoom images by scrolling +!QUEUE_DESTPREVIEW_TITLE;Select a thumbnail to preview its destination path here +!QUEUE_DESTPREVIEW_TOOLTIP;Destination path for the first selected image appears here +!QUEUE_LOCATION_TEMPLATE_HELP_BUTTON_TOOLTIP;Show or hide a help panel with instructions for creating location templates +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_BODY;If you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p-3/converted/%P-4/%f +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_TITLE;Common examples +!QUEUE_LOCATION_TEMPLATE_HELP_INTRO;The output template field allows you to to dynamically customize the destination folder and filename. When you include certain specifiers, which begin with %, they are replaced by the program when each file is being saved.\n\nThe sections below describe each type of specifier. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_1;Using this pathname as an example: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_2;The meanings of the formatting strings are: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_LINUX;/home/tom/photos/2010-10-31/photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_WINDOWS;D:\tom\photos\2010-10-31\photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO;The %dN, %d-N, %pN, %p-N, %PN and %P-N (N = 1..9) specifiers will be replaced by elements of the image file's directory path.\nThe format specifiers operate as follows:\n %dN = Nth directory from the end of the path\n %d-N = Nth directory from the start of the path\n %pN = all directories up to the Nth from the end of the path\n %p-N = the first N directories in the path\n %PN = the last N directories in the path\n %P-N = all directories from the Nth to the end of the path\n %f = base filename (no extension) +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO_WINDOWS;For Windows paths, %d-1 is the drive letter and colon, and %d-2 is the base directory on that drive. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_TITLE;Directories and partial paths +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_BODY;%r will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used. +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_TITLE;Rank +!QUEUE_LOCATION_TEMPLATE_HELP_RESULT_MISMATCH;ERROR: 2nd result is different: +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_BODY;%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'. +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_TITLE;Position/sequence in queue +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_BODY;Three different date/time values may be used in templates:\n %tE"%Y-%m-%d" = when export started\n %tF"%Y-%m-%d" = when file was last saved\n %tP"%Y-%m-%d" = when photo was taken\nThe quoted string defines the format of the resulting date and/or time. The format string %tF"%Y-%m-%d" is just one example. The string can use all conversion specifiers defined for the g_date_time_format function (see https://docs.gtk.org/glib/method.DateTime.format.html).\n\nExample format strings: +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_TITLE;Date and time +!QUEUE_LOCATION_TEMPLATE_HELP_TITLE;Creating an output template !SAVEDLG_BIGTIFF;BigTIFF (no metadata support) !SORT_ASCENDING;Ascending !SORT_BY_DATE;By Date @@ -3147,12 +3243,16 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !SORT_BY_NAME;By Name !SORT_BY_RANK;By Rank !SORT_DESCENDING;Descending +!TC_LOCALLAB_PRIM_SHIFTX;Shift x +!TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP;In combination with "Refine colors", allows you to:\n 1) for low values, adjust the image purity.\n 2) for higher values, carry out moderate color toning.\nBe careful not to go outside the CIE xy diagram. +!TC_LOCALLAB_PRIM_SHIFTY;Shift y !TC_PRIM_BLUX;Bx !TC_PRIM_BLUY;By !TC_PRIM_GREX;Gx !TC_PRIM_GREY;Gy !TC_PRIM_REDX;Rx !TC_PRIM_REDY;Ry +!TC_PRIM_REFI;Refine colors (white-point) !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 @@ -3207,6 +3307,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !TP_HLREC_COLOROPP;Inpaint Opposed !TP_HLREC_HLBLUR;Blur !TP_HLREC_HLTH;Gain threshold +!TP_ICM_BW;Black and White !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)'. @@ -3219,8 +3320,15 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !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_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 three main uses - channel mixer, restore image color (saturation), 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_CAT;Matrix adaptation +!TP_ICM_WORKING_CAT_BRAD;Bradford +!TP_ICM_WORKING_CAT_CAT02;Cat02 +!TP_ICM_WORKING_CAT_CAT16;Cat16 +!TP_ICM_WORKING_CAT_TOOLTIP;Performs the chromatic adaptation of the XYZ conversion matrix. Default: Bradford +!TP_ICM_WORKING_CAT_VK;Von Kries +!TP_ICM_WORKING_CAT_XYZ;XYZ scale !TP_ICM_WORKING_CIEDIAG;CIE xy diagram !TP_ICM_WORKING_ILLU;Illuminant !TP_ICM_WORKING_ILLU_1500;Tungsten 1500K @@ -3232,11 +3340,13 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !TP_ICM_WORKING_ILLU_D65;D65 !TP_ICM_WORKING_ILLU_D80;D80 !TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_E;E !TP_ICM_WORKING_ILLU_NONE;Default !TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_NON;None !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_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination primaries' combo box, 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 @@ -3245,11 +3355,14 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !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_FREE;Custom LA (sliders) !TP_ICM_WORKING_PRIM_JDCMAX;JDC Max +!TP_ICM_WORKING_PRIM_JDCMAXSTDA;JDC Max stdA !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_TOOLTIP;Performs a gamut control. Destination primaries (Advanced) allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified.\nWhen 'Custom LA (sliders)' is selected, you can modify the values of the 3 primaries (Red, Green, and Blue) for x and y. !TP_ICM_WORKING_PRIM_WID;WideGamut !TP_ICM_WORKING_TRC_18;Prophoto g=1.8 !TP_ICM_WORKING_TRC_22;Adobe g=2.2 @@ -3257,6 +3370,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !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_LENSPROFILE_CORRECTION_METADATA;From file metadata !TP_LOCALLAB_ACTIV;Luminance only !TP_LOCALLAB_ACTIVSPOT;Enable Spot !TP_LOCALLAB_ADJ;Equalizer Color @@ -3264,9 +3378,9 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !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_AUTOGRAYCIE;Automatic !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_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab). Default: Munsell only.\n\nMunsell only: 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. The result is not the same as Lab. !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 @@ -3309,9 +3423,12 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !TP_LOCALLAB_BUTTON_DUPL;Duplicate !TP_LOCALLAB_BUTTON_REN;Rename !TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWEVNONE;None +!TP_LOCALLAB_BWEVSIG;Activated +!TP_LOCALLAB_BWEVSIGLOG;Sigmoid & Log-Encoding !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_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16 (experimental). 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, for example, to match CAM16 processing with the maximum monitor brightness of 400cd/m2. !TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments !TP_LOCALLAB_CAMMODE;CAM model !TP_LOCALLAB_CAMMODE_CAM16;CAM 16 @@ -3351,6 +3468,12 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !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_SMOOTHFRAME;Highlight Attenuation & Levels +!TP_LOCALLAB_CIE_SMOOTH_EV;Ev based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA;Slope based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF;Gamma based +!TP_LOCALLAB_CIE_SMOOTH_LEVELS;Levels +!TP_LOCALLAB_CIE_SMOOTH_NONE;None !TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) !TP_LOCALLAB_CIRCRADIUS;Spot size !TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the 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. @@ -3366,8 +3489,9 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !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_COLORDEPREV_TOOLTIP;Preview ΔE button in Settings will only work if you have activated 'Sharpening', 'Soft Light and Original Retinex', 'Blur/Grain and Denoise', 'Dehaze and Retinex', or 'Contrast by Detail Levels' in the 'Add tool to current spot' menu.\nFor others tools, the Preview ΔE button is in the tool, which allows previewing ΔE with several tools enabled. Prefer using Mask and modifications. !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_COLORFRAME;Dominant color !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 @@ -3375,7 +3499,10 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !TP_LOCALLAB_COL_NAME;Name !TP_LOCALLAB_COL_VIS;Status !TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPRCIE;Brightness compression +!TP_LOCALLAB_COMPRCIETH;Compression threshold !TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_COMPRLOG_TOOLTIP;This algorithm compress the data before log conversion, above the threshold slider value. To use in conjunction with Whites distribution. !TP_LOCALLAB_CONTCOL;Contrast threshold !TP_LOCALLAB_CONTFRA;Contrast by level !TP_LOCALLAB_CONTRAST;Contrast @@ -3390,7 +3517,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !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 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 spot. -!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combo box 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. @@ -3399,13 +3526,14 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !TP_LOCALLAB_DARKRETI;Darkness !TP_LOCALLAB_DEHAFRA;Dehaze !TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZE_BLACK;Black !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_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. @@ -3425,6 +3553,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !TP_LOCALLAB_DETAILFRA;Edge detection - DCT !TP_LOCALLAB_DETAILSH;Details !TP_LOCALLAB_DETAILTHR;Lum/chrom detail threshold +!TP_LOCALLAB_DISAB_CIECAM;Disable Ciecam or Weak Jz surround !TP_LOCALLAB_DIVGR;Gamma !TP_LOCALLAB_DUPLSPOTNAME;Copy !TP_LOCALLAB_EDGFRA;Edge sharpness @@ -3433,6 +3562,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping !TP_LOCALLAB_ENABLE_MASK;Enable mask !TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENABLE_MASKALL;Enable all mask tools !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 @@ -3448,9 +3578,10 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !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_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all selective editing data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\nUse 'Scope' (Excluding) to set the exclusion intensity.\n\n'Full image' allows you to use the selective editing tools on the whole image.\nThe RT Spot delimiters are set beyond the image preview boundaries.\nThe 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.\nNote: 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.\n\n'Global' allows you to use the selective editing tools on the whole image, without using Delta E or transitions. !TP_LOCALLAB_EXECLU;Excluding spot !TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXMAIN;Global !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 @@ -3459,11 +3590,11 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !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_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Selective Editing 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 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_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. @@ -3485,7 +3616,8 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !TP_LOCALLAB_FATSAT;Saturation control !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_FEATVALUE;Feather gradient +!TP_LOCALLAB_FEATVALUE_MASK;Feather gradient (Grad. Filters Mask) !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 @@ -3581,7 +3713,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !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_LABEL;Selective Editing !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 @@ -3626,8 +3758,10 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !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_LOGCIE;Log encoding +!TP_LOCALLAB_LOGCIEQ;Log Encoding Q (with Ciecam) +!TP_LOCALLAB_LOGCIEQ_TOOLTIP;Activating the checkbox allows you to switch between log encoding based on the 3 RGB channels, and log encoding based solely on Ciecam’s brightness (Q) channel.\nUsing the Q channel instead of the RGB channels helps avoid undesirable edge effects such as hue and saturation shifts.\nHowever, the settings are more difficult to optimise because Q is unbounded and Ciecam alters the data to take into account the surround conditions, simultaneous contrast, etc.\nYou may have to adjust the following:\n Scene conditions: Mean luminance (Yb), Whites & Blacks distribution, Black Ev, White Ev.\n Source Data Adjustments : Brightness compression, Strength.\n\nNote: when using Log Encoding (Q), be careful not to activate the Disable Ciecam option in the Scene Conditions, Surround menu. +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you to use Black Ev, White Ev, White and Black distribution, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using 'Log encoding' with Brightness compression. !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) @@ -3635,7 +3769,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !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_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 @@ -3648,6 +3782,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !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_LOGPFRA2;Log Encoding settings !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. @@ -3717,7 +3852,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !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_MASKUNUSABLE;Mask disabled (Enable in 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 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 @@ -3753,6 +3888,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !TP_LOCALLAB_MERTWE;Exclusion !TP_LOCALLAB_MERTWO;Subtract !TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MIDTCIE;Midtones !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 @@ -3800,10 +3936,15 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !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_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_PRECAMGAMUT_TOOLTIP;If checked, ensures a gamut control just after primary conversion to XYZ. +!TP_LOCALLAB_PRECAMREFIMAIN_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. In combination with "Shift x" and "Shift y", allows you to carry out moderate color toning. +!TP_LOCALLAB_PRECAMREFI_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. +!TP_LOCALLAB_PRECAM_TOOLTIP;'Source Data Adjustments' modifies the Dynamic Range using Log encoding, the tones of the image and primaries (simplified Abstract Profile), and midtones, just before the Ciecam process. These values are adjustable:\nGamma: Acts mainly on light tones\nSlope: Acts mainly on dark tones. You 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.\nDestination primaries: Allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified. You can also finely adapt the primaries and the illuminant (white-point). Moving a primary away from the white point reduces saturation and vice versa. Pay attention to the gamut. !TP_LOCALLAB_PREVHIDE;Hide additional settings !TP_LOCALLAB_PREVIEW;Preview ΔE !TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PRIMILLFRAME;Primaries & Illuminant !TP_LOCALLAB_PROXI;ΔE decay !TP_LOCALLAB_QUAAGRES;Aggressive !TP_LOCALLAB_QUACONSER;Conservative @@ -3848,10 +3989,11 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !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_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_SATCIE;Saturation control !TP_LOCALLAB_SATUR;Saturation !TP_LOCALLAB_SATURV;Saturation (s) !TP_LOCALLAB_SCALEGR;Scale @@ -3872,7 +4014,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !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_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;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. @@ -3918,17 +4060,41 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !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_SIGBLACKSSCIE;Blacks distribution +!TP_LOCALLAB_SIGCIE;Sigmoid +!TP_LOCALLAB_SIGFRA;Sigmoid Q +!TP_LOCALLAB_SIGGAMJCIE;Gamma !TP_LOCALLAB_SIGJZFRA;Sigmoid Jz !TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOID16_TOOLTIP;Allows you to simulate a tone mapping appearance using both 'Ciecam' and 'Sigmoid Q'. Sigmoid Q has three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc) Adaptability weights the action of the sigmoid by action on the internal exponential function. !TP_LOCALLAB_SIGMOIDBL;Blend !TP_LOCALLAB_SIGMOIDLAMBDA;Contrast -!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDLOGAUTO;Auto threshold +!TP_LOCALLAB_SIGMOIDLOGEV_TOOLTIP;If the combo box selection 'Black Ev and White Ev' is 'Sigmoid and Log encoding' instead of 'Sigmoid only', the two algorithms 'Log encoding' and 'Sigmoid' are used together. +!TP_LOCALLAB_SIGMOIDNORMCIE;Normalize Luminance +!TP_LOCALLAB_SIGMOIDNORMCIEBLEND_TOOLTIP;Blend acts on the final aspect of the image, contrast and luminance. Ratio between original and output image. +!TP_LOCALLAB_SIGMOIDNORMCIE_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image take into account those of the original.\nAll the adjustments acting on J or Q are taken into account, including those which are not relative to Sigmoid Q. +!TP_LOCALLAB_SIGMOIDQJ;Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDQJCOMPRCIE_TOOLTIP;When the combo box selection 'Uses Black Ev and White Ev' is 'Sigmoid and Log encoding Q' or 'Log encoding instead of Sigmoid' checked. This algorithm compress the data above the threshold slider value. The last value stands for brightness (Q) and should be close as possible to the value 'Compression threshold' (calculate when 'Auto threshold" checked, often > 1). +!TP_LOCALLAB_SIGMOIDSENSI;Adaptability !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_SIGMOIDWHITESCIE_TOOLTIP;Allows you, in Automatic when the dynamic range of the image is high, to change the distribution of lights in whites and deep blacks.\nCan be used with Log encoding or Sigmoid with Black Ev and White Ev enabled.\n\nThe algorithm does not change the basic data, but acts on the components necessary to calculate the Dynamic range, Black Ev, White Ev and the Gray point. +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a tone mapping appearance using both the 'Jz' and 'Sigmoid' function. Three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SIGSLOPJCIE;Slope +!TP_LOCALLAB_SIGTRCCIE;Source Data Adjustments +!TP_LOCALLAB_SIGWHITESCIE;Whites distribution !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_SLOPESMOOTH;Gray balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHB;Blue balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHG;Green balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHR;Red balance (Slope) !TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SMOOTHCIE;Highlight Attenuation +!TP_LOCALLAB_SMOOTHCIE_LUM;Luminosity mode +!TP_LOCALLAB_SMOOTHCIE_SCA;Scale Yb Scene +!TP_LOCALLAB_SMOOTHCIE_TOOLTIP;Completes the processing carried out by gamma, slope and midtones by causing a slight lowering of lights. Please note this does not replace Highlight reconstruction.\n\nGamma based and Slope based (Standard and Advanced) allow you to simulate a tone mapping using:\na) Scene conditions: Black-Ev, White-Ev, Mean luminance (Yb%)\nb) Viewing conditions: Mean luminance (Yb%).\n\nScale Yb Scene is function of White-Ev. +!TP_LOCALLAB_SMOOTHCIE_YB;Scale Yb Viewing !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. @@ -3950,13 +4116,14 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !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_STRENGTHCIELOG;Strength !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_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. @@ -3988,11 +4155,12 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !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_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_TRCFRAME;Tone Response Curve & Midtones !TP_LOCALLAB_USEMASK;Laplacian !TP_LOCALLAB_VART;Variance (contrast) !TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool @@ -4192,7 +4360,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !TP_WAVELET_WAVOFFSET;Offset !TP_WBALANCE_AUTOITCGREEN;Temperature correlation !TP_WBALANCE_AUTOOLD;RGB grey -!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement +!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement !TP_WBALANCE_ITCWALG_TOOLTIP;Allows you to switch to the other Alternative temperature (Alt_temp), when possible.\nInactive in the "single choice" case. !TP_WBALANCE_ITCWBDELTA_TOOLTIP;Fixed for each "green" iteration tried, the temperature difference to be taken into account. !TP_WBALANCE_ITCWBFGREEN_TOOLTIP;Find the best compromise between Student and green. @@ -4235,7 +4403,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - !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_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).\nIn the rare case of a color drift with "Observer 2°" (probably due to the conversion matrix) "Observer 10°" must be selected. !TP_WBALANCE_PATCHLABEL;Read colors:%1 Patch: Chroma:%2 Size=%3 !TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colors (max=237).\nDisplay calculated Patch Chroma.\nAWB temperature bias, lets try to reduce this value, a minimum may seem to optimize the algorithm.\n\nPatch size matching chroma optimization. !TP_WBALANCE_PATCHLEVELLABEL;Patch: ΔE=%1 - datas x 9 Min:%2 Max=%3 diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 84c52d64f..72bdae9fa 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -1,91 +1,94 @@ -#001 keenonkites; Aktualisierte Version für 2.3 beta2 -#002 phberlin; basiert auf keenonkites' Erstübersetzung -#003 2007-12-20 -#004 2007-12-22 -#005 2008-01-08 -#006 2008-01-15 -#007 2008-02-20 -#008 2008-12-19 keenonkites, Anpassungen für 2.4beta4 -#009 2008-09-20 keenonkites, Anpassungen für 2.4m2 -#010 2008-04-04 Anpassungen für 2.4 -#011 Leichte Anpassungen (keenonkites/klonk) -#012 Erweiterung (oduis) -#013 Erweiterung (oduis) -#014 Erweiterung (oduis) -#015 Erweiterung (oduis) -#016 2012-12-05 3.0 alpha: Erweiterung und Korrekturen (Metex) -#017 2012-04-29 Erweiterungen und Korrekturen (MaWe) -#018 Erweiterung (oduis) -#019 Erweiterung (oduis) -#020 2013-02-27 Erweiterung (cytrinox) -#021 2013-12-31 Erweiterung (Ingo) -#022 2015-09-04 komplette Überarbeitung (TooWaBoo) -#023 2015-10-24 Retinexübersetzung und Korrekturen (TooWaBoo) -#024 2015-11-01 Korrekturen (TooWaBoo) RT4.2.450 -#025 2015-11-30 Korrekturen (TooWaBoo) RT4.2.507 -#026 2015-12-13 Korrekturen (TooWaBoo) RT4.2.514 -#026 2015-12-22 Korrekturen (TooWaBoo) RT4.2.536 -#027 2016-02-12 Retinexübersetzung (TooWaBoo) RT4.2.730 -#028 2016-03-19 Erweiterung/Korrekturen (TooWaBoo) RT4.2.880 -#029 2016-05-24 Erweiterung/Korrekturen (TooWaBoo) RT4.2.1005 -#030 2016-09-30 Erweiterung/Korrekturen (TooWaBoo) RT4.2.1234 -#031 2016-12-01 Erweiterung/Korrekturen (TooWaBoo) RT4.2.1408 -#032 2016-12-29 Erweiterung/Korrekturen (TooWaBoo) RT4.2.1464 -#033 2017-01-04 Erweiterung/Korrekturen/Soft-Proofing (TooWaBoo) RT4.2.1477 -#034 2017-01-07 IPTC (TooWaBoo) RT4.2.1492 -#035 2017-02-18 AWB bias (TooWaBoo) RT 5.0 r1 -#036 2017-02-23 Korrekturen (TooWaBoo) RT 5.0 r1 -#037 2017-03-06 Dynamisches Profil (TooWaBoo) RT 5.0 r1 -#038 2017-03-26 Pixel-Shift (TooWaBoo) RT 5.0 r1 -#039 06.04.2017 Fast Export (TooWaBoo) RT 5.0 r1 -#040 30.04.2017 Erweiterung/Korrekturen (TooWaBoo) RT 5.0 r1 -#041 03.05.2017 Erweiterung/Korrekturen (TooWaBoo) RT 5.0 r1 -#042 13.05.2017 Erweiterung (TooWaBoo) RT 5.0 r1 -#043 21.07.2017 Erweiterung (TooWaBoo) RT 5.1 -#044 21.09.2017 Erweiterung (TooWaBoo) RT 5.2 -#045 15.10.2017 Erweiterung (TooWaBoo) RT 5.3 -#046 18.10.2017 Erweiterung (TooWaBoo) RT 5.3 -#047 19.11.2017 HDR-Dynamikkompression (TooWaBoo) RT 5.3 -#048 13.12.2017 Erweiterung (TooWaBoo) RT 5.3 -#049 21.12.2017 Lokaler Kontrast (TooWaBoo) RT 5.3 -#050 07.01.2018 Crop Settings (TooWaBoo) RT 5.3 -#051 10.02.2018 Erweiterung (TooWaBoo) RT 5.3 -#052 10.02.2018 Korrektur (TooWaBoo) RT 5.3 -#053 26.02.2018 Erweiterung (TooWaBoo) RT 5.3 -#054 30.03.2018 Erweiterung (TooWaBoo) RT 5.4 -#055 06.04.2018 Erweiterung (TooWaBoo) RT 5.4 -#056 27.04.2018 Erweiterung (TooWaBoo) RT 5.4 -#057 17.05.2018 Erweiterung (TooWaBoo) RT 5.4 -#058 19.05.2018 Erweiterung (TooWaBoo) RT 5.4 -#059 29.05.2018 Erweiterung (TooWaBoo) RT 5.4 -#060 14.06.2018 Erweiterung (TooWaBoo) RT 5.4 -#061 14.06.2018 Korrektur (TooWaBoo) RT 5.4 -#062 22.06.2018 Korrektur (TooWaBoo) RT 5.4 -#063 24.06.2018 DCB/RCD+VNG4 (TooWaBoo) RT 5.4 -#064 24.06.2018 Erweiterung/Korrektur (TooWaBoo) RT 5.4 -#065 25.06.2018 Korrekturen (TooWaBoo) RT 5.4 -#066 04.07.2018 Erweiterung (TooWaBoo) RT 5.4 -#067 05.07.2018 Erweiterung (TooWaBoo) RT 5.4 -#068 05.07.2018 Erweiterung (TooWaBoo) RT 5.4 -#069 25.07.2018 Erweiterung (TooWaBoo) RT 5.4 -#070 25.07.2018 Korrekturen (TooWaBoo) RT 5.4 -#071 28.09.2018 Korrekturen (TooWaBoo) RT 5.5 -#072 05.10.2018 Korrekturen (TooWaBoo) RT 5.5 -#073 21.11.2018 Erweiterung (TooWaBoo) RT 5.5 -#074 24.11.2018 Erweiterung (TooWaBoo) RT 5.5 -#075 02.12.2018 Erweiterung (TooWaBoo) RT 5.5 -#076 11.12.2018 Erweiterung (TooWaBoo) RT 5.5 -#077 16.12.2018 Korrektur Farbwähler-Tooltip (TooWaBoo) RT 5.5 -#078 19.01.2019 Erweiterung (TooWaBoo) RT 5.5 -#079 24.02.2019 Erweiterung (TooWaBoo) RT 5.5 -#080 25.03.2019 Erweiterung (TooWaBoo) RT 5.6 -#081 15.04.2019 Erweiterung (TooWaBoo) RT 5.6 -#082 25.05.2019 Erweiterung (TooWaBoo) RT 5.6 -#083 06.07.2019 Erweiterung (TooWaBoo) RT 5.6 -#084 06.10.2019 Erweiterung (TooWaBoo) RT 5.7 -#084 18.07.2019 Erweiterung (TooWaBoo) RT 5.6 -#085 29.07.2022 Erweiterung (marter, mozzihh) RT 5.9 -#086 2023-09, Version RT 5.10 (marter) +#01 keenonkites; Aktualisierte Version für 2.3 beta2 +#02 phberlin; basiert auf keenonkites' Erstübersetzung +#03 2007-12-20 +#04 2007-12-22 +#05 2008-01-08 +#06 2008-01-15 +#07 2008-02-20 +#08 2008-12-19 keenonkites, Anpassungen für 2.4beta4 +#09 2008-09-20 keenonkites, Anpassungen für 2.4m2 +#10 2008-04-04 Anpassungen für 2.4 +#11 Leichte Anpassungen (keenonkites/klonk) +#12 Erweiterung (oduis) +#13 Erweiterung (oduis) +#14 Erweiterung (oduis) +#15 Erweiterung (oduis) +#16 2012-12-05 3.0 alpha: Erweiterung und Korrekturen (Metex) +#17 2012-04-29 Erweiterungen und Korrekturen (MaWe) +#18 Erweiterung (oduis) +#19 Erweiterung (oduis) +#20 2013-02-27 Erweiterung (cytrinox) +#21 2013-12-31 Erweiterung (Ingo) +#22 2015-09-04 komplette Überarbeitung (TooWaBoo) +#23 2015-10-24 Retinexübersetzung und Korrekturen (TooWaBoo) +#24 2015-11-01 Korrekturen (TooWaBoo) RT4.2.450 +#25 2015-11-30 Korrekturen (TooWaBoo) RT4.2.507 +#26 2015-12-13 Korrekturen (TooWaBoo) RT4.2.514 +#26 2015-12-22 Korrekturen (TooWaBoo) RT4.2.536 +#27 2016-02-12 Retinexübersetzung (TooWaBoo) RT4.2.730 +#28 2016-03-19 Erweiterung/Korrekturen (TooWaBoo) RT4.2.880 +#29 2016-05-24 Erweiterung/Korrekturen (TooWaBoo) RT4.2.1005 +#30 2016-09-30 Erweiterung/Korrekturen (TooWaBoo) RT4.2.1234 +#31 2016-12-01 Erweiterung/Korrekturen (TooWaBoo) RT4.2.1408 +#32 2016-12-29 Erweiterung/Korrekturen (TooWaBoo) RT4.2.1464 +#33 2017-01-04 Erweiterung/Korrekturen/Soft-Proofing (TooWaBoo) RT4.2.1477 +#34 2017-01-07 IPTC (TooWaBoo) RT4.2.1492 +#35 2017-02-18 AWB bias (TooWaBoo) RT 5.0 r1 +#36 2017-02-23 Korrekturen (TooWaBoo) RT 5.0 r1 +#37 2017-03-06 Dynamisches Profil (TooWaBoo) RT 5.0 r1 +#38 2017-03-26 Pixel-Shift (TooWaBoo) RT 5.0 r1 +#39 06.04.2017 Fast Export (TooWaBoo) RT 5.0 r1 +#40 30.04.2017 Erweiterung/Korrekturen (TooWaBoo) RT 5.0 r1 +#41 03.05.2017 Erweiterung/Korrekturen (TooWaBoo) RT 5.0 r1 +#42 13.05.2017 Erweiterung (TooWaBoo) RT 5.0 r1 +#43 21.07.2017 Erweiterung (TooWaBoo) RT 5.1 +#44 21.09.2017 Erweiterung (TooWaBoo) RT 5.2 +#45 15.10.2017 Erweiterung (TooWaBoo) RT 5.3 +#46 18.10.2017 Erweiterung (TooWaBoo) RT 5.3 +#47 19.11.2017 HDR-Dynamikkompression (TooWaBoo) RT 5.3 +#48 13.12.2017 Erweiterung (TooWaBoo) RT 5.3 +#49 21.12.2017 Lokaler Kontrast (TooWaBoo) RT 5.3 +#50 07.01.2018 Crop Settings (TooWaBoo) RT 5.3 +#51 10.02.2018 Erweiterung (TooWaBoo) RT 5.3 +#52 10.02.2018 Korrektur (TooWaBoo) RT 5.3 +#53 26.02.2018 Erweiterung (TooWaBoo) RT 5.3 +#54 30.03.2018 Erweiterung (TooWaBoo) RT 5.4 +#55 06.04.2018 Erweiterung (TooWaBoo) RT 5.4 +#56 27.04.2018 Erweiterung (TooWaBoo) RT 5.4 +#57 17.05.2018 Erweiterung (TooWaBoo) RT 5.4 +#58 19.05.2018 Erweiterung (TooWaBoo) RT 5.4 +#59 29.05.2018 Erweiterung (TooWaBoo) RT 5.4 +#60 14.06.2018 Erweiterung (TooWaBoo) RT 5.4 +#61 14.06.2018 Korrektur (TooWaBoo) RT 5.4 +#62 22.06.2018 Korrektur (TooWaBoo) RT 5.4 +#63 24.06.2018 DCB/RCD+VNG4 (TooWaBoo) RT 5.4 +#64 24.06.2018 Erweiterung/Korrektur (TooWaBoo) RT 5.4 +#65 25.06.2018 Korrekturen (TooWaBoo) RT 5.4 +#66 04.07.2018 Erweiterung (TooWaBoo) RT 5.4 +#67 05.07.2018 Erweiterung (TooWaBoo) RT 5.4 +#68 05.07.2018 Erweiterung (TooWaBoo) RT 5.4 +#69 25.07.2018 Erweiterung (TooWaBoo) RT 5.4 +#70 25.07.2018 Korrekturen (TooWaBoo) RT 5.4 +#71 28.09.2018 Korrekturen (TooWaBoo) RT 5.5 +#72 05.10.2018 Korrekturen (TooWaBoo) RT 5.5 +#73 21.11.2018 Erweiterung (TooWaBoo) RT 5.5 +#74 24.11.2018 Erweiterung (TooWaBoo) RT 5.5 +#75 02.12.2018 Erweiterung (TooWaBoo) RT 5.5 +#76 11.12.2018 Erweiterung (TooWaBoo) RT 5.5 +#77 16.12.2018 Korrektur Farbwähler-Tooltip (TooWaBoo) RT 5.5 +#78 19.01.2019 Erweiterung (TooWaBoo) RT 5.5 +#79 24.02.2019 Erweiterung (TooWaBoo) RT 5.5 +#80 25.03.2019 Erweiterung (TooWaBoo) RT 5.6 +#81 15.04.2019 Erweiterung (TooWaBoo) RT 5.6 +#82 25.05.2019 Erweiterung (TooWaBoo) RT 5.6 +#83 06.07.2019 Erweiterung (TooWaBoo) RT 5.6 +#84 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 +#86 2023-09, Version RT 5.10 (marter) +#87 29.08.2024 (marter) RT 5.11 +#100 +#101 @LANGUAGE_DISPLAY_NAME=Deutsch ABOUT_TAB_BUILD;Version ABOUT_TAB_CREDITS;Danksagungen @@ -137,6 +140,7 @@ DYNPROFILEEDITOR_PROFILE;Profil EDITWINDOW_TITLE;Bildbearbeitung 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. +ERROR_MSG_METADATA_VALUE;Metadaten: Fehler Einstellung %1 nach %2 EXIFFILTER_APERTURE;Blende EXIFFILTER_CAMERA;Kamera EXIFFILTER_EXPOSURECOMPENSATION;Belichtungskorrektur (EV) @@ -192,7 +196,7 @@ EXPORT_PUTTOQUEUEFAST;Zur Warteschlange 'Schneller Export' hinzufügen EXPORT_RAW_DMETHOD;Demosaikmethode EXPORT_USE_FAST_PIPELINE;Priorität Geschwindigkeit 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) +EXPORT_USE_NORMAL_PIPELINE;Standard (überspringt einige Schritte, Skalieren zuletzt) EXTPROGTARGET_1;RAW EXTPROGTARGET_2;Stapelverarbeitung beendet FILEBROWSER_APPLYPROFILE;Profil anwenden @@ -287,6 +291,7 @@ FILEBROWSER_SHOWRANK4HINT;Nur mit 4 Sternen bewertete Bilder anzeigen.\nTaste: < FILEBROWSER_SHOWRANK5HINT;Nur mit 5 Sternen bewertete Bilder anzeigen.\nTaste: Umschalt-5 FILEBROWSER_SHOWRECENTLYSAVEDHINT;Nur gespeicherte Bilder anzeigen.\nTaste: Alt + 7 FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Nur nicht gespeicherte Bilder anzeigen.\nTaste: Alt + 6 +FILEBROWSER_SHOWRECURSIVE;Bilder in Unterordnern rekursiv anzeigen. FILEBROWSER_SHOWTRASHHINT;Inhalt des Papierkorbs anzeigen.\nTaste: Strg + t FILEBROWSER_SHOWUNCOLORHINT;Nur unmarkierte Bilder anzeigen.\nTaste: Alt + 0 FILEBROWSER_SHOWUNRANKHINT;Nur unbewertete Bilder anzeigen.\nTaste: Umschalt-0 @@ -347,8 +352,8 @@ 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_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 @@ -491,7 +496,7 @@ 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_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 @@ -822,647 +827,647 @@ 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;--nicht verwendet-- -HISTORY_MSG_499;--nicht verwendet-- -HISTORY_MSG_500;(Lokal - Spot)\nForm -HISTORY_MSG_501;(Lokal - Spot)\nMethode -HISTORY_MSG_502;(Lokal - Spot)\nForm-Methode -HISTORY_MSG_503;(Lokal - Spot)\nRechts -HISTORY_MSG_504;(Lokal - Spot)\nLinks -HISTORY_MSG_505;(Lokal - Spot)\nUnten -HISTORY_MSG_506;(Lokal - Spot)\nOben -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)\nausschließender Bereich -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_496;(sel. Editieren - Spot)\nGelöscht +HISTORY_MSG_497;(sel. Editieren - Spot)\nAusgewählt +HISTORY_MSG_498;(sel. Editieren - Spot)\nName +HISTORY_MSG_499;(sel. Editieren - Spot)\nSichtbarkeit +HISTORY_MSG_500;(sel. Editieren - Spot)\nForm +HISTORY_MSG_501;(sel. Editieren - Spot)\nMethode +HISTORY_MSG_502;(sel. Editieren - Spot)\nForm-Methode +HISTORY_MSG_503;(sel. Editieren - Spot)\nRechts +HISTORY_MSG_504;(sel. Editieren - Spot)\nLinks +HISTORY_MSG_505;(sel. Editieren - Spot)\nUnten +HISTORY_MSG_506;(sel. Editieren - Spot)\nOben +HISTORY_MSG_507;(sel. Editieren - Spot)\nMitte +HISTORY_MSG_508;(sel. Editieren - Spot)\nSpotgröße +HISTORY_MSG_509;(sel. Editieren - Spot)\nQualitäts-Methode +HISTORY_MSG_510;(sel. Editieren - Spot)\nÜbergangsgradient\nIntensität +HISTORY_MSG_511;(sel. Editieren - Spot)\nKantenerkennung\nSchwellenwert +HISTORY_MSG_512;(sel. Editieren - Spot)\nKantenerkennung\nΔE Zerfall +HISTORY_MSG_513;(sel. Editieren - Spot)\nausschließender Bereich +HISTORY_MSG_514;(sel. Editieren - Spot)\nStruktur +HISTORY_MSG_515;(Selektives Editieren) +HISTORY_MSG_516;(sel. Editieren - Farbe-Licht) +HISTORY_MSG_517;(sel. Editieren) - Super aktivieren +HISTORY_MSG_518;(sel. Editieren - Farbe-Licht)\nHelligkeit +HISTORY_MSG_519;(sel. Editieren - Farbe-Licht)\nKontrast +HISTORY_MSG_520;(sel. Editieren - Farbe-Licht)\nChrominanz +HISTORY_MSG_521;(sel. Editieren) - Umfang +HISTORY_MSG_522;(sel. Editieren - Farbe-Licht)\nKurventyp +HISTORY_MSG_523;(sel. Editieren - Farbe-Licht)\nLL-Kurve +HISTORY_MSG_524;(sel. Editieren - Farbe-Licht)\nCC-Kurve +HISTORY_MSG_525;(sel. Editieren - Farbe-Licht)\nLH-Kurve +HISTORY_MSG_526;(sel. Editieren - Farbe-Licht)\nHH-Kurve +HISTORY_MSG_527;(sel. Editieren - Farbe-Licht)\nInvertieren +HISTORY_MSG_528;(sel. Editieren - Dynamik u. Belichtung) +HISTORY_MSG_529;(sel. Editieren - Dynamik u. Belichtung)\nKompression +HISTORY_MSG_530;(sel. Editieren - Dynamik u. Belichtung)\nLichterkompression +HISTORY_MSG_531;(sel. Editieren - Dynamik u. Belichtung)\nLichterkompression\nSchwellenwert +HISTORY_MSG_532;(sel. Editieren - Dynamik u. Belichtung)\nSchwarzwert +HISTORY_MSG_533;(sel. Editieren - Dynamik u. Belichtung)\nSchattenkompression +HISTORY_MSG_534;(sel. Editieren - Farbtemperatur)\nTönung +HISTORY_MSG_535;(sel. Editieren - Dynamik u. Belichtung)\nIntensität +HISTORY_MSG_536;(sel. Editieren - Dynamik u. Belichtung)\nKontrastkurve +HISTORY_MSG_537;(sel. Editieren - Farbtemperatur) +HISTORY_MSG_538;(sel. Editieren - Farbtemperatur)\nGesättigte Töne +HISTORY_MSG_539;(sel. Editieren - Farbtemperatur)\nPastelltöne +HISTORY_MSG_540;(sel. Editieren - Farbtemperatur)\nSchwellenwert +HISTORY_MSG_541;(sel. Editieren - Farbtemperatur)\nHauttöne schützen +HISTORY_MSG_542;(sel. Editieren - Farbtemperatur)\nFarbverschiebung vermeiden +HISTORY_MSG_543;(sel. Editieren - Farbtemperatur)\nPastell- und gesättigte Farbtöne koppeln +HISTORY_MSG_544;(sel. Editieren - Farbtemperatur)\nBereich +HISTORY_MSG_545;(sel. Editieren - Farbtemperatur)\nH-Kurve +HISTORY_MSG_546;(sel. Editieren - Unschärfe)\nUnschärfe und Rauschen +HISTORY_MSG_547;(sel. Editieren - Unschärfe)\nRadius +HISTORY_MSG_548;(sel. Editieren - Unschärfe)\nRauschen +HISTORY_MSG_549;(sel. Editieren - Unschärfe)\nIntensität +HISTORY_MSG_550;(sel. Editieren - Unschärfe)\nMethode +HISTORY_MSG_551;(sel. Editieren - Unschärfe)\nNur Luminanz +HISTORY_MSG_552;(sel. Editieren - Tonwert) +HISTORY_MSG_553;(sel. Editieren - Tonwert)\nKompressionsintensität +HISTORY_MSG_554;(sel. Editieren - Tonwert)\nGamma +HISTORY_MSG_555;(sel. Editieren - Tonwert)\nKantenempfindlichkeit +HISTORY_MSG_556;(sel. Editieren - Tonwert)\nSkalieren +HISTORY_MSG_557;(sel. Editieren - Tonwert)\nGewichtung +HISTORY_MSG_558;(sel. Editieren - Tonwert)\nIntensität +HISTORY_MSG_559;(sel. Editieren - Retinex) +HISTORY_MSG_560;(sel. Editieren - Retinex)\nMethode +HISTORY_MSG_561;(sel. Editieren - Retinex)\nIntensität +HISTORY_MSG_562;(sel. Editieren - Retinex)\nChroma +HISTORY_MSG_563;(sel. Editieren - Retinex)\nRadius +HISTORY_MSG_564;(sel. Editieren - Retinex)\nKontrast +HISTORY_MSG_565;(sel. Editieren) - Umfang +HISTORY_MSG_566;(sel. Editieren - Retinex)\nVerstärkungskurve +HISTORY_MSG_567;(sel. Editieren - Retinex)\nInvertieren +HISTORY_MSG_568;(sel. Editieren - Schärfen) +HISTORY_MSG_569;(sel. Editieren - Schärfen)\nRadius +HISTORY_MSG_570;(sel. Editieren - Schärfen)\nIntensität +HISTORY_MSG_571;(sel. Editieren - Schärfen)\nDämpfung +HISTORY_MSG_572;(sel. Editieren - Schärfen)\nIterationen +HISTORY_MSG_573;(sel. Editieren - Schärfen)\nUmfang +HISTORY_MSG_574;(sel. Editieren - Schärfen)\nInvertieren +HISTORY_MSG_575;(sel. Editieren - Detailebenen) +HISTORY_MSG_576;(sel. Editieren - Detailebenen)\nMulti +HISTORY_MSG_577;(sel. Editieren - Detailebenen)\nChroma +HISTORY_MSG_578;(sel. Editieren - Detailebenen)\nSchwelle +HISTORY_MSG_579;(sel. Editieren - 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_581;(sel. Editieren - Rauschminderung)\nLuminanz f 1 +HISTORY_MSG_582;(sel. Editieren - Rauschminderung)\nLuminanz c +HISTORY_MSG_583;(sel. Editieren - Rauschminderung)\nLuminanz Detailwiederherstellung +HISTORY_MSG_584;(sel. Editieren - Rauschminderung)\nEqualizer Weiß -Schwarz +HISTORY_MSG_585;(sel. Editieren - Rauschminderung)\nFeine Chrominanz +HISTORY_MSG_586;(sel. Editieren - Rauschminderung)\nGrobe Chrominanz +HISTORY_MSG_587;(sel. Editieren - Rauschminderung)\nFarbintensität Detailwiederherstellung +HISTORY_MSG_588;(sel. Editieren - Rauschminderung)\nEqualizer Blau/Rot +HISTORY_MSG_589;(sel. Editieren - Rauschminderung)\nImpulsrauschen +HISTORY_MSG_590;(sel. Editieren - Rauschminderung)\nIntensität +HISTORY_MSG_591;(sel. Editieren - Spot)\nSpeziell\nFarbverschiebungen vermeiden +HISTORY_MSG_592;(sel. Editieren - Schärfen)\nKontrastschwelle +HISTORY_MSG_593;(sel. Editieren - Lokaler Kontrast) +HISTORY_MSG_594;(sel. Editieren - Lokaler Kontrast)\nRadius +HISTORY_MSG_595;(sel. Editieren - Lokaler Kontrast)\nIntensität +HISTORY_MSG_596;(sel. Editieren - Lokaler Kontrast)\nDunkel +HISTORY_MSG_597;(sel. Editieren - Lokaler Kontrast)\nHell +HISTORY_MSG_598;(sel. Editieren - Lokaler Kontrast)\nUmfang +HISTORY_MSG_599;(sel. Editieren - Dunst entfernen)\nIntensität +HISTORY_MSG_600;(sel. Editieren - weiches Licht)\nAktiviert +HISTORY_MSG_601;(sel. Editieren - weiches Licht)\nIntensität +HISTORY_MSG_602;(sel. Editieren - weiches Licht)\nBereich +HISTORY_MSG_603;(sel. Editieren - Schärfen)\nUnschärferadius +HISTORY_MSG_605;(sel. Editieren) - 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 -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_607;(sel. Editieren - Farbe-Licht)\nMaske\nKurve C +HISTORY_MSG_608;(sel. Editieren - Farbe-Licht)\nMaske\nKurve L +HISTORY_MSG_609;(sel. Editieren - Dynamik u. Belichtung)\nMaske\nKurve C +HISTORY_MSG_610;(sel. Editieren - Dynamik u. Belichtung)\nMaske\nKurve L +HISTORY_MSG_611;(sel. Editieren - Farbe-Licht)\nMaske\nKurve LC(H) +HISTORY_MSG_612;(sel. Editieren - Farbe-Licht)\nSpot-Struktur +HISTORY_MSG_613;(sel. Editieren - Dynamik u. Belichtung)\nSpot-Struktur +HISTORY_MSG_614;(sel. Editieren - Dynamik u. Belichtung)\nMaske\nKurve LC(H) +HISTORY_MSG_615;(sel. Editieren - Farbe-Licht)\nMaske\nÜberlagerung +HISTORY_MSG_616;(sel. Editieren - Dynamik u. Belichtung)\nMaske\nÜberlagerung +HISTORY_MSG_617;(sel. Editieren - Dynamik u. Belichtung)\nUnschärfe Kantenerkennung +HISTORY_MSG_618;(sel. Editieren - Farbe-Licht)\nMaske +HISTORY_MSG_619;(sel. Editieren - Dynamik u. Belichtung)\nMaske +HISTORY_MSG_620;(sel. Editieren - Farbe-Licht)\nUnschärfe Kantenerkennung +HISTORY_MSG_621;(sel. Editieren - Dynamik u. Belichtung)\nInvertieren +HISTORY_MSG_622;(sel. Editieren - Spot)\nAusschließende Spot-Struktur +HISTORY_MSG_623;(sel. Editieren - Dynamik u. Belichtung)\nKompensation Farbsättigung +HISTORY_MSG_624;(sel. Editieren - Farbe-Licht)\nFarbkorrektur +HISTORY_MSG_625;(sel. Editieren - Farbe-Licht)\nIntensität Farbkorrektur +HISTORY_MSG_626;(sel. Editieren - Farbe-Licht)\nMethode +HISTORY_MSG_627;(sel. Editieren - Schatten/Lichter) +HISTORY_MSG_628;(sel. Editieren - Schatten/Lichter)\nLichter +HISTORY_MSG_629;(sel. Editieren - Schatten/Lichter)\nTonwertbreite Lichter +HISTORY_MSG_630;(sel. Editieren - Schatten/Lichter)\nSchatten +HISTORY_MSG_631;(sel. Editieren - Schatten/Lichter)\nTonwertbreite Schatten +HISTORY_MSG_632;(sel. Editieren - Schatten/Lichter)\nRadius +HISTORY_MSG_633;(sel. Editieren - Schatten/Lichter)\nUmfang +HISTORY_MSG_634;(sel. Editieren - Farbe-Licht)\nMaske\nRadius +HISTORY_MSG_635;(sel. Editieren - Dynamik u. Belichtung)\nMaske\nRadius +HISTORY_MSG_636;(sel. Editieren)\nWerkzeug hinzugefügt +HISTORY_MSG_637;(sel. Editieren - Schatten/Lichter)\nMaske\nKurve C +HISTORY_MSG_638;(sel. Editieren - Schatten/Lichter)\nMaske\nKurve L +HISTORY_MSG_639;(sel. Editieren - Schatten/Lichter)\nMaske\nKurve LC(H) +HISTORY_MSG_640;(sel. Editieren - Schatten/Lichter)\nMaske\nÜberlagerung +HISTORY_MSG_641;(sel. Editieren - Schatten/Lichter)\nMaske +HISTORY_MSG_642;(sel. Editieren - Schatten/Lichter)\nMaske\nRadius +HISTORY_MSG_643;(sel. Editieren - Schatten/Lichter)\nUnschärfe Kantenerkennung +HISTORY_MSG_644;(sel. Editieren - Schatten/Lichter)\nInvertieren +HISTORY_MSG_645;(sel. Editieren - Spot)\nKantenerkennung\nBalance ab-L +HISTORY_MSG_646;(sel. Editieren - Dynamik u. Belichtung)\nMaske\nFarbintensität +HISTORY_MSG_647;(sel. Editieren - Dynamik u. Belichtung)\nMaske\nGamma +HISTORY_MSG_648;(sel. Editieren - Dynamik u. Belichtung)\nMaske\nSteigung +HISTORY_MSG_649;(sel. Editieren - Dynamik u. Belichtung)\nVerlaufsfilter\nRadius +HISTORY_MSG_650;(sel. Editieren - Farbe-Licht)\nMaske\nFarbintensität +HISTORY_MSG_651;(sel. Editieren - Farbe-Licht)\nMaske\nGamma +HISTORY_MSG_652;(sel. Editieren - Farbe-Licht)\nMaske\nSteigung +HISTORY_MSG_653;(sel. Editieren - Schatten/Lichter)\nMaske\nFarbintensität +HISTORY_MSG_654;(sel. Editieren - Schatten/Lichter)\nMaske\nGamma +HISTORY_MSG_655;(sel. Editieren - Schatten/Lichter)\nMaske\nSteigung +HISTORY_MSG_656;(sel. Editieren - Farbe-Licht)\nRadius +HISTORY_MSG_657;(sel. Editieren - Retinex)\nArtefakte reduzieren +HISTORY_MSG_658;(sel. Editieren - Detailebenen)\nRadius +HISTORY_MSG_659;(sel. Editieren - Spot)\nÜbergangsgradient\nÜbergangszerfall +HISTORY_MSG_660;(sel. Editieren - Detailebenen)\nKlarheit +HISTORY_MSG_661;(sel. Editieren - Detailebenen)\nVerbleibend +HISTORY_MSG_662;(sel. Editieren - Rauschminderung)\nLuminanz f 0 +HISTORY_MSG_663;(sel. Editieren - 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 -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 Bildmaske -HISTORY_MSG_786;(Lokal - Schatten/Lichter)\nMethode -HISTORY_MSG_787;(Lokal - Schatten/Lichter)\nTonwert-Equalizer\nWerte -HISTORY_MSG_788;(Lokal - Schatten/Lichter)\nTonwert-Equalizer\nDetails -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\nHintergrund Maske -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 -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_665;(sel. Editieren - Detailebenen)\nMaske\nÜberlagerung +HISTORY_MSG_666;(sel. Editieren - Detailebenen)\nMaske\nRadius +HISTORY_MSG_667;(sel. Editieren - Detailebenen)\nMaske\nFarbintensität +HISTORY_MSG_668;(sel. Editieren - Detailebenen)\nMaske\nGamma +HISTORY_MSG_669;(sel. Editieren - Detailebenen)\nMaske\nSteigung +HISTORY_MSG_670;(sel. Editieren - Detailebenen)\nMaske C +HISTORY_MSG_671;(sel. Editieren - Detailebenen)\nMaske L +HISTORY_MSG_672;(sel. Editieren - Detailebenen)\nMaske CL +HISTORY_MSG_673;(sel. Editieren - Detailebenen)\nMaske anwenden +HISTORY_MSG_674;(sel. Editieren)\nWerkzeug entfernt +HISTORY_MSG_675;(sel. Editieren - Tonwert)\nRadius +HISTORY_MSG_676;(sel. Editieren - Spot)\nÜbergangsgradient\nUnterschied +HISTORY_MSG_677;(sel. Editieren - Tonwert)\nIntensität +HISTORY_MSG_678;(sel. Editieren - Tonwert)\nSättigung +HISTORY_MSG_679;(sel. Editieren - Retinex)\nMaske C +HISTORY_MSG_680;(sel. Editieren - Retinex)\nMaske L +HISTORY_MSG_681;(sel. Editieren - Retinex)\nMaske CL +HISTORY_MSG_682;(sel. Editieren - Retinex) Maske +HISTORY_MSG_683;(sel. Editieren - Retinex)\nMaske\nÜberlagerung +HISTORY_MSG_684;(sel. Editieren - Retinex)\nMaske\nRadius +HISTORY_MSG_685;(sel. Editieren - Retinex)\nMaske\nFarbintensität +HISTORY_MSG_686;(sel. Editieren - Retinex)\nMaske\nGamma +HISTORY_MSG_687;(sel. Editieren - Retinex)\nMaske\nSteigung +HISTORY_MSG_688;(sel. Editieren)\nWerkzeug entfernt +HISTORY_MSG_689;(sel. Editieren - Retinex) Maske\nÜbertragungszuordnung +HISTORY_MSG_690;(sel. Editieren - Retinex)\nSkalieren +HISTORY_MSG_691;(sel. Editieren - Retinex)\nDunkel +HISTORY_MSG_692;(sel. Editieren - Retinex)\nHell +HISTORY_MSG_693;(sel. Editieren - Retinex)\nSchwelle +HISTORY_MSG_694;(sel. Editieren - Retinex)\nSchwelle Laplace +HISTORY_MSG_695;(sel. Editieren - weiches Licht)\nMethode +HISTORY_MSG_696;(sel. Editieren - Retinex)\nLuminanz normalisieren +HISTORY_MSG_697;(sel. Editieren - Tonwert)\nLuminanz normalisieren +HISTORY_MSG_698;(sel. Editieren - Lokaler Kontrast)\nSchnelle Fouriertransformation +HISTORY_MSG_699;(sel. Editieren - Retinex)\nSchnelle Fouriertransformation +HISTORY_MSG_701;(sel. Editieren - Dynamik u. Belichtung)\nSchatten +HISTORY_MSG_702;(sel. Editieren - Dynamik u. Belichtung)\nMethode +HISTORY_MSG_703;(sel. Editieren - Dynamik u. Belichtung)\nSchwellenwert Laplace +HISTORY_MSG_704;(sel. Editieren - Dynamik u. Belichtung)\nLaplace Balance +HISTORY_MSG_705;(sel. Editieren - Dynamik u. Belichtung)\nLinearität +HISTORY_MSG_706;(sel. Editieren - Tonwert)\nMaske\nKurve C +HISTORY_MSG_707;(sel. Editieren - Tonwert)\nMaske\nKurve L +HISTORY_MSG_708;(sel. Editieren - Tonwert)\nMaske\nKurve LC(h) +HISTORY_MSG_709;(sel. Editieren - Tonwert)\nMaske +HISTORY_MSG_710;(sel. Editieren - Tonwert)\nMaske überlagern +HISTORY_MSG_711;(sel. Editieren - Tonwert)\nMaske Radius +HISTORY_MSG_712;(sel. Editieren - Tonwert)\nMaske Farbintensität +HISTORY_MSG_713;(sel. Editieren - Tonwert)\nMaske Gamma +HISTORY_MSG_714;(sel. Editieren - Tonwert)\nMaske Steigung +HISTORY_MSG_716;(sel. Editieren) - lokale Methode +HISTORY_MSG_717;(sel. Editieren - Wavelet)\nKontrastkurve +HISTORY_MSG_718;(sel. Editieren) - lokale Kontrastebenen +HISTORY_MSG_719;(sel. Editieren - Wavelet)\nVerbleibende L +HISTORY_MSG_720;(sel. Editieren - Unschärfe)\nLuminanzmaske\nKurve C +HISTORY_MSG_721;(sel. Editieren - Unschärfe)\nLuminanzmaske\nKurve L +HISTORY_MSG_722;(sel. Editieren - Unschärfe)\nLuminanzmaske\nKurve LC(h) +HISTORY_MSG_723;(sel. Editieren - Unschärfe)\nMaske +HISTORY_MSG_725;(sel. Editieren - Unschärfe)\nMaske\nÜberlagerung +HISTORY_MSG_726;(sel. Editieren - Unschärfe)\nMaske\nRadius +HISTORY_MSG_727;(sel. Editieren - Unschärfe)\nMaske\nFarbintensität +HISTORY_MSG_728;(sel. Editieren - Unschärfe)\nMaske\nGamma +HISTORY_MSG_729;(sel. Editieren - Unschärfe)\nMaske\nSteigung +HISTORY_MSG_730;(sel. Editieren - Unschärfe)\nMethode +HISTORY_MSG_731;(sel. Editieren - Unschärfe)\nMethode Median\nMedianwert +HISTORY_MSG_732;(sel. Editieren - Unschärfe)\nMethode Median\nIterationen +HISTORY_MSG_733;(sel. Editieren - Unschärfe)\nAnpassbarer Filter\nRadius +HISTORY_MSG_734;(sel. Editieren - Unschärfe)\nAnpassbarer Filter\nDetail +HISTORY_MSG_738;(sel. Editieren - Wavelet)\nRestbild\nLuma zusammenführen +HISTORY_MSG_739;(sel. Editieren - Wavelet)\nRestbild\nRadius +HISTORY_MSG_740;(sel. Editieren - Wavelet)\nRestbild\nChroma zusammenführen +HISTORY_MSG_741;(sel. Editieren - Wavelet)\nVerbleibende C +HISTORY_MSG_742;(sel. Editieren - Dynamik u. Belichtung)\nKontrastdämpfung\nGamma +HISTORY_MSG_743;(sel. Editieren - Dynamik u. Belichtung)\nDynamikkompression\nIntensität +HISTORY_MSG_744;(sel. Editieren - Dynamik u. Belichtung)\nDynamikkompression\nDetail +HISTORY_MSG_745;(sel. Editieren - Dynamik u. Belichtung)\nDynamikkompression\nVersatz +HISTORY_MSG_746;(sel. Editieren - Dynamik u. Belichtung)\nDynamikkompression\nSigma +HISTORY_MSG_747;(sel. Editieren - Einstellungen)\nSpot erstellt +HISTORY_MSG_748;(sel. Editieren - Dynamik u. Belichtung)\nMethode Rauschreduzierung +HISTORY_MSG_749;(sel. Editieren - Dunst entfernen)\nTiefe +HISTORY_MSG_750;(sel. Editieren - Retinex)\nModus logarithmisch +HISTORY_MSG_751;(sel. Editieren - Dunst entfernen)\nSättigung +HISTORY_MSG_752;(sel. Editieren - Retinex)\nVersatz +HISTORY_MSG_753;(sel. Editieren - Retinex)\nÜbertragungszuordnung +HISTORY_MSG_754;(sel. Editieren - Retinex)\nBeschneiden +HISTORY_MSG_755;(sel. Editieren - Tonwert)\nTonwertkorrektur maskieren +HISTORY_MSG_756;(sel. Editieren - Dynamik u. Belichtung)\nVerwende Algo-Belichtungsmaske +HISTORY_MSG_757;(sel. Editieren - Dynamik u. Belichtung)\nMaske\nSchwelle Laplace +HISTORY_MSG_758;(sel. Editieren - Retinex)\nMaske\nSchwelle Laplace +HISTORY_MSG_759;(sel. Editieren - Dynamik u. Belichtung)\nMaske\nSchwelle Laplace +HISTORY_MSG_760;(sel. Editieren - Farbe-Licht)\nMaske\nSchwelle Laplace +HISTORY_MSG_761;(sel. Editieren - Schatten/Lichter)\nMaske\nSchwelle Laplace +HISTORY_MSG_762;(sel. Editieren - Kontrastebenen)\nMaske\nSchwelle Laplace +HISTORY_MSG_763;(sel. Editieren - Unschärfe)\nMaske\nSchwelle Laplace +HISTORY_MSG_764;(sel. Editieren) - Auflösung PDE Laplace-Maske +HISTORY_MSG_765;(sel. Editieren - Rauschminderung)\nLuminanzmaske\nSchwellenwert +HISTORY_MSG_766;(sel. Editieren - Unschärfe)\nSchnelle Fouriertransformation +HISTORY_MSG_767;(sel. Editieren - Unschärfe)\nISO Körnung Verteilung +HISTORY_MSG_768;(sel. Editieren - Unschärfe)\nISO Körnung Intensität +HISTORY_MSG_769;(sel. Editieren - Unschärfe)\nISO Korngröße +HISTORY_MSG_770;(sel. Editieren - Farbe-Licht)\nMaske\nKontrastkurve +HISTORY_MSG_771;(sel. Editieren - Dynamik u. Belichtung)\nMaske\nKontrastkurve +HISTORY_MSG_772;(sel. Editieren - Schärfen)\nMaske\nKontrastkurve +HISTORY_MSG_773;(sel. Editieren - Tonwert)\nMaske\nKontrastkurve +HISTORY_MSG_774;(sel. Editieren - Retinex)\nMaske\nKontrastkurve +HISTORY_MSG_775;(sel. Editieren - Detailebenen)\nMaske\nKontrastkurve +HISTORY_MSG_776;(sel. Editieren - Unschärfe)\nMaske\nKontrastkurve +HISTORY_MSG_777;(sel. Editieren - Unschärfe)\nMaske\nWavelet\nKontrastkurve +HISTORY_MSG_778;(sel. Editieren - Unschärfe)\nMaske\nLichter +HISTORY_MSG_779;(sel. Editieren - Farbe-Licht)\nMaske\nLokale Kontrastkurve +HISTORY_MSG_780;(sel. Editieren - Farbe-Licht)\nMaske\nSchatten +HISTORY_MSG_781;(sel. Editieren - Wavelet)\nWavelet Ebenen +HISTORY_MSG_782;(sel. Editieren - Unschärfe)\nMaske\nWavelet Ebenen +HISTORY_MSG_783;(sel. Editieren - Farbe-Licht)\nWavelet Ebenenauswahl +HISTORY_MSG_784;(sel. Editieren - Spot)\nMaskieren\nΔE Bildmaske +HISTORY_MSG_785;(sel. Editieren - Spot)\nMaskieren\nBereich Bildmaske +HISTORY_MSG_786;(sel. Editieren - Schatten/Lichter)\nMethode +HISTORY_MSG_787;(sel. Editieren - Schatten/Lichter)\nTonwert-Equalizer\nWerte +HISTORY_MSG_788;(sel. Editieren - Schatten/Lichter)\nTonwert-Equalizer\nDetails +HISTORY_MSG_789;(sel. Editieren - Schatten/Lichter)\nMaske\nIntensität +HISTORY_MSG_790;(sel. Editieren - Schatten/Lichter)\nMaske Ankerpunkt +HISTORY_MSG_791;(sel. Editieren - Maske)\nShort L-Kurve +HISTORY_MSG_792;(sel. Editieren - Spot)\nMaskieren\nHintergrund Maske +HISTORY_MSG_793;(sel. Editieren - Schatten/Lichter)\nGamma Farbtonkennlinie +HISTORY_MSG_794;(sel. Editieren - Schatten/Lichter)\nSteigung Farbtonkennlinie +HISTORY_MSG_795;(sel. Editieren - Maske)\nSichern wiederhergestelltes Bild +HISTORY_MSG_796;(sel. Editieren - Spot)\nSpeziell\nReferenzen rekursiv +HISTORY_MSG_797;(sel. Editieren - Farbe-Licht)\nZusammenführen\nMethode +HISTORY_MSG_798;(sel. Editieren - Farbe-Licht)\nZusammenführen\nDeckkraft +HISTORY_MSG_799;(sel. Editieren - Farbe-Licht)\nRGB-Kurve +HISTORY_MSG_800;(sel. Editieren - Farbe-Licht)\nMethode RGB-Kurven +HISTORY_MSG_801;(sel. Editieren - Farbe-Licht)\nSpezielle Verwendung RGB-Kurven +HISTORY_MSG_802;(sel. Editieren - Farbe-Licht)\nZusammenführen\nSchwellenwert Kontrast +HISTORY_MSG_803;(sel. Editieren - Farbe-Licht)\nZusammenführen +HISTORY_MSG_804;(sel. Editieren - Farbe-Licht)\nIntensität Strukturmaske +HISTORY_MSG_805;(sel. Editieren - Unschärfe)\nIntensität Strukturmaske +HISTORY_MSG_806;(sel. Editieren - Farbe-Licht)\nStrukturmaske als Werkzeug +HISTORY_MSG_807;(sel. Editieren - Unschärfe)\nStrukturmaske als Werkzeug +HISTORY_MSG_808;(sel. Editieren - Farbe-Licht)\nMaske\nKurve H(H) +HISTORY_MSG_809;(sel. Editieren - Farbtemperatur)\nMaske\nKurve C +HISTORY_MSG_810;(sel. Editieren - Farbtemperatur)\nMaske\nKurve L +HISTORY_MSG_811;(sel. Editieren - Farbtemperatur)\nMaske\nKurve LC(h) +HISTORY_MSG_813;(sel. Editieren - Farbtemperatur)\nMaske +HISTORY_MSG_814;(sel. Editieren - Farbtemperatur)\nMaske\nÜberlagerung +HISTORY_MSG_815;(sel. Editieren - Farbtemperatur)\nMaske\nRadius +HISTORY_MSG_816;(sel. Editieren - Farbtemperatur)\nMaske\nFarbintensität +HISTORY_MSG_817;(sel. Editieren - Farbtemperatur)\nMaske\nGamma +HISTORY_MSG_818;(sel. Editieren - Farbtemperatur)\nMaske\nSteigung +HISTORY_MSG_819;(sel. Editieren - Farbtemperatur)\nMaske\nSchwellenwert Laplace +HISTORY_MSG_820;(sel. Editieren - Farbtemperatur)\nMaske\nKontrastkurve +HISTORY_MSG_821;(sel. Editieren - Farbe-Licht)\nHintergrundgitter +HISTORY_MSG_822;(sel. Editieren - Farbe-Licht)\nHintergrund zusammenführen +HISTORY_MSG_823;(sel. Editieren - Farbe-Licht)\nLuminanz Hintergrund +HISTORY_MSG_824;(sel. Editieren - Dynamik u. Belichtung)\nVerlaufsfilter\nVerlaufsintensität +HISTORY_MSG_825;(sel. Editieren - Dynamik u. Belichtung)\nVerlaufsfilter\nRotationswinkel +HISTORY_MSG_826;(sel. Editieren - Dynamik u. Belichtung)\nVerlaufsfilter\nIntensität +HISTORY_MSG_827;(sel. Editieren - Dynamik u. Belichtung)\nVerlaufsfilter\nRotationswinkel +HISTORY_MSG_828;(sel. Editieren - Schatten/Lichter)\nVerlaufsfilter\nVerlaufsintensität +HISTORY_MSG_829;(sel. Editieren - Schatten/Lichter)\nVerlaufsfilter\nRotationswinkel +HISTORY_MSG_830;(sel. Editieren - Farbe-Licht)\nVerlaufsfilter\nIntensität Luminanz +HISTORY_MSG_831;(sel. Editieren - Farbe-Licht)\nVerlaufsfilter\nRotationswinkel +HISTORY_MSG_832;(sel. Editieren - Farbe-Licht)\nVerlaufsfilter\nIntensität Chrominanz +HISTORY_MSG_833;(sel. Editieren - Spot)\nÜbergangsgradient\nVerlaufsbreite +HISTORY_MSG_834;(sel. Editieren - Farbe-Licht)\nVerlaufsfilter\nIntensität Farbton +HISTORY_MSG_835;(sel. Editieren - Farbtemperatur)\nVerlaufsfilter\nIntensität Luminanz +HISTORY_MSG_836;(sel. Editieren - Farbtemperatur)\nVerlaufsfilter\nRotationswinkel +HISTORY_MSG_837;(sel. Editieren - Farbtemperatur)\nVerlaufsfilter\nIntensität Chrominanz +HISTORY_MSG_838;(sel. Editieren - Farbtemperatur)\nVerlaufsfilter\nIntensität Farbton +HISTORY_MSG_839;(sel. Editieren) - Softwarekomplexität +HISTORY_MSG_840;(sel. Editieren - Farbe-Licht)\nCL-Kurve +HISTORY_MSG_841;(sel. Editieren - Farbe-Licht)\nLC-Kurve +HISTORY_MSG_842;(sel. Editieren - Farbe-Licht)\nUnschärfemaske\nRadius +HISTORY_MSG_843;(sel. Editieren - Farbe-Licht)\nUnschärfemaske\nSchwellenwert Kontrast +HISTORY_MSG_844;(sel. Editieren - Farbe-Licht)\nUnschärfemaske\nSchnelle Fouriertransformation +HISTORY_MSG_845;(sel. Editieren - LOG-Kodierung) +HISTORY_MSG_846;(sel. Editieren - LOG-Kodierung)\nAutomatisch +HISTORY_MSG_847;(sel. Editieren - LOG-Kodierung)\nQuelle +HISTORY_MSG_849;(sel. Editieren - LOG-Kodierung)\nQuelle Automatisch +HISTORY_MSG_850;(sel. Editieren - LOG-Kodierung)\nSchwarz-Ev +HISTORY_MSG_851;(sel. Editieren - LOG-Kodierung)\nWeiß-Ev +HISTORY_MSG_852;(sel. Editieren - LOG-Kodierung)\nZiel +HISTORY_MSG_853;(sel. Editieren - LOG-Kodierung)\nLokaler Kontrast +HISTORY_MSG_854;(sel. Editieren - LOG-Kodierung)\nBereich +HISTORY_MSG_855;(sel. Editieren - LOG-Kodierung)\nGesamtes Bild +HISTORY_MSG_856;(sel. Editieren - LOG-Kodierung)\nBereich Schatten +HISTORY_MSG_857;(sel. Editieren - Wavelet)\nUnschärfeebenen\nVerbleibende Unschärfe +HISTORY_MSG_858;(sel. Editieren - Wavelet)\nUnschärfeebenen\nNur Luminanz +HISTORY_MSG_859;(sel. Editieren - Wavelet)\nUnschärfeebenen\nMaximum +HISTORY_MSG_860;(sel. Editieren - Wavelet)\nUnschärfeebenen +HISTORY_MSG_861;(sel. Editieren - Wavelet)\nKontrastebenen +HISTORY_MSG_862;(sel. Editieren - Wavelet)\nKontrastebenen\nDämpfungsreaktion +HISTORY_MSG_863;(sel. Editieren - Wavelet)\nOriginal zusammenführen +HISTORY_MSG_864;(sel. Editieren - Wavelet)\nDirektionaler Kontrast\nDämpfungsreaktion +HISTORY_MSG_865;(sel. Editieren - Wavelet)\nDirektionaler Kontrast\nEbenenbalance +HISTORY_MSG_866;(sel. Editieren - Wavelet)\nDirektionaler Kontrast\nKompression +HISTORY_MSG_868;(sel. Editieren - Spot)\nKantenerkennung\nC-H Balance +HISTORY_MSG_869;(sel. Editieren - Rauschminderung)\nLuminanzkurve +HISTORY_MSG_870;(sel. Editieren - Lokaler Kontrast)\nMaske\nKurve H +HISTORY_MSG_871;(sel. Editieren - Lokaler Kontrast)\nMaske\nKurve C +HISTORY_MSG_872;(sel. Editieren - Lokaler Kontrast)\nMaske\nKurve L +HISTORY_MSG_873;(sel. Editieren - Lokaler Kontrast)\nMaske +HISTORY_MSG_875;(sel. Editieren - Lokaler Kontrast)\nMaske überlagern +HISTORY_MSG_876;(sel. Editieren - Lokaler Kontrast)\nMaske glätten +HISTORY_MSG_877;(sel. Editieren - Lokaler Kontrast)\nMaske Farbintensität +HISTORY_MSG_878;(sel. Editieren - Lokaler Kontrast)\nMaske Kontrastkurve +HISTORY_MSG_879;(sel. Editieren - Wavelet)\nKontrastebene\nFarbintensität +HISTORY_MSG_880;(sel. Editieren - Wavelet)\nUnschärfeebenen\nChrominanz Ebenen +HISTORY_MSG_881;(sel. Editieren - Wavelet)\nKontrastebene\nVersatz +HISTORY_MSG_882;(sel. Editieren - Wavelet)\nUnschärfeebenen +HISTORY_MSG_883;(sel. Editieren - Wavelet)\nKontrast nach Ebenen +HISTORY_MSG_884;(sel. Editieren - Wavelet)\nDirektionaler Kontrast +HISTORY_MSG_885;(sel. Editieren - Wavelet)\nTonwertkorrektur +HISTORY_MSG_886;(sel. Editieren - Wavelet)\nTonwertkorrektur Kompression +HISTORY_MSG_887;(sel. Editieren - Wavelet)\nTonwertkorrektur\nKompression Restbild +HISTORY_MSG_888;(sel. Editieren - Wavelet)\nTonwertkorrektur\nSchwellenwert Balance +HISTORY_MSG_889;(sel. Editieren - Wavelet)\nVerlaufsfilter\nIntensität +HISTORY_MSG_890;(sel. Editieren - Wavelet)\nVerlaufsfilter\nRotationswinkel +HISTORY_MSG_891;(sel. Editieren - Wavelet)\nVerlaufsfilter +HISTORY_MSG_892;(sel. Editieren - LOG-Kodierung)\nVerlaufsintensität +HISTORY_MSG_893;(sel. Editieren - LOG-Kodierung)\nVerlaufswinkel +HISTORY_MSG_894;(sel. Editieren - Spot)\nKantenerkennung\nVorschau Farbe Intensität (ΔE) +HISTORY_MSG_897;(sel. Editieren - Wavelet)\nKantenschärfe\nIntensität +HISTORY_MSG_898;(sel. Editieren - Wavelet)\nKantenschärfe\nRadius +HISTORY_MSG_899;(sel. Editieren - Wavelet(\nKantenschärfe\nDetails +HISTORY_MSG_900;(sel. Editieren - Wavelet)\nKantenschärfe\nVerlaufsempfindlichkeit +HISTORY_MSG_901;(sel. Editieren - Wavelet)\nKantenschärfe\nUnterer Schwellenwert +HISTORY_MSG_902;(sel. Editieren - Wavelet)\nKantenschärfe\nOberer Schwellenwert +HISTORY_MSG_903;(sel. Editieren - Wavelet)\nKantenschärfe\nKontrastkurve +HISTORY_MSG_904;(sel. Editieren - Wavelet)\nKantenschärfe\nErste Ebene +HISTORY_MSG_905;(sel. Editieren - Wavelet)\nKantenschärfe +HISTORY_MSG_906;(sel. Editieren - Wavelet)\nKantenschärfe\nKantenempfindlichkeit +HISTORY_MSG_907;(sel. Editieren - Wavelet)\nKantenschärfe\nGrundverstärkung +HISTORY_MSG_908;(sel. Editieren - Wavelet)\nKantenschärfe\nBenachbarte Pixel +HISTORY_MSG_909;(sel. Editieren - Wavelet\nKantenschärfe\nAlle Werkzeuge anzeigen +HISTORY_MSG_910;(sel. Editieren - Wavelet)\nKantenperformance +HISTORY_MSG_911;(sel. Editieren - Unschärfe)\nChrominanz Luminanz +HISTORY_MSG_912;(sel. Editieren - Unschärfe)\nAnpassbarer Filter Intensität +HISTORY_MSG_913;(sel. Editieren - Wavelet)\nTonwertkorrektur\nDämpfungsreaktion +HISTORY_MSG_914;(sel. Editieren - Wavelet)\nUnschärfeebenen\nDämpfungsreaktion +HISTORY_MSG_915;(sel. Editieren - Wavelet)\nKantenschärfe\nDämpfungsreaktion +HISTORY_MSG_916;(sel. Editieren - Wavelet)\nRestbild Schatten +HISTORY_MSG_917;(sel. Editieren - Wavelet)\nRestbild\nSchwellenwert Schatten +HISTORY_MSG_918;(sel. Editieren - Wavelet)\nRestbild Lichter +HISTORY_MSG_919;(sel. Editieren - Wavelet)\nRestbild\nSchwellenwert Lichter +HISTORY_MSG_920;(sel. Editieren - Wavelet)\nKontrast\nDämpfungsreaktion +HISTORY_MSG_921;(sel. Editieren - Wavelet)\nVerlaufsfilter\nDämpfungsreaktion +HISTORY_MSG_922;(sel. Editieren - Spot)\nSpeziell\nÄnderungen in Schwarz-Weiß erzwingen +HISTORY_MSG_923;(sel. Editieren - 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 -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_925;(sel. Editieren - Spot)\nAnwendungsbereich\nFarbwerkzeuge +HISTORY_MSG_926;(sel. Editieren - Unschärfe) Rauschreduzierung\nMaskenauswahl +HISTORY_MSG_927;(sel. Editieren - Unschärfe)\nMaske\nSchatten +HISTORY_MSG_928;(sel. Editieren - Normale Farbmaske) +HISTORY_MSG_929;(sel. Editieren - Normale Farbmaske)\nIntensität +HISTORY_MSG_930;(sel. Editieren - Normale Farbmaske)\nÜberlagerung Luminanzmaske +HISTORY_MSG_931;(sel. Editieren - Normale Farbmaske)\nMaske +HISTORY_MSG_932;(sel. Editieren - Normale Farbmaske)\nRadius +HISTORY_MSG_933;(sel. Editieren - Normale Farbmaske)\nSchwellenwert Laplace +HISTORY_MSG_934;(sel. Editieren - Normale Farbmaske)\nFarbintensität +HISTORY_MSG_935;(sel. Editieren - Normale Farbmaske)\nGamma +HISTORY_MSG_936;(sel. Editieren - Normale Farbmaske)\nSteigung +HISTORY_MSG_937;(sel. Editieren - Normale Farbmaske)\nKurve C(C) +HISTORY_MSG_938;(sel. Editieren - Normale Farbmaske)\nKurve L(L) +HISTORY_MSG_939;(sel. Editieren - Normale Farbmaske)\nKurve LC(H) +HISTORY_MSG_940;(sel. Editieren - Normale Farbmaske)\nStrukturmaske als Werkzeug +HISTORY_MSG_941;(sel. Editieren - Normale Farbmaske)\nIntensität Strukturmaske +HISTORY_MSG_942;(sel. Editieren - Normale Farbmaske)\nKurve H(H) +HISTORY_MSG_943;(sel. Editieren - Normale Farbmaske)\nSchnelle Fouriertransformation +HISTORY_MSG_944;(sel. Editieren - Normale Farbmaske)\nUnschärfemaske\nUnschärferadius +HISTORY_MSG_945;(sel. Editieren - Normale Farbmaske)\nUnschärfemaske\nSchwellenwert Kontrast +HISTORY_MSG_946;(sel. Editieren - Normale Farbmaske)\nSchatten +HISTORY_MSG_947;(sel. Editieren - Normale Farbmaske)\nKontrastkurve +HISTORY_MSG_948;(sel. Editieren - Normale Farbmaske)\nWavelet-Kurve +HISTORY_MSG_949;(sel. Editieren - Normale Farbmaske)\nWavelet-Ebenen +HISTORY_MSG_950;(sel. Editieren - Normale Farbmaske)\nVerlaufsfiltermaske\nIntensität +HISTORY_MSG_951;(sel. Editieren - Normale Farbmaske)\nVerlaufsfiltermaske\nRotationswinkel +HISTORY_MSG_952;(sel. Editieren - Normale Farbmaske)\nRadius +HISTORY_MSG_953;(sel. Editieren - Normale Farbmaske)\nÜberlagerung Chrominanzmaske +HISTORY_MSG_954;(sel. Editieren)\nWerkzeuge einblenden/ausblenden +HISTORY_MSG_955;(sel. Editieren) - Spot aktivieren +HISTORY_MSG_956;(sel. Editieren - Farbe-Licht)\nCH-Kurve +HISTORY_MSG_957;(sel. Editieren - Rauschminderung)\nModus +HISTORY_MSG_958;(sel. Editieren) - Zus. Einstellungen +HISTORY_MSG_959;(sel. Editieren - Unschärfe)\nInvertieren +HISTORY_MSG_960;(sel. Editieren - LOG-Kodierung)\nCAT16 +HISTORY_MSG_961;(sel. Editieren - LOG-Kodierung)\nCIECAM +HISTORY_MSG_962;(sel. Editieren - LOG-Kodierung)\nAbsolute Luminanzquelle +HISTORY_MSG_963;(sel. Editieren - LOG-Kodierung)\nAbsolutes Luminanzziel +HISTORY_MSG_964;(sel. Editieren - LOG-Kodierung)\nUmgebung +HISTORY_MSG_965;(sel. Editieren - LOG-Kodierung)\nSättigung s +HISTORY_MSG_966;(sel. Editieren - LOG-Kodierung)\nKontrast J +HISTORY_MSG_967;(sel. Editieren - LOG-Kodierung)\nMaske Kurve C +HISTORY_MSG_968;(sel. Editieren - LOG-Kodierung)\nMaske Kurve L +HISTORY_MSG_969;(sel. Editieren - LOG-Kodierung)\nMaske Kurve H +HISTORY_MSG_970;(sel. Editieren - LOG-Kodierung)\nMaske +HISTORY_MSG_971;(sel. Editieren - LOG-Kodierung)\nMaske überlagern +HISTORY_MSG_972;(sel. Editieren - LOG-Kodierung)\nMaske Radius +HISTORY_MSG_973;(sel. Editieren - LOG-Kodierung)\nMaske Chroma +HISTORY_MSG_974;(sel. Editieren - LOG-Kodierung)\nMaske Kontrast +HISTORY_MSG_975;(sel. Editieren - LOG-Kodierung)\nHelligkeit J +HISTORY_MSG_977;(sel. Editieren - LOG-Kodierung)\nKontrast Q +HISTORY_MSG_978;(sel. Editieren - LOG-Kodierung)\nSichere Quelle +HISTORY_MSG_979;(sel. Editieren - LOG-Kodierung)\nHelligkeit Q +HISTORY_MSG_980;(sel. Editieren - LOG-Kodierung)\nFarbigkeit M +HISTORY_MSG_981;(sel. Editieren - LOG-Kodierung)\nIntensität +HISTORY_MSG_982;(sel. Editieren - Rauschminderung)\nEqualizer Farbton +HISTORY_MSG_983;(sel. Editieren - Rauschminderung)\nWiederherstellung\nSchwellenwert Maske hell +HISTORY_MSG_984;(sel. Editieren - Rauschminderung)\nWiederherstellung\nSchwellenwert Maske dunkel +HISTORY_MSG_985;(sel. Editieren - Rauschminderung)\nLuminanzmaske\nLaplace +HISTORY_MSG_986;(sel. Editieren - Rauschminderung)\nDunkle und helle Bereiche verstärken +HISTORY_MSG_987;(sel. Editieren - Verlaufsfilter)\nSchwellenwert Wiederherstellung +HISTORY_MSG_988;(sel. Editieren - Verlaufsfilter)\nSchwellenwert Maske dunkel +HISTORY_MSG_989;(sel. Editieren - Verlaufsfilter)\nSchwellenwert Maske hell +HISTORY_MSG_990;(sel. Editieren - Rauschminderung)\nWiederherstellung\nSchwelle +HISTORY_MSG_991;(sel. Editieren - Rauschminderung)\nSchwellenwert Maske dunkel +HISTORY_MSG_992;(sel. Editieren - Rauschminderung)\nSchwellenwert Maske hell +HISTORY_MSG_993;(sel. Editieren - Rauschminderung)\nInvertieren +HISTORY_MSG_994;(sel. Editieren - Verlaufsfilter)\nInvertieren +HISTORY_MSG_995;(sel. Editieren - Rauschminderung)\nZerfallrate +HISTORY_MSG_996;(sel. Editieren - Farbe-Licht)\nWiederherstellung\nSchwelle +HISTORY_MSG_997;(sel. Editieren - Farbe-Licht)\nWiederherstellung\nSchwellenwert dunkel +HISTORY_MSG_998;(sel. Editieren - Farbe-Licht)\nWiederherstellung\nSchwellenwert hell +HISTORY_MSG_999;(sel. Editieren - Farbe-Licht)\nWiederherstellung\nZerfallrate +HISTORY_MSG_1000;(sel. Editieren - Rauschminderung)\nLuminanz Graubereiche +HISTORY_MSG_1001;(sel. Editieren - LOG-Kodierung)\nWiederherstellung\nSchwellenwert +HISTORY_MSG_1002;(sel. Editieren - LOG-Kodierung)\nWiederherstellung\nSchwellenwert dunkel +HISTORY_MSG_1003;(sel. Editieren - LOG-Kodierung)\nWiederherstellung\nSchwellenwert hell +HISTORY_MSG_1004;(sel. Editieren - LOG-Kodierung)\nWiederherstellung\nZerfallrate +HISTORY_MSG_1005;(sel. Editieren - Dynamik u. Belichtung)\nWiederherstellung\nSchwellenwert +HISTORY_MSG_1006;(sel. Editieren - Dynamik u. Belichtung)\nWiederherstellung\nSchwellenwert dunkel +HISTORY_MSG_1007;(sel. Editieren - Dynamik u. Belichtung)\nWiederherstellung\nSchwellenwert hell +HISTORY_MSG_1008;(sel. Editieren - Dynamik u. Belichtung)\nWiederherstellung\nZerfallrate +HISTORY_MSG_1009;(sel. Editieren - Schatten/Lichter)\nWiederherstellung\nSchwellenwert +HISTORY_MSG_1010;(sel. Editieren - Schatten/Lichter)\nWiederherstellung\nSchwellenwert dunkel +HISTORY_MSG_1011;(sel. Editieren - Schatten/Lichter)\nWiederherstellung\nSchwellenwert hell +HISTORY_MSG_1012;(sel. Editieren - Schatten/Lichter)\nWiederherstellung\nZerfallrate +HISTORY_MSG_1013;(sel. Editieren - Farbtemperatur)\nWiederherstellung\nSchwellenwert +HISTORY_MSG_1014;(sel. Editieren - Farbtemperatur)\nWiederherstellung\nSchwellenwert dunkel +HISTORY_MSG_1015;(sel. Editieren - Farbtemperatur)\nWiederherstellung\nSchwellenwert hell +HISTORY_MSG_1016;(sel. Editieren - Farbtemperatur)\nWiederherstellung\nZerfallrate +HISTORY_MSG_1017;(sel. Editieren - Lokaler Kontrast)\nWiederherstellung\nSchwellenwert +HISTORY_MSG_1018;(sel. Editieren - Lokaler Kontrast)\nWiederherstellung\nSchwellenwert dunkel +HISTORY_MSG_1019;(sel. Editieren - Lokaler Kontrast)\nWiederherstellung\nSchwellenwert hell +HISTORY_MSG_1020;(sel. Editieren - Lokaler Kontrast)\nWiederherstellung\nZerfallrate +HISTORY_MSG_1021;(sel. Editieren - Rauschminderung)\nChrominanz Graubereiche +HISTORY_MSG_1022;(sel. Editieren - Tonwert)\nWiederherstellung\nSchwellenwert +HISTORY_MSG_1023;(sel. Editieren - Tonwert)\nWiederherstellung\nSchwellenwert dunkel +HISTORY_MSG_1024;(sel. Editieren - Tonwert)\nWiederherstellung\nSchwellenwert hell +HISTORY_MSG_1025;(sel. Editieren - Tonwert)\nWiederherstellung\nZerfallrate +HISTORY_MSG_1026;(sel. Editieren - Detailebenen-Kontrast)\nWiederherstellung\nSchwellenwert +HISTORY_MSG_1027;(sel. Editieren - Detailebenen-Kontrast)\nWiederherstellung\nSchwellenwert dunkel +HISTORY_MSG_1028;(sel. Editieren - Detailebenen-Kontrast)\nWiederherstellung\nSchwellenwert hell +HISTORY_MSG_1029;(sel. Editieren - Detailebenen-Kontrast)\nWiederherstellung\nZerfallrate +HISTORY_MSG_1030;(sel. Editieren - Retinex)\nWiederherstellung\nSchwellenwert +HISTORY_MSG_1031;(sel. Editieren - Retinex)\nWiederherstellung\nSchwellenwert dunkel +HISTORY_MSG_1032;(sel. Editieren - Retinex)\nWiederherstellung\nSchwellenwert hell +HISTORY_MSG_1033;(sel. Editieren - Retinex)\nWiederherstellung\nZerfallrate +HISTORY_MSG_1034;(sel. Editieren - Rauschminderung)\nNicht-lokales Mittel\nIntensität +HISTORY_MSG_1035;(sel. Editieren - Rauschminderung)\nNicht-lokales Mittel\nDetailwiederherstellung +HISTORY_MSG_1036;(sel. Editieren - Rauschminderung)\nNicht-lokales Mittel\nObjektgröße +HISTORY_MSG_1037;(sel. Editieren - Rauschminderung)\nNicht-lokales Mittel\nRadius +HISTORY_MSG_1038;(sel. Editieren - Rauschminderung)\nNicht-lokales Mittel\nGamma +HISTORY_MSG_1039;(sel. Editieren - Unschärfe)\nKörnung Gamma +HISTORY_MSG_1040;(sel. Editieren - Spot)\nSpeziell\nRadius +HISTORY_MSG_1041;(sel. Editieren - Spot)\nSpeziell\nNur Munsell +HISTORY_MSG_1042;(sel. Editieren - LOG-Kodierung)\nSchwellenwert +HISTORY_MSG_1043;(sel. Editieren - Dynamik u. Belichtung)\nNormalisieren +HISTORY_MSG_1044;(sel. Editieren - Lokaler Kontrast)\nGesamtintensität +HISTORY_MSG_1045;(sel. Editieren - Farbe-Licht)\nGesamtintensität +HISTORY_MSG_1046;(sel. Editieren - Rauschminderung)\nGesamtintensität +HISTORY_MSG_1047;(sel. Editieren - Schatten/Lichter)\nGesamtintensität +HISTORY_MSG_1048;(sel. Editieren - Dynamik u. Belichtung)\nGesamtintensität +HISTORY_MSG_1049;(sel. Editieren - Tonwert)\nGesamtintensität +HISTORY_MSG_1050;(sel. Editieren - LOG-Kodierung)\nChroma +HISTORY_MSG_1051;(sel. Editieren - Lokaler Kontrast)\nRestbild\nGamma +HISTORY_MSG_1052;(sel. Editieren - Lokaler Kontrast\nRestbild\nSteigung +HISTORY_MSG_1053;(sel. Editieren - Rauschminderung)\nRauschreduzierung\nGamma +HISTORY_MSG_1054;(sel. Editieren - Lokaler Kontrast)\nWavelet\nGamma +HISTORY_MSG_1055;(sel. Editieren - Farbe u. Licht)\nGamma +HISTORY_MSG_1056;(sel. Editieren - Dynamik u. Belichtung)\nDynamikkompression\nGamma +HISTORY_MSG_1057;(sel. Editieren - CIECAM) +HISTORY_MSG_1058;(sel. Editieren - CIECAM)\nGesamtintensität +HISTORY_MSG_1059;(sel. Editieren - CIECAM)\nSzenebasierte Bedingungen\nAutomatisch +HISTORY_MSG_1060;(sel. Editieren - CIECAM)\nSzenebasierte Bedingungen\nMittlere Luminanz +HISTORY_MSG_1061;(sel. Editieren - CIECAM)\nSzenebasierte Bedingungen\nAbsolute Luminanz +HISTORY_MSG_1062;(sel. Editieren - CIECAM)\nSzenebasierte Bedingungen\nUmgebung +HISTORY_MSG_1063;(sel. Editieren - CIECAM)\nCAM16 - Farbe\nSättigung +HISTORY_MSG_1064;(sel. Editieren - CIECAM)\nCAM16 - Farbe\nChroma +HISTORY_MSG_1065;(sel. Editieren - CIECAM)\nHelligkeit J +HISTORY_MSG_1066;(sel. Editieren - CIECAM)\nHelligkeit +HISTORY_MSG_1067;(sel. Editieren - CIECAM)\nKontrast J +HISTORY_MSG_1068;(sel. Editieren - CIECAM)\nCAM16 - Kontrast\nSchwellenwert Kontrast +HISTORY_MSG_1069;(sel. Editieren - CIECAM)\nCAM16 - Kontrast\nKontrast (Q) +HISTORY_MSG_1070;(sel. Editieren - CIECAM)\nCAM16 - Farbe\nBuntheit +HISTORY_MSG_1071;(sel. Editieren - CIECAM)\nBetrachtungsbedingungen\nAbsolute Luminanz +HISTORY_MSG_1072;(sel. Editieren - CIECAM)\nBetrachtungsbedingungen\nMittlere Luminanz +HISTORY_MSG_1073;(sel. Editieren - CIECAM)\nBetrachtungsbedingungen\nChromatische Adaption/Cat16 +HISTORY_MSG_1074;(sel. Editieren - CIECAM)\nCAM16 - Kontrast\nLokaler Kontrast +HISTORY_MSG_1075;(sel. Editieren - CIECAM)\nBetrachtungsbedingungen\nUmgebung +HISTORY_MSG_1076;(sel. Editieren - CIECAM)\nBereich +HISTORY_MSG_1077;(sel. Editieren - CIECAM)\nWerkzeugmodus +HISTORY_MSG_1078;(sel. Editieren - CIECAM)\nCAM16 - Farbe\nHautfarbtöne schützen +HISTORY_MSG_1079;(sel. Editieren - CIECAM)\nSigmoid\nKontraststärke +HISTORY_MSG_1080;(sel. Editieren - CIECAM)\nSigmoid\nSchwellenwert +HISTORY_MSG_1081;(sel. Editieren - CIECAM)\nSigmoid\nLuminanz normalisieren\nÜberlagern +HISTORY_MSG_1082;(sel. Editieren - CIECAM)\nSchwellenwert automatisch +HISTORY_MSG_1083;(sel. Editieren - CIECAM)\nCAM16 - Farbe\nFarbtonverschiebung +HISTORY_MSG_1084;(sel. Editieren - CIECAM)\nSchwarz-Ev Weiß-Ev verwenden +HISTORY_MSG_1085;(sel. Editieren - CIECAM)\nJz Cz Hz\nHelligkeit +HISTORY_MSG_1086;(sel. Editieren - CIECAM)\nJz Cz Hz\nKontrast +HISTORY_MSG_1087;(sel. Editieren - CIECAM)\nJz Cz Hz\nChroma +HISTORY_MSG_1088;(sel. Editieren - CIECAM)\nJz Cz Hz\nFarbton +HISTORY_MSG_1089;(sel. Editieren - CIECAM)\nSigmoid Jz\nKontraststärke +HISTORY_MSG_1090;(sel. Editieren - CIECAM)\nSigmoid Jz\nSchwellenwert +HISTORY_MSG_1091;(sel. Editieren - CIECAM)\nSigmoid Jz\nÜberlagern +HISTORY_MSG_1092;(sel. Editieren - CIECAM)\nJz Zuordnung\nAnpassung +HISTORY_MSG_1093;(sel. Editieren - CIECAM)\nCAM Modell +HISTORY_MSG_1094;(sel. Editieren - CIECAM)\nJz Lichter +HISTORY_MSG_1095;(sel. Editieren - CIECAM)\nTonwertbreite Jz Lichter +HISTORY_MSG_1096;(sel. Editieren - CIECAM)\nJz Schatten +HISTORY_MSG_1097;(sel. Editieren - CIECAM)\nTonwertbreite Jz Schatten +HISTORY_MSG_1098;(sel. Editieren - CIECAM)\nJz Radius +HISTORY_MSG_1099;(sel. Editieren - CIECAM)\nJz Cz Hz\nKurve Cz(Hz) +HISTORY_MSG_1100;(sel. Editieren - CIECAM)\nJz Zuordnung\nReferenz 100 +HISTORY_MSG_1101;(sel. Editieren - CIECAM)\nJz Zuordnung\nPQ Peak Luminanz +HISTORY_MSG_1102;(sel. Editieren - CIECAM)\nKurve Jz(Hz) +HISTORY_MSG_1103;(sel. Editieren - CIECAM)\nGamma Lebendigkeit +HISTORY_MSG_1104;(sel. Editieren - CIECAM)\nGamma Schärfe +HISTORY_MSG_1105;(sel. Editieren - CIECAM)\nTonmethode +HISTORY_MSG_1106;(sel. Editieren - CIECAM)\nTonkurve +HISTORY_MSG_1107;(sel. Editieren - CIECAM)\nFarbmethode +HISTORY_MSG_1108;(sel. Editieren - CIECAM)\nFarbkurve +HISTORY_MSG_1109;(sel. Editieren - CIECAM)\nKurve Jz(Jz) +HISTORY_MSG_1110;(sel. Editieren - CIECAM)\nKurve Cz(Cz) +HISTORY_MSG_1111;(sel. Editieren - CIECAM)\nKurve Cz(Jz) +HISTORY_MSG_1112;(sel. Editieren - CIECAM)\nErzwinge Jz +HISTORY_MSG_1113;(sel. Editieren - CIECAM)\nCAM16\nHDR PQ +HISTORY_MSG_1114;(sel. Editieren - CIECAM)\nMaske aktivieren +HISTORY_MSG_1115;(sel. Editieren - CIECAM)\nMaske\nKurve C +HISTORY_MSG_1116;(sel. Editieren - CIECAM)\nMaske\nKurve L +HISTORY_MSG_1117;(sel. Editieren - CIECAM)\nMaske\nKurve LC(h) +HISTORY_MSG_1118;(sel. Editieren - CIECAM)\nMaske\nÜberlagerung +HISTORY_MSG_1119;(sel. Editieren - CIECAM)\nMaske\nGlättradius +HISTORY_MSG_1120;(sel. Editieren - CIECAM)\nMaske\nFarbintensität +HISTORY_MSG_1121;(sel. Editieren - CIECAM)\nMaske\nKontrastkurve +HISTORY_MSG_1122;(sel. Editieren - CIECAM)\nMaske\nSchwelle Wiederherstellung +HISTORY_MSG_1123;(sel. Editieren - CIECAM)\nMaske\nSchwelle dunkel +HISTORY_MSG_1124;(sel. Editieren - CIECAM)\nMaske\nSchwelle hell +HISTORY_MSG_1125;(sel. Editieren - CIECAM)\nMaske\nZerfallrate +HISTORY_MSG_1126;(sel. Editieren - CIECAM)\nMaske\nSchwelle Laplace +HISTORY_MSG_1127;(sel. Editieren - CIECAM)\nMaske\nGamma +HISTORY_MSG_1128;(sel. Editieren - CIECAM)\nMaske\nSteigung +HISTORY_MSG_1129;(sel. Editieren - CIECAM)\nJz Cz Hz\nRelative Helligkeit +HISTORY_MSG_1130;(sel. Editieren - CIECAM)\nJz Cz Hz\nSättigung +HISTORY_MSG_1131;(sel. Editieren - Spot)\nMaske Farbrauschen +HISTORY_MSG_1132;(sel. Editieren - CIECAM)\nWavelet Jz\nDämpfungsreaktion +HISTORY_MSG_1133;(sel. Editieren - CIECAM)\nWavelet Jz\nEbenen +HISTORY_MSG_1134;(sel. Editieren - CIECAM)\nWavelet Jz\nLokaler Kontrast +HISTORY_MSG_1135;(sel. Editieren - CIECAM)\nWavelet Jz\nLuma zusammenführen +HISTORY_MSG_1136;(sel. Editieren - CIECAM)\nWavelet Jz\nChroma zusammenführen +HISTORY_MSG_1137;(sel. Editieren - CIECAM)\nWavelet Jz\nGlättradius +HISTORY_MSG_1138;(sel. Editieren - CIECAM)\nJz Cz Hz\nKurve Hz(Hz) +HISTORY_MSG_1139;(sel. Editieren - CIECAM)\nJz Cz Hz\nKurven H\nGlättradius +HISTORY_MSG_1140;(sel. Editieren - CIECAM)\nJz Cz Hz\nKurve Jz(Hz)\nSchwelle Chroma +HISTORY_MSG_1141;(sel. Editieren - CIECAM)\nChroma-Kurve Jz(Hz) +HISTORY_MSG_1142;(sel. Editieren) - Stärke Glätten +HISTORY_MSG_1143;(sel. Editieren - CIECAM)\nSchwarz-Ev +HISTORY_MSG_1144;(sel. Editieren - CIECAM)\nWeiß-Ev +HISTORY_MSG_1145;(sel. Editieren - CIECAM)\nLOG-Kodierung Jz +HISTORY_MSG_1146;(sel. Editieren - CIECAM)\nLOG-Kodierung Jz\nMittlere Helligkeit +HISTORY_MSG_1147;(sel. Editieren - CIECAM)\nSigmoid Jz\nVerwendet Schwarz-Ev Weiß-Ev +HISTORY_MSG_1148;(sel. Editieren - CIECAM)\nSigmoid Jz +HISTORY_MSG_1149;(sel. Editieren - CIECAM)\nSigmoid Q +HISTORY_MSG_1150;(sel. Editieren - CIECAM)\nSigmoid\nQuellen-Daten\nLOG-Kodierung 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 @@ -1492,8 +1497,8 @@ 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_DIRPYRDENOISE_GAIN;(Details - Rauschreduzierung)\nHelligkeitskompensation -HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;(Sensor—Matrix)\nFarbinterpolation\nAuto-Kontrastschwelle +HISTORY_MSG_DIRPYRDENOISE_GAIN;(Details - Rauschminderung)\nKompensation nach Bildhelligkeit +HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;(RAW - Sensor-Matrix)\nFarbinterpolation\nAuto-Kontrastschwelle HISTORY_MSG_DUALDEMOSAIC_CONTRAST;(RAW - Sensor-Matrix)\nFarbinterpolation\nKontrastschwelle HISTORY_MSG_EDGEFFECT;(Erweitert - Wavelet)\nKantenschärfung\nDämpfungsreaktion HISTORY_MSG_FF_FROMMETADATA;(RAW- Weißbild)\nFlat-Field - aus den Metadaten @@ -1510,16 +1515,23 @@ 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_CAT;Matrixanpassung HISTORY_MSG_ICM_FBW;(Farbe - Farbmanagement)\nAbstraktes Profil\nSchwarz-Weiß HISTORY_MSG_ICM_GAMUT;(Farbe - Farbmanagement)\nAbstraktes Profil\nGamut-Kontrolle 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_MIDTCIE;(Farbe - Farbmanagement)\nAbstraktes Profil\nMitteltöne 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_REFI;(Farbe - Farbmanagement)\nAbstraktes Profil\nFarbverfeinerung +HISTORY_MSG_ICM_SHIFTX;(Farbe - Farbmanagement)\nAbstraktes Profil\nFarbverfeinerung - Shift x +HISTORY_MSG_ICM_SHIFTY;(Farbe - Farbmanagement)\nAbstraktes Profil\nFarbverfeinerung - Shift y +HISTORY_MSG_ICM_SMOOTHCIE;(Farbe - Farbmanagement)\nAbstraktes Profil\nLichter glätten +HISTORY_MSG_ICM_TRCEXP;(Farbe - Farbmanagement) - Abstraktes Profil 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 @@ -1531,9 +1543,74 @@ 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_LOCALLAB_TE_PIVOT;(Lokal - Schatten/Lichter)\nTonwert-Equalizer\nWichtung -HISTORY_MSG_LOCAL_DEHAZE_BLACK;(Lokal - Dunst entfernen)\nSchwarzpunkt -HISTORY_MSG_LOCAL_GAMUTMUNSEL;(Lokal - Spot)\nSpeziell\nFarbverschiebung vermeiden +HISTORY_MSG_LOCALLAB_TE_PIVOT;(sel. Editieren - Schatten/Lichter)\nTonwert-Equalizer\nWichtung +HISTORY_MSG_LOCAL_CIEMASK_BLURCONT;(sel. Editieren - CIECAM)\nUnschärfemaske\nKontrast +HISTORY_MSG_LOCAL_CIEMASK_BLURFFT;(sel. Editieren - CIECAM)\nUnschärfemaske\nFouriertransformation +HISTORY_MSG_LOCAL_CIEMASK_BLURRAD;(sel. Editieren - CIECAM)\nUnschärfemaske\nRadius +HISTORY_MSG_LOCAL_CIEMASK_CHH;(sel. Editieren - CIECAM)\nUnschärfemaske\nKurve h(h) +HISTORY_MSG_LOCAL_CIEMASK_HIGH;(sel. Editieren - CIECAM)\nUnschärfemaske\nLichter +HISTORY_MSG_LOCAL_CIEMASK_SHAD;(sel. Editieren - CIECAM)\nUnschärfemaske\nSchatten +HISTORY_MSG_LOCAL_CIEMASK_STRU;(sel. Editieren - CIECAM)\nMaske\nIntensität Struktur +HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;(sel. Editieren - CIECAM)\nMaske\nStrukturmaske als Werkzeug +HISTORY_MSG_LOCAL_CIEMASK_WLC;(sel. Editieren - CIECAM)\nMaske\nWavelets L(L) +HISTORY_MSG_LOCAL_CIEMASK_WLEV;(sel. Editieren - CIECAM)\nMaske\nWavelets Ebenen +HISTORY_MSG_LOCAL_CIE_ANGGRAD;(sel. Editieren - CIECAM)\nVerlaufsfilter \nVerlaufswinkel +HISTORY_MSG_LOCAL_CIE_BLACKS;(sel. Editieren - CIECAM)\nSchwarz-Verteilung +HISTORY_MSG_LOCAL_CIE_BLUXL;(sel. Editieren - CIECAM)\Primärfarben und Lichtquelle\nBlau X +HISTORY_MSG_LOCAL_CIE_BLUYL;(sel. Editieren - CIECAM)\Primärfarben und Lichtquelle\nBlau Y +HISTORY_MSG_LOCAL_CIE_BRICOMP;(sel. Editieren - CIECAM)\nQuellen-Daten\nHelligkeitskompression +HISTORY_MSG_LOCAL_CIE_BRICOMPTH;(sel. Editieren - CIECAM)\nSchwellenwert Helligkeitskompression +HISTORY_MSG_LOCAL_CIE_BWCIE;(sel. Editieren - CIECAM)\nSchwarz-Weiß +HISTORY_MSG_LOCAL_CIE_CAT;(sel. Editieren - CIECAM)\nMatrix-Adaption +HISTORY_MSG_LOCAL_CIE_DETAILJZ;(sel. Editieren - JzCzHz)\nLokaler Kontrast +HISTORY_MSG_LOCAL_CIE_ENAMASKALL;(sel. Editieren - CIECAM)\nAlle Masken +HISTORY_MSG_LOCAL_CIE_EXPPRECAM;(sel. Editieren - CIECAM)\nQuell-Daten +HISTORY_MSG_LOCAL_CIE_GAM;(sel. Editieren - CIECAM)\nGamma +HISTORY_MSG_LOCAL_CIE_GAMUTCIE;(sel. Editieren - CIECAM)\nGamut +HISTORY_MSG_LOCAL_CIE_GREXL;(sel. Editieren - CIECAM)\nGrün X +HISTORY_MSG_LOCAL_CIE_GREYL;(sel. Editieren - CIECAM)\nGrün Y +HISTORY_MSG_LOCAL_CIE_ILL;(sel. Editieren - CIECAM)\nPrimärfarben und Lichtquelle\nBeleuchtung +HISTORY_MSG_LOCAL_CIE_LOGCIEQ;(sel. Editieren - CIECAM)\nLOG-Kodierung Q +HISTORY_MSG_LOCAL_CIE_MIDT;(sel. Editieren - CIECAM)\nMitteltöne +HISTORY_MSG_LOCAL_CIE_NORM;(sel. Editieren - CIECAM)\nSigmoid\nLuminanz normalisieren +HISTORY_MSG_LOCAL_CIE_PRIM;(sel. Editieren - CIECAM)\nTonwertkurve Primärfarben +HISTORY_MSG_LOCAL_CIE_REDXL;(sel. Editieren - CIECAM)\nRot X +HISTORY_MSG_LOCAL_CIE_REDYL;(sel. Editieren - CIECAM)\nRot Y +HISTORY_MSG_LOCAL_CIE_REFI;(sel. Editieren - CIECAM)\nFarben verfeinern +HISTORY_MSG_LOCAL_CIE_SATCIE;(sel. Editieren - CIECAM)\nSättigungskontrolle +HISTORY_MSG_LOCAL_CIE_SHIFTXL;(sel. Editieren - CIECAM)\nShift x +HISTORY_MSG_LOCAL_CIE_SHIFTYL;(sel. Editieren - CIECAM)\nShift y +HISTORY_MSG_LOCAL_CIE_SIG;(sel. Editieren - CIECAM)\nSigmoid +HISTORY_MSG_LOCAL_CIE_SIGADAP;(sel. Editieren - CIECAM)\nSigmoid Anpassung +HISTORY_MSG_LOCAL_CIE_SIGMET;(sel. Editieren - CIECAM)\nSigmoid Methode +HISTORY_MSG_LOCAL_CIE_SLOP;(sel. Editieren - CIECAM)\nSteigung +HISTORY_MSG_LOCAL_CIE_SLOPESMO;(sel. Editieren - CIECAM)\nQuelldaten\nGraubalance +HISTORY_MSG_LOCAL_CIE_SLOPESMOB;(sel. Editieren - CIECAM)\nQuelldaten\nBlaubalance +HISTORY_MSG_LOCAL_CIE_SLOPESMOG;(sel. Editieren - CIECAM)\nQuelldaten\nGrünbalance +HISTORY_MSG_LOCAL_CIE_SLOPESMOR;(sel. Editieren - CIECAM)\nQuelldaten\nRotbalance +HISTORY_MSG_LOCAL_CIE_SMOOTH;(sel. Editieren - CIECAM)\nQuelldaten\nSkalierung Yb Szene +HISTORY_MSG_LOCAL_CIE_SMOOTHMET;(sel. Editieren - CIECAM)\nMethode Lichtdämpfung +HISTORY_MSG_LOCAL_CIE_SMOOTHYB;(sel. Editieren - CIECAM)\nQuelldaten\nSkalierung Yb Ansicht +HISTORY_MSG_LOCAL_CIE_SMOOTH_LUM;(sel. Editieren - CIECAM)\nEbenen - Helligkeitsmodus +HISTORY_MSG_LOCAL_CIE_STRGRAD;(sel. Editieren - CIECAM)\nVerlaufsfilter\nVerlaufsstärke L +HISTORY_MSG_LOCAL_CIE_STRLOG;(sel. Editieren - CIECAM)\nQuellen-Daten\nLOG-Kodierung Stärke +HISTORY_MSG_LOCAL_CIE_TRC;(sel. Editieren - CIECAM)\Farbtonkennlinie +HISTORY_MSG_LOCAL_CIE_WHITES;(sel. Editieren - CIECAM)\nWeiß-Verteilung +HISTORY_MSG_LOCAL_DEHAZE_BLACK;(sel. Editieren - Dunst entfernen)\nSchwarzpunkt +HISTORY_MSG_LOCAL_FEATHERCIE;(sel. Editieren - CIECAM)\nVerlaufsfilter\nVerlaufsbreite +HISTORY_MSG_LOCAL_FEATHERCOL;(sel. Editieren - Farbe-Licht)\nVerlaufsfilter\nVerlaufsbreite +HISTORY_MSG_LOCAL_FEATHEREXE;(sel. Editieren - Dynamik u. Belichtung)\nVerlaufsfilter\nVerlaufsbreite +HISTORY_MSG_LOCAL_FEATHERLOG;(sel. Editieren - LOG-Kodierung)\nVerlaufsbreite +HISTORY_MSG_LOCAL_FEATHERMAS;(sel. Editieren - Normale Farbmaske)\nVerlaufsfiltermaske\nVerlaufsbreite +HISTORY_MSG_LOCAL_FEATHERSH;(sel. Editieren - Schatten/Lichter)\nVerlaufsfilter\nVerlaufsbreite +HISTORY_MSG_LOCAL_FEATHERVIB;(sel. Editieren - Farbtemperatur)\nVerlaufsfilter\nVerlaufsbreite +HISTORY_MSG_LOCAL_FEATHERWAV;(sel. Editieren - Wavelet)\nVerlaufsfilter\nVerlaufsbreite +HISTORY_MSG_LOCAL_GAMUTMUNSEL;(sel. Editieren - Spot)\nSpeziell\nFarbverschiebung vermeiden +HISTORY_MSG_LOCAL_LOG_BLACKS;(sel. Editieren - LOG-Kodierung)\nSchwarz-Verteilung +HISTORY_MSG_LOCAL_LOG_COMPR;(sel. Editieren - LOG-Kodierung)\nHelligkeitskompression +HISTORY_MSG_LOCAL_LOG_SAT;(sel. Editieren - LOG-Kodierung)\nSättigungskontrolle +HISTORY_MSG_LOCAL_LOG_WHITES;(sel. Editieren - LOG-Kodierung)\nWeissverteilung +HISTORY_MSG_LOCAL_TMO_SATUR;(sel. Editieren - Dynamik u. Belichtung)\nDynamikkompression\nSättigungskontrolle HISTORY_MSG_METADATA_MODE;(Metadaten)\nKopiermodus HISTORY_MSG_MICROCONTRAST_CONTRAST;(Details - Mikrokontrast)\nKontrastschwelle HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;(RAW - Eingangsschärfung)\nAuto-Schwelle @@ -1588,7 +1665,7 @@ 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_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 @@ -1613,7 +1690,7 @@ 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_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 @@ -1625,10 +1702,20 @@ HISTORY_MSG_WAVTHREND;(Erweitert - Wavelet)\nEndretusche - finales Glätten\nSch HISTORY_MSG_WAVUSHAMET;(Erweitert - Wavelet)\nSchärfemaske und Klarheit\nMethode HISTORY_MSG_WBALANCE_OBSERVER10;(Farbe - Weißabgleich)\nBeobachter 10° HISTORY_MSG_WBITC_CUSTOM;(Farbe - Weißabgleich)\nTemperaturbezogen - Benutzerdefiniert +HISTORY_MSG_WBITC_DELTA;(Farbe - Weißabgleich)\nDelta grün +HISTORY_MSG_WBITC_FGREEN;(Farbe - Weißabgleich)\nGrün - Kandidat +HISTORY_MSG_WBITC_FORCE;(Farbe - Weißabgleich)\nerzwingen HISTORY_MSG_WBITC_GREEN;(Farbe - Weißabgleich)\nGrün-Verfeinerung -HISTORY_MSG_WBITC_MINSIZE;(Farbe-Weißabgleich)\nPatch Mindestgröße -HISTORY_MSG_WBITC_OBS;(Farbe - Weißabgleich)\n2-Wege-Algorithmus entfernt +HISTORY_MSG_WBITC_MINSIZE;(Farbe - Weißabgleich)\nPatch Mindestgröße +HISTORY_MSG_WBITC_NOPURPLE;(Farbe - Weißabgleich)\n Kein Violett +HISTORY_MSG_WBITC_OBS;(Farbe - Weißabgleich)\n2-Wege-Algorithmus entfernen +HISTORY_MSG_WBITC_PONDER;(Farbe - Weißabgleich)\ngemäßigt +HISTORY_MSG_WBITC_PRECIS;(Farbe - Weißabgleich)\nPräzision HISTORY_MSG_WBITC_PRIM;(Farbe - Weißabgleich)\nWahl der Abtastung +HISTORY_MSG_WBITC_RGREEN;(Farbe - Weißabgleich)\nGrünbereich +HISTORY_MSG_WBITC_SIZE;(Farbe - Weißabgleich)\nGröße +HISTORY_MSG_WBITC_SORTED;(Farbe - Weißabgleich)\ngemäßigt +HISTORY_MSG_WBITC_THRES;(Farbe - Weißabgleich)\nSchwellenwert HISTORY_NEWSNAPSHOT;Hinzufügen HISTORY_NEWSNAPSHOT_TOOLTIP;Taste: Alt + s HISTORY_SNAPSHOT;Schnappschuss @@ -1646,7 +1733,7 @@ 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_63;D63 : DCI-P3 Theater ICCPROFCREATOR_ILL_65;D65 ICCPROFCREATOR_ILL_80;D80 ICCPROFCREATOR_ILL_DEF;Vorgabe @@ -1761,17 +1848,17 @@ 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_FILTER;Filter MAIN_TAB_INSPECT;Inspektor MAIN_TAB_IPTC;IPTC -MAIN_TAB_LOCALLAB;Lokal +MAIN_TAB_LOCALLAB;Selektives Editieren MAIN_TAB_LOCALLAB_TOOLTIP;Taste: Alt-o MAIN_TAB_METADATA;Metadaten MAIN_TAB_METADATA_TOOLTIP;Taste: Alt + m @@ -1792,7 +1879,7 @@ MAIN_TOOLTIP_PREVIEWFOCUSMASK;Vorschau Fokusmaske\nTaste: Umschalt + f MAIN_TOOLTIP_PREVIEWG;Vorschau Grün-Kanal\nTaste: g MAIN_TOOLTIP_PREVIEWL;Vorschau Helligkeit\nTaste: v\n\n0.299·R + 0.587·G + 0.114·B MAIN_TOOLTIP_PREVIEWR;Vorschau Rot-Kanal\nTaste: r -MAIN_TOOLTIP_PREVIEWSHARPMASK;Schärfungs-Kontroll-Maske ein-/ausschalten.\n\nFunktioniert nur bei aktivierter Schärfung und Zoom >= 100%.\nTaste: p +MAIN_TOOLTIP_PREVIEWSHARPMASK;Schärfungs-Kontroll-Maske ein-/ausschalten.\n\nFunktioniert nur bei aktivierter Schärfung und Zoom >= 100%.\nTaste: p oder wenn Eingangsschärfung aktiviert ist. 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 @@ -1858,8 +1945,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_LOCALLAB;Selektives Editieren +PARTIALPASTE_LOCALLABGROUP; Einstellungen f. Selektives Editieren PARTIALPASTE_METADATA;Kopiermodus PARTIALPASTE_METAGROUP;Metadaten PARTIALPASTE_PCVIGNETTE;Vignettierungsfilter @@ -1906,7 +1993,6 @@ PREFERENCES_APPEARANCE_COLORPICKERFONT;Schriftart Farbwähler PREFERENCES_APPEARANCE_CROPMASKCOLOR;Farbe/Transparenz für Schnittmaske PREFERENCES_APPEARANCE_MAINFONT;Schriftart: PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Farbe der Navigationshilfe -PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI-Modus PREFERENCES_APPEARANCE_THEME;Oberflächendesign PREFERENCES_APPLNEXTSTARTUP;erfordert Neustart PREFERENCES_AUTOMONPROFILE;Automatisch das für den aktuellen Monitor festgelegte Profil verwenden @@ -1917,6 +2003,9 @@ PREFERENCES_BEHADDALLHINT;Setzt alle Parameter auf Hinzufügen.\nAnpassun PREFERENCES_BEHAVIOR;Verhalten PREFERENCES_BEHSETALL;Alle setzen PREFERENCES_BEHSETALLHINT;Setzt alle Parameter auf Setzen.\nAnpassungen der Parameter in der Hintergrundstapelverarbeitung werden als Absolut zu den gespeicherten Werten interpretiert. +PREFERENCES_BROWSERECURSIVEDEPTH;Unterordner durchsuchen +PREFERENCES_BROWSERECURSIVEFOLLOWLINKS;Verknüfungen in Unterordnern durchsuchen +PREFERENCES_BROWSERECURSIVEMAXDIRS;Maximale Anzahl Unterordner PREFERENCES_CACHECLEAR;Löschen PREFERENCES_CACHECLEAR_ALL;Alle Dateien im Zwischenspeicher löschen: PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Alle Dateien im Zwischenspeicher löschen mit Ausnahme der Bearbeitungsprofile: @@ -1939,13 +2028,13 @@ 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_COMPLEXITYLOC;Vorgabe Komplexität für Selektives Editieren PREFERENCES_COMPLEXITY_EXP;Erweitert PREFERENCES_COMPLEXITY_NORM;Standard PREFERENCES_COMPLEXITY_SIMP;Basis -PREFERENCES_CROP;Einstellung des Ausschnittswerkzeuges +PREFERENCES_CROP;Einstellung des Ausschnittwerkzeuges PREFERENCES_CROP_AUTO_FIT;Automatischer Zoom des Ausschnitts -PREFERENCES_CROP_GUIDES;Hilfslinien anzeigen wenn Ausschnitt nicht verändert wird +PREFERENCES_CROP_GUIDES;Hilfslinien anzeigen, wenn Ausschnitt nicht verändert wird PREFERENCES_CROP_GUIDES_FRAME;Rahmen PREFERENCES_CROP_GUIDES_FULL;Vorgabe des Ausschnittswerkzeuges PREFERENCES_CROP_GUIDES_NONE;Keine @@ -2002,7 +2091,7 @@ 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_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. @@ -2018,6 +2107,7 @@ PREFERENCES_LENSFUNDBDIR_TOOLTIP;Verzeichnis, in dem sich die Lensfun Datenbank PREFERENCES_LENSPROFILESDIR;Verzeichnis der Objektivprofile PREFERENCES_LENSPROFILESDIR_TOOLTIP;Verzeichnis, das die Adobe Lens Correction Profiles (LCPs) enthält PREFERENCES_MAXRECENTFOLDERS;Maximale Anzahl der letzten Dateien +PREFERENCES_MAX_ZOOM_TITLE;Maximale Vergrößerung PREFERENCES_MENUGROUPEXTPROGS;Untermenü 'Öffnen mit' PREFERENCES_MENUGROUPFILEOPERATIONS;Untermenü Dateioperationen PREFERENCES_MENUGROUPLABEL;Untermenü Farbmarkierung @@ -2043,7 +2133,7 @@ PREFERENCES_PANFACTORLABEL;Mausgeschwindigkeit beim Bewegen von Bildern PREFERENCES_PARSEDEXT;Dateitypen anzeigen PREFERENCES_PARSEDEXTADD;Dateityp PREFERENCES_PARSEDEXTADDHINT;Dateityp zur Liste hinzufügen -PREFERENCES_PARSEDEXTDELHINT;Ausgewählten Dateityp aus Liste entfernen +PREFERENCES_PARSEDEXTDELHINT;Ausgewählten Dateityp aus der Liste entfernen.\nVordefinierte Dateitypen können nicht gelöscht werden. PREFERENCES_PARSEDEXTDOWNHINT;Ausgewählten Dateityp nach unten verschieben. PREFERENCES_PARSEDEXTUPHINT;Ausgewählten Dateityp nach oben verschieben. PREFERENCES_PERFORMANCE_MEASURE;Messung aktivieren @@ -2068,6 +2158,8 @@ PREFERENCES_PROPERTY;Eigenschaft PREFERENCES_PRTINTENT;Wiedergabe PREFERENCES_PRTPROFILE;Farbprofil PREFERENCES_PSPATH;Adobe Photoshop Installationsverzeichnis +PREFERENCES_RAW_DECODER;Raw Decoder +PREFERENCES_RAW_DECODER_ENABLE_LIBRAW;LibRaw verwenden PREFERENCES_REMEMBERZOOMPAN;Zoom und Bildposition merken 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 @@ -2080,7 +2172,7 @@ 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_SHOWTOOLTIP;Anzeigen der Tooltips für selektives Editieren PREFERENCES_SHTHRESHOLD;Schatten - Schwelle PREFERENCES_SINGLETAB;Ein-Reitermodus PREFERENCES_SINGLETABVERTAB;Ein-Reitermodus (vertikale Reiter) @@ -2088,6 +2180,7 @@ PREFERENCES_SND_HELP;Geben Sie einen Pfad zu einer Sound-Datei ein, oder geben S PREFERENCES_SND_LNGEDITPROCDONE;Bearbeitung abgeschlossen PREFERENCES_SND_QUEUEDONE;Warteschlange abgearbeitet PREFERENCES_SND_THRESHOLDSECS;Verzögerung in Sekunden +PREFERENCES_SPOTLOC;Vorgabe der Spot-Methode für das selektive Editieren PREFERENCES_STARTUPIMDIR;Bildverzeichnis beim Programmstart PREFERENCES_TAB_BROWSER;Dateiverwaltung PREFERENCES_TAB_COLORMGR;Farbmanagement @@ -2099,22 +2192,27 @@ PREFERENCES_TAB_PERFORMANCE;Performance PREFERENCES_TAB_SOUND;Klänge PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Eingebundenes JPEG PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Bildanzeige -PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutrales RAW-Bild +PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutrales RAW-Bild PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Eingebundenes JPEG wenn in Originalgröße, sonst neutrales RAW-Bild +PREFERENCES_THUMBNAIL_RANK_COLOR_MODE;Laden/Speichern Miniaturbilder Bewertung und Farbe von/nach XMP Bearbeitungsprofil (sidecar) PREFERENCES_TOOLPANEL_AVAILABLETOOLS;Verfügbare Werkzeuge PREFERENCES_TOOLPANEL_CLONE_FAVORITES;Belasse favorisierte Werkzeuge auch im Original-Tab PREFERENCES_TOOLPANEL_CLONE_FAVORITES_TOOLTIP;Wenn aktiviert, werden favorisierte Werkzeuge in beiden Tabs erscheinen, in den Favoriten und im ursprünglichen Tab.\n\nMerke: Die Aktivierung dieser Option könnte zu geringfügigen Verzögerungen während des Tab-Wechsels führen. PREFERENCES_TOOLPANEL_FAVORITE;Favorit -PREFERENCES_TOOLPANEL_FAVORITESPANEL;Favorites Panel +PREFERENCES_TOOLPANEL_FAVORITESPANEL;Favoriten Panel PREFERENCES_TOOLPANEL_TOOL;Tool PREFERENCES_TP_LABEL;Werkzeugbereich: PREFERENCES_TP_VSCROLLBAR;Keine vertikale Scrollbar PREFERENCES_USEBUNDLEDPROFILES;Standardprofile verwenden PREFERENCES_WBA;Weißabgleich -PREFERENCES_WBACORR;Weissabgleich - automatische Temperaturkorrelation -PREFERENCES_WBACORR_TOOLTIP;Diese Einstellungen ermöglichen, abhängig von den Bildern (Art der Rohdatei, Farbmetrik usw.), eine Anpassung des Algorithmus "Temperaturkorrelation", um die besten Gesamtergebnisse zu erzielen. Es gibt keine absolute Regel, diese Parameter mit den erhaltenen Ergebnissen zu verknüpfen.\n\nEs gibt drei Arten von Einstellungen: \n* solche, die für den Benutzer über die GUI zugänglich sind.\n* solche, die nur beim Lesen aus jeder pp3-Datei zugänglich sind\n* diejenigen, auf die der Benutzer in "Optionen" zugreifen kann (siehe Rawpedia)\n Sie können "AWB-Temperatur-Bias" und "Grün-Verfeinerung" verwenden, um die Ergebnisse anzupassen. Jede Veränderung führt zu einer Neuberechnung von Temperatur, Farbton und Bezug.\n\nBitte beachten Sie, dass die drei Indikatoren "Bezugsfaktor", "Patch-Chroma" und ΔE nur zur Information dienen. Nur weil einer dieser Indikatoren besser ist, ist das Ergebnis nicht zwangsläufig besser. -PREFERENCES_WBAENA;Zeige Einstellungen der Temperaturkorrelation bei automatischem Weißabgleich +PREFERENCES_WBACORR;Weißabgleich - automatische Temperaturkorrelation +PREFERENCES_WBACORR_TOOLTIP;Diese Einstellungen ermöglichen, abhängig von den Bildern (Art der Rohdatei, Farbmetrik usw.), eine Anpassung des Algorithmus 'Temperaturkorrelation', um die besten Gesamtergebnisse zu erzielen. Es gibt keine absolute Regel, diese Parameter mit den erhaltenen Ergebnissen zu verknüpfen.\n\nEs gibt drei Arten von Einstellungen: \n* solche, die für den Benutzer über die GUI zugänglich sind.\n* solche, die nur beim Lesen aus jeder pp3-Datei zugänglich sind\n* diejenigen, auf die der Benutzer in 'Optionen' zugreifen kann (siehe Rawpedia)\n Sie können 'AWB-Temperatur-Bias' und 'Grün-Verfeinerung' verwenden, um die Ergebnisse anzupassen. Jede Veränderung führt zu einer Neuberechnung von Temperatur, Farbton und Bezug.\n\nBitte beachten Sie, dass die drei Indikatoren 'Bezugsfaktor', 'Patch-Chroma' und ΔE nur zur Information dienen. Nur weil einer dieser Indikatoren besser ist, ist das Ergebnis nicht zwangsläufig besser. +PREFERENCES_WBAENA;Zeige Einstellungen der Temperaturkorrelation bei automatischem Weißabgleich PREFERENCES_WBAENACUSTOM;Benutzerdefinierte Temperatur und Tönung +PREFERENCES_WBAFORC;Erzwingt extra Algorithmus +PREFERENCES_WBANOPURP;Keine lila Farben verwendet +PREFERENCES_WBAPRECIS;Präzision Algorithmus - skaliert +PREFERENCES_WBASORT;Chromatische Sortierung anstatt nach Histogramm PREFERENCES_WORKFLOW;Layout PREFERENCES_XMP_SIDECAR_MODE;Datei-Endung für XMP (Sidecar) PREFERENCES_XMP_SIDECAR_MODE_EXT;wie Darktable (DATEINAME.ext.xmp für DATEINAME.ext) @@ -2147,6 +2245,7 @@ PROGRESSBAR_LINEDENOISE;Linienrauschfilter... PROGRESSBAR_LOADING;Lade Bild... PROGRESSBAR_LOADINGTHUMBS;Lade Miniaturbilder... PROGRESSBAR_LOADJPEG;Lade JPEG... +PROGRESSBAR_LOADJXL;Lade JXL ... PROGRESSBAR_LOADPNG;Lade PNG... PROGRESSBAR_LOADTIFF;Lade TIFF... PROGRESSBAR_NOIMAGES;Keine Bilder gefunden @@ -2167,10 +2266,31 @@ QINFO_PIXELSHIFT;Pixel-Shift / %2 Frame(s) QUEUE_AUTOSTART;Automatisch starten QUEUE_AUTOSTART_TOOLTIP;Bei neuem Job die Verarbeitung automatisch starten QUEUE_DESTFILENAME;Pfad und Dateiname +QUEUE_DESTPREVIEW_TITLE;Wähle ein Vorschaubild aus um den Zielpfad hier anzuzeigen +QUEUE_DESTPREVIEW_TOOLTIP;Der Zielpfad für das zuerst ausgewählte Bild erscheint hier 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_HELP_BUTTON_TOOLTIP;Anzeigen oder Ausblenden eines Hilfe-Fenster mit der Anleitung zur Erstellung von Ausgabe-Templates +QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_BODY;Wenn Sie das Ausgabebild zusammen mit dem Quellbild speichern möchten, schreiben Sie:\n%p1/%f\n\nWenn Sie das Ausgabebild in einem Ordner mit dem Namen „converted“ im Ordner des Quellfotos speichern möchten, schreiben Sie:\n%p1/converted/%f\n\nWenn Sie das Ausgabebild in\n„/home/tom/photos/converted/2010-10-31“ speichern möchten, schreiben Sie:\n%p-3/converted/%P-4/%f +QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_TITLE;Beispiele +QUEUE_LOCATION_TEMPLATE_HELP_INTRO;Mit dem Feld „Ausgabevorlage“ können Sie den Zielordner und den Dateinamen dynamisch anpassen. Wenn Sie bestimmte Platzhalter einfügen, die mit % beginnen, werden diese beim Speichern jeder Datei vom Programm ersetzt.\n\nDie folgenden Abschnitte beschreiben die einzelnen Platzhaltertypen. +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_1;Zum Beispiel dieser Pfad: +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_2;The Bedeutungen der Formatierungs-Platzhalter sind: +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_LINUX;/home/tom/photos/2010-10-31/photo1.raw +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_WINDOWS;D:\tom\photos\2010-10-31\photo1.raw +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO;Die Platzhalter %dN, %d-N, %pN, %p-N, %PN und %P-N (N = 1..9) werden durch Elemente des Verzeichnispfads der Bilddatei ersetzt.\nDie Formatplatzhalter funktionieren wie folgt:\n %dN = N-tes Verzeichnis vom Ende des Pfads\n %d-N = N-tes Verzeichnis vom Anfang des Pfads\n %pN = alle Verzeichnisse bis zum N-ten vom Ende des Pfads\n %p-N = die ersten N Verzeichnisse im Pfad\n %PN = die letzten N Verzeichnisse im Pfad\n %P-N = alle Verzeichnisse vom N-ten bis zum Ende des Pfads\n %f = Basis Dateiname (keine Erweiterung) +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO_WINDOWS;Bei Windows-Pfaden ist %d-1 der Laufwerksbuchstabe und der Doppelpunkt und %d-2 das Basisverzeichnis auf diesem Laufwerk. +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_TITLE;Verzeichnisse und Teilpfade +QUEUE_LOCATION_TEMPLATE_HELP_RANK_BODY;%r wird durch den Rang des Fotos ersetzt. Wenn das Foto keinen Rang hat, wird „0“ verwendet. Wenn das Foto im Papierkorb liegt, wird „x“ verwendet. +QUEUE_LOCATION_TEMPLATE_HELP_RANK_TITLE;Rang +QUEUE_LOCATION_TEMPLATE_HELP_RESULT_MISMATCH;ERROR: 2tes Ergebnis ist anders: +QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_BODY;%s1, ..., %s9 werden durch die Anfangsposition des Fotos in der zum Zeitpunkt des Starts der Warteschlange ersetzt. Die Zahl gibt die Auffüllung an, z. B. ergibt %s3001“. +QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_TITLE;Position in der Warteschlange +QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_BODY;In Vorlagen können drei verschiedene Datums-/Zeitwerte verwendet werden:\n %tE"%Y-%m-%d" = wann der Export gestartet wurde\n %tF"%Y-%m-%d" = wann die Datei zuletzt gespeichert wurde\n %tP"%Y-%m-%d" = wann das Foto aufgenommen wurde\nDie in Anführungszeichen gesetzte Zeichenfolge definiert das Format des resultierenden Datums und/oder der resultierenden Uhrzeit. Die Formatzeichenfolge %tF"%Y-%m-%d" ist nur ein Beispiel. Die Zeichenfolge kann alle für die Funktion g_date_time_format definierten Konvertierungsplatzhalter verwenden (siehe https://docs.gtk.org/glib/method.DateTime.format.html).\n\nBeispielformatzeichenfolgen: +QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_TITLE;Datum und Uhrzeit +QUEUE_LOCATION_TEMPLATE_HELP_TITLE;Erstellen einer Ausgabevorlage +QUEUE_LOCATION_TEMPLATE_TOOLTIP;Geben Sie den Ausgabeort basierend auf Merkmalen wie dem Speicherort, Rang, Papierkorbstatus oder der Position in der Warteschlange des Quellfotos an.\n\nDer Feldwert der Ausgabevorlage kann Platzhalter enthalten, die mit % beginnen und im tatsächlichen Zielpfad durch diese Merkmale ersetzt werden.\n\nDrücken Sie die Taste ?, um vollständige Anweisungen zu erhalten. QUEUE_LOCATION_TITLE;Ausgabeverzeichnis QUEUE_STARTSTOP_TOOLTIP;Startet/Stoppt die Verarbeitung der Warteschlange.\n\nTaste: Strg + s SAMPLEFORMAT_0;Unbekanntes Datenformat @@ -2209,12 +2329,16 @@ SORT_BY_LABEL;Nach Farbmarkierung SORT_BY_NAME;Nach Name SORT_BY_RANK;Nach Bewertung SORT_DESCENDING;Absteigend +TC_LOCALLAB_PRIM_SHIFTX;Shift x +TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP;In Kombination mit „Farben verfeinern“ können Sie:\n 1) bei niedrigen Werten die Bildreinheit anpassen.\n 2) bei höheren Werten eine moderate Farbtönung durchführen.\nAchten Sie darauf, das CIE-XY-Diagramm nicht zu verlassen. +TC_LOCALLAB_PRIM_SHIFTY;Shift y TC_PRIM_BLUX;Bx TC_PRIM_BLUY;By TC_PRIM_GREX;Gx TC_PRIM_GREY;Gy TC_PRIM_REDX;Rx TC_PRIM_REDY;Ry +TC_PRIM_REFI;Farben verfeinern (Weißpunkt) THRESHOLDSELECTOR_B;Unten THRESHOLDSELECTOR_BL;Unten-Links THRESHOLDSELECTOR_BR;Unten-Rechts @@ -2498,7 +2622,7 @@ 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-Rauschreduzierung verwendet.\n\nVorschau:\nNur der sichbare Teil des Bildes wird für die Berechnung der Chrominanz-Rauschreduzierung verwendet. +TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Benutzerdefiniert:\nManuelle Anpassung der Chrominanz-Rauschreduzierung.\n\nAutomatisch Global:\nEs werden 9 Zonen für die Berechnung der Chrominanz-Rauschreduzierung verwendet.\n\nVorschau:\nNur der sichtbare Teil des Bildes wird für die Berechnung der 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 @@ -2514,8 +2638,8 @@ TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminanzkurve TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Luminanzdetails TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminanz TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminanz -TP_DIRPYRDENOISE_MAIN_AUTO_GAIN;Helligkeitskompensation -TP_DIRPYRDENOISE_MAIN_AUTO_GAIN_TOOLTIP;Stärke der Rauschreduzierung basierend auf der Bildhelligkeit. Bei dunklen Bildern wird die Stärke verringert und bei hellen Bildern erhöht. +TP_DIRPYRDENOISE_MAIN_AUTO_GAIN;Kompensation nach Bildhelligkeit +TP_DIRPYRDENOISE_MAIN_AUTO_GAIN_TOOLTIP;Ändern Sie die Stärke der Rauschunterdrückung basierend auf der Bildhelligkeit. Bei dunklen Bildern wird die Stärke verringert und bei hellen Bildern erhöht. TP_DIRPYRDENOISE_MAIN_COLORSPACE;Farbraum TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB @@ -2661,10 +2785,11 @@ 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 Eingangsfarbprofil 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 Eingangsfarbprofil unterstützt wird. +TP_ICM_APPLYHUESATMAP_TOOLTIP;Die eingebettete DCP-Basistabelle verwenden.\nDie Einstellung ist nur verfügbar, wenn sie vom Eingangsfarbprofil 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 Eingangsfarbprofil unterstützt wird. +TP_ICM_APPLYLOOKTABLE_TOOLTIP;Die eingebettete DCP-'Look'-Tabelle verwenden.\nDie Einstellung ist nur verfügbar, wenn sie vom Eingangsfarbprofil unterstützt wird. TP_ICM_BPC;Schwarzpunkt-Kompensation +TP_ICM_BW;Schwarz-Weiß TP_ICM_DCPILLUMINANT;Illumination TP_ICM_DCPILLUMINANT_INTERPOLATED;Interpoliert TP_ICM_DCPILLUMINANT_TOOLTIP;DCP-Illumination auswählen. Vorgabe ist 'Interpoliert'.\nDie Einstellung ist nur verfügbar, wenn sie vom Eingangsfarbprofil unterstützt wird. @@ -2679,7 +2804,7 @@ TP_ICM_INPUTCUSTOM;DCP/ICC-Profil TP_ICM_INPUTCUSTOM_TOOLTIP;Eigenes DCP/ICC-Farbprofil verwenden. TP_ICM_INPUTDLGLABEL;DCP/ICC-Profil wählen... TP_ICM_INPUTEMBEDDED;Eingebettetes Profil verwenden -TP_ICM_INPUTEMBEDDED_TOOLTIP;Farbprofil verwenden, das in Nicht-RAW-Bildern eingebettet ist. +TP_ICM_INPUTEMBEDDED_TOOLTIP;In der Datei eingebettetes Farbprofil verwenden. Falls nicht vorhanden, Kamera-Standard verwenden. TP_ICM_INPUTNONE;Kein Profil TP_ICM_INPUTNONE_TOOLTIP;Kein Eingangsfarbprofil verwenden. TP_ICM_INPUTPROFILE;Eingangsfarbprofil @@ -2689,8 +2814,8 @@ TP_ICM_NEUTRAL;Zurücksetzen TP_ICM_NOICM;Kein ICM: sRGB-Ausgabe TP_ICM_OUTPUTPROFILE;Ausgabeprofil 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_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 @@ -2702,9 +2827,16 @@ TP_ICM_SAVEREFERENCE_TOOLTIP;Speichern Sie das lineare TIFF-Bild bevor das Einga TP_ICM_TONECURVE;Tonwertkurve 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_TRCFRAME_TOOLTIP;Auch bekannt als 'synthetisches' oder 'virtuelles' Profil, das am Ende der Verarbeitungspipeline (vor CIECAM) angewandt 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 drei Hauptanwendungen zu ändern – Kanalmischer, Farbwiederherstellung (Sättigung) 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_CAT;Matrix-Adaptation +TP_ICM_WORKING_CAT_BRAD;Bradford +TP_ICM_WORKING_CAT_CAT02;Cat02 +TP_ICM_WORKING_CAT_CAT16;Cat16 +TP_ICM_WORKING_CAT_TOOLTIP;Führt die chromatische Adaptation der XYZ-Konvertierungs-Matrix durch. Vorgabe Bradford +TP_ICM_WORKING_CAT_VK;Von Kries +TP_ICM_WORKING_CAT_XYZ;XYZ Skala TP_ICM_WORKING_CIEDIAG;CIE xy-Diagramm TP_ICM_WORKING_ILLU;Beleuchtung TP_ICM_WORKING_ILLU_1500;Tungsten 1500K @@ -2716,11 +2848,13 @@ 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_E;E TP_ICM_WORKING_ILLU_NONE;Standard TP_ICM_WORKING_ILLU_STDA;Glühbirne Normlicht A 2875K +TP_ICM_WORKING_NON;Keine 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_PRIMFRAME_TOOLTIP;Wenn 'Benutzerdefiniertes CIE xy Diagramm' im Kombinationsfeld 'Zielvorwahl' ausgewählt ist, können Sie die Werte der 3 Primärfarben direkt im Diagramm ändern.\nBeachten Sie, dass in diesem Fall die Position des Weißpunkts im Diagramm nicht aktualisiert wird. TP_ICM_WORKING_PRIM_AC0;ACESp0 TP_ICM_WORKING_PRIM_ACE;ACESp1 TP_ICM_WORKING_PRIM_ADOB;Adobe RGB @@ -2729,11 +2863,14 @@ 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_FREE;Benutzerdefiniert (Schieberegler) TP_ICM_WORKING_PRIM_JDCMAX;JDC Max +TP_ICM_WORKING_PRIM_JDCMAXSTDA;JDC Max stdA 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_TOOLTIP;Führt eine Gamut-Kontrolle durch. Mit Ziel-Primärfarben (Erweitert) können Sie die Ziel-Primärfarben ändern, um die Bildfarbe (Sättigung) wiederherzustellen oder zu ändern. Die Farbbalance bleibt erhalten, wenn das 'Arbeitsprofil' und die 'Ziel-Primärfarben' ähnlich sind. 'Arbeitsprofile' werden nicht geändert. \nWenn 'Benutzerdefinierte Lokale Anpassungen (Schieberegler)' ausgewählt ist, können Sie die Werte der drei Primärfarben Rot, Grün, Blau für x und y ändern. TP_ICM_WORKING_PRIM_WID;WideGamut TP_ICM_WORKING_TRC;Farbtonkennlinie: TP_ICM_WORKING_TRC_18;ProPhoto g=1.8 @@ -2791,6 +2928,7 @@ TP_LENSGEOM_LOG;Logarithmisch TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatisch (Lensfun) TP_LENSPROFILE_CORRECTION_LCPFILE;LCP-Datei TP_LENSPROFILE_CORRECTION_MANUAL;Benutzerdefiniert (Lensfun) +TP_LENSPROFILE_CORRECTION_METADATA;aus den Meta-Daten TP_LENSPROFILE_LABEL;Objektivkorrekturprofil TP_LENSPROFILE_LENS_WARNING;Achtung: Der Crop-Faktor des Profils entspricht nicht dem der Kamera.\nDie Ergebnisse sind möglicherweise falsch. TP_LENSPROFILE_MODE_HEADER;Profilauswahl @@ -2812,7 +2950,7 @@ TP_LOCALLAB_ARTIF_TOOLTIP;Schwellenwert Bereich ΔE erhöht den Anwendungsbereic 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 oder 'Farberscheinung und Beleuchtung' angewendet wird.\n\nDefault: Munsell.\nMunsell-Korrektur: behebt Farbabweichungen im Lab-Modus aufgrund von Nichtlinearität, wenn die Chromatizität geändert wird (Uniform Perceptual Lab).\nLab: Wendet eine Gamut-Steuerung an, bei relativer Farbmetrik wird dann Munsell angewendet.\nXYZ +TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Passt Farben an den Arbeitsfarbraum an und wendet die Munsell-Korrektur an (Uniform Perceptual Lab). Voreinstellung: nur Munsell.\n\nnur Munsell: behebt Farbabweichungen im Lab-Modus aufgrund von Nichtlinearität, wenn die Chromatizität geändert wird (Uniform Perceptual Lab).\nLab: Wendet eine Gamut-Steuerung bei relativer Farbmetrik an, danach wird Munsell angewandt.\nXYZ absolut: Wendet eine Gamut-Steuerung bei absoluter Farbmetrik an, danach Munsell wird angewandt.\nXYZ relativ: Wendet eine Gamut-Steuerung bei relativer Farbmetrik an, danach Munsell wird angewandt. Das Ergebnis ist nicht das gleiche wie Lab. TP_LOCALLAB_AVOIDMUN;Nur Munsell-Korrektur TP_LOCALLAB_AVOIDMUN_TOOLTIP;Munsell-Korrektur ist deaktiviert, wenn Jz or CAM16 angewendet wird. TP_LOCALLAB_AVOIDRAD;Radius @@ -2849,15 +2987,18 @@ TP_LOCALLAB_BLURMASK_TOOLTIP;Verwendet eine große Radius-Unschärfe für eine M 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_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_BWEVNONE;Keine +TP_LOCALLAB_BWEVSIG;Aktiviert +TP_LOCALLAB_BWEVSIGLOG;Sigmoid & Log-Kodierung 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_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) angepasst an CAM16(experimentell). 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, z. Bsp. um die Cam16-Verarbeitung mit der maximalen Monitorhelligkeit von 400cd/m² abzustimmen. TP_LOCALLAB_CAM16_FRA;CAM16 Bildanpassungen TP_LOCALLAB_CAMMODE;CAM-Modell TP_LOCALLAB_CAMMODE_CAM16;CAM 16 @@ -2871,8 +3012,8 @@ 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_CHRO46LABEL;Chroma levels 456: Mittel=%1 Hoch=%2 -TP_LOCALLAB_CHROLABEL;Chroma levels 0123: Mittel=%1 Hoch=%2 +TP_LOCALLAB_CHRO46LABEL;Chrominanz Ebenen 456: Mittel=%1 Hoch=%2 +TP_LOCALLAB_CHROLABEL;Chrominanz Ebenen 0123: Mittel=%1 Hoch=%2 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. @@ -2884,8 +3025,8 @@ TP_LOCALLAB_CHROMASK_TOOLTIP;Ändert die Chrominanz der Maske, wenn eine existie 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_CIEC;Ciecam Umgebungs Parameter verwenden +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 @@ -2897,23 +3038,30 @@ 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_SMOOTHFRAME;Lichtdämpfung +TP_LOCALLAB_CIE_SMOOTH_EV;Ev basiert +TP_LOCALLAB_CIE_SMOOTH_GAMMA;Steigungs basiert +TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF;Gamma basiert +TP_LOCALLAB_CIE_SMOOTH_LEVELS;Ebenen +TP_LOCALLAB_CIE_SMOOTH_NONE;Keine 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 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_CLARIJZ_TOOLTIP;Ebenen 0 bis 4 (einschließlich): 'Schärfemaske' ist aktiviert\nEbene 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_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_CLARI_TOOLTIP;Ebenen 0 bis 4 (einschließlich): 'Schärfemaske' ist aktiviert\nEbene 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_COLORDEPREV_TOOLTIP;Die Schaltfläche 'ΔE-Vorschau' in den Einstellungen funktioniert nur, wenn Sie im Menü 'Werkzeug zum aktuellen Punkt hinzufügen' 'Schärfen', 'Weiches Licht und Original-Retinex', 'Weichzeichnen/Körnung und Rauschunterdrückung', 'Dunst entfernen und Retinex' oder 'Kontrast nach Detailstufen' aktiviert haben.\nBei anderen Werkzeugen befindet sich die Schaltfläche 'ΔE-Vorschau' im Werkzeug, die eine Vorschau von ΔE mit mehreren aktivierten Werkzeugen ermöglicht. Verwenden Sie vorzugsweise Maske und Modifikationen. 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_COLORFRAME;Dominierende Farbe 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 @@ -2921,8 +3069,11 @@ TP_LOCALLAB_COLOR_TOOLNAME;Farbe und Licht TP_LOCALLAB_COL_NAME;Name TP_LOCALLAB_COL_VIS;Status TP_LOCALLAB_COMPFRA;Direktionaler Kontrast +TP_LOCALLAB_COMPRCIE;Helligkeits-Kompression +TP_LOCALLAB_COMPRCIETH;Kompression Schwellenwert TP_LOCALLAB_COMPREFRA;Tonwertkorrektur -TP_LOCALLAB_CONTCOL;Schwellenwert Kontrast +TP_LOCALLAB_COMPRLOG_TOOLTIP;Dieser Algorithmus komprimiert die Daten vor der Log-Konvertierung über den Schwellenwert des Schiebereglers. Zu verwenden in Verbindung mit der Weiß-Verteilung. +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. @@ -2945,13 +3096,14 @@ TP_LOCALLAB_CURVNONE;Kurven deaktivieren TP_LOCALLAB_DARKRETI;Dunkelheit TP_LOCALLAB_DEHAFRA;Dunst entfernen TP_LOCALLAB_DEHAZ;Intensität +TP_LOCALLAB_DEHAZE_BLACK;Schwarzpunkt 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_DENOIBILAT_TOOLTIP;Ermöglicht Impulsrauschen zu reduzieren oder auch 'Salz- u. 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 @@ -2971,6 +3123,7 @@ TP_LOCALLAB_DETAIL;Lokaler Kontrast TP_LOCALLAB_DETAILFRA;Kantenerkennung DCT TP_LOCALLAB_DETAILSH;Details TP_LOCALLAB_DETAILTHR;Schwelle Luminanz-Chrominanz-Detail +TP_LOCALLAB_DISAB_CIECAM;Deaktiviere Ciecam oder Jz-Umgebung TP_LOCALLAB_DIVGR;Gamma TP_LOCALLAB_DUPLSPOTNAME;Kopie TP_LOCALLAB_EDGFRA;Kantenschärfe @@ -2979,6 +3132,7 @@ 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_ENABLE_MASKALL;alle Maskierungswerkzeuge aktivieren 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 @@ -2994,27 +3148,28 @@ 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_EXCLUTYPE_TOOLTIP;Normaler Spot verwendet rekursive Daten.\n\nDurch Ausschließen des Spots werden alle selektiven Bearbeitungen neu initialisiert.\nKann verwendet werden, um eine vorherige Aktion ganz oder teilweise abzubrechen oder um Vorgänge im umgekehrten Modus auszuführen.\nVerwenden Sie 'Bereich' (Ausschließen), um die Ausschlussintensität festzulegen.\n\n'Vollbild' ermöglicht Ihnen, die selektiven Bearbeitungstools auf das gesamte Bild anzuwenden.\nDie RT-Spot-Begrenzer werden über die Bildvorschaugrenzen hinaus gesetzt.\nDer Übergang wird auf 100 eingestellt.\nHinweis: Mö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.\n\n'Global' ermöglicht Ihnen, die selektiven Bearbeitungstools auf das gesamte Bild anzuwenden, ohne Delta E oder Übergänge zu verwenden. TP_LOCALLAB_EXECLU;Ausschließender Spot TP_LOCALLAB_EXFULL;Gesamtes Bild +TP_LOCALLAB_EXMAIN;Global 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;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_EXPCONTRASTPYR_TOOLTIP;Siehe Dokumentation für Wavelet-Ebenen.\nEs gibt einige Unterschiede in der Version des selektiven Editierens, welche mehr Werkzeuge und mehr Möglichkeiten an individuellen Detailebenen zu arbeiten anbietet.\nz.B. Wavelet-Ebenen-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 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_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-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_EXPMERGEFILE_TOOLTIP;Ermöglicht die Verwendung von GIMP oder Photoshop-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. @@ -3028,9 +3183,11 @@ 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_FATSAT;Sättigungskontrolle 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_FEATVALUE_MASK;Verlaufsbreite (Maske Verlaufsfilter ) 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 @@ -3097,8 +3254,8 @@ TP_LOCALLAB_JZ100_TOOLTIP;Passt automatisch den Referenz-Jz-Pegel von 100 cd/m2 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_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. @@ -3113,7 +3270,7 @@ TP_LOCALLAB_JZLOGWB_TOOLTIP;Wenn Auto aktiviert ist, werden die Ev-Werte und die 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_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 Luminanz' 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 @@ -3126,7 +3283,7 @@ 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_LABEL;Selektives Editieren TP_LOCALLAB_LABGRID;Farbkorrektur TP_LOCALLAB_LABGRIDMERG;Hintergrund TP_LOCALLAB_LABGRID_VALUES;oben(a)=%1\noben(b)=%2\nunten(a)=%3\nunten(b)=%4 @@ -3170,9 +3327,11 @@ TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;Berechnet automatisch die 'Mittlere Luminanz' 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_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 die Lichtquelle des Ausgabegeräts an. +TP_LOCALLAB_LOGCIE;LOG-Kodierung +TP_LOCALLAB_LOGCIEQ;LOG-Kodierung Q (mit Ciecam) +TP_LOCALLAB_LOGCIEQ_TOOLTIP;Aktivierung der Checkbox erlaubt die Wahl zwischen LOG-Kodierung basierend auf den 3 RGB Kanälen, und LOG-Kodierung basierend auf dem Ciecam’s Helligkeit (Q) Kanal.\nDie Verwendung des Q Kanals anstatt der RGB Kanäle hilft, unerwünschte Kanteneffekte, wie Farbton- und Sättigungsverschiebungen zu vermeiden.\nJedoch sind die Einstellungen schwieriger zu optimieren, weil Q unbeschränkt ist und Ciecam die Daten unter Berücksichtigung der Umgebungsbedingungen, gleichzeitig Kontrast, etc. anpasst.\nEs könnten folgende Anpassungen erforderlich werden:\n Szene-Bedingungen: Mittlere Helligkeit (Yb), Weiß- & Schwarzverteilung, Schwarz Ev, Weiß Ev.\n Quelldaten Anpassungen: Helligkeitskompression, Stärke.\n\nHinweis: Wenn LOG-Kodierung (Q) verwendet wird, sollte die Option 'Ciecam deaktivieren' unter Szene Bedingungen, Menu Umgebung nicht aktiviert werden. +TP_LOCALLAB_LOGCIE_TOOLTIP;Ermöglicht die Verwendung von 'Schwarz-Ev', 'Weiß-Ev', 'Weiß- und Schwarz-Verteilung', 'Szenen-Mittlere-Leuchtdichte (Yb%)' und 'sichtbare mittlere Leuchtdichte (Yb%)' für die Tonzuordnung mit 'LOG-Kodierung' mit Helligkeitskompression. 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) @@ -3180,7 +3339,7 @@ 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_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 @@ -3188,11 +3347,12 @@ 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_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_LOGPFRA2;Einstellungen Log-Kodierung 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. @@ -3207,13 +3367,13 @@ 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_LUMLABEL;Luminanz Ebenen 0123: Mittel=%1 Hoch=%2 +TP_LOCALLAB_LUMLABEL;Luminanz Ebenen 0123: Mittel=%1 Hoch=%2 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_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 @@ -3237,9 +3397,9 @@ 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_MASKLCTHRMID;Luminanz Graubereiche TP_LOCALLAB_MASKLCTHRMIDCH;Chrominanz Graubereiche -TP_LOCALLAB_MASKLC_TOOLTIP;Wird von der Wavelet-Luminanz verwendet.\nDamit können Sie die Rauschunterdrückung basierend auf den Bildluminanzinformationen festlegen, die in der L(L)- oder LC(H)-Maske (Maske und Modifikationen) enthalten sind.\nDie L(L)-Maske oder die LC(H)-Maske muss aktiviert sein, m diese Funktion nutzen zu können.\n„Schwellenwert für die Luminanz dunkler Bereiche“. Ist „Rauschunterdrückung in dunklen und hellen Bereichen verstärken“ > 1, wird die Rauschunterdrückung schrittweise von 0 % auf 100 % beim maximalen Schwarzwert (bestimmt durch die Maske) erhöht.\n„Schwellenwert für die Luminanz für helle Bereiche“. Die Rauschunterdrückung wird schrittweise von 100 % auf 0 % beim maximalen Weißwert (bestimmt durch die Maske) verringert.\n Im Bereich zwischen den beiden Schwellenwerten werden die Rauschunterdrückungseinstellungen von der Maske nicht beeinflusst. +TP_LOCALLAB_MASKLC_TOOLTIP;Wird von der Wavelet-Luminanz verwendet.\nDamit können Sie die Rauschunterdrückung basierend auf den Bildluminanzinformationen festlegen, die in der L(L)- oder LC(H)-Maske (Maske und Modifikationen) enthalten sind.\nDie L(L)-Maske oder die LC(H)-Maske muss aktiviert sein, m diese Funktion nutzen zu können.\n'Schwellenwert für die Luminanz dunkler Bereiche'. Ist 'Rauschunterdrückung in dunklen und hellen Bereichen verstärken' > 1, wird die Rauschunterdrückung schrittweise von 0 % auf 100 % beim maximalen Schwarzwert (bestimmt durch die Maske) erhöht.\n'Schwellenwert für die Luminanz für helle Bereiche'. Die Rauschunterdrückung wird schrittweise von 100 % auf 0 % beim maximalen Weißwert (bestimmt durch die Maske) verringert.\n Im Bereich zwischen den beiden Schwellenwerten werden die Rauschunterdrückungseinstellungen 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. @@ -3262,7 +3422,7 @@ TP_LOCALLAB_MASKRESRETI_TOOLTIP;Wird verwendet, um den Effekt der Retinex-Einste 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_MASKUNUSABLE;Maske deaktiviert (aktivieren unter 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 Spot auch duplizieren und nahe am ersten Punkt platzieren. Die kleinen Abweichungen in den Punktreferenzen ermöglichen Feineinstellungen. TP_LOCALLAB_MEDIAN;Median niedrig @@ -3298,6 +3458,7 @@ 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_MIDTCIE;Mitteltöne 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 @@ -3345,10 +3506,15 @@ TP_LOCALLAB_ORRETISTREN_TOOLTIP;Wirkt basierend auf dem Laplace-Schwellwert. Je 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_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_PRECAMGAMUT_TOOLTIP;Wenn aktiviert, wird eine Gamut-Kontrolle nach der Konvertierung nach XYZ durchgeführt. +TP_LOCALLAB_PRECAMREFIMAIN_TOOLTIP;Ermöglicht, den Weiß-Punkt so zu bewegen, dass er sich der Dominanzfarbe annähert. Diese Aktion modifiziert die Reinheit. In Kombination mit 'Shift x' und 'Shift y' kann eine moderate Farbtönung vorgenommen werden. +TP_LOCALLAB_PRECAMREFI_TOOLTIP;Ermöglicht, den Weiß-Punkt so zu bewegen, dass er sich der Dominanzfarbe annähert. Diese Aktion modifiziert die Reinheit. +TP_LOCALLAB_PRECAM_TOOLTIP; „Quelldatenanpassungen“ ändert den Dynamikbereich mithilfe der Log-Kodierung, der Töne des Bildes und der Primärfarben (vereinfachtes abstraktes Profil) und der Mitteltöne direkt vor dem Ciecam-Prozess. Diese Werte sind anpassbar:\nGamma: Wirkt hauptsächlich auf helle Töne\nSteigung: Wirkt hauptsächlich auf dunkle Töne. Sie können jedes beliebige Paar aus Gamma und Steigung wählen (Werte >1) und der Algorithmus stellt sicher, dass zwischen den linearen und parabolischen Teilen der Kurve Kontinuität besteht.\nZielprimärfarben: Ermöglicht Ihnen, die Zielprimärfarben zu ändern, um die Bildfarbe (Sättigung) wiederherzustellen oder zu ändern. Die Farbbalance bleibt weitgehend erhalten, wenn das „Arbeitsprofil“ und die „Zielprimärfarben“ ähnlich sind. Das „Arbeitsprofil“ wird nicht geändert. Sie können auch die Primärfarben und die Lichtquelle (Weißpunkt) fein anpassen. Wenn Sie eine Primärfarbe vom Weißpunkt weg verschieben, wird die Sättigung reduziert und umgekehrt. Achten Sie auf den Farbumfang. TP_LOCALLAB_PREVHIDE;Mehr Einstellungen ausblenden TP_LOCALLAB_PREVIEW;Vorschau ΔE TP_LOCALLAB_PREVSHOW;Mehr Einstellungen einblenden +TP_LOCALLAB_PRIMILLFRAME;Primärfarben und Lichtquelle TP_LOCALLAB_PROXI;Zerfallrate (ΔE) TP_LOCALLAB_QUAAGRES;Aggressiv TP_LOCALLAB_QUACONSER;Konservativ @@ -3367,7 +3533,7 @@ 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_REPAREXP_TOOLTIP;Ermöglicht, die relative Stärke von 'Dynamik 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. @@ -3379,7 +3545,7 @@ 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_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. @@ -3397,6 +3563,7 @@ TP_LOCALLAB_RGBCURVE_TOOLTIP;Im RGB-Modus gibt es 4 Möglichkeiten: 'Standard', 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_SATCIE;Kontrolle Sättigung TP_LOCALLAB_SATUR;Sättigung TP_LOCALLAB_SATURV;Sättigung (s) TP_LOCALLAB_SCALEGR;Korngröße @@ -3422,7 +3589,7 @@ TP_LOCALLAB_SHAMASKCOL;Schatten TP_LOCALLAB_SHAPETYPE;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_SHARBLUR;Unschärferadius TP_LOCALLAB_SHARDAMPING;Dämpfung TP_LOCALLAB_SHARFRAME;Veränderungen TP_LOCALLAB_SHARITER;Iterationen @@ -3463,17 +3630,41 @@ 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_SIGBLACKSSCIE;Schwarz-Verteilung +TP_LOCALLAB_SIGCIE;Sigmoid +TP_LOCALLAB_SIGFRA;Sigmoid Q +TP_LOCALLAB_SIGGAMJCIE;Gamma TP_LOCALLAB_SIGJZFRA;Sigmoid Jz TP_LOCALLAB_SIGMAWAV;Dämpfungsreaktion +TP_LOCALLAB_SIGMOID16_TOOLTIP;Erlaubt mit 'Ciecam' und 'Sigmoid Q' den Anschein einer Tonwertkorrektur zu simulieren. Sigmoid Q hat 3 Schieber:\na) Kontrast wirkt sich auf die Form der Sigmoid Kurve und in der Konsequenz auf dei Stärke aus\nb) Schwellenwert (Graupunkt) verteilt die Action hinsichtlich der Helligkeit\nc) Wichtung: Anpassung der Wirkung der Sigmoidfunktion auf die interne Exponentialfunktion. TP_LOCALLAB_SIGMOIDBL;Überlagern TP_LOCALLAB_SIGMOIDLAMBDA;Kontrast -TP_LOCALLAB_SIGMOIDQJ;Schwarz-Ev und Weiß-Ev verwenden +TP_LOCALLAB_SIGMOIDLOGAUTO;Auto Schwellenwert +TP_LOCALLAB_SIGMOIDLOGEV_TOOLTIP;Wenn in der Combo-Box 'Schwarz-Ev und Weiß-Ev' 'Sigmoid und Log Kodierung' aktiviert ist, anstatt 'nur Sigmoid', werden beide Algorithmen gemeinsam verarbeitet. +TP_LOCALLAB_SIGMOIDNORMCIE;Luminanz normalisieren +TP_LOCALLAB_SIGMOIDNORMCIEBLEND_TOOLTIP;Überlagern wirkt sich auf das endgültige Aussehen des Bildes, Kontrast und Leuchtdichte aus. Verhältnis zwischen Original- und Ausgabebild. +TP_LOCALLAB_SIGMOIDNORMCIE_TOOLTIP;Rekonstruiert die Luminanz, sodass Mittelwert und Varianz des Ausgabebildes denen des Originals entsprechen.\nAlle auf J oder Q einwirkenden Anpassungen werden berücksichtigt, einschließlich derjenigen, die nicht relativ zu Sigmoid Q sind. +TP_LOCALLAB_SIGMOIDQJ;Schwarz-Ev und Weiß-Ev +TP_LOCALLAB_SIGMOIDQJCOMPRCIE_TOOLTIP;Wenn in der Combobox-Auswahl 'Schwarz-Ev und Weiß-Ev‘ die Option 'Sigmoid- und LOG-Kodierung Q' oder 'LOG-Kodierung statt Sigmoid' aktiviert ist, komprimiert dieser Algorithmus die Daten über den Schwellenwert-Schiebereglerwert. Der letzte Wert steht für die Helligkeit (Q) und sollte so nahe wie möglich am Wert „Komprimierungsschwelle“ liegen (berechnet, wenn ‚Automatischer Schwellenwert‘ aktiviert ist, oft > 1). +TP_LOCALLAB_SIGMOIDSENSI;Anpassungsfähigkeit TP_LOCALLAB_SIGMOIDTH;Schwellenwert (Graupunkt) +TP_LOCALLAB_SIGMOIDWHITESCIE_TOOLTIP;Ermöglicht Ihnen im Automatikmodus, wenn der Dynamikbereich des Bildes hoch ist, die Lichtverteilung in Weiß und tiefem Schwarz zu ändern.\nKann mit LOG-Kodierung oder Sigmoid mit aktiviertem Schwarz- und Weiß-Ev verwendet werden.\n\nDer Algorithmus ändert die Basisdaten nicht, sondern wirkt auf die Komponenten ein, die zur Berechnung des Dynamikbereichs, des Schwarz-Ev, des Weiß-Ev und des Graupunkts erforderlich sind. 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_SIGSLOPJCIE;Steigung +TP_LOCALLAB_SIGTRCCIE;Quellen-Daten-Anpassung +TP_LOCALLAB_SIGWHITESCIE;Weiß-Verteilung 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_SLOPESMOOTH;Grau-Balance (Steigung) +TP_LOCALLAB_SLOPESMOOTHB;Blau-Balance (Steigung) +TP_LOCALLAB_SLOPESMOOTHG;Grün-Balance (Steigung) +TP_LOCALLAB_SLOPESMOOTHR;Rot-Balance (Steigung) TP_LOCALLAB_SLOSH;Steigung +TP_LOCALLAB_SMOOTHCIE;Glanzlichtdämpfung +TP_LOCALLAB_SMOOTHCIE_LUM;Helligkeitsmodus +TP_LOCALLAB_SMOOTHCIE_SCA;Skalierung Yb Szene +TP_LOCALLAB_SMOOTHCIE_TOOLTIP;Schließt die Verarbeitung durch Gamma, Neigung und Mitteltöne ab, indem eine leichte Abschwächung der Lichter bewirkt wird. Bitte beachten Sie, dass dies die Rekonstruktion von Glanzlichtern nicht ersetzt.\n\nGamma-basiert und Neigungsbasiert (Standard und Erweitert) ermöglichen Ihnen die Simulation einer Tonwertzuordnung mithilfe von:\na) Szenenbedingungen: Schwarz-Ev, Weiß-Ev, mittlere Leuchtdichte (Yb%)\nb) Betrachtungsbedingungen: mittlere Leuchtdichte (Yb%).\n\nDie Yb-Szenenskala ist eine Funktion von Weiß-Ev. +TP_LOCALLAB_SMOOTHCIE_YB;Skalierung Yb Ansicht 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. @@ -3495,13 +3686,14 @@ 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_STRENGTHCIELOG;Stärke 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 stehen für Maske 'Unschärfe und Rauschreduzierung' und Maske 'Farbe & Licht' zur Verfügung. +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 stehen für Maske 'Unschärfe und Rauschreduzierung' und Maske 'Farbe & Licht' zur Verfügung. 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. @@ -3533,11 +3725,12 @@ 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_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_TRCFRAME;Farbtonkennlinie & Mitteltöne TP_LOCALLAB_USEMASK;Laplace TP_LOCALLAB_VART;Varianz (Kontrast) TP_LOCALLAB_VIBRANCE;Farbtemperatur @@ -3568,7 +3761,7 @@ TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Bereich der Wavelet-Ebenen, die im gesamten 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_WAVESHOW_TOOLTIP;Zeigt alle Werkzeuge zum 'Kantenschärfen' an. Es wird empfohlen, die Dokumentation zu Wavelet-Ebenen 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. @@ -3583,7 +3776,7 @@ TP_LOCALLAB_WAVCONTF_TOOLTIP;Ähnlich wie bei Kontrast nach Detailebenen. Feine 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_WAVEEDG_TOOLTIP;Verbessert die Schärfe durch gezielte lokale Kontrastwirkung an den Kanten. Es hat die gleichen Funktionen wie das entsprechende Modul in Wavelet-Ebenen 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. @@ -3837,7 +4030,7 @@ 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 Ü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;Übertragungszuordnung 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 @@ -4024,7 +4217,7 @@ TP_WAVELET_DAUBLOCAL;Wavelet Kantenperformance TP_WAVELET_DAUB_TOOLTIP;Ändert den Daubechies-Koeffizienten:\nD4 = Standard\nD14 = Häufig bestes Ergebnis auf Kosten von ca. 10% längerer Verarbeitungszeit.\n\nVerbessert die Kantenerkennung sowie die Qualität der ersten Waveletebene. Jedoch hängt die Qualität nicht ausschließlich mit diesem Koeffizienten zusammen und kann je nach Bild und Einsatz variieren. TP_WAVELET_DEN5THR;Schwellenwert TP_WAVELET_DENCURV;Kurve -TP_WAVELET_DENL;Korrektur Struktur +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. @@ -4082,7 +4275,7 @@ 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_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 @@ -4150,7 +4343,7 @@ 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_SHOWMASK;Wavelet 'Maske' anzeigen TP_WAVELET_SIGM;Radius TP_WAVELET_SIGMA;Dämpfungsreaktion TP_WAVELET_SIGMAFIN;Dämpfungsreaktion @@ -4164,7 +4357,7 @@ TP_WAVELET_STREN;Intensität TP_WAVELET_STREND;Intensität TP_WAVELET_STRENGTH;Intensität TP_WAVELET_SUPE;Extra -TP_WAVELET_THR;Schwelle Schatten +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 @@ -4191,7 +4384,7 @@ TP_WAVELET_WAVOFFSET;Versatz TP_WBALANCE_AUTO;Automatisch TP_WBALANCE_AUTOITCGREEN;Temperaturbezogen TP_WBALANCE_AUTOOLD;RGB grau -TP_WBALANCE_AUTO_HEADER;Automatisch & Verfeinern +TP_WBALANCE_AUTO_HEADER;Automatisch & Verfeinern TP_WBALANCE_CAMERA;Kamera TP_WBALANCE_CLOUDY;Bewölkt TP_WBALANCE_CUSTOM;Benutzerdefiniert @@ -4218,11 +4411,11 @@ TP_WBALANCE_FLUO_HEADER;Leuchtstofflampe TP_WBALANCE_GREEN;Tönung TP_WBALANCE_GTI;GTI TP_WBALANCE_HMI;HMI -TP_WBALANCE_ITCWALG_TOOLTIP;Ermöglicht Ihnen, wenn möglich, zur anderen alternativen Temperatur (Alt_temp) zu wechseln.\nInaktiv im Fall der "Einzelauswahl". +TP_WBALANCE_ITCWALG_TOOLTIP;Ermöglicht Ihnen, wenn möglich, zur anderen alternativen Temperatur (Alt_temp) zu wechseln.\nInaktiv im Fall der 'Einzelauswahl'. TP_WBALANCE_ITCWBDELTA_TOOLTIP;Für jede versuchte "grüne" Iteration wurde der zu berücksichtigende Temperaturunterschied festgelegt. TP_WBALANCE_ITCWBFGREEN_TOOLTIP;Finden Sie den besten Kompromiss zwischen Kandidat und Grün. TP_WBALANCE_ITCWBMINSIZEPATCH_TOOLTIP;Ermöglicht Ihnen, den minimalen Patch-Wert festzulegen. Zu niedrige Werte können zu einer fehlenden Korrelation führen. -TP_WBALANCE_ITCWBNOPURPLE_TOOLTIP;Ermöglicht das Filtern von Magenta-/Lila-Daten aus dem Bild. Wenn das Kontrollkästchen aktiviert ist, wird ein Filter angewendet, der den Wert von Y begrenzt. Standardmäßig beträgt dieser Wert 0,4. Sie können es in "Optionen" Itcwb_Ypurple ändern (maximal 1). +TP_WBALANCE_ITCWBNOPURPLE_TOOLTIP;Ermöglicht das Filtern von Magenta-/Lila-Daten aus dem Bild. Wenn das Kontrollkästchen aktiviert ist, wird ein Filter angewandt, der den Wert von Y begrenzt. Standardmäßig beträgt dieser Wert 0,4. Sie können es in 'Optionen' Iterativer temperaturbezogener Weißabgleich Y lila ändern (maximal 1). TP_WBALANCE_ITCWBPRECIS_TOOLTIP;Je niedriger der Wert, desto relevanter sind die Daten, aber desto länger dauert die Verarbeitung. Da die Verarbeitungszeit gering ist, sollte dieser Parameter grundsätzlich auf dem Standardwert bleiben können. TP_WBALANCE_ITCWBRGREEN_TOOLTIP;Legt die Amplitude der Grünwertüberprüfung in Iterationen fest, von der niedrigen Amplitude 0,82 bis 1,25 bis zur maximalen Amplitude 0,4 bis 4. TP_WBALANCE_ITCWBSIZEPATCH_TOOLTIP;Definiert die Anzahl der Farben die vom Algorithmus verwendet werden. @@ -4234,11 +4427,12 @@ TP_WBALANCE_ITCWB_DELTA;Delta-Temperatur in der Grün-Schleife TP_WBALANCE_ITCWB_FGREEN;Ermittle den Grün-Kandidaten TP_WBALANCE_ITCWB_FORCED;Annähernd vollständiges CIE-Diagramm TP_WBALANCE_ITCWB_FRA;Einstellungen Auto-Temperatur-Korrelation -TP_WBALANCE_ITCWB_FRA_TOOLTIP;Diese Einstellungen ermöglichen je nach Bildart (Rohtyp, Farbmetrik usw.) eine Anpassung des Algorithmus "Temperaturkorrelation". Es gibt keine absolute Regel, die diese Parameter mit den erzielten Ergebnissen verknüpft. +TP_WBALANCE_ITCWB_FRA_TOOLTIP;Diese Einstellungen ermöglichen je nach Bildart (Rohtyp, Farbmetrik usw.) eine Anpassung des Algorithmus 'Temperaturkorrelation'. Es gibt keine absolute Regel, die diese Parameter mit den erzielten Ergebnissen verknüpft. TP_WBALANCE_ITCWB_MINSIZEPATCH;Patch Minimalgröße TP_WBALANCE_ITCWB_NOPURPLE;Filter auf Violett -TP_WBALANCE_ITCWB_PRIM_ACE;Erzwingt die Verwendung des vollständiigen CIE-Diagrammes -TP_WBALANCE_ITCWB_PRIM_ADOB;Mittlere Abttastung +TP_WBALANCE_ITCWB_PRECIS;Präzisions-Algorithm - skaliert +TP_WBALANCE_ITCWB_PRIM_ACE;Erzwingt die Verwendung des vollständigen CIE-Diagrammes +TP_WBALANCE_ITCWB_PRIM_ADOB;Mittlere Abtastung TP_WBALANCE_ITCWB_PRIM_BETA;Mittlere Abtastung (Standard) - nahe der Farbskala des Zeigers TP_WBALANCE_ITCWB_PRIM_JDCMAX;Annähernd vollständiges CIE-Diagramm TP_WBALANCE_ITCWB_PRIM_REC;Hohe Abtastung @@ -4247,12 +4441,13 @@ TP_WBALANCE_ITCWB_PRIM_XYZCAM;Kamera-XYZ-Matrix TP_WBALANCE_ITCWB_PRIM_XYZCAM2;JDCmax nach Kamera XYZ-Matrix TP_WBALANCE_ITCWB_RGREEN;Grün-Bereich TP_WBALANCE_ITCWB_SAMPLING;Niedrige Abtastung 5.9 +TP_WBALANCE_ITCWB_SIZE;Größe der Referenzfarbe im Vergleich zum Histogramm TP_WBALANCE_ITCWB_SIZEPATCH;Größe des Farb-Patches TP_WBALANCE_ITCWB_THRES;Verwendete Farben (Voreingestellt) -TP_WBALANCE_ITCWCUSTOM_TOOLTIP;Ermöglicht Ihnen die Verwendung benutzerdefinierter Einstellungen für Temperatur und Grün (Tönung).\n\nNutzungstipps:\n1) Starten Sie Itcwb und aktivieren Sie "Benutzerdefinierte Temperatur und Tönung verwenden".\n2) Stellen Sie "Temperatur und Tönung" nach Ihren Wünschen ein: frei, auswählen ,...(Benutzerdefiniert)\n3) Gehen Sie zurück zu "Temperaturkorrelation".\n\nSie können nicht verwenden: 2 Durchgänge, AWB-Temperatur-Bias, Grün-Verfeinerung. +TP_WBALANCE_ITCWCUSTOM_TOOLTIP;Ermöglicht Ihnen die Verwendung benutzerdefinierter Einstellungen für Temperatur und Grün (Tönung)\n\nnicht zur Verfügung stehen: 2 Durchgänge, AWB-Temperatur-Bias, Grün-Verfeinerung. TP_WBALANCE_ITCWFORCED_TOOLTIP;Standardmäßig (Kontrollkästchen nicht aktiviert) werden die während der Abtastung gescannten Daten auf das sRGB-Profil zurückgeführt, das am weitesten verbreitet ist, sowohl für die Kalibrierung von DCP- oder ICC-Profilen mit dem Colorchecker24 als auch für die Verwendung im Internet.\nWenn Sie Bilder mit sehr hohem Farbumfang haben (einige Blumen, künstliche Farben), kann es erforderlich sein, das gesamte CIExy-Diagramm zu verwenden. Das verwendete Profil ist ACESP0. In diesem zweiten Fall ist die Anzahl der Farben, die innerhalb des Algorithmus verwendet werden können, wichtiger. TP_WBALANCE_ITCWGREEN;Grün-Verfeinerung -TP_WBALANCE_ITCWGREEN_TOOLTIP;Verändert die Grün-Tönung als Referenz für den Algorithmus. Es hat im Wesentlichen die gleiche Rolle für Grün wie die "AWB-Temperaturabweichung" für die Temperatur.\nDer gesamte Algorithmus wird neu berechnet. +TP_WBALANCE_ITCWGREEN_TOOLTIP;Verändert die Grün-Tönung als Referenz für den Algorithmus. Es hat im Wesentlichen die gleiche Rolle für Grün wie die 'AWB-Temperaturabweichung' für die Temperatur.\nDer gesamte Algorithmus wird neu berechnet. TP_WBALANCE_ITCWPRIM_TOOLTIP;Ermöglicht die Auswahl der Bildabtastung.\n'Annähernd vollständiges CIE-Diagramm' verwendet fast die auf dem Sensor vorhandenen Daten, möglicherweise einschließlich der imaginären Farben.\n'Kamera-XYZ-Matrix' – verwendet die direkt von der Farbmatrix abgeleitete Matrix.\n'Mittlere Abtastung (Standard) - nahe der Farbskala des Zeigers' entspricht im Wesentlichen den häufigsten Fällen des menschlichen Sehens.\nMit 'Geringe Abtastung und keine Kameraeinstellungen verwenden' können Sie Teile des Bildes mit hoher Farbskala isolieren und den Algorithmus zwingen, die Kameraeinstellungen in einigen Fällen (Tönung > 0,8,...) zu ignorieren. Dies wird sich natürlich auf das Ergebnis auswirken.\n\nDieses Sampling hat nur einen Einfluss auf die Kanalmultiplikatoren, es hat nichts mit dem "Arbeitsprofil" zu tun und verändert nicht die Farbskala des Bildes. TP_WBALANCE_ITCWSAMPLING_TOOLTIP;Ermöglicht die Verwendung des alten Sampling-Algorithmus, um eine bessere Kompatibilität mit 5.9 sicherzustellen. Dazu muss Beobachter 10° (Standard) aktiviert sein. TP_WBALANCE_JUDGEIII;JudgeIII @@ -4265,7 +4460,7 @@ TP_WBALANCE_METHOD;Methode TP_WBALANCE_MULLABEL;Multiplikatoren: r=%1 g=%2 b=%3 TP_WBALANCE_MULLABEL_TOOLTIP;Die Werte dienen der Information, sie können nicht geändert werden. TP_WBALANCE_OBSERVER10;Beobachter 10° anstatt Beobachter 2° -TP_WBALANCE_OBSERVER10_TOOLTIP;Das Farbmanagement in Rawtherapee (Weißabgleich, Kanalmultiplikatoren, Lichter-Rekonstruktion,...) nutzt die Spektraldaten der Leuchtmittel und Farben. Der Beobachter ist ein wichtiger Parameter dieses Managements, der den Wahrnehmungswinkel des Auges berücksichtigt. Im Jahr 1931 wurde er auf 2° festgelegt (privilegiert die Verwendung der Kegel). Im Jahr 1964 wurde er auf 10° festgelegt (privilegiert die Verwendung der Zapfen, berücksichtigt jedoch teilweise die Stäbchen).\nIm Falle einer (seltenen) Drift der Farben aufgrund des Beobachters 10° – wahrscheinlich aufgrund der Konvertierungsmatrix – muss Beobachter 2° ausgewählt werden.\nIn den meisten Fällen ist Beobachter 10° (Standard) die bessere Wahl. +TP_WBALANCE_OBSERVER10_TOOLTIP;Das Farbmanagement in RawTherapee (Weißabgleich, Kanalmultiplikatoren, Lichter-Rekonstruktion,...) verwendet die Spektraldaten der Lichtquellen und Farben. Der Beobachter ist ein wichtiger Parameter dieses Managements, der den Wahrnehmungswinkel des Auges berücksichtigt. Im Jahr 1931 wurde er auf 2° festgelegt (privilegiert die Verwendung der Zapfen). Im Jahre 1964 wurde er auf 10° festgelegt (privilegiert die Verwendung der Zapfen, berücksichtigt aber teilweise die Stäbchen). \nIm seltenen Fall einer Farbdrift mit 'Beobachter 2°' (wahrscheinlich aufgrund der Konvertierungsmatrix) muss 'Beobachter 10°' ausgewählt werden. TP_WBALANCE_PATCHLABEL;Gelesene Farben: %1 Patch Chroma: %2 Größe= %3 TP_WBALANCE_PATCHLABEL_TOOLTIP;Zeigt die Anzahl der gelesenen Farben an (max. = 237).\nZeigt die berechnete Patch-Chroma an.\nAWB-Temperaturabweichung. Versuchen Sie, diesen Wert zu reduzieren. Ein Minimum scheint den Algorithmus zu optimieren.\n\nPatch-Größe passt zur Chroma-Optimierung. TP_WBALANCE_PATCHLEVELLABEL;Patch: ΔE= %1 - Daten x 9 Min: %2 Max= %3 @@ -4296,33 +4491,14 @@ ZOOMPANEL_ZOOMFITCROPSCREEN;Ausschnitt an Bildschirm anpassen.\nTaste: f ZOOMPANEL_ZOOMFITSCREEN;An Bildschirm anpassen.\nTaste: Alt + f ZOOMPANEL_ZOOMIN;Hineinzoomen\nTaste: + ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - -//TP_WBALANCE_ITCWBNOPURPLE_TOOLTIP;By default when "Inpaint opposed" is activated, purple colors are not taken into account. However, if the image does not need highlight reconstruction, or if this image naturally contains purple tints (flowers, etc.), it may be necessary to deactivate, to take into account all the colors. -//TP_WBALANCE_ITCWB_FORCED;Forces use of the entire CIE diagram !!!!!!!!!!!!!!!!!!!!!!!!! ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -!ERROR_MSG_METADATA_VALUE;Metadata: error setting %1 to %2 -!HISTORY_MSG_LOCAL_TMO_SATUR;Local Exp Fattal Saturation -!HISTORY_MSG_WBITC_DELTA;Itcwb Delta green -!HISTORY_MSG_WBITC_FGREEN;Itcwb Green - student -!HISTORY_MSG_WBITC_FORCE;Itcwb Force -!HISTORY_MSG_WBITC_NOPURPLE;Itcwb Nopurple -!HISTORY_MSG_WBITC_PONDER;Itcwb ponderated -!HISTORY_MSG_WBITC_PRECIS;Itcwb Precision -!HISTORY_MSG_WBITC_RGREEN;Itcwb Green range !HISTORY_MSG_WBITC_SAMPLING;Low sampling -!HISTORY_MSG_WBITC_SIZE;Itcwb Size -!HISTORY_MSG_WBITC_SORTED;Itcwb ponderated -!HISTORY_MSG_WBITC_THRES;Itcwb Threshold -!PREFERENCES_WBAFORC;Forces Extra algoritm !PREFERENCES_WBAGREENDELTA;Delta temperature in green iterate loop (if Force Extra enabled) -!PREFERENCES_WBANOPURP;No purple color used !PREFERENCES_WBAPATCH;Number maximum of colors used in picture -!PREFERENCES_WBAPRECIS;Precision algorithm - scale used !PREFERENCES_WBASIZEREF;Size of reference color compare to size of histogram color -!PREFERENCES_WBASORT;Sort in chroma order instead of histogram -!TP_LOCALLAB_FATSAT;Saturation control -!TP_WBALANCE_ITCWB_PRECIS;Precision algorithm - scale used -!TP_WBALANCE_ITCWB_SIZE;Size of ref. color compare to histogram +!//TP_WBALANCE_ITCWBNOPURPLE_TOOLTIP;By default when "Inpaint opposed" is activated, purple colors are not taken into account. However, if the image does not need highlight reconstruction, or if this image naturally contains purple tints (flowers, etc.), it may be necessary to deactivate, to take into account all the colors. +!//TP_WBALANCE_ITCWB_FORCED;Forces use of the entire CIE diagram diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index f03dbd1af..b96535923 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -80,6 +80,11 @@ 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_ICM_REFI;Refinement Colours +HISTORY_MSG_ICM_SHIFTX;Refinement Colours - Shift x +HISTORY_MSG_ICM_SHIFTY;Refinement Colours - Shift y +HISTORY_MSG_LOCAL_CIE_REFI;Local - CIECAM Refinement colours +HISTORY_MSG_LOCAL_FEATHERCOL;Local - Colour Gradient feather HISTORY_MSG_LOCAL_GAMUTMUNSEL;Local - SC - Avoid Colour Shift HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid colour shift HISTORY_MSG_SH_COLORSPACE;S/H - Colourspace @@ -107,6 +112,7 @@ PREFERENCES_MENUGROUPLABEL;Group 'Colour label' PREFERENCES_MONPROFILE;Default colour profile PREFERENCES_PRTPROFILE;Colour profile PREFERENCES_TAB_COLORMGR;Colour Management +PREFERENCES_THUMBNAIL_RANK_COLOR_MODE;Load/Save thumbnail rank and colour from/to XMP sidecars PREFERENCES_WBACORR_TOOLTIP;These settings allow, depending on the images (type of raw file, colourimetry, etc.), an adaptation of the " Temperature correlation " algorithm in order to obtain the best overall results. There is no absolute rule, linking these parameters to the results obtained.\n\nThe settings are of 3 types: \n* those accessible to the user from the GUI.\n* those accessible only in reading from each pp3 file : Itcwb_minsize=20, Itcwb_delta=4 Itcwb_rgreen=1 Itcwb_nopurple=false (See Rawpedia)\n* those accessible to the user in 'options' (see Rawpedia)\n You can use "Awb temperature bias" and "Green refinement" to adjust the results. Each movement of these commands brings a new calculation of temperature, tint and correlation.\n\nPlease note that the 3 indicators 'Correlation factor', 'Patch chroma' and ΔE are given for information only. It is not because one of these indicators is better that the result will necessarily be better. PREFERENCES_WBANOPURP;No purple colour used PREFERENCES_WBAPATCH;Number maximum of colours used in picture @@ -114,6 +120,8 @@ PREFERENCES_WBASIZEREF;Size of reference colour compare to size of histogram col 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. SORT_BY_LABEL;By Colour Label +TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP;In combination with "Refine colours", allows you to:\n 1) for low values, adjust the image purity.\n 2) for higher values, carry out moderate colour toning.\nBe careful not to go outside the CIE xy diagram. +TC_PRIM_REFI;Refine colours (white-point) 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. 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 @@ -168,13 +176,15 @@ TP_HLREC_COLOR;Colour Propagation TP_ICM_INPUTCAMERAICC_TOOLTIP;Use RawTherapee's camera-specific DCP or ICC input colour 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 colour matrix from dcraw, an enhanced RawTherapee version (whichever is available based on camera model) or one embedded in the DNG. TP_ICM_INPUTCUSTOM_TOOLTIP;Select your own DCP/ICC colour profile file for the camera. -TP_ICM_INPUTEMBEDDED_TOOLTIP;Use colour profile embedded in non-raw files. +TP_ICM_INPUTEMBEDDED_TOOLTIP;Use the colour profile embedded in the file.\nIf unavailable, fall back to Camera standard 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_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 three main uses - channel mixer, restore image colour (saturation), 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_WORKING_PRIM_TOOLTIP;Performs a gamut control. Destination primaries (Advanced) allows you to change the destination primaries to restore or change image colour (saturation). The colour balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified.\nWhen 'Custom LA (sliders)' is selected, you can modify the values of the 3 primaries (Red, Green, and Blue) for x and y. 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 or Colour 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 colourimetric, Munsell is then applied.\nXYZ Absolute, applies gamut control, in absolute colourimetric, Munsell is then applied.\nXYZ Relative, applies gamut control, in relative colourimetric, Munsell is then applied. +TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Fit colours into gamut of the working colour space and apply Munsell correction (Uniform Perceptual Lab). Default: Munsell only.\n\nMunsell only: Fixes Lab mode hue drifts due to non-linearity when chromaticity is changed (Uniform Perceptual Lab).\nLab: Applies a gamut control in relative colourimetric. Munsell is then applied.\nXYZ Absolute: Applies gamut control in absolute colourimetric. Munsell is then applied.\nXYZ Relative: Applies gamut control in relative colourimetric. Munsell is then applied. The result is not the same as Lab. 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 @@ -185,6 +195,7 @@ 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_COLORFRAME;Dominant colour 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 @@ -199,7 +210,7 @@ TP_LOCALLAB_EXCLUF_TOOLTIP;'Excluding' mode prevents adjacent spots from influen 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_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 layer blend modes (difference, multiply, soft light, overlay, etc.) with opacity control.\nOriginal image: merge current spot with original.\nPrevious spot: merge current spot with previous (if there is only one spot, previous = original).\nBackground: merge current 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. @@ -245,6 +256,9 @@ TP_LOCALLAB_MASKRELOG_TOOLTIP;Used to modulate the effect of the Log encoding se TP_LOCALLAB_MERCOL;Colour TP_LOCALLAB_MERFOR;Colour Dodge TP_LOCALLAB_MERTHI;Colour Burn +TP_LOCALLAB_PRECAMREFIMAIN_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant colour. This action modifies the purity. In combination with "Shift x" and "Shift y", allows you to carry out moderate colour toning. +TP_LOCALLAB_PRECAMREFI_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant colour. This action modifies the purity. +TP_LOCALLAB_PRECAM_TOOLTIP;'Source Data Adjustments' modifies the Dynamic Range using Log encoding, the tones of the image and primaries (simplified Abstract Profile), and midtones, just before the Ciecam process. These values are adjustable:\nGamma: Acts mainly on light tones\nSlope: Acts mainly on dark tones. You 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.\nDestination primaries: Allows you to change the destination primaries to restore or change image colour (saturation). The colour balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified. You can also finely adapt the primaries and the illuminant (white-point). Moving a primary away from the white point reduces saturation and vice versa. Pay attention to the gamut. 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. @@ -252,8 +266,8 @@ 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 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_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. @@ -284,11 +298,12 @@ TP_WBALANCE_ITCWB_SIZEPATCH;Size of colour patch TP_WBALANCE_ITCWB_THRES;Colours used in picture (preset) TP_WBALANCE_ITCWFORCED_TOOLTIP;By default (box not checked) the data scanned during sampling is brought back to the sRGB profile, which is the most widespread, both for calibrating DCP or ICC profiles with the Colourchecker24, or used on the web.\n If you have very high gamut images (some flowers, artificial colours), then it may be necessary to use the entire CIExy diagram, the profile used will be ACESP0. In this second case, the number of colours that can be used in internal to the algorithm will be more important. TP_WBALANCE_ITCWPRIM_TOOLTIP;Allows you to select the image sampling.\n'Close to full CIE diagram' almost uses the data present on the sensor, possibly including the imaginary colours.\n'Camera XYZ matrix' - uses the matrix directly derived from Colour Matrix.\n'Medium sampling' (default) - near Pointer's gamut: corresponds substantially to the most common cases of human vision.\nThe other choice 'Low sampling and Ignore camera settings' allow you to isolate high gamut parts of the image and forces the algorithm in some cases (tint > 0.8,...) to ignore camera settings. This will obviously have an impact on the result.\n\nThis sampling only has an influence on the channel multipliers, it has nothing to do with the "working profile" and does not modify the gamut of the image. -TP_WBALANCE_OBSERVER10_TOOLTIP;The colour management in Rawtherapee (White balance, channel multipliers, highlight recovery,...) uses the spectral data of the illuminants and colours. 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 colours 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_OBSERVER10_TOOLTIP;The colour management in RawTherapee (White balance, channel multipliers, highlight recovery,...) uses the spectral data of the illuminants and colours. 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).\nIn the rare case of a colour drift with "Observer 2°" (probably due to the conversion matrix) "Observer 10°" must be selected. TP_WBALANCE_PATCHLABEL;Read colours:%1 Patch: Chroma:%2 Size=%3 TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDisplay calculated Patch Chroma.\nAWB temperature bias, lets try to reduce this value, a minimum may seem to optimize the algorithm.\n\nPatch size matching chroma optimization. //TP_WBALANCE_ITCWBNOPURPLE_TOOLTIP;By default when "Inpaint opposed" is activated, purple colours are not taken into account. However, if the image does not need highlight reconstruction, or if this image naturally contains purple tints (flowers, etc.), it may be necessary to deactivate, to take into account all the colours. + !!!!!!!!!!!!!!!!!!!!!!!!! ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! @@ -491,6 +506,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !FILEBROWSER_SHOWRANK5HINT;Show images ranked as 5-star.\nShortcut: Shift-5 !FILEBROWSER_SHOWRECENTLYSAVEDHINT;Show saved images.\nShortcut: Alt-7 !FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 +!FILEBROWSER_SHOWRECURSIVE;Show images in sub-folders recursively. !FILEBROWSER_SHOWTRASHHINT;Show contents of trash.\nShortcut: Ctrl-t !FILEBROWSER_SHOWUNRANKHINT;Show unranked images.\nShortcut: Shift-0 !FILEBROWSER_THUMBSIZE;Thumbnail size @@ -1021,7 +1037,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !HISTORY_MSG_512;Local - SD - ΔE decay !HISTORY_MSG_513;Local - Spot - Excluding - Scope !HISTORY_MSG_514;Local - Spot structure -!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_515;Selective Editing !HISTORY_MSG_517;Local - Enable super !HISTORY_MSG_518;Local - Lightness !HISTORY_MSG_519;Local - Contrast @@ -1295,7 +1311,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !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 - TG - Feather gradient +!HISTORY_MSG_833;Local - Mask 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 @@ -1526,7 +1542,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !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_1082;Local - CIECAM Auto threshold !HISTORY_MSG_1083;Local - CIECAM Hue !HISTORY_MSG_1084;Local - Uses Black Ev - White Ev !HISTORY_MSG_1085;Local - Jz lightness @@ -1635,16 +1651,20 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !HISTORY_MSG_ICM_AINTENT;Abstract profile intent !HISTORY_MSG_ICM_BLUX;Primaries Blue X !HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_CAT;Matrix adaptation !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_MIDTCIE;Midtones !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_PRESER;Preserve neutral !HISTORY_MSG_ICM_REDX;Primaries Red X !HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_SMOOTHCIE;Smooth highlights +!HISTORY_MSG_ICM_TRCEXP;Abstract Profile !HISTORY_MSG_ICM_WORKING_GAMMA;TRC - Gamma !HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method !HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method @@ -1657,6 +1677,69 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_LOCALLAB_TE_PIVOT;Local - Equalizer pivot +!HISTORY_MSG_LOCAL_CIEMASK_BLURCONT;Local - CIECAM Mask blur contrast +!HISTORY_MSG_LOCAL_CIEMASK_BLURFFT;Local - CIECAM Mask blur FFTW +!HISTORY_MSG_LOCAL_CIEMASK_BLURRAD;Local - CIECAM Mask blur radius +!HISTORY_MSG_LOCAL_CIEMASK_CHH;Local - CIECAM Mask curve h(h) +!HISTORY_MSG_LOCAL_CIEMASK_HIGH;Local - CIECAM Mask highlights +!HISTORY_MSG_LOCAL_CIEMASK_SHAD;Local - CIECAM Mask shadows +!HISTORY_MSG_LOCAL_CIEMASK_STRU;Local - CIECAM Mask structure +!HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;Local - CIECAM Mask structure as tool +!HISTORY_MSG_LOCAL_CIEMASK_WLC;Local - CIECAM Mask wavelet L(L) +!HISTORY_MSG_LOCAL_CIEMASK_WLEV;Local - CIECAM Mask wavelet levels +!HISTORY_MSG_LOCAL_CIE_ANGGRAD;Local - CIECAM Gradient angle +!HISTORY_MSG_LOCAL_CIE_BLACKS;Local - CIECAM Blacks distribution +!HISTORY_MSG_LOCAL_CIE_BLUXL;Local - CIECAM Blue X +!HISTORY_MSG_LOCAL_CIE_BLUYL;Local - CIECAM Blue Y +!HISTORY_MSG_LOCAL_CIE_BRICOMP;Local - CIECAM Brightness compression +!HISTORY_MSG_LOCAL_CIE_BRICOMPTH;Local - CIECAM Brightness compression threshold +!HISTORY_MSG_LOCAL_CIE_BWCIE;Local - CIECAM Black and white +!HISTORY_MSG_LOCAL_CIE_CAT;Local - Matrix adaptation +!HISTORY_MSG_LOCAL_CIE_DETAILJZ;Local - JzCzHz Local contrast +!HISTORY_MSG_LOCAL_CIE_ENAMASKALL;Local - CIECAM All mask tools +!HISTORY_MSG_LOCAL_CIE_EXPPRECAM;Local - CIECAM Pre-Cam +!HISTORY_MSG_LOCAL_CIE_GAM;Local - CIECAM Gamma +!HISTORY_MSG_LOCAL_CIE_GAMUTCIE;Local - CIECAM Gamut +!HISTORY_MSG_LOCAL_CIE_GREXL;Local - CIECAM Green X +!HISTORY_MSG_LOCAL_CIE_GREYL;Local - CIECAM Green Y +!HISTORY_MSG_LOCAL_CIE_ILL;Local - CIECAM TRC Illuminant +!HISTORY_MSG_LOCAL_CIE_LOGCIEQ;Local - CIECAM Log encoding Q +!HISTORY_MSG_LOCAL_CIE_MIDT;Local - CIECAM Mid Tones +!HISTORY_MSG_LOCAL_CIE_NORM;Local - CIECAM Normalize L +!HISTORY_MSG_LOCAL_CIE_PRIM;Local - CIECAM TRC primaries +!HISTORY_MSG_LOCAL_CIE_REDXL;Local - CIECAM Red X +!HISTORY_MSG_LOCAL_CIE_REDYL;Local - CIECAM Red Y +!HISTORY_MSG_LOCAL_CIE_SATCIE;Local - CIECAM Saturation control +!HISTORY_MSG_LOCAL_CIE_SHIFTXL;Local - CIECAM Shift x +!HISTORY_MSG_LOCAL_CIE_SHIFTYL;Local - CIECAM Shift y +!HISTORY_MSG_LOCAL_CIE_SIG;Local - Sigmoid +!HISTORY_MSG_LOCAL_CIE_SIGADAP;Local - CIECAM Sigmoid adaptability +!HISTORY_MSG_LOCAL_CIE_SIGMET;Local - CIECAM Sigmoid method +!HISTORY_MSG_LOCAL_CIE_SLOP;Local - CIECAM Slope +!HISTORY_MSG_LOCAL_CIE_SLOPESMO;Local - CIECAM Gray balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOB;Local - CIECAM Blue balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOG;Local - CIECAM Green balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOR;Local - CIECAM Red balance +!HISTORY_MSG_LOCAL_CIE_SMOOTH;Local - CIECAM Scale Yb scene +!HISTORY_MSG_LOCAL_CIE_SMOOTHMET;Local - CIECAM Smooth lights method +!HISTORY_MSG_LOCAL_CIE_SMOOTHYB;Local - CIECAM Scale Yb viewing +!HISTORY_MSG_LOCAL_CIE_SMOOTH_LUM;Local - CIECAM Levels - Luminosity mode +!HISTORY_MSG_LOCAL_CIE_STRGRAD;Local - CIECAM Gradient strength L +!HISTORY_MSG_LOCAL_CIE_STRLOG;Local - CIECAM Log encoding strength +!HISTORY_MSG_LOCAL_CIE_TRC;Local - CIECAM TRC +!HISTORY_MSG_LOCAL_CIE_WHITES;Local - CIECAM Whites distribution +!HISTORY_MSG_LOCAL_DEHAZE_BLACK;Local - Dehaze Black +!HISTORY_MSG_LOCAL_FEATHERCIE;Local - CIECAM Gradient feather +!HISTORY_MSG_LOCAL_FEATHEREXE;Local - Exp Gradient feather +!HISTORY_MSG_LOCAL_FEATHERLOG;Local - Log Gradient feather +!HISTORY_MSG_LOCAL_FEATHERMAS;Local - Mask Common gradient feather +!HISTORY_MSG_LOCAL_FEATHERSH;Local - SH Gradient feather +!HISTORY_MSG_LOCAL_FEATHERVIB;Local - Vib Gradient feather +!HISTORY_MSG_LOCAL_FEATHERWAV;Local - Wav Gradient feather +!HISTORY_MSG_LOCAL_LOG_BLACKS;Local - Log Blacks distribution +!HISTORY_MSG_LOCAL_LOG_COMPR;Local - Log Compress brightness +!HISTORY_MSG_LOCAL_LOG_SAT;Local - Log Saturation control +!HISTORY_MSG_LOCAL_LOG_WHITES;Local - Log Whites distribution !HISTORY_MSG_LOCAL_TMO_SATUR;Local Exp Fattal Saturation !HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold @@ -1902,7 +1985,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !MAIN_TAB_FILTER; Filter !MAIN_TAB_INSPECT; Inspect !MAIN_TAB_IPTC;IPTC -!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB;Selective Editing !MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o !MAIN_TAB_METADATA;Metadata !MAIN_TAB_METADATA_TOOLTIP;Shortcut: Alt-m @@ -1919,7 +2002,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !MAIN_TOOLTIP_PREVIEWG;Preview the green channel.\nShortcut: g !MAIN_TOOLTIP_PREVIEWL;Preview the luminosity.\nShortcut: v\n\n0.299*R + 0.587*G + 0.114*B !MAIN_TOOLTIP_PREVIEWR;Preview the red channel.\nShortcut: r -!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%, or when capture sharpening is enabled. !MAIN_TOOLTIP_QINFO;Quick info on the image.\nShortcut: i !MAIN_TOOLTIP_SHOWHIDELP1;Show/Hide the left panel.\nShortcut: l !MAIN_TOOLTIP_SHOWHIDERP1;Show/Hide the right panel.\nShortcut: Alt-l @@ -1981,8 +2064,8 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !PARTIALPASTE_LENSGROUP;Lens Related Settings !PARTIALPASTE_LENSPROFILE;Profiled lens correction !PARTIALPASTE_LOCALCONTRAST;Local contrast -!PARTIALPASTE_LOCALLAB;Local Adjustments -!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings +!PARTIALPASTE_LOCALLAB;Selective Editing +!PARTIALPASTE_LOCALLABGROUP;Selective Editing Settings !PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_METAGROUP;Metadata settings !PARTIALPASTE_PCVIGNETTE;Vignette filter @@ -2024,7 +2107,6 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !PREFERENCES_ADD;Add !PREFERENCES_APPEARANCE;Appearance !PREFERENCES_APPEARANCE_MAINFONT;Main font -!PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode !PREFERENCES_APPEARANCE_THEME;Theme !PREFERENCES_APPLNEXTSTARTUP;restart required !PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit @@ -2033,6 +2115,9 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !PREFERENCES_BEHADDALLHINT;Set all parameters to the Add mode.\nAdjustments of parameters in the batch tool panel will be deltas to the stored values. !PREFERENCES_BEHSETALL;All to 'Set' !PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. +!PREFERENCES_BROWSERECURSIVEDEPTH;Browse sub-folders depth +!PREFERENCES_BROWSERECURSIVEFOLLOWLINKS;Follow symbolic links when browsing sub-folders +!PREFERENCES_BROWSERECURSIVEMAXDIRS;Maximum sub-folders !PREFERENCES_CACHECLEAR;Clear !PREFERENCES_CACHECLEAR_ALL;Clear all cached files: !PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: @@ -2055,7 +2140,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !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_COMPLEXITYLOC;Default complexity for Selective Editing !PREFERENCES_COMPLEXITY_EXP;Advanced !PREFERENCES_COMPLEXITY_NORM;Standard !PREFERENCES_COMPLEXITY_SIMP;Basic @@ -2131,6 +2216,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !PREFERENCES_LENSPROFILESDIR;Lens profiles directory !PREFERENCES_LENSPROFILESDIR_TOOLTIP;Directory containing Adobe Lens Correction Profiles (LCPs) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders +!PREFERENCES_MAX_ZOOM_TITLE;Maximum zoom !PREFERENCES_MENUGROUPEXTPROGS;Group 'Open with' !PREFERENCES_MENUGROUPFILEOPERATIONS;Group 'File operations' !PREFERENCES_MENUGROUPPROFILEOPERATIONS;Group 'Processing profile operations' @@ -2154,7 +2240,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !PREFERENCES_PARSEDEXT;Parsed Extensions !PREFERENCES_PARSEDEXTADD;Add extension !PREFERENCES_PARSEDEXTADDHINT;Add entered extension to the list. -!PREFERENCES_PARSEDEXTDELHINT;Delete selected extension from the list. +!PREFERENCES_PARSEDEXTDELHINT;Delete selected extension from the list.\nPredefined extensions cannot be deleted. !PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. !PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. !PREFERENCES_PERFORMANCE_MEASURE;Measure @@ -2178,6 +2264,8 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !PREFERENCES_PROPERTY;Property !PREFERENCES_PRTINTENT;Rendering intent !PREFERENCES_PSPATH;Adobe Photoshop installation directory +!PREFERENCES_RAW_DECODER;Raw Decoder +!PREFERENCES_RAW_DECODER_ENABLE_LIBRAW;Use LibRaw !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in 'Single Editor Tab Mode' and when 'Demosaicing method used for the preview at <100% zoom' is set to 'As in PP3'. !PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now @@ -2190,7 +2278,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !PREFERENCES_SHOWDATETIME;Show date and time !PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation !PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar -!PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips +!PREFERENCES_SHOWTOOLTIP;Show Selective Editing advice tooltips !PREFERENCES_SHTHRESHOLD;Threshold for clipped shadows !PREFERENCES_SINGLETAB;Single Editor Tab Mode !PREFERENCES_SINGLETABVERTAB;Single Editor Tab Mode, Vertical Tabs @@ -2198,6 +2286,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !PREFERENCES_SND_LNGEDITPROCDONE;Editor processing done !PREFERENCES_SND_QUEUEDONE;Queue processing done !PREFERENCES_SND_THRESHOLDSECS;After seconds +!PREFERENCES_SPOTLOC;Define Spot method for Selective Editing !PREFERENCES_STARTUPIMDIR;Image Directory at Startup !PREFERENCES_TAB_BROWSER;File Browser !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules @@ -2259,6 +2348,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !PROGRESSBAR_LOADING;Loading image... !PROGRESSBAR_LOADINGTHUMBS;Loading thumbnails... !PROGRESSBAR_LOADJPEG;Loading JPEG file... +!PROGRESSBAR_LOADJXL;Loading JXL file... !PROGRESSBAR_LOADPNG;Loading PNG file... !PROGRESSBAR_LOADTIFF;Loading TIFF file... !PROGRESSBAR_NOIMAGES;No images found @@ -2279,10 +2369,31 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !QUEUE_AUTOSTART;Auto-start !QUEUE_AUTOSTART_TOOLTIP;Start processing automatically when a new job arrives. !QUEUE_DESTFILENAME;Path and file name +!QUEUE_DESTPREVIEW_TITLE;Select a thumbnail to preview its destination path here +!QUEUE_DESTPREVIEW_TOOLTIP;Destination path for the first selected image appears here !QUEUE_FORMAT_TITLE;File Format !QUEUE_LOCATION_FOLDER;Save to folder !QUEUE_LOCATION_TEMPLATE;Use template -!QUEUE_LOCATION_TEMPLATE_TOOLTIP;Specify the output location based on the source photo's location, rank, trash status or position in the queue.\n\nUsing the following pathname as an example:\n/home/tom/photos/2010-10-31/photo1.raw\nthe meaning of the formatting strings follows:\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 will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used.\n\n%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'.\n\nIf you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p2/converted/%d1/%f +!QUEUE_LOCATION_TEMPLATE_HELP_BUTTON_TOOLTIP;Show or hide a help panel with instructions for creating location templates +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_BODY;If you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p-3/converted/%P-4/%f +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_TITLE;Common examples +!QUEUE_LOCATION_TEMPLATE_HELP_INTRO;The output template field allows you to to dynamically customize the destination folder and filename. When you include certain specifiers, which begin with %, they are replaced by the program when each file is being saved.\n\nThe sections below describe each type of specifier. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_1;Using this pathname as an example: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_2;The meanings of the formatting strings are: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_LINUX;/home/tom/photos/2010-10-31/photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_WINDOWS;D:\tom\photos\2010-10-31\photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO;The %dN, %d-N, %pN, %p-N, %PN and %P-N (N = 1..9) specifiers will be replaced by elements of the image file's directory path.\nThe format specifiers operate as follows:\n %dN = Nth directory from the end of the path\n %d-N = Nth directory from the start of the path\n %pN = all directories up to the Nth from the end of the path\n %p-N = the first N directories in the path\n %PN = the last N directories in the path\n %P-N = all directories from the Nth to the end of the path\n %f = base filename (no extension) +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO_WINDOWS;For Windows paths, %d-1 is the drive letter and colon, and %d-2 is the base directory on that drive. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_TITLE;Directories and partial paths +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_BODY;%r will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used. +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_TITLE;Rank +!QUEUE_LOCATION_TEMPLATE_HELP_RESULT_MISMATCH;ERROR: 2nd result is different: +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_BODY;%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'. +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_TITLE;Position/sequence in queue +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_BODY;Three different date/time values may be used in templates:\n %tE"%Y-%m-%d" = when export started\n %tF"%Y-%m-%d" = when file was last saved\n %tP"%Y-%m-%d" = when photo was taken\nThe quoted string defines the format of the resulting date and/or time. The format string %tF"%Y-%m-%d" is just one example. The string can use all conversion specifiers defined for the g_date_time_format function (see https://docs.gtk.org/glib/method.DateTime.format.html).\n\nExample format strings: +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_TITLE;Date and time +!QUEUE_LOCATION_TEMPLATE_HELP_TITLE;Creating an output template +!QUEUE_LOCATION_TEMPLATE_TOOLTIP;Specify the output location based on characteristics such as the source photo's location, rank, trash status or position in the queue.\n\nThe output template field value can include specifiers beginning with %, which are replaced by those characteristics in the actual destination path.\n\nPress the ? button for full instructions. !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 @@ -2318,6 +2429,8 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !SORT_BY_NAME;By Name !SORT_BY_RANK;By Rank !SORT_DESCENDING;Descending +!TC_LOCALLAB_PRIM_SHIFTX;Shift x +!TC_LOCALLAB_PRIM_SHIFTY;Shift y !TC_PRIM_BLUX;Bx !TC_PRIM_BLUY;By !TC_PRIM_GREX;Gx @@ -2723,6 +2836,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !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_BW;Black and White !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. @@ -2733,7 +2847,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !TP_ICM_INPUTCAMERAICC;Auto-matched camera profile !TP_ICM_INPUTCUSTOM;Custom !TP_ICM_INPUTDLGLABEL;Select Input DCP/ICC Profile... -!TP_ICM_INPUTEMBEDDED;Use embedded, if possible +!TP_ICM_INPUTEMBEDDED;Use embedded !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 @@ -2753,9 +2867,15 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !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_CAT;Matrix adaptation +!TP_ICM_WORKING_CAT_BRAD;Bradford +!TP_ICM_WORKING_CAT_CAT02;Cat02 +!TP_ICM_WORKING_CAT_CAT16;Cat16 +!TP_ICM_WORKING_CAT_TOOLTIP;Performs the chromatic adaptation of the XYZ conversion matrix. Default: Bradford +!TP_ICM_WORKING_CAT_VK;Von Kries +!TP_ICM_WORKING_CAT_XYZ;XYZ scale !TP_ICM_WORKING_CIEDIAG;CIE xy diagram !TP_ICM_WORKING_ILLU;Illuminant !TP_ICM_WORKING_ILLU_1500;Tungsten 1500K @@ -2767,11 +2887,13 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !TP_ICM_WORKING_ILLU_D65;D65 !TP_ICM_WORKING_ILLU_D80;D80 !TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_E;E !TP_ICM_WORKING_ILLU_NONE;Default !TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_NON;None !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_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination primaries' combo box, 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 @@ -2780,7 +2902,9 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !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_FREE;Custom LA (sliders) !TP_ICM_WORKING_PRIM_JDCMAX;JDC Max +!TP_ICM_WORKING_PRIM_JDCMAXSTDA;JDC Max stdA !TP_ICM_WORKING_PRIM_NONE;Default !TP_ICM_WORKING_PRIM_PROP;ProPhoto !TP_ICM_WORKING_PRIM_REC;Rec2020 @@ -2842,6 +2966,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected !TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file !TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected +!TP_LENSPROFILE_CORRECTION_METADATA;From file metadata !TP_LENSPROFILE_LABEL;Profiled Lens Correction !TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. !TP_LENSPROFILE_MODE_HEADER;Lens Profile @@ -2860,7 +2985,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !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_AUTOGRAYCIE;Automatic !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 @@ -2902,9 +3027,12 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !TP_LOCALLAB_BUTTON_DUPL;Duplicate !TP_LOCALLAB_BUTTON_REN;Rename !TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWEVNONE;None +!TP_LOCALLAB_BWEVSIG;Activated +!TP_LOCALLAB_BWEVSIGLOG;Sigmoid & Log-Encoding !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_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16 (experimental). 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, for example, to match CAM16 processing with the maximum monitor brightness of 400cd/m2. !TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments !TP_LOCALLAB_CAMMODE;CAM model !TP_LOCALLAB_CAMMODE_CAM16;CAM 16 @@ -2939,6 +3067,12 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !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_SMOOTHFRAME;Highlight Attenuation & Levels +!TP_LOCALLAB_CIE_SMOOTH_EV;Ev based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA;Slope based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF;Gamma based +!TP_LOCALLAB_CIE_SMOOTH_LEVELS;Levels +!TP_LOCALLAB_CIE_SMOOTH_NONE;None !TP_LOCALLAB_CIRCRADIUS;Spot size !TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the 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 @@ -2951,11 +3085,14 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !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_COLORDEPREV_TOOLTIP;Preview ΔE button in Settings will only work if you have activated 'Sharpening', 'Soft Light and Original Retinex', 'Blur/Grain and Denoise', 'Dehaze and Retinex', or 'Contrast by Detail Levels' in the 'Add tool to current spot' menu.\nFor others tools, the Preview ΔE button is in the tool, which allows previewing ΔE with several tools enabled. Prefer using Mask and modifications. !TP_LOCALLAB_COL_NAME;Name !TP_LOCALLAB_COL_VIS;Status !TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPRCIE;Brightness compression +!TP_LOCALLAB_COMPRCIETH;Compression threshold !TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_COMPRLOG_TOOLTIP;This algorithm compress the data before log conversion, above the threshold slider value. To use in conjunction with Whites distribution. !TP_LOCALLAB_CONTCOL;Contrast threshold !TP_LOCALLAB_CONTFRA;Contrast by level !TP_LOCALLAB_CONTRAST;Contrast @@ -2968,7 +3105,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !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_LL_TOOLTIP;To activate the curves, set the 'Curve type' combo box 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 @@ -2976,12 +3113,13 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !TP_LOCALLAB_DARKRETI;Darkness !TP_LOCALLAB_DEHAFRA;Dehaze !TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZE_BLACK;Black !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_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. @@ -2999,6 +3137,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !TP_LOCALLAB_DETAILFRA;Edge detection - DCT !TP_LOCALLAB_DETAILSH;Details !TP_LOCALLAB_DETAILTHR;Lum/chrom detail threshold +!TP_LOCALLAB_DISAB_CIECAM;Disable Ciecam or Weak Jz surround !TP_LOCALLAB_DIVGR;Gamma !TP_LOCALLAB_DUPLSPOTNAME;Copy !TP_LOCALLAB_EDGFRA;Edge sharpness @@ -3007,6 +3146,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping !TP_LOCALLAB_ENABLE_MASK;Enable mask !TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENABLE_MASKALL;Enable all mask tools !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 @@ -3021,15 +3161,16 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !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_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all selective editing data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\nUse 'Scope' (Excluding) to set the exclusion intensity.\n\n'Full image' allows you to use the selective editing tools on the whole image.\nThe RT Spot delimiters are set beyond the image preview boundaries.\nThe 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.\nNote: 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.\n\n'Global' allows you to use the selective editing tools on the whole image, without using Delta E or transitions. !TP_LOCALLAB_EXECLU;Excluding spot !TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXMAIN;Global !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_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Selective Editing 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 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 @@ -3053,7 +3194,8 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !TP_LOCALLAB_FATSAT;Saturation control !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_FEATVALUE;Feather gradient +!TP_LOCALLAB_FEATVALUE_MASK;Feather gradient (Grad. Filters Mask) !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 @@ -3146,7 +3288,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !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_LABEL;Selective Editing !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 @@ -3189,12 +3331,14 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !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_LOGCIE;Log encoding +!TP_LOCALLAB_LOGCIEQ;Log Encoding Q (with Ciecam) +!TP_LOCALLAB_LOGCIEQ_TOOLTIP;Activating the checkbox allows you to switch between log encoding based on the 3 RGB channels, and log encoding based solely on Ciecam’s brightness (Q) channel.\nUsing the Q channel instead of the RGB channels helps avoid undesirable edge effects such as hue and saturation shifts.\nHowever, the settings are more difficult to optimise because Q is unbounded and Ciecam alters the data to take into account the surround conditions, simultaneous contrast, etc.\nYou may have to adjust the following:\n Scene conditions: Mean luminance (Yb), Whites & Blacks distribution, Black Ev, White Ev.\n Source Data Adjustments : Brightness compression, Strength.\n\nNote: when using Log Encoding (Q), be careful not to activate the Disable Ciecam option in the Scene Conditions, Surround menu. +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you to use Black Ev, White Ev, White and Black distribution, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using 'Log encoding' with Brightness compression. !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_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 @@ -3205,6 +3349,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !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_LOGPFRA2;Log Encoding settings !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. @@ -3244,7 +3389,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !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_MASKUNUSABLE;Mask disabled (Enable in 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 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 @@ -3277,6 +3422,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !TP_LOCALLAB_MERTWE;Exclusion !TP_LOCALLAB_MERTWO;Subtract !TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MIDTCIE;Midtones !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 @@ -3324,10 +3470,12 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !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_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_PRECAMGAMUT_TOOLTIP;If checked, ensures a gamut control just after primary conversion to XYZ. !TP_LOCALLAB_PREVHIDE;Hide additional settings !TP_LOCALLAB_PREVIEW;Preview ΔE !TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PRIMILLFRAME;Primaries & Illuminant !TP_LOCALLAB_PROXI;ΔE decay !TP_LOCALLAB_QUAAGRES;Aggressive !TP_LOCALLAB_QUACONSER;Conservative @@ -3370,9 +3518,10 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !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_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_SATCIE;Saturation control !TP_LOCALLAB_SATUR;Saturation !TP_LOCALLAB_SATURV;Saturation (s) !TP_LOCALLAB_SCALEGR;Scale @@ -3390,7 +3539,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !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_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;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. @@ -3436,17 +3585,41 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !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_SIGBLACKSSCIE;Blacks distribution +!TP_LOCALLAB_SIGCIE;Sigmoid +!TP_LOCALLAB_SIGFRA;Sigmoid Q +!TP_LOCALLAB_SIGGAMJCIE;Gamma !TP_LOCALLAB_SIGJZFRA;Sigmoid Jz !TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOID16_TOOLTIP;Allows you to simulate a tone mapping appearance using both 'Ciecam' and 'Sigmoid Q'. Sigmoid Q has three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc) Adaptability weights the action of the sigmoid by action on the internal exponential function. !TP_LOCALLAB_SIGMOIDBL;Blend !TP_LOCALLAB_SIGMOIDLAMBDA;Contrast -!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDLOGAUTO;Auto threshold +!TP_LOCALLAB_SIGMOIDLOGEV_TOOLTIP;If the combo box selection 'Black Ev and White Ev' is 'Sigmoid and Log encoding' instead of 'Sigmoid only', the two algorithms 'Log encoding' and 'Sigmoid' are used together. +!TP_LOCALLAB_SIGMOIDNORMCIE;Normalize Luminance +!TP_LOCALLAB_SIGMOIDNORMCIEBLEND_TOOLTIP;Blend acts on the final aspect of the image, contrast and luminance. Ratio between original and output image. +!TP_LOCALLAB_SIGMOIDNORMCIE_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image take into account those of the original.\nAll the adjustments acting on J or Q are taken into account, including those which are not relative to Sigmoid Q. +!TP_LOCALLAB_SIGMOIDQJ;Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDQJCOMPRCIE_TOOLTIP;When the combo box selection 'Uses Black Ev and White Ev' is 'Sigmoid and Log encoding Q' or 'Log encoding instead of Sigmoid' checked. This algorithm compress the data above the threshold slider value. The last value stands for brightness (Q) and should be close as possible to the value 'Compression threshold' (calculate when 'Auto threshold" checked, often > 1). +!TP_LOCALLAB_SIGMOIDSENSI;Adaptability !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_SIGMOIDWHITESCIE_TOOLTIP;Allows you, in Automatic when the dynamic range of the image is high, to change the distribution of lights in whites and deep blacks.\nCan be used with Log encoding or Sigmoid with Black Ev and White Ev enabled.\n\nThe algorithm does not change the basic data, but acts on the components necessary to calculate the Dynamic range, Black Ev, White Ev and the Gray point. +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a tone mapping appearance using both the 'Jz' and 'Sigmoid' function. Three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SIGSLOPJCIE;Slope +!TP_LOCALLAB_SIGTRCCIE;Source Data Adjustments +!TP_LOCALLAB_SIGWHITESCIE;Whites distribution !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_SLOPESMOOTH;Gray balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHB;Blue balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHG;Green balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHR;Red balance (Slope) !TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SMOOTHCIE;Highlight Attenuation +!TP_LOCALLAB_SMOOTHCIE_LUM;Luminosity mode +!TP_LOCALLAB_SMOOTHCIE_SCA;Scale Yb Scene +!TP_LOCALLAB_SMOOTHCIE_TOOLTIP;Completes the processing carried out by gamma, slope and midtones by causing a slight lowering of lights. Please note this does not replace Highlight reconstruction.\n\nGamma based and Slope based (Standard and Advanced) allow you to simulate a tone mapping using:\na) Scene conditions: Black-Ev, White-Ev, Mean luminance (Yb%)\nb) Viewing conditions: Mean luminance (Yb%).\n\nScale Yb Scene is function of White-Ev. +!TP_LOCALLAB_SMOOTHCIE_YB;Scale Yb Viewing !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. @@ -3467,6 +3640,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !TP_LOCALLAB_STRENG;Strength !TP_LOCALLAB_STRENGR;Strength !TP_LOCALLAB_STRENGTH;Noise +!TP_LOCALLAB_STRENGTHCIELOG;Strength !TP_LOCALLAB_STRGRID;Strength !TP_LOCALLAB_STRUC;Structure !TP_LOCALLAB_STRUCCOL;Spot structure @@ -3508,6 +3682,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !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_TRCFRAME;Tone Response Curve & Midtones !TP_LOCALLAB_USEMASK;Laplacian !TP_LOCALLAB_VART;Variance (contrast) !TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool @@ -4141,7 +4316,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !TP_WBALANCE_AUTO;Auto !TP_WBALANCE_AUTOITCGREEN;Temperature correlation !TP_WBALANCE_AUTOOLD;RGB grey -!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement +!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement !TP_WBALANCE_CAMERA;Camera !TP_WBALANCE_CLOUDY;Cloudy !TP_WBALANCE_CUSTOM;Custom diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index 329925625..1e7630225 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -1,4 +1,5 @@ + !!!!!!!!!!!!!!!!!!!!!!!!! ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! @@ -204,6 +205,7 @@ !FILEBROWSER_SHOWRANK5HINT;Show images ranked as 5-star.\nShortcut: Shift-5 !FILEBROWSER_SHOWRECENTLYSAVEDHINT;Show saved images.\nShortcut: Alt-7 !FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 +!FILEBROWSER_SHOWRECURSIVE;Show images in sub-folders recursively. !FILEBROWSER_SHOWTRASHHINT;Show contents of trash.\nShortcut: Ctrl-t !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 !FILEBROWSER_SHOWUNRANKHINT;Show unranked images.\nShortcut: Shift-0 @@ -758,7 +760,7 @@ !HISTORY_MSG_512;Local - SD - ΔE decay !HISTORY_MSG_513;Local - Spot - Excluding - Scope !HISTORY_MSG_514;Local - Spot structure -!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_515;Selective Editing !HISTORY_MSG_516;Local - Color and light !HISTORY_MSG_517;Local - Enable super !HISTORY_MSG_518;Local - Lightness @@ -1068,7 +1070,7 @@ !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 - TG - Feather gradient +!HISTORY_MSG_833;Local - Mask 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 @@ -1311,7 +1313,7 @@ !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_1082;Local - CIECAM Auto threshold !HISTORY_MSG_1083;Local - CIECAM Hue !HISTORY_MSG_1084;Local - Uses Black Ev - White Ev !HISTORY_MSG_1085;Local - Jz lightness @@ -1427,16 +1429,23 @@ !HISTORY_MSG_ICM_AINTENT;Abstract profile intent !HISTORY_MSG_ICM_BLUX;Primaries Blue X !HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_CAT;Matrix adaptation !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_MIDTCIE;Midtones !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_PRESER;Preserve neutral !HISTORY_MSG_ICM_REDX;Primaries Red X !HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_REFI;Refinement Colors +!HISTORY_MSG_ICM_SHIFTX;Refinement Colors - Shift x +!HISTORY_MSG_ICM_SHIFTY;Refinement Colors - Shift y +!HISTORY_MSG_ICM_SMOOTHCIE;Smooth highlights +!HISTORY_MSG_ICM_TRCEXP;Abstract Profile !HISTORY_MSG_ICM_WORKING_GAMMA;TRC - Gamma !HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method !HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method @@ -1449,7 +1458,72 @@ !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_LOCALLAB_TE_PIVOT;Local - Equalizer pivot +!HISTORY_MSG_LOCAL_CIEMASK_BLURCONT;Local - CIECAM Mask blur contrast +!HISTORY_MSG_LOCAL_CIEMASK_BLURFFT;Local - CIECAM Mask blur FFTW +!HISTORY_MSG_LOCAL_CIEMASK_BLURRAD;Local - CIECAM Mask blur radius +!HISTORY_MSG_LOCAL_CIEMASK_CHH;Local - CIECAM Mask curve h(h) +!HISTORY_MSG_LOCAL_CIEMASK_HIGH;Local - CIECAM Mask highlights +!HISTORY_MSG_LOCAL_CIEMASK_SHAD;Local - CIECAM Mask shadows +!HISTORY_MSG_LOCAL_CIEMASK_STRU;Local - CIECAM Mask structure +!HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;Local - CIECAM Mask structure as tool +!HISTORY_MSG_LOCAL_CIEMASK_WLC;Local - CIECAM Mask wavelet L(L) +!HISTORY_MSG_LOCAL_CIEMASK_WLEV;Local - CIECAM Mask wavelet levels +!HISTORY_MSG_LOCAL_CIE_ANGGRAD;Local - CIECAM Gradient angle +!HISTORY_MSG_LOCAL_CIE_BLACKS;Local - CIECAM Blacks distribution +!HISTORY_MSG_LOCAL_CIE_BLUXL;Local - CIECAM Blue X +!HISTORY_MSG_LOCAL_CIE_BLUYL;Local - CIECAM Blue Y +!HISTORY_MSG_LOCAL_CIE_BRICOMP;Local - CIECAM Brightness compression +!HISTORY_MSG_LOCAL_CIE_BRICOMPTH;Local - CIECAM Brightness compression threshold +!HISTORY_MSG_LOCAL_CIE_BWCIE;Local - CIECAM Black and white +!HISTORY_MSG_LOCAL_CIE_CAT;Local - Matrix adaptation +!HISTORY_MSG_LOCAL_CIE_DETAILJZ;Local - JzCzHz Local contrast +!HISTORY_MSG_LOCAL_CIE_ENAMASKALL;Local - CIECAM All mask tools +!HISTORY_MSG_LOCAL_CIE_EXPPRECAM;Local - CIECAM Pre-Cam +!HISTORY_MSG_LOCAL_CIE_GAM;Local - CIECAM Gamma +!HISTORY_MSG_LOCAL_CIE_GAMUTCIE;Local - CIECAM Gamut +!HISTORY_MSG_LOCAL_CIE_GREXL;Local - CIECAM Green X +!HISTORY_MSG_LOCAL_CIE_GREYL;Local - CIECAM Green Y +!HISTORY_MSG_LOCAL_CIE_ILL;Local - CIECAM TRC Illuminant +!HISTORY_MSG_LOCAL_CIE_LOGCIEQ;Local - CIECAM Log encoding Q +!HISTORY_MSG_LOCAL_CIE_MIDT;Local - CIECAM Mid Tones +!HISTORY_MSG_LOCAL_CIE_NORM;Local - CIECAM Normalize L +!HISTORY_MSG_LOCAL_CIE_PRIM;Local - CIECAM TRC primaries +!HISTORY_MSG_LOCAL_CIE_REDXL;Local - CIECAM Red X +!HISTORY_MSG_LOCAL_CIE_REDYL;Local - CIECAM Red Y +!HISTORY_MSG_LOCAL_CIE_REFI;Local - CIECAM Refinement colors +!HISTORY_MSG_LOCAL_CIE_SATCIE;Local - CIECAM Saturation control +!HISTORY_MSG_LOCAL_CIE_SHIFTXL;Local - CIECAM Shift x +!HISTORY_MSG_LOCAL_CIE_SHIFTYL;Local - CIECAM Shift y +!HISTORY_MSG_LOCAL_CIE_SIG;Local - Sigmoid +!HISTORY_MSG_LOCAL_CIE_SIGADAP;Local - CIECAM Sigmoid adaptability +!HISTORY_MSG_LOCAL_CIE_SIGMET;Local - CIECAM Sigmoid method +!HISTORY_MSG_LOCAL_CIE_SLOP;Local - CIECAM Slope +!HISTORY_MSG_LOCAL_CIE_SLOPESMO;Local - CIECAM Gray balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOB;Local - CIECAM Blue balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOG;Local - CIECAM Green balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOR;Local - CIECAM Red balance +!HISTORY_MSG_LOCAL_CIE_SMOOTH;Local - CIECAM Scale Yb scene +!HISTORY_MSG_LOCAL_CIE_SMOOTHMET;Local - CIECAM Smooth lights method +!HISTORY_MSG_LOCAL_CIE_SMOOTHYB;Local - CIECAM Scale Yb viewing +!HISTORY_MSG_LOCAL_CIE_SMOOTH_LUM;Local - CIECAM Levels - Luminosity mode +!HISTORY_MSG_LOCAL_CIE_STRGRAD;Local - CIECAM Gradient strength L +!HISTORY_MSG_LOCAL_CIE_STRLOG;Local - CIECAM Log encoding strength +!HISTORY_MSG_LOCAL_CIE_TRC;Local - CIECAM TRC +!HISTORY_MSG_LOCAL_CIE_WHITES;Local - CIECAM Whites distribution +!HISTORY_MSG_LOCAL_DEHAZE_BLACK;Local - Dehaze Black +!HISTORY_MSG_LOCAL_FEATHERCIE;Local - CIECAM Gradient feather +!HISTORY_MSG_LOCAL_FEATHERCOL;Local - Color Gradient feather +!HISTORY_MSG_LOCAL_FEATHEREXE;Local - Exp Gradient feather +!HISTORY_MSG_LOCAL_FEATHERLOG;Local - Log Gradient feather +!HISTORY_MSG_LOCAL_FEATHERMAS;Local - Mask Common gradient feather +!HISTORY_MSG_LOCAL_FEATHERSH;Local - SH Gradient feather +!HISTORY_MSG_LOCAL_FEATHERVIB;Local - Vib Gradient feather +!HISTORY_MSG_LOCAL_FEATHERWAV;Local - Wav Gradient feather !HISTORY_MSG_LOCAL_GAMUTMUNSEL;Local - SC - Avoid Color Shift +!HISTORY_MSG_LOCAL_LOG_BLACKS;Local - Log Blacks distribution +!HISTORY_MSG_LOCAL_LOG_COMPR;Local - Log Compress brightness +!HISTORY_MSG_LOCAL_LOG_SAT;Local - Log Saturation control +!HISTORY_MSG_LOCAL_LOG_WHITES;Local - Log Whites distribution !HISTORY_MSG_LOCAL_TMO_SATUR;Local Exp Fattal Saturation !HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold @@ -1699,7 +1773,7 @@ !MAIN_TAB_FILTER; Filter !MAIN_TAB_INSPECT; Inspect !MAIN_TAB_IPTC;IPTC -!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB;Selective Editing !MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o !MAIN_TAB_METADATA;Metadata !MAIN_TAB_METADATA_TOOLTIP;Shortcut: Alt-m @@ -1720,7 +1794,7 @@ !MAIN_TOOLTIP_PREVIEWG;Preview the green channel.\nShortcut: g !MAIN_TOOLTIP_PREVIEWL;Preview the luminosity.\nShortcut: v\n\n0.299*R + 0.587*G + 0.114*B !MAIN_TOOLTIP_PREVIEWR;Preview the red channel.\nShortcut: r -!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%, or when capture sharpening is enabled. !MAIN_TOOLTIP_QINFO;Quick info on the image.\nShortcut: i !MAIN_TOOLTIP_SHOWHIDELP1;Show/Hide the left panel.\nShortcut: l !MAIN_TOOLTIP_SHOWHIDERP1;Show/Hide the right panel.\nShortcut: Alt-l @@ -1786,8 +1860,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_LOCALLAB;Selective Editing +!PARTIALPASTE_LOCALLABGROUP;Selective Editing Settings !PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_METAGROUP;Metadata settings !PARTIALPASTE_PCVIGNETTE;Vignette filter @@ -1834,7 +1908,6 @@ !PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color !PREFERENCES_APPEARANCE_MAINFONT;Main font !PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator guide color -!PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode !PREFERENCES_APPEARANCE_THEME;Theme !PREFERENCES_APPLNEXTSTARTUP;restart required !PREFERENCES_AUTOMONPROFILE;Use operating system's main monitor color profile @@ -1845,6 +1918,9 @@ !PREFERENCES_BEHAVIOR;Behavior !PREFERENCES_BEHSETALL;All to 'Set' !PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. +!PREFERENCES_BROWSERECURSIVEDEPTH;Browse sub-folders depth +!PREFERENCES_BROWSERECURSIVEFOLLOWLINKS;Follow symbolic links when browsing sub-folders +!PREFERENCES_BROWSERECURSIVEMAXDIRS;Maximum sub-folders !PREFERENCES_CACHECLEAR;Clear !PREFERENCES_CACHECLEAR_ALL;Clear all cached files: !PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: @@ -1867,7 +1943,7 @@ !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_COMPLEXITYLOC;Default complexity for Selective Editing !PREFERENCES_COMPLEXITY_EXP;Advanced !PREFERENCES_COMPLEXITY_NORM;Standard !PREFERENCES_COMPLEXITY_SIMP;Basic @@ -1946,6 +2022,7 @@ !PREFERENCES_LENSPROFILESDIR;Lens profiles directory !PREFERENCES_LENSPROFILESDIR_TOOLTIP;Directory containing Adobe Lens Correction Profiles (LCPs) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders +!PREFERENCES_MAX_ZOOM_TITLE;Maximum zoom !PREFERENCES_MENUGROUPEXTPROGS;Group 'Open with' !PREFERENCES_MENUGROUPFILEOPERATIONS;Group 'File operations' !PREFERENCES_MENUGROUPLABEL;Group 'Color label' @@ -1971,7 +2048,7 @@ !PREFERENCES_PARSEDEXT;Parsed Extensions !PREFERENCES_PARSEDEXTADD;Add extension !PREFERENCES_PARSEDEXTADDHINT;Add entered extension to the list. -!PREFERENCES_PARSEDEXTDELHINT;Delete selected extension from the list. +!PREFERENCES_PARSEDEXTDELHINT;Delete selected extension from the list.\nPredefined extensions cannot be deleted. !PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. !PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. !PREFERENCES_PERFORMANCE_MEASURE;Measure @@ -1996,6 +2073,8 @@ !PREFERENCES_PRTINTENT;Rendering intent !PREFERENCES_PRTPROFILE;Color profile !PREFERENCES_PSPATH;Adobe Photoshop installation directory +!PREFERENCES_RAW_DECODER;Raw Decoder +!PREFERENCES_RAW_DECODER_ENABLE_LIBRAW;Use LibRaw !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in 'Single Editor Tab Mode' and when 'Demosaicing method used for the preview at <100% zoom' is set to 'As in PP3'. !PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now @@ -2008,7 +2087,7 @@ !PREFERENCES_SHOWDATETIME;Show date and time !PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation !PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar -!PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips +!PREFERENCES_SHOWTOOLTIP;Show Selective Editing advice tooltips !PREFERENCES_SHTHRESHOLD;Threshold for clipped shadows !PREFERENCES_SINGLETAB;Single Editor Tab Mode !PREFERENCES_SINGLETABVERTAB;Single Editor Tab Mode, Vertical Tabs @@ -2016,6 +2095,7 @@ !PREFERENCES_SND_LNGEDITPROCDONE;Editor processing done !PREFERENCES_SND_QUEUEDONE;Queue processing done !PREFERENCES_SND_THRESHOLDSECS;After seconds +!PREFERENCES_SPOTLOC;Define Spot method for Selective Editing !PREFERENCES_STARTUPIMDIR;Image Directory at Startup !PREFERENCES_TAB_BROWSER;File Browser !PREFERENCES_TAB_COLORMGR;Color Management @@ -2029,6 +2109,7 @@ !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_THUMBNAIL_RANK_COLOR_MODE;Load/Save thumbnail rank and color from/to XMP sidecars !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. @@ -2082,6 +2163,7 @@ !PROGRESSBAR_LOADING;Loading image... !PROGRESSBAR_LOADINGTHUMBS;Loading thumbnails... !PROGRESSBAR_LOADJPEG;Loading JPEG file... +!PROGRESSBAR_LOADJXL;Loading JXL file... !PROGRESSBAR_LOADPNG;Loading PNG file... !PROGRESSBAR_LOADTIFF;Loading TIFF file... !PROGRESSBAR_NOIMAGES;No images found @@ -2102,10 +2184,31 @@ !QUEUE_AUTOSTART;Auto-start !QUEUE_AUTOSTART_TOOLTIP;Start processing automatically when a new job arrives. !QUEUE_DESTFILENAME;Path and file name +!QUEUE_DESTPREVIEW_TITLE;Select a thumbnail to preview its destination path here +!QUEUE_DESTPREVIEW_TOOLTIP;Destination path for the first selected image appears here !QUEUE_FORMAT_TITLE;File Format !QUEUE_LOCATION_FOLDER;Save to folder !QUEUE_LOCATION_TEMPLATE;Use template -!QUEUE_LOCATION_TEMPLATE_TOOLTIP;Specify the output location based on the source photo's location, rank, trash status or position in the queue.\n\nUsing the following pathname as an example:\n/home/tom/photos/2010-10-31/photo1.raw\nthe meaning of the formatting strings follows:\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 will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used.\n\n%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'.\n\nIf you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p2/converted/%d1/%f +!QUEUE_LOCATION_TEMPLATE_HELP_BUTTON_TOOLTIP;Show or hide a help panel with instructions for creating location templates +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_BODY;If you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p-3/converted/%P-4/%f +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_TITLE;Common examples +!QUEUE_LOCATION_TEMPLATE_HELP_INTRO;The output template field allows you to to dynamically customize the destination folder and filename. When you include certain specifiers, which begin with %, they are replaced by the program when each file is being saved.\n\nThe sections below describe each type of specifier. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_1;Using this pathname as an example: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_2;The meanings of the formatting strings are: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_LINUX;/home/tom/photos/2010-10-31/photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_WINDOWS;D:\tom\photos\2010-10-31\photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO;The %dN, %d-N, %pN, %p-N, %PN and %P-N (N = 1..9) specifiers will be replaced by elements of the image file's directory path.\nThe format specifiers operate as follows:\n %dN = Nth directory from the end of the path\n %d-N = Nth directory from the start of the path\n %pN = all directories up to the Nth from the end of the path\n %p-N = the first N directories in the path\n %PN = the last N directories in the path\n %P-N = all directories from the Nth to the end of the path\n %f = base filename (no extension) +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO_WINDOWS;For Windows paths, %d-1 is the drive letter and colon, and %d-2 is the base directory on that drive. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_TITLE;Directories and partial paths +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_BODY;%r will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used. +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_TITLE;Rank +!QUEUE_LOCATION_TEMPLATE_HELP_RESULT_MISMATCH;ERROR: 2nd result is different: +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_BODY;%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'. +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_TITLE;Position/sequence in queue +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_BODY;Three different date/time values may be used in templates:\n %tE"%Y-%m-%d" = when export started\n %tF"%Y-%m-%d" = when file was last saved\n %tP"%Y-%m-%d" = when photo was taken\nThe quoted string defines the format of the resulting date and/or time. The format string %tF"%Y-%m-%d" is just one example. The string can use all conversion specifiers defined for the g_date_time_format function (see https://docs.gtk.org/glib/method.DateTime.format.html).\n\nExample format strings: +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_TITLE;Date and time +!QUEUE_LOCATION_TEMPLATE_HELP_TITLE;Creating an output template +!QUEUE_LOCATION_TEMPLATE_TOOLTIP;Specify the output location based on characteristics such as the source photo's location, rank, trash status or position in the queue.\n\nThe output template field value can include specifiers beginning with %, which are replaced by those characteristics in the actual destination path.\n\nPress the ? button for full instructions. !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 @@ -2144,12 +2247,16 @@ !SORT_BY_NAME;By Name !SORT_BY_RANK;By Rank !SORT_DESCENDING;Descending +!TC_LOCALLAB_PRIM_SHIFTX;Shift x +!TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP;In combination with "Refine colors", allows you to:\n 1) for low values, adjust the image purity.\n 2) for higher values, carry out moderate color toning.\nBe careful not to go outside the CIE xy diagram. +!TC_LOCALLAB_PRIM_SHIFTY;Shift y !TC_PRIM_BLUX;Bx !TC_PRIM_BLUY;By !TC_PRIM_GREX;Gx !TC_PRIM_GREY;Gy !TC_PRIM_REDX;Rx !TC_PRIM_REDY;Ry +!TC_PRIM_REFI;Refine colors (white-point) !THRESHOLDSELECTOR_B;Bottom !THRESHOLDSELECTOR_BL;Bottom-left !THRESHOLDSELECTOR_BR;Bottom-right @@ -2600,6 +2707,7 @@ !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_BW;Black and White !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. @@ -2613,8 +2721,8 @@ !TP_ICM_INPUTCUSTOM;Custom !TP_ICM_INPUTCUSTOM_TOOLTIP;Select your own DCP/ICC color profile file for the camera. !TP_ICM_INPUTDLGLABEL;Select Input DCP/ICC Profile... -!TP_ICM_INPUTEMBEDDED;Use embedded, if possible -!TP_ICM_INPUTEMBEDDED_TOOLTIP;Use color profile embedded in non-raw files. +!TP_ICM_INPUTEMBEDDED;Use embedded +!TP_ICM_INPUTEMBEDDED_TOOLTIP;Use the color profile embedded in the file.\nIf unavailable, fall back to Camera standard !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 @@ -2637,9 +2745,16 @@ !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_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 three main uses - channel mixer, restore image color (saturation), 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_CAT;Matrix adaptation +!TP_ICM_WORKING_CAT_BRAD;Bradford +!TP_ICM_WORKING_CAT_CAT02;Cat02 +!TP_ICM_WORKING_CAT_CAT16;Cat16 +!TP_ICM_WORKING_CAT_TOOLTIP;Performs the chromatic adaptation of the XYZ conversion matrix. Default: Bradford +!TP_ICM_WORKING_CAT_VK;Von Kries +!TP_ICM_WORKING_CAT_XYZ;XYZ scale !TP_ICM_WORKING_CIEDIAG;CIE xy diagram !TP_ICM_WORKING_ILLU;Illuminant !TP_ICM_WORKING_ILLU_1500;Tungsten 1500K @@ -2651,11 +2766,13 @@ !TP_ICM_WORKING_ILLU_D65;D65 !TP_ICM_WORKING_ILLU_D80;D80 !TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_E;E !TP_ICM_WORKING_ILLU_NONE;Default !TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_NON;None !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_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination primaries' combo box, 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 @@ -2664,11 +2781,14 @@ !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_FREE;Custom LA (sliders) !TP_ICM_WORKING_PRIM_JDCMAX;JDC Max +!TP_ICM_WORKING_PRIM_JDCMAXSTDA;JDC Max stdA !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_TOOLTIP;Performs a gamut control. Destination primaries (Advanced) allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified.\nWhen 'Custom LA (sliders)' is selected, you can modify the values of the 3 primaries (Red, Green, and Blue) for x and y. !TP_ICM_WORKING_PRIM_WID;WideGamut !TP_ICM_WORKING_TRC;Tone response curve: !TP_ICM_WORKING_TRC_18;Prophoto g=1.8 @@ -2726,6 +2846,7 @@ !TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected !TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file !TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected +!TP_LENSPROFILE_CORRECTION_METADATA;From file metadata !TP_LENSPROFILE_LABEL;Profiled Lens Correction !TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. !TP_LENSPROFILE_MODE_HEADER;Lens Profile @@ -2745,9 +2866,9 @@ !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_AUTOGRAYCIE;Automatic !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_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab). Default: Munsell only.\n\nMunsell only: 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. The result is not the same as Lab. !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 @@ -2790,9 +2911,12 @@ !TP_LOCALLAB_BUTTON_DUPL;Duplicate !TP_LOCALLAB_BUTTON_REN;Rename !TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWEVNONE;None +!TP_LOCALLAB_BWEVSIG;Activated +!TP_LOCALLAB_BWEVSIGLOG;Sigmoid & Log-Encoding !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_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16 (experimental). 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, for example, to match CAM16 processing with the maximum monitor brightness of 400cd/m2. !TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments !TP_LOCALLAB_CAMMODE;CAM model !TP_LOCALLAB_CAMMODE_CAM16;CAM 16 @@ -2832,6 +2956,12 @@ !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_SMOOTHFRAME;Highlight Attenuation & Levels +!TP_LOCALLAB_CIE_SMOOTH_EV;Ev based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA;Slope based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF;Gamma based +!TP_LOCALLAB_CIE_SMOOTH_LEVELS;Levels +!TP_LOCALLAB_CIE_SMOOTH_NONE;None !TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) !TP_LOCALLAB_CIRCRADIUS;Spot size !TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the 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. @@ -2847,8 +2977,9 @@ !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_COLORDEPREV_TOOLTIP;Preview ΔE button in Settings will only work if you have activated 'Sharpening', 'Soft Light and Original Retinex', 'Blur/Grain and Denoise', 'Dehaze and Retinex', or 'Contrast by Detail Levels' in the 'Add tool to current spot' menu.\nFor others tools, the Preview ΔE button is in the tool, which allows previewing ΔE with several tools enabled. Prefer using Mask and modifications. !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_COLORFRAME;Dominant color !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 @@ -2856,7 +2987,10 @@ !TP_LOCALLAB_COL_NAME;Name !TP_LOCALLAB_COL_VIS;Status !TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPRCIE;Brightness compression +!TP_LOCALLAB_COMPRCIETH;Compression threshold !TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_COMPRLOG_TOOLTIP;This algorithm compress the data before log conversion, above the threshold slider value. To use in conjunction with Whites distribution. !TP_LOCALLAB_CONTCOL;Contrast threshold !TP_LOCALLAB_CONTFRA;Contrast by level !TP_LOCALLAB_CONTRAST;Contrast @@ -2871,7 +3005,7 @@ !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 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 spot. -!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combo box 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. @@ -2880,13 +3014,14 @@ !TP_LOCALLAB_DARKRETI;Darkness !TP_LOCALLAB_DEHAFRA;Dehaze !TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZE_BLACK;Black !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_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. @@ -2906,6 +3041,7 @@ !TP_LOCALLAB_DETAILFRA;Edge detection - DCT !TP_LOCALLAB_DETAILSH;Details !TP_LOCALLAB_DETAILTHR;Lum/chrom detail threshold +!TP_LOCALLAB_DISAB_CIECAM;Disable Ciecam or Weak Jz surround !TP_LOCALLAB_DIVGR;Gamma !TP_LOCALLAB_DUPLSPOTNAME;Copy !TP_LOCALLAB_EDGFRA;Edge sharpness @@ -2914,6 +3050,7 @@ !TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping !TP_LOCALLAB_ENABLE_MASK;Enable mask !TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENABLE_MASKALL;Enable all mask tools !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 @@ -2929,9 +3066,10 @@ !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_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all selective editing data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\nUse 'Scope' (Excluding) to set the exclusion intensity.\n\n'Full image' allows you to use the selective editing tools on the whole image.\nThe RT Spot delimiters are set beyond the image preview boundaries.\nThe 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.\nNote: 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.\n\n'Global' allows you to use the selective editing tools on the whole image, without using Delta E or transitions. !TP_LOCALLAB_EXECLU;Excluding spot !TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXMAIN;Global !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 @@ -2940,11 +3078,11 @@ !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_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Selective Editing 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 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_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. @@ -2966,7 +3104,8 @@ !TP_LOCALLAB_FATSAT;Saturation control !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_FEATVALUE;Feather gradient +!TP_LOCALLAB_FEATVALUE_MASK;Feather gradient (Grad. Filters Mask) !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 @@ -3062,7 +3201,7 @@ !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_LABEL;Selective Editing !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 @@ -3107,8 +3246,10 @@ !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_LOGCIE;Log encoding +!TP_LOCALLAB_LOGCIEQ;Log Encoding Q (with Ciecam) +!TP_LOCALLAB_LOGCIEQ_TOOLTIP;Activating the checkbox allows you to switch between log encoding based on the 3 RGB channels, and log encoding based solely on Ciecam’s brightness (Q) channel.\nUsing the Q channel instead of the RGB channels helps avoid undesirable edge effects such as hue and saturation shifts.\nHowever, the settings are more difficult to optimise because Q is unbounded and Ciecam alters the data to take into account the surround conditions, simultaneous contrast, etc.\nYou may have to adjust the following:\n Scene conditions: Mean luminance (Yb), Whites & Blacks distribution, Black Ev, White Ev.\n Source Data Adjustments : Brightness compression, Strength.\n\nNote: when using Log Encoding (Q), be careful not to activate the Disable Ciecam option in the Scene Conditions, Surround menu. +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you to use Black Ev, White Ev, White and Black distribution, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using 'Log encoding' with Brightness compression. !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) @@ -3116,7 +3257,7 @@ !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_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 @@ -3129,6 +3270,7 @@ !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_LOGPFRA2;Log Encoding settings !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. @@ -3198,7 +3340,7 @@ !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_MASKUNUSABLE;Mask disabled (Enable in 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 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 @@ -3234,6 +3376,7 @@ !TP_LOCALLAB_MERTWE;Exclusion !TP_LOCALLAB_MERTWO;Subtract !TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MIDTCIE;Midtones !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 @@ -3281,10 +3424,15 @@ !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_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_PRECAMGAMUT_TOOLTIP;If checked, ensures a gamut control just after primary conversion to XYZ. +!TP_LOCALLAB_PRECAMREFIMAIN_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. In combination with "Shift x" and "Shift y", allows you to carry out moderate color toning. +!TP_LOCALLAB_PRECAMREFI_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. +!TP_LOCALLAB_PRECAM_TOOLTIP;'Source Data Adjustments' modifies the Dynamic Range using Log encoding, the tones of the image and primaries (simplified Abstract Profile), and midtones, just before the Ciecam process. These values are adjustable:\nGamma: Acts mainly on light tones\nSlope: Acts mainly on dark tones. You 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.\nDestination primaries: Allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified. You can also finely adapt the primaries and the illuminant (white-point). Moving a primary away from the white point reduces saturation and vice versa. Pay attention to the gamut. !TP_LOCALLAB_PREVHIDE;Hide additional settings !TP_LOCALLAB_PREVIEW;Preview ΔE !TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PRIMILLFRAME;Primaries & Illuminant !TP_LOCALLAB_PROXI;ΔE decay !TP_LOCALLAB_QUAAGRES;Aggressive !TP_LOCALLAB_QUACONSER;Conservative @@ -3329,10 +3477,11 @@ !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_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_SATCIE;Saturation control !TP_LOCALLAB_SATUR;Saturation !TP_LOCALLAB_SATURV;Saturation (s) !TP_LOCALLAB_SCALEGR;Scale @@ -3353,7 +3502,7 @@ !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_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;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. @@ -3399,17 +3548,41 @@ !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_SIGBLACKSSCIE;Blacks distribution +!TP_LOCALLAB_SIGCIE;Sigmoid +!TP_LOCALLAB_SIGFRA;Sigmoid Q +!TP_LOCALLAB_SIGGAMJCIE;Gamma !TP_LOCALLAB_SIGJZFRA;Sigmoid Jz !TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOID16_TOOLTIP;Allows you to simulate a tone mapping appearance using both 'Ciecam' and 'Sigmoid Q'. Sigmoid Q has three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc) Adaptability weights the action of the sigmoid by action on the internal exponential function. !TP_LOCALLAB_SIGMOIDBL;Blend !TP_LOCALLAB_SIGMOIDLAMBDA;Contrast -!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDLOGAUTO;Auto threshold +!TP_LOCALLAB_SIGMOIDLOGEV_TOOLTIP;If the combo box selection 'Black Ev and White Ev' is 'Sigmoid and Log encoding' instead of 'Sigmoid only', the two algorithms 'Log encoding' and 'Sigmoid' are used together. +!TP_LOCALLAB_SIGMOIDNORMCIE;Normalize Luminance +!TP_LOCALLAB_SIGMOIDNORMCIEBLEND_TOOLTIP;Blend acts on the final aspect of the image, contrast and luminance. Ratio between original and output image. +!TP_LOCALLAB_SIGMOIDNORMCIE_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image take into account those of the original.\nAll the adjustments acting on J or Q are taken into account, including those which are not relative to Sigmoid Q. +!TP_LOCALLAB_SIGMOIDQJ;Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDQJCOMPRCIE_TOOLTIP;When the combo box selection 'Uses Black Ev and White Ev' is 'Sigmoid and Log encoding Q' or 'Log encoding instead of Sigmoid' checked. This algorithm compress the data above the threshold slider value. The last value stands for brightness (Q) and should be close as possible to the value 'Compression threshold' (calculate when 'Auto threshold" checked, often > 1). +!TP_LOCALLAB_SIGMOIDSENSI;Adaptability !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_SIGMOIDWHITESCIE_TOOLTIP;Allows you, in Automatic when the dynamic range of the image is high, to change the distribution of lights in whites and deep blacks.\nCan be used with Log encoding or Sigmoid with Black Ev and White Ev enabled.\n\nThe algorithm does not change the basic data, but acts on the components necessary to calculate the Dynamic range, Black Ev, White Ev and the Gray point. +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a tone mapping appearance using both the 'Jz' and 'Sigmoid' function. Three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SIGSLOPJCIE;Slope +!TP_LOCALLAB_SIGTRCCIE;Source Data Adjustments +!TP_LOCALLAB_SIGWHITESCIE;Whites distribution !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_SLOPESMOOTH;Gray balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHB;Blue balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHG;Green balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHR;Red balance (Slope) !TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SMOOTHCIE;Highlight Attenuation +!TP_LOCALLAB_SMOOTHCIE_LUM;Luminosity mode +!TP_LOCALLAB_SMOOTHCIE_SCA;Scale Yb Scene +!TP_LOCALLAB_SMOOTHCIE_TOOLTIP;Completes the processing carried out by gamma, slope and midtones by causing a slight lowering of lights. Please note this does not replace Highlight reconstruction.\n\nGamma based and Slope based (Standard and Advanced) allow you to simulate a tone mapping using:\na) Scene conditions: Black-Ev, White-Ev, Mean luminance (Yb%)\nb) Viewing conditions: Mean luminance (Yb%).\n\nScale Yb Scene is function of White-Ev. +!TP_LOCALLAB_SMOOTHCIE_YB;Scale Yb Viewing !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. @@ -3431,13 +3604,14 @@ !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_STRENGTHCIELOG;Strength !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_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. @@ -3469,11 +3643,12 @@ !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_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_TRCFRAME;Tone Response Curve & Midtones !TP_LOCALLAB_USEMASK;Laplacian !TP_LOCALLAB_VART;Variance (contrast) !TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool @@ -4127,7 +4302,7 @@ !TP_WBALANCE_AUTO;Auto !TP_WBALANCE_AUTOITCGREEN;Temperature correlation !TP_WBALANCE_AUTOOLD;RGB grey -!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement +!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement !TP_WBALANCE_CAMERA;Camera !TP_WBALANCE_CLOUDY;Cloudy !TP_WBALANCE_CUSTOM;Custom @@ -4203,7 +4378,7 @@ !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_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).\nIn the rare case of a color drift with "Observer 2°" (probably due to the conversion matrix) "Observer 10°" must be selected. !TP_WBALANCE_PATCHLABEL;Read colors:%1 Patch: Chroma:%2 Size=%3 !TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colors (max=237).\nDisplay calculated Patch Chroma.\nAWB temperature bias, lets try to reduce this value, a minimum may seem to optimize the algorithm.\n\nPatch size matching chroma optimization. !TP_WBALANCE_PATCHLEVELLABEL;Patch: ΔE=%1 - datas x 9 Min:%2 Max=%3 diff --git a/rtdata/languages/Espanol (Castellano) b/rtdata/languages/Espanol (Castellano) index 32b5791dc..e554df27d 100644 --- a/rtdata/languages/Espanol (Castellano) +++ b/rtdata/languages/Espanol (Castellano) @@ -76,8 +76,6 @@ 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» @@ -1795,7 +1793,6 @@ 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 @@ -2006,6 +2003,7 @@ PROGRESSBAR_LINEDENOISE;Filtro de ruido de línea... PROGRESSBAR_LOADING;Cargando imagen... PROGRESSBAR_LOADINGTHUMBS;Cargando miniaturas... PROGRESSBAR_LOADJPEG;Cargando archivo JPEG... +PROGRESSBAR_LOADJXL;Cargando archivo JXL... PROGRESSBAR_LOADPNG;Cargando archivo PNG... PROGRESSBAR_LOADTIFF;Cargando archivo TIFF... PROGRESSBAR_NOIMAGES;No se encuentran imágenes @@ -2588,8 +2586,6 @@ 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. @@ -4079,15 +4075,88 @@ ZOOMPANEL_ZOOMOUT;Alejar\nAtajo de teclado: - !EXIFPANEL_BASIC_GROUP;Basic !EXIFPANEL_VALUE_NOT_SHOWN;Not shown !FILEBROWSER_POPUPSORTBY;Sort Files +!FILEBROWSER_SHOWRECURSIVE;Show images in sub-folders recursively. !FILECHOOSER_FILTER_EXECUTABLE;Executable files !GENERAL_OTHER;Other !HISTORY_MSG_DIRPYRDENOISE_GAIN;NR - Compensate for lightness !HISTORY_MSG_FF_FROMMETADATA;Flat-Field - From Metadata !HISTORY_MSG_GAMUTMUNSEL;Gamut-Munsell !HISTORY_MSG_HLTH;Inpaint opposed - gain threshold +!HISTORY_MSG_ICM_CAT;Matrix adaptation !HISTORY_MSG_ICM_GAMUT;Gamut control +!HISTORY_MSG_ICM_MIDTCIE;Midtones +!HISTORY_MSG_ICM_REFI;Refinement Colors +!HISTORY_MSG_ICM_SHIFTX;Refinement Colors - Shift x +!HISTORY_MSG_ICM_SHIFTY;Refinement Colors - Shift y +!HISTORY_MSG_ICM_SMOOTHCIE;Smooth highlights +!HISTORY_MSG_ICM_TRCEXP;Abstract Profile !HISTORY_MSG_LOCALLAB_TE_PIVOT;Local - Equalizer pivot +!HISTORY_MSG_LOCAL_CIEMASK_BLURCONT;Local - CIECAM Mask blur contrast +!HISTORY_MSG_LOCAL_CIEMASK_BLURFFT;Local - CIECAM Mask blur FFTW +!HISTORY_MSG_LOCAL_CIEMASK_BLURRAD;Local - CIECAM Mask blur radius +!HISTORY_MSG_LOCAL_CIEMASK_CHH;Local - CIECAM Mask curve h(h) +!HISTORY_MSG_LOCAL_CIEMASK_HIGH;Local - CIECAM Mask highlights +!HISTORY_MSG_LOCAL_CIEMASK_SHAD;Local - CIECAM Mask shadows +!HISTORY_MSG_LOCAL_CIEMASK_STRU;Local - CIECAM Mask structure +!HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;Local - CIECAM Mask structure as tool +!HISTORY_MSG_LOCAL_CIEMASK_WLC;Local - CIECAM Mask wavelet L(L) +!HISTORY_MSG_LOCAL_CIEMASK_WLEV;Local - CIECAM Mask wavelet levels +!HISTORY_MSG_LOCAL_CIE_ANGGRAD;Local - CIECAM Gradient angle +!HISTORY_MSG_LOCAL_CIE_BLACKS;Local - CIECAM Blacks distribution +!HISTORY_MSG_LOCAL_CIE_BLUXL;Local - CIECAM Blue X +!HISTORY_MSG_LOCAL_CIE_BLUYL;Local - CIECAM Blue Y +!HISTORY_MSG_LOCAL_CIE_BRICOMP;Local - CIECAM Brightness compression +!HISTORY_MSG_LOCAL_CIE_BRICOMPTH;Local - CIECAM Brightness compression threshold +!HISTORY_MSG_LOCAL_CIE_BWCIE;Local - CIECAM Black and white +!HISTORY_MSG_LOCAL_CIE_CAT;Local - Matrix adaptation +!HISTORY_MSG_LOCAL_CIE_DETAILJZ;Local - JzCzHz Local contrast +!HISTORY_MSG_LOCAL_CIE_ENAMASKALL;Local - CIECAM All mask tools +!HISTORY_MSG_LOCAL_CIE_EXPPRECAM;Local - CIECAM Pre-Cam +!HISTORY_MSG_LOCAL_CIE_GAM;Local - CIECAM Gamma +!HISTORY_MSG_LOCAL_CIE_GAMUTCIE;Local - CIECAM Gamut +!HISTORY_MSG_LOCAL_CIE_GREXL;Local - CIECAM Green X +!HISTORY_MSG_LOCAL_CIE_GREYL;Local - CIECAM Green Y +!HISTORY_MSG_LOCAL_CIE_ILL;Local - CIECAM TRC Illuminant +!HISTORY_MSG_LOCAL_CIE_LOGCIEQ;Local - CIECAM Log encoding Q +!HISTORY_MSG_LOCAL_CIE_MIDT;Local - CIECAM Mid Tones +!HISTORY_MSG_LOCAL_CIE_NORM;Local - CIECAM Normalize L +!HISTORY_MSG_LOCAL_CIE_PRIM;Local - CIECAM TRC primaries +!HISTORY_MSG_LOCAL_CIE_REDXL;Local - CIECAM Red X +!HISTORY_MSG_LOCAL_CIE_REDYL;Local - CIECAM Red Y +!HISTORY_MSG_LOCAL_CIE_REFI;Local - CIECAM Refinement colors +!HISTORY_MSG_LOCAL_CIE_SATCIE;Local - CIECAM Saturation control +!HISTORY_MSG_LOCAL_CIE_SHIFTXL;Local - CIECAM Shift x +!HISTORY_MSG_LOCAL_CIE_SHIFTYL;Local - CIECAM Shift y +!HISTORY_MSG_LOCAL_CIE_SIG;Local - Sigmoid +!HISTORY_MSG_LOCAL_CIE_SIGADAP;Local - CIECAM Sigmoid adaptability +!HISTORY_MSG_LOCAL_CIE_SIGMET;Local - CIECAM Sigmoid method +!HISTORY_MSG_LOCAL_CIE_SLOP;Local - CIECAM Slope +!HISTORY_MSG_LOCAL_CIE_SLOPESMO;Local - CIECAM Gray balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOB;Local - CIECAM Blue balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOG;Local - CIECAM Green balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOR;Local - CIECAM Red balance +!HISTORY_MSG_LOCAL_CIE_SMOOTH;Local - CIECAM Scale Yb scene +!HISTORY_MSG_LOCAL_CIE_SMOOTHMET;Local - CIECAM Smooth lights method +!HISTORY_MSG_LOCAL_CIE_SMOOTHYB;Local - CIECAM Scale Yb viewing +!HISTORY_MSG_LOCAL_CIE_SMOOTH_LUM;Local - CIECAM Levels - Luminosity mode +!HISTORY_MSG_LOCAL_CIE_STRGRAD;Local - CIECAM Gradient strength L +!HISTORY_MSG_LOCAL_CIE_STRLOG;Local - CIECAM Log encoding strength +!HISTORY_MSG_LOCAL_CIE_TRC;Local - CIECAM TRC +!HISTORY_MSG_LOCAL_CIE_WHITES;Local - CIECAM Whites distribution +!HISTORY_MSG_LOCAL_DEHAZE_BLACK;Local - Dehaze Black +!HISTORY_MSG_LOCAL_FEATHERCIE;Local - CIECAM Gradient feather +!HISTORY_MSG_LOCAL_FEATHERCOL;Local - Color Gradient feather +!HISTORY_MSG_LOCAL_FEATHEREXE;Local - Exp Gradient feather +!HISTORY_MSG_LOCAL_FEATHERLOG;Local - Log Gradient feather +!HISTORY_MSG_LOCAL_FEATHERMAS;Local - Mask Common gradient feather +!HISTORY_MSG_LOCAL_FEATHERSH;Local - SH Gradient feather +!HISTORY_MSG_LOCAL_FEATHERVIB;Local - Vib Gradient feather +!HISTORY_MSG_LOCAL_FEATHERWAV;Local - Wav Gradient feather !HISTORY_MSG_LOCAL_GAMUTMUNSEL;Local - SC - Avoid Color Shift +!HISTORY_MSG_LOCAL_LOG_BLACKS;Local - Log Blacks distribution +!HISTORY_MSG_LOCAL_LOG_COMPR;Local - Log Compress brightness +!HISTORY_MSG_LOCAL_LOG_SAT;Local - Log Saturation control +!HISTORY_MSG_LOCAL_LOG_WHITES;Local - Log Whites distribution !HISTORY_MSG_LOCAL_TMO_SATUR;Local Exp Fattal Saturation !HISTORY_MSG_TONE_EQUALIZER_BANDS;Tone equalizer - Bands !HISTORY_MSG_TONE_EQUALIZER_ENABLED;Tone equalizer @@ -4113,6 +4182,9 @@ ZOOMPANEL_ZOOMOUT;Alejar\nAtajo de teclado: - !HISTORY_MSG_WBITC_THRES;Itcwb Threshold !PARTIALPASTE_FLATFIELDFROMMETADATA;Flat-field from Metadata !PARTIALPASTE_TONE_EQUALIZER;Tone equalizer +!PREFERENCES_BROWSERECURSIVEDEPTH;Browse sub-folders depth +!PREFERENCES_BROWSERECURSIVEFOLLOWLINKS;Follow symbolic links when browsing sub-folders +!PREFERENCES_BROWSERECURSIVEMAXDIRS;Maximum sub-folders !PREFERENCES_CAMERAPROFILESDIR;Camera profiles directory !PREFERENCES_EXTERNALEDITOR_CHANGE;Change Application !PREFERENCES_EXTERNALEDITOR_CHANGE_FILE;Change Executable @@ -4123,12 +4195,17 @@ ZOOMPANEL_ZOOMOUT;Alejar\nAtajo de teclado: - !PREFERENCES_LENSFUNDBDIR_TOOLTIP;Directory containing the Lensfun database. Leave empty to use the default directories. !PREFERENCES_LENSPROFILESDIR;Lens profiles directory !PREFERENCES_LENSPROFILESDIR_TOOLTIP;Directory containing Adobe Lens Correction Profiles (LCPs) +!PREFERENCES_MAX_ZOOM_TITLE;Maximum zoom !PREFERENCES_METADATA;Metadata !PREFERENCES_METADATA_SYNC;Metadata synchronization with XMP sidecars !PREFERENCES_METADATA_SYNC_NONE;Off !PREFERENCES_METADATA_SYNC_READ;Read only !PREFERENCES_METADATA_SYNC_READWRITE;Bidirectional +!PREFERENCES_RAW_DECODER;Raw Decoder +!PREFERENCES_RAW_DECODER_ENABLE_LIBRAW;Use LibRaw +!PREFERENCES_SPOTLOC;Define Spot method for Selective Editing !PREFERENCES_TAB_FAVORITES;Favorites +!PREFERENCES_THUMBNAIL_RANK_COLOR_MODE;Load/Save thumbnail rank and color from/to XMP sidecars !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. @@ -4150,6 +4227,27 @@ ZOOMPANEL_ZOOMOUT;Alejar\nAtajo de teclado: - !PREFERENCES_XMP_SIDECAR_MODE;XMP sidecar style !PREFERENCES_XMP_SIDECAR_MODE_EXT;darktable-like (FILENAME.ext.xmp for FILENAME.ext) !PREFERENCES_XMP_SIDECAR_MODE_STD;Standard (FILENAME.xmp for FILENAME.ext) +!QUEUE_DESTPREVIEW_TITLE;Select a thumbnail to preview its destination path here +!QUEUE_DESTPREVIEW_TOOLTIP;Destination path for the first selected image appears here +!QUEUE_LOCATION_TEMPLATE_HELP_BUTTON_TOOLTIP;Show or hide a help panel with instructions for creating location templates +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_BODY;If you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p-3/converted/%P-4/%f +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_TITLE;Common examples +!QUEUE_LOCATION_TEMPLATE_HELP_INTRO;The output template field allows you to to dynamically customize the destination folder and filename. When you include certain specifiers, which begin with %, they are replaced by the program when each file is being saved.\n\nThe sections below describe each type of specifier. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_1;Using this pathname as an example: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_2;The meanings of the formatting strings are: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_LINUX;/home/tom/photos/2010-10-31/photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_WINDOWS;D:\tom\photos\2010-10-31\photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO;The %dN, %d-N, %pN, %p-N, %PN and %P-N (N = 1..9) specifiers will be replaced by elements of the image file's directory path.\nThe format specifiers operate as follows:\n %dN = Nth directory from the end of the path\n %d-N = Nth directory from the start of the path\n %pN = all directories up to the Nth from the end of the path\n %p-N = the first N directories in the path\n %PN = the last N directories in the path\n %P-N = all directories from the Nth to the end of the path\n %f = base filename (no extension) +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO_WINDOWS;For Windows paths, %d-1 is the drive letter and colon, and %d-2 is the base directory on that drive. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_TITLE;Directories and partial paths +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_BODY;%r will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used. +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_TITLE;Rank +!QUEUE_LOCATION_TEMPLATE_HELP_RESULT_MISMATCH;ERROR: 2nd result is different: +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_BODY;%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'. +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_TITLE;Position/sequence in queue +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_BODY;Three different date/time values may be used in templates:\n %tE"%Y-%m-%d" = when export started\n %tF"%Y-%m-%d" = when file was last saved\n %tP"%Y-%m-%d" = when photo was taken\nThe quoted string defines the format of the resulting date and/or time. The format string %tF"%Y-%m-%d" is just one example. The string can use all conversion specifiers defined for the g_date_time_format function (see https://docs.gtk.org/glib/method.DateTime.format.html).\n\nExample format strings: +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_TITLE;Date and time +!QUEUE_LOCATION_TEMPLATE_HELP_TITLE;Creating an output template !SAVEDLG_BIGTIFF;BigTIFF (no metadata support) !SORT_ASCENDING;Ascending !SORT_BY_DATE;By Date @@ -4158,6 +4256,10 @@ ZOOMPANEL_ZOOMOUT;Alejar\nAtajo de teclado: - !SORT_BY_NAME;By Name !SORT_BY_RANK;By Rank !SORT_DESCENDING;Descending +!TC_LOCALLAB_PRIM_SHIFTX;Shift x +!TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP;In combination with "Refine colors", allows you to:\n 1) for low values, adjust the image purity.\n 2) for higher values, carry out moderate color toning.\nBe careful not to go outside the CIE xy diagram. +!TC_LOCALLAB_PRIM_SHIFTY;Shift y +!TC_PRIM_REFI;Refine colors (white-point) !TP_COLORAPP_CIECAT_DEGREEOUT;Chromatic Adaptation Viewing !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_DIRPYRDENOISE_MAIN_AUTO_GAIN;Compensate for lightness @@ -4167,13 +4269,45 @@ ZOOMPANEL_ZOOMOUT;Alejar\nAtajo de teclado: - !TP_FLATFIELD_FROMMETADATA;From Metadata !TP_HLREC_COLOROPP;Inpaint Opposed !TP_HLREC_HLTH;Gain threshold +!TP_ICM_BW;Black and White !TP_ICM_GAMUT;Gamut control +!TP_ICM_WORKING_CAT;Matrix adaptation +!TP_ICM_WORKING_CAT_BRAD;Bradford +!TP_ICM_WORKING_CAT_CAT02;Cat02 +!TP_ICM_WORKING_CAT_CAT16;Cat16 +!TP_ICM_WORKING_CAT_TOOLTIP;Performs the chromatic adaptation of the XYZ conversion matrix. Default: Bradford +!TP_ICM_WORKING_CAT_VK;Von Kries +!TP_ICM_WORKING_CAT_XYZ;XYZ scale +!TP_ICM_WORKING_ILLU_E;E +!TP_ICM_WORKING_NON;None +!TP_ICM_WORKING_PRIM_FREE;Custom LA (sliders) !TP_ICM_WORKING_PRIM_JDCMAX;JDC Max +!TP_ICM_WORKING_PRIM_JDCMAXSTDA;JDC Max stdA +!TP_ICM_WORKING_PRIM_TOOLTIP;Performs a gamut control. Destination primaries (Advanced) allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified.\nWhen 'Custom LA (sliders)' is selected, you can modify the values of the 3 primaries (Red, Green, and Blue) for x and y. +!TP_LENSPROFILE_CORRECTION_METADATA;From file metadata +!TP_LOCALLAB_BWEVNONE;None +!TP_LOCALLAB_BWEVSIG;Activated +!TP_LOCALLAB_BWEVSIGLOG;Sigmoid & Log-Encoding !TP_LOCALLAB_CHRO46LABEL;Chroma levels 456: Mean=%1 High=%2 !TP_LOCALLAB_CHROLABEL;Chroma levels 0123: Mean=%1 High=%2 +!TP_LOCALLAB_CIE_SMOOTHFRAME;Highlight Attenuation & Levels +!TP_LOCALLAB_CIE_SMOOTH_EV;Ev based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA;Slope based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF;Gamma based +!TP_LOCALLAB_CIE_SMOOTH_LEVELS;Levels +!TP_LOCALLAB_CIE_SMOOTH_NONE;None +!TP_LOCALLAB_COLORFRAME;Dominant color +!TP_LOCALLAB_COMPRCIE;Brightness compression +!TP_LOCALLAB_COMPRCIETH;Compression threshold +!TP_LOCALLAB_COMPRLOG_TOOLTIP;This algorithm compress the data before log conversion, above the threshold slider value. To use in conjunction with Whites distribution. +!TP_LOCALLAB_DEHAZE_BLACK;Black !TP_LOCALLAB_DENOIWAVCH;Wavelets: Chrominance !TP_LOCALLAB_DENOIWAVLUM;Wavelets: Luminance +!TP_LOCALLAB_DISAB_CIECAM;Disable Ciecam or Weak Jz surround +!TP_LOCALLAB_ENABLE_MASKALL;Enable all mask tools +!TP_LOCALLAB_EXMAIN;Global !TP_LOCALLAB_FATSAT;Saturation control +!TP_LOCALLAB_FEATVALUE_MASK;Feather gradient (Grad. Filters Mask) !TP_LOCALLAB_GAMUTLABRELA;Lab !TP_LOCALLAB_GAMUTMUNSELL;Munsell only !TP_LOCALLAB_GAMUTNON;None @@ -4181,9 +4315,45 @@ ZOOMPANEL_ZOOMOUT;Alejar\nAtajo de teclado: - !TP_LOCALLAB_GAMUTXYZRELA;XYZ Relative !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_LOGCIEQ;Log Encoding Q (with Ciecam) +!TP_LOCALLAB_LOGCIEQ_TOOLTIP;Activating the checkbox allows you to switch between log encoding based on the 3 RGB channels, and log encoding based solely on Ciecam’s brightness (Q) channel.\nUsing the Q channel instead of the RGB channels helps avoid undesirable edge effects such as hue and saturation shifts.\nHowever, the settings are more difficult to optimise because Q is unbounded and Ciecam alters the data to take into account the surround conditions, simultaneous contrast, etc.\nYou may have to adjust the following:\n Scene conditions: Mean luminance (Yb), Whites & Blacks distribution, Black Ev, White Ev.\n Source Data Adjustments : Brightness compression, Strength.\n\nNote: when using Log Encoding (Q), be careful not to activate the Disable Ciecam option in the Scene Conditions, Surround menu. +!TP_LOCALLAB_LOGPFRA2;Log Encoding settings !TP_LOCALLAB_LUM46LABEL;Luma levels 456: Mean=%1 High=%2 !TP_LOCALLAB_LUMLABEL;Luma levels 0123: Mean=%1 High=%2 +!TP_LOCALLAB_MIDTCIE;Midtones +!TP_LOCALLAB_PRECAMGAMUT_TOOLTIP;If checked, ensures a gamut control just after primary conversion to XYZ. +!TP_LOCALLAB_PRECAMREFIMAIN_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. In combination with "Shift x" and "Shift y", allows you to carry out moderate color toning. +!TP_LOCALLAB_PRECAMREFI_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. +!TP_LOCALLAB_PRECAM_TOOLTIP;'Source Data Adjustments' modifies the Dynamic Range using Log encoding, the tones of the image and primaries (simplified Abstract Profile), and midtones, just before the Ciecam process. These values are adjustable:\nGamma: Acts mainly on light tones\nSlope: Acts mainly on dark tones. You 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.\nDestination primaries: Allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified. You can also finely adapt the primaries and the illuminant (white-point). Moving a primary away from the white point reduces saturation and vice versa. Pay attention to the gamut. +!TP_LOCALLAB_PRIMILLFRAME;Primaries & Illuminant +!TP_LOCALLAB_SATCIE;Saturation control +!TP_LOCALLAB_SIGBLACKSSCIE;Blacks distribution +!TP_LOCALLAB_SIGCIE;Sigmoid +!TP_LOCALLAB_SIGGAMJCIE;Gamma +!TP_LOCALLAB_SIGMOID16_TOOLTIP;Allows you to simulate a tone mapping appearance using both 'Ciecam' and 'Sigmoid Q'. Sigmoid Q has three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc) Adaptability weights the action of the sigmoid by action on the internal exponential function. +!TP_LOCALLAB_SIGMOIDLOGAUTO;Auto threshold +!TP_LOCALLAB_SIGMOIDLOGEV_TOOLTIP;If the combo box selection 'Black Ev and White Ev' is 'Sigmoid and Log encoding' instead of 'Sigmoid only', the two algorithms 'Log encoding' and 'Sigmoid' are used together. +!TP_LOCALLAB_SIGMOIDNORMCIE;Normalize Luminance +!TP_LOCALLAB_SIGMOIDNORMCIEBLEND_TOOLTIP;Blend acts on the final aspect of the image, contrast and luminance. Ratio between original and output image. +!TP_LOCALLAB_SIGMOIDNORMCIE_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image take into account those of the original.\nAll the adjustments acting on J or Q are taken into account, including those which are not relative to Sigmoid Q. +!TP_LOCALLAB_SIGMOIDQJCOMPRCIE_TOOLTIP;When the combo box selection 'Uses Black Ev and White Ev' is 'Sigmoid and Log encoding Q' or 'Log encoding instead of Sigmoid' checked. This algorithm compress the data above the threshold slider value. The last value stands for brightness (Q) and should be close as possible to the value 'Compression threshold' (calculate when 'Auto threshold" checked, often > 1). +!TP_LOCALLAB_SIGMOIDSENSI;Adaptability +!TP_LOCALLAB_SIGMOIDWHITESCIE_TOOLTIP;Allows you, in Automatic when the dynamic range of the image is high, to change the distribution of lights in whites and deep blacks.\nCan be used with Log encoding or Sigmoid with Black Ev and White Ev enabled.\n\nThe algorithm does not change the basic data, but acts on the components necessary to calculate the Dynamic range, Black Ev, White Ev and the Gray point. +!TP_LOCALLAB_SIGSLOPJCIE;Slope +!TP_LOCALLAB_SIGTRCCIE;Source Data Adjustments +!TP_LOCALLAB_SIGWHITESCIE;Whites distribution +!TP_LOCALLAB_SLOPESMOOTH;Gray balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHB;Blue balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHG;Green balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHR;Red balance (Slope) +!TP_LOCALLAB_SMOOTHCIE;Highlight Attenuation +!TP_LOCALLAB_SMOOTHCIE_LUM;Luminosity mode +!TP_LOCALLAB_SMOOTHCIE_SCA;Scale Yb Scene +!TP_LOCALLAB_SMOOTHCIE_TOOLTIP;Completes the processing carried out by gamma, slope and midtones by causing a slight lowering of lights. Please note this does not replace Highlight reconstruction.\n\nGamma based and Slope based (Standard and Advanced) allow you to simulate a tone mapping using:\na) Scene conditions: Black-Ev, White-Ev, Mean luminance (Yb%)\nb) Viewing conditions: Mean luminance (Yb%).\n\nScale Yb Scene is function of White-Ev. +!TP_LOCALLAB_SMOOTHCIE_YB;Scale Yb Viewing +!TP_LOCALLAB_STRENGTHCIELOG;Strength !TP_LOCALLAB_TE_PIVOT;Pivot (Ev) +!TP_LOCALLAB_TRCFRAME;Tone Response Curve & Midtones !TP_TONE_EQUALIZER_BANDS;Bands !TP_TONE_EQUALIZER_BAND_0;Blacks !TP_TONE_EQUALIZER_BAND_1;Shadows @@ -4236,7 +4406,7 @@ ZOOMPANEL_ZOOMOUT;Alejar\nAtajo de teclado: - !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_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).\nIn the rare case of a color drift with "Observer 2°" (probably due to the conversion matrix) "Observer 10°" must be selected. !TP_WBALANCE_PATCHLABEL;Read colors:%1 Patch: Chroma:%2 Size=%3 !TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colors (max=237).\nDisplay calculated Patch Chroma.\nAWB temperature bias, lets try to reduce this value, a minimum may seem to optimize the algorithm.\n\nPatch size matching chroma optimization. !TP_WBALANCE_PATCHLEVELLABEL;Patch: ΔE=%1 - datas x 9 Min:%2 Max=%3 diff --git a/rtdata/languages/Espanol (Latin America) b/rtdata/languages/Espanol (Latin America) index 9d5e352bd..f0e10ceb1 100644 --- a/rtdata/languages/Espanol (Latin America) +++ b/rtdata/languages/Espanol (Latin America) @@ -136,8 +136,6 @@ EXIFPANEL_RESET;Restablecer EXIFPANEL_RESETALL;Restablecer todo EXIFPANEL_RESETALLHINT;Restablecer todos los atributos a los valores predeterminados EXIFPANEL_RESETHINT;Restablecer atributos seleccionados a los valores predeterminados -EXIFPANEL_SHOWALL;Mostrar todo -EXIFPANEL_SUBDIRECTORY;Subcarpeta EXPORT_BYPASS;Procesamiento de pasos a bypass EXPORT_BYPASS_ALL;Seleccionar / Deseleccionar todo EXPORT_BYPASS_DEFRINGE;Saltar Quitar borde púrpura @@ -889,19 +887,13 @@ IPTCPANEL_TITLE;Título IPTCPANEL_TITLEHINT;Ingrese un nombre corto legible y humano para la imagen, este puede ser el nombre del archivo. IPTCPANEL_TRANSREFERENCE;Identificación del trabajo IPTCPANEL_TRANSREFERENCEHINT;Ingrese un número o identificador necesario para el control o seguimiento del flujo de trabajo. -LENSPROFILE_CORRECTION_AUTOMATCH;Parámetros de corrección auto-emparejados -LENSPROFILE_CORRECTION_LCPFILE;LCP archivo -LENSPROFILE_CORRECTION_MANUAL;Parámetros de corrección manual -LENSPROFILE_LENS_WARNING;Advertencia: el factor de recorte utilizado para el perfilado de la lente es mayor que el factor de recorte de la cámara, los resultados pueden ser incorrectos. MAIN_BUTTON_FULLSCREEN;Pantalla completa MAIN_BUTTON_ICCPROFCREATOR;Creador de perfiles ICC MAIN_BUTTON_NAVNEXT_TOOLTIP;Navegar hasta la imagen Siguiente a la que está abierta en el editor:\nShift-F4\n\nPara navegar hasta la imagen Siguiente a aquella cuya miniatura está seleccionada en el Explorador de Archivos:\nF4 MAIN_BUTTON_NAVPREV_TOOLTIP;Navegar hasta la imagen Anterior a la que está abierta en el editor:\nShift-F3\n\nPara navegar hasta la imagen Anterior a aquella cuya miniatura está seleccionada en el Explorador de Archivos:\nF3 MAIN_BUTTON_NAVSYNC_TOOLTIP;Sincronizar el Navegador de Archivos con el Editor para mostrar la miniatura de la imagen actualmente abierta y quitar los filtros en el Navegador de Archivos:\nx\n\nPara hacer lo dicho anteriormente, pero sin quitar los filtros en el Navegador de Archivos:\ny\n(Note que la miniatura del archivo abierto no será mostrada si los filtros la excluyen). MAIN_BUTTON_PREFERENCES;Preferencias -MAIN_BUTTON_PUTTOQUEUE;Poner en la cola MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Añadir imagen actual a la cola de procesamiento.\nTecla de Atajo: Ctrl+B -MAIN_BUTTON_SAVE;Guardar imagen MAIN_BUTTON_SAVE_TOOLTIP;Guardar imagen actual.\nTecla de Atajo: Ctrl+S MAIN_BUTTON_SENDTOEDITOR;Abrir con editor MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Editar imagen actual en editor externo.\nTecla de Atajo: Ctrl+E @@ -1151,7 +1143,6 @@ PREFERENCES_INTENT_SATURATION;Saturación PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Mostrar miniatura JPEG incrustada si foto Raw no se ha editado PREFERENCES_LANG;Idioma PREFERENCES_LANGAUTODETECT;Usar idioma del sistema -PREFERENCES_MAX;Maxi (baldoza) PREFERENCES_MAXRECENTFOLDERS;Número máximo de carpetas recientes PREFERENCES_MENUGROUPEXTPROGS;Grupo "Abrir con" PREFERENCES_MENUGROUPFILEOPERATIONS;Grupo "Operaciones de archivo" @@ -1253,6 +1244,7 @@ PROFILEPANEL_TOOLTIPSAVE;Guardar perfil actual.\nCtrl-click para seleccio PROGRESSBAR_LOADING;Abriendo imagen... PROGRESSBAR_LOADINGTHUMBS;Cargando miniaturas... PROGRESSBAR_LOADJPEG;Abriendo archivo JPEG... +PROGRESSBAR_LOADJXL;Abriendo archivo JXL... PROGRESSBAR_LOADPNG;Abriendo archivo PNG... PROGRESSBAR_LOADTIFF;Abriendo archivo TIFF... PROGRESSBAR_NOIMAGES;No se han encontrado imágenes @@ -1728,8 +1720,6 @@ TP_ICM_WORKING_TRC_SLOPE;Bajar TP_ICM_WORKING_TRC_TOOLTIP;Solo para perfiles incorporados. TP_IMPULSEDENOISE_LABEL;Impulsar Reducc. ruido TP_IMPULSEDENOISE_THRESH;Umbral -TP_LABCURVE_AVOIDCOLORSHIFT;Evitar desplazamiento de colores -TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Encaja los colores dentro de la gamma del espacio de color de trabajo y aplica la corrección de Munsell TP_LABCURVE_BRIGHTNESS;Brillo TP_LABCURVE_CHROMATICITY;Cromaticidad (Saturación) TP_LABCURVE_CHROMA_TOOLTIP;Para aplicar mapeo tonal en blanco y negro, establezca la Cromaticidad a -100 @@ -1768,7 +1758,9 @@ TP_LABCURVE_RSTPRO_TOOLTIP;Puede usarse con el deslizador Cromaticidad y con la TP_LENSGEOM_AUTOCROP;Auto recorte TP_LENSGEOM_FILL;Auto relleno TP_LENSGEOM_LABEL;Lente / Geometría +TP_LENSPROFILE_CORRECTION_AUTOMATCH;Parámetros de corrección auto-emparejados TP_LENSPROFILE_CORRECTION_LCPFILE;LCP archivo +TP_LENSPROFILE_CORRECTION_MANUAL;Parámetros de corrección manual TP_LENSPROFILE_LABEL;Perfil de corrección de lente TP_LENSPROFILE_LENS_WARNING;Advertencia: el factor de recorte utilizado para el perfilado de la lente es mayor que el factor de recorte de la cámara, los resultados pueden ser incorrectos. TP_LENSPROFILE_USE_CA;Aberración cromática @@ -1880,7 +1872,6 @@ TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use la mediana de todos los cuadros en lugar del TP_RAW_PIXELSHIFTMM_AUTO;Automático TP_RAW_PIXELSHIFTMM_CUSTOM;Personalizado TP_RAW_PIXELSHIFTMM_OFF;Apagado -TP_RAW_PIXELSHIFTMOTION;Nivel de detección de movimiento (en desuso) TP_RAW_PIXELSHIFTMOTIONMETHOD;Corrección del movimiento TP_RAW_PIXELSHIFTNONGREENCROSS;Compruebe los canales rojos/azules para el movimiento TP_RAW_PIXELSHIFTSHOWMOTION;Mostrar máscara de movimiento @@ -2208,7 +2199,6 @@ TP_WAVELET_SKIN;Enfocar piel/proteción TP_WAVELET_SKIN_TOOLTIP;A (menos)-100 los tonos de piel están afectados. \nA 0 todos los tonos se tratan por igual. \nA +100 los tonos de piel están protegidos, mientras que todos los demás tonos están afectados. TP_WAVELET_SKY;protección del cielo al enfocar TP_WAVELET_SKY_TOOLTIP;A -100 se apuntan los tonos del cielo. \nEn 0 todos los tonos se tratan por igual. \nEn +100 los tonos del cielo están protegidos, mientras que todos los demás tonos están afectados. -TP_WAVELET_SKY_TOOLTIPEn (menos)-100se afecta a los tonos del cielo. \nEn 0 todos los tonos se tratan por igual. \nen +100 los tonos del cielo están protegidos, mientras que todos los demás tonos están afectados. TP_WAVELET_STREN;Fuerza TP_WAVELET_STRENGTH;Fuerza TP_WAVELET_SUPE;Extra @@ -2304,6 +2294,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_POPUPSORTBY;Sort Files !FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. +!FILEBROWSER_SHOWRECURSIVE;Show images in sub-folders recursively. !FILECHOOSER_FILTER_EXECUTABLE;Executable files !GENERAL_DELETE_ALL;Delete all !GENERAL_EDIT;Edit @@ -2354,7 +2345,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !HISTORY_MSG_512;Local - SD - ΔE decay !HISTORY_MSG_513;Local - Spot - Excluding - Scope !HISTORY_MSG_514;Local - Spot structure -!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_515;Selective Editing !HISTORY_MSG_516;Local - Color and light !HISTORY_MSG_517;Local - Enable super !HISTORY_MSG_518;Local - Lightness @@ -2664,7 +2655,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !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 - TG - Feather gradient +!HISTORY_MSG_833;Local - Mask 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 @@ -2907,7 +2898,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !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_1082;Local - CIECAM Auto threshold !HISTORY_MSG_1083;Local - CIECAM Hue !HISTORY_MSG_1084;Local - Uses Black Ev - White Ev !HISTORY_MSG_1085;Local - Jz lightness @@ -3001,18 +2992,90 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !HISTORY_MSG_ICM_AINTENT;Abstract profile intent !HISTORY_MSG_ICM_BLUX;Primaries Blue X !HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_CAT;Matrix adaptation !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_MIDTCIE;Midtones !HISTORY_MSG_ICM_PRESER;Preserve neutral !HISTORY_MSG_ICM_REDX;Primaries Red X !HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_REFI;Refinement Colors +!HISTORY_MSG_ICM_SHIFTX;Refinement Colors - Shift x +!HISTORY_MSG_ICM_SHIFTY;Refinement Colors - Shift y +!HISTORY_MSG_ICM_SMOOTHCIE;Smooth highlights +!HISTORY_MSG_ICM_TRCEXP;Abstract Profile !HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method !HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method !HISTORY_MSG_ILLUM;CAL - SC - Illuminant !HISTORY_MSG_LOCALLAB_TE_PIVOT;Local - Equalizer pivot +!HISTORY_MSG_LOCAL_CIEMASK_BLURCONT;Local - CIECAM Mask blur contrast +!HISTORY_MSG_LOCAL_CIEMASK_BLURFFT;Local - CIECAM Mask blur FFTW +!HISTORY_MSG_LOCAL_CIEMASK_BLURRAD;Local - CIECAM Mask blur radius +!HISTORY_MSG_LOCAL_CIEMASK_CHH;Local - CIECAM Mask curve h(h) +!HISTORY_MSG_LOCAL_CIEMASK_HIGH;Local - CIECAM Mask highlights +!HISTORY_MSG_LOCAL_CIEMASK_SHAD;Local - CIECAM Mask shadows +!HISTORY_MSG_LOCAL_CIEMASK_STRU;Local - CIECAM Mask structure +!HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;Local - CIECAM Mask structure as tool +!HISTORY_MSG_LOCAL_CIEMASK_WLC;Local - CIECAM Mask wavelet L(L) +!HISTORY_MSG_LOCAL_CIEMASK_WLEV;Local - CIECAM Mask wavelet levels +!HISTORY_MSG_LOCAL_CIE_ANGGRAD;Local - CIECAM Gradient angle +!HISTORY_MSG_LOCAL_CIE_BLACKS;Local - CIECAM Blacks distribution +!HISTORY_MSG_LOCAL_CIE_BLUXL;Local - CIECAM Blue X +!HISTORY_MSG_LOCAL_CIE_BLUYL;Local - CIECAM Blue Y +!HISTORY_MSG_LOCAL_CIE_BRICOMP;Local - CIECAM Brightness compression +!HISTORY_MSG_LOCAL_CIE_BRICOMPTH;Local - CIECAM Brightness compression threshold +!HISTORY_MSG_LOCAL_CIE_BWCIE;Local - CIECAM Black and white +!HISTORY_MSG_LOCAL_CIE_CAT;Local - Matrix adaptation +!HISTORY_MSG_LOCAL_CIE_DETAILJZ;Local - JzCzHz Local contrast +!HISTORY_MSG_LOCAL_CIE_ENAMASKALL;Local - CIECAM All mask tools +!HISTORY_MSG_LOCAL_CIE_EXPPRECAM;Local - CIECAM Pre-Cam +!HISTORY_MSG_LOCAL_CIE_GAM;Local - CIECAM Gamma +!HISTORY_MSG_LOCAL_CIE_GAMUTCIE;Local - CIECAM Gamut +!HISTORY_MSG_LOCAL_CIE_GREXL;Local - CIECAM Green X +!HISTORY_MSG_LOCAL_CIE_GREYL;Local - CIECAM Green Y +!HISTORY_MSG_LOCAL_CIE_ILL;Local - CIECAM TRC Illuminant +!HISTORY_MSG_LOCAL_CIE_LOGCIEQ;Local - CIECAM Log encoding Q +!HISTORY_MSG_LOCAL_CIE_MIDT;Local - CIECAM Mid Tones +!HISTORY_MSG_LOCAL_CIE_NORM;Local - CIECAM Normalize L +!HISTORY_MSG_LOCAL_CIE_PRIM;Local - CIECAM TRC primaries +!HISTORY_MSG_LOCAL_CIE_REDXL;Local - CIECAM Red X +!HISTORY_MSG_LOCAL_CIE_REDYL;Local - CIECAM Red Y +!HISTORY_MSG_LOCAL_CIE_REFI;Local - CIECAM Refinement colors +!HISTORY_MSG_LOCAL_CIE_SATCIE;Local - CIECAM Saturation control +!HISTORY_MSG_LOCAL_CIE_SHIFTXL;Local - CIECAM Shift x +!HISTORY_MSG_LOCAL_CIE_SHIFTYL;Local - CIECAM Shift y +!HISTORY_MSG_LOCAL_CIE_SIG;Local - Sigmoid +!HISTORY_MSG_LOCAL_CIE_SIGADAP;Local - CIECAM Sigmoid adaptability +!HISTORY_MSG_LOCAL_CIE_SIGMET;Local - CIECAM Sigmoid method +!HISTORY_MSG_LOCAL_CIE_SLOP;Local - CIECAM Slope +!HISTORY_MSG_LOCAL_CIE_SLOPESMO;Local - CIECAM Gray balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOB;Local - CIECAM Blue balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOG;Local - CIECAM Green balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOR;Local - CIECAM Red balance +!HISTORY_MSG_LOCAL_CIE_SMOOTH;Local - CIECAM Scale Yb scene +!HISTORY_MSG_LOCAL_CIE_SMOOTHMET;Local - CIECAM Smooth lights method +!HISTORY_MSG_LOCAL_CIE_SMOOTHYB;Local - CIECAM Scale Yb viewing +!HISTORY_MSG_LOCAL_CIE_SMOOTH_LUM;Local - CIECAM Levels - Luminosity mode +!HISTORY_MSG_LOCAL_CIE_STRGRAD;Local - CIECAM Gradient strength L +!HISTORY_MSG_LOCAL_CIE_STRLOG;Local - CIECAM Log encoding strength +!HISTORY_MSG_LOCAL_CIE_TRC;Local - CIECAM TRC +!HISTORY_MSG_LOCAL_CIE_WHITES;Local - CIECAM Whites distribution +!HISTORY_MSG_LOCAL_DEHAZE_BLACK;Local - Dehaze Black +!HISTORY_MSG_LOCAL_FEATHERCIE;Local - CIECAM Gradient feather +!HISTORY_MSG_LOCAL_FEATHERCOL;Local - Color Gradient feather +!HISTORY_MSG_LOCAL_FEATHEREXE;Local - Exp Gradient feather +!HISTORY_MSG_LOCAL_FEATHERLOG;Local - Log Gradient feather +!HISTORY_MSG_LOCAL_FEATHERMAS;Local - Mask Common gradient feather +!HISTORY_MSG_LOCAL_FEATHERSH;Local - SH Gradient feather +!HISTORY_MSG_LOCAL_FEATHERVIB;Local - Vib Gradient feather +!HISTORY_MSG_LOCAL_FEATHERWAV;Local - Wav Gradient feather !HISTORY_MSG_LOCAL_GAMUTMUNSEL;Local - SC - Avoid Color Shift +!HISTORY_MSG_LOCAL_LOG_BLACKS;Local - Log Blacks distribution +!HISTORY_MSG_LOCAL_LOG_COMPR;Local - Log Compress brightness +!HISTORY_MSG_LOCAL_LOG_SAT;Local - Log Saturation control +!HISTORY_MSG_LOCAL_LOG_WHITES;Local - Log Whites distribution !HISTORY_MSG_LOCAL_TMO_SATUR;Local Exp Fattal Saturation !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold !HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius @@ -3111,16 +3174,18 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !MAIN_FRAME_PLACES_DEL;Remove !MAIN_TAB_FAVORITES;Favorites !MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u -!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB;Selective Editing !MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o !PARTIALPASTE_FILMNEGATIVE;Film negative !PARTIALPASTE_FLATFIELDFROMMETADATA;Flat-field from Metadata -!PARTIALPASTE_LOCALLAB;Local Adjustments -!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings +!PARTIALPASTE_LOCALLAB;Selective Editing +!PARTIALPASTE_LOCALLABGROUP;Selective Editing Settings !PARTIALPASTE_PREPROCWB;Preprocess White Balance !PARTIALPASTE_SPOT;Spot removal !PARTIALPASTE_TONE_EQUALIZER;Tone equalizer -!PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode +!PREFERENCES_BROWSERECURSIVEDEPTH;Browse sub-folders depth +!PREFERENCES_BROWSERECURSIVEFOLLOWLINKS;Follow symbolic links when browsing sub-folders +!PREFERENCES_BROWSERECURSIVEMAXDIRS;Maximum sub-folders !PREFERENCES_CAMERAPROFILESDIR;Camera profiles directory !PREFERENCES_CHUNKSIZES;Tiles per thread !PREFERENCES_CHUNKSIZE_RAW_AMAZE;AMaZE demosaic @@ -3130,7 +3195,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !PREFERENCES_CHUNKSIZE_RGB;RGB processing !PREFERENCES_CIE;Ciecam !PREFERENCES_CIEARTIF;Avoid artifacts -!PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments +!PREFERENCES_COMPLEXITYLOC;Default complexity for Selective Editing !PREFERENCES_COMPLEXITY_EXP;Advanced !PREFERENCES_COMPLEXITY_NORM;Standard !PREFERENCES_COMPLEXITY_SIMP;Basic @@ -3150,6 +3215,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !PREFERENCES_LENSFUNDBDIR_TOOLTIP;Directory containing the Lensfun database. Leave empty to use the default directories. !PREFERENCES_LENSPROFILESDIR;Lens profiles directory !PREFERENCES_LENSPROFILESDIR_TOOLTIP;Directory containing Adobe Lens Correction Profiles (LCPs) +!PREFERENCES_MAX_ZOOM_TITLE;Maximum zoom !PREFERENCES_METADATA;Metadata !PREFERENCES_METADATA_SYNC;Metadata synchronization with XMP sidecars !PREFERENCES_METADATA_SYNC_NONE;Off @@ -3157,8 +3223,12 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !PREFERENCES_METADATA_SYNC_READWRITE;Bidirectional !PREFERENCES_PERFORMANCE_MEASURE;Measure !PREFERENCES_PERFORMANCE_MEASURE_HINT;Logs processing times in console -!PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips +!PREFERENCES_RAW_DECODER;Raw Decoder +!PREFERENCES_RAW_DECODER_ENABLE_LIBRAW;Use LibRaw +!PREFERENCES_SHOWTOOLTIP;Show Selective Editing advice tooltips +!PREFERENCES_SPOTLOC;Define Spot method for Selective Editing !PREFERENCES_TAB_FAVORITES;Favorites +!PREFERENCES_THUMBNAIL_RANK_COLOR_MODE;Load/Save thumbnail rank and color from/to XMP sidecars !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. @@ -3187,6 +3257,27 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !PROGRESSBAR_HOTDEADPIXELFILTER;Hot/dead pixel filter... !PROGRESSBAR_LINEDENOISE;Line noise filter... !PROGRESSBAR_RAWCACORR;Raw CA correction... +!QUEUE_DESTPREVIEW_TITLE;Select a thumbnail to preview its destination path here +!QUEUE_DESTPREVIEW_TOOLTIP;Destination path for the first selected image appears here +!QUEUE_LOCATION_TEMPLATE_HELP_BUTTON_TOOLTIP;Show or hide a help panel with instructions for creating location templates +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_BODY;If you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p-3/converted/%P-4/%f +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_TITLE;Common examples +!QUEUE_LOCATION_TEMPLATE_HELP_INTRO;The output template field allows you to to dynamically customize the destination folder and filename. When you include certain specifiers, which begin with %, they are replaced by the program when each file is being saved.\n\nThe sections below describe each type of specifier. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_1;Using this pathname as an example: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_2;The meanings of the formatting strings are: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_LINUX;/home/tom/photos/2010-10-31/photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_WINDOWS;D:\tom\photos\2010-10-31\photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO;The %dN, %d-N, %pN, %p-N, %PN and %P-N (N = 1..9) specifiers will be replaced by elements of the image file's directory path.\nThe format specifiers operate as follows:\n %dN = Nth directory from the end of the path\n %d-N = Nth directory from the start of the path\n %pN = all directories up to the Nth from the end of the path\n %p-N = the first N directories in the path\n %PN = the last N directories in the path\n %P-N = all directories from the Nth to the end of the path\n %f = base filename (no extension) +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO_WINDOWS;For Windows paths, %d-1 is the drive letter and colon, and %d-2 is the base directory on that drive. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_TITLE;Directories and partial paths +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_BODY;%r will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used. +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_TITLE;Rank +!QUEUE_LOCATION_TEMPLATE_HELP_RESULT_MISMATCH;ERROR: 2nd result is different: +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_BODY;%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'. +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_TITLE;Position/sequence in queue +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_BODY;Three different date/time values may be used in templates:\n %tE"%Y-%m-%d" = when export started\n %tF"%Y-%m-%d" = when file was last saved\n %tP"%Y-%m-%d" = when photo was taken\nThe quoted string defines the format of the resulting date and/or time. The format string %tF"%Y-%m-%d" is just one example. The string can use all conversion specifiers defined for the g_date_time_format function (see https://docs.gtk.org/glib/method.DateTime.format.html).\n\nExample format strings: +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_TITLE;Date and time +!QUEUE_LOCATION_TEMPLATE_HELP_TITLE;Creating an output template !QUEUE_LOCATION_TITLE;Output Location !SAVEDLG_BIGTIFF;BigTIFF (no metadata support) !SORT_ASCENDING;Ascending @@ -3196,12 +3287,16 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !SORT_BY_NAME;By Name !SORT_BY_RANK;By Rank !SORT_DESCENDING;Descending +!TC_LOCALLAB_PRIM_SHIFTX;Shift x +!TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP;In combination with "Refine colors", allows you to:\n 1) for low values, adjust the image purity.\n 2) for higher values, carry out moderate color toning.\nBe careful not to go outside the CIE xy diagram. +!TC_LOCALLAB_PRIM_SHIFTY;Shift y !TC_PRIM_BLUX;Bx !TC_PRIM_BLUY;By !TC_PRIM_GREX;Gx !TC_PRIM_GREY;Gy !TC_PRIM_REDX;Rx !TC_PRIM_REDY;Ry +!TC_PRIM_REFI;Refine colors (white-point) !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 @@ -3263,6 +3358,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !TP_HLREC_COLOROPP;Inpaint Opposed !TP_HLREC_HLBLUR;Blur !TP_HLREC_HLTH;Gain threshold +!TP_ICM_BW;Black and White !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)'. @@ -3275,8 +3371,15 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !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_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 three main uses - channel mixer, restore image color (saturation), 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_CAT;Matrix adaptation +!TP_ICM_WORKING_CAT_BRAD;Bradford +!TP_ICM_WORKING_CAT_CAT02;Cat02 +!TP_ICM_WORKING_CAT_CAT16;Cat16 +!TP_ICM_WORKING_CAT_TOOLTIP;Performs the chromatic adaptation of the XYZ conversion matrix. Default: Bradford +!TP_ICM_WORKING_CAT_VK;Von Kries +!TP_ICM_WORKING_CAT_XYZ;XYZ scale !TP_ICM_WORKING_CIEDIAG;CIE xy diagram !TP_ICM_WORKING_ILLU;Illuminant !TP_ICM_WORKING_ILLU_1500;Tungsten 1500K @@ -3288,11 +3391,13 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !TP_ICM_WORKING_ILLU_D65;D65 !TP_ICM_WORKING_ILLU_D80;D80 !TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_E;E !TP_ICM_WORKING_ILLU_NONE;Default !TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_NON;None !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_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination primaries' combo box, 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 @@ -3301,11 +3406,14 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !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_FREE;Custom LA (sliders) !TP_ICM_WORKING_PRIM_JDCMAX;JDC Max +!TP_ICM_WORKING_PRIM_JDCMAXSTDA;JDC Max stdA !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_TOOLTIP;Performs a gamut control. Destination primaries (Advanced) allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified.\nWhen 'Custom LA (sliders)' is selected, you can modify the values of the 3 primaries (Red, Green, and Blue) for x and y. !TP_ICM_WORKING_PRIM_WID;WideGamut !TP_ICM_WORKING_TRC_18;Prophoto g=1.8 !TP_ICM_WORKING_TRC_22;Adobe g=2.2 @@ -3314,8 +3422,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !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_CORRECTION_METADATA;From file metadata !TP_LENSPROFILE_MODE_HEADER;Lens Profile !TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion !TP_LENSPROFILE_USE_HEADER;Correct @@ -3326,9 +3433,9 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !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_AUTOGRAYCIE;Automatic !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_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab). Default: Munsell only.\n\nMunsell only: 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. The result is not the same as Lab. !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 @@ -3371,9 +3478,12 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !TP_LOCALLAB_BUTTON_DUPL;Duplicate !TP_LOCALLAB_BUTTON_REN;Rename !TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWEVNONE;None +!TP_LOCALLAB_BWEVSIG;Activated +!TP_LOCALLAB_BWEVSIGLOG;Sigmoid & Log-Encoding !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_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16 (experimental). 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, for example, to match CAM16 processing with the maximum monitor brightness of 400cd/m2. !TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments !TP_LOCALLAB_CAMMODE;CAM model !TP_LOCALLAB_CAMMODE_CAM16;CAM 16 @@ -3413,6 +3523,12 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !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_SMOOTHFRAME;Highlight Attenuation & Levels +!TP_LOCALLAB_CIE_SMOOTH_EV;Ev based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA;Slope based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF;Gamma based +!TP_LOCALLAB_CIE_SMOOTH_LEVELS;Levels +!TP_LOCALLAB_CIE_SMOOTH_NONE;None !TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) !TP_LOCALLAB_CIRCRADIUS;Spot size !TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the 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. @@ -3428,8 +3544,9 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !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_COLORDEPREV_TOOLTIP;Preview ΔE button in Settings will only work if you have activated 'Sharpening', 'Soft Light and Original Retinex', 'Blur/Grain and Denoise', 'Dehaze and Retinex', or 'Contrast by Detail Levels' in the 'Add tool to current spot' menu.\nFor others tools, the Preview ΔE button is in the tool, which allows previewing ΔE with several tools enabled. Prefer using Mask and modifications. !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_COLORFRAME;Dominant color !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 @@ -3437,7 +3554,10 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !TP_LOCALLAB_COL_NAME;Name !TP_LOCALLAB_COL_VIS;Status !TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPRCIE;Brightness compression +!TP_LOCALLAB_COMPRCIETH;Compression threshold !TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_COMPRLOG_TOOLTIP;This algorithm compress the data before log conversion, above the threshold slider value. To use in conjunction with Whites distribution. !TP_LOCALLAB_CONTCOL;Contrast threshold !TP_LOCALLAB_CONTFRA;Contrast by level !TP_LOCALLAB_CONTRAST;Contrast @@ -3452,7 +3572,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !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 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 spot. -!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combo box 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. @@ -3461,13 +3581,14 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !TP_LOCALLAB_DARKRETI;Darkness !TP_LOCALLAB_DEHAFRA;Dehaze !TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZE_BLACK;Black !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_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. @@ -3487,6 +3608,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !TP_LOCALLAB_DETAILFRA;Edge detection - DCT !TP_LOCALLAB_DETAILSH;Details !TP_LOCALLAB_DETAILTHR;Lum/chrom detail threshold +!TP_LOCALLAB_DISAB_CIECAM;Disable Ciecam or Weak Jz surround !TP_LOCALLAB_DIVGR;Gamma !TP_LOCALLAB_DUPLSPOTNAME;Copy !TP_LOCALLAB_EDGFRA;Edge sharpness @@ -3495,6 +3617,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping !TP_LOCALLAB_ENABLE_MASK;Enable mask !TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENABLE_MASKALL;Enable all mask tools !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 @@ -3510,9 +3633,10 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !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_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all selective editing data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\nUse 'Scope' (Excluding) to set the exclusion intensity.\n\n'Full image' allows you to use the selective editing tools on the whole image.\nThe RT Spot delimiters are set beyond the image preview boundaries.\nThe 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.\nNote: 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.\n\n'Global' allows you to use the selective editing tools on the whole image, without using Delta E or transitions. !TP_LOCALLAB_EXECLU;Excluding spot !TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXMAIN;Global !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 @@ -3521,11 +3645,11 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !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_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Selective Editing 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 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_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. @@ -3547,7 +3671,8 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !TP_LOCALLAB_FATSAT;Saturation control !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_FEATVALUE;Feather gradient +!TP_LOCALLAB_FEATVALUE_MASK;Feather gradient (Grad. Filters Mask) !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 @@ -3643,7 +3768,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !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_LABEL;Selective Editing !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 @@ -3688,8 +3813,10 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !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_LOGCIE;Log encoding +!TP_LOCALLAB_LOGCIEQ;Log Encoding Q (with Ciecam) +!TP_LOCALLAB_LOGCIEQ_TOOLTIP;Activating the checkbox allows you to switch between log encoding based on the 3 RGB channels, and log encoding based solely on Ciecam’s brightness (Q) channel.\nUsing the Q channel instead of the RGB channels helps avoid undesirable edge effects such as hue and saturation shifts.\nHowever, the settings are more difficult to optimise because Q is unbounded and Ciecam alters the data to take into account the surround conditions, simultaneous contrast, etc.\nYou may have to adjust the following:\n Scene conditions: Mean luminance (Yb), Whites & Blacks distribution, Black Ev, White Ev.\n Source Data Adjustments : Brightness compression, Strength.\n\nNote: when using Log Encoding (Q), be careful not to activate the Disable Ciecam option in the Scene Conditions, Surround menu. +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you to use Black Ev, White Ev, White and Black distribution, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using 'Log encoding' with Brightness compression. !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) @@ -3697,7 +3824,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !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_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 @@ -3710,6 +3837,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !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_LOGPFRA2;Log Encoding settings !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. @@ -3779,7 +3907,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !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_MASKUNUSABLE;Mask disabled (Enable in 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 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 @@ -3815,6 +3943,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !TP_LOCALLAB_MERTWE;Exclusion !TP_LOCALLAB_MERTWO;Subtract !TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MIDTCIE;Midtones !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 @@ -3862,10 +3991,15 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !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_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_PRECAMGAMUT_TOOLTIP;If checked, ensures a gamut control just after primary conversion to XYZ. +!TP_LOCALLAB_PRECAMREFIMAIN_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. In combination with "Shift x" and "Shift y", allows you to carry out moderate color toning. +!TP_LOCALLAB_PRECAMREFI_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. +!TP_LOCALLAB_PRECAM_TOOLTIP;'Source Data Adjustments' modifies the Dynamic Range using Log encoding, the tones of the image and primaries (simplified Abstract Profile), and midtones, just before the Ciecam process. These values are adjustable:\nGamma: Acts mainly on light tones\nSlope: Acts mainly on dark tones. You 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.\nDestination primaries: Allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified. You can also finely adapt the primaries and the illuminant (white-point). Moving a primary away from the white point reduces saturation and vice versa. Pay attention to the gamut. !TP_LOCALLAB_PREVHIDE;Hide additional settings !TP_LOCALLAB_PREVIEW;Preview ΔE !TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PRIMILLFRAME;Primaries & Illuminant !TP_LOCALLAB_PROXI;ΔE decay !TP_LOCALLAB_QUAAGRES;Aggressive !TP_LOCALLAB_QUACONSER;Conservative @@ -3910,10 +4044,11 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !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_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_SATCIE;Saturation control !TP_LOCALLAB_SATUR;Saturation !TP_LOCALLAB_SATURV;Saturation (s) !TP_LOCALLAB_SCALEGR;Scale @@ -3934,7 +4069,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !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_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;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. @@ -3980,17 +4115,41 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !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_SIGBLACKSSCIE;Blacks distribution +!TP_LOCALLAB_SIGCIE;Sigmoid +!TP_LOCALLAB_SIGFRA;Sigmoid Q +!TP_LOCALLAB_SIGGAMJCIE;Gamma !TP_LOCALLAB_SIGJZFRA;Sigmoid Jz !TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOID16_TOOLTIP;Allows you to simulate a tone mapping appearance using both 'Ciecam' and 'Sigmoid Q'. Sigmoid Q has three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc) Adaptability weights the action of the sigmoid by action on the internal exponential function. !TP_LOCALLAB_SIGMOIDBL;Blend !TP_LOCALLAB_SIGMOIDLAMBDA;Contrast -!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDLOGAUTO;Auto threshold +!TP_LOCALLAB_SIGMOIDLOGEV_TOOLTIP;If the combo box selection 'Black Ev and White Ev' is 'Sigmoid and Log encoding' instead of 'Sigmoid only', the two algorithms 'Log encoding' and 'Sigmoid' are used together. +!TP_LOCALLAB_SIGMOIDNORMCIE;Normalize Luminance +!TP_LOCALLAB_SIGMOIDNORMCIEBLEND_TOOLTIP;Blend acts on the final aspect of the image, contrast and luminance. Ratio between original and output image. +!TP_LOCALLAB_SIGMOIDNORMCIE_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image take into account those of the original.\nAll the adjustments acting on J or Q are taken into account, including those which are not relative to Sigmoid Q. +!TP_LOCALLAB_SIGMOIDQJ;Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDQJCOMPRCIE_TOOLTIP;When the combo box selection 'Uses Black Ev and White Ev' is 'Sigmoid and Log encoding Q' or 'Log encoding instead of Sigmoid' checked. This algorithm compress the data above the threshold slider value. The last value stands for brightness (Q) and should be close as possible to the value 'Compression threshold' (calculate when 'Auto threshold" checked, often > 1). +!TP_LOCALLAB_SIGMOIDSENSI;Adaptability !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_SIGMOIDWHITESCIE_TOOLTIP;Allows you, in Automatic when the dynamic range of the image is high, to change the distribution of lights in whites and deep blacks.\nCan be used with Log encoding or Sigmoid with Black Ev and White Ev enabled.\n\nThe algorithm does not change the basic data, but acts on the components necessary to calculate the Dynamic range, Black Ev, White Ev and the Gray point. +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a tone mapping appearance using both the 'Jz' and 'Sigmoid' function. Three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SIGSLOPJCIE;Slope +!TP_LOCALLAB_SIGTRCCIE;Source Data Adjustments +!TP_LOCALLAB_SIGWHITESCIE;Whites distribution !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_SLOPESMOOTH;Gray balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHB;Blue balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHG;Green balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHR;Red balance (Slope) !TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SMOOTHCIE;Highlight Attenuation +!TP_LOCALLAB_SMOOTHCIE_LUM;Luminosity mode +!TP_LOCALLAB_SMOOTHCIE_SCA;Scale Yb Scene +!TP_LOCALLAB_SMOOTHCIE_TOOLTIP;Completes the processing carried out by gamma, slope and midtones by causing a slight lowering of lights. Please note this does not replace Highlight reconstruction.\n\nGamma based and Slope based (Standard and Advanced) allow you to simulate a tone mapping using:\na) Scene conditions: Black-Ev, White-Ev, Mean luminance (Yb%)\nb) Viewing conditions: Mean luminance (Yb%).\n\nScale Yb Scene is function of White-Ev. +!TP_LOCALLAB_SMOOTHCIE_YB;Scale Yb Viewing !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. @@ -4012,13 +4171,14 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !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_STRENGTHCIELOG;Strength !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_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. @@ -4050,11 +4210,12 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !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_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_TRCFRAME;Tone Response Curve & Midtones !TP_LOCALLAB_USEMASK;Laplacian !TP_LOCALLAB_VART;Variance (contrast) !TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool @@ -4261,7 +4422,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !TP_WAVELET_WAVOFFSET;Offset !TP_WBALANCE_AUTOITCGREEN;Temperature correlation !TP_WBALANCE_AUTOOLD;RGB grey -!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement +!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement !TP_WBALANCE_ITCWALG_TOOLTIP;Allows you to switch to the other Alternative temperature (Alt_temp), when possible.\nInactive in the "single choice" case. !TP_WBALANCE_ITCWBDELTA_TOOLTIP;Fixed for each "green" iteration tried, the temperature difference to be taken into account. !TP_WBALANCE_ITCWBFGREEN_TOOLTIP;Find the best compromise between Student and green. @@ -4304,7 +4465,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !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_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).\nIn the rare case of a color drift with "Observer 2°" (probably due to the conversion matrix) "Observer 10°" must be selected. !TP_WBALANCE_PATCHLABEL;Read colors:%1 Patch: Chroma:%2 Size=%3 !TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colors (max=237).\nDisplay calculated Patch Chroma.\nAWB temperature bias, lets try to reduce this value, a minimum may seem to optimize the algorithm.\n\nPatch size matching chroma optimization. !TP_WBALANCE_PATCHLEVELLABEL;Patch: ΔE=%1 - datas x 9 Min:%2 Max=%3 diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 33ffc861c..d0b926bb2 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -75,8 +75,6 @@ EXIFPANEL_RESET;Réinitialiser EXIFPANEL_RESETALL;Réinitialiser tout EXIFPANEL_RESETALLHINT;Réinitialise tous les tags à leur valeur initiale EXIFPANEL_RESETHINT;Réinitialise les données sélectionnées à la valeur initiale -EXIFPANEL_SHOWALL;Voir tout -EXIFPANEL_SUBDIRECTORY;Sous-répertoire EXPORT_BYPASS;Étapes de traitement à ignorer EXPORT_BYPASS_ALL;Sélectionner / Désélectionner tout EXPORT_BYPASS_DEFRINGE;Ignorer la corr. d'aberration chromatique @@ -836,7 +834,6 @@ IPTCPANEL_TITLE;Titre IPTCPANEL_TITLEHINT;Enterez un nom court et humainement lisible pour l'image, cela peut être le nom du fichier. IPTCPANEL_TRANSREFERENCE;ID du travail IPTCPANEL_TRANSREFERENCEHINT;Enterez un nombre ou identifiant servant au contrôle du flux de travail ou au suivi. -LENSPROFILE_LENS_WARNING;Attention: la taille du capteur utilisé pour le profilage de l'objectif est plus grand que celui de l'appareil sélectionné, le résultat peut être faux. MAIN_BUTTON_FULLSCREEN;Plein écran MAIN_BUTTON_ICCPROFCREATOR;Créateur de Profil ICC MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigue à l'image Suivante relativement à l'image ouverte dans l'Éditeur\nRaccourci: Shift-F4\n\nPour naviguer à l'image Suivante relativement à la vignette sélectionnée dans le Navigateur de fichiers\nRaccourci: F4 @@ -1019,7 +1016,6 @@ PREFERENCES_APPEARANCE_COLORPICKERFONT;Police des ancres de vérification couleu PREFERENCES_APPEARANCE_CROPMASKCOLOR;Couleur du masque de recadrage PREFERENCES_APPEARANCE_MAINFONT;Police principale PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Couleur du cadre dans le Navigateur -PREFERENCES_APPEARANCE_PSEUDOHIDPI;Mode pseudo-HiDPI PREFERENCES_APPEARANCE_THEME;Thème PREFERENCES_APPLNEXTSTARTUP;appliqué au prochain lancement PREFERENCES_AUTOMONPROFILE;Utiliser automatiquement le profil de l'écran principal @@ -1210,6 +1206,7 @@ PROFILEPANEL_TOOLTIPSAVE;Enregistrer le profil actuel\nCTRL-clic pour sé PROGRESSBAR_LOADING;Chargement de l'Image... PROGRESSBAR_LOADINGTHUMBS;Chargement des vignettes... PROGRESSBAR_LOADJPEG;Chargement du fichier JPEG... +PROGRESSBAR_LOADJXL;Chargement du fichier JXL... PROGRESSBAR_LOADPNG;Chargement du fichier PNG... PROGRESSBAR_LOADTIFF;Chargement du fichier TIFF... PROGRESSBAR_NOIMAGES;Pas d'image trouvée @@ -1704,8 +1701,6 @@ TP_ICM_WORKING_TRC_SLOPE;Pente TP_ICM_WORKING_TRC_TOOLTIP;Seulement pour les profils internes TP_IMPULSEDENOISE_LABEL;Réduction du bruit d'impulsion TP_IMPULSEDENOISE_THRESH;Seuil -TP_LABCURVE_AVOIDCOLORSHIFT;Éviter les dérives de teinte -TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Ramène les données dans le gamut de l'espace couleur de travail\npuis applique la correction de Munsell TP_LABCURVE_BRIGHTNESS;Luminosité TP_LABCURVE_CHROMATICITY;Chromaticité TP_LABCURVE_CHROMA_TOOLTIP;Pour activer la colorisation du N&B par les courbes 'a' et 'b', réglez la Chromaticité à -100 @@ -2179,7 +2174,6 @@ TP_LOCALLAB_MASKRESWAV_TOOLTIP;Utilisé pour moduler l'action des réglages de C 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 @@ -2619,7 +2613,6 @@ TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Utilise la médianes de toutes les sous-images a TP_RAW_PIXELSHIFTMM_AUTO;Automatique TP_RAW_PIXELSHIFTMM_CUSTOM;Manuel TP_RAW_PIXELSHIFTMM_OFF;Arrêt -TP_RAW_PIXELSHIFTMOTION;Niveau de détection de mouvement (dépréconisé) TP_RAW_PIXELSHIFTMOTIONMETHOD;Correction de Mouvement TP_RAW_PIXELSHIFTNONGREENCROSS;Vérifier les canaux rouge/bleu pour le mouvement TP_RAW_PIXELSHIFTSHOWMOTION;Voir le masque de mouvement @@ -3050,6 +3043,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_POPUPSORTBY;Sort Files !FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. +!FILEBROWSER_SHOWRECURSIVE;Show images in sub-folders recursively. !FILECHOOSER_FILTER_EXECUTABLE;Executable files !GENERAL_DELETE_ALL;Delete all !GENERAL_EDIT;Edit @@ -3100,7 +3094,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !HISTORY_MSG_512;Local - SD - ΔE decay !HISTORY_MSG_513;Local - Spot - Excluding - Scope !HISTORY_MSG_514;Local - Spot structure -!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_515;Selective Editing !HISTORY_MSG_516;Local - Color and light !HISTORY_MSG_517;Local - Enable super !HISTORY_MSG_518;Local - Lightness @@ -3410,7 +3404,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !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 - TG - Feather gradient +!HISTORY_MSG_833;Local - Mask 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 @@ -3653,7 +3647,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !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_1082;Local - CIECAM Auto threshold !HISTORY_MSG_1083;Local - CIECAM Hue !HISTORY_MSG_1084;Local - Uses Black Ev - White Ev !HISTORY_MSG_1085;Local - Jz lightness @@ -3742,18 +3736,90 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !HISTORY_MSG_ICM_AINTENT;Abstract profile intent !HISTORY_MSG_ICM_BLUX;Primaries Blue X !HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_CAT;Matrix adaptation !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_MIDTCIE;Midtones !HISTORY_MSG_ICM_PRESER;Preserve neutral !HISTORY_MSG_ICM_REDX;Primaries Red X !HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_REFI;Refinement Colors +!HISTORY_MSG_ICM_SHIFTX;Refinement Colors - Shift x +!HISTORY_MSG_ICM_SHIFTY;Refinement Colors - Shift y +!HISTORY_MSG_ICM_SMOOTHCIE;Smooth highlights +!HISTORY_MSG_ICM_TRCEXP;Abstract Profile !HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method !HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method !HISTORY_MSG_ILLUM;CAL - SC - Illuminant !HISTORY_MSG_LOCALLAB_TE_PIVOT;Local - Equalizer pivot +!HISTORY_MSG_LOCAL_CIEMASK_BLURCONT;Local - CIECAM Mask blur contrast +!HISTORY_MSG_LOCAL_CIEMASK_BLURFFT;Local - CIECAM Mask blur FFTW +!HISTORY_MSG_LOCAL_CIEMASK_BLURRAD;Local - CIECAM Mask blur radius +!HISTORY_MSG_LOCAL_CIEMASK_CHH;Local - CIECAM Mask curve h(h) +!HISTORY_MSG_LOCAL_CIEMASK_HIGH;Local - CIECAM Mask highlights +!HISTORY_MSG_LOCAL_CIEMASK_SHAD;Local - CIECAM Mask shadows +!HISTORY_MSG_LOCAL_CIEMASK_STRU;Local - CIECAM Mask structure +!HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;Local - CIECAM Mask structure as tool +!HISTORY_MSG_LOCAL_CIEMASK_WLC;Local - CIECAM Mask wavelet L(L) +!HISTORY_MSG_LOCAL_CIEMASK_WLEV;Local - CIECAM Mask wavelet levels +!HISTORY_MSG_LOCAL_CIE_ANGGRAD;Local - CIECAM Gradient angle +!HISTORY_MSG_LOCAL_CIE_BLACKS;Local - CIECAM Blacks distribution +!HISTORY_MSG_LOCAL_CIE_BLUXL;Local - CIECAM Blue X +!HISTORY_MSG_LOCAL_CIE_BLUYL;Local - CIECAM Blue Y +!HISTORY_MSG_LOCAL_CIE_BRICOMP;Local - CIECAM Brightness compression +!HISTORY_MSG_LOCAL_CIE_BRICOMPTH;Local - CIECAM Brightness compression threshold +!HISTORY_MSG_LOCAL_CIE_BWCIE;Local - CIECAM Black and white +!HISTORY_MSG_LOCAL_CIE_CAT;Local - Matrix adaptation +!HISTORY_MSG_LOCAL_CIE_DETAILJZ;Local - JzCzHz Local contrast +!HISTORY_MSG_LOCAL_CIE_ENAMASKALL;Local - CIECAM All mask tools +!HISTORY_MSG_LOCAL_CIE_EXPPRECAM;Local - CIECAM Pre-Cam +!HISTORY_MSG_LOCAL_CIE_GAM;Local - CIECAM Gamma +!HISTORY_MSG_LOCAL_CIE_GAMUTCIE;Local - CIECAM Gamut +!HISTORY_MSG_LOCAL_CIE_GREXL;Local - CIECAM Green X +!HISTORY_MSG_LOCAL_CIE_GREYL;Local - CIECAM Green Y +!HISTORY_MSG_LOCAL_CIE_ILL;Local - CIECAM TRC Illuminant +!HISTORY_MSG_LOCAL_CIE_LOGCIEQ;Local - CIECAM Log encoding Q +!HISTORY_MSG_LOCAL_CIE_MIDT;Local - CIECAM Mid Tones +!HISTORY_MSG_LOCAL_CIE_NORM;Local - CIECAM Normalize L +!HISTORY_MSG_LOCAL_CIE_PRIM;Local - CIECAM TRC primaries +!HISTORY_MSG_LOCAL_CIE_REDXL;Local - CIECAM Red X +!HISTORY_MSG_LOCAL_CIE_REDYL;Local - CIECAM Red Y +!HISTORY_MSG_LOCAL_CIE_REFI;Local - CIECAM Refinement colors +!HISTORY_MSG_LOCAL_CIE_SATCIE;Local - CIECAM Saturation control +!HISTORY_MSG_LOCAL_CIE_SHIFTXL;Local - CIECAM Shift x +!HISTORY_MSG_LOCAL_CIE_SHIFTYL;Local - CIECAM Shift y +!HISTORY_MSG_LOCAL_CIE_SIG;Local - Sigmoid +!HISTORY_MSG_LOCAL_CIE_SIGADAP;Local - CIECAM Sigmoid adaptability +!HISTORY_MSG_LOCAL_CIE_SIGMET;Local - CIECAM Sigmoid method +!HISTORY_MSG_LOCAL_CIE_SLOP;Local - CIECAM Slope +!HISTORY_MSG_LOCAL_CIE_SLOPESMO;Local - CIECAM Gray balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOB;Local - CIECAM Blue balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOG;Local - CIECAM Green balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOR;Local - CIECAM Red balance +!HISTORY_MSG_LOCAL_CIE_SMOOTH;Local - CIECAM Scale Yb scene +!HISTORY_MSG_LOCAL_CIE_SMOOTHMET;Local - CIECAM Smooth lights method +!HISTORY_MSG_LOCAL_CIE_SMOOTHYB;Local - CIECAM Scale Yb viewing +!HISTORY_MSG_LOCAL_CIE_SMOOTH_LUM;Local - CIECAM Levels - Luminosity mode +!HISTORY_MSG_LOCAL_CIE_STRGRAD;Local - CIECAM Gradient strength L +!HISTORY_MSG_LOCAL_CIE_STRLOG;Local - CIECAM Log encoding strength +!HISTORY_MSG_LOCAL_CIE_TRC;Local - CIECAM TRC +!HISTORY_MSG_LOCAL_CIE_WHITES;Local - CIECAM Whites distribution +!HISTORY_MSG_LOCAL_DEHAZE_BLACK;Local - Dehaze Black +!HISTORY_MSG_LOCAL_FEATHERCIE;Local - CIECAM Gradient feather +!HISTORY_MSG_LOCAL_FEATHERCOL;Local - Color Gradient feather +!HISTORY_MSG_LOCAL_FEATHEREXE;Local - Exp Gradient feather +!HISTORY_MSG_LOCAL_FEATHERLOG;Local - Log Gradient feather +!HISTORY_MSG_LOCAL_FEATHERMAS;Local - Mask Common gradient feather +!HISTORY_MSG_LOCAL_FEATHERSH;Local - SH Gradient feather +!HISTORY_MSG_LOCAL_FEATHERVIB;Local - Vib Gradient feather +!HISTORY_MSG_LOCAL_FEATHERWAV;Local - Wav Gradient feather !HISTORY_MSG_LOCAL_GAMUTMUNSEL;Local - SC - Avoid Color Shift +!HISTORY_MSG_LOCAL_LOG_BLACKS;Local - Log Blacks distribution +!HISTORY_MSG_LOCAL_LOG_COMPR;Local - Log Compress brightness +!HISTORY_MSG_LOCAL_LOG_SAT;Local - Log Saturation control +!HISTORY_MSG_LOCAL_LOG_WHITES;Local - Log Whites distribution !HISTORY_MSG_LOCAL_TMO_SATUR;Local Exp Fattal Saturation !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold !HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius @@ -3851,10 +3917,13 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !PARTIALPASTE_FLATFIELDFROMMETADATA;Flat-field from Metadata !PARTIALPASTE_PREPROCWB;Preprocess White Balance !PARTIALPASTE_TONE_EQUALIZER;Tone equalizer +!PREFERENCES_BROWSERECURSIVEDEPTH;Browse sub-folders depth +!PREFERENCES_BROWSERECURSIVEFOLLOWLINKS;Follow symbolic links when browsing sub-folders +!PREFERENCES_BROWSERECURSIVEMAXDIRS;Maximum sub-folders !PREFERENCES_CAMERAPROFILESDIR;Camera profiles directory !PREFERENCES_CIE;Ciecam !PREFERENCES_CIEARTIF;Avoid artifacts -!PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments +!PREFERENCES_COMPLEXITYLOC;Default complexity for Selective Editing !PREFERENCES_COMPLEXITY_EXP;Advanced !PREFERENCES_COMPLEXITY_NORM;Standard !PREFERENCES_COMPLEXITY_SIMP;Basic @@ -3874,13 +3943,18 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !PREFERENCES_LENSFUNDBDIR_TOOLTIP;Directory containing the Lensfun database. Leave empty to use the default directories. !PREFERENCES_LENSPROFILESDIR;Lens profiles directory !PREFERENCES_LENSPROFILESDIR_TOOLTIP;Directory containing Adobe Lens Correction Profiles (LCPs) +!PREFERENCES_MAX_ZOOM_TITLE;Maximum zoom !PREFERENCES_METADATA;Metadata !PREFERENCES_METADATA_SYNC;Metadata synchronization with XMP sidecars !PREFERENCES_METADATA_SYNC_NONE;Off !PREFERENCES_METADATA_SYNC_READ;Read only !PREFERENCES_METADATA_SYNC_READWRITE;Bidirectional -!PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips +!PREFERENCES_RAW_DECODER;Raw Decoder +!PREFERENCES_RAW_DECODER_ENABLE_LIBRAW;Use LibRaw +!PREFERENCES_SHOWTOOLTIP;Show Selective Editing advice tooltips +!PREFERENCES_SPOTLOC;Define Spot method for Selective Editing !PREFERENCES_TAB_FAVORITES;Favorites +!PREFERENCES_THUMBNAIL_RANK_COLOR_MODE;Load/Save thumbnail rank and color from/to XMP sidecars !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. @@ -3909,6 +3983,27 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !PROGRESSBAR_HOTDEADPIXELFILTER;Hot/dead pixel filter... !PROGRESSBAR_LINEDENOISE;Line noise filter... !PROGRESSBAR_RAWCACORR;Raw CA correction... +!QUEUE_DESTPREVIEW_TITLE;Select a thumbnail to preview its destination path here +!QUEUE_DESTPREVIEW_TOOLTIP;Destination path for the first selected image appears here +!QUEUE_LOCATION_TEMPLATE_HELP_BUTTON_TOOLTIP;Show or hide a help panel with instructions for creating location templates +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_BODY;If you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p-3/converted/%P-4/%f +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_TITLE;Common examples +!QUEUE_LOCATION_TEMPLATE_HELP_INTRO;The output template field allows you to to dynamically customize the destination folder and filename. When you include certain specifiers, which begin with %, they are replaced by the program when each file is being saved.\n\nThe sections below describe each type of specifier. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_1;Using this pathname as an example: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_2;The meanings of the formatting strings are: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_LINUX;/home/tom/photos/2010-10-31/photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_WINDOWS;D:\tom\photos\2010-10-31\photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO;The %dN, %d-N, %pN, %p-N, %PN and %P-N (N = 1..9) specifiers will be replaced by elements of the image file's directory path.\nThe format specifiers operate as follows:\n %dN = Nth directory from the end of the path\n %d-N = Nth directory from the start of the path\n %pN = all directories up to the Nth from the end of the path\n %p-N = the first N directories in the path\n %PN = the last N directories in the path\n %P-N = all directories from the Nth to the end of the path\n %f = base filename (no extension) +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO_WINDOWS;For Windows paths, %d-1 is the drive letter and colon, and %d-2 is the base directory on that drive. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_TITLE;Directories and partial paths +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_BODY;%r will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used. +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_TITLE;Rank +!QUEUE_LOCATION_TEMPLATE_HELP_RESULT_MISMATCH;ERROR: 2nd result is different: +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_BODY;%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'. +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_TITLE;Position/sequence in queue +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_BODY;Three different date/time values may be used in templates:\n %tE"%Y-%m-%d" = when export started\n %tF"%Y-%m-%d" = when file was last saved\n %tP"%Y-%m-%d" = when photo was taken\nThe quoted string defines the format of the resulting date and/or time. The format string %tF"%Y-%m-%d" is just one example. The string can use all conversion specifiers defined for the g_date_time_format function (see https://docs.gtk.org/glib/method.DateTime.format.html).\n\nExample format strings: +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_TITLE;Date and time +!QUEUE_LOCATION_TEMPLATE_HELP_TITLE;Creating an output template !QUEUE_LOCATION_TITLE;Output Location !SAVEDLG_BIGTIFF;BigTIFF (no metadata support) !SORT_ASCENDING;Ascending @@ -3918,12 +4013,16 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !SORT_BY_NAME;By Name !SORT_BY_RANK;By Rank !SORT_DESCENDING;Descending +!TC_LOCALLAB_PRIM_SHIFTX;Shift x +!TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP;In combination with "Refine colors", allows you to:\n 1) for low values, adjust the image purity.\n 2) for higher values, carry out moderate color toning.\nBe careful not to go outside the CIE xy diagram. +!TC_LOCALLAB_PRIM_SHIFTY;Shift y !TC_PRIM_BLUX;Bx !TC_PRIM_BLUY;By !TC_PRIM_GREX;Gx !TC_PRIM_GREY;Gy !TC_PRIM_REDX;Rx !TC_PRIM_REDY;Ry +!TC_PRIM_REFI;Refine colors (white-point) !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. @@ -3966,6 +4065,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !TP_HLREC_COLOROPP;Inpaint Opposed !TP_HLREC_HLBLUR;Blur !TP_HLREC_HLTH;Gain threshold +!TP_ICM_BW;Black and White !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)'. @@ -3978,8 +4078,15 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !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_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 three main uses - channel mixer, restore image color (saturation), 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_CAT;Matrix adaptation +!TP_ICM_WORKING_CAT_BRAD;Bradford +!TP_ICM_WORKING_CAT_CAT02;Cat02 +!TP_ICM_WORKING_CAT_CAT16;Cat16 +!TP_ICM_WORKING_CAT_TOOLTIP;Performs the chromatic adaptation of the XYZ conversion matrix. Default: Bradford +!TP_ICM_WORKING_CAT_VK;Von Kries +!TP_ICM_WORKING_CAT_XYZ;XYZ scale !TP_ICM_WORKING_CIEDIAG;CIE xy diagram !TP_ICM_WORKING_ILLU;Illuminant !TP_ICM_WORKING_ILLU_1500;Tungsten 1500K @@ -3991,11 +4098,13 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !TP_ICM_WORKING_ILLU_D65;D65 !TP_ICM_WORKING_ILLU_D80;D80 !TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_E;E !TP_ICM_WORKING_ILLU_NONE;Default !TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_NON;None !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_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination primaries' combo box, 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 @@ -4004,11 +4113,14 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !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_FREE;Custom LA (sliders) !TP_ICM_WORKING_PRIM_JDCMAX;JDC Max +!TP_ICM_WORKING_PRIM_JDCMAXSTDA;JDC Max stdA !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_TOOLTIP;Performs a gamut control. Destination primaries (Advanced) allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified.\nWhen 'Custom LA (sliders)' is selected, you can modify the values of the 3 primaries (Red, Green, and Blue) for x and y. !TP_ICM_WORKING_PRIM_WID;WideGamut !TP_ICM_WORKING_TRC_18;Prophoto g=1.8 !TP_ICM_WORKING_TRC_22;Adobe g=2.2 @@ -4019,26 +4131,45 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !TP_LENSGEOM_LOG;Logarithmic !TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected !TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected +!TP_LENSPROFILE_CORRECTION_METADATA;From file metadata !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 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_AUTOGRAYCIE;Automatic +!TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab). Default: Munsell only.\n\nMunsell only: 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. The result is not the same as Lab. !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_BWEVNONE;None +!TP_LOCALLAB_BWEVSIG;Activated +!TP_LOCALLAB_BWEVSIGLOG;Sigmoid & Log-Encoding !TP_LOCALLAB_CATAD;Chromatic adaptation/Cat16 !TP_LOCALLAB_CHRO46LABEL;Chroma levels 456: Mean=%1 High=%2 !TP_LOCALLAB_CHROLABEL;Chroma levels 0123: Mean=%1 High=%2 !TP_LOCALLAB_CHROML;Chroma (C) +!TP_LOCALLAB_CIE_SMOOTHFRAME;Highlight Attenuation & Levels +!TP_LOCALLAB_CIE_SMOOTH_EV;Ev based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA;Slope based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF;Gamma based +!TP_LOCALLAB_CIE_SMOOTH_LEVELS;Levels +!TP_LOCALLAB_CIE_SMOOTH_NONE;None +!TP_LOCALLAB_COLORFRAME;Dominant color !TP_LOCALLAB_COLOR_CIE;Color curve +!TP_LOCALLAB_COMPRCIE;Brightness compression +!TP_LOCALLAB_COMPRCIETH;Compression threshold +!TP_LOCALLAB_COMPRLOG_TOOLTIP;This algorithm compress the data before log conversion, above the threshold slider value. To use in conjunction with Whites distribution. !TP_LOCALLAB_CURVES_CIE;Tone curve +!TP_LOCALLAB_DEHAZE_BLACK;Black !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_DENOIWAVCH;Wavelets: Chrominance !TP_LOCALLAB_DENOIWAVLUM;Wavelets: Luminance +!TP_LOCALLAB_DISAB_CIECAM;Disable Ciecam or Weak Jz surround !TP_LOCALLAB_DIVGR;Gamma +!TP_LOCALLAB_ENABLE_MASKALL;Enable all mask tools +!TP_LOCALLAB_EXMAIN;Global !TP_LOCALLAB_FATSAT;Saturation control +!TP_LOCALLAB_FEATVALUE_MASK;Feather gradient (Grad. Filters Mask) !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. @@ -4054,23 +4185,59 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !TP_LOCALLAB_LAPRAD2_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. !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_LOGCIEQ;Log Encoding Q (with Ciecam) +!TP_LOCALLAB_LOGCIEQ_TOOLTIP;Activating the checkbox allows you to switch between log encoding based on the 3 RGB channels, and log encoding based solely on Ciecam’s brightness (Q) channel.\nUsing the Q channel instead of the RGB channels helps avoid undesirable edge effects such as hue and saturation shifts.\nHowever, the settings are more difficult to optimise because Q is unbounded and Ciecam alters the data to take into account the surround conditions, simultaneous contrast, etc.\nYou may have to adjust the following:\n Scene conditions: Mean luminance (Yb), Whites & Blacks distribution, Black Ev, White Ev.\n Source Data Adjustments : Brightness compression, Strength.\n\nNote: when using Log Encoding (Q), be careful not to activate the Disable Ciecam option in the Scene Conditions, Surround menu. +!TP_LOCALLAB_LOGPFRA2;Log Encoding settings !TP_LOCALLAB_LUM46LABEL;Luma levels 456: Mean=%1 High=%2 !TP_LOCALLAB_LUMFRA;L*a*b* standard !TP_LOCALLAB_LUMLABEL;Luma levels 0123: Mean=%1 High=%2 !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_MIDTCIE;Midtones !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_PRECAMGAMUT_TOOLTIP;If checked, ensures a gamut control just after primary conversion to XYZ. +!TP_LOCALLAB_PRECAMREFIMAIN_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. In combination with "Shift x" and "Shift y", allows you to carry out moderate color toning. +!TP_LOCALLAB_PRECAMREFI_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. +!TP_LOCALLAB_PRECAM_TOOLTIP;'Source Data Adjustments' modifies the Dynamic Range using Log encoding, the tones of the image and primaries (simplified Abstract Profile), and midtones, just before the Ciecam process. These values are adjustable:\nGamma: Acts mainly on light tones\nSlope: Acts mainly on dark tones. You 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.\nDestination primaries: Allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified. You can also finely adapt the primaries and the illuminant (white-point). Moving a primary away from the white point reduces saturation and vice versa. Pay attention to the gamut. +!TP_LOCALLAB_PRIMILLFRAME;Primaries & Illuminant !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_RGBCURVE_TOOLTIP;In RGB mode you have 4 choices : Standard, Weighted standard, Luminance & Film-like. +!TP_LOCALLAB_SATCIE;Saturation control !TP_LOCALLAB_SATURV;Saturation (s) +!TP_LOCALLAB_SIGBLACKSSCIE;Blacks distribution +!TP_LOCALLAB_SIGCIE;Sigmoid +!TP_LOCALLAB_SIGGAMJCIE;Gamma +!TP_LOCALLAB_SIGMOID16_TOOLTIP;Allows you to simulate a tone mapping appearance using both 'Ciecam' and 'Sigmoid Q'. Sigmoid Q has three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc) Adaptability weights the action of the sigmoid by action on the internal exponential function. +!TP_LOCALLAB_SIGMOIDLOGAUTO;Auto threshold +!TP_LOCALLAB_SIGMOIDLOGEV_TOOLTIP;If the combo box selection 'Black Ev and White Ev' is 'Sigmoid and Log encoding' instead of 'Sigmoid only', the two algorithms 'Log encoding' and 'Sigmoid' are used together. +!TP_LOCALLAB_SIGMOIDNORMCIE;Normalize Luminance +!TP_LOCALLAB_SIGMOIDNORMCIEBLEND_TOOLTIP;Blend acts on the final aspect of the image, contrast and luminance. Ratio between original and output image. +!TP_LOCALLAB_SIGMOIDNORMCIE_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image take into account those of the original.\nAll the adjustments acting on J or Q are taken into account, including those which are not relative to Sigmoid Q. +!TP_LOCALLAB_SIGMOIDQJCOMPRCIE_TOOLTIP;When the combo box selection 'Uses Black Ev and White Ev' is 'Sigmoid and Log encoding Q' or 'Log encoding instead of Sigmoid' checked. This algorithm compress the data above the threshold slider value. The last value stands for brightness (Q) and should be close as possible to the value 'Compression threshold' (calculate when 'Auto threshold" checked, often > 1). +!TP_LOCALLAB_SIGMOIDSENSI;Adaptability +!TP_LOCALLAB_SIGMOIDWHITESCIE_TOOLTIP;Allows you, in Automatic when the dynamic range of the image is high, to change the distribution of lights in whites and deep blacks.\nCan be used with Log encoding or Sigmoid with Black Ev and White Ev enabled.\n\nThe algorithm does not change the basic data, but acts on the components necessary to calculate the Dynamic range, Black Ev, White Ev and the Gray point. +!TP_LOCALLAB_SIGSLOPJCIE;Slope +!TP_LOCALLAB_SIGTRCCIE;Source Data Adjustments +!TP_LOCALLAB_SIGWHITESCIE;Whites distribution +!TP_LOCALLAB_SLOPESMOOTH;Gray balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHB;Blue balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHG;Green balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHR;Red balance (Slope) +!TP_LOCALLAB_SMOOTHCIE;Highlight Attenuation +!TP_LOCALLAB_SMOOTHCIE_LUM;Luminosity mode +!TP_LOCALLAB_SMOOTHCIE_SCA;Scale Yb Scene +!TP_LOCALLAB_SMOOTHCIE_TOOLTIP;Completes the processing carried out by gamma, slope and midtones by causing a slight lowering of lights. Please note this does not replace Highlight reconstruction.\n\nGamma based and Slope based (Standard and Advanced) allow you to simulate a tone mapping using:\na) Scene conditions: Black-Ev, White-Ev, Mean luminance (Yb%)\nb) Viewing conditions: Mean luminance (Yb%).\n\nScale Yb Scene is function of White-Ev. +!TP_LOCALLAB_SMOOTHCIE_YB;Scale Yb Viewing +!TP_LOCALLAB_STRENGTHCIELOG;Strength !TP_LOCALLAB_TE_PIVOT;Pivot (Ev) !TP_LOCALLAB_TOOLMASK_2;Wavelets +!TP_LOCALLAB_TRCFRAME;Tone Response Curve & Midtones !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 @@ -4193,7 +4360,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !TP_WAVELET_WAVOFFSET;Offset !TP_WBALANCE_AUTOITCGREEN;Temperature correlation !TP_WBALANCE_AUTOOLD;RGB grey -!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement +!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement !TP_WBALANCE_ITCWALG_TOOLTIP;Allows you to switch to the other Alternative temperature (Alt_temp), when possible.\nInactive in the "single choice" case. !TP_WBALANCE_ITCWBDELTA_TOOLTIP;Fixed for each "green" iteration tried, the temperature difference to be taken into account. !TP_WBALANCE_ITCWBFGREEN_TOOLTIP;Find the best compromise between Student and green. @@ -4236,7 +4403,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !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_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).\nIn the rare case of a color drift with "Observer 2°" (probably due to the conversion matrix) "Observer 10°" must be selected. !TP_WBALANCE_PATCHLABEL;Read colors:%1 Patch: Chroma:%2 Size=%3 !TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colors (max=237).\nDisplay calculated Patch Chroma.\nAWB temperature bias, lets try to reduce this value, a minimum may seem to optimize the algorithm.\n\nPatch size matching chroma optimization. !TP_WBALANCE_PATCHLEVELLABEL;Patch: ΔE=%1 - datas x 9 Min:%2 Max=%3 diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index c150994ee..c78af3958 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -3,6 +3,7 @@ #003 2011-08-26 v3.0 joker, chelidon, ffsup2 #004 2011-08-31 v4.0 chelidon, ffsup2 #005 2014-04-21 crx +#006 2024-03-04 capejeaspaje #100 #101 @LANGUAGE_DISPLAY_NAME=Italiano @@ -11,11 +12,18 @@ ABOUT_TAB_CREDITS;Riconoscimenti ABOUT_TAB_LICENSE;Licenza ABOUT_TAB_RELEASENOTES;Note di rilascio ABOUT_TAB_SPLASH;Emblema +ADJUSTER_RESET_TO_DEFAULT;Click - ripristina i valori di default.\nCtrl+click - ripristina i valori iniziali. BATCH_PROCESSING;Sviluppo in serie +CURVEEDITOR_AXIS_IN;I: +CURVEEDITOR_AXIS_LEFT_TAN;LT: +CURVEEDITOR_AXIS_OUT;O: +CURVEEDITOR_AXIS_RIGHT_TAN;RT: +CURVEEDITOR_CATMULLROM;Flessibile CURVEEDITOR_CURVE;Curva CURVEEDITOR_CURVES;Curve CURVEEDITOR_CUSTOM;Personalizzata CURVEEDITOR_DARKS;Toni Scuri +CURVEEDITOR_EDITPOINT_HINT;Abilita la modifica dei valori di ingresso/uscita del nodo.\n\n Click-destro su un nodo per selezionarlo.\nClick-destro su uno spazio vuoto per deselezionare il nodo. CURVEEDITOR_HIGHLIGHTS;Alteluci CURVEEDITOR_LIGHTS;Toni chiari CURVEEDITOR_LINEAR;Lineare @@ -32,23 +40,43 @@ CURVEEDITOR_TOOLTIPPASTE;Incolla la curva dagli appunti CURVEEDITOR_TOOLTIPSAVE;Salva la curva corrente CURVEEDITOR_TYPE;Tipologia: DIRBROWSER_FOLDERS;Cartelle +DONT_SHOW_AGAIN;Non mostrare più questo messaggio. +DYNPROFILEEDITOR_DELETE;Elimina +DYNPROFILEEDITOR_EDIT;Modifica +DYNPROFILEEDITOR_EDIT_RULE;Modifica regola profilo dinamico +DYNPROFILEEDITOR_ENTRY_TOOLTIP;La corrispondenza non fa distinzione tra maiuscole e minuscole.\nUtilizzare il prefisso 're:' per inserire\na un'espressione regolare. +DYNPROFILEEDITOR_IMGTYPE_ANY;Qualsiasi +DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +DYNPROFILEEDITOR_IMGTYPE_STD;Standard +DYNPROFILEEDITOR_MOVE_DOWN;Muovi Giù +DYNPROFILEEDITOR_MOVE_UP;Muovi Sù +DYNPROFILEEDITOR_NEW;Nuovo +DYNPROFILEEDITOR_NEW_RULE;Nuova regola del profilo dinamico +DYNPROFILEEDITOR_PROFILE;Profilo di elaborazione EDITWINDOW_TITLE;Modifica immagine EDIT_OBJECT_TOOLTIP;Mostra un widget nella finestra anteprima che ti permette di configurare questo strumento. EDIT_PIPETTE_TOOLTIP;Per aggiungere un punto di regolazione alla curva, tieni premuto il tasto Ctrl e fai click sul punto desiderato nell'anteprima dell'immagine.\nPer sistemare il punto, tieni premuto il tasto Ctrl mentre fai click sulla corrispondente area nell'anteprima, poi lascia il tasto Ctrl (a meno che non desideri un controllo fine) e mentre tieni premuto il tasto sinistro del mouse, muovilo in su e in giù per muovere il punto su e giù sulla curva. +ERROR_MSG_METADATA_VALUE;Metadata: errore di setting %1 di %2 EXIFFILTER_APERTURE;Diaframma EXIFFILTER_CAMERA;Fotocamera EXIFFILTER_EXPOSURECOMPENSATION;Compensazione dell'Esposizione (EV) EXIFFILTER_FILETYPE;Tipo file EXIFFILTER_FOCALLEN;Lunghezza focale +EXIFFILTER_IMAGETYPE;Tipo di immagine EXIFFILTER_ISO;ISO EXIFFILTER_LENS;Obiettivo EXIFFILTER_METADATAFILTER;Abilita filtri metadati +EXIFFILTER_PATH;Percorso del file EXIFFILTER_SHUTTER;Tempo d'esposizione +EXIFPANEL_ACTIVATE_ALL_HINT;Seleziona tutti i tags +EXIFPANEL_ACTIVATE_NONE_HINT;Deseleziona tutti i tags EXIFPANEL_ADDEDIT;Aggiungi/Modifica EXIFPANEL_ADDEDITHINT;Aggiungi un nuovo campo o modificane uno esistente EXIFPANEL_ADDTAGDLG_ENTERVALUE;Inserisci il valore EXIFPANEL_ADDTAGDLG_SELECTTAG;Seleziona un campo EXIFPANEL_ADDTAGDLG_TITLE;Aggiungi/Modifica un campo +EXIFPANEL_BASIC_GROUP;Di base EXIFPANEL_KEEP;Mantieni EXIFPANEL_KEEPHINT;Mantieni i campi selezionati nel file di uscita EXIFPANEL_REMOVE;Rimuovi @@ -57,11 +85,13 @@ EXIFPANEL_RESET;Ripristina EXIFPANEL_RESETALL;Ripristina tutto EXIFPANEL_RESETALLHINT;Ripristina tutti i campi al loro valore originario EXIFPANEL_RESETHINT;Ripristina i campi selezionati ai loro valori originari -EXIFPANEL_SUBDIRECTORY;Sottocartella +EXIFPANEL_VALUE_NOT_SHOWN;Non mostrare +EXPORT_BYPASS;Passaggi di elaborazione da bypassare EXPORT_BYPASS_ALL;Seleziona/Deseleziona Tutto EXPORT_BYPASS_DEFRINGE;Ignora Defringe EXPORT_BYPASS_DIRPYRDENOISE;Ignora Riduzione Rumore EXPORT_BYPASS_DIRPYREQUALIZER;Ignora Contrasto per livelli di dettaglio +EXPORT_BYPASS_EQUALIZER;Bypassare i livelli wavelet EXPORT_BYPASS_RAW_CA;Ignora Correzione Aberrazione Cromatica [raw] EXPORT_BYPASS_RAW_CCSTEPS;Ignora Soppressione Falsi Colori [raw] EXPORT_BYPASS_RAW_DCB_ENHANCE;Ignora Passaggi di Miglioramento DCB [raw] @@ -78,23 +108,34 @@ EXPORT_FASTEXPORTOPTIONS;Opzioni di Esportazione Rapida EXPORT_INSTRUCTIONS;Le opzioni di Esportazione Rapida forniscono opzioni per ignorare le impostazioni di sviluppo ad elevato consumo di tempo e risorse ed avviare quindi la coda di sviluppo usando solo le impostazioni veloci. Questo metodo è consigliato per la lavorazione veloce di immagini a bassa risoluzione quando è importante la rapidità, oppure quando si desidera ridimensionare una o più immagini senza apportare modifiche ai parametri di sviluppo salvati. EXPORT_MAXHEIGHT;Altezza Massima: EXPORT_MAXWIDTH;Larghezza Massima: +EXPORT_PIPELINE;Pipeline di elaborazione EXPORT_PUTTOQUEUEFAST; Aggiungi alla Coda di sviluppo per l'Esportazione Rapida EXPORT_RAW_DMETHOD;Metodo di Demosaicizzazione +EXPORT_USE_FAST_PIPELINE;Dedicato (elaborazione completa sull'immagine ridimensionata) +EXPORT_USE_FAST_PIPELINE_TOOLTIP;Utilizza una pipeline di elaborazione dedicata per le immagini in modalità Esportazione rapida, che baratta la velocità con la qualità. Il ridimensionamento dell'immagine viene effettuato il prima possibile, invece di farlo alla fine come nella pipeline normale. L'accelerazione può essere significativa, ma preparati a vedere artefatti e un generale degrado della qualità dell'output. +EXPORT_USE_NORMAL_PIPELINE;Standard (ignora alcuni passaggi, ridimensiona alla fine) EXTPROGTARGET_1;raw EXTPROGTARGET_2;Lavorato dalla Coda FILEBROWSER_APPLYPROFILE;Applica FILEBROWSER_APPLYPROFILE_PARTIAL;Applica (parziale) FILEBROWSER_AUTODARKFRAME;Dark Frame automatico FILEBROWSER_AUTOFLATFIELD;Flat Field automatico +FILEBROWSER_BROWSEPATHBUTTONHINT;Fare clic per aprire il percorso specificato, ricaricare la cartella e applicare le parole chiave "trova". FILEBROWSER_BROWSEPATHHINT;Inserisci il percorso da aprire\nCtrl-o seleziona il percorso\nEnter, Ctrl-Enter (solo nel Navigatore) porta alla destinazione ;\nScorciatoie:\n ~ - Cartella home\n ! - Cartella Immagini FILEBROWSER_CACHE;Memoria +FILEBROWSER_CACHECLEARFROMFULL;Cancella tutto, compresi i profili memorizzati nella cache +FILEBROWSER_CACHECLEARFROMPARTIAL;Cancella tutto tranne i profili memorizzati nella cache FILEBROWSER_CLEARPROFILE;Cancella FILEBROWSER_COLORLABEL_TOOLTIP;Etichetta colore.\n\nUsa il menù o le scorciatoie:\nShift-Ctrl-0 Nessun Colore\nShift-Ctrl-1 Rosso\nShift-Ctrl-2 Giallo\nShift-Ctrl-3 Verde\nShift-Ctrl-4 Blu\nShift-Ctrl-5 Viola FILEBROWSER_COPYPROFILE;Copia FILEBROWSER_CURRENT_NAME;Nome corrente: FILEBROWSER_DARKFRAME;Dark Frame +FILEBROWSER_DELETEDIALOG_ALL;Vuoi eliminare permanentemente tutti i file %1 nel cestino? FILEBROWSER_DELETEDIALOG_HEADER;Conferma eliminazione del file +FILEBROWSER_DELETEDIALOG_SELECTED;Sei sicuro di voler eliminare permanentemente i file %1 selezionati? +FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Sei sicuro di voler eliminare permanentemente i file %1 selezionati, inclusa una versione elaborata in coda? FILEBROWSER_EMPTYTRASH;Svuota cestino +FILEBROWSER_EMPTYTRASHHINT;Elimina permanentemente tutti i file nel cestino. FILEBROWSER_EXTPROGMENU;Apri con FILEBROWSER_FLATFIELD;Flat Field FILEBROWSER_MOVETODARKFDIR;Sposta nella cartella dei Dark Frame @@ -113,6 +154,7 @@ FILEBROWSER_POPUPCOLORLABEL4;Etichetta: Blu FILEBROWSER_POPUPCOLORLABEL5;Etichetta: Viola FILEBROWSER_POPUPCOPYTO;Copia in... FILEBROWSER_POPUPFILEOPERATIONS;Operazioni sul file +FILEBROWSER_POPUPINSPECT;Ispezionare FILEBROWSER_POPUPMOVEEND;Sposta in fondo alla coda FILEBROWSER_POPUPMOVEHEAD;Sposta in cima alla coda FILEBROWSER_POPUPMOVETO;Sposta in... @@ -128,8 +170,11 @@ FILEBROWSER_POPUPRANK2;Punteggio 2 ** FILEBROWSER_POPUPRANK3;Punteggio 3 *** FILEBROWSER_POPUPRANK4;Punteggio 4 **** FILEBROWSER_POPUPRANK5;Punteggio 5 ***** +FILEBROWSER_POPUPREMOVE;Elimina in modo permanente +FILEBROWSER_POPUPREMOVEINCLPROC;Elimina in modo permanente, inclusa la versione elaborata in coda FILEBROWSER_POPUPRENAME;Rinomina FILEBROWSER_POPUPSELECTALL;Seleziona tutto +FILEBROWSER_POPUPSORTBY;Ordina file FILEBROWSER_POPUPTRASH;Sposta nel cestino FILEBROWSER_POPUPUNRANK;Rimuovi il punteggio FILEBROWSER_POPUPUNTRASH;Rimuovi dal cestino @@ -142,6 +187,7 @@ FILEBROWSER_RANK3_TOOLTIP;Punteggio 3 *\nScorciatoia: 3 FILEBROWSER_RANK4_TOOLTIP;Punteggio 4 *\nScorciatoia: 4 FILEBROWSER_RANK5_TOOLTIP;Punteggio 5 *\nScorciatoia: 5 FILEBROWSER_RENAMEDLGLABEL;Rinomina il file +FILEBROWSER_RESETDEFAULTPROFILE;Riportare alle condizioni originali FILEBROWSER_SELECTDARKFRAME;Seleziona un Dark Frame... FILEBROWSER_SELECTFLATFIELD;Seleziona un Flat Field... FILEBROWSER_SHOWCOLORLABEL1HINT;Mostra le immagini con etichetta Rossa.\nScorciatoia: Alt-1 @@ -153,6 +199,8 @@ FILEBROWSER_SHOWDIRHINT;Rimuovi tutti i filtri.\nScorciatoia: d FILEBROWSER_SHOWEDITEDHINT;Mostra immagini modificate.\nScorciatoia: Shift-7 FILEBROWSER_SHOWEDITEDNOTHINT;Mostra immagini non modificate.\nScorciatoia: Shift-6 FILEBROWSER_SHOWEXIFINFO;Mostra informazioni Exif.\nScorciatoie:\ni - Modalità a Schede Multiple,\nAlt-i - Modalità a Schede Singole. +FILEBROWSER_SHOWNOTTRASHHINT;Mostra solo le immagini non nel cestino. +FILEBROWSER_SHOWORIGINALHINT;Mostra solo immagini originali.\n\nQuando esistono più immagini con lo stesso nome file ma estensioni diverse, quella considerata originale è quella la cui estensione è più vicina alla parte superiore dell'elenco delle estensioni analizzate in Preferenze > Browser file > Estensioni analizzate. FILEBROWSER_SHOWRANK1HINT;Mostra le immagini classificate con 1 stella.\nScorciatoia: Shift-1 FILEBROWSER_SHOWRANK2HINT;Mostra le immagini classificate con 2 stelle.\nScorciatoia: Shift-2 FILEBROWSER_SHOWRANK3HINT;Mostra le immagini classificate con 3 stelle.\nScorciatoia: Shift-3 @@ -167,32 +215,62 @@ FILEBROWSER_THUMBSIZE;Dimensione miniature FILEBROWSER_UNRANK_TOOLTIP;Nessun Punteggio.\nScorciatoia: 0 FILEBROWSER_ZOOMINHINT;Aumenta la dimensione delle miniature.\n\nScorciatoie:\n+ - Modalità a Schede Multiple,\nAlt-+ - Modalità a Schede Singole. FILEBROWSER_ZOOMOUTHINT;Diminuisci la dimensione delle miniature.\n\nScorciatoie:\n- - Modalità a Schede Multiple,\nAlt-- - Modalità a Schede Singole. +FILECHOOSER_FILTER_ANY;Tutti i files +FILECHOOSER_FILTER_COLPROF;Profili colore (*.icc) +FILECHOOSER_FILTER_CURVE;File di curve +FILECHOOSER_FILTER_EXECUTABLE;File eseguibili +FILECHOOSER_FILTER_LCP;Profili di correzione delle lenti +FILECHOOSER_FILTER_PP;Profili di elaborazione +FILECHOOSER_FILTER_SAME;Stesso formato della foto attuale +FILECHOOSER_FILTER_TIFF;File TIFF GENERAL_ABOUT;Informazioni GENERAL_AFTER;Dopo +GENERAL_APPLY;Applica +GENERAL_ASIMAGE;Come immagine GENERAL_AUTO;Automatico GENERAL_BEFORE;Prima GENERAL_CANCEL;Annulla GENERAL_CLOSE;Chiudi +GENERAL_CURRENT;Attuale +GENERAL_DELETE_ALL;Cancella tutto GENERAL_DISABLE;Disabilita GENERAL_DISABLED;Disabilitato +GENERAL_EDIT;Modifica GENERAL_ENABLE;Abilita GENERAL_ENABLED;Abilitato GENERAL_FILE;File +GENERAL_HELP;Aiuto GENERAL_LANDSCAPE;Panorama GENERAL_NA;n/a GENERAL_NO;No GENERAL_NONE;Nessuno GENERAL_OK;OK +GENERAL_OPEN;Apri +GENERAL_OTHER;Altro GENERAL_PORTRAIT;Ritratto +GENERAL_RESET;Ripristina GENERAL_SAVE;Salva +GENERAL_SAVE_AS;Salva come… +GENERAL_SLIDER;Cursore GENERAL_UNCHANGED;(Invariato) GENERAL_WARNING;Attenzione +GIMP_PLUGIN_INFO;Benvenuto nel plugin GIMP di RawTherapee!\nUna volta terminata la modifica, chiudi semplicemente la finestra principale di RawTherapee e l'immagine verrà automaticamente importata in GIMP. HISTOGRAM_TOOLTIP_B;Mostra/Nascondi l'istogramma del Blu. HISTOGRAM_TOOLTIP_BAR;Mostra/Nascondi la barra RBG.\nPremi il tasto destro del mouse sull'anteprima dell'immagine per bloccarla/sbloccarla. HISTOGRAM_TOOLTIP_CHRO;Mostra/Nascondi l'istogramma di cromaticità. +HISTOGRAM_TOOLTIP_CROSSHAIR;Mostra/nascondi mirino indicatore. HISTOGRAM_TOOLTIP_G;Mostra/Nascondi l'istogramma del Verde. HISTOGRAM_TOOLTIP_L;Mostra/Nascondi l'istogramma di Luminanza CIELAB. +HISTOGRAM_TOOLTIP_MODE;Alterna tra il ridimensionamento lineare, log-lineare e log-log dell'istogramma. HISTOGRAM_TOOLTIP_R;Mostra/Nascondi l'istogramma del Rosso. +HISTOGRAM_TOOLTIP_SHOW_OPTIONS;Attiva/disattiva la visibilità dei pulsanti di opzione dell'ambito. +HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS;Regola la luminosità dell'oscilloscopio. +HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Istogramma +HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Istogramma grezzo +HISTOGRAM_TOOLTIP_TYPE_PARADE;Parata RGB +HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Vectorscope tonalità-croma +HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;Vectorscope tonalità-saturazione +HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Forma d'onda HISTORY_CHANGED;Modificato HISTORY_CUSTOMCURVE;Curva personalizzata HISTORY_FROMCLIPBOARD;Dagli appunti @@ -224,7 +302,7 @@ HISTORY_MSG_28;USM - Quantità Controllo Alone HISTORY_MSG_29;Nitidezza - Metodo HISTORY_MSG_30;RLD - Raggio HISTORY_MSG_31;RLD - Quantità -HISTORY_MSG_32;RLD - Smorzamento +HISTORY_MSG_32;RLD - Attenuazione HISTORY_MSG_33;RLD - Iterazioni HISTORY_MSG_34;Correzione Distorsione HISTORY_MSG_35;Correzione Vignettatura @@ -335,7 +413,7 @@ HISTORY_MSG_154;Vividezza - Proteggi Incarnato HISTORY_MSG_155;Vividezza - Evita il color shift HISTORY_MSG_156;Vividezza - Lega toni Pastello/Saturi HISTORY_MSG_157;Vividezza - Soglia Pastello/Saturi -HISTORY_MSG_158;TM - Forza +HISTORY_MSG_158;TM - Intensità HISTORY_MSG_159;TM - Blocco ai Bordi HISTORY_MSG_160;TM - Scala HISTORY_MSG_161;TM - Iterazioni di Ribilanciamento @@ -343,12 +421,14 @@ HISTORY_MSG_162;Tone Mapping (TM) HISTORY_MSG_163;Curve RGB - R (Rosso) HISTORY_MSG_164;Curve RGB - G (Verde) HISTORY_MSG_165;Curve RGB - B (Blu) +HISTORY_MSG_166;Esposizione – Reimposta HISTORY_MSG_167;Demosaicizzazione - Metodo HISTORY_MSG_168;Curva 'CC' HISTORY_MSG_169;Curva 'CH' HISTORY_MSG_170;Vividezza - Curva HISTORY_MSG_171;Curva 'LC' HISTORY_MSG_172;Lab - Limita LC +HISTORY_MSG_173;NR - Recupero dettaglio HISTORY_MSG_174;CIECAM02 HISTORY_MSG_175;CAM02 - Adattamento CAT02 HISTORY_MSG_176;CAM02 - Ambiente di Visualizzazione @@ -378,6 +458,7 @@ HISTORY_MSG_199;CAM02 - Mostra negli istogrammi HISTORY_MSG_200;CAM02 - Tone mapping HISTORY_MSG_201;NR - Crominanza R,G HISTORY_MSG_202;NR - Crominanza B,Y +HISTORY_MSG_203;NR - Spazio colore HISTORY_MSG_204;Passaggi di miglioramento LMMSE HISTORY_MSG_205;CAM02 - Pixel Surriscaldati/Guasti HISTORY_MSG_206;CAT02 - Lum. automatica della scena @@ -385,7 +466,7 @@ HISTORY_MSG_207;Defringe - Curva Tonalità HISTORY_MSG_208;WB - B-R Equalizzatore HISTORY_MSG_210;GF - Angolo HISTORY_MSG_211;Filtro Graduato (GF) -HISTORY_MSG_212;VF - Forza +HISTORY_MSG_212;VF - Intensità HISTORY_MSG_213;Filtro Vignettatura (VF) HISTORY_MSG_214;Bianco-Nero (BN) HISTORY_MSG_215;BN - CM - Rosso @@ -408,14 +489,16 @@ HISTORY_MSG_231;BN - Curva 'Prima' HISTORY_MSG_232;BN - Tipo Curva 'Prima' HISTORY_MSG_233;BN - Curva 'Dopo' HISTORY_MSG_234;BN - Tipo Curva 'Dopo' +HISTORY_MSG_235;B&W - CM – Auto HISTORY_MSG_236;--unused-- +HISTORY_MSG_237;B&W – CM HISTORY_MSG_238;GF - Scia -HISTORY_MSG_239;GF - Forza +HISTORY_MSG_239;GF - intensità HISTORY_MSG_240;GF - Centro HISTORY_MSG_241;VF - Scia HISTORY_MSG_242;VF - Rotondità HISTORY_MSG_243;VC - Raggio -HISTORY_MSG_244;VC - Forza +HISTORY_MSG_244;VC - intensità HISTORY_MSG_245;VC - Centro HISTORY_MSG_246;Curva 'CL' HISTORY_MSG_247;Curva 'LH' @@ -426,34 +509,1158 @@ HISTORY_MSG_252;CbDL Toni della Pelle HISTORY_MSG_253;CbDL Riduzione Artefatti HISTORY_MSG_254;CbDL - Tonalità Incarnato HISTORY_MSG_255;CbDL - Algoritmo +HISTORY_MSG_256;NR - Mediana - Tipo +HISTORY_MSG_257;Tono colore +HISTORY_MSG_258;CT - Curva colore +HISTORY_MSG_259;CT - Opacità curva +HISTORY_MSG_260;CT - a*[b*] opacità +HISTORY_MSG_261;CT - Metodo +HISTORY_MSG_262;CT - b* opacità +HISTORY_MSG_263;CT - Ombre - Rosso +HISTORY_MSG_264;CT - Ombre - Verde +HISTORY_MSG_265;CT - Ombre - Blu +HISTORY_MSG_266;CT - Medio - Rosso +HISTORY_MSG_267;CT - Medio - Verde +HISTORY_MSG_268;CT - Medio - Blu +HISTORY_MSG_269;CT - Alto - Rosso +HISTORY_MSG_270;CT - Alto - Verde +HISTORY_MSG_271;CT - Alto - Blu +HISTORY_MSG_272;CT - Bilanciamento +HISTORY_MSG_273;CT - Bilanciamento Colore SMH +HISTORY_MSG_276;CT - Opacità +HISTORY_MSG_277;--inutilizzato-- +HISTORY_MSG_278;CT - Preserva la luminanza +HISTORY_MSG_279;CT - Ombre +HISTORY_MSG_280;CT - Alteluci +HISTORY_MSG_281;CT - Intensità di saturazione +HISTORY_MSG_282;CT - Soglia di saturazione +HISTORY_MSG_283;CT - intensità +HISTORY_MSG_284;CT - Protezione Sat. Auto +HISTORY_MSG_285;NR - Metodo Medio +HISTORY_MSG_286;NR - Tipo Medio +HISTORY_MSG_287;NR - Iterazione Media +HISTORY_MSG_288;Controllo della clip del Flat-Field +HISTORY_MSG_289;Controllo della clip Flat-Field automatico +HISTORY_MSG_290;Livello del Nero - Rosso +HISTORY_MSG_291;Livello del Nero - Verde +HISTORY_MSG_292;Livello del Nero - Blu +HISTORY_MSG_293;Film Simulation +HISTORY_MSG_294;Film Simulation - intensità +HISTORY_MSG_295;Film Simulation - Film +HISTORY_MSG_296;NR - Curva di Luminanza +HISTORY_MSG_297;NR - Modo +HISTORY_MSG_298;Filtro pixel bruciati +HISTORY_MSG_299;NR - Curva di Crominanza +HISTORY_MSG_301;NR - Controllo Luma +HISTORY_MSG_302;NR - Metodo Cromatico +HISTORY_MSG_303;NR - Metodo Cromatico +HISTORY_MSG_304;W - Livello di contrasto +HISTORY_MSG_305;Livello di Wavelet +HISTORY_MSG_306;W - Processo +HISTORY_MSG_307;W - Processo +HISTORY_MSG_308;W - Direzione del Processo +HISTORY_MSG_309;W - ES - Dettaglio +HISTORY_MSG_310;W - Cromia Residua - proteggi le tonalità del cielo +HISTORY_MSG_311;W - Livello di Wavelet +HISTORY_MSG_312;W - Soglia delle ombre residuale +HISTORY_MSG_313;W - Cromia - Saturazione/Pastello +HISTORY_MSG_314;W - Riduzione artefatti di Gamut +HISTORY_MSG_315;W - Contrasto Residuale +HISTORY_MSG_316;W - Gamma - Proteggi le tonalità della pelle +HISTORY_MSG_317;W - Gamma - Tonalità della pelle +HISTORY_MSG_318;W - Livelli più fini di Contrasto +HISTORY_MSG_319;W - Gamma più fine di Contrasto +HISTORY_MSG_320;W - Gamma più grossolana di Contrasto +HISTORY_MSG_321;W - Livelli più grossolani di Contrasto +HISTORY_MSG_322;W - Evita il cambiamento di colore di Gamut +HISTORY_MSG_323;W - ES - Contrasto Locale +HISTORY_MSG_324;W - Pastello cromatico +HISTORY_MSG_325;W - Saturazione cromatica +HISTORY_MSG_326;W - Metodo cromatico +HISTORY_MSG_327;W - Applica a Contrasto +HISTORY_MSG_328;W - Intensità del collegamento cromatico +HISTORY_MSG_329;W - Tonalità - Opacità RG +HISTORY_MSG_330;W - Tonalità - Opacità BY +HISTORY_MSG_331;W - Livello di Contrasto - Extra +HISTORY_MSG_332;W - Metodo di piastrellatura +HISTORY_MSG_333;W - Ombre residue +HISTORY_MSG_334;W - Cromaticità residua +HISTORY_MSG_335;W - Alteluci residue +HISTORY_MSG_336;W - Soglia alteluci residue +HISTORY_MSG_337;W - Tonalità del cielo residue +HISTORY_MSG_338;W - ES - Raggio +HISTORY_MSG_339;W - ES - Intensità +HISTORY_MSG_340;W - Intensità +HISTORY_MSG_341;W - Prestazioni ai bordi +HISTORY_MSG_342;W - ES - Primo Livello +HISTORY_MSG_343;W - Livello di Cromaticità +HISTORY_MSG_344;W - Metodo colore - Cursore Curva +HISTORY_MSG_345;W - ES - Contrasto Locale +HISTORY_MSG_346;W - ES - Metodo per il Contrasto Locale +HISTORY_MSG_347;W - Eliminazione del rumore - Levello 1 +HISTORY_MSG_348;W - Eliminazione del rumore - Levello 2 +HISTORY_MSG_349;W - Eliminazione del rumore - Levello 3 +HISTORY_MSG_350;W - ES - Rilevamento dei bordi +HISTORY_MSG_351;W - Curva HH residuale +HISTORY_MSG_352;W - Background +HISTORY_MSG_353;W - ES - Sensibilità gradiente +HISTORY_MSG_354;W - ES - Migliorata +HISTORY_MSG_355;W - ES - Soglia bassa +HISTORY_MSG_356;W - ES - Soglia alta +HISTORY_MSG_357;W - Eliminazione del rumore - Collegamento con ES +HISTORY_MSG_358;W - Gamut - CH +HISTORY_MSG_359;Soglia di Caldo/Morto +HISTORY_MSG_360;TM - Gamma +HISTORY_MSG_361;W - Bilanciamento cromatico finale +HISTORY_MSG_362;W - Metodo di compressione residuo +HISTORY_MSG_363;W - Intensità di compressione residua +HISTORY_MSG_364;W - Bilanciamento di contrasto finale +HISTORY_MSG_365;W - Bilanciamento variazione finale +HISTORY_MSG_366;W - Compressione di gamma finale +HISTORY_MSG_367;W - 'Dopo' le curve di contrasto +HISTORY_MSG_368;W - Bilanciamento di contrasto finale +HISTORY_MSG_369;W - Metodo di bilanciamento finale +HISTORY_MSG_370;W - Curva di contrasto locale finale +HISTORY_MSG_371;Nitidezza post-ridimensionamento +HISTORY_MSG_372;PRS USM - Raggio +HISTORY_MSG_373;PRS USM - Quantità +HISTORY_MSG_374;PRS USM - Soglia +HISTORY_MSG_375;PRS USM - Affila solo i bordi +HISTORY_MSG_376;PRS USM - Raggio di rilevamento del bordo +HISTORY_MSG_377;PRS USM - Tolleranza del bordo +HISTORY_MSG_378;PRS USM - Controllo dell'alone +HISTORY_MSG_379;PRS USM - Quantità di controllo dell'alone +HISTORY_MSG_380;PRS - Metodo +HISTORY_MSG_381;PRS RLD - Raggio +HISTORY_MSG_382;PRS RLD - Quantità +HISTORY_MSG_383;PRS RLD - Attenuazione +HISTORY_MSG_384;PRS RLD - Iterazioni +HISTORY_MSG_385;W - Bilanciamento del colore residuo +HISTORY_MSG_386;W - CB verde alto residuo +HISTORY_MSG_387;W - CB blu alto residuo +HISTORY_MSG_388;W - CB verde medio residuo +HISTORY_MSG_389;W - CB blu medio residuo +HISTORY_MSG_390;W - CB verde basso residuo +HISTORY_MSG_391;W - CB blu basso residuo +HISTORY_MSG_392;W - Bilanciamento del colore residuo +HISTORY_MSG_393;DCP - Guarda la tabella +HISTORY_MSG_394;DCP - Esposizione di base +HISTORY_MSG_395;DCP - Tabella di base +HISTORY_MSG_396;W - Sotto-strumento di contrasto +HISTORY_MSG_397;W - Sotto-strumento di Cromaticità +HISTORY_MSG_398;W - Sotto-strumento di ES +HISTORY_MSG_399;W - Sotto-strumento residuale +HISTORY_MSG_400;W - Sotto-strumento finale +HISTORY_MSG_401;W - Sotto-strumento di tono +HISTORY_MSG_402;W - Sotto-strumento di eliminazione del rumore +HISTORY_MSG_403;W - ES - Sensibilità dei bordi +HISTORY_MSG_404;W - ES - Amplificazione di base +HISTORY_MSG_405;W - Eliminazione del rumore - Level 4 +HISTORY_MSG_406;W - ES - Pixel vicini +HISTORY_MSG_407;Retinex - Metodo +HISTORY_MSG_408;Retinex - Raggio +HISTORY_MSG_410;Retinex - Compensare +HISTORY_MSG_411;Retinex - Intensità +HISTORY_MSG_412;Retinex - Gradiente Gaussiano +HISTORY_MSG_413;Retinex - Contrasto +HISTORY_MSG_414;Retinex - Istogramma - Lab +HISTORY_MSG_415;Retinex - Trasmissione +HISTORY_MSG_416;Retinex +HISTORY_MSG_417;Retinex - Trasmissione media +HISTORY_MSG_418;Retinex - Soglia +HISTORY_MSG_419;Retinex - Spazio Colore +HISTORY_MSG_420;Retinex - Istogramma - HSL +HISTORY_MSG_421;Retinex - Gamma +HISTORY_MSG_422;Retinex - Gamma +HISTORY_MSG_423;Retinex - Pendenza di Gamma +HISTORY_MSG_424;Retinex - Soglia HL +HISTORY_MSG_425;--inutilizzato-- +HISTORY_MSG_426;Retinex - Equalizzatore di tonalità +HISTORY_MSG_427;Intento di rendering dell'output +HISTORY_MSG_428;Monitorare l'intento di rendering +HISTORY_MSG_429;Retinex - Iterazione +HISTORY_MSG_430;Retinex - Gradiente di trasmissione +HISTORY_MSG_431;Retinex - Gradiente di forza +HISTORY_MSG_432;Retinex - M - Alteluci +HISTORY_MSG_433;Retinex - M - Alteluci TW +HISTORY_MSG_434;Retinex - M - Ombre +HISTORY_MSG_435;Retinex - M - Ombre TW +HISTORY_MSG_436;Retinex - M - Raggio +HISTORY_MSG_437;Retinex - M - Metodo +HISTORY_MSG_438;Retinex - M - Equalizzatore +HISTORY_MSG_439;Retinex - Processo +HISTORY_MSG_440;CbDL - Metodo +HISTORY_MSG_441;Retinex - Guadagno di trasmissione +HISTORY_MSG_442;Retinex - Scala +HISTORY_MSG_443;Compensazione del punto nero in uscita +HISTORY_MSG_444;WB - Pregiudizio della temperatura +HISTORY_MSG_445;Sotto-immagine RAW +HISTORY_MSG_446;--inutilizzato-- +HISTORY_MSG_447;--inutilizzato-- +HISTORY_MSG_448;--inutilizzato-- +HISTORY_MSG_449;Adattamento ISO PS +HISTORY_MSG_450;--inutilizzato-- +HISTORY_MSG_451;--inutilizzato-- +HISTORY_MSG_452;Mostra movimento PS +HISTORY_MSG_453;Mostra solo la maschera PS +HISTORY_MSG_454;--inutilizzato-- +HISTORY_MSG_455;--inutilizzato-- +HISTORY_MSG_456;--inutilizzato-- +HISTORY_MSG_457;Controllo rosso/blu PS +HISTORY_MSG_458;--inutilizzato-- +HISTORY_MSG_459;--inutilizzato-- +HISTORY_MSG_460;--inutilizzato-- +HISTORY_MSG_461;--inutilizzato-- +HISTORY_MSG_462;Controllo verde PS +HISTORY_MSG_463;--inutilizzato-- +HISTORY_MSG_464;Maschera di movimento sfocato PS +HISTORY_MSG_465;Raggio di sfocatura PS +HISTORY_MSG_466;--inutilizzato-- +HISTORY_MSG_467;--inutilizzato-- +HISTORY_MSG_468;Riempi i buchi PS +HISTORY_MSG_469;Mediano PS +HISTORY_MSG_470;--inutilizzato-- +HISTORY_MSG_471;Correzione del movimento PS +HISTORY_MSG_472;Transizioni fluide PS +HISTORY_MSG_474;Equalizza PS +HISTORY_MSG_475;Equalizza il canale PS +HISTORY_MSG_476;CAL - VC - Temperatura +HISTORY_MSG_477;CAL - VC - Tinta +HISTORY_MSG_478;CAL - VC - Luminanza media +HISTORY_MSG_479;CAL - VC - Adattamento +HISTORY_MSG_480;CAL - VC - Auto adattamento +HISTORY_MSG_481;CAL - SC - Temperatura +HISTORY_MSG_482;CAL - SC - Tinta +HISTORY_MSG_483;CAL - SC - Luminanza media +HISTORY_MSG_484;CAL - SC - Auto luminanza media +HISTORY_MSG_485;Correzione delle lenti +HISTORY_MSG_486;Correzione delle lenti - Camera +HISTORY_MSG_487;Correzione delle lenti - Obiettivo +HISTORY_MSG_488;Compressione della gamma dinamica +HISTORY_MSG_489;Dettagli della compressione della gamma dinamica +HISTORY_MSG_490;Quantità della compressione della gamma dinamica +HISTORY_MSG_491;Bilanciamento del bianco +HISTORY_MSG_492;Curve RGB +HISTORY_MSG_493;Aggiustamenti L*a*b* +HISTORY_MSG_494;Acquisisci nitidezza +HISTORY_MSG_496;Spot locale eliminato +HISTORY_MSG_497;Spot locale selezionato +HISTORY_MSG_498;--inutilizzato-- +HISTORY_MSG_499;--inutilizzato-- +HISTORY_MSG_500;Local - Forma dello Spot +HISTORY_MSG_501;Local - Metodo di Spot +HISTORY_MSG_502;Local - SC - Metodo di forma +HISTORY_MSG_503;Local - Spot - Destro +HISTORY_MSG_504;Local - Spot - Sinistro +HISTORY_MSG_505;Local - Spot - Basso +HISTORY_MSG_506;Local - Spot - Alto +HISTORY_MSG_507;Local - Spot - Centro +HISTORY_MSG_508;Local - Spot - Misurare +HISTORY_MSG_509;Local - Metodo di qualità dello Spot +HISTORY_MSG_510;Local - TG - Valore di transizione +HISTORY_MSG_511;Local - SD - ΔE soglia di ambito +HISTORY_MSG_512;Local - SD - ΔE decadimento +HISTORY_MSG_513;Local - Spot - Escluso - Ambito +HISTORY_MSG_514;Local - Struttura dello spot +HISTORY_MSG_515;Aggiustamenti locali +HISTORY_MSG_516;Local - Colore e luce +HISTORY_MSG_517;Local - Abilita super +HISTORY_MSG_518;Local - Luminosità +HISTORY_MSG_519;Local - Contrasto +HISTORY_MSG_520;Local - Crominanza +HISTORY_MSG_521;Local - Scopo +HISTORY_MSG_522;Local - Metodo delle curve +HISTORY_MSG_523;Local - Curve LL +HISTORY_MSG_524;Local - Curve CC +HISTORY_MSG_525;Local - Curve LH +HISTORY_MSG_526;Local - Curve H +HISTORY_MSG_527;Local - Inversione Colore +HISTORY_MSG_528;Local - Esposizione +HISTORY_MSG_529;Local - Compensazione esposizione +HISTORY_MSG_530;Local - Compressione esposizione delle alteluci +HISTORY_MSG_531;Local - Compressione raccolta della esposizione delle alteluci +HISTORY_MSG_532;Local - Esposizione dei Neutri +HISTORY_MSG_533;Local - Compressione dell'Esposizione +HISTORY_MSG_534;Local - Caldo freddo +HISTORY_MSG_535;Local - Scopo dell'esposizione +HISTORY_MSG_536;Local - Esposizione con curve di contrasto +HISTORY_MSG_537;Local - Vibranza +HISTORY_MSG_538;Local - Vibranza saturata +HISTORY_MSG_539;Local - Vibranza delicata +HISTORY_MSG_540;Local - Soglia di vibranza +HISTORY_MSG_541;Local - Vibranza con protezzione dei toni della pelle +HISTORY_MSG_542;Local - Vibranza evitando cambiamenti colore +HISTORY_MSG_543;Local - Vibranza collegamento +HISTORY_MSG_544;Local - Ambito di vibranza +HISTORY_MSG_545;Local - Vibranza su curve H +HISTORY_MSG_546;Local - Sfocatura e rumore +HISTORY_MSG_547;Local - Raggio +HISTORY_MSG_548;Local - Rumore +HISTORY_MSG_549;Local - Ambito di sfocatura +HISTORY_MSG_550;Local - Metodo di sfocatura +HISTORY_MSG_551;Local - Solo sfocatura di luminanza +HISTORY_MSG_552;Local - Mappatura dei toni +HISTORY_MSG_553;Local - Intensità di compressione della mappatura dei toni +HISTORY_MSG_554;Local - Gamma della mappatura dei toni +HISTORY_MSG_555;Local - Arresto al bordo della mappatura dei toni +HISTORY_MSG_556;Local - Scala della mappatura dei toni +HISTORY_MSG_557;Local - Riponderazione della mappatura dei toni +HISTORY_MSG_558;Local - Ambito della mappatura dei toni +HISTORY_MSG_559;Local - Retinex +HISTORY_MSG_560;Local - Metodo Retinex +HISTORY_MSG_561;Local - Intensità del Retinex +HISTORY_MSG_562;Local - Cromia del Retinex +HISTORY_MSG_563;Local - Raggio del Retinex +HISTORY_MSG_564;Local - Contrasto del Retinex +HISTORY_MSG_565;Local - Ambito +HISTORY_MSG_566;Local - Curva di guadagno del Retinex +HISTORY_MSG_567;Local - Inverso del Retinex +HISTORY_MSG_568;Local - Nitidezza +HISTORY_MSG_569;Local - Raggio di nitidezza +HISTORY_MSG_570;Local - Quantità di nitidezza +HISTORY_MSG_571;Local - Attenuazione della nitidezza +HISTORY_MSG_572;Local - Iterazione della nitidezza +HISTORY_MSG_573;Local - Ambito della nitidezza +HISTORY_MSG_574;Local - Inverso della nitidezza +HISTORY_MSG_575;Local - CBDL +HISTORY_MSG_576;Local - cbdl multiplo +HISTORY_MSG_577;Local - cbdl cromia +HISTORY_MSG_578;Local - cbdl soglia +HISTORY_MSG_579;Local - cbdl ambito +HISTORY_MSG_580;--inutilizzato-- +HISTORY_MSG_581;Local - Eliminazione del rumore mediante luminanza f1 +HISTORY_MSG_582;Local - Eliminazione del rumore mediante luminanza c +HISTORY_MSG_583;Local - Eliminazione del rumore mediante dettagli di luminanza +HISTORY_MSG_584;Local - Eliminazione del rumore mediante equalizzatore Bianco-Nero +HISTORY_MSG_585;Local - Eliminazione del rumore mediante cromia f +HISTORY_MSG_586;Local - Eliminazione del rumore mediante cromia c +HISTORY_MSG_587;Local - Eliminazione del rumore mediante dettagli di cromia +HISTORY_MSG_588;Local - Eliminazione del mediante equalizzatore Blu-Rosso +HISTORY_MSG_589;Local - Eliminazione del rumore bilaterale +HISTORY_MSG_590;Local - Ambito di eliminazione del rumore +HISTORY_MSG_591;Local - Evita il cambiamento di colore +HISTORY_MSG_592;Local - Contrasto di nitidezza +HISTORY_MSG_593;Local - Contrasto locale +HISTORY_MSG_594;Local - Raggio del contrasto locale +HISTORY_MSG_595;Local - Quantità del contrasto locale +HISTORY_MSG_596;Local - Durezza del contrasto locale +HISTORY_MSG_597;Local - Luminosità del contrasto locale +HISTORY_MSG_598;Local - Ambito del contrasto locale +HISTORY_MSG_599;Local - Defoschia Retinex +HISTORY_MSG_600;Local - Abilitazione luce soffusa +HISTORY_MSG_601;Local - Intensità luce soffusa +HISTORY_MSG_602;Local - Ambito luce soffusa +HISTORY_MSG_603;Local - Raggio di sfocaura della nitidezza +HISTORY_MSG_605;Local - Scelta dell'anteprima della maschera +HISTORY_MSG_606;Local Selezione Spot +HISTORY_MSG_607;Local - Maschera di colore C +HISTORY_MSG_608;Local - Maschera di colore L +HISTORY_MSG_609;Local - Maschera di esposizione C +HISTORY_MSG_610;Local - Maschera di esposizione L +HISTORY_MSG_611;Local - Maschera di colore H +HISTORY_MSG_612;Local - Struttura colore +HISTORY_MSG_613;Local - Struttura esposizione +HISTORY_MSG_614;Local - Maschera di esposizione H +HISTORY_MSG_615;Local - Miscela il colore +HISTORY_MSG_616;Local - Miscela l'esposizione +HISTORY_MSG_617;Local - Sfoca l'esposizione +HISTORY_MSG_618;Local - Usa la maschera di colore +HISTORY_MSG_619;Local - Usa la maschera di esposizione +HISTORY_MSG_620;Local - Sfocatura colore +HISTORY_MSG_621;Local - Esposizione inversa +HISTORY_MSG_622;Local - Spot - Escluso - Struttura Spot +HISTORY_MSG_623;Local - Compensazione della cromia di esposizione +HISTORY_MSG_624;Local - Griglia di correzione colore +HISTORY_MSG_625;Local - Intensità di correzione colore +HISTORY_MSG_626;Local - Metodo di correzione colore +HISTORY_MSG_627;Local - Ombre e Alteluci +HISTORY_MSG_628;Local - SH Alteluci +HISTORY_MSG_629;Local - SH Larghezza tonale alteluci +HISTORY_MSG_630;Local - SH Ombre +HISTORY_MSG_631;Local - SH Larghezza tonale Ombre +HISTORY_MSG_632;Local - SH Raggio +HISTORY_MSG_633;Local - SH Ambito +HISTORY_MSG_634;Local - Raggio colore +HISTORY_MSG_635;Local - Raggio esposizione +HISTORY_MSG_636;Local - Strumento aggiunto +HISTORY_MSG_637;Local - SH Maschera C +HISTORY_MSG_638;Local - SH Maschera L +HISTORY_MSG_639;Local - SH Maschera H +HISTORY_MSG_640;Local - SH Miscela +HISTORY_MSG_641;Local - Usa maschera alteluci +HISTORY_MSG_642;Local - Raggio alteluci +HISTORY_MSG_643;Local - Sfocatura alteluci +HISTORY_MSG_644;Local - Inverti alteluci +HISTORY_MSG_645;Local - SD - ab-L bilanciamento +HISTORY_MSG_646;Local - Maschera di cromia dell'esposizione +HISTORY_MSG_647;Local - Maschera di gamma dell'esposizione +HISTORY_MSG_648;Local - Maschera di pendenza dell'esposizione +HISTORY_MSG_649;Local - Raggio morbido dell'esposizione +HISTORY_MSG_650;Local - Maschera di cromia colore +HISTORY_MSG_651;Local - Maschera di gamma colore +HISTORY_MSG_652;Local - Maschera di pendenza colore +HISTORY_MSG_653;Local - Maschera di cromia alteluci +HISTORY_MSG_654;Local - Maschera di gamma alteluci +HISTORY_MSG_655;Local - Maschera di pendenza alteluci +HISTORY_MSG_656;Local - Raggio morbido colore +HISTORY_MSG_657;Local - Riduzione artefatti Retinex +HISTORY_MSG_658;Local - Raggio morbido CBDL +HISTORY_MSG_659;Local - TG - Decadimento transizione +HISTORY_MSG_660;Local - cbdl chiarezza +HISTORY_MSG_661;Local - cbdl contrasto residuale +HISTORY_MSG_662;Local - Eliminazione del rumore mediante luminanza f0 +HISTORY_MSG_663;Local - Eliminazione del rumore mediante luminanza f2 +HISTORY_MSG_664;--inutilizzato-- +HISTORY_MSG_665;Local - cbdl maschera miscelazione +HISTORY_MSG_666;Local - cbdl maschera raggio +HISTORY_MSG_667;Local - cbdl maschera cromia +HISTORY_MSG_668;Local - cbdl maschera gamma +HISTORY_MSG_669;Local - cbdl maschera pendenza +HISTORY_MSG_670;Local - cbdl maschera C +HISTORY_MSG_671;Local - cbdl maschera L +HISTORY_MSG_672;Local - cbdl maschera CL +HISTORY_MSG_673;Local - Usa maschera cbdl +HISTORY_MSG_674;Local - Strumenti di rimozione +HISTORY_MSG_675;Local - Raggio morbido di strumenti di rimozione +HISTORY_MSG_676;Local - TG - Differenziazione della transizione +HISTORY_MSG_677;Local - Ambito di strumenti di rimozione +HISTORY_MSG_678;Local - Saturazione con strumenti di rimozione +HISTORY_MSG_679;Local - Retinex maschera C +HISTORY_MSG_680;Local - Retinex maschera L +HISTORY_MSG_681;Local - Retinex maschera CL +HISTORY_MSG_682;Local - Retinex maschera +HISTORY_MSG_683;Local - Retinex maschera miscela +HISTORY_MSG_684;Local - Retinex maschera raggio +HISTORY_MSG_685;Local - Retinex maschera cromia +HISTORY_MSG_686;Local - Retinex maschera gamma +HISTORY_MSG_687;Local - Retinex maschera pendenza +HISTORY_MSG_688;Local - Strumenti di rimozione +HISTORY_MSG_689;Local - Retinex maschera della mappa di transmissione +HISTORY_MSG_690;Local - Retinex scala +HISTORY_MSG_691;Local - Retinex durezza +HISTORY_MSG_692;Local - Retinex luminosità +HISTORY_MSG_693;Local - Retinex intensità +HISTORY_MSG_694;Local - Retinex soglia Laplacian +HISTORY_MSG_695;Local - Metodo morbio +HISTORY_MSG_696;Local - Retinex Normalizza +HISTORY_MSG_697;Local - TM Normalizza +HISTORY_MSG_698;Local - Contrasto locale velocità di Fourier +HISTORY_MSG_699;Local - Retinex velocità di Fourier +HISTORY_MSG_701;Local - Esposizione Ombre +HISTORY_MSG_702;Local - Esposizione metodo +HISTORY_MSG_703;Local - Esposizione soglia Laplacian +HISTORY_MSG_704;Local - Bilanciamento esposizione PDE +HISTORY_MSG_705;Local - Linearità esposizione +HISTORY_MSG_706;Local - TM maschera C +HISTORY_MSG_707;Local - TM maschera L +HISTORY_MSG_708;Local - TM maschera CL +HISTORY_MSG_709;Local - Usa maschera di TM +HISTORY_MSG_710;Local - TM maschera miscela +HISTORY_MSG_711;Local - TM maschera raggio +HISTORY_MSG_712;Local - TM maschera cromia +HISTORY_MSG_713;Local - TM maschera gamma +HISTORY_MSG_714;Local - TM maschera pendenza +HISTORY_MSG_716;Local - Metodo locale +HISTORY_MSG_717;Local - Contrasto locale +HISTORY_MSG_718;Local - Livelli di contrasto locale +HISTORY_MSG_719;Local - Contrasto locale residuo L +HISTORY_MSG_720;Local - Maschera di sfocatura C +HISTORY_MSG_721;Local - Maschera di sfocatura L +HISTORY_MSG_722;Local - Maschera di sfocatura CL +HISTORY_MSG_723;Local - Usa la maschera di sfocatura +HISTORY_MSG_725;Local - Miscela la maschera di sfocatura +HISTORY_MSG_726;Local - Raggio della maschera di sfocatura +HISTORY_MSG_727;Local - Cromia della maschera di sfocatura +HISTORY_MSG_728;Local - Gamma della maschera di sfocatura +HISTORY_MSG_729;Local - Pendenza della maschera di sfocatura +HISTORY_MSG_730;Local - Metodo di sfocatura +HISTORY_MSG_731;Local - Metodo mediano +HISTORY_MSG_732;Local - Iterazioni mediane +HISTORY_MSG_733;Local - Raggio morbido +HISTORY_MSG_734;Local - Dettaglio +HISTORY_MSG_738;Local - Contrasto locale Unisci L +HISTORY_MSG_739;Local - Contrasto locale Raggio morbido +HISTORY_MSG_740;Local - Contrasto locale Unisci C +HISTORY_MSG_741;Local - Residuo di contrasto locale C +HISTORY_MSG_742;Local - Esposizione della gamma Laplacian +HISTORY_MSG_743;Local - Esposizione quantità fattale +HISTORY_MSG_744;Local - Esposizione dettaglio fattale +HISTORY_MSG_745;Local - Compensazione fattale dell'esposizione +HISTORY_MSG_746;Local - Sigma fattale dell'esposizione +HISTORY_MSG_747;Local Spot creato +HISTORY_MSG_748;Local - Esposizione di riduzione rumore +HISTORY_MSG_749;Local - Profondità Reti +HISTORY_MSG_750;Local - Modalità reti log - lin +HISTORY_MSG_751;Local - Defoschia della saturazione Reti +HISTORY_MSG_752;Local - Compensazione reti +HISTORY_MSG_753;Local - Mappa trasmissione reti +HISTORY_MSG_754;Local - Reti Clip +HISTORY_MSG_755;Local - Usa la maschera di TM +HISTORY_MSG_756;Local - Usa algoritmo della maschera di esposizione +HISTORY_MSG_757;Local - Maschera di esposizione Laplacian +HISTORY_MSG_758;Local - Maschera di reti Laplacian +HISTORY_MSG_759;Local - Maschera di esposizione Laplacian +HISTORY_MSG_760;Local - Maschera colore Laplacian +HISTORY_MSG_761;Local - Maschera Ombre Alteluci Laplacian +HISTORY_MSG_762;Local - Maschera cbdl Laplacian +HISTORY_MSG_763;Local - Maschera di sfocatura Laplacian +HISTORY_MSG_764;Local - Risolve la maschera PDE Laplacian +HISTORY_MSG_765;Local - Soglia dettaglio riduzione rumore +HISTORY_MSG_766;Local - Sfocatura veloce Fourier +HISTORY_MSG_767;Local - Grana ISO +HISTORY_MSG_768;Local - Intensità della grana +HISTORY_MSG_769;Local - Scala della grana +HISTORY_MSG_770;Local - Curva di contrasto della maschera colore +HISTORY_MSG_771;Local - Curva di contrasto della maschera dell'esposizione +HISTORY_MSG_772;Local - Curva di contrasto della maschera Ombre/Alteluci +HISTORY_MSG_773;Local - Curva di contrasto della maschera TM +HISTORY_MSG_774;Local - Curva di contrasto della maschera Reti +HISTORY_MSG_775;Local - Curva di contrasto della maschera CBDL +HISTORY_MSG_776;Local - Curva di contrasto della maschera riduzione del rumore della sfocatura +HISTORY_MSG_777;Local - Curva di contrasto della maschera sfocatura +HISTORY_MSG_778;Local - Maschera alteluci +HISTORY_MSG_779;Local - Curva di contrasto della maschera colore +HISTORY_MSG_780;Local - Ombre della maschera di colore +HISTORY_MSG_781;Local - Livello Wavelet della maschera di contrasto +HISTORY_MSG_782;Local - Livelli wavelet della maschera di riduzione del rumore della sfocatura +HISTORY_MSG_783;Local - Livelli Wavelet di colore +HISTORY_MSG_784;Local - Maschera - ΔE maschera immagine +HISTORY_MSG_785;Local - Maschera - Ambito +HISTORY_MSG_786;Local - Metodo Ombre/Alteluci +HISTORY_MSG_787;Local - Moltiplicatore dell'equalizzatore +HISTORY_MSG_788;Local - Moltiplicatore di dettaglio +HISTORY_MSG_789;Local - Maschera di quantitè ombre/alteluci +HISTORY_MSG_790;Local - ancoraggio della maschera ombre/alteluci +HISTORY_MSG_791;Local - Maschera corta di curva L +HISTORY_MSG_792;Local - Maschera - Sfondo +HISTORY_MSG_793;Local - Gamma ombre/alteluci TRC +HISTORY_MSG_794;Local - Pendenza ombre/alteluci TRC +HISTORY_MSG_795;Local - Maschera salva ripristina immagine +HISTORY_MSG_796;Local - SC - Riferimenti ricorsivi +HISTORY_MSG_797;Local - Metodo Unisci originale +HISTORY_MSG_798;Local - Opacità +HISTORY_MSG_799;Local - Curva di tono colore RGB +HISTORY_MSG_800;Local - Metodo curva di tono colore +HISTORY_MSG_801;Local - Speciale curva toni colore +HISTORY_MSG_802;Local - Soglia di contrasto +HISTORY_MSG_803;Local - Fusione colori +HISTORY_MSG_804;Local - Struttura maschera colore +HISTORY_MSG_805;Local - Struttura maschera riduzione di rumore della sfocatura +HISTORY_MSG_806;Local - Struttura maschera colore come strumento +HISTORY_MSG_807;Local - Struttura maschera colore come strumento di sfocatura +HISTORY_MSG_808;Local - Curva H(H) della maschera di colore +HISTORY_MSG_809;Local - Curva C(C) della maschera di vibranza +HISTORY_MSG_810;Local - Curva L(L) della maschera di vibranza +HISTORY_MSG_811;Local - Curva LC(H) della maschera di vibranza +HISTORY_MSG_813;Local - Usa la maschera di vibranza +HISTORY_MSG_814;Local - Miscela la maschera di vibranza +HISTORY_MSG_815;Local - Raggio della maschera di vibranza +HISTORY_MSG_816;Local - Cromia della maschera di vibranza +HISTORY_MSG_817;Local - Gamma della maschera di vibranza +HISTORY_MSG_818;Local - Pendenza della maschera di vibranza +HISTORY_MSG_819;Local - Laplacian della maschera di vibranza +HISTORY_MSG_820;Local - Curva di contrasto della maschera di vibranza +HISTORY_MSG_821;Local - sfondo della griglia di colore +HISTORY_MSG_822;Local - unione dello sfondo a colori +HISTORY_MSG_823;Local - luminanza dello sfondo colorato +HISTORY_MSG_824;Local - Intensità della maschera del gradiente dell'esposizione +HISTORY_MSG_825;Local - Angolo della maschera del gradiente di esposizione +HISTORY_MSG_826;Local - Intensità del gradiente dell'esposizione +HISTORY_MSG_827;Local - Angolo di gradiente dell'esposizione +HISTORY_MSG_828;Local - Intensità di gradiente delle ombre/alteluci +HISTORY_MSG_829;Local - Angolo di gradiente delle ombre/alteluci +HISTORY_MSG_830;Local - Intensità del gradiente di colore L +HISTORY_MSG_831;Local - Angolo del gradiente di colore +HISTORY_MSG_832;Local - Intensità del gradiente di coloreh C +HISTORY_MSG_833;Local - TG - Gradiente di piume +HISTORY_MSG_834;Local - Intensità del gradiente di colore H +HISTORY_MSG_835;Local - Intensità del gradiente di vibranza L +HISTORY_MSG_836;Local - Angolo del gradiente di vibranza +HISTORY_MSG_837;Local - Intensità del gradiente di vibranza C +HISTORY_MSG_838;Local - Intensità del gradiente di vibranzah H +HISTORY_MSG_839;Local - Complessità del software +HISTORY_MSG_840;Local - Curva CL +HISTORY_MSG_841;Local - Curva LC +HISTORY_MSG_842;Local - Raggio della maschera di sfocatura +HISTORY_MSG_843;Local - Soglia di contrasto della maschera di sfocatura +HISTORY_MSG_844;Local - Maschera di sfocatura FFTW +HISTORY_MSG_845;Local - Log codifica +HISTORY_MSG_846;Local - Log codifica automatica +HISTORY_MSG_847;Local - Log codifica origine +HISTORY_MSG_849;Local - Log codifica origine automatica +HISTORY_MSG_850;Local - Log codifica B_Ev +HISTORY_MSG_851;Local - Log codifica W_Ev +HISTORY_MSG_852;Local - Log codifica bersaglio +HISTORY_MSG_853;Local - Log codifica contrasto locale +HISTORY_MSG_854;Local - Log ambito di codifica +HISTORY_MSG_855;Local - Log codifica immagine intera +HISTORY_MSG_856;Local - Log codifica gamma di ombre +HISTORY_MSG_857;Local - Residuo di sfocatura Wavelet +HISTORY_MSG_858;Local - Solo luminanza con sfocatura wavelet +HISTORY_MSG_859;Local - Sfocatura massima wavelet +HISTORY_MSG_860;Local - Livelli di sfocatura wavelet +HISTORY_MSG_861;Local - Livelli di contrasto wavelet +HISTORY_MSG_862;Local - Attenuazione del contrasto wavelet +HISTORY_MSG_863;Local - Wavelet unisce l'immagine originale +HISTORY_MSG_864;Local - Attenuazione del contrasto wavelet +HISTORY_MSG_865;Local - Wavelet di contrasto delta +HISTORY_MSG_866;Local - Compressione delle wavelet +HISTORY_MSG_868;Local - SD - C-H bilanciamento +HISTORY_MSG_869;Local - Riduzione rumore per livello +HISTORY_MSG_870;Local - Curva H della maschera wavelet +HISTORY_MSG_871;Local - Curva C della maschera wavelet +HISTORY_MSG_872;Local - Curva L della maschera wavelet +HISTORY_MSG_873;Local - Maschera wavelet +HISTORY_MSG_875;Local - Miscela di maschere Wavelet +HISTORY_MSG_876;Local - Maschera Wavelet liscia +HISTORY_MSG_877;Local - Crominanza della maschera Wavelet +HISTORY_MSG_878;Local - Curva di contrasto della maschera wavelet +HISTORY_MSG_879;Local - Crominanza a contrasto wavelet +HISTORY_MSG_880;Local - Crominanza di sfocatura wavelet +HISTORY_MSG_881;Local - Offset del contrasto wavelet +HISTORY_MSG_882;Local - Sfocatura wavelet +HISTORY_MSG_883;Local - Contrasto wavelet per livello +HISTORY_MSG_884;Local - Wavelet di contrasto +HISTORY_MSG_885;Local - Mappatura dei toni wavelet +HISTORY_MSG_886;Local - Compressione della mappatura dei toni wavelet +HISTORY_MSG_887;Local - Residuo di compressione della mappatura dei toni wavelet +HISTORY_MSG_888;Local - Soglia di bilanciamento di contrasto wavelet +HISTORY_MSG_889;Local - Intensità graduata dell'onda di contrasto +HISTORY_MSG_890;Local - Contrasto Wavelet Angolo graduato +HISTORY_MSG_891;Local - Contrasto Wavelet graduato +HISTORY_MSG_892;Local - Codifica log della intensità graduata +HISTORY_MSG_893;Local - Codifica log Angolo graduato +HISTORY_MSG_894;Local - SD - ΔE visualizzare in anteprima l'intensità del colore +HISTORY_MSG_897;Local - Intensità del contrasto Wavelet ES +HISTORY_MSG_898;Local - Contrasto raggio Wavelet ES +HISTORY_MSG_899;Local - Dettaglio Wavelet ES a contrasto +HISTORY_MSG_900;Local - Contrasto gradiente Wavelet ES +HISTORY_MSG_901;Local - Soglia di contrasto Wavelet ES bassa +HISTORY_MSG_902;Local - Soglia di contrasto Wavelet ES alta +HISTORY_MSG_903;Local - Contrasto locale Wavelet ES +HISTORY_MSG_904;Local - Contrasto Wavelet ES primo livello +HISTORY_MSG_905;Local - Contrasto Nitidezza bordo Wavelet +HISTORY_MSG_906;Local - Sensibilità del contrasto Wavelet ES +HISTORY_MSG_907;Local - Amplificazione Wavelet ES a contrasto +HISTORY_MSG_908;Local - Contrasto Wavelet ES adiacente +HISTORY_MSG_909;Local - Visualizzazione Wavelet ES di contrasto +HISTORY_MSG_910;Local - SC - Prestazioni di Wavelet ai bordi +HISTORY_MSG_911;Local - Sfocatura Crominanza Luminanza +HISTORY_MSG_912;Local - Intensità del filtro guida sfocatura +HISTORY_MSG_913;Local - Contrasto Wavelet Sigma DR +HISTORY_MSG_914;Local - Sfocatura Wavelet Sigma BL +HISTORY_MSG_915;Local - Bordi Wavelet Sigma ED +HISTORY_MSG_916;Local - Ombre wavelet residue +HISTORY_MSG_917;Local - Soglia delle ombre wavelet residue +HISTORY_MSG_918;Local - Alteluci wavelet residue +HISTORY_MSG_919;Local - Soglia delle alteluci wavelet residue +HISTORY_MSG_920;Local - Wavelet sigma LC +HISTORY_MSG_921;Local - Wavelet graduato sigma LC2 +HISTORY_MSG_922;Local - SC - Cambia in B/W +HISTORY_MSG_923;Local - Modalità di complessità dello strumento +HISTORY_MSG_924;--inutilizzato-- +HISTORY_MSG_925;Local - Ambito (strumenti colore) +HISTORY_MSG_926;Local - Mostra il tipo di maschera +HISTORY_MSG_927;Local - Ombre +HISTORY_MSG_928;Local - Maschera di colore comune +HISTORY_MSG_929;Local - Maschera l'ambito comune +HISTORY_MSG_930;Local - Maschera di fusione luminanza comune +HISTORY_MSG_931;Local - Abilitazione maschera comune +HISTORY_MSG_932;Local - Raggio morbido di maschera comune +HISTORY_MSG_933;Local - Maschera comune di laplacian +HISTORY_MSG_934;Local - Maschera comune di crominanza +HISTORY_MSG_935;Local - Maschera comune di gamma +HISTORY_MSG_936;Local - Maschera comune di pendenza +HISTORY_MSG_937;Local - Maschera comune di curva C(C) +HISTORY_MSG_938;Local - Maschera comune di curva L(L) +HISTORY_MSG_939;Local - Maschera comune di curva LC(H) +HISTORY_MSG_940;Local - Maschera comune della struttura dello strumento +HISTORY_MSG_941;Local - Maschera Resistenza strutturale comune +HISTORY_MSG_942;Local - Maschera comune di curva H(H) +HISTORY_MSG_943;Local - Maschera comune FFT +HISTORY_MSG_944;Local - Raggio di sfocatura maschera comune +HISTORY_MSG_945;Local - Soglia di contrasto maschera comune +HISTORY_MSG_946;Local - Maschera comune di ombre +HISTORY_MSG_947;Local - Curva di contrasto maschera comune +HISTORY_MSG_948;Local - Maschera curva Wavelet comune +HISTORY_MSG_949;Local - Maschera i livelli di soglia comuni +HISTORY_MSG_950;Local - Maschera comune di intensità GF +HISTORY_MSG_951;Local - Maschera comune di angolo GF +HISTORY_MSG_952;Local - Raggio morbido di maschera comune +HISTORY_MSG_953;Local - Maschera crominanza di fusione comune +HISTORY_MSG_954;Local - Strumenti mostra-nascondi +HISTORY_MSG_955;Local - Abilita Spot +HISTORY_MSG_956;Local - Curva CH +HISTORY_MSG_957;Local - Modo di riduzione rumore +HISTORY_MSG_958;Local - Mostra/nascondi le impostazioni +HISTORY_MSG_959;Local - Sfocatura inversa +HISTORY_MSG_960;Local - Log codifica - cat16 +HISTORY_MSG_961;Local - Log codifica Ciecam +HISTORY_MSG_962;Local - Log codifica sorgente di luminanza assoluta +HISTORY_MSG_963;Local - Log codifica bersaglio di luminanza assoluta +HISTORY_MSG_964;Local - Log codifica contorni +HISTORY_MSG_965;Local - Log codifica saturazione s +HISTORY_MSG_966;Local - Log codifica contrasto J +HISTORY_MSG_967;Local - Log codifica maschera di curva C +HISTORY_MSG_968;Local - Log codifica maschera di curva L +HISTORY_MSG_969;Local - Log codifica maschera di curva H +HISTORY_MSG_970;Local - Log codifica abilita maschera +HISTORY_MSG_971;Local - Log codifica miscela maschera +HISTORY_MSG_972;Local - Log codifica raggio maschera +HISTORY_MSG_973;Local - Log codifica maschera di crominanza +HISTORY_MSG_974;Local - Log codifica maschera di contrasto +HISTORY_MSG_975;Local - Log codifica luminosità J +HISTORY_MSG_977;Local - Log codifica contrasto Q +HISTORY_MSG_978;Local - Log codifica sorgente +HISTORY_MSG_979;Local - Log codifica luminosità Q +HISTORY_MSG_980;Local - Log codifica Colorazione M +HISTORY_MSG_981;Local - Log codifica intensità +HISTORY_MSG_982;Local - Tonalità dell'equalizzatore +HISTORY_MSG_983;Local - maschera con soglia di riduzione del rumore alta +HISTORY_MSG_984;Local - maschera con soglia di riduzione del rumore bassa +HISTORY_MSG_985;Local - riduzione del rumore Laplacian +HISTORY_MSG_986;Local - rinforzo riduzione del rumore +HISTORY_MSG_987;Local - GF soglia di recupero +HISTORY_MSG_988;Local - GF maschera soglia bassa +HISTORY_MSG_989;Local - GF maschera soglia alta +HISTORY_MSG_990;Local - Soglia di ripristino del rumore +HISTORY_MSG_991;Local - Maschera soglia rumore bassa +HISTORY_MSG_992;Local - Maschera soglia rumore alta +HISTORY_MSG_993;Local - Algoritmo inverso riduzione rumore +HISTORY_MSG_994;Local - GF algoritmo inverso +HISTORY_MSG_995;Local - Decadimento del rumore +HISTORY_MSG_996;Local - Soglia di recupero colore +HISTORY_MSG_997;Local - Maschera soglia colore bassa +HISTORY_MSG_998;Local - Maschera soglia colore alta +HISTORY_MSG_999;Local - Decadimento colore +HISTORY_MSG_1000;Local - Riduzione rumore del grigio di luminanza +HISTORY_MSG_1001;Local - Soglia di recupero logaritmico +HISTORY_MSG_1002;Local - Maschera soglia registro bassa +HISTORY_MSG_1003;Local - Maschera soglia registro alta +HISTORY_MSG_1004;Local - Decadimento logaritmico +HISTORY_MSG_1005;Local - Soglia di recupero esposizione +HISTORY_MSG_1006;Local - Maschera soglia esposizione bassa +HISTORY_MSG_1007;Local - Maschera soglia esposizione alta +HISTORY_MSG_1008;Local - Decadimento esposizione +HISTORY_MSG_1009;Local - Soglia di recupero ombre/alteluci +HISTORY_MSG_1010;Local - Maschera soglia ombre/alteluci bassa +HISTORY_MSG_1011;Local - Maschera soglia ombre/alteluci alta +HISTORY_MSG_1012;Local - Decadimento ombre/alteluci +HISTORY_MSG_1013;Local - Soglia di recupero vibranza +HISTORY_MSG_1014;Local - Maschera soglia vibranza bassa +HISTORY_MSG_1015;Local - Maschera soglia vibranza alta +HISTORY_MSG_1016;Local - Decadimento vibranza +HISTORY_MSG_1017;Local - Soglia di recupero lc +HISTORY_MSG_1018;Local - Maschera soglia lc bassa +HISTORY_MSG_1019;Local - Maschera soglia lc alta +HISTORY_MSG_1020;Local - Decadimento lc +HISTORY_MSG_1021;Local - Riduzione rumore del grigio di crominanza +HISTORY_MSG_1022;Local - Soglia di recupero TM +HISTORY_MSG_1023;Local - Maschera soglia TM bassa +HISTORY_MSG_1024;Local - Maschera soglia TM alta +HISTORY_MSG_1025;Local - Decadimento TM +HISTORY_MSG_1026;Local - Soglia di recupero cbdl +HISTORY_MSG_1027;Local - Maschera soglia cbdl bassa +HISTORY_MSG_1028;Local - Maschera soglia cbdl alta +HISTORY_MSG_1029;Local - Decadimento cbdl +HISTORY_MSG_1030;Local - Soglia di recupero reti +HISTORY_MSG_1031;Local - Maschera soglia reti bassa +HISTORY_MSG_1032;Local - Maschera soglia reti alta +HISTORY_MSG_1033;Local - Decadimento reti +HISTORY_MSG_1034;Local - Nlmeans - intensità +HISTORY_MSG_1035;Local - Nlmeans - dettaglio +HISTORY_MSG_1036;Local - Nlmeans - percorso +HISTORY_MSG_1037;Local - Nlmeans - raggio +HISTORY_MSG_1038;Local - Nlmeans - gamma +HISTORY_MSG_1039;Local - Grana - gamma +HISTORY_MSG_1040;Local - SC - Raggio morbido +HISTORY_MSG_1041;Local - Spot - Munsell +HISTORY_MSG_1042;Local - Decodifica logaritmica - soglia +HISTORY_MSG_1043;Local - Esposizione - normalizza +HISTORY_MSG_1044;Local - Intensità di contrasto locale +HISTORY_MSG_1045;Local - Intensità colore e luci +HISTORY_MSG_1046;Local - Intensità riduzione rumore +HISTORY_MSG_1047;Local - Intensità Ombre/Alteluci e equalizzatore toni +HISTORY_MSG_1048;Local - Intensità DR e esposizione +HISTORY_MSG_1049;Local - Intensità TM +HISTORY_MSG_1050;Local - Decodifica logaritmica crominanza +HISTORY_MSG_1051;Local - Gamma residuale wavelet +HISTORY_MSG_1052;Local - Pendenza residuale wavelet +HISTORY_MSG_1053;Local - Gamma riduzione rumore +HISTORY_MSG_1054;Local - Gamma Wavelet +HISTORY_MSG_1055;Local - Gamma colore e luci +HISTORY_MSG_1056;Local - Gamma DR e esposizione +HISTORY_MSG_1057;Local - Abilita CIECAM +HISTORY_MSG_1058;Local - Forza complessiva CIECAM +HISTORY_MSG_1059;Local - Grigio automatico CIECAM +HISTORY_MSG_1060;Local - Sorgente di luminanza media CIECAM +HISTORY_MSG_1061;Local - Fonte assoluta CIECAM +HISTORY_MSG_1062;Local - Sorgente circostante CIECAM +HISTORY_MSG_1063;Local - Saturazione CIECAM +HISTORY_MSG_1064;Local - Crominanza CIECAM +HISTORY_MSG_1065;Local - Luminosità J CIECAM +HISTORY_MSG_1066;Local - Luminosità CIECAM +HISTORY_MSG_1067;Local - Contrasto J CIECAM +HISTORY_MSG_1068;Local - Soglia CIECAM +HISTORY_MSG_1069;Local - Contrasto Q CIECAM +HISTORY_MSG_1070;Local - Colorazione CIECAM +HISTORY_MSG_1071;Local - Luminanza assoluta CIECAM +HISTORY_MSG_1072;Local - Luminanza media CIECAM +HISTORY_MSG_1073;Local - Cat16 CIECAM +HISTORY_MSG_1074;Local - Contrasto locale CIECAM +HISTORY_MSG_1075;Local - Visualizzazione circostante CIECAM +HISTORY_MSG_1076;Local - Ambito CIECAM +HISTORY_MSG_1077;Local - Modo CIECAM +HISTORY_MSG_1078;Local - Protezione del rosso e della pelle +HISTORY_MSG_1079;Local - Forza del sigmoide J CIECAM +HISTORY_MSG_1080;Local - Soglia del sigmoide CIECAM +HISTORY_MSG_1081;Local - Miscela sigmoidea CIECAM +HISTORY_MSG_1082;Local - Sigmoide Q di compensazione esposizione dei neri e compensazione esposizione dei bianchi CIECAM +HISTORY_MSG_1083;Local - Tonalità CIECAM +HISTORY_MSG_1084;Local - Usa la compensazione esposizione dei neri e la compensazione esposizione dei bianchi +HISTORY_MSG_1085;Local - Luminosità Jz +HISTORY_MSG_1086;Local - Contrasto Jz +HISTORY_MSG_1087;Local - Crominanza Jz +HISTORY_MSG_1088;Local - Tonalità Jz +HISTORY_MSG_1089;Local - Forza del sigmoide Jz +HISTORY_MSG_1090;Local - Soglia del sigmoide Jz +HISTORY_MSG_1091;Local - Miscela sigmoidea Jz +HISTORY_MSG_1092;Local - Adattamento Jz +HISTORY_MSG_1093;Local - modello CAM +HISTORY_MSG_1094;Local - Alteluci Jz +HISTORY_MSG_1095;Local - Soglia alteluci Jz +HISTORY_MSG_1096;Local - Ombre Jz +HISTORY_MSG_1097;Local - Soglia ombre Jz +HISTORY_MSG_1098;Local - Raggio Ombre/Alteluci Jz +HISTORY_MSG_1099;Local - Curva Cz(Hz) +HISTORY_MSG_1100;Local - Referenza 100 Jz +HISTORY_MSG_1101;Local - Jz PQ rimappa +HISTORY_MSG_1102;Local - Curva Jz(Hz) +HISTORY_MSG_1103;Local - Gamma di vibranza +HISTORY_MSG_1104;Local - Gamma netta +HISTORY_MSG_1105;Local - Metodo tono CIECAM +HISTORY_MSG_1106;Local - Curva di tono CIECAM +HISTORY_MSG_1107;Local - Metodo colore CIECAM +HISTORY_MSG_1108;Local - Curva colore CIECAM +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 - Forzatura Jz +HISTORY_MSG_1113;Local - HDR PQ +HISTORY_MSG_1114;Local - Abilta maschera Cie +HISTORY_MSG_1115;Local - Maschera curva C Cie +HISTORY_MSG_1116;Local - Maschera curva L Cie +HISTORY_MSG_1117;Local - Maschera curva H Cie +HISTORY_MSG_1118;Local - Miscela maschera Cie +HISTORY_MSG_1119;Local - Maschera raggio Cie +HISTORY_MSG_1120;Local - Maschera di crominanza Cie +HISTORY_MSG_1121;Local - Maschera curva di contrasto Cie +HISTORY_MSG_1122;Local - Soglia di ripristino della maschera Cie +HISTORY_MSG_1123;Local - Maschera recupero duro Cie +HISTORY_MSG_1124;Local - Luce di recupero della maschera Cie +HISTORY_MSG_1125;Local - Decadimento del recupero della maschera Cie +HISTORY_MSG_1126;Local - Maschera laplacian Cie +HISTORY_MSG_1127;Local - Maschera di gamma Cie +HISTORY_MSG_1128;Local - Maschera di pendenza Cie +HISTORY_MSG_1129;Local - Luminanza relativa Cie +HISTORY_MSG_1130;Local - Saturazione Jz Cie +HISTORY_MSG_1131;Local - Maschera - Riduzione rumore +HISTORY_MSG_1132;Local - Wav sigma Jz Cie +HISTORY_MSG_1133;Local - Livello di Wav Jz Cie +HISTORY_MSG_1134;Local - Wav di contrasto locale Jz Cie +HISTORY_MSG_1135;Local - Wav di chiarezza Jz Cie +HISTORY_MSG_1136;Local - Wav di chiarezza Cz Cie +HISTORY_MSG_1137;Local - Wav di chiarezza morbida Cie +HISTORY_MSG_1138;Local - Local - Curva Hz(Hz) +HISTORY_MSG_1139;Local - Curva H morbida Jz +HISTORY_MSG_1140;Local - Soglia di crominanza Jz +HISTORY_MSG_1141;Local - Curva di chominanza Jz(Hz) +HISTORY_MSG_1142;Local - Intensità morbida +HISTORY_MSG_1143;Local - compensazione esposizione dei neri Jz +HISTORY_MSG_1144;Local - compensazione esposizione dei bianchi Jz +HISTORY_MSG_1145;Local - Decodifica logaritmica Jz +HISTORY_MSG_1146;Local - Decodifica logaritmica del grigio puntuale Jz +HISTORY_MSG_1147;Local - Compensazione esposizione dei neri e compensazione esposizione dei bianchi Jz +HISTORY_MSG_1148;Local - Sigmoide Jz +HISTORY_MSG_1149;Local - Sigmoide Q +HISTORY_MSG_1150;Local - Decodifica logaritmica Q invece del Sigmoideo Q +HISTORY_MSG_BLSHAPE;Sfocatura per livello +HISTORY_MSG_BLURCWAV;Sfocatura cromatica +HISTORY_MSG_BLURWAV;Luminanza sfocata +HISTORY_MSG_BLUWAV;Risposta di attenuazione +HISTORY_MSG_CATCAT;CAL - Impostazioni - Modalità +HISTORY_MSG_CATCOMPLEX;CAL - Impostazioni - Complessità +HISTORY_MSG_CATMODEL;CAL - Impostazioni - CAM +HISTORY_MSG_CLAMPOOG;Ritaglia i colori fuori gamma +HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Correzione del colore +HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Correzione del colore +HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Canale +HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - maschera della regione C +HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - maschra H +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Luminosità +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - Maschera L +HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - Lista +HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - sfocatura della maschera della regione +HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - compensazione della regione +HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - potenza della regione +HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturazione +HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - la regione mostra la maschera +HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - pendenza della regione +HISTORY_MSG_COMPLEX;Complessità delle wavelet +HISTORY_MSG_COMPLEXRETI;Complessità del Retinex +HISTORY_MSG_DEHAZE_DEPTH;Rimozione foschia - Profondità +HISTORY_MSG_DEHAZE_ENABLED;Rimozione della foschia +HISTORY_MSG_DEHAZE_SATURATION;Rimozione foschia - Saturazione +HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Rimozione foschia - mostra la mappa di profondità +HISTORY_MSG_DEHAZE_STRENGTH;Rimozione foschia - Intensità +HISTORY_MSG_DIRPYRDENOISE_GAIN;Riduzione del rumore - Compensazione per leggerezza +HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Doppia demosaicizzazione - Soglia automatica +HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Doppia demosaicizzazione - Soglia di contrasto +HISTORY_MSG_EDGEFFECT;Risposta di attenuazione del bordo +HISTORY_MSG_FF_FROMMETADATA;Flat-Field - Dai metadati +HISTORY_MSG_FILMNEGATIVE_BALANCE;FN - Uscita di riferimento +HISTORY_MSG_FILMNEGATIVE_COLORSPACE;Spazio colore negativo della pellicola +HISTORY_MSG_FILMNEGATIVE_ENABLED;Negativo della pellicola +HISTORY_MSG_FILMNEGATIVE_REF_SPOT;FN - Ingresso di riferimento +HISTORY_MSG_FILMNEGATIVE_VALUES;Valori negativi della pellicola +HISTORY_MSG_GAMUTMUNSEL;Gamma-Munsell +HISTORY_MSG_HISTMATCHING;Curva di tono con abbinamento automatico +HISTORY_MSG_HLBL;Propagazione colore - sfocatura +HISTORY_MSG_HLTH;Inpaint opposto - soglia di guadagno +HISTORY_MSG_ICL_LABGRIDCIEXY;Cie xy +HISTORY_MSG_ICM_AINTENT;Intento del profilo astratto +HISTORY_MSG_ICM_BLUX;Blu X primario +HISTORY_MSG_ICM_BLUY;Blu Y primario +HISTORY_MSG_ICM_FBW;Bianco e Nero +HISTORY_MSG_ICM_GAMUT;Controllo di Gamma +HISTORY_MSG_ICM_GREX;Verde X primario +HISTORY_MSG_ICM_GREY;Verde Y primario +HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Uscita - Primari +HISTORY_MSG_ICM_OUTPUT_TEMP;Uscita - ICC-v4 illuminante D +HISTORY_MSG_ICM_OUTPUT_TYPE;Uscita - Tipo +HISTORY_MSG_ICM_PRESER;Conservare il neutro +HISTORY_MSG_ICM_REDX;Rosso X primario +HISTORY_MSG_ICM_REDY;Rosso Y primario +HISTORY_MSG_ICM_WORKING_GAMMA;TRC - Gamma +HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Metodo illuminante +HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Metodo delle primarie +HISTORY_MSG_ICM_WORKING_SLOPE;TRC - Pendenza +HISTORY_MSG_ICM_WORKING_TRC_METHOD;Metodo TRC +HISTORY_MSG_ILLUM;CAL - SC - Illuminante +HISTORY_MSG_LOCALCONTRAST_AMOUNT;Contrasto Locale - Quantità +HISTORY_MSG_LOCALCONTRAST_DARKNESS;Contrasto Locale - Durezza +HISTORY_MSG_LOCALCONTRAST_ENABLED;Contrasto Locale +HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Contrasto Locale - Luminosità +HISTORY_MSG_LOCALCONTRAST_RADIUS;Contrasto Locale - Raggio +HISTORY_MSG_LOCALLAB_TE_PIVOT;Locale - Perno dell'equalizzatore +HISTORY_MSG_LOCAL_DEHAZE_BLACK;Local - Riduzione Foschia - Nero +HISTORY_MSG_LOCAL_GAMUTMUNSEL;Locale - SC - Evita il cambiamento di colore +HISTORY_MSG_LOCAL_TMO_SATUR;Local Saturazione Fattale dell'esposizione +HISTORY_MSG_METADATA_MODE;Modalità di copia dei metadati +HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrasto - Soglia di contrasto +HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Soglia automatica +HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Raggio automatico +HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Iterazioni di limite automatico +HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Soglia di contrasto +HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterazione +HISTORY_MSG_PDSHARPEN_RADIUS;CS - Raggio +HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Aumento del raggio d'angolo +HISTORY_MSG_PERSP_CAM_ANGLE;Prospettiva - Camera +HISTORY_MSG_PERSP_CAM_FL;Prospettiva - Camera +HISTORY_MSG_PERSP_CAM_SHIFT;Prospettiva - Camera +HISTORY_MSG_PERSP_CTRL_LINE;Prospettiva - Linee di controllo +HISTORY_MSG_PERSP_METHOD;Prospettiva - Metodo +HISTORY_MSG_PERSP_PROJ_ANGLE;Prospettiva - Recupero +HISTORY_MSG_PERSP_PROJ_ROTATE;Prospettiva - PCA rotazione +HISTORY_MSG_PERSP_PROJ_SHIFT;Prospettiva - PCA +HISTORY_MSG_PIXELSHIFT_AVERAGE;PS - Media +HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Metodo demosaico per il movimento +HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Direzione del filtro del rumore di linea +HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF filtro delle linee +HISTORY_MSG_PREPROCWB_MODE;Preelabora la modalità WB +HISTORY_MSG_PROTAB;Protezione +HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Soglia di contrasto +HISTORY_MSG_RANGEAB;Allineare ab +HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correzione - Iterazione +HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correzione - Evita il cambiamento di colore +HISTORY_MSG_RAW_BORDER;Raw confine +HISTORY_MSG_RESIZE_ALLOWUPSCALING;Ridimensiona - Consente l'ingrandimento +HISTORY_MSG_RESIZE_LONGEDGE;Ridimensiona - Bordo lungo +HISTORY_MSG_RESIZE_SHORTEDGE;Ridimensiona - Bordo corto +HISTORY_MSG_SHARPENING_BLUR;Nitidezza - Raggio di sfocatura +HISTORY_MSG_SHARPENING_CONTRAST;Nitidezza - Soglia di contrasto +HISTORY_MSG_SH_COLORSPACE;S/H - Spazio colore +HISTORY_MSG_SIGMACOL;Risposta all'attenuazione cromatica +HISTORY_MSG_SIGMADIR;Risposta di attenuazione Dir +HISTORY_MSG_SIGMAFIN;Risposta di attenuazione del contrasto finale +HISTORY_MSG_SIGMATON;Risposta all'attenuazione toni +HISTORY_MSG_SOFTLIGHT_ENABLED;Luce soffusa +HISTORY_MSG_SOFTLIGHT_STRENGTH;Luce soffusa - Intensità +HISTORY_MSG_SPOT;Rimozione delle macchie +HISTORY_MSG_SPOT_ENTRY;Rimozione delle macchie - modifica punto +HISTORY_MSG_TEMPOUT;CAM02 temperature automatica +HISTORY_MSG_THRESWAV;Soglia bilanciamento +HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Ancora +HISTORY_MSG_TONE_EQUALIZER_BANDS;Equalizzatore di tono - Bande +HISTORY_MSG_TONE_EQUALIZER_ENABLED;Equalizzatore di tono +HISTORY_MSG_TONE_EQUALIZER_PIVOT;Equalizzatore di tono - Perno +HISTORY_MSG_TONE_EQUALIZER_REGULARIZATION;Equalizzatore di tono - Regolarizzazione +HISTORY_MSG_TONE_EQUALIZER_SHOW_COLOR_MAP;Equalizzatore di tono - Mappa tonale +HISTORY_MSG_TRANS_METHOD;Geometria - Metodo +HISTORY_MSG_WAVBALCHROM;Equalizzatore di crominanza +HISTORY_MSG_WAVBALLUM;Equalizzatore di luminanza +HISTORY_MSG_WAVBL;Livelli di sfocatura +HISTORY_MSG_WAVCHR;Livelli di sfocatura - sfocatura cromatica +HISTORY_MSG_WAVCHROMCO;Croma grossolana +HISTORY_MSG_WAVCHROMFI;Croma fine +HISTORY_MSG_WAVCLARI;Chiarezza +HISTORY_MSG_WAVDENLH;Livello 5 +HISTORY_MSG_WAVDENOISE;Contrasto locale +HISTORY_MSG_WAVDENOISEH;Livelli elevati Contrasto locale +HISTORY_MSG_WAVDETEND;Dettagli morbidi +HISTORY_MSG_WAVEDGS;Arresto del bordo +HISTORY_MSG_WAVGUIDH;Equalizzatore locale di contrasto-tonalità +HISTORY_MSG_WAVHUE;Equalizzatore di tonalità +HISTORY_MSG_WAVLABGRID_VALUE;Tonalità - Esclude i colori +HISTORY_MSG_WAVLEVDEN;Contrasto locale di alto livello +HISTORY_MSG_WAVLEVELSIGM;Riduzione rumore - Raggio +HISTORY_MSG_WAVLEVSIGM;Raggio +HISTORY_MSG_WAVLIMDEN;Interazione 56 14 +HISTORY_MSG_WAVLOWTHR;Soglia di basso contrasto +HISTORY_MSG_WAVMERGEC;Unire C +HISTORY_MSG_WAVMERGEL;Unire L +HISTORY_MSG_WAVMIXMET;Contrasto locale di riferimento +HISTORY_MSG_WAVOFFSET;Compensare +HISTORY_MSG_WAVOLDSH;Vecchio algoritmo +HISTORY_MSG_WAVQUAMET;Modo riduzione rumore +HISTORY_MSG_WAVRADIUS;Raggio ombre-alteluci +HISTORY_MSG_WAVSCALE;Scala +HISTORY_MSG_WAVSHOWMASK;Mostra maschera di wavelet +HISTORY_MSG_WAVSIGM;Sigma +HISTORY_MSG_WAVSIGMA;Risposta di attenuazione +HISTORY_MSG_WAVSLIMET;Metodo +HISTORY_MSG_WAVSOFTRAD;Raggio morbido di chiarezza +HISTORY_MSG_WAVSOFTRADEND;Raggio morbido finale +HISTORY_MSG_WAVSTREND;Intensità morbida +HISTORY_MSG_WAVTHRDEN;Soglia di contrasto locale +HISTORY_MSG_WAVTHREND;Soglia di contrasto locale +HISTORY_MSG_WAVUSHAMET;Metodo chiarezza +HISTORY_MSG_WBALANCE_OBSERVER10;Osservatore 10° +HISTORY_MSG_WBITC_CUSTOM;Itcwb personalizzato +HISTORY_MSG_WBITC_DELTA;Itcwb Verde delta +HISTORY_MSG_WBITC_FGREEN;Itcwb Verde - Studente +HISTORY_MSG_WBITC_FORCE;Itcwb Forza +HISTORY_MSG_WBITC_GREEN;Raffina il verde +HISTORY_MSG_WBITC_MINSIZE;Dimensione minima della toppa +HISTORY_MSG_WBITC_NOPURPLE;Itcwb No Porpora +HISTORY_MSG_WBITC_OBS;Rimuovere l'algoritmo 2 passaggi +HISTORY_MSG_WBITC_PONDER;Itcwb Ponderata +HISTORY_MSG_WBITC_PRECIS;Itcwb Precisione +HISTORY_MSG_WBITC_PRIM;Primari +HISTORY_MSG_WBITC_RGREEN;Itcwb Intervalli del verde +HISTORY_MSG_WBITC_SAMPLING;Campionamento basso +HISTORY_MSG_WBITC_SIZE;Itcwb Dimensione +HISTORY_MSG_WBITC_SORTED;Itcwb Ponderata +HISTORY_MSG_WBITC_THRES;Itcwb Soglia HISTORY_NEWSNAPSHOT;Aggiungi HISTORY_NEWSNAPSHOT_TOOLTIP;Scorciatoia: Alt-s HISTORY_SNAPSHOT;Istantanea HISTORY_SNAPSHOTS;Istantanee +ICCPROFCREATOR_COPYRIGHT;Copyright: +ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Ripristina il copyright predefinito, concesso a "RawTherapee, CC0". +ICCPROFCREATOR_CUSTOM;Predefinito +ICCPROFCREATOR_DESCRIPTION;Descrizione: +ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Aggiungi i valori gamma e pendenza alla descrizione +ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Lascia vuoto per impostare la descrizione predefinita. +ICCPROFCREATOR_GAMMA;Gamma +ICCPROFCREATOR_ICCVERSION;ICC versione: +ICCPROFCREATOR_ILL;Illuminante: +ICCPROFCREATOR_ILL_41;D41 +ICCPROFCREATOR_ILL_50;D50 +ICCPROFCREATOR_ILL_55;D55 +ICCPROFCREATOR_ILL_60;D60 +ICCPROFCREATOR_ILL_63;D63 : DCI-P3 Teatro +ICCPROFCREATOR_ILL_65;D65 +ICCPROFCREATOR_ILL_80;D80 +ICCPROFCREATOR_ILL_DEF;Default +ICCPROFCREATOR_ILL_INC;StdA 2856K +ICCPROFCREATOR_ILL_TOOLTIP;È possibile impostare l'illuminante per i profili ICC v4 e anche per i profili ICC v2. +ICCPROFCREATOR_PRIMARIES;Primarie: +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;Blu X +ICCPROFCREATOR_PRIM_BLUY;Blu 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;Rosso X +ICCPROFCREATOR_PRIM_REDY;Rosso Y +ICCPROFCREATOR_PRIM_SRGB;sRGB +ICCPROFCREATOR_PRIM_TOOLTIP;È possibile impostare primari personalizzati per i profili ICC v4 e anche per i profili ICC v2. +ICCPROFCREATOR_PRIM_WIDEG;Ampia gamma +ICCPROFCREATOR_PROF_V2;ICC v2 +ICCPROFCREATOR_PROF_V4;ICC v4 +ICCPROFCREATOR_SAVEDIALOG_TITLE;Salva il profilo ICC come... +ICCPROFCREATOR_SLOPE;Pendenza +ICCPROFCREATOR_TRC_PRESET;Curva di risposta tonale +INSPECTOR_WINDOW_TITLE;Ispettore IPTCPANEL_CATEGORY;Categoria +IPTCPANEL_CATEGORYHINT;Identifica il soggetto dell'immagine secondo il parere del fornitore. IPTCPANEL_CITY;Città +IPTCPANEL_CITYHINT;Inserisci il nome della città raffigurata in questa immagine. IPTCPANEL_COPYHINT;Copia le impostazioni IPTC negli appunti +IPTCPANEL_COPYRIGHT;Notizie sul Copyright +IPTCPANEL_COPYRIGHTHINT;Inserisci un avviso sull'attuale proprietario del copyright per questa immagine, ad esempio ©2008 Jane Doe. IPTCPANEL_COUNTRY;Stato +IPTCPANEL_COUNTRYHINT;Inserisci il nome del paese raffigurato in questa immagine. +IPTCPANEL_CREATOR;Creatore +IPTCPANEL_CREATORHINT;Inserisci il nome della persona che ha creato questa immagine. +IPTCPANEL_CREATORJOBTITLE;Titolo della professione del creatore +IPTCPANEL_CREATORJOBTITLEHINT;Inserisci la qualifica professionale della persona elencata nel campo Creatore. IPTCPANEL_CREDIT;Riconoscimento IPTCPANEL_CREDITHINT;Identifica il fornitore dell'immagine, non necessariamente il possessore/creatore (Credit). IPTCPANEL_DATECREATED;Data di creazione +IPTCPANEL_DATECREATEDHINT;Inserisci la data in cui è stata scattata l'immagine. +IPTCPANEL_DESCRIPTION;Descrizione +IPTCPANEL_DESCRIPTIONHINT;Inserisci una "didascalia" che descriva chi, cosa e perché di ciò che sta accadendo in questa immagine. Ciò potrebbe includere nomi di persone e/o il loro ruolo nell'azione che si sta svolgendo all'interno dell'immagine. +IPTCPANEL_DESCRIPTIONWRITER;Scrittore di descrizioni +IPTCPANEL_DESCRIPTIONWRITERHINT;Inserisci il nome della persona coinvolta nella scrittura, modifica o correzione della descrizione dell'immagine. IPTCPANEL_EMBEDDED;Incorporato IPTCPANEL_EMBEDDEDHINT;Ripristina i dati IPTC incorporati nel file d'immagine IPTCPANEL_HEADLINE;Intestazione +IPTCPANEL_HEADLINEHINT;Inserisci una breve sinossi pubblicabile o un riepilogo dei contenuti dell'immagine. IPTCPANEL_INSTRUCTIONS;Istruzioni +IPTCPANEL_INSTRUCTIONSHINT;Inserisci informazioni sugli embarghi o altre restrizioni non coperte dal campo Copyright. IPTCPANEL_KEYWORDS;Parole Chiave +IPTCPANEL_KEYWORDSHINT;Inserisci un numero qualsiasi di parole chiave, termini o frasi utilizzate per esprimere l'oggetto dell'immagine. IPTCPANEL_PASTEHINT;Incolla le impostazioni IPTC dagli appunti +IPTCPANEL_PROVINCE;Provincia o stato +IPTCPANEL_PROVINCEHINT;Inserisci il nome della provincia o dello stato raffigurato in questa immagine. IPTCPANEL_RESET;Ripristina IPTCPANEL_RESETHINT;Ripristina il profilo predefinito IPTCPANEL_SOURCE;Origine +IPTCPANEL_SOURCEHINT;Inserisci o modifica il nome di una persona o di un soggetto che ha un ruolo nella catena di fornitura dei contenuti, ad esempio una persona o entità da cui hai ricevuto questa immagine. +IPTCPANEL_SUPPCATEGORIES;Categorie supplementari +IPTCPANEL_SUPPCATEGORIESHINT;Perfeziona ulteriormente il soggetto dell'immagine. IPTCPANEL_TITLE;Titolo +IPTCPANEL_TITLEHINT;Inserisci un breve nome verbale e leggibile per l'immagine, questo potrebbe essere il nome del file. +IPTCPANEL_TRANSREFERENCE;ID lavoro +IPTCPANEL_TRANSREFERENCEHINT;Inserisci un numero o un identificatore necessario per il controllo o il monitoraggio del flusso di lavoro. MAIN_BUTTON_FULLSCREEN;Schermo intero +MAIN_BUTTON_ICCPROFCREATOR;Creatore di profili ICC MAIN_BUTTON_NAVNEXT_TOOLTIP;Passa all'immagine successiva rispetto all'immagine aperta per la Modifica\nScorciatoia: Shift-F4\n\nPer passare all'immagine successiva rispetto alla miniatura selezionata nel Navigatore o nel Rullino:\nScorciatoia: F4 MAIN_BUTTON_NAVPREV_TOOLTIP;Passa all'immagine precedente rispetto all'immagine aperta per la Modifica\nScorciatoia: Shift-F3\n\nPer passare all'immagine precedente rispetto alla miniatura selezionata nel Navigatore o nel Rullino:\nScorciatoia: F3 MAIN_BUTTON_NAVSYNC_TOOLTIP;Sincronizza il Navigatore o il Rullino con la scheda di Modifica per trovare la miniatura dell'immagine attualmente aperta e rimuovere tutti i filtri di ricerca\nScorciatoia: x\n\nCome sopra, ma senza cancellare i filtri di ricerca\nScorciatoia: y\n(Nota che la miniatura del file aperto, se filtrato, non verrà mostrata). MAIN_BUTTON_PREFERENCES;Preferenze MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Aggiungi l'immagine corrente alla coda di sviluppo.\nScorciatoia: Ctrl+B MAIN_BUTTON_SAVE_TOOLTIP;Salva l'immagine corrente.\nSscorciatoia: Ctrl+S +MAIN_BUTTON_SENDTOEDITOR;Modifica l'immagine nell'editor esterno MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Modifica l'immagine corrente con un programma di fotoritocco.\nScorciatoia: Ctrl+E MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Mostra/Nascondi tutti i pannelli laterali.\nScorciatoia: m MAIN_BUTTON_UNFULLSCREEN;Esci da schermo intero @@ -463,6 +1670,7 @@ MAIN_FRAME_FILEBROWSER;Navigatore MAIN_FRAME_FILEBROWSER_TOOLTIP;Navigatore.\nScorciatoia: Ctrl-F2 MAIN_FRAME_PLACES;Risorse MAIN_FRAME_PLACES_ADD;Aggiungi +MAIN_FRAME_PLACES_DEL;Rimuovere MAIN_FRAME_QUEUE;Coda di sviluppo MAIN_FRAME_QUEUE_TOOLTIP;Coda di sviluppo.\nScorciatoia: Ctrl-F3 MAIN_FRAME_RECENT;Cartelle recenti @@ -478,18 +1686,26 @@ MAIN_MSG_OPERATIONCANCELLED;Operatione annullata MAIN_MSG_PATHDOESNTEXIST;Il percorso\n\n%1\n\nnon esiste. Imposta un percorso corretto nella finestra Preferenze. MAIN_MSG_QOVERWRITE;Vuoi sovrascriverlo? MAIN_MSG_SETPATHFIRST;Per utilizzare questa funzione\ndevi impostare un percorso nelle Preferenze. +MAIN_MSG_TOOMANYOPENEDITORS;Troppi editor aperti.\nChiudi un editor per continuare. MAIN_MSG_WRITEFAILED;Impossibile scrivere\n\n"%1"\n\nAssicurati che la cartella esista e di averne i permessi di scrittura. +MAIN_TAB_ADVANCED;Avanzate +MAIN_TAB_ADVANCED_TOOLTIP;Scorciatoia: Alt-a MAIN_TAB_COLOR;Colore MAIN_TAB_COLOR_TOOLTIP;Scorciatoia: Alt-c MAIN_TAB_DETAIL;Dettaglio MAIN_TAB_DETAIL_TOOLTIP;Scorciatoia: Alt-d -MAIN_TAB_DEVELOP; Modifiche Batch +MAIN_TAB_DEVELOP; Modifiche Batch MAIN_TAB_EXIF;Exif -MAIN_TAB_EXPORT; Esportazione Rapida +MAIN_TAB_EXPORT; Esportazione Rapida MAIN_TAB_EXPOSURE;Esposizione MAIN_TAB_EXPOSURE_TOOLTIP;Scorciatoia: Alt-e -MAIN_TAB_FILTER; Filtro +MAIN_TAB_FAVORITES;Preferiti +MAIN_TAB_FAVORITES_TOOLTIP;Scorciatoia: Alt-u +MAIN_TAB_FILTER; Filtro +MAIN_TAB_INSPECT; Inspect MAIN_TAB_IPTC;IPTC +MAIN_TAB_LOCALLAB;Local +MAIN_TAB_LOCALLAB_TOOLTIP;Scorciatoia: Alt-o MAIN_TAB_METADATA;Metadati MAIN_TAB_METADATA_TOOLTIP;Scorciatoia: Alt-m MAIN_TAB_RAW;Raw @@ -499,6 +1715,7 @@ MAIN_TAB_TRANSFORM_TOOLTIP;Scorciatoia: Alt-t MAIN_TOOLTIP_BACKCOLOR0;Colore di sfondo dell'anteprima: Basato sul tema\nScorciatoia: 9 MAIN_TOOLTIP_BACKCOLOR1;Colore di sfondo dell'anteprima: Nero\nScorciatoia: 9 MAIN_TOOLTIP_BACKCOLOR2;Colore di sfondo dell'anteprima: Bianco\nScorciatoia: 9 +MAIN_TOOLTIP_BACKCOLOR3;Colore di sfondo dell'anteprima: grigio medio\nScorciatoia: 9 MAIN_TOOLTIP_BEFOREAFTERLOCK;Blocca/Sblocca la vista Prima\n\nBlocca: Conserva la vista Prima.\nUtile per valutare l'effetto cumulativo di diversi strumenti.\nIn più, possono essere confrontati diversi passi della cronologia.\n\nSblocca: la vista Prima segue di un passo la vista Dopo, mostrando l'immagine prima dell'effetto dello strumento corrente. MAIN_TOOLTIP_HIDEHP;Mostra/Nascondi il pannello sinistro (inclusa la cronologia)\nScorciatoia: l MAIN_TOOLTIP_INDCLIPPEDH;Indicazione delle alteluci tosate.\nScorciatoia: > @@ -508,12 +1725,14 @@ MAIN_TOOLTIP_PREVIEWFOCUSMASK;Anteprima della Focus Mask.\nScorciatoia: < MAIN_TOOLTIP_PREVIEWG;Anteprima del Canale Verde.\nScorciatoia: g MAIN_TOOLTIP_PREVIEWL;Anteprima della Luminosità.\nScorciatoia: v\n\n0.299*R + 0.587*G + 0.114*B MAIN_TOOLTIP_PREVIEWR;Anteprima del Canale Rosso.\nScorciatoia: r +MAIN_TOOLTIP_PREVIEWSHARPMASK;Visualizza l'anteprima della maschera di contrasto per la nitidezza.\nScorciatoia: p\n\nFunziona solo quando la nitidezza è abilitata e lo zoom >= 100%. MAIN_TOOLTIP_QINFO;Informazioni generali sullo scatto.\nScorciatoia: i MAIN_TOOLTIP_SHOWHIDELP1;Mostra/Nascondi il pannello sinistro.\nScorciatoia: l MAIN_TOOLTIP_SHOWHIDERP1;Mostra/Nascondi il pannello destro.\nScorciatoia: Alt-l MAIN_TOOLTIP_SHOWHIDETP1;Mostra/Nascondi il pannello superiore.\nScorciatoia: Maiuscolo-l MAIN_TOOLTIP_THRESHOLD;Soglia MAIN_TOOLTIP_TOGGLE;Vista Prima/Dopo.\nScorciatoia: Maiuscolo-b +MONITOR_PROFILE_SYSTEM;Default del sistema NAVIGATOR_B;B: NAVIGATOR_G;G: NAVIGATOR_H;H: @@ -526,6 +1745,10 @@ NAVIGATOR_S;S: NAVIGATOR_V;V: NAVIGATOR_XY_FULL;Larghezza: %1, Altezza: %2 NAVIGATOR_XY_NA;x: --, y: -- +OPTIONS_BUNDLED_MISSING;Impossibile trovare il profilo in bundle '%1'!\in\L'installazione potrebbe essere danneggiata.\non Verranno utilizzati invece i valori interni predefiniti. +OPTIONS_DEFIMG_MISSING;Impossibile trovare o non è impostato il profilo predefinito per foto non RAW.\n\nControlla la directory dei profili, potrebbe essere mancante o danneggiata.\n\n'% Verrà invece utilizzato 1'. +OPTIONS_DEFRAW_MISSING;Impossibile trovare o non è impostato il profilo predefinito per foto RAW.\n\nControlla la directory dei profili, potrebbe essere mancante o danneggiata.\n\n'%1< /b>' verrà invece utilizzato. +PARTIALPASTE_ADVANCEDGROUP;Impostazioni avanzate PARTIALPASTE_BASICGROUP;Parametri principali PARTIALPASTE_CACORRECTION;Correzione AC PARTIALPASTE_CHANNELMIXER;Miscelatore Canali @@ -533,25 +1756,32 @@ PARTIALPASTE_CHANNELMIXERBW;Bianco-Nero PARTIALPASTE_COARSETRANS;Rotazione di 90°/Riflessione PARTIALPASTE_COLORAPP;Modello di Aspetto Colore CIE 2002 PARTIALPASTE_COLORGROUP;Parametri relativi al colore +PARTIALPASTE_COLORTONING;Tonalità colore PARTIALPASTE_COMMONTRANSFORMPARAMS;Riadatta PARTIALPASTE_COMPOSITIONGROUP;Parametri di composizione PARTIALPASTE_CROP;Ritaglio PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark Frame - Autoselezione PARTIALPASTE_DARKFRAMEFILE;File Dark Frame PARTIALPASTE_DEFRINGE;Defringe +PARTIALPASTE_DEHAZE;Rimozione della foschia PARTIALPASTE_DETAILGROUP;Parametri di dettaglio PARTIALPASTE_DIALOGLABEL;Incolla una parte del profilo di sviluppo PARTIALPASTE_DIRPYRDENOISE;Riduzione Rumore PARTIALPASTE_DIRPYREQUALIZER;Contrasto per livelli di dettaglio PARTIALPASTE_DISTORTION;Correzione Distorsione PARTIALPASTE_EPD;Tone mapping +PARTIALPASTE_EQUALIZER;Livelli wavelet PARTIALPASTE_EVERYTHING;Tutto PARTIALPASTE_EXIFCHANGES;Modifiche ai dati Exif PARTIALPASTE_EXPOSURE;Esposizione +PARTIALPASTE_FILMNEGATIVE;Negativo della pellicola +PARTIALPASTE_FILMSIMULATION;Simulazione della pellicola PARTIALPASTE_FLATFIELDAUTOSELECT;Flat Field - Autoselezione PARTIALPASTE_FLATFIELDBLURRADIUS;Flat Field - Raggio di sfocamento PARTIALPASTE_FLATFIELDBLURTYPE;Flat Field - Modalità di sfocamento +PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field controllo della clip PARTIALPASTE_FLATFIELDFILE;File Flat Field +PARTIALPASTE_FLATFIELDFROMMETADATA;Flat-field dai metadati PARTIALPASTE_GRADIENT;Filtro Graduato PARTIALPASTE_HSVEQUALIZER;Equalizzatore HSV PARTIALPASTE_ICMSETTINGS;Impostazioni Gestione Colore @@ -560,44 +1790,102 @@ PARTIALPASTE_IPTCINFO;Informazioni IPTC PARTIALPASTE_LABCURVE;Regolazioni Lab PARTIALPASTE_LENSGROUP;Impostazioni dell'Obiettivo PARTIALPASTE_LENSPROFILE;Profilo di Correzione dell'Obiettivo +PARTIALPASTE_LOCALCONTRAST;Contrasto locale +PARTIALPASTE_LOCALLAB;Aggiustamenti locali +PARTIALPASTE_LOCALLABGROUP;Impostazioni aggiustamenti locali +PARTIALPASTE_METADATA;Modo metadati PARTIALPASTE_METAGROUP;Impostazioni di metadati PARTIALPASTE_PCVIGNETTE;Filtro Vignettatura PARTIALPASTE_PERSPECTIVE;Prospettiva +PARTIALPASTE_PREPROCESS_DEADPIXFILT;Filtro pixel bruciati/morti PARTIALPASTE_PREPROCESS_GREENEQUIL;Bilanciamento del verde +PARTIALPASTE_PREPROCESS_HOTPIXFILT;Filtro pixel bruciati PARTIALPASTE_PREPROCESS_LINEDENOISE;Filtro per rumore a bande +PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;Filtro linee PDAF +PARTIALPASTE_PREPROCWB;Preelaborare il bilanciamento del bianco +PARTIALPASTE_PRSHARPENING;Affinamento post-ridimensionamento PARTIALPASTE_RAWCACORR_AUTO;Autocorrezione AC +PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA evitare cambiamenti di colore +PARTIALPASTE_RAWCACORR_CAREDBLUE;CA rosso e blu PARTIALPASTE_RAWEXPOS_BLACK;Punto del Nero PARTIALPASTE_RAWEXPOS_LINEAR;Correzione Punto del Bianco PARTIALPASTE_RAWGROUP;Impostazioni del Raw +PARTIALPASTE_RAW_BORDER;Bordo del raw PARTIALPASTE_RAW_DCBENHANCE;Miglioramento DCB PARTIALPASTE_RAW_DCBITERATIONS;Numero di iterazioni DCB PARTIALPASTE_RAW_DMETHOD;Metodo di demosaicizzazione PARTIALPASTE_RAW_FALSECOLOR;Soppressione di falsi colori demosaicizzati +PARTIALPASTE_RAW_IMAGENUM;Sotto-immagine PARTIALPASTE_RAW_LMMSEITERATIONS;Passaggi di miglioramento LMMSE +PARTIALPASTE_RAW_PIXELSHIFT;Spostamento dei pixel PARTIALPASTE_RESIZE;Ridimensionamento +PARTIALPASTE_RETINEX;Retinex PARTIALPASTE_RGBCURVES;Curve RGB PARTIALPASTE_ROTATION;Rotazione PARTIALPASTE_SHADOWSHIGHLIGHTS;Ombre/Alteluci PARTIALPASTE_SHARPENEDGE;Bordi PARTIALPASTE_SHARPENING;Nitidezza (USM/RL) PARTIALPASTE_SHARPENMICRO;Microcontrasto +PARTIALPASTE_SOFTLIGHT;Luce soffusa +PARTIALPASTE_SPOT;Rimozione delle macchie +PARTIALPASTE_TM_FATTAL;Compressione della gamma dinamica +PARTIALPASTE_TONE_EQUALIZER;Equalizzatore di tono PARTIALPASTE_VIBRANCE;Vividezza PARTIALPASTE_VIGNETTING;Correzione Vignettatura PARTIALPASTE_WHITEBALANCE;Bilanciamento del bianco PREFERENCES_ADD;Somma +PREFERENCES_APPEARANCE;Aspetto +PREFERENCES_APPEARANCE_COLORPICKERFONT;Carattere di selezione colore +PREFERENCES_APPEARANCE_CROPMASKCOLOR;Colore della maschera di ritaglio +PREFERENCES_APPEARANCE_MAINFONT;Carattere principale PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Colore delle guide del Navigatore +PREFERENCES_APPEARANCE_THEME;Tema PREFERENCES_APPLNEXTSTARTUP;applicato al prossimo avvio PREFERENCES_AUTOMONPROFILE;Usa il profilo colore dello schermo principale del sistema operativo +PREFERENCES_AUTOSAVE_TP_OPEN;Salva lo stato compresso/espanso dello strumento all'uscita PREFERENCES_BATCH_PROCESSING;Sviluppo in serie PREFERENCES_BEHADDALL;Tutti a 'Somma' PREFERENCES_BEHADDALLHINT;Imposta tutti i parametri nella modalità Somma.\nLe regolazioni dei parametri nel pannello strumenti batch saranno differenze dei valori memorizzati. PREFERENCES_BEHAVIOR;Comportamento PREFERENCES_BEHSETALL;Tutti a 'Imposta' PREFERENCES_BEHSETALLHINT;Imposta tutti i parametri nella modalità Imposta.\nLe regolazioni dei parametri nel pannello strumenti batch saranno assoluti, verranno mostrati i valori reali. +PREFERENCES_CACHECLEAR;Pulisci +PREFERENCES_CACHECLEAR_ALL;Pulisci tutti i file della cache: +PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Cancella tutti i file memorizzati nella cache ad eccezione dei profili di elaborazione memorizzati nella cache: +PREFERENCES_CACHECLEAR_ONLYPROFILES;Cancella solo i profili di elaborazione memorizzati nella cache: +PREFERENCES_CACHECLEAR_SAFETY;Vengono cancellati solo i file nella cache. I profili di elaborazione memorizzati insieme alle immagini sorgente non vengono toccati. PREFERENCES_CACHEMAXENTRIES;Numero massimo di voci in memoria PREFERENCES_CACHEOPTS;Opzioni della memoria PREFERENCES_CACHETHUMBHEIGHT;Massima altezza delle miniature +PREFERENCES_CAMERAPROFILESDIR;Directory dei profili della fotocamera +PREFERENCES_CHUNKSIZES;Riquadri per tipo di esecuzione +PREFERENCES_CHUNKSIZE_RAW_AMAZE;Demosaicizzazione AMaZE +PREFERENCES_CHUNKSIZE_RAW_CA;Correzione CA Raw +PREFERENCES_CHUNKSIZE_RAW_RCD;Demosaicizzazione RCD +PREFERENCES_CHUNKSIZE_RAW_XT;Demosaicizzazione Xtrans +PREFERENCES_CHUNKSIZE_RGB;Elaborazione RGB +PREFERENCES_CIE;Ciecam +PREFERENCES_CIEARTIF;Evita artefatti PREFERENCES_CLIPPINGIND;Indicazione di tosaggio +PREFERENCES_CLUTSCACHE;HaldCLUT Cache +PREFERENCES_CLUTSCACHE_LABEL;Numero massimo di cache CLUTs +PREFERENCES_CLUTSDIR;Directory HaldCLUT +PREFERENCES_CMMBPC;Compensazione del punti di Nero +PREFERENCES_COMPLEXITYLOC;Complessità predefinita per le regolazioni locali +PREFERENCES_COMPLEXITY_EXP;Avanzate +PREFERENCES_COMPLEXITY_NORM;Standard +PREFERENCES_COMPLEXITY_SIMP;Di base +PREFERENCES_CROP;Modifica del ritaglio +PREFERENCES_CROP_AUTO_FIT;Zoom automaticamente per adattare il ritaglio +PREFERENCES_CROP_GUIDES;Guide visualizzate quando non si modifica il ritaglio +PREFERENCES_CROP_GUIDES_FRAME;Frame +PREFERENCES_CROP_GUIDES_FULL;Originale +PREFERENCES_CROP_GUIDES_NONE;Nessuno +PREFERENCES_CURVEBBOXPOS;Posizione dei pulsanti copia e incolla della curva +PREFERENCES_CURVEBBOXPOS_ABOVE;Sopra +PREFERENCES_CURVEBBOXPOS_BELOW;Sotto +PREFERENCES_CURVEBBOXPOS_LEFT;Sinistra +PREFERENCES_CURVEBBOXPOS_RIGHT;Destra PREFERENCES_CUSTPROFBUILD;Generatore profili personalizzati PREFERENCES_CUSTPROFBUILDHINT;File eseguibile (o script) richiamato quando è necessario generare un nuovo profilo per un'immagine.\nIl percorso del file di comunicazione (del tipo *.ini, detto "Keyfile") è aggiunto come parametro da linea di comando. Contiene diversi paramentri necessari agli script e ai dati Exif per generare un profilo di elaborazione.\n\nATTENZIONE:: Devi utilizzare le virgolette doppie quando necessario se utilizzi percorsi contenenti spazi. PREFERENCES_CUSTPROFBUILDKEYFORMAT;Formato tasti @@ -610,60 +1898,121 @@ PREFERENCES_DARKFRAMETEMPLATES;modelli PREFERENCES_DATEFORMAT;Formato della data PREFERENCES_DATEFORMATHINT;Puoi usare le seguenti stringhe di formattazione:\n%y : anno\n%m : mese\n%d : giorno\n\nPer esempio, il formato italiano per la data è:\n%d/%m/%y PREFERENCES_DIRDARKFRAMES;Cartella dei fotogrammi di fondo (Dark Frame) +PREFERENCES_DIRECTORIES;Directories PREFERENCES_DIRHOME;Cartella personale dell'utente (home directory) PREFERENCES_DIRLAST;Ultima cartella visitata PREFERENCES_DIROTHER;Altra PREFERENCES_DIRSELECTDLG;Seleziona la cartella delle immagini all'avvio... PREFERENCES_DIRSOFTWARE;Cartella d'installazione +PREFERENCES_EDITORCMDLINE;Riga di comando personalizzata PREFERENCES_EDITORLAYOUT;Disposizione +PREFERENCES_EXTEDITOR_BYPASS_OUTPUT_PROFILE;Ignora profilo di destinazione +PREFERENCES_EXTEDITOR_DIR;Cartella di destinazione +PREFERENCES_EXTEDITOR_DIR_CURRENT;Uguale all'immagine di input +PREFERENCES_EXTEDITOR_DIR_CUSTOM;Personalizza +PREFERENCES_EXTEDITOR_DIR_TEMP;OS Directory temporanea +PREFERENCES_EXTEDITOR_FLOAT32;Output TIFF in virgola mobile a 32 bit PREFERENCES_EXTERNALEDITOR;Programma di ritocco esterni +PREFERENCES_EXTERNALEDITOR_CHANGE;Cambia applicazione +PREFERENCES_EXTERNALEDITOR_CHANGE_FILE;Modifica eseguibile +PREFERENCES_EXTERNALEDITOR_COLUMN_COMMAND;Comando +PREFERENCES_EXTERNALEDITOR_COLUMN_NAME;Nome +PREFERENCES_EXTERNALEDITOR_COLUMN_NATIVE_COMMAND;Comando nativo PREFERENCES_FBROWSEROPTS;Opzioni del Navigatore e delle miniature +PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Barre degli strumenti compatte nel browser dei file PREFERENCES_FLATFIELDFOUND;Trovati PREFERENCES_FLATFIELDSDIR;Cartella dei fotogrammi di campo (Flat Field) PREFERENCES_FLATFIELDSHOTS;fotogrammi PREFERENCES_FLATFIELDTEMPLATES;modelli PREFERENCES_FORIMAGE;Per foto non raw PREFERENCES_FORRAW;Per foto raw +PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Stessa altezza della miniatura tra la pellicola e il browser dei file +PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Avere dimensioni delle miniature separate richiederà più tempo di elaborazione ogni volta che passerai dalla scheda Editor singolo al Browser file. PREFERENCES_GIMPPATH;Cartella d'installazione di GIMP PREFERENCES_HISTOGRAMPOSITIONLEFT;Istogramma nel pannello sinistro PREFERENCES_HISTOGRAM_TOOLTIP;Se abilitato, Navigatore e Istogramma usano il Profilo di Lavoro anziché il Profilo di Uscita (con gamma) PREFERENCES_HLTHRESHOLD;Soglia per le alteluci tosate PREFERENCES_ICCDIR;Cartella profili colore PREFERENCES_IMPROCPARAMS;Parametri predefiniti di elaborazione dell'immagine +PREFERENCES_INSPECTORWINDOW;Apri la visualizzazione nella tua finestra o a schermo intero +PREFERENCES_INSPECT_LABEL;Ispezionare +PREFERENCES_INSPECT_MAXBUFFERS_LABEL;Numero massimo di immagini memorizzate nella cache +PREFERENCES_INSPECT_MAXBUFFERS_TOOLTIP;Imposta il numero massimo di immagini archiviate nella cache quando passi il mouse sopra di esse nel Browser file; i sistemi con poca RAM (2GB) dovrebbero mantenere questo valore impostato su 1 o 2. PREFERENCES_INTENT_ABSOLUTE;Colorimetrico Assoluto PREFERENCES_INTENT_PERCEPTUAL;Percettivo PREFERENCES_INTENT_RELATIVE;Colorimetrico Relativo PREFERENCES_INTENT_SATURATION;Saturazione PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Mostra miniatura JPEG incorporata, se il raw non è stato lavorato +PREFERENCES_LANG;Lingua PREFERENCES_LANGAUTODETECT;Usa l'impostazione di lingua del sistema +PREFERENCES_LENSFUNDBDIR;Directory del database di Lensfun +PREFERENCES_LENSFUNDBDIR_TOOLTIP;Directory contenente il database Lensfun. Lascia vuoto per utilizzare le directory predefinite. +PREFERENCES_LENSPROFILESDIR;Directory dei profili degli obiettivi +PREFERENCES_LENSPROFILESDIR_TOOLTIP;Directory contenente i profili di correzione dell'obiettivo Adobe (LCP) +PREFERENCES_MAXRECENTFOLDERS;Numero massimo di cartelle recenti PREFERENCES_MENUGROUPEXTPROGS;Raggruppa "Apri con" PREFERENCES_MENUGROUPFILEOPERATIONS;Raggruppa "Operazioni sui file" PREFERENCES_MENUGROUPLABEL;Raggruppa "Etichette Colore" PREFERENCES_MENUGROUPPROFILEOPERATIONS;Raggruppa "Operazioni sui profili" PREFERENCES_MENUGROUPRANK;Raggruppa "Classificazioni" PREFERENCES_MENUOPTIONS;Opzioni del menù a discesa +PREFERENCES_METADATA;Metadata +PREFERENCES_METADATA_SYNC;Sincronizzazione dei metadati con sidecar XMP +PREFERENCES_METADATA_SYNC_NONE;Spento +PREFERENCES_METADATA_SYNC_READ;Solo lettura +PREFERENCES_METADATA_SYNC_READWRITE;Bidirezionale +PREFERENCES_MONINTENT;Intento di rendering predefinito +PREFERENCES_MONITOR;Monitor +PREFERENCES_MONPROFILE;Profilo colore predefinito +PREFERENCES_MONPROFILE_WARNOSX;A causa delle limitazioni di MacOS, è supportato solo sRGB. PREFERENCES_MULTITAB;Modalità a Schede Multiple PREFERENCES_MULTITABDUALMON;Modalità a Schede Multiple (se disponibile sul secondo schermo) +PREFERENCES_NAVIGATIONFRAME;Navigazione PREFERENCES_OVERLAY_FILENAMES;Mostra i nomi dei file sovrapposti alle miniature +PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Sovrapponi i nomi dei file alle miniature nel pannello dell'editor PREFERENCES_OVERWRITEOUTPUTFILE;Sovrascrivi file esistenti PREFERENCES_PANFACTORLABEL;Fattore PREFERENCES_PARSEDEXT;Estensioni riconosciute PREFERENCES_PARSEDEXTADD;Aggiungi un'estensione PREFERENCES_PARSEDEXTADDHINT;Aggiungi l'estensione alla lista. PREFERENCES_PARSEDEXTDELHINT;Rimuovi l'estensione selezionata dalla lista. +PREFERENCES_PARSEDEXTDOWNHINT;Sposta l'estensione selezionata verso il basso nell'elenco. +PREFERENCES_PARSEDEXTUPHINT;Sposta l'estensione selezionata in alto nell'elenco. +PREFERENCES_PERFORMANCE_MEASURE;Misurare +PREFERENCES_PERFORMANCE_MEASURE_HINT;Registra i tempi di elaborazione nella console +PREFERENCES_PERFORMANCE_THREADS;Discussioni +PREFERENCES_PERFORMANCE_THREADS_LABEL;Numero massimo di thread per la riduzione del rumore e i livelli wavelet (0 = automatico) +PREFERENCES_PREVDEMO;Anteprima metodo di Demosaicizzazione +PREFERENCES_PREVDEMO_FAST;Veloce +PREFERENCES_PREVDEMO_LABEL;Metodo di demosaicizzazione utilizzato per l'anteprima con zoom <100%: +PREFERENCES_PREVDEMO_SIDECAR;Come in PP3 +PREFERENCES_PRINTER;Stampa (Soft-Proofing) PREFERENCES_PROFILEHANDLING;Gestione dei profilo di sviluppo PREFERENCES_PROFILELOADPR;Priorità nel caricamento del profilo PREFERENCES_PROFILEPRCACHE;Profilo nella memoria PREFERENCES_PROFILEPRFILE;Profilo a fianco del file originario +PREFERENCES_PROFILESAVEBOTH;Salva il profilo di elaborazione sia nella cache che accanto al file di input PREFERENCES_PROFILESAVECACHE;Salva il profilo di sviluppo nella memoria PREFERENCES_PROFILESAVEINPUT;Salva il profilo di sviluppo a fianco del file originario +PREFERENCES_PROFILESAVELOCATION;Posizione di salvataggio del profilo di elaborazione +PREFERENCES_PROFILE_NONE;Nessuno PREFERENCES_PROPERTY;Proprietà +PREFERENCES_PRTINTENT;Intento di rendering +PREFERENCES_PRTPROFILE;Profilo Colore PREFERENCES_PSPATH;Cartella d'installazione di Adobe Photoshop +PREFERENCES_REMEMBERZOOMPAN;Ricorda la percentuale di zoom e l'offset del pan +PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Ricorda la percentuale di zoom e l'offset di panoramica dell'immagine corrente quando si apre una nuova immagine.\n\nQuesta opzione funziona solo in 'Modalità scheda editor singola' e quando 'Metodo di demosaicizzazione utilizzato per l'anteprima con zoom <100%' è impostato su ' Come in PP3'. +PREFERENCES_SAVE_TP_OPEN_NOW;Salva ora lo stato compresso/espanso dello strumento PREFERENCES_SELECTLANG;Seleziona la lingua +PREFERENCES_SERIALIZE_TIFF_READ;Impostazioni di lettura TIFF +PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serializza la lettura dei file TIFF +PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Abilitando questa opzione quando si lavora con cartelle contenenti file TIFF non compressi è possibile aumentare le prestazioni di generazione delle miniature. PREFERENCES_SET;Imposta PREFERENCES_SHOWBASICEXIF;Mostra dati Exif di base PREFERENCES_SHOWDATETIME;Mostra data e ora PREFERENCES_SHOWEXPOSURECOMPENSATION;Accoda compensazione dell'esposizione +PREFERENCES_SHOWFILMSTRIPTOOLBAR;Mostra la barra degli strumenti della sequenza +PREFERENCES_SHOWTOOLTIP;Mostra le descrizioni comandi dei consigli sulle regolazioni locali PREFERENCES_SHTHRESHOLD;Soglia per le ombre tosate PREFERENCES_SINGLETAB;Modalità a Scheda Singola PREFERENCES_SINGLETABVERTAB;Modalità a Scheda Singola, schede verticali @@ -674,13 +2023,42 @@ PREFERENCES_SND_THRESHOLDSECS;dopo un tempo in secondi PREFERENCES_STARTUPIMDIR;Cartella delle immagini all'avvio PREFERENCES_TAB_BROWSER;Navigatore PREFERENCES_TAB_COLORMGR;Gestione Colore +PREFERENCES_TAB_DYNAMICPROFILE;Regole del profilo dinamico +PREFERENCES_TAB_FAVORITES;Preferiti PREFERENCES_TAB_GENERAL;Generale PREFERENCES_TAB_IMPROC;Elaborazione immagine +PREFERENCES_TAB_PERFORMANCE;Prestazione PREFERENCES_TAB_SOUND;Suoni +PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Anteprima JPEG incorporata +PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Immagine da mostrare +PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Rendering RAW neutro +PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;JPEG incorporato se a grandezza naturale, raw neutro altrimenti +PREFERENCES_TOOLPANEL_AVAILABLETOOLS;Strumenti disponibili +PREFERENCES_TOOLPANEL_CLONE_FAVORITES;Mantieni gli strumenti preferiti nelle posizioni originali +PREFERENCES_TOOLPANEL_CLONE_FAVORITES_TOOLTIP;Se impostati, gli strumenti preferiti verranno visualizzati sia nella scheda dei preferiti che nelle relative schede originali.\n\nNota: l'abilitazione di questa opzione potrebbe comportare un leggero ritardo quando si passa da una scheda all'altra. +PREFERENCES_TOOLPANEL_FAVORITE;Preferito +PREFERENCES_TOOLPANEL_FAVORITESPANEL;Pannello Preferiti +PREFERENCES_TOOLPANEL_TOOL;Strumento PREFERENCES_TP_LABEL;Pannello Strumenti: PREFERENCES_TP_VSCROLLBAR;Nascondi la barra di scorrimento verticale PREFERENCES_USEBUNDLEDPROFILES;Usa profili inclusi +PREFERENCES_WBA;Bilanciamento del bianco +PREFERENCES_WBACORR;Bilanciamento del bianco - correlazione automatica della temperatura +PREFERENCES_WBACORR_TOOLTIP;Queste impostazioni consentono, a seconda delle immagini (tipo di file raw, colorimetria, ecc.), un adattamento dell'algoritmo "Correlazione della temperatura" per ottenere i migliori risultati complessivi. Non esiste una regola assoluta, che lega questi parametri ai risultati ottenuti.\n\nLe impostazioni sono di 3 tipi: \n* quelle accessibili all'utente dalla GUI.\n* quelle accessibili solo in lettura da ogni file pp3 : Itcwb_minsize =20, Itcwb_delta=4 Itcwb_rgreen=1 Itcwb_nopurple=false (Vedi Rawpedia)\n* quelli accessibili all'utente in 'opzioni' (vedi Rawpedia)\n Puoi usare "Bias temperatura Awb" e "Raffinamento verde" per regolare il risultati. Ogni movimento di questi comandi comporta un nuovo calcolo di temperatura, tinta e correlazione.\n\nNota che i 3 indicatori "Fattore di correlazione", "Crominanza patch" e ΔE sono forniti solo a titolo informativo. Non è perché uno di questi indicatori è migliore che il risultato sarà necessariamente migliore. +PREFERENCES_WBAENA;Mostra le impostazioni automatiche di correlazione della temperatura del bilanciamento del bianco +PREFERENCES_WBAENACUSTOM;Utilizza temperatura e tinta personalizzate +PREFERENCES_WBAFORC;Algoritmo Intensità Extra +PREFERENCES_WBAGREENDELTA;Delta temperatura nel ciclo iterativo verde (se Force Extra è abilitato) +PREFERENCES_WBANOPURP;Nessun colore viola utilizzato +PREFERENCES_WBAPATCH;Numero massimo di colori utilizzati nell'immagine +PREFERENCES_WBAPRECIS;Algoritmo di precisione - scala utilizzata +PREFERENCES_WBASIZEREF;La dimensione del colore di riferimento viene confrontata con la dimensione del colore dell'istogramma +PREFERENCES_WBASORT;Ordina in ordine cromatico anziché in istogramma PREFERENCES_WORKFLOW;Disposizione +PREFERENCES_XMP_SIDECAR_MODE;Stile sidecar XMP +PREFERENCES_XMP_SIDECAR_MODE_EXT;darktable-like (FILENAME.ext.xmp for FILENAME.ext) +PREFERENCES_XMP_SIDECAR_MODE_STD;Standard (FILENAME.xmp for FILENAME.ext) +PREFERENCES_ZOOMONSCROLL;Ingrandire le immagini scorrendole PROFILEPANEL_COPYPPASTE;Parametri da copiare PROFILEPANEL_GLOBALPROFILES;Profili inclusi PROFILEPANEL_LABEL;Profili di sviluppo @@ -690,6 +2068,7 @@ PROFILEPANEL_MODE_TOOLTIP;Modalità di riempimento del Profilo di Sviluppo.\n\nP PROFILEPANEL_MYPROFILES;Miei profili PROFILEPANEL_PASTEPPASTE;Parametri da incollare PROFILEPANEL_PCUSTOM;Personalizzato +PROFILEPANEL_PDYNAMIC;Dinamico PROFILEPANEL_PFILE;Da file PROFILEPANEL_PINTERNAL;Neutral PROFILEPANEL_PLASTSAVED;Ultimo salvato @@ -699,31 +2078,55 @@ PROFILEPANEL_TOOLTIPCOPY;Copia il profilo corrente negli appunti.\nCtrl-click PROFILEPANEL_TOOLTIPLOAD;Carica profilo da file.\nCtrl-click per selezionare i parametri da caricare. PROFILEPANEL_TOOLTIPPASTE;Incolla il profilo dagli appunti.\nCtrl-click per selezionare i parametri da incollare. PROFILEPANEL_TOOLTIPSAVE;Salva il profilo corrente.\nCtrl-click per selezionare i parametri da salvare. +PROGRESSBAR_DECODING;Decodifica... +PROGRESSBAR_GREENEQUIL;Equilibrio verde... +PROGRESSBAR_HLREC;Ricostruzione alteluci... +PROGRESSBAR_HOTDEADPIXELFILTER;Filtro pixel bruciati/morti... +PROGRESSBAR_LINEDENOISE;Filtro antirumore di linea... PROGRESSBAR_LOADING;Caricamento immagine... PROGRESSBAR_LOADINGTHUMBS;Caricamento miniature... PROGRESSBAR_LOADJPEG;Caricamento JPEG... +PROGRESSBAR_LOADJXL;Caricamento JXL... PROGRESSBAR_LOADPNG;Caricamento PNG... PROGRESSBAR_LOADTIFF;Caricamento TIFF... PROGRESSBAR_NOIMAGES;Nessuna immagine trovata PROGRESSBAR_PROCESSING;Elaborazione dell'immagine... PROGRESSBAR_PROCESSING_PROFILESAVED;Profilo di sviluppo salvato +PROGRESSBAR_RAWCACORR;Correzione CA RAW... PROGRESSBAR_READY;Pronto PROGRESSBAR_SAVEJPEG;Salvataggio del file JPEG... PROGRESSBAR_SAVEPNG;Salvataggio del file PNG... PROGRESSBAR_SAVETIFF;Salvataggio del file TIFF... PROGRESSBAR_SNAPSHOT_ADDED;Istantanea aggiunta PROGRESSDLG_PROFILECHANGEDINBROWSER;Profilo di sviluppo modificato nel navigatore +QINFO_FRAMECOUNT;%2 frames +QINFO_HDR;HDR / %2 frame(s) QINFO_ISO;ISO QINFO_NOEXIF;Dati Exif non disponibili. +QINFO_PIXELSHIFT;Spostamento dei pixel / %2 frame(s) QUEUE_AUTOSTART;Autoavvia QUEUE_AUTOSTART_TOOLTIP;Inizia a sviluppare automaticamente quando un nuovo lavoro viene accodato QUEUE_DESTFILENAME;Percorso e nome file +QUEUE_DESTPREVIEW_TITLE;Seleziona una miniatura per visualizzare qui l'anteprima del percorso di destinazione +QUEUE_DESTPREVIEW_TOOLTIP;Il percorso di destinazione per la prima immagine selezionata viene visualizzato qui QUEUE_FORMAT_TITLE;Formato file QUEUE_LOCATION_FOLDER;Salva nella cartella QUEUE_LOCATION_TEMPLATE;Usa lo schema QUEUE_LOCATION_TEMPLATE_TOOLTIP;Puoi usare le seguenti stringhe di formattazione:\n%f, %d1, %d2, ..., %p1, %p2, ...\n\nQueste stringhe di formattazione si riferiscono ai vari livelli del percorso in cui si trova la foto.\n\nPer esempio, se la foto sviluppata si trovasse nel seguente percorso:\n/home/mario/foto/31-10-2010/dsc0042.nef\nil significato delle stringhe di formattazione sarebbe:\n%d4 = home\n%d3 = mario\n%d2 = foto\n%d1 = 31-10-2010\n%f = dsc0042\n%p1 = /home/mario/foto/31-10-2010/\n%p2 = /home/mario/foto/\n%p3 = /home/mario/\n%p4 = /home/\n\nPer salvare l'immagine finale nella stessa posizione dove si trova l'originale, scrivi:\n%p1/%f\n\nPer salvare l'immagine finale in una cartella chiamata "sviluppate" situata nella cartella degli originali, scrivi:\n%p1/sviluppate/%f\n\nPer salvare l'immagine finale in una cartella chiamata "/home/mario/foto/sviluppate/31-10-2010", scrivi:\n%p2/sviluppate/%d1/%f +QUEUE_LOCATION_TITLE;Posizione di uscita +QUEUE_STARTSTOP_TOOLTIP;Avvia o interrompe l'elaborazione delle immagini in coda.\n\nScorciatoia: Ctrl+s +SAMPLEFORMAT_0;Formato dati sconosciuto +SAMPLEFORMAT_1;8-bit non firmato +SAMPLEFORMAT_2;16-bit non firmato +SAMPLEFORMAT_4;24-bit LogLuv +SAMPLEFORMAT_8;32-bit LogLuv +SAMPLEFORMAT_16;16-bit virgola mobile +SAMPLEFORMAT_32;24-bit virgola mobile +SAMPLEFORMAT_64;32-bit virgola mobile SAVEDLG_AUTOSUFFIX;Aggiungi automaticamente un suffisso se il file esiste già +SAVEDLG_BIGTIFF;Grande TIFF (no supporto ai metadati) SAVEDLG_FILEFORMAT;Formato file +SAVEDLG_FILEFORMAT_FLOAT; virgola mobile SAVEDLG_FORCEFORMATOPTS;Opzioni di salvataggio forzato SAVEDLG_JPEGQUAL;Qualità JPEG SAVEDLG_PUTTOQUEUE;Inserisci nella coda di sviluppo @@ -735,9 +2138,25 @@ SAVEDLG_SUBSAMP;Sottocampionamento SAVEDLG_SUBSAMP_1;Migliore Compressione SAVEDLG_SUBSAMP_2;Bilanciato SAVEDLG_SUBSAMP_3;Migliore Qualità +SAVEDLG_SUBSAMP_TOOLTIP;Migliore compressione:\nJ:a:b 4:2:0\nh/v 2/2\nCromaticità dimezzata orizzontalmente e verticalmente.\n\nBilanciato:\nJ:a:b 4:2:2\nh/v 2/ 1\nCromazia dimezzata orizzontalmente.\n\nQualità migliore:\nJ:a:b 4:4:4\nh/v 1/1\nNessun sottocampionamento della crominanza. SAVEDLG_TIFFUNCOMPRESSED;TIFF non compresso SAVEDLG_WARNFILENAME;Il file verrà chiamato SHCSELECTOR_TOOLTIP;Click destro per ripristinare la posizione di questi tre cursori. +SOFTPROOF_GAMUTCHECK_TOOLTIP;Evidenzia i pixel con colori fuori gamma rispetto a:\n- il profilo della stampante, se impostato e la prova a video abilitata,\n- il profilo di destinazione, se non è impostato un profilo della stampante e la prova a video è abilitata abilitato,\n- il profilo del monitor, se il soft-proof è disabilitato. +SOFTPROOF_TOOLTIP;La prova colore simula l'aspetto dell'immagine:\n- quando viene stampata, se è impostato un profilo stampante in Preferenze > Gestione colore,\n- quando viene visualizzata su un display che utilizza il profilo di destinazione corrente, se non è impostato un profilo stampante . +SORT_ASCENDING;Ascendente +SORT_BY_DATE;Per data +SORT_BY_EXIF;Per EXIF +SORT_BY_LABEL;Per etichetta colore +SORT_BY_NAME;Per nome +SORT_BY_RANK;Per posizione +SORT_DESCENDING;Discendente +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;Basso THRESHOLDSELECTOR_BL;Basso-Sinistra THRESHOLDSELECTOR_BR;Basso-Destra @@ -745,8 +2164,10 @@ THRESHOLDSELECTOR_HINT;Tieni premuto Maiuscolo per muovere un singolo pun THRESHOLDSELECTOR_T;Alto THRESHOLDSELECTOR_TL;Alto-Sinistra THRESHOLDSELECTOR_TR;Alto-Destra +TOOLBAR_TOOLTIP_COLORPICKER;Selettore colore bloccabile\n\nQuando lo strumento è attivo:\n- Aggiungi un selettore: fai clic con il pulsante sinistro del mouse.\n- Trascina un selettore: fai clic con il pulsante sinistro del mouse e trascina. \n- Elimina un selettore: fai clic con il pulsante destro del mouse.\n- Elimina tutti i selettori: Ctrl+Maiusc+fai clic con il pulsante destro del mouse< /b>.\n- Torna allo strumento manuale: fai clic con il pulsante destro del mouse all'esterno di qualsiasi selettore. TOOLBAR_TOOLTIP_CROP;Ritaglia la selezione.\nScorciatoia: c\nSposta l'area di ritaglio tenendo premuto Maiuscolo mentre muovi il mouse TOOLBAR_TOOLTIP_HAND;Strumento mano.\nScorciatoia: h +TOOLBAR_TOOLTIP_PERSPECTIVE;Correzione prospettica\n\nModifica le linee di controllo per correggere la distorsione prospettica. Fare di nuovo clic su questo pulsante per applicare la correzione. TOOLBAR_TOOLTIP_STRAIGHTEN;Linea Dritta/Rotazione Precisa.\nScorciatoia: s\n\nTraccia il verticale o l'orizzontale disegnando una linea sull'anteprima dell'immagine. L'angolo di rotazione verrà mostrato accanto alla linea guida. Il centro della rotazione è il centro geometrico dell'immagine. TOOLBAR_TOOLTIP_WB;Bilanciamento del bianco puntuale.\nScorciatoia: w TP_BWMIX_ALGO;Algoritmo OYCPM @@ -780,6 +2201,8 @@ TP_BWMIX_MET;Metodo TP_BWMIX_MET_CHANMIX;Miscelatore Canali TP_BWMIX_MET_DESAT;Desaturazione TP_BWMIX_MET_LUMEQUAL;Equalizzatore di Luminanza +TP_BWMIX_MIXC;Miscelatore di canali +TP_BWMIX_NEUTRAL;Ripristina TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Totale: %4%% TP_BWMIX_RGBLABEL_HINT;Fattori RGB finali che si occupano di tutte le opzioni del miscelatore.\n"Totale" mostra la somma dei valori RGB:\n- sempre 100% nella modalità relativa\n- Più alto (luminoso) or più basso (scuro) del 100% nella modalità assoluta. TP_BWMIX_RGB_TOOLTIP;Miscela i canali RGB. Usa i valori preimpostati per orientarti.\nFai attenzione ai valori negativi: possono causare artefatti o comportamenti imprevisti. @@ -808,6 +2231,10 @@ TP_BWMIX_VAL;L TP_CACORRECTION_BLUE;Blu TP_CACORRECTION_LABEL;Correzione AC TP_CACORRECTION_RED;Rosso +TP_CBDL_AFT;Dopo il bianco e nero +TP_CBDL_BEF;Prima del bianco e nero +TP_CBDL_METHOD;Processo individuato +TP_CBDL_METHOD_TOOLTIP;Scegliere se lo strumento Contrasto per livelli di dettaglio deve essere posizionato dopo lo strumento Bianco e nero, che lo fa funzionare nello spazio L*a*b*, o prima di esso, che lo fa funzionare nello spazio RGB. TP_CHMIXER_BLUE;Canale Blu TP_CHMIXER_GREEN;Canale Verde TP_CHMIXER_LABEL;Miscelatore Canali @@ -816,6 +2243,8 @@ TP_COARSETRAF_TOOLTIP_HFLIP;Rifletti orizzontalmente. TP_COARSETRAF_TOOLTIP_ROTLEFT;Ruota a sinistra.\nScorciatoie:\n[ - Modalità a Scheda Multipla,\nAlt-[ - Modalità a Scheda Singola. TP_COARSETRAF_TOOLTIP_ROTRIGHT;Ruota a destra.\nScorciatoie:\n] - Modalità a Scheda Multipla,\nAlt-] - Modalità a Scheda Singola. TP_COARSETRAF_TOOLTIP_VFLIP;Rifletti verticalmente +TP_COLORAPP_ABSOLUTELUMINANCE;Luminanza assoluta +TP_COLORAPP_ADAPSCEN_TOOLTIP;Corrisponde alla luminanza in candele per m2 al momento dello scatto, calcolata automaticamente dai dati EXIF. TP_COLORAPP_ALGO;Algoritmo TP_COLORAPP_ALGO_ALL;Tutto TP_COLORAPP_ALGO_JC;Chiarezza + Croma (JC) @@ -826,6 +2255,12 @@ TP_COLORAPP_BADPIXSL;Filtro pixel surriscaldati/guasti TP_COLORAPP_BADPIXSL_TOOLTIP;Soppressione dei pixel surriscaldati/guasti (eccessivamente colorati).\n0 = nessun effetto\n1 = mediana\n2 = gaussiana.\n\nQuesti artefatti derivano dalle limitazioni di CIECAM02. Alternativamente, regola l'immagine per evitare ombre eccessivamente scure. TP_COLORAPP_BRIGHT;Brillanza (Q) TP_COLORAPP_BRIGHT_TOOLTIP;La Brillanza in CIECAM02 prende in considerazione la luminosità del bianco ed è diversa da quella in Lab e RGB. +TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;Quando si imposta manualmente, si consigliano valori superiori a 65. +TP_COLORAPP_CATCLASSIC;Classico +TP_COLORAPP_CATMET_TOOLTIP;Classico - funzionamento tradizionale CIECAM. Le trasformazioni dell'adattamento cromatico vengono applicate separatamente su 'Condizioni della scena' e illuminante di base da un lato, e su illuminante di base e 'Condizioni di visualizzazione' dall'altro.\n\nSimmetrico: l'adattamento cromatico si basa sul bilanciamento del bianco. Le impostazioni 'Condizioni scena', 'Regolazioni immagine' e 'Condizioni di visualizzazione' vengono neutralizzate.\n\nMisto: come l'opzione 'Classico' ma in questo caso l'adattamento cromatico si basa sul bilanciamento del bianco. +TP_COLORAPP_CATMOD;Modo +TP_COLORAPP_CATSYMGEN;Simmetrico automatico +TP_COLORAPP_CATSYMSPE;Misto TP_COLORAPP_CHROMA;Croma (C) TP_COLORAPP_CHROMA_M;Pienezza (M) TP_COLORAPP_CHROMA_M_TOOLTIP;La Pienezza in CIECAM02 è diversa da quella in Lab e RGB. @@ -833,6 +2268,7 @@ TP_COLORAPP_CHROMA_S;Saturazione (S) TP_COLORAPP_CHROMA_S_TOOLTIP;La Saturazione in CIECAM02 è diversa da quella in Lab e RGB. TP_COLORAPP_CHROMA_TOOLTIP;Il Croma in CIECAM02 è diverso da quello in Lab e RGB. TP_COLORAPP_CIECAT_DEGREE;Adattamento CAT02 +TP_COLORAPP_CIECAT_DEGREEOUT;Visualizzazione dell'adattamento cromatico TP_COLORAPP_CONTRAST;Contrasto (J) TP_COLORAPP_CONTRAST_Q;Contrasto (Q) TP_COLORAPP_CONTRAST_Q_TOOLTIP;Contrasto per il cursore Q in CIECAM02; è diverso da quello in Lab e RGB. @@ -845,25 +2281,50 @@ TP_COLORAPP_CURVEEDITOR3;Curva Colore TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Regola Croma, Saturazione o Pienezza.\nL'Istogramma mostra la Cromaticità (Lab) prima di CIECAM02.\nSe "Mostra gli istogrammi di uscita CIECAM02 nelle curve" è abilitato, l'Istogramma mostra C, s e M dopo CIECAM02.\nC, s e M non sono mostrati direttamente nel pannello Istogramma.\nPer l'output finale fare riferimento al pannello Istogramma TP_COLORAPP_DATACIE;Mostra gli istogrammi di uscita CIECAM02 nelle curve TP_COLORAPP_DATACIE_TOOLTIP;Quando abilitato, gli istogrammi nelle curve CIECAM02 mostrano valori e intervalli approssimati di J o Q, e C, s o M dopo le regolazioni CIECAM02.\nQuesta selezione non ha effetto nel pannello Istogramma principale.\n\nQuando disabilitato, gli istogrammi nelle curve CIECAM02 mostrano i valori Lab, come sono prima delle regolazioni CIECAM02. +TP_COLORAPP_DEGREE_TOOLTIP;CAT02/16 è un adattamento cromatico. Converte i valori di un'immagine il cui punto di bianco è quello di un dato illuminante (ad esempio D65) in nuovi valori il cui punto di bianco è quello del nuovo illuminante - vedi modello WP (ad esempio D50 o D55). +TP_COLORAPP_DEGREOUT_TOOLTIP;CAT02/16 è un adattamento cromatico. Converte i valori di un'immagine il cui punto di bianco è quello di un dato illuminante (ad esempio D50) in nuovi valori il cui punto di bianco è quello del nuovo illuminante - vedi modello WP (ad esempio D75). +TP_COLORAPP_FREE;Temp. libera + tinta + CAT02/16 +[uscita] TP_COLORAPP_GAMUT;Controllo Gamut (Lab) +TP_COLORAPP_GEN;Impostazioni +TP_COLORAPP_GEN_TOOLTIP;Questo modulo si basa sui modelli di aspetto del colore CIECAM, progettati per simulare meglio il modo in cui la visione umana percepisce i colori in diverse condizioni di illuminazione, ad es. contro contesti diversi. Tiene conto dell'ambiente di ciascun colore e ne modifica l'aspetto per avvicinarsi il più possibile alla percezione umana. Inoltre, adatta l'output alle condizioni di visualizzazione previste (monitor, TV, proiettore, stampante, ecc.) in modo che l'aspetto cromatico venga preservato nella scena e negli ambienti di visualizzazione. TP_COLORAPP_HUE;Tinta (h) TP_COLORAPP_HUE_TOOLTIP;Tinta (h) - angolo tra 0° e 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;Incandescente StdA 2856K +TP_COLORAPP_ILFREE;Libero +TP_COLORAPP_ILLUM;Illuminante +TP_COLORAPP_ILLUM_TOOLTIP;Seleziona l'illuminante più vicino alle condizioni di scatto.\nIn generale D50, ma può cambiare a seconda dell'ora e della latitudine. TP_COLORAPP_LABEL;Modello di Aspetto Colore CIE 2002 TP_COLORAPP_LABEL_CAM02;Regolazioni Immagine TP_COLORAPP_LABEL_SCENE;Caratteristiche della scena TP_COLORAPP_LABEL_VIEWING;Caratteristiche della visualizzazione TP_COLORAPP_LIGHT;Chiarezza (J) TP_COLORAPP_LIGHT_TOOLTIP;La Chiarezza in CIECAM02 è diversa da quella in Lab e RGB. +TP_COLORAPP_MEANLUMINANCE;Luminanza media (Yb%) +TP_COLORAPP_MOD02;CAM02 +TP_COLORAPP_MOD16;CAM16 TP_COLORAPP_MODEL;Modello del Punto di Bianco +TP_COLORAPP_MODELCAT;CAM +TP_COLORAPP_MODELCAT_TOOLTIP;Ti consente di scegliere tra CAM02 o CAM16.\nCAM02 a volte sarà più preciso.\nCAM16 dovrebbe generare meno artefatti. TP_COLORAPP_MODEL_TOOLTIP;Modello del Punto di bianco.\n\nWB [RT] + [output]: Per la scena viene usato il Bilanciamento del Bianco di RT, CIECAM02 è impostato a D50, il bianco del dispositivo di uscita utilizza il valore impostato in Preferenze > Gestione Colore.\n\nWB [RT+CAT02] + [output]: Le impostazioni di Bilanciamento del Bianco di RT sono utilizzate da CAT02 e il bianco del dispositivo di uscita utilizza il valore impostato in Preferenze > Gestione Colore. +TP_COLORAPP_NEUTRAL;Reset +TP_COLORAPP_NEUTRAL_TOOLTIP;Ripristina tutte le caselle di controllo e le curve dei cursori ai valori predefiniti. TP_COLORAPP_RSTPRO;Protezione rossi e incarnato TP_COLORAPP_RSTPRO_TOOLTIP;Protezione dei toni rossi e dell'incarnato (cursori e curve) +TP_COLORAPP_SOURCEF_TOOLTIP;Corrisponde alle condizioni di ripresa e a come riportare le condizioni e i dati in un'area "normale". Normale significa condizioni e dati medi o standard, ovvero senza tenere conto delle correzioni CIECAM. TP_COLORAPP_SURROUND;Ambiente +TP_COLORAPP_SURROUNDSRC;Circondare TP_COLORAPP_SURROUND_AVER;Medio TP_COLORAPP_SURROUND_DARK;Scuro TP_COLORAPP_SURROUND_DIM;Fioco TP_COLORAPP_SURROUND_EXDARK;Estremamente Scuro (Pieghevole) TP_COLORAPP_SURROUND_TOOLTIP;Cambia toni e colori per tenere conto delle condizioni di visualizzazione del dispositivo di uscita\n\nMedio: Ambiente mediamente illuminato (standard)\nL'immagine non verrà modificata.\n\nFioco: Ambiente fioco (TV)\nL'immagine diverrà leggermente più scura\n\nScuro: Ambiente scuro (proiettore)\nL'immagine diventerà più scura\n\nEstremamente Scuro: Ambiente buio (Pieghevole)\nL'immagine diventerà molto più scura. +TP_COLORAPP_SURSOURCE_TOOLTIP;Modifica toni e colori per tenere conto delle condizioni circostanti dell'illuminazione della scena. Quanto più scure sono le condizioni circostanti, tanto più luminosa risulterà l'immagine. La luminosità dell'immagine non verrà modificata quando il surround è impostato su medio. TP_COLORAPP_TCMODE_BRIGHTNESS;Brillanza TP_COLORAPP_TCMODE_CHROMA;Croma TP_COLORAPP_TCMODE_COLORF;Pienezza @@ -872,21 +2333,91 @@ TP_COLORAPP_TCMODE_LABEL2;Modo Curva 2 TP_COLORAPP_TCMODE_LABEL3;Modo Curva Croma TP_COLORAPP_TCMODE_LIGHTNESS;Chiarezza TP_COLORAPP_TCMODE_SATUR;Saturazione +TP_COLORAPP_TEMP2_TOOLTIP;Modalità simmetrica Temp = Bilanciamento del bianco.\nSeleziona illuminante impostato sempre Tinta=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504 \nD75 temperatura=7504 +TP_COLORAPP_TEMPOUT_TOOLTIP;Temperatura e Tinta.\nA seconda delle scelte effettuate in precedenza, la temperatura selezionata è:\nBilanciamento del bianco\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504 \nD75 temp=7504\nLibero. +TP_COLORAPP_TEMP_TOOLTIP;Per selezionare un illuminante impostare sempre 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;Tone mapping con CIECAM02 TP_COLORAPP_TONECIE_TOOLTIP;Se questa opzione è disabilitata, il Tone Mapping è eseguito nello spazio Lab.\nSe l'opzione è abilitata, il Tone Mapping è fatto usando CIECAM02.\nLo strumento Tone Mapping (Lab/CIECAM02) deve essere abilitato affinché questa impostazione abbia effetto. +TP_COLORAPP_VIEWINGF_TOOLTIP;Tiene conto del supporto su cui verrà visualizzata l'immagine finale (monitor, TV, proiettore, stampante, ecc.), nonché del suo ambiente. Questo processo prenderà i dati provenienti dal processo 'Regolazioni immagine' e li 'porterà' al supporto in modo tale che le condizioni di visualizzazione e il suo ambiente siano presi in considerazione. TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Luminanza assoluta dell'ambiente di visualizzazione\n(normalmente 16cd/m²). TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] TP_COLORAPP_WBRT;WB [RT] + [output] +TP_COLORAPP_YBOUT_TOOLTIP;Yb è la luminanza relativa dello sfondo, espressa in % di grigio. Il 18% di grigio corrisponde ad una luminanza di sfondo del 50% espressa in CIE L.\nI dati si basano sulla luminanza media dell'immagine. +TP_COLORAPP_YBSCEN_TOOLTIP;Yb è la luminanza relativa dello sfondo, espressa in % di grigio. Il 18% di grigio corrisponde ad una luminanza di sfondo del 50% espressa in CIE L.\nI dati si basano sulla luminanza media dell'immagine. +TP_COLORTONING_AB;o C/L +TP_COLORTONING_AUTOSAT;Automatico +TP_COLORTONING_BALANCE;Balanciato +TP_COLORTONING_BY;o C/L +TP_COLORTONING_CHROMAC;Opacità +TP_COLORTONING_COLOR;Colore: +TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP;Opacità cromatica in funzione della luminanza oC=f(L). +TP_COLORTONING_HIGHLIGHT;Alteluci +TP_COLORTONING_HUE;Tonalità +TP_COLORTONING_LAB;L*a*b* miscelazione +TP_COLORTONING_LABEL;Toni Colore +TP_COLORTONING_LABGRID;L*a*b* griglia correzione colore +TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +TP_COLORTONING_LABREGIONS;Zona correzione colore +TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +TP_COLORTONING_LABREGION_CHANNEL;Canale +TP_COLORTONING_LABREGION_CHANNEL_ALL;Tutto +TP_COLORTONING_LABREGION_CHANNEL_B;Blu +TP_COLORTONING_LABREGION_CHANNEL_G;Verde +TP_COLORTONING_LABREGION_CHANNEL_R;Rosso +TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +TP_COLORTONING_LABREGION_HUEMASK;H +TP_COLORTONING_LABREGION_LIGHTNESS;Luminosità +TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +TP_COLORTONING_LABREGION_LIST_TITLE;Correzione +TP_COLORTONING_LABREGION_MASK;Maschera +TP_COLORTONING_LABREGION_MASKBLUR;Maschera di sfocatura +TP_COLORTONING_LABREGION_OFFSET;Compensazione +TP_COLORTONING_LABREGION_POWER;Potenza +TP_COLORTONING_LABREGION_SATURATION;Saturazione +TP_COLORTONING_LABREGION_SHOWMASK;Mostra maschera +TP_COLORTONING_LABREGION_SLOPE;Pendenza +TP_COLORTONING_LUMA;Luminanza +TP_COLORTONING_LUMAMODE;Preserva la luminanza +TP_COLORTONING_LUMAMODE_TOOLTIP;Se abilitato, quando si cambia colore (rosso, verde, ciano, blu, ecc.) viene preservata la luminanza di ciascun pixel. +TP_COLORTONING_METHOD;Metodo +TP_COLORTONING_METHOD_TOOLTIP;"Miscelazione L*a*b*", "Cursori RGB" e "Curve RGB" utilizzano la fusione dei colori interpolati.\n"Bilanciamento colore (ombre/mezzitoni/luci)" e "Saturazione 2 colori" utilizzano colori diretti.\n\ nLo strumento Bianco e nero può essere abilitato quando si utilizza qualsiasi metodo di tonalità del colore che consenta la tonalità del colore. +TP_COLORTONING_MIDTONES;Mezzitoni +TP_COLORTONING_NEUTRAL;Ripristina i cursori +TP_COLORTONING_NEUTRAL_TOOLTIP;Ripristina tutti i valori (ombre, mezzitoni, luci) ai valori predefiniti. +TP_COLORTONING_OPACITY;Opacità: +TP_COLORTONING_RGBCURVES;RGB - Curve +TP_COLORTONING_RGBSLIDERS;RGB - Cursori +TP_COLORTONING_SA;Protezione dalla saturazione +TP_COLORTONING_SATURATEDOPACITY;Intensità +TP_COLORTONING_SATURATIONTHRESHOLD;Soglia +TP_COLORTONING_SHADOWS;Ombre +TP_COLORTONING_SPLITCO;Ombre/Mezzitoni/Alteluci +TP_COLORTONING_SPLITCOCO;Balanciamento Colore Ombre/Mezzitoni/Alteluci +TP_COLORTONING_SPLITLR;Saturazione 2 colori +TP_COLORTONING_STR;Intensità +TP_COLORTONING_STRENGTH;Intensità +TP_COLORTONING_TWO2;Cromia Speciale '2 colori' +TP_COLORTONING_TWOALL;Cromia speciale +TP_COLORTONING_TWOBY;Speciale a* e b* +TP_COLORTONING_TWOCOLOR_TOOLTIP;Crominanza standard:\nRisposta lineare, a* = b*.\n\nCrominanza speciale:\nRisposta lineare, a* = b*, ma non legata: provare sotto la diagonale.\n\nSpeciale a* e b*:\nRisposta lineare non legato con curve separate per a* e b*. Destinato agli effetti speciali.\n\nColori speciali Chroma 2:\nPiù prevedibili. +TP_COLORTONING_TWOSTD;Cromia Standard TP_CROP_FIXRATIO;Rapporto fisso: +TP_CROP_GTCENTEREDSQUARE;Quadrato centrato TP_CROP_GTDIAGONALS;Regola delle diagonali TP_CROP_GTEPASSPORT;Passaporto Biometrico TP_CROP_GTFRAME;Fotogramma TP_CROP_GTGRID;Griglia +TP_CROP_GTHARMMEANS;Mezzi armonici TP_CROP_GTNONE;Nessuna TP_CROP_GTRULETHIRDS;Regola dei terzi +TP_CROP_GTTRIANGLE1;Triangoli d'oro 1 +TP_CROP_GTTRIANGLE2;Triangoli d'oro 2 TP_CROP_GUIDETYPE;Tipo di guida: TP_CROP_H;A TP_CROP_LABEL;Ritaglio +TP_CROP_PPI;PPI +TP_CROP_RESETCROP;Ripristina +TP_CROP_SELECTCROP;Selezione TP_CROP_W;L TP_CROP_X;X TP_CROP_Y;Y @@ -895,19 +2426,69 @@ TP_DARKFRAME_LABEL;Dark Frame TP_DEFRINGE_LABEL;Defringe TP_DEFRINGE_RADIUS;Raggio TP_DEFRINGE_THRESHOLD;Soglia +TP_DEHAZE_DEPTH;Doppio +TP_DEHAZE_LABEL;Rimuove foschia +TP_DEHAZE_SATURATION;Saturazione +TP_DEHAZE_SHOW_DEPTH_MAP;Mostra doppia mappa +TP_DEHAZE_STRENGTH;Intensità +TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Multizona automatica +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Globale automatico TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Crominanza - Blu-Giallo +TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Curva di crominanza +TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Aumenta (moltiplica) il valore di tutti i cursori della crominanza.\nQuesta curva consente di regolare l'intensità della riduzione del rumore cromatico in funzione della cromaticità, ad esempio per aumentare l'azione nelle aree a bassa saturazione e per diminuirla in quelle ad alta saturazione. +TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Crominanza +TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manuale TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Crominanza (Principale) +TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Metodo +TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manuale\nAgisce sull'immagine intera.\nControlli manualmente le impostazioni di riduzione del rumore.\n\nGlobale automatico\nAgisce sull'immagine intera.\n9 zone vengono utilizzate per calcolare un'impostazione globale di riduzione del rumore della crominanza.\n\nAnteprima\nAgisce su l'intera immagine.\nLa parte dell'immagine visibile nell'anteprima viene utilizzata per calcolare le impostazioni globali di riduzione del rumore della crominanza. +TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manuale\nAgisce sull'immagine intera.\nControlli manualmente le impostazioni di riduzione del rumore.\n\nGlobale automatico\nAgisce sull'immagine intera.\n9 zone vengono utilizzate per calcolare un'impostazione globale di riduzione del rumore della crominanza.\n\nMultizone automatiche \nNessuna anteprima: funziona solo durante il salvataggio, ma utilizzando il metodo 'Anteprima' facendo corrispondere la dimensione e il centro della tessera alla dimensione e al centro dell'anteprima puoi avere un'idea dei risultati attesi.\nL'immagine è divisa in tessere (da circa 10 a 70 a seconda della dimensione dell'immagine) e ogni riquadro riceve le proprie impostazioni di riduzione del rumore della crominanza.\n\nAnteprima\nAgisce sull'intera immagine.\nLa parte dell'immagine visibile nell'anteprima viene utilizzata per calcolare le impostazioni globali di riduzione del rumore della crominanza. +TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Anteprima multizona +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Anteprima +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Visualizza i livelli di rumore rimanenti della parte dell'immagine visibile nell'anteprima dopo il wavelet.\n\n>300 Molto rumoroso\n100-300 Rumoroso\n50-100 Un po' rumoroso\n<50 Rumore molto basso\n\nAttenzione, i valori differiranno tra la modalità RGB e L*a*b*. I valori RGB sono meno accurati perché la modalità RGB non separa completamente luminanza e crominanza. +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Dimensione anteprima=%1, Centro: Px=%2 Py=%3 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Rumore dell'anteprima: Medio=%1 Alto=%2 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Dimensione tessera=%1, Centro: Tx=%2 Ty=%3 TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Crominanza - Rosso-Verde +TP_DIRPYRDENOISE_LABEL;Riduzione del rumore +TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Controllo della luminanza +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Curva di luminanza TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Dettaglio di Luminanza +TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminanza TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminanza +TP_DIRPYRDENOISE_MAIN_AUTO_GAIN;Compensazione per leggerezza +TP_DIRPYRDENOISE_MAIN_AUTO_GAIN_TOOLTIP;Modificare l'intensità della riduzione del rumore in base alla luminosità dell'immagine. L'intensità viene ridotta per le immagini scure e aumentata per le immagini luminose. TP_DIRPYRDENOISE_MAIN_COLORSPACE;Metodo TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;Lab TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;Per immagini raw può essere usato il metodo RGB o Lab.\n\nPer immagini non raw verrà utilizzato il metodo Lab, indipendentemente dalla selezione. TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Il gamma varia la forza della riduzione rumore su tutto l'intervallo di toni. Valori più piccoli incideranno sulle ombre, mentre valori maggiori estenderanno l'effetto ai toni più luminosi. +TP_DIRPYRDENOISE_MAIN_MODE;Modo +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressivo +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservativo +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;Il conservativo preserva i modelli di crominanza a bassa frequenza, mentre l'aggressivo li cancella. +TP_DIRPYRDENOISE_MEDIAN_METHOD;Metodo mediano +TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Solo crominanza +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Filtro mediano +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Solo luminanza +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;Quando si utilizzano i metodi "Solo luminanza" e "L*a*b*", il filtraggio mediano verrà eseguito subito dopo il passaggio wavelet nella pipeline di riduzione del rumore.\nQuando si utilizza la modalità "RGB", verrà eseguito proprio fine del gasdotto di riduzione del rumore. +TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Ponderato L* (poco) + a*b* (normale) +TP_DIRPYRDENOISE_MEDIAN_PASSES;Iterazioni mediane +TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;L'applicazione di tre iterazioni del filtro mediano con una dimensione della finestra 3×3 spesso porta a risultati migliori rispetto all'utilizzo di un'iterazione del filtro mediano con una dimensione della finestra 7×7. +TP_DIRPYRDENOISE_MEDIAN_TYPE;Tipo mediano +TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Applicare un filtro medio della dimensione della finestra desiderata. Maggiore è la dimensione della finestra, maggiore è il tempo necessario.\n\n3×3 soft: tratta 5 pixel in una finestra di 3×3 pixel.\n3×3: tratta 9 pixel in una finestra di 3×3 pixel.\n5×5 soft: tratta 13 pixel in una finestra da 5×5 pixel.\n5×5: tratta 25 pixel in una finestra da 5×5 pixel.\n7×7: tratta 49 pixel in una finestra da 7×7 pixel.\n9×9: tratta 81 pixel in una finestra di 9×9 pixel.\n\nA volte è possibile ottenere una qualità superiore eseguendo diverse iterazioni con una dimensione della finestra più piccola rispetto a un'iterazione con una più grande. +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;Algoritmo Pelle TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: più simile ai colori dell'incarnato, minimizzando l'azione di altri colori\nAmpio: evita ulteriori artefatti +TP_DIRPYREQUALIZER_ARTIF;Ridurre gli artefatti TP_DIRPYREQUALIZER_HUESKIN;Tonalità della Pelle TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;Questa piramide è per la parte superiore, con l'algoritmo alla sua massima efficienza.\nNella parte inferiore, le zone di transizione.\nSe devi muovere in modo significativo la zona verso destra o verso sinistra (o se ci sono artefatti): il bilanciamento del bianco è sbagliato\nPuoi ridurre leggermente la zona per evitare che la parte rimante dell'immagine ne sia influenzata TP_DIRPYREQUALIZER_LABEL;Contrasto per livelli di dettaglio (CbDL) @@ -921,16 +2502,19 @@ TP_DIRPYREQUALIZER_SKIN_TOOLTIP;A -100 i toni della pelle sono elaborati.\nA 0 t TP_DIRPYREQUALIZER_THRESHOLD;Soglia TP_DIRPYREQUALIZER_TOOLTIP;Tenta di ridurre gli artefatti dovuti alle transizioni tra colori (tonalità, croma, luma) dell'incarnato e del resto dell'immagine TP_DISTORTION_AMOUNT;Quantità +TP_DISTORTION_AUTO_TOOLTIP;Corregge automaticamente la distorsione dell'obiettivo nei file raw confrontandolo con l'immagine JPEG incorporata, se ne esiste una e la distorsione dell'obiettivo è stata corretta automaticamente dalla fotocamera. TP_DISTORTION_LABEL;Distorsione TP_EPD_EDGESTOPPING;Blocco ai Bordi +TP_EPD_GAMMA;Gamma TP_EPD_LABEL;Tone Mapping TP_EPD_REWEIGHTINGITERATES;Iterazioni di Ribilanciamento TP_EPD_SCALE;Scala -TP_EPD_STRENGTH;Forza +TP_EPD_STRENGTH;Intensità TP_EXPOSURE_AUTOLEVELS;Livelli automatici 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_CLAMPOOG;Ritaglia i colori fuori gamma TP_EXPOSURE_CLIP;Tosaggio % TP_EXPOSURE_CLIP_TOOLTIP;La frazione di pixel da tosare nell'operazione di livelli automatici. TP_EXPOSURE_COMPRHIGHLIGHTS;Compressione Alteluci @@ -941,14 +2525,42 @@ TP_EXPOSURE_CURVEEDITOR1;Curva Tono 1 TP_EXPOSURE_CURVEEDITOR2;Curva Tono 2 TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Fare riferimento alla pagina "Exposure > Tone Curves" di RawPedia per capire come ottenere i risultati migliori con le doppie curve. TP_EXPOSURE_EXPCOMP;Compensazione Esposizione +TP_EXPOSURE_HISTMATCHING;Curva di tono con abbinamento automatico +TP_EXPOSURE_HISTMATCHING_TOOLTIP;Regola automaticamente i cursori e le curve (eccetto la compensazione dell'esposizione) per adattarli all'aspetto della miniatura JPEG incorporata. TP_EXPOSURE_LABEL;Esposizione TP_EXPOSURE_SATURATION;Saturazione TP_EXPOSURE_TCMODE_FILMLIKE;Pellicola TP_EXPOSURE_TCMODE_LABEL1;Tipo Curva 1 TP_EXPOSURE_TCMODE_LABEL2;Tipo Curva 2 +TP_EXPOSURE_TCMODE_LUMINANCE;Luminanza +TP_EXPOSURE_TCMODE_PERCEPTUAL;Percentule TP_EXPOSURE_TCMODE_SATANDVALBLENDING;Fusione Saturazione/Valore TP_EXPOSURE_TCMODE_STANDARD;Standard TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Standard Pesata +TP_EXPOS_BLACKPOINT_LABEL;Raw Punto di nero +TP_EXPOS_WHITEPOINT_LABEL;Raw Punto di bianco +TP_FILMNEGATIVE_BLUE;Rapporto blu +TP_FILMNEGATIVE_BLUEBALANCE;Caldo/Freddo +TP_FILMNEGATIVE_COLORSPACE;Inversione spazio colore: +TP_FILMNEGATIVE_COLORSPACE_INPUT;Spazio colore in ingresso +TP_FILMNEGATIVE_COLORSPACE_TOOLTIP;Seleziona lo spazio colore utilizzato per eseguire l'inversione negativa:\nSpazio colore di input: esegue l'inversione prima che venga applicato il profilo di input, come nelle versioni precedenti di RT.\nSpazio colore di lavoro< /b>: esegue l'inversione dopo il profilo di input, utilizzando il profilo di lavoro attualmente selezionato. +TP_FILMNEGATIVE_COLORSPACE_WORKING;Spazio colore di lavoro +TP_FILMNEGATIVE_GREEN;Esponente di riferimento +TP_FILMNEGATIVE_GREENBALANCE;Magenta/Verde +TP_FILMNEGATIVE_GUESS_TOOLTIP;Imposta automaticamente i rapporti rosso e blu selezionando due patch che avevano una tonalità neutra (nessun colore) nella scena originale. Le patch dovrebbero differire in luminosità. +TP_FILMNEGATIVE_LABEL;Negativo Pellicola +TP_FILMNEGATIVE_OUT_LEVEL;Livelli di uscita +TP_FILMNEGATIVE_PICK;Scegli punti neutri +TP_FILMNEGATIVE_PICK_SIZE;Misura: +TP_FILMNEGATIVE_RED;Rapporto rosso +TP_FILMNEGATIVE_REF_LABEL;Ingresso RGB: %1 +TP_FILMNEGATIVE_REF_PICK;Scegli il punto di WB +TP_FILMNEGATIVE_REF_SIZE;Misura: +TP_FILMNEGATIVE_REF_TOOLTIP;Scegli una zona grigia per bilanciare il bianco dell'output, immagine positiva. +TP_FILMSIMULATION_LABEL;Simulazione pellicola +TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee è configurato per cercare immagini Hald CLUT, che vengono utilizzate per lo strumento Simulazione pellicola, in una cartella che impiega troppo tempo a caricarsi.\nVai su Preferenze > Elaborazione immagine > Simulazione pellicola\nper vedere quale cartella viene utilizzata. Dovresti indirizzare RawTherapee a una cartella che contiene solo immagini Hald CLUT e niente altro, oppure a una cartella vuota se non vuoi utilizzare lo strumento Simulazione film.\n\nLeggi l'articolo Simulazione film in RawPedia per maggiori informazioni. \n\nVuoi annullare la scansione adesso? +TP_FILMSIMULATION_STRENGTH;Intensità +TP_FILMSIMULATION_ZEROCLUTSFOUND;Imposta la directory HaldCLUT nelle Preferenze TP_FLATFIELD_AUTOSELECT;Autoselezione TP_FLATFIELD_BLURRADIUS;Raggio di sfocamento TP_FLATFIELD_BLURTYPE;Modalità di sfocamento @@ -956,6 +2568,9 @@ TP_FLATFIELD_BT_AREA;Area TP_FLATFIELD_BT_HORIZONTAL;Orizzontale TP_FLATFIELD_BT_VERTHORIZ;Vert. + Oriz. TP_FLATFIELD_BT_VERTICAL;Verticale +TP_FLATFIELD_CLIPCONTROL;Controllo della clip +TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Il controllo clip evita le evidenziazioni ritagliate causate dall'applicazione del flat field. Se sono già presenti luci ritagliate prima dell'applicazione del flat field, viene utilizzato il valore 0. +TP_FLATFIELD_FROMMETADATA;Da Metadata TP_FLATFIELD_LABEL;Flat Field TP_GENERAL_11SCALE_TOOLTIP;L'effetto di questo strumento è visibile solo (o è accurato solo) con l'anteprima in scala 1:1. TP_GRADIENT_CENTER;Centro @@ -968,12 +2583,15 @@ TP_GRADIENT_DEGREE_TOOLTIP;Angolo di rotazione in gradi. TP_GRADIENT_FEATHER;Scia TP_GRADIENT_FEATHER_TOOLTIP;Ampiezza del gradiente in percento della diagonale dell'immagine. TP_GRADIENT_LABEL;Filtro Graduato -TP_GRADIENT_STRENGTH;Forza -TP_GRADIENT_STRENGTH_TOOLTIP;Forza del filtro in stop. +TP_GRADIENT_STRENGTH;intensità +TP_GRADIENT_STRENGTH_TOOLTIP;intensità del filtro in stop. TP_HLREC_BLEND;Fusione TP_HLREC_CIELAB;Fusione in CIELab TP_HLREC_COLOR;Propagazione di crominanza +TP_HLREC_COLOROPP;Riverniciare opposto TP_HLREC_ENA_TOOLTIP;Può essere attivato dai Livelli Automatici. +TP_HLREC_HLBLUR;Sfoca +TP_HLREC_HLTH;Soglia di guadagno TP_HLREC_LABEL;Ricostruzione Alteluci TP_HLREC_LUMINANCE;Recupero di Luminanza TP_HLREC_METHOD;Metodo: @@ -982,9 +2600,19 @@ TP_HSVEQUALIZER_HUE;H TP_HSVEQUALIZER_LABEL;Equalizzatore HSV TP_HSVEQUALIZER_SAT;S TP_HSVEQUALIZER_VAL;V +TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Esposizione di base +TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Utilizzare la compensazione dell'esposizione di base DCP incorporata. L'impostazione è disponibile solo se il DCP selezionato ne ha uno. +TP_ICM_APPLYHUESATMAP;Tabella base +TP_ICM_APPLYHUESATMAP_TOOLTIP;Utilizza la tabella base DCP incorporata (HueSatMap). L'impostazione è disponibile solo se il DCP selezionato ne ha uno. +TP_ICM_APPLYLOOKTABLE;Guarda la tabella +TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is only available if the selected DCP has one. +TP_ICM_BPC;Compensazione punto di nero TP_ICM_DCPILLUMINANT;Illuminazione TP_ICM_DCPILLUMINANT_INTERPOLATED;Interpolato TP_ICM_DCPILLUMINANT_TOOLTIP;Seleziona il DCP del tipo di illuminazione da utilizzare. Il predefinito è "interpolato", un mix tra i due basato sul bilanciamento del bianco. Questa impostazione è abilitata solo se è selezionato Doppia Illuminazione con supporto interpolato. +TP_ICM_FBW;Bianco e Nero +TP_ICM_GAMUT;Controllo della gamma +TP_ICM_ILLUMPRIM_TOOLTIP;Scegli l'illuminante più vicino alle condizioni di ripresa.\nLe modifiche possono essere apportate solo quando la selezione "Destinazione primarie" è impostata su "Personalizzato (cursori)". TP_ICM_INPUTCAMERA;Predefinito della fotocamera TP_ICM_INPUTCAMERAICC;Specifico della fotocamera TP_ICM_INPUTCAMERAICC_TOOLTIP;Utilizza i profili colore di ingresso DCP o ICC di RawTherapee specifici per la fotocamera. Questi profili sono più precisi dei semplici matrix. Non sono però disponibili per tutte le fotocamere. Questi profili sono archiviati nelle cartelle /iccprofiles/input e /dcpprofiles e sono recuperati automaticamente in base all'esatta corrispondenza tra nome del file e modello di fotocamera. @@ -998,16 +2626,70 @@ TP_ICM_INPUTNONE;Nessun profilo TP_ICM_INPUTNONE_TOOLTIP;Non applicare un profilo colore.\nDa utilizzare solo in casi particolari. TP_ICM_INPUTPROFILE;Profilo di ingresso TP_ICM_LABEL;Gestione Colore +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;Ripristina TP_ICM_NOICM;Nessun ICM: uscita in sRGB TP_ICM_OUTPUTPROFILE;Profilo di Uscita +TP_ICM_OUTPUTPROFILE_TOOLTIP;Per impostazione predefinita tutti i profili RTv4 o RTv2 sono con TRC - sRGB: g=2.4 s=12.92\n\nCon 'ICC Profile Creator' puoi generare profili v4 o v2 con le seguenti scelte;\n-Primarie: Aces AP0, Aces AP1 , AdobeRGB, Prophoto, Rec2020, sRGB, Widegamut, BestRGB, BetaRGB, BruceRGB, Personalizzato\n-TRC: BT709, sRGB, lineare, standard g=2,2, standard g=1,8, Personalizzato\n-Illuminante: D41, D50, D55 , D60, D65, D80, standard A 2856K +TP_ICM_PRIMBLU_TOOLTIP;Blu primari:\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;Verde primario:\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\n ASSI 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\nMigliore RGB x=0,2150 0,7750 +TP_ICM_PRIMILLUM_TOOLTIP;È possibile modificare un'immagine dalla modalità originale ("profilo di lavoro") a una modalità diversa ("primarie di destinazione"). Quando scegli una modalità colore diversa per un'immagine, modifichi in modo permanente i valori del colore nell'immagine.\n\nCambiare i "primari" è piuttosto complesso e difficile da usare. Richiede molta sperimentazione.\n È in grado di apportare regolazioni esotiche ai colori come primari del Mixer canali.\n Consente di modificare la calibrazione della fotocamera con personalizzazione (cursori). +TP_ICM_PRIMRED_TOOLTIP;Rosso primario:\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;Intento di rendering +TP_ICM_REDFRAME;Primarie personalizzate +TP_ICM_SAVEREFERENCE;Salva immagine di riferimento +TP_ICM_SAVEREFERENCE_APPLYWB;Applicare il bilanciamento del bianco +TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;In genere, applicare il bilanciamento del bianco quando si salvano le immagini per creare profili ICC e non applicare il bilanciamento del bianco per creare profili DCP. TP_ICM_SAVEREFERENCE_TOOLTIP;Salva l'immagine TIFF lineare prima che sia applicato il profilo colore. Il risultato può essere utilizzato per la calibrazione e generazione del profilo della fotocamera. TP_ICM_TONECURVE;Usa la curva tono del DCP TP_ICM_TONECURVE_TOOLTIP;Utilizza le curve tono incluse nel DCP. Questa opzione è abilitata solo se il DCP selezionato possiede una curva tono. +TP_ICM_TRCFRAME;Profilo astratto +TP_ICM_TRCFRAME_TOOLTIP;Noti anche come profili "sintetici" o "virtuali", che vengono applicati alla fine della pipeline di elaborazione (prima di ciecam) consentendo di creare effetti immagine personalizzati.\nÈ possibile apportare modifiche a:\n "Curva di risposta tonale" , che modifica i toni dell'immagine.\n 'Illuminante': che permette di modificare i primari del profilo per adattarli alle condizioni di ripresa.\n 'Primari di destinazione': che permette di modificare i primari di destinazione con due utilizzi principali - mixer canali e calibrazione.\nNota: i profili astratti tengono conto dei profili di lavoro integrati senza modificarli. Non funzionano con i profili di lavoro personalizzati. +TP_ICM_TRC_TOOLTIP;Ti consente di modificare la "curva di risposta tonale" sRGB predefinita in RT (g=2,4 s=12,92).\nQuesto TRC modifica i toni dell'immagine. I valori RGB e Lab, l'istogramma e l'output (schermo, TIF, JPG) vengono modificati:\n-Gamma agisce principalmente sui toni chiari -Slope agisce principalmente sui toni scuri.\nPuoi scegliere qualsiasi coppia di 'gamma e pendenza' (valori >1) e l'algoritmo garantirà che vi sia continuità tra le parti lineari e paraboliche della curva.\nUna selezione diversa da "nessuno" attiva i menu "Illuminante" e "Destinazione primari". TP_ICM_WORKINGPROFILE;Profilo di lavoro +TP_ICM_WORKING_CIEDIAG;Diagramma xy di CIE +TP_ICM_WORKING_ILLU;Illuminante +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;Default +TP_ICM_WORKING_ILLU_STDA;stdA 2875K +TP_ICM_WORKING_PRESER;Preserva i toni pastello +TP_ICM_WORKING_PRIM;Destinatione primaria +TP_ICM_WORKING_PRIMFRAME_TOOLTIP;Quando è selezionato 'Diagramma xy CIE personalizzato' nella casella combinata 'Destinazione- primarie', è possibile modificare i valori dei 3 primari direttamente sul grafico.\nNota che in questo caso, la posizione del punto bianco sul grafico non verrà aggiornata . +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_JDCMAX;JDC Max +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;Ampia gamma +TP_ICM_WORKING_TRC;Curva di risposta tonale: +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;Lineare g=1 +TP_ICM_WORKING_TRC_NONE;Nessuno +TP_ICM_WORKING_TRC_SLOPE;Pendenza +TP_ICM_WORKING_TRC_SRGB;sRGB g=2.4 s=12.92 +TP_ICM_WORKING_TRC_TOOLTIP;Solo per profili integrati. TP_IMPULSEDENOISE_LABEL;Riduzione Rumore Puntuale TP_IMPULSEDENOISE_THRESH;Soglia -TP_LABCURVE_AVOIDCOLORSHIFT;Evita il color shift -TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Adatta i colori all'interno del gamut dello spazio colore di lavoro e applica la correzione Munsell. TP_LABCURVE_BRIGHTNESS;Luminosità TP_LABCURVE_CHROMATICITY;Cromaticità TP_LABCURVE_CHROMA_TOOLTIP;Per applicare il toning BN impostare la Cromaticità a -100. @@ -1046,40 +2728,974 @@ TP_LABCURVE_RSTPRO_TOOLTIP;Può essere utilizzato con il cursore Cromaticità e TP_LENSGEOM_AUTOCROP; Ritaglio automatico TP_LENSGEOM_FILL;Adattamento automatico TP_LENSGEOM_LABEL;Obiettivo/Geometria +TP_LENSGEOM_LIN;Lineare +TP_LENSGEOM_LOG;Logaritmico +TP_LENSPROFILE_CORRECTION_AUTOMATCH;Selezione Automatica +TP_LENSPROFILE_CORRECTION_LCPFILE;File LCP +TP_LENSPROFILE_CORRECTION_MANUAL;Selezione Manuale TP_LENSPROFILE_LABEL;Profilo di Correzione dell'Obiettivo +TP_LENSPROFILE_LENS_WARNING;Attenzione: il fattore di crop utilizzato per la profilazione dell'obiettivo è maggiore del fattore di crop della fotocamera, i risultati potrebbero essere errati. +TP_LENSPROFILE_MODE_HEADER;Profilo lenti +TP_LENSPROFILE_USE_CA;Aberrazione Cromatica +TP_LENSPROFILE_USE_GEOMETRIC;Distorsione geometrica +TP_LENSPROFILE_USE_HEADER;Correzione +TP_LENSPROFILE_USE_VIGNETTING;Vignettatura +TP_LOCALCONTRAST_AMOUNT;Quantità +TP_LOCALCONTRAST_DARKNESS;Livello durezza +TP_LOCALCONTRAST_LABEL;Contrasto locale +TP_LOCALCONTRAST_LIGHTNESS;Livello di luminosità +TP_LOCALCONTRAST_RADIUS;Raggio +TP_LOCALLAB_ACTIV;Solo Luminanza +TP_LOCALLAB_ACTIVSPOT;Abilita Spot +TP_LOCALLAB_ADJ;Equalizzatore Colore +TP_LOCALLAB_AMOUNT;Quantità +TP_LOCALLAB_ARTIF;Rilevamento della forma +TP_LOCALLAB_ARTIF_TOOLTIP;La soglia dell'ambito ΔE aumenta la portata dell'ambito ΔE. I valori elevati si riferiscono a immagini con una gamma molto ampia.\nL'aumento del decadimento ΔE può migliorare il rilevamento della forma, ma può anche ridurre l'ambito. +TP_LOCALLAB_AUTOGRAY;Luminanza media automatica (Yb%) +TP_LOCALLAB_AUTOGRAYCIE;Auto +TP_LOCALLAB_AVOID;Evita il cambiamento di colore +TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Adatta i colori alla gamma dello spazio colore di lavoro e applica la correzione Munsell (Uniform Perceptual Lab).\nLa correzione Munsell è sempre disabilitata quando si utilizza Jz o CAM16 o Aspetto colore e illuminazione.\n\nPredefinito: Munsell.\nCorrezione Munsell: corregge la modalità Lab la tonalità si sposta a causa della non linearità, quando la cromaticità viene modificata (Uniform Perceptual Lab).\nLab: applica un controllo della gamma, in colorimetrico relativo, viene quindi applicato Munsell.\nXYZ Assoluto, applica il controllo della gamma, in colorimetrico assoluto, viene quindi applicato Munsell. applicato.\nXYZ Relativo, applica il controllo gamma, in colorimetrico relativo, viene quindi applicato Munsell. +TP_LOCALLAB_AVOIDMUN;Solo correzione Munsell +TP_LOCALLAB_AVOIDMUN_TOOLTIP;La correzione Munsell è sempre disabilitata quando si utilizza Jz o CAM16. +TP_LOCALLAB_AVOIDRAD;Raggio Morbido +TP_LOCALLAB_BALAN;ab-L bilanciato (ΔE) +TP_LOCALLAB_BALANEXP;Bilanciamento Laplacian +TP_LOCALLAB_BALANH;C-H bilanciato (ΔE) +TP_LOCALLAB_BALAN_TOOLTIP;Modifica i parametri dell'algoritmo ΔE.\nPrende in considerazione più o meno a*b* o L*, o più o meno C o H.\nNon per Denoise. +TP_LOCALLAB_BASELOG;Intervallo delle ombre (base logaritmica) +TP_LOCALLAB_BILATERAL;Filtro bilateralte +TP_LOCALLAB_BLACK_EV;Compensazione dell'esposizione dei neri +TP_LOCALLAB_BLCO;Solo crominanza +TP_LOCALLAB_BLENDMASKCOL;Miscela +TP_LOCALLAB_BLENDMASKMASK;Aggiungi/sottrai la maschera luminanza +TP_LOCALLAB_BLENDMASKMASKAB;Aggiungi/sottrai la maschera crominanza +TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;Se questo cursore = 0 nessuna azione.\nAggiungi o sottrai la maschera dall'immagine originale. +TP_LOCALLAB_BLENDMASK_TOOLTIP;Se fusione = 0 viene migliorato solo il rilevamento della forma.\nSe fusione > 0 la maschera viene aggiunta all'immagine. Se la mescola < 0 la maschera viene sottratta dall'immagine. +TP_LOCALLAB_BLGUID;Filtro guidato +TP_LOCALLAB_BLINV;Inverso +TP_LOCALLAB_BLLC;Luminanza e Crominanza +TP_LOCALLAB_BLLO;Solo Luminanza +TP_LOCALLAB_BLMED;Mediano +TP_LOCALLAB_BLMETHOD_TOOLTIP;Normale: sfocatura e rumore diretti con tutte le impostazioni.\nInverso: sfocatura e rumore con tutte le impostazioni. Attenzione, alcune impostazioni potrebbero dare risultati curiosi. +TP_LOCALLAB_BLNOI_EXP;Sfocatura e rumore +TP_LOCALLAB_BLNORM;Normale +TP_LOCALLAB_BLUFR;Sfocatura/grana e riduzione rumore +TP_LOCALLAB_BLUMETHOD_TOOLTIP;Per sfocare lo sfondo e isolare il primo piano:\n-sfoca lo sfondo coprendo completamente l'immagine con un punto (valori elevati per ambito e transizione e 'Normale' o 'Inverso' nella casella di controllo).\n-Isola il primo piano utilizzando uno o più punti 'Esclusioni' e aumentare l'ambito.\n\nQuesto modulo (incluso il 'mediano' e il 'Filtro guidato') può essere utilizzato in aggiunta alla riduzione del rumore nel menu principale. +TP_LOCALLAB_BLUR;Sfocatura gaussiana - Rumore - Grana +TP_LOCALLAB_BLURCOL;Raggio +TP_LOCALLAB_BLURCOLDE_TOOLTIP;L'immagine utilizzata per calcolare ΔE è leggermente sfocata per evitare di prendere in considerazione i pixel isolati. +TP_LOCALLAB_BLURDE;Rilevamento della forma sfocata +TP_LOCALLAB_BLURLC;Solo luminanza +TP_LOCALLAB_BLURLEVELFRA;Livello di sfocatura +TP_LOCALLAB_BLURMASK_TOOLTIP;Utilizza una sfocatura ad ampio raggio per creare una maschera che consente di variare il contrasto dell'immagine e/o scurire/schiarire parti di essa. +TP_LOCALLAB_BLURRMASK_TOOLTIP;Permette di variare il 'raggio' della sfocatura gaussiana (da 0 a 1000). +TP_LOCALLAB_BLUR_TOOLNAME;Sfocatura/grana e riduzione rumore +TP_LOCALLAB_BLWH;Tutti i cambiamenti forzati in bianco e nero +TP_LOCALLAB_BLWH_TOOLTIP;Forza i componenti del colore 'a' e 'b' a zero.\nUtile per l'elaborazione in bianco e nero o la simulazione di film. +TP_LOCALLAB_BUTTON_ADD;Aggiungi +TP_LOCALLAB_BUTTON_DEL;Elimina +TP_LOCALLAB_BUTTON_DUPL;Duplica +TP_LOCALLAB_BUTTON_REN;Rinomina +TP_LOCALLAB_BUTTON_VIS;Mostra/Nascondi +TP_LOCALLAB_BWFORCE;Usa la compensazione dell'esposizione dei neri e la compensazione dell'esposizione dei bianchi +TP_LOCALLAB_CAM16PQREMAP;HDR PQ (Luminanza di picco) +TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;PQ (quantizzatore percettivo) adattato al CAM16. Consente di modificare la funzione PQ interna (solitamente 10000 cd/m2 - predefinito 100 cd/m2 - disabilitato per 100 cd/m2).\nPuò essere utilizzato per adattarsi a diversi dispositivi e immagini. +TP_LOCALLAB_CAM16_FRA;Regolazioni dell'immagine Cam16 +TP_LOCALLAB_CAMMODE;Modello CAM +TP_LOCALLAB_CAMMODE_CAM16;CAM 16 +TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz +TP_LOCALLAB_CATAD;Adattamento cromatico/Cat16 +TP_LOCALLAB_CBDL;Contrasto per livelli di dettaglio +TP_LOCALLAB_CBDLCLARI_TOOLTIP;Migliora il contrasto locale dei mezzitoni. +TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Come le wavelet.\nIl primo livello (0) agisce su dettagli di 2x2 pixel.\nL'ultimo livello (5) agisce su dettagli di 64x64 pixel. +TP_LOCALLAB_CBDL_THRES_TOOLTIP;Previene l'acutizzazione del rumore. +TP_LOCALLAB_CBDL_TOOLNAME;Contrasto per livelli di dettaglio +TP_LOCALLAB_CENTER_X;Centra X +TP_LOCALLAB_CENTER_Y;Centra Y +TP_LOCALLAB_CH;CL - LC +TP_LOCALLAB_CHRO46LABEL;Livelli di crominanza 456: Medio=%1 Alto=%2 +TP_LOCALLAB_CHROLABEL;Livelli di crominanza 0123: Medio=%1 Alto=%2 +TP_LOCALLAB_CHROMA;Crominanza +TP_LOCALLAB_CHROMABLU;Livelli di crominanza +TP_LOCALLAB_CHROMABLU_TOOLTIP;Aumenta o riduce l'effetto a seconda delle impostazioni di luminanza.\nI valori inferiori a 1 riducono l'effetto. Valori maggiori di 1 aumentano l'effetto. +TP_LOCALLAB_CHROMACBDL;Crominanza +TP_LOCALLAB_CHROMACB_TOOLTIP;Aumenta o riduce l'effetto a seconda delle impostazioni di luminanza.\nI valori inferiori a 1 riducono l'effetto. Valori maggiori di 1 aumentano l'effetto. +TP_LOCALLAB_CHROMALEV;Livelli di crominanza +TP_LOCALLAB_CHROMASKCOL;Crominanza +TP_LOCALLAB_CHROMASK_TOOLTIP;Cambia la crominanza della maschera se ne esiste una (cioè C(C) o LC(H) è attivato). +TP_LOCALLAB_CHROML;Crominanza (C) +TP_LOCALLAB_CHRRT;Crominanza +TP_LOCALLAB_CIE;Aspetto del colore (Cam16 & JzCzHz) +TP_LOCALLAB_CIEC;Utilizza i parametri dell'ambiente CIECAM +TP_LOCALLAB_CIECAMLOG_TOOLTIP;Questo modulo si basa sul modello di aspetto del colore CIECAM che è stato progettato per simulare meglio il modo in cui la visione umana percepisce i colori in diverse condizioni di illuminazione.\nIl primo processo Ciecam 'Condizioni di scena' viene eseguito mediante codifica Log, utilizza anche 'Luminanza assoluta' a l'ora dello scatto.\nIl secondo processo Ciecam 'Regolazioni immagine' è semplificato e utilizza solo 3 variabili (contrasto locale, contrasto J, saturazione s).\nIl terzo processo Ciecam 'Condizioni di visualizzazione' adatta l'output alle condizioni di visualizzazione previste ( monitor, TV, proiettore, stampante, ecc.) in modo che l'aspetto cromatico e di contrasto venga preservato in tutto l'ambiente di visualizzazione. +TP_LOCALLAB_CIECOLORFRA;Colore +TP_LOCALLAB_CIECONTFRA;Contrasto +TP_LOCALLAB_CIELIGHTCONTFRA;Illuminazione e contrasto +TP_LOCALLAB_CIELIGHTFRA;Illuminazione +TP_LOCALLAB_CIEMODE;Modificare la posizione dello strumento +TP_LOCALLAB_CIEMODE_COM;Default +TP_LOCALLAB_CIEMODE_DR;Gamma dinamica +TP_LOCALLAB_CIEMODE_TM;Mappatura dei toni +TP_LOCALLAB_CIEMODE_TOOLTIP;Nella modalità predefinita, Ciecam viene aggiunto alla fine del processo. 'Maschera e modifiche' e 'Recupero basato sulla maschera di luminanza' sono disponibili per'Cam16 e JzCzHz' a tua disposizione.\nPuoi anche integrare Ciecam in altri strumenti se lo desideri (TM, Wavelet, Dynamic Range, Log Encoding). I risultati per questi strumenti saranno diversi rispetto a quelli senza Ciecam. In questa modalità è anche possibile utilizzare 'Maschera e modifiche' e 'Ripristino basato sulla maschera di luminanza'. +TP_LOCALLAB_CIEMODE_WAV;Wavelet +TP_LOCALLAB_CIETOOLEXP;Curve +TP_LOCALLAB_CIE_TOOLNAME;Aspetto del colore (Cam16 & JzCzHz) +TP_LOCALLAB_CIRCRADIUS;Dimensione del punto +TP_LOCALLAB_CIRCRAD_TOOLTIP;Contiene i riferimenti della macchia, utili per il rilevamento della forma (tonalità, luminanza, crominanza, Sobel).\bValori bassi possono essere utili per l'elaborazione del fogliame.\Valori alti possono essere utili per l'elaborazione della pelle. +TP_LOCALLAB_CLARICRES;Unisci crominanza +TP_LOCALLAB_CLARIFRA;Maschera Chiarezza e Nitidezza/Unisci e ammorbidisci le immagini +TP_LOCALLAB_CLARIJZ_TOOLTIP;Livelli da 0 a 4 (inclusi): 'Maschera nitida' è abilitata\nLivelli 5 e superiori: 'Chiarezza' è abilitata. +TP_LOCALLAB_CLARILRES;Unisci luminanza +TP_LOCALLAB_CLARISOFT;Raggio morbido +TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;Il dispositivo di scorrimento "Raggio morbido" (algoritmo di filtro guidato) riduce gli aloni e le irregolarità per Chiarezza, Maschera nitida e Wavelet di contrasto locale Jz. +TP_LOCALLAB_CLARISOFT_TOOLTIP;Il cursore 'Raggio morbido' (algoritmo di filtro guidato) riduce gli aloni e le irregolarità per Chiarezza, Maschera nitida e tutti i processi piramidali wavelet. Per disattivare, impostare il cursore su zero. +TP_LOCALLAB_CLARITYML;Clarity +TP_LOCALLAB_CLARI_TOOLTIP;Livelli da 0 a 4 (inclusi): 'Maschera nitida' è abilitata\nLivelli 5 e superiori: 'Chiarezza' è abilitata.\nUtile se si utilizza la 'Mappatura toni livello Wavelet'. +TP_LOCALLAB_CLIPTM;Clip dei dati ripristinati (guadagno) +TP_LOCALLAB_COFR;Colore e luce +TP_LOCALLAB_COLORDE;ΔE anteprima colore - intensità +TP_LOCALLAB_COLORDEPREV_TOOLTIP;Il pulsante Anteprima ΔE funzionerà solo se hai attivato uno (e solo uno) degli strumenti nel menu 'Aggiungi strumento al punto corrente'.\nPer poter visualizzare l'anteprima ΔE con diversi strumenti abilitati, usa Maschera e modifiche - Anteprima ΔE. +TP_LOCALLAB_COLORDE_TOOLTIP;Mostra un'anteprima di colore blu per la selezione ΔE se negativa e verde se positiva.\n\nMaschera e modifiche (mostra aree modificate senza maschera): mostra le modifiche effettive se positive, mostra le modifiche migliorate (solo luminanza) con blu e giallo se negative. +TP_LOCALLAB_COLORSCOPE;Ambito (strumenti colore) +TP_LOCALLAB_COLORSCOPE_TOOLTIP;Cursore di ambito comune per Colore e luce, Ombre/Alte luci, Vividezza.\nAltri strumenti hanno i propri controlli di ambito. +TP_LOCALLAB_COLOR_CIE;Curva colore +TP_LOCALLAB_COLOR_TOOLNAME;Colore e luce +TP_LOCALLAB_COL_NAME;Nome +TP_LOCALLAB_COL_VIS;Stato +TP_LOCALLAB_COMPFRA;Contrasto direzionale +TP_LOCALLAB_COMPREFRA;Mappatura dei toni del livello wavelet +TP_LOCALLAB_CONTCOL;Soglia di contrasto +TP_LOCALLAB_CONTFRA;Livello di contrasto +TP_LOCALLAB_CONTRAST;Contrasto +TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Ti permette di cambiare liberamente il contrasto della maschera.\n Ha una funzione simile ai cursori Gamma e Pendenza.\n Ti permette di individuare alcune parti dell'immagine (solitamente le parti più chiare della maschera utilizzando la curva per escludere le parti più scure). Può creare artefatti. +TP_LOCALLAB_CONTRESID;Contrasto +TP_LOCALLAB_CONTTHMASK_TOOLTIP;Consente di determinare quali parti dell'immagine verranno interessate in base alla texture. +TP_LOCALLAB_CONTTHR;Soglia di contrasto +TP_LOCALLAB_CONTWFRA;Contrasto locale +TP_LOCALLAB_CSTHRESHOLD;Livelli di Wavelet +TP_LOCALLAB_CSTHRESHOLDBLUR;Selezione del livello wavelet +TP_LOCALLAB_CURV;LighQualità - Contrasto - Crominanza 'Super' +TP_LOCALLAB_CURVCURR;Normale +TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;Se le curve sono in alto, la maschera è completamente nera e non viene apportata alcuna modifica all'immagine.\nMan mano che si abbassa la curva, la maschera diventa gradualmente più colorata e luminosa, modificando progressivamente l'immagine.\n\nSi consiglia ( ma non obbligatorio) posizionare la parte superiore delle curve sulla linea di confine grigia che rappresenta i valori di riferimento di crominanza, luminanza, tonalità per lo spot. +TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;Se le curve sono in alto, la maschera è completamente nera e non viene apportata alcuna modifica all'immagine.\nMan mano che si abbassa la curva, la maschera diventa gradualmente più colorata e luminosa, cambiando progressivamente l'immagine.\n\nÈ consigliato (ma (non obbligatorio) posizionare la parte superiore delle curve sulla linea di confine grigia che rappresenta i valori di riferimento di crominanza, luminanza, tonalità per lo spot. +TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;Per attivare le curve, impostare la casella combinata 'Tipo di curva' su 'Normale'. +TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Curva del tono +TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), può essere utilizzato con L(H) in Colore e Luce. +TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normale', la curva L=f(L) utilizza lo stesso algoritmo del cursore della luminosità. +TP_LOCALLAB_CURVES_CIE;Curva del tono +TP_LOCALLAB_CURVNONE;Disabilita curve +TP_LOCALLAB_DARKRETI;Durezza +TP_LOCALLAB_DEHAFRA;Rimouovi foschia +TP_LOCALLAB_DEHAZ;Intensità +TP_LOCALLAB_DEHAZE_BLACK;Nero +TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Rimuove la foschia atmosferica. Aumenta la saturazione e il dettaglio complessivi.\nPuò rimuovere dominanti di colore, ma può anche introdurre una dominante blu che può essere corretta con altri strumenti. +TP_LOCALLAB_DEHAZ_TOOLTIP;I valori negativi aggiungono foschia. +TP_LOCALLAB_DELTAD;Equilibrio delta +TP_LOCALLAB_DELTAEC;ΔE Maschera immagine +TP_LOCALLAB_DENOI1_EXP;Riduzione rumore basato sulla maschera di luminanza +TP_LOCALLAB_DENOI2_EXP;Recupero basato sulla maschera di luminanza +TP_LOCALLAB_DENOIBILAT_TOOLTIP;Consente di ridurre il rumore impulsivo o "sale e pepe". +TP_LOCALLAB_DENOICHROC_TOOLTIP;Ti consente di gestire macchie e pacchetti di rumore. +TP_LOCALLAB_DENOICHRODET_TOOLTIP;Permette di recuperare il dettaglio della crominanza applicando progressivamente una trasformata di Fourier (DCT). +TP_LOCALLAB_DENOICHROF_TOOLTIP;Consente di regolare il rumore della crominanza nei minimi dettagli. +TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Consente di indirizzare la riduzione del rumore cromatico verso i colori blu-giallo o rosso-verde. +TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Consente di effettuare una riduzione maggiore o minore del rumore sia nelle ombre che nelle luci. +TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Permette di recuperare il dettaglio della luminanza applicando progressivamente una trasformata di Fourier (DCT). +TP_LOCALLAB_DENOIMASK;Ruzione rumore maschera di crominanza +TP_LOCALLAB_DENOIMASK_TOOLTIP;Per tutti gli strumenti, consente di controllare il livello di rumore cromatico della maschera.\nUtile per un migliore controllo della crominanza e per evitare artefatti quando si utilizza la curva LC(h). +TP_LOCALLAB_DENOIQUA_TOOLTIP;La modalità conservativa preserva i dettagli a bassa frequenza. La modalità aggressiva rimuove i dettagli a bassa frequenza.\nLe modalità conservativa e aggressiva utilizzano wavelet e DCT e possono essere utilizzate insieme a "Mezzi non locali – Luminanza". +TP_LOCALLAB_DENOITHR_TOOLTIP;Regola il rilevamento dei bordi per ridurre il rumore nelle aree uniformi e a basso contrasto. +TP_LOCALLAB_DENOIWAVCH;Wavelets: Crominanza +TP_LOCALLAB_DENOIWAVLUM;Wavelets: Luminanza +TP_LOCALLAB_DENOI_EXP;Riduzione rumore +TP_LOCALLAB_DENOI_TOOLTIP;Questo modulo può essere utilizzato per la riduzione del rumore da solo (alla fine della pipeline di elaborazione) o in aggiunta al modulo Riduzione del rumore nella scheda Dettagli (che funziona all'inizio della pipeline).\n L'ambito ti consente di differenziare l'azione in base al colore (ΔE).\nDimensione minima dello spot: 128x128. +TP_LOCALLAB_DEPTH;Profondità +TP_LOCALLAB_DETAIL;Contrasto locale +TP_LOCALLAB_DETAILFRA;Rilevamento dei bordi - DCT +TP_LOCALLAB_DETAILSH;Dettagli +TP_LOCALLAB_DETAILTHR;Soglia dettaglio Luminanza/Crominanza +TP_LOCALLAB_DIVGR;Gamma +TP_LOCALLAB_DUPLSPOTNAME;Copia +TP_LOCALLAB_EDGFRA;Nitidezza dei bordi +TP_LOCALLAB_EDGSHOW;Mostra tutti gli strumenti +TP_LOCALLAB_ELI;Ellisse +TP_LOCALLAB_ENABLE_AFTER_MASK;Utilizza la mappatura dei toni +TP_LOCALLAB_ENABLE_MASK;Abilita maschera +TP_LOCALLAB_ENABLE_MASKAFT;Utilizza tutti gli algoritmi di esposizione +TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;Se abilitata, la maschera utilizza i dati ripristinati dopo la mappa di trasmissione invece dei dati originali. +TP_LOCALLAB_ENH;Migliorato +TP_LOCALLAB_ENHDEN;Migliorato + riduzione rumore cromatico +TP_LOCALLAB_EPSBL;Dettagli +TP_LOCALLAB_EQUIL;Normalizza la luminanza +TP_LOCALLAB_EQUILTM_TOOLTIP;Ricostruire la luminanza in modo che la media e la varianza dell'immagine di output siano identiche a quelle dell'originale. +TP_LOCALLAB_ESTOP;Arresto sul bordo +TP_LOCALLAB_EV_DUPL;Copia di +TP_LOCALLAB_EV_NVIS;Nascondi +TP_LOCALLAB_EV_NVIS_ALL;Nascondi tutto +TP_LOCALLAB_EV_VIS;Mostra +TP_LOCALLAB_EV_VIS_ALL;Mostra tutto +TP_LOCALLAB_EXCLUF;Escluso +TP_LOCALLAB_EXCLUF_TOOLTIP;La modalità 'Esclusione' impedisce ai punti adiacenti di influenzare alcune parti dell'immagine. La regolazione di 'Ambito' estenderà la gamma di colori.\n Puoi anche aggiungere strumenti a un punto di esclusione e utilizzarli come per un punto normale. +TP_LOCALLAB_EXCLUTYPE;Metodo Spot +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;Escluso spot +TP_LOCALLAB_EXFULL;Immagine piena +TP_LOCALLAB_EXNORM;Spot normale +TP_LOCALLAB_EXPCBDL_TOOLTIP;Può essere utilizzato per rimuovere segni sul sensore o sull'obiettivo riducendo il contrasto ai livelli di dettaglio appropriati. +TP_LOCALLAB_EXPCHROMA;Compensazione cromatica +TP_LOCALLAB_EXPCHROMA_TOOLTIP;Utilizzare insieme a 'Compensazione dell'esposizione f' e 'Attenuatore contrasto f' per evitare la desaturazione dei colori. +TP_LOCALLAB_EXPCOLOR_TOOLTIP;Regola colore, luminosità, contrasto e correggi piccoli difetti come occhi rossi, polvere del sensore, ecc. +TP_LOCALLAB_EXPCOMP;Compensazione dell'esposizione ƒ +TP_LOCALLAB_EXPCOMPINV;Compensazione dell'esposizione +TP_LOCALLAB_EXPCOMP_TOOLTIP;Per ritratti o immagini con una bassa sfumatura di colore. Puoi modificare il "Rilevamento della forma" in "Impostazioni":\n\nAumenta la "Soglia ambito ΔE"\nRiduci il "Decadimento ΔE"\nAumenta il "Bilanciamento ab-L (ΔE)" +TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;Consulta la documentazione per i Livelli Wavelet.\nCi sono alcune differenze nella versione Regolazioni Locali, che ha più strumenti e più possibilità per lavorare su livelli di dettaglio individuali.\nEs. mappatura dei toni a livello wavelet. +TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Evita punti troppo piccoli (< 32x32 pixel).\nUtilizza un 'Valore di transizione' basso e un 'Decadimento della transizione' e un''Ambito' alti per simulare piccoli punti e gestire i difetti.\nUtilizza la maschera Chiarezza e Nitidezza e Fondi e ammorbidisci immagini ' se necessario regolando 'Raggio morbido' per ridurre gli artefatti. +TP_LOCALLAB_EXPCURV;Curve +TP_LOCALLAB_EXPGRAD;Filtro graduato +TP_LOCALLAB_EXPGRADCOL_TOOLTIP;Un filtro graduato è disponibile in Colore e Luce (luminanza, crominanza e gradienti di tonalità e "Unisci file"), Esposizione (grado di luminanza), Maschera esposizione (grado di luminanza), Ombre/Alte luci (grado di luminanza), Vividezza ( luminanza, crominanza e gradienti di tonalità), contrasto locale e piramide wavelet (gradazione di contrasto locale).\nPiuma si trova in Impostazioni. +TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Modifica la fusione dell'immagine trasformata/originale. +TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Modifica il comportamento delle immagini con contrasto eccessivo o insufficiente aggiungendo una curva gamma prima e dopo la trasformata di Laplace. +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;Spostando il cursore verso destra si riduce progressivamente il contrasto. +TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Consente di utilizzare le modalità di fusione dei livelli di GIMP o Photoshop (differenza, moltiplicazione, luce soffusa, sovrapposizione, ecc.) con controllo dell'opacità.\nImmagine originale: unisci il punto corrente con l'originale.\nPunto precedente: unisci il punto corrente con quello precedente (se presente solo uno spot, precedente = originale).\nSfondo: unisce lo spot corrente con uno sfondo di colore e luminanza (meno possibilità). +TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Applica un filtro mediano prima della trasformazione di Laplace per prevenire artefatti (rumore).\nPuoi anche utilizzare lo strumento "Rimuovi rumore". +TP_LOCALLAB_EXPOSE;Gamma dinamica ed esposizione +TP_LOCALLAB_EXPOSURE_TOOLTIP;Modificare l'esposizione nello spazio L*a*b utilizzando gli algoritmi PDE laplaciani per tenere conto dE e ridurre al minimo gli artefatti. +TP_LOCALLAB_EXPRETITOOLS;Strumenti Retinex avanzati +TP_LOCALLAB_EXPSHARP_TOOLTIP;Spot minimo 39*39.\nUtilizza valori di transizione bassi e valori alti di "Decadimento transizione" e "Ambito" per simulare spot più piccoli. +TP_LOCALLAB_EXPTOOL;Strumenti di esposizione +TP_LOCALLAB_EXP_TOOLNAME;Gamma dinamica ed esposizione +TP_LOCALLAB_FATAMOUNT;Quantità +TP_LOCALLAB_FATANCHOR;Ancora +TP_LOCALLAB_FATDETAIL;Dettaglio +TP_LOCALLAB_FATFRA;Compressione della gamma dinamica ƒ +TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattali - utilizza l'algoritmo di mappatura dei toni fattali. +TP_LOCALLAB_FATLEVEL;Sigma +TP_LOCALLAB_FATSAT;Controllo della Saturazione +TP_LOCALLAB_FATSHFRA;Maschera di compressione della gamma dinamica ƒ +TP_LOCALLAB_FEATH_TOOLTIP;Ampiezza del gradiente come percentuale della diagonale del punto\Utilizzato da tutti i filtri graduati in tutti gli strumenti.\nessuna azione se non è stato attivato un filtro graduato. +TP_LOCALLAB_FEATVALUE;Gradiente di sfumatura (filtri graduati) +TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +TP_LOCALLAB_FFTMASK_TOOLTIP;Utilizzare una trasformata di Fourier per una migliore qualità (maggiore tempo di elaborazione e requisiti di memoria). +TP_LOCALLAB_FFTW;ƒ - Utilizza la trasformata veloce di Fourier +TP_LOCALLAB_FFTWBLUR;ƒ - Utilizza sempre la trasformata veloce di Fourier +TP_LOCALLAB_FULLIMAGE;Compensazione dell'esposizione dei neri e compensazione dell'esposizione dei bianchi per l'intera immagine +TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calcola i livelli Ev per l'intera immagine. +TP_LOCALLAB_GAM;Gamma +TP_LOCALLAB_GAMC;Gamma +TP_LOCALLAB_GAMCOL_TOOLTIP;Applica una gamma sui dati di luminanza L*a*b*.\nSe gamma = 3.0 viene utilizzata la luminanza 'lineare'. +TP_LOCALLAB_GAMC_TOOLTIP;Applicare una gamma sui dati di luminanza L*a*b* prima e dopo il trattamento Piramide 1 e Piramide 2.\nSe gamma = 3.0 Viene utilizzata la luminanza 'lineare'. +TP_LOCALLAB_GAMFRA;Curva di risposta tonale (CRT) +TP_LOCALLAB_GAMM;Gamma +TP_LOCALLAB_GAMMASKCOL;Gamma +TP_LOCALLAB_GAMMASK_TOOLTIP;La regolazione di Gamma e Pendenza può fornire una trasformazione morbida e priva di artefatti della maschera modificando progressivamente "L" per evitare eventuali discontinuità. +TP_LOCALLAB_GAMSH;Gamma +TP_LOCALLAB_GAMUTLABRELA;Lab +TP_LOCALLAB_GAMUTMUNSELL;Solo Munsell +TP_LOCALLAB_GAMUTNON;Nessuno +TP_LOCALLAB_GAMUTXYZABSO;XYZ Assoluto +TP_LOCALLAB_GAMUTXYZRELA;XYZ Relativo +TP_LOCALLAB_GAMW;Gamma (piramide di wavelet) +TP_LOCALLAB_GRADANG;Angolo gradiente +TP_LOCALLAB_GRADANG_TOOLTIP;Angolo di rotazione in gradi: -180 o +180. +TP_LOCALLAB_GRADFRA;Maschera con filtro graduato +TP_LOCALLAB_GRADGEN_TOOLTIP;Regola l'intensità del gradiente di luminanza. +TP_LOCALLAB_GRADLOGFRA;Luminanza del filtro graduato +TP_LOCALLAB_GRADSTR;Intensità del gradiente +TP_LOCALLAB_GRADSTRAB_TOOLTIP;Regola l'intensità del gradiente cromatico. +TP_LOCALLAB_GRADSTRCHRO;Intensità del gradiente cromatico +TP_LOCALLAB_GRADSTRHUE;Intensità del gradiente di tonalità +TP_LOCALLAB_GRADSTRHUE2;Intensità del gradiente di tonalità +TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Regola l'intensità del gradiente di tonalità. +TP_LOCALLAB_GRADSTRLUM;Intensità del gradiente luminanza +TP_LOCALLAB_GRAINFRA;Grana della pellicola 1:1 +TP_LOCALLAB_GRAINFRA2;Ruvidezza +TP_LOCALLAB_GRAIN_TOOLTIP;Aggiunge una grana simile a una pellicola all'immagine. +TP_LOCALLAB_GRALWFRA;Filtro graduato (contrasto locale) +TP_LOCALLAB_GRIDFRAME_TOOLTIP;Puoi usare questo strumento come un pennello. Usa un piccolo punto e adatta il 'Valore di transizione' e il 'Decadimento della transizione'\nSolo la modalità 'Normale' ed eventualmente Tonalità, Saturazione, Colore e Luminosità sono interessate da Unisci sfondo (ΔE). +TP_LOCALLAB_GRIDMETH_TOOLTIP;Tonalità del colore: la luminanza viene presa in considerazione quando si varia la crominanza. Equivalente a H=f(H) se il 'punto bianco' sulla griglia rimane a zero e si varia solo il 'punto nero'. Equivalente a 'Viraggio colore' se si variano i 2 punti.\n\nDiretto: agisce direttamente sulla crominanza. +TP_LOCALLAB_GRIDONE;Tonificazione del colore +TP_LOCALLAB_GRIDTWO;Diretto +TP_LOCALLAB_GUIDBL;Raggio morbido +TP_LOCALLAB_GUIDBL_TOOLTIP;Applica un filtro guidato con raggio regolabile. Consente di ridurre gli artefatti o sfocare l'immagine. +TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Modifica la funzione di distribuzione del filtro guidato. I valori negativi simulano una sfocatura gaussiana. +TP_LOCALLAB_GUIDFILTER;Raggio del filtro guidato +TP_LOCALLAB_GUIDFILTER_TOOLTIP;Può ridurre o aumentare gli artefatti. +TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Intensità del filtro guidato. +TP_LOCALLAB_HHMASK_TOOLTIP;Regolazioni fini della tonalità, ad esempio per la pelle. +TP_LOCALLAB_HIGHMASKCOL;Alteluci +TP_LOCALLAB_HLH;H +TP_LOCALLAB_HUECIE;Tonalità +TP_LOCALLAB_IND;Independente (mouse) +TP_LOCALLAB_INDSL;Independento (mouse + scorrimento) +TP_LOCALLAB_INVBL;Inverso +TP_LOCALLAB_INVBL_TOOLTIP;Alternativa alla modalità 'Inversa': usa due spot\Primo spot:\nell'immagine intera\in\Secondo spot: escluso lo spot. +TP_LOCALLAB_INVERS;Inverso +TP_LOCALLAB_INVERS_TOOLTIP;Meno possibilità se selezionato (Inverso).\n\nAlternativa: usa due spot\nPrimo spot:\n Immagine intera\n \nSecondo spot: escluso spot\n\n Inverso abiliterà questo strumento per l'area esterna allo spot, mentre il l'area all'interno dello spot non verrà influenzata dallo strumento. +TP_LOCALLAB_INVMASK;Algoritmo inverso +TP_LOCALLAB_ISOGR;Distribuzione (ISO) +TP_LOCALLAB_JAB;Usa la compensazione dell'esposizione dei neri e la compensazione dell'esposizione dei bianchi +TP_LOCALLAB_JABADAP_TOOLTIP;Adattamento uniforme percettivo.\nRegola automaticamente il rapporto tra Jz e saturazione tenendo conto della 'Luminanza assoluta'. +TP_LOCALLAB_JZ100;Riferimento Jz 100cd/m2 +TP_LOCALLAB_JZ100_TOOLTIP;Regola automaticamente il livello di riferimento Jz 100 cd/m2 (segnale immagine).\nModifica il livello di saturazione e l'azione dell''adattamento PU' (adattamento uniforme percettivo). +TP_LOCALLAB_JZADAP; Adattamento PU +TP_LOCALLAB_JZCH;Crominanza +TP_LOCALLAB_JZCHROM;Crominanza +TP_LOCALLAB_JZCLARICRES;Unisci crominanza Cz +TP_LOCALLAB_JZCLARILRES;Unisci Jz +TP_LOCALLAB_JZCONT;Contrasto +TP_LOCALLAB_JZFORCE;Forza il massimo Jz di 1 +TP_LOCALLAB_JZFORCE_TOOLTIP;Consente di forzare il valore Jz massimo su 1 per una migliore risposta dello slider e della curva. +TP_LOCALLAB_JZFRA;Jz Cz Hz Regolazioni dell'immagine +TP_LOCALLAB_JZHFRA;Curve Hz +TP_LOCALLAB_JZHJZFRA;Curva Jz(Hz) +TP_LOCALLAB_JZHUECIE;Rotazione della tonalità +TP_LOCALLAB_JZLIGHT;Luminosità +TP_LOCALLAB_JZLOG;Codifica del registro Jz +TP_LOCALLAB_JZLOGWBS_TOOLTIP;Le regolazioni Ev nero e Ev bianco possono essere diverse a seconda che venga utilizzata la codifica Log o Sigmoid.\nPer Sigmoid, potrebbe essere necessario un cambiamento (aumento nella maggior parte dei casi) di Ev bianco per ottenere una migliore resa delle luci, del contrasto e della saturazione. +TP_LOCALLAB_JZLOGWB_TOOLTIP;Se Auto è abilitato, calcolerà e regolerà i livelli Ev e la 'Luminanza media Yb%' per l'area spot. I valori risultanti verranno utilizzati da tutte le operazioni Jz inclusa 'Log Encoding Jz'.\nCalcola anche la luminanza assoluta al momento dello scatto. +TP_LOCALLAB_JZLOGYBOUT_TOOLTIP;Yb è la luminanza relativa dello sfondo, espressa come percentuale di grigio. Il 18% di grigio corrisponde a una luminanza di sfondo del 50% quando espressa in CIE L.\nI dati si basano sulla luminanza media dell'immagine.\nSe utilizzata con Log Encoding, la luminanza media viene utilizzata per determinare la quantità di guadagno necessaria da applicare al segnale prima della codifica del log. Valori più bassi di luminanza media si tradurranno in un aumento del guadagno. +TP_LOCALLAB_JZMODECAM_TOOLTIP;Jz (solo in modalità 'Avanzata'). Funziona solo se il dispositivo di output (monitor) è HDR (luminanza di picco superiore a 100 cd/m2 - idealmente tra 4000 e 10000 cd/m2. Luminanza del punto nero inferiore a 0,005 cd/m2). Ciò presuppone che a) l'ICC-PCS per lo schermo utilizzi Jzazbz (o XYZ), b) funzioni con precisione reale, c) che il monitor sia calibrato (se possibile con una gamma DCI-P3 o Rec-2020), d) che la solita gamma (sRGB o BT709) è sostituita da una funzione Perceptual Quantiser (PQ). +TP_LOCALLAB_JZPQFRA;Rimappatura Jz +TP_LOCALLAB_JZPQFRA_TOOLTIP;Permette di adattare l'algoritmo Jz ad un ambiente SDR o alle caratteristiche (prestazioni) di un ambiente HDR come segue:\n a) per valori di luminanza compresi tra 0 e 100 cd/m2, il sistema si comporta come se fosse in un ambiente SDR .\n b) per valori di luminanza compresi tra 100 e 10000 cd/m2 è possibile adattare l'algoritmo alle caratteristiche HDR dell'immagine e del monitor.\n\nSe 'PQ - Luminanza di picco' è impostato su 10000, 'Rimappatura Jz' si comporta allo stesso modo dell'algoritmo Jzazbz originale. +TP_LOCALLAB_JZPQREMAP;PQ - Luminanza di picco +TP_LOCALLAB_JZPQREMAP_TOOLTIP;PQ (Quantizzatore percettivo): consente di modificare la funzione PQ interna (solitamente 10000 cd/m2 - predefinito 120 cd/m2).\nPuò essere utilizzato per adattarsi a diverse immagini, processi e dispositivi. +TP_LOCALLAB_JZQTOJ;Luminanza relativa +TP_LOCALLAB_JZQTOJ_TOOLTIP;Ti permette di utilizzare 'Luminanza relativa' invece di 'Luminanza assoluta' - La luminosità diventa Luminosità.\nLe modifiche influiscono: sul cursore Luminosità, sul cursore Contrasto e sulla curva Jz(Jz). +TP_LOCALLAB_JZSAT;Saturatione +TP_LOCALLAB_JZSHFRA;Ombre/Alteluci Jz +TP_LOCALLAB_JZSOFTCIE;Raggio morbido (Filtro guidato) +TP_LOCALLAB_JZSTRSOFTCIE;Filtro guidato dell'intensità +TP_LOCALLAB_JZTARGET_EV;Visualizzazione della luminanza media (Yb%) +TP_LOCALLAB_JZTHRHCIE;Soglia cromatica per Jz(Hz) +TP_LOCALLAB_JZWAVEXP;Wavelet Jz +TP_LOCALLAB_LABBLURM;Maschera di sfocatura +TP_LOCALLAB_LABEL;Aggiustamenti locali +TP_LOCALLAB_LABGRID;Griglia di correzione del colore +TP_LOCALLAB_LABGRIDMERG;Sfondo +TP_LOCALLAB_LABGRID_VALUES;Alto(a)=%1 Alto(b)=%2\nBasso(a)=%3 Basso(b)=%4 +TP_LOCALLAB_LABSTRUM;Maschera di struttura +TP_LOCALLAB_LAPLACC;ΔØ La maschera laplaciana risolve la PDE +TP_LOCALLAB_LAPLACE;Soglia laplaciana ΔE +TP_LOCALLAB_LAPLACEXP;Soglia laplaciana +TP_LOCALLAB_LAPMASKCOL;Soglia laplaciana +TP_LOCALLAB_LAPRAD1_TOOLTIP;Aumenta il contrasto della maschera aumentando i valori di luminanza delle aree più chiare. Può essere utilizzato insieme alle curve L(L) e LC(H). +TP_LOCALLAB_LAPRAD2_TOOLTIP;Il raggio uniforme utilizza un filtro guidato per ridurre gli artefatti e uniformare la transizione. +TP_LOCALLAB_LAPRAD_TOOLTIP;Il raggio uniforme utilizza un filtro guidato per ridurre gli artefatti e uniformare la transizione. +TP_LOCALLAB_LAP_MASK_TOOLTIP;Risolve i PDE per tutte le maschere laplaciane.\nSe abilitata, la maschera della soglia laplaciana riduce gli artefatti e uniforma il risultato.\nSe disabilitata, la risposta è lineare. +TP_LOCALLAB_LCLABELS;Livelli di rumore residuo +TP_LOCALLAB_LCLABELS_TOOLTIP;Visualizza i valori di rumore medio e alto per l'area mostrata nel pannello di anteprima (con zoom al 100%). I valori del rumore sono raggruppati per livelli wavelet 0,1,2,3 e 4,5,6.\nI valori visualizzati sono solo indicativi e sono progettati per assistere nelle regolazioni del rumore. Non devono essere interpretati come livelli di rumore assoluti.\n\n 300: Molto rumoroso\n 100-300: Rumoroso\n 50-100: Moderatamente rumoroso\n < 50: Basso rumore\n\nPermettono di vedere:\ n*L'impatto della riduzione del rumore nella scheda Dettagli del menu principale.\n*L'influenza delle medie non locali, delle wavelet e del DCT sul rumore della luminanza.\n*L'influenza delle wavelet e del DCT sul rumore della crominanza.\n *L'influenza di cattura nitidezza e demosaicizzazione. +TP_LOCALLAB_LC_FFTW_TOOLTIP;La FFT migliora la qualità e consente l'utilizzo di raggi ampi, ma aumenta i tempi di lavorazione (dipende dall'area da trattare). Preferibile l'utilizzo solo per raggi ampi. La dimensione dell'area può essere ridotta di alcuni pixel per ottimizzare la FFTW. Ciò può ridurre il tempo di elaborazione di un fattore da 1,5 a 10. +TP_LOCALLAB_LC_TOOLNAME;Contrasto locale e wavelet +TP_LOCALLAB_LEVELBLUR;Livelli massimi di sfocatura +TP_LOCALLAB_LEVELWAV;Livelli di Wavelet +TP_LOCALLAB_LEVELWAV_TOOLTIP;Il Livello si adatta automaticamente alla dimensione dello spot e dell'anteprima.\Dal livello 9 dimensione max 512 al livello 1 dimensione max = 4. +TP_LOCALLAB_LEVFRA;Livelli +TP_LOCALLAB_LIGHTNESS;Luminosità +TP_LOCALLAB_LIGHTN_TOOLTIP;In modalità inversa: la selezione = -100 forza la luminanza a zero. +TP_LOCALLAB_LIGHTRETI;Luminosità +TP_LOCALLAB_LINEAR;Linearità +TP_LOCALLAB_LIST_NAME;Aggiungi strumento al punto corrente... +TP_LOCALLAB_LIST_TOOLTIP;Puoi selezionare 3 livelli di complessità per ciascuno strumento: Base, Standard e Avanzato.\nL'impostazione predefinita per tutti gli strumenti è Base ma può essere modificata nella finestra Preferenze.\nPuoi anche modificare il livello di complessità per strumento base durante la modifica. +TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Permette di diminuire o aumentare l'effetto su particolari livelli di dettaglio della maschera puntando su determinate zone di luminanza (in genere le più chiare). +TP_LOCALLAB_LMASK_LL_TOOLTIP;Ti permette di cambiare liberamente il contrasto della maschera.\n Ha una funzione simile ai cursori Gamma e Pendenza.\n Ti permette di individuare alcune parti dell'immagine (solitamente le parti più chiare della maschera utilizzando la curva per escludere le parti più scure). Può creare artefatti. +TP_LOCALLAB_LOCCONT;Maschera di contrasto +TP_LOCALLAB_LOC_CONTRAST;Contrasto locale e wavelet +TP_LOCALLAB_LOC_CONTRASTPYR;Piramide 1: +TP_LOCALLAB_LOC_CONTRASTPYR2;Piramide 2: +TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contrasto per livello/TM/Contrasto direzionale +TP_LOCALLAB_LOC_CONTRASTPYRLAB; Filtro graduato/Nitidezza bordi/Sfocatura +TP_LOCALLAB_LOC_RESIDPYR;Immagine residua (principale) +TP_LOCALLAB_LOG;Codifica del registro +TP_LOCALLAB_LOG1FRA;CAM16 Regolazioni dell'immagine +TP_LOCALLAB_LOG2FRA;Condizioni di visualizzazione +TP_LOCALLAB_LOGAUTO;Automatico +TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;Calcola automaticamente la "luminanza media" per le condizioni della scena. +TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;Calcola automaticamente la "luminanza media" per le condizioni della scena quando viene premuto il pulsante "Automatico" in Livelli di esposizione relativa. +TP_LOCALLAB_LOGAUTO_TOOLTIP;Premendo questo pulsante si calcolerà la gamma dinamica e la 'Luminanza media' per le condizioni della scena se è selezionata la 'Luminanza media automatica (Yb%)).\nCalcola anche la luminanza assoluta al momento dello scatto.\nPremere nuovamente il pulsante per regolare i valori calcolati automaticamente. +TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValori inferiori a 2 riducono l'azione dell'algoritmo rendendo le ombre più scure e le luci più luminose.\nCon valori maggiori di 2, le ombre sono più grigie e le luci diventano più sbiadite. +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;Codifica del registro anziché Sigmoid +TP_LOCALLAB_LOGCIE_TOOLTIP;Consente di utilizzare Nero Ev, Bianco Ev, Luminanza media scena (Yb%) e Luminanza media visualizzazione (Yb%) per la mappatura dei toni utilizzando la codifica Log Q. +TP_LOCALLAB_LOGCOLORFL;Colorazione (M) +TP_LOCALLAB_LOGCOLORF_TOOLTIP;Quantità di tonalità percepita in relazione al grigio.\nIndicatore che uno stimolo appare più o meno colorato. +TP_LOCALLAB_LOGCONQL;Contrasto (Q) +TP_LOCALLAB_LOGCONTHRES;Soglia di Contrasto (J & Q) +TP_LOCALLAB_LOGCONTL;Contrasto (J) +TP_LOCALLAB_LOGCONTL_TOOLTIP;Il contrasto (J) in CIECAM16 tiene conto dell'aumento della colorazione percepita con la luminanza. +TP_LOCALLAB_LOGCONTQ_TOOLTIP;Il contrasto (Q) in CIECAM16 tiene conto dell'aumento della colorazione percepita con la luminosità. +TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;Regola la gamma di contrasto dei toni medi (J e Q).\nI valori positivi riducono progressivamente l'effetto dei cursori Contrasto (J e Q). I valori negativi aumentano progressivamente l'effetto dei cursori Contrasto. +TP_LOCALLAB_LOGDETAIL_TOOLTIP;Agisce principalmente sulle alte frequenze. +TP_LOCALLAB_LOGENCOD_TOOLTIP;Mappatura dei toni con codifica logaritmica (ACES).\nUtile per immagini sottoesposte o immagini con elevata gamma dinamica.\n\nProcesso in due fasi: 1) Calcolo della gamma dinamica 2) Regolazione manuale. +TP_LOCALLAB_LOGEXP;Tutti gli strumenti +TP_LOCALLAB_LOGFRA;Condizioni della scena +TP_LOCALLAB_LOGFRAME_TOOLTIP;Consente di calcolare e regolare i livelli Ev e la "luminanza media Yb%" (punto grigio sorgente) per l'area spot. I valori risultanti verranno utilizzati da tutte le operazioni di laboratorio e dalla maggior parte delle operazioni RGB in corso.\nCalcola inoltre la luminanza assoluta al momento dello scatto. +TP_LOCALLAB_LOGIMAGE_TOOLTIP;Tiene conto delle variabili Ciecam corrispondenti: ovvero Contrasto (J) e Saturazione (s), nonché Contrasto (Q), Luminosità (Q), Luminosità (J) e Colorazione (M) (in modalità Avanzata). +TP_LOCALLAB_LOGLIGHTL;Luminosità (J) +TP_LOCALLAB_LOGLIGHTL_TOOLTIP;Vicino alla Luminosità (L*a*b*). Tiene conto dell'aumento della colorazione percepita. +TP_LOCALLAB_LOGLIGHTQ;Luminosità (Q) +TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;Quantità percepita di luce emanata da uno stimolo.\nIndicatore che uno stimolo sembra essere più o meno luminoso, chiaro. +TP_LOCALLAB_LOGLIN;Modalità logaritmo +TP_LOCALLAB_LOGPFRA;Livelli di esposizione relativa +TP_LOCALLAB_LOGREPART;Overall strength +TP_LOCALLAB_LOGREPART_TOOLTIP;Consente di regolare la forza relativa dell'immagine con codifica log rispetto all'immagine originale.\nNon influisce sul componente Ciecam. +TP_LOCALLAB_LOGSATURL_TOOLTIP;La saturazione (s) in CIECAM16 corrisponde al colore di uno stimolo in relazione alla propria luminosità.\nAgisce principalmente sui toni medi e sulle alte luci. +TP_LOCALLAB_LOGSCENE_TOOLTIP;Corrisponde alle condizioni di ripresa. +TP_LOCALLAB_LOGSURSOUR_TOOLTIP;Modifica toni e colori per tenere conto delle condizioni della scena.\n\nMedia: condizioni di luce medie (standard). L'immagine non cambierà.\n\nDim: condizioni di luminosità. L'immagine diventerà leggermente più luminosa.\n\nScuro: condizioni di oscurità. L'immagine diventerà più luminosa. +TP_LOCALLAB_LOGVIEWING_TOOLTIP;Corrisponde al supporto su cui verrà visualizzata l'immagine finale (monitor, TV, proiettore, stampante, ecc.), nonché alle condizioni circostanti. +TP_LOCALLAB_LOG_TOOLNAME;Codifica del registro +TP_LOCALLAB_LUM;LL - CC +TP_LOCALLAB_LUM46LABEL;Livelli luminanza 456: Media=%1 Alta=%2 +TP_LOCALLAB_LUMADARKEST;Più oscuro +TP_LOCALLAB_LUMASK;Maschera colore/luminosità dello sfondo +TP_LOCALLAB_LUMASK_TOOLTIP;Regola la tonalità di grigio o il colore dello sfondo della maschera in Mostra maschera (Maschera e modifiche). +TP_LOCALLAB_LUMAWHITESEST;Il più leggero +TP_LOCALLAB_LUMFRA;Norma L*a*b* +TP_LOCALLAB_LUMLABEL;Livelli luminanza 0123: Media=%1 Alta=%2 +TP_LOCALLAB_MASFRAME;Maschera e Unisci +TP_LOCALLAB_MASFRAME_TOOLTIP;Per tutte le maschere.\nPrende in considerazione l'immagine ΔE per evitare di modificare l'area di selezione quando vengono utilizzati i seguenti strumenti maschera: Gamma, Pendenza, Crominanza, Curva di contrasto, Contrasto locale (per livello wavelet), Maschera di sfocatura e Maschera di struttura (se abilitata ).\nDisabilitato quando viene utilizzata la modalità Inversa. +TP_LOCALLAB_MASK;Curve +TP_LOCALLAB_MASK2;Curva di contrasto +TP_LOCALLAB_MASKCOM;Maschera di colore comune +TP_LOCALLAB_MASKCOM_TOOLNAME;Maschera di colore comune +TP_LOCALLAB_MASKCOM_TOOLTIP;Uno strumento a sé stante.\Può essere utilizzato per regolare l'aspetto dell'immagine (crominanza, luminanza, contrasto) e la trama in funzione di Scope. +TP_LOCALLAB_MASKCURVE_TOOLTIP;Le 3 curve sono impostate su 1 (massimo) per impostazione predefinita:\nC=f(C) la crominanza varia in base alla crominanza. È possibile diminuire la crominanza per migliorare la selezione. Impostando questa curva vicino allo zero (con un valore basso di C per attivare la curva) è possibile desaturare lo sfondo in modalità Inversa.\nL=f(L) la luminanza varia in base alla luminanza, quindi è possibile diminuire la luminosità a migliorare la selezione.\nL e C = f(H) la luminanza e la crominanza variano con la tonalità, quindi è possibile diminuire la luminanza e la crominanza per migliorare la selezione. +TP_LOCALLAB_MASKDDECAY;Intensità di decadimento +TP_LOCALLAB_MASKDECAY_TOOLTIP;Gestisce il tasso di decadimento per i livelli di grigio nella maschera.\n Decay = 1 lineare, Decay > 1 transizioni paraboliche più nette, Decay < 1 transizioni più graduali. +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;Utilizzato per indirizzare l'eliminazione del rumore in funzione delle informazioni sulla luminanza dell'immagine contenute nelle maschere L(L) o LC(H) (Maschera e modifiche).\n La maschera L(L) o la maschera LC(H) deve essere abilitata per utilizzare questa funzione.\n Se la maschera è al di sotto della soglia 'scura', la riduzione del rumore verrà applicata progressivamente.\n iSe la maschera è al di sopra della soglia 'chiara', la riduzione del rumore verrà applicata progressivamente.\n Tra In entrambi i casi, le impostazioni dell'immagine senza Denoise verranno mantenute, a meno che non si regoli i cursori 'Rimozione rumore luminanza area grigia' o 'Rimozione rumore crominanza area grigia'. +TP_LOCALLAB_MASKGF_TOOLTIP;Utilizzato per indirizzare il filtro guidato in funzione delle informazioni sulla luminanza dell'immagine contenute nelle maschere L(L) o LC(H) (Maschera e modifiche).\n La maschera L(L) o la maschera LC(H) deve essere abilitato a utilizzare questa funzione.\n Se la maschera è al di sotto della soglia 'scura', il GF verrà applicato progressivamente.\n Se la maschera è al di sopra della soglia 'chiara', il GF verrà applicato progressivamente.\n Tra i due, verranno mantenute le impostazioni dell'immagine senza GF. +TP_LOCALLAB_MASKH;Curva tonalità +TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP;Limite del tono più chiaro oltre il quale i parametri CBDL (solo luminanza) verranno ripristinati progressivamente ai loro valori originali prima di essere modificati dalle impostazioni CBDL.\n Puoi utilizzare determinati strumenti in 'Maschera e modifiche' per modificare i livelli di grigio :'Raggio uniforme', Gamma e pendenza, 'Curva di contrasto'.\nUtilizza un 'selettore colore bloccabile' sulla maschera per vedere quali aree saranno interessate. Assicurati di impostare "Maschera colore di sfondo" = 0 in Impostazioni. +TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;Limite di tono più chiaro oltre il quale i parametri verranno ripristinati progressivamente ai loro valori originali prima di essere modificati dalle impostazioni di Colore e Luce.\n Puoi utilizzare alcuni strumenti in 'Maschera e modifiche' per modificare i livelli di grigio: 'Maschera struttura' , 'Maschera di sfocatura', 'Raggio attenuato', Gamma e pendenza, 'Curva di contrasto', 'Contrasto locale' (wavelet).\n Utilizza un 'selettore colore bloccabile' sulla maschera per vedere quali aree saranno interessate. Assicurati di impostare "Maschera colore di sfondo" = 0 in Impostazioni. +TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP; Il rumore viene progressivamente ridotto dal 100% dell'impostazione della soglia allo 0% al valore massimo del bianco (come determinato dalla maschera).\n Puoi utilizzare alcuni strumenti in 'Maschera e modifiche' per modificare i livelli di grigio: 'Maschera struttura ', 'Raggio uniforme', Gamma e pendenza, 'Curva di contrasto', 'Contrasto locale' (wavelet).\n Utilizza un 'selettore colore bloccabile' sulla maschera per vedere quali aree saranno interessate. Assicurati di impostare "Maschera colore di sfondo" = 0 in Impostazioni. +TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP;Limite di tono più chiaro oltre il quale i parametri verranno ripristinati progressivamente ai valori originali prima di essere modificati dalle impostazioni "Gamma dinamica ed esposizione".\n Puoi utilizzare alcuni strumenti in "Maschera e modifiche" per modificare i livelli di grigio: " Raggio uniforme", Gamma e Pendenza, "Curva di contrasto".\n Utilizza un "selettore colori bloccabile" sulla maschera per vedere quali aree saranno interessate. Assicurati di impostare "Maschera colore di sfondo" = 0 in Impostazioni. +TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP;Limite di tono più chiaro oltre il quale i parametri verranno ripristinati progressivamente ai loro valori originali prima di essere modificati dalle impostazioni di codifica del registro.\n Puoi utilizzare alcuni strumenti in 'Maschera e modifiche' per modificare i livelli di grigio:'Raggio uniforme', 'Curva di contrasto'.\n Utilizza un 'selettore colore bloccabile' sulla maschera per vedere quali aree saranno interessate. Assicurati di impostare "Maschera colore di sfondo" = 0 in Impostazioni. +TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP;Limite di tono più chiaro al di sopra del quale i parametri Retinex (solo Luminanza) verranno ripristinati progressivamente ai loro valori originali prima di essere modificati dalle impostazioni Retinex.\n Puoi utilizzare alcuni strumenti in 'Maschera e modifiche' per modificare i livelli di grigio: 'Smussato raggio', Gamma e Pendenza, 'Curva di contrasto'.\n Utilizza un 'selettore colore bloccabile' sulla maschera per vedere quali aree saranno interessate. Assicurati di impostare "Maschera colore di sfondo" = 0 in Impostazioni. +TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP;Limite di tono più chiaro oltre il quale i parametri verranno ripristinati progressivamente ai loro valori originali prima di essere modificati dalle impostazioni Ombre E Luci.\n Puoi utilizzare alcuni strumenti in 'Maschera e modifiche' per modificare i livelli di grigio: 'Raggio uniforme', Gamma e pendenza, 'Curva di contrasto'.\n Utilizza un 'selettore colore bloccabile' sulla maschera per vedere quali aree saranno interessate. Assicurati di impostare "Maschera colore di sfondo" = 0 in Impostazioni. +TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP;Limite di tono più chiaro oltre il quale i parametri verranno ripristinati progressivamente ai loro valori originali prima di essere modificati dalle impostazioni di Mappatura tono.\n Puoi utilizzare alcuni strumenti in 'Maschera e modifiche' per modificare i livelli di grigio: 'Raggio uniforme', Gamma e pendenza, 'Curva di contrasto'.\n Utilizza un 'selettore colore bloccabile' sulla maschera per vedere quali aree saranno interessate. Assicurati di impostare "Maschera colore di sfondo" = 0 in Impostazioni. +TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP;Limite del tono più chiaro oltre il quale i parametri verranno ripristinati progressivamente ai loro valori originali prima di essere modificati dalle impostazioni Vividezza e Caldo Freddo.\n Puoi utilizzare alcuni strumenti in 'Maschera e modifiche' per modificare i livelli di grigio:'Raggio uniforme ', Gamma e Pendenza, 'Curva di contrasto'.\n Utilizza un 'selettore colore bloccabile' sulla maschera per vedere quali aree saranno interessate. Assicurati di impostare "Maschera colore di sfondo" = 0 in Impostazioni. +TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP;Limite di tono più chiaro oltre il quale i parametri verranno ripristinati progressivamente ai loro valori originali prima di essere modificati dalle impostazioni Contrasto locale e Wavelet.\n Puoi utilizzare alcuni strumenti in 'Maschera e modifiche' per modificare i livelli di grigio: 'Raggio uniforme ', Gamma e Pendenza, 'Curva di contrasto'.\n Utilizza un 'selettore colore bloccabile' sulla maschera per vedere quali aree saranno interessate. Assicurati di impostare "Maschera colore di sfondo" = 0 in Impostazioni. +TP_LOCALLAB_MASKHIGTHRES_TOOLTIP; Il filtro guidato viene progressivamente ridotto dal 100% dell'impostazione della soglia allo 0% del valore massimo del bianco (come determinato dalla maschera).\n Puoi utilizzare alcuni strumenti in 'Maschera e modifiche' per modificare i livelli di grigio: 'struttura maschera', 'Raggio uniforme', 'Gamma e pendenza', 'Curva di contrasto', 'Wavelet di contrasto locale'.\n Utilizza un 'selettore colore bloccabile' sulla maschera per vedere quali aree saranno interessate. Assicurati di impostare "Maschera colore di sfondo" = 0 in Impostazioni. +TP_LOCALLAB_MASKLCTHR;Soglia di luminanza dell'area chiara +TP_LOCALLAB_MASKLCTHR2;Soglia luminanza dell'area chiara +TP_LOCALLAB_MASKLCTHRLOW;Soglia di luminanza dell'area scura +TP_LOCALLAB_MASKLCTHRLOW2;Soglia luminanza dell'area scura +TP_LOCALLAB_MASKLCTHRMID;Rimuovi rumore luminanza dell'area grigia +TP_LOCALLAB_MASKLCTHRMIDCH;Rimuovi rumore crominanza area grigia +TP_LOCALLAB_MASKLC_TOOLTIP;Utilizzato dalla luminanza wavelet.\nCiò consente di indirizzare la riduzione del rumore in base alle informazioni sulla luminanza dell'immagine contenute nella maschera L(L) o LC(H) (Maschera e modifiche).\n La maschera L(L) o LC( H) la maschera deve essere abilitata per utilizzare questa funzione.\n 'Soglia luminanza area scura'. Se 'Rafforza il denoise nelle aree scure e chiare' > 1 il denoise viene progressivamente aumentato dallo 0% all'impostazione della soglia al 100% al valore massimo del nero (determinato dalla maschera).\n 'Soglia luminanza dell'area chiara'. La riduzione del rumore viene progressivamente ridotta dal 100% dell'impostazione della soglia allo 0% del valore massimo del bianco (determinato dalla maschera).\n Nell'area tra le due soglie, le impostazioni della riduzione del rumore non sono influenzate dalla maschera. +TP_LOCALLAB_MASKLNOISELOW;Rinforza le aree scure/chiare +TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP;Limite del tono scuro al di sotto del quale i parametri CBDL (solo Luminanza) verranno ripristinati progressivamente ai loro valori originali prima di essere modificati dalle impostazioni CBDL.\n Puoi utilizzare determinati strumenti in 'Maschera e modifiche' per modificare il grigio livelli: "Raggio uniforme", Gamma e pendenza, "Curva di contrasto".\n Utilizza un "selettore colore bloccabile" sulla maschera per vedere quali aree saranno interessate. Assicurati di impostare "Maschera colore di sfondo" = 0 in Impostazioni. +TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP;Limite del tono scuro al di sotto del quale i parametri verranno ripristinati progressivamente ai loro valori originali prima di essere modificati dalle impostazioni Colore e Luce.\n Puoi utilizzare alcuni strumenti in 'Maschera e modifiche' per modificare i livelli di grigio: ' Maschera struttura", "Maschera di sfocatura", "Raggio uniforme", Gamma e pendenza, "Curva di contrasto", "Contrasto locale" (wavelet).\n Utilizza un "selettore colore bloccabile" sulla maschera per vedere quali aree saranno interessate . Assicurati di impostare "Maschera colore di sfondo" = 0 in Impostazioni. +TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;Il rumore viene progressivamente aumentato dallo 0% dell'impostazione della soglia al 100% del valore massimo del nero (come determinato dalla maschera).\n Puoi utilizzare determinati strumenti in 'Maschera e modifiche' per modificare i livelli di grigio: 'Maschera struttura', 'Raggio uniforme', Gamma e pendenza, 'Curva di contrasto', 'Contrasto locale' (wavelet).\n Utilizza un 'selettore colore bloccabile' sulla maschera per vedere quali aree saranno interessate. Assicurati di impostare "Maschera colore di sfondo" = 0 in Impostazioni. +TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP;Limite del tono scuro al di sotto del quale i parametri verranno ripristinati progressivamente ai loro valori originali prima di essere modificati dalle impostazioni 'Gamma dinamica ed esposizione'.\n Puoi utilizzare determinati strumenti in 'Maschera e modifiche' per modificare il grigio livelli: "Raggio uniforme", Gamma e pendenza, "Curva di contrasto".\n Utilizza un "selettore colore bloccabile" sulla maschera per vedere quali aree saranno interessate. Assicurati di impostare "Maschera colore di sfondo" = 0 in Impostazioni. +TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP;Limite del tono scuro al di sotto del quale i parametri verranno ripristinati progressivamente ai loro valori originali prima di essere modificati dalle impostazioni di codifica del registro.\n Puoi utilizzare alcuni strumenti in 'Maschera e modifiche' per modificare i livelli di grigio:'Smussato raggio', 'Curva di contrasto'.\n Utilizza un 'selettore colore bloccabile' sulla maschera per vedere quali aree saranno interessate. Assicurati di impostare "Maschera colore di sfondo" = 0 in Impostazioni. +TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP;Limite del tono scuro al di sotto del quale i parametri Retinex (solo Luminanza) verranno ripristinati progressivamente ai loro valori originali prima di essere modificati dalle impostazioni Retinex.\n Puoi utilizzare determinati strumenti in 'Maschera e modifiche' per modificare il grigio livelli: "Raggio uniforme", Gamma e pendenza, "Curva di contrasto".\n Utilizza un "selettore colore bloccabile" sulla maschera per vedere quali aree saranno interessate. Assicurati di impostare "Maschera colore di sfondo" = 0 in Impostazioni. +TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;Limite del tono scuro al di sotto del quale i parametri verranno ripristinati progressivamente ai loro valori originali prima di essere modificati dalle impostazioni Ombre Evidenziazioni.\n Puoi utilizzare alcuni strumenti in 'Maschera e modifiche' per modificare i livelli di grigio: 'Smussato raggio', Gamma e Pendenza, 'Curva di contrasto'.\n Utilizza un 'selettore colore bloccabile' sulla maschera per vedere quali aree saranno interessate. Assicurati di impostare "Maschera colore di sfondo" = 0 in Impostazioni. +TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP;Limite del tono scuro al di sotto del quale i parametri verranno ripristinati progressivamente ai loro valori originali prima di essere modificati dalle impostazioni di Mappatura toni.\n Puoi utilizzare alcuni strumenti in 'Maschera e modifiche' per modificare i livelli di grigio: 'Smussato raggio', Gamma e Pendenza, 'Curva di contrasto'.\n Utilizza un 'selettore colore bloccabile' sulla maschera per vedere quali aree saranno interessate. Assicurati di impostare "Maschera colore di sfondo" = 0 in Impostazioni. +TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;Limite del tono scuro al di sotto del quale i parametri verranno ripristinati progressivamente ai loro valori originali prima di essere modificati dalle impostazioni Vividezza e Caldo Freddo.\n Puoi utilizzare alcuni strumenti in 'Maschera e modifiche' per modificare i livelli di grigio: 'Raggio uniforme', Gamma e pendenza, 'Curva di contrasto'.\n Utilizza un 'selettore colore bloccabile' sulla maschera per vedere quali aree saranno interessate. Assicurati di impostare "Maschera colore di sfondo" = 0 in Impostazioni. +TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;Limite del tono scuro al di sotto del quale i parametri verranno ripristinati progressivamente ai loro valori originali prima di essere modificati dalle impostazioni Contrasto locale e Wavelet.\n Puoi utilizzare alcuni strumenti in 'Maschera e modifiche' per modificare i livelli di grigio: 'Raggio uniforme', Gamma e pendenza, 'Curva di contrasto'.\n Utilizza un 'selettore colore bloccabile' sulla maschera per vedere quali aree saranno interessate. Assicurati di impostare "Maschera colore di sfondo" = 0 in Impostazioni. +TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;Il filtro guidato viene progressivamente aumentato dallo 0% dell'impostazione della soglia al 100% del valore massimo del nero (come determinato dalla maschera).\n Puoi utilizzare determinati strumenti in 'Maschera e modifiche' per modificare i livelli di grigio : 'Maschera struttura', 'Raggio uniforme', Gamma e pendenza, 'Curva di contrasto', 'Contrasto locale' (wavelet).\n Utilizza un 'selettore colore bloccabile' sulla maschera per vedere quali aree saranno interessate. Assicurati di impostare "Maschera colore di sfondo" = 0 in Impostazioni. +TP_LOCALLAB_MASKRECOL_TOOLTIP;Utilizzato per modulare l'effetto delle impostazioni Colore e Luce in base alle informazioni sulla luminanza dell'immagine contenute nelle maschere L(L) o LC(H) (Maschera e modifiche).\n La maschera L(L) o LC La maschera (H) deve essere abilitata per utilizzare questa funzione.\n Le aree 'scure' e 'chiare' sotto la soglia scura e sopra la soglia chiara verranno ripristinate progressivamente ai loro valori originali prima di essere modificate dalle impostazioni Colore e Luce \n Tra queste due aree, verrà applicato l'intero valore delle impostazioni Colore e Luce. +TP_LOCALLAB_MASKRECOTHRES;Soglia di ripristino +TP_LOCALLAB_MASKREEXP_TOOLTIP;Utilizzato per modulare l'effetto delle impostazioni 'Gamma dinamica ed esposizione' in base alle informazioni sulla luminanza dell'immagine contenute nelle maschere L(L) o LC(H) (Maschera e modifiche).\n La maschera L(L) oppure per utilizzare questa funzione è necessario abilitare la maschera LC(H).\n Le aree 'scure' e 'chiare' sotto la soglia di buio e sopra la soglia di luce verranno ripristinate progressivamente ai loro valori originali prima di essere modificate dal ' Impostazioni di "Gamma dinamica ed esposizione" \n Tra queste due aree, verrà applicato il valore completo delle impostazioni di "Gamma dinamica ed esposizione". +TP_LOCALLAB_MASKRELOG_TOOLTIP;Utilizzato per modulare l'effetto delle impostazioni di codifica Log in base alle informazioni sulla luminanza dell'immagine contenute nelle maschere L(L) o LC(H) (Maschera e modifiche).\n La maschera L(L) o LC( H) la maschera deve essere abilitata per utilizzare questa funzione.\n Le aree 'scure' e 'chiare' sotto la soglia scura e sopra la soglia chiara verranno ripristinate progressivamente ai loro valori originali prima di essere modificate dalle impostazioni di codifica del registro - può essere utilizzato per ripristinare le luci ricostruite dalla propagazione del colore \n Tra queste due aree, verrà applicato l'intero valore delle impostazioni di codifica del registro. +TP_LOCALLAB_MASKRESCB_TOOLTIP;Utilizzato per modulare l'effetto delle impostazioni CBDL (solo luminanza) in base alle informazioni sulla luminanza dell'immagine contenute nelle maschere L(L) o LC(H) (Maschera e modifiche).\n La maschera L(L) o la maschera LC(H) deve essere abilitata per utilizzare questa funzione.\n Le aree 'scure' e 'chiare' sotto la soglia scura e sopra la soglia chiara verranno ripristinate progressivamente ai loro valori originali prima di essere modificate dalle impostazioni CBDL \n Tra queste due aree, verrà applicato l'intero valore delle impostazioni CBDL. +TP_LOCALLAB_MASKRESH_TOOLTIP;Utilizza l'effetto delle impostazioni Ombre Evidenziazioni in base alle informazioni sulla luminanza dell'immagine contenute nelle maschere L(L) o LC(H) (Maschera e modifiche).\n La maschera L(L) o LC( H) la maschera deve essere abilitata per utilizzare questa funzione.\n Le aree 'scure' e 'chiare' sotto la soglia di buio e sopra la soglia di luce verranno ripristinate progressivamente ai loro valori originali prima di essere modificate dalle impostazioni Ombre Alte luci\n Tra queste due aree, verrà applicato l'intero valore delle impostazioni Ombre Evidenziazioni. +TP_LOCALLAB_MASKRESRETI_TOOLTIP;Utilizzato per modulare l'effetto delle impostazioni di Retinex (solo luminanza) in base alle informazioni sulla luminanza dell'immagine contenute nelle maschere L(L) o LC(H) (Maschera e modifiche).\n La maschera L(L) o per utilizzare questa funzione è necessario abilitare la maschera LC(H).\n Le aree 'scure' e 'chiare' sotto la soglia di buio e sopra la soglia di luce verranno ripristinate progressivamente ai loro valori originali prima di essere modificate dalle impostazioni di Retinex \n Tra queste due aree, verrà applicato l'intero valore delle impostazioni Retinex. +TP_LOCALLAB_MASKRESTM_TOOLTIP;Utilizzato per modulare l'effetto delle impostazioni di Mappatura dei toni in base alle informazioni sulla luminanza dell'immagine contenute nelle maschere L(L) o LC(H) (Maschera e modifiche).\n La maschera L(L) o LC( H) la maschera deve essere abilitata per utilizzare questa funzione.\n Le aree 'scure' e 'chiare' sotto la soglia scura e sopra la soglia chiara verranno ripristinate progressivamente ai loro valori originali prima di essere modificate dalle impostazioni di mappatura dei toni\n Tra queste due aree verrà applicato l'intero valore delle impostazioni di mappatura dei toni. +TP_LOCALLAB_MASKRESVIB_TOOLTIP;Utilizzato per modulare l'effetto delle impostazioni Vividezza e Caldo Freddo in base alle informazioni sulla luminanza dell'immagine contenute nelle maschere L(L) o LC(H) (Maschera e modifiche).\n La maschera L(L) o Per utilizzare questa funzione è necessario abilitare la maschera LC(H).\n Le aree "scure" e "chiare" al di sotto della soglia del buio e al di sopra della soglia della luce verranno ripristinate progressivamente ai loro valori originali prima di essere modificate da Vividezza e Caldo Impostazioni Freddo \n Tra queste due aree, verrà applicato il valore completo delle impostazioni Vividezza e Caldo Freddo. +TP_LOCALLAB_MASKRESWAV_TOOLTIP;Utilizzato per modulare l'effetto delle impostazioni Contrasto locale e Wavelet in base alle informazioni sulla luminanza dell'immagine contenute nelle maschere L(L) o LC(H) (Maschera e modifiche).\n La maschera L(L) o Per utilizzare questa funzione è necessario abilitare la maschera LC(H).\n Le aree "scure" e "chiare" al di sotto della soglia di buio e al di sopra della soglia di luce verranno ripristinate progressivamente ai loro valori originali prima di essere modificate dal Contrasto locale e Impostazioni Wavelet \n Tra queste due aree, verrà applicato il valore completo delle impostazioni Contrasto locale e Wavelet. +TP_LOCALLAB_MASKUNUSABLE;Maschera disabilitata (Maschera e modifiche) +TP_LOCALLAB_MASKUSABLE;Maschera abilitata (Maschera e modifiche) +TP_LOCALLAB_MASK_TOOLTIP;Puoi abilitare più maschere per uno strumento attivando un altro strumento e utilizzando solo la maschera (imposta i cursori dello strumento su 0 ).\n\nPuoi anche duplicare il punto e posizionarlo vicino al primo punto. Le piccole variazioni nei riferimenti spot consentono di effettuare regolazioni fini. +TP_LOCALLAB_MEDIAN;Mediana bassa +TP_LOCALLAB_MEDIANITER_TOOLTIP;Il numero di iterazioni successive eseguite dal filtro mediano. +TP_LOCALLAB_MEDIAN_TOOLTIP;Puoi scegliere un valore medio compreso tra 3x3 e 9x9 pixel. Valori più alti aumentano la riduzione del rumore e la sfocatura. +TP_LOCALLAB_MEDNONE;Nessuno +TP_LOCALLAB_MERCOL;Colore +TP_LOCALLAB_MERDCOL;Unisci sfondo (ΔE) +TP_LOCALLAB_MERELE;Schiarisci solo +TP_LOCALLAB_MERFIV;Somma +TP_LOCALLAB_MERFOR;Colore scherma +TP_LOCALLAB_MERFOU;Moltiplica +TP_LOCALLAB_MERGE1COLFRA;Unisci con Originale/Precedente/Sfondo +TP_LOCALLAB_MERGECOLFRA;Maschera: LCh & Struttura +TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Permette di creare maschere basate sulle 3 curve LCh e/o un algoritmo di rilevamento della struttura. +TP_LOCALLAB_MERGEMER_TOOLTIP;Prende in considerazione ΔE quando si uniscono i file (equivalente dell'ambito in questo caso). +TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacità = % del punto corrente da unire con il punto originale o precedente.\nSoglia contrasto: regola il risultato in funzione del contrasto nell'immagine originale. +TP_LOCALLAB_MERHEI;Sovrapposizione +TP_LOCALLAB_MERHUE;Tonalità +TP_LOCALLAB_MERLUCOL;Luminanza +TP_LOCALLAB_MERLUM;Luminosità +TP_LOCALLAB_MERNIN;Schermo +TP_LOCALLAB_MERONE;Normale +TP_LOCALLAB_MERSAT;Saturazione +TP_LOCALLAB_MERSEV;Luce soffusa (legacy) +TP_LOCALLAB_MERSEV0;Illusione di luce soffusa +TP_LOCALLAB_MERSEV1;Luce soffusa W3C +TP_LOCALLAB_MERSEV2;Luce forte +TP_LOCALLAB_MERSIX;Dividi +TP_LOCALLAB_MERTEN;Scurisci solo +TP_LOCALLAB_MERTHI;Colore brucia +TP_LOCALLAB_MERTHR;Differenza +TP_LOCALLAB_MERTWE;Esclusione +TP_LOCALLAB_MERTWO;Sottrai +TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' aumenta significativamente i tempi di elaborazione.\nMa riduce gli artefatti. +TP_LOCALLAB_MLABEL;Dati ripristinati Min=%1 Max=%2 +TP_LOCALLAB_MLABEL_TOOLTIP;I valori dovrebbero essere vicini a Min=0 Max=32768 (modalità registro) ma sono possibili altri valori. Puoi regolare 'Ritaglia dati ripristinati (guadagno)' e 'Offset' per normalizzare.\nRecupera i dati dell'immagine senza fusione. +TP_LOCALLAB_MODE_EXPERT;Avanzato +TP_LOCALLAB_MODE_NORMAL;Standard +TP_LOCALLAB_MODE_SIMPLE;Base +TP_LOCALLAB_MRFIV;Sfondo +TP_LOCALLAB_MRFOU;Spot precedente +TP_LOCALLAB_MRONE;Nessuno +TP_LOCALLAB_MRTHR;Immagine originale +TP_LOCALLAB_MULTIPL_TOOLTIP;Ampia gamma di regolazione del tono: da -18EV a +4EV. Il primo cursore agisce su toni molto scuri compresi tra -18EV e -6EV. L'ultimo cursore agisce sui toni chiari fino a 4EV. +TP_LOCALLAB_NEIGH;Raggio +TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;Valori più bassi preservano dettagli e texture, valori più alti aumentano il denoise.\nSe gamma = 3.0 Viene utilizzata la luminanza 'lineare'. +TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;Utilizza questo cursore per adattare la quantità di riduzione rumore alla dimensione degli oggetti da elaborare. +TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP;Valori più alti aumentano il rumore a scapito del tempo di elaborazione. +TP_LOCALLAB_NLDENOISE_TOOLTIP;'Recupero dettagli' agisce su una trasformazione laplaciana per individuare aree uniformi anziché aree con dettagli. +TP_LOCALLAB_NLDET;Recupero dettagli +TP_LOCALLAB_NLFRA;Mezzi non locali: Luminanza +TP_LOCALLAB_NLFRAME_TOOLTIP;Il denoising delle medie non locali prende una media di tutti i pixel dell'immagine, ponderata in base alla loro somiglianza con il pixel di destinazione.\nRiduce la perdita di dettaglio rispetto agli algoritmi della media locale.\nViene preso in considerazione solo il rumore della luminanza. Il rumore della crominanza viene elaborato al meglio utilizzando wavelet e trasformate di Fourier (DCT).\nPuò essere utilizzato insieme a "Rimozione rumore luminanza per livello" o da solo. +TP_LOCALLAB_NLGAM;Gamma +TP_LOCALLAB_NLLUM;Forza +TP_LOCALLAB_NLPAT;Dimensione massima della patch +TP_LOCALLAB_NLRAD;Dimensione massima del raggio +TP_LOCALLAB_NOISECHROCOARSE;Crominanza grossolana (Wav) +TP_LOCALLAB_NOISECHROC_TOOLTIP;Se superiore a zero, l'algoritmo di alta qualità è abilitato.\nCoarse è per slider >=0.02. +TP_LOCALLAB_NOISECHRODETAIL;Recupero dettagli crominanza +TP_LOCALLAB_NOISECHROFINE;Crominanza fine (Wav) +TP_LOCALLAB_NOISEGAM;Gamma +TP_LOCALLAB_NOISEGAM_TOOLTIP;Se gamma = 1 Luminanza viene utilizzato 'Lab'. Se gamma = 3.0 Viene utilizzata la luminanza 'lineare'.\nValori più bassi preservano dettagli e texture, valori più alti aumentano il rumore. +TP_LOCALLAB_NOISELEQUAL;Equalizzatore bianco-nero +TP_LOCALLAB_NOISELUMCOARSE;Luminanza grossolana (Wav) +TP_LOCALLAB_NOISELUMDETAIL;Recupero dettaglio luminanza +TP_LOCALLAB_NOISELUMFINE;Luminanza fine 1 (Wav) +TP_LOCALLAB_NOISELUMFINETWO;Luminanza fine 2 (Wav) +TP_LOCALLAB_NOISELUMFINEZERO;Luminanza fine 0 (Wav) +TP_LOCALLAB_NOISEMETH;Rimuovi rumore +TP_LOCALLAB_NOISE_TOOLTIP;Aggiunge rumore di luminanza. +TP_LOCALLAB_NONENOISE;Nessuno +TP_LOCALLAB_NUL_TOOLTIP;. +TP_LOCALLAB_OFFS;Spostamento +TP_LOCALLAB_OFFSETWAV;Spostamento +TP_LOCALLAB_OPACOL;Opacità +TP_LOCALLAB_ORIGLC;Unisci solo con l'immagine originale +TP_LOCALLAB_ORRETILAP_TOOLTIP;Modifica ΔE prima di qualsiasi modifica apportata da 'Scope'. Ciò consente di differenziare l'azione per diverse parti dell'immagine (rispetto ad esempio allo sfondo). +TP_LOCALLAB_ORRETISTREN_TOOLTIP;Agisce sulla soglia laplaciana, maggiore è l'azione, più si ridurranno le differenze di contrasto. +TP_LOCALLAB_PASTELS2;Vivace +TP_LOCALLAB_PDE;Attenuatore contrasto - Compressione della gamma dinamica +TP_LOCALLAB_PDEFRA;Attenuatore contrasto ƒ +TP_LOCALLAB_PDEFRAME_TOOLTIP;Algoritmo PDE IPOL adattato per Rawtherapee: fornisce risultati diversi e richiede impostazioni diverse rispetto al menu principale 'Esposizione'.\nPuò essere utile per immagini sottoesposte o con elevata gamma dinamica. +TP_LOCALLAB_PREVHIDE;Nascondi impostazioni aggiuntive +TP_LOCALLAB_PREVIEW;Anteprima ΔE +TP_LOCALLAB_PREVSHOW;Mostra impostazioni aggiuntive +TP_LOCALLAB_PROXI;Decadimento ΔE +TP_LOCALLAB_QUAAGRES;Aggressivo +TP_LOCALLAB_QUACONSER;Conservatore +TP_LOCALLAB_QUALCURV_METHOD;Tipo di curva +TP_LOCALLAB_QUAL_METHOD;Qualità globale +TP_LOCALLAB_QUANONEALL;Disattivato +TP_LOCALLAB_QUANONEWAV;Significa solo non-locale +TP_LOCALLAB_RADIUS;Raggio +TP_LOCALLAB_RADIUS_TOOLTIP;Utilizza una trasformata veloce di Fourier per raggio > 30. +TP_LOCALLAB_RADMASKCOL;Raggio uniforme +TP_LOCALLAB_RECOTHRES02_TOOLTIP;Se il valore della 'Soglia di ripristino' è maggiore di 1, la maschera in Maschera e Modifiche tiene conto di eventuali modifiche precedenti apportate all'immagine ma non di quelle apportate con lo strumento corrente (es. Colore e Luce, Wavelet, Cam16, ecc.) .)\nSe il valore della 'Soglia di ripristino' è inferiore a 1, la maschera in Maschera e Modifiche non tiene conto di eventuali modifiche precedenti all'immagine.\n\nIn entrambi i casi, la 'Soglia di ripristino' agisce sulla immagine mascherata modificata dallo strumento corrente (Colore e Luce, Wavelet, Cam16, ecc.). +TP_LOCALLAB_RECT;Rettangolo +TP_LOCALLAB_RECURS;Riferimenti ricorsivi +TP_LOCALLAB_RECURS_TOOLTIP;Forza l'algoritmo a ricalcolare i riferimenti dopo l'applicazione di ogni strumento.\nUtile anche per lavorare con le maschere. +TP_LOCALLAB_REN_DIALOG_LAB;Inserisci il nome del nuovo punto di controllo +TP_LOCALLAB_REN_DIALOG_NAME;Rinominare punto di controllo +TP_LOCALLAB_REPARCOL_TOOLTIP;Permette di regolare l'intensità relativa dell'immagine Colore e Luce rispetto all'immagine originale. +TP_LOCALLAB_REPARDEN_TOOLTIP;Permette di regolare l'intensità relativa dell'immagine Rimuovi rumore rispetto all'immagine originale. +TP_LOCALLAB_REPAREXP_TOOLTIP;Consente di regolare la forza relativa dell'immagine Gamma dinamica ed Esposizione rispetto all'immagine originale. +TP_LOCALLAB_REPARSH_TOOLTIP;Consente di regolare l'intensità relativa dell'immagine Ombre/Alte luci e dell'equalizzatore toni rispetto all'immagine originale. +TP_LOCALLAB_REPARTM_TOOLTIP;Permette di regolare la forza relativa dell'immagine di mappatura tono rispetto all'immagine originale. +TP_LOCALLAB_REPARW_TOOLTIP;Permette di regolare l'intensità relativa del contrasto locale e dell'immagine wavelet rispetto all'immagine originale. +TP_LOCALLAB_RESID;Immagine residua +TP_LOCALLAB_RESIDBLUR;Sfoca immagine residua +TP_LOCALLAB_RESIDCHRO;Croma immagine residua +TP_LOCALLAB_RESIDCOMP;Comprimi l'immagine residua +TP_LOCALLAB_RESIDCONT;Contrasto immagine residua +TP_LOCALLAB_RESIDHI;Alteluci +TP_LOCALLAB_RESIDHITHR;Soglia evidenziazioni +TP_LOCALLAB_RESIDSHA;Ombre +TP_LOCALLAB_RESIDSHATHR;Soglia ombre +TP_LOCALLAB_RETI;Rimozione foschia e Retinex +TP_LOCALLAB_RETIFRA;Retinex +TP_LOCALLAB_RETIFRAME_TOOLTIP;Retinex può essere utile per elaborare immagini:\nche sono sfocate, nebbiose o confuse (oltre a Dehaze).\nche contengono grandi differenze di luminanza.\nPuò essere utilizzato anche per effetti speciali (mappatura dei toni). +TP_LOCALLAB_RETIM;Retinex originale +TP_LOCALLAB_RETITOOLFRA;Strumenti Retinex +TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Non ha effetto quando il valore di 'Chiarezza = 1' o 'Scurità =2'.\nPer altri valori, viene applicato l'ultimo passaggio di un algoritmo 'Retinex a scala multipla' (simile a 'contrasto locale'). Questi 2 cursori, associati a 'Intensità', consentono di effettuare regolazioni a monte del contrasto locale. +TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Regola i parametri interni per ottimizzare la risposta.\nPreferibile mantenere i valori 'Dati ripristinati' vicini a Min=0 e Max=32768 (modalità registro), ma sono possibili altri valori. +TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;La modalità logaritmo introduce più contrasto ma genererà anche più aloni. +TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;I cursori del raggio e della varianza ti consentono di regolare la foschia e puntare al primo piano o allo sfondo. +TP_LOCALLAB_RETI_SCALE_TOOLTIP;Se Scala=1, Retinex si comporta come contrasto locale con possibilità aggiuntive.\nAumentando il valore di Scala aumenta l'intensità dell'azione ricorsiva a scapito del tempo di elaborazione. +TP_LOCALLAB_RET_TOOLNAME;Rimozione foschia e Retinex +TP_LOCALLAB_REWEI;La riponderazione itera +TP_LOCALLAB_RGB;Curva toni RGB +TP_LOCALLAB_RGBCURVE_TOOLTIP;In modalità RGB hai 4 scelte: Standard, Standard ponderato, Luminanza e Simil-pellicola. +TP_LOCALLAB_ROW_NVIS;Non visibile +TP_LOCALLAB_ROW_VIS;Visibile +TP_LOCALLAB_RSTPROTECT_TOOLTIP;La protezione del rosso e della tonalità della pelle influisce sui cursori Saturazione, Crominanza e Colore. +TP_LOCALLAB_SATUR;Saturazione +TP_LOCALLAB_SATURV;Saturazione (s) +TP_LOCALLAB_SCALEGR;Scala +TP_LOCALLAB_SCALERETI;Scala +TP_LOCALLAB_SCALTM;Scala +TP_LOCALLAB_SCOPEMASK;Ambito (maschera immagine ΔE) +TP_LOCALLAB_SCOPEMASK_TOOLTIP;Abilitato se la maschera immagine ΔE è abilitata.\nValori bassi evitano il ritocco dell'area selezionata. +TP_LOCALLAB_SENSI;Ambito +TP_LOCALLAB_SENSIEXCLU;Ambito +TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Regola i colori da escludere. +TP_LOCALLAB_SENSIMASK_TOOLTIP;Regolazione dell'ambito specifica per il comune strumento maschera.\nAgisce sulla differenza tra l'immagine originale e la maschera.\nUtilizza i riferimenti luminanza, crominanza e tonalità dal centro dello spot\n\nPuoi anche regolare il ΔE del mascherarsi utilizzando 'Ambito (maschera immagine ΔE)' in 'Impostazioni' > 'Maschera e unisci'. +TP_LOCALLAB_SENSI_TOOLTIP;Regola l'ambito dell'azione:\nValori piccoli limitano l'azione a colori simili a quelli al centro del punto.\nValori alti consentono allo strumento di agire su una gamma più ampia di colori. +TP_LOCALLAB_SETTINGS;Impostazioni +TP_LOCALLAB_SH1;Evidenzia ombre +TP_LOCALLAB_SH2;Equalizzatore +TP_LOCALLAB_SHADEX;Ombre +TP_LOCALLAB_SHADEXCOMP;Compressione delle ombre +TP_LOCALLAB_SHADHIGH;Ombre/luci ed equalizzatore toni +TP_LOCALLAB_SHADHMASK_TOOLTIP;Abbassa le luci della maschera allo stesso modo dell'algoritmo ombre/luci. +TP_LOCALLAB_SHADMASK_TOOLTIP;Alza le ombre della maschera allo stesso modo dell'algoritmo ombre/luci. +TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Regola ombre e luci con i cursori ombre e luci o con un equalizzatore di toni.\nPuò essere utilizzato al posto o insieme al modulo Esposizione.\nPuò anche essere utilizzato come filtro graduato. +TP_LOCALLAB_SHAMASKCOL;Ombre +TP_LOCALLAB_SHAPETYPE;Forma del punto +TP_LOCALLAB_SHAPE_TOOLTIP;'Ellisse' è la modalità normale.\n 'Rettangolo' può essere utilizzato in alcuni casi, ad esempio per lavorare in modalità immagine intera posizionando i delimitatori all'esterno dell'area di anteprima. In questo caso, imposta transizione = 100.\n\nGli sviluppi futuri includeranno forme poligonali e curve di Bezier. +TP_LOCALLAB_SHARAMOUNT;Quantità +TP_LOCALLAB_SHARBLUR;Raggio di sfocatura +TP_LOCALLAB_SHARDAMPING;Smorzamento +TP_LOCALLAB_SHARFRAME;Modifiche +TP_LOCALLAB_SHARITER;Iterazioni +TP_LOCALLAB_SHARP;Nitidezza +TP_LOCALLAB_SHARP_TOOLNAME;Nitidezza +TP_LOCALLAB_SHARRADIUS;Raggio +TP_LOCALLAB_SHORTC;Maschera curve corte 'L' +TP_LOCALLAB_SHORTCMASK_TOOLTIP;Cortocircuita le 2 curve L(L) e L(H).\nPermette di mixare l'immagine corrente con l'immagine originale modificata dal lavoro della maschera.\nUtilizzabile con le maschere 2, 3, 4, 6, 7. +TP_LOCALLAB_SHOWC;Maschera e modifiche +TP_LOCALLAB_SHOWC1;Unisci file +TP_LOCALLAB_SHOWCB;Maschera e modifiche +TP_LOCALLAB_SHOWDCT;Mostra processo Fourier (ƒ). +TP_LOCALLAB_SHOWE;Maschera e modifiche +TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) +TP_LOCALLAB_SHOWLAPLACE;∆ Laplaciano (primo) +TP_LOCALLAB_SHOWLC;Maschera e modifiche +TP_LOCALLAB_SHOWMASK;Mostra maschera +TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Visualizza maschere e modifiche.\nAttenzione, puoi visualizzare solo una maschera strumento alla volta.\nMostra immagine modificata: mostra l'immagine modificata compreso l'effetto di eventuali regolazioni e maschere.\nMostra aree modificate senza maschera: mostra le modifiche prima dell'applicazione di qualsiasi maschera.\nMostra aree modificate con maschera: mostra le modifiche dopo l'applicazione di una maschera.\nMostra maschera: mostra l'aspetto della maschera compreso l'effetto di eventuali curve e filtri.\nMostra struttura spot: consente di vedere la maschera di rilevamento della struttura quando il cursore 'Spot struttura' è attivato (se disponibile).\nNota: la maschera viene applicata prima dell'algoritmo di rilevamento della forma. +TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Permette di visualizzare le diverse fasi del processo di Fourier.\n Laplace - calcola la derivata seconda della trasformata di Laplace in funzione della soglia.\nFourier - mostra la trasformata laplaciana con DCT.\nPoisson - mostra la soluzione del Poisson DCE.\nNessuna normalizzazione della luminanza: mostra il risultato senza alcuna normalizzazione della luminanza. +TP_LOCALLAB_SHOWMASKTYP1;Sfocatura e rumore +TP_LOCALLAB_SHOWMASKTYP2;Rimuovi rumore +TP_LOCALLAB_SHOWMASKTYP3;Sfocatura e rumore + Rimuovi rumore +TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Può essere utilizzato con 'Maschera e modifiche'.\nSe è selezionato 'Sfocatura e rumore', la maschera non può essere utilizzata per Rimuovi rumore.\nSe è selezionato Riduci rumore, la maschera non può essere utilizzata per 'Sfocatura e rumore'.\ nSe è selezionato 'Sfocatura e rumore + Riduzione rumore', la maschera viene condivisa. Tieni presente che in questo caso, i cursori dell'ambito sia per "Sfocatura e rumore" che per Riduci rumore saranno attivi, quindi è consigliabile utilizzare l'opzione "Mostra modifiche con maschera" quando si apportano eventuali modifiche. +TP_LOCALLAB_SHOWMNONE;Mostra immagine modificata +TP_LOCALLAB_SHOWMODIF;Mostra le aree modificate senza maschera +TP_LOCALLAB_SHOWMODIF2;Mostra aree modificate +TP_LOCALLAB_SHOWMODIFMASK;Mostra aree modificate con maschera +TP_LOCALLAB_SHOWNORMAL;Nessuna normalizzazione della luminanza +TP_LOCALLAB_SHOWPLUS;Maschera e modifiche (Sfocatura e Riduzione rumore) +TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) +TP_LOCALLAB_SHOWR;Maschera e modifiche +TP_LOCALLAB_SHOWREF;Anteprima ΔE +TP_LOCALLAB_SHOWS;Maschera e modifiche +TP_LOCALLAB_SHOWSTRUC;Mostra struttura spot(Avanzato) +TP_LOCALLAB_SHOWSTRUCEX;Mostra struttura spot(Avanzato) +TP_LOCALLAB_SHOWT;Maschera e modifiche +TP_LOCALLAB_SHOWVI;Maschera e modifiche +TP_LOCALLAB_SHRESFRA;Ombre/Alte luci e TRC +TP_LOCALLAB_SHTRC_TOOLTIP;In base al 'profilo di lavoro' (solo quelli forniti), modifica i toni dell'immagine agendo su una TRC (Curva di risposta del tono).\nGamma agisce principalmente sui toni chiari.\nSlope agisce principalmente sui toni scuri.\n si consiglia che il TRC di entrambi i dispositivi (monitor e profilo di output) sia sRGB (predefinito). +TP_LOCALLAB_SH_TOOLNAME;Ombre/luci ed equalizzatore toni +TP_LOCALLAB_SIGFRA;Sigmoide Q e codifica registro Q +TP_LOCALLAB_SIGJZFRA;Sigmoide Jz +TP_LOCALLAB_SIGMAWAV;Risposta di attenuazione +TP_LOCALLAB_SIGMOIDBL;Miscela +TP_LOCALLAB_SIGMOIDLAMBDA;Contrasto +TP_LOCALLAB_SIGMOIDQJ;Utilizza Ev nero e Ev bianco +TP_LOCALLAB_SIGMOIDTH;Soglia (punto grigio) +TP_LOCALLAB_SIGMOID_TOOLTIP;Permette di simulare un aspetto di Tone-mapping utilizzando sia la funzione 'Ciecam' (o 'Jz') che 'Sigmoid'.\nTre slider: a) Il contrasto agisce sulla forma della curva sigmoidea e di conseguenza sull'intensità ; b) Soglia (punto grigio) distribuisce l'azione in base alla luminanza; c)Blend agisce sull'aspetto finale dell'immagine, contrasto e luminanza. +TP_LOCALLAB_SLOMASKCOL;Pendenza +TP_LOCALLAB_SLOMASK_TOOLTIP;La regolazione di Gamma e Pendenza può fornire una trasformazione morbida e priva di artefatti della maschera modificando progressivamente 'L' per evitare eventuali discontinuità. +TP_LOCALLAB_SLOSH;Pendenza +TP_LOCALLAB_SOFT;Luce soffusa e Retinex originale +TP_LOCALLAB_SOFTM;Luce soffusa +TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Applica una miscela di luce soffusa (identica alla regolazione globale). Esegui scherma e brucia utilizzando l'algoritmo Retinex originale. +TP_LOCALLAB_SOFTRADIUSCOL;Raggio morbido +TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applica un filtro guidato all'immagine di output per ridurre possibili artefatti. +TP_LOCALLAB_SOFTRETI;Riduci gli artefatti ΔE +TP_LOCALLAB_SOFT_TOOLNAME;Luce soffusa e Retinex originale +TP_LOCALLAB_SOURCE_ABS;Luminanza assoluta +TP_LOCALLAB_SOURCE_GRAY;Luminanza media (Yb%) +TP_LOCALLAB_SPECCASE;Casi specifici +TP_LOCALLAB_SPECIAL;Utilizzo speciale delle curve RGB +TP_LOCALLAB_SPECIAL_TOOLTIP;La casella di controllo ti consente di rimuovere tutte le altre azioni, ad esempio 'Ambito', maschere, cursori ecc., (eccetto le transizioni) e utilizzare solo l'effetto della curva di tono RGB. +TP_LOCALLAB_SPOTNAME;Nuovo punto +TP_LOCALLAB_STD;Standard +TP_LOCALLAB_STR;Intensità +TP_LOCALLAB_STRBL;Intensità +TP_LOCALLAB_STREN;Resistenza alla compressione +TP_LOCALLAB_STRENG;Intensità +TP_LOCALLAB_STRENGR;Intensità +TP_LOCALLAB_STRENGRID_TOOLTIP;Puoi regolare l'effetto desiderato con 'forza', ma puoi anche utilizzare la funzione 'ambito' che ti permette di delimitare l'azione (ad esempio per isolare un colore particolare). +TP_LOCALLAB_STRENGTH;Rumore +TP_LOCALLAB_STRGRID;Intento +TP_LOCALLAB_STRUC;Struttura +TP_LOCALLAB_STRUCCOL;Struttura del punto +TP_LOCALLAB_STRUCCOL1;Struttura del punto +TP_LOCALLAB_STRUCT_TOOLTIP;Utilizza l'algoritmo Sobel per prendere in considerazione la struttura per il rilevamento della forma.\nAttiva 'Maschera e modifiche' > 'Mostra struttura spot' (Modalità avanzata) per vedere un'anteprima della maschera (senza modifiche).\n\nPuò essere utilizzato insieme alla maschera di struttura, alla maschera di sfocatura e al "Contrasto locale" (per livello wavelet) per migliorare il rilevamento dei bordi.\n\nEffetti delle regolazioni utilizzando Luminosità, Contrasto, Crominanza, Esposizione o altri strumenti non correlati alla maschera visibili utilizzando 'Mostra immagine modificata' o 'Mostra aree modificate con maschera'. +TP_LOCALLAB_STRUMASKCOL;Intensità maschera struttura +TP_LOCALLAB_STRUMASK_TOOLTIP;Maschera struttura (slider) con la casella di controllo 'Maschera struttura come strumento' deselezionata: In questo caso verrà generata una maschera che mostra la struttura anche se nessuna delle 3 curve è attivata. Le maschere di struttura sono disponibili per maschera (Sfocatura e riduzione disturbo) e maschera (Colore e luce). +TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Si consiglia un uso moderato di questo cursore! +TP_LOCALLAB_STYPE;Metodo forma +TP_LOCALLAB_STYPE_TOOLTIP;Puoi scegliere tra:\nSimmetrico - maniglia sinistra collegata a destra, maniglia superiore collegata a quella inferiore.\nIndipendente - tutte le maniglie sono indipendenti. +TP_LOCALLAB_SYM;Simmetrico (mouse) +TP_LOCALLAB_SYMSL;Simmetrico (mouse + cursori) +TP_LOCALLAB_TARGET_GRAY;Luminanza media (Yb%) +TP_LOCALLAB_TE_PIVOT;Pivot (Ev) +TP_LOCALLAB_THRES;Struttura della soglia +TP_LOCALLAB_THRESDELTAE;Soglia ambito ΔE +TP_LOCALLAB_THRESRETI;Soglia +TP_LOCALLAB_THRESWAV;Soglia di bilanciamento +TP_LOCALLAB_TLABEL;TM Min=%1 Max=%2 Media=%3 Sig=%4 +TP_LOCALLAB_TLABEL_TOOLTIP;Risultato della mappa di trasmissione.\nMin e Max sono utilizzati dalla varianza.\nTm=Min TM=Max della mappa di trasmissione.\nPuoi normalizzare i risultati con il cursore della soglia. +TP_LOCALLAB_TM;Mappatura toni +TP_LOCALLAB_TM_MASK;Utilizza mappa di trasmissione +TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;Questo cursore influisce sulla sensibilità dei bordi.\n Maggiore è il valore, più è probabile che un cambiamento di contrasto venga interpretato come un 'bordo'.\n Se impostato su zero, la mappatura dei toni avrà un effetto simile alla maschera di contrasto. +TP_LOCALLAB_TONEMAPGAM_TOOLTIP;Il cursore Gamma sposta l'effetto di mappatura dei toni verso le ombre o le luci. +TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In alcuni casi la mappatura dei toni può risultare in un aspetto da cartone animato, e in alcuni rari casi possono apparire aloni morbidi ma ampi.\n Aumentare il numero di iterazioni di riponderazione aiuterà a combattere alcuni di questi problemi. +TP_LOCALLAB_TONEMAP_TOOLTIP;Uguale allo strumento di mappatura dei toni nel menu principale.\nLo strumento del menu principale deve essere disattivato se si utilizza questo strumento. +TP_LOCALLAB_TONEMASCALE_TOOLTIP;Questo cursore ti consente di regolare la transizione tra il contrasto 'locale' e 'globale'.\nMaggiore è il valore, maggiore deve essere il dettaglio per essere potenziato. +TP_LOCALLAB_TONE_TOOLNAME;Mappatura toni +TP_LOCALLAB_TOOLCOL;Maschera struttura come strumento +TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Permette di modificare la maschera, se ne esiste una. +TP_LOCALLAB_TOOLMASK;Strumenti maschera +TP_LOCALLAB_TOOLMASK_2;Wavelets +TP_LOCALLAB_TOOLMASK_TOOLTIP;Maschera struttura (slider) con la casella di controllo 'Maschera struttura come strumento' selezionata: in questo caso una maschera che mostra la struttura verrà generata dopo che una o più delle 2 curve L(L) o LC(H) sono state modificate .\n Qui, la 'Maschera Struttura' si comporta come gli altri strumenti Maschera: Gamma, Pendenza, ecc.\n Permette di variare l'azione sulla maschera in base alla struttura dell'immagine. +TP_LOCALLAB_TRANSIT;Gradiente di transizione +TP_LOCALLAB_TRANSITGRAD;Differenziazione transizione XY +TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Permette di variare la transizione dell'asse y. +TP_LOCALLAB_TRANSITVALUE;Valore di transizione +TP_LOCALLAB_TRANSITWEAK;Decadimento della transizione (log lineare) +TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Regola la funzione di decadimento della transizione: 1 lineare, 2 parabolica, 3 cubica fino a ^25.\nPuò essere utilizzato insieme a valori di transizione molto bassi per ridurre i difetti (CBDL, Wavelets, Colore e Luce). +TP_LOCALLAB_TRANSIT_TOOLTIP;Regola la morbidezza della transizione tra le aree interessate e quelle non interessate come percentuale del 'raggio'. +TP_LOCALLAB_TRANSMISSIONGAIN;Guadagno di trasmissione +TP_LOCALLAB_TRANSMISSIONMAP;Mappa di trasmissione +TP_LOCALLAB_TRANSMISSION_TOOLTIP;Trasmissione secondo la trasmissione.\nAscissa: trasmissione da valori negativi (min), media e valori positivi (max).\nOrdinata: amplificazione o riduzione.\nÈ possibile regolare questa curva per modificare la trasmissione e ridurre gli artefatti. +TP_LOCALLAB_USEMASK;Laplaciano +TP_LOCALLAB_VART;Varianza (contrasto) +TP_LOCALLAB_VIBRANCE;Vivace e caldo/freddo +TP_LOCALLAB_VIBRA_TOOLTIP;Regola la vivacità (essenzialmente uguale alla regolazione globale).\nEsegue l'equivalente di una regolazione del bilanciamento del bianco utilizzando un algoritmo CIECAM. +TP_LOCALLAB_VIB_TOOLNAME;Vibranza e caldo/freddo +TP_LOCALLAB_VIS_TOOLTIP;Fai clic per mostrare/nascondere tutti i punti di controllo selezionati.\nCtrl+clic per mostrare/nascondere tutti i punti di controllo. +TP_LOCALLAB_WARM;Artefatti caldo/freddo e colore +TP_LOCALLAB_WARM_TOOLTIP;Questo cursore utilizza l'algoritmo CIECAM e agisce come controllo del bilanciamento del bianco per rendere la temperatura del colore dell'area selezionata più calda o più fredda.\nIn alcuni casi può anche ridurre gli artefatti di colore. +TP_LOCALLAB_WASDEN_TOOLTIP;Riduzione del rumore di luminanza: il lato sinistro della curva compreso il confine grigio scuro/grigio chiaro corrisponde ai primi 3 livelli 0, 1, 2 (dettaglio fine). Il lato destro della curva corrisponde ai dettagli più grossolani (livello 3, 4, 5, 6). +TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Bilancia l'azione all'interno di ogni livello. +TP_LOCALLAB_WAT_BLURLC_TOOLTIP;L'impostazione di sfocatura predefinita influisce su tutti e 3 i componenti L*a* b* (luminanza e colore).\nSe selezionata, solo la luminanza viene sfocata. +TP_LOCALLAB_WAT_CLARIC_TOOLTIP;'Unisci crominanza' viene utilizzato per selezionare l'intensità dell'effetto desiderato sulla crominanza. +TP_LOCALLAB_WAT_CLARIL_TOOLTIP;'Unisci luminanza' viene utilizzato per selezionare l'intensità dell'effetto desiderato sulla luminanza. +TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;'Livelli di crominanza': regola i componenti 'a' e 'b' di Lab* come proporzione del valore di luminanza. +TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;L'offset modifica l'equilibrio tra i dettagli a basso e ad alto contrasto.\nValori elevati amplificheranno le modifiche del contrasto ai dettagli a contrasto più elevato, mentre valori bassi amplificheranno le modifiche del contrasto ai dettagli a basso contrasto.\nUtilizzando un ' basso Dal valore della risposta di attenuazione è possibile selezionare quali valori di contrasto verranno migliorati. +TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;Spostando il cursore verso sinistra, i livelli inferiori vengono accentuati. A destra i livelli inferiori vengono ridotti e quelli superiori accentuati. +TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;L'immagine residua si comporta allo stesso modo dell'immagine principale quando si apportano modifiche al contrasto, alla crominanza, ecc. +TP_LOCALLAB_WAT_GRADW_TOOLTIP;Più si sposta il cursore verso destra, più efficace sarà l'algoritmo di rilevamento e meno evidenti saranno gli effetti del contrasto locale. +TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Contrasto locale da basso ad alto da sinistra a destra sull'asse x.\nAumenta o diminuisce il contrasto locale sull'asse y. +TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;Puoi regolare la distribuzione del contrasto locale in base al livello wavelet in base all'intensità iniziale del contrasto. Ciò modificherà gli effetti della prospettiva e del rilievo nell'immagine e/o ridurrà i valori di contrasto per livelli di contrasto iniziali molto bassi. +TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;'Unisci solo con immagine originale', impedisce alle impostazioni della 'Piramide Wavelet' di interferire con 'Chiarezza' e 'Maschera di nitidezza'. +TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Sfoca l'immagine residua, indipendentemente dai livelli. +TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Comprime l'immagine residua per aumentare o ridurre il contrasto. +TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;L'effetto della regolazione del contrasto locale è più forte per i dettagli a contrasto medio e più debole per i dettagli ad alto e basso contrasto.\n Questo cursore controlla quanto velocemente l'effetto si attenua verso i contrasti estremi.\nPiù alto è il valore del cursore , più ampia è la gamma di contrasti che riceverà il pieno effetto della regolazione del contrasto locale e maggiore è il rischio di generare artefatti.\nPiù basso è il valore, più l'effetto sarà localizzato verso una gamma ristretta di valori di contrasto. +TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensità del rilevamento dell'effetto bordo. +TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Permette di variare il contrasto locale in base al gradiente e all'angolo scelti. Viene presa in considerazione la variazione del segnale di luminanza e non la luminanza. +TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Gamma di livelli wavelet utilizzati nel modulo Wavelet. +TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Ti permette di sfocare ogni livello di scomposizione.\nI livelli di scomposizione dal più piccolo al più grossolano vanno da sinistra a destra. +TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Simile a Contrasto per livelli di dettaglio. Livelli di dettaglio da fine a grossolano da sinistra a destra sull'asse x. +TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Agisce sull'equilibrio delle tre direzioni (orizzontale, verticale e diagonale) in base alla luminanza dell'immagine.\nPer impostazione predefinita le ombre o le luci vengono ridotte per evitare artefatti. +TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Mostra tutti gli strumenti 'Nitidezza bordi'. Si consiglia di leggere la documentazione sui Livelli Wavelet. +TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Permette di regolare l'effetto massimo della sfocatura sui livelli. +TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Contrasto locale da basso ad alto da sinistra a destra sull'asse x\nAumenta o diminuisce il contrasto locale sull'asse y. +TP_LOCALLAB_WAT_WAVTM_TOOLTIP;La parte inferiore (negativa) comprime ciascun livello di scomposizione creando un effetto di mappatura dei toni.\nLa parte superiore (positiva) attenua il contrasto per livello.\nI livelli di scomposizione da più piccoli a più grossolani sono da sinistra a destra sulla x- asse. +TP_LOCALLAB_WAV;Contrasto locale +TP_LOCALLAB_WAVBLUR_TOOLTIP;Permette di sfocare ogni livello della scomposizione, così come l'immagine residua. +TP_LOCALLAB_WAVCOMP;Compressione per livello +TP_LOCALLAB_WAVCOMPRE;Compressione per livello +TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Consente di applicare la mappatura dei toni o ridurre il contrasto locale su livelli individuali.\nLivelli di dettaglio da fine a grossolano da sinistra a destra sull'asse x. +TP_LOCALLAB_WAVCOMP_TOOLTIP;Permette di applicare il contrasto locale in base alla direzione della scomposizione wavelet: orizzontale, verticale, diagonale. +TP_LOCALLAB_WAVCON;Contrasto per livello +TP_LOCALLAB_WAVCONTF_TOOLTIP;Simile a Contrasto per livelli di dettaglio. Livelli di dettaglio da fine a grossolano da sinistra a destra sull'asse x. +TP_LOCALLAB_WAVDEN;Rimozione rumore luminanza +TP_LOCALLAB_WAVE;Wavelet +TP_LOCALLAB_WAVEDG;Contrasto locale +TP_LOCALLAB_WAVEEDG_TOOLTIP;Migliora la nitidezza mirando all'azione del contrasto locale sui bordi. Ha le stesse funzioni del modulo corrispondente in Livelli Wavelet e utilizza le stesse impostazioni. +TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Gamma di livelli wavelet utilizzati in 'Contrasto locale' (per livello wavelet). +TP_LOCALLAB_WAVGRAD_TOOLTIP;Permette di variare il contrasto locale in base al gradiente e all'angolo scelti. Viene presa in considerazione la variazione del segnale di luminanza e non la luminanza. +TP_LOCALLAB_WAVHUE_TOOLTIP;Permette di ridurre o aumentare la riduzione del rumore in base alla tonalità. +TP_LOCALLAB_WAVLEV;Sfocatura per livello +TP_LOCALLAB_WAVMASK;Contrasto locale +TP_LOCALLAB_WAVMASK_TOOLTIP;Utilizza wavelet per modificare il contrasto locale della maschera e rinforzare o ridurre la struttura (pelle, edifici, ecc.). +TP_LOCALLAB_WEDIANHI;Medio alto +TP_LOCALLAB_WHITE_EV;Compensazione dell'esposizione del bianco +TP_LOCALLAB_ZCAMFRA;Regolazioni immagine ZCAM +TP_LOCALLAB_ZCAMTHRES;Recupera alti dati +TP_LOCAL_HEIGHT;Basso +TP_LOCAL_HEIGHT_T;Alto +TP_LOCAL_WIDTH;Destro +TP_LOCAL_WIDTH_L;Sinistro +TP_LOCRETI_METHOD_TOOLTIP;Basso = Rinforza la luce scarsa.\Uniformemente = Distribuito uniformemente.\Alto = Rinforza la luce forte. +TP_METADATA_EDIT;Apply modifications +TP_METADATA_MODE;Modalità di copia dei metadati +TP_METADATA_STRIP;Elimina tutti i metadati +TP_METADATA_TUNNEL;Copia invariata +TP_NEUTRAL;Ripristina 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 TP_PCVIGNETTE_ROUNDNESS;Rotondità TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Rotondità:\n0 = rettangolo,\n50 = ellisse riempito,\n100 = cerchio. -TP_PCVIGNETTE_STRENGTH;Forza -TP_PCVIGNETTE_STRENGTH_TOOLTIP;Forza del filtro in stop (raggiunta agli angoli). +TP_PCVIGNETTE_STRENGTH;intensità +TP_PCVIGNETTE_STRENGTH_TOOLTIP;intensità del filtro in stop (raggiunta agli angoli). +TP_PDSHARPENING_LABEL;Acquisisci nitidezza +TP_PERSPECTIVE_CAMERA_CROP_FACTOR;Fattore di ritaglio +TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Lunghezza focale +TP_PERSPECTIVE_CAMERA_FRAME;Correzione +TP_PERSPECTIVE_CAMERA_PITCH;Verticale +TP_PERSPECTIVE_CAMERA_ROLL;Rotazione +TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Spostamento orizzontale +TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Spostamento verticale +TP_PERSPECTIVE_CAMERA_YAW;Orizzontale +TP_PERSPECTIVE_CONTROL_LINES;Linee di controllo +TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Ctrl+trascina: traccia una nuova riga\nclic destro: elimina la riga +TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP;Sono necessarie almeno due linee di controllo orizzontali o due verticali. TP_PERSPECTIVE_HORIZONTAL;Orizzontale TP_PERSPECTIVE_LABEL;Prospettiva +TP_PERSPECTIVE_METHOD;Metodo +TP_PERSPECTIVE_METHOD_CAMERA_BASED;Camera-base +TP_PERSPECTIVE_METHOD_SIMPLE;Semplice +TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Aggiustamento post-correzione +TP_PERSPECTIVE_PROJECTION_PITCH;Verticale +TP_PERSPECTIVE_PROJECTION_ROTATE;Rotatione +TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Spostamento orizzontale +TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Spostamento verticale +TP_PERSPECTIVE_PROJECTION_YAW;Orizzontale +TP_PERSPECTIVE_RECOVERY_FRAME;Recupera TP_PERSPECTIVE_VERTICAL;Verticale TP_PFCURVE_CURVEEDITOR_CH;Tonalità TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controlla la forza di defringe dal colore.\nPiù alto = di più,\nPiù basso = di meno. +TP_PREPROCESS_DEADPIXFILT;Filtro pixel morti +TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tenta di sopprimere i pixel morti. TP_PREPROCESS_GREENEQUIL;Bilanciamento del verde +TP_PREPROCESS_HOTPIXFILT;Filtro pixel bruciati +TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tenta di sopprimere i pixel bruciati. TP_PREPROCESS_LABEL;Pre-elaborazione TP_PREPROCESS_LINEDENOISE;Filtro per rumore a bande +TP_PREPROCESS_LINEDENOISE_DIRECTION;Direzione +TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Entrambi +TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Orizzontale +TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Orizzontale solo su righe PDAF +TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Verticale TP_PREPROCESS_NO_FOUND;Nessuno presente +TP_PREPROCESS_PDAFLINESFILTER;Filtro linee PDAF +TP_PREPROCWB_LABEL;Preelaborare il bilanciamento del bianco +TP_PREPROCWB_MODE;Modo +TP_PREPROCWB_MODE_AUTO;Auto +TP_PREPROCWB_MODE_CAMERA;Camera +TP_PRSHARPENING_LABEL;Nitidezza post-ridimensionamento +TP_PRSHARPENING_TOOLTIP;Rende più nitida l'immagine dopo il ridimensionamento. Funziona solo quando viene utilizzato il metodo di ridimensionamento 'Lanczos'. È impossibile prevedere in anteprima gli effetti di questo strumento. Vedi RawPedia per le istruzioni d'uso. TP_RAWCACORR_AUTO;Autocorrezione +TP_RAWCACORR_AUTOIT;Iterazioni +TP_RAWCACORR_AUTOIT_TOOLTIP;Questa impostazione è disponibile se è selezionata l'opzione "Correzione automatica".\nLa correzione automatica è conservativa, ovvero spesso non corregge tutta l'aberrazione cromatica.\nPer correggere l'aberrazione cromatica rimanente, puoi utilizzare fino a cinque iterazioni dell'aberrazione cromatica automatica. correzione.\nOgni iterazione ridurrà l'aberrazione cromatica rimanente dall'ultima iterazione al costo di ulteriore tempo di elaborazione. +TP_RAWCACORR_AVOIDCOLORSHIFT;Evita il cambiamento di colore TP_RAWCACORR_CABLUE;Blu TP_RAWCACORR_CARED;Rosso TP_RAWCACORR_LABEL;Correzione AC +TP_RAWEXPOS_BLACK_0;Verde 1 (guida) +TP_RAWEXPOS_BLACK_1;Rosso +TP_RAWEXPOS_BLACK_2;Blu +TP_RAWEXPOS_BLACK_3;Verde 2 +TP_RAWEXPOS_BLACK_BLUE;Blu +TP_RAWEXPOS_BLACK_GREEN;Verde +TP_RAWEXPOS_BLACK_RED;Rosso TP_RAWEXPOS_LINEAR;Punto del Bianco - Correzione +TP_RAWEXPOS_RGB;Rosso, Verde, Blu TP_RAWEXPOS_TWOGREEN;Valori del verde uniti +TP_RAW_1PASSMEDIUM;1-passaggio (Markesteijn) +TP_RAW_2PASS;1-passaggio+veloce +TP_RAW_3PASSBEST;3-passaggi (Markesteijn) +TP_RAW_4PASS;3-passaggi+veloce +TP_RAW_AHD;AHD +TP_RAW_AMAZE;AMaZE +TP_RAW_AMAZEBILINEAR;AMaZE+Bilineare +TP_RAW_AMAZEVNG4;AMaZE+VNG4 +TP_RAW_BORDER;Bordo +TP_RAW_DCB;DCB +TP_RAW_DCBBILINEAR;DCB+Bilineare TP_RAW_DCBENHANCE;Miglioramento DCB TP_RAW_DCBITERATIONS;Numero di iterazioni DCB +TP_RAW_DCBVNG4;DCB+VNG4 TP_RAW_DMETHOD;Metodo TP_RAW_DMETHOD_PROGRESSBAR;Demosaicizzazione %1... TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Perfezionamento della demosaicizzazione... TP_RAW_DMETHOD_TOOLTIP;Nota: IGV e LMMSE sono dedicati alle immagini ad alti ISO per aiutare nella riduzione rumore senza comportare posterizzazione o colori lavati. +TP_RAW_DUALDEMOSAICAUTOCONTRAST;Soglia Automatica +TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;Se la casella è selezionata (consigliato), RawTherapee calcola un valore ottimale in base alle regioni piatte nell'immagine.\nSe non c'è alcuna regione piatta nell'immagine o se l'immagine è troppo rumorosa, il valore verrà impostato su 0.\nPer impostare il valore manualmente, deselezionare prima la casella di controllo (valori ragionevoli dipendono dall'immagine). +TP_RAW_DUALDEMOSAICCONTRAST;Soglia di contrasto +TP_RAW_EAHD;EAHD TP_RAW_FALSECOLOR;Stadi per soppressione di falsi colori +TP_RAW_FAST;Veloce +TP_RAW_HD;Soglia +TP_RAW_HD_TOOLTIP;Valori più bassi rendono il rilevamento dei pixel caldi/morti più aggressivo, ma i falsi positivi possono causare artefatti. Se noti artefatti quando abiliti i filtri pixel caldi/morti, aumenta gradualmente il valore di soglia finché non scompaiono. +TP_RAW_HPHD;HPHD +TP_RAW_IGV;IGV +TP_RAW_IMAGENUM;Immagine secondaria +TP_RAW_IMAGENUM_SN;Modo SN +TP_RAW_IMAGENUM_TOOLTIP;Alcuni file RAW sono costituiti da diverse immagini secondarie (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\n\nQuando si utilizza qualsiasi metodo di demosaicizzazione diverso da Pixel Shift, questo seleziona quali sotto-immagini viene utilizzata l'immagine.\n\nQuando si utilizza il metodo di demosaicizzazione Pixel Shift su un Pixel Shift raw, vengono utilizzate tutte le immagini secondarie e viene selezionato quale immagine secondaria deve essere utilizzata per lo spostamento delle parti. TP_RAW_LABEL;Demosaicizzazione +TP_RAW_LMMSE;LMMSE TP_RAW_LMMSEITERATIONS;Passaggi di miglioramento LMMSE TP_RAW_LMMSE_TOOLTIP;Aggiunge gamma (passo 1) - Aggiunge mediana (passi 2-4), poi perfeziona (passi 5-6) per ridurre gli artefatti e migliorare il rapporto segnale/rumore. +TP_RAW_MONO;Mono +TP_RAW_NONE;Nessuno (mostra il modello del sensore) +TP_RAW_PIXELSHIFT;Pixel Shift (spostamento dei pixel) +TP_RAW_PIXELSHIFTAVERAGE;Utilizzare la media per le parti in movimento +TP_RAW_PIXELSHIFTAVERAGE_TOOLTIP;Utilizza la media di tutti i fotogrammi invece del fotogramma selezionato per le regioni con movimento.\nFornisce effetti di movimento su oggetti che si muovono lentamente (sovrapposti). +TP_RAW_PIXELSHIFTBLUR;Maschera di movimento sfocato +TP_RAW_PIXELSHIFTDMETHOD;Metodo di demosaicizzazione per il movimento +TP_RAW_PIXELSHIFTEPERISO;Sensibilità +TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;Il valore predefinito di 0 dovrebbe funzionare correttamente per l'ISO di base.\nValori più alti aumentano la sensibilità del rilevamento del movimento.\nCambia a piccoli passi e osserva la maschera di movimento mentre cambia.\nAumenta la sensibilità per immagini sottoesposte o con ISO elevati. +TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalizza la luminosità dei fotogrammi +TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;Equalizza per canale +TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Abilitato: equalizza i canali RGB individualmente.\nDisabilitato: utilizza lo stesso fattore di equalizzazione per tutti i canali. +TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalizza la luminosità dei fotogrammi alla luminosità del fotogramma selezionato.\nSe ci sono aree sovraesposte nei fotogrammi, seleziona il fotogramma più luminoso per evitare la dominante di colore magenta nelle aree sovraesposte o abilitare la correzione del movimento. +TP_RAW_PIXELSHIFTGREEN;Controllare il movimento nel canale verde +TP_RAW_PIXELSHIFTHOLEFILL;Riempi i buchi nella maschera di movimento +TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Riempi i buchi nella maschera di movimento. +TP_RAW_PIXELSHIFTMEDIAN;Utilizzare la mediana per le parti in movimento +TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Utilizza la mediana di tutti i fotogrammi anziché il fotogramma selezionato per le regioni con movimento.\nRimuove gli oggetti che si trovano in posizioni diverse in tutti i fotogrammi.\nConferisce un effetto di movimento agli oggetti che si muovono lentamente (sovrapposti). +TP_RAW_PIXELSHIFTMM_AUTO;Automatico +TP_RAW_PIXELSHIFTMM_CUSTOM;Personalizzato +TP_RAW_PIXELSHIFTMM_OFF;Chiuso +TP_RAW_PIXELSHIFTMOTIONMETHOD;Correzione del movimento +TP_RAW_PIXELSHIFTNONGREENCROSS;Controllare i canali rosso/blu per il movimento +TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask +TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Mostra solo la maschera di movimento +TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Mostra la maschera di movimento senza l'immagine. +TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Sovrappone l'immagine con una maschera verde che mostra le regioni in movimento. +TP_RAW_PIXELSHIFTSIGMA;Raggio di sfocatura +TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;Il raggio predefinito di 1,0 di solito si adatta bene agli ISO di base.\nAumenta il valore per gli scatti con ISO elevati, 5,0 è un buon punto di partenza.\nGuarda la maschera di movimento mentre modifichi il valore. +TP_RAW_PIXELSHIFTSMOOTH;Transizioni fluide +TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Transizioni uniformi tra aree con movimento e aree senza.\nImposta su 0 per disattivare l'arrotondamento della transizione.\nImposta su 1 per ottenere il risultato AMaZE/LMMSE del fotogramma selezionato (a seconda che sia selezionato "Utilizza LMMSE") o la mediana di tutti e quattro i fotogrammi se è selezionato 'Usa mediana'. +TP_RAW_RCD;RCD +TP_RAW_RCDBILINEAR;RCD+Bilineare +TP_RAW_RCDVNG4;RCD+VNG4 +TP_RAW_SENSOR_BAYER_LABEL;Sensore con Matrice di Bayer +TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;La modalità a 3 passaggi offre i migliori risultati (consigliata per immagini a ISO bassi).\nLa modalità a 1 passaggio è quasi indistinguibile dalla modalità a 3 passaggi per immagini a ISO elevati ed è più veloce.\n+la modalità veloce fornisce meno artefatti nelle aree piatte. +TP_RAW_SENSOR_XTRANS_LABEL;Sensore con Matrice X-Trans +TP_RAW_VNG4;VNG4 +TP_RAW_XTRANS;X-Trans +TP_RAW_XTRANSFAST;Fast X-Trans +TP_RESIZE_ALLOW_UPSCALING;Consenti l'upscaling TP_RESIZE_APPLIESTO;Applica a: TP_RESIZE_CROPPEDAREA;Zona ritagliata TP_RESIZE_FITBOX;Riquadro delimitato @@ -1088,12 +3704,95 @@ TP_RESIZE_H;A: TP_RESIZE_HEIGHT;Altezza TP_RESIZE_LABEL;Ridimensiona TP_RESIZE_LANCZOS;Lanczos +TP_RESIZE_LE;Bordo lungo: +TP_RESIZE_LONG;Bordo lungo TP_RESIZE_METHOD;Metodo: TP_RESIZE_NEAREST;Più prossimo (Nearest) TP_RESIZE_SCALE;Scala +TP_RESIZE_SE;Bordo corto: +TP_RESIZE_SHORT;Bordo corto TP_RESIZE_SPECIFY;Specifica: TP_RESIZE_W;L: TP_RESIZE_WIDTH;Larghezza +TP_RETINEX_CONTEDIT_HSL;HSL istogramma +TP_RETINEX_CONTEDIT_LAB;L*a*b* istogramma +TP_RETINEX_CONTEDIT_LH;Tonalità +TP_RETINEX_CONTEDIT_MAP;Equalizzatore +TP_RETINEX_CURVEEDITOR_CD;L=f(L) +TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminanza in base alla luminanza L=f(L)\nCorreggere i dati grezzi per ridurre aloni e artefatti. +TP_RETINEX_CURVEEDITOR_LH;Intensità=f(H) +TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Intensità in base alla tonalità Intensità=f(H)\nQuesta curva agisce anche sulla crominanza quando si utilizza il metodo Retinex 'Alteluci'. +TP_RETINEX_CURVEEDITOR_MAP;L=f(L) +TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;Questa curva può essere applicata da sola o con una maschera gaussiana o una maschera wavelet.\nAttenzione agli artefatti! +TP_RETINEX_EQUAL;Equalizzatore +TP_RETINEX_FREEGAMMA;Gamma libera +TP_RETINEX_GAIN;Guadagno +TP_RETINEX_GAINOFFS;Guadagno e compensazione (luminosità) +TP_RETINEX_GAINTRANSMISSION;Transmissione guadagno +TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Aumentare o ridurre la mappa di trasmissione per ottenere la luminanza desiderata. L'asse x è la trasmissione. L'asse y è il guadagno. +TP_RETINEX_GAMMA;Gamma +TP_RETINEX_GAMMA_FREE;Libero +TP_RETINEX_GAMMA_HIGH;Alto +TP_RETINEX_GAMMA_LOW;Basso +TP_RETINEX_GAMMA_MID;Medio +TP_RETINEX_GAMMA_NONE;Nessuno +TP_RETINEX_GAMMA_TOOLTIP;Ripristina i toni applicando gamma prima e dopo Retinex. Differenti dalle curve Retinex o da altre curve (Lab, Exposure, ecc.). +TP_RETINEX_GRAD;Gradiente di trasmissione +TP_RETINEX_GRADS;Gradiente di forza +TP_RETINEX_GRADS_TOOLTIP;Se il dispositivo di scorrimento è a 0, tutte le iterazioni sono identiche.\nSe > 0 La forza viene ridotta quando le iterazioni aumentano e viceversa. +TP_RETINEX_GRAD_TOOLTIP;Se il dispositivo di scorrimento è impostato su 0, tutte le iterazioni sono identiche.\nSe > 0 Varianza e Soglia vengono ridotte quando le iterazioni aumentano e viceversa. +TP_RETINEX_HIGH;Alto +TP_RETINEX_HIGHLIG;Alteluci +TP_RETINEX_HIGHLIGHT;Soglia alteluci +TP_RETINEX_HIGHLIGHT_TOOLTIP;Aumenta l'azione dell'algoritmo Alto.\nPotrebbe essere necessario regolare nuovamente i "Pixel vicini" e aumentare la "Correzione del punto bianco" nella scheda Raw -> strumento Punti bianchi grezzi. +TP_RETINEX_HSLSPACE_LIN;HSL-Lineare +TP_RETINEX_HSLSPACE_LOG;HSL-Logaritmica +TP_RETINEX_ITER;Iterazioni (mappatura dei toni) +TP_RETINEX_ITERF;Mappatura dei toni +TP_RETINEX_ITER_TOOLTIP;Simula un operatore di mappatura dei toni.\nValori elevati aumentano il tempo di elaborazione. +TP_RETINEX_LABEL;Retinex +TP_RETINEX_LABEL_MASK;Maschera +TP_RETINEX_LABSPACE;L*a*b* +TP_RETINEX_LOW;Basso +TP_RETINEX_MAP;Metodo +TP_RETINEX_MAP_GAUS;Maschera Gaussiana +TP_RETINEX_MAP_MAPP;Maschera nitida (wavelet parziale) +TP_RETINEX_MAP_MAPT;Maschera nitida (wavelet totale) +TP_RETINEX_MAP_METHOD_TOOLTIP;Usa la maschera generata dalla funzione gaussiana sopra (Raggio, Metodo) per ridurre aloni e artefatti.\n\nSolo curva: applica una curva di contrasto diagonale sulla maschera.\nAttenzione agli artefatti!\n\nMaschera gaussiana: genera e usa una Sfocatura gaussiana della maschera originale.\nVeloce.\n\nMaschera nitida: genera e utilizza un'onda sulla maschera originale.\nLento. +TP_RETINEX_MAP_NONE;Nessuno +TP_RETINEX_MEDIAN;Filtro mediano di trasmissione +TP_RETINEX_METHOD;Metodo +TP_RETINEX_METHOD_TOOLTIP;Basso = Rinforza la luce scarsa.\Uniforme = Equalizza l'azione.\Alto = Rinforza la luce alta.\Alte luci = Rimuove il magenta nelle alte luci. +TP_RETINEX_MLABEL;Ripristino dati Min=%1 Max=%2 +TP_RETINEX_MLABEL_TOOLTIP;I valori dovrebbero essere vicini a Min=0 Max=32768 (modalità registro) ma sono possibili altri valori. Puoi regolare 'Clip dati ripristinati (guadagno)' e 'Offset' per normalizzare.\nRecupera i dati dell'immagine senza fusione. +TP_RETINEX_NEIGHBOR;Raggio +TP_RETINEX_NEUTRAL;Ripristina +TP_RETINEX_NEUTRAL_TOOLTIP;Ripristina tutti i cursori e le curve ai valori predefiniti. +TP_RETINEX_OFFSET;Compensazione (luminosità) +TP_RETINEX_SCALES;Gradiente Gaussiano +TP_RETINEX_SCALES_TOOLTIP;Se il dispositivo di scorrimento è a 0, tutte le iterazioni sono identiche.\nSe > 0 Scala e raggio vengono ridotti quando le iterazioni aumentano e viceversa. +TP_RETINEX_SETTINGS;Impostazioni +TP_RETINEX_SKAL;Scala +TP_RETINEX_SLOPE;Pendenza gamma libera +TP_RETINEX_STRENGTH;Intensità +TP_RETINEX_THRESHOLD;Soglia +TP_RETINEX_THRESHOLD_TOOLTIP;Limiti in/out.\nIn = sorgente immagine,\nOut = gauss immagine. +TP_RETINEX_TLABEL;Dati TM Min=%1 Max=%2 Media=%3 Sigma=%4 +TP_RETINEX_TLABEL2;TM Effettivo Tm=%1 TM=%2 +TP_RETINEX_TLABEL_TOOLTIP;Risultato della mappa di trasmissione.\nMin e Max vengono utilizzati dalla varianza.\nTm=Min TM=Max della mappa di trasmissione.\nÈ possibile normalizzare i risultati con il cursore della soglia. +TP_RETINEX_TRANF;Transmissione +TP_RETINEX_TRANSMISSION;Mappa di transmissione +TP_RETINEX_TRANSMISSION_TOOLTIP;Trasmissione secondo trasmissione.\nAscissa: trasmissione da valori negativi (min), media e valori positivi (max).\nOrdinata: amplificazione o riduzione. +TP_RETINEX_UNIFORM;Uniforme +TP_RETINEX_VARIANCE;Contrasto +TP_RETINEX_VARIANCE_TOOLTIP;Una varianza bassa aumenta il contrasto e la saturazione locali, ma può causare artefatti. +TP_RETINEX_VIEW;Processo +TP_RETINEX_VIEW_MASK;Maschera +TP_RETINEX_VIEW_METHOD_TOOLTIP;Standard - Visualizzazione normale.\nMaschera - Visualizza la maschera.\nMaschera di contrasto - Visualizza l'immagine con una maschera di contrasto ad alto raggio.\nTrasmissione - Automatica/Fissa - Visualizza la mappa di trasmissione del file, prima di qualsiasi azione su contrasto e luminosità.\n \nAttenzione: la maschera non corrisponde alla realtà, ma viene amplificata per renderla più visibile. +TP_RETINEX_VIEW_NONE;Standard +TP_RETINEX_VIEW_TRAN;Trasmissione - Automatica +TP_RETINEX_VIEW_TRAN2;Trasmissione - Risolto +TP_RETINEX_VIEW_UNSHARP;Maschera di contrasto TP_RGBCURVES_BLUE;B TP_RGBCURVES_CHANNEL;Canale TP_RGBCURVES_GREEN;G @@ -1116,24 +3815,50 @@ TP_SHARPENEDGE_LABEL;Bordi TP_SHARPENEDGE_PASSES;Iterazioni TP_SHARPENEDGE_THREE;Solo per luminanza TP_SHARPENING_AMOUNT;Quantità +TP_SHARPENING_BLUR;Raggio di sfocatura +TP_SHARPENING_CONTRAST;Soglia di contrasto TP_SHARPENING_EDRADIUS;Raggio TP_SHARPENING_EDTOLERANCE;Tolleranza bordi TP_SHARPENING_HALOCONTROL;Controllo dell'alone TP_SHARPENING_HCAMOUNT;Quantità +TP_SHARPENING_ITERCHECK;Limite di iterazione automatica TP_SHARPENING_LABEL;Nitidezza TP_SHARPENING_METHOD;Metodo TP_SHARPENING_ONLYEDGES;Definisci solo i bordi TP_SHARPENING_RADIUS;Raggio +TP_SHARPENING_RADIUS_BOOST;Aumento del raggio d'angolo TP_SHARPENING_RLD;Deconvoluzione RL TP_SHARPENING_RLD_AMOUNT;Quantità -TP_SHARPENING_RLD_DAMPING;Smorzamento +TP_SHARPENING_RLD_DAMPING;Attenuazione TP_SHARPENING_RLD_ITERATIONS;Iterazioni TP_SHARPENING_THRESHOLD;Soglia TP_SHARPENING_USM;Maschera di contrasto TP_SHARPENMICRO_AMOUNT;Quantità +TP_SHARPENMICRO_CONTRAST;Soglia di contrasto TP_SHARPENMICRO_LABEL;Microcontrasto TP_SHARPENMICRO_MATRIX;Matrice 3×3 invece di 5×5 TP_SHARPENMICRO_UNIFORMITY;Uniformità +TP_SOFTLIGHT_LABEL;Luce soffusa +TP_SOFTLIGHT_STRENGTH;Intensità +TP_SPOT_COUNTLABEL;%1 punto(i) +TP_SPOT_DEFAULT_SIZE;Dimensione spot predefinita +TP_SPOT_ENTRYCHANGED;Il punto è cambiato +TP_SPOT_HINT;Fare clic su questo pulsante per poter operare sull'area di anteprima.\n\nPer modificare un punto, posizionare il mouse sul segno bianco che individua un'area modificata, facendo apparire la geometria di modifica.\n\nPer aggiungere un punto, premere Ctrl e il tasto sinistro del mouse pulsante , trascina il cerchio (è possibile rilasciare il tasto Ctrl) in una posizione di origine, quindi rilascia il pulsante del mouse.\n\nPer spostare il punto di origine o di destinazione, passa con il mouse al centro, quindi trascinalo.\n\nIl cerchio interno (massimo effetto area) e il cerchio "piuma" può essere ridimensionato passandovi sopra con il mouse (il cerchio diventa arancione) e trascinandolo (il cerchio diventa rosso).\n\nUna volta completate le modifiche, fare clic con il pulsante destro del mouse all'esterno di qualsiasi punto per terminare la modalità di modifica Spot oppure fare nuovamente clic su questo pulsante. +TP_SPOT_LABEL;Rimozione delle macchie +TP_TM_FATTAL_AMOUNT;Quantità +TP_TM_FATTAL_ANCHOR;Ancora +TP_TM_FATTAL_LABEL;Compressione della gamma dinamica +TP_TM_FATTAL_THRESHOLD;Dettagli +TP_TONE_EQUALIZER_BANDS;Bande +TP_TONE_EQUALIZER_BAND_0;Neri +TP_TONE_EQUALIZER_BAND_1;Ombre +TP_TONE_EQUALIZER_BAND_2;Mezzitoni +TP_TONE_EQUALIZER_BAND_3;Alteluci +TP_TONE_EQUALIZER_BAND_4;Bianchi +TP_TONE_EQUALIZER_DETAIL;Regolarizzazione +TP_TONE_EQUALIZER_LABEL;Equalizzatore di toni +TP_TONE_EQUALIZER_PIVOT;Perno (Ev) +TP_TONE_EQUALIZER_SHOW_COLOR_MAP;Show tonal map TP_VIBRANCE_AVOIDCOLORSHIFT;Evita il color shift TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Incarnato @@ -1157,8 +3882,260 @@ TP_VIGNETTING_CENTER_X;Centra X TP_VIGNETTING_CENTER_Y;Centra Y TP_VIGNETTING_LABEL;Correzione Vignettatura TP_VIGNETTING_RADIUS;Raggio -TP_VIGNETTING_STRENGTH;Forza +TP_VIGNETTING_STRENGTH;intensità +TP_WAVELET_1;Livello 1 +TP_WAVELET_2;Livello 2 +TP_WAVELET_3;Livello 3 +TP_WAVELET_4;Livello 4 +TP_WAVELET_5;Livello 5 +TP_WAVELET_6;Livello 6 +TP_WAVELET_7;Livello 7 +TP_WAVELET_8;Livello 8 +TP_WAVELET_9;Livello 9 +TP_WAVELET_APPLYTO;Applica a +TP_WAVELET_AVOID;Evita cambiamento colore +TP_WAVELET_B0;Nero +TP_WAVELET_B1;Grigio +TP_WAVELET_B2;Residuale +TP_WAVELET_BACKGROUND;Sfondo +TP_WAVELET_BACUR;Curva +TP_WAVELET_BALANCE;Bilanciamento di contrasto d/v-h +TP_WAVELET_BALANCE_TOOLTIP;Altera il bilanciamento tra le direzioni delle wavelet: verticale-orizzontale e diagonale.\nSe sono attivati contrasto, crominanza o mappatura del tono residuo, l'effetto dovuto al bilanciamento viene amplificato. +TP_WAVELET_BALCHRO;Bilanciamento cromatico +TP_WAVELET_BALCHROM;Equalizzazione colore +TP_WAVELET_BALCHRO_TOOLTIP;Se abilitata, la curva o il cursore "Bilanciamento del contrasto" modifica anche il bilanciamento della crominanza. +TP_WAVELET_BALLUM;Equalizzatore antirumore Bianco-Nero +TP_WAVELET_BANONE;Nessuno +TP_WAVELET_BASLI;Dispositivo di scorrimento +TP_WAVELET_BATYPE;Metodo del bilanciamento del contrasto +TP_WAVELET_BL;Livelli di sfocatura +TP_WAVELET_BLCURVE;Sfocatura per livelli +TP_WAVELET_BLURFRAME;Sfoca +TP_WAVELET_BLUWAV;Risposta di attenuazione +TP_WAVELET_CBENAB;Tonalità e bilanciamento del colore +TP_WAVELET_CB_TOOLTIP;Con valori elevati puoi creare effetti speciali, simili a quelli ottenuti con il Modulo Chroma, ma focalizzati sull'immagine residua.\nCon valori moderati puoi correggere manualmente il bilanciamento del bianco. +TP_WAVELET_CCURVE;Contrasto locale +TP_WAVELET_CH1;Intera gamma cromatica +TP_WAVELET_CH2;Saturato/pastello +TP_WAVELET_CH3;Collega i livelli di contrasto +TP_WAVELET_CHCU;Curva +TP_WAVELET_CHR;Intensità coll.to contrasto cromatico +TP_WAVELET_CHRO;Soglia saturata/pastello +TP_WAVELET_CHROFRAME;Riduce il rumore di crominanza +TP_WAVELET_CHROMAFRAME;Crominanza +TP_WAVELET_CHROMCO;Crominanza grossolana +TP_WAVELET_CHROMFI;Crominanza fine +TP_WAVELET_CHRO_TOOLTIP;Imposta il livello wavelet che sarà la soglia tra i colori saturi e pastello.\n1-x: saturi\nx-9: pastello\n\nSe il valore supera la quantità di livelli wavelet che stai utilizzando, verrà ignorato. +TP_WAVELET_CHRWAV;Sfocatura cromatica +TP_WAVELET_CHR_TOOLTIP;Regola la crominanza in funzione dei "livelli di contrasto" e della "forza del collegamento crominanza-contrasto". +TP_WAVELET_CHSL;Cursori +TP_WAVELET_CHTYPE;Metodo della crominanza +TP_WAVELET_CLA;Chiarezza +TP_WAVELET_CLARI;Maschera di nitidezza e chiarezza +TP_WAVELET_COLORT;Opacità rosso-verde +TP_WAVELET_COMPCONT;Contrasto +TP_WAVELET_COMPEXPERT;Avanzate +TP_WAVELET_COMPGAMMA;Compressione di gamma +TP_WAVELET_COMPGAMMA_TOOLTIP;La regolazione della gamma dell'immagine residua consente di equilibrare i dati e l'istogramma. +TP_WAVELET_COMPLEXLAB;Complessità +TP_WAVELET_COMPLEX_TOOLTIP;Standard: mostra un set ridotto di strumenti adatti alla maggior parte delle operazioni di elaborazione.\nAvanzato: mostra il set completo di strumenti per operazioni di elaborazione avanzate. +TP_WAVELET_COMPNORMAL;Standard +TP_WAVELET_COMPTM;Mappatura dei toni +TP_WAVELET_CONTEDIT;Curva di contrasto 'dopo' +TP_WAVELET_CONTFRAME;Contrasto - Compressione +TP_WAVELET_CONTR;Gamma +TP_WAVELET_CONTRA;Contrasto +TP_WAVELET_CONTRAST_MINUS;Contrasto - +TP_WAVELET_CONTRAST_PLUS;Contrasto + +TP_WAVELET_CONTRA_TOOLTIP;Modifica il contrasto residuo dell'immagine. +TP_WAVELET_CTYPE;Controllo della crominanza +TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Disabilitato se lo zoom > circa 300%. +TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifica il contrasto locale in funzione del contrasto locale originale (ascissa).\nI valori bassi dell'ascissa rappresentano un contrasto locale piccolo (valori reali circa 10..20).\nIl 50% dell'ascissa rappresenta il contrasto locale medio (valore reale circa 100..300) .\nIl 66% dell'ascissa rappresenta la deviazione standard del contrasto locale (valore reale circa 300..800).\nIl 100% dell'ascissa rappresenta il contrasto locale massimo (valore reale circa 3000..8000). +TP_WAVELET_CURVEEDITOR_CH;Livelli di contrasto=f(Tonalità) +TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifica il contrasto di ciascun livello in funzione della tonalità.\nFare attenzione a non sovrascrivere le modifiche apportate con i controlli della tonalità dello strumento secondario Gamut.\nLa curva avrà effetto solo quando i cursori del livello di contrasto wavelet sono diversi da zero. +TP_WAVELET_CURVEEDITOR_CL;L +TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applica una curva finale di contrasto-luminanza al termine dell'elaborazione wavelet. +TP_WAVELET_CURVEEDITOR_HH;HH +TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifica la tonalità residua dell'immagine in funzione della tonalità. +TP_WAVELET_DALL;Tutte le direzioni +TP_WAVELET_DAUB;Prestazioni ai bordi +TP_WAVELET_DAUB2;D2 - basso +TP_WAVELET_DAUB4;D4 - standard +TP_WAVELET_DAUB6;D6 - standard + +TP_WAVELET_DAUB10;D10 - medio +TP_WAVELET_DAUB14;D14 - alto +TP_WAVELET_DAUBLOCAL;Prestazioni ai bordi Wavelet +TP_WAVELET_DAUB_TOOLTIP;Modifiche ai coefficienti Daubechies:\nD4 = Standard,\nD14 = Spesso la migliore prestazione, il 10% in più in termini di tempo.\n\nInfluisce sul rilevamento dei bordi e sulla qualità generale dei primi livelli. Tuttavia la qualità non è strettamente legata a questo coefficiente e può variare a seconda dell'immagine e dell'utilizzo. +TP_WAVELET_DEN5THR;Soglia guidata +TP_WAVELET_DENCURV;Curva +TP_WAVELET_DENL;Correctione struttura +TP_WAVELET_DENLH;Soglia guidata livelli 1-4 +TP_WAVELET_DENLOCAL_TOOLTIP;Utilizzare una curva per guidare il denoising in base al contrasto locale.\nLe aree vengono denoisate, le strutture vengono mantenute. +TP_WAVELET_DENMIX_TOOLTIP;Il valore di riferimento del contrasto locale utilizzato dal filtro guidato.\nA seconda dell'immagine, i risultati possono variare a seconda che il rumore venga misurato prima o dopo la riduzione del rumore. Queste quattro scelte consentono di prendere in considerazione varie combinazioni delle immagini originali e modificate (denoizzate) per trovare il miglior compromesso. +TP_WAVELET_DENOISE;Curva guida basata sul contrasto locale +TP_WAVELET_DENOISEGUID;Soglia guidata in base alla tonalità +TP_WAVELET_DENOISEH;Livelli alti Curva Contrasto locale +TP_WAVELET_DENOISEHUE;Equalizzatore tonalità rimozione rumore +TP_WAVELET_DENQUA;Modo +TP_WAVELET_DENSIGMA_TOOLTIP;Adatta la forma della guida. +TP_WAVELET_DENSLI;Dispositivo di scorrimento +TP_WAVELET_DENSLILAB;Metodo +TP_WAVELET_DENWAVGUID_TOOLTIP;Utilizza la tonalità per ridurre o aumentare l'azione del filtro guidato. +TP_WAVELET_DENWAVHUE_TOOLTIP;Amplifica o riduci il denoising a seconda del colore. +TP_WAVELET_DETEND;Dettagli +TP_WAVELET_DIRFRAME;Contrasto direzionale +TP_WAVELET_DONE;Verticale +TP_WAVELET_DTHR;Diagonale +TP_WAVELET_DTWO;Orizzontale +TP_WAVELET_EDCU;Curva +TP_WAVELET_EDEFFECT;Risposta di attenuazione +TP_WAVELET_EDEFFECT_TOOLTIP;Questo cursore seleziona l'intervallo di valori di contrasto che riceveranno il pieno effetto di qualsiasi regolazione. +TP_WAVELET_EDGCONT;Contrasto locale +TP_WAVELET_EDGCONT_TOOLTIP;Regolando i punti a sinistra si diminuisce il contrasto, mentre a destra lo si aumenta.\nIn basso a sinistra, in alto a sinistra, in alto a destra e in basso a destra rappresentano rispettivamente il contrasto locale per valori bassi, media, media+std. dev. e massimi. +TP_WAVELET_EDGE;Nitidezza dei bordi +TP_WAVELET_EDGEAMPLI;Amplificazione di base +TP_WAVELET_EDGEDETECT;Sensibilità gradiente +TP_WAVELET_EDGEDETECTTHR;Soglia bassa (rumore) +TP_WAVELET_EDGEDETECTTHR2;Miglioramento dei bordi +TP_WAVELET_EDGEDETECTTHR_TOOLTIP;Questo cursore imposta una soglia al di sotto della quale i dettagli più fini non verranno considerati un vantaggio. +TP_WAVELET_EDGEDETECT_TOOLTIP;Spostando il cursore verso destra si aumenta la sensibilità dei bordi. Ciò influisce sul contrasto locale, sulle impostazioni dei bordi e sul rumore. +TP_WAVELET_EDGESENSI;Sensibilità dei bordi +TP_WAVELET_EDGREINF_TOOLTIP;Rafforzare o ridurre l'azione del primo livello, fare il contrario del secondo livello e lasciare invariato il resto. +TP_WAVELET_EDGTHRESH;Dettagli +TP_WAVELET_EDGTHRESH_TOOLTIP;Cambia la ripartizione tra i primi livelli e gli altri. Più alta è la soglia più l'azione è centrata sui primi livelli. Fare attenzione ai valori negativi, aumentano l'azione a livelli elevati e possono introdurre artefatti. +TP_WAVELET_EDRAD;Raggio +TP_WAVELET_EDRAD_TOOLTIP;Questa regolazione controlla il miglioramento locale. Un valore pari a zero ha comunque effetto. +TP_WAVELET_EDSL;Cursori di soglia +TP_WAVELET_EDTYPE;Metodo di contrasto locale +TP_WAVELET_EDVAL;Intensità +TP_WAVELET_FINAL;Ritocco finale +TP_WAVELET_FINCFRAME;Contrasto locale finale +TP_WAVELET_FINEST;Più bello +TP_WAVELET_FINTHR_TOOLTIP;Utilizza il contrasto locale per ridurre o aumentare l'azione del filtro guidato. +TP_WAVELET_GUIDFRAME;Smoothing finale (filtro guidato) +TP_WAVELET_HIGHLIGHT;Gamma di luminanza a livelli più fini +TP_WAVELET_HS1;Intero intervallo di luminanza +TP_WAVELET_HS2;Gamma di luminanza selettiva +TP_WAVELET_HUESKIN;Tonalità della pelle +TP_WAVELET_HUESKIN_TOOLTIP;I punti in basso impostano l'inizio della zona di transizione e i punti in alto la fine, dove l'effetto è al massimo.\n\nSe è necessario spostare l'area in modo significativo o se sono presenti artefatti, allora il bilanciamento del bianco non è corretto. +TP_WAVELET_HUESKY;Gamma di tonalità +TP_WAVELET_HUESKY_TOOLTIP;I punti in basso impostano l'inizio della zona di transizione e i punti in alto la fine, dove l'effetto è al massimo.\n\nSe è necessario spostare l'area in modo significativo o se sono presenti artefatti, allora il bilanciamento del bianco non è corretto. +TP_WAVELET_ITER;Livelli di equilibrio delta +TP_WAVELET_ITER_TOOLTIP;Sinistra: aumenta i livelli bassi e riduci i livelli alti,\nDestra: riduci i livelli bassi e aumenta i livelli alti. +TP_WAVELET_LABEL;Livelli wavelet +TP_WAVELET_LABGRID_VALUES;Alto(a)=%1 Alto(b)=%2\nBasso(a)=%3 Basso(b)=%4 +TP_WAVELET_LARGEST;Grossolano +TP_WAVELET_LEVCH;Crominanza +TP_WAVELET_LEVDEN;Riduzione rumore livello 5-6 +TP_WAVELET_LEVDIR_ALL;Tutti i livelli, in tutte le direzioni +TP_WAVELET_LEVDIR_INF;Livelli di dettaglio più fini, incluso il livello selezionato +TP_WAVELET_LEVDIR_ONE;Un livello +TP_WAVELET_LEVDIR_SUP;Livelli di dettaglio più grossolani, escluso il livello selezionato +TP_WAVELET_LEVELHIGH;Raggio 5-6 +TP_WAVELET_LEVELLOW;Raggio 1-4 +TP_WAVELET_LEVELS;Livelli di Wavelet +TP_WAVELET_LEVELSIGM;Raggio +TP_WAVELET_LEVELS_TOOLTIP;Scegli il numero di livelli di decomposizione wavelet per l'immagine.\nPiù livelli richiedono più RAM e un tempo di elaborazione più lungo. +TP_WAVELET_LEVF;Contrasto +TP_WAVELET_LEVFOUR;Riduzione rumore e soglia guidata livello 5-6 +TP_WAVELET_LEVLABEL;Anteprima dei livelli massimi possibili = %1 +TP_WAVELET_LEVONE;Livello 2 +TP_WAVELET_LEVTHRE;Livello 4 +TP_WAVELET_LEVTWO;Livello 3 +TP_WAVELET_LEVZERO;Livello 1 +TP_WAVELET_LIMDEN;Iterazione livello 5-6 di livelli 1-4 +TP_WAVELET_LINKEDG;Collegamento all'intensità della nitidezza del bordo +TP_WAVELET_LIPST;Algoritmo migliorato +TP_WAVELET_LOWLIGHT;Gamma di luminanza a livelli più grossolani +TP_WAVELET_LOWTHR_TOOLTIP;Previene l'amplificazione delle texture fini e del rumore. +TP_WAVELET_MEDGREINF;Primo livello +TP_WAVELET_MEDI;Riduci gli artefatti nel cielo blu +TP_WAVELET_MEDILEV;Rilevamento dei bordi +TP_WAVELET_MEDILEV_TOOLTIP;Quando abiliti il rilevamento dei bordi, si consiglia di:\n- disattivare i livelli di contrasto bassi per evitare artefatti,\n- utilizzare valori elevati di sensibilità del gradiente.\n\nPuoi modulare l'intensità con 'perfeziona' da Riduci rumore e Affina. +TP_WAVELET_MERGEC;Unisci crominanza +TP_WAVELET_MERGEL;Unisci luminanza +TP_WAVELET_MIXCONTRAST;Riferimento +TP_WAVELET_MIXDENOISE;Riduzione del rumore +TP_WAVELET_MIXMIX;Misto 50% rumore - 50% riduzione rumore +TP_WAVELET_MIXMIX70;Misto 30% rumore - 30% riduzione rumore +TP_WAVELET_MIXNOISE;Rumore +TP_WAVELET_NEUTRAL;Neutro +TP_WAVELET_NOIS;Riduzione rumore +TP_WAVELET_NOISE;Elimina rumore e perfeziona +TP_WAVELET_NPHIGH;Alto +TP_WAVELET_NPLOW;Basso +TP_WAVELET_NPNONE;Nessuno +TP_WAVELET_NPTYPE;Pixel vicini +TP_WAVELET_NPTYPE_TOOLTIP;Questo algoritmo utilizza la vicinanza di un pixel e otto dei suoi vicini. Se la differenza è inferiore, i bordi sono rinforzati. +TP_WAVELET_OFFSET_TOOLTIP;L'offset modifica il bilanciamento tra i dettagli a basso contrasto e quelli ad alto contrasto.\nValori elevati amplificheranno le modifiche del contrasto ai dettagli a contrasto più elevato, mentre valori bassi amplificheranno le modifiche del contrasto ai dettagli a basso contrasto.\nUtilizzando un valore di risposta dell'attenuazione basso è possibile selezionare quale contrasto i valori verranno valorizzati. +TP_WAVELET_OLDSH;Algoritmo che utilizza valori negativi +TP_WAVELET_OPACITY;Opacità blu-giallo +TP_WAVELET_OPACITYW;Curva d/v-h del bilanciamento del contrasto +TP_WAVELET_OPACITYWL;Contrasto locale +TP_WAVELET_OPACITYWL_TOOLTIP;Modificare il contrasto locale finale al termine del trattamento wavelet.\n\nIl lato sinistro rappresenta il contrasto locale più piccolo, procedendo fino al contrasto locale più grande sulla destra. +TP_WAVELET_PASTEL;Cromia pastello +TP_WAVELET_PROC;Processo +TP_WAVELET_PROTAB;Protezione +TP_WAVELET_QUAAGRES;Aggressività +TP_WAVELET_QUACONSER;Conservativo +TP_WAVELET_RADIUS;Raggio Ombre - Alteluci +TP_WAVELET_RANGEAB;Allineare a e b % +TP_WAVELET_RE1;Rinforzata +TP_WAVELET_RE2;Invariato +TP_WAVELET_RE3;Ridotto +TP_WAVELET_RESBLUR;Luminanza sfocata +TP_WAVELET_RESBLURC;Blur chromaSfocatura cromatica +TP_WAVELET_RESBLUR_TOOLTIP;Disabilitato se lo zoom > circa 500%. +TP_WAVELET_RESCHRO;Intensità +TP_WAVELET_RESCON;Ombre +TP_WAVELET_RESCONH;Alteluci +TP_WAVELET_RESID;Immagine residuale +TP_WAVELET_SAT;Cromia saturata +TP_WAVELET_SETTINGS;Impostazioni Wavelet +TP_WAVELET_SHA;Maschera definita +TP_WAVELET_SHFRAME;Ombre/Alteluci +TP_WAVELET_SHOWMASK;Mostra la 'maschera' wavelet +TP_WAVELET_SIGM;Raggio +TP_WAVELET_SIGMA;Risposta di attenuazione +TP_WAVELET_SIGMAFIN;Risposta di attenuazione +TP_WAVELET_SIGMA_TOOLTIP;L'effetto dei cursori del contrasto è più forte nei dettagli a contrasto medio e più debole nei dettagli ad alto e basso contrasto.\n Con questo cursore puoi controllare quanto velocemente l'effetto si attenua verso i contrasti estremi.\n Più alto è impostato il cursore, più ampia è la gamma di contrasti che otterrà un forte cambiamento e maggiore è il rischio di generare artefatti.\n .Più basso è, più l'effetto sarà localizzato verso una gamma ristretta di valori di contrasto. +TP_WAVELET_SKIN;Mira/protezione della pelle +TP_WAVELET_SKIN_TOOLTIP;A -100 le tonalità della pelle vengono prese di mira.\nA 0 tutte le tonalità vengono trattate allo stesso modo.\nA +100 le tonalità della pelle vengono protette mentre tutte le altre tonalità vengono influenzate. +TP_WAVELET_SKY;Mira/protezione della tonalità +TP_WAVELET_SKY_TOOLTIP;Consente di scegliere o proteggere una gamma di tonalità.\nA -100 vengono prese di mira le tonalità selezionate.\nA 0 tutte le tonalità vengono trattate allo stesso modo.\nA +100 le tonalità selezionate vengono protette mentre tutte le altre tonalità vengono prese di mira. +TP_WAVELET_SOFTRAD;Raggio morbido +TP_WAVELET_STREN;Perfeziona +TP_WAVELET_STREND;Intensità +TP_WAVELET_STRENGTH;Intensità +TP_WAVELET_SUPE;Extra +TP_WAVELET_THR;Soglia delle ombre +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;Soglia di contrasto locale +TP_WAVELET_THRESHOLD;Livelli più fini +TP_WAVELET_THRESHOLD2;Livelli più grossolani +TP_WAVELET_THRESHOLD2_TOOLTIP;Solo i livelli dal valore scelto al numero selezionato di 'livelli wavelet' saranno influenzati dall'intervallo di luminanza dell'ombra. +TP_WAVELET_THRESHOLD_TOOLTIP;Solo i livelli inferiori e compresi nel valore scelto saranno influenzati dall'intervallo di luminanza delle alte luci. +TP_WAVELET_THRH;Soglia delle Alteluci +TP_WAVELET_TILESBIG;Riquadri +TP_WAVELET_TILESFULL;Immagine completa +TP_WAVELET_TILESIZE;Metodo di quadrettatura +TP_WAVELET_TILES_TOOLTIP;L'elaborazione dell'immagine completa porta a una migliore qualità ed è l'opzione consigliata, mentre l'utilizzo dei riquadri è una soluzione di ripiego per gli utenti con poca RAM. Fare riferimento a RawPedia per i requisiti di memoria. +TP_WAVELET_TMEDGS;Arresto del bordo +TP_WAVELET_TMSCALE;Scala +TP_WAVELET_TMSTRENGTH;Intensità della compressione +TP_WAVELET_TMSTRENGTH_TOOLTIP;Controlla l'intensità della mappatura dei toni o della compressione del contrasto dell'immagine residua. +TP_WAVELET_TMTYPE;Metodo di compressione +TP_WAVELET_TON;Tonificante +TP_WAVELET_TONFRAME;Colori esclusi +TP_WAVELET_USH;Nessuno +TP_WAVELET_USHARP;Metodo di chiarezza +TP_WAVELET_USH_TOOLTIP;Se selezioni Maschera nitida, puoi scegliere qualsiasi livello (in Impostazioni) da 1 a 4 per l'elaborazione.\nSe selezioni Chiarezza, puoi scegliere qualsiasi livello (in Impostazioni) tra 5 ed Extra. +TP_WAVELET_WAVLOWTHR;Soglia di contrasto basso +TP_WAVELET_WAVOFFSET;Compensa TP_WBALANCE_AUTO;Automatico +TP_WBALANCE_AUTOITCGREEN;Correlazione della temperatura +TP_WBALANCE_AUTOOLD;Grigio RGB +TP_WBALANCE_AUTO_HEADER;Automatico e perfezionamento TP_WBALANCE_CAMERA;Fotocamera TP_WBALANCE_CLOUDY;Nuvoloso TP_WBALANCE_CUSTOM;Personalizzato @@ -1185,6 +4162,45 @@ TP_WBALANCE_FLUO_HEADER;Fluorescente TP_WBALANCE_GREEN;Tinta TP_WBALANCE_GTI;GTI TP_WBALANCE_HMI;HMI +TP_WBALANCE_ITCWALG_TOOLTIP;Permette di passare all'altra temperatura Alternativa (Alt_temp), quando possibile.\nNon attivo nel caso "scelta singola". +TP_WBALANCE_ITCWBDELTA_TOOLTIP;Risolto il problema per ogni iterazione "verde" tentata, della differenza di temperatura da prendere in considerazione. +TP_WBALANCE_ITCWBFGREEN_TOOLTIP;Trova il miglior compromesso tra Student e green. +TP_WBALANCE_ITCWBMINSIZEPATCH_TOOLTIP;Consente di impostare il valore patch minimo. valori troppo bassi possono portare ad una mancanza di correlazione. +TP_WBALANCE_ITCWBNOPURPLE_TOOLTIP;Consente di filtrare i dati magenta/viola dall'immagine. Se la casella è selezionata, viene applicato un filtro che limita il valore di Y. Per impostazione predefinita questo valore è 0,4. Puoi cambiarlo nelle 'opzioni' Itcwb_Yporpora (Massimo 1) +TP_WBALANCE_ITCWBPRECIS_TOOLTIP;Più basso è il valore, più rilevanti sono i dati, ma aumenta il tempo di elaborazione. Poiché il tempo di elaborazione è basso, questo parametro dovrebbe generalmente poter rimanere al valore predefinito +TP_WBALANCE_ITCWBRGREEN_TOOLTIP;Imposta l'ampiezza di revisione del valore verde in iterazioni, dall'ampiezza bassa da 0,82 a 1,25 all'ampiezza massima da 0,4 a 4. +TP_WBALANCE_ITCWBSIZEPATCH_TOOLTIP;Questa impostazione imposta la dimensione dei dati di colore utilizzati dall'algoritmo. +TP_WBALANCE_ITCWBSIZE_TOOLTIP;Questa impostazione imposta il numero di iterazioni per trovare la migliore corrispondenza tra i colori spettrali di riferimento e quelli nel valore xyY dell'immagine. Un valore pari a 3 sembra un buon compromesso. +TP_WBALANCE_ITCWBTHRES_TOOLTIP;Limita il campionamento comparativo tra i dati spettrali e i dati dell'immagine. +TP_WBALANCE_ITCWB_ALG;Rimuovi l'algoritmo a 2 passaggi +TP_WBALANCE_ITCWB_CUSTOM;Utilizza temperatura e tinta personalizzate +TP_WBALANCE_ITCWB_DELTA;Delta temperatura nel circuito verde +TP_WBALANCE_ITCWB_FGREEN;Trova uno alunno verde +TP_WBALANCE_ITCWB_FORCED;Vicino al diagramma CIE completo +TP_WBALANCE_ITCWB_FRA;Impostazioni correlazione temperatura auto +TP_WBALANCE_ITCWB_FRA_TOOLTIP;Queste impostazioni consentono, a seconda delle immagini (tipo di raw, colorimetria, ecc.), un adattamento dell'algoritmo di 'Correlazione della temperatura'. Non esiste una regola assoluta che lega questi parametri ai risultati ottenuti. +TP_WBALANCE_ITCWB_MINSIZEPATCH;Dimensione minima della patch +TP_WBALANCE_ITCWB_NOPURPLE;Filtra sul colore viola +TP_WBALANCE_ITCWB_PRECIS;Algoritmo di precisione: scala utilizzata +TP_WBALANCE_ITCWB_PRIM_ACE;Forza l'uso dell'intero diagramma CIE +TP_WBALANCE_ITCWB_PRIM_ADOB;Campionamento medio +TP_WBALANCE_ITCWB_PRIM_BETA;Campionamento medio: vicino alla gamma di Pointer +TP_WBALANCE_ITCWB_PRIM_JDCMAX;Vicino al diagramma CIE completo +TP_WBALANCE_ITCWB_PRIM_REC;Campionamento elevato +TP_WBALANCE_ITCWB_PRIM_SRGB;Campionamento basso e nessun utilizzo Impostazioni della fotocamera +TP_WBALANCE_ITCWB_PRIM_XYZCAM;Matrice XYZ della fotocamera +TP_WBALANCE_ITCWB_PRIM_XYZCAM2;JDCmax dopo la matrice XYZ della fotocamera +TP_WBALANCE_ITCWB_RGREEN;Gamma del verde +TP_WBALANCE_ITCWB_SAMPLING;Campionamento basso 5.9 +TP_WBALANCE_ITCWB_SIZE;Dimensioni di riferimento il colore viene confrontato con l'istogramma +TP_WBALANCE_ITCWB_SIZEPATCH;Dimensioni della toppa colorata +TP_WBALANCE_ITCWB_THRES;Colori utilizzati nell'immagine (preimpostati) +TP_WBALANCE_ITCWCUSTOM_TOOLTIP;Ti consente di utilizzare le impostazioni personalizzate Temperatura e Verde (tinta).\n\nSuggerimenti per l'uso:\n1) avvia Itcwb, attiva 'Utilizza temperatura e tinta personalizzate'.\n2) Imposta 'Temperatura e tinta' a tuo piacimento: gratis, scegli ,...(Personalizzato)\n3) torna a 'Correlazione temperatura'.\n\nNon è possibile utilizzare: 2 passaggi, bias temperatura AWB, perfezionamento verde. +TP_WBALANCE_ITCWFORCED_TOOLTIP;Per impostazione predefinita (casella non selezionata) i dati scansionati durante il campionamento vengono riportati al profilo sRGB, che è il più diffuso, sia per la calibrazione dei profili DCP o ICC con il Colorchecker24, sia utilizzato sul web.\n Se avete valori molto alti immagini della gamma (alcuni fiori, colori artificiali), potrebbe essere necessario utilizzare l'intero diagramma CIExy, il profilo utilizzato sarà ACESP0. In questo secondo caso sarà più importante il numero di colori che potranno essere utilizzati all’interno dell’algoritmo. +TP_WBALANCE_ITCWGREEN;Raffinatezza del verde +TP_WBALANCE_ITCWGREEN_TOOLTIP;Permette di cambiare la "tinta" (verde) che servirà da riferimento all'avvio dell'algoritmo. Ha sostanzialmente lo stesso ruolo per i verdi del "bias temperatura AWB" per la temperatura.\nL'intero algoritmo viene ricalcolato. +TP_WBALANCE_ITCWPRIM_TOOLTIP;Permette di selezionare il campionamento dell'immagine.\n'Vicino al diagramma CIE completo' utilizza quasi i dati presenti sul sensore, eventualmente includendo i colori immaginari.\n'Matrice XYZ della fotocamera' - utilizza la matrice derivata direttamente da Color Matrix.\ n'Campionamento medio' (predefinito) - vicino alla gamma del puntatore: corrisponde sostanzialmente ai casi più comuni di visione umana.\nL'altra scelta 'Campionamento basso e Impostazioni fotocamera inutilizzata' consentono di isolare parti ad alta gamma dell'immagine e forzare il algoritmo in alcuni casi (tinta > 0,8,...) per non utilizzare le impostazioni della fotocamera. Ciò ovviamente avrà un impatto sul risultato.\n\nQuesto campionamento influisce solo sui moltiplicatori di canale, non ha nulla a che vedere con il "profilo di lavoro" e non modifica il gamut dell'immagine. +TP_WBALANCE_ITCWSAMPLING_TOOLTIP;Consente di utilizzare il vecchio algoritmo di campionamento per garantire una migliore compatibilità con 5.9. È necessario abilitare Observer 10° (impostazione predefinita). TP_WBALANCE_JUDGEIII;JudgeIII TP_WBALANCE_LABEL;Bilanciamento del bianco TP_WBALANCE_LAMP_HEADER;Lamp @@ -1192,13 +4208,28 @@ TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 TP_WBALANCE_LED_HEADER;LED TP_WBALANCE_LED_LSI;LSI Lumelex 2040 TP_WBALANCE_METHOD;Metodo +TP_WBALANCE_MULLABEL;Multi: r=%1 g=%2 b=%3 +TP_WBALANCE_MULLABEL_TOOLTIP;Valori forniti a scopo informativo. Non puoi cambiarli. +TP_WBALANCE_OBSERVER10;Osservatore 10° invece di 2° +TP_WBALANCE_OBSERVER10_TOOLTIP;La gestione del colore in Rawtherapee (bilanciamento del bianco, moltiplicatori di canali, recupero delle luci,...) utilizza i dati spettrali degli illuminanti e dei colori. L'osservatore è un parametro importante di questa gestione che tiene conto dell'angolo di percezione dell'occhio. Nel 1931 fu fissata a 2° (privilegia l'uso dei coni). Nel 1964 è stato fissato a 10° (privilegia l'uso dei coni, ma tiene parzialmente conto dei bastoncelli).\nPer evitare una (rara) deriva dei colori dovuta alla scelta dell'Osservatore 10° - probabilmente dovuta alla matrice di conversione - È necessario selezionare l'Osservatore 2°.\nNella maggior parte dei casi l'Osservatore 10° (predefinito) sarà una scelta più rilevante. +TP_WBALANCE_PATCHLABEL;Read colors:%1 Patch: Chroma:%2 Size=%3 +TP_WBALANCE_PATCHLABEL_TOOLTIP;Visualizza il numero di colori letti (max=237).\nVisualizza la crominanza patch calcolata.\nBias di temperatura AWB, proviamo a ridurre questo valore, un minimo potrebbe sembrare per ottimizzare l'algoritmo.\n\nOttimizzazione della crominanza corrispondente alla dimensione della patch. +TP_WBALANCE_PATCHLEVELLABEL;Patch: ΔE=%1 - datas x 9 Min:%2 Max=%3 +TP_WBALANCE_PATCHLEVELLABEL_TOOLTIP;Visualizza patch ΔE (questo presuppone che ci siano abbastanza dati spettrali), tra l'immagine e i dati spettrali.\n Visualizza i dati letti trovati. I 2 valori corrispondono ai valori dei dati minimo e massimo presi in considerazione. È necessario tenere conto del coefficiente x9 per ottenere il numero di pixel interessati nell'immagine. +TP_WBALANCE_PICKER;Scegli TP_WBALANCE_SHADE;Ombra -TP_WBALANCE_SIZE;Dimensione: +TP_WBALANCE_SIZE;Dim.: 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;Punto BB +TP_WBALANCE_STUDLABEL;Correlation factor: %1 Passes:%2 Worst_alt=%3 +TP_WBALANCE_STUDLABEL0;Correlation factor: %1 Passes:%2 Alt=%3 +TP_WBALANCE_STUDLABEL1;Correlation factor: %1 Passes:%2 Best_alt=%3 +TP_WBALANCE_STUDLABEL_TOOLTIP;Visualizza la correlazione Student calcolata.\nValori più bassi sono migliori, dove <0,005 è eccellente,\n<0,01 è buono e >0,5 è scarso.\nValori bassi non significano che il bilanciamento del bianco è buono:\nse l'illuminante non è standard i risultati possono essere irregolari.\nUn valore di 1000 significa che vengono utilizzati i calcoli precedenti e\ni risultati sono probabilmente buoni.\n\nPassaggi: numero di passaggi effettuati.\nAlt_temp: temperatura alternativa. +TP_WBALANCE_TEMPBIAS;Distorsione temperatura AWB +TP_WBALANCE_TEMPBIAS_TOOLTIP;Permette di alterare il calcolo del 'bilanciamento automatico del bianco'\nspostandolo verso temperature più calde o più fredde. Il bias\nè espresso come percentuale della temperatura calcolata,\nin modo che il risultato sia dato da 'computedTemp + computedTemp * bias'.\n\nÈ possibile utilizzare il "bias temperatura Awb" per regolare i risultati della "correlazione della temperatura". Ogni movimento di questo comando comporta un nuovo calcolo di temperatura, tinta e correlazione. TP_WBALANCE_TEMPERATURE;Temperatura TP_WBALANCE_TUNGSTEN;Tungsteno TP_WBALANCE_WATER1;Subacqueo 1 @@ -1207,3043 +4238,184 @@ TP_WBALANCE_WATER_HEADER;Subacqueo ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;Apri (nuova) finestra di dettaglio ZOOMPANEL_ZOOM100;Ingrandimento al 100%.\nScorciatoia: z +ZOOMPANEL_ZOOMFITCROPSCREEN;Adatta il ritaglio allo schermo\nScorciatoia: f ZOOMPANEL_ZOOMFITSCREEN;Adatta allo schermo.\nScorciatoia: Alt-f ZOOMPANEL_ZOOMIN;Ingrandisci.\nScorciatoia: + ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - +//TP_WBALANCE_ITCWBNOPURPLE_TOOLTIP;Per impostazione predefinita, quando è attivato "Inpaint opposto", i colori viola non vengono presi in considerazione. Tuttavia, se l'immagine non necessita di ricostruzione delle alte luci o se l'immagine contiene naturalmente tinte viola (fiori, ecc.), potrebbe essere necessario disattivarla per tenere conto di tutti i colori. +//TP_WBALANCE_ITCWB_FORCED;Forza l'uso dell'intero diagramma CIE !!!!!!!!!!!!!!!!!!!!!!!!! ! 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_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 -!ERROR_MSG_METADATA_VALUE;Metadata: error setting %1 to %2 -!EXIFFILTER_IMAGETYPE;Image type -!EXIFFILTER_PATH;File path -!EXIFPANEL_ACTIVATE_ALL_HINT;Select all tags -!EXIFPANEL_ACTIVATE_NONE_HINT;Unselect all tags -!EXIFPANEL_BASIC_GROUP;Basic -!EXIFPANEL_VALUE_NOT_SHOWN;Not shown -!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_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_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_POPUPSORTBY;Sort Files -!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_EXECUTABLE;Executable 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_DELETE_ALL;Delete all -!GENERAL_EDIT;Edit -!GENERAL_HELP;Help -!GENERAL_OPEN;Open -!GENERAL_OTHER;Other -!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 -!HISTORY_MSG_235;B&W - CM - Auto -!HISTORY_MSG_237;B&W - CM -!HISTORY_MSG_256;NR - Median - Type -!HISTORY_MSG_257;Color Toning -!HISTORY_MSG_258;CT - Color curve -!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_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_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 - 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 -!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 -!HISTORY_MSG_396;W - Contrast sub-tool -!HISTORY_MSG_397;W - Chroma sub-tool -!HISTORY_MSG_398;W - ES sub-tool -!HISTORY_MSG_399;W - Residual sub-tool -!HISTORY_MSG_400;W - Final sub-tool -!HISTORY_MSG_401;W - Toning sub-tool -!HISTORY_MSG_402;W - Denoise sub-tool -!HISTORY_MSG_403;W - ES - Edge sensitivity -!HISTORY_MSG_404;W - ES - Base amplification -!HISTORY_MSG_405;W - Denoise - Level 4 -!HISTORY_MSG_406;W - ES - Neighboring pixels -!HISTORY_MSG_407;Retinex - Method -!HISTORY_MSG_408;Retinex - Radius -!HISTORY_MSG_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;--unused-- -!HISTORY_MSG_426;Retinex - Hue equalizer -!HISTORY_MSG_427;Output rendering intent -!HISTORY_MSG_428;Monitor rendering intent -!HISTORY_MSG_429;Retinex - Iterations -!HISTORY_MSG_430;Retinex - Transmission gradient -!HISTORY_MSG_431;Retinex - Strength gradient -!HISTORY_MSG_432;Retinex - M - Highlights -!HISTORY_MSG_433;Retinex - M - Highlights TW -!HISTORY_MSG_434;Retinex - M - Shadows -!HISTORY_MSG_435;Retinex - M - Shadows TW -!HISTORY_MSG_436;Retinex - M - Radius -!HISTORY_MSG_437;Retinex - M - Method -!HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Process -!HISTORY_MSG_440;CbDL - Method -!HISTORY_MSG_441;Retinex - Gain transmission -!HISTORY_MSG_442;Retinex - Scale -!HISTORY_MSG_443;Output black point compensation -!HISTORY_MSG_444;WB - Temp bias -!HISTORY_MSG_445;Raw Sub-Image -!HISTORY_MSG_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 -!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_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 - SC - Shape method -!HISTORY_MSG_503;Local - Spot - Right -!HISTORY_MSG_504;Local - Spot - Left -!HISTORY_MSG_505;Local - Spot - Bottom -!HISTORY_MSG_506;Local - Spot - Top -!HISTORY_MSG_507;Local - Spot - Center -!HISTORY_MSG_508;Local - Spot - Size -!HISTORY_MSG_509;Local - Spot quality method -!HISTORY_MSG_510;Local - TG - Transition value -!HISTORY_MSG_511;Local - SD - ΔE scope threshold -!HISTORY_MSG_512;Local - SD - ΔE decay -!HISTORY_MSG_513;Local - Spot - Excluding - 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 - Spot - Excluding - Spot 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 - SD - ab-L balance -!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 - TG - 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 - TG - 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 Image Mask -!HISTORY_MSG_785;Local - Mask - Scope -!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 - 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 - SC - 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 - TG - Feather gradient -!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 - SD - C-H balance -!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 - SD - ΔE preview color intensity -!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 - SC - 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 - SC - Changes in B/W -!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 - SC - 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 -!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 -!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_COMPLEX;Wavelet complexity -!HISTORY_MSG_COMPLEXRETI;Retinex complexity -!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth -!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal -!HISTORY_MSG_DEHAZE_SATURATION;Dehaze - Saturation -!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map -!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength -!HISTORY_MSG_DIRPYRDENOISE_GAIN;NR - Compensate for lightness -!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_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_LOCALLAB_TE_PIVOT;Local - Equalizer pivot -!HISTORY_MSG_LOCAL_GAMUTMUNSEL;Local - SC - Avoid Color Shift -!HISTORY_MSG_LOCAL_TMO_SATUR;Local Exp Fattal Saturation -!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_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_MSG_WBITC_CUSTOM;Itcwb Custom -!HISTORY_MSG_WBITC_DELTA;Itcwb Delta green -!HISTORY_MSG_WBITC_FGREEN;Itcwb Green - student -!HISTORY_MSG_WBITC_FORCE;Itcwb Force -!HISTORY_MSG_WBITC_GREEN;Green refinement -!HISTORY_MSG_WBITC_MINSIZE;Patch min size -!HISTORY_MSG_WBITC_NOPURPLE;Itcwb Nopurple -!HISTORY_MSG_WBITC_OBS;Remove algo 2 passes -!HISTORY_MSG_WBITC_PONDER;Itcwb ponderated -!HISTORY_MSG_WBITC_PRECIS;Itcwb Precision -!HISTORY_MSG_WBITC_PRIM;Primaries -!HISTORY_MSG_WBITC_RGREEN;Itcwb Green range -!HISTORY_MSG_WBITC_SAMPLING;Low sampling -!HISTORY_MSG_WBITC_SIZE;Itcwb Size -!HISTORY_MSG_WBITC_SORTED;Itcwb ponderated -!HISTORY_MSG_WBITC_THRES;Itcwb Threshold -!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_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 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_DCIP3;DCI-P3 -!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 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 -!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_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_COLORTONING;Color toning -!PARTIALPASTE_DEHAZE;Haze removal -!PARTIALPASTE_EQUALIZER;Wavelet levels -!PARTIALPASTE_FILMNEGATIVE;Film negative -!PARTIALPASTE_FILMSIMULATION;Film simulation -!PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control -!PARTIALPASTE_FLATFIELDFROMMETADATA;Flat-field from Metadata -!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 -!PARTIALPASTE_RAW_BORDER;Raw border -!PARTIALPASTE_RAW_IMAGENUM;Sub-image -!PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift -!PARTIALPASTE_RETINEX;Retinex -!PARTIALPASTE_SOFTLIGHT;Soft light -!PARTIALPASTE_SPOT;Spot removal -!PARTIALPASTE_TM_FATTAL;Dynamic range compression -!PARTIALPASTE_TONE_EQUALIZER;Tone equalizer -!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_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_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 -!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_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_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_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. -!PREFERENCES_LANG;Language -!PREFERENCES_LENSFUNDBDIR;Lensfun database directory -!PREFERENCES_LENSFUNDBDIR_TOOLTIP;Directory containing the Lensfun database. Leave empty to use the default directories. -!PREFERENCES_LENSPROFILESDIR;Lens profiles directory -!PREFERENCES_LENSPROFILESDIR_TOOLTIP;Directory containing Adobe Lens Correction Profiles (LCPs) -!PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -!PREFERENCES_METADATA;Metadata -!PREFERENCES_METADATA_SYNC;Metadata synchronization with XMP sidecars -!PREFERENCES_METADATA_SYNC_NONE;Off -!PREFERENCES_METADATA_SYNC_READ;Read only -!PREFERENCES_METADATA_SYNC_READWRITE;Bidirectional -!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_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_FAVORITES;Favorites -!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_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_WBA;White Balance -!PREFERENCES_WBACORR;White Balance - Automatic temperature correlation -!PREFERENCES_WBACORR_TOOLTIP;These settings allow, depending on the images (type of raw file, colorimetry, etc.), an adaptation of the " Temperature correlation " algorithm in order to obtain the best overall results. There is no absolute rule, linking these parameters to the results obtained.\n\nThe settings are of 3 types: \n* those accessible to the user from the GUI.\n* those accessible only in reading from each pp3 file : Itcwb_minsize=20, Itcwb_delta=4 Itcwb_rgreen=1 Itcwb_nopurple=false (See Rawpedia)\n* those accessible to the user in 'options' (see Rawpedia)\n You can use "Awb temperature bias" and "Green refinement" to adjust the results. Each movement of these commands brings a new calculation of temperature, tint and correlation.\n\nPlease note that the 3 indicators 'Correlation factor', 'Patch chroma' and ΔE are given for information only. It is not because one of these indicators is better that the result will necessarily be better. -!PREFERENCES_WBAENA;Show White Balance Auto temperature correlation settings -!PREFERENCES_WBAENACUSTOM;Use Custom temperature & tint -!PREFERENCES_WBAFORC;Forces Extra algoritm -!PREFERENCES_WBAGREENDELTA;Delta temperature in green iterate loop (if Force Extra enabled) -!PREFERENCES_WBANOPURP;No purple color used -!PREFERENCES_WBAPATCH;Number maximum of colors used in picture -!PREFERENCES_WBAPRECIS;Precision algorithm - scale used -!PREFERENCES_WBASIZEREF;Size of reference color compare to size of histogram color -!PREFERENCES_WBASORT;Sort in chroma order instead of histogram -!PREFERENCES_XMP_SIDECAR_MODE;XMP sidecar style -!PREFERENCES_XMP_SIDECAR_MODE_EXT;darktable-like (FILENAME.ext.xmp for FILENAME.ext) -!PREFERENCES_XMP_SIDECAR_MODE_STD;Standard (FILENAME.xmp for FILENAME.ext) -!PREFERENCES_ZOOMONSCROLL;Zoom images by scrolling -!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 -!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_BIGTIFF;BigTIFF (no metadata support) -!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. -!SORT_ASCENDING;Ascending -!SORT_BY_DATE;By Date -!SORT_BY_EXIF;By EXIF -!SORT_BY_LABEL;By Color Label -!SORT_BY_NAME;By Name -!SORT_BY_RANK;By Rank -!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 -!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 -!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_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_CIECAT_DEGREEOUT;Chromatic Adaptation Viewing -!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_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_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_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_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 -!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_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_SATURATION;Saturation -!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_CURVE;Chrominance curve -!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -!TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance -!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual -!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method -!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the 'Preview' method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones -!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview -!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 -!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - -!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 -!TP_DIRPYRDENOISE_LABEL;Noise Reduction -!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control -!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve -!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance -!TP_DIRPYRDENOISE_MAIN_AUTO_GAIN;Compensate for lightness -!TP_DIRPYRDENOISE_MAIN_AUTO_GAIN_TOOLTIP;Alter the noise reduction strength based on the image lightness. Strength is reduced for dark images and increased for bright images. -!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_ARTIF;Reduce artifacts -!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 -!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_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_PICK_SIZE;Size: -!TP_FILMNEGATIVE_RED;Red ratio -!TP_FILMNEGATIVE_REF_LABEL;Input RGB: %1 -!TP_FILMNEGATIVE_REF_PICK;Pick white balance spot -!TP_FILMNEGATIVE_REF_SIZE;Size: -!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_FLATFIELD_FROMMETADATA;From Metadata -!TP_HLREC_COLOROPP;Inpaint Opposed -!TP_HLREC_HLBLUR;Blur -!TP_HLREC_HLTH;Gain threshold -!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_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_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_JDCMAX;JDC Max -!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 -!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_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 a spot (high values for scope and transition and 'Normal' or 'Inverse' in checkbox).\n-Isolate the foreground by using one or more 'Excluding' spots 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_CHRO46LABEL;Chroma levels 456: Mean=%1 High=%2 -!TP_LOCALLAB_CHROLABEL;Chroma levels 0123: Mean=%1 High=%2 -!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 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 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 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 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 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 layer blend modes (difference, multiply, soft light, overlay, etc.) with opacity control.\nOriginal image: merge current spot with original.\nPrevious spot: merge current spot with previous (if there is only one spot, previous = original).\nBackground: merge current 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;Spot minimum 39*39.\nUse low transition values and high 'Transition decay' and 'Scope' values to simulate smaller 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_FATSAT;Saturation control -!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_GAMUTLABRELA;Lab -!TP_LOCALLAB_GAMUTMUNSELL;Munsell only -!TP_LOCALLAB_GAMUTNON;None -!TP_LOCALLAB_GAMUTXYZABSO;XYZ Absolute -!TP_LOCALLAB_GAMUTXYZRELA;XYZ Relative -!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_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_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_LUM46LABEL;Luma levels 456: Mean=%1 High=%2 -!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_LUMLABEL;Luma levels 0123: Mean=%1 High=%2 -!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 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 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;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_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 -!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_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;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_RAWEXPOS_BLACK_0;Green 1 (lead) -!TP_RAWEXPOS_BLACK_1;Red -!TP_RAWEXPOS_BLACK_2;Blue -!TP_RAWEXPOS_BLACK_3;Green 2 -!TP_RAWEXPOS_BLACK_BLUE;Blue -!TP_RAWEXPOS_BLACK_GREEN;Green -!TP_RAWEXPOS_BLACK_RED;Red -!TP_RAWEXPOS_RGB;Red, Green, Blue -!TP_RAW_1PASSMEDIUM;1-pass (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_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). -!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_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 -!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_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_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 -!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_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;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 -!TP_RETINEX_GAMMA_LOW;Low -!TP_RETINEX_GAMMA_MID;Middle -!TP_RETINEX_GAMMA_NONE;None -!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.). -!TP_RETINEX_GRAD;Transmission gradient -!TP_RETINEX_GRADS;Strength gradient -!TP_RETINEX_GRADS_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Strength is reduced when iterations increase, and conversely. -!TP_RETINEX_GRAD_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Variance and Threshold are reduced when iterations increase, and conversely. -!TP_RETINEX_HIGH;High -!TP_RETINEX_HIGHLIG;Highlight -!TP_RETINEX_HIGHLIGHT;Highlight threshold -!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust 'Neighboring pixels' and to increase the 'White-point correction' in the Raw tab -> Raw White Points tool. -!TP_RETINEX_HSLSPACE_LIN;HSL-Linear -!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic -!TP_RETINEX_ITER;Iterations (Tone-mapping) -!TP_RETINEX_ITERF;Tone mapping -!TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. -!TP_RETINEX_LABEL;Retinex -!TP_RETINEX_LABEL_MASK;Mask -!TP_RETINEX_LABSPACE;L*a*b* -!TP_RETINEX_LOW;Low -!TP_RETINEX_MAP;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 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_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 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_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_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_BANDS;Bands -!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_DETAIL;Regularization -!TP_TONE_EQUALIZER_LABEL;Tone Equalizer -!TP_TONE_EQUALIZER_PIVOT;Pivot (Ev) -!TP_TONE_EQUALIZER_SHOW_COLOR_MAP;Show tonal map -!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;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_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 -!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_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_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 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 processing. -!TP_WAVELET_CURVEEDITOR_HH;HH -!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 -!TP_WAVELET_DAUB4;D4 - standard -!TP_WAVELET_DAUB6;D6 - standard plus -!TP_WAVELET_DAUB10;D10 - medium -!TP_WAVELET_DAUB14;D14 - high -!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+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;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 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_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;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;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_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 -!TP_WAVELET_LARGEST;Coarsest -!TP_WAVELET_LEVCH;Chroma -!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;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_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_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;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 -!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_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;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_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;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_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;Tiles -!TP_WAVELET_TILESFULL;Full image -!TP_WAVELET_TILESIZE;Tiling method -!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. -!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 & Refinement -!TP_WBALANCE_ITCWALG_TOOLTIP;Allows you to switch to the other Alternative temperature (Alt_temp), when possible.\nInactive in the "single choice" case. -!TP_WBALANCE_ITCWBDELTA_TOOLTIP;Fixed for each "green" iteration tried, the temperature difference to be taken into account. -!TP_WBALANCE_ITCWBFGREEN_TOOLTIP;Find the best compromise between Student and green. -!TP_WBALANCE_ITCWBMINSIZEPATCH_TOOLTIP;Allows you to set the minimum patch value. values that are too low can lead to a lack of correlation. -!TP_WBALANCE_ITCWBNOPURPLE_TOOLTIP;Allows you to filter magenta/purple data from the image. If the box is checked a filter limiting the value of Y is applied. By default this value is 0.4. You can change it in 'options' Itcwb_Ypurple (Maximum 1) -!TP_WBALANCE_ITCWBPRECIS_TOOLTIP;The lower the value, the more relevant the data, but increases the processing time. Since the processing time is low, this parameter should generally be able to remain at the default value -!TP_WBALANCE_ITCWBRGREEN_TOOLTIP;Sets the green value review amplitude in iterations, from low amplitude 0.82 to 1.25 to maximum amplitude 0.4 to 4. -!TP_WBALANCE_ITCWBSIZEPATCH_TOOLTIP;This setting sets the size of color datas used by algorithm. -!TP_WBALANCE_ITCWBSIZE_TOOLTIP;This setting sets the number of iterations to find the best correspondence between the reference spectral colors and those in xyY value of the image. A value of 3 seams a good compromise. -!TP_WBALANCE_ITCWBTHRES_TOOLTIP;Limits comparison sampling between spectral data and image data. -!TP_WBALANCE_ITCWB_ALG;Remove 2 pass algorithm -!TP_WBALANCE_ITCWB_CUSTOM;Use Custom temperature & tint -!TP_WBALANCE_ITCWB_DELTA;Delta temperature in green loop -!TP_WBALANCE_ITCWB_FGREEN;Find green student -!TP_WBALANCE_ITCWB_FORCED;Close to full CIE diagram -!TP_WBALANCE_ITCWB_FRA;Auto temperature correlation settings -!TP_WBALANCE_ITCWB_FRA_TOOLTIP;These settings allow, depending on the images (type of raw, colorimetry, etc.), an adaptation of the 'Temperature correlation' algorithm. There is no absolute rule linking these parameters to the results obtained. -!TP_WBALANCE_ITCWB_MINSIZEPATCH;Patch minimum size -!TP_WBALANCE_ITCWB_NOPURPLE;Filter on purple color -!TP_WBALANCE_ITCWB_PRECIS;Precision algorithm - scale used -!TP_WBALANCE_ITCWB_PRIM_ACE;Forces use of the entire CIE diagram -!TP_WBALANCE_ITCWB_PRIM_ADOB;Medium sampling -!TP_WBALANCE_ITCWB_PRIM_BETA;Medium sampling - near Pointer's gamut -!TP_WBALANCE_ITCWB_PRIM_JDCMAX;Close to full CIE diagram -!TP_WBALANCE_ITCWB_PRIM_REC;High sampling -!TP_WBALANCE_ITCWB_PRIM_SRGB;Low sampling & Ignore Camera settings -!TP_WBALANCE_ITCWB_PRIM_XYZCAM;Camera XYZ matrix -!TP_WBALANCE_ITCWB_PRIM_XYZCAM2;JDCmax after Camera XYZ matrix -!TP_WBALANCE_ITCWB_RGREEN;Green range -!TP_WBALANCE_ITCWB_SAMPLING;Low sampling 5.9 -!TP_WBALANCE_ITCWB_SIZE;Size of ref. color compare to histogram -!TP_WBALANCE_ITCWB_SIZEPATCH;Size of color patch -!TP_WBALANCE_ITCWB_THRES;Colors used in picture (preset) -!TP_WBALANCE_ITCWCUSTOM_TOOLTIP;Allows you to use Custom settings Temperature and Green (tint).\n\nUsage tips:\n1) start Itcwb , enable 'Use Custom temperature and tint'.\n2) Set 'Temperature and tint' to your liking :free, Pick,...(Custom)\n3) go back to 'Temperature correlation'.\n\nYou cannot use : 2 passes, AWB temperature bias, Green refinement. -!TP_WBALANCE_ITCWFORCED_TOOLTIP;By default (box not checked) the data scanned during sampling is brought back to the sRGB profile, which is the most widespread, both for calibrating DCP or ICC profiles with the Colorchecker24, or used on the web.\n If you have very high gamut images (some flowers, artificial colors), then it may be necessary to use the entire CIExy diagram, the profile used will be ACESP0. In this second case, the number of colors that can be used in internal to the algorithm will be more important. -!TP_WBALANCE_ITCWGREEN;Green refinement -!TP_WBALANCE_ITCWGREEN_TOOLTIP;Allows you to change the "tint" (green) which will serve as a reference when starting the algorithm. It has substantially the same role for greens as "AWB temperature bias" for temperature.\nThe whole algorithm is recalculated. -!TP_WBALANCE_ITCWPRIM_TOOLTIP;Allows you to select the image sampling.\n'Close to full CIE diagram' almost uses the data present on the sensor, possibly including the imaginary colors.\n'Camera XYZ matrix' - uses the matrix directly derived from Color Matrix.\n'Medium sampling' (default) - near Pointer's gamut: corresponds substantially to the most common cases of human vision.\nThe other choice 'Low sampling and Ignore camera settings' allow you to isolate high gamut parts of the image and forces the algorithm in some cases (tint > 0.8,...) to ignore camera settings. This will obviously have an impact on the result.\n\nThis sampling only has an influence on the channel multipliers, it has nothing to do with the "working profile" and does not modify the gamut of the image. -!TP_WBALANCE_ITCWSAMPLING_TOOLTIP;Allows you to use the old sampling algorithm to ensure better compatibility with 5.9. You must enable Observer 10° (default). -!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_PATCHLABEL;Read colors:%1 Patch: Chroma:%2 Size=%3 -!TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colors (max=237).\nDisplay calculated Patch Chroma.\nAWB temperature bias, lets try to reduce this value, a minimum may seem to optimize the algorithm.\n\nPatch size matching chroma optimization. -!TP_WBALANCE_PATCHLEVELLABEL;Patch: ΔE=%1 - datas x 9 Min:%2 Max=%3 -!TP_WBALANCE_PATCHLEVELLABEL_TOOLTIP;Display ΔE patch (this assumes there is enough spectral data), between image and spectral datas.\n Display read datas found. The 2 values correspond to the minimum and maximum data values taken into account. The coefficient x9 must be taken into account to obtain the number of pixels concerned in the image. -!TP_WBALANCE_PICKER;Pick -!TP_WBALANCE_STUDLABEL;Correlation factor: %1 Passes:%2 Worst_alt=%3 -!TP_WBALANCE_STUDLABEL0;Correlation factor: %1 Passes:%2 Alt=%3 -!TP_WBALANCE_STUDLABEL1;Correlation factor: %1 Passes:%2 Best_alt=%3 -!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.\n\nPasses : number of passes made.\nAlt_temp : Alternative temperature. -!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'.\n\nYou can use "Awb temperature bias" to adjust the "Temperature correlation" results. Each movement of this command brings a new calculation of temperature, tint and correlation. -!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f -!//TP_WBALANCE_ITCWBNOPURPLE_TOOLTIP;By default when "Inpaint opposed" is activated, purple colors are not taken into account. However, if the image does not need highlight reconstruction, or if this image naturally contains purple tints (flowers, etc.), it may be necessary to deactivate, to take into account all the colors. -!//TP_WBALANCE_ITCWB_FORCED;Forces use of the entire CIE diagram +!FILEBROWSER_SHOWRECURSIVE;Show images in sub-folders recursively. +!HISTORY_MSG_ICM_CAT;Matrix adaptation +!HISTORY_MSG_ICM_MIDTCIE;Midtones +!HISTORY_MSG_ICM_REFI;Refinement Colors +!HISTORY_MSG_ICM_SHIFTX;Refinement Colors - Shift x +!HISTORY_MSG_ICM_SHIFTY;Refinement Colors - Shift y +!HISTORY_MSG_ICM_SMOOTHCIE;Smooth highlights +!HISTORY_MSG_ICM_TRCEXP;Abstract Profile +!HISTORY_MSG_LOCAL_CIEMASK_BLURCONT;Local - CIECAM Mask blur contrast +!HISTORY_MSG_LOCAL_CIEMASK_BLURFFT;Local - CIECAM Mask blur FFTW +!HISTORY_MSG_LOCAL_CIEMASK_BLURRAD;Local - CIECAM Mask blur radius +!HISTORY_MSG_LOCAL_CIEMASK_CHH;Local - CIECAM Mask curve h(h) +!HISTORY_MSG_LOCAL_CIEMASK_HIGH;Local - CIECAM Mask highlights +!HISTORY_MSG_LOCAL_CIEMASK_SHAD;Local - CIECAM Mask shadows +!HISTORY_MSG_LOCAL_CIEMASK_STRU;Local - CIECAM Mask structure +!HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;Local - CIECAM Mask structure as tool +!HISTORY_MSG_LOCAL_CIEMASK_WLC;Local - CIECAM Mask wavelet L(L) +!HISTORY_MSG_LOCAL_CIEMASK_WLEV;Local - CIECAM Mask wavelet levels +!HISTORY_MSG_LOCAL_CIE_ANGGRAD;Local - CIECAM Gradient angle +!HISTORY_MSG_LOCAL_CIE_BLACKS;Local - CIECAM Blacks distribution +!HISTORY_MSG_LOCAL_CIE_BLUXL;Local - CIECAM Blue X +!HISTORY_MSG_LOCAL_CIE_BLUYL;Local - CIECAM Blue Y +!HISTORY_MSG_LOCAL_CIE_BRICOMP;Local - CIECAM Brightness compression +!HISTORY_MSG_LOCAL_CIE_BRICOMPTH;Local - CIECAM Brightness compression threshold +!HISTORY_MSG_LOCAL_CIE_BWCIE;Local - CIECAM Black and white +!HISTORY_MSG_LOCAL_CIE_CAT;Local - Matrix adaptation +!HISTORY_MSG_LOCAL_CIE_DETAILJZ;Local - JzCzHz Local contrast +!HISTORY_MSG_LOCAL_CIE_ENAMASKALL;Local - CIECAM All mask tools +!HISTORY_MSG_LOCAL_CIE_EXPPRECAM;Local - CIECAM Pre-Cam +!HISTORY_MSG_LOCAL_CIE_GAM;Local - CIECAM Gamma +!HISTORY_MSG_LOCAL_CIE_GAMUTCIE;Local - CIECAM Gamut +!HISTORY_MSG_LOCAL_CIE_GREXL;Local - CIECAM Green X +!HISTORY_MSG_LOCAL_CIE_GREYL;Local - CIECAM Green Y +!HISTORY_MSG_LOCAL_CIE_ILL;Local - CIECAM TRC Illuminant +!HISTORY_MSG_LOCAL_CIE_LOGCIEQ;Local - CIECAM Log encoding Q +!HISTORY_MSG_LOCAL_CIE_MIDT;Local - CIECAM Mid Tones +!HISTORY_MSG_LOCAL_CIE_NORM;Local - CIECAM Normalize L +!HISTORY_MSG_LOCAL_CIE_PRIM;Local - CIECAM TRC primaries +!HISTORY_MSG_LOCAL_CIE_REDXL;Local - CIECAM Red X +!HISTORY_MSG_LOCAL_CIE_REDYL;Local - CIECAM Red Y +!HISTORY_MSG_LOCAL_CIE_REFI;Local - CIECAM Refinement colors +!HISTORY_MSG_LOCAL_CIE_SATCIE;Local - CIECAM Saturation control +!HISTORY_MSG_LOCAL_CIE_SHIFTXL;Local - CIECAM Shift x +!HISTORY_MSG_LOCAL_CIE_SHIFTYL;Local - CIECAM Shift y +!HISTORY_MSG_LOCAL_CIE_SIG;Local - Sigmoid +!HISTORY_MSG_LOCAL_CIE_SIGADAP;Local - CIECAM Sigmoid adaptability +!HISTORY_MSG_LOCAL_CIE_SIGMET;Local - CIECAM Sigmoid method +!HISTORY_MSG_LOCAL_CIE_SLOP;Local - CIECAM Slope +!HISTORY_MSG_LOCAL_CIE_SLOPESMO;Local - CIECAM Gray balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOB;Local - CIECAM Blue balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOG;Local - CIECAM Green balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOR;Local - CIECAM Red balance +!HISTORY_MSG_LOCAL_CIE_SMOOTH;Local - CIECAM Scale Yb scene +!HISTORY_MSG_LOCAL_CIE_SMOOTHMET;Local - CIECAM Smooth lights method +!HISTORY_MSG_LOCAL_CIE_SMOOTHYB;Local - CIECAM Scale Yb viewing +!HISTORY_MSG_LOCAL_CIE_SMOOTH_LUM;Local - CIECAM Levels - Luminosity mode +!HISTORY_MSG_LOCAL_CIE_STRGRAD;Local - CIECAM Gradient strength L +!HISTORY_MSG_LOCAL_CIE_STRLOG;Local - CIECAM Log encoding strength +!HISTORY_MSG_LOCAL_CIE_TRC;Local - CIECAM TRC +!HISTORY_MSG_LOCAL_CIE_WHITES;Local - CIECAM Whites distribution +!HISTORY_MSG_LOCAL_FEATHERCIE;Local - CIECAM Gradient feather +!HISTORY_MSG_LOCAL_FEATHERCOL;Local - Color Gradient feather +!HISTORY_MSG_LOCAL_FEATHEREXE;Local - Exp Gradient feather +!HISTORY_MSG_LOCAL_FEATHERLOG;Local - Log Gradient feather +!HISTORY_MSG_LOCAL_FEATHERMAS;Local - Mask Common gradient feather +!HISTORY_MSG_LOCAL_FEATHERSH;Local - SH Gradient feather +!HISTORY_MSG_LOCAL_FEATHERVIB;Local - Vib Gradient feather +!HISTORY_MSG_LOCAL_FEATHERWAV;Local - Wav Gradient feather +!HISTORY_MSG_LOCAL_LOG_BLACKS;Local - Log Blacks distribution +!HISTORY_MSG_LOCAL_LOG_COMPR;Local - Log Compress brightness +!HISTORY_MSG_LOCAL_LOG_SAT;Local - Log Saturation control +!HISTORY_MSG_LOCAL_LOG_WHITES;Local - Log Whites distribution +!PREFERENCES_BROWSERECURSIVEDEPTH;Browse sub-folders depth +!PREFERENCES_BROWSERECURSIVEFOLLOWLINKS;Follow symbolic links when browsing sub-folders +!PREFERENCES_BROWSERECURSIVEMAXDIRS;Maximum sub-folders +!PREFERENCES_MAX_ZOOM_TITLE;Maximum zoom +!PREFERENCES_RAW_DECODER;Raw Decoder +!PREFERENCES_RAW_DECODER_ENABLE_LIBRAW;Use LibRaw +!PREFERENCES_SPOTLOC;Define Spot method for Selective Editing +!PREFERENCES_THUMBNAIL_RANK_COLOR_MODE;Load/Save thumbnail rank and color from/to XMP sidecars +!QUEUE_LOCATION_TEMPLATE_HELP_BUTTON_TOOLTIP;Show or hide a help panel with instructions for creating location templates +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_BODY;If you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p-3/converted/%P-4/%f +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_TITLE;Common examples +!QUEUE_LOCATION_TEMPLATE_HELP_INTRO;The output template field allows you to to dynamically customize the destination folder and filename. When you include certain specifiers, which begin with %, they are replaced by the program when each file is being saved.\n\nThe sections below describe each type of specifier. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_1;Using this pathname as an example: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_2;The meanings of the formatting strings are: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_LINUX;/home/tom/photos/2010-10-31/photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_WINDOWS;D:\tom\photos\2010-10-31\photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO;The %dN, %d-N, %pN, %p-N, %PN and %P-N (N = 1..9) specifiers will be replaced by elements of the image file's directory path.\nThe format specifiers operate as follows:\n %dN = Nth directory from the end of the path\n %d-N = Nth directory from the start of the path\n %pN = all directories up to the Nth from the end of the path\n %p-N = the first N directories in the path\n %PN = the last N directories in the path\n %P-N = all directories from the Nth to the end of the path\n %f = base filename (no extension) +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO_WINDOWS;For Windows paths, %d-1 is the drive letter and colon, and %d-2 is the base directory on that drive. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_TITLE;Directories and partial paths +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_BODY;%r will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used. +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_TITLE;Rank +!QUEUE_LOCATION_TEMPLATE_HELP_RESULT_MISMATCH;ERROR: 2nd result is different: +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_BODY;%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'. +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_TITLE;Position/sequence in queue +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_BODY;Three different date/time values may be used in templates:\n %tE"%Y-%m-%d" = when export started\n %tF"%Y-%m-%d" = when file was last saved\n %tP"%Y-%m-%d" = when photo was taken\nThe quoted string defines the format of the resulting date and/or time. The format string %tF"%Y-%m-%d" is just one example. The string can use all conversion specifiers defined for the g_date_time_format function (see https://docs.gtk.org/glib/method.DateTime.format.html).\n\nExample format strings: +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_TITLE;Date and time +!QUEUE_LOCATION_TEMPLATE_HELP_TITLE;Creating an output template +!TC_LOCALLAB_PRIM_SHIFTX;Shift x +!TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP;In combination with "Refine colors", allows you to:\n 1) for low values, adjust the image purity.\n 2) for higher values, carry out moderate color toning.\nBe careful not to go outside the CIE xy diagram. +!TC_LOCALLAB_PRIM_SHIFTY;Shift y +!TC_PRIM_REFI;Refine colors (white-point) +!TP_ICM_BW;Black and White +!TP_ICM_WORKING_CAT;Matrix adaptation +!TP_ICM_WORKING_CAT_BRAD;Bradford +!TP_ICM_WORKING_CAT_CAT02;Cat02 +!TP_ICM_WORKING_CAT_CAT16;Cat16 +!TP_ICM_WORKING_CAT_TOOLTIP;Performs the chromatic adaptation of the XYZ conversion matrix. Default: Bradford +!TP_ICM_WORKING_CAT_VK;Von Kries +!TP_ICM_WORKING_CAT_XYZ;XYZ scale +!TP_ICM_WORKING_ILLU_E;E +!TP_ICM_WORKING_NON;None +!TP_ICM_WORKING_PRIM_FREE;Custom LA (sliders) +!TP_ICM_WORKING_PRIM_JDCMAXSTDA;JDC Max stdA +!TP_ICM_WORKING_PRIM_TOOLTIP;Performs a gamut control. Destination primaries (Advanced) allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified.\nWhen 'Custom LA (sliders)' is selected, you can modify the values of the 3 primaries (Red, Green, and Blue) for x and y. +!TP_LENSPROFILE_CORRECTION_METADATA;From file metadata +!TP_LOCALLAB_BWEVNONE;None +!TP_LOCALLAB_BWEVSIG;Activated +!TP_LOCALLAB_BWEVSIGLOG;Sigmoid & Log-Encoding +!TP_LOCALLAB_CIE_SMOOTHFRAME;Highlight Attenuation & Levels +!TP_LOCALLAB_CIE_SMOOTH_EV;Ev based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA;Slope based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF;Gamma based +!TP_LOCALLAB_CIE_SMOOTH_LEVELS;Levels +!TP_LOCALLAB_CIE_SMOOTH_NONE;None +!TP_LOCALLAB_COLORFRAME;Dominant color +!TP_LOCALLAB_COMPRCIE;Brightness compression +!TP_LOCALLAB_COMPRCIETH;Compression threshold +!TP_LOCALLAB_COMPRLOG_TOOLTIP;This algorithm compress the data before log conversion, above the threshold slider value. To use in conjunction with Whites distribution. +!TP_LOCALLAB_DISAB_CIECAM;Disable Ciecam or Weak Jz surround +!TP_LOCALLAB_ENABLE_MASKALL;Enable all mask tools +!TP_LOCALLAB_EXMAIN;Global +!TP_LOCALLAB_FEATVALUE_MASK;Feather gradient (Grad. Filters Mask) +!TP_LOCALLAB_LOGCIEQ;Log Encoding Q (with Ciecam) +!TP_LOCALLAB_LOGCIEQ_TOOLTIP;Activating the checkbox allows you to switch between log encoding based on the 3 RGB channels, and log encoding based solely on Ciecam’s brightness (Q) channel.\nUsing the Q channel instead of the RGB channels helps avoid undesirable edge effects such as hue and saturation shifts.\nHowever, the settings are more difficult to optimise because Q is unbounded and Ciecam alters the data to take into account the surround conditions, simultaneous contrast, etc.\nYou may have to adjust the following:\n Scene conditions: Mean luminance (Yb), Whites & Blacks distribution, Black Ev, White Ev.\n Source Data Adjustments : Brightness compression, Strength.\n\nNote: when using Log Encoding (Q), be careful not to activate the Disable Ciecam option in the Scene Conditions, Surround menu. +!TP_LOCALLAB_LOGPFRA2;Log Encoding settings +!TP_LOCALLAB_MIDTCIE;Midtones +!TP_LOCALLAB_PRECAMGAMUT_TOOLTIP;If checked, ensures a gamut control just after primary conversion to XYZ. +!TP_LOCALLAB_PRECAMREFIMAIN_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. In combination with "Shift x" and "Shift y", allows you to carry out moderate color toning. +!TP_LOCALLAB_PRECAMREFI_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. +!TP_LOCALLAB_PRECAM_TOOLTIP;'Source Data Adjustments' modifies the Dynamic Range using Log encoding, the tones of the image and primaries (simplified Abstract Profile), and midtones, just before the Ciecam process. These values are adjustable:\nGamma: Acts mainly on light tones\nSlope: Acts mainly on dark tones. You 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.\nDestination primaries: Allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified. You can also finely adapt the primaries and the illuminant (white-point). Moving a primary away from the white point reduces saturation and vice versa. Pay attention to the gamut. +!TP_LOCALLAB_PRIMILLFRAME;Primaries & Illuminant +!TP_LOCALLAB_SATCIE;Saturation control +!TP_LOCALLAB_SIGBLACKSSCIE;Blacks distribution +!TP_LOCALLAB_SIGCIE;Sigmoid +!TP_LOCALLAB_SIGGAMJCIE;Gamma +!TP_LOCALLAB_SIGMOID16_TOOLTIP;Allows you to simulate a tone mapping appearance using both 'Ciecam' and 'Sigmoid Q'. Sigmoid Q has three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc) Adaptability weights the action of the sigmoid by action on the internal exponential function. +!TP_LOCALLAB_SIGMOIDLOGAUTO;Auto threshold +!TP_LOCALLAB_SIGMOIDLOGEV_TOOLTIP;If the combo box selection 'Black Ev and White Ev' is 'Sigmoid and Log encoding' instead of 'Sigmoid only', the two algorithms 'Log encoding' and 'Sigmoid' are used together. +!TP_LOCALLAB_SIGMOIDNORMCIE;Normalize Luminance +!TP_LOCALLAB_SIGMOIDNORMCIEBLEND_TOOLTIP;Blend acts on the final aspect of the image, contrast and luminance. Ratio between original and output image. +!TP_LOCALLAB_SIGMOIDNORMCIE_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image take into account those of the original.\nAll the adjustments acting on J or Q are taken into account, including those which are not relative to Sigmoid Q. +!TP_LOCALLAB_SIGMOIDQJCOMPRCIE_TOOLTIP;When the combo box selection 'Uses Black Ev and White Ev' is 'Sigmoid and Log encoding Q' or 'Log encoding instead of Sigmoid' checked. This algorithm compress the data above the threshold slider value. The last value stands for brightness (Q) and should be close as possible to the value 'Compression threshold' (calculate when 'Auto threshold" checked, often > 1). +!TP_LOCALLAB_SIGMOIDSENSI;Adaptability +!TP_LOCALLAB_SIGMOIDWHITESCIE_TOOLTIP;Allows you, in Automatic when the dynamic range of the image is high, to change the distribution of lights in whites and deep blacks.\nCan be used with Log encoding or Sigmoid with Black Ev and White Ev enabled.\n\nThe algorithm does not change the basic data, but acts on the components necessary to calculate the Dynamic range, Black Ev, White Ev and the Gray point. +!TP_LOCALLAB_SIGSLOPJCIE;Slope +!TP_LOCALLAB_SIGTRCCIE;Source Data Adjustments +!TP_LOCALLAB_SIGWHITESCIE;Whites distribution +!TP_LOCALLAB_SLOPESMOOTH;Gray balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHB;Blue balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHG;Green balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHR;Red balance (Slope) +!TP_LOCALLAB_SMOOTHCIE;Highlight Attenuation +!TP_LOCALLAB_SMOOTHCIE_LUM;Luminosity mode +!TP_LOCALLAB_SMOOTHCIE_SCA;Scale Yb Scene +!TP_LOCALLAB_SMOOTHCIE_TOOLTIP;Completes the processing carried out by gamma, slope and midtones by causing a slight lowering of lights. Please note this does not replace Highlight reconstruction.\n\nGamma based and Slope based (Standard and Advanced) allow you to simulate a tone mapping using:\na) Scene conditions: Black-Ev, White-Ev, Mean luminance (Yb%)\nb) Viewing conditions: Mean luminance (Yb%).\n\nScale Yb Scene is function of White-Ev. +!TP_LOCALLAB_SMOOTHCIE_YB;Scale Yb Viewing +!TP_LOCALLAB_STRENGTHCIELOG;Strength +!TP_LOCALLAB_TRCFRAME;Tone Response Curve & Midtones diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 8bfbf0f42..235d68e11 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -1,4 +1,5 @@ -#001 Last update 10-12-2022 +#001 2022-10-12 Yz2house +#002 2024-05-23 Yz2house #100 #101 @LANGUAGE_DISPLAY_NAME=日本語 @@ -52,6 +53,7 @@ DYNPROFILEEDITOR_PROFILE;処理プロファイル EDITWINDOW_TITLE;画像編集 EDIT_OBJECT_TOOLTIP;この機能を使うための目安に、プレビュー画面にガイドを表示する EDIT_PIPETTE_TOOLTIP;カーブ上に調整ポイントを追加するには、Ctrlキーを押しながら、プレビューの画像上の目標ポイントを左クリックします。\n追加されたそのポイントを調整するには、Ctrlキーを押しながら、プレビュー画像のそのポイントに当たる部分を左クリックします。それからCtrlキーを離し(微妙な調整をする場合はそのまま)、左クリックしたままマウスを画面上で上下に動かすと、それに合わせてトーンカーブが調整されます。 +ERROR_MSG_METADATA_VALUE;メタデータ: エラー設定 %1から%2 EXIFFILTER_APERTURE;絞り EXIFFILTER_CAMERA;カメラ EXIFFILTER_EXPOSURECOMPENSATION;露光量補正 (EV) @@ -61,12 +63,16 @@ EXIFFILTER_IMAGETYPE;画像の種類 EXIFFILTER_ISO;ISO EXIFFILTER_LENS;レンズ EXIFFILTER_METADATAFILTER;メタデータ絞り込みを有効にする +EXIFFILTER_PATH;ファイルパス EXIFFILTER_SHUTTER;シャッター +EXIFPANEL_ACTIVATE_ALL_HINT;全てのタグを選択 +EXIFPANEL_ACTIVATE_NONE_HINT;何れのタグも選択しない EXIFPANEL_ADDEDIT;追加/編集 EXIFPANEL_ADDEDITHINT;新しいタグを追加、またはタグの編集 EXIFPANEL_ADDTAGDLG_ENTERVALUE;値の入力 EXIFPANEL_ADDTAGDLG_SELECTTAG;タグ選択 EXIFPANEL_ADDTAGDLG_TITLE;タグの追加/編集 +EXIFPANEL_BASIC_GROUP;ベーシック EXIFPANEL_KEEP;そのまま EXIFPANEL_KEEPHINT;出力ファイルに書き込む際、選択されたタグをそのままにする EXIFPANEL_REMOVE;削除 @@ -75,9 +81,8 @@ EXIFPANEL_RESET;リセット EXIFPANEL_RESETALL;すべてリセット EXIFPANEL_RESETALLHINT;すべてのタグを元の値にリセット EXIFPANEL_RESETHINT;選択されたタグを元の値にリセット -EXIFPANEL_SHOWALL;全て表示 -EXIFPANEL_SUBDIRECTORY;サブディレクトリ -EXPORT_BYPASS;迂回させる機能 +EXIFPANEL_VALUE_NOT_SHOWN;非表示 +EXPORT_BYPASS;処理工程を迂回 EXPORT_BYPASS_ALL;全て選択 / 全て解除 EXPORT_BYPASS_DEFRINGE;フリンジ低減を迂回 EXPORT_BYPASS_DIRPYRDENOISE;ノイズ低減を迂回 @@ -164,7 +169,8 @@ FILEBROWSER_POPUPRANK5;ランク 5 ***** FILEBROWSER_POPUPREMOVE;完全に削除 FILEBROWSER_POPUPREMOVEINCLPROC;キュー処理に保持されているファイルを含めて完全に削除 FILEBROWSER_POPUPRENAME;名前変更 -FILEBROWSER_POPUPSELECTALL;全選択 +FILEBROWSER_POPUPSELECTALL;全て選択 +FILEBROWSER_POPUPSORTBY;ファイルの並べ替え FILEBROWSER_POPUPTRASH;ゴミ箱へ移動 FILEBROWSER_POPUPUNRANK;ランクなし FILEBROWSER_POPUPUNTRASH;ゴミ箱から移動 @@ -196,11 +202,12 @@ FILEBROWSER_SHOWRANK2HINT;2つ星ランクを表示\nショートカット: Shift-3 FILEBROWSER_SHOWRANK4HINT;4つ星ランクを表示\nショートカット: Shift-4 FILEBROWSER_SHOWRANK5HINT;5つ星ランクを表示\nショートカット: Shift-5 -FILEBROWSER_SHOWRECENTLYSAVEDHINT;最近保存された画像を表示\nショートカット: Alt-7 -FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;最近保存されていない画像を表示\nショートカット: Alt-6 +FILEBROWSER_SHOWRECENTLYSAVEDHINT;保存された画像を表示\nショートカット: Alt-7 +FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;保存されていない画像を表示\nショートカット: Alt-6 +FILEBROWSER_SHOWRECURSIVE;サブフォルダの中の画像を再帰的に表示 FILEBROWSER_SHOWTRASHHINT;ゴミ箱の内容を表示\nショートカット: Ctrl-t -FILEBROWSER_SHOWUNCOLORHINT;カラー・ラベルのない画像を表示\nショートカット: Alt-0 -FILEBROWSER_SHOWUNRANKHINT;ランクなし画像を表示\nショートカット: Shift-0 +FILEBROWSER_SHOWUNCOLORHINT;カラーラベルなしで画像を表示\nショートカット: Alt-0 +FILEBROWSER_SHOWUNRANKHINT;ランクのない画像を表示\nショートカット: Shift-0 FILEBROWSER_THUMBSIZE;サムネイルのサイズ FILEBROWSER_UNRANK_TOOLTIP;ランクなし\nショートカット: 0 FILEBROWSER_ZOOMINHINT;サムネイルサイズの拡大\nショートカット: +\n\nシングル編集タブのショートカット: Alt-+ @@ -208,6 +215,7 @@ FILEBROWSER_ZOOMOUTHINT;サムネイルサイズの縮小\nショートカット FILECHOOSER_FILTER_ANY;全てのファイル FILECHOOSER_FILTER_COLPROF;カラープロファイル FILECHOOSER_FILTER_CURVE;カーブファイル +FILECHOOSER_FILTER_EXECUTABLE;実行可能ファイル FILECHOOSER_FILTER_LCP;レンズ補正プロファイル FILECHOOSER_FILTER_PP;処理プロファイル FILECHOOSER_FILTER_SAME;現在の画像と同じフォーマット @@ -222,11 +230,11 @@ GENERAL_CANCEL;キャンセル GENERAL_CLOSE;閉じる GENERAL_CURRENT;現在 GENERAL_DELETE_ALL;全て削除 -GENERAL_DISABLE;無効 -GENERAL_DISABLED;無効 +GENERAL_DISABLE;無効にする +GENERAL_DISABLED;無効になりました GENERAL_EDIT;編集 -GENERAL_ENABLE;有効 -GENERAL_ENABLED;有効 +GENERAL_ENABLE;有効する +GENERAL_ENABLED;有効になりました GENERAL_FILE;ファイル GENERAL_HELP;ヘルプ GENERAL_LANDSCAPE;横 @@ -235,6 +243,7 @@ GENERAL_NO;No GENERAL_NONE;なし GENERAL_OK;OK GENERAL_OPEN;開く +GENERAL_OTHER;その他 GENERAL_PORTRAIT;縦 GENERAL_RESET;リセット GENERAL_SAVE;保存 @@ -735,21 +744,21 @@ 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_500;ローカル - スポット形状 +HISTORY_MSG_501;ローカル - スポット方法 +HISTORY_MSG_502;ローカル - SC -形状の方式 +HISTORY_MSG_503;ローカル - スポット - 右の垂直線 +HISTORY_MSG_504;ローカル - スポット - 左の垂直線 +HISTORY_MSG_505;ローカル - スポット - 下の水平線 +HISTORY_MSG_506;ローカル - スポット - 上の水平線 +HISTORY_MSG_507;ローカル - スポット - 中心 +HISTORY_MSG_508;ローカル - スポット - 大きさ +HISTORY_MSG_509;ローカル - スポット - 質の種類 +HISTORY_MSG_510;ローカル - TG - 変移の位置 +HISTORY_MSG_511;ローカル - SD - ΔEスコープのしきい値 +HISTORY_MSG_512;ローカル - SD - ΔEの減衰 +HISTORY_MSG_513;ローカル - スポット - 除外 - スコープ +HISTORY_MSG_514;ローカル - スポットの構造 HISTORY_MSG_515;ローカル編集 HISTORY_MSG_516;ローカル - 色と明るさ HISTORY_MSG_517;ローカル - 強力を有効にする @@ -856,7 +865,7 @@ HISTORY_MSG_618;ローカル - 色と明るさ マスクを使う HISTORY_MSG_619;ローカル - 露光補正 マスクを使う HISTORY_MSG_620;ローカル - 色と明るさ ぼかし HISTORY_MSG_621;ローカル - 露光補正 反対処理 -HISTORY_MSG_622;ローカル - 構造の除外 +HISTORY_MSG_622;ローカル - スポット - 除外 - スポットの構造 HISTORY_MSG_623;ローカル - 露光補正 色の補間 HISTORY_MSG_624;ローカル - カラー補正グリッド HISTORY_MSG_625;ローカル - 補正グリッドの強さ @@ -879,7 +888,7 @@ HISTORY_MSG_641;ローカル - シャドウハイライト マスクを使用 HISTORY_MSG_642;ローカル - シャドウハイライト 半径 HISTORY_MSG_643;ローカル - シャドウハイライト ぼかし HISTORY_MSG_644;ローカル - シャドウハイライト 反対処理 -HISTORY_MSG_645;ローカル - 色差のバランス ab-L +HISTORY_MSG_645;ローカル - SD - ab-Lのバランス HISTORY_MSG_646;ローカル - 露光補正 色度のマスク HISTORY_MSG_647;ローカル - 露光補正 ガンマのマスク HISTORY_MSG_648;ローカル - 露光補正 スロープのマスク @@ -893,7 +902,7 @@ HISTORY_MSG_655;ローカル - シャドウハイライト スロープのマ HISTORY_MSG_656;ローカル - 色と明るさ ソフトな半径 HISTORY_MSG_657;ローカル - レティネックス アーティファクトの軽減 HISTORY_MSG_658;ローカル - CbDL ソフトな半径 -HISTORY_MSG_659;ローカル スポット 境界値の減衰 +HISTORY_MSG_659;ローカル - TG - 変移の減衰 HISTORY_MSG_660;ローカル - CbDL 明瞭 HISTORY_MSG_661;ローカル - CbDL 残差のコントラスト HISTORY_MSG_662;ローカル - deNoise 輝度 細かい0 @@ -910,7 +919,7 @@ HISTORY_MSG_672;ローカル - CbDL マスク CL HISTORY_MSG_673;ローカル - CbDL マスクを使う HISTORY_MSG_674;ローカル - 削除された機能 HISTORY_MSG_675;ローカル - TM ソフトな半径 -HISTORY_MSG_676;ローカル スポット 境界の差異 +HISTORY_MSG_676;ローカル - TG - 変移の差異 HISTORY_MSG_677;ローカル - TM 量 HISTORY_MSG_678;ローカル - TM 彩度 HISTORY_MSG_679;ローカル - レティネックス マスク C @@ -1012,19 +1021,19 @@ HISTORY_MSG_780;ローカル - 色と明るさ シャドウのマスク HISTORY_MSG_781;ローカル - コントラスト ウェーブレットのレベルのマスク HISTORY_MSG_782;ローカル - Blur Denoise ウェーブレットのレベルのマスク HISTORY_MSG_783;ローカル - 色と明るさ ウェーブレットのレベル -HISTORY_MSG_784;ローカル - ΔEのマスク -HISTORY_MSG_785;ローカル - ΔEのスコープのマスク +HISTORY_MSG_784;ローカル - マスク - ΔE画像のマスク +HISTORY_MSG_785;ローカル - マスク - スコープ HISTORY_MSG_786;ローカル - シャドウハイライト 方式 HISTORY_MSG_787;ローカル - イコライザの乗数 HISTORY_MSG_788;ローカル - イコライザのディテール HISTORY_MSG_789;ローカル - シャドウハイライト マスクの量 HISTORY_MSG_790;ローカル - シャドウハイライト マスクのアンカー HISTORY_MSG_791;ローカル - マスク ショートLカーブ -HISTORY_MSG_792;ローカル - マスク 背景輝度 +HISTORY_MSG_792;ローカル - マスク - 背景 HISTORY_MSG_793;ローカル - シャドウハイライト TRCのガンマ HISTORY_MSG_794;ローカル - シャドウハイライト TRCのスロープ HISTORY_MSG_795;ローカル - マスク 復元したイメージの保存 -HISTORY_MSG_796;ローカル - 基準値の繰り返し +HISTORY_MSG_796;ローカル - SC - 繰り返しの基準 HISTORY_MSG_797;ローカル - オリジナルとの融合方式 HISTORY_MSG_798;ローカル - 不透明度 HISTORY_MSG_799;ローカル - Color RGB トーンカーブ @@ -1060,7 +1069,7 @@ HISTORY_MSG_829;ローカル - シャドウハイライト 階調 角度 HISTORY_MSG_830;ローカル - 色と明るさ 階調 Lの強さ HISTORY_MSG_831;ローカル - 色と明るさ 階調 角度 HISTORY_MSG_832;ローカル - 色と明るさ 階調 Cの強さ -HISTORY_MSG_833;ローカル - 減光のフェザー処理 +HISTORY_MSG_833;ローカル - TG - 減光のフェザー処理 HISTORY_MSG_834;ローカル - 色と明るさ 減光の強さ H HISTORY_MSG_835;ローカル - 自然な彩度 諧調 Lの強さ HISTORY_MSG_836;ローカル - 自然な彩度 階調 角度 @@ -1093,7 +1102,7 @@ HISTORY_MSG_863;ローカル - ウェーブレット 元画像と融合 HISTORY_MSG_864;ローカル - ウェーブレット 方向別コントラストの減衰 HISTORY_MSG_865;ローカル - ウェーブレット 方向別コントラスト Δ HISTORY_MSG_866;ローカル - ウェーブレット 方向別コントラスト 圧縮のガンマ -HISTORY_MSG_868;ローカル - ΔE C-Hのバランス +HISTORY_MSG_868;ローカル - SD - C-Hのバランス HISTORY_MSG_869;ローカル - レベルによるノイズ除去 HISTORY_MSG_870;ローカル - ウェーブレット マスク カーブH HISTORY_MSG_871;ローカル - ウェーブレット マスク カーブC @@ -1118,7 +1127,7 @@ HISTORY_MSG_890;ローカル - コントラスト ウェーブレット 階調 HISTORY_MSG_891;ローカル - コントラスト ウェーブレット 階調フィルタ HISTORY_MSG_892;ローカル - 対数符号化 階調の強さ HISTORY_MSG_893;ローカル - 対数符号化 階調の角度 -HISTORY_MSG_894;ローカル - 色と明るさ ΔEのプレビュー +HISTORY_MSG_894;ローカル - SD - ΔEプレビューの色の強さ HISTORY_MSG_897;ローカル - コントラスト ウェーブレット ES 強さ HISTORY_MSG_898;ローカル - コントラスト ウェーブレット ES 半径 HISTORY_MSG_899;ローカル - コントラスト ウェーブレット ES ディテール @@ -1132,7 +1141,7 @@ HISTORY_MSG_906;ローカル - コントラスト ウェーブレット ES 感 HISTORY_MSG_907;ローカル - コントラスト ウェーブレット ES 増幅 HISTORY_MSG_908;ローカル - コントラスト ウェーブレット ES 隣接 HISTORY_MSG_909;ローカル - コントラスト ウェーブレット ES 表示 -HISTORY_MSG_910;ローカル - ウェーブレット エッジ検出の効果 +HISTORY_MSG_910;ローカル - SC - ウェーブレット エッジ検出の効果 HISTORY_MSG_911;ローカル - ぼかし 色度 輝度 HISTORY_MSG_912;ローカル - ガイド付きフィルターの強さのぼかし HISTORY_MSG_913;ローカル - コントラスト ウェーブレット シグマ DR @@ -1144,10 +1153,10 @@ HISTORY_MSG_918;ローカル - ウェーブレットの残差画像 ハイライ HISTORY_MSG_919;ローカル - ウェーブレットの残差画像 ハイライトのしきい値 HISTORY_MSG_920;ローカル - ウェーブレット シグマ LC HISTORY_MSG_921;ローカル - ウェーブレット 階調のシグマ LC2 -HISTORY_MSG_922;ローカル - 白黒での変更 +HISTORY_MSG_922;ローカル - SC - 白黒での変更 HISTORY_MSG_923;ローカル - 機能の複雑度モード HISTORY_MSG_924;--未使用の文字列-- -HISTORY_MSG_925;ローカル - カラー機能のスコープ +HISTORY_MSG_925;ローカル - スコープ(カラー機能) HISTORY_MSG_926;ローカル - マスクのタイプを表示 HISTORY_MSG_927;ローカル - シャドウマスク HISTORY_MSG_928;ローカル - 共通のカラーマスク @@ -1206,7 +1215,7 @@ HISTORY_MSG_981;ローカル - 対数符号化 強さ HISTORY_MSG_982;ローカル - イコライザ 色相 HISTORY_MSG_983;ローカル - ノイズ除去 しきい値マスク 明るい HISTORY_MSG_984;ローカル - ノイズ除去 しきい値マスク 暗い -HISTORY_MSG_985;ローカル - ノイズ除去 ラプラス変換 +HISTORY_MSG_985;ローカル - ノイズ除去 ラプラス作用素 HISTORY_MSG_986;ローカル - ノイズ除去 強化 HISTORY_MSG_987;ローカル - 階調フィルタ しきい値マスク HISTORY_MSG_988;ローカル - 階調フィルタ 暗い領域のしきい値マスク @@ -1255,13 +1264,13 @@ 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_1034;ローカル - 非局所平均 - 強さ +HISTORY_MSG_1035;ローカル - 非局所平均 - ディテール +HISTORY_MSG_1036;ローカル - 非局所平均 - パッチ +HISTORY_MSG_1037;ローカル - 非局所平均 - 半径 +HISTORY_MSG_1038;ローカル - 非局所平均 - ガンマ HISTORY_MSG_1039;ローカル - 質感 - ガンマ -HISTORY_MSG_1040;ローカル - スポット - ソフトな半径 +HISTORY_MSG_1040;ローカル - SC - ソフトな半径 HISTORY_MSG_1041;ローカル - スポット - マンセル補正 HISTORY_MSG_1042;ローカル - 対数符号化 - しきい値 HISTORY_MSG_1043;ローカル - Exp - 標準化 @@ -1352,8 +1361,8 @@ 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_1131;ローカル - マスク - ノイズ除去  +HISTORY_MSG_1132;ローカル - Cie ウェーブレット シグマ Jz HISTORY_MSG_1133;ローカル - Cie ウェーブレット レベル Jz HISTORY_MSG_1134;ローカル - Cie ウェーブレット ローカルコントラスト Jz HISTORY_MSG_1135;ローカル - Cie ウェーブレット 明瞭 Jz @@ -1401,40 +1410,112 @@ HISTORY_MSG_DEHAZE_ENABLED;霞除去 HISTORY_MSG_DEHAZE_SATURATION;霞除去 - 彩度 HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;霞除去 - 深度マップの表示 HISTORY_MSG_DEHAZE_STRENGTH;霞除去 - 強さ +HISTORY_MSG_DIRPYRDENOISE_GAIN;NR - 明るさに応じた補整 HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;デュアルデモザイク - 自動しきい値 HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - コントラストのしきい値 -HISTORY_MSG_EDGEFFECT;エッジの効果調整 +HISTORY_MSG_EDGEFFECT;エッジの減衰応答 +HISTORY_MSG_FF_FROMMETADATA;フラットフィールド - メタデータから 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_GAMUTMUNSEL;色域-マンセル +HISTORY_MSG_HISTMATCHING;トーンカーブの自動整合 HISTORY_MSG_HLBL;Color 色の波及 - ぼかし -HISTORY_MSG_ICL_LABGRIDCIEXY;Cie xy +HISTORY_MSG_HLTH;インペイント オポーズド - ゲインのしきい値 +HISTORY_MSG_ICL_LABGRIDCIEXY;Cie表色系 xy HISTORY_MSG_ICM_AINTENT;アブストラクトプロファイルの意図 -HISTORY_MSG_ICM_BLUX;原色 ブルー X +HISTORY_MSG_ICM_BLUX;原色 ブルー X HISTORY_MSG_ICM_BLUY;原色 ブルー Y +HISTORY_MSG_ICM_CAT;カラーマトリクスの適応 HISTORY_MSG_ICM_FBW;白黒 +HISTORY_MSG_ICM_GAMUT;色域の抑制 HISTORY_MSG_ICM_GREX;原色 グリーン X HISTORY_MSG_ICM_GREY;原色 グリーン Y -HISTORY_MSG_ICM_OUTPUT_PRIMARIES;出力 - プライマリ +HISTORY_MSG_ICM_MIDTCIE;中間トーン +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_REFI;色の微調整 +HISTORY_MSG_ICM_SHIFTX;色の微調整 - シフト x +HISTORY_MSG_ICM_SHIFTY;色の微調整 - シフト y +HISTORY_MSG_ICM_SMOOTHCIE;ハイライト調整の減衰 +HISTORY_MSG_ICM_TRCEXP;アブストラクトプロファイル +HISTORY_MSG_ICM_WORKING_GAMMA;TRC - ガンマ HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;輝度 方式 HISTORY_MSG_ICM_WORKING_PRIM_METHOD;原色 方式 -HISTORY_MSG_ICM_WORKING_SLOPE;作業色空間 - 勾配 +HISTORY_MSG_ICM_WORKING_SLOPE;TRC - スロープ HISTORY_MSG_ICM_WORKING_TRC_METHOD;TRCの方式 -HISTORY_MSG_ILLUM;輝度 +HISTORY_MSG_ILLUM;CAL - SC - 輝度 HISTORY_MSG_LOCALCONTRAST_AMOUNT;ローカルコントラスト - 量 HISTORY_MSG_LOCALCONTRAST_DARKNESS;ローカルコントラスト - 暗い部分 HISTORY_MSG_LOCALCONTRAST_ENABLED;ローカルコントラスト HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;ローカルコントラスト - 明るい部分 HISTORY_MSG_LOCALCONTRAST_RADIUS;ローカルコントラスト - 半径 +HISTORY_MSG_LOCALLAB_TE_PIVOT;ローカル - イコライザ ピボット +HISTORY_MSG_LOCAL_CIEMASK_BLURCONT;ローカル編集 Cieのマスク ぼかし コントラスト +HISTORY_MSG_LOCAL_CIEMASK_BLURFFT;ローカル編集 Cieのマスク ぼかし 高速フーリエ変換 +HISTORY_MSG_LOCAL_CIEMASK_BLURRAD;ローカル編集 Cieのマスク ぼかし 半径 +HISTORY_MSG_LOCAL_CIEMASK_CHH; ローカル編集 Cieのマスク 色相カーブ +HISTORY_MSG_LOCAL_CIEMASK_HIGH;ローカル編集 Cieのマスク ハイライト +HISTORY_MSG_LOCAL_CIEMASK_SHAD;ローカル編集 Cieのマスク シャドウ +HISTORY_MSG_LOCAL_CIEMASK_STRU;ローカル編集 Cieのマスク 構造 +HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;機能としてのCieの構造マスク +HISTORY_MSG_LOCAL_CIEMASK_WLC;ローカル編集 Cieのマスク ウェーブレット Lc +HISTORY_MSG_LOCAL_CIEMASK_WLEV;ローカル編集 Cieのマスク ウェーブレットのレベル +HISTORY_MSG_LOCAL_CIE_ANGGRAD;ローカル編集 CIECAM - 諧調フィルタの角度 +HISTORY_MSG_LOCAL_CIE_BLACKS;ローカル編集 CIECAM - ブラックの分布 +HISTORY_MSG_LOCAL_CIE_BLUXL;ローカル編集 CIECAM - ブルー X +HISTORY_MSG_LOCAL_CIE_BLUYL;ローカル編集 CIECAM - ブルー Y +HISTORY_MSG_LOCAL_CIE_BRICOMP;ローカル編集 CIECAM 明るさの圧縮 +HISTORY_MSG_LOCAL_CIE_BRICOMPTH;ローカル編集 CIECAM 明るさの圧縮のしきい値 +HISTORY_MSG_LOCAL_CIE_BWCIE;ローカル編集 CIECAM - 白黒 +HISTORY_MSG_LOCAL_CIE_CAT;マトリクスの適合 +HISTORY_MSG_LOCAL_CIE_DETAILJZ;ローカル編集 JzCzHz ローカルコントラスト +HISTORY_MSG_LOCAL_CIE_ENAMASKALL;ローカル編集 CIECAM 全てのマスクツール +HISTORY_MSG_LOCAL_CIE_EXPPRECAM;ローカル編集 CIECAM 前処理 +HISTORY_MSG_LOCAL_CIE_GAM;ローカル編集 CIECAM ガンマ +HISTORY_MSG_LOCAL_CIE_GAMUTCIE;ローカル編集 CIECAM 色域 +HISTORY_MSG_LOCAL_CIE_GREXL;ローカル編集 CIECAM - グリーン X +HISTORY_MSG_LOCAL_CIE_GREYL;ローカル編集 CIECAM - グリーン Y +HISTORY_MSG_LOCAL_CIE_ILL;ローカル編集 CIECAM TRC 輝度 +HISTORY_MSG_LOCAL_CIE_LOGCIEQ;ローカル編集 CIECAM 対数符号化 Q +HISTORY_MSG_LOCAL_CIE_MIDT;ローカル編集 CIECAM 中間トーン +HISTORY_MSG_LOCAL_CIE_NORM;ローカル編集 CIECAM 輝度の正常化 +HISTORY_MSG_LOCAL_CIE_PRIM;ローカル編集 CIECAM TRC 原色 +HISTORY_MSG_LOCAL_CIE_REDXL;ローカル編集 CIECAM - レッド X +HISTORY_MSG_LOCAL_CIE_REDYL;ローカル編集 CIECAM - レッド Y +HISTORY_MSG_LOCAL_CIE_REFI;ローカル編集 CIECAM 色の微調整 +HISTORY_MSG_LOCAL_CIE_SATCIE;ローカル編集 CIECAM - 彩度の制御 +HISTORY_MSG_LOCAL_CIE_SHIFTXL;ローカル編集 CIECAM - シフト x +HISTORY_MSG_LOCAL_CIE_SHIFTYL;ローカル編集 CIECAM - シフト y +HISTORY_MSG_LOCAL_CIE_SIG;シグモイド +HISTORY_MSG_LOCAL_CIE_SIGADAP;ローカル編集 CIECAM シグモイドの適応性 +HISTORY_MSG_LOCAL_CIE_SIGMET;ローカル編集 CIECAM - シグモイドの方式 +HISTORY_MSG_LOCAL_CIE_SLOP;ローカル編集 CIECAM - スロープ +HISTORY_MSG_LOCAL_CIE_SLOPESMO;ローカル編集 CIECAM - グレーポイントのバランス +HISTORY_MSG_LOCAL_CIE_SLOPESMOB;ローカル編集 CIECAM - ブルーのバランス +HISTORY_MSG_LOCAL_CIE_SLOPESMOG;ローカル編集 CIECAM - グリーンのバランス +HISTORY_MSG_LOCAL_CIE_SLOPESMOR;ローカル編集 CIECAM - レッドのバランス +HISTORY_MSG_LOCAL_CIE_SMOOTH;ローカル編集 CIECAM - 場面条件のYbのスケール +HISTORY_MSG_LOCAL_CIE_SMOOTHMET;ローカル編集 CIECAM - 減衰の基準 +HISTORY_MSG_LOCAL_CIE_SMOOTHYB;ローカル編集 CIECAM - 観視条件のYbの尺度 +HISTORY_MSG_LOCAL_CIE_SMOOTH_LUM;ローカル編集 CIECAM - レベル - 明るさのモード +HISTORY_MSG_LOCAL_CIE_STRGRAD;ローカル編集 CIECAM - 諧調の強さ L +HISTORY_MSG_LOCAL_CIE_STRLOG;ローカル編集 CIECAM - 対数符号化の強さ +HISTORY_MSG_LOCAL_CIE_TRC;ローカル編集 CIECAM - TRC +HISTORY_MSG_LOCAL_CIE_WHITES;ローカル編集 CIECAM - ホワイトの分布 +HISTORY_MSG_LOCAL_DEHAZE_BLACK;ローカル - 霞除去 - ブラック +HISTORY_MSG_LOCAL_GAMUTMUNSEL;ローカル - SC - 色ずれの回避 +HISTORY_MSG_LOCAL_LOG_BLACKS;ローカル編集 対数符号化 - ブラックの分布 +HISTORY_MSG_LOCAL_LOG_COMPR;ローカル編集 対数符号化 - 明るさの圧縮 +HISTORY_MSG_LOCAL_LOG_SAT;ローカル編集 対数符号化 - 彩度の制御 +HISTORY_MSG_LOCAL_LOG_WHITES;ローカル編集 対数符号化 - ホワイトの分布 +HISTORY_MSG_LOCAL_TMO_SATUR;ローカル編集 露光 Fattal 彩度 HISTORY_MSG_METADATA_MODE;メタデータ コピーモード HISTORY_MSG_MICROCONTRAST_CONTRAST;マイクロコントラスト - コントラストのしきい値 HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - しきい値の自動設定 @@ -1480,10 +1561,15 @@ HISTORY_MSG_SPOT_ENTRY;スポット除去 - ポイント変更 HISTORY_MSG_TEMPOUT;CAM02/16 自動色温度設定 HISTORY_MSG_THRESWAV;バランスのしきい値 HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - アンカー +HISTORY_MSG_TONE_EQUALIZER_BANDS;トーンイコライザ - バンド +HISTORY_MSG_TONE_EQUALIZER_ENABLED;トーンイコライザ +HISTORY_MSG_TONE_EQUALIZER_PIVOT;トーンイコライザ - ピボット +HISTORY_MSG_TONE_EQUALIZER_REGULARIZATION;トーンイコライザ - 円滑 +HISTORY_MSG_TONE_EQUALIZER_SHOW_COLOR_MAP;トーンイコライザ - トーンの配分 HISTORY_MSG_TRANS_METHOD;ジオメトリ - 方式 HISTORY_MSG_WAVBALCHROM;イコライザ 色度 HISTORY_MSG_WAVBALLUM;イコライザ 輝度 -HISTORY_MSG_WAVBL;レベルのぼかし +HISTORY_MSG_WAVBL;詳細レベルのぼかし HISTORY_MSG_WAVCHR;レベルのぼかし - 色度のぼかし HISTORY_MSG_WAVCHROMCO;大きいディテールの色度 HISTORY_MSG_WAVCHROMFI;小さいディテールの色度 @@ -1519,6 +1605,23 @@ HISTORY_MSG_WAVSTREND;ソフトの強さ HISTORY_MSG_WAVTHRDEN;ローカルコントラストのしきい値 HISTORY_MSG_WAVTHREND;ローカルコントラストのしきい値 HISTORY_MSG_WAVUSHAMET;明瞭の方式 +HISTORY_MSG_WBALANCE_OBSERVER10;標準観測者10° +HISTORY_MSG_WBITC_CUSTOM;Itcwb カスタム +HISTORY_MSG_WBITC_DELTA;Itcwb 色偏差のΔ +HISTORY_MSG_WBITC_FGREEN;Itcwb 色偏差 - スチューデント検定 +HISTORY_MSG_WBITC_FORCE;Itcwb 強制 +HISTORY_MSG_WBITC_GREEN;色偏差の微調整 +HISTORY_MSG_WBITC_MINSIZE;最小のパッチ +HISTORY_MSG_WBITC_NOPURPLE;Itcwb 非パープル +HISTORY_MSG_WBITC_OBS;2段階アルゴリズムを外す +HISTORY_MSG_WBITC_PONDER;Itcwb バランス +HISTORY_MSG_WBITC_PRECIS;Itcwb 精度 +HISTORY_MSG_WBITC_PRIM;原色 +HISTORY_MSG_WBITC_RGREEN;Itcwb 色偏差の範囲 +HISTORY_MSG_WBITC_SAMPLING;ローサンプリング +HISTORY_MSG_WBITC_SIZE;Itcwb サイズ +HISTORY_MSG_WBITC_SORTED;Itcwb バランス +HISTORY_MSG_WBITC_THRES;Itcwb しきい値 HISTORY_NEWSNAPSHOT;追加 HISTORY_NEWSNAPSHOT_TOOLTIP;ショートカット: Alt-s HISTORY_SNAPSHOT;スナップショット @@ -1564,8 +1667,8 @@ ICCPROFCREATOR_PRIM_WIDEG;Widegamut ICCPROFCREATOR_PROF_V2;ICC v2 ICCPROFCREATOR_PROF_V4;ICC v4 ICCPROFCREATOR_SAVEDIALOG_TITLE;...でICCプロファイルを保存 -ICCPROFCREATOR_SLOPE;勾配 -ICCPROFCREATOR_TRC_PRESET;トーンリプレーススカーブ +ICCPROFCREATOR_SLOPE;スロープ +ICCPROFCREATOR_TRC_PRESET;トーンリプロダクションカーブ INSPECTOR_WINDOW_TITLE;カメラ出し画像 IPTCPANEL_CATEGORY;カテゴリ IPTCPANEL_CATEGORYHINT;画像の意図 @@ -1661,7 +1764,7 @@ MAIN_TAB_FAVORITES_TOOLTIP;ショートカット: Alt-u MAIN_TAB_FILTER;絞り込み MAIN_TAB_INSPECT;カメラ出しJPEG MAIN_TAB_IPTC;IPTC -MAIN_TAB_LOCALLAB;ローカル編集 +MAIN_TAB_LOCALLAB;選択的な編集 MAIN_TAB_LOCALLAB_TOOLTIP;ショートカット Alt-o MAIN_TAB_METADATA;メタデータ MAIN_TAB_METADATA_TOOLTIP;ショートカット: Alt-m @@ -1682,7 +1785,7 @@ MAIN_TOOLTIP_PREVIEWFOCUSMASK;フォーカス・マスク表示\nショ MAIN_TOOLTIP_PREVIEWG;グリーン チャンネル表示\nショートカット: g MAIN_TOOLTIP_PREVIEWL;輝度表示\nショートカット: v\n\n0.299*R + 0.587*G + 0.114*B MAIN_TOOLTIP_PREVIEWR;レッド チャンネル表示\nショートカット: r -MAIN_TOOLTIP_PREVIEWSHARPMASK;プレビューで見るシャープニング機能のコントラストマスク\nショートカット: p\n\nこの機能が使えるのはシャープニング機能が有効で、画像が100%以上に拡大されている場合だけ +MAIN_TOOLTIP_PREVIEWSHARPMASK;シャープニングのコントラストマスク\nショートカット: p\n\nこの機能が使えるのはシャープニング機能が有効で、画像が100%以上に拡大されている場合だけです MAIN_TOOLTIP_QINFO;画像の情報\nショートカット: i MAIN_TOOLTIP_SHOWHIDELP1;表示/非表示 左パネル\nショートカット: l MAIN_TOOLTIP_SHOWHIDERP1;表示/非表示 右パネル\nショートカット: Alt-l @@ -1738,6 +1841,7 @@ PARTIALPASTE_FLATFIELDBLURRADIUS;フラットフィールド ぼかし半径 PARTIALPASTE_FLATFIELDBLURTYPE;フラットフィールド ぼかしタイプ PARTIALPASTE_FLATFIELDCLIPCONTROL;フラットフィールド クリップコントロール PARTIALPASTE_FLATFIELDFILE;フラットフィールド ファイル +PARTIALPASTE_FLATFIELDFROMMETADATA;メタデータからフラットフィールドを選択 PARTIALPASTE_GRADIENT;減光フィルター PARTIALPASTE_HSVEQUALIZER;HSV イコライザ PARTIALPASTE_ICMSETTINGS;ICM 設定 @@ -1747,8 +1851,8 @@ PARTIALPASTE_LABCURVE;L*a*b* 調整 PARTIALPASTE_LENSGROUP;レンズ関係の設定 PARTIALPASTE_LENSPROFILE;プロファイルされたレンズ補正 PARTIALPASTE_LOCALCONTRAST;ローカルコントラスト -PARTIALPASTE_LOCALLAB;ローカル編集 -PARTIALPASTE_LOCALLABGROUP;ローカル編集の設定 +PARTIALPASTE_LOCALLAB;選択的な編集 +PARTIALPASTE_LOCALLABGROUP;選択的な編集の設定 PARTIALPASTE_METADATA;メタデータモード PARTIALPASTE_METAGROUP;メタデータ PARTIALPASTE_PCVIGNETTE;ビネットフィルター @@ -1785,6 +1889,7 @@ PARTIALPASTE_SHARPENMICRO;マイクロコントラスト PARTIALPASTE_SOFTLIGHT;ソフトライト PARTIALPASTE_SPOT;スポット除去 PARTIALPASTE_TM_FATTAL;ダイナミックレンジ圧縮 +PARTIALPASTE_TONE_EQUALIZER;トーンイコライザ PARTIALPASTE_VIBRANCE;自然な彩度 PARTIALPASTE_VIGNETTING;周辺光量補正 PARTIALPASTE_WHITEBALANCE;ホワイトバランス @@ -1794,7 +1899,6 @@ PREFERENCES_APPEARANCE_COLORPICKERFONT;カラーピッカーのフォント PREFERENCES_APPEARANCE_CROPMASKCOLOR;切り抜きのマスクカラー PREFERENCES_APPEARANCE_MAINFONT;メインフォント PREFERENCES_APPEARANCE_NAVGUIDECOLOR;ナビゲーターのガイドカラー -PREFERENCES_APPEARANCE_PSEUDOHIDPI;擬似HiDPIモード PREFERENCES_APPEARANCE_THEME;テーマ PREFERENCES_APPLNEXTSTARTUP;要再起動 PREFERENCES_AUTOMONPROFILE;OSのメインモニター・プロファイルを使用 @@ -1802,9 +1906,12 @@ PREFERENCES_AUTOSAVE_TP_OPEN;プログラム終了時の機能パネルの開閉 PREFERENCES_BATCH_PROCESSING;バッチ処理 PREFERENCES_BEHADDALL;すべて '追加' PREFERENCES_BEHADDALLHINT;すべてのパラメータを 追加モードにします\nバッチツールパネルで設定される調整値が、各画像の既定値に加算されます -PREFERENCES_BEHAVIOR;ビヘイビア +PREFERENCES_BEHAVIOR;作用 PREFERENCES_BEHSETALL;すべて '設定' PREFERENCES_BEHSETALLHINT;すべてのパラメータを 設定モードにします\nバッチツールパネルで設定される調整値が、各画像の既定値に取って代わり同一になります +PREFERENCES_BROWSERECURSIVEDEPTH;サブフォルダ階層数のブラウズ +PREFERENCES_BROWSERECURSIVEFOLLOWLINKS;サブフォルダをブラウズする際はシンボリックリンクに従う +PREFERENCES_BROWSERECURSIVEMAXDIRS;サブフォルダの最大数 PREFERENCES_CACHECLEAR;クリア PREFERENCES_CACHECLEAR_ALL;cacheに入れられたファイルを全てクリア: PREFERENCES_CACHECLEAR_ALLBUTPROFILES;cacheに入れた処理プロファイル以外をクリア: @@ -1813,6 +1920,7 @@ PREFERENCES_CACHECLEAR_SAFETY;casheに入れたファイルだけをクリア。 PREFERENCES_CACHEMAXENTRIES;cacheに入れるファイルの最大数 PREFERENCES_CACHEOPTS;cache オプション PREFERENCES_CACHETHUMBHEIGHT;サムネイル縦の最大値 +PREFERENCES_CAMERAPROFILESDIR;カメラプロファイルのディレクトリ PREFERENCES_CHUNKSIZES;スレッドごとのタイル PREFERENCES_CHUNKSIZE_RAW_AMAZE;AMaZE デモザイク PREFERENCES_CHUNKSIZE_RAW_CA;Raw 色収差補正 @@ -1868,6 +1976,11 @@ PREFERENCES_EXTEDITOR_DIR_CUSTOM;カスタム PREFERENCES_EXTEDITOR_DIR_TEMP;OS 一時ディレクトリ PREFERENCES_EXTEDITOR_FLOAT32;32-ビット 浮動小数点TIFF出力 PREFERENCES_EXTERNALEDITOR;外部エディタ +PREFERENCES_EXTERNALEDITOR_CHANGE;アプリケーションの変更 +PREFERENCES_EXTERNALEDITOR_CHANGE_FILE;実行ファイルの変更 +PREFERENCES_EXTERNALEDITOR_COLUMN_COMMAND;コマンド +PREFERENCES_EXTERNALEDITOR_COLUMN_NAME;名前 +PREFERENCES_EXTERNALEDITOR_COLUMN_NATIVE_COMMAND;ネイティブコマンド PREFERENCES_FBROWSEROPTS;ファイルブラウザ/サムネイルのオプション PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;ファイルブラウザのツールバーを圧縮 PREFERENCES_FLATFIELDFOUND;検出 @@ -1895,13 +2008,23 @@ PREFERENCES_INTENT_SATURATION;彩度 PREFERENCES_INTERNALTHUMBIFUNTOUCHED;rawファイルが未編集の場合 JPEGのサムネイルを表示 PREFERENCES_LANG;言語 PREFERENCES_LANGAUTODETECT;OSの言語設定を使用 +PREFERENCES_LENSFUNDBDIR;Lensfunのデータベースディレクトリ +PREFERENCES_LENSFUNDBDIR_TOOLTIP;このディレクトリはLensfunのデータを含んでいます。デフォルトのディレクトリを使うために空のままにしておきます。 +PREFERENCES_LENSPROFILESDIR;レンズプロファイルのディレクトリ +PREFERENCES_LENSPROFILESDIR_TOOLTIP;このディレクトリはAdobeのレンズコレクション(LCP)のデータを含んでいます。Directory containing Adobe Lens Correction Profiles (LCPs) PREFERENCES_MAXRECENTFOLDERS;直近のフォルダーの最大数 +PREFERENCES_MAX_ZOOM_TITLE;最大拡大率 PREFERENCES_MENUGROUPEXTPROGS;"..で開く"のグループ PREFERENCES_MENUGROUPFILEOPERATIONS;"ファイル操作"のグループ PREFERENCES_MENUGROUPLABEL;"カラーラベル"のグループ PREFERENCES_MENUGROUPPROFILEOPERATIONS;"処理プロファイル操作"のグループ PREFERENCES_MENUGROUPRANK;"ランキング"のグループ -PREFERENCES_MENUOPTIONS;メニューオプションの状況 +PREFERENCES_MENUOPTIONS;コンテキストメニューのオプション +PREFERENCES_METADATA;メタデータ +PREFERENCES_METADATA_SYNC;XMPサイドカーと同期しているメタデータ +PREFERENCES_METADATA_SYNC_NONE;オフ +PREFERENCES_METADATA_SYNC_READ;読み込みだけ +PREFERENCES_METADATA_SYNC_READWRITE;双方向 PREFERENCES_MONINTENT;デフォルトのレンダリングインテント PREFERENCES_MONITOR;モニター PREFERENCES_MONPROFILE;デフォルトのモニタープロファイル @@ -1961,10 +2084,12 @@ PREFERENCES_SND_HELP;ファイルパスを入力 または空欄(無音).\nWindo PREFERENCES_SND_LNGEDITPROCDONE;編集処理 終了 PREFERENCES_SND_QUEUEDONE;キュー処理 終了 PREFERENCES_SND_THRESHOLDSECS;数秒後 +PREFERENCES_SPOTLOC;ローカル編集のスポットの方式を決める PREFERENCES_STARTUPIMDIR;起動時の画像・ディレクトリ PREFERENCES_TAB_BROWSER;ファイルブラウザ PREFERENCES_TAB_COLORMGR;カラーマネジメント PREFERENCES_TAB_DYNAMICPROFILE;ダイナミックプロファイルの規定 +PREFERENCES_TAB_FAVORITES;お気に入りの機能 PREFERENCES_TAB_GENERAL;一般 PREFERENCES_TAB_IMPROC;画像処理 PREFERENCES_TAB_PERFORMANCE;パフォーマンス @@ -1973,10 +2098,32 @@ 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_THUMBNAIL_RANK_COLOR_MODE;サムネイルのランクと色をXMPサイドカーから読み込む、或いはサイドカーに保存する +PREFERENCES_TOOLPANEL_AVAILABLETOOLS;使用可能な機能 +PREFERENCES_TOOLPANEL_CLONE_FAVORITES;お気に入りの機能を元の場所にも保持する +PREFERENCES_TOOLPANEL_CLONE_FAVORITES_TOOLTIP;これを設定すると、お気に入りの機能がお気に入りのタブと独自のタブの両方に表示されます。\n\n注意: このオプションを有効にするとタブを切り替える際に若干の遅れが生じる場合があります。 +PREFERENCES_TOOLPANEL_FAVORITE;お気に入り +PREFERENCES_TOOLPANEL_FAVORITESPANEL;お気に入りのパネル +PREFERENCES_TOOLPANEL_TOOL;機能 +PREFERENCES_TP_LABEL;機能パネル: PREFERENCES_TP_VSCROLLBAR;ツールパネルの垂直スクロールバーを隠す PREFERENCES_USEBUNDLEDPROFILES;付属のプロファイルを使用 +PREFERENCES_WBA;ホワイトバランス +PREFERENCES_WBACORR;自動ホワイトバランス - 色温度の相関関係 +PREFERENCES_WBACORR_TOOLTIP;画像(rawファイルの形式、測色など)に応じて、これらの設定で “色温度の相関関係”アルゴリズムを適合させ、総合的に見て最良の結果を求めます。そのための各パラメータ調整に決められた規則は特にありません。\n\n設定パラメータは3種類あります:\n*インターフェイスでユーザーが設定するもの。\n*各pp3ファイルから読み込むもの:Itcwb_minsize=20, Itcwb_delta=4 Itcwb_rgreen=1 Itcwb_nopurple=false(詳しくはRawPediaを参照)\n*オプションファイルで設定するもの(RawPediaを参照)\n結果に対する補正で、“自動ホワイトバランス バイアス”や“色偏差の微調整”を使うことが出来ます。これらを調整すると色温度、色偏差、相関関係が新たに計算されます。\n\n‘相関関係係数’、‘色度のパッチ’、‘ΔE’の3つの指標は、あくまで参考情報で変更することは出来ません。どれか一つの指標が良いからと言って、結果が良くなるわけではないからです。 +PREFERENCES_WBAENA;自動ホワイトバランスの色温度の相関関係設定を表示する +PREFERENCES_WBAENACUSTOM;カスタムの色温度と色偏差を使う +PREFERENCES_WBAFORC;追加的アルゴリズムの強制使用 +PREFERENCES_WBAGREENDELTA;色偏差の繰り返し計算における色温度のΔ (追加的アルゴリズムを有効にした場合) +PREFERENCES_WBANOPURP;パープルを使わない +PREFERENCES_WBAPATCH;画像で使われる色数の最大値 +PREFERENCES_WBAPRECIS;精度の高いアルゴリズム - スケールを使う +PREFERENCES_WBASIZEREF;ヒストグラムカラーの大きさと比較した基準色の大きさ +PREFERENCES_WBASORT;ヒストグラムの代わりに色度の順で並べ替える PREFERENCES_WORKFLOW;レイアウト +PREFERENCES_XMP_SIDECAR_MODE;XMP サイドカー形式 +PREFERENCES_XMP_SIDECAR_MODE_EXT;darktableに似た形式(FILENAME.ext.xmp for FILENAME.ext) +PREFERENCES_XMP_SIDECAR_MODE_STD;標準 (FILENAME.xmp for FILENAME.ext) PREFERENCES_ZOOMONSCROLL;スクロールを使って画像の拡大・縮小 PROFILEPANEL_COPYPPASTE;コピーするパラメータ PROFILEPANEL_GLOBALPROFILES;付属のプロファイル @@ -2005,6 +2152,7 @@ PROGRESSBAR_LINEDENOISE;ラインノイズフィルタ。。。 PROGRESSBAR_LOADING;画像読み込み中... PROGRESSBAR_LOADINGTHUMBS;サムネイルの読み込み... PROGRESSBAR_LOADJPEG;JPEGファイル読み込み中... +PROGRESSBAR_LOADJXL;JXLファイル読み込み中... PROGRESSBAR_LOADPNG;PNGファイル読み込み中... PROGRESSBAR_LOADTIFF;TIFFファイル読み込み中... PROGRESSBAR_NOIMAGES;画像が見つかりません @@ -2025,21 +2173,43 @@ QINFO_PIXELSHIFT;ピクセルシフト / %2 フレーム QUEUE_AUTOSTART;オートスタート QUEUE_AUTOSTART_TOOLTIP;新しいrawファイルが送られて来たら自動的に現像処理を開始します QUEUE_DESTFILENAME;パスとファイル名 +QUEUE_DESTPREVIEW_TITLE;移動先のパスを表示するためにサムネイルをここで選択 +QUEUE_DESTPREVIEW_TOOLTIP;最初に選択した画像の移動先のパスがここに表示されます QUEUE_FORMAT_TITLE;ファイル形式 QUEUE_LOCATION_FOLDER;フォルダに保存 QUEUE_LOCATION_TEMPLATE;テンプレートを使う -QUEUE_LOCATION_TEMPLATE_TOOLTIP;次の書式文字を使用することができます:\n%f, %d1, %d2, ..., %p1, %p2, ...%r\n\nこれらの書式文字は画像パス名のそれぞれ別々の部分、画像の属性を参照します\n\n例えば、次の画像を処理中の場合は:\n\n/home/tom/photos/2010-10-31/dsc0042.nef\n書式文字の意味するものは:\n%d4 = home\n%d3 = tom\n%d2 = photos\n%d1 = 2010-10-31\n%f = dsc0042\n%p1 = /home/tom/photos/2010-10-31/\n%p2 = /home/tom/photos/\n%p3 = /home/tom/\n%p4 = /home/\n\n%rは写真のランクに置き換えられます。評価なしは%rは'0 'に置換されます。画像がごみ箱にある場合、%rは'X'に置換されます\n\n元画像と同じ場所に出力したい場合はこのように書きます:\n%p1/%f\n\n処理画像のディレクトリ下 "converted" という名前のディレクトリに出力画像を保存したい場合このように書きます:\n%p1/converted/%f\n\n"/home/tom/photos/converted/2010-10-31" という名前のディレクトリに出力画像を保存したい場合はこのように書きます:\n%p2/converted/%d1/%f +QUEUE_LOCATION_TEMPLATE_HELP_BUTTON_TOOLTIP;ロケーションテンプレートの作成に関するヘルプパネルを表示/非表示します +QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_BODY;出力画像を元画像と並べて保存したい場合は、次のように書きます: \n%p1/%f\n\n出力画像を元画像のフォルダの中にある'converted'というファルダに保存したい場合は、次のように書きます: \n%p1/converted/%f\n\n出力画像を\n'/home/tom/photos/converted/2010-10-31',に保存したい場合は次のように書きます: \n%p-3/converted/%P-4/%f +QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_TITLE;共通例 +QUEUE_LOCATION_TEMPLATE_HELP_INTRO;出力のテンプレートフィールドは移動先のフォルダやファイルネームを柔軟にカスタマイズすることが出来ます。%で始まる特定の指定子を含めると、各ファイルが保存される際にプログラムにより置き換えられます。\n\n以下のセクションで指定子の各種類を説明します +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_1;このパス名を例として使うと: +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_2;書式文字列の意味は: +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_LINUX;Linuxの場合は、/home/tom/photos/2010-10-31/photo1.raw +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_WINDOWS;Windowsの場合はD:\tom\photos\2010-10-31\photo1.raw +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO;%dN%d-N%pN%p-N%PN 及び %P-N (N は1から9) の指定子は画像ファイルのディレクトリパスの要素により置き換えられます\n書式指定子は次のように働きます:\n %dN はパスの最後からN番目のディレクトリ\n %d-Nはパスの初めからN番目のディレクトリ\n %pN はパスの最後からN番目までの全てのディレクトリ\n %p-N はパスの最初のN個のディレクトリ\n %PN はパスの最後のN個のディレクトリ\n %P-N はパスのN番目のディレクトから最後のディレクトリまで\n %f はベースネーム(拡張子なし) +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO_WINDOWS;Windowsのパスは、%d-1がドライブレターとコロン、%d-2がドライブのベースディレクトリとなります +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_TITLE;ディレクトリと部分的パス +QUEUE_LOCATION_TEMPLATE_HELP_RANK_BODY;%r は写真のランクで置き換えられます。写真にランクが無い場合には'0'が使われます。写真がゴミ箱にある場合は、'x'が使われます。 +QUEUE_LOCATION_TEMPLATE_HELP_RANK_TITLE;ランク +QUEUE_LOCATION_TEMPLATE_HELP_RESULT_MISMATCH;ERROR: 2番目の結果は異なります: +QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_BODY;%s1から%s9 はバッチ処理が始まった時点でのキューにおける画像の当初の位置で置き換えられます。数値はパディングを指定します、例えば%s3は'001'となります。 +QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_TITLE;キューにおける位置と順番 +QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_BODY;テンプレートでは3つの異なる日付/時間の値が使えます:\n %tE"%Y-%m-%d" は書き出しが行われた日時 \n %tF"%Y-%m-%d"はファイルが最後に保存された日時\n %tP"%Y-%m-%d" は写真が撮影された日時\n引用符が付けられた文字列は日付或いは時間の書式を定義します。%tF"%Y-%m-%d"という書式文字列はその1例です。文字列はg_date_time_format で指定された全ての文字列を使うことが出来ます。https://docs.gtk.org/glib/method.DateTime.format.html +QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_TITLE;日付と時間 +QUEUE_LOCATION_TEMPLATE_HELP_TITLE;出力テンプレートの作成 +QUEUE_LOCATION_TEMPLATE_TOOLTIP;その元画像のある場所、その画像のランク、その画像がゴミ箱に入っているかどうか、或いは、その画像がキューのどこにあるかに応じて、出力の場所を明記します。 \n\n%dN, %d-N, %pN, %p-N, %PN 及び %P-N (N = 1..9) は画像ファイルのディレクトリパスのエレメントによって置き換えられます(ファイルネームは含みません):\n%dN =パスの最後からN番目のディレクトリ\n%d-N =パスの最初からN番目のディレクトリ\n%pN =パスの最後からN番目までのすべてのディレクトリ\n%p-N =パスの中の最初のN個のディレクトリ\n%PN = パスの中の最後のN個のディレクトリ\n%P-N =パスの中のN番目のディレクトリ最後までのすべてのディレクトリ\n%f = ベースファイル名(拡張子は入れない)\nWindowsのパスでは、%d-1はドライブレターとコロン, %d-2 はそのドライブのベースディレクトリになります。\n\n一例として以下のパスネームを使います:\n/home/tom/photos/2010-10-31/photo1.raw\nフォーマットの文字列の意味は以下の通りです:\n%d4 = %d-1 = home\n%d3 = %d-2 = tom\n%d2 = %d-3 = photos\n%d1 = %d-4 = 2010-10-31\n%p1 = %p-4 = /home/tom/photos/2010-10-31/\n%p2 = %p-3 = /home/tom/photos/\n%p3 = %p-2 = /home/tom/\n%p4 = %p-1 = /home/\n%P1 = %P-4 = 2010-10-31/\n%P2 = %P-3 = photos/2010-10-31/\n%P3 = %P-2 = tom/photos/2010-10-31/\n%P4 = %P-1 = /home/tom/photos/2010-10-31/\n%f = photo1\n\n%rは画像のランクにより置き換えられます。画像にランクが付いていない場合は、0'が使われます。 画像がゴミ箱の中にある場合は'x'が使われます。\n\n%s1から%s9 はキューが始まった時の画像の元々の場所で置き換えられます。数値はパディングを指定します。例えば、%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%p-3/converted/%P-4/%f QUEUE_LOCATION_TITLE;出力の場所 QUEUE_STARTSTOP_TOOLTIP;キューにある画像の現像を始める、或いは中止する\n\nショートカット: Ctrl+s SAMPLEFORMAT_0;データ形式不明 -SAMPLEFORMAT_1;符号なし8ビット -SAMPLEFORMAT_2;符号なし16ビット -SAMPLEFORMAT_4;LogLuv24ビット -SAMPLEFORMAT_8;LogLuv32ビット +SAMPLEFORMAT_1;8ビット符号なし +SAMPLEFORMAT_2;16ビット符号なし +SAMPLEFORMAT_4;24ビットLogLuv +SAMPLEFORMAT_8;32ビットLogLuv SAMPLEFORMAT_16;16ビット浮動小数点 SAMPLEFORMAT_32;24ビット浮動小数点 SAMPLEFORMAT_64;32ビット浮動小数点 SAVEDLG_AUTOSUFFIX;ファイルが存在する場合、自動的に末尾に文字を加える +SAVEDLG_BIGTIFF;BigTIFF (メタデータのサポートなし) SAVEDLG_FILEFORMAT;ファイル形式 SAVEDLG_FILEFORMAT_FLOAT;浮動小数点 SAVEDLG_FORCEFORMATOPTS;強制保存オプション @@ -2059,12 +2229,23 @@ SAVEDLG_WARNFILENAME;ファイルに名前が付けられます SHCSELECTOR_TOOLTIP;この3つのスライダーの位置をリセットするには\nマウスの右ボタンをクリック SOFTPROOF_GAMUTCHECK_TOOLTIP;有効にすると、出力プロファイルの色域から外れた色のピクセルをグレーで表示します SOFTPROOF_TOOLTIP;ソフトプルーフィング\n有効にすると、ICMツールの出力プロファイルを使った疑似的なレンダリングを行います。印刷した場合などの画像の印象を掴むのに大変便利です。 +SORT_ASCENDING;昇順 +SORT_BY_DATE;日付順 +SORT_BY_EXIF;EXIF順 +SORT_BY_LABEL;カラーラベル順 +SORT_BY_NAME;名前順 +SORT_BY_RANK;ランク順 +SORT_DESCENDING;降順 +TC_LOCALLAB_PRIM_SHIFTX;シフト x +TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP;“色の微調整”と併用することで:\n1)低い値を設定すると、画像の彩度が変わります。\n2)高い値は、穏やかなカラートーン調整になります。\n3)但し、CIE xyダイヤグラムから外れないように注意します。 +TC_LOCALLAB_PRIM_SHIFTY;シフト y TC_PRIM_BLUX;Bx TC_PRIM_BLUY;By TC_PRIM_GREX;Gx TC_PRIM_GREY;Gy TC_PRIM_REDX;Rx TC_PRIM_REDY;Ry +TC_PRIM_REFI;色の微調整(ホワイトポイント) THRESHOLDSELECTOR_B;下 THRESHOLDSELECTOR_BL;下-左 THRESHOLDSELECTOR_BR;下-右 @@ -2141,7 +2322,7 @@ TP_CACORRECTION_LABEL;色収差補正 TP_CACORRECTION_RED;レッド TP_CBDL_AFT;白黒適用の後 TP_CBDL_BEF;白黒適用の前 -TP_CBDL_METHOD;処理の順番 +TP_CBDL_METHOD;位置づけられた処理 TP_CBDL_METHOD_TOOLTIP;詳細レベルによるコントラスト調整の処理を白黒処理の前に行うか、後に行うか選びます。前を選んだ場合は同機能の作業色空間はRGBとなり、後を選んだ場合はL*a*b*となります。 TP_CHMIXER_BLUE;ブルー TP_CHMIXER_GREEN;グリーン @@ -2175,7 +2356,8 @@ TP_COLORAPP_CHROMA_M_TOOLTIP;CIECAM02/16の鮮やかさは、グレーと比較 TP_COLORAPP_CHROMA_S;彩度 (S) 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_CIECAT_DEGREE;色順応変換 場面条件 +TP_COLORAPP_CIECAT_DEGREEOUT;色順応変換 観視条件 TP_COLORAPP_CONTRAST;コントラスト (J) TP_COLORAPP_CONTRAST_Q;コントラスト (Q) TP_COLORAPP_CONTRAST_Q_TOOLTIP;CIECAM02/16のコントラスト(Q) は明るさに基づくもので、L*a*b*やRGBのコントラストとは異なります @@ -2224,12 +2406,12 @@ TP_COLORAPP_NEUTRAL_TOOLTIP;全てのスライダーチェックボックスと TP_COLORAPP_RSTPRO;レッドと肌色トーンを保護 TP_COLORAPP_RSTPRO_TOOLTIP;レッドと肌色トーンを保護はスライダーとカーブの両方に影響します TP_COLORAPP_SOURCEF_TOOLTIP;撮影条件に合わせて、その条件とデータを通常の範囲に収めます。ここで言う“通常”とは、平均的或いは標準的な条件とデータのことです。例えば、CIECAM02/16の補正を計算に入れずに収める。 -TP_COLORAPP_SURROUND;観視時の周囲環境 +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_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;明るさ @@ -2241,6 +2423,7 @@ 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_TEMPOUT_TOOLTIP;色温度と色偏差\n前に行われた選択に応じて、選択された色温度は:\nホワイトバランスが次のように\nA光源=2856\nD41=4100\nD50=5003\nD55=5503\nD60=6000\nD65=6504\nD75=7504\n或いはフリー\nになります TP_COLORAPP_TEMP_TOOLTIP;選択した光源に関し色偏差は常に1が使われます\n\n色温度=2856\nD50 色温度=5003\nD55 色温度=5503\nD65 色温度=6504\nD75 色温度=7504 TP_COLORAPP_TONECIE;CIECAM02/16を使ったトーンマッピング TP_COLORAPP_TONECIE_TOOLTIP;このオプションが無効になっている場合、トーンマッピングはL*a*b*空間を使用します\nこのオプションが有効になっている場合、トーンマッピングは、CIECAM02/16を使用します\nトーンマッピング(L*a*b*/CIECAM02)ツールを有効にするには、この設定を有効にする必要があります @@ -2362,6 +2545,8 @@ TP_DIRPYRDENOISE_LUMINANCE_CURVE;輝度カーブ TP_DIRPYRDENOISE_LUMINANCE_DETAIL;輝度 細部の復元 TP_DIRPYRDENOISE_LUMINANCE_FRAME;輝度ノイズ TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;輝度 +TP_DIRPYRDENOISE_MAIN_AUTO_GAIN;明るさに応じた補整 +TP_DIRPYRDENOISE_MAIN_AUTO_GAIN_TOOLTIP;画像の明るさに応じてノイズ低減の強さを変えます。画像が暗い場合はノイズ低減の強さを下げ、明るい画像では上げます。 TP_DIRPYRDENOISE_MAIN_COLORSPACE;色空間 TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB @@ -2455,9 +2640,11 @@ TP_FILMNEGATIVE_GUESS_TOOLTIP;レッドとブルーの比率を、元画像の TP_FILMNEGATIVE_LABEL;ネガフィルム TP_FILMNEGATIVE_OUT_LEVEL;出力のレベル TP_FILMNEGATIVE_PICK;ニュートラルなポイントをピック +TP_FILMNEGATIVE_PICK_SIZE;サイズ: TP_FILMNEGATIVE_RED;レッドの比率 TP_FILMNEGATIVE_REF_LABEL;入力RGB: %1 TP_FILMNEGATIVE_REF_PICK;ホワイトバランスのスポットをピックアップ +TP_FILMNEGATIVE_REF_SIZE;サイズ: TP_FILMNEGATIVE_REF_TOOLTIP;ポジの画像でホワイトバランスの取れているグレーの部分をピックアップします TP_FILMSIMULATION_LABEL;フィルムシミュレーション TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapeeはフィルムシミュレーション機能に使う画像をHald CLUTフォルダーの中から探すよう設計されています(プログラムに組み込むにはフォルダーが大き過ぎるため)。\n変更するには、環境設定 > 画像処理 > フィルムシミュレーションと進み\nどのフォルダーが使われているか確認します。機能を利用する場合は、Hald CLUTだけが入っているフォルダーを指定するか、 この機能を使わない場合はそのフォルダーを空にしておきます。\n\n詳しくはRawPediaを参照して下さい。\n\nフィルム画像のスキャンを止めますか? @@ -2472,6 +2659,7 @@ TP_FLATFIELD_BT_VERTHORIZ;垂直 + 水平 TP_FLATFIELD_BT_VERTICAL;垂直 TP_FLATFIELD_CLIPCONTROL;クリップコントロール TP_FLATFIELD_CLIPCONTROL_TOOLTIP;クリップコントロールは、フラットフィールドを使った時に白飛びが発生するのを避けるために使います。適用する元画像に既に白飛びがある場合は、クリップコントロールの適用で色被りが起こる可能性があります。 +TP_FLATFIELD_FROMMETADATA;メタデータから TP_FLATFIELD_LABEL;フラットフィールド TP_GENERAL_11SCALE_TOOLTIP;この機能の効果や、そのサブコンポーネントの確認には、プレビューで1:1以上のスケールが必要です。 TP_GRADIENT_CENTER;中央位置 @@ -2489,8 +2677,10 @@ TP_GRADIENT_STRENGTH_TOOLTIP;終点位置でのフィルターの強さ TP_HLREC_BLEND;ブレンド TP_HLREC_CIELAB;CIEL*a*b* ブレンディング TP_HLREC_COLOR;色の波及 +TP_HLREC_COLOROPP;インペイント オポーズド TP_HLREC_ENA_TOOLTIP;自動露光でも動作可 TP_HLREC_HLBLUR;ぼかし +TP_HLREC_HLTH;ゲインのしきい値 TP_HLREC_LABEL;ハイライト復元 TP_HLREC_LUMINANCE;輝度復元 TP_HLREC_METHOD;方式: @@ -2506,10 +2696,12 @@ TP_ICM_APPLYHUESATMAP_TOOLTIP;DCPに埋め込まれているベーステーブ TP_ICM_APPLYLOOKTABLE;ルックテーブル TP_ICM_APPLYLOOKTABLE_TOOLTIP;DCPに埋め込まれているルックテーブルを用います。但し、適用するDCPにこのタグがある場合に限ります。 TP_ICM_BPC;ブラックポイント補正 +TP_ICM_BW;白黒 TP_ICM_DCPILLUMINANT;光源 TP_ICM_DCPILLUMINANT_INTERPOLATED;補間 TP_ICM_DCPILLUMINANT_TOOLTIP;埋め込まれているDCPの光源のどちらを使うか選択。デフォルトではホワイトバランスに基づいて二つの光源の中間に補間する。この設定は二つのDCPの光源が補間サポートされる、を選択している場合に有効。 TP_ICM_FBW;白黒 +TP_ICM_GAMUT;色域の制御 TP_ICM_ILLUMPRIM_TOOLTIP;撮影条件に最も相応しい光源を選びます\n変更が行われるのは、‘変換先の原色’で‘カスタム (スライダー)’が選択された時だけです。 TP_ICM_INPUTCAMERA;カメラの標準的プロファイル TP_ICM_INPUTCAMERAICC;カメラプロファイルの自動調和 @@ -2518,8 +2710,8 @@ TP_ICM_INPUTCAMERA_TOOLTIP;dcrawのシンプルなカラー・マトリクス、 TP_ICM_INPUTCUSTOM;カスタム TP_ICM_INPUTCUSTOM_TOOLTIP;独自の DCP/ICCプロファイルファイルを選択 TP_ICM_INPUTDLGLABEL;DCP/ICC 入力プロファイルを選択... -TP_ICM_INPUTEMBEDDED;埋め込み使用, 可能なら -TP_ICM_INPUTEMBEDDED_TOOLTIP;raw以外のファイルに埋め込まれたカラープロファイルを使用 +TP_ICM_INPUTEMBEDDED;埋め込まれているプロファイルを使用 +TP_ICM_INPUTEMBEDDED_TOOLTIP;ファイルに埋め込まれているカラープロファイルを使用\nファイルがない場合は、カメラ標準のプロファイルに戻る TP_ICM_INPUTNONE;プロファイルなし TP_ICM_INPUTNONE_TOOLTIP;すべてにカラープロファイルを使用しない 特殊な場合にのみ使用 TP_ICM_INPUTPROFILE;入力プロファイル @@ -2529,9 +2721,9 @@ TP_ICM_NEUTRAL;リセット TP_ICM_NOICM;No ICM: sRGB 出力 TP_ICM_OUTPUTPROFILE;出力プロファイル 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_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;カスタム 原色 @@ -2543,8 +2735,15 @@ 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_TRC_TOOLTIP;RawTherapeeのデフォルトsRGBトーンリプロダクションカーブ(g=2.4 s=12.92)は変更が可能です。\nこのトーンリプロダクションカーブの変更は画像のトーンを変える機能です。RGB/Labの値、ヒストグラム、出力(スクリーン、TIF、JPG)が変わります。\nガンマは主に明るいトーンの変更、スロープは主に暗いトーンに作用します。\nどの様なガンマとスロープ(1より大きい)の組み合わせが選べます。アルゴリズムはカーブの線形部分と非線形部分の連続性を確保します。\n“なし”以外の選択をすると、“光源”と“相手先の原色”メニューが有効になります。 TP_ICM_WORKINGPROFILE;作業プロファイル +TP_ICM_WORKING_CAT;カラーマトリクスの適応 +TP_ICM_WORKING_CAT_BRAD;ブラッドフォード +TP_ICM_WORKING_CAT_CAT02;Cat02 +TP_ICM_WORKING_CAT_CAT16;Cat16 +TP_ICM_WORKING_CAT_TOOLTIP;XYZ変換マトリクスの色順応を実行します。デフォルトはブラッドフォードです +TP_ICM_WORKING_CAT_VK;フォンクリース係数 +TP_ICM_WORKING_CAT_XYZ;XYZスケール TP_ICM_WORKING_CIEDIAG;CIE xy ダイヤグラム TP_ICM_WORKING_ILLU;光源 TP_ICM_WORKING_ILLU_1500;タングステン 1500K @@ -2556,8 +2755,10 @@ 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_E;E TP_ICM_WORKING_ILLU_NONE;デフォルト TP_ICM_WORKING_ILLU_STDA;stdA 2875K +TP_ICM_WORKING_NON;なし TP_ICM_WORKING_PRESER;パステルトーンを維持 TP_ICM_WORKING_PRIM;変換先の原色 TP_ICM_WORKING_PRIMFRAME_TOOLTIP;‘変換先の原色’のコンボボックスの中から‘カスタムCIE xyダイヤグラム’を選択すると、3つの原色がダイヤグラム上で変更可能となります。\n注意:この場合、ダイヤグラムのホワイトポイントの位置は更新されません。 @@ -2569,10 +2770,14 @@ 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_FREE;カスタム(スライダー) +TP_ICM_WORKING_PRIM_JDCMAX;JDC Max +TP_ICM_WORKING_PRIM_JDCMAXSTDA;JDC Max 標準A光源 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_TOOLTIP;‘変換先の原色’(高度)により、画像の色(彩度)を復元或いは変更するために変換先の原色を変えることが出来ます。‘作業プロファイル’と‘変換先の原色’の違いが小さければ、カラーバランスは十分に保たれます。作業プロファイルは変わりません。色域が制御されます。\n‘カスタム(スライダー)’を選択すると、XとYに関するレッド、グリーン、ブルーの3原色の値を変えることが出来ます。 TP_ICM_WORKING_PRIM_WID;WideGamut TP_ICM_WORKING_TRC;トーンリプロダクションカーブ: TP_ICM_WORKING_TRC_18;Prophoto g=1.8 @@ -2582,13 +2787,11 @@ 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_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_BRIGHTNESS;明度 TP_LABCURVE_CHROMATICITY;色度 TP_LABCURVE_CHROMA_TOOLTIP;白黒トーンを適用するには、彩度を-100に設定します @@ -2653,7 +2856,7 @@ TP_LOCALLAB_ARTIF_TOOLTIP;ΔE-スコープのしきい値:スコープを適 TP_LOCALLAB_AUTOGRAY;自動平均輝度(Yb%) TP_LOCALLAB_AUTOGRAYCIE;自動 TP_LOCALLAB_AVOID;色ずれの回避 -TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;作業色空間の色域に色を収め、マンセル補正を行います(均一的な知覚のLab)\nJz或いはCAM16が使われている場合は、マンセル補正が常に無効になります。 +TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;作業色空間の色域に色を収め、マンセル補正を行います(均一的な知覚のLab)\nJz或いはCAM16、色の見えと明るさが使われている場合は、マンセル補正が常に無効になります。\n\nデフォルト:マンセル\nマンセル補正:色度が修正された時に、非線形性に起因する色ずれが発生するL*a*b*の欠点を修復します(均一的な知覚Lab)\nL*a*b*: 色域制御、相対的色域が適用され後に、マンセル補正が行われます\nXYZ 絶対:色域制御、絶対的色域が適用された後にマンセル補正が行われます \nXYZ 相対: 色域制御、相対的色域が適用された後にマンセル補正が行われます。結果はLabの場合と同じになりません。 TP_LOCALLAB_AVOIDMUN;マンセル補正だけ TP_LOCALLAB_AVOIDMUN_TOOLTIP;Jz或いはCAM16が使われている場合は、マンセル補正が常に無効になります。 TP_LOCALLAB_AVOIDRAD;ソフトな半径 @@ -2666,7 +2869,7 @@ TP_LOCALLAB_BILATERAL;平滑化フィルタ TP_LOCALLAB_BLACK_EV;ブラックEv TP_LOCALLAB_BLCO;色度だけ TP_LOCALLAB_BLENDMASKCOL;ブレンド -TP_LOCALLAB_BLENDMASKMASK;マスクの輝度の加減 +TP_LOCALLAB_BLENDMASKMASK;マスクの輝度の加減 TP_LOCALLAB_BLENDMASKMASKAB;マスクの色度の加減 TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;スライダーの値が0の場合は作用しません\n元画像にマスクを追加したり、追加したマスクを削除します TP_LOCALLAB_BLENDMASK_TOOLTIP;ブレンド=0の場合は、形状検出だけが改善します\nブレンドが0より大きい場合は、画像にマスクが追加されます。 ブレンドが0より小さい場合は、画像からマスクが除かれます。 @@ -2676,16 +2879,16 @@ TP_LOCALLAB_BLLC;輝度と色度 TP_LOCALLAB_BLLO;輝度だけ TP_LOCALLAB_BLMED;メディアン TP_LOCALLAB_BLMETHOD_TOOLTIP;通常:全ての設定に対し、直接的なぼかしとノイズ処理\nインバース:ぼかしとノイズ処理\n注意:設定によっては予期しない結果になることがあります -TP_LOCALLAB_BLNOI_EXP;ぼかし & ノイズ除去 +TP_LOCALLAB_BLNOI_EXP;ぼかし & ノイズ TP_LOCALLAB_BLNORM;通常 TP_LOCALLAB_BLUFR;ぼかし/質感とノイズ除去 -TP_LOCALLAB_BLUMETHOD_TOOLTIP;背景をぼかし、前景を区分けするために:\n画像全体をRT-スポットで完全に囲み(スコープと境界値は高くします)背景をぼかします-'通常’或いは’インバース’モードを選択します\n*一つ以上のRT-スポットで’除外’モードを使い、スコープ値を高くして前景を区分けします\n\nこの機能モジュール('メディアン’及び’ガイド付きフィルタ’を含む)は、メインのノイズ低減と併用できます。 +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_BLURLEVELFRA;詳細レベルのぼかし TP_LOCALLAB_BLURMASK_TOOLTIP;マスクを生成するために半径の大きなぼかしを使います。これにより画像のコントラストを変えたり、画像の一部を暗く、又は明るくすることが出来ます。 TP_LOCALLAB_BLURRMASK_TOOLTIP;ガウスぼかしの’半径’を変えることが出来ます(0~1000) TP_LOCALLAB_BLUR_TOOLNAME;ぼかし/質感 & ノイズ除去 @@ -2696,10 +2899,13 @@ TP_LOCALLAB_BUTTON_DEL;削除 TP_LOCALLAB_BUTTON_DUPL;複製 TP_LOCALLAB_BUTTON_REN;名前の変更 TP_LOCALLAB_BUTTON_VIS;表示/非表示 +TP_LOCALLAB_BWEVNONE;なし +TP_LOCALLAB_BWEVSIG;有効 +TP_LOCALLAB_BWEVSIGLOG;シグモイド & 対数符号化 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_CAM16_FRA;CAM16による画像編集 TP_LOCALLAB_CAMMODE;CAMのモデル TP_LOCALLAB_CAMMODE_CAM16;CAM16 TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz @@ -2712,12 +2918,14 @@ TP_LOCALLAB_CBDL_TOOLNAME;詳細レベルによるコントラスト調整 TP_LOCALLAB_CENTER_X;センターX TP_LOCALLAB_CENTER_Y;センターY TP_LOCALLAB_CH;CL - LC +TP_LOCALLAB_CHRO46LABEL;詳細レベル4から6の色度: 平均=%1 高=%2 +TP_LOCALLAB_CHROLABEL;詳細レベル0から3の色度: 平均=%1 高=%2 TP_LOCALLAB_CHROMA;色度 -TP_LOCALLAB_CHROMABLU;色度のレベル +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_CHROMALEV;詳細レベルの色度 TP_LOCALLAB_CHROMASKCOL;色度 TP_LOCALLAB_CHROMASK_TOOLTIP;このスライダーを使って背景の彩度を下げることが出来ます(インバースマスクで言う0に近いカーブ).\n色度に対するマスクの作用を強めることも出来ます。 TP_LOCALLAB_CHROML;色度 (C) @@ -2727,19 +2935,25 @@ 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_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_TOOLTIP;デフォルトではCIECAMが処理過程の最後になっています。"マスクと修正"と"輝度マスクをベースにした詳細の復元"は"CAM16 + JzCzHz"で使えます。\n好みに併せて他の機能(トーンマッピング、ダイナミックレンジ圧縮、対数符号化)にCIECAMを統合することも出来ます。調整結果はCIECAMを統合しなかった場合と異なります。このモードでは"マスクと修正"と"輝度マスクをベースにした詳細の復元"が使えます。 TP_LOCALLAB_CIEMODE_WAV;ウェーブレット TP_LOCALLAB_CIETOOLEXP;カーブ +TP_LOCALLAB_CIE_SMOOTHFRAME;ハイライトの減衰とレベル +TP_LOCALLAB_CIE_SMOOTH_EV;Evをベースにした減衰 +TP_LOCALLAB_CIE_SMOOTH_GAMMA;スロープをベースにした減衰 +TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF;ガンマをベースにした減衰 +TP_LOCALLAB_CIE_SMOOTH_LEVELS;レベル +TP_LOCALLAB_CIE_SMOOTH_NONE;なし TP_LOCALLAB_CIE_TOOLNAME;色の見えモデル(CAM16とJzCzHz) -TP_LOCALLAB_CIRCRADIUS;スポットの中心の大きさ +TP_LOCALLAB_CIRCRADIUS;スポットの中心円の大きさ TP_LOCALLAB_CIRCRAD_TOOLTIP;この円内の情報がRT-スポットの編集の基準値となります。色相、輝度、色度、Sobelの形状検出に使います。\n小さい半径は花の色などの補正に。\n大きな半径は肌などの補正に適しています。 -TP_LOCALLAB_CLARICRES;色度を融合 +TP_LOCALLAB_CLARICRES;色度の融合 TP_LOCALLAB_CLARIFRA;明瞭とシャープマスク/ブレンド & ソフトイメージ TP_LOCALLAB_CLARIJZ_TOOLTIP;レベル0から4まではシャープマスクが働きます\nレベル5以上では明瞭が働きます TP_LOCALLAB_CLARILRES;輝度の融合 @@ -2748,19 +2962,23 @@ TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;‘ソフトな半径’のスライダー (ガ TP_LOCALLAB_CLARISOFT_TOOLTIP;'ソフトな半径’のスライダーは(ガイド付きフィルタのアルゴリズム)、明瞭とシャープマスク、及び全てのウェーブレットピラミッドの処理に起因するハロと不規則性を軽減します。作用を無効にするには値を0にします。 TP_LOCALLAB_CLARITYML;明瞭 TP_LOCALLAB_CLARI_TOOLTIP;'シャープマスク’はレベル0~4で有効です。\n’明瞭’はレベル5以上で有効です。\n'レベルのダイナミックレンジ圧縮’を利用する場合に役立ちます。 -TP_LOCALLAB_CLIPTM;復元されたデータの切り取り(ゲイン) +TP_LOCALLAB_CLIPTM;復元されたデータの切り詰め(ゲイン) TP_LOCALLAB_COFR;色と明るさ -TP_LOCALLAB_COLORDE;ΔEのプレビューカラー - 強さ -TP_LOCALLAB_COLORDEPREV_TOOLTIP;有効になっている機能が1つだけの時は、設定のパネル(拡張する)のΔEのプレビューボタンを使います。\n複数の機能が有効になっている時は、各機能に備わっているマスクと調節の中のΔEのプレビューを使います。 +TP_LOCALLAB_COLORDE;プレビューΔEのカラー - 強さ +TP_LOCALLAB_COLORDEPREV_TOOLTIP;‘現在のスポットに機能を追加’で選んだ機能の中で、設定パネルで表示される‘プレビューΔEボタン’が使えるのは、シャープニング、ソフトライト&独自のレティネックス、ぼかし/質感&ノイズ除去、霞除去&レティネックス、或いは、詳細レベルによるコントラスト調整だけです。\n他の機能の場合は、その機能パネルの中に表示されるプレビューΔEボタンを使います。また、同じRT-スポットで複数の機能が有効になっている場合は、マスクと修正領域のコンボボックスの中にあるプレビューΔEボタンを使います。 TP_LOCALLAB_COLORDE_TOOLTIP;設定値がマイナスの場合は色差(ΔE)のプレビューの色をブルーで表示、プラスの場合はグリーンで表示\n\nマスクと調節(マスクなしで変更された領域を表示):プラスであれば、実際の変更を表示、マイナスであれば、強化された変更(輝度のみ)をブルーとイエローで表示 +TP_LOCALLAB_COLORFRAME;主体色 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_COMPFRA;方向によるコントラスト +TP_LOCALLAB_COMPRCIE;明るさの圧縮 +TP_LOCALLAB_COMPRCIETH;圧縮のしきい値 TP_LOCALLAB_COMPREFRA;ウェーブレットのレベルを使ったトーンマッピング +TP_LOCALLAB_COMPRLOG_TOOLTIP;これは、しきい値以上のコントラストで、データを対数変換する前に圧縮するアルゴリズムです。ホワイトの分布と併用して使います。 TP_LOCALLAB_CONTCOL;コントラストしきい値 TP_LOCALLAB_CONTFRA;レベルによるコントラスト調整 TP_LOCALLAB_CONTRAST;コントラスト @@ -2784,6 +3002,7 @@ TP_LOCALLAB_CURVNONE;カーブを無効 TP_LOCALLAB_DARKRETI;暗さ TP_LOCALLAB_DEHAFRA;霞除去 TP_LOCALLAB_DEHAZ;強さ +TP_LOCALLAB_DEHAZE_BLACK;ブラック TP_LOCALLAB_DEHAZFRAME_TOOLTIP;大気に起因する霞を除去します。全体の彩度とディテールが向上します\n色被りも除去できますが、青味がかかることがあるので、その場合は別な機能で補正します TP_LOCALLAB_DEHAZ_TOOLTIP;マイナス値にすると霞が増えます TP_LOCALLAB_DELTAD;デルタバランス @@ -2796,11 +3015,13 @@ TP_LOCALLAB_DENOICHRODET_TOOLTIP;漸進的にフーリエ変換(離散コサ TP_LOCALLAB_DENOICHROF_TOOLTIP;小さいディテールの色ノイズを調整します TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;ブルー/イエロー、或いはレッド/グリーンの補色次元で色ノイズを軽減します TP_LOCALLAB_DENOIEQUAL_TOOLTIP;シャドウ、或いはハイライト部分で、ある程度ノイズ低減を実行出来ます -TP_LOCALLAB_DENOILUMDETAIL_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_DENOIQUA_TOOLTIP;’控え目’なモードでは、低周波ノイズは除去されません。’積極的’なモードは低周波ノイズも除去します。\n’控え目’も’積極的’も、ウェーブレットとDCTを使いますが、’輝度の非局所平均フィルタ’を併用することも出来ます。 +TP_LOCALLAB_DENOITHR_TOOLTIP;均一及び低コントラスト部分のノイズを減らす補助としてエッジ検出を調整します +TP_LOCALLAB_DENOIWAVCH;ウェーブレット: 色ノイズ +TP_LOCALLAB_DENOIWAVLUM;ウェーブレット: 輝度ノイズ TP_LOCALLAB_DENOI_EXP;ノイズ除去 TP_LOCALLAB_DENOI_TOOLTIP;このモジュールは単独のノイズ低減機能(処理工程の最後の方に位置)として、或いはメインのディテールタブに付属するノイズ低減(処理工程の最初の方に位置)の追加機能として使うことが出来ます。\n色(ΔE)を基本に、スコープを使って作用に差を付けることが出来ます。\n但し、RT-スポットは最低128x128の大きさの必要です TP_LOCALLAB_DEPTH;深度 @@ -2808,6 +3029,7 @@ TP_LOCALLAB_DETAIL;ローカルコントラスト TP_LOCALLAB_DETAILFRA;エッジ検出 - DCT TP_LOCALLAB_DETAILSH;ディテール TP_LOCALLAB_DETAILTHR;輝度と色の詳細のしきい値 +TP_LOCALLAB_DISAB_CIECAM;CIECAM、或いは弱いJz状態を無効にする TP_LOCALLAB_DIVGR;ガンマ TP_LOCALLAB_DUPLSPOTNAME;コピー TP_LOCALLAB_EDGFRA;エッジシャープネス @@ -2816,6 +3038,7 @@ TP_LOCALLAB_ELI;楕円 TP_LOCALLAB_ENABLE_AFTER_MASK;トーンマッピングを使う TP_LOCALLAB_ENABLE_MASK;マスクを有効にする TP_LOCALLAB_ENABLE_MASKAFT;露光補正の全てのアルゴリズムを使う +TP_LOCALLAB_ENABLE_MASKALL;全てのマスクツールを有効にする TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;元のデータの代わりに透過マップを使った後は、有効にしたマスクは修復されたデータを使います。 TP_LOCALLAB_ENH;強化 TP_LOCALLAB_ENHDEN;強化 + 色ノイズの軽減 @@ -2831,9 +3054,10 @@ 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_EXCLUTYPE_TOOLTIP;通常スポットが使う情報は再帰的になります。\n\n除外スポットはローカル調整のデータを再初期化します。\nそれまでの作用を一部、或いは全てキャンセルするために使います。或いは、インバースモードで動作を実行するために使います。\n\n’画像全体’はローカル編集の機能を画像全体で使うためのモードです。\nRT-スポットのフレーム(外枠)がプレビュー画像の外側に自動で設定されます。\n’変移の階調’の変移の位置が自動で100に設定されます。\n注意1:目標とする調整に応じて、RT-スポットの中心円の位置や大きさを変えます。\n注意2:このスポットタイプでノイズ除去やウェーブレット、或いは高速フーリエ変換を使う場合はメモリー消費量が非常に大きくなります。PCのスペックが低いとプログラムがクラッシュすることがあります。\n\n‘グローバル’を選択すると、ΔEと変移の階調に影響を受けずに、画像全体でローカル編集の機能を使うことが出来ます。 TP_LOCALLAB_EXECLU;除外スポット TP_LOCALLAB_EXFULL;画像全体 +TP_LOCALLAB_EXMAIN;グローバル TP_LOCALLAB_EXNORM;通常スポット TP_LOCALLAB_EXPCBDL_TOOLTIP;センサーやレンズの汚れ跡を、それに該当する詳細レベルのコントラストを減らすことで除去します。 TP_LOCALLAB_EXPCHROMA;色度の補間 @@ -2841,22 +3065,22 @@ 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_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_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_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_EXPNOISEMETHOD_TOOLTIP;アーティファクト(ノイズ)の発生を避けるため、ラプラス作用素を適用する前にメディアンフィルタを適用します TP_LOCALLAB_EXPOSE;ダイナミックレンジ & 露光補正 TP_LOCALLAB_EXPOSURE_TOOLTIP;シャドウ部分が強いような場合は、’シャドウ/ハイライト’のモジュールが使えます TP_LOCALLAB_EXPRETITOOLS;高度なレティネックス機能 -TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-スポットの大きさが最低でも39x39ピクセル必要です\nスポットが小さい場合は、低い境界値、高い減衰値、高いスコープ値を設定します +TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-スポットの大きさが最低でも39x39ピクセル必要です\nスポットが小さい場合は、低い変移の位置、高い減衰値、高いスコープ値を設定します TP_LOCALLAB_EXPTOOL;露光補正の機能 TP_LOCALLAB_EXP_TOOLNAME;ダイナミックレンジ & 露光補正 TP_LOCALLAB_FATAMOUNT;量 @@ -2865,6 +3089,7 @@ TP_LOCALLAB_FATDETAIL;ディテール TP_LOCALLAB_FATFRA;ダイナミックレンジ圧縮 ƒ TP_LOCALLAB_FATFRAME_TOOLTIP;ここではFattalのトーンマッピングアルゴリズムを使います\nアンカーで画像の露出不足・過多に応じた選択が出来ます\n現在のスポットに近く、マスクを使用する2番目のスポットの輝度を増やすのに便利です TP_LOCALLAB_FATLEVEL;シグマ +TP_LOCALLAB_FATSAT;彩度の抑制 TP_LOCALLAB_FATSHFRA;マスクのダイナミックレンジ圧縮のマスク ƒ TP_LOCALLAB_FEATH_TOOLTIP;RT-スポットの対角線の長さに対する諧調幅の割合で作用します\nこれは階調フィルタを備えているモジュール全てに共通です\n但し、フェザー処理が働くのは、階調フィルタの中で一つ以上の調整が行われている場合だけです TP_LOCALLAB_FEATVALUE;フェザー処理 @@ -2883,11 +3108,16 @@ TP_LOCALLAB_GAMM;ガンマ TP_LOCALLAB_GAMMASKCOL;ガンマ TP_LOCALLAB_GAMMASK_TOOLTIP;ガンマとスロープを調整すると、不連続になるのを避けるために’L’が徐々に変わるため、アーティファクトを発生させずにマスクの修正が出来ます TP_LOCALLAB_GAMSH;ガンマ +TP_LOCALLAB_GAMUTLABRELA;L*a*b* +TP_LOCALLAB_GAMUTMUNSELL;マンセル補正だけ +TP_LOCALLAB_GAMUTNON;なし +TP_LOCALLAB_GAMUTXYZABSO;XYZ 絶対 +TP_LOCALLAB_GAMUTXYZRELA;XYZ 相対 TP_LOCALLAB_GAMW;ガンマ(ウェーブレットピラミッド) TP_LOCALLAB_GRADANG;階調フィルタの角度 TP_LOCALLAB_GRADANG_TOOLTIP;-180度から+180度の間で角度を調整 TP_LOCALLAB_GRADFRA;階調フィルタのマスク -TP_LOCALLAB_GRADGEN_TOOLTIP;階調フィルタの機能は’色と明るさ’と、’露光’、'シャドウ/ハイライト”、’自然な彩度’に備わっています\n\n自然な彩度、色と明るさには輝度、色調、色相の階調フィルタが使えます\nフェザー処理は設定の中にあります +TP_LOCALLAB_GRADGEN_TOOLTIP;階調フィルタの機能は’色と明るさ’と、’露光’、'シャドウ/ハイライト”、’自然な彩度’に備わっています\n\n自然な彩度、色と明るさには輝度、色調、色相の階調フィルタが使えます\nフェザー処理は設定の中にあります TP_LOCALLAB_GRADLOGFRA;輝度の階調フィルタ TP_LOCALLAB_GRADSTR;階調フィルタ 強さ TP_LOCALLAB_GRADSTRAB_TOOLTIP;色度の階調の強さを調整します @@ -2900,7 +3130,7 @@ TP_LOCALLAB_GRAINFRA;フィルムの質感 1:1 TP_LOCALLAB_GRAINFRA2;粗い TP_LOCALLAB_GRAIN_TOOLTIP;画像にフィルムのような質感を加えます TP_LOCALLAB_GRALWFRA;階調フィルタ(ローカルコントラスト) -TP_LOCALLAB_GRIDFRAME_TOOLTIP;このツールはブラシとして使うことが出来ます。小さいRT-スポットと低い‘境界値’、‘境界値の減衰’を設定します。\n‘標準’モードだけで使います。融合する背景(ΔE)に関係するのは色相、彩度、色、輝度です。 +TP_LOCALLAB_GRIDFRAME_TOOLTIP;このツールはブラシとして使うことが出来ます。小さいRT-スポットと低い‘変移の位置’、‘変移の減衰’を設定します。\n‘標準’モードだけで使います。融合する背景(ΔE)に関係するのは色相、彩度、色、輝度です。 TP_LOCALLAB_GRIDMETH_TOOLTIP;カラートーン調整:色が変わる際に輝度を考慮します。グリッド上の’白い点’は0の位置、’黒い点’だけを移動した場合は、H=f(H)と同じ効果です。両方の点を移動した場合に’カラートーン調整’の効果になります。\n\n直接:色度に直接作用します。 TP_LOCALLAB_GRIDONE;カラートーン調整 TP_LOCALLAB_GRIDTWO;直接 @@ -2908,7 +3138,7 @@ TP_LOCALLAB_GUIDBL;ソフトな半径 TP_LOCALLAB_GUIDBL_TOOLTIP;半径を変えられるガイド付きフィルタを適用します。アーティファクトを軽減したり、画像にぼかしを掛けたり出来ます。 TP_LOCALLAB_GUIDEPSBL_TOOLTIP;ガイド付きフィルタの配分機能を変化させます。マイナス値の設定はガウスぼかしに似た効果となります TP_LOCALLAB_GUIDFILTER;ガイド付きフィルタの半径 -TP_LOCALLAB_GUIDFILTER_TOOLTIP;アーティファクトが減ったり、増えたりします +TP_LOCALLAB_GUIDFILTER_TOOLTIP;アーティファクトが減ったり、増えたりします TP_LOCALLAB_GUIDSTRBL_TOOLTIP;ガイド付きフィルタの強さ TP_LOCALLAB_HHMASK_TOOLTIP;例えば肌の微妙な色相調整に使います TP_LOCALLAB_HIGHMASKCOL;ハイライト @@ -2945,8 +3175,8 @@ TP_LOCALLAB_JZLOGWB_TOOLTIP;自動を有効にすると、スポット内のEv 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_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)カーブが影響を受けます。 @@ -2958,25 +3188,27 @@ TP_LOCALLAB_JZTARGET_EV;観視の平均輝度(Yb%) TP_LOCALLAB_JZTHRHCIE;Jz(Hz)の色度のしきい値 TP_LOCALLAB_JZWAVEXP;Jz ウェーブレット TP_LOCALLAB_LABBLURM;マスクのぼかし -TP_LOCALLAB_LABEL;ローカル編集 +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_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_LAP_MASK_TOOLTIP;全てのラプラシアンマスクのポアソン方程式の解を求めます\nラプラシアンのしきい値マスクを有効にするとアーティファクトが軽減され、スムーズな効果が得られます\n無効の場合は線形的な応答となります +TP_LOCALLAB_LCLABELS;残差画像のノイズレベル +TP_LOCALLAB_LCLABELS_TOOLTIP;プレビューパネル(拡大率100%)で表示されている部分のノイズの平均値と最も高い値を表示します。ノイズの値は0から3、4から5のウェーブレットのレベルでグループ化されています。\n表示される値はあくまで目安であり、ノイズ除去の補助的役割を担うものです。絶対的なノイズの値ではありません。\n\n300:非常にノイズが多い\n100から300:ノイズが多い\n50から100:ある程度のノイズ\n50より低い:ノイズが少ない\n\nこれらの値から次のことが分かります:\n*ディテールタブのノイズ低減機能の効果\n*非局所平均、ウェーブレット、DCT(コサイン変換)機能による輝度ノイズ低減の効果\n*キャプチャーシャープニングとデモザイク処理の効果 TP_LOCALLAB_LC_FFTW_TOOLTIP;高速フーリエ変換を使うと質が向上し、大きな半径も使えますが、処理時間が増えます(処理する領域次第で)。大きい半径を使う時だけに使う方がいいでしょう。FFTWの最適化を図るため、処理する領域が数ピクセルほど小さくなります。これだけで、処理の効率がが1.5倍~10倍良くなります。 TP_LOCALLAB_LC_TOOLNAME;ローカルコントラスト & ウェーブレット -TP_LOCALLAB_LEVELBLUR;ぼかしを施すレベルの最大値 +TP_LOCALLAB_LEVELBLUR;ぼかし効果の強さ TP_LOCALLAB_LEVELWAV;ウェーブレットのレベル TP_LOCALLAB_LEVELWAV_TOOLTIP;詳細レベルの番手はスポットとプレビューのサイズに応じて自動で決まります\n最大512ピクセルで解析するレベル9から最大4ピクセルで解析するレベル1まで -TP_LOCALLAB_LEVFRA;レベル +TP_LOCALLAB_LEVFRA;ウェーブレットのレベル TP_LOCALLAB_LIGHTNESS;明度 TP_LOCALLAB_LIGHTN_TOOLTIP;インバースモードにして、スコープを高く(75以上)、明度を-100にして色度を下げると、境界の外側の輝度が0になります。 TP_LOCALLAB_LIGHTRETI;明度 @@ -2993,7 +3225,7 @@ TP_LOCALLAB_LOC_CONTRASTPYR2LAB;レベルによるコントラスト調整/ト TP_LOCALLAB_LOC_CONTRASTPYRLAB;階調フィルタ/エッジシャープネス/ぼかし TP_LOCALLAB_LOC_RESIDPYR;残差画像 メイン TP_LOCALLAB_LOG;対数符号化 -TP_LOCALLAB_LOG1FRA;CAM16による画像の調整 +TP_LOCALLAB_LOG1FRA;CAM16による画像編集 TP_LOCALLAB_LOG2FRA;観視条件 TP_LOCALLAB_LOGAUTO;自動 TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;場面条件の’平均輝度’を自動で計算します。 @@ -3001,7 +3233,9 @@ 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;対数符号化 +TP_LOCALLAB_LOGCIEQ;対数符号化 Q (CIECAMを含む) +TP_LOCALLAB_LOGCIEQ_TOOLTIP;このオプションを有効(✓)にすると、3つのRGBチャンネルをベースにした対数符号化をCIECAMの明るさ(Q)チャンネルだけをベースにした対数符号化に切り替えることが出来ます。\nRGBチャンネルの代わりにQチャンネルを使うと、色相や彩度のズレによる好ましくないエッジ効果を避けることが出来ます。\n但し、Qチャンネルの値には制限がありませんが、CIECAMは周囲環境や同時対比などに合わせてデータを変化させるため、最適化を図る設定は難しくなります。\n次のような機能調整が必要でしょう:\n‘場面条件’の平均輝度(Yb)、ホワイトとブラックの分布、ブラックEv、ホワイトEv\n‘元データの調整’の明るさの圧縮、強さ\n\n注意:対数符号化(Q)を使う際には、場面条件の周囲環境でCIECAMを無効にするオプションは選択しないようにします。 TP_LOCALLAB_LOGCIE_TOOLTIP;対数符号化Qを使うトーンマッピングでは、ブラックEvとホワイトEvの調節、場面条件の平均輝度と観視条件の平均輝度(Y%)の調整が出来ます。 TP_LOCALLAB_LOGCOLORFL;鮮やかさ (M) TP_LOCALLAB_LOGCOLORF_TOOLTIP;グレーに対して知覚される色相の量のことです。\n色刺激が多かれ少なかれ色付いて見えることの指標です。 @@ -3018,11 +3252,12 @@ 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_LOGLIGHTL_TOOLTIP;L*a*b*の明度に近いものですが、知覚される彩色の増加を考慮ています。 TP_LOCALLAB_LOGLIGHTQ;明るさ (Q) -TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;その色刺激から発せられる知覚された光の量を意味します。\nその色刺激の明るさの多寡の指標です。 +TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;その色刺激から発せられる知覚された光の量を意味します。\nその色刺激の明るさの多寡の指標です。 TP_LOCALLAB_LOGLIN;対数モード TP_LOCALLAB_LOGPFRA;相対的な露光レベル +TP_LOCALLAB_LOGPFRA2;対数符号化の設定 TP_LOCALLAB_LOGREPART;全体の強さ TP_LOCALLAB_LOGREPART_TOOLTIP;元画像と比べた対数符号化した画像の強さを調整します。\n色の見えモデルの構成要素には影響しません。 TP_LOCALLAB_LOGSATURL_TOOLTIP;色の見えモデル16の彩度Sは、物体自身が持つ明るさに関した色刺激の色に該当します\n主に、中間トーンからハイライトにかけて作用します。 @@ -3031,14 +3266,16 @@ TP_LOCALLAB_LOGSURSOUR_TOOLTIP;場面条件を考慮して明暗と色を調整 TP_LOCALLAB_LOGVIEWING_TOOLTIP;最終画像を見る周囲環境同様、それを見る媒体(モニター、TV、プロジェクター、プリンターなど)に対応します。 TP_LOCALLAB_LOG_TOOLNAME;対数符号化 TP_LOCALLAB_LUM;LL - CC +TP_LOCALLAB_LUM46LABEL;4から6のレベルの輝度: 平均=%1 高=%2 TP_LOCALLAB_LUMADARKEST;最も暗い部分 TP_LOCALLAB_LUMASK;マスクの背景色と輝度 -TP_LOCALLAB_LUMASK_TOOLTIP;マスクの表示(マスクと修正領域)で、背景のグレーを調節します +TP_LOCALLAB_LUMASK_TOOLTIP;マスクの表示(マスクと修正)で、背景のグレーを調節します TP_LOCALLAB_LUMAWHITESEST;最も明るい部分 TP_LOCALLAB_LUMFRA;L*a*b* 標準 +TP_LOCALLAB_LUMLABEL;0から3のレベルの輝度: 平均=%1 高=%2 TP_LOCALLAB_MASFRAME;マスクと融合に関する設定 TP_LOCALLAB_MASFRAME_TOOLTIP;これは全てのマスクに共通します\n以下のマスク機能が使われた時に目標とする領域が変化するのを避けるためにΔE画像を考慮します:ガンマ、スロープ、色度、コントラストカーブ(ウェーブレットのレベル)、ぼかしマスク、構造のマスク(有効になっている場合)\nこの機能はインバースモードでは無効になります -TP_LOCALLAB_MASK;カーブ +TP_LOCALLAB_MASK;コントラスト TP_LOCALLAB_MASK2;コントラストカーブ TP_LOCALLAB_MASKCOM;共通のカラーマスク TP_LOCALLAB_MASKCOM_TOOLNAME;共通のカラーマスク @@ -3047,51 +3284,51 @@ TP_LOCALLAB_MASKCURVE_TOOLTIP;デフォルトでは3つのカーブは1(最大 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_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_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_MASKLC_TOOLTIP;輝度ノイズをウェーブレットを使って除去します。\n'マスクと修正'の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_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;メディアンフィルタ適用の繰り返し回数を設定します @@ -3103,7 +3340,7 @@ TP_LOCALLAB_MERELE;明るくするだけ TP_LOCALLAB_MERFIV;追加 TP_LOCALLAB_MERFOR;色の覆い焼き TP_LOCALLAB_MERFOU;乗算 -TP_LOCALLAB_MERGE1COLFRA;融合するファイルの選択:オリジナル/前のRT-スポット/背景 +TP_LOCALLAB_MERGE1COLFRA;融合するファイルの選択:元画像/一つ前の画像/背景 TP_LOCALLAB_MERGECOLFRA;マスク:LChと構造 TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;LChの3つのカーブ、或いは構造検出のアルゴリズム、またはその両方をベースにマスクを作ります TP_LOCALLAB_MERGEMER_TOOLTIP;ファイルを癒合する際にΔEを考慮します(この場合はスコープと同じ働きです) @@ -3125,38 +3362,39 @@ TP_LOCALLAB_MERTHI;色の焼き込み TP_LOCALLAB_MERTHR;差異 TP_LOCALLAB_MERTWE;除外 TP_LOCALLAB_MERTWO;減算 -TP_LOCALLAB_METHOD_TOOLTIP;'強化 + 色ノイズ低減'を選ぶと処理時間が著しく増加します\nしかし、アーティファクトは軽減されます +TP_LOCALLAB_METHOD_TOOLTIP;'強化 + 色ノイズ低減'を選ぶと処理時間が著しく増加します\nしかし、アーティファクトは軽減されます +TP_LOCALLAB_MIDTCIE;中間トーン 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_MRFOU;一つ前のスポット TP_LOCALLAB_MRONE;なし -TP_LOCALLAB_MRTHR;オリジナルRT-スポット -TP_LOCALLAB_MULTIPL_TOOLTIP;トーンの幅が広い画像、-18EV~+4EV、を調整します: 最初のスライダーは-18EV~-6EVの非常に暗い部分に作用します。2つ目のスライダーは-6EV~+4EVの部分に作用します +TP_LOCALLAB_MRTHR;元画像 +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_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_NOISECHROCOARSE;高い番手の色ノイズ(ウェーブレット) TP_LOCALLAB_NOISECHROC_TOOLTIP;0より大きい値で効果の高いアルゴリズムが働き始めます\n大まかなスライダーの場合は2以上からです -TP_LOCALLAB_NOISECHRODETAIL;色度の詳細復元 -TP_LOCALLAB_NOISECHROFINE;低い番手の色度(ウェーブレット) +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_NOISELUMDETAIL;詳細復元(輝度) TP_LOCALLAB_NOISELUMFINE;輝度 詳細レベル2(ウェーブレット) TP_LOCALLAB_NOISELUMFINETWO;輝度 詳細レベル3(ウェーブレット) TP_LOCALLAB_NOISELUMFINEZERO;輝度 詳細レベル1(ウェーブレット) @@ -3171,23 +3409,28 @@ TP_LOCALLAB_ORIGLC;元画像だけと融合 TP_LOCALLAB_ORRETILAP_TOOLTIP;'スコープ'による変更の前に、ΔEを変更します。これにより画像の異なる部分(例えば背景)に対する作用に差を付けることが出来ます。 TP_LOCALLAB_ORRETISTREN_TOOLTIP;1次ラプラシアンのしきい値に作用します。設定値を高くするほど、コントラストの違いが減少します TP_LOCALLAB_PASTELS2;自然な彩度 -TP_LOCALLAB_PDE;PDE IPOL - ダイナミックレンジ圧縮 +TP_LOCALLAB_PDE;コントラストの減衰 - ダイナミックレンジ圧縮 TP_LOCALLAB_PDEFRA;コントラストの減衰 ƒ TP_LOCALLAB_PDEFRAME_TOOLTIP;RawtherapeeはPDE IPOLのアルゴリズムを採用しています : 異なる効果が期待できますが、メインの露光補正機能とは異なる設定が必要です。\n露出不足やハイダイナミックレンジの画像の補正に便利でしょう +TP_LOCALLAB_PRECAMGAMUT_TOOLTIP;このオプションを有効した場合は、XYZマトリクスへの一次変換直後に色域が抑制されます。 +TP_LOCALLAB_PRECAMREFIMAIN_TOOLTIP;ホワイトポイントを主体色に近づけることが出来ます。彩度が変わります。“シフトx”と“シフトy”の組み合わせにより、穏やかなカラートーン調整が可能です。 +TP_LOCALLAB_PRECAMREFI_TOOLTIP;ホワイトポイントを主体色に近づけることが出来ます。彩度が変わります。 +TP_LOCALLAB_PRECAM_TOOLTIP;この‘元データの調整’機能で:a)対数符号化を使ったダイナミックレンジの圧縮、b)CIECAMの処理を行う前の画像全体のトーン、原色(単純化したアブストラクトプロファイルを使用)、及び中間トーンの調整を行うことが出来ます。各パラメータ:\nガンマは主に明るいトーンに作用し、スロープは暗いトーンに作用します。\nガンマとスロープ(両パラメータ>1)を併用することで、アルゴリズムがトーンカーブの線形部分と非線形部分の連続性を保ちます。\n\n\n変更先の原色:これを使うと画像の色(彩度)を復元或いは変更するための変更先の原色を変えることが出来ます。‘作業プロファイル’と‘変更先の原色’の違いが極端に大きくなければ、カラーバランスは十分に保たれます。作業プロファイルは変更されません。\n原色と光源(ホワイトポイント)をかなり正確に順応させることが可能です。\nホワイトポイントから原色を離すほど画像の彩度が下がります。その逆も然りですが色域には注意を必要とします。 TP_LOCALLAB_PREVHIDE;基本的な設定項目だけを表示 -TP_LOCALLAB_PREVIEW;ΔEのプレビュー +TP_LOCALLAB_PREVIEW;プレビューΔE TP_LOCALLAB_PREVSHOW;全ての設定項目を表示 +TP_LOCALLAB_PRIMILLFRAME;原色 & 光源 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_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_RECOTHRES02_TOOLTIP;“回復のしきい値”が1より大きい場合は、“マスクと修正”に付属するマスクは、その前に画像に対して行われた全ての調整を考慮しますが、現在のツールで行われた調整(例、色と明るさや、ウェーブレット、CAM16、など)は考慮しません。\n“回復のしきい値”が1より小さい場合は、“マスクと修正”に付属するマスクは、その前に画像に対して行われた全ての調整を考慮しません。\n\nどちらの場合も、“回復のしきい値”は現在のツール(例、色と明るさや、ウェーブレット、CAM16、など)で調整されたマスクされた画像に作用します。 TP_LOCALLAB_RECT;長方形 TP_LOCALLAB_RECURS;基準値を繰り返し更新 TP_LOCALLAB_RECURS_TOOLTIP;各機能の適用後に基準値を強制的に再計算させる機能です\nマスクを使った作業にも便利です @@ -3200,7 +3443,7 @@ TP_LOCALLAB_REPARSH_TOOLTIP;元画像に関するシャドウ/ハイライトと TP_LOCALLAB_REPARTM_TOOLTIP;元画像に関するトーンマッピングの構成の相対的強さを調整出来るようにします。 TP_LOCALLAB_REPARW_TOOLTIP;元画像に関するローカルコントラストとウェーブレットの構成の相対的強さを調整出来るようにします。 TP_LOCALLAB_RESID;残差画像 -TP_LOCALLAB_RESIDBLUR;残差画像をぼかす +TP_LOCALLAB_RESIDBLUR;残差画像のぼかし TP_LOCALLAB_RESIDCHRO;残差画像の色度 TP_LOCALLAB_RESIDCOMP;残差画像の圧縮 TP_LOCALLAB_RESIDCONT;残差画像のコントラスト @@ -3217,7 +3460,7 @@ TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;'明度=1'或いは'暗さ=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_RETI_SCALE_TOOLTIP;スケールが1の時は、レティネックスはローカルコントラストを調整した様な効果になります\nスケールの値を増やすと回帰作用が強化されますが、その分処理時間も増加します TP_LOCALLAB_RET_TOOLNAME;霞除去 & レティネックス TP_LOCALLAB_REWEI;再加重平均の繰り返し TP_LOCALLAB_RGB;RGB トーンカーブ @@ -3225,6 +3468,7 @@ TP_LOCALLAB_RGBCURVE_TOOLTIP;RGBモードには4つの選択肢があります TP_LOCALLAB_ROW_NVIS;非表示 TP_LOCALLAB_ROW_VIS;表示 TP_LOCALLAB_RSTPROTECT_TOOLTIP;レッドと肌色の保護は、彩度や色度、鮮やかさのスライダー調整に影響します。 +TP_LOCALLAB_SATCIE;彩度の制御 TP_LOCALLAB_SATUR;彩度 TP_LOCALLAB_SATURV;彩度S TP_LOCALLAB_SCALEGR;スケール @@ -3259,49 +3503,73 @@ 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_SHOWC;マスクと修正 TP_LOCALLAB_SHOWC1;ファイルの融合 -TP_LOCALLAB_SHOWCB;マスクと修正領域 +TP_LOCALLAB_SHOWCB;マスクと修正 TP_LOCALLAB_SHOWDCT;フーリエの処理を表示 -TP_LOCALLAB_SHOWE;マスクと修正領域 +TP_LOCALLAB_SHOWE;マスクと修正 TP_LOCALLAB_SHOWFOURIER;フーリエ (DCT) TP_LOCALLAB_SHOWLAPLACE;Δ ラプラシアン (一次) -TP_LOCALLAB_SHOWLC;マスクと修正領域 +TP_LOCALLAB_SHOWLC;マスクと修正 TP_LOCALLAB_SHOWMASK;マスクの表示 -TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;マスクと修正箇所の表示:\n注意:一度に一つの機能のマスクしか見ることが出来きません\n調整及び修正した画像:機能による調整とマスクによる修正の両方を含む画像を表示\n修正領域をマスクなしで表示:マスクを適用する前の修正領域を表示\n修正領域をマスクと共に表示:マスクを適用した修正領域を表示\nマスクの表示:カーブやフィルタの効果を含めたマスクの様子を表示します\nスポットの構造を表示:'スポットの構造'スライダー(機能水準が高度の場合)が有効になった時に、構造検出マスクを見ることが出来ます\n注意:形状検出のアルゴリズムが作用する前にマスクが適用されます +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_SHOWMASKTYP1;ぼかし&ノイズ TP_LOCALLAB_SHOWMASKTYP2;ノイズ除去 -TP_LOCALLAB_SHOWMASKTYP3;ぼかし&ノイズ除去 + ノイズ除去 -TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;‘マスクと修正領域’と併せて使うことが出来ます。\n‘ぼかしとノイズ’を選択した場合、マスクはノイズ除去には使えません。\n‘ノイズ除去を選択した場合、マスクは’ぼかしとノイズ‘には使えません。\n’ぼかしとノイズ + ノイズ除去‘を選択した場合は、マスクを共有することが出来ます。但し、この場合、’ぼかしとノイズ‘とノイズ除去のスコープスライダーが有効となるので、修正を行う際には’マスクと共に修正領域を表示‘のオプションを使うことを奨めます。 -TP_LOCALLAB_SHOWMNONE;調整及び修正した画像 +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_SHOWPLUS;マスクと修正(ぼかし&ノイズ) TP_LOCALLAB_SHOWPOISSON;ポアソン (pde f) -TP_LOCALLAB_SHOWR;マスクと修正領域 -TP_LOCALLAB_SHOWREF;ΔEのプレビュー -TP_LOCALLAB_SHOWS;マスクと修正領域 +TP_LOCALLAB_SHOWR;マスクと修正 +TP_LOCALLAB_SHOWREF;プレビューΔE +TP_LOCALLAB_SHOWS;マスクと修正 TP_LOCALLAB_SHOWSTRUC;スポットの構造を表示 TP_LOCALLAB_SHOWSTRUCEX;スポットの構造を表示 -TP_LOCALLAB_SHOWT;マスクと修正領域 -TP_LOCALLAB_SHOWVI;マスクと修正領域 +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_SIGBLACKSSCIE;ブラックの分布 +TP_LOCALLAB_SIGCIE;シグモイド +TP_LOCALLAB_SIGFRA;シグモイドQ +TP_LOCALLAB_SIGGAMJCIE;ガンマ +TP_LOCALLAB_SIGJZFRA;シグモイド Jz TP_LOCALLAB_SIGMAWAV;減衰応答 +TP_LOCALLAB_SIGMOID16_TOOLTIP;‘CIECAM’と‘シグモイドQ’を併用することで、トーンマッピングに似た効果を出せます。\nシグモイドQの3つのスライダー:a)コントラストはシグモイドのカーブ形状に作用し強さを調整します、b)しきい値(グレーポイント)は輝度に応じた作用の配分を調整します、c)順応性は内部の指数関数に作用することでシグモイドの作用に重みをかけます。 TP_LOCALLAB_SIGMOIDBL;ブレンド TP_LOCALLAB_SIGMOIDLAMBDA;コントラスト -TP_LOCALLAB_SIGMOIDQJ;ブラックEvとホワイトEvを使う +TP_LOCALLAB_SIGMOIDLOGAUTO;自動のしきい値 +TP_LOCALLAB_SIGMOIDLOGEV_TOOLTIP;コンボボックスによる選択で、‘ブラックEvとホワイトEv’が‘シグモイドのみ’ではなく、‘シグモイドと対数符号化’の場合は、2つのアルゴリズム、‘対数符号化’と‘シグモイド’の双方が併用して使われます。 +TP_LOCALLAB_SIGMOIDNORMCIE;輝度の標準化 +TP_LOCALLAB_SIGMOIDNORMCIEBLEND_TOOLTIP;ブレンドで画像の最終面、コントラスト及び輝度に作用する元画像と出力画像の比率を決めます。 +TP_LOCALLAB_SIGMOIDNORMCIE_TOOLTIP;元画像の輝度の平均と分散を考慮することで輝度の復元を行います。\nシグモイドQに関連がない調整も含め、J或いはQに作用する全ての調整が考慮されます。 +TP_LOCALLAB_SIGMOIDQJ;ブラックEvとホワイトEv +TP_LOCALLAB_SIGMOIDQJCOMPRCIE_TOOLTIP;コンボボックスからの選択で、‘ブラックEvとホワイトEvを使う’が、‘シグモイドと対数符号化Q’、或いは‘シグモイドの代わりに対数符号化’にチェックが入っている場合は、このアルゴリズムはしきい値の設定値以上のデータを圧縮します。この最後の値は明るさQを表していて、考えられる‘圧縮のしきい値’ (‘自動のしきい値にチェックが入っている場合に算出され、多くの場合1より大きい)に近くなるべきです。 +TP_LOCALLAB_SIGMOIDSENSI;順応性 TP_LOCALLAB_SIGMOIDTH;しきい値(グレーポイント) -TP_LOCALLAB_SIGMOID_TOOLTIP;'CIECAM'(或いは’Jz)と'シグモイド'関数を使って、トーンマッピングの様な効果を作ることが出来ます。\n3つのスライダーを使います: a) コントラストのスライダーはシグモイドの形状を変えることで強さを変えます。 b) しきい値(グレーポイント)のスライダーは、輝度に応じて作用を変えます。 c)ブレンドは画像の最終的なコントラストや輝度を変えます。 +TP_LOCALLAB_SIGMOIDWHITESCIE_TOOLTIP;画像のダイナミックレンジが高い場合、非常に明るい部分の分布と非常に暗い部分の分布を自動で調整することが出来ます。\n対数符号化、或いはブラックEvとホワイトEvを有効にしたシグモイドで使うことが出来ます。\n\nアルゴリズムが元のデータを変えることはありませんが、ダイナミックレンジ、ブラックEv、ホワイトEv、及びグレーポイントを計算する際に必要な構成要素に作用します。 +TP_LOCALLAB_SIGMOID_TOOLTIP;'Jz’と'シグモイド'関数を使って、トーンマッピングに似た効果を出せます。\n3つのスライダーを使います: a) コントラストのスライダーはシグモイドの形状を変えることで強さを変えます。 b) しきい値(グレーポイント)のスライダーは、輝度に応じて作用を変えます。 c)ブレンドは画像の最終的なコントラストや輝度を変えます。 +TP_LOCALLAB_SIGSLOPJCIE;スロープ +TP_LOCALLAB_SIGTRCCIE;元データの調整 +TP_LOCALLAB_SIGWHITESCIE;ホワイトの分布 TP_LOCALLAB_SLOMASKCOL;スロープ TP_LOCALLAB_SLOMASK_TOOLTIP;ガンマとスロープを調整することで、不連続を避けるための“L”の漸進的修正により、アーティファクトの無いマスクの修正が出来ます +TP_LOCALLAB_SLOPESMOOTH;グレーバランス(スロープ) +TP_LOCALLAB_SLOPESMOOTHB;ブルーのバランス(スロープ) +TP_LOCALLAB_SLOPESMOOTHG;グリーンのバランス(スロープ) +TP_LOCALLAB_SLOPESMOOTHR;レッドのバランス(スロープ) TP_LOCALLAB_SLOSH;スロープ +TP_LOCALLAB_SMOOTHCIE;ハイライトの減衰 +TP_LOCALLAB_SMOOTHCIE_LUM;明るさのモード +TP_LOCALLAB_SMOOTHCIE_SCA;場面のYbの尺度 +TP_LOCALLAB_SMOOTHCIE_TOOLTIP;ガンマ、スロープ及び中間トーンにより実行された処理の効果を滑らかにするもので、明るさが若干下がります。但し、これはハイライトの復元機能の代わりにはなりません。\n\nガンマとスロープの調整は以下に示す調整と合わせればトーンマッピングに似た効果をもたらします。a)場面条件のブラックEvとホワイトEv、平均輝度(Yb%)、b)観視条件の平均輝度(Yb%)。\n場面のYbの尺度はホワイトEvに応じて決まります。 +TP_LOCALLAB_SMOOTHCIE_YB;観視条件のYbの尺度 TP_LOCALLAB_SOFT;ソフトライト & 独自のレティネックス TP_LOCALLAB_SOFTM;ソフトライト TP_LOCALLAB_SOFTMETHOD_TOOLTIP;独自のレティネックスは他のレティネックス方式とは大きく異なります\nグレーと輝度のバランスに作用します @@ -3313,7 +3581,7 @@ TP_LOCALLAB_SOURCE_ABS;絶対輝度 TP_LOCALLAB_SOURCE_GRAY;平均輝度(Y%) TP_LOCALLAB_SPECCASE;特有の設定 TP_LOCALLAB_SPECIAL;RGBカーブの特殊な利用 -TP_LOCALLAB_SPECIAL_TOOLTIP;チェックボックスに✔を入れると、他の全ての作用が取り除かれます。例えば、“スコープ”, マスク, スライダーなどの作用(境界を除きます) が除かれRGBトーンカーブの効果だけが使われます +TP_LOCALLAB_SPECIAL_TOOLTIP;チェックボックスに✔を入れると、他の全ての作用が取り除かれます。例えば、“スコープ”, マスク, スライダーなどの作用(境界を除きます) が除かれRGBトーンカーブの効果だけが使われます TP_LOCALLAB_SPOTNAME;新しいスポット TP_LOCALLAB_STD;標準 TP_LOCALLAB_STR;強さ @@ -3323,19 +3591,21 @@ TP_LOCALLAB_STRENG;強さ TP_LOCALLAB_STRENGR;強さ TP_LOCALLAB_STRENGRID_TOOLTIP;望む効果は'強さ'で調整出来ますが、作用の範囲を制限する'スコープ'を使うことも出来ます。 TP_LOCALLAB_STRENGTH;ノイズ +TP_LOCALLAB_STRENGTHCIELOG;強さ TP_LOCALLAB_STRGRID;強さ TP_LOCALLAB_STRUC;構造 TP_LOCALLAB_STRUCCOL;スポットの構造 TP_LOCALLAB_STRUCCOL1;スポットの構造 -TP_LOCALLAB_STRUCT_TOOLTIP;形状検出に関する構造を考慮するSobelアルゴリズムを使います.\n'マスクと修正領域'を有効にして、マスクのプレビュー(変更なし)を見るために'スポットの構造を表示'を有効にします\n\nエッジ検出の精度を上げるため、構造マスク、ぼかしマスク、ローカルコントラスト(ウェーブレットのレベル)と共に使うことが出来ます\n\n明るさ、コントラスト、色度、露光補正、或いはマスクに関係しない機能を使った調整効果は、'調整及び修正した画像'、或いは'修正された領域をマスクと共に表示'で、見ることが出来ます +TP_LOCALLAB_STRUCT_TOOLTIP;形状検出に関する構造を考慮するSobelアルゴリズムを使います.\n'マスクと修正'を有効にして、マスクのプレビュー(変更なし)を見るために'スポットの構造を表示'を有効にします\n\nエッジ検出の精度を上げるため、構造マスク、ぼかしマスク、ローカルコントラスト(ウェーブレットのレベル)と共に使うことが出来ます\n\n明るさ、コントラスト、色度、露光補正、或いはマスクに関係しない機能を使った調整効果は、'修正された画像を表示'、或いは'修正された領域をマスクと共に表示'で、見ることが出来ます TP_LOCALLAB_STRUMASKCOL;構造マスクの強さ -TP_LOCALLAB_STRUMASK_TOOLTIP;“機能としての構造のマスク”オプションを無効のままで構造のマスク(スライダー)を使う:この場合、3つのカーブが活用されていなくても、構造を表示するマスクが生成されます。構造のマスクはマスク1(ぼかしとノイズ除去)とマスク7(色と明るさ)で使えます +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_TE_PIVOT;ピボット(Ev) TP_LOCALLAB_THRES;しきい値の構造 TP_LOCALLAB_THRESDELTAE;ΔE-スコープのしきい値 TP_LOCALLAB_THRESRETI;しきい値 @@ -3355,17 +3625,18 @@ 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_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_TRCFRAME;トーンリプロダクションカーブ & 中間トーン +TP_LOCALLAB_USEMASK;ラプラス作用素 TP_LOCALLAB_VART;分散(コントラスト) TP_LOCALLAB_VIBRANCE;自然な彩度 & ウォーム/クール TP_LOCALLAB_VIBRA_TOOLTIP;自然な彩度を調整する機能です(基本的にはメインの自然な彩度と同じです)\nCIECAMのアルゴリズムを使ったホワイトバランス調整と同等の作用をします @@ -3401,11 +3672,11 @@ TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;X軸は右側ほどローカルコントラス TP_LOCALLAB_WAT_WAVTM_TOOLTIP;各レベルの圧縮カーブを中央より下げる(マイナス)とトーンマッピングのような効果になります。\n中央より上では(プラス)、レベルのコントラストが減衰します。\nX軸は左から右に向って、大きなディテールのレベルを表しています。 TP_LOCALLAB_WAV;ローカルコントラスト TP_LOCALLAB_WAVBLUR_TOOLTIP;分解された各レベル、及び残差画像にぼかしをかけます -TP_LOCALLAB_WAVCOMP;ウェーブレットのレベルによる圧縮 -TP_LOCALLAB_WAVCOMPRE;ウェーブレットのレベルによる圧縮 +TP_LOCALLAB_WAVCOMP;ウェーブレットのレベルの圧縮 +TP_LOCALLAB_WAVCOMPRE;ウェーブレットのレベルの圧縮 TP_LOCALLAB_WAVCOMPRE_TOOLTIP;トーンマッピングを適用する、或いは各レベルのローカルコントラストを減らすことが出来ます。\nX軸は左から右に向って、大きなディテールのレベルを表しています。 TP_LOCALLAB_WAVCOMP_TOOLTIP;ウェーブレット分解の方向(水平、垂直、斜め)をベースにローカルコントラストを適用します。 -TP_LOCALLAB_WAVCON;ウェーブレットのレベルによるコントラスト調整 +TP_LOCALLAB_WAVCON;レベルによるコントラスト調整 TP_LOCALLAB_WAVCONTF_TOOLTIP;”詳細レベルによるコントラスト調整”に似ています。X軸の右側ほど大きいディテールのレベルを意味します。 TP_LOCALLAB_WAVDEN;輝度ノイズ除去 TP_LOCALLAB_WAVE;ウェーブレット @@ -3414,7 +3685,7 @@ TP_LOCALLAB_WAVEEDG_TOOLTIP;エッジに対するローカルコントラスト TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;’ローカルコントラスト’で使うウェーブレットのレベルの範囲 TP_LOCALLAB_WAVGRAD_TOOLTIP;設定した階調と角度に応じて、ローカルコントラストが変わるようにします。輝度値ではなく、輝度値の差を考慮しています。 TP_LOCALLAB_WAVHUE_TOOLTIP;色相に基づいてノイズ除去の強弱を加減できます。 -TP_LOCALLAB_WAVLEV;ウェーブレットのレベルによるぼかし +TP_LOCALLAB_WAVLEV;ウェーブレットのレベルのぼかし TP_LOCALLAB_WAVMASK;ローカルコントラスト TP_LOCALLAB_WAVMASK_TOOLTIP;マスクのローカルコントラストを変えるためにウェーブレットを使い、構造(肌、建物など)を強化したり弱めたりします TP_LOCALLAB_WEDIANHI;メディアン 高 @@ -3431,7 +3702,7 @@ TP_METADATA_MODE;メタデータ コピーモード TP_METADATA_STRIP;メタデータを全て取り除く TP_METADATA_TUNNEL;変更なしでコピー TP_NEUTRAL;リセット -TP_NEUTRAL_TIP;露光量補正のスライダー値をニュートラルにリセットします。\n自動露光補正の調整値ついても同様にリセットされます +TP_NEUTRAL_TOOLTIP;露光量補正のスライダー値をニュートラルにリセットします。\n自動露光補正の調整値ついても同様にリセットされます TP_PCVIGNETTE_FEATHER;フェザー TP_PCVIGNETTE_FEATHER_TOOLTIP;フェザー: 0=四隅だけ、50=中央までの半分、100=中央まで TP_PCVIGNETTE_LABEL;ビネットフィルター @@ -3732,6 +4003,16 @@ TP_TM_FATTAL_AMOUNT;量 TP_TM_FATTAL_ANCHOR;アンカー TP_TM_FATTAL_LABEL;ダイナミックレンジ圧縮 TP_TM_FATTAL_THRESHOLD;ディテール +TP_TONE_EQUALIZER_BANDS;バンド +TP_TONE_EQUALIZER_BAND_0;ブラック +TP_TONE_EQUALIZER_BAND_1;シャドウ +TP_TONE_EQUALIZER_BAND_2;中間トーン +TP_TONE_EQUALIZER_BAND_3;ハイライト +TP_TONE_EQUALIZER_BAND_4;ホワイト +TP_TONE_EQUALIZER_DETAIL;円滑化 +TP_TONE_EQUALIZER_LABEL;トーンイコライザ +TP_TONE_EQUALIZER_PIVOT;ピボット(Ev) +TP_TONE_EQUALIZER_SHOW_COLOR_MAP;トーンの配分を表示 TP_VIBRANCE_AVOIDCOLORSHIFT;色ずれを回避 TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;肌色トーン @@ -3983,7 +4264,7 @@ TP_WAVELET_STRENGTH;強さ TP_WAVELET_SUPE;エキストラ TP_WAVELET_THR;シャドウのしきい値 TP_WAVELET_THRDEN_TOOLTIP;ローカルコントラストに応じたノイズ除去の目安に使うため、ステップカーブを作成します。ノイズ除去がコントラストの低い均一な画質部分に適用されます。詳細がある部分(コントラストが高い)は保持されます。 -TP_WAVELET_THREND;ローカルコントラストのしきい値 +TP_WAVELET_THREND;ローカルコントラストのしきい値 TP_WAVELET_THRESHOLD;調整レベル(小さいディテール) TP_WAVELET_THRESHOLD2;調整レベル(大きいディテール) TP_WAVELET_THRESHOLD2_TOOLTIP;設定値より上のレベルだけが、大きなディテールのレベルの輝度範囲で設定された条件で調整されます。 @@ -4035,6 +4316,45 @@ TP_WBALANCE_FLUO_HEADER;蛍光灯 TP_WBALANCE_GREEN;色偏差 TP_WBALANCE_GTI;GTI TP_WBALANCE_HMI;HMI +TP_WBALANCE_ITCWALG_TOOLTIP;可能であれば、別な代替え色温度に切り替えることが出来ます。\n“単一の選択”の場合は出来ません。 +TP_WBALANCE_ITCWBDELTA_TOOLTIP;“色偏差”の繰り返し計算の際に固定されます。色温度の違いは考慮されます。 +TP_WBALANCE_ITCWBFGREEN_TOOLTIP;スチューデントの検定結果と色編間の最良の妥協点を探ります。 +TP_WBALANCE_ITCWBMINSIZEPATCH_TOOLTIP;最小パッチの値の設定が可能です。設定値が小さ過ぎると相関関係の欠如につながることがあります。 +TP_WBALANCE_ITCWBNOPURPLE_TOOLTIP;マゼンタ/パープルの色データを画像から取り除くことが出来ます。このオプションを有効にすると、Y値を制限するフィルタが適用されます。デフォルトではこの値が0.4に設定されています。変更は‘オプション‘ファイルの‘Itcwb Ypurple‘(最大値1)で行います。 +TP_WBALANCE_ITCWBPRECIS_TOOLTIP;値が低いほど処理に係るデータが増え処理時間が長くなりますが、元々処理時間は短いので、普通はデフォルトで設定されている低い設定値で構わないでしょう。 +TP_WBALANCE_ITCWBRGREEN_TOOLTIP;繰り返し計算における色偏差値の評価の幅です。低幅の場合は0.82から1.25、最大幅は0.4から4.0になります。 +TP_WBALANCE_ITCWBSIZEPATCH_TOOLTIP;アルゴリズムが使用するカラーデータの大きさを設定するものです。 +TP_WBALANCE_ITCWBSIZE_TOOLTIP;参考スペクトルカラーと画像の色のxyY値との間で最良の対応を探るための繰り返し計算の回数を設定します。設定値3が程好い妥協点と思われます。 +TP_WBALANCE_ITCWBTHRES_TOOLTIP;スペクトルデータと画像データの間の比較のサンプリングを制限します。 +TP_WBALANCE_ITCWB_ALG;2工程アルゴリズムを除外 +TP_WBALANCE_ITCWB_CUSTOM;独自の色温度と色偏差を使用 +TP_WBALANCE_ITCWB_DELTA;色偏差のループにおけるΔ色温度 +TP_WBALANCE_ITCWB_FGREEN;色偏差のスチューデント検定を探す +TP_WBALANCE_ITCWB_FORCED;CIEダイヤグラムと概ね同じ範囲 +TP_WBALANCE_ITCWB_FRA;自動色温度相関関係の設定 +TP_WBALANCE_ITCWB_FRA_TOOLTIP;画像(rawの形式、測色など)に応じて、これらの設定で‘色温度の相関関係‘アルゴリズムの適応を可能にします。最良の結果を得るためのパラメータ調整に特別な法則はありません。 +TP_WBALANCE_ITCWB_MINSIZEPATCH;最小のパッチサイズ +TP_WBALANCE_ITCWB_NOPURPLE;パープルのフィルタ +TP_WBALANCE_ITCWB_PRECIS;精度の高いアルゴリズム - スケールを使用 +TP_WBALANCE_ITCWB_PRIM_ACE;CIEダイヤグラム全体を使うことを強制する +TP_WBALANCE_ITCWB_PRIM_ADOB;ミディアムサンプリング +TP_WBALANCE_ITCWB_PRIM_BETA;ミディアムサンプリング - ポインターん色域に近い +TP_WBALANCE_ITCWB_PRIM_JDCMAX;完全なCIEダイヤグラムに近い +TP_WBALANCE_ITCWB_PRIM_REC;ハイサンプリング +TP_WBALANCE_ITCWB_PRIM_SRGB;ローサンプリングを使用、カメラの設定を無視する +TP_WBALANCE_ITCWB_PRIM_XYZCAM;カメラのXYZマトリクス +TP_WBALANCE_ITCWB_PRIM_XYZCAM2;カメラのXYZマトリクス後のJDCmax +TP_WBALANCE_ITCWB_RGREEN;色偏差の範囲 +TP_WBALANCE_ITCWB_SAMPLING;ローサンプリング 5.9 +TP_WBALANCE_ITCWB_SIZE;ヒストグラムと比較した参考色の大きさ +TP_WBALANCE_ITCWB_SIZEPATCH;カラーパッチの大きさ +TP_WBALANCE_ITCWB_THRES;画像に使われている色(プリセット) +TP_WBALANCE_ITCWCUSTOM_TOOLTIP;色温度と色偏差の独自設定が可能です。\n\n 利用のためのヒント:\n 1)Itcwbを選択し、‘独自の色温度と色偏差‘有効にする。\n 2)好みの色温度と色偏差を設定:自由、ピック。。。(独自)\n 3)‘色温度の相関関係‘に戻る。\n\n これを使用する場合は、2工程のアルゴリズム、自動色温度バイアス、色偏差の微調整は使えません。 +TP_WBALANCE_ITCWFORCED_TOOLTIP;デフォルトでは(ボックスにチェックが入っていない状態)、サンプリングの際にスキャンされたデータは、DCPのキャリブレーション、ICCプロファイル、カラーチェッカー24、ウェブサイトなどに幅広く使われるsRGBプロファイルに戻されます。\n 色域が非常に広い画像(花や人口色)の場合、CIExyダイヤグラム全体を使う必要があるかもしれません。その場合はプロファイルにACESP0が使われるでしょう。後者のケースでは、アルゴリズムに対し内部で使われる色の数がより重要になります。 +TP_WBALANCE_ITCWGREEN;色偏差の微調整 +TP_WBALANCE_ITCWGREEN_TOOLTIP;この機能は、アルゴリズムをスタートさせる際の参考地となる“色偏差”の変更を可能にするものです。“自動ホワイトバランスの色温度 バイアス”とほぼ同じ働きを色編に対して及ぼします。\n 変更を行うとアルゴリズムは計算を最初からやり直します。 +TP_WBALANCE_ITCWPRIM_TOOLTIP;画像サンプリングの選択が出来ます。\n ‘CIEダイヤグラムに近いサンプリング‘ これはカメラの撮像センサーが捉えたデータの殆どを対象としますが、想像上の色が含まれるかもしれません。\n ‘カメラのXYZマトリクス‘ カラーマトリクスから直接的に導いたマトリクスです。\n ミディアムサンプリング(デフォル)‐ポインターの色域に近いものです:人間の視覚に非常に近い色域です。\n 他にも‘ローサンプリング‘と‘カメラの設定を無視‘という選択肢があります。これらは画像の色度が高い部分を計算に入れない、または色偏差が0.8より大きい場合に、カメラの設定を無視しますので、結果にそれなりの影響だ出ます。\n\nこれらサンプリングはチャンネル乗数だけに影響するもので、‘作業プロファイル‘には影響せず、画像の色域を変えることもありません。 +TP_WBALANCE_ITCWSAMPLING_TOOLTIP;バージョン5.9との互換性が良い古いサンプリングアルゴリズムを使うことが出来ます。標準観測者10°のオプションは有効にしておきます(デフォルト)。 TP_WBALANCE_JUDGEIII;JudgeIII TP_WBALANCE_LABEL;ホワイトバランス TP_WBALANCE_LAMP_HEADER;ランプ @@ -4042,6 +4362,14 @@ TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 TP_WBALANCE_LED_HEADER;LED TP_WBALANCE_LED_LSI;LSI Lumelex 2040 TP_WBALANCE_METHOD;方式 +TP_WBALANCE_MULLABEL;乗数: レッド=%1 グリーン=%2 ブルー=%3 +TP_WBALANCE_MULLABEL_TOOLTIP;乗数は情報として表示されるだけで、変更は出来ません。 +TP_WBALANCE_OBSERVER10;標準観測者2°の代わりに標準観測者10°を使用 +TP_WBALANCE_OBSERVER10_TOOLTIP;RawTherapeeのカラーマネジメント(ホワイトバランス、チャンネル乗数、ハイライト復元。。。)では、光源や色のスペクトルデータを使っています。目の知覚角度を考慮する標準観測者は、カラーマネジメントの重要な変数の一つです。1931年、その角度は2°に固定されましたが(目の錐体を優先)、1964年になると10°(錐体が優先されるが、桿体も部分的に考慮する)が使われるようになりました。\n稀に”標準観測者2°で色ずれが生じた時は(恐らく変換マトリクスに起因する)、”標準観測者10°”に切り替えて下さい。 +TP_WBALANCE_PATCHLABEL;色の読み込み=%1 色のパッチ=%2 サイズ=%3 +TP_WBALANCE_PATCHLABEL_TOOLTIP;読み込んだ色の数を表示します(最大237個)。\n 算出されたパッチの色度を表示します。\n 自動ホワイトバランスの色温度バイアスの値を下げてみて下さい。最低値を設定するとアルゴリズムが最適になるようです。\n パッチサイズは色度の最適化につながります。 +TP_WBALANCE_PATCHLEVELLABEL;パッチ: ΔE=%1 - データ x 9 最小値=%2 最大値=%3 +TP_WBALANCE_PATCHLEVELLABEL_TOOLTIP;画像とスペクトルデータ間のΔEパッチ(十分なスペクトルデータがあるという前提で)を表示します。\n 見つけたデータを表示します。これら2つの値はそれぞれ考慮される最小値と最大値を示しています。画像の関係するピクセル数を得るために、係数x9の値は考慮されなければなりません。 TP_WBALANCE_PICKER;ピック TP_WBALANCE_SHADE;日陰 TP_WBALANCE_SIZE;サイズ: @@ -4050,8 +4378,9 @@ TP_WBALANCE_SOLUX41;Solux 4100K TP_WBALANCE_SOLUX47;Solux 4700K (vendor) TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) 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_STUDLABEL;相関関係:%1 工程:%2 悪い入れ替え:%3 +TP_WBALANCE_STUDLABEL1;相関関係:%1 工程:%2 最適な入れ替え:%3 +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_TEMPERATURE;色温度 @@ -4071,177 +4400,18 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -!ERROR_MSG_METADATA_VALUE;Metadata: error setting %1 to %2 -!EXIFFILTER_PATH;File path -!EXIFPANEL_ACTIVATE_ALL_HINT;Select all tags -!EXIFPANEL_ACTIVATE_NONE_HINT;Unselect all tags -!EXIFPANEL_BASIC_GROUP;Basic -!EXIFPANEL_VALUE_NOT_SHOWN;Not shown -!FILEBROWSER_POPUPSORTBY;Sort Files -!FILECHOOSER_FILTER_EXECUTABLE;Executable files -!GENERAL_OTHER;Other -!HISTORY_MSG_DIRPYRDENOISE_GAIN;NR - Compensate for lightness -!HISTORY_MSG_FF_FROMMETADATA;Flat-Field - From Metadata -!HISTORY_MSG_GAMUTMUNSEL;Gamut-Munsell -!HISTORY_MSG_HLTH;Inpaint opposed - gain threshold -!HISTORY_MSG_ICM_GAMUT;Gamut control -!HISTORY_MSG_LOCALLAB_TE_PIVOT;Local - Equalizer pivot -!HISTORY_MSG_LOCAL_GAMUTMUNSEL;Local - SC - Avoid Color Shift -!HISTORY_MSG_LOCAL_TMO_SATUR;Local Exp Fattal Saturation -!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_WBALANCE_OBSERVER10;Observer 10° -!HISTORY_MSG_WBITC_CUSTOM;Itcwb Custom -!HISTORY_MSG_WBITC_DELTA;Itcwb Delta green -!HISTORY_MSG_WBITC_FGREEN;Itcwb Green - student -!HISTORY_MSG_WBITC_FORCE;Itcwb Force -!HISTORY_MSG_WBITC_GREEN;Green refinement -!HISTORY_MSG_WBITC_MINSIZE;Patch min size -!HISTORY_MSG_WBITC_NOPURPLE;Itcwb Nopurple -!HISTORY_MSG_WBITC_OBS;Remove algo 2 passes -!HISTORY_MSG_WBITC_PONDER;Itcwb ponderated -!HISTORY_MSG_WBITC_PRECIS;Itcwb Precision -!HISTORY_MSG_WBITC_PRIM;Primaries -!HISTORY_MSG_WBITC_RGREEN;Itcwb Green range -!HISTORY_MSG_WBITC_SAMPLING;Low sampling -!HISTORY_MSG_WBITC_SIZE;Itcwb Size -!HISTORY_MSG_WBITC_SORTED;Itcwb ponderated -!HISTORY_MSG_WBITC_THRES;Itcwb Threshold -!PARTIALPASTE_FLATFIELDFROMMETADATA;Flat-field from Metadata -!PARTIALPASTE_TONE_EQUALIZER;Tone equalizer -!PREFERENCES_CAMERAPROFILESDIR;Camera profiles directory -!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_LENSFUNDBDIR;Lensfun database directory -!PREFERENCES_LENSFUNDBDIR_TOOLTIP;Directory containing the Lensfun database. Leave empty to use the default directories. -!PREFERENCES_LENSPROFILESDIR;Lens profiles directory -!PREFERENCES_LENSPROFILESDIR_TOOLTIP;Directory containing Adobe Lens Correction Profiles (LCPs) -!PREFERENCES_METADATA;Metadata -!PREFERENCES_METADATA_SYNC;Metadata synchronization with XMP sidecars -!PREFERENCES_METADATA_SYNC_NONE;Off -!PREFERENCES_METADATA_SYNC_READ;Read only -!PREFERENCES_METADATA_SYNC_READWRITE;Bidirectional -!PREFERENCES_TAB_FAVORITES;Favorites -!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_WBA;White Balance -!PREFERENCES_WBACORR;White Balance - Automatic temperature correlation -!PREFERENCES_WBACORR_TOOLTIP;These settings allow, depending on the images (type of raw file, colorimetry, etc.), an adaptation of the " Temperature correlation " algorithm in order to obtain the best overall results. There is no absolute rule, linking these parameters to the results obtained.\n\nThe settings are of 3 types: \n* those accessible to the user from the GUI.\n* those accessible only in reading from each pp3 file : Itcwb_minsize=20, Itcwb_delta=4 Itcwb_rgreen=1 Itcwb_nopurple=false (See Rawpedia)\n* those accessible to the user in 'options' (see Rawpedia)\n You can use "Awb temperature bias" and "Green refinement" to adjust the results. Each movement of these commands brings a new calculation of temperature, tint and correlation.\n\nPlease note that the 3 indicators 'Correlation factor', 'Patch chroma' and ΔE are given for information only. It is not because one of these indicators is better that the result will necessarily be better. -!PREFERENCES_WBAENA;Show White Balance Auto temperature correlation settings -!PREFERENCES_WBAENACUSTOM;Use Custom temperature & tint -!PREFERENCES_WBAFORC;Forces Extra algoritm -!PREFERENCES_WBAGREENDELTA;Delta temperature in green iterate loop (if Force Extra enabled) -!PREFERENCES_WBANOPURP;No purple color used -!PREFERENCES_WBAPATCH;Number maximum of colors used in picture -!PREFERENCES_WBAPRECIS;Precision algorithm - scale used -!PREFERENCES_WBASIZEREF;Size of reference color compare to size of histogram color -!PREFERENCES_WBASORT;Sort in chroma order instead of histogram -!PREFERENCES_XMP_SIDECAR_MODE;XMP sidecar style -!PREFERENCES_XMP_SIDECAR_MODE_EXT;darktable-like (FILENAME.ext.xmp for FILENAME.ext) -!PREFERENCES_XMP_SIDECAR_MODE_STD;Standard (FILENAME.xmp for FILENAME.ext) -!SAVEDLG_BIGTIFF;BigTIFF (no metadata support) -!SORT_ASCENDING;Ascending -!SORT_BY_DATE;By Date -!SORT_BY_EXIF;By EXIF -!SORT_BY_LABEL;By Color Label -!SORT_BY_NAME;By Name -!SORT_BY_RANK;By Rank -!SORT_DESCENDING;Descending -!TP_COLORAPP_CIECAT_DEGREEOUT;Chromatic Adaptation Viewing -!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_DIRPYRDENOISE_MAIN_AUTO_GAIN;Compensate for lightness -!TP_DIRPYRDENOISE_MAIN_AUTO_GAIN_TOOLTIP;Alter the noise reduction strength based on the image lightness. Strength is reduced for dark images and increased for bright images. -!TP_FILMNEGATIVE_PICK_SIZE;Size: -!TP_FILMNEGATIVE_REF_SIZE;Size: -!TP_FLATFIELD_FROMMETADATA;From Metadata -!TP_HLREC_COLOROPP;Inpaint Opposed -!TP_HLREC_HLTH;Gain threshold -!TP_ICM_GAMUT;Gamut control -!TP_ICM_WORKING_PRIM_JDCMAX;JDC Max -!TP_LOCALLAB_CHRO46LABEL;Chroma levels 456: Mean=%1 High=%2 -!TP_LOCALLAB_CHROLABEL;Chroma levels 0123: Mean=%1 High=%2 -!TP_LOCALLAB_DENOIWAVCH;Wavelets: Chrominance -!TP_LOCALLAB_DENOIWAVLUM;Wavelets: Luminance -!TP_LOCALLAB_FATSAT;Saturation control -!TP_LOCALLAB_GAMUTLABRELA;Lab -!TP_LOCALLAB_GAMUTMUNSELL;Munsell only -!TP_LOCALLAB_GAMUTNON;None -!TP_LOCALLAB_GAMUTXYZABSO;XYZ Absolute -!TP_LOCALLAB_GAMUTXYZRELA;XYZ Relative -!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_LUM46LABEL;Luma levels 456: Mean=%1 High=%2 -!TP_LOCALLAB_LUMLABEL;Luma levels 0123: Mean=%1 High=%2 -!TP_LOCALLAB_TE_PIVOT;Pivot (Ev) -!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_TONE_EQUALIZER_BANDS;Bands -!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_DETAIL;Regularization -!TP_TONE_EQUALIZER_LABEL;Tone Equalizer -!TP_TONE_EQUALIZER_PIVOT;Pivot (Ev) -!TP_TONE_EQUALIZER_SHOW_COLOR_MAP;Show tonal map -!TP_WBALANCE_ITCWALG_TOOLTIP;Allows you to switch to the other Alternative temperature (Alt_temp), when possible.\nInactive in the "single choice" case. -!TP_WBALANCE_ITCWBDELTA_TOOLTIP;Fixed for each "green" iteration tried, the temperature difference to be taken into account. -!TP_WBALANCE_ITCWBFGREEN_TOOLTIP;Find the best compromise between Student and green. -!TP_WBALANCE_ITCWBMINSIZEPATCH_TOOLTIP;Allows you to set the minimum patch value. values that are too low can lead to a lack of correlation. -!TP_WBALANCE_ITCWBNOPURPLE_TOOLTIP;Allows you to filter magenta/purple data from the image. If the box is checked a filter limiting the value of Y is applied. By default this value is 0.4. You can change it in 'options' Itcwb_Ypurple (Maximum 1) -!TP_WBALANCE_ITCWBPRECIS_TOOLTIP;The lower the value, the more relevant the data, but increases the processing time. Since the processing time is low, this parameter should generally be able to remain at the default value -!TP_WBALANCE_ITCWBRGREEN_TOOLTIP;Sets the green value review amplitude in iterations, from low amplitude 0.82 to 1.25 to maximum amplitude 0.4 to 4. -!TP_WBALANCE_ITCWBSIZEPATCH_TOOLTIP;This setting sets the size of color datas used by algorithm. -!TP_WBALANCE_ITCWBSIZE_TOOLTIP;This setting sets the number of iterations to find the best correspondence between the reference spectral colors and those in xyY value of the image. A value of 3 seams a good compromise. -!TP_WBALANCE_ITCWBTHRES_TOOLTIP;Limits comparison sampling between spectral data and image data. -!TP_WBALANCE_ITCWB_ALG;Remove 2 pass algorithm -!TP_WBALANCE_ITCWB_CUSTOM;Use Custom temperature & tint -!TP_WBALANCE_ITCWB_DELTA;Delta temperature in green loop -!TP_WBALANCE_ITCWB_FGREEN;Find green student -!TP_WBALANCE_ITCWB_FORCED;Close to full CIE diagram -!TP_WBALANCE_ITCWB_FRA;Auto temperature correlation settings -!TP_WBALANCE_ITCWB_FRA_TOOLTIP;These settings allow, depending on the images (type of raw, colorimetry, etc.), an adaptation of the 'Temperature correlation' algorithm. There is no absolute rule linking these parameters to the results obtained. -!TP_WBALANCE_ITCWB_MINSIZEPATCH;Patch minimum size -!TP_WBALANCE_ITCWB_NOPURPLE;Filter on purple color -!TP_WBALANCE_ITCWB_PRECIS;Precision algorithm - scale used -!TP_WBALANCE_ITCWB_PRIM_ACE;Forces use of the entire CIE diagram -!TP_WBALANCE_ITCWB_PRIM_ADOB;Medium sampling -!TP_WBALANCE_ITCWB_PRIM_BETA;Medium sampling - near Pointer's gamut -!TP_WBALANCE_ITCWB_PRIM_JDCMAX;Close to full CIE diagram -!TP_WBALANCE_ITCWB_PRIM_REC;High sampling -!TP_WBALANCE_ITCWB_PRIM_SRGB;Low sampling & Ignore Camera settings -!TP_WBALANCE_ITCWB_PRIM_XYZCAM;Camera XYZ matrix -!TP_WBALANCE_ITCWB_PRIM_XYZCAM2;JDCmax after Camera XYZ matrix -!TP_WBALANCE_ITCWB_RGREEN;Green range -!TP_WBALANCE_ITCWB_SAMPLING;Low sampling 5.9 -!TP_WBALANCE_ITCWB_SIZE;Size of ref. color compare to histogram -!TP_WBALANCE_ITCWB_SIZEPATCH;Size of color patch -!TP_WBALANCE_ITCWB_THRES;Colors used in picture (preset) -!TP_WBALANCE_ITCWCUSTOM_TOOLTIP;Allows you to use Custom settings Temperature and Green (tint).\n\nUsage tips:\n1) start Itcwb , enable 'Use Custom temperature and tint'.\n2) Set 'Temperature and tint' to your liking :free, Pick,...(Custom)\n3) go back to 'Temperature correlation'.\n\nYou cannot use : 2 passes, AWB temperature bias, Green refinement. -!TP_WBALANCE_ITCWFORCED_TOOLTIP;By default (box not checked) the data scanned during sampling is brought back to the sRGB profile, which is the most widespread, both for calibrating DCP or ICC profiles with the Colorchecker24, or used on the web.\n If you have very high gamut images (some flowers, artificial colors), then it may be necessary to use the entire CIExy diagram, the profile used will be ACESP0. In this second case, the number of colors that can be used in internal to the algorithm will be more important. -!TP_WBALANCE_ITCWGREEN;Green refinement -!TP_WBALANCE_ITCWGREEN_TOOLTIP;Allows you to change the "tint" (green) which will serve as a reference when starting the algorithm. It has substantially the same role for greens as "AWB temperature bias" for temperature.\nThe whole algorithm is recalculated. -!TP_WBALANCE_ITCWPRIM_TOOLTIP;Allows you to select the image sampling.\n'Close to full CIE diagram' almost uses the data present on the sensor, possibly including the imaginary colors.\n'Camera XYZ matrix' - uses the matrix directly derived from Color Matrix.\n'Medium sampling' (default) - near Pointer's gamut: corresponds substantially to the most common cases of human vision.\nThe other choice 'Low sampling and Ignore camera settings' allow you to isolate high gamut parts of the image and forces the algorithm in some cases (tint > 0.8,...) to ignore camera settings. This will obviously have an impact on the result.\n\nThis sampling only has an influence on the channel multipliers, it has nothing to do with the "working profile" and does not modify the gamut of the image. -!TP_WBALANCE_ITCWSAMPLING_TOOLTIP;Allows you to use the old sampling algorithm to ensure better compatibility with 5.9. You must enable Observer 10° (default). -!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_PATCHLABEL;Read colors:%1 Patch: Chroma:%2 Size=%3 -!TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colors (max=237).\nDisplay calculated Patch Chroma.\nAWB temperature bias, lets try to reduce this value, a minimum may seem to optimize the algorithm.\n\nPatch size matching chroma optimization. -!TP_WBALANCE_PATCHLEVELLABEL;Patch: ΔE=%1 - datas x 9 Min:%2 Max=%3 -!TP_WBALANCE_PATCHLEVELLABEL_TOOLTIP;Display ΔE patch (this assumes there is enough spectral data), between image and spectral datas.\n Display read datas found. The 2 values correspond to the minimum and maximum data values taken into account. The coefficient x9 must be taken into account to obtain the number of pixels concerned in the image. +!HISTORY_MSG_LOCAL_FEATHERCIE;Local - CIECAM Gradient feather +!HISTORY_MSG_LOCAL_FEATHERCOL;Local - Color Gradient feather +!HISTORY_MSG_LOCAL_FEATHEREXE;Local - Exp Gradient feather +!HISTORY_MSG_LOCAL_FEATHERLOG;Local - Log Gradient feather +!HISTORY_MSG_LOCAL_FEATHERMAS;Local - Mask Common gradient feather +!HISTORY_MSG_LOCAL_FEATHERSH;Local - SH Gradient feather +!HISTORY_MSG_LOCAL_FEATHERVIB;Local - Vib Gradient feather +!HISTORY_MSG_LOCAL_FEATHERWAV;Local - Wav Gradient feather +!PREFERENCES_RAW_DECODER;Raw Decoder +!PREFERENCES_RAW_DECODER_ENABLE_LIBRAW;Use LibRaw +!TP_LENSPROFILE_CORRECTION_METADATA;From file metadata +!TP_LOCALLAB_FEATVALUE_MASK;Feather gradient (Grad. Filters Mask) !TP_WBALANCE_STUDLABEL0;Correlation factor: %1 Passes:%2 Alt=%3 -!TP_WBALANCE_STUDLABEL1;Correlation factor: %1 Passes:%2 Best_alt=%3 !//TP_WBALANCE_ITCWBNOPURPLE_TOOLTIP;By default when "Inpaint opposed" is activated, purple colors are not taken into account. However, if the image does not need highlight reconstruction, or if this image naturally contains purple tints (flowers, etc.), it may be necessary to deactivate, to take into account all the colors. !//TP_WBALANCE_ITCWB_FORCED;Forces use of the entire CIE diagram diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index 07ab9784b..f1a425951 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -128,7 +128,6 @@ EXIFPANEL_RESET;Visszaállít EXIFPANEL_RESETALL;Mindent visszaállít EXIFPANEL_RESETALLHINT;Az összes metaadat visszaállítása az eredeti állapotba EXIFPANEL_RESETHINT;A kijelölt adatok visszaállítása az eredeti állapotba -EXIFPANEL_SUBDIRECTORY;Alkönyvtár EXPORT_BYPASS_ALL;Mindent kijelöl/Kijelölés megszüntetése EXPORT_BYPASS_DEFRINGE;Színihiba-korrekció kihagyása EXPORT_BYPASS_DIRPYRDENOISE;Zajszűrés kihagyása @@ -693,9 +692,7 @@ MAIN_BUTTON_NAVNEXT_TOOLTIP;A Szerkesztőben megnyitott képet követő képhez MAIN_BUTTON_NAVPREV_TOOLTIP;A Szerkesztőben megnyitott képet megelőző képhez navigálás.\nGyorsbillentyű: Shift-F3\n\nA Fájl böngészőben vagy Filmszalagban jelenleg kijelölt ikont megelőző képhez navigálás.\nGyorsbillentyű: F3 MAIN_BUTTON_NAVSYNC_TOOLTIP;A Fájl böngészőben vagy Filmszalag szinkronizálása a Szerkesztővel a jelenleg megnyitott kép ikonjának felfedéséért, és minden aktív szűrő törlése.\nGyorsbillentyű: x\n\nMint fentebb, de az aktív szűrők törlése nélkül.\nGyorsbillentyű: y\n(Vedd figyelembe, hogy a megnyitott kép ikonja nem fog megjelenni, amennyiben az ki van szűrve). MAIN_BUTTON_PREFERENCES;Beállítások -MAIN_BUTTON_PUTTOQUEUE;Feldolgozási sorba helyez MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add hozzá a kiválasztott képet a feldolgozási sorhoz Ctrl+B -MAIN_BUTTON_SAVE;Kép mentése MAIN_BUTTON_SAVE_TOOLTIP;Kiválasztott kép mentése Ctrl+S MAIN_BUTTON_SENDTOEDITOR;Megnyitás külső programmal MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Kiválasztott kép szerkesztése külső programmal Ctrl+E @@ -874,7 +871,6 @@ PREFERENCES_APPEARANCE_COLORPICKERFONT;Színválasztó betűtípusa PREFERENCES_APPEARANCE_CROPMASKCOLOR;Vágómaszk színe PREFERENCES_APPEARANCE_MAINFONT;Főbetűtípus PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigátor útmutató színe -PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pszeudo-magasDPI mód PREFERENCES_APPEARANCE_THEME;Téma PREFERENCES_APPLNEXTSTARTUP;újraindítás után érvényes PREFERENCES_AUTOMONPROFILE;Oprendszerben beállított monitor-színprofil automatikus használata @@ -1084,6 +1080,7 @@ PROGRESSBAR_LINEDENOISE;Sorzajszűrő... PROGRESSBAR_LOADING;Kép betöltése... PROGRESSBAR_LOADINGTHUMBS;Előnézeti képek betöltése... PROGRESSBAR_LOADJPEG;JPEG fájl betöltése... +PROGRESSBAR_LOADJXL;JXL fájl betöltése... PROGRESSBAR_LOADPNG;PNG fájl betöltése... PROGRESSBAR_LOADTIFF;TIFF fájl betöltése... PROGRESSBAR_NOIMAGES;Nem találhatóak képek @@ -1369,7 +1366,6 @@ 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 TP_EXPOSURE_CONTRAST;Kontraszt -TP_EXPOSURE_CURVEEDITOR;Tónusgörbe TP_EXPOSURE_EXPCOMP;Exp. Kompenzáció TP_EXPOSURE_LABEL;Expozíció TP_EXPOSURE_SATURATION;Színtelítettség @@ -1574,6 +1570,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !EXPORT_PIPELINE;Processing pipeline !EXPORT_USE_FAST_PIPELINE;Dedicated (full processing on resized image) !FILEBROWSER_POPUPSORTBY;Sort Files +!FILEBROWSER_SHOWRECURSIVE;Show images in sub-folders recursively. !FILECHOOSER_FILTER_EXECUTABLE;Executable files !GENERAL_OTHER;Other !HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB Parade @@ -1775,7 +1772,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_512;Local - SD - ΔE decay !HISTORY_MSG_513;Local - Spot - Excluding - Scope !HISTORY_MSG_514;Local - Spot structure -!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_515;Selective Editing !HISTORY_MSG_516;Local - Color and light !HISTORY_MSG_517;Local - Enable super !HISTORY_MSG_518;Local - Lightness @@ -2085,7 +2082,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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 - TG - Feather gradient +!HISTORY_MSG_833;Local - Mask 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 @@ -2328,7 +2325,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_1082;Local - CIECAM Auto threshold !HISTORY_MSG_1083;Local - CIECAM Hue !HISTORY_MSG_1084;Local - Uses Black Ev - White Ev !HISTORY_MSG_1085;Local - Jz lightness @@ -2444,16 +2441,23 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_ICM_AINTENT;Abstract profile intent !HISTORY_MSG_ICM_BLUX;Primaries Blue X !HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_CAT;Matrix adaptation !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_MIDTCIE;Midtones !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_PRESER;Preserve neutral !HISTORY_MSG_ICM_REDX;Primaries Red X !HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_REFI;Refinement Colors +!HISTORY_MSG_ICM_SHIFTX;Refinement Colors - Shift x +!HISTORY_MSG_ICM_SHIFTY;Refinement Colors - Shift y +!HISTORY_MSG_ICM_SMOOTHCIE;Smooth highlights +!HISTORY_MSG_ICM_TRCEXP;Abstract Profile !HISTORY_MSG_ICM_WORKING_GAMMA;TRC - Gamma !HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method !HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method @@ -2466,7 +2470,72 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_LOCALLAB_TE_PIVOT;Local - Equalizer pivot +!HISTORY_MSG_LOCAL_CIEMASK_BLURCONT;Local - CIECAM Mask blur contrast +!HISTORY_MSG_LOCAL_CIEMASK_BLURFFT;Local - CIECAM Mask blur FFTW +!HISTORY_MSG_LOCAL_CIEMASK_BLURRAD;Local - CIECAM Mask blur radius +!HISTORY_MSG_LOCAL_CIEMASK_CHH;Local - CIECAM Mask curve h(h) +!HISTORY_MSG_LOCAL_CIEMASK_HIGH;Local - CIECAM Mask highlights +!HISTORY_MSG_LOCAL_CIEMASK_SHAD;Local - CIECAM Mask shadows +!HISTORY_MSG_LOCAL_CIEMASK_STRU;Local - CIECAM Mask structure +!HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;Local - CIECAM Mask structure as tool +!HISTORY_MSG_LOCAL_CIEMASK_WLC;Local - CIECAM Mask wavelet L(L) +!HISTORY_MSG_LOCAL_CIEMASK_WLEV;Local - CIECAM Mask wavelet levels +!HISTORY_MSG_LOCAL_CIE_ANGGRAD;Local - CIECAM Gradient angle +!HISTORY_MSG_LOCAL_CIE_BLACKS;Local - CIECAM Blacks distribution +!HISTORY_MSG_LOCAL_CIE_BLUXL;Local - CIECAM Blue X +!HISTORY_MSG_LOCAL_CIE_BLUYL;Local - CIECAM Blue Y +!HISTORY_MSG_LOCAL_CIE_BRICOMP;Local - CIECAM Brightness compression +!HISTORY_MSG_LOCAL_CIE_BRICOMPTH;Local - CIECAM Brightness compression threshold +!HISTORY_MSG_LOCAL_CIE_BWCIE;Local - CIECAM Black and white +!HISTORY_MSG_LOCAL_CIE_CAT;Local - Matrix adaptation +!HISTORY_MSG_LOCAL_CIE_DETAILJZ;Local - JzCzHz Local contrast +!HISTORY_MSG_LOCAL_CIE_ENAMASKALL;Local - CIECAM All mask tools +!HISTORY_MSG_LOCAL_CIE_EXPPRECAM;Local - CIECAM Pre-Cam +!HISTORY_MSG_LOCAL_CIE_GAM;Local - CIECAM Gamma +!HISTORY_MSG_LOCAL_CIE_GAMUTCIE;Local - CIECAM Gamut +!HISTORY_MSG_LOCAL_CIE_GREXL;Local - CIECAM Green X +!HISTORY_MSG_LOCAL_CIE_GREYL;Local - CIECAM Green Y +!HISTORY_MSG_LOCAL_CIE_ILL;Local - CIECAM TRC Illuminant +!HISTORY_MSG_LOCAL_CIE_LOGCIEQ;Local - CIECAM Log encoding Q +!HISTORY_MSG_LOCAL_CIE_MIDT;Local - CIECAM Mid Tones +!HISTORY_MSG_LOCAL_CIE_NORM;Local - CIECAM Normalize L +!HISTORY_MSG_LOCAL_CIE_PRIM;Local - CIECAM TRC primaries +!HISTORY_MSG_LOCAL_CIE_REDXL;Local - CIECAM Red X +!HISTORY_MSG_LOCAL_CIE_REDYL;Local - CIECAM Red Y +!HISTORY_MSG_LOCAL_CIE_REFI;Local - CIECAM Refinement colors +!HISTORY_MSG_LOCAL_CIE_SATCIE;Local - CIECAM Saturation control +!HISTORY_MSG_LOCAL_CIE_SHIFTXL;Local - CIECAM Shift x +!HISTORY_MSG_LOCAL_CIE_SHIFTYL;Local - CIECAM Shift y +!HISTORY_MSG_LOCAL_CIE_SIG;Local - Sigmoid +!HISTORY_MSG_LOCAL_CIE_SIGADAP;Local - CIECAM Sigmoid adaptability +!HISTORY_MSG_LOCAL_CIE_SIGMET;Local - CIECAM Sigmoid method +!HISTORY_MSG_LOCAL_CIE_SLOP;Local - CIECAM Slope +!HISTORY_MSG_LOCAL_CIE_SLOPESMO;Local - CIECAM Gray balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOB;Local - CIECAM Blue balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOG;Local - CIECAM Green balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOR;Local - CIECAM Red balance +!HISTORY_MSG_LOCAL_CIE_SMOOTH;Local - CIECAM Scale Yb scene +!HISTORY_MSG_LOCAL_CIE_SMOOTHMET;Local - CIECAM Smooth lights method +!HISTORY_MSG_LOCAL_CIE_SMOOTHYB;Local - CIECAM Scale Yb viewing +!HISTORY_MSG_LOCAL_CIE_SMOOTH_LUM;Local - CIECAM Levels - Luminosity mode +!HISTORY_MSG_LOCAL_CIE_STRGRAD;Local - CIECAM Gradient strength L +!HISTORY_MSG_LOCAL_CIE_STRLOG;Local - CIECAM Log encoding strength +!HISTORY_MSG_LOCAL_CIE_TRC;Local - CIECAM TRC +!HISTORY_MSG_LOCAL_CIE_WHITES;Local - CIECAM Whites distribution +!HISTORY_MSG_LOCAL_DEHAZE_BLACK;Local - Dehaze Black +!HISTORY_MSG_LOCAL_FEATHERCIE;Local - CIECAM Gradient feather +!HISTORY_MSG_LOCAL_FEATHERCOL;Local - Color Gradient feather +!HISTORY_MSG_LOCAL_FEATHEREXE;Local - Exp Gradient feather +!HISTORY_MSG_LOCAL_FEATHERLOG;Local - Log Gradient feather +!HISTORY_MSG_LOCAL_FEATHERMAS;Local - Mask Common gradient feather +!HISTORY_MSG_LOCAL_FEATHERSH;Local - SH Gradient feather +!HISTORY_MSG_LOCAL_FEATHERVIB;Local - Vib Gradient feather +!HISTORY_MSG_LOCAL_FEATHERWAV;Local - Wav Gradient feather !HISTORY_MSG_LOCAL_GAMUTMUNSEL;Local - SC - Avoid Color Shift +!HISTORY_MSG_LOCAL_LOG_BLACKS;Local - Log Blacks distribution +!HISTORY_MSG_LOCAL_LOG_COMPR;Local - Log Compress brightness +!HISTORY_MSG_LOCAL_LOG_SAT;Local - Log Saturation control +!HISTORY_MSG_LOCAL_LOG_WHITES;Local - Log Whites distribution !HISTORY_MSG_LOCAL_TMO_SATUR;Local Exp Fattal Saturation !HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold @@ -2577,6 +2646,9 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !PARTIALPASTE_FLATFIELDFROMMETADATA;Flat-field from Metadata !PARTIALPASTE_TONE_EQUALIZER;Tone equalizer +!PREFERENCES_BROWSERECURSIVEDEPTH;Browse sub-folders depth +!PREFERENCES_BROWSERECURSIVEFOLLOWLINKS;Follow symbolic links when browsing sub-folders +!PREFERENCES_BROWSERECURSIVEMAXDIRS;Maximum sub-folders !PREFERENCES_CAMERAPROFILESDIR;Camera profiles directory !PREFERENCES_EXTERNALEDITOR_CHANGE;Change Application !PREFERENCES_EXTERNALEDITOR_CHANGE_FILE;Change Executable @@ -2587,13 +2659,18 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !PREFERENCES_LENSFUNDBDIR_TOOLTIP;Directory containing the Lensfun database. Leave empty to use the default directories. !PREFERENCES_LENSPROFILESDIR;Lens profiles directory !PREFERENCES_LENSPROFILESDIR_TOOLTIP;Directory containing Adobe Lens Correction Profiles (LCPs) +!PREFERENCES_MAX_ZOOM_TITLE;Maximum zoom !PREFERENCES_METADATA;Metadata !PREFERENCES_METADATA_SYNC;Metadata synchronization with XMP sidecars !PREFERENCES_METADATA_SYNC_NONE;Off !PREFERENCES_METADATA_SYNC_READ;Read only !PREFERENCES_METADATA_SYNC_READWRITE;Bidirectional !PREFERENCES_PRINTER;Printer (Soft-Proofing) +!PREFERENCES_RAW_DECODER;Raw Decoder +!PREFERENCES_RAW_DECODER_ENABLE_LIBRAW;Use LibRaw +!PREFERENCES_SPOTLOC;Define Spot method for Selective Editing !PREFERENCES_TAB_FAVORITES;Favorites +!PREFERENCES_THUMBNAIL_RANK_COLOR_MODE;Load/Save thumbnail rank and color from/to XMP sidecars !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. @@ -2615,6 +2692,27 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !PREFERENCES_XMP_SIDECAR_MODE;XMP sidecar style !PREFERENCES_XMP_SIDECAR_MODE_EXT;darktable-like (FILENAME.ext.xmp for FILENAME.ext) !PREFERENCES_XMP_SIDECAR_MODE_STD;Standard (FILENAME.xmp for FILENAME.ext) +!QUEUE_DESTPREVIEW_TITLE;Select a thumbnail to preview its destination path here +!QUEUE_DESTPREVIEW_TOOLTIP;Destination path for the first selected image appears here +!QUEUE_LOCATION_TEMPLATE_HELP_BUTTON_TOOLTIP;Show or hide a help panel with instructions for creating location templates +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_BODY;If you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p-3/converted/%P-4/%f +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_TITLE;Common examples +!QUEUE_LOCATION_TEMPLATE_HELP_INTRO;The output template field allows you to to dynamically customize the destination folder and filename. When you include certain specifiers, which begin with %, they are replaced by the program when each file is being saved.\n\nThe sections below describe each type of specifier. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_1;Using this pathname as an example: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_2;The meanings of the formatting strings are: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_LINUX;/home/tom/photos/2010-10-31/photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_WINDOWS;D:\tom\photos\2010-10-31\photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO;The %dN, %d-N, %pN, %p-N, %PN and %P-N (N = 1..9) specifiers will be replaced by elements of the image file's directory path.\nThe format specifiers operate as follows:\n %dN = Nth directory from the end of the path\n %d-N = Nth directory from the start of the path\n %pN = all directories up to the Nth from the end of the path\n %p-N = the first N directories in the path\n %PN = the last N directories in the path\n %P-N = all directories from the Nth to the end of the path\n %f = base filename (no extension) +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO_WINDOWS;For Windows paths, %d-1 is the drive letter and colon, and %d-2 is the base directory on that drive. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_TITLE;Directories and partial paths +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_BODY;%r will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used. +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_TITLE;Rank +!QUEUE_LOCATION_TEMPLATE_HELP_RESULT_MISMATCH;ERROR: 2nd result is different: +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_BODY;%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'. +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_TITLE;Position/sequence in queue +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_BODY;Three different date/time values may be used in templates:\n %tE"%Y-%m-%d" = when export started\n %tF"%Y-%m-%d" = when file was last saved\n %tP"%Y-%m-%d" = when photo was taken\nThe quoted string defines the format of the resulting date and/or time. The format string %tF"%Y-%m-%d" is just one example. The string can use all conversion specifiers defined for the g_date_time_format function (see https://docs.gtk.org/glib/method.DateTime.format.html).\n\nExample format strings: +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_TITLE;Date and time +!QUEUE_LOCATION_TEMPLATE_HELP_TITLE;Creating an output template !SAVEDLG_BIGTIFF;BigTIFF (no metadata support) !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. @@ -2625,6 +2723,10 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !SORT_BY_NAME;By Name !SORT_BY_RANK;By Rank !SORT_DESCENDING;Descending +!TC_LOCALLAB_PRIM_SHIFTX;Shift x +!TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP;In combination with "Refine colors", allows you to:\n 1) for low values, adjust the image purity.\n 2) for higher values, carry out moderate color toning.\nBe careful not to go outside the CIE xy diagram. +!TC_LOCALLAB_PRIM_SHIFTY;Shift y +!TC_PRIM_REFI;Refine colors (white-point) !TP_COLORAPP_CIECAT_DEGREEOUT;Chromatic Adaptation Viewing !TP_COLORAPP_SURROUND;Surround !TP_COLORAPP_SURROUNDSRC;Surround @@ -2826,6 +2928,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_BW;Black and White !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. @@ -2848,8 +2951,15 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_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 three main uses - channel mixer, restore image color (saturation), 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_CAT;Matrix adaptation +!TP_ICM_WORKING_CAT_BRAD;Bradford +!TP_ICM_WORKING_CAT_CAT02;Cat02 +!TP_ICM_WORKING_CAT_CAT16;Cat16 +!TP_ICM_WORKING_CAT_TOOLTIP;Performs the chromatic adaptation of the XYZ conversion matrix. Default: Bradford +!TP_ICM_WORKING_CAT_VK;Von Kries +!TP_ICM_WORKING_CAT_XYZ;XYZ scale !TP_ICM_WORKING_CIEDIAG;CIE xy diagram !TP_ICM_WORKING_ILLU;Illuminant !TP_ICM_WORKING_ILLU_1500;Tungsten 1500K @@ -2861,11 +2971,13 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_ICM_WORKING_ILLU_D65;D65 !TP_ICM_WORKING_ILLU_D80;D80 !TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_E;E !TP_ICM_WORKING_ILLU_NONE;Default !TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_NON;None !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_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination primaries' combo box, 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 @@ -2874,11 +2986,14 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_FREE;Custom LA (sliders) !TP_ICM_WORKING_PRIM_JDCMAX;JDC Max +!TP_ICM_WORKING_PRIM_JDCMAXSTDA;JDC Max stdA !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_TOOLTIP;Performs a gamut control. Destination primaries (Advanced) allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified.\nWhen 'Custom LA (sliders)' is selected, you can modify the values of the 3 primaries (Red, Green, and Blue) for x and y. !TP_ICM_WORKING_PRIM_WID;WideGamut !TP_ICM_WORKING_TRC;Tone response curve: !TP_ICM_WORKING_TRC_18;Prophoto g=1.8 @@ -2927,6 +3042,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected !TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file !TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected +!TP_LENSPROFILE_CORRECTION_METADATA;From file metadata !TP_LENSPROFILE_LABEL;Profiled Lens Correction !TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. !TP_LENSPROFILE_MODE_HEADER;Lens Profile @@ -2946,9 +3062,9 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_AUTOGRAYCIE;Automatic !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_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab). Default: Munsell only.\n\nMunsell only: 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. The result is not the same as Lab. !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 @@ -2991,9 +3107,12 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_LOCALLAB_BUTTON_DUPL;Duplicate !TP_LOCALLAB_BUTTON_REN;Rename !TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWEVNONE;None +!TP_LOCALLAB_BWEVSIG;Activated +!TP_LOCALLAB_BWEVSIGLOG;Sigmoid & Log-Encoding !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_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16 (experimental). 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, for example, to match CAM16 processing with the maximum monitor brightness of 400cd/m2. !TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments !TP_LOCALLAB_CAMMODE;CAM model !TP_LOCALLAB_CAMMODE_CAM16;CAM 16 @@ -3033,6 +3152,12 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_SMOOTHFRAME;Highlight Attenuation & Levels +!TP_LOCALLAB_CIE_SMOOTH_EV;Ev based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA;Slope based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF;Gamma based +!TP_LOCALLAB_CIE_SMOOTH_LEVELS;Levels +!TP_LOCALLAB_CIE_SMOOTH_NONE;None !TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) !TP_LOCALLAB_CIRCRADIUS;Spot size !TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the 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. @@ -3048,8 +3173,9 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_COLORDEPREV_TOOLTIP;Preview ΔE button in Settings will only work if you have activated 'Sharpening', 'Soft Light and Original Retinex', 'Blur/Grain and Denoise', 'Dehaze and Retinex', or 'Contrast by Detail Levels' in the 'Add tool to current spot' menu.\nFor others tools, the Preview ΔE button is in the tool, which allows previewing ΔE with several tools enabled. Prefer using Mask and modifications. !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_COLORFRAME;Dominant color !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 @@ -3057,7 +3183,10 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_LOCALLAB_COL_NAME;Name !TP_LOCALLAB_COL_VIS;Status !TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPRCIE;Brightness compression +!TP_LOCALLAB_COMPRCIETH;Compression threshold !TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_COMPRLOG_TOOLTIP;This algorithm compress the data before log conversion, above the threshold slider value. To use in conjunction with Whites distribution. !TP_LOCALLAB_CONTCOL;Contrast threshold !TP_LOCALLAB_CONTFRA;Contrast by level !TP_LOCALLAB_CONTRAST;Contrast @@ -3072,7 +3201,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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 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 spot. -!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combo box 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. @@ -3081,13 +3210,14 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_LOCALLAB_DARKRETI;Darkness !TP_LOCALLAB_DEHAFRA;Dehaze !TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZE_BLACK;Black !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_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. @@ -3107,6 +3237,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_LOCALLAB_DETAILFRA;Edge detection - DCT !TP_LOCALLAB_DETAILSH;Details !TP_LOCALLAB_DETAILTHR;Lum/chrom detail threshold +!TP_LOCALLAB_DISAB_CIECAM;Disable Ciecam or Weak Jz surround !TP_LOCALLAB_DIVGR;Gamma !TP_LOCALLAB_DUPLSPOTNAME;Copy !TP_LOCALLAB_EDGFRA;Edge sharpness @@ -3115,6 +3246,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping !TP_LOCALLAB_ENABLE_MASK;Enable mask !TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENABLE_MASKALL;Enable all mask tools !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 @@ -3130,9 +3262,10 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all selective editing data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\nUse 'Scope' (Excluding) to set the exclusion intensity.\n\n'Full image' allows you to use the selective editing tools on the whole image.\nThe RT Spot delimiters are set beyond the image preview boundaries.\nThe 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.\nNote: 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.\n\n'Global' allows you to use the selective editing tools on the whole image, without using Delta E or transitions. !TP_LOCALLAB_EXECLU;Excluding spot !TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXMAIN;Global !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 @@ -3141,11 +3274,11 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Selective Editing 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 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_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. @@ -3167,7 +3300,8 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_LOCALLAB_FATSAT;Saturation control !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_FEATVALUE;Feather gradient +!TP_LOCALLAB_FEATVALUE_MASK;Feather gradient (Grad. Filters Mask) !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 @@ -3263,7 +3397,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_LABEL;Selective Editing !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 @@ -3308,8 +3442,10 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_LOGCIE;Log encoding +!TP_LOCALLAB_LOGCIEQ;Log Encoding Q (with Ciecam) +!TP_LOCALLAB_LOGCIEQ_TOOLTIP;Activating the checkbox allows you to switch between log encoding based on the 3 RGB channels, and log encoding based solely on Ciecam’s brightness (Q) channel.\nUsing the Q channel instead of the RGB channels helps avoid undesirable edge effects such as hue and saturation shifts.\nHowever, the settings are more difficult to optimise because Q is unbounded and Ciecam alters the data to take into account the surround conditions, simultaneous contrast, etc.\nYou may have to adjust the following:\n Scene conditions: Mean luminance (Yb), Whites & Blacks distribution, Black Ev, White Ev.\n Source Data Adjustments : Brightness compression, Strength.\n\nNote: when using Log Encoding (Q), be careful not to activate the Disable Ciecam option in the Scene Conditions, Surround menu. +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you to use Black Ev, White Ev, White and Black distribution, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using 'Log encoding' with Brightness compression. !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) @@ -3317,7 +3453,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_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 @@ -3330,6 +3466,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_LOGPFRA2;Log Encoding settings !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. @@ -3399,7 +3536,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_MASKUNUSABLE;Mask disabled (Enable in 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 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 @@ -3435,6 +3572,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_LOCALLAB_MERTWE;Exclusion !TP_LOCALLAB_MERTWO;Subtract !TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MIDTCIE;Midtones !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 @@ -3482,10 +3620,15 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_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_PRECAMGAMUT_TOOLTIP;If checked, ensures a gamut control just after primary conversion to XYZ. +!TP_LOCALLAB_PRECAMREFIMAIN_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. In combination with "Shift x" and "Shift y", allows you to carry out moderate color toning. +!TP_LOCALLAB_PRECAMREFI_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. +!TP_LOCALLAB_PRECAM_TOOLTIP;'Source Data Adjustments' modifies the Dynamic Range using Log encoding, the tones of the image and primaries (simplified Abstract Profile), and midtones, just before the Ciecam process. These values are adjustable:\nGamma: Acts mainly on light tones\nSlope: Acts mainly on dark tones. You 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.\nDestination primaries: Allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified. You can also finely adapt the primaries and the illuminant (white-point). Moving a primary away from the white point reduces saturation and vice versa. Pay attention to the gamut. !TP_LOCALLAB_PREVHIDE;Hide additional settings !TP_LOCALLAB_PREVIEW;Preview ΔE !TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PRIMILLFRAME;Primaries & Illuminant !TP_LOCALLAB_PROXI;ΔE decay !TP_LOCALLAB_QUAAGRES;Aggressive !TP_LOCALLAB_QUACONSER;Conservative @@ -3530,10 +3673,11 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_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_SATCIE;Saturation control !TP_LOCALLAB_SATUR;Saturation !TP_LOCALLAB_SATURV;Saturation (s) !TP_LOCALLAB_SCALEGR;Scale @@ -3554,7 +3698,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_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;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. @@ -3600,17 +3744,41 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_SIGBLACKSSCIE;Blacks distribution +!TP_LOCALLAB_SIGCIE;Sigmoid +!TP_LOCALLAB_SIGFRA;Sigmoid Q +!TP_LOCALLAB_SIGGAMJCIE;Gamma !TP_LOCALLAB_SIGJZFRA;Sigmoid Jz !TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOID16_TOOLTIP;Allows you to simulate a tone mapping appearance using both 'Ciecam' and 'Sigmoid Q'. Sigmoid Q has three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc) Adaptability weights the action of the sigmoid by action on the internal exponential function. !TP_LOCALLAB_SIGMOIDBL;Blend !TP_LOCALLAB_SIGMOIDLAMBDA;Contrast -!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDLOGAUTO;Auto threshold +!TP_LOCALLAB_SIGMOIDLOGEV_TOOLTIP;If the combo box selection 'Black Ev and White Ev' is 'Sigmoid and Log encoding' instead of 'Sigmoid only', the two algorithms 'Log encoding' and 'Sigmoid' are used together. +!TP_LOCALLAB_SIGMOIDNORMCIE;Normalize Luminance +!TP_LOCALLAB_SIGMOIDNORMCIEBLEND_TOOLTIP;Blend acts on the final aspect of the image, contrast and luminance. Ratio between original and output image. +!TP_LOCALLAB_SIGMOIDNORMCIE_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image take into account those of the original.\nAll the adjustments acting on J or Q are taken into account, including those which are not relative to Sigmoid Q. +!TP_LOCALLAB_SIGMOIDQJ;Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDQJCOMPRCIE_TOOLTIP;When the combo box selection 'Uses Black Ev and White Ev' is 'Sigmoid and Log encoding Q' or 'Log encoding instead of Sigmoid' checked. This algorithm compress the data above the threshold slider value. The last value stands for brightness (Q) and should be close as possible to the value 'Compression threshold' (calculate when 'Auto threshold" checked, often > 1). +!TP_LOCALLAB_SIGMOIDSENSI;Adaptability !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_SIGMOIDWHITESCIE_TOOLTIP;Allows you, in Automatic when the dynamic range of the image is high, to change the distribution of lights in whites and deep blacks.\nCan be used with Log encoding or Sigmoid with Black Ev and White Ev enabled.\n\nThe algorithm does not change the basic data, but acts on the components necessary to calculate the Dynamic range, Black Ev, White Ev and the Gray point. +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a tone mapping appearance using both the 'Jz' and 'Sigmoid' function. Three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SIGSLOPJCIE;Slope +!TP_LOCALLAB_SIGTRCCIE;Source Data Adjustments +!TP_LOCALLAB_SIGWHITESCIE;Whites distribution !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_SLOPESMOOTH;Gray balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHB;Blue balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHG;Green balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHR;Red balance (Slope) !TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SMOOTHCIE;Highlight Attenuation +!TP_LOCALLAB_SMOOTHCIE_LUM;Luminosity mode +!TP_LOCALLAB_SMOOTHCIE_SCA;Scale Yb Scene +!TP_LOCALLAB_SMOOTHCIE_TOOLTIP;Completes the processing carried out by gamma, slope and midtones by causing a slight lowering of lights. Please note this does not replace Highlight reconstruction.\n\nGamma based and Slope based (Standard and Advanced) allow you to simulate a tone mapping using:\na) Scene conditions: Black-Ev, White-Ev, Mean luminance (Yb%)\nb) Viewing conditions: Mean luminance (Yb%).\n\nScale Yb Scene is function of White-Ev. +!TP_LOCALLAB_SMOOTHCIE_YB;Scale Yb Viewing !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. @@ -3632,13 +3800,14 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_STRENGTHCIELOG;Strength !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_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. @@ -3670,11 +3839,12 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_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_TRCFRAME;Tone Response Curve & Midtones !TP_LOCALLAB_USEMASK;Laplacian !TP_LOCALLAB_VART;Variance (contrast) !TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool @@ -4243,7 +4413,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_WAVELET_WAVOFFSET;Offset !TP_WBALANCE_AUTOITCGREEN;Temperature correlation !TP_WBALANCE_AUTOOLD;RGB grey -!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement +!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement !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_ITCWALG_TOOLTIP;Allows you to switch to the other Alternative temperature (Alt_temp), when possible.\nInactive in the "single choice" case. @@ -4288,7 +4458,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_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).\nIn the rare case of a color drift with "Observer 2°" (probably due to the conversion matrix) "Observer 10°" must be selected. !TP_WBALANCE_PATCHLABEL;Read colors:%1 Patch: Chroma:%2 Size=%3 !TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colors (max=237).\nDisplay calculated Patch Chroma.\nAWB temperature bias, lets try to reduce this value, a minimum may seem to optimize the algorithm.\n\nPatch size matching chroma optimization. !TP_WBALANCE_PATCHLEVELLABEL;Patch: ΔE=%1 - datas x 9 Min:%2 Max=%3 diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index f92f4ab04..404cc2c18 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -14,7 +14,10 @@ #014 2015-11-23 update by wim ter meer #015 2016-07-21 update by wim ter meer #016 2017-04-21 update by wim ter meer -#017 2020-06-05 update by dheijl +#017 2020-06-05 update by dheijl +#018 2024-02-18 update to RawTherapee 5.10 by Paul Matthijsse +#019 2024-03-08 update by Paul Matthijsse +#020 2024-08-09 update naar RawTherapee 5.11 door pm #100 #101 @LANGUAGE_DISPLAY_NAME=Nederlands @@ -24,7 +27,7 @@ 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 +BATCH_PROCESSING;Groepsverwerking CURVEEDITOR_AXIS_IN;I: CURVEEDITOR_AXIS_LEFT_TAN;LT: CURVEEDITOR_AXIS_OUT;O: @@ -34,12 +37,12 @@ CURVEEDITOR_CURVE;Curve CURVEEDITOR_CURVES;Curven CURVEEDITOR_CUSTOM;Handmatig CURVEEDITOR_DARKS;Schaduwen -CURVEEDITOR_EDITPOINT_HINT;Activeer wijzigen van node in/uit waardes.\n\nRechts-klik op een node om het te selecteren.\nRechts-klik in een leeg gebied om de node te de-selecteren. +CURVEEDITOR_EDITPOINT_HINT;Activeer wijzigen van node in/uit-waarden.\n\nRechtsklik op een node om die te selecteren.\nRechtsklik in een leeg gebied om de node te deselecteren. CURVEEDITOR_HIGHLIGHTS;Hoge lichten CURVEEDITOR_LIGHTS;Lichten CURVEEDITOR_LINEAR;Lineair CURVEEDITOR_LOADDLGLABEL;Laad curve... -CURVEEDITOR_MINMAXCPOINTS;Min/Max controlepunten +CURVEEDITOR_MINMAXCPOINTS;Min/max-controlepunten CURVEEDITOR_NURBS;Kooicurve CURVEEDITOR_PARAMETRIC;Parametrisch CURVEEDITOR_SAVEDLGLABEL;Bewaar curve... @@ -54,52 +57,56 @@ 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_EDIT_RULE;Wijzig dynamische profielregel +DYNPROFILEEDITOR_ENTRY_TOOLTIP;Het zoeken is niet hoofdlettergevoelig.\nGebruik het "re:" voorvoegsel om\neen reguliere expressie in te voeren DYNPROFILEEDITOR_IMGTYPE_ANY;Alles DYNPROFILEEDITOR_IMGTYPE_HDR;HDR -DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +DYNPROFILEEDITOR_IMGTYPE_PS;Pixel-shift DYNPROFILEEDITOR_IMGTYPE_STD;Standaard DYNPROFILEEDITOR_MOVE_DOWN;Naar beneden DYNPROFILEEDITOR_MOVE_UP;Naar boven DYNPROFILEEDITOR_NEW;Nieuw -DYNPROFILEEDITOR_NEW_RULE;Nieuw Dynamisch Profielregelegel +DYNPROFILEEDITOR_NEW_RULE;Nieuwe dynamische profielregel DYNPROFILEEDITOR_PROFILE;Profiel verwerken EDITWINDOW_TITLE;Bewerk afbeelding -EDIT_OBJECT_TOOLTIP;Toont een widget in het voorbeeld scherm waarmee de werking van het gereedschap kan worden aangepast. -EDIT_PIPETTE_TOOLTIP;Voeg een punt toe aan de curve door de Ctrl toets ingedrukt te houden en tegelijkertijd te links-klikken op de gewenste plek op het voorbeeld.\nOm een punt te wijzigen, hou de Ctrl toets ingedrukt en links-klik tegelijkertijd op het gewenste gebied in het voorbeeld, en laat daarna de Ctrl toets los (behalve wanneer fijne controle is gewenst), blijf de linker muis knop ingedrukt houden en beweeg de muis naar boven of beneden om dit punt te verschuiven op de curve. +EDIT_OBJECT_TOOLTIP;Toont een widget in het voorbeeldscherm waarmee de werking van het gereedschap kan worden aangepast. +EDIT_PIPETTE_TOOLTIP;Voeg een punt aan de curve toe met Ctrl+muisklik op de gewenste plek in het voorbeeld.\nKlik op een punt in de tooncurve om deze te selecteren (wordt rood), verplaats 'm vervolgens met de linkermuisknop ingedrukt.\nHou de Ctrl-toets ingedrukt voor fijnmazige controle. +ERROR_MSG_METADATA_VALUE;Metadata: fout bij omzetting %1 naar %2 EXIFFILTER_APERTURE;Diafragma EXIFFILTER_CAMERA;Camera -EXIFFILTER_EXPOSURECOMPENSATION;Belichtingscompensatie (EV) +EXIFFILTER_EXPOSURECOMPENSATION;Belichtingscompensatie (LW) EXIFFILTER_FILETYPE;Bestandstype EXIFFILTER_FOCALLEN;Brandpuntsafstand EXIFFILTER_IMAGETYPE;Type afbeelding EXIFFILTER_ISO;ISO-waarde EXIFFILTER_LENS;Objectief EXIFFILTER_METADATAFILTER;Activeer metadatafilters +EXIFFILTER_PATH;Bestandspad EXIFFILTER_SHUTTER;Sluitertijd +EXIFPANEL_ACTIVATE_ALL_HINT;Selecteer alle tags +EXIFPANEL_ACTIVATE_NONE_HINT;Deselecteer alle tags EXIFPANEL_ADDEDIT;Voeg toe/bewerk EXIFPANEL_ADDEDITHINT;Voeg nieuwe tag toe of bewerk tag EXIFPANEL_ADDTAGDLG_ENTERVALUE;Geef waarde EXIFPANEL_ADDTAGDLG_SELECTTAG;Selecteer tag EXIFPANEL_ADDTAGDLG_TITLE;Voeg tag toe of bewerk +EXIFPANEL_BASIC_GROUP;Basis EXIFPANEL_KEEP;Bewaar EXIFPANEL_KEEPHINT;Bewaar geselecteerde tags in doelbestand EXIFPANEL_REMOVE;Verwijder EXIFPANEL_REMOVEHINT;Verwijder geselecteerde tags in doelbestand 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 +EXIFPANEL_RESETALLHINT;Zet alle tags terug naar hun oorspronkelijke waarden +EXIFPANEL_RESETHINT;Zet geselecteerde tags terug naar hun oorspronkelijke waarden +EXIFPANEL_VALUE_NOT_SHOWN;Niet getoond EXPORT_BYPASS;Verwerkingsstappen die worden overgeslagen EXPORT_BYPASS_ALL;Alles selecteren/deselecteren EXPORT_BYPASS_DEFRINGE;Verzachten niet toepassen EXPORT_BYPASS_DIRPYRDENOISE;Ruisonderdrukking niet toepassen EXPORT_BYPASS_DIRPYREQUALIZER;Detailcontrast niet toepassen -EXPORT_BYPASS_EQUALIZER;Wavelet Niveau niet toepassen -EXPORT_BYPASS_RAW_CA;Correctie Chromatische Aberratie niet toepassen [raw] +EXPORT_BYPASS_EQUALIZER;Wavelet-niveaus niet toepassen +EXPORT_BYPASS_RAW_CA;Correctie Chromatische afwijking niet toepassen [raw] EXPORT_BYPASS_RAW_CCSTEPS;Kleurfoutonderdrukking niet toepassen [raw] EXPORT_BYPASS_RAW_DCB_ENHANCE;DCB-verbetering niet toepassen [raw] EXPORT_BYPASS_RAW_DCB_ITERATIONS;DCB-herhalingen niet toepassen [raw] @@ -107,7 +114,7 @@ EXPORT_BYPASS_RAW_DF;Donkerframe niet toepassen [raw] EXPORT_BYPASS_RAW_FF;Vlakveld niet toepassen [raw] EXPORT_BYPASS_RAW_GREENTHRESH;Groenbalans niet toepassen [raw] EXPORT_BYPASS_RAW_LINENOISE;Lijnruisfilter niet toepassen [raw] -EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;LMMSE Verbetering niet toeppassen [raw] +EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;LMMSE-verbetering niet toeppassen [raw] EXPORT_BYPASS_SHARPENEDGE;Randen verscherpen niet toepassen EXPORT_BYPASS_SHARPENING;Verscherpen niet toepassen EXPORT_BYPASS_SHARPENMICRO;Microcontrast niet toepassen @@ -119,7 +126,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_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_FAST_PIPELINE_TOOLTIP;Gebruikt een speciale verwerkingslijn waarbij kwaliteit ten koste gaat van snelheid. Het formaat van de afbeelding wordt zo snel mogelijk gewijzigd, in plaats van 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 @@ -127,13 +134,13 @@ 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_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\nsneltoetsen:\n ~ - thuismap van de gebruiker\n ! - afbeeldingenmap van de gebruiker 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_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 @@ -148,11 +155,11 @@ FILEBROWSER_FLATFIELD;Vlakveld FILEBROWSER_MOVETODARKFDIR;Verplaats naar map met donkerframes FILEBROWSER_MOVETOFLATFIELDDIR;Verplaats naar vlakveldmap FILEBROWSER_NEW_NAME;Nieuwe naam: -FILEBROWSER_OPENDEFAULTVIEWER;Windows standaard viewer (verwerkingsrij) +FILEBROWSER_OPENDEFAULTVIEWER;Windows standaardfoto-viewer (verwerkingsrij) FILEBROWSER_PARTIALPASTEPROFILE;Gedeeltelijk plakken FILEBROWSER_PASTEPROFILE;Plak profiel FILEBROWSER_POPUPCANCELJOB;Verwijder uit verwerkingsrij -FILEBROWSER_POPUPCOLORLABEL;Kleur label +FILEBROWSER_POPUPCOLORLABEL;Labelkleur FILEBROWSER_POPUPCOLORLABEL0;Label: Geen FILEBROWSER_POPUPCOLORLABEL1;Label: Rood FILEBROWSER_POPUPCOLORLABEL2;Label: Geel @@ -161,8 +168,9 @@ FILEBROWSER_POPUPCOLORLABEL4;Label: Blauw FILEBROWSER_POPUPCOLORLABEL5;Label: Paars FILEBROWSER_POPUPCOPYTO;Kopieer naar... FILEBROWSER_POPUPFILEOPERATIONS;Bestandsbewerkingen -FILEBROWSER_POPUPMOVEEND;Naar eind van verwerkingsrij -FILEBROWSER_POPUPMOVEHEAD;Naar begin verwerkingsrij +FILEBROWSER_POPUPINSPECT;Inspecteer +FILEBROWSER_POPUPMOVEEND;Naar einde van de verwerkingsrij +FILEBROWSER_POPUPMOVEHEAD;Naar begin van de verwerkingsrij FILEBROWSER_POPUPMOVETO;Verplaats naar... FILEBROWSER_POPUPOPEN;Open FILEBROWSER_POPUPOPENINEDITOR;Open in Bewerkingsvenster @@ -180,11 +188,12 @@ FILEBROWSER_POPUPREMOVE;Permanent verwijderen FILEBROWSER_POPUPREMOVEINCLPROC;Verwijder definitief, inclusief met uitvoer in de verwerkingsrij FILEBROWSER_POPUPRENAME;Hernoem FILEBROWSER_POPUPSELECTALL;Alles selecteren +FILEBROWSER_POPUPSORTBY;Sorteer bestanden FILEBROWSER_POPUPTRASH;Verplaats naar prullenbak FILEBROWSER_POPUPUNRANK;Verwijder sterwaardering FILEBROWSER_POPUPUNTRASH;Haal terug uit prullenbak FILEBROWSER_QUERYBUTTONHINT;Wis zoekopdracht -FILEBROWSER_QUERYHINT;Zoeken op bestandsnamen. Ondersteund gedeeltelijke bestandsnamen. Scheidt de zoektermen door komma's, bv.\n1001,1004,1199\n\nSluit zoektermen uit door ze te prefixen met != bv.\n!=1001,1004,1199 \n\nSneltoets:\nCtrl-f - focus het zoekveld,\nEnter - zoek,\nEsc - verwijder zoekresultaat, \nShift-Esc - verwijder focus van het zoekveld. +FILEBROWSER_QUERYHINT;Zoeken op bestandsnamen. Ondersteunt gedeeltelijke bestandsnamen. Scheid de zoektermen door komma's, bv.\n1001,1004,1199 (zonder spaties!)\n\nSluit zoektermen uit door er != voor te plaatsen bijvoorbeeld\n!=1001,1004,1199 \n\nSneltoets:\nCtrl+F - focus op het zoekveld,\nEnter - zoek,\nEsc - verwijder zoekresultaat, \nShift+Esc - verwijder focus van het zoekveld. FILEBROWSER_QUERYLABEL; Zoeken: FILEBROWSER_RANK1_TOOLTIP;Waardering 1 *\nSneltoets: 1 FILEBROWSER_RANK2_TOOLTIP;Waardering 2 *\nSneltoets: 2 @@ -195,49 +204,53 @@ FILEBROWSER_RENAMEDLGLABEL;Hernoem bestand FILEBROWSER_RESETDEFAULTPROFILE;Terugzetten naar standaardwaarde FILEBROWSER_SELECTDARKFRAME;Selecteer donkerframe... FILEBROWSER_SELECTFLATFIELD;Kies vlakveldopname... -FILEBROWSER_SHOWCOLORLABEL1HINT;Toon foto's met label Rood\nSneltoets: Alt-1 -FILEBROWSER_SHOWCOLORLABEL2HINT;Toon foto's met label Geel\nSneltoets: Alt-2 -FILEBROWSER_SHOWCOLORLABEL3HINT;Toon foto's met label Groen\nSneltoets: Alt-3 -FILEBROWSER_SHOWCOLORLABEL4HINT;Toon foto's met label Blauw\nSneltoets: Alt-4 -FILEBROWSER_SHOWCOLORLABEL5HINT;Toon foto's met label Paars\nSneltoets: Alt-5 +FILEBROWSER_SHOWCOLORLABEL1HINT;Toon foto's met label Rood\nSneltoets: Alt+1 +FILEBROWSER_SHOWCOLORLABEL2HINT;Toon foto's met label Geel\nSneltoets: Alt+2 +FILEBROWSER_SHOWCOLORLABEL3HINT;Toon foto's met label Groen\nSneltoets: Alt+3 +FILEBROWSER_SHOWCOLORLABEL4HINT;Toon foto's met label Blauw\nSneltoets: Alt+4 +FILEBROWSER_SHOWCOLORLABEL5HINT;Toon foto's met label Paars\nSneltoets: Alt+5 FILEBROWSER_SHOWDIRHINT;Verwijder alle filters.\nSneltoets: d -FILEBROWSER_SHOWEDITEDHINT;Toon bewerkte foto's\nSneltoets: Shift-7 -FILEBROWSER_SHOWEDITEDNOTHINT;Toon niet-bewerkte foto's\nSneltoets: Shift-6 -FILEBROWSER_SHOWEXIFINFO;Toon EXIF-info +FILEBROWSER_SHOWEDITEDHINT;Toon bewerkte foto's\nSneltoets: Shift+7 +FILEBROWSER_SHOWEDITEDNOTHINT;Toon niet-bewerkte foto's\nSneltoets: Shift+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: Shift-1 -FILEBROWSER_SHOWRANK2HINT;Toon foto's met 2 sterren.\nSneltoets: Shift-2 -FILEBROWSER_SHOWRANK3HINT;Toon foto's met 3 sterren.\nSneltoets: Shift-3 -FILEBROWSER_SHOWRANK4HINT;Toon foto's met 4 sterren.\nSneltoets: Shift-4 -FILEBROWSER_SHOWRANK5HINT;Toon foto's met 5 sterren.\nSneltoets: Shift-5 -FILEBROWSER_SHOWRECENTLYSAVEDHINT;Toon recent opgeslagen/verwerkte foto's.\nSneltoets: Alt-7 -FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Toon niet-opgeslagen/verwerkte foto's.\nSneltoets: Alt-6 -FILEBROWSER_SHOWTRASHHINT;Toon inhoud prullenbak\nSneltoets: Ctrl-t -FILEBROWSER_SHOWUNCOLORHINT;Toon foto's zonder kleurlabel.\nSneltoets: Alt-0 -FILEBROWSER_SHOWUNRANKHINT;Toon foto's zonder sterwaardering.\nSneltoets: Shift-0 +FILEBROWSER_SHOWORIGINALHINT;Toon alleen originele afbeelding.\n\nAls er meerdere afbeeldingen zijn met dezelfde naam maar verschillende extensies, dan wordt de afbeelding gekozen waarvan de extensie het hoogst staat in de lijst met extensies in Voorkeuren > Bestandsnavigator > Extensies +FILEBROWSER_SHOWRANK1HINT;Toon foto's met 1 ster.\nSneltoets: Shift+1 +FILEBROWSER_SHOWRANK2HINT;Toon foto's met 2 sterren.\nSneltoets: Shift+2 +FILEBROWSER_SHOWRANK3HINT;Toon foto's met 3 sterren.\nSneltoets: Shift+3 +FILEBROWSER_SHOWRANK4HINT;Toon foto's met 4 sterren.\nSneltoets: Shift+4 +FILEBROWSER_SHOWRANK5HINT;Toon foto's met 5 sterren.\nSneltoets: Shift+5 +FILEBROWSER_SHOWRECENTLYSAVEDHINT;Toon recent opgeslagen/verwerkte foto's.\nSneltoets: Alt+7 +FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Toon niet-opgeslagen/verwerkte foto's.\nSneltoets: Alt+6 +FILEBROWSER_SHOWRECURSIVE;Toon afbeeldingen in subfolders recursief +FILEBROWSER_SHOWTRASHHINT;Toon inhoud prullenbak\nSneltoets: Ctrl+T +FILEBROWSER_SHOWUNCOLORHINT;Toon foto's zonder kleurlabel.\nSneltoets: Alt+0 +FILEBROWSER_SHOWUNRANKHINT;Toon foto's zonder sterwaardering.\nSneltoets: Shift+0 FILEBROWSER_THUMBSIZE;Miniaturen FILEBROWSER_UNRANK_TOOLTIP;Verwijder sterwaardering\nSneltoets: 0 FILEBROWSER_ZOOMINHINT;Groter FILEBROWSER_ZOOMOUTHINT;Kleiner FILECHOOSER_FILTER_ANY;Alle bestanden FILECHOOSER_FILTER_COLPROF;Kleurprofielen -FILECHOOSER_FILTER_CURVE;Curve bestanden -FILECHOOSER_FILTER_LCP;Lens correctieprofielen +FILECHOOSER_FILTER_CURVE;Curve-bestanden +FILECHOOSER_FILTER_EXECUTABLE;Uitvoerbare bestanden +FILECHOOSER_FILTER_LCP;Lenscorrectieprofielen FILECHOOSER_FILTER_PP;Profiel verwerken -FILECHOOSER_FILTER_SAME;Hetzelfe formaat als huidige foto -FILECHOOSER_FILTER_TIFF;TIFF bestanden +FILECHOOSER_FILTER_SAME;Hetzelfde formaat als huidige foto +FILECHOOSER_FILTER_TIFF;TIFF-bestanden GENERAL_ABOUT;Over RawTherapee GENERAL_AFTER;Na GENERAL_APPLY;Toepassen -GENERAL_ASIMAGE;Als Afbeelding +GENERAL_ASIMAGE;Als afbeelding GENERAL_AUTO;Automatisch GENERAL_BEFORE;Voor GENERAL_CANCEL;Annuleren GENERAL_CLOSE;Sluiten GENERAL_CURRENT;Huidig +GENERAL_DELETE_ALL;Wis alles GENERAL_DISABLE;Deactiveren GENERAL_DISABLED;Gedeactiveerd +GENERAL_EDIT;Bewerk GENERAL_ENABLE;Activeer GENERAL_ENABLED;Geactiveerd GENERAL_FILE;Bestand @@ -248,6 +261,7 @@ GENERAL_NO;Nee GENERAL_NONE;Geen GENERAL_OK;OK GENERAL_OPEN;Open +GENERAL_OTHER;Ander GENERAL_PORTRAIT;Portret GENERAL_RESET;Terugzetten GENERAL_SAVE;Opslaan @@ -258,11 +272,20 @@ 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_CHRO;Toon/Verberg chromaticiteitshistogram +HISTOGRAM_TOOLTIP_CROSSHAIR;Toon/verberg indicatorkruis 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_MODE;Wissel tussen lineair, log-lineair en log-log schalen van het histogram. HISTOGRAM_TOOLTIP_R;Toon/verberg rood histogram +HISTOGRAM_TOOLTIP_SHOW_OPTIONS;Toon/verberg optieknoppen +HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS;Pas helderheid aan +HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histogram +HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw-histogram +HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB-Parade +HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Tint-Chroma vectorscope +HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;Tint-Verzadiging vectorscope +HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Golfvorm HISTORY_CHANGED;Veranderd HISTORY_CUSTOMCURVE;Handmatig HISTORY_FROMCLIPBOARD;Van klembord @@ -274,40 +297,40 @@ HISTORY_MSG_5;Helderheid HISTORY_MSG_6;Contrast HISTORY_MSG_7;Schaduwen HISTORY_MSG_8;Belichtingscompensatie -HISTORY_MSG_9;Hoge lichten Comprimeren +HISTORY_MSG_9;Hoge lichten comprimeren HISTORY_MSG_10;Schaduwcompressie HISTORY_MSG_11;Tooncurve 1 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_19;L*a*b* - L* curve +HISTORY_MSG_19;L*a*b* - L*-curve HISTORY_MSG_20;Verscherpen -HISTORY_MSG_21;OSM - Straal -HISTORY_MSG_22;OSM - Hoeveelheid -HISTORY_MSG_23;OSM - Drempel -HISTORY_MSG_24;OSM - Randen -HISTORY_MSG_25;OSM - Randen Straal -HISTORY_MSG_26;OSM - Randtolerantie -HISTORY_MSG_27;OSM - Halocontrole -HISTORY_MSG_28;OSM - Halo hoeveelheid +HISTORY_MSG_21;Onscherpmasker - Straal +HISTORY_MSG_22;Onscherpmasker - Hoeveelheid +HISTORY_MSG_23;Onscherpmasker - Drempel +HISTORY_MSG_24;Onscherpmasker - Randen +HISTORY_MSG_25;Onscherpmasker - Randen straal +HISTORY_MSG_26;Onscherpmasker - Randtolerantie +HISTORY_MSG_27;Onscherpmasker - Halocontrole +HISTORY_MSG_28;Onscherpmasker - Halo hoeveelheid HISTORY_MSG_29;Verscherpingsmethode HISTORY_MSG_30;RL-verscherping - Straal HISTORY_MSG_31;RL-verscherping - Hoeveelheid HISTORY_MSG_32;RL-verscherping - Demping HISTORY_MSG_33;RL-verscherping - Herhaling -HISTORY_MSG_34;Lensvervorming correctie -HISTORY_MSG_35;Vignettering correctie -HISTORY_MSG_36;CA correctie -HISTORY_MSG_37;Automatische Niveaus -HISTORY_MSG_38;Witbalans Methode +HISTORY_MSG_34;Lensvervormingscorrectie +HISTORY_MSG_35;Vignetteringscorrectie +HISTORY_MSG_36;CA-correctie +HISTORY_MSG_37;Automatische niveaus +HISTORY_MSG_38;Witbalans - Methode HISTORY_MSG_39;Kleurtemperatuur HISTORY_MSG_40;Witbalans Groentint HISTORY_MSG_41;Tooncurve Mode 1 HISTORY_MSG_42;Tooncurve 2 HISTORY_MSG_43;Tooncurve Mode 2 -HISTORY_MSG_48;Gebruik DCP's toon curve -HISTORY_MSG_49;DCP Illuminant +HISTORY_MSG_48;Gebruik DCP-tooncurve +HISTORY_MSG_49;DCP-lichtbron HISTORY_MSG_50;Schaduwen/hoge lichten HISTORY_MSG_51;S/HL - Hoge lichten HISTORY_MSG_52;S/HL - Schaduwen @@ -324,12 +347,12 @@ HISTORY_MSG_63;Snapshot HISTORY_MSG_64;Bijsnijden HISTORY_MSG_65;CA-correctie HISTORY_MSG_66;Hoge lichten herstellen -HISTORY_MSG_68;HL herstellen methode +HISTORY_MSG_68;HL herstellen - methode HISTORY_MSG_69;Kleurwerkruimte HISTORY_MSG_70;Uitvoerkleurruimte HISTORY_MSG_71;Invoerkleurruimte HISTORY_MSG_72;VC - Hoeveelheid -HISTORY_MSG_73;Kleurkanaal Mixer +HISTORY_MSG_73;Kleurkanaalmixer HISTORY_MSG_74;Schalingsinstelling HISTORY_MSG_75;Schalingsmethode HISTORY_MSG_76;Exif-metadata @@ -339,26 +362,26 @@ HISTORY_MSG_80;Schalen - Hoogte HISTORY_MSG_81;Schalen geactiveerd HISTORY_MSG_82;Profiel veranderd HISTORY_MSG_84;Perspectiefcorrectie -HISTORY_MSG_85;Lenscorrectie Profiel -HISTORY_MSG_86;RGB Curven - Luminos. Mode +HISTORY_MSG_85;Lenscorrectieprofiel +HISTORY_MSG_86;RGB-curven - Luminos. Modus HISTORY_MSG_87;Spot-ruisonderdrukking -HISTORY_MSG_88;Spot-ruis drempel +HISTORY_MSG_88;Spot ruisdrempel HISTORY_MSG_89;Ruisonderdrukking -HISTORY_MSG_90;RO -Luminantie -HISTORY_MSG_91;RO -Chrominantie leidend -HISTORY_MSG_92;RO -Gamma -HISTORY_MSG_93;DC waarde +HISTORY_MSG_90;RO - Luminantie +HISTORY_MSG_91;RO - Chrominantie leidend +HISTORY_MSG_92;RO - Gamma +HISTORY_MSG_93;DC-waarde HISTORY_MSG_94;Detailcontrast -HISTORY_MSG_95;L*a*b* -Chromaticiteit -HISTORY_MSG_96;L*a*b* -'a*'-curve -HISTORY_MSG_97;L*a*b* -'b*'-curve +HISTORY_MSG_95;L*a*b* - Chromaticiteit +HISTORY_MSG_96;L*a*b* - 'a*'-curve +HISTORY_MSG_97;L*a*b* - 'b*'-curve HISTORY_MSG_98;Demozaïekmethode -HISTORY_MSG_99;Hete pixels filter -HISTORY_MSG_100;RGB Verzadiging +HISTORY_MSG_99;Hetepixels-filter +HISTORY_MSG_100;RGB-verzadiging HISTORY_MSG_101;HSV - Tint HISTORY_MSG_102;HSV - Verzadiging HISTORY_MSG_103;HSV - Waarde -HISTORY_MSG_104;HSV Balans +HISTORY_MSG_104;HSV-balans HISTORY_MSG_105;Randverzachting HISTORY_MSG_106;RV - Straal HISTORY_MSG_107;RV - Drempel @@ -368,22 +391,22 @@ HISTORY_MSG_110;Herschalen van: HISTORY_MSG_111;L*a*b* - Vermijd kleurversch. HISTORY_MSG_112;--unused-- HISTORY_MSG_113;L*a*b* - Beschermen -HISTORY_MSG_114;DCB Herhalingen +HISTORY_MSG_114;DCB-herhalingen HISTORY_MSG_115;Valse kleuren onderdrukken HISTORY_MSG_116;Verbeterd DCB HISTORY_MSG_117;RAW CA-correctie - Rood HISTORY_MSG_118;RAW CA-correctie - Blauw HISTORY_MSG_119;Lijnruis -HISTORY_MSG_120;Groenbalans drempel +HISTORY_MSG_120;Drempel groenbalans HISTORY_MSG_121;RAW CA-correctie - Auto HISTORY_MSG_122;Donkerframe - Autom. selectie HISTORY_MSG_123;Donkerframe - Bestand -HISTORY_MSG_124;Witpunt correctie +HISTORY_MSG_124;Witpuntcorrectie HISTORY_MSG_126;Vlakveld - Bestand 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_130;Autocorrectie lensvervorming HISTORY_MSG_137;Zwartniveau - Groen 1 HISTORY_MSG_138;Zwartniveau - Rood HISTORY_MSG_139;Zwartniveau - Blauw @@ -404,7 +427,7 @@ HISTORY_MSG_153;LV - Verzadigde tinten HISTORY_MSG_154;LV - Bescherm huidtinten HISTORY_MSG_155;LV - Vermijd verschuiving HISTORY_MSG_156;LV - Koppel pastel/verzadig -HISTORY_MSG_157;LV - P/S Drempel +HISTORY_MSG_157;LV - P/S-drempel HISTORY_MSG_158;TK - Sterkte HISTORY_MSG_159;TK - Randen HISTORY_MSG_160;TK - Schaal @@ -415,75 +438,75 @@ HISTORY_MSG_164;RGB-curve - G HISTORY_MSG_165;RGB-curve - B HISTORY_MSG_166;Belichting - Teruggezet HISTORY_MSG_167;Demozaïekmethode -HISTORY_MSG_168;L*a*b* - CC curve -HISTORY_MSG_169;L*a*b* - CH curve -HISTORY_MSG_170;Levendigheid curve -HISTORY_MSG_171;L*a*b* - LC curve +HISTORY_MSG_168;L*a*b* - CC-curve +HISTORY_MSG_169;L*a*b* - CH-curve +HISTORY_MSG_170;Levendigheidscurve +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 -HISTORY_MSG_177;CAM02 - Opname Luminositeit -HISTORY_MSG_178;CAM02 - Weergave Luminositeit -HISTORY_MSG_179;CAM02 - Witpunt model +HISTORY_MSG_175;CAM02 - CAT02-toepassing +HISTORY_MSG_176;CAM02 - Weergave-omgeving +HISTORY_MSG_177;CAM02 - Luminositeit scène (opname) +HISTORY_MSG_178;CAM02 - Luminositeit weergave (bv. monitor) +HISTORY_MSG_179;CAM02 - Witpuntmodel HISTORY_MSG_180;CAM02 - Lichtheid (J) HISTORY_MSG_181;CAM02 - Chroma (C) HISTORY_MSG_182;CAM02 - Automatisch CAT02 HISTORY_MSG_183;CAM02 - Contrast (J) -HISTORY_MSG_184;CAM02 - Opname omgeving -HISTORY_MSG_185;CAM02 - Gamut controle +HISTORY_MSG_184;CAM02 - Scène-omgeving +HISTORY_MSG_185;CAM02 - Beperk kleurenscala HISTORY_MSG_186;CAM02 - Algoritme -HISTORY_MSG_187;CAM02 - Rode/Huidtint bescher. +HISTORY_MSG_187;CAM02 - Rode/huidtint. bescher. HISTORY_MSG_188;CAM02 - Helderheid (Q) HISTORY_MSG_189;CAM02 - Contrast (Q) HISTORY_MSG_190;CAM02 - Verzadiging (S) HISTORY_MSG_191;CAM02 - Kleurrijkheid (M) HISTORY_MSG_192;CAM02 - Tint (h) -HISTORY_MSG_193;CAM02 - Toon curve 1 -HISTORY_MSG_194;CAM02 - Toon curve 2 -HISTORY_MSG_195;CAM02 - Toon curve 1 -HISTORY_MSG_196;CAM02 - Toon curve 2 -HISTORY_MSG_197;CAM02 - Kleur curve -HISTORY_MSG_198;CAM02 - Kleur curve -HISTORY_MSG_199;CAM02 - Toont in histogram -HISTORY_MSG_200;CAM02 - Tonemapping +HISTORY_MSG_193;CAM02 - Tooncurve 1 +HISTORY_MSG_194;CAM02 - Tooncurve 2 +HISTORY_MSG_195;CAM02 - Tooncurve 1 +HISTORY_MSG_196;CAM02 - Tooncurve 2 +HISTORY_MSG_197;CAM02 - Kleurcurve +HISTORY_MSG_198;CAM02 - Kleurcurve +HISTORY_MSG_199;CAM02 - Toon in histogram +HISTORY_MSG_200;CAM02 - Toonmappen 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_204;LMMSE-verbetering HISTORY_MSG_205;CAM02 hete/dode pixels -HISTORY_MSG_206;CAT02 - Opname Lum. Auto -HISTORY_MSG_207;Verzachten Tint curve -HISTORY_MSG_208;WB - Blauw/Rood balans +HISTORY_MSG_206;CAT02 - Scène Lum. Auto +HISTORY_MSG_207;Verzachten tintcurve +HISTORY_MSG_208;WB - Blauw/Rood-balans HISTORY_MSG_210;GF - Hoek -HISTORY_MSG_211;Grijsverloop Filter +HISTORY_MSG_211;Grijsverloopfilter HISTORY_MSG_212;VF - Sterkte -HISTORY_MSG_213;Vignettering Filter -HISTORY_MSG_214;Zwart-Wit +HISTORY_MSG_213;Vignetteringsfilter +HISTORY_MSG_214;Zwart-wit HISTORY_MSG_215;ZW - KM - Rood HISTORY_MSG_216;ZW - KM - Groen HISTORY_MSG_217;ZW - KM - Blauw HISTORY_MSG_218;ZW - Gamma - Rood HISTORY_MSG_219;ZW - Gamma - Groen HISTORY_MSG_220;ZW - Gamma - Blauw -HISTORY_MSG_221;ZW - Kleur Filter +HISTORY_MSG_221;ZW - Filterkleur HISTORY_MSG_222;ZW - Voorinstelling HISTORY_MSG_223;ZW - KM - Oranje HISTORY_MSG_224;ZW - KM - Geel HISTORY_MSG_225;ZW - KM - Cyaan HISTORY_MSG_226;ZW - KM - Magenta HISTORY_MSG_227;ZW - KM - Paars -HISTORY_MSG_228;ZW - Luminantie Mixer -HISTORY_MSG_229;ZW - Luminantie Mixer -HISTORY_MSG_230;ZW - Mode -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_228;ZW - Luminantiemixer +HISTORY_MSG_229;ZW - Luminantiemixer +HISTORY_MSG_230;ZW - Modus +HISTORY_MSG_231;ZW - 'Voor'-curve +HISTORY_MSG_232;ZW - Type 'Voor'-curve +HISTORY_MSG_233;ZW - 'Na'-curve +HISTORY_MSG_234;ZW - Type 'Na' curve +HISTORY_MSG_235;B&W - CM - Auto HISTORY_MSG_236;- -HISTORY_MSG_237;B&W - CM +HISTORY_MSG_237;BW - CM HISTORY_MSG_238;GF - Straal HISTORY_MSG_239;GF - Sterkte HISTORY_MSG_240;GF - Centrum @@ -492,22 +515,22 @@ HISTORY_MSG_242;VF - Vorm HISTORY_MSG_243;VC - Straal HISTORY_MSG_244;VC - Sterkte HISTORY_MSG_245;VC - Centrum -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_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_251;ZW - Algoritme HISTORY_MSG_252;DC - Huidtonen -HISTORY_MSG_253;DC - Verminder artefacten +HISTORY_MSG_253;DC - Verminder onregelmatigheden 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_258;KT - Kleurcurve HISTORY_MSG_259;KT - Dekking -HISTORY_MSG_260;KT - a*[b*] Dekking +HISTORY_MSG_260;KT - a*[b*]-dekking HISTORY_MSG_261;KT - Methode -HISTORY_MSG_262;KT - b* Dekking +HISTORY_MSG_262;KT - b*-dekking HISTORY_MSG_263;KT - Schaduwen - Rood HISTORY_MSG_264;KT - Schaduwen - Groen HISTORY_MSG_265;KT - Schaduwen - Blauw @@ -524,155 +547,155 @@ HISTORY_MSG_277;--unused-- HISTORY_MSG_278;KT - Behoud luminantie HISTORY_MSG_279;KT - Schaduwen HISTORY_MSG_280;KT - Hoge lichten -HISTORY_MSG_281;KT - Verz. sterkte -HISTORY_MSG_282;KT - Verz. drempel +HISTORY_MSG_281;KT - Sterkte verzadiging +HISTORY_MSG_282;KT - Drempel verzadiging HISTORY_MSG_283;KT - Sterkte -HISTORY_MSG_284;KT - Auto verz. bescherming +HISTORY_MSG_284;KT - Auto-bescherming verzadiging HISTORY_MSG_285;RO - Mediaan - Methode HISTORY_MSG_286;RO - Mediaan - Type HISTORY_MSG_287;RO - Mediaan - Herhalingen -HISTORY_MSG_288;Vlakveld - Clip Controle -HISTORY_MSG_289;Vlakveld - Clip Controle - Auto +HISTORY_MSG_288;Vlakveld - Afkapcontrole +HISTORY_MSG_289;Vlakveld - Afkapcontrole - Auto HISTORY_MSG_290;Zwartniveau - Rood HISTORY_MSG_291;Zwartniveau - Groen HISTORY_MSG_292;Zwartniveau - Blauw -HISTORY_MSG_293;Film Simuleren +HISTORY_MSG_293;Filmsimulatie 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_301;RO - Luma controle -HISTORY_MSG_302;RO - Chroma methode -HISTORY_MSG_303;RO - Chroma methode -HISTORY_MSG_304;W niveau -HISTORY_MSG_305;W niveau -HISTORY_MSG_306;W N° niveau -HISTORY_MSG_307;W Ch niveau -HISTORY_MSG_308;W richting -HISTORY_MSG_309;W tegels -HISTORY_MSG_310;W Tinten lucht -HISTORY_MSG_311;W Max niveaus -HISTORY_MSG_312;W Schaduwen drempel -HISTORY_MSG_313;W Pastel Verzadigd -HISTORY_MSG_314;W Artefacten blauwe lucht -HISTORY_MSG_315;W Contrast Rest afbeelding -HISTORY_MSG_316;W Tinten huid -HISTORY_MSG_317;W Tinten reeks Huid -HISTORY_MSG_318;W Hoge lichten niveau -HISTORY_MSG_319;W Hoge lichten reeks -HISTORY_MSG_320;W Schaduwen reeks -HISTORY_MSG_321;W Schaduwen niveau -HISTORY_MSG_322;W kleurverschuiving -HISTORY_MSG_323;W Chroma niveau -HISTORY_MSG_324;W Chroma pastel -HISTORY_MSG_325;W Chroma verzadigd -HISTORY_MSG_326;W Chroma methode -HISTORY_MSG_327;W Contrast methode -HISTORY_MSG_328;W Chroma koppelen -HISTORY_MSG_329;W Dekking Rood-Groen -HISTORY_MSG_330;W Dekking Blauw-Geel -HISTORY_MSG_331;W Extra -HISTORY_MSG_332;W Tegels Methode -HISTORY_MSG_333;W Schaduwen Rest afbeelding -HISTORY_MSG_334;W Chroma -HISTORY_MSG_335;W Hoge lichten Rest afbeelding -HISTORY_MSG_336;W Hoge lichten drempel -HISTORY_MSG_337;W Tinten reeks Lucht -HISTORY_MSG_338;W Randen Straal -HISTORY_MSG_339;W Randen Waarde -HISTORY_MSG_340;W Sterkte -HISTORY_MSG_341;W - Rand prestaties -HISTORY_MSG_342;W - RS - Eerste niveau -HISTORY_MSG_343;W - Chroma niveau -HISTORY_MSG_344;W - Meth chroma balk/curve -HISTORY_MSG_345;W - RS - Lokaal contrast -HISTORY_MSG_346;W - RS - Lokaal contrast methode -HISTORY_MSG_347;W - RO - Niveau 0 -HISTORY_MSG_348;W - RO - Niveau 1 -HISTORY_MSG_349;W - RO - Niveau 2 -HISTORY_MSG_350;W - RS - Rand detectie -HISTORY_MSG_351;W - Rest - HH curve -HISTORY_MSG_352;W - Achtergrond -HISTORY_MSG_353;W - RS - Gradiënt gevoeligheid -HISTORY_MSG_354;W - RS - Verbeteren -HISTORY_MSG_355;W - RS - Drempel laag -HISTORY_MSG_356;W - RS - Drempel hoog -HISTORY_MSG_357;W - RO - Koppel met RS -HISTORY_MSG_358;W - Gamut - CH +HISTORY_MSG_296;RO - Luminantiecurve +HISTORY_MSG_297;RO - Modus +HISTORY_MSG_298;Dodepixels-filter +HISTORY_MSG_299;RO - Chrominantiecurve +HISTORY_MSG_301;RO - Luma-controle +HISTORY_MSG_302;RO - Chroma-methode +HISTORY_MSG_303;RO - Chroma-methode +HISTORY_MSG_304;Wavelets - Contrastniveaus +HISTORY_MSG_305;Wavelets - Niveaus +HISTORY_MSG_306;Wavelets - Proces +HISTORY_MSG_307;Wavelets - Ch-niveau +HISTORY_MSG_308;Wavelets - richting +HISTORY_MSG_309;Wavelets - tegels +HISTORY_MSG_310;Wavelets - Tinten lucht +HISTORY_MSG_311;Wavelets - Max. niveaus +HISTORY_MSG_312;Wavelets - Schaduwen drempel +HISTORY_MSG_313;Wavelets - Pastel Verzadigd +HISTORY_MSG_314;Wavelets - Artefacten blauwe lucht +HISTORY_MSG_315;Wavelets - Contrast Residuele afbeelding +HISTORY_MSG_316;Wavelets - Tinten huid +HISTORY_MSG_317;Wavelets - Tinten reeks Huid +HISTORY_MSG_318;Wavelets - Hoge lichten niveau +HISTORY_MSG_319;Wavelets - Hoge lichten reeks +HISTORY_MSG_320;Wavelets - Schaduwen reeks +HISTORY_MSG_321;Wavelets - Schaduwen niveau +HISTORY_MSG_322;Wavelets - kleurverschuiving +HISTORY_MSG_323;Wavelets - Chroma niveau +HISTORY_MSG_324;Wavelets - Chroma pastel +HISTORY_MSG_325;Wavelets - Chroma verzadigd +HISTORY_MSG_326;Wavelets - Chroma methode +HISTORY_MSG_327;Wavelets - Contrast methode +HISTORY_MSG_328;Wavelets - Chroma koppelen +HISTORY_MSG_329;Wavelets - Dekking Rood-Groen +HISTORY_MSG_330;Wavelets - Dekking Blauw-Geel +HISTORY_MSG_331;Wavelets - Extra +HISTORY_MSG_332;Wavelets - Tegels Methode +HISTORY_MSG_333;Wavelets - Schaduwen Residuele afbeelding +HISTORY_MSG_334;Wavelets - Chroma +HISTORY_MSG_335;Wavelets - Hoge lichten Residuele afbeelding +HISTORY_MSG_336;Wavelets - Hoge lichten drempel +HISTORY_MSG_337;Wavelets - Tinten reeks Lucht +HISTORY_MSG_338;Wavelets - Randen Straal +HISTORY_MSG_339;Wavelets - Randen Waarde +HISTORY_MSG_340;Wavelets - Sterkte +HISTORY_MSG_341;Wavelets - Rand prestaties +HISTORY_MSG_342;Wavelets - RS - Eerste niveau +HISTORY_MSG_343;Wavelets - Chroma niveau +HISTORY_MSG_344;Wavelets - Meth chroma balk/curve +HISTORY_MSG_345;Wavelets - RS - Lokaal contrast +HISTORY_MSG_346;Wavelets - RS - Lokaal contrast methode +HISTORY_MSG_347;Wavelets - RO - Niveau 0 +HISTORY_MSG_348;Wavelets - RO - Niveau 1 +HISTORY_MSG_349;Wavelets - RO - Niveau 2 +HISTORY_MSG_350;Wavelets - RS - Randdetectie +HISTORY_MSG_351;Wavelets - Rest - HH-curve +HISTORY_MSG_352;Wavelets - Achtergrond +HISTORY_MSG_353;Wavelets - RS - Gradiënt gevoeligheid +HISTORY_MSG_354;Wavelets - RS - Verbeteren +HISTORY_MSG_355;Wavelets - RS - Drempel laag +HISTORY_MSG_356;Wavelets - RS - Drempel hoog +HISTORY_MSG_357;Wavelets - RO - Koppel met RS +HISTORY_MSG_358;Wavelets - Gamut - CH HISTORY_MSG_359;Hete/Dode - Drempel HISTORY_MSG_360;TM Gamma -HISTORY_MSG_361;W - Finale - Chroma balans -HISTORY_MSG_362;W - Rest - Compressie methode -HISTORY_MSG_363;W - Rest - Compressie sterkte -HISTORY_MSG_364;W - Finale - Contrast balans -HISTORY_MSG_365;W - Finale - Balans niveau -HISTORY_MSG_366;W - Rest - Compressie gamma -HISTORY_MSG_367;W - RS - Lokaal contrast curve -HISTORY_MSG_368;W - Finale - Contrast balans -HISTORY_MSG_369;W - Finale - Balans methode -HISTORY_MSG_370;W - Finale - Lokaal contrast curve +HISTORY_MSG_361;Wavelets - Finale - Chroma balans +HISTORY_MSG_362;Wavelets - Residueel - Compressiemethode +HISTORY_MSG_363;Wavelets - Residueel - Compressiesterkte +HISTORY_MSG_364;Wavelets - Finale - Contrastbalans +HISTORY_MSG_365;Wavelets - Finale - Balansniveau +HISTORY_MSG_366;Wavelets - Residueel - Compressie gamma +HISTORY_MSG_367;Wavelets - RS - Lokaal contrast curve +HISTORY_MSG_368;Wavelets - Finale - Contrast balans +HISTORY_MSG_369;Wavelets - Finale - Balans methode +HISTORY_MSG_370;Wavelets - Finale - Lokaal contrastcurve HISTORY_MSG_371;Post-Verkleinen Verscherpen HISTORY_MSG_372;PVV OSM - Straal HISTORY_MSG_373;PVV OSM - Hoeveelheid HISTORY_MSG_374;PVV OSM - Drempel HISTORY_MSG_375;PVV OSM - Verscherp alleen randen -HISTORY_MSG_376;PVV OSM - Rand detectie straal -HISTORY_MSG_377;PVV OSM - Rand tolerantie -HISTORY_MSG_378;PVV OSM - Halo controle -HISTORY_MSG_379;PVV OSM - Halo controle hoeveelheid +HISTORY_MSG_376;PVV OSM - Randdetectie straal +HISTORY_MSG_377;PVV OSM - Randtolerantie +HISTORY_MSG_378;PVV OSM - Halocontrole +HISTORY_MSG_379;PVV OSM - Halocontrole hoeveelheid HISTORY_MSG_380;PVV - Methode HISTORY_MSG_381;PVV RLV - Straal HISTORY_MSG_382;PVV RLV - Hoeveelheid HISTORY_MSG_383;PVV RLV - Demping HISTORY_MSG_384;PVV RLV - Herhalingen -HISTORY_MSG_385;W - Rest - Kleurbalans -HISTORY_MSG_386;W - Rest - KB groen hoog -HISTORY_MSG_387;W - Rest - KB blauw hoog -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 -HISTORY_MSG_396;W - Contrast sub-tool -HISTORY_MSG_397;W - Chroma sub-tool -HISTORY_MSG_398;W - Randscherpte sub-tool -HISTORY_MSG_399;W - Rest sub-tool -HISTORY_MSG_400;W - Finale sub-tool -HISTORY_MSG_401;W - Tinten sub-tool -HISTORY_MSG_402;W - RO sub-tool -HISTORY_MSG_403;W - RS - Randgevoeligheid -HISTORY_MSG_404;W - RS - Basis versterken -HISTORY_MSG_405;W - RO - Niveau 4 -HISTORY_MSG_406;W - RS - Naburige pixels +HISTORY_MSG_385;Wavelets - Residueel - Kleurbalans +HISTORY_MSG_386;Wavelets - Residueel - KB groen hoog +HISTORY_MSG_387;Wavelets - Residueel - KB blauw hoog +HISTORY_MSG_388;Wavelets - Residueel - KB groen midden +HISTORY_MSG_389;Wavelets - Residueel - KB blauw midden +HISTORY_MSG_390;Wavelets - Residueel - KB groen laag +HISTORY_MSG_391;Wavelets - Residueel - KB blauw laag +HISTORY_MSG_392;Wavelets - Residueel - Kleurbalans +HISTORY_MSG_393;DCP 'Look'-tabel +HISTORY_MSG_394;DCP Basisbelichting +HISTORY_MSG_395;DCP Basistabel +HISTORY_MSG_396;Wavelets - Contrast sub-tool +HISTORY_MSG_397;Wavelets - Chroma sub-tool +HISTORY_MSG_398;Wavelets - Randscherpte sub-tool +HISTORY_MSG_399;Wavelets - Residueel sub-tool +HISTORY_MSG_400;Wavelets - Finale sub-tool +HISTORY_MSG_401;Wavelets - Tinten sub-tool +HISTORY_MSG_402;Wavelets - RO sub-tool +HISTORY_MSG_403;Wavelets - RS - Randgevoeligheid +HISTORY_MSG_404;Wavelets - RS - Basis versterken +HISTORY_MSG_405;Wavelets - RO - Niveau 4 +HISTORY_MSG_406;Wavelets - RS - Naburige pixels HISTORY_MSG_407;Retinex - Methode HISTORY_MSG_408;Retinex - Naburig HISTORY_MSG_410;Retinex - Beginpunt HISTORY_MSG_411;Retinex - Sterkte -HISTORY_MSG_412;Retinex - Gaussiaans Verloop +HISTORY_MSG_412;Retinex - Gaussiaans verloop HISTORY_MSG_413;Retinex - Variantie HISTORY_MSG_414;Retinex - Histogram - Lab HISTORY_MSG_415;Retinex - Transmissie HISTORY_MSG_416;Retinex -HISTORY_MSG_417;Retinex - Transmissie mediaan +HISTORY_MSG_417;Retinex - Transmissiemediaan HISTORY_MSG_418;Retinex - Drempel HISTORY_MSG_419;Retinex - Kleurruimte HISTORY_MSG_420;Retinex - Histogram - HSL HISTORY_MSG_421;Retinex - Gamma HISTORY_MSG_422;Retinex - Gamma HISTORY_MSG_423;Retinex - Gamma helling -HISTORY_MSG_424;Retinex - HL drempel +HISTORY_MSG_424;Retinex - HL-drempel HISTORY_MSG_425;Retinex - Log base HISTORY_MSG_426;Retinex - Tint balans -HISTORY_MSG_427;Uitvoer grafische weergave -HISTORY_MSG_428;Monitor grafische weergave +HISTORY_MSG_427;Weergave-intentie uitvoerprofiel +HISTORY_MSG_428;Weergave-intentie monitorprofiel HISTORY_MSG_429;Retinex - Herhalingen -HISTORY_MSG_430;Retinex - Transmissie Verloop -HISTORY_MSG_431;Retinex - Sterkte Verloop +HISTORY_MSG_430;Retinex - Transmissieverloop +HISTORY_MSG_431;Retinex - Sterkteverloop HISTORY_MSG_432;Retinex - M - Hoge lichten HISTORY_MSG_433;Retinex - M - Hoge lichten TW HISTORY_MSG_434;Retinex - M - Schaduwen @@ -684,31 +707,31 @@ 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 +HISTORY_MSG_443;Zwartpuntcompensatie uitvoerprofiel +HISTORY_MSG_444;WB - Temp. afwijking HISTORY_MSG_445;Raw Sub-afbeelding HISTORY_MSG_449;PV ISO toepassen HISTORY_MSG_452;PV Toon beweging HISTORY_MSG_453;PV Toon alleen masker HISTORY_MSG_457;PV Controleer rood/blauw HISTORY_MSG_462;PV Controleer groen -HISTORY_MSG_464;PV Vervagen bewagingsmasker +HISTORY_MSG_464;PV Vervagen bewegingsmasker HISTORY_MSG_465;PV Vervagen straal HISTORY_MSG_468;PV Vul holtes -HISTORY_MSG_469;PV Mediaann +HISTORY_MSG_469;PV Mediaan HISTORY_MSG_471;PV Bewegingscorrectie HISTORY_MSG_472;PV Zachte overgang HISTORY_MSG_474;PV Balans HISTORY_MSG_475;PS - Kanaalbalans -HISTORY_MSG_476;CAM02 - Temp uit +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_481;CAM02 - Temp. opname +HISTORY_MSG_482;CAM02 - Groen opname +HISTORY_MSG_483;CAM02 - Yb opname +HISTORY_MSG_484;CAM02 - Auto Yb opname HISTORY_MSG_485;Lenscorrectie HISTORY_MSG_486;Lenscorrectie - Camera HISTORY_MSG_487;Lenscorrectie - Lens @@ -716,70 +739,899 @@ 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_492;RGB-curven +HISTORY_MSG_493;L*a*b* aanpassingen HISTORY_MSG_494;verscherpen +HISTORY_MSG_496;SB - Spot verwijderd +HISTORY_MSG_497;SB - Spot geselecteerd +HISTORY_MSG_498;Lokaal - Spotnaam +HISTORY_MSG_499;Lokaal - Zichtbaarheid spot +HISTORY_MSG_500;SB - Spotvorm +HISTORY_MSG_501;SB - Spotmethode +HISTORY_MSG_502;SB - SC - Vorm method +HISTORY_MSG_503;SB - Spot - Rechts +HISTORY_MSG_504;SB - Spot - Links +HISTORY_MSG_505;SB - Spot - Onder +HISTORY_MSG_506;SB - Spot - Boven +HISTORY_MSG_507;SB - Spot - Centrum +HISTORY_MSG_508;SB - Spot - Grootte +HISTORY_MSG_509;SB - Spot kwaliteitsmethode +HISTORY_MSG_510;SB - TG - Transitiewaarde +HISTORY_MSG_511;SB - SD - Drempel ΔE-bereik +HISTORY_MSG_512;SB - SD - ΔE-verval +HISTORY_MSG_513;SB - Spot - Uitsluiting - bereik +HISTORY_MSG_514;SB - Spotstructuur +HISTORY_MSG_515;SB - Aanpassingen +HISTORY_MSG_516;SB - Kleur en Licht +HISTORY_MSG_517;SB - Activeer super +HISTORY_MSG_518;SB - Lichtheid +HISTORY_MSG_519;SB - Contrast +HISTORY_MSG_520;SB - Chrominantie +HISTORY_MSG_521;SB - Bereik +HISTORY_MSG_522;SB - Curvemethode +HISTORY_MSG_523;SB - LL-curve +HISTORY_MSG_524;SB - CC-curve +HISTORY_MSG_525;SB - LH-curve +HISTORY_MSG_526;SB - H-curve +HISTORY_MSG_527;SB - Inverteer kleur +HISTORY_MSG_528;SB - Belichting +HISTORY_MSG_529;SB - Belichtingscompensatie +HISTORY_MSG_530;SB - Bel. Hlcompr +HISTORY_MSG_531;SB - Bel. hlcomprthresh +HISTORY_MSG_532;SB - Bel. zwart +HISTORY_MSG_533;SB - Bel. Shcompr +HISTORY_MSG_534;SB - Warm Koel +HISTORY_MSG_535;SB - Bel. Bereik +HISTORY_MSG_536;SB - Bel. Contrastcurve +HISTORY_MSG_537;SB - Levendigheid +HISTORY_MSG_538;SB - Lev. Verzadigd +HISTORY_MSG_539;SB - Lev. Pastel +HISTORY_MSG_540;SB - Lev. Drempel +HISTORY_MSG_541;SB - Lev. Bescherm huidtonen +HISTORY_MSG_542;SB - Lev. Vermijd kleurverschuiving +HISTORY_MSG_543;SB - Lev. Koppel +HISTORY_MSG_544;SB - Lev. Bereik +HISTORY_MSG_545;SB - Lev. H-curve +HISTORY_MSG_546;SB - Vervaging en Ruisvermindering +HISTORY_MSG_547;SB - Straal +HISTORY_MSG_548;SB - Ruis +HISTORY_MSG_549;SB - Bereik ruisvermindering +HISTORY_MSG_550;SB - Methode ruisvermindering +HISTORY_MSG_551;SB - Ruisvermindering alleen Luminantie +HISTORY_MSG_552;SB - Toonmappen +HISTORY_MSG_553;SB - TM compressiesterkte +HISTORY_MSG_554;SB - TM gamma +HISTORY_MSG_555;SB - TM Randbehoud +HISTORY_MSG_556;SB - TM Schaal +HISTORY_MSG_557;SB - TM Herwogen +HISTORY_MSG_558;SB - TM Bereik +HISTORY_MSG_559;SB - Retinex +HISTORY_MSG_560;SB - Retinex methode +HISTORY_MSG_561;SB - Retinex kracht +HISTORY_MSG_562;SB - Retinex chroma +HISTORY_MSG_563;SB - Retinex straal +HISTORY_MSG_564;SB - Retinex contrast +HISTORY_MSG_565;SB - Bereik +HISTORY_MSG_566;SB - Retinex versterkingscurve +HISTORY_MSG_567;SB - Retinex Omgekeerd +HISTORY_MSG_568;SB - Verscherping +HISTORY_MSG_569;SB - Sh Straal +HISTORY_MSG_570;SB - Sh Hoeveelheid +HISTORY_MSG_571;SB - Sh Demping +HISTORY_MSG_572;SB - Sh Herhalingen +HISTORY_MSG_573;SB - Sh Bereik +HISTORY_MSG_574;SB - Sh Omgekeerd +HISTORY_MSG_575;SB - CBDL +HISTORY_MSG_576;SB - cbdl mult +HISTORY_MSG_577;SB - cbdl chroma +HISTORY_MSG_578;SB - cbdl drempel +HISTORY_MSG_579;SB - cbdl bereik +HISTORY_MSG_581;SB - Ruisverm. lum f 1 +HISTORY_MSG_582;SB - Ruisverm. lum c +HISTORY_MSG_583;SB - Ruisverm. lum detail +HISTORY_MSG_584;SB - Ruisverm. equalizer Wit-Zwart +HISTORY_MSG_585;SB - Ruisverm. chro f +HISTORY_MSG_586;SB - Ruisverm. chro c +HISTORY_MSG_587;SB - Ruisverm. chro detail +HISTORY_MSG_588;SB - Ruisverm. equalizer Blauw-Rood +HISTORY_MSG_589;SB - Ruisverm. bilateraal +HISTORY_MSG_590;SB - Ruisverm. bereik +HISTORY_MSG_591;SB - Voorkom kleurverschuiving +HISTORY_MSG_592;SB - Sh Contrast +HISTORY_MSG_593;SB - LA contrast +HISTORY_MSG_594;SB - Lokaal contrast straal +HISTORY_MSG_595;SB - Lokaal contrast hoeveelheid +HISTORY_MSG_596;SB - Lokaal contrast donkerte +HISTORY_MSG_597;SB - Lokaal contrast lichtheid +HISTORY_MSG_598;SB - Lokaal contrast bereik +HISTORY_MSG_599;SB - Retinex nevelvermindering +HISTORY_MSG_600;SB - Zacht licht activeer +HISTORY_MSG_601;SB - Zacht licht kracht +HISTORY_MSG_602;SB - Zacht licht bereik +HISTORY_MSG_603;SB - Sh Vervagingsradius +HISTORY_MSG_605;SB - Keuze maskervoorbeeld +HISTORY_MSG_606;SB - Spot geslecteerd +HISTORY_MSG_607;SB - Kleurmasker C +HISTORY_MSG_608;SB - Kleurmasker L +HISTORY_MSG_609;SB - Bel.masker C +HISTORY_MSG_610;SB - Bel.masker L +HISTORY_MSG_611;SB - Kleurmasker H +HISTORY_MSG_612;SB - Kleur structuur +HISTORY_MSG_613;SB - Bel. structuur +HISTORY_MSG_614;SB - Bel.masker H +HISTORY_MSG_615;SB - Meng kleur +HISTORY_MSG_616;SB - Meng bel. +HISTORY_MSG_617;SB - Vervaag Bel. +HISTORY_MSG_618;SB - Gebruik kleurmasker +HISTORY_MSG_619;SB - Gebruik bel.masker +HISTORY_MSG_620;SB - Meng col +HISTORY_MSG_621;SB - Bel. omgekeerd +HISTORY_MSG_622;SB - Spot - Uitsluiting - Spotstructuur +HISTORY_MSG_623;SB - Bel. Chroma-compensatie +HISTORY_MSG_624;SB - Kleurcorrectieraster +HISTORY_MSG_625;SB - Kleurcorrectie kracht +HISTORY_MSG_626;SB - Kleurcorrectie methode +HISTORY_MSG_627;SB - Schaduw Hoge lichten +HISTORY_MSG_628;SB - SH Hoge lichten +HISTORY_MSG_629;SB - SH H tonaalomvang +HISTORY_MSG_630;SB - SH Schaduwen +HISTORY_MSG_631;SB - SH S tonaalomvang +HISTORY_MSG_632;SB - SH straal +HISTORY_MSG_633;SB - SH bereik +HISTORY_MSG_634;SB - straal kleur +HISTORY_MSG_635;SB - straal Bel. +HISTORY_MSG_636;SB - Gereedschap toegevoegd +HISTORY_MSG_637;SB - SH Masker C +HISTORY_MSG_638;SB - SH Masker L +HISTORY_MSG_639;SB - SH Masker H +HISTORY_MSG_640;SB - SH meng +HISTORY_MSG_641;SB - Gebruik SH-masker +HISTORY_MSG_642;SB - Straal SH +HISTORY_MSG_643;SB - Vervaag SH +HISTORY_MSG_644;SB - Keer SH om +HISTORY_MSG_645;SB - SD - ab-L-balans +HISTORY_MSG_646;SB - Bel.masker chroma +HISTORY_MSG_647;SB - Bel.masker gamma +HISTORY_MSG_648;SB - Bel.masker helling +HISTORY_MSG_649;SB - Bel. verzachting straal +HISTORY_MSG_650;SB - Kleurmasker chroma +HISTORY_MSG_651;SB - Kleurmasker gamma +HISTORY_MSG_652;SB - Kleurmasker helling +HISTORY_MSG_653;SB - SH-masker chroma +HISTORY_MSG_654;SB - SH-masker gamma +HISTORY_MSG_655;SB - SH-masker helling +HISTORY_MSG_656;SB - Kleur zachte radius +HISTORY_MSG_657;SB - Retinex verminder onregelmatigheden +HISTORY_MSG_658;SB - CBDL zachte radius +HISTORY_MSG_659;SB - TG - Transitieverval +HISTORY_MSG_660;SB - CBDL klaarheid +HISTORY_MSG_661;SB - CBDL residueel contrast +HISTORY_MSG_662;SB - Verminder ruis lum f 0 +HISTORY_MSG_663;SB - Verminder ruis lum f 2 +HISTORY_MSG_665;SB - cbdl masker meng +HISTORY_MSG_666;SB - cbdl masker straal +HISTORY_MSG_667;SB - cbdl masker chroma +HISTORY_MSG_668;SB - cbdl masker gamma +HISTORY_MSG_669;SB - cbdl masker helling +HISTORY_MSG_670;SB - cbdl masker C +HISTORY_MSG_671;SB - cbdl masker L +HISTORY_MSG_672;SB - cbdl masker CL +HISTORY_MSG_673;SB - Gebruik cbdl-masker +HISTORY_MSG_674;SB - Gereedschap verwijderd +HISTORY_MSG_675;SB - TM verzacht straal +HISTORY_MSG_676;SB - TG - Transitiedifferentie +HISTORY_MSG_677;SB - TM hoeveelheid +HISTORY_MSG_678;SB - TM verzadiging +HISTORY_MSG_679;SB - Retinex masker C +HISTORY_MSG_680;SB - Retinex masker L +HISTORY_MSG_681;SB - Retinex masker CL +HISTORY_MSG_682;SB - Retinex masker +HISTORY_MSG_683;SB - Retinex masker meng +HISTORY_MSG_684;SB - Retinex masker straal +HISTORY_MSG_685;SB - Retinex masker chroma +HISTORY_MSG_686;SB - Retinex masker gamma +HISTORY_MSG_687;SB - Retinex masker helling +HISTORY_MSG_688;SB - Gereedschap verwijderd +HISTORY_MSG_689;SB - Retinex masker transmissiemap +HISTORY_MSG_690;SB - Retinex schaal +HISTORY_MSG_691;SB - Retinex donkerte +HISTORY_MSG_692;SB - Retinex lichtheid +HISTORY_MSG_693;SB - Retinex drempel +HISTORY_MSG_694;SB - Retinex Laplacian drempel +HISTORY_MSG_695;SB - Verzachting methode +HISTORY_MSG_696;SB - Retinex Normaliseer +HISTORY_MSG_697;SB - TM Normaliseer +HISTORY_MSG_698;SB - LA contrast Fast Fourier +HISTORY_MSG_699;SB - Retinex Fast Fourier +HISTORY_MSG_701;SB - Bel. Schaduwen +HISTORY_MSG_702;SB - Bel. Methode +HISTORY_MSG_703;SB - Bel. Laplacian drempel +HISTORY_MSG_704;SB - Bel. PDE-balans +HISTORY_MSG_705;SB - Bel. lineariteit +HISTORY_MSG_706;SB - TM masker C +HISTORY_MSG_707;SB - TM masker L +HISTORY_MSG_708;SB - TM masker CL +HISTORY_MSG_709;SB - gebruik TM-masker +HISTORY_MSG_710;SB - TM-masker meng +HISTORY_MSG_711;SB - TM-masker straal +HISTORY_MSG_712;SB - TM-masker chroma +HISTORY_MSG_713;SB - TM-masker gamma +HISTORY_MSG_714;SB - TM-masker helling +HISTORY_MSG_716;SB - LA methode +HISTORY_MSG_717;SB - LA contrast +HISTORY_MSG_718;SB - LA contrastniveaus +HISTORY_MSG_719;SB - LA contrast residueel L +HISTORY_MSG_720;SB - Vervagingsmasker C +HISTORY_MSG_721;SB - Vervagingsmasker L +HISTORY_MSG_722;SB - Vervagingsmasker CL +HISTORY_MSG_723;SB - Gebruik vervagingsmasker +HISTORY_MSG_725;SB - Vervagingsmasker meng +HISTORY_MSG_726;SB - Vervagingsmasker straal +HISTORY_MSG_727;SB - Vervagingsmasker chroma +HISTORY_MSG_728;SB - Vervagingsmasker gamma +HISTORY_MSG_729;SB - Vervagingsmasker helling +HISTORY_MSG_730;SB - Vervaging methode +HISTORY_MSG_731;SB - mediaanmethod +HISTORY_MSG_732;SB - mediaan herhalingen +HISTORY_MSG_733;SB - straal zacht +HISTORY_MSG_734;SB - detail +HISTORY_MSG_738;SB - Lokaal contrast meng L +HISTORY_MSG_739;SB - Lokaal contrast zacht straal +HISTORY_MSG_740;SB - Lokaal contrast Meng C +HISTORY_MSG_741;SB - Lokaal contrast Residueel C +HISTORY_MSG_742;SB - Exp Laplacian gamma +HISTORY_MSG_743;SB - Bel. Fattal Hoeveelheid +HISTORY_MSG_744;SB - Bel. Fattal Detail +HISTORY_MSG_745;SB - Bel. Fattal verschuiving +HISTORY_MSG_746;SB - Bel. Fattal Sigma +HISTORY_MSG_747;SB - Spot aangemaakt +HISTORY_MSG_748;SB - Bel. Ruisvermindering +HISTORY_MSG_749;SB - Reti Diepte +HISTORY_MSG_750;SB - Reti Modus log - lin +HISTORY_MSG_751;SB - Reti nevelvermindering verzadiging +HISTORY_MSG_752;SB - Reti Verschuiving +HISTORY_MSG_753;SB - Reti Transmissiemap +HISTORY_MSG_754;SB - Reti Kap +HISTORY_MSG_755;SB - TM gebruik tm-masker +HISTORY_MSG_756;SB - Bel. gebruik algo belichtingsmasker +HISTORY_MSG_757;SB - Bel. Laplacian-masker +HISTORY_MSG_758;SB - Reti Laplacian-masker +HISTORY_MSG_759;SB - Bel. Laplacian-masker +HISTORY_MSG_760;SB - Kleur Laplacian masker +HISTORY_MSG_761;SB - SH Laplacian-masker +HISTORY_MSG_762;SB - cbdl Laplacian-masker +HISTORY_MSG_763;SB - Blur Laplacian-masker +HISTORY_MSG_764;SB - Solve PDE Laplacian-masker +HISTORY_MSG_765;SB - Ruisvermindering detaildrempel +HISTORY_MSG_766;SB - Vervaag Fast Fourier +HISTORY_MSG_767;SB - Korrel ISO +HISTORY_MSG_768;SB - Korrel Sterkte +HISTORY_MSG_769;SB - Korrel Schaal +HISTORY_MSG_770;SB - Kleurmasker contrastcurve +HISTORY_MSG_771;SB - Bel.masker contrastcurve +HISTORY_MSG_772;SB - SH-masker contrastcurve +HISTORY_MSG_773;SB - TM-Masker contrastcurve +HISTORY_MSG_774;SB - Reti masker contrastcurve +HISTORY_MSG_775;SB - CBDL masker contrastcurve +HISTORY_MSG_776;SB - Vervaag-Ruisverminderingmasker contrastcurve +HISTORY_MSG_777;SB - Vervaagmasker lokale contrastcurve +HISTORY_MSG_778;SB - Maskeer hoge lichten +HISTORY_MSG_779;SB - Kleurmasker lokale contrastcurve +HISTORY_MSG_780;SB - Kleurmasker schaduwen +HISTORY_MSG_781;SB - Contrastmasker Wavelet-niveau +HISTORY_MSG_782;SB - Vervaag-Ruisverminderingmasker Wavelet-niveaus +HISTORY_MSG_783;SB - Kleur Wavelet-niveaus +HISTORY_MSG_784;SB - masker - ΔE beeldmasker +HISTORY_MSG_785;SB - masker - bereik +HISTORY_MSG_786;SB - SH-methode +HISTORY_MSG_787;SB - Equalizer vermenigvuldiger +HISTORY_MSG_788;SB - Equalizer detail +HISTORY_MSG_789;SB - SH-masker hoeveelheid +HISTORY_MSG_790;SB - SH-masker anker +HISTORY_MSG_791;SB - masker Short L-curven +HISTORY_MSG_792;SB - masker - Achtergrond +HISTORY_MSG_793;SB - SH TRC gamma +HISTORY_MSG_794;SB - SH TRC helling +HISTORY_MSG_795;SB - masker bewaar herstel beeld +HISTORY_MSG_796;SB - SC - Recursieve referenties +HISTORY_MSG_797;SB - Meng Originele methode +HISTORY_MSG_798;SB - Opaciteit +HISTORY_MSG_799;SB - Kleur RGB Tooncurve +HISTORY_MSG_800;SB - Kleur Tooncurve Methode +HISTORY_MSG_801;SB - Kleur Tooncurve Speciaal +HISTORY_MSG_802;SB - Contrastdrempel +HISTORY_MSG_803;SB - Kleurmengen +HISTORY_MSG_804;SB - Kleurmaskerstructuur +HISTORY_MSG_805;SB - Vervaging Ruisonderdrukking maskerstructuur +HISTORY_MSG_806;SB - Kleurmaskerstructuur als gereedschap +HISTORY_MSG_807;SB - Vervaging Ruisonderdrukkingsmasker structuur als gereedschap +HISTORY_MSG_808;SB - Kleurmasker curve H(H) +HISTORY_MSG_809;SB - Lev. maskercurve C(C) +HISTORY_MSG_810;SB - Lev. maskercurve L(L) +HISTORY_MSG_811;SB - Lev. maskercurve LC(H) +HISTORY_MSG_813;SB - Gebruik Levendigheid masker +HISTORY_MSG_814;SB - Lev. masker Meng +HISTORY_MSG_815;SB - Lev. masker straal +HISTORY_MSG_816;SB - Lev. masker chroma +HISTORY_MSG_817;SB - Lev. masker gamma +HISTORY_MSG_818;SB - Lev. masker helling +HISTORY_MSG_819;SB - Lev. masker laplacian +HISTORY_MSG_820;SB - Lev. masker contrastcurve +HISTORY_MSG_821;SB - kleurenraster achtergrond +HISTORY_MSG_822;SB - kleur achtergrond meng +HISTORY_MSG_823;SB - kleur achtergrond luminantie +HISTORY_MSG_824;SB - Bel. verloopmasker kracht +HISTORY_MSG_825;SB - Bel. verloopmasker hoek +HISTORY_MSG_826;SB - Bel. verloop kracht +HISTORY_MSG_827;SB - Bel. verloop hoek +HISTORY_MSG_828;SB - SH verloop kracht +HISTORY_MSG_829;SB - SH verloop hoek +HISTORY_MSG_830;SB - Keurverloop kracht L +HISTORY_MSG_831;SB - Keurverloop hoek +HISTORY_MSG_832;SB - Keurverloop kracht C +HISTORY_MSG_833;SB - TG - Veer verloop +HISTORY_MSG_834;SB - Keurverloop kracht H +HISTORY_MSG_835;SB - Lev. verloop kracht L +HISTORY_MSG_836;SB - Lev. verloop hoek +HISTORY_MSG_837;SB - Lev. verloop kracht C +HISTORY_MSG_838;SB - Lev. verloop kracht H +HISTORY_MSG_839;SB - Softwarecomplexiteit +HISTORY_MSG_840;SB - CL-curve +HISTORY_MSG_841;SB - LC-curve +HISTORY_MSG_842;SB - Vervagingsmasker Straal +HISTORY_MSG_843;SB - Vervagingsmasker Contrastdrempel +HISTORY_MSG_844;SB - Vervagingsmasker FFTW +HISTORY_MSG_845;SB - Log-codering +HISTORY_MSG_846;SB - Log-codering auto +HISTORY_MSG_847;SB - Log-codering Bron +HISTORY_MSG_849;SB - Log-codering Bron auto +HISTORY_MSG_850;SB - Log-codering B_Ev +HISTORY_MSG_851;SB - Log-codering W_Ev +HISTORY_MSG_852;SB - Log-codering Doel +HISTORY_MSG_853;SB - Log encodind lokaal contrast +HISTORY_MSG_854;SB - Log encodind bereik +HISTORY_MSG_855;SB - Log-codering gehele beeld +HISTORY_MSG_856;SB - Log-codering Schaduwen bereik +HISTORY_MSG_857;SB - Wavelet vervaging residueel +HISTORY_MSG_858;SB - Wavelet vervaging alleen luminantie +HISTORY_MSG_859;SB - Wavelet max. vervaging +HISTORY_MSG_860;SB - Wavelet vervaging niveaus +HISTORY_MSG_861;SB - Wavelet contrastniveaus +HISTORY_MSG_862;SB - Wavelet contrastversterking +HISTORY_MSG_863;SB - Wavelet meng met originele afbeelding +HISTORY_MSG_864;SB - Wavelet dir contrastversterking +HISTORY_MSG_865;SB - Wavelet dir contrast delta +HISTORY_MSG_866;SB - Wavelet dir compressie +HISTORY_MSG_868;SB - SD - C-H balans +HISTORY_MSG_869;SB - Ruisonderdrukking per niveau +HISTORY_MSG_870;SB - Wavelet masker curve H +HISTORY_MSG_871;SB - Wavelet masker curve C +HISTORY_MSG_872;SB - Wavelet masker curve L +HISTORY_MSG_873;SB - Wavelet masker +HISTORY_MSG_875;SB - Wavelet masker voeg samen +HISTORY_MSG_876;SB - Wavelet masker zacht +HISTORY_MSG_877;SB - Wavelet masker chroma +HISTORY_MSG_878;SB - Wavelet masker contrastcurve +HISTORY_MSG_879;SB - Wavelet contrast chroma +HISTORY_MSG_880;SB - Wavelet vervaging chroma +HISTORY_MSG_881;SB - Wavelet contrast verschuiving +HISTORY_MSG_882;SB - Wavelet vervaging +HISTORY_MSG_883;SB - Wavelet contrast per niveau +HISTORY_MSG_884;SB - Wavelet dir contrast +HISTORY_MSG_885;SB - Wavelet toonmapping +HISTORY_MSG_886;SB - Wavelet toonmapping comprimeer +HISTORY_MSG_887;SB - Wavelet toonmapping comprimeer residueel +HISTORY_MSG_888;SB - Contrast Wavelet Balans Drempel +HISTORY_MSG_889;SB - Contrast Wavelet Verloop Sterkte +HISTORY_MSG_890;SB - Contrast Wavelet Verloop hoek +HISTORY_MSG_891;SB - Contrast Wavelet Verloop +HISTORY_MSG_892;SB - Log Encoding Verloop kracht +HISTORY_MSG_893;SB - Log Encoding Verloop hoek +HISTORY_MSG_894;SB - SD - ΔE voorbeeld kleurintensiteit +HISTORY_MSG_897;SB - Contrast Wavelet ES kracht +HISTORY_MSG_898;SB - Contrast Wavelet ES straal +HISTORY_MSG_899;SB - Contrast Wavelet ES detail +HISTORY_MSG_900;SB - Contrast Wavelet ES verloop +HISTORY_MSG_901;SB - Contrast Wavelet ES drempel laag +HISTORY_MSG_902;SB - Contrast Wavelet ES drempel hoog +HISTORY_MSG_903;SB - Contrast Wavelet ES LA contrast +HISTORY_MSG_904;SB - Contrast Wavelet ES eerste niveau +HISTORY_MSG_905;SB - Contrast Wavelet Randscherpte +HISTORY_MSG_906;SB - Contrast Wavelet ES gevoeligheid +HISTORY_MSG_907;SB - Contrast Wavelet ES versterking +HISTORY_MSG_908;SB - Contrast Wavelet ES nabuur +HISTORY_MSG_909;SB - Contrast Wavelet ES toon +HISTORY_MSG_910;SB - SC - Wavelet Randprestaties +HISTORY_MSG_911;SB - Vervaging Chroma Luma +HISTORY_MSG_912;SB - Vervaging Gids filterkracht +HISTORY_MSG_913;SB - Contrast Wavelet Sigma DR +HISTORY_MSG_914;SB - Vervaging Wavelet Sigma BL +HISTORY_MSG_915;SB - Rand Wavelet Sigma ED +HISTORY_MSG_916;SB - Residueel wavelet schaduwen +HISTORY_MSG_917;SB - Residueel wavelet schaduwen drempel +HISTORY_MSG_918;SB - Residueel wavelet hoge lichten +HISTORY_MSG_919;SB - Residueel wavelet hoge lichten drempel +HISTORY_MSG_920;SB - Wavelet sigma LC +HISTORY_MSG_921;SB - Wavelet Gradueel sigma LC2 +HISTORY_MSG_922;SB - SC - Veranderingen in Z-W +HISTORY_MSG_923;SB - Gereedschapscomplexiteit modus +HISTORY_MSG_924;--unused-- +HISTORY_MSG_925;SB - bereik (kleurgereedschappen) +HISTORY_MSG_926;SB - Toon maskertype +HISTORY_MSG_927;SB - Schaduw +HISTORY_MSG_928;SB - Algemeen kleurenmasker +HISTORY_MSG_929;SB - Masker Algemeen Bereik +HISTORY_MSG_930;SB - Masker Algemeen Meng luma +HISTORY_MSG_931;SB - Masker Algemeen activeer +HISTORY_MSG_932;SB - Masker Algemeen straal zacht +HISTORY_MSG_933;SB - Masker Algemeen laplacian +HISTORY_MSG_934;SB - Masker Algemeen chroma +HISTORY_MSG_935;SB - Masker Algemeen gamma +HISTORY_MSG_936;SB - Masker Algemeen helling +HISTORY_MSG_937;SB - Masker Algemeen curve C(C) +HISTORY_MSG_938;SB - Masker Algemeen curve L(L) +HISTORY_MSG_939;SB - Masker Algemeen curve LC(H) +HISTORY_MSG_940;SB - Masker Algemeen structuur als gereedschap +HISTORY_MSG_941;SB - Masker Algemeen structuurkracht +HISTORY_MSG_942;SB - Masker Algemeen H(H) curve +HISTORY_MSG_943;SB - Masker Algemeen FFT +HISTORY_MSG_944;SB - Masker Algemeen Vervaging straal +HISTORY_MSG_945;SB - Masker Algemeen contrastdrempel +HISTORY_MSG_946;SB - Masker Algemeen schaduwen +HISTORY_MSG_947;SB - Masker Algemeen Contrastcurve +HISTORY_MSG_948;SB - Masker Algemeen Wavelet-curve +HISTORY_MSG_949;SB - Masker Algemeen Drempel niveaus +HISTORY_MSG_950;SB - Masker Algemeen GF kracht +HISTORY_MSG_951;SB - Masker Algemeen GF hoek +HISTORY_MSG_952;SB - Masker Algemeen zacht straal +HISTORY_MSG_953;SB - Masker Algemeen meng chroma +HISTORY_MSG_954;SB - Toon/verberg gereedschappen +HISTORY_MSG_955;SB - Activeer Spot +HISTORY_MSG_956;SB - CH-curve +HISTORY_MSG_957;SB - Ruisonderdrukking modus +HISTORY_MSG_958;SB - Toon/verberg instellingen +HISTORY_MSG_959;SB - Inverteer vervaging +HISTORY_MSG_960;SB - Log-codering - cat16 +HISTORY_MSG_961;SB - Log-codering Ciecam +HISTORY_MSG_962;SB - Log-codering Absolute luminantie bron +HISTORY_MSG_963;SB - Log-codering Absolute luminantie doel +HISTORY_MSG_964;SB - Log-codering Omgeving +HISTORY_MSG_965;SB - Log-codering Verzadiging s +HISTORY_MSG_966;SB - Log-codering Contrast J +HISTORY_MSG_967;SB - Log-codering masker curve C +HISTORY_MSG_968;SB - Log-codering masker curve L +HISTORY_MSG_969;SB - Log-codering masker curve H +HISTORY_MSG_970;SB - Log-codering masker geactiveerd +HISTORY_MSG_971;SB - Log-codering masker meng +HISTORY_MSG_972;SB - Log-codering masker straal +HISTORY_MSG_973;SB - Log-codering masker chroma +HISTORY_MSG_974;SB - Log-codering masker contrast +HISTORY_MSG_975;SB - Log-codering Lichtheid J +HISTORY_MSG_977;SB - Log-codering Contrast Q +HISTORY_MSG_978;SB - Log-codering Sursource +HISTORY_MSG_979;SB - Log-codering Helderheid Q +HISTORY_MSG_980;SB - Log-codering Kleurrijkheid M +HISTORY_MSG_981;SB - Log-codering Kracht +HISTORY_MSG_982;SB - Equalizer tint +HISTORY_MSG_983;SB - Ruisonderdrukking drempel masker hoog +HISTORY_MSG_984;SB - Ruisonderdrukking drempel masker laag +HISTORY_MSG_985;SB - Ruisonderdrukking Laplacian +HISTORY_MSG_986;SB - Ruisonderdrukking versterk +HISTORY_MSG_987;SB - GF herstel drempel +HISTORY_MSG_988;SB - GF drempel masker laag +HISTORY_MSG_989;SB - GF drempel masker hoog +HISTORY_MSG_990;SB - Ruisonderdrukking herstel drempel +HISTORY_MSG_991;SB - Ruisonderdrukking drempel masker laag +HISTORY_MSG_992;SB - Ruisonderdrukking drempel masker hoog +HISTORY_MSG_993;SB - Ruisonderdrukking Omgekeerd algo +HISTORY_MSG_994;SB - GF Omgekeerd algo +HISTORY_MSG_995;SB - Ruisonderdrukking verval +HISTORY_MSG_996;SB - Kleurherstel drempel +HISTORY_MSG_997;SB - Kleurherstel masker laag +HISTORY_MSG_998;SB - Kleur drempel masker hoog +HISTORY_MSG_999;SB - Kleur verval +HISTORY_MSG_1000;SB - Ruisonderdrukking luminantie grijs +HISTORY_MSG_1001;SB - Log herstel drempel +HISTORY_MSG_1002;SB - Log drempel masker laag +HISTORY_MSG_1003;SB - Log drempel masker hoog +HISTORY_MSG_1004;SB - Log verval +HISTORY_MSG_1005;SB - Bel. herstel drempel +HISTORY_MSG_1006;SB - Bel. drempel masker laag +HISTORY_MSG_1007;SB - Bel. drempel masker hoog +HISTORY_MSG_1008;SB - Bel. verval +HISTORY_MSG_1009;SB - SH herstel drempel +HISTORY_MSG_1010;SB - SH drempel masker laag +HISTORY_MSG_1011;SB - SH drempel masker hoog +HISTORY_MSG_1012;SB - SH verval +HISTORY_MSG_1013;SB - lev. herstel drempel +HISTORY_MSG_1014;SB - lev. drempel masker laag +HISTORY_MSG_1015;SB - lev. drempel masker hoog +HISTORY_MSG_1016;SB - lev. verval +HISTORY_MSG_1017;SB - lc herstel drempel +HISTORY_MSG_1018;SB - lc drempel masker laag +HISTORY_MSG_1019;SB - lc drempel masker hoog +HISTORY_MSG_1020;SB - lc verval +HISTORY_MSG_1021;SB - Ruisonderdrukking chrominantie grijs +HISTORY_MSG_1022;SB - TM herstel drempel +HISTORY_MSG_1023;SB - TM drempel masker laag +HISTORY_MSG_1024;SB - TM drempel masker hoog +HISTORY_MSG_1025;SB - TM verval +HISTORY_MSG_1026;SB - cbdl herstel drempel +HISTORY_MSG_1027;SB - cbdl drempel masker laag +HISTORY_MSG_1028;SB - cbdl drempel masker hoog +HISTORY_MSG_1029;SB - cbdl verval +HISTORY_MSG_1030;SB - reti herstel drempel +HISTORY_MSG_1031;SB - reti drempel masker laag +HISTORY_MSG_1032;SB - reti drempel masker hoog +HISTORY_MSG_1033;SB - reti verval +HISTORY_MSG_1034;SB - Nlmeans - kracht +HISTORY_MSG_1035;SB - Nlmeans - detail +HISTORY_MSG_1036;SB - Nlmeans - patch +HISTORY_MSG_1037;SB - Nlmeans - straal +HISTORY_MSG_1038;SB - Nlmeans - gamma +HISTORY_MSG_1039;SB - Korrel - gamma +HISTORY_MSG_1040;SB - SC - Verzachtingsstraal +HISTORY_MSG_1041;SB - Spot - Munsell +HISTORY_MSG_1042;SB - Log-codring - drempel +HISTORY_MSG_1043;SB - Bel. - normaliseer +HISTORY_MSG_1044;SB - LA contrast kracht +HISTORY_MSG_1045;SB - Kleur en Licht kracht +HISTORY_MSG_1046;SB - Ruisonderdrukking kracht +HISTORY_MSG_1047;SB - SH en Toonequalizer kracht +HISTORY_MSG_1048;SB - DR en Belichting kracht +HISTORY_MSG_1049;SB - TM kracht +HISTORY_MSG_1050;SB - Log-codering chroma +HISTORY_MSG_1051;SB - residueel wavelet gamma +HISTORY_MSG_1052;SB - residueel wavelet helling +HISTORY_MSG_1053;SB - ruisonderdrukking gamma +HISTORY_MSG_1054;SB - Wavelet gamma +HISTORY_MSG_1055;SB - Kleur en Licht gamma +HISTORY_MSG_1056;SB - DR en Belichting gamma +HISTORY_MSG_1057;SB - CIECAM Geactiveerd +HISTORY_MSG_1058;SB - CIECAM Overall kracht +HISTORY_MSG_1059;SB - CIECAM Autogrijs +HISTORY_MSG_1060;SB - CIECAM Gemiddelde luminantie bron +HISTORY_MSG_1061;SB - CIECAM bron absoluut +HISTORY_MSG_1062;SB - CIECAM omgeving bron +HISTORY_MSG_1063;SB - CIECAM verzadiging +HISTORY_MSG_1064;SB - CIECAM Chroma +HISTORY_MSG_1065;SB - CIECAM lichtheid J +HISTORY_MSG_1066;SB - CIECAM helderheid +HISTORY_MSG_1067;SB - CIECAM Contrast J +HISTORY_MSG_1068;SB - CIECAM drempel +HISTORY_MSG_1069;SB - CIECAM contrast Q +HISTORY_MSG_1070;SB - CIECAM kleurrijkheid +HISTORY_MSG_1071;SB - CIECAM Absolute luminantie +HISTORY_MSG_1072;SB - CIECAM Gemiddelde luminantie +HISTORY_MSG_1073;SB - CIECAM Cat16 +HISTORY_MSG_1074;SB - CIECAM LA contrast +HISTORY_MSG_1075;SB - CIECAM kijkomgeving +HISTORY_MSG_1076;SB - CIECAM bereik +HISTORY_MSG_1077;SB - CIECAM modus +HISTORY_MSG_1078;SB - Rood/huidbescherming +HISTORY_MSG_1079;SB - CIECAM Sigmoid kracht J +HISTORY_MSG_1080;SB - CIECAM Sigmoid drempel +HISTORY_MSG_1081;SB - CIECAM Sigmoid meng +HISTORY_MSG_1082;SB - CIECAM Sigmoid Q BlackEv WhiteEv +HISTORY_MSG_1083;SB - CIECAM tint +HISTORY_MSG_1084;SB - Gebruikt Zwart LW - Wit LW +HISTORY_MSG_1085;SB - Jz lichtheid +HISTORY_MSG_1086;SB - Jz contrast +HISTORY_MSG_1087;SB - Jz chroma +HISTORY_MSG_1088;SB - Jz tint +HISTORY_MSG_1089;SB - Jz Sigmoid kracht +HISTORY_MSG_1090;SB - Jz Sigmoid drempel +HISTORY_MSG_1091;SB - Jz Sigmoid meng +HISTORY_MSG_1092;SB - Jz aanpassing +HISTORY_MSG_1093;SB - CAM model +HISTORY_MSG_1094;SB - Jz hoge lichten +HISTORY_MSG_1095;SB - Jz hoge lichten thr +HISTORY_MSG_1096;SB - Jz schaduwen +HISTORY_MSG_1097;SB - Jz schaduwen thr +HISTORY_MSG_1098;SB - Jz straal SH +HISTORY_MSG_1099;SB - Cz(Hz) Curve +HISTORY_MSG_1100;SB - Jz referentie 100 +HISTORY_MSG_1101;SB - Jz PQ remap +HISTORY_MSG_1102;SB - Jz(Hz) Curve +HISTORY_MSG_1103;SB - Levendigheid gamma +HISTORY_MSG_1104;SB - Scherp gamma +HISTORY_MSG_1105;SB - CIECAM Toon methode +HISTORY_MSG_1106;SB - CIECAM Toon curve +HISTORY_MSG_1107;SB - CIECAM Kleur methode +HISTORY_MSG_1108;SB - CIECAM Kleur curve +HISTORY_MSG_1109;SB - Jz(Jz) curve +HISTORY_MSG_1110;SB - Cz(Cz) curve +HISTORY_MSG_1111;SB - Cz(Jz) curve +HISTORY_MSG_1112;SB - forcejz +HISTORY_MSG_1113;SB - HDR PQ +HISTORY_MSG_1114;SB - Cie masker activeer +HISTORY_MSG_1115;SB - Cie masker curve C +HISTORY_MSG_1116;SB - Cie masker curve L +HISTORY_MSG_1117;SB - Cie masker curve H +HISTORY_MSG_1118;SB - Cie masker meng +HISTORY_MSG_1119;SB - Cie masker straal +HISTORY_MSG_1120;SB - Cie masker chroma +HISTORY_MSG_1121;SB - Cie masker contrast curve +HISTORY_MSG_1122;SB - Cie masker herstel drempel +HISTORY_MSG_1123;SB - Cie masker herstel donker +HISTORY_MSG_1124;SB - Cie masker herstel licht +HISTORY_MSG_1125;SB - Cie masker herstel verval +HISTORY_MSG_1126;SB - Cie masker laplacian +HISTORY_MSG_1127;SB - Cie masker gamma +HISTORY_MSG_1128;SB - Cie masker helling +HISTORY_MSG_1129;SB - Cie Relatieve luminantie +HISTORY_MSG_1130;SB - Cie Verzadiging Jz +HISTORY_MSG_1131;SB - masker - Ruisvermindering +HISTORY_MSG_1132;SB - Cie Wav sigma Jz +HISTORY_MSG_1133;SB - Cie Wav level Jz +HISTORY_MSG_1134;SB - Cie Wav LA contrast Jz +HISTORY_MSG_1135;SB - Cie Wav klaarheid Jz +HISTORY_MSG_1136;SB - Cie Wav klaarheid Cz +HISTORY_MSG_1137;SB - Cie Wav klaarheid Zacht +HISTORY_MSG_1138;SB - SB - Hz(Hz) Curve +HISTORY_MSG_1139;SB - Jz zacht Curven H +HISTORY_MSG_1140;SB - Jz Drempel chroma +HISTORY_MSG_1141;SB - chroma curve Jz(Hz) +HISTORY_MSG_1142;SB - kracht zacht +HISTORY_MSG_1143;SB - Jz blackev +HISTORY_MSG_1144;SB - Jz whiteev +HISTORY_MSG_1145;SB - Jz Log-codering +HISTORY_MSG_1146;SB - Jz Log-codering doel grijs +HISTORY_MSG_1147;SB - Jz BlackEv WhiteEv +HISTORY_MSG_1148;SB - Jz Sigmoid +HISTORY_MSG_1149;SB - Q Sigmoid +HISTORY_MSG_1150;SB - Log-codering Q in plaats van Sigmoid Q +HISTORY_MSG_BLSHAPE;Vervaag per niveau +HISTORY_MSG_BLURCWAV;Vervaging chroma +HISTORY_MSG_BLURWAV;Vervaging luminantie +HISTORY_MSG_BLUWAV;Versterkingsrespons +HISTORY_MSG_CATCAT;CAL - Instellingen - Modus +HISTORY_MSG_CATCOMPLEX;CAL - Instellingen - Complexiteit +HISTORY_MSG_CATMODEL;CAL - Instellingen - CAM 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_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_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_OFFSET;CT - verschuiving 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_COMPLEX;Waveletcomplexiteit +HISTORY_MSG_COMPLEXRETI;Retinexcomplexiteit +HISTORY_MSG_DEHAZE_DEPTH;Ontnevelen - Diepte +HISTORY_MSG_DEHAZE_ENABLED;Ontnevelen +HISTORY_MSG_DEHAZE_SATURATION;Nevelvermindering - Verzadiging +HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Ontnevelen - Toon dieptemap +HISTORY_MSG_DEHAZE_STRENGTH;Ontnevelen - Sterkte +HISTORY_MSG_DIRPYRDENOISE_GAIN;NR - Compenseer lichtheid HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual-demozaïek - auto-drempel HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual-demozaïek - Contrastdrempel +HISTORY_MSG_EDGEFFECT;Randversterking respons +HISTORY_MSG_FF_FROMMETADATA;Flat-Field - Uit metadata +HISTORY_MSG_FILMNEGATIVE_BALANCE;FN - Referentie-uitvoer +HISTORY_MSG_FILMNEGATIVE_COLORSPACE;Filmnegatief kleurruimte HISTORY_MSG_FILMNEGATIVE_ENABLED;Filmnegatief +HISTORY_MSG_FILMNEGATIVE_REF_SPOT;FN - Referentie-invoer 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_GAMUTMUNSEL;Gamut-Munsell +HISTORY_MSG_HISTMATCHING;Auto-tooncurve +HISTORY_MSG_HLBL;Kleurpropagatie - vervaging +HISTORY_MSG_HLTH;Inpaint opposed - versterking drempel +HISTORY_MSG_ICL_LABGRIDCIEXY;Cie xy +HISTORY_MSG_ICM_AINTENT;Abstract profiel - weergave-intentie +HISTORY_MSG_ICM_BLUX;Primair blauw X +HISTORY_MSG_ICM_BLUY;Primair blauw Y +HISTORY_MSG_ICM_CAT;Matrix-aanpassing +HISTORY_MSG_ICM_FBW;Zwart en wit +HISTORY_MSG_ICM_GAMUT;Beperk kleurbereik +HISTORY_MSG_ICM_GREX;Primair groen X +HISTORY_MSG_ICM_GREY;Primair groen Y +HISTORY_MSG_ICM_MIDTCIE;Middentonen +HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Uitvoer - Primaire kleuren +HISTORY_MSG_ICM_OUTPUT_TEMP;Uitvoer - ICC-v4 Lichtbron 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_ICM_PRESER;Behoud neutraal +HISTORY_MSG_ICM_REDX;Primair rood X +HISTORY_MSG_ICM_REDY;Primair rood Y +HISTORY_MSG_ICM_REFI;Kleurverfijning +HISTORY_MSG_ICM_SHIFTX;Kleurverfijning - Verschuif x +HISTORY_MSG_ICM_SHIFTY;Kleurverfijning - Verschuif y +HISTORY_MSG_ICM_SMOOTHCIE;Vloeiende hoge lichten +HISTORY_MSG_ICM_TRCEXP;Abstract Profiel +HISTORY_MSG_ICM_WORKING_GAMMA;Werkend - Gamma +HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Methode lichtsterkte +HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Methode primaire kleuren +HISTORY_MSG_ICM_WORKING_SLOPE;Werkend - Helling +HISTORY_MSG_ICM_WORKING_TRC_METHOD;Werkend - TRC-methode +HISTORY_MSG_ILLUM;CAL - SC - Lichtsterkte +HISTORY_MSG_LOCALCONTRAST_AMOUNT;Lokaal Contrast - Hoeveelheid +HISTORY_MSG_LOCALCONTRAST_DARKNESS;Lokaal Contrast - Donker HISTORY_MSG_LOCALCONTRAST_ENABLED;Lokaal Contrast HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Lokaal Contrast - Licht HISTORY_MSG_LOCALCONTRAST_RADIUS;Lokaal Contrast - Radius +HISTORY_MSG_LOCALLAB_TE_PIVOT;Lokaal - draaipunt Equalizer +HISTORY_MSG_LOCAL_CIEMASK_BLURCONT;Lokaal - CIECAM masker vervaging contrast +HISTORY_MSG_LOCAL_CIEMASK_BLURFFT;Lokaal - CIECAM masker vervaging FFTW +HISTORY_MSG_LOCAL_CIEMASK_BLURRAD;Lokaal - CIECAM masker vervaging straal +HISTORY_MSG_LOCAL_CIEMASK_CHH;Lokaal - CIECAM masker curve h(h) +HISTORY_MSG_LOCAL_CIEMASK_HIGH;Lokaal - CIECAM masker hoge lichten +HISTORY_MSG_LOCAL_CIEMASK_SHAD;Lokaal - CIECAM masker schaduwen +HISTORY_MSG_LOCAL_CIEMASK_STRU;Lokaal - CIECAM masker structuur +HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;Lokaal - CIECAM structuurmasker als gereedschap +HISTORY_MSG_LOCAL_CIEMASK_WLC;Lokaal - CIECAM masker wavelet L(L) +HISTORY_MSG_LOCAL_CIEMASK_WLEV;Lokaal - CIECAM masker wavelet niveaus +HISTORY_MSG_LOCAL_CIE_ANGGRAD;Lokaal - CIECAM verloop hoek +HISTORY_MSG_LOCAL_CIE_BLACKS;Lokaal - CIECAM Spreiding zwarten +HISTORY_MSG_LOCAL_CIE_BLUXL;Lokaal - CIECAM blauw X +HISTORY_MSG_LOCAL_CIE_BLUYL;Lokaal - CIECAM blauw Y +HISTORY_MSG_LOCAL_CIE_BRICOMP;Lokaal - CIECAM helderheidscompressie +HISTORY_MSG_LOCAL_CIE_BRICOMPTH;Lokaal - CIECAM drempel helderheidscompressie +HISTORY_MSG_LOCAL_CIE_BWCIE;Lokaal - CIECAM Zwart en Wit +HISTORY_MSG_LOCAL_CIE_CAT;Lokaal - Matrixaanpassing +HISTORY_MSG_LOCAL_CIE_DETAILJZ;Lokaal - JzCzHz Lokaal contrast +HISTORY_MSG_LOCAL_CIE_ENAMASKALL;Lokaal - CIECAM Alle maskergereedschappen +HISTORY_MSG_LOCAL_CIE_EXPPRECAM;Lokaal - CIECAM Pre-Cam +HISTORY_MSG_LOCAL_CIE_GAM;Lokaal - CIECAM Gamma +HISTORY_MSG_LOCAL_CIE_GAMUTCIE;Lokaal - CIECAM Kleuromvang +HISTORY_MSG_LOCAL_CIE_GREXL;Lokaal - CIECAM groen X +HISTORY_MSG_LOCAL_CIE_GREYL;Lokaal - CIECAM groen Y +HISTORY_MSG_LOCAL_CIE_ILL;Lokaal - CIECAM TRC Lichtbron +HISTORY_MSG_LOCAL_CIE_LOGCIEQ;Lokaal - CIECAM Log-codering Q +HISTORY_MSG_LOCAL_CIE_MIDT;Lokaal - CIECAM Middentonen +HISTORY_MSG_LOCAL_CIE_NORM;Lokaal - CIECAM Normaliseer L +HISTORY_MSG_LOCAL_CIE_PRIM;Lokaal - CIECAM TRC primaire kleuren +HISTORY_MSG_LOCAL_CIE_REDXL;Lokaal - CIECAM rood X +HISTORY_MSG_LOCAL_CIE_REDYL;Lokaal - CIECAM rood Y +HISTORY_MSG_LOCAL_CIE_REFI;Lokaal - CIECAM Verfijn kleuren +HISTORY_MSG_LOCAL_CIE_SATCIE;Lokaal - CIECAM Beperk verzadiging +HISTORY_MSG_LOCAL_CIE_SHIFTXL;Lokaal - CIECAM verschuif x +HISTORY_MSG_LOCAL_CIE_SHIFTYL;Lokaal - CIECAM verschuif y +HISTORY_MSG_LOCAL_CIE_SIG;Lokaal - Sigmoid +HISTORY_MSG_LOCAL_CIE_SIGADAP;Lokaal - CIECAM Sigmoid aanpasbaarheid +HISTORY_MSG_LOCAL_CIE_SIGMET;Lokaal - CIECAM Sigmoid methode +HISTORY_MSG_LOCAL_CIE_SLOP;Lokaal - CIECAM helling +HISTORY_MSG_LOCAL_CIE_SLOPESMO;Lokaal - CIECAM grijsbalans +HISTORY_MSG_LOCAL_CIE_SLOPESMOB;Lokaal - CIECAM blauwbalans +HISTORY_MSG_LOCAL_CIE_SLOPESMOG;Lokaal - CIECAM groenbalans +HISTORY_MSG_LOCAL_CIE_SLOPESMOR;Lokaal - CIECAM roodbalans +HISTORY_MSG_LOCAL_CIE_SMOOTH;Lokaal - CIECAM Schaal Yb opname +HISTORY_MSG_LOCAL_CIE_SMOOTHMET;Lokaal - CIECAM Zachte lichten methode +HISTORY_MSG_LOCAL_CIE_SMOOTHYB;Lokaal - CIECAM Schaal Yb weergave +HISTORY_MSG_LOCAL_CIE_SMOOTH_LUM;Lokaal - CIECAM Niveaus - Luminositeitsmodus +HISTORY_MSG_LOCAL_CIE_STRGRAD;Lokaal - CIECAM verloop kracht L +HISTORY_MSG_LOCAL_CIE_STRLOG;Lokaal - CIECAM Log-codering kracht +HISTORY_MSG_LOCAL_CIE_TRC;Lokaal - CIECAM TRC +HISTORY_MSG_LOCAL_CIE_WHITES;Lokaal - CIECAM Spreiding witten +HISTORY_MSG_LOCAL_DEHAZE_BLACK;Lokaal - Nevelvermindering Zwart +HISTORY_MSG_LOCAL_FEATHERCIE;Lokaal - CIECAM verloop verzachting +HISTORY_MSG_LOCAL_FEATHERCOL;Lokaal - kleur verloop verzachting +HISTORY_MSG_LOCAL_FEATHEREXE;Lokaal - Bel. verloop verzachting +HISTORY_MSG_LOCAL_FEATHERLOG;Lokaal - Log verloop verzachting +HISTORY_MSG_LOCAL_FEATHERMAS;Lokaal - masker algemeen verloop verzachting +HISTORY_MSG_LOCAL_FEATHERSH;Lokaal - SH verloop verzachting +HISTORY_MSG_LOCAL_FEATHERVIB;Lokaal - Vib verloop verzachting +HISTORY_MSG_LOCAL_FEATHERWAV;Lokaal - Wav verloop verzachting +HISTORY_MSG_LOCAL_GAMUTMUNSEL;Lokaal - SC - Voorkom kleurverschuiving +HISTORY_MSG_LOCAL_LOG_BLACKS;Lokaal - Log Zwartdistributie +HISTORY_MSG_LOCAL_LOG_COMPR;Lokaal - Log Comprimeer helderheid +HISTORY_MSG_LOCAL_LOG_SAT;Lokaal - Log Beperk verzadiging +HISTORY_MSG_LOCAL_LOG_WHITES;Lokaal - Log Witdistributie +HISTORY_MSG_LOCAL_TMO_SATUR;Lokaal Bel. Fattal-verzadiging 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_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_PDSHARPEN_RADIUS;CS - Straal +HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Toename hoekstraal +HISTORY_MSG_PERSP_CAM_ANGLE;Perspectief - Camera +HISTORY_MSG_PERSP_CAM_FL;Perspectief - Camera +HISTORY_MSG_PERSP_CAM_SHIFT;Perspectief - Camera +HISTORY_MSG_PERSP_CTRL_LINE;Perspectief - Controlelijnen +HISTORY_MSG_PERSP_METHOD;Perspectief - Methode +HISTORY_MSG_PERSP_PROJ_ANGLE;Perspectief - Herstel +HISTORY_MSG_PERSP_PROJ_ROTATE;Perspectief - PCA-rotatie +HISTORY_MSG_PERSP_PROJ_SHIFT;Perspectief - PCA +HISTORY_MSG_PIXELSHIFT_AVERAGE;PS - Gemiddeld HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demozaïekmethode voor beweging -HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;lijnruisfilter richting -HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lijnfilter +HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Lijnruisfilter richting +HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF-lijnfilter +HISTORY_MSG_PREPROCWB_MODE;Voorproces WB Modus +HISTORY_MSG_PROTAB;Protectie HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrastdrempel +HISTORY_MSG_RANGEAB;Reeks ab 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_RESIZE_LONGEDGE;Verander grootte - Lange zijde +HISTORY_MSG_RESIZE_SHORTEDGE;Verander grootte - Korte zijde HISTORY_MSG_SHARPENING_BLUR;Verscherpen - Vervagingsradius HISTORY_MSG_SHARPENING_CONTRAST;Verscherpen - Contrastdrempel HISTORY_MSG_SH_COLORSPACE;S/H - Kleurruimte +HISTORY_MSG_SIGMACOL;Chroma-versterking respons +HISTORY_MSG_SIGMADIR;Dir versterking respons +HISTORY_MSG_SIGMAFIN;Finale contrastversterking respons +HISTORY_MSG_SIGMATON;Toning versterking respons HISTORY_MSG_SOFTLIGHT_ENABLED;Zacht licht HISTORY_MSG_SOFTLIGHT_STRENGTH;Zacht licht - Sterkte +HISTORY_MSG_SPOT;Verwijder vlekken +HISTORY_MSG_SPOT_ENTRY;Vlekverwijdering - punt gewijzigd +HISTORY_MSG_TEMPOUT;CAM02 automatische temperatuur +HISTORY_MSG_THRESWAV;Balance drempel HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anker +HISTORY_MSG_TONE_EQUALIZER_BANDS;Toonequalizer - Banden +HISTORY_MSG_TONE_EQUALIZER_ENABLED;Toonequalizer +HISTORY_MSG_TONE_EQUALIZER_PIVOT;Toonequalizer - Draaipunt +HISTORY_MSG_TONE_EQUALIZER_REGULARIZATION;Toonequalizer - Regularisatie +HISTORY_MSG_TONE_EQUALIZER_SHOW_COLOR_MAP;Toonequalizer - Tonale map HISTORY_MSG_TRANS_METHOD;Geometrie - Methode +HISTORY_MSG_WAVBALCHROM;Equalizer chrominantie +HISTORY_MSG_WAVBALLUM;Equalizer luminantie +HISTORY_MSG_WAVBL;Vervagingsniveaus +HISTORY_MSG_WAVCHR;Vervagingsniveaus - vervaag chroma +HISTORY_MSG_WAVCHROMCO;Chroma ruw +HISTORY_MSG_WAVCHROMFI;Chroma fijn +HISTORY_MSG_WAVCLARI;Klaarheid +HISTORY_MSG_WAVDENLH;Nineau 5 +HISTORY_MSG_WAVDENOISE;Lokaal contrast +HISTORY_MSG_WAVDENOISEH;Hoge niveaus lokaal contrast +HISTORY_MSG_WAVDETEND;Details zacht +HISTORY_MSG_WAVEDGS;Rand stopping +HISTORY_MSG_WAVGUIDH;Lokaal contrast - Tintequalizer +HISTORY_MSG_WAVHUE;Equalizer tint +HISTORY_MSG_WAVLABGRID_VALUE;Toning - sluit kleuren uit +HISTORY_MSG_WAVLEVDEN;Hoog niveau lokaal contrast +HISTORY_MSG_WAVLEVELSIGM;Ruisvermindering - straal +HISTORY_MSG_WAVLEVSIGM;Straal +HISTORY_MSG_WAVLIMDEN;Interactie 56 14 +HISTORY_MSG_WAVLOWTHR;Drempel laag contrast +HISTORY_MSG_WAVMERGEC;Meng C +HISTORY_MSG_WAVMERGEL;Meng L +HISTORY_MSG_WAVMIXMET;Referentie lokaal contrast +HISTORY_MSG_WAVOFFSET;Verschuiving +HISTORY_MSG_WAVOLDSH;Oud algoritme +HISTORY_MSG_WAVQUAMET;Ruisvermindering modus +HISTORY_MSG_WAVRADIUS;Straal schaduwen-hoge lichten +HISTORY_MSG_WAVSCALE;Schaal +HISTORY_MSG_WAVSHOWMASK;Toon wavelet-masker +HISTORY_MSG_WAVSIGM;Sigma +HISTORY_MSG_WAVSIGMA;Versterkingsrespons +HISTORY_MSG_WAVSLIMET;Methode +HISTORY_MSG_WAVSOFTRAD;Zacht straal klaarheid +HISTORY_MSG_WAVSOFTRADEND;Zacht straal finaal +HISTORY_MSG_WAVSTREND;Kracht zacht +HISTORY_MSG_WAVTHRDEN;Drempel lokaal contrast +HISTORY_MSG_WAVTHREND;Drempel lokaal contrast +HISTORY_MSG_WAVUSHAMET;Klaarheid methode +HISTORY_MSG_WBALANCE_OBSERVER10;Observer 10° +HISTORY_MSG_WBITC_CUSTOM;Itcwb Aangepast +HISTORY_MSG_WBITC_DELTA;Itcwb Delta groen +HISTORY_MSG_WBITC_FGREEN;Itcwb Groen - student +HISTORY_MSG_WBITC_FORCE;Itcwb Kracht +HISTORY_MSG_WBITC_GREEN;Groenverfijning +HISTORY_MSG_WBITC_MINSIZE;Patch min grootte +HISTORY_MSG_WBITC_NOPURPLE;Itcwb Nopurple +HISTORY_MSG_WBITC_OBS;Verwijder algo 2x +HISTORY_MSG_WBITC_PONDER;Itcwb gewogen +HISTORY_MSG_WBITC_PRECIS;Itcwb Precisie +HISTORY_MSG_WBITC_PRIM;Primaire kleuren +HISTORY_MSG_WBITC_RGREEN;Itcwb Groenreeks +HISTORY_MSG_WBITC_SAMPLING;Laag sampling +HISTORY_MSG_WBITC_SIZE;Itcwb Grootte +HISTORY_MSG_WBITC_SORTED;Itcwb gewogen +HISTORY_MSG_WBITC_THRES;Itcwb drempel HISTORY_NEWSNAPSHOT;Nieuw -HISTORY_NEWSNAPSHOT_TOOLTIP;Sneltoets: Alt-s +HISTORY_NEWSNAPSHOT_TOOLTIP;Sneltoets: Alt+S HISTORY_SNAPSHOT;Nieuw HISTORY_SNAPSHOTS;Snapshots ICCPROFCREATOR_COPYRIGHT;Copyright: @@ -787,19 +1639,20 @@ ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Zet terug naar standaard copyright, verle 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_DESCRIPTION_TOOLTIP;Laat leeg voor de standaardbeschrijving. ICCPROFCREATOR_GAMMA;Gamma -ICCPROFCREATOR_ICCVERSION;ICC versie: -ICCPROFCREATOR_ILL;Illuminant: +ICCPROFCREATOR_ICCVERSION;ICC-versie: +ICCPROFCREATOR_ILL;Lichtbron: 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;Standaard ICCPROFCREATOR_ILL_INC;StdA 2856K -ICCPROFCREATOR_ILL_TOOLTIP;U kunt alleen de illuminant instellen voor ICC v4-profielen. +ICCPROFCREATOR_ILL_TOOLTIP;U kunt alleen de lichtbron instellen voor ICC v4-profielen. ICCPROFCREATOR_PRIMARIES;Primaire kleuren: ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 @@ -809,6 +1662,7 @@ ICCPROFCREATOR_PRIM_BETA;BetaRGB ICCPROFCREATOR_PRIM_BLUX;Blauw X ICCPROFCREATOR_PRIM_BLUY;Blauw Y ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 ICCPROFCREATOR_PRIM_GREX;Groen X ICCPROFCREATOR_PRIM_GREY;Groen Y ICCPROFCREATOR_PRIM_PROPH;Prophoto @@ -817,19 +1671,20 @@ 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_PRIM_WIDEG;Wijd kleurenscala ICCPROFCREATOR_PROF_V2;ICC v2 ICCPROFCREATOR_PROF_V4;ICC v4 -ICCPROFCREATOR_SAVEDIALOG_TITLE;Bewaar ICC profiel als... +ICCPROFCREATOR_SAVEDIALOG_TITLE;Bewaar ICC-profiel als... ICCPROFCREATOR_SLOPE;Helling ICCPROFCREATOR_TRC_PRESET;Toonresponscurve: +INSPECTOR_WINDOW_TITLE;Inspecteur IPTCPANEL_CATEGORY;Categorie IPTCPANEL_CATEGORYHINT;Het onderwerp van de afbeelding. IPTCPANEL_CITY;Plaats IPTCPANEL_CITYHINT;Plaats waar de afbeelding is genomen. IPTCPANEL_COPYHINT;Kopieer IPTC-instellingen naar klembord -IPTCPANEL_COPYRIGHT;Copyright melding -IPTCPANEL_COPYRIGHTHINT;Melding over de huidige copyright houder van de afbeelding, bijvoorbeeld ©2008 Jane Doe. +IPTCPANEL_COPYRIGHT;Copyright-melding +IPTCPANEL_COPYRIGHTHINT;Melding over de huidige copyright-houder van de afbeelding, bijvoorbeeld ©2008 Jane Doe. IPTCPANEL_COUNTRY;Land IPTCPANEL_COUNTRYHINT;Land waar de afbeelding is genomen. IPTCPANEL_CREATOR;Maker @@ -841,7 +1696,7 @@ IPTCPANEL_CREDITHINT;Naam van de leverancier van de foto, niet noodzakelijkerwij IPTCPANEL_DATECREATED;Opnamedatum IPTCPANEL_DATECREATEDHINT;Datum waarop de afbeelding is genomen. IPTCPANEL_DESCRIPTION;Beschrijving -IPTCPANEL_DESCRIPTIONHINT;Bijschrift dat het wie, wat of waarom beschrijft van wat er gebeurt in de afbeelding. Dit kan inclusief de namen van de persone zijn en of hun rol in de actie die plaatsvindt in de afbeelding. +IPTCPANEL_DESCRIPTIONHINT;Bijschrift dat het wie, wat of waarom beschrijft van wat er gebeurt in de afbeelding. Dit kan inclusief de namen van de personen zijn en of hun rol in de actie die plaatsvindt in de afbeelding. IPTCPANEL_DESCRIPTIONWRITER;Schrijver van de beschrijving. IPTCPANEL_DESCRIPTIONWRITERHINT;De naam van de persoon die is betrokken bij het schrijven, wijzigen of corrigeren van de beschrijving van de afbeelding. IPTCPANEL_EMBEDDED;Ingebed @@ -867,27 +1722,27 @@ 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) +MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigeer naar de volgende afbeelding relatief ten opzichte van de geopende afbeelding in de Fotobewerker\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 Fotobewerker\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 Fotobewerker 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) MAIN_BUTTON_PREFERENCES;Voorkeuren MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Plaats huidige foto in verwerkingsrij.\nSneltoets: Ctrl+B MAIN_BUTTON_SAVE_TOOLTIP;Bewaar huidige foto.\nSneltoets: Ctrl+S -MAIN_BUTTON_SENDTOEDITOR;Bewerk afbeelding in externe editor +MAIN_BUTTON_SENDTOEDITOR;Bewerk afbeelding in externe fotobewerker MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Stuur huidige foto naar extern fotobewerkingsprogramma.\nSneltoets: Ctrl+E -MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Toon/verberg alle zijpanelen.\nSneltoets: m +MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Toon/verberg alle zijpanelen.\nSneltoets: M MAIN_BUTTON_UNFULLSCREEN;Verlaat volledig scherm MAIN_FRAME_EDITOR;Fotobewerker -MAIN_FRAME_EDITOR_TOOLTIP; Bewerking.\nSneltoets: Ctrl-F4 +MAIN_FRAME_EDITOR_TOOLTIP; Bewerking.\nSneltoets: Ctrl+F4 MAIN_FRAME_FILEBROWSER;Bestandsnavigator -MAIN_FRAME_FILEBROWSER_TOOLTIP; Bestandsnavigator.\nSneltoets: Ctrl-F2 +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_QUEUE_TOOLTIP; Verwerkingsrij.\nSneltoets: Ctrl+F3 MAIN_FRAME_RECENT;Recente mappen -MAIN_MSG_ALREADYEXISTS;Bestand bestaat reeds. +MAIN_MSG_ALREADYEXISTS;Bestand bestaat al MAIN_MSG_CANNOTLOAD;Fout bij laden MAIN_MSG_CANNOTSAVE;Fout bij opslaan van de afbeelding MAIN_MSG_CANNOTSTARTEDITOR;Kan fotoprogramma niet starten. @@ -896,51 +1751,53 @@ MAIN_MSG_EMPTYFILENAME;Geen bestandsnaam opgegeven! MAIN_MSG_IMAGEUNPROCESSED;Deze opdracht vereist dat alle geselecteerde foto's eerst moeten zijn verwerkt. MAIN_MSG_NAVIGATOR;Navigator MAIN_MSG_OPERATIONCANCELLED;Opdracht afgebroken -MAIN_MSG_PATHDOESNTEXIST;Het pad\n\n%1\n\nbestaat niet. Zet een correct pad bij Voorkeuren. +MAIN_MSG_PATHDOESNTEXIST;Het pad\n\n%1\n\nbestaat niet. Geef een correct pad op in 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_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_ADVANCED_TOOLTIP;Sneltoets: Alt+A MAIN_TAB_COLOR;Kleur -MAIN_TAB_COLOR_TOOLTIP;Sneltoets: Alt-c +MAIN_TAB_COLOR_TOOLTIP;Sneltoets: Alt+C MAIN_TAB_DETAIL;Detail -MAIN_TAB_DETAIL_TOOLTIP;Sneltoets: Alt-d +MAIN_TAB_DETAIL_TOOLTIP;Sneltoets: Alt+D MAIN_TAB_DEVELOP;Ontwikkel MAIN_TAB_EXIF;Exif MAIN_TAB_EXPORT; Exporteren MAIN_TAB_EXPOSURE;Belichting -MAIN_TAB_EXPOSURE_TOOLTIP;Sneltoets: Alt-e +MAIN_TAB_EXPOSURE_TOOLTIP;Sneltoets: Alt+E MAIN_TAB_FAVORITES;Favorieten -MAIN_TAB_FAVORITES_TOOLTIP;Sneltoets: Alt-u +MAIN_TAB_FAVORITES_TOOLTIP;Sneltoets: Alt+U MAIN_TAB_FILTER;Filter -MAIN_TAB_INSPECT; Inspecteren +MAIN_TAB_INSPECT; Inspecteer MAIN_TAB_IPTC;IPTC +MAIN_TAB_LOCALLAB;Selectief bewerken +MAIN_TAB_LOCALLAB_TOOLTIP;Sneltoets: Alt+O MAIN_TAB_METADATA;Metadata -MAIN_TAB_METADATA_TOOLTIP;Sneltoets: Alt-m +MAIN_TAB_METADATA_TOOLTIP;Sneltoets: Alt+M MAIN_TAB_RAW;RAW -MAIN_TAB_RAW_TOOLTIP;Sneltoets: Alt-r +MAIN_TAB_RAW_TOOLTIP;Sneltoets: Alt+R MAIN_TAB_TRANSFORM;Transformeer -MAIN_TAB_TRANSFORM_TOOLTIP;Sneltoets: Alt-t -MAIN_TOOLTIP_BACKCOLOR0;Achtergrond kleur van het voorbeeld: Thema-based\nSneltoets: 8 +MAIN_TAB_TRANSFORM_TOOLTIP;Sneltoets: Alt+T +MAIN_TOOLTIP_BACKCOLOR0;Achtergrond kleur van het voorbeeld: Gebaseerd op thema\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_BACKCOLOR3;Achtergrondkleur van het voorbeeld: Middelgrijs\nSneltoets: 9 +MAIN_TOOLTIP_BEFOREAFTERLOCK;Vergrendel/Ontgrendel de Voorafbeelding.\n\nVergrendeld: 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\nOntgrendeld: 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: > MAIN_TOOLTIP_INDCLIPPEDS;Onderbelichtingsindicatie.\nSneltoets: < -MAIN_TOOLTIP_PREVIEWB;Bekijk het Blauwe kanaal.\nSneltoets: b -MAIN_TOOLTIP_PREVIEWFOCUSMASK;Bekijk het Focus Masker.\nSneltoets: Shift-F\n\nAccurater bij afbeeldingen met geringe scherptediepte, weinig ruis en hogere zoomniveaus.\n\nBekijk de afbeelding op lagere zoomniveaus (10-30%) om de accuratesse te vergroten bij afbeeldingen met veel ruis.\n\nHet voorbeeld wordt langzamer aangemaakt als Focus Masker aanstaat. -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_PREVIEWB;Bekijk het Blauwe kanaal.\nSneltoets: B +MAIN_TOOLTIP_PREVIEWFOCUSMASK;Bekijk het Focusmasker.\nSneltoets: Shift+F\n\nAccurater bij afbeeldingen met geringe scherptediepte, weinig ruis en hogere zoomniveaus.\n\nBekijk de afbeelding op lagere zoomniveaus (10-30%) om de accuratesse te vergroten bij afbeeldingen met veel ruis.\n\nHet voorbeeld wordt langzamer aangemaakt als Focusmasker aanstaat. +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 -MAIN_TOOLTIP_SHOWHIDETP1;Toon/verberg bovenste paneel.\nSneltoets: Shift-L +MAIN_TOOLTIP_SHOWHIDELP1;Toon/verberg linkerpaneel.\nSneltoets: L +MAIN_TOOLTIP_SHOWHIDERP1;Toon/verberg rechterpaneel.\nSneltoets: Alt+L +MAIN_TOOLTIP_SHOWHIDETP1;Toon/verberg bovenste paneel.\nSneltoets: Shift+L MAIN_TOOLTIP_THRESHOLD;Drempel MAIN_TOOLTIP_TOGGLE;Vergelijk origineel en bewerking MONITOR_PROFILE_SYSTEM;Systeem standaardwaarde @@ -957,13 +1814,13 @@ 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. +OPTIONS_DEFIMG_MISSING;Het standaardprofiel voor niet-RAW-afbeeldingen werd niet gevonden of is niet ingesteld.\n\nControleer de profielmap, het kan ontbreken of beschadigd zijn.\n\nDaarom wordt "%1" gebruikt. +OPTIONS_DEFRAW_MISSING;Het standaardprofiel voor RAW-afbeeldingen werd niet gevonden of is niet ingesteld.\n\nControleer de profielmap, het kan ontbreken of beschadigd zijn.\n\nDaarom wordt "%1" gebruikt. PARTIALPASTE_ADVANCEDGROUP;Geavanceerd PARTIALPASTE_BASICGROUP;Basisinstellingen PARTIALPASTE_CACORRECTION;C/A-correctie -PARTIALPASTE_CHANNELMIXER;Kleurkanaal mixer -PARTIALPASTE_CHANNELMIXERBW;Zwart-Wit +PARTIALPASTE_CHANNELMIXER;Kleurkanaalmixer +PARTIALPASTE_CHANNELMIXERBW;Zwart-wit PARTIALPASTE_COARSETRANS;90 graden roteren/spiegelen PARTIALPASTE_COLORAPP;CIE Color Appearance Model 2002 PARTIALPASTE_COLORGROUP;Kleurgerelateerde instellingen @@ -974,42 +1831,46 @@ PARTIALPASTE_CROP;Bijsnijden PARTIALPASTE_DARKFRAMEAUTOSELECT;Donkerframe autom. selectie PARTIALPASTE_DARKFRAMEFILE;Donkerframe-opname PARTIALPASTE_DEFRINGE;Verzachten -PARTIALPASTE_DEHAZE;Nevel verminderen +PARTIALPASTE_DEHAZE;Ontnevelen PARTIALPASTE_DETAILGROUP;Detailinstellingen PARTIALPASTE_DIALOGLABEL;Profiel gedeeltelijk plakken... PARTIALPASTE_DIRPYRDENOISE;Ruisonderdrukking PARTIALPASTE_DIRPYREQUALIZER;Detailcontrast PARTIALPASTE_DISTORTION;Corrigeer lensvervorming -PARTIALPASTE_EPD;Tonemapping +PARTIALPASTE_EPD;Toonmappen PARTIALPASTE_EQUALIZER;Wavelet Balans PARTIALPASTE_EVERYTHING;Alles PARTIALPASTE_EXIFCHANGES;Wijzig Exif-gegevens PARTIALPASTE_EXPOSURE;Belichting -PARTIALPASTE_FILMNEGATIVE;Film Negatief -PARTIALPASTE_FILMSIMULATION;Film Simuleren +PARTIALPASTE_FILMNEGATIVE;Filmnegatief +PARTIALPASTE_FILMSIMULATION;Filmsimulatie PARTIALPASTE_FLATFIELDAUTOSELECT;Vlakveld autoselectie PARTIALPASTE_FLATFIELDBLURRADIUS;Vlakveld verzachting straal PARTIALPASTE_FLATFIELDBLURTYPE;Vlakveld verzachting type -PARTIALPASTE_FLATFIELDCLIPCONTROL;Vlakveld clip controle +PARTIALPASTE_FLATFIELDCLIPCONTROL;Vlakveld afkapcontrole PARTIALPASTE_FLATFIELDFILE;Vlakveldopname -PARTIALPASTE_GRADIENT;Grijsverloop Filter +PARTIALPASTE_FLATFIELDFROMMETADATA;Vlakveld uit metadata +PARTIALPASTE_GRADIENT;Grijsverloopfilter PARTIALPASTE_HSVEQUALIZER;HSV-balans PARTIALPASTE_ICMSETTINGS;ICM-instellingen -PARTIALPASTE_IMPULSEDENOISE;Spot ruisonderdrukking +PARTIALPASTE_IMPULSEDENOISE;Spot-ruisonderdrukking PARTIALPASTE_IPTCINFO;IPTC-informatie PARTIALPASTE_LABCURVE;LAB-curve PARTIALPASTE_LENSGROUP;Lensgerelateerde instellingen -PARTIALPASTE_LENSPROFILE;Lens correctie profiel +PARTIALPASTE_LENSPROFILE;Lenscorrectieprofiel PARTIALPASTE_LOCALCONTRAST;Lokaal contrast +PARTIALPASTE_LOCALLAB;Selectief bewerken +PARTIALPASTE_LOCALLABGROUP;Instellingen Selectief bewerken PARTIALPASTE_METADATA;Metadata modus PARTIALPASTE_METAGROUP;Metadata -PARTIALPASTE_PCVIGNETTE;Vignettering Filter +PARTIALPASTE_PCVIGNETTE;Vignetteringsfilter PARTIALPASTE_PERSPECTIVE;Perspectief -PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dode pixels filter +PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dodepixels-filter PARTIALPASTE_PREPROCESS_GREENEQUIL;Groenbalans -PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hete pixels filter +PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hetepixels-filter PARTIALPASTE_PREPROCESS_LINEDENOISE;Lijnruisfilter -PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lijnfilter +PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF-lijnfilter +PARTIALPASTE_PREPROCWB;Pre-proces witbalans PARTIALPASTE_PRSHARPENING;Verscherp na verkleinen PARTIALPASTE_RAWCACORR_AUTO;Autom. C/A-correctie PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA vermijd kleurverschuiving @@ -1023,8 +1884,8 @@ PARTIALPASTE_RAW_DCBITERATIONS;aantal DCB-herhalingen PARTIALPASTE_RAW_DMETHOD;Demozaïekmethode PARTIALPASTE_RAW_FALSECOLOR;Demozaïek stapgrootte kleurfoutonderdrukking PARTIALPASTE_RAW_IMAGENUM;Sub-afbeelding -PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE verbetering -PARTIALPASTE_RAW_PIXELSHIFT;PixelVerschuiving +PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE-verbetering +PARTIALPASTE_RAW_PIXELSHIFT;Pixelverschuiving PARTIALPASTE_RESIZE;Wijzig grootte PARTIALPASTE_RETINEX;Retinex PARTIALPASTE_RGBCURVES;RGB-curven @@ -1034,60 +1895,71 @@ PARTIALPASTE_SHARPENEDGE;Randen PARTIALPASTE_SHARPENING;Verscherping PARTIALPASTE_SHARPENMICRO;Microcontrast PARTIALPASTE_SOFTLIGHT;Zacht licht +PARTIALPASTE_SPOT;Spot verwijder PARTIALPASTE_TM_FATTAL;Compressie dynamisch bereik +PARTIALPASTE_TONE_EQUALIZER;Toonequalizer 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_CROPMASKCOLOR;Kleur bijsnijmasker 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_AUTOMONPROFILE;Gebruik automatisch het standaard monitorprofiel \nvan het besturingssysteem PREFERENCES_AUTOSAVE_TP_OPEN;Bewaar positie gereedschappen (open/dicht) bij afsluiten -PREFERENCES_BATCH_PROCESSING;Batch-verwerking +PREFERENCES_BATCH_PROCESSING;Groepsverwerking 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_BEHADDALLHINT;Zet alle parameters in de Toevoegen-modus.\nWijzigingen van de parameters voor groepsverwerking 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_BEHSETALLHINT;Zet alle parameters in de Activeer-modus.\nWijzigingen van de parameters voor groepsverwerking zijn absoluut. De actuele waarden worden gebruikt. +PREFERENCES_BROWSERECURSIVEDEPTH;Diepte sub-folders +PREFERENCES_BROWSERECURSIVEFOLLOWLINKS;Volg symbolische links in sub-folders +PREFERENCES_BROWSERECURSIVEMAXDIRS;Max. aantal sub-folders 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_CACHEMAXENTRIES;Maximaal aantal elementen in de cache PREFERENCES_CACHEOPTS;Cache-opties PREFERENCES_CACHETHUMBHEIGHT;Maximale hoogte miniaturen +PREFERENCES_CAMERAPROFILESDIR;Map met cameraprofielen 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_CHUNKSIZE_RAW_AMAZE;AMaZE-demozaïek +PREFERENCES_CHUNKSIZE_RAW_CA;Raw CA-correctie +PREFERENCES_CHUNKSIZE_RAW_RCD;RCD-demozaïek +PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans-demozaïek +PREFERENCES_CHUNKSIZE_RGB;RGB-verwerking +PREFERENCES_CIE;Ciecam +PREFERENCES_CIEARTIF;Vermijd onregelmatigheden 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_CLUTSCACHE;HaldCLUT-cache +PREFERENCES_CLUTSCACHE_LABEL;Maximum aantal cluts in de cache +PREFERENCES_CLUTSDIR;HaldCLUT-map +PREFERENCES_CMMBPC;Zwartpuntcompensatie +PREFERENCES_COMPLEXITYLOC;Standaard complexiteit voor Selectief bewerken +PREFERENCES_COMPLEXITY_EXP;Geavanceerd +PREFERENCES_COMPLEXITY_NORM;Standaard +PREFERENCES_COMPLEXITY_SIMP;Basis 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;Positie kopieer/plak-knoppen bij Curves PREFERENCES_CURVEBBOXPOS_ABOVE;Boven PREFERENCES_CURVEBBOXPOS_BELOW;Beneden PREFERENCES_CURVEBBOXPOS_LEFT;Links PREFERENCES_CURVEBBOXPOS_RIGHT;Rechts PREFERENCES_CUSTPROFBUILD;Eigen/externe profielgenerator -PREFERENCES_CUSTPROFBUILDHINT;Programma (of script) dat wordt aangeroepen om een initieel profiel voor foto te maken.\nOntvangt terminalparameters voor het genereren van pp3's gebaseerd op regels:\n[Pad RAW/JPG] [Pad default profiel] [f-getal] [belichting in sec] [brandpuntsafstand in mm] [ISO] [lens] [Camera make] [camera model]\n\n WAARSCHUWING: Indien een pad spaties bevat moeten er dubbele quotes worden gezet om het pad. -PREFERENCES_CUSTPROFBUILDKEYFORMAT;Keys formaat +PREFERENCES_CUSTPROFBUILDHINT;Programma (of script) dat wordt aangeroepen om een initieel profiel voor een foto te maken.\nOntvangt terminalparameters voor het genereren van pp3's gebaseerd op regels:\n[Pad RAW/JPG] [Pad standaardprofiel] [f-getal] [belichting in sec] [brandpuntsafstand in mm] [ISO] [lens] [Camerafabrikant] [cameramodel]\n\n Let op: Indien een pad spaties bevat moeten er dubbele quotes om het pad worden gezet. +PREFERENCES_CUSTPROFBUILDKEYFORMAT;'Keys'-formaat PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Naam PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID PREFERENCES_CUSTPROFBUILDPATH;Pad naar programma of script @@ -1095,7 +1967,7 @@ PREFERENCES_DARKFRAMEFOUND;Gevonden PREFERENCES_DARKFRAMESHOTS;foto's PREFERENCES_DARKFRAMETEMPLATES;sjablonen PREFERENCES_DATEFORMAT;Datumformaat -PREFERENCES_DATEFORMATHINT;U kunt de volgende formaten gebruiken:\n%y : jaar\n%m : maand\n%d : dag\n\nHet Nederlandse datumformaat is bijvoorbeeld:\n%d/%m/%y +PREFERENCES_DATEFORMATHINT;U kunt de volgende formaten gebruiken:\n%y : jaar\n%m : maand\n%d : dag\n\nHet Nederlandse datumformaat is \n%d/%m/%y PREFERENCES_DIRDARKFRAMES;Map met donkerframes PREFERENCES_DIRECTORIES;Mappen PREFERENCES_DIRHOME;Standaardmap @@ -1105,7 +1977,18 @@ PREFERENCES_DIRSELECTDLG;Selecteer standaardmap bij opstarten... PREFERENCES_DIRSOFTWARE;Installatiemap PREFERENCES_EDITORCMDLINE;Aangepaste opdrachtregel PREFERENCES_EDITORLAYOUT;Bewerkingsvenster +PREFERENCES_EXTEDITOR_BYPASS_OUTPUT_PROFILE;Passeer uitvoerprofiel +PREFERENCES_EXTEDITOR_DIR;Uitvoermap +PREFERENCES_EXTEDITOR_DIR_CURRENT;Zelfde als invoerbeeld +PREFERENCES_EXTEDITOR_DIR_CUSTOM;Aangepast +PREFERENCES_EXTEDITOR_DIR_TEMP;Tmp-map besturingssysteem +PREFERENCES_EXTEDITOR_FLOAT32;32-bit decimale TIFF_uitvoer PREFERENCES_EXTERNALEDITOR;Externe editor +PREFERENCES_EXTERNALEDITOR_CHANGE;Verander applicatie +PREFERENCES_EXTERNALEDITOR_CHANGE_FILE;Verander uitvoerbaar bestand +PREFERENCES_EXTERNALEDITOR_COLUMN_COMMAND;Opdracht +PREFERENCES_EXTERNALEDITOR_COLUMN_NAME;Naam +PREFERENCES_EXTERNALEDITOR_COLUMN_NATIVE_COMMAND;Standaard opdracht PREFERENCES_FBROWSEROPTS;Opties bestandsnavigator PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compacte gereedschapsbalken in bestandsnavigator PREFERENCES_FLATFIELDFOUND;Gevonden @@ -1122,9 +2005,10 @@ PREFERENCES_HISTOGRAM_TOOLTIP;Het werkprofiel wordt gebruikt voor het Hoofdhisto PREFERENCES_HLTHRESHOLD;Grenswaarde overbelichting PREFERENCES_ICCDIR;Map met ICC-profielen PREFERENCES_IMPROCPARAMS;Standaardprofiel -PREFERENCES_INSPECT_LABEL;Inspecteren -PREFERENCES_INSPECT_MAXBUFFERS_LABEL;Maximum aantal afbeeldingen in cache -PREFERENCES_INSPECT_MAXBUFFERS_TOOLTIP;Het maximum aantal afbeeldingen in de cache wanneer je in de Bestandsnavigator met de cursor over de miniaturen beweegt. Op computers met weinig RAM geheugen (2 Gb) moet deze waarde op 1 of 2 worden gezet. +PREFERENCES_INSPECTORWINDOW;Open de Inspecteur in eigen venster of volledig scherm +PREFERENCES_INSPECT_LABEL;Inspecteer +PREFERENCES_INSPECT_MAXBUFFERS_LABEL;Maximum aantal afbeeldingen in de cache +PREFERENCES_INSPECT_MAXBUFFERS_TOOLTIP;Het maximum aantal afbeeldingen in de cache wanneer je in de Bestandsnavigator met de cursor over de miniaturen beweegt. Op computers met erg weinig RAM-geheugen (2 GB) moet deze waarde op 1 of 2 worden gezet. PREFERENCES_INTENT_ABSOLUTE;Absolute colorimetrie PREFERENCES_INTENT_PERCEPTUAL;Waargenomen colorimetrie PREFERENCES_INTENT_RELATIVE;Relatieve colorimetrie @@ -1132,39 +2016,49 @@ PREFERENCES_INTENT_SATURATION;Verzadiging PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Toon interne JPEG-miniatuur indien onbewerkt PREFERENCES_LANG;Taal PREFERENCES_LANGAUTODETECT;Gebruik taalinstellingen pc +PREFERENCES_LENSFUNDBDIR;Map met Lensfun-database +PREFERENCES_LENSFUNDBDIR_TOOLTIP;Map met de Lensfun-database. Laat leeg om de standaardmappen te gebruiken. +PREFERENCES_LENSPROFILESDIR;Map met lensprofielen +PREFERENCES_LENSPROFILESDIR_TOOLTIP;Map met Adobe Lens Correction Profiles (LCP's) PREFERENCES_MAXRECENTFOLDERS;Maximum aantal recente mappen +PREFERENCES_MAX_ZOOM_TITLE;Maximale zoom PREFERENCES_MENUGROUPEXTPROGS;Groepeer open met PREFERENCES_MENUGROUPFILEOPERATIONS;Groepeer bestandsbewerkingen PREFERENCES_MENUGROUPLABEL;Groepeer labelen PREFERENCES_MENUGROUPPROFILEOPERATIONS;Groepeer profielbewerkingen PREFERENCES_MENUGROUPRANK;Groepeer markering PREFERENCES_MENUOPTIONS;Menu-opties -PREFERENCES_MONINTENT;Standaard monitor weergave +PREFERENCES_METADATA;Metadata +PREFERENCES_METADATA_SYNC;Synchronisatie metadata met XMP-zijspanbestanden +PREFERENCES_METADATA_SYNC_NONE;Geen +PREFERENCES_METADATA_SYNC_READ;Alleen lezen +PREFERENCES_METADATA_SYNC_READWRITE;Bidirectioneel +PREFERENCES_MONINTENT;Standaard weergave-intentie monitor PREFERENCES_MONITOR;Monitor PREFERENCES_MONPROFILE;Standaard kleurprofiel -PREFERENCES_MONPROFILE_WARNOSX;Als gevolg van MacOS beperkingen wordt alleen sRGB ondersteund. +PREFERENCES_MONPROFILE_WARNOSX;Als gevolg van beperkingen van macOS wordt alleen sRGB ondersteund. PREFERENCES_MULTITAB;Multi-tab: elke foto opent in nieuw tabvenster PREFERENCES_MULTITABDUALMON;Multi-tab, indien beschikbaar op tweede monitor PREFERENCES_NAVIGATIONFRAME;Navigatie PREFERENCES_OVERLAY_FILENAMES;Toon bestandsnamen over miniaturen PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Toon bestandsnaam over miniaturen in het Bewerkingsvenster -PREFERENCES_OVERWRITEOUTPUTFILE;Overschrijf bestaande output-bestanden +PREFERENCES_OVERWRITEOUTPUTFILE;Overschrijf bestaande uitvoerbestanden PREFERENCES_PANFACTORLABEL;Factor PREFERENCES_PARSEDEXT;Extensies (verwerkingsvolgorde) PREFERENCES_PARSEDEXTADD;Voeg extensie toe -PREFERENCES_PARSEDEXTADDHINT;Typ nieuwe extensie en druk op knop om aan lijst toe te voegen +PREFERENCES_PARSEDEXTADDHINT;Geef nieuwe extensie op en druk op de knop om aan de lijst toe te voegen 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_MEASURE_HINT;Log de 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_PERFORMANCE_THREADS_LABEL;Maximaal aantal threads voor ruisvermindering en Wavelet-niveaus (0 = automatisch) +PREFERENCES_PREVDEMO;Voorbeeld demozaïekmethode PREFERENCES_PREVDEMO_FAST;Snel PREFERENCES_PREVDEMO_LABEL;Demozaïekmethode van het voorbeeld bij <100% zoom: PREFERENCES_PREVDEMO_SIDECAR;Gelijk aan PP3 -PREFERENCES_PRINTER;Printer (Proefafdruk) +PREFERENCES_PRINTER;Printer (soft-proofing) PREFERENCES_PROFILEHANDLING;Verwerking profielen PREFERENCES_PROFILELOADPR;Laadprioriteit profielen PREFERENCES_PROFILEPRCACHE;Profiel in cache @@ -1175,21 +2069,24 @@ PREFERENCES_PROFILESAVEINPUT;Bewaar profiel bij RAW-bestand PREFERENCES_PROFILESAVELOCATION;Opslaglocatie profielen PREFERENCES_PROFILE_NONE;Geen PREFERENCES_PROPERTY;Eigenschap -PREFERENCES_PRTINTENT;Grafische weergave +PREFERENCES_PRTINTENT;Weergave-intentie 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_RAW_DECODER;Raw-decoder +PREFERENCES_RAW_DECODER_ENABLE_LIBRAW;Gebruik LibRaw +PREFERENCES_REMEMBERZOOMPAN;Onthoud zoom% en pan-startpunt +PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Onthoud het zoompercentage en pan-startpunt van de huidige afbeelding als er een nieuwe afbeelding wordt geopend.\n\nDeze optie werkt alleen in Enkeltab-modus 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 -PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Als een map veel ongecomprimeerde TIFF bestanden bevat dan versnelt deze optie het genereren van de miniaturen. +PREFERENCES_SERIALIZE_TIFF_READ;TIFF-leesinstellingen +PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serieel lezen van TIFF-bestanden +PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Als een map veel ongecomprimeerde TIFF-bestanden bevat dan versnelt deze optie het aanmaken van de miniaturen. PREFERENCES_SET;Activeer PREFERENCES_SHOWBASICEXIF;Toon standaard Exif-info PREFERENCES_SHOWDATETIME;Toon datum en tijd PREFERENCES_SHOWEXPOSURECOMPENSATION;Toon belichtingscompensatie PREFERENCES_SHOWFILMSTRIPTOOLBAR;Toon filmstrip werkbalk +PREFERENCES_SHOWTOOLTIP;Toon schermtips voor Selectief bewerken PREFERENCES_SHTHRESHOLD;Grenswaarde onderbelichting PREFERENCES_SINGLETAB;Enkel-tab: foto's openen in zelfde tabvenster PREFERENCES_SINGLETABVERTAB;Enkel-tab ('filmstrip') modus met verticale tabs @@ -1197,28 +2094,53 @@ PREFERENCES_SND_HELP;Typ bestandsnaam (of niets: geen geluid).\nWindows: gebruik PREFERENCES_SND_LNGEDITPROCDONE;Bewerking klaar PREFERENCES_SND_QUEUEDONE;Verwerkingsrij klaar PREFERENCES_SND_THRESHOLDSECS;na seconden +PREFERENCES_SPOTLOC;Bepaal spotmethode voor Selectief bewerken PREFERENCES_STARTUPIMDIR;Standaardmap bij opstarten PREFERENCES_TAB_BROWSER;Bestandsnavigator PREFERENCES_TAB_COLORMGR;Kleurbeheer -PREFERENCES_TAB_DYNAMICPROFILE;Dynamisch Profielregel +PREFERENCES_TAB_DYNAMICPROFILE;Dynamische Profielregel +PREFERENCES_TAB_FAVORITES;Favorieten PREFERENCES_TAB_GENERAL;Algemeen PREFERENCES_TAB_IMPROC;Beeldverwerking -PREFERENCES_TAB_PERFORMANCE;Performantie +PREFERENCES_TAB_PERFORMANCE;Prestaties PREFERENCES_TAB_SOUND;Geluiden -PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Ingesloten JPEG voorbeeld +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;Neutrale raw-rendering PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Ingesloten JPEG indien vol formaat, anders neutrale raw +PREFERENCES_THUMBNAIL_RANK_COLOR_MODE;Laad/bewaar waardering en kleurcodes van miniaturen van/naar XMP-zijspanbestanden +PREFERENCES_TOOLPANEL_AVAILABLETOOLS;Beschikbare gereedschappen +PREFERENCES_TOOLPANEL_CLONE_FAVORITES;Toon favoriete gereedschappen ook op hun oorspronkelijke locatie +PREFERENCES_TOOLPANEL_CLONE_FAVORITES_TOOLTIP;Indien aangevinkt zullen de favoriete gereedschappen zowel in de Favorieten-tab als op hun oorspronkelijke locatie te vinden zijn.\n\nOpmerking: als deze optie is aangevinkt kunt u een lichte vertraging verwachten tijdens het wisselen van tabs. +PREFERENCES_TOOLPANEL_FAVORITE;Favoriet +PREFERENCES_TOOLPANEL_FAVORITESPANEL;Favorietenpaneel +PREFERENCES_TOOLPANEL_TOOL;Gereedschap PREFERENCES_TP_LABEL;Gereedschapspaneel: PREFERENCES_TP_VSCROLLBAR;Verberg de schuifbalk van het gereedschapspaneel PREFERENCES_USEBUNDLEDPROFILES;Gebruik gebundelde profielen +PREFERENCES_WBA;Witbalans +PREFERENCES_WBACORR;Witbalans - Automatische temperatuurcorrelatie +PREFERENCES_WBACORR_TOOLTIP;Deze instellingen maken het mogelijk om, afhankelijk van de afbeelding (type raw-bestand, kleurmeting, etc.), het Temperatuurcorrelatie-algoritme aan te passen om de beste resultaten te krijgen. Er is geen absolute regel die deze parameters verbindt met de verkregen resultaten.\n\nDe instellingen zijn van drie types:\n* Die voor de gebruiker toegankelijk zijn vanuit de GUI.\n* Die alleen toegankelijk zijn door het lezen van elk pp3-bestand: Itcwb_minsize=20, Itcwb_delta=4 Itcwb_rgreen=1 Itcwb_nopurple=false (Zie Rawpedia)\n* Die voor de gebruiker toegankelijk zijn in Voorkeuren (zie Rawpedia).\nU kunt 'AWB-temperatuurnadruk' en 'Groenverfijning' gebruiken om de resultaten aan te passen. Elke verandering in deze opdrachten resulteert in een nieuwe berekening van temperatuur, tint en correlatie.\n\nLet op dat de drie indicatoren 'Correlatiefactor', 'Patchkleur' en ΔE alleen dienen ter informatie. Het is niet omdat een van deze indicatoren beter is dat het resultaat noodzakelijkerwijs beter zal zijn. +PREFERENCES_WBAENA;Witbalans - Toon instellingen automatische temperatuurcorrelatie +PREFERENCES_WBAENACUSTOM;Gebruik aangepaste temperatuur & tint +PREFERENCES_WBAFORC;Forceer extra algoritme +PREFERENCES_WBAGREENDELTA;Delta temperatuur in groene herhalingslus (indien Forceer extra geactiveerd) +PREFERENCES_WBANOPURP;Geen paarse kleur gebruikt +PREFERENCES_WBAPATCH;Maximaal aantal kleuren gebruikt in afbeelding +PREFERENCES_WBAPRECIS;Precisie-algoritme - schaal toegepast +PREFERENCES_WBASIZEREF;Grootte referentiekleur vergelijken met grootte histogramkleur +PREFERENCES_WBASORT;Sorteer in chroma-volgorde in plaats van histogram PREFERENCES_WORKFLOW;Layout +PREFERENCES_XMP_SIDECAR_MODE;XMP zijspanbestand stijl +PREFERENCES_XMP_SIDECAR_MODE_EXT;Zoals darktable (FILENAME.ext.xmp voor FILENAME.ext) +PREFERENCES_XMP_SIDECAR_MODE_STD;Standaard (FILENAME.xmp voor FILENAME.ext) +PREFERENCES_ZOOMONSCROLL;Zoom afbeeldingen door te scrollen PROFILEPANEL_COPYPPASTE;Te kopiëren parameters PROFILEPANEL_GLOBALPROFILES;Gebundelde profielen PROFILEPANEL_LABEL;Profielen PROFILEPANEL_LOADDLGLABEL;Kies profiel... PROFILEPANEL_LOADPPASTE;Te laden parameters -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_MODE_TOOLTIP;Profiel aanvullen.\n\nKnop ingedrukt: gedeeltelijke profielen worden omgezet naar volledige profielen. De ontbrekende waarden worden vervangen door standaardwaarden.\n\nKnop neutraal: profielen worden toegepast zoals ze zijn, alleen de aanwezige waarden worden gewijzigd. PROFILEPANEL_MYPROFILES;Mijn profielen PROFILEPANEL_PASTEPPASTE;Te plakken parameters PROFILEPANEL_PCUSTOM;Handmatig @@ -1230,43 +2152,65 @@ PROFILEPANEL_SAVEDLGLABEL;Bewaar profiel... PROFILEPANEL_SAVEPPASTE;Te bewaren parameters 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. +PROFILEPANEL_TOOLTIPPASTE;Plak profiel van klembord +PROFILEPANEL_TOOLTIPSAVE;Bewaar huidig profiel.\nCtrl+klik voor het selecteren van de instellingen voor opslaan. PROGRESSBAR_DECODING;Decoderen... -PROGRESSBAR_GREENEQUIL;Groen blancering... +PROGRESSBAR_GREENEQUIL;Groenbalancering... PROGRESSBAR_HLREC;Reconstructie hoge lichten... -PROGRESSBAR_HOTDEADPIXELFILTER;Hot/dead pixel filter... -PROGRESSBAR_LINEDENOISE;Lijnruis filter... +PROGRESSBAR_HOTDEADPIXELFILTER;Hete/dodepixels-filter... +PROGRESSBAR_LINEDENOISE;Lijnruisfilter... PROGRESSBAR_LOADING;Afbeelding laden... PROGRESSBAR_LOADINGTHUMBS;Miniaturen laden... PROGRESSBAR_LOADJPEG;Laden JPEG-bestand... +PROGRESSBAR_LOADJXL;Laden JXL-bestand... PROGRESSBAR_LOADPNG;Laden PNG-bestand... 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_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 +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) +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 +QUEUE_DESTPREVIEW_TITLE;Selecteer een miniatuur om het bestemmingspad te zien +QUEUE_DESTPREVIEW_TOOLTIP;Bestemmingspad van de eerst geselecteerde foto verschijnt hier 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_TEMPLATE_HELP_BUTTON_TOOLTIP;Toon of verberg een helpvenster met instructies voor het maken van locatie-sjablonen +QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_BODY;Als u de uitvoerafbeelding naast de bronafbeelding wilt opslaan, schrijf dan:\n%p1/%f\n\nAls u de uitvoerafbeelding wilt opslaan in een map genaamd 'geconverteerd' in de map van de bronfoto, schrijf dan:\n%p1/geconverteerd/%f\n\nAls u de uitvoerafbeelding wilt opslaan in\n'/home/tom/photos/geconverteerd/2010-10-31', schrijf dan:\n%p-3/converted/%P-4/%f +QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_TITLE;Voorbeelden +QUEUE_LOCATION_TEMPLATE_HELP_INTRO;Het uitvoersjabloonveld stelt u in staat om dynamisch de bestemmingsmap en bestandsnaam aan te passen. Wanneer u bepaalde specificaties opneemt, die beginnen met %, worden deze door het programma vervangen wanneer elk bestand wordt opgeslagen.\n\nDe onderstaande secties beschrijven elk type specificatie. +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_1;We gebruik dit pad als voorbeeld: +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_2;De betekenissen van de opmaakstrings zijn: +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_LINUX;/home/tom/photos/2010-10-31/photo1.raw +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_WINDOWS;D:\tom\photos\2010-10-31\photo1.raw +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO;De specificaties %dN, %d-N, %pN, %p-N, %PN en %P-N (N = 1..9) worden vervangen door elementen van het folderpad van het afbeeldingsbestand.\nDe opmaakspecificaties werken als volgt:\n %dN = Nde folder vanaf het einde van het pad\n %d-N = Nde folder vanaf het begin van het pad\n %pN = alle folders tot de Nde vanaf het einde van het pad\n %p-N = de eerste N folders in het pad\n %PN = de laatste N folders in het pad\n %P-N = alle folders vanaf de Nde tot het einde van het pad\n %f = basis bestandsnaam (zonder extensie) +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO_WINDOWS;Voor Windows-paden is %d-1 de stationsletter en dubbele punt, en %d-2 de basismap op dat station. +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_TITLE;Mappen en gedeeltelijke paden +QUEUE_LOCATION_TEMPLATE_HELP_RANK_BODY;%r wordt vervangen door de waardering van de foto. Als de foto geen waardering heeft, wordt '0' gebruikt. Als de foto in de prullenbak zit, wordt 'x' gebruikt. +QUEUE_LOCATION_TEMPLATE_HELP_RANK_TITLE;Waardering +QUEUE_LOCATION_TEMPLATE_HELP_RESULT_MISMATCH;FOUT: tweede resultaat is anders: +QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_BODY;%s1, ..., %s9 worden vervangen door de oorspronkelijke positie van de foto in de wachtrij op het moment dat de wachtrij wordt gestart. Het nummer specificeert de opvulling, bijvoorbeeld %s3 resulteert in '001'. +QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_TITLE;Positie/volgorde in de wachtrij +QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_BODY;Drie verschillende datum/tijd-waarden kunnen in sjablonen worden gebruikt:\n %tE"%Y-%m-%d" = wanneer export is gestart\n %tF"%Y-%m-%d" = wanneer bestand voor het laatst is opgeslagen\n %tP"%Y-%m-%d" = wanneer foto is genomen\nDe geciteerde string definieert het formaat van de resulterende datum en/of tijd. De opmaakstring %tF"%Y-%m-%d" is slechts een voorbeeld. De string kan alle conversiespecificaties gebruiken die zijn gedefinieerd voor de g_date_time_format functie (zie https://docs.gtk.org/glib/method.DateTime.format.html).\n\nVoorbeeld opmaakstrings: +QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_TITLE;Datum en tijd +QUEUE_LOCATION_TEMPLATE_HELP_TITLE;Een uitvoersjabloon maken +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-2024/dsc0012.nef is geopend, hebben deze formaten de volgende betekenis:\n%f=dsc0012, %d1=02-09-2024, %d2=foto, ...\n%p1=/home/tom/image/02-09-2024, %p2=/home/tom/image, p3=/home/tom, ...\n\n%r wordt vervangen door de waardering van de foto. Als de foto geen waardering 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 +QUEUE_STARTSTOP_TOOLTIP;Start of stop de verwerking van foto's in de rij.\n\nSneltoets: Ctrl+S +SAMPLEFORMAT_0;onbekend dataformaat SAMPLEFORMAT_1;8-bit unsigned SAMPLEFORMAT_2;16-bit unsigned SAMPLEFORMAT_4;24-bit LogLuv @@ -1275,6 +2219,7 @@ 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_BIGTIFF;BigTIFF (geen metadata-ondersteuning) SAVEDLG_FILEFORMAT;Bestandstype SAVEDLG_FILEFORMAT_FLOAT; drijvendekomma SAVEDLG_FORCEFORMATOPTS;Forceer opties voor opslaan @@ -1288,38 +2233,56 @@ SAVEDLG_SUBSAMP;Subsampling SAVEDLG_SUBSAMP_1;Beste compressie SAVEDLG_SUBSAMP_2;Gebalanceerd SAVEDLG_SUBSAMP_3;Beste kwaliteit -SAVEDLG_SUBSAMP_TOOLTIP;Beste Compressie:\nJ:a:b 4:2:0\nh/v 2/2\nChroma gehalveerd horizontaal en vertikaal\n\nGebalanceerd:\nJ:a:b 4:2:2\nh/v 2/1\nChroma gehalveerd horizontaal.\n\nBeste kwaliteit:\nJ:a:b 4:4:4\nh/v 1/1\nGeen chroma subsampling. +SAVEDLG_SUBSAMP_TOOLTIP;Beste compressie:\nJ:a:b 4:2:0\nh/v 2/2\nChroma gehalveerd horizontaal en verticaal\n\nGebalanceerd:\nJ:a:b 4:2:2\nh/v 2/1\nChroma gehalveerd horizontaal.\n\nBeste kwaliteit:\nJ:a:b 4:4:4\nh/v 1/1\nGeen chroma-subsampling. 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. +SORT_ASCENDING;Oplopend +SORT_BY_DATE;Op datum +SORT_BY_EXIF;Op EXIF +SORT_BY_LABEL;Op kleurlabel +SORT_BY_NAME;Op naam +SORT_BY_RANK;Volgens sterwaardering +SORT_DESCENDING;Aflopend +TC_LOCALLAB_PRIM_SHIFTX;Verschuif x +TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP;In combinatie met Kleuren verfijnen kunt u:\n1) voor lage waarden, de zuiverheid (purity) van het beeld aanpassen.\n2) voor hogere waarden een gematigde kleurtoning uitvoeren.\nLet op dat u niet buiten het CIE xy-diagram gaat. +TC_LOCALLAB_PRIM_SHIFTY;Verschuif y +TC_PRIM_BLUX;Bx +TC_PRIM_BLUY;By +TC_PRIM_GREX;Gx +TC_PRIM_GREY;Gy +TC_PRIM_REDX;Rx +TC_PRIM_REDY;Ry +TC_PRIM_REFI;Verfijn kleuren (witpunt) THRESHOLDSELECTOR_B;Onderkant THRESHOLDSELECTOR_BL;Onderkant-links THRESHOLDSELECTOR_BR;Onderkant-rechts -THRESHOLDSELECTOR_HINT;Houdt de Shift-toets ingedrukt om individuele controle punten te verschuiven. +THRESHOLDSELECTOR_HINT;Houd de Shift-toets ingedrukt om individuele controlepunten te verschuiven. THRESHOLDSELECTOR_T;Bovenkant THRESHOLDSELECTOR_TL;Bovenkant-links THRESHOLDSELECTOR_TR;Bovenkant-rechts -TOOLBAR_TOOLTIP_COLORPICKER;Vergrendelbare Kleurkiezer\n\nKlik met de linkermuisknop in het voorbeeld om een kleurkiezer toe te voegen\nBeweeg het punt door de linkermuisknop ingedrukt te houden\nVerwijder de kleurkiezer met een rechtermuisknop klik\nVerwijder allle kleurkiezers met Shift + rechtermuisknop klik\nMet een rechtermuisklik naast een kleurkiezer komt het selecteer handje terug. -TOOLBAR_TOOLTIP_CROP;Bijsnijden.\nSneltoets: c -TOOLBAR_TOOLTIP_HAND;Sleepgereedschap.\nSneltoets: h -TOOLBAR_TOOLTIP_STRAIGHTEN;Rechtmaken / Kleine rotaties.\nSneltoets: s\n\nBepaal de vertikale of horizontale as door het trekken van een hulplijn over de afbeelding. De rotatiehoek wordt naast de hulplijn getoond. Het centrum van de roatatie is het geometrische midden van de afbeelding. -TOOLBAR_TOOLTIP_WB;Witbalans.\nSneltoets: w +TOOLBAR_TOOLTIP_COLORPICKER;Vergrendelbare kleurkiezer\n\nKlik met de linkermuisknop in het voorbeeld om een kleurkiezer toe te voegen\nBeweeg het punt door de linkermuisknop ingedrukt te houden\nVerwijder de kleurkiezer met rechts-klik\nVerwijder alle kleurkiezers met Shift+rechtsklik\nMet een rechtermuisklik naast een kleurkiezer komt het selectiehandje terug. +TOOLBAR_TOOLTIP_CROP;Bijsnijden.\nSneltoets: C +TOOLBAR_TOOLTIP_HAND;Sleepgereedschap.\nSneltoets: H +TOOLBAR_TOOLTIP_PERSPECTIVE;Perspectiefcorrectie\n\nVerplaats de controlelijnen om perspectivische vervorming te corrigeren. Klik opnieuw op deze knop om de correctie toe te passen. +TOOLBAR_TOOLTIP_STRAIGHTEN;Rechtzetten/Kleine rotaties.\nSneltoets: S\n\nBepaal de verticale of horizontale as door een hulplijn over de afbeelding te trekken. De rotatiehoek wordt naast de hulplijn getoond. Het centrum van de roatatie is het geometrische midden van de afbeelding. +TOOLBAR_TOOLTIP_WB;Witbalans.\nSneltoets: W TP_BWMIX_ALGO;Algoritme OYCPM TP_BWMIX_ALGO_LI;Lineair TP_BWMIX_ALGO_SP;Speciale effecten -TP_BWMIX_ALGO_TOOLTIP;Lineair: creëert een normale lineaire response.\n Speciale effecten: creëert speciale effecten door kanalen non-lineair te mixen.TP_BWMIX_AUTOCH;Auto +TP_BWMIX_ALGO_TOOLTIP;Lineair: creëert een normale lineaire respons.\nSpeciale effecten: creëert speciale effecten door kanalen non-lineair te mixen. TP_BWMIX_AUTOCH;Auto TP_BWMIX_CC_ENABLED;Wijzig complementaire kleur -TP_BWMIX_CC_TOOLTIP;Automatische aanpassing van complementaire kleuren in ROYGCBPM mode. -TP_BWMIX_CHANNEL;Luminantie Balans -TP_BWMIX_CURVEEDITOR1;'Voor' curve -TP_BWMIX_CURVEEDITOR2;'Na' curve -TP_BWMIX_CURVEEDITOR_AFTER_TOOLTIP;Toon curve wordt toegepast na de Zwart-Wit conversie. -TP_BWMIX_CURVEEDITOR_BEFORE_TOOLTIP;Toon curve wordt toegepast voor de Zwart-Wit conversie\nHoudt rekening met de kleur componenten. -TP_BWMIX_CURVEEDITOR_LH_TOOLTIP;Wijzig luminantie in de functie van hue\nNegatieve waarden kunnen artefacten of onregelmatigheden veroorzaken. -TP_BWMIX_FILTER;Kleur Filter +TP_BWMIX_CC_TOOLTIP;Automatische aanpassing van complementaire kleuren in ROYGCBPM-modus. +TP_BWMIX_CHANNEL;Luminantiebalans +TP_BWMIX_CURVEEDITOR1;'Voor'-curve +TP_BWMIX_CURVEEDITOR2;'Na'-curve +TP_BWMIX_CURVEEDITOR_AFTER_TOOLTIP;Tooncurve wordt toegepast na de zwart-witconversie. +TP_BWMIX_CURVEEDITOR_BEFORE_TOOLTIP;Tooncurve wordt toegepast voor de zwart-witconversie.\nHoud rekening met de kleurcomponenten. +TP_BWMIX_CURVEEDITOR_LH_TOOLTIP;Luminantie als functie van tint (L=f(T).\nPas op met extreme waarden, deze kunnen onregelmatigheden veroorzaken. +TP_BWMIX_FILTER;Filterkleur TP_BWMIX_FILTER_BLUE;Blauw TP_BWMIX_FILTER_BLUEGREEN;Blauw-Groen TP_BWMIX_FILTER_GREEN;Groen @@ -1328,139 +2291,172 @@ TP_BWMIX_FILTER_NONE;Geen TP_BWMIX_FILTER_PURPLE;Paars TP_BWMIX_FILTER_RED;Rood TP_BWMIX_FILTER_REDYELLOW;Rood-Geel -TP_BWMIX_FILTER_TOOLTIP;Het kleurfilter heeft hetzelfde effect als een voor de lens geplaatst filter. Kleurfilters reduceren specifieke reeksen van kleuren en beïnvloeden de helderheid. Bv. een rood filter maak een blauwe lucht donkerder. +TP_BWMIX_FILTER_TOOLTIP;Het kleurfilter heeft hetzelfde effect als een voor de lens geplaatst filter. Kleurfilters reduceren specifieke reeksen van kleuren en beïnvloeden de helderheid. Zo maakt een rood filter een blauwe lucht donkerder. TP_BWMIX_FILTER_YELLOW;Geel -TP_BWMIX_GAMMA;Gamma Correctie -TP_BWMIX_GAM_TOOLTIP;Corrigeer gamma voor elk RGB kanaal -TP_BWMIX_LABEL;Zwart-Wit +TP_BWMIX_GAMMA;Gammacorrectie +TP_BWMIX_GAM_TOOLTIP;Corrigeer gamma voor elk RGB-kanaal +TP_BWMIX_LABEL;Zwart-wit 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_MET_LUMEQUAL;Luminantie-equalizer +TP_BWMIX_MIXC;Kanalenmixer 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. +TP_BWMIX_RGBLABEL_HINT;RGB-omrekeningsfactoren. Hierin zijn alle gekozen opties verwerkt.\nTotaal toont de som van de uit te voeren RGB-factoren:\n- dit is altijd 100% in relatieve modus\n- groter (lichter) of kleiner (donkerder) dan 100% in absolute modus. +TP_BWMIX_RGB_TOOLTIP;Mix de RGB-kanalen. Gebruik Voorinstellingen voor aanwijzingen.\nNegatieve waarden kunnen onregelmatigheden veroorzaken. TP_BWMIX_SETTING;Voorinstellingen TP_BWMIX_SETTING_TOOLTIP;Verschillende voorinstellingen (film, landschap, etc.) of handmatige instellingen van de kanaalmixer. -TP_BWMIX_SET_HIGHCONTAST;Hoog Contrast -TP_BWMIX_SET_HIGHSENSIT;Hoge Gevoeligheid -TP_BWMIX_SET_HYPERPANCHRO;Hyper Panchromatisch +TP_BWMIX_SET_HIGHCONTAST;Hoog contrast +TP_BWMIX_SET_HIGHSENSIT;Hoge gevoeligheid +TP_BWMIX_SET_HYPERPANCHRO;Hyperpanchromatisch TP_BWMIX_SET_INFRARED;Infrarood TP_BWMIX_SET_LANDSCAPE;Landschap -TP_BWMIX_SET_LOWSENSIT;Lage Gevoeligheid +TP_BWMIX_SET_LOWSENSIT;Lage gevoeligheid TP_BWMIX_SET_LUMINANCE;Luminantie -TP_BWMIX_SET_NORMCONTAST;Normaal Contrast +TP_BWMIX_SET_NORMCONTAST;Normaal contrast TP_BWMIX_SET_ORTHOCHRO;Orthochromatisch TP_BWMIX_SET_PANCHRO;Panchromatisch TP_BWMIX_SET_PORTRAIT;Portret -TP_BWMIX_SET_RGBABS;Absolute RGB -TP_BWMIX_SET_RGBREL;Relatieve RGB -TP_BWMIX_SET_ROYGCBPMABS;Absolute ROYGCBPM -TP_BWMIX_SET_ROYGCBPMREL;Relatieve ROYGCBPM -TP_BWMIX_TCMODE_FILMLIKE;Z&W Film-achtig -TP_BWMIX_TCMODE_SATANDVALBLENDING;Z-W Verzadiging en Waarde menging +TP_BWMIX_SET_RGBABS;RGB-absoluut +TP_BWMIX_SET_RGBREL;RGB-relatief +TP_BWMIX_SET_ROYGCBPMABS;ROYGCBPM-absoluut +TP_BWMIX_SET_ROYGCBPMREL;ROYGCBPM-relatief +TP_BWMIX_TCMODE_FILMLIKE;Z-W Filmachtig +TP_BWMIX_TCMODE_SATANDVALBLENDING;Z-W Verzadiging en Waarde mengen TP_BWMIX_TCMODE_STANDARD;Z-W Standaard -TP_BWMIX_TCMODE_WEIGHTEDSTD;Z-W Gewogen Standard +TP_BWMIX_TCMODE_WEIGHTEDSTD;Z-W Gewogen standaard TP_BWMIX_VAL;L TP_CACORRECTION_BLUE;Blauw -TP_CACORRECTION_LABEL;Corrigeer chromatische aberratie +TP_CACORRECTION_LABEL;Corrigeer chromatische afwijking TP_CACORRECTION_RED;Rood -TP_CBDL_AFT;Na Zwart-Wit -TP_CBDL_BEF;Voor Zwart-Wit +TP_CBDL_AFT;Na zwart-wit +TP_CBDL_BEF;Voor zwart-wit TP_CBDL_METHOD;Uitvoeren -TP_CBDL_METHOD_TOOLTIP;Kies of Detailcontrast moet worden uitgevoerd na de Zwart-Wit bewerking waardoor het werkt in L*a*b*, of voor de Zwart-Wit bewerking waardoor het werkt in RGB +TP_CBDL_METHOD_TOOLTIP;Kies of Detailcontrast moet worden uitgevoerd ná de zwart-witbewerking waardoor het werkt in L*a*b*, of vòòr de zwart-witbewerking waardoor het werkt in RGB TP_CHMIXER_BLUE;Blauw TP_CHMIXER_GREEN;Groen -TP_CHMIXER_LABEL;Kleurkanaal mixer +TP_CHMIXER_LABEL;Kleurkanaalmixer TP_CHMIXER_RED;Rood 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_ROTLEFT;Roteer links.\n\nSneltoets:\n[ - Multitab-modus,\nAlt+[ - Enkeltab-modus. +TP_COARSETRAF_TOOLTIP_ROTRIGHT;Roteer rechts.\n\nSneltoets:\n] - Multitab-modus,\nAlt+] - Enkeltab-modus. TP_COARSETRAF_TOOLTIP_VFLIP;Verticaal spiegelen TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminantie +TP_COLORAPP_ADAPSCEN_TOOLTIP;Komt overeen met de luminantie in candela per vierkante meter op het moment van opname, automatisch berekend op basis van de exif-gegevens. TP_COLORAPP_ALGO;Algoritme TP_COLORAPP_ALGO_ALL;Alle TP_COLORAPP_ALGO_JC;Lichtheid + Chroma (JC) TP_COLORAPP_ALGO_JS;Lichtheid + Verzadiging (JS) TP_COLORAPP_ALGO_QM;Helderheid + Kleurrijkheid (QM) TP_COLORAPP_ALGO_TOOLTIP;Keuze uit parameters -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_BADPIXSL;Hete/dode-pixelsfilter +TP_COLORAPP_BADPIXSL_TOOLTIP;Onderdruk hete/dode (sterk gekleurde) pixels.\n0 = geen effect 1 = mediaan 2 = gaussiaans.\n\nDeze onregelmatigheden 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_CAT02ADAPTATION_TOOLTIP;Bij handmatige aanpassing worden waarden boven 65 aanbevolen. +TP_COLORAPP_CATCLASSIC;Klassiek +TP_COLORAPP_CATMET_TOOLTIP;Klassiek - traditionele CIECAM-bewerking. De kleuradaptatie-transformaties worden afzonderlijk toegepast op 'Opname-omstandigheden' en basisverlichting aan de ene kant, en op basisverlichting en 'Weergave-omstandigheden' aan de andere kant.\n\nSymmetrisch - De kleuradaptatie is gebaseerd op de witbalans. De instellingen 'Opname-omstandigheden', 'Afbeeldingsaanpassingen' en 'Weergave-omstandigheden' worden geneutraliseerd.\n\nGemengd - Hetzelfde als de 'Klassieke' optie, maar in dit geval is de kleuradaptatie gebaseerd op de witbalans. +TP_COLORAPP_CATMOD;Modus +TP_COLORAPP_CATSYMGEN;Auto-symmetrisch +TP_COLORAPP_CATSYMSPE;Gemengd 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 TP_COLORAPP_CHROMA_S;Verzadiging (S) TP_COLORAPP_CHROMA_S_TOOLTIP;Verzadiging in CIECAM02 is verschillend van Lab en RGB TP_COLORAPP_CHROMA_TOOLTIP;Chroma in CIECAM02 is verschillend van Lab en RGB -TP_COLORAPP_CIECAT_DEGREE;CAT02 toepassen +TP_COLORAPP_CIECAT_DEGREE;Chromatische aanpassing Scène +TP_COLORAPP_CIECAT_DEGREEOUT;Chromatische aanpassing weergave TP_COLORAPP_CONTRAST;Contrast (J) TP_COLORAPP_CONTRAST_Q;Contrast (Q) -TP_COLORAPP_CONTRAST_Q_TOOLTIP;Contrast (Q)in CIECAM02 is verschillend van Lab en RGB +TP_COLORAPP_CONTRAST_Q_TOOLTIP;Contrast (Q) in CIECAM02 is verschillend van Lab en RGB TP_COLORAPP_CONTRAST_TOOLTIP;Contrast (J) in CIECAM02 is verschillend van Lab en RGB -TP_COLORAPP_CURVEEDITOR1;Toon curve 1 -TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Toont het histogram van L (Lab) voor CIECAM wijzigingen.\n\nHet histogram toont J,Q na toepassing van CIECAM, indien het selectievakje 'Toon CIECAM uitvoer' is aangezet.\n(J,Q) worden niet getoond in het hoofd histogram. \n\nRaadpleeg voor de definitieve uitvoer het Histogram paneel. -TP_COLORAPP_CURVEEDITOR2;Toon curve 2 -TP_COLORAPP_CURVEEDITOR2_TOOLTIP;Heeft dezelfde werking als belichtings 'Toon Curve 2'. -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_CURVEEDITOR1;Tooncurve 1 +TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Toont het histogram van L (Lab) voor CIECAM-wijzigingen.\n\nHet histogram toont J,Q na toepassing van CIECAM, indien het selectievakje 'Toon CIECAM-uitvoer' is aangezet.\n(J,Q) worden niet getoond in het hoofdhistogram. \n\nZie voor de definitieve uitvoer het Histogrampaneel. +TP_COLORAPP_CURVEEDITOR2;Tooncurve 2 +TP_COLORAPP_CURVEEDITOR2_TOOLTIP;Heeft dezelfde werking als belichtings-tooncurve 2. +TP_COLORAPP_CURVEEDITOR3;Chroma-curve +TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Wijzigt ofwel chroma, verzadiging of kleurrijkheid.\nHet histogram toont chromaticiteit (Lab) voor CIECAM-aanpassingen.\nHet histogram toont C, S en M na toepassing van CIECAM indien de optie 'Toon CIECAM-uitvoer' is aangevinkt.\nC, S en M worden niet getoond in het hoofdhistogram. \nDe definitieve uitvoer is te zien in het histogrampaneel. +TP_COLORAPP_DATACIE;CIECAM02 uitvoerhistogram in de curven +TP_COLORAPP_DATACIE_TOOLTIP;Indien aangevinkt 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 heeft geen invloed op het hoofdhistogram.\n\nIndien uitgevinkt tonen de histogrammen van de CIECAM02-curven de Lab-waarden zoals deze waren voor de CIECAM02-aanpassingen +TP_COLORAPP_DEGREE_TOOLTIP;CAT02/16 is een chromatische aanpassing. Het converteert de waarden van een afbeelding met een witpunt van een gegeven Lichtbron (bijvoorbeeld D65) naar nieuwe waarden met het witpunt van de nieuwe Lichtbron - zie WP-model (bijvoorbeeld D50 of D55). +TP_COLORAPP_DEGREOUT_TOOLTIP;CAT02/16 is een chromatische aanpassing. Het converteert de waarden van een afbeelding met een witpunt van een gegeven Lichtbron (bijvoorbeeld D50) naar nieuwe waarden met het witpunt van de nieuwe Lichtbron - zie WP-model (bijvoorbeeld D75). +TP_COLORAPP_FREE;Vrije temp + groen + CAT02 + [uitvoer] +TP_COLORAPP_GAMUT;Beperk kleurbereik (Lab) +TP_COLORAPP_GEN;Instellingen +TP_COLORAPP_GEN_TOOLTIP;Deze module is gebaseerd op de CIECAM-kleurweergavemodellen, die zijn ontworpen om beter te simuleren hoe het menselijke oog kleuren waarneemt onder verschillende verlichtingsomstandigheden, bijvoorbeeld tegen verschillende achtergronden. Het analyseert de omgeving van elke kleur en wijzigt die om zo dicht mogelijk bij de menselijke waarneming te komen. Het past de uitvoer ook aan aan de gekozen weergave-omstandigheden (monitor, tv, projector, printer, etc.), zodat de kleurweergave behouden blijft tussen de opname- en weergave-omgevingen. TP_COLORAPP_HUE;Tint (h) TP_COLORAPP_HUE_TOOLTIP;Tint (h) - hoek tussen 0° en 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;Vrij +TP_COLORAPP_ILLUM;Lichtbron +TP_COLORAPP_ILLUM_TOOLTIP;Kiest de verlichting die het dichtst bij de opname-omstandigheden ligt. In het algemeen D50, maar dit kan veranderen afhankelijk van de tijd en de breedtegraad. TP_COLORAPP_LABEL;CIE Color Appearance Model 2002 TP_COLORAPP_LABEL_CAM02;Afbeelding wijzigen -TP_COLORAPP_LABEL_SCENE;Opnameomstandigheden +TP_COLORAPP_LABEL_SCENE;Opname-omstandigheden 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_LIGHT_TOOLTIP;Lichtheid in CIECAM02 verschilt van Lab en RGB 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_MOD02;CAM02 +TP_COLORAPP_MOD16;CAM16 +TP_COLORAPP_MODEL;Witpuntmodel +TP_COLORAPP_MODELCAT;CAM +TP_COLORAPP_MODELCAT_TOOLTIP;U kunt kiezen tussen CAM02 of CAM16. CAM02 zal soms nauwkeuriger zijn, maar CAM16 zal minder onregelmatigheden genereren. +TP_COLORAPP_MODEL_TOOLTIP;WitpuntmodelWB [RT] + [uitvoer]:\nRT's witbalans wordt gebruikt voor de scène (opname), CIECAM02 gebruikt D50. De witbalans van het uitvoerapparaat (beeldscherm bv.) wordt opgegeven in Weergaveomstandigheden. wit gebruikt de instelling van Voorkeuren > Kleurbeheer\n\nWB [RT+CAT02/16] + [uitvoer]:\nDe witbalansinstellingen van RT worden gebruikt door CAT02 en de witbalans van het uitvoerapparaat wordt opgegeven in Weergaveomstandigheden.\n\nFree temp + tint + CAT02/16 + [uitvoer]: kleurtemperatuur en tint worden opgegeven door de gebruiker en de witbalans van het uitvoerapparaat wordt opgegeven in Weergaveomstandigheden. 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_RSTPRO;Bescherming huid- en rode tinten +TP_COLORAPP_RSTPRO_TOOLTIP;Bescherm huid- en rode tinten (schuifbalk en curven) +TP_COLORAPP_SOURCEF_TOOLTIP;Dit gaat over de opname-omstandigheden en hoe deze omstandigheden en data teruggebracht kunnen worden naar een 'normaal' gebied. Normaal betekent gemiddelde of standaardomstandigheden en -data, dat wil zeggen zonder rekening te houden met CIECAM-correcties. TP_COLORAPP_SURROUND;Omgeving -TP_COLORAPP_SURROUND_AVER;Gemmiddeld +TP_COLORAPP_SURROUNDSRC;Omgevingsverlichting +TP_COLORAPP_SURROUND_AVER;Gemiddeld TP_COLORAPP_SURROUND_DARK;Donker TP_COLORAPP_SURROUND_DIM;Gedimd TP_COLORAPP_SURROUND_EXDARK;Duister -TP_COLORAPP_SURROUND_TOOLTIP;Verander tonen en kleuren rekening houdend met de weergaveomstandigheden van het uitvoerapparaat\n\nGemiddeld:\nGemiddeld verlichte omgeving (standaard)\nDe afbeelding zal niet veranderen \n\nGedimd:\nGedimde omgeving (TV)\nDe afbeelding zal enigszins donkerder worden\n\nDonker:\nDonkere omgeving (projector)\nDe afbeelding zal veel donkerder worden\n\nDuister:\nDuistere omgeving\nDe afbeelding zal zeer donker worden +TP_COLORAPP_SURROUND_TOOLTIP;Verander tonen en kleuren rekening houdend met de weergaveomstandigheden van het uitvoerapparaat\n\nGemiddeld:\nGemiddeld verlichte omgeving (standaard)\nDe afbeelding zal niet veranderen \n\nGedimd:\nGedimde omgeving (TV)\nDe afbeelding zal enigszins donkerder worden\n\nDonker:\nDonkere omgeving (projector)\nDe afbeelding zal veel donkerder worden\n\nDuister:\nDuistere omgeving\nDe afbeelding zal zeer donker worden. +TP_COLORAPP_SURSOURCE_TOOLTIP;Verandert tonen en kleuren op basis van de omgevingsomstandigheden van de opnameverlichting. Hoe donkerder de omgevingsomstandigheden, hoe helderder het beeld zal worden. De helderheid van het beeld zal niet worden gewijzigd wanneer de omgeving op gemiddeld is ingesteld. TP_COLORAPP_TCMODE_BRIGHTNESS;Helderheid TP_COLORAPP_TCMODE_CHROMA;Chroma TP_COLORAPP_TCMODE_COLORF;Kleurrijkheid TP_COLORAPP_TCMODE_LABEL1;Curve modus 1 TP_COLORAPP_TCMODE_LABEL2;Curve modus 2 -TP_COLORAPP_TCMODE_LABEL3;Curve chroma modus -TP_COLORAPP_TCMODE_LIGHTNESS;lichtheid +TP_COLORAPP_TCMODE_LABEL3;Curve chroma-modus +TP_COLORAPP_TCMODE_LIGHTNESS;Lichtheid TP_COLORAPP_TCMODE_SATUR;Verzadiging +TP_COLORAPP_TEMP2_TOOLTIP;Of symmetrische modus temp = Witbalans.\nOf selecteer Lichtbron en stel altijd Tint=1 in.\n\ntemp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +TP_COLORAPP_TEMPOUT_TOOLTIP;Temperatuur en Tint.\nAfhankelijk van eerder gemaakte keuzes, is de geselecteerde temperatuur:\nWitbalans\ntemp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504\nVrij. 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_TONECIE;Tonemappen met CIECAM +TP_COLORAPP_TONECIE_TOOLTIP;Indien uitgevinkt zal het toonmappen plaatsvinden in Lab.\nIndien aangevinkt zal toonmappen gebruikmaken van CIECAM02.\nVoorwaarde is dat Tonemappen (Lab/CIECAM02) actief is. +TP_COLORAPP_VIEWINGF_TOOLTIP;Houd rekening met het apparaat waarop het uiteindelijke beeld zal worden bekeken (monitor, tv, projector, printer, enz.) en de omgeving hiervan. Dit proces gebruikt de gegevens van het proces 'Beeldaanpassingen' en past deze aan het apparaat aan, rekening houdend met de weergave-omstandigheden en de omgeving. TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminantie van de weergaveomgeving \n(gebruikelijk 16cd/m²) TP_COLORAPP_WBCAM;WB [RT+CAT02] + [uitvoer] TP_COLORAPP_WBRT;WB [RT] + [uitvoer] +TP_COLORAPP_YBOUT_TOOLTIP;Yb is de relatieve luminantie van de achtergrond, uitgedrukt in een grijspercentage. 18% grijs komt overeen met een achtergrondluminantie van 50% uitgedrukt in CIE L.\nDe gegevens zijn gebaseerd op de gemiddelde luminantie van het beeld. +TP_COLORAPP_YBSCEN_TOOLTIP;Yb is de relatieve luminantie van de achtergrond, uitgedrukt in een grijspercentage. 18% grijs komt overeen met een achtergrondluminantie van 50% uitgedrukt in CIE L.\nDe gegevens zijn gebaseerd op de gemiddelde luminantie van het beeld. TP_COLORTONING_AB;o C/L TP_COLORTONING_AUTOSAT;Automatisch TP_COLORTONING_BALANCE;Balans TP_COLORTONING_BY;o C/L TP_COLORTONING_CHROMAC;Dekking TP_COLORTONING_COLOR;Kleur -TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP;Chroma dekking als een functie van Luminantie oC=f(L) +TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP;Chroma-dekking als functie van Luminantie oC=f(L) TP_COLORTONING_HIGHLIGHT;Hoge lichten TP_COLORTONING_HUE;Kleurtint -TP_COLORTONING_LAB;L*a*b* menging +TP_COLORTONING_LAB;L*a*b*-menging TP_COLORTONING_LABEL;Kleurtinten -TP_COLORTONING_LABGRID;L*a*b* kleurcorrectie raster +TP_COLORTONING_LABGRID;L*a*b* kleurcorrectieraster TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 -TP_COLORTONING_LABREGIONS;Kleurcorrectie gebieden +TP_COLORTONING_LABREGIONS;Kleurcorrectiegebieden TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 TP_COLORTONING_LABREGION_CHANNEL;Kanaal TP_COLORTONING_LABREGION_CHANNEL_ALL;Alle @@ -1469,12 +2465,12 @@ 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_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_OFFSET;Verschuiving TP_COLORTONING_LABREGION_POWER;Kracht TP_COLORTONING_LABREGION_SATURATION;Verzadiging TP_COLORTONING_LABREGION_SHOWMASK;Toon masker @@ -1483,28 +2479,29 @@ 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. 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_METHOD_TOOLTIP;L*a*b*-menging, RGB-schuifbalken en RGB-curven gebruiken geïnterpoleerde kleurmenging.\nKleurbalans SMH en Verzadiging twee kleuren gebruiken directe kleuren.\nAlle methodes werken ook met zwart-wit. +TP_COLORTONING_MIDTONES;Middentonen TP_COLORTONING_NEUTRAL;Terug naar beginstand -TP_COLORTONING_NEUTRAL_TOOLTIP;Zet alle waarden (Schaduwen, Midden tonen, Hoge lichten) terug naar default. +TP_COLORTONING_NEUTRAL_TOOLTIP;Zet alle waarden (schaduwen, middentonen, hoge lichten) terug naar hun standaardwaarden. TP_COLORTONING_OPACITY;Dekking TP_COLORTONING_RGBCURVES;RGB - Curven TP_COLORTONING_RGBSLIDERS;RGB - Schuifbalken -TP_COLORTONING_SA;Verzadiging bescherming +TP_COLORTONING_SA;Bescherm verzadiging TP_COLORTONING_SATURATEDOPACITY;Sterkte TP_COLORTONING_SATURATIONTHRESHOLD;Drempel TP_COLORTONING_SHADOWS;Schaduwen -TP_COLORTONING_SPLITCO;Schaduwen/Midden tonen/Hoge lichten +TP_COLORTONING_SPLITCO;Schaduwen/Middentonen/Hoge lichten TP_COLORTONING_SPLITCOCO;Kleurbalans SMH -TP_COLORTONING_SPLITLR;Verzadiging 2 kleuren +TP_COLORTONING_SPLITLR;Verzadiging twee kleuren TP_COLORTONING_STR;Sterkte TP_COLORTONING_STRENGTH;Sterkte -TP_COLORTONING_TWO2;Speciaal chroma '2 kleuren' +TP_COLORTONING_TWO2;Speciaal chroma twee kleuren TP_COLORTONING_TWOALL;Speciaal chroma TP_COLORTONING_TWOBY;Speciaal a* en b* -TP_COLORTONING_TWOCOLOR_TOOLTIP;Standaard chroma:\nLineaire response, a* = b*.\n\nSpeciaal chroma:\nLineaire response, a* = b*, maar zonder begrenzing - probeer beneden de diagonaal.\n\nSpeciaal a* en b*:\nLineaire response zonder begrenzing met aparte curves voor a* en b*. Bedoeld voor speciale effecten.\n\nSpeciaal chroma 2 kleuren: meest voorspelbare uitkomst. +TP_COLORTONING_TWOCOLOR_TOOLTIP;Standaard chroma:\nLineaire respons, a* = b*.\n\nSpeciaal chroma:\nLineaire respons, a* = b*, maar ontbonden - gebruik de diagonaal hieronder.\n\nSpeciaal a* en b*:\nLineair ontbonden respons met aparte curves voor a* en b*. Bedoeld voor speciale effecten.\n\nSpeciaal chroma twee kleuren: beter voorspelbaar. TP_COLORTONING_TWOSTD;Standaard chroma TP_CROP_FIXRATIO;Verhouding: +TP_CROP_GTCENTEREDSQUARE;Vierkant gecentreerd TP_CROP_GTDIAGONALS;Diagonaalmethode TP_CROP_GTEPASSPORT;Biometrisch paspoort TP_CROP_GTFRAME;Frame @@ -1529,79 +2526,82 @@ 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_LABEL;Nevelvermindering +TP_DEHAZE_SATURATION;Verzadiging +TP_DEHAZE_SHOW_DEPTH_MAP;Toon 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_CURVE;Chrominantie-curve +TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Verhoog (vermenigvuldig) de waarde van alle chrominantieschuiven.\nDeze curve regelt de sterkte van de chromatische ruisvermindering als een functie van de chromaticiteit, om bijvoorbeeld het effect te verhogen in gebieden met weinig verzadiging en te verlagen in gebieden met veel verzadiging. TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominantie TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Handmatig TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominantie (master) -TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Auto methode -TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Handmatig\nWerkt op de hele afbeelding.\nDe instellingen voor ruisonderdrukking moeten zelf worden bepaald.\n\nAutomatisch algemeen\nWerkt op de hele afbeelding.\n9 gebieden worden gebruikt om de chroma ruisonderdrukking te bepalen.\n\nVoorbeeld\nWerkt op de hele afbeelding.\nHet deel van de afbeelding dat zichtbaar is in het voorbeeld wordt gebruikt om de chroma ruisonderdrukking te bepalen. -TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Handmatig\nWerkt op de hele afbeelding.\nDe instellingen voor ruisonderdrukking moeten zelf worden bepaald.\n\nAutomatisch algemeen\nWerkt op de hele afbeelding.\n9 gebieden worden gebruikt om de chroma ruisonderdrukking te bepalen.\n\nAutomatisch multi-zones\nGeen voorbeeld - werkt alleen bij opslaan. Gebruik de "Voorbeeld" methode om een idee te krijgen van het verwachte resultaat door de tegelgrootte en het centrum van het voorbeeld te matchen.\nDe afbeelding is verdeeld in tegels (10 tot 70 afhankelijk van de afbeeldingsgrootte) en van elke tegel wordt de eigen chroma ruisonderdrukking bepaald.\n\Voorbeeld\nWerkt op de hele afbeelding.\nHet deel van de afbeelding dat zichtbaar is in het voorbeeld wordt gebruikt om de chroma ruisonderdrukking te bepalen. +TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Auto-methode +TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Handmatig\nWerkt op de hele afbeelding.\nDe instellingen voor ruisonderdrukking moeten zelf worden bepaald.\n\nAutomatisch algemeen\nWerkt op de hele afbeelding.\nNegen gebieden worden gebruikt om de chroma-ruisonderdrukking te bepalen.\n\nVoorbeeld\nWerkt op de hele afbeelding.\nHet deel van de afbeelding dat zichtbaar is in het voorbeeld wordt gebruikt om de chroma-ruisonderdrukking te bepalen. +TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Handmatig\nWerkt op de hele afbeelding.\nDe instellingen voor ruisonderdrukking moeten zelf worden bepaald.\n\nAutomatisch algemeen\nWerkt op de hele afbeelding.\nNegen gebieden worden gebruikt om de chroma-ruisonderdrukking te bepalen.\n\nAutomatisch multi-zones\nGeen voorbeeld - werkt alleen bij opslaan. Gebruik de Voorbeeld-methode om een idee te krijgen van het verwachte resultaat door de tegelgrootte en het centrum van het voorbeeld te matchen.\nDe afbeelding is verdeeld in tegels (10 tot 70 afhankelijk van de afbeeldingsgrootte) en van elke tegel wordt de eigen chroma-ruisonderdrukking bepaald.\n\Voorbeeld\nWerkt op de hele afbeelding.\nHet deel van de afbeelding dat zichtbaar is in het voorbeeld wordt gebruikt om de chroma-ruisonderdrukking te bepalen. TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Voorbeeld multi-zone TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Voorbeeld -TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Toont de overgebleven ruisniveaus van het zichtbare deel van de afbeelding in het voorbeeld na wavelet.\n\n>300 Veel ruis\n100-300 Gemiddeld ruis\n50-100 Weinig ruis\n<50 Zeer weinig ruis\n\nVoorzichtig, de waarden zullen verschillen tussen RGB en L*a*b* mode. De RGB waarden zijn minder accuraat omdat de RGB mode luminantie en chrominantie niet volledig scheidt. +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Toont de overgebleven ruisniveaus van het zichtbare deel van de afbeelding in het voorbeeld na Wavelet.\n\n>300 Veel ruis\n100-300 Gemiddelde ruis\n50-100 Weinig ruis\n<50 Zeer weinig ruis\n\nVoorzichtig, de waarden zullen verschillen tussen RGB- en L*a*b*-modus. De RGB-waarden zijn minder accuraat omdat de RGB-modus luminantie en chrominantie niet volledig scheidt. TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Voorbeeld grootte=%1, Centrum: Px=%2 Py=%3 TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Voorbeeld ruis: Gemiddeld=%1 Hoog=%2 TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Voorbeeld ruis: Gemiddeld= - Hoog= - -TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tegel grootte=%1, Centrum: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tegelgrootte=%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 +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminantie-curve +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Luminantie-detail TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminantie TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminantie -TP_DIRPYRDENOISE_MAIN_COLORSPACE;Methode +TP_DIRPYRDENOISE_MAIN_AUTO_GAIN;Compenseer lichtheid +TP_DIRPYRDENOISE_MAIN_AUTO_GAIN_TOOLTIP;Wijzig de kracht van de ruisvermindering gebaseerd op de lichtheid van de afbeelding. De kracht wordt minder bij donkere beelden en meer bij heldere beelden. +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Kleurruimte TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB -TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;Voor raw afbeeldingen kan RGB of Lab methode worden gebruikt.\n\nVoor niet-raw afbeeldingen zal altijd de Lab methode worden gebruikt, ongeacht de geselecteerde methode. +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;Voor RAW-afbeeldingen kan de RGB- of Lab-methode worden gebruikt.\n\nVoor niet-RAW-afbeeldingen zal altijd de Lab-methode worden gebruikt, ongeacht de geselecteerde methode. TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma -TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varieert de mate van ruisonderdrukking over het bereik van tinten. Kleinere waarden beperken zich tot schaduwen, terwijl grotere waarden het bereik oprekken tot heldere tinten +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varieert de mate van ruisonderdrukking over het bereik van tinten. Kleinere waarden beperken zich tot schaduwen, terwijl grotere waarden het bereik oprekken tot heldere tinten. TP_DIRPYRDENOISE_MAIN_MODE;Kwaliteit TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Hoog TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Standaard TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;De kwaliteit kan worden aangepast aan de hoeveelheid ruis. \nHoog verbetert de ruisonderdrukking, maar verlengt de verwerkingstijd TP_DIRPYRDENOISE_MEDIAN_METHOD;Methode -TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Alleen chroma +TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Alleen Chroma TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* -TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Mediaan filter +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Mediaan-filter TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Alleen Luminantie TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB -TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;De "Alleen Luminantie" en "L*a*b*" methodes worden meteen na de wavelet stap uitgevoerd bij het onderdrukken van ruis.\nDe "RGB" methode, wordt echter als laatste stap uitgevoerd bij ruisonderdrukking. +TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;De Alleen Luminantie- en L*a*b*-methodes worden meteen na de Wavelet-stap uitgevoerd bij het onderdrukken van ruis.\nDe RGB-methode wordt echter als laatste stap uitgevoerd bij ruisonderdrukking. TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Gewogen L* (weinig) + a*b* (normaal) -TP_DIRPYRDENOISE_MEDIAN_PASSES;Mediaan herhalingen -TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Het gebruik van drie mediaan filter herhalingen met een 3×3 venster grootte geeft meestal een beter resultaat dan het gebruik van één mediaan filter herhaling met eeen 7×7 venster grootte. +TP_DIRPYRDENOISE_MEDIAN_PASSES;Mediaan-herhalingen +TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Het gebruik van drie mediaanfilter-herhalingen met een 3×3 venstergrootte geeft meestal een beter resultaat dan het gebruik van één mediaanfilter-herhaling met een 7×7 venstergrootte. TP_DIRPYRDENOISE_MEDIAN_TYPE;Type -TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Gebruik een mediaan filter van gewenste venster grootte. Hoe groter het venster hoe langer het duurt.\n\n3×3 zacht: behandeld 5 pixels in een 3×3 pixel venster.\n3×3: behandeld 9 pixels in een 3×3 pixel venster.\n5×5 zacht: behandeld 13 pixels in een 5×5 pixel venster.\n5×5: behandeld 25 pixels in een 5×5 pixel venster.\n7×7: behandeld 49 pixels in een 7×7 pixel venster.\n9×9: behandeld 81 pixels in a 9×9 pixel venster.\n\nSoms is het mogelijk om een betere kwaliteit te krijgen door het uitvoeren van meerdere herhalingen met een kleiner venster dan één uitvoering met een groter venster. +TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Gebruik een mediaanfilter van gewenste venstergrootte. Hoe groter het venster hoe langer het duurt.\n\n3×3 zacht: behandelt 5 pixels in een 3×3 pixelvenster.\n3×3: behandelt 9 pixels in een 3×3 pixelvenster.\n5×5 zacht: behandelt 13 pixels in een 5×5 pixelvenster.\n5×5: behandelt 25 pixels in een 5×5 pixelvenster.\n7×7: behandelt 49 pixels in een 7×7 pixelvenster.\n9×9: behandelt 81 pixels in een 9×9 pixelvenster.\n\nSoms is het mogelijk om een betere kwaliteit te krijgen door het uitvoeren van meerdere herhalingen met een kleiner venster dan één uitvoering met een groter venster. TP_DIRPYRDENOISE_TYPE_3X3;3×3 TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 zacht TP_DIRPYRDENOISE_TYPE_5X5;5×5 TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 zacht TP_DIRPYRDENOISE_TYPE_7X7;7×7 TP_DIRPYRDENOISE_TYPE_9X9;9×9 -TP_DIRPYREQUALIZER_ALGO;Algoritme Huid -TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fijn: behoud de kleuren van de huid, minimaliseert de actie op andere kleuren\nGroot: vermijd artefacten -TP_DIRPYREQUALIZER_ARTIF;Verminder artefacten +TP_DIRPYREQUALIZER_ALGO;Huid-algoritme +TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fijn: behoud de huidskleuren, minimaliseert de actie op andere kleuren\nGroot: vermijd onregelmatigheden +TP_DIRPYREQUALIZER_ARTIF;Verminder onregelmatigheden TP_DIRPYREQUALIZER_HUESKIN;Huidtint -TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;De onderste punten zetten het begin van de transitie zone, en de bovenste punten het einde. Daar is het effect het sterkst.\n\nAls je de zone sterk moet verschuiven of als er sprake is van artefacten, dan is de witbalans incorrect.\nJe kunt de zone enigzins wijzigen om te voorkomen dat de rest van de afbeelding wordt beïnvloed. -TP_DIRPYREQUALIZER_LABEL;Detailcontrast (Lab/CIECAM02) +TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;De onderste punten zetten het begin van de transitiezone, en de bovenste punten het einde. Daar is het effect het sterkst.\n\nAls je de zone sterk moet verschuiven of als er sprake is van artefacten, dan is de witbalans incorrect.\nJe kunt de zone enigszins wijzigen om te voorkomen dat de rest van de afbeelding wordt beïnvloed. +TP_DIRPYREQUALIZER_LABEL;Contrast per Detailniveaus (Lab/CIECAM02) TP_DIRPYREQUALIZER_LUMACOARSEST;grofste -TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- -TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ +TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;< Contrast +TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast > TP_DIRPYREQUALIZER_LUMAFINEST;fijnste TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutraal TP_DIRPYREQUALIZER_SKIN;Huidtinten Wijzigen/Beschermen -TP_DIRPYREQUALIZER_SKIN_TOOLTIP;Bij -100 huidtinten worden gewijzigd.\nBij 0 alle tinten worden gelijk behandeld.\nBij +100 huidtinten worden beschermd en alle andere tinten worden gewijzigd +TP_DIRPYREQUALIZER_SKIN_TOOLTIP;Bij -100 worden huidtinten gewijzigd.\nBij 0 worden alle tinten gelijk behandeld.\nBij +100 worden huidtinten beschermd en alle andere tinten worden gewijzigd 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_DIRPYREQUALIZER_TOOLTIP;Probeer onregelmatigheden te verminderen die het gevolg zijn van een kleurverschuiving van de huidtinten (tint, chroma, luma) en de rest van de afbeelding TP_DISTORTION_AMOUNT;Hoeveelheid -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_AUTO_TOOLTIP;Corrigeert automatisch lensafwijkingen 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 @@ -1613,42 +2613,53 @@ TP_EXPOSURE_AUTOLEVELS;Autom. niveaus 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_CLAMPOOG;Kap kleuren die buiten het gamma vallen af +TP_EXPOSURE_CLIP;Afkap % 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_COMPRHIGHLIGHTS;Hoge lichten comprimeren +TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Drempel compressie hoge lichten TP_EXPOSURE_COMPRSHADOWS;Schaduwcompressie TP_EXPOSURE_CONTRAST;Contrast -TP_EXPOSURE_CURVEEDITOR;Tooncurve -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_CURVEEDITOR1;Tooncurve 1 +TP_EXPOSURE_CURVEEDITOR2;Tooncurve 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:\nThe 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_HISTMATCHING;Automatische tooncurve +TP_EXPOSURE_HISTMATCHING_TOOLTIP;Pas automatisch de curves en schuifregelaars aan (behalve belichtingscompensatie) volgens de in de RAW ingebedde JPEG-afbeelding. TP_EXPOSURE_LABEL;Belichting TP_EXPOSURE_SATURATION;Verzadiging -TP_EXPOSURE_TCMODE_FILMLIKE;Film-achtig +TP_EXPOSURE_TCMODE_FILMLIKE;Filmachtig TP_EXPOSURE_TCMODE_LABEL1;Curve modus 1 TP_EXPOSURE_TCMODE_LABEL2;Curve modus 2 TP_EXPOSURE_TCMODE_LUMINANCE;Luminantie TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptueel TP_EXPOSURE_TCMODE_SATANDVALBLENDING;Verzadiging en Waarde mengen 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_EXPOSURE_TCMODE_WEIGHTEDSTD;Gewogen standaard +TP_EXPOS_BLACKPOINT_LABEL;Raw-zwartpunten +TP_EXPOS_WHITEPOINT_LABEL;Raw-witpunten +TP_FILMNEGATIVE_BLUE;Blauw-verhouding +TP_FILMNEGATIVE_BLUEBALANCE;Koel/Warm +TP_FILMNEGATIVE_COLORSPACE;Omkeerkleurruimte: +TP_FILMNEGATIVE_COLORSPACE_INPUT;Invoerkleurruimte +TP_FILMNEGATIVE_COLORSPACE_TOOLTIP;Kies de kleurruimte voor de negatieve omkering:\nInvoerkleurruimte: voer de omkering uit voordat het invoerprofiel wordt toegepast, zoals in eerdere versies van RT.\nWerkkleurruimte: voer de omkering uit na het invoerprofiel en gebruik het momenteel geselecteerde werkprofiel. +TP_FILMNEGATIVE_COLORSPACE_WORKING;Werkkleurruimte +TP_FILMNEGATIVE_GREEN;Referentie-exponent (contrast) +TP_FILMNEGATIVE_GREENBALANCE;Magenta/Groen +TP_FILMNEGATIVE_GUESS_TOOLTIP;Bepaal automatisch de rood/groen-verhouding door twee gebieden te kiezen met een neutrale tint (geen kleur) in het origineel. De gebieden moeten verschillen in helderheid. Kies de witbalans nadien. +TP_FILMNEGATIVE_LABEL;Filmnegatief +TP_FILMNEGATIVE_OUT_LEVEL;Uitvoerniveau 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_FILMNEGATIVE_PICK_SIZE;Grootte: +TP_FILMNEGATIVE_RED;Rood-verhouding +TP_FILMNEGATIVE_REF_LABEL;Invoer RGB: %1 +TP_FILMNEGATIVE_REF_PICK;Kies witbalans +TP_FILMNEGATIVE_REF_SIZE;Grootte: +TP_FILMNEGATIVE_REF_TOOLTIP;Kies een grijspunt om de witbalans van het positieve beeld te bepalen. +TP_FILMSIMULATION_LABEL;Filmsimulatie +TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee zoekt naar HaldCLUT-afbeeldingen om de Filmsimulatie uit te voeren, maar deze bevinden zich in een map die teveel tijd kost om te lezen.\nKijk bij Voorkeuren > Beeldverwerking > Filmsimulatie om te zien welke map gebruikt wordt\nAanbevolen wordt om een map te gebruiken die alleen HaldCLUT-afbeeldingen bevat of kies een lege folder als u Filmsimulatie niet wilt gebruiken.\n\nMeer informatie is te vinden in het (Engelstalige) artikel over Filmsimulatie op RawPedia.\n\nWilt u de scan nu afbreken? TP_FILMSIMULATION_STRENGTH;Sterkte -TP_FILMSIMULATION_ZEROCLUTSFOUND;Specificeer HaldCLUT map in Voorkeuren +TP_FILMSIMULATION_ZEROCLUTSFOUND;Specificeer HaldCLUT-map in Voorkeuren TP_FLATFIELD_AUTOSELECT;Automatische selectie TP_FLATFIELD_BLURRADIUS;Verzachten: straal TP_FLATFIELD_BLURTYPE;Verzachten: type @@ -1656,8 +2667,9 @@ TP_FLATFIELD_BT_AREA;Gebied TP_FLATFIELD_BT_HORIZONTAL;Horizontaal TP_FLATFIELD_BT_VERTHORIZ;Vert. + Horiz. TP_FLATFIELD_BT_VERTICAL;Verticaal -TP_FLATFIELD_CLIPCONTROL;Clip controle -TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip controle vermijd geclipte hoge lichten veroorzaakt door het toepassen van vlakveld. Als er al geclipte hoge lichten waren voor het toepassen van vlakveld dan kan clip controle kleurzweem veroorzaken. +TP_FLATFIELD_CLIPCONTROL;Afkapcontrole +TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Afkapcontrole vermijdt uitgevreten hoge lichten veroorzaakt door het toepassen van een vlakveld. Als er al uitgevreten hoge lichten waren voor het toepassen van het vlakveld, dan kan afkapcontrole kleurzweem veroorzaken. +TP_FLATFIELD_FROMMETADATA;Uit metadata TP_FLATFIELD_LABEL;Vlakveld TP_GENERAL_11SCALE_TOOLTIP;De werking is alleen zichtbaar op schaal 1:1 van het voorbeeld TP_GRADIENT_CENTER;Centrum @@ -1666,17 +2678,20 @@ TP_GRADIENT_CENTER_X_TOOLTIP;Rotatiepunt X-as: \n-100=linkerkant \n0=centrum \n+ TP_GRADIENT_CENTER_Y;Centrum Y TP_GRADIENT_CENTER_Y_TOOLTIP;Rotatiepunt Y-as: \n-100=bovenkant \n0=centrum \n+100=onderkant TP_GRADIENT_DEGREE;Hoek -TP_GRADIENT_DEGREE_TOOLTIP;Rotatie hoek in graden +TP_GRADIENT_DEGREE_TOOLTIP;Rotatiehoek in graden TP_GRADIENT_FEATHER;Verloop TP_GRADIENT_FEATHER_TOOLTIP;Verloop als percentage van de afbeeldingsdiagonaal -TP_GRADIENT_LABEL;Grijsverloop Filter +TP_GRADIENT_LABEL;Grijsverloopfilter TP_GRADIENT_STRENGTH;Sterkte TP_GRADIENT_STRENGTH_TOOLTIP;Filtersterkte in stops TP_HLREC_BLEND;Mengen -TP_HLREC_CIELAB;CIELab-blending +TP_HLREC_CIELAB;CIELab-menging TP_HLREC_COLOR;Kleurherstel +TP_HLREC_COLOROPP;Inpaint opposed TP_HLREC_ENA_TOOLTIP;Kan worden geactiveerd door automatische niveaus -TP_HLREC_LABEL;Hoge lichten Herstellen +TP_HLREC_HLBLUR;Vervaging +TP_HLREC_HLTH;Versterking drempel +TP_HLREC_LABEL;Hoge lichten herstellen TP_HLREC_LUMINANCE;Lichtherstel TP_HLREC_METHOD;Methode: TP_HSVEQUALIZER_CHANNEL;HSV-balans @@ -1684,20 +2699,24 @@ TP_HSVEQUALIZER_HUE;Tint TP_HSVEQUALIZER_LABEL;HSV-balans TP_HSVEQUALIZER_SAT;Verzadiging TP_HSVEQUALIZER_VAL;Waarde -TP_ICM_APPLYBASELINEEXPOSUREOFFSET;DCP basis belichting -TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Gebruik de ingebedde DCP basis belichting. De instelling is allen actief als de DCP een basis belichting heeft. -TP_ICM_APPLYHUESATMAP;DCP basis tabel -TP_ICM_APPLYHUESATMAP_TOOLTIP;Gebruik de ingebedde DCP basis tabel (HueSatMap). De instelling is allen actief als de DCP een basis tabel heeft. -TP_ICM_APPLYLOOKTABLE;DCP 'look' tabel -TP_ICM_APPLYLOOKTABLE_TOOLTIP;Gebruik de ingebedde DCP 'look' tabel. De instelling is allen actief als de DCP een looktable heeft. -TP_ICM_BPC;Zwartpunt Compensatie -TP_ICM_DCPILLUMINANT;Illuminant +TP_ICM_APPLYBASELINEEXPOSUREOFFSET;DCP-basisbelichting +TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Gebruik de ingebedde DCP-basisbelichting. De instelling is alleen actief als de DCP een basisbelichting heeft. +TP_ICM_APPLYHUESATMAP;DCP-basistabel +TP_ICM_APPLYHUESATMAP_TOOLTIP;Gebruik de ingebedde DCP-basistabel (HueSatMap). De instelling is alleen actief als de DCP een basistabel heeft. +TP_ICM_APPLYLOOKTABLE;DCP-look-tabel +TP_ICM_APPLYLOOKTABLE_TOOLTIP;Gebruik de ingebedde DCP-look-tabel. De instelling is alleen actief als de DCP een look-tabel heeft. +TP_ICM_BPC;Zwartpuntcompensatie +TP_ICM_BW;Zwart en Wit +TP_ICM_DCPILLUMINANT;Lichtbron TP_ICM_DCPILLUMINANT_INTERPOLATED;Interpoleren -TP_ICM_DCPILLUMINANT_TOOLTIP;Kies welk ingebed DCP illuminant moet worden gebruikt. Standaard is dit "interpoleren". Dit is een mix van de twee gebaseerd op de witbalans. De instelling is alleen actief als een Dual-Illuminant DCP met interpolatie is geselecteerd. +TP_ICM_DCPILLUMINANT_TOOLTIP;Kies welk ingebed DCP-illuminant moet worden gebruikt. Standaard is dit 'interpoleren'. Dit is een mix van de twee gebaseerd op de witbalans. De instelling is alleen actief als een Dual-lichtbron DCP met interpolatie is geselecteerd. +TP_ICM_FBW;Zwart-wit +TP_ICM_GAMUT;Begrens kleurruimte +TP_ICM_ILLUMPRIM_TOOLTIP;Kies de verlichting die het dichtst bij de opname-omstandigheden ligt.\nWijzigingen kunnen alleen worden aangebracht wanneer de selectie 'Bestemming primaire kleuren' is ingesteld op 'Aangepast (schuifregelaars)'. TP_ICM_INPUTCAMERA;Camera standaard TP_ICM_INPUTCAMERAICC;Camera-specifiek kleurprofiel -TP_ICM_INPUTCAMERAICC_TOOLTIP;Gebruik RawTherapee's camera-specifieke DCP- of ICC-kleurprofiel dat preciezer is dan een eenvoudige matrix. Beschikbaar voor sommige camera's. Deze profielen zijn opgeslagen in de map /iccprofiles/input en worden automatisch opgehaald gebaseerd op de exacte overeenkomst van bestandsnaam met de modelnaam van de camera. -TP_ICM_INPUTCAMERA_TOOLTIP;Gebruik de eenvoudige kleurenmatrix van dcraw, of de uitgebreidere RawTherapee-versie (indien aanwezig voor het cameramodel) of gebruik het ingebedde profiel in de DNG. +TP_ICM_INPUTCAMERAICC_TOOLTIP;Gebruik RawTherapee's camera-specifieke DCP- of ICC-invoerkleurprofielen. Deze zijn preciezer dan een eenvoudige matrix maar niet beschikbaar voor alle camera's. Deze profielen zijn opgeslagen in de map /iccprofiles/input en /dccprofiles en worden automatisch geladen gebaseerd op een bestandsnaam die exact overeenkomt met de modelnaam van de camera. +TP_ICM_INPUTCAMERA_TOOLTIP;Gebruik een eenvoudige kleurenmatrix van dcraw, een uitgebreidere RawTherapee-versie (indien aanwezig voor het cameramodel), of gebruik het ingebedde profiel in de DNG. TP_ICM_INPUTCUSTOM;Handmatig TP_ICM_INPUTCUSTOM_TOOLTIP;Selecteer eigen DCP/ICC-kleurenprofiel voor uw camera. TP_ICM_INPUTDLGLABEL;Selecteer invoer-ICC-profiel... @@ -1707,29 +2726,85 @@ TP_ICM_INPUTNONE;Geen profiel TP_ICM_INPUTNONE_TOOLTIP;Gebruik geen invoerprofiel. Alleen toepassen in speciale gevallen. TP_ICM_INPUTPROFILE;Invoerprofiel TP_ICM_LABEL;Kleurbeheer +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;Zet terug TP_ICM_NOICM;Geen ICM: sRGB-uitvoer TP_ICM_OUTPUTPROFILE;Uitvoerprofiel -TP_ICM_PROFILEINTENT;Grafische weergave -TP_ICM_SAVEREFERENCE;Bewaar Referentie Afbeelding +TP_ICM_OUTPUTPROFILE_TOOLTIP;Alle RTv4- of RTv2-profielen zijn met TRC - sRGB: g=2,4 s=12,92\n\nMet de ICC-profielmaker kunt u v4- of v2-profielen creëren met de volgende keuzen:\n-Primaire kleuren: Aces AP0, Aces AP1, AdobeRGB, Prophoto, Rec2020, sRGB, Widegamut, BestRGB, BetaRGB, BruceRGB en Aangepast\n-TRC: BT709, sRGB, lineair, standaard g=2,2, standaard g=1,8, Aangepast\n-Lichtbron: D41, D50, D55, D60, D65, D80, stdA 2856K +TP_ICM_PRIMBLU_TOOLTIP;Primair Blauw:\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;Primair Groen:\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 y=0.7750 +TP_ICM_PRIMILLUM_TOOLTIP;U kunt een afbeelding wijzigen van de oorspronkelijke modus ('werkprofiel') naar een andere modus ('Bestemming primaire kleuren'). Wanneer u een andere kleurmodus voor een afbeelding kiest, veranderen de kleurwaarden in de afbeelding permanent.\n\nHet wijzigen van de 'primaire kleuren' is vrij complex en moeilijk te gebruiken en vereist veel experimenteren.\nHiermee kunnen exotische kleurcorrecties worden gemaakt, zoals bij de kanaalmixer primaire kleuren.\nPas de camerakalibratie aan met 'Aangepast (schuifregelaars)'. +TP_ICM_PRIMRED_TOOLTIP;Primair Rood:\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;Weergave-intentie +TP_ICM_REDFRAME;Aangepaste primaire kleuren +TP_ICM_SAVEREFERENCE;Bewaar referentie-afbeelding TP_ICM_SAVEREFERENCE_APPLYWB;Toepassen witbalans -TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;Gebruik witbalans bij het opslaan van afbeeldingen voor het maken van ICC profielen. Gebruik geen witbalans bij het maken van DCP profielen. -TP_ICM_SAVEREFERENCE_TOOLTIP;Sla de lineaire TIFF afbeelding op voordat het invoer profiel is toegepast. Het resultaat kan worden gebruikt voor calibratie en het genereren van een camera profiel. -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_SAVEREFERENCE_APPLYWB_TOOLTIP;Gebruik witbalans bij het opslaan van afbeeldingen voor het maken van ICC-profielen. Gebruik geen witbalans bij het maken van DCP-profielen. +TP_ICM_SAVEREFERENCE_TOOLTIP;Sla de lineaire TIFF-afbeelding op voordat het invoerprofiel is toegepast. Het resultaat kan worden gebruikt voor kalibratie en het genereren van een cameraprofiel. +TP_ICM_TONECURVE;Gebruik DCP-tooncurve +TP_ICM_TONECURVE_TOOLTIP;Gebruik de ingebedde DCP-tooncurve. De instelling is alleen actief als de geselecteerde DCP een tooncurve bevat. +TP_ICM_TRCFRAME;Abstract Profiel +TP_ICM_TRCFRAME_TOOLTIP;Ook bekend als 'synthetische' of 'virtuele' profielen. Deze worden toegepast aan het eind van de verwerkingspijplijn (voor ciecam), waardoor speciale beeldeffecten kunnen worden gecreëerd.\nU kunt wijzigingen aanbrengen in:\n'Toonresponscurve', die de tonen van het beeld aanpast\n'Verlichting', waarmee de primaire kleuren van het profiel worden aangepast aan de opnamemstandigheden.\n'Primaire kleuren Bestemming': waarmee u de Primaire kleuren Bestemming kunt wijzigen met drie hoofdtoepassingen - kanalenmixer, herstel beeldkleur (verzadiging) en kalibratie.\nOpmerking: Abstracte profielen maken gebruik van de ingebouwde werkprofielen zonder deze te wijzigen. Ze werken niet met aangepaste werkprofielen. +TP_ICM_TRC_TOOLTIP;Hiermee kunt u de standaard sRGB Toonresponscurve in RT wijzigen (g=2.4 s=12.92).\nDeze TRC wijzigt de tonen van het beeld. De RGB- en Lab-waarden, het histogram en de uitvoer (scherm, TIF, JPG) worden gewijzigd:\n-Gamma werkt voornamelijk op lichte tonen \n-Hellingshoek werkt voornamelijk op donkere tonen.\nU kunt willekeurige gamma en hellingshoek-paren (waarden >1) kiezen en het algoritme zorgt ervoor dat er continuïteit is tussen de lineaire en parabolische delen van de curve.\nEen andere selectie dan 'Geen' activeert de menu's 'Verlichting' en 'Primaire kleuren Bestemming'. TP_ICM_WORKINGPROFILE;Werkprofiel +TP_ICM_WORKING_CAT;Matrixaanpassing +TP_ICM_WORKING_CAT_BRAD;Bradford +TP_ICM_WORKING_CAT_CAT02;Cat02 +TP_ICM_WORKING_CAT_CAT16;Cat16 +TP_ICM_WORKING_CAT_TOOLTIP;Voert de chromatische aanpassing van de XYZ-conversiematrix uit. Standaard: Bradford +TP_ICM_WORKING_CAT_VK;Von Kries +TP_ICM_WORKING_CAT_XYZ;XYZ-schaal +TP_ICM_WORKING_CIEDIAG;CIE xy diagram +TP_ICM_WORKING_ILLU;Lichtbron +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_E;E +TP_ICM_WORKING_ILLU_NONE;Standaard +TP_ICM_WORKING_ILLU_STDA;stdA 2875K +TP_ICM_WORKING_NON;Geen +TP_ICM_WORKING_PRESER;Bescherm pasteltinten +TP_ICM_WORKING_PRIM;Bestemming primaire kleuren +TP_ICM_WORKING_PRIMFRAME_TOOLTIP;Wanneer 'Aangepast CIE xy-diagram' is geselecteerd in de combobox Primaire kleuren Bestemming, kunt u de waarden van de drie primaire kleuren direct op de grafiek wijzigen.\nMerk op dat in dit geval de positie van het witpunt op de grafiek niet wordt bijgewerkt. +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;Aangepast (schuiven) +TP_ICM_WORKING_PRIM_CUSGR;Aangepast (CIE xy-diagram) +TP_ICM_WORKING_PRIM_FREE;Aangepast LA (schuiven) +TP_ICM_WORKING_PRIM_JDCMAX;JDC Max +TP_ICM_WORKING_PRIM_JDCMAXSTDA;JDC Max stdA +TP_ICM_WORKING_PRIM_NONE;Standaard +TP_ICM_WORKING_PRIM_PROP;ProPhoto +TP_ICM_WORKING_PRIM_REC;Rec2020 +TP_ICM_WORKING_PRIM_SRGB;sRGB +TP_ICM_WORKING_PRIM_TOOLTIP;Controleert de kleuromvang (gamut). Primaire kleuren Bestemming (Geavanceerd) stelt u in staat om de primaire kleuren van de bestemming te wijzigen, om de kleur van het beeld (verzadiging) te herstellen of te veranderen. De kleurbalans blijft behouden wanneer het 'Werkprofiel' en de 'Primaire kleuren Bestemming' gelijk zijn. Het 'Werkprofiel' wordt niet gewijzigd.\nWanneer 'Aangepast LA (schuiven)' is geselecteerd, kunt u de waarden van de drie primaire kleuren (Rood, Groen en Blauw) voor x en y wijzigen. +TP_ICM_WORKING_PRIM_WID;WideGamut TP_ICM_WORKING_TRC;Tooncurve: -TP_ICM_WORKING_TRC_CUSTOM;Gebruiker gedefinieerd +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;Door gebruiker gedefinieerd TP_ICM_WORKING_TRC_GAMMA;Gamma +TP_ICM_WORKING_TRC_LIN;Lineair g=1 TP_ICM_WORKING_TRC_NONE;Geen TP_ICM_WORKING_TRC_SLOPE;Helling +TP_ICM_WORKING_TRC_SRGB;sRGB g=2,4 s=12,92 TP_ICM_WORKING_TRC_TOOLTIP;Enkel voor ingebouwde profielen. TP_IMPULSEDENOISE_LABEL;Spot-ruisonderdrukking TP_IMPULSEDENOISE_THRESH;Drempel -TP_LABCURVE_AVOIDCOLORSHIFT;Vermijd kleurverschuiving -TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Plaats de kleuren in het gamut van de kleurruimte van het werkprofiel\nen pas Munsell correctie toe TP_LABCURVE_BRIGHTNESS;Helderheid TP_LABCURVE_CHROMATICITY;Chromaticiteit -TP_LABCURVE_CHROMA_TOOLTIP;Voor Z-W tonen, zet Chromaticiteit op -100 +TP_LABCURVE_CHROMA_TOOLTIP;Voor zwartwit, zet Chromaticiteit op -100 TP_LABCURVE_CONTRAST;Contrast TP_LABCURVE_CURVEEDITOR;Luminantiecurve TP_LABCURVE_CURVEEDITOR_A_RANGE1;Groen verzadigd @@ -1742,46 +2817,898 @@ TP_LABCURVE_CURVEEDITOR_B_RANGE3;Geel pastel TP_LABCURVE_CURVEEDITOR_B_RANGE4;Geel verzadigd TP_LABCURVE_CURVEEDITOR_CC;CC TP_LABCURVE_CURVEEDITOR_CC_RANGE1;Neutraal -TP_LABCURVE_CURVEEDITOR_CC_RANGE2;Saai +TP_LABCURVE_CURVEEDITOR_CC_RANGE2;Slap TP_LABCURVE_CURVEEDITOR_CC_RANGE3;Pastel TP_LABCURVE_CURVEEDITOR_CC_RANGE4;Verzadigd -TP_LABCURVE_CURVEEDITOR_CC_TOOLTIP;Chromaticiteit volgens chromaticeit C=f(C) +TP_LABCURVE_CURVEEDITOR_CC_TOOLTIP;Chromaticiteit volgens Chromaticiteit C=f(C) TP_LABCURVE_CURVEEDITOR_CH;CH -TP_LABCURVE_CURVEEDITOR_CH_TOOLTIP;Chromaticiteit volgens Tint C=f(H) +TP_LABCURVE_CURVEEDITOR_CH_TOOLTIP;Chromaticiteit volgens Tint C=f(T) TP_LABCURVE_CURVEEDITOR_CL;CL TP_LABCURVE_CURVEEDITOR_CL_TOOLTIP;Chromaticiteit volgens Luminantie C=f(L) TP_LABCURVE_CURVEEDITOR_HH;HH -TP_LABCURVE_CURVEEDITOR_HH_TOOLTIP;Hue volgens hue H=f(H) +TP_LABCURVE_CURVEEDITOR_HH_TOOLTIP;Hue volgens Tint H=f(T) TP_LABCURVE_CURVEEDITOR_LC;LC -TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP;Luminantie volgens chromaticiteit L=f(C) +TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP;Luminantie volgens Chromaticiteit L=f(C) TP_LABCURVE_CURVEEDITOR_LH;LH -TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminantie volgens hue L=f(H) -TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminantie volgens luminantie L=f(L) +TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminantie volgens Tint 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_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_LABCURVE_LCREDSK;Beperk LC tot huid- en rode tinten +TP_LABCURVE_LCREDSK_TOOLTIP;Indien ingeschakeld beïnvloedt de LC-curve alleen huid- en rode tinten.\nIndien uitgeschakeld is het van toepassing op alle tinten. +TP_LABCURVE_RSTPROTECTION;Bescherming huid- en rode tinten +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_CORRECTION_LCPFILE;LCP-bestand +TP_LENSPROFILE_CORRECTION_MANUAL;Handmatige selectie +TP_LENSPROFILE_CORRECTION_METADATA;Uit metadata bestand +TP_LENSPROFILE_LABEL;Lenscorrectieprofielen +TP_LENSPROFILE_LENS_WARNING;Waarschuwing: de gebruikte bijsnijdfactor van het lensprofiel komt niet overeen met de bijsnijdfactor van de camera, de resultaten kunnen onjuist zijn. +TP_LENSPROFILE_MODE_HEADER;Lensprofiel 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_DARKNESS;Donkere delen +TP_LOCALCONTRAST_LABEL;Lokaal contrast +TP_LOCALCONTRAST_LIGHTNESS;Lichte delen TP_LOCALCONTRAST_RADIUS;Straal +TP_LOCALLAB_ACTIV;Alleen luminantie +TP_LOCALLAB_ACTIVSPOT;Activeer spot +TP_LOCALLAB_ADJ;Kleurequalizer +TP_LOCALLAB_AMOUNT;Hoeveelheid +TP_LOCALLAB_ARTIF;Vormdetectie +TP_LOCALLAB_ARTIF_TOOLTIP;De ΔE-bereikdrempel vergroot het ΔE-bereik. Hoge waarden zijn voor beelden met een zeer groot kleurbereik.\nDoor het ΔE-verval te vergroten kan de vormdetectie verbeterd worden maar ook het bereik gereduceerd. +TP_LOCALLAB_AUTOGRAY;Autom. gemiddelde luminantie (Yb%) +TP_LOCALLAB_AUTOGRAYCIE;Auto +TP_LOCALLAB_AVOID;Voorkom kleurverschuiving +TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Pas kleuren aan tot ze binnen het bereik van de werkkleurruimte vallen en pas Munsell-correctie toe (Uniform Perceptual Lab). Standaard: Alleen Munsell.\n\nAlleen Munsell: Corrigeert tintafwijkingen in de Lab-modus als gevolg van non-lineariteit wanneer de chromaticiteit wordt gewijzigd (Uniform Perceptual Lab).\nLab: Past een gamutcontrole toe in relatieve colorimetrie. Vervolgens wordt Munsell toegepast.\nXYZ Absoluut: Past gamutcontrole toe in absolute colorimetrie. Vervolgens wordt Munsell toegepast.\nXYZ Relatief: Past gamutcontrole toe in relatieve colorimetrie. Vervolgens wordt Munsell toegepast. Het resultaat is niet hetzelfde als bij Lab. +TP_LOCALLAB_AVOIDMUN;Alleen Munsell-correctie +TP_LOCALLAB_AVOIDMUN_TOOLTIP;Munsell-correctie is altijd uitgeschakeld wanneer Jz of CAM16 wordt gebruikt. +TP_LOCALLAB_AVOIDRAD;Verzachtingsstraal +TP_LOCALLAB_BALAN;ab-L-balans (ΔE) +TP_LOCALLAB_BALANEXP;Laplacian-balans +TP_LOCALLAB_BALANH;C-H-balans (ΔE) +TP_LOCALLAB_BALAN_TOOLTIP;Wijzigt de parameters van het ΔE-algoritme.\nHoudt meer of minder rekening met a*b* of L*, of meer of minder C of H.\nNiet voor ruisonderdrukking. +TP_LOCALLAB_BASELOG;Bereik schaduwen (logaritmische basis) +TP_LOCALLAB_BILATERAL;Bilateraal filter +TP_LOCALLAB_BLACK_EV;Zwart LW +TP_LOCALLAB_BLCO;Alleen chrominantie +TP_LOCALLAB_BLENDMASKCOL;Meng +TP_LOCALLAB_BLENDMASKMASK;Voeg toe/trek af luma-masker +TP_LOCALLAB_BLENDMASKMASKAB;Voeg toe/trek af chroma-masker +TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;Schuifregelaar op 0, geen actie.\nVoeg het masker toe aan of trek het af van de originele afbeelding. +TP_LOCALLAB_BLENDMASK_TOOLTIP;Als mengen = 0 wordt alleen de vormdetectie verbeterd.\nAls mengen > 0 wordt het masker aan de afbeelding toegevoegd. Als mengen < 0 wordt het masker van de afbeelding afgetrokken. +TP_LOCALLAB_BLGUID;Begeleid filter +TP_LOCALLAB_BLINV;Inverteer +TP_LOCALLAB_BLLC;Luminantie & Chrominantie +TP_LOCALLAB_BLLO;Alleen luminantie +TP_LOCALLAB_BLMED;Mediaan +TP_LOCALLAB_BLMETHOD_TOOLTIP;Normaal: direct vervagen en ruis met alle instellingen.\nInvers: vervagen en ruis met alle instellingen. Waarschuwing, sommige instellingen kunnen vreemde resultaten geven. +TP_LOCALLAB_BLNOI_EXP;Vervaging & Ruis +TP_LOCALLAB_BLNORM;Normaal +TP_LOCALLAB_BLUFR;Vervaging/Korrel & Ruisvermindering +TP_LOCALLAB_BLUMETHOD_TOOLTIP;Om de achtergrond te vervagen en de voorgrond te isoleren:\n-vervaging van de achtergrond door de afbeelding volledig te bedekken met een spot (hoge waarden voor bereik en overgang en 'Normaal' of 'Invers' in het selectievakje).\n-Isoleren van de voorgrond door een of meer 'Uitsluitende' spots te gebruiken en het bereik te vergroten.\n\nDeze module (inclusief Mediaan en Guided filter) kan worden gebruikt als aanvulling op de ruisonderdrukking in het hoofdmenu. +TP_LOCALLAB_BLUR;Gaussiaanse vervaging - Ruis - Korrel +TP_LOCALLAB_BLURCOL;Straal +TP_LOCALLAB_BLURCOLDE_TOOLTIP;De afbeelding die wordt gebruikt om ΔE te berekenen, wordt lichtelijk vervaagd om te voorkomen dat geïsoleerde pixels in de berekening worden meegenomen. +TP_LOCALLAB_BLURDE;Vormdetectie vervaging +TP_LOCALLAB_BLURLC;Alleen luminantie +TP_LOCALLAB_BLURLEVELFRA;Vervagingsniveaus +TP_LOCALLAB_BLURMASK_TOOLTIP;Gebruikt een vervaging met een grote straal om een masker te creëren waarmee het contrast van de afbeelding gevarieerd kan worden en/of delen ervan donkerder of lichter te maken. +TP_LOCALLAB_BLURRMASK_TOOLTIP;Hiermee wordt de straal van de Gaussische vervaging gewijzigd (0 tot 1000). +TP_LOCALLAB_BLUR_TOOLNAME;Vervaging/Korrel & Ruisvermindering +TP_LOCALLAB_BLWH;Alle veranderingen forceren in zwart-wit +TP_LOCALLAB_BLWH_TOOLTIP;Dwingt de kleurcomponenten 'a' en 'b' naar nul.\nHandig voor zwart-witverwerking of filmsimulatie. +TP_LOCALLAB_BUTTON_ADD;Voeg toe +TP_LOCALLAB_BUTTON_DEL;Wis +TP_LOCALLAB_BUTTON_DUPL;Dupliceer +TP_LOCALLAB_BUTTON_REN;Hernoem +TP_LOCALLAB_BUTTON_VIS;Toon/verberg +TP_LOCALLAB_BWEVNONE;Geen +TP_LOCALLAB_BWEVSIG;Geactiveerd +TP_LOCALLAB_BWEVSIGLOG;Sigmoid & Log-codering +TP_LOCALLAB_BWFORCE;Gebruik Zwart LW & Wit LW +TP_LOCALLAB_CAM16PQREMAP;HDR PQ (Piekluminantie) +TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) aangepast aan CAM16 (experimenteel). Hiermee kunt u de interne PQ-functie wijzigen (meestal 10000 cd/m2 - standaard 100 cd/m2 - uitgeschakeld voor 100 cd/m2).\nKan bijvoorbeeld worden gebruikt om CAM16-verwerking af te stemmen op de maximale monitorhelderheid van 400 cd/m2. +TP_LOCALLAB_CAM16_FRA;Cam16 Beeldaanpassingen +TP_LOCALLAB_CAMMODE;CAM-model +TP_LOCALLAB_CAMMODE_CAM16;CAM 16 +TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz +TP_LOCALLAB_CATAD;Chromatische aanpassing/Cat16 +TP_LOCALLAB_CBDL;Contrast per Detailniveaus +TP_LOCALLAB_CBDLCLARI_TOOLTIP;Verbetert het lokale contrast van de middentonen. +TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Zelfde als wavelets.\nHet eerste niveau (0) werkt op details van 2x2 pixels.\nHet laatste niveau (5) werkt op details van 64x64 pixels. +TP_LOCALLAB_CBDL_THRES_TOOLTIP;Voorkomt het verscherpen van ruis. +TP_LOCALLAB_CBDL_TOOLNAME;Contrast per Detailniveaus +TP_LOCALLAB_CENTER_X;Centrum X +TP_LOCALLAB_CENTER_Y;Centrum Y +TP_LOCALLAB_CH;CL - LC +TP_LOCALLAB_CHRO46LABEL;Chroma-niveaus 456: Gemiddeld=%1 Hoog=%2 +TP_LOCALLAB_CHROLABEL;Chroma-niveaus 0123: Gemiddeld=%1 Hoog=%2 +TP_LOCALLAB_CHROMA;Chrominantie +TP_LOCALLAB_CHROMABLU;Chroma-niveaus +TP_LOCALLAB_CHROMABLU_TOOLTIP;Vergroot of vermindert het effect afhankelijk van de luma-instellingen.\nWaarden onder 1 verminderen het effect. Waarden boven 1 vergroten het effect. +TP_LOCALLAB_CHROMACBDL;Chroma +TP_LOCALLAB_CHROMACB_TOOLTIP;Vergroot of vermindert het effect afhankelijk van de luma-instellingen.\nWaarden onder 1 verminderen het effect. Waarden boven 1 vergroten het effect. +TP_LOCALLAB_CHROMALEV;Chroma-niveaus +TP_LOCALLAB_CHROMASKCOL;Chroma +TP_LOCALLAB_CHROMASK_TOOLTIP;Wijzigt de chroma van het masker als er een bestaat (d.w.z. C(C) of LC(H) is geactiveerd). +TP_LOCALLAB_CHROML;Chroma (C) +TP_LOCALLAB_CHRRT;Chroma +TP_LOCALLAB_CIE;Kleurweergave (Cam16 & JzCzHz) +TP_LOCALLAB_CIEC;Gebruik Ciecam omgevingsparameters +TP_LOCALLAB_CIECAMLOG_TOOLTIP;Deze module is gebaseerd op het CIECAM-kleurverschijningsmodel, dat is ontworpen om beter te simuleren hoe het menselijk oog kleuren waarneemt onder verschillende lichtomstandigheden.\nHet eerste Ciecam-proces 'Opname-omstandigheden' wordt uitgevoerd met log-codering en maakt gebruik van 'Absolute luminantie' op het moment van opname.\nHet tweede Ciecam-proces 'Beeldaanpassingen' is vereenvoudigd en gebruikt slechts drie variabelen (lokaal contrast, contrast J, verzadiging s).\nHet derde Ciecam-proces 'Weergaveomstandigheden' past de uitvoer aan de beoogde weergaveomstandigheden aan (monitor, tv, projector, printer, enz.), zodanig dat de kleuren en het contrast behouden blijven in de weergaveomgeving. +TP_LOCALLAB_CIECOLORFRA;Kleur +TP_LOCALLAB_CIECONTFRA;Contrast +TP_LOCALLAB_CIELIGHTCONTFRA;Verlichting & Contrast +TP_LOCALLAB_CIELIGHTFRA;Verlichting +TP_LOCALLAB_CIEMODE;Verander gereedschapspositie +TP_LOCALLAB_CIEMODE_COM;Standaard +TP_LOCALLAB_CIEMODE_DR;Dynamisch bereik +TP_LOCALLAB_CIEMODE_TM;Toonmappen +TP_LOCALLAB_CIEMODE_TOOLTIP;In de standaardmodus wordt Ciecam aan het einde van het proces toegevoegd. 'Masker en modificaties' en 'Herstel volgens luminantiemasker' zijn beschikbaar voor 'Cam16 en JzCzHz'.\nU kunt Ciecam ook integreren met andere gereedschappen (TM, Wavelet, Dynamisch Bereik, Log-codering). De resultaten met deze gereedschappen zullen anders zijn dan zonder Ciecam. In deze modus kunt u ook 'Masker en modificaties' en 'Herstel volgens luminantiemasker' gebruiken. +TP_LOCALLAB_CIEMODE_WAV;Wavelet +TP_LOCALLAB_CIETOOLEXP;Curven +TP_LOCALLAB_CIE_SMOOTHFRAME;Versterking hoge lichten & Niveaus +TP_LOCALLAB_CIE_SMOOTH_EV;Gebaseerd op LW +TP_LOCALLAB_CIE_SMOOTH_GAMMA;Gebaseerd op helling +TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF;Gebaseerd op gamma +TP_LOCALLAB_CIE_SMOOTH_LEVELS;Niveaus +TP_LOCALLAB_CIE_SMOOTH_NONE;Geen +TP_LOCALLAB_CIE_TOOLNAME;Kleurweergave (Cam16 & JzCzHz) +TP_LOCALLAB_CIRCRADIUS;Spotgrootte +TP_LOCALLAB_CIRCRAD_TOOLTIP;Bevat de referenties van de spot, nuttig voor vormdetectie (tint, luma, chroma, Sobel).\nLage waarden kunnen nuttig zijn bij het verwerken van gebladerte.\nGebruik hoge waarden voor huidtinten. +TP_LOCALLAB_CLARICRES;Meng chroma +TP_LOCALLAB_CLARIFRA;Klaarheid (Clarity) & Scherptemasker/Meng & Verzacht beelden +TP_LOCALLAB_CLARIJZ_TOOLTIP;Niveaus 0 tot en met 4: Scherptemasker is ingeschakeld\nNiveaus 5 en hoger: Klaarheid (Clarity) is ingeschakeld. +TP_LOCALLAB_CLARILRES;Meng luma +TP_LOCALLAB_CLARISOFT;Verzacht straal +TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;De schuifregelaar Verzachtingsstraal (Begeleid filter) vermindert halo's en onregelmatigheden voor Klaarheid (Clarity), Scherptemasker en Lokaal contrast wavelets Jz. +TP_LOCALLAB_CLARISOFT_TOOLTIP;De schuifregelaar Verzachtingsstraal (Begeleid filter) vermindert halo's en onregelmatigheden voor Klaarheid (Clarity), Scherptemasker en alle wavelet-piramideprocessen. Zet de schuif op 0 om dit te deactiveren. +TP_LOCALLAB_CLARITYML;Klaarheid (Clarity) +TP_LOCALLAB_CLARI_TOOLTIP;Niveaus 0 tot en met 4: Scherptemasker is ingeschakeld.\nNiveaus 5 en hoger: Helderheid is ingeschakeld.\nNuttig bij toonmappen met wavelet-niveaus. +TP_LOCALLAB_CLIPTM;Kap herstelde data af (versterking) +TP_LOCALLAB_COFR;Kleur & Licht +TP_LOCALLAB_COLORDE;ΔE Voorbeeldkleur - intensiteit +TP_LOCALLAB_COLORDEPREV_TOOLTIP;De voorvertoningsknop voor ΔE in Instellingen werkt alleen als Verscherping, Zacht Licht en Originele Retinex, Vervagen/Korrel en Ruisvermindering, Nevel Verwijderen en Retinex of Contrast per Detailniveaus zijn geactiveerd in het menu 'Voeg gereedschap toe aan huidige spot'.\nVoor andere gereedschappen bevindt de Voorvertoningsknop ΔE zich in de tool, waarmee ΔE wordt voorvertoond met meerdere ingeschakelde gereedschappen. Geef de voorkeur aan Masker en modificaties. +TP_LOCALLAB_COLORDE_TOOLTIP;Toont een blauwe kleurvoorvertoning van de ΔE-selectie indien negatief en groen indien positief.\n\nMasker en modificaties (toon gemodificeerde gebieden zonder masker): toon daadwerkelijke modificaties als positief, toon verbeterde modificaties (alleen luminantie) met blauw en geel indien negatief. +TP_LOCALLAB_COLORFRAME;Dominante kleur +TP_LOCALLAB_COLORSCOPE;Bereik (kleurgereedschappen) +TP_LOCALLAB_COLORSCOPE_TOOLTIP;Gemeenschappelijke bereikschuif voor Kleur en Licht, Schaduwen/Hoge lichten, Levendigheid.\nAndere hulpmiddelen hebben hun eigen bereikregelaars. +TP_LOCALLAB_COLOR_CIE;Kleurcurve +TP_LOCALLAB_COLOR_TOOLNAME;Kleur & Licht +TP_LOCALLAB_COL_NAME;Naam +TP_LOCALLAB_COL_VIS;Status +TP_LOCALLAB_COMPFRA;Directioneel contrast +TP_LOCALLAB_COMPRCIE;Helderheidscompressie +TP_LOCALLAB_COMPRCIETH;Compressiedrempel +TP_LOCALLAB_COMPREFRA;Wavelet-niveau toonmappen +TP_LOCALLAB_COMPRLOG_TOOLTIP;Dit algoritme comprimeert de gegevens vòòr de logconversie, boven de drempelwaarde van de schuif. Te gebruiken in combinatie met Witdistributie. +TP_LOCALLAB_CONTCOL;Contrastdrempel +TP_LOCALLAB_CONTFRA;Contrast per niveau +TP_LOCALLAB_CONTRAST;Contrast +TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Hiermee kunt u het contrast van het masker vrij aanpassen.\nHet heeft een vergelijkbare functie als de Gamma- en Helling-schuiven.\nHiermee kunt u bepaalde delen van het beeld bewerken (meestal de lichtste delen van het masker door de curve te gebruiken om de donkere delen uit te sluiten). Dit kan artefacten veroorzaken. +TP_LOCALLAB_CONTRESID;Contrast +TP_LOCALLAB_CONTTHMASK_TOOLTIP;Hiermee kunt u bepalen welke delen van het beeld worden beïnvloed op basis van de textuur. +TP_LOCALLAB_CONTTHR;Contrastdrempel +TP_LOCALLAB_CONTWFRA;Lokaal contrast +TP_LOCALLAB_CSTHRESHOLD;Wavelet-niveaus +TP_LOCALLAB_CSTHRESHOLDBLUR;Selecteer Wavelet-niveau +TP_LOCALLAB_CURV;Lichtheid - Contrast - Chrominantie 'Super' +TP_LOCALLAB_CURVCURR;Normaal +TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;Als de curven bovenaan staan, is het masker volledig zwart en worden er geen wijzigingen aangebracht in het beeld.\nAls de curve naar beneden wordt geplaatst, wordt het masker geleidelijk kleurrijker en helderder, waardoor het beeld progressief verandert.\n\nHet wordt aanbevolen (maar is niet verplicht) om de bovenkant van de curven op de grijze grenslijn te plaatsen die de referentiewaarden van chroma, luma en tint voor de spot weergeeft. +TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;Als de curven bovenaan staan, is het masker volledig zwart en worden er geen wijzigingen aangebracht in het beeld.\nAls de curve naar beneden wordt geplaatst, wordt het masker geleidelijk kleurrijker en helderder, waardoor het beeld progressief verandert.\n\nHet wordt aanbevolen (maar is niet verplicht) om de bovenkant van de curven op de grijze grenslijn te plaatsen die de referentiewaarden van chroma, luma en tint voor de spot weergeeft. +TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;Om de curves te activeren, stelt u het Curvetype in de combobox in op 'Normaal'. +TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tooncurve +TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), kan worden gebruikt met L(H) in Kleur en Licht. +TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normaal', de curve L=f(L) gebruikt hetzelfde algoritme als de helderheidsschuif. +TP_LOCALLAB_CURVES_CIE;Tooncurven +TP_LOCALLAB_CURVNONE;De-activeer curven +TP_LOCALLAB_DARKRETI;Donker +TP_LOCALLAB_DEHAFRA;Ontnevelen +TP_LOCALLAB_DEHAZ;Kracht +TP_LOCALLAB_DEHAZE_BLACK;Zwart +TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Verwijdert atmosferische nevel. Verhoogt de algehele verzadiging en detail.\nKan kleurzweem verwijderen, maar kan ook een blauwzweem introduceren die met andere hulpmiddelen kan worden gecorrigeerd. +TP_LOCALLAB_DEHAZ_TOOLTIP;Negatieve waarden voegen nevel toe. +TP_LOCALLAB_DELTAD;Delta-balans +TP_LOCALLAB_DELTAEC;ΔE Beeldmasker +TP_LOCALLAB_DENOI1_EXP;Ruisvermindering volgens luminantiemasker +TP_LOCALLAB_DENOI2_EXP;Herstel volgens luminantiemasker +TP_LOCALLAB_DENOIBILAT_TOOLTIP;Hiermee kunt u impuls- of 'zout en peper'-ruis verminderen. +TP_LOCALLAB_DENOICHROC_TOOLTIP;Hiermee kunt u ruisvlekken aanpakken. +TP_LOCALLAB_DENOICHRODET_TOOLTIP;Hiermee kunt u chrominantiedetails herstellen door geleidelijk een Fourier-transformatie (DCT) toe te passen. +TP_LOCALLAB_DENOICHROF_TOOLTIP;Hiermee kunt u chrominantieruis in fijne details aanpassen. +TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Hiermee kunt u de chromaruisreductie of op blauw-gele of op rood-groene kleuren richten. +TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Hiermee kunt u meer of minder ruisreductie uitvoeren in de schaduwen of de hoge lichten. +TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Hiermee kunt u luminantiedetails herstellen door geleidelijk een Fourier-transformatie (DCT) toe te passen. +TP_LOCALLAB_DENOIMASK;Chroma-masker ruisvermindering +TP_LOCALLAB_DENOIMASK_TOOLTIP;Voor alle hulpmiddelen is hiermee het chromatische ruisniveau van het masker te regelen.\nHandig voor een betere controle van de chrominantie en om onregelmatigheden te vermijden bij gebruik van de LC(h)-curve. +TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservatieve modus behoudt lage frequentiedetails. Agressieve modus verwijdert lage frequentiedetails.\nConservatieve en agressieve modi gebruiken wavelets en DCT en kunnen worden gebruikt in combinatie met 'Non-local Means – Luminance'. +TP_LOCALLAB_DENOITHR_TOOLTIP;Past randdetectie aan om te helpen ruis in uniforme, laag-contrastgebieden te verminderen. +TP_LOCALLAB_DENOIWAVCH;Wavelets: Chrominantie +TP_LOCALLAB_DENOIWAVLUM;Wavelets: Luminantie +TP_LOCALLAB_DENOI_EXP;Ruisvermindering +TP_LOCALLAB_DENOI_TOOLTIP;Deze module kan worden gebruikt voor ruisreductie, hetzij op zichzelf (aan het einde van de verwerkingspijplijn) of in aanvulling op de module Ruisreductie in het Detailtabblad (die aan het begin van de pijplijn werkt).\nMet Bereik kunt u de actie differentiëren op basis van kleur (ΔE).\nMinimale spotgrootte: 128x128. +TP_LOCALLAB_DEPTH;Diepte +TP_LOCALLAB_DETAIL;Lokaal contrast +TP_LOCALLAB_DETAILFRA;Randdetectie - DCT +TP_LOCALLAB_DETAILSH;Details +TP_LOCALLAB_DETAILTHR;Detaildrempel Lum/chrom +TP_LOCALLAB_DISAB_CIECAM;Schakel Ciecam of geringe Jz-omgeving uit +TP_LOCALLAB_DIVGR;Gamma +TP_LOCALLAB_DUPLSPOTNAME;Kopieer +TP_LOCALLAB_EDGFRA;Randscherpte +TP_LOCALLAB_EDGSHOW;Toon alle gereedschappen +TP_LOCALLAB_ELI;Ellips +TP_LOCALLAB_ENABLE_AFTER_MASK;Gebruik toonmappen +TP_LOCALLAB_ENABLE_MASK;Activeer masker +TP_LOCALLAB_ENABLE_MASKAFT;Gebruik alle algoritmen Belichting +TP_LOCALLAB_ENABLE_MASKALL;Gebruik alle maskergereedschappen +TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;Indien ingeschakeld, gebruikt het masker Herstelde Data na de Transmissiekaart in plaats van Originele Data. +TP_LOCALLAB_ENH;Verbeterd +TP_LOCALLAB_ENHDEN;Verbeterd + chroma-ruisonderdrukking +TP_LOCALLAB_EPSBL;Detail +TP_LOCALLAB_EQUIL;Normaliseer luminantie +TP_LOCALLAB_EQUILTM_TOOLTIP;Herstel luminantie zodat het gemiddelde en de variantie van de uitvoerafbeelding identiek zijn aan die van het origineel. +TP_LOCALLAB_ESTOP;Randbehoud +TP_LOCALLAB_EV_DUPL;Kopie van +TP_LOCALLAB_EV_NVIS;Verberg +TP_LOCALLAB_EV_NVIS_ALL;Verberg allemaal +TP_LOCALLAB_EV_VIS;Toon +TP_LOCALLAB_EV_VIS_ALL;Toon alles +TP_LOCALLAB_EXCLUF;Uitsluiting +TP_LOCALLAB_EXCLUF_TOOLTIP;De modus 'Uitsluiten' voorkomt dat aangrenzende spots bepaalde delen van het beeld beïnvloeden. Door 'Bereik' aan te passen, wordt het kleurbereik vergroot.\nU kunt ook gereedschappen toevoegen aan een Uitgesloten spot en deze op dezelfde manier gebruiken als bij een normale spot. +TP_LOCALLAB_EXCLUTYPE;Spotmethode +TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Een normale spot gebruikt recursieve data.\n\nEen uitsluitspot initialiseert alle selectieve bewerkingsdata opnieuw.\nKan worden gebruikt om een vorige actie geheel of gedeeltelijk te annuleren of om bewerkingen in de omgekeerde modus uit te voeren.\nGebruik 'Bereik' (Uitsluiten) om de uitsluitingsintensiteit in te stellen.\n\n'Volledige afbeelding' stelt u in staat om de selectieve bewerkingsgereedschappen op de hele afbeelding te gebruiken.\nDe RT Spot-begrenzers worden buiten de preview-grenzen van de afbeelding geplaatst.\nDe overgang is ingesteld op 100.\nOpmerking: Mogelijk moet u de RT Spot iets verplaatsen en de spotgrootte aanpassen om het gewenste effect te bereiken.\nOpmerking2: Het gebruik van Ruisonderdrukking, Wavelets of FFTW in volledige afbeeldingsmodus gebruikt grote hoeveelheden geheugen en kan ervoor zorgen dat de applicatie crasht op systemen met een lagere capaciteit.\n\n'Globaal' stelt u in staat om de selectieve bewerkingsgereedschappen op de hele afbeelding te gebruiken, zonder Delta E of transities. +TP_LOCALLAB_EXECLU;Sluit spot uit +TP_LOCALLAB_EXFULL;Volledige afbeelding +TP_LOCALLAB_EXMAIN;Globaal +TP_LOCALLAB_EXNORM;Normale spot +TP_LOCALLAB_EXPCBDL_TOOLTIP;Kan worden gebruikt om vlekken op de sensor of lens te verwijderen door het contrast op de juiste detailniveau te verminderen. +TP_LOCALLAB_EXPCHROMA;Chroma-compensatie +TP_LOCALLAB_EXPCHROMA_TOOLTIP;Gebruik in combinatie met 'Belichtingscompensatie f' en 'Contrastverzwakker f' om de kleurverzadiging te behouden. +TP_LOCALLAB_EXPCOLOR_TOOLTIP;Pas kleur, helderheid en contrast aan en corrigeer kleine gebreken zoals rode ogen, stof op de sensor, enz. +TP_LOCALLAB_EXPCOMP;Belichtingscompensatie ƒ +TP_LOCALLAB_EXPCOMPINV;Belichtingscompensatie +TP_LOCALLAB_EXPCOMP_TOOLTIP;Voor portretten of afbeeldingen met een gering kleurverloop. U kunt 'Vormdetectie' wijzigen in 'Instellingen':\n\nVerhoog 'ΔE-bereikdrempel'\nVerlaag 'ΔE-verval'\nVerhoog 'ab-L balans (ΔE)' +TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;Zie de documentatie voor Wavelet-niveaus.\nEr zijn enkele verschillen in de Selectieve bewerkingsversie, die meer gereedschappen en mogelijkheden heeft om aan afzonderlijke detailniveaus te werken.\nBijvoorbeeld toonmapping met Wavelet-niveaus. +TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Vermijd spots die te klein zijn (< 32x32 pixels).\nGebruik een lage 'Transitiewaarde' en een hoge waarde voor 'Transitieverval' en 'Bereik' om kleine spots te simuleren en defecten aan te pakken.\nGebruik 'Helderheid en scherptemasker' en 'Meng en verzacht beelden' indien nodig door 'Zachte straal' aan te passen om artefacten te verminderen. +TP_LOCALLAB_EXPCURV;Curven +TP_LOCALLAB_EXPGRAD;Verloopfilter +TP_LOCALLAB_EXPGRADCOL_TOOLTIP;Een verloopfilter is beschikbaar in Kleur en Licht (luminantie, chrominantie & tintverlopen en 'Voeg bestand samen'), Belichting (luminantieverloop), Belichtingsmasker (luminantieverloop), Schaduwen/Hoge lichten (luminantieverloop), Levendigheid (luminantie, chrominantie & tintverlopen), Lokaal contrast & wavelet-piramide (lokaal contrastverloop).\nVervaging bevindt zich in Instellingen. +TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Wijzigt de menging van de getransformeerde/originele afbeelding. +TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Wijzigt het gedrag voor afbeeldingen met te veel of te weinig contrast door een gammacurve toe te voegen vóór en na de Laplace-transformatie. +TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Wijzigt het gedrag voor onderbelichte foto's door een lineaire component toe te voegen vóór het toepassen van de Laplace-transformatie. +TP_LOCALLAB_EXPLAP_TOOLTIP;Door de schuif naar rechts te verplaatsen, wordt het contrast geleidelijk verminderd. +TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Stelt u in staat om GIMP- of Photoshop-laagmengmodi (verschil, vermenigvuldigen, zacht licht, overlay, enz.) met ondoorzichtigheidsregeling te gebruiken.\nOriginele afbeelding: huidige spot mengen met origineel.\nVorige spot: huidige spot mengen met vorige (als er slechts één spot is, is vorige = origineel).\nAchtergrond: huidige spot mengen met een kleur- en luminantie-achtergrond (minder mogelijkheden). +TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Past een mediaanfilter toe vóór de Laplace-transformatie om artefacten (ruis) te voorkomen.\nU kunt ook het gereedschap 'Ruisonderdrukking' gebruiken. +TP_LOCALLAB_EXPOSE;Dynamisch bereik & Belichting +TP_LOCALLAB_EXPOSURE_TOOLTIP;Wijzig belichting in L*a*b-ruimte met behulp van Laplacian PDE-algoritmen op basis van dE en minimaliseer onregelmatigheden. +TP_LOCALLAB_EXPRETITOOLS;Geavanceerde Retinex-gereedschappen +TP_LOCALLAB_EXPSHARP_TOOLTIP;Spot minimaal 39x39.\nGebruik lage overgangswaarden en hoge 'Transitieverval' en 'Bereik'-waarden om kleinere spots te simuleren. +TP_LOCALLAB_EXPTOOL;Belichtingsgereedschappen +TP_LOCALLAB_EXP_TOOLNAME;Dynamisch bereik & Belichting +TP_LOCALLAB_FATAMOUNT;Hoeveelheid +TP_LOCALLAB_FATANCHOR;Anker +TP_LOCALLAB_FATDETAIL;Detail +TP_LOCALLAB_FATFRA;Compressie dynamisch bereik ƒ +TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal – gebruik het Fattal Toonmapping algoritme. +TP_LOCALLAB_FATLEVEL;Sigma +TP_LOCALLAB_FATSAT;Beperk verzadiging +TP_LOCALLAB_FATSHFRA;Masker compressie dynamisch bereik ƒ +TP_LOCALLAB_FEATH_TOOLTIP;Verloopbreedte als percentage van de spotdiagonaal\nWordt gebruikt door alle verloopfilters in alle gereedschappen.\nGeen actie als er geen gradiëntfilter is geactiveerd. +TP_LOCALLAB_FEATVALUE;Veerverzachting +TP_LOCALLAB_FEATVALUE_MASK;Veerverzachting (Verloopfilters-masker) +TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +TP_LOCALLAB_FFTMASK_TOOLTIP;Gebruik een Fourier-transformatie voor betere kwaliteit (langere verwerkingstijd en meer geheugengebruik). +TP_LOCALLAB_FFTW;ƒ - Gebruik Fast Fourier-transformatie +TP_LOCALLAB_FFTWBLUR;ƒ - Gebruik altijd Fast Fourier-transformatie +TP_LOCALLAB_FULLIMAGE;Zwart LW en Wit LW voor volledige afbeelding +TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Berekent de LW-niveaus voor de hele afbeelding. +TP_LOCALLAB_GAM;Gamma +TP_LOCALLAB_GAMC;Gamma +TP_LOCALLAB_GAMCOL_TOOLTIP;Pas een gamma toe op Luminantie L*a*b*-data.\nAls gamma = 3.0 wordt Luminantie 'lineair' gebruikt. +TP_LOCALLAB_GAMC_TOOLTIP;Pas een gamma toe op Luminantie L*a*b*-data voor en na behandeling Piramide 1 en Piramide 2.\nAls gamma = 3.0 wordt Luminantie 'lineair' gebruikt. +TP_LOCALLAB_GAMFRA;Toonresponscurve (TRC) +TP_LOCALLAB_GAMM;Gamma +TP_LOCALLAB_GAMMASKCOL;Gamma +TP_LOCALLAB_GAMMASK_TOOLTIP;Het aanpassen van Gamma en Helling kan zorgen voor een zachte en artefactvrije transformatie van het masker, door 'L' geleidelijk te wijzigen om discontinuïteiten te vermijden. +TP_LOCALLAB_GAMSH;Gamma +TP_LOCALLAB_GAMUTLABRELA;Lab +TP_LOCALLAB_GAMUTMUNSELL;Alleen Munsell +TP_LOCALLAB_GAMUTNON;Geen +TP_LOCALLAB_GAMUTXYZABSO;XYZ absoluut +TP_LOCALLAB_GAMUTXYZRELA;XYZ relatief +TP_LOCALLAB_GAMW;Gamma (wavelet-pyramiden) +TP_LOCALLAB_GRADANG;Verloophoek +TP_LOCALLAB_GRADANG_TOOLTIP;Rotatiehoek in graden: -180, 0, +180. +TP_LOCALLAB_GRADFRA;Masker Verloopfilter +TP_LOCALLAB_GRADGEN_TOOLTIP;Past de sterkte van het luminantieverloop aan. +TP_LOCALLAB_GRADLOGFRA;Verloopfilter - Luminantie +TP_LOCALLAB_GRADSTR;Verloopsterkte +TP_LOCALLAB_GRADSTRAB_TOOLTIP;Past de sterkte van het chromaverloop aan. +TP_LOCALLAB_GRADSTRCHRO;Chroma verloopsterkte +TP_LOCALLAB_GRADSTRHUE;Tint verloopsterkte +TP_LOCALLAB_GRADSTRHUE2;Tint verloopsterkte +TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Past de sterkte van het tintverloop aan. +TP_LOCALLAB_GRADSTRLUM;Luma verloopsterkte +TP_LOCALLAB_GRAINFRA;Filmkorrel 1:1 +TP_LOCALLAB_GRAINFRA2;Grofheid +TP_LOCALLAB_GRAIN_TOOLTIP;Voegt filmachtige korrel toe aan het beeld. +TP_LOCALLAB_GRALWFRA;Verloopfilter (lokaal contrast) +TP_LOCALLAB_GRIDFRAME_TOOLTIP;U kunt dit gereedschap als penseel gebruiken. Gebruik een kleine spot en pas 'Transitiewaarde' en 'Transitieverval' aan.\nAlleen de modus 'Normaal' en mogelijk ook Tint, Verzadiging, Kleur en Helderheid hebben invloed op Achtergrond samenvoegen (ΔE). +TP_LOCALLAB_GRIDMETH_TOOLTIP;Kleurtonen: de luminantie wordt in aanmerking genomen bij het variëren van chroma. Equivalent aan H=f(H) als de 'witte stip' op het raster op nul blijft en alleen de 'zwarte stip' wordt gewijzigd. Equivalent aan 'Kleurtonen' als beide stippen worden gewijzigd.\n\nDirect: werkt rechtstreeks op chroma. +TP_LOCALLAB_GRIDONE;Kleurtoning +TP_LOCALLAB_GRIDTWO;Direct +TP_LOCALLAB_GUIDBL;Verzachtingsstraal +TP_LOCALLAB_GUIDBL_TOOLTIP;Past een Begeleid filter met verstelbare straal toe. Hiermee kunnen onregelmatigheden verminderd worden of het beeld vervaagd. +TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Wijzigt de distributiefunctie van het Begeleid filter. Negatieve waarden simuleren een Gaussiaanse vervaging. +TP_LOCALLAB_GUIDFILTER;Straal Begeleid filter +TP_LOCALLAB_GUIDFILTER_TOOLTIP;Kan onregelmatigheden verminderen of vermeerderen. +TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Intensiteit van het Begeleide filter. +TP_LOCALLAB_HHMASK_TOOLTIP;Fijne tintaanpassingen, bijvoorbeeld voor de huid. +TP_LOCALLAB_HIGHMASKCOL;Hoge lichten +TP_LOCALLAB_HLH;H +TP_LOCALLAB_HUECIE;Tint +TP_LOCALLAB_IND;Onafhankelijk (muis) +TP_LOCALLAB_INDSL;Onafhankelijk (muis + schuiven) +TP_LOCALLAB_INVBL;Inverteer +TP_LOCALLAB_INVBL_TOOLTIP;Alternatief voor de 'Omkeer'-modus: gebruik twee spots.\nEerste spot:\nVolledige afbeelding.\n\nTweede spot: Sluit spot uit. +TP_LOCALLAB_INVERS;Inverteer +TP_LOCALLAB_INVERS_TOOLTIP;Minder mogelijkheden indien (Omkeren) is geselecteerd.\n\nAlternatief: gebruik twee spots\nEerste spot:\nVolledige afbeelding.\n\nTweede spot: Uitgesloten spot.\n\nOmkeren zal dit gereedschap inschakelen voor het gebied buiten de spot, terwijl het gebied binnen de spot onaangetast blijft. +TP_LOCALLAB_INVMASK;Keer algoritme om +TP_LOCALLAB_ISOGR;Distributie (ISO) +TP_LOCALLAB_JAB;Gebruik Zwart LW & Wit LW +TP_LOCALLAB_JABADAP_TOOLTIP;Perceptuele Uniforme aanpassing.\nPast automatisch de relatie tussen Jz en verzadiging aan, rekening houdend met 'Absolute luminantie'. +TP_LOCALLAB_JZ100;Jz-referentie 100cd/m2 +TP_LOCALLAB_JZ100_TOOLTIP;Past automatisch het referentieniveau Jz 100 cd/m2 aan (beeldsignaal).\nWijzigt het verzadigingsniveau en de werking van 'PU-aanpassing' (Perceptuele Uniforme aanpassing). +TP_LOCALLAB_JZADAP;PU-adaptatie +TP_LOCALLAB_JZCH;Chroma +TP_LOCALLAB_JZCHROM;Chroma +TP_LOCALLAB_JZCLARICRES;Voeg samen met chroma Cz +TP_LOCALLAB_JZCLARILRES;Voeg samen Jz +TP_LOCALLAB_JZCONT;Contrast +TP_LOCALLAB_JZFORCE;Forceer max Jz tot 1 +TP_LOCALLAB_JZFORCE_TOOLTIP;Hiermee kan de maximale Jz-waarde naar 1 geforceerd worden voor een betere respons van schuiven en curven. +TP_LOCALLAB_JZFRA;Jz Cz Hz Beeldaanpassingen +TP_LOCALLAB_JZHFRA;Curven Hz +TP_LOCALLAB_JZHJZFRA;Curve Jz(Hz) +TP_LOCALLAB_JZHUECIE;Tintrotatie +TP_LOCALLAB_JZLIGHT;Helderheid +TP_LOCALLAB_JZLOG;Log-codering Jz +TP_LOCALLAB_JZLOGWBS_TOOLTIP;Aanpassingen van Zwart LW en Wit LW kunnen verschillen afhankelijk van of Log-codering of Sigmoid wordt gebruikt.\nVoor Sigmoid kan een verandering (meestal een toename) van Wit LW nodig zijn voor een betere weergave van de hoge lichten, contrast en verzadiging. +TP_LOCALLAB_JZLOGWB_TOOLTIP;Als Auto is ingeschakeld, worden de LW-niveaus en de 'Gemiddelde luminantie Yb%' voor het spotgebied berekend en aangepast. De resulterende waarden worden gebruikt door alle Jz-bewerkingen, inclusief 'Log Encoding Jz'.\nHet berekent ook de absolute luminantie op het moment van opname. +TP_LOCALLAB_JZLOGYBOUT_TOOLTIP;Yb is de relatieve luminantie van de achtergrond, uitgedrukt als een percentage grijs. 18% grijs komt overeen met een achtergrondluminantie van 50% wanneer uitgedrukt in CIE L.\nDe gegevens zijn gebaseerd op de gemiddelde luminantie van het beeld.\nIndien toegepast met Log-codering, wordt de gemiddelde luminantie gebruikt om de hoeveelheid versterking te bepalen die op het signaal moet worden toegepast voor de log-codering. Lagere waarden van gemiddelde luminantie resulteren in grotere versterking. +TP_LOCALLAB_JZMODECAM_TOOLTIP;Jz (alleen in 'Geavanceerde' modus). Alleen operationeel als het uitvoerapparaat (monitor) HDR is (piekluminantie hoger dan 100 cd/m2 - idealiter tussen 4000 en 10000 cd/m2. Zwartpuntluminantie lager dan 0.005 cd/m2). Dit veronderstelt a) dat de ICC-PCS voor het scherm Jzazbz (of XYZ) gebruikt, b) werkt in echte precisie, c) dat de monitor is gekalibreerd (bij voorkeur met een DCI-P3 of Rec-2020 kleurbereik), d) dat het gebruikelijke gamma (sRGB of BT709) wordt vervangen door een Perceptual Quantiser (PQ)-functie. +TP_LOCALLAB_JZPQFRA;Jz herindeling +TP_LOCALLAB_JZPQFRA_TOOLTIP;Hiermee kunt u het Jz-algoritme aanpassen aan een SDR-omgeving of aan de kenmerken (prestaties) van een HDR-omgeving als volgt:\na) voor luminantiewaarden tussen 0 en 100 cd/m2 gedraagt het systeem zich alsof het zich in een SDR-omgeving bevindt.\nb) voor luminantiewaarden tussen 100 en 10000 cd/m2 kunt u het algoritme aanpassen aan de HDR-kenmerken van de afbeelding en de monitor.\n\nAls 'PQ - Piekluminantie' is ingesteld op 10000, gedraagt 'Jz-hermapping' zich op dezelfde manier als het originele Jzazbz-algoritme. +TP_LOCALLAB_JZPQREMAP;PQ - Piekluminantie +TP_LOCALLAB_JZPQREMAP_TOOLTIP;PQ (Perceptual Quantizer) - hiermee kunt u de interne PQ-functie wijzigen (meestal 10000 cd/m2 - standaard 120 cd/m2).\nKan worden gebruikt voor verschillende afbeeldingen, processen en apparaten. +TP_LOCALLAB_JZQTOJ;Relatieve luminantie +TP_LOCALLAB_JZQTOJ_TOOLTIP;Hiermee kunt u 'Relatieve luminantie' in plaats van 'Absolute luminantie' gebruiken - Helderheid wordt Lichtheid.\nDe wijzigingen hebben invloed op: de Helderheidsschuif, de Contrastschuif en de Jz(Jz)-curve. +TP_LOCALLAB_JZSAT;Verzadiging +TP_LOCALLAB_JZSHFRA;Schaduwen/Hoge lichten Jz +TP_LOCALLAB_JZSOFTCIE;Verzachtingsstraal (Begeleid filter) +TP_LOCALLAB_JZSTRSOFTCIE;Kracht Begeleid filter +TP_LOCALLAB_JZTARGET_EV;Bekijk gemiddelde luminantie (Yb%) +TP_LOCALLAB_JZTHRHCIE;Chroma-drempel voor Jz(Hz) +TP_LOCALLAB_JZWAVEXP;Wavelet Jz +TP_LOCALLAB_LABBLURM;Vervagingsmasker +TP_LOCALLAB_LABEL;Selectief bewerken +TP_LOCALLAB_LABGRID;Kleurcorrectierooster +TP_LOCALLAB_LABGRIDMERG;Achtergrond +TP_LOCALLAB_LABGRID_VALUES;Hoog(a)=%1 Hoog(b)=%2\nLaag(a)=%3 Laag(b)=%4 +TP_LOCALLAB_LABSTRUM;Structuurmasker +TP_LOCALLAB_LAPLACC;ΔØ Masker Laplacian lost PDE op +TP_LOCALLAB_LAPLACE;Laplacian-drempel ΔE +TP_LOCALLAB_LAPLACEXP;Laplacian-drempel +TP_LOCALLAB_LAPMASKCOL;Laplacian-drempel +TP_LOCALLAB_LAPRAD1_TOOLTIP;Verhoogt het contrast van het masker door de luminantiewaarden van de lichtere gebieden te verhogen. Kan worden gebruikt in combinatie met de L(L)- en LC(H)-curves. +TP_LOCALLAB_LAPRAD2_TOOLTIP;De verzachtingsstraal gebruikt een Begeleid filter om onregelmatigheden te verminderen en de overgang te verzachten. +TP_LOCALLAB_LAPRAD_TOOLTIP;De verzachtingsstraal gebruikt een Begeleid filter om onregelmatigheden te verminderen en de overgang te verzachten. +TP_LOCALLAB_LAP_MASK_TOOLTIP;Lost PDE's op voor alle Laplacian-maskers.\nIndien ingeschakeld, vermindert het Laplacian-drempelmasker onregelmatigheden en verzacht het resultaat.\nIndien uitgeschakeld is de respons lineair. +TP_LOCALLAB_LCLABELS;Residuele ruisniveaus +TP_LOCALLAB_LCLABELS_TOOLTIP;Geeft de gemiddelde en high-end ruiswaarden weer voor het gebied dat wordt weergegeven in het Voorbeeldpaneel (bij 100% zoom). De ruiswaarden zijn gegroepeerd op wavelet-niveaus 0,1,2,3 en 4,5,6.\nDe weergegeven waarden zijn alleen indicatief en zijn bedoeld om te helpen bij het aanpassen van ruisonderdrukking. Ze mogen niet worden geïnterpreteerd als absolute ruisniveaus.\n\n300: Veel ruis\n100-300: Ruis\n50-100: Matige ruis\n< 50: Weinig ruis\n\nZe tonen het volgende:\n*De impact van Ruisonderdrukking in het hoofdmenu Detail-tabblad.\n*De invloed van Non-local Means, Wavelets en DCT op de luminantieruis.\n*De invloed van Wavelets en DCT op de chroma-ruis.\n*De invloed van Opnameverscherping en Demozaïeken. +TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT verbetert de kwaliteit en maakt het gebruik van grote stralen (radius) mogelijk, maar verhoogt de verwerkingstijd (afhankelijk van het te verwerken gebied). Bij voorkeur alleen gebruiken voor grote stralen. De grootte van het gebied kan met enkele pixels worden verminderd om de FFTW te optimaliseren. Dit kan de verwerkingstijd met een factor 1,5 tot 10 verminderen. +TP_LOCALLAB_LC_TOOLNAME;Lokaal Contrast & Wavelets +TP_LOCALLAB_LEVELBLUR;Maximum vervagingsniveaus +TP_LOCALLAB_LEVELWAV;Wavelet-niveaus +TP_LOCALLAB_LEVELWAV_TOOLTIP;Het niveau wordt automatisch aangepast aan de grootte van de spot en het voorbeeld.\nVan niveau 9 grootte max 512 tot niveau 1 grootte max = 4. +TP_LOCALLAB_LEVFRA;Niveaus +TP_LOCALLAB_LIGHTNESS;Lichtheid +TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse modus: selectie = -100 dwingt luminantie naar nul. +TP_LOCALLAB_LIGHTRETI;Lichtheid +TP_LOCALLAB_LINEAR;Lineariteit +TP_LOCALLAB_LIST_NAME;Voeg gereedschap toe aan huidige spot... +TP_LOCALLAB_LIST_TOOLTIP;U kunt drie complexiteitsniveaus selecteren voor elk gereedschap: Basis, Standaard en Geavanceerd.\nDe standaardinstelling voor alle hulpmiddelen is Basis, maar dit kan worden gewijzigd in het venster Voorkeuren.\nU kunt ook het complexiteitsniveau per gereedschap wijzigen tijdens het bewerken. +TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Hiermee kunt u het effect op specifieke detailniveaus in het masker verminderen of vergroten door op bepaalde luminantiezones te werken (over het algemeen de lichtste). +TP_LOCALLAB_LMASK_LL_TOOLTIP;Hiermee past u het contrast van het masker vrijelijk aan.\nHeeft een vergelijkbare functie als de Gamma- en Hellingschuiven.\nHiermee kunnen bepaalde delen van het beeld worden bewerkt (meestal de lichtste delen van het masker door de curve te gebruiken om de donkere delen uit te sluiten). Kan onregelmatigheden creëren. +TP_LOCALLAB_LOCCONT;Onscherptemasker +TP_LOCALLAB_LOC_CONTRAST;Lokaal Contrast & Wavelets +TP_LOCALLAB_LOC_CONTRASTPYR;Pyramide 1: +TP_LOCALLAB_LOC_CONTRASTPYR2;Pyramide 2: +TP_LOCALLAB_LOC_CONTRASTPYR2LAB;Contrast per niveau/TM/Directioneel contrast +TP_LOCALLAB_LOC_CONTRASTPYRLAB;Verloopfilter/Randscherpte/Vervaging +TP_LOCALLAB_LOC_RESIDPYR;Residueel beeld (Main) +TP_LOCALLAB_LOG;Log-codering +TP_LOCALLAB_LOG1FRA;CAM16 Beeldaanpassingen +TP_LOCALLAB_LOG2FRA;Weergave-omstandigheden +TP_LOCALLAB_LOGAUTO;Automatisch +TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;Berekent automatisch de 'Gemiddelde luminantie' voor de opnameomstandigheden. +TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;Berekent automatisch de 'Gemiddelde luminantie' voor de opnameomstandigheden wanneer de Auto-knop in Relatieve belichtingsniveaus is ingedrukt. +TP_LOCALLAB_LOGAUTO_TOOLTIP;Door op deze knop te drukken, worden het dynamisch bereik en de 'Gemiddelde luminantie' voor de opnameomstandigheden berekend als de optie 'Auto gemiddelde luminantie (Yb%)' is aangevinkt).\nBerekent ook de absolute luminantie op het moment van opname.\nDruk nogmaals op de knop om de automatisch berekende waarden aan te passen. +TP_LOCALLAB_LOGBASE_TOOLTIP;Standaard = 2.\nWaarden kleiner dan 2 verminderen de werking van het algoritme, waardoor de schaduwen donkerder en de hoge lichten helderder worden.\nMet waarden groter dan 2 worden de schaduwen grijzer en worden de hoge lichten meer uitgebleekt. +TP_LOCALLAB_LOGCATAD_TOOLTIP;Met Chromatische aanpassing wordt een kleur geïnterpreteerd volgens zijn ruimtelijk-tijdelijke omgeving.\nHandig wanneer de witbalans aanzienlijk afwijkt van de D50-referentie.\nPast kleuren aan de lichtbron van het uitvoerapparaat aan. +TP_LOCALLAB_LOGCIE;Log-codering ipv. Sigmoid +TP_LOCALLAB_LOGCIEQ;Log-codering Q (met Ciecam) +TP_LOCALLAB_LOGCIEQ_TOOLTIP;Door het selectievakje aan te vinken kunt u schakelen tussen log-codering op basis van de drie RGB-kanalen en log-codering die uitsluitend is gebaseerd op het helderheidskanaal (Q) van Ciecam.\nHet gebruik van het Q-kanaal in plaats van de RGB-kanalen helpt ongewenste randeffecten zoals tint- en verzadigingsverschuivingen te vermijden.\nDe instellingen zijn echter moeilijker te optimaliseren omdat Q onbegrensd is en Ciecam de gegevens wijzigt om rekening te houden met de omgevingsomstandigheden, gelijktijdig contrast, enz.\nU moet mogelijk het volgende aanpassen:\nOpnameomstandigheden: Gemiddelde luminantie (Yb), wit- en zwartdistributie, Zwart LW, Wit LW.\n Bronaanpassingen: Helderheidscompressie, Sterkte.\n\nOpmerking: als u log-codering (Q) gebruikt, wees dan voorzichtig om de optie 'Ciecam uitschakelen' niet te activeren onder Opnameomstandigheden, menu Weergave-omstandigheden. +TP_LOCALLAB_LOGCIE_TOOLTIP;Hiermee kunt u Zwart LW, Wit LW, Wit- en zwartdistributie, Gemiddelde luminantie opname-omstandigheden en Gemiddelde luminantie weergave-omstandigheden (Yb%) gebruiken voor toonmappen met behulp van 'Log-codering' met Helderheidscompressie. +TP_LOCALLAB_LOGCOLORFL;Kleurrijkheid (M) +TP_LOCALLAB_LOGCOLORF_TOOLTIP;Waargenomen hoeveelheid tint in verhouding tot grijs.\nIndicator dat een stimulus meer of minder gekleurd lijkt. +TP_LOCALLAB_LOGCONQL;Contrast (Q) +TP_LOCALLAB_LOGCONTHRES;Contrastdrempel (J & Q) +TP_LOCALLAB_LOGCONTL;Contrast (J) +TP_LOCALLAB_LOGCONTL_TOOLTIP;Contrast (J) in CIECAM16 houdt rekening met de toename in waargenomen kleuring bij luminantie. +TP_LOCALLAB_LOGCONTQ_TOOLTIP;Contrast (Q) in CIECAM16 houdt rekening met de toename in waargenomen kleuring bij helderheid. +TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;Past het contrastbereik van de middentonen aan (J & Q).\nPositieve waarden verminderen geleidelijk het effect van de Contrastschuiven (J & Q). Negatieve waarden verhogen geleidelijk het effect van de Contrastschuiven. +TP_LOCALLAB_LOGDETAIL_TOOLTIP;Werkt voornamelijk op hoge frequenties. +TP_LOCALLAB_LOGENCOD_TOOLTIP;Toonmappen met Logaritmische codering (ACES).\nNuttig voor onderbelichte afbeeldingen of afbeeldingen met een hoog dynamisch bereik.\n\nTweestaps-proces: 1) Berekening van Dynamisch Bereik 2) Handmatige aanpassing. +TP_LOCALLAB_LOGEXP;Alle gereedschappen +TP_LOCALLAB_LOGFRA;Opname-omstandigheden +TP_LOCALLAB_LOGFRAME_TOOLTIP;Hiermee kunt u de LW-niveaus en de 'Gemiddelde luminantie Yb%' (grijspunt bron) voor het spotgebied berekenen en aanpassen. De resulterende waarden zullen worden gebruikt door alle Lab-bewerkingen en de meeste RGB-bewerkingen in de pijplijn.\nBerekent ook de absolute luminantie op het moment van opname. +TP_LOCALLAB_LOGIMAGE_TOOLTIP;Houdt rekening met de overeenkomstige Ciecam-variabelen: Contrast (J) en Verzadiging (s), evenals Contrast (Q), Helderheid (Q), Lichtheid (J) en Kleurrijkheid (M) (in Geavanceerde modus). +TP_LOCALLAB_LOGLIGHTL;Lichtheid (J) +TP_LOCALLAB_LOGLIGHTL_TOOLTIP;Dicht bij lichtheid (L*a*b*). Houdt rekening met de toename in waargenomen kleuring. +TP_LOCALLAB_LOGLIGHTQ;Helderheid (Q) +TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;Waargenomen hoeveelheid licht die uit een stimulus komt.\nIndicator dat een stimulus meer of minder licht, helder lijkt. +TP_LOCALLAB_LOGLIN;Logaritmische modus +TP_LOCALLAB_LOGPFRA;Relatieve Belichtingsniveaus +TP_LOCALLAB_LOGPFRA2;log-codering - instellingen +TP_LOCALLAB_LOGREPART;Overall kracht +TP_LOCALLAB_LOGREPART_TOOLTIP;Hiermee kunt u de relatieve sterkte van de log-gecodeerde afbeelding aanpassen ten opzichte van de originele afbeelding.\nHeeft geen invloed op de Ciecam-component. +TP_LOCALLAB_LOGSATURL_TOOLTIP;Verzadiging (s) in CIECAM16 komt overeen met de kleur van een stimulus in verhouding tot zijn eigen helderheid.\nWerkt voornamelijk op middentonen en op de hoge lichten. +TP_LOCALLAB_LOGSCENE_TOOLTIP;Komt overeen met de opnameomstandigheden. +TP_LOCALLAB_LOGSURSOUR_TOOLTIP;Verandert tinten en kleuren op basis van de opname-omstandigheden.\n\nGemiddeld: Gemiddelde lichtomstandigheden (standaard). Het beeld zal niet veranderen.\n\nGedimd: Gedimde omstandigheden. Het beeld zal iets helderder worden.\n\nDonker: Donkere omstandigheden. Het beeld zal helderder worden. +TP_LOCALLAB_LOGVIEWING_TOOLTIP;Komt overeen met het medium waarop de uiteindelijke afbeelding zal worden bekeken (monitor, TV, projector, printer, enz.), evenals de omgevingsomstandigheden. +TP_LOCALLAB_LOG_TOOLNAME;Log-codering +TP_LOCALLAB_LUM;LL - CC +TP_LOCALLAB_LUM46LABEL;Luma-niveaus 456: Gemiddeld=%1 Hoog=%2 +TP_LOCALLAB_LUMADARKEST;Donkerst +TP_LOCALLAB_LUMASK;Achtergrondkleur/luma-masker +TP_LOCALLAB_LUMASK_TOOLTIP;Past de grijstint of kleur van de achtergrond van het masker aan in Toon Masker (Masker en Modificaties). +TP_LOCALLAB_LUMAWHITESEST;Lichtst +TP_LOCALLAB_LUMFRA;L*a*b* standaard +TP_LOCALLAB_LUMLABEL;Luma-niveaus 0123: Gemiddeld=%1 Hoog=%2 +TP_LOCALLAB_MASFRAME;Masker en Combineer +TP_LOCALLAB_MASFRAME_TOOLTIP;Voor alle maskers.\nHoudt rekening met de ΔE-afbeelding om te voorkomen dat het selectiegebied wordt gewijzigd wanneer de volgende maskergereedschappen worden gebruikt: Gamma, Helling, Chroma, Contrastcurve, Lokaal contrast (op wavelet-niveau), Vervagingsmasker en Structuurmasker (indien ingeschakeld).\nUitgeschakeld als de Inverteermodus wordt gebruikt. +TP_LOCALLAB_MASK;Curven +TP_LOCALLAB_MASK2;Contrastcurve +TP_LOCALLAB_MASKCOM;Gemeenschappelijk Kleurmasker +TP_LOCALLAB_MASKCOM_TOOLNAME;Gemeenschappelijk kleurmasker +TP_LOCALLAB_MASKCOM_TOOLTIP;Een gereedschap op zichzelf.\nKan worden gebruikt om het uiterlijk van de afbeelding aan te passen (chrominantie, luminantie, contrast) en de textuur als een functie van Bereik. +TP_LOCALLAB_MASKCURVE_TOOLTIP;De 3 curven staan standaard op 1 (maximum):\nC=f(C) de chroma varieert afhankelijk van de chrominantie. U kunt de chroma verlagen om de selectie te verbeteren. Door deze curve dichtbij nul in te stellen (met een lage waarde van C om de curve te activeren) kunt u de achtergrond desatureren in Inverteermodus.\nL=f(L) de luminantie varieert afhankelijk van de luminantie, dus u kunt de helderheid verminderen om de selectie te verbeteren.\nL en C = f(H) luminantie en chroma variëren met tint, dus u kunt de luminantie en chroma verlagen om de selectie te verbeteren. +TP_LOCALLAB_MASKDDECAY;Vervalsterkte +TP_LOCALLAB_MASKDECAY_TOOLTIP;Beheert de vervalsnelheid voor de grijswaarden in het masker.\nVerval = 1 lineair, Verval > 1 scherpere parabolische overgangen, Verval < 1 geleidelijkere overgangen. +TP_LOCALLAB_MASKDEINV_TOOLTIP;Keert de manier om waarop het algoritme het masker interpreteert.\nIndien aangevinkt, zullen zwarte en zeer lichte gebieden worden verminderd. +TP_LOCALLAB_MASKDE_TOOLTIP;Wordt gebruikt voor ruisvermindering als een functie van de luminantie-informatie van de afbeelding die is opgenomen in de L(L)- of LC(H)-maskers (Masker en Modificaties).\nHet L(L)-masker of het LC(H)-masker moet zijn ingeschakeld om deze functie te gebruiken.\nAls het masker onder de 'donkere' drempel ligt, zal de ruisvermindering progressief worden toegepast.\nAls het masker boven de 'lichte' drempel ligt, zal de ruisvermindering progressief worden toegepast.\nTussen de twee zullen de afbeeldingsinstellingen zonder de ruisvermindering worden behouden, tenzij u de schuiven 'Grijsgebied luminantie ruisvermindering' of 'Grijsgebied chrominantie ruisvermindering' aanpast. +TP_LOCALLAB_MASKGF_TOOLTIP;Hier wordt het Begeleid Filter gebruikt als een functie van de luminantie-informatie van de afbeelding die is opgenomen in de L(L)- of LC(H)-maskers (Masker en Modificaties).\nHet L(L)-masker of het LC(H)-masker moet zijn ingeschakeld om deze functie te gebruiken.\nAls het masker onder de 'donkere' drempel ligt, zal het Begeleid Filter progressief worden toegepast.\nAls het masker boven de 'lichte' drempel ligt, zal het Begeleid Filter progressief worden toegepast.\nTussen de twee zullen de afbeeldingsinstellingen zonder het Begeleid Filter worden behouden. +TP_LOCALLAB_MASKH;Tintcurve +TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP;Lichtere-tint limiet waarboven CBDL-parameters (alleen Luminantie) geleidelijk zullen worden hersteld naar hun oorspronkelijke waarden voordat ze door de CBDL-instellingen werden gewijzigd.\nU kunt sommige gereedschappen in 'Masker en Modificaties' gebruiken om de grijstinten te veranderen: 'Verzachtingsstraal', Gamma en Helling, 'Contrastcurve'.\nGebruik een 'vergrendelbaar kleurpipet' op het masker om te zien welke gebieden zullen worden beïnvloed. Zorg ervoor dat u 'Achtergrond kleurmasker' = 0 instelt in Instellingen. +TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;Lichtere-tint limiet waarboven de parameters geleidelijk zullen worden hersteld naar hun oorspronkelijke waarden voordat ze door de Kleur en Licht-instellingen werden gewijzigd.\nU kunt sommige gereedschappen in 'Masker en Modificaties' gebruiken om de grijstinten te veranderen: 'Structuurmasker', 'Vervagingsmasker', 'Verzachtingsstraal', 'Gamma en Helling', 'Contrast curve' en 'Lokaal contrast' (wavelets).\nGebruik een 'vergrendelbaar kleurpipet' op het masker om te zien welke gebieden zullen worden beïnvloed. Zorg ervoor dat u 'Achtergrond kleurmasker' = 0 instelt in Instellingen. +TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP; De ruisvermindering wordt geleidelijk verminderd van 100% bij de drempelinstelling tot 0% bij de maximale witte waarde (zoals bepaald door het masker).\nU kunt sommige gereedschappen in 'Masker en Modificaties' gebruiken om de grijstinten te veranderen: 'Structuurmasker', 'Verzachtingsstraal', 'Gamma en Helling', 'Contrastcurve', 'Lokaal contrast' (wavelets).\nGebruik een vergrendelbaar kleurpipet' op het masker om te zien welke gebieden zullen worden beïnvloed. Zorg ervoor dat u 'Achtergrond kleurmasker' = 0 instelt in Instellingen. +TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP;Lichtere-tint limiet waarboven de parameters geleidelijk zullen worden hersteld naar hun oorspronkelijke waarden voordat ze door de 'Dynamisch bereik en Belichting'-instellingen werden gewijzigd.\nU kunt bepaalde hulpmiddelen in 'Masker en Modificaties' gebruiken om de grijstinten te veranderen: 'Verzachtingsstraal', Gamma en Helling, 'Contrastcurve'.\nGebruik een 'vergrendelbaar kleurpipet' op het masker om te zien welke gebieden zullen worden beïnvloed. Zorg ervoor dat u 'Achtergrond kleurmasker' = 0 instelt in Instellingen. +TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP;Lichtere-tint limiet waarboven de parameters geleidelijk zullen worden hersteld naar hun oorspronkelijke waarden voordat ze door de Log-coderingsinstellingen werden gewijzigd.\nU kunt bepaalde hulpmiddelen in 'Masker en Modificaties' gebruiken om de grijstinten te veranderen: 'Verzachtingsstraal', 'Contrastcurve'.\nGebruik een 'vergrendelbaar kleurpipet' op het masker om te zien welke gebieden zullen worden beïnvloed. Zorg ervoor dat u 'Achtergrond kleurmasker' = 0 instelt in Instellingen. +TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP;Lichtere-tint limiet waarboven Retinex-parameters (alleen Luminantie) geleidelijk zullen worden hersteld naar hun oorspronkelijke waarden voordat ze door de Retinex-instellingen werden gewijzigd.\nU kunt bepaalde hulpmiddelen in 'Masker en Modificaties' gebruiken om de grijstinten te veranderen: 'Verzachtingsstraal', Gamma en Helling, 'Contrastcurve'.\nGebruik een 'vergrendelbaar kleurpipet' op het masker om te zien welke gebieden zullen worden beïnvloed. Zorg ervoor dat u 'Achtergrond kleurmasker' = 0 instelt in Instellingen. +TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP;Lichtere-tint limiet waarboven de parameters geleidelijk zullen worden hersteld naar hun oorspronkelijke waarden voordat ze door de instellingen in Schaduwen/Hoge lichten werden gewijzigd.\nU kunt bepaalde hulpmiddelen in 'Masker en Modificaties' gebruiken om de grijstinten te veranderen: 'Verzachtingsstraal', Gamma en Helling, 'Contrastcurve'.\nGebruik een 'vergrendelbaar kleurpipet' op het masker om te zien welke gebieden zullen worden beïnvloed. Zorg ervoor dat u 'Achtergrond kleurmasker' = 0 instelt in Instellingen. +TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP;Lichtere-tint limiet waarboven de parameters geleidelijk zullen worden hersteld naar hun oorspronkelijke waarden voordat ze door de Toonmap-instellingen werden gewijzigd.\nU kunt bepaalde hulpmiddelen in 'Masker en Modificaties' gebruiken om de grijstinten te veranderen: 'Verzachtingsstraal', Gamma en Helling, 'Contrastcurve'.\nGebruik een 'vergrendelbaar kleurpipet' op het masker om te zien welke gebieden zullen worden beïnvloed. Zorg ervoor dat u 'Achtergrond kleurmasker' = 0 instelt in Instellingen. +TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP;Lichtere-tint limiet waarboven de parameters geleidelijk zullen worden hersteld naar hun oorspronkelijke waarden voordat ze door de Levendigheid en Warm/Koel-instellingen werden gewijzigd.\nU kunt bepaalde hulpmiddelen in 'Masker en Modificaties' gebruiken om de grijstinten te veranderen: 'Verzachtingsstraal', Gamma en Helling, 'Contrastcurve'.\nGebruik een 'vergrendelbaar kleurpipet' op het masker om te zien welke gebieden zullen worden beïnvloed. Zorg ervoor dat u 'Achtergrond kleurmasker' = 0 instelt in Instellingen. +TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP;Lichtere-tint limiet waarboven de parameters geleidelijk zullen worden hersteld naar hun oorspronkelijke waarden voordat ze door de Lokaal contrast en Wavelet-instellingen werden gewijzigd.\nU kunt sommige gereedschappen in 'Masker en Modificaties' gebruiken om de grijstinten te veranderen: 'Verzachtingsstraal', Gamma en Helling, 'Contrastcurve'.\nGebruik een 'vergrendelbaar kleurpipet' op het masker om te zien welke gebieden zullen worden beïnvloed. Zorg ervoor dat u 'Achtergrond kleurmasker' = 0 instelt in Instellingen. +TP_LOCALLAB_MASKHIGTHRES_TOOLTIP;Het Begeleid filter wordt geleidelijk verminderd van 100% bij de drempelinstelling tot 0% bij de maximale witte waarde (zoals bepaald door het masker).\nU kunt sommige gereedschappen in 'Masker en Modificaties' gebruiken om de grijstinten te veranderen: 'Structuurmasker', 'Verzachtingsstraal', 'Gamma en Helling', 'Contrastcurve', 'Lokaal contrast wavelet'.\nGebruik een 'vergrendelbaar kleurpipet' op het masker om te zien welke gebieden zullen worden beïnvloed. Zorg ervoor dat u 'Achtergrond kleurmasker' = 0 instelt in Instellingen. +TP_LOCALLAB_MASKLCTHR;Lichte gebieden luminantiedrempel +TP_LOCALLAB_MASKLCTHR2;Lichte gebieden luma-drempel +TP_LOCALLAB_MASKLCTHRLOW;Donkere gebieden luminantiedrempel +TP_LOCALLAB_MASKLCTHRLOW2;Donkere gebieden luma-drempel +TP_LOCALLAB_MASKLCTHRMID;Grijze gebieden luma-ruisvermindering +TP_LOCALLAB_MASKLCTHRMIDCH;Grijze gebieden chroma-ruisvermindering +TP_LOCALLAB_MASKLC_TOOLTIP;Gebruikt door wavelet-luminantie. \nHiermee kunt u de ruisonderdrukking afstemmen op basis van de luminantie-informatie van de afbeelding in het L(L)- of LC(H)-masker (Masker en Modificaties).\nHet L(L)-masker of het LC(H)-masker moet worden ingeschakeld om deze functie te gebruiken.\n'Donkere gebieden luminantiedrempel'. Als 'Versterk ruisonderdrukking in donkere en lichte gebieden' > 1, dan wordt de ruisonderdrukking geleidelijk verhoogd van 0% bij de drempelinstelling tot 100% bij de maximale zwarte waarde (bepaald door het masker).\n'Lichte gebieden luminantiedrempel'. De ruisonderdrukking wordt geleidelijk verminderd van 100% bij de drempelinstelling tot 0% bij de maximale witte waarde (bepaald door het masker).\nIn het gebied tussen de twee drempels worden de ruisonderdrukkingsinstellingen niet beïnvloed door het masker. +TP_LOCALLAB_MASKLNOISELOW;Versterk donkere/lichte gebieden +TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP;Donkere-tint limiet waaronder de CBDL-parameters (alleen Luminantie) geleidelijk zullen worden hersteld naar hun oorspronkelijke waarden voordat ze door de CBDL-instellingen werden gewijzigd.\nU kunt sommige gereedschappen in 'Masker en Modificaties' gebruiken om de grijstinten te veranderen: 'Verzachtingsstraal', Gamma en Helling, 'Contrastcurve'.\nGebruik een 'vergrendelbaar kleurpipet' op het masker om te zien welke gebieden zullen worden beïnvloed. Zorg ervoor dat u 'Achtergrond kleurmasker' = 0 instelt in Instellingen. +TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP;Donkere-tint limiet waaronder de parameters geleidelijk zullen worden hersteld naar hun oorspronkelijke waarden voordat ze door de Kleur en Licht-instellingen werden gewijzigd.\nU kunt sommige gereedschappen in 'Masker en Modificaties' gebruiken om de grijstinten te veranderen: 'Structuurmasker', 'Vervagingsmasker', 'Verzachtingsstraal', Gamma en Helling, 'Contrastcurve', 'Lokaal contrast' (wavelets).\nGebruik een 'vergrendelbaar kleurpipet' op het masker om te zien welke gebieden zullen worden beïnvloed. Zorg ervoor dat u 'Achtergrond kleurmasker' = 0 instelt in Instellingen. +TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;De ruisonderdrukking wordt geleidelijk verhoogd van 0% bij de drempelinstelling tot 100% bij de maximale zwarte waarde (zoals bepaald door het masker).\nU kunt bepaalde gereedschappen in Masker en Modificaties gebruiken om de grijstinten te veranderen: 'Structuurmasker', 'Verzachtingsstraal', Gamma en Helling, 'Contrastcurve', 'Lokaal contrast' (wavelets).\nGebruik een 'vergrendelbaar kleurpipet' op het masker om te zien welke gebieden zullen worden beïnvloed. Zorg ervoor dat u 'Achtergrond kleurmasker' = 0 instelt in Instellingen. +TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP;Donkere-tint limiet waaronder de parameters geleidelijk zullen worden hersteld naar hun oorspronkelijke waarden voordat ze door de 'Dynamisch bereik en Belichting'-instellingen werden gewijzigd.\nU kunt sommige gereedschappen in 'Masker en Modificaties' gebruiken om de grijstinten te veranderen: 'Verzachtingsstraal', Gamma en Helling, 'Contrastcurve'.\nGebruik een 'vergrendelbaar kleurpipet' op het masker om te zien welke gebieden zullen worden beïnvloed. Zorg ervoor dat u 'Achtergrond kleurmasker' = 0 instelt in Instellingen. +TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP;Donkere-tint limiet waaronder de parameters geleidelijk zullen worden hersteld naar hun oorspronkelijke waarden voordat ze door de Log-coderingsinstellingen werden gewijzigd.\nU kunt sommige gereedschappen in 'Masker en Modificaties' gebruiken om de grijstinten te veranderen: 'Verzachtingsstraal', 'Contrastcurve'.\nGebruik een 'vergrendelbaar kleurpipet' op het masker om te zien welke gebieden zullen worden beïnvloed. Zorg ervoor dat u 'Achtergrond kleurmasker' = 0 instelt in Instellingen. +TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP;Donkere-tint limiet waaronder de Retinex-parameters (alleen Luminantie) geleidelijk zullen worden hersteld naar hun oorspronkelijke waarden voordat ze door de Retinex-instellingen werden gewijzigd.\nU kunt sommige gereedschappen in 'Masker en Modificaties' gebruiken om de grijstinten te veranderen: 'Verzachtingsstraal', Gamma en Helling, 'Contrastcurve'.\nGebruik een 'vergrendelbaar kleurpipet' op het masker om te zien welke gebieden zullen worden beïnvloed. Zorg ervoor dat u 'Achtergrond kleurmasker' = 0 instelt in Instellingen. +TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;Donkere-tint limiet waaronder de parameters geleidelijk zullen worden hersteld naar hun oorspronkelijke waarden voordat ze door de instellingen in Schaduwen/Hoge lichten werden gewijzigd.\nU kunt sommige gereedschappen in 'Masker en Modificaties' gebruiken om de grijstinten te veranderen: 'Verzachtingsstraal', Gamma en Helling, 'Contrastcurve'.\nGebruik een 'vergrendelbaar kleurpipet' op het masker om te zien welke gebieden zullen worden beïnvloed. Zorg ervoor dat u 'Achtergrond kleurmasker' = 0 instelt in Instellingen. +TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP;Donkere-tint limiet waaronder de parameters geleidelijk zullen worden hersteld naar hun oorspronkelijke waarden voordat ze door de Toonmap-instellingen werden gewijzigd.\nU kunt sommige gereedschappen in 'Masker en Modificaties' gebruiken om de grijstinten te veranderen: 'Verzachtingsstraal', Gamma en Helling, 'Contrastcurve'.\nGebruik een 'vergrendelbaar kleurpipet' op het masker om te zien welke gebieden zullen worden beïnvloed. Zorg ervoor dat u 'Achtergrond kleurmasker' = 0 instelt in Instellingen. +TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;Donkere-tint limiet waaronder de parameters geleidelijk zullen worden hersteld naar hun oorspronkelijke waarden voordat ze door de instellingen in Levendigheid en Warm/koel werden gewijzigd.\nU kunt sommige gereedschappen in 'Masker en Modificaties' gebruiken om de grijstinten te veranderen: 'Verzachtingsstraal', Gamma en Helling, 'Contrastcurve'.\nGebruik een 'vergrendelbaar kleurpipet' op het masker om te zien welke gebieden zullen worden beïnvloed. Zorg ervoor dat u 'Achtergrond kleurmasker' = 0 instelt in Instellingen. +TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;Donkere-tint limiet waaronder de parameters geleidelijk zullen worden hersteld naar hun oorspronkelijke waarden voordat ze door de Lokaal contrast en Wavelet-instellingen werden gewijzigd.\nU kunt sommige gereedschappen in 'Masker en Modificaties' gebruiken om de grijstinten te veranderen: 'Verzachtingsstraal', Gamma en Helling, 'Contrastcurve'.\nGebruik een 'vergrendelbaar kleurpipet' op het masker om te zien welke gebieden zullen worden beïnvloed. Zorg ervoor dat u 'Achtergrond kleurmasker' = 0 instelt in Instellingen. +TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;Het Begeleid Filter wordt geleidelijk verhoogd van 0% bij de drempelinstelling tot 100% bij de maximale zwarte waarde (zoals bepaald door het masker).\nU kunt sommige gereedschappen in 'Masker en Modificaties' gebruiken om de grijstinten te veranderen: 'Structuurmasker', 'Verzachtingsstraal', Gamma en Helling, 'Contrastcurve', 'Lokaal contrast' (wavelets).\nGebruik een 'vergrendelbaar kleurpipet' op het masker om te zien welke gebieden zullen worden beïnvloed. Zorg ervoor dat u 'Achtergrond kleurmasker' = 0 instelt in Instellingen. +TP_LOCALLAB_MASKRECOL_TOOLTIP;Gebruikt om het effect van de Kleur en Licht-instellingen te moduleren op basis van de luminantie-informatie van de afbeelding in de L(L)- of LC(H)-maskers (Masker en Modificaties).\nHet L(L)-masker of het LC(H)-masker moet worden ingeschakeld om deze functie te gebruiken.\nDe 'donkere' en 'lichte' gebieden onder de donkere drempel en boven de lichte drempel zullen geleidelijk worden hersteld naar hun oorspronkelijke waarden voordat ze door de Kleur en Licht-instellingen werden gewijzigd.\nTussen deze twee gebieden in, zal de volledige waarde van de Kleur en Licht-instellingen worden toegepast. +TP_LOCALLAB_MASKRECOTHRES;Hersteldrempel +TP_LOCALLAB_MASKREEXP_TOOLTIP;Gebruikt om het effect van de 'Dynamisch bereik en Belichting'-instellingen te moduleren op basis van de luminantie-informatie van de afbeelding in de L(L)- of LC(H)-maskers (Masker en Modificaties).\nHet L(L)-masker of het LC(H)-masker moet worden ingeschakeld om deze functie te gebruiken.\nDe 'donkere' en 'lichte' gebieden onder de donkere drempel en boven de lichte drempel zullen geleidelijk worden hersteld naar hun oorspronkelijke waarden voordat ze door de 'Dynamisch bereik en Belichting'-instellingen werden gewijzigd.\nTussen deze twee gebieden in, zal de volledige waarde van de 'Dynamisch bereik en Belichting'-instellingen worden toegepast. +TP_LOCALLAB_MASKRELOG_TOOLTIP;Wordt gebruikt om het effect van de Log-coderingsinstellingen te moduleren op basis van de luminantie-informatie van de afbeelding in de L(L)- of LC(H)-maskers (Masker en Modificaties).\nHet L(L)-masker of het LC(H)-masker moet worden ingeschakeld om deze functie te gebruiken.\nDe 'donkere' en 'lichte' gebieden onder de donkere drempel en boven de lichte drempel zullen geleidelijk worden hersteld naar hun oorspronkelijke waarden voordat ze door de Log-coderingsinstellingen werden gewijzigd - kan worden gebruikt om de hoge lichten die door Kleurherstel zijn gereconstrueerd te herstellen.\nTussen deze twee gebieden zal de volledige waarde van de Log-coderingsinstellingen worden toegepast. +TP_LOCALLAB_MASKRESCB_TOOLTIP;Wordt gebruikt om het effect van de CBDL-instellingen (alleen luminantie) te moduleren op basis van de luminantie-informatie van de afbeelding in de L(L)- of LC(H)-maskers (Masker en Modificaties).\nHet L(L)-masker of het LC(H)-masker moet worden ingeschakeld om deze functie te gebruiken.\nDe 'donkere' en 'lichte' gebieden onder de donkere drempel en boven de lichte drempel zullen geleidelijk worden hersteld naar hun oorspronkelijke waarden voordat ze door de CBDL-instellingen werden gewijzigd.\nTussen deze twee gebieden zal de volledige waarde van de CBDL-instellingen worden toegepast. +TP_LOCALLAB_MASKRESH_TOOLTIP;Wordt gebruikt om het effect van de instellingen in Schaduwen/Hoge lichten te moduleren op basis van de luminantie-informatie van de afbeelding in de L(L)- of LC(H)-maskers (Masker en Modificaties).\nHet L(L)-masker of het LC(H)-masker moet worden ingeschakeld om deze functie te gebruiken.\nDe 'donkere' en 'lichte' gebieden onder de donkere drempel en boven de lichte drempel zullen geleidelijk worden hersteld naar hun oorspronkelijke waarden voordat ze door de Schaduwen/Hoge lichten-instellingen werden gewijzigd.\nTussen deze twee gebieden zal de volledige waarde van de Schaduwen/Hoge lichten-instellingen worden toegepast. +TP_LOCALLAB_MASKRESRETI_TOOLTIP;Wordt gebruikt om het effect van de Retinex-instellingen (alleen luminantie) te moduleren op basis van de luminantie-informatie van de afbeelding in de L(L)- of LC(H)-maskers (Masker en Modificaties).\nHet L(L)-masker of het LC(H)-masker moet worden ingeschakeld om deze functie te gebruiken.\nDe 'donkere' en 'lichte' gebieden onder de donkere drempel en boven de lichte drempel zullen geleidelijk worden hersteld naar hun oorspronkelijke waarden voordat ze door de Retinex-instellingen werden gewijzigd.\nTussen deze twee gebieden zal de volledige waarde van de Retinex-instellingen worden toegepast. +TP_LOCALLAB_MASKRESTM_TOOLTIP;Wordt gebruikt om het effect van de Toonmap-instellingen te moduleren op basis van de luminantie-informatie van de afbeelding in de L(L)- of LC(H)-maskers (Masker en Modificaties).\nHet L(L)-masker of het LC(H)-masker moet worden ingeschakeld om deze functie te gebruiken.\nDe 'donkere' en 'lichte' gebieden onder de donkere drempel en boven de lichte drempel zullen geleidelijk worden hersteld naar hun oorspronkelijke waarden voordat ze door de Toonmap-instellingen werden gewijzigd.\nTussen deze twee gebieden zal de volledige waarde van de Toonmap-instellingen worden toegepast. +TP_LOCALLAB_MASKRESVIB_TOOLTIP;Wordt gebruikt om het effect van de Levendigheid en Warm/Koel-instellingen te moduleren op basis van de luminantie-informatie van de afbeelding in de L(L)- of LC(H)-maskers (Masker en Modificaties).\nHet L(L)-masker of het LC(H)-masker moet worden ingeschakeld om deze functie te gebruiken.\nDe 'donkere' en 'lichte' gebieden onder de donkere drempel en boven de lichte drempel zullen geleidelijk worden hersteld naar hun oorspronkelijke waarden voordat ze door de Levendigheid en Warm/Koel-instellingen werden gewijzigd.\nTussen deze twee gebieden zal de volledige waarde van de Levendigheid en Warm/Koel-instellingen worden toegepast. +TP_LOCALLAB_MASKRESWAV_TOOLTIP;Wordt gebruikt om het effect van de Lokaal contrast en Wavelet-instellingen te moduleren op basis van de luminantie-informatie van de afbeelding in de L(L)- of LC(H)-maskers (Masker en Modificaties).\nHet L(L)-masker of het LC(H)-masker moet worden ingeschakeld om deze functie te gebruiken.\nDe 'donkere' en 'lichte' gebieden onder de donkere drempel en boven de lichte drempel zullen geleidelijk worden hersteld naar hun oorspronkelijke waarden voordat ze door de Lokaal contrast en Wavelet-instellingen werden gewijzigd.\nTussen deze twee gebieden zal de volledige waarde van de Lokaal contrast en Wavelet-instellingen worden toegepast. +TP_LOCALLAB_MASKUNUSABLE;Masker uitgeschakeld (zie Masker & modificaties) +TP_LOCALLAB_MASKUSABLE;Masker ingeschakeld (Masker & modificaties) +TP_LOCALLAB_MASK_TOOLTIP;U kunt meerdere maskers voor een gereedschap inschakelen door een ander gereedschap te activeren en alleen het masker te gebruiken (stel de gereedschapsschuiven in op 0).\n\nU kunt ook de spot dupliceren en deze dicht bij de eerste spot plaatsen. De kleine variaties in de spotreferenties stellen u in staat om fijne aanpassingen te maken. +TP_LOCALLAB_MEDIAN;Mediaan Laag +TP_LOCALLAB_MEDIANITER_TOOLTIP;Het aantal opeenvolgende iteraties dat wordt uitgevoerd door het mediaanfilter. +TP_LOCALLAB_MEDIAN_TOOLTIP;U kunt een mediaanwaarde kiezen in het bereik van 3x3 tot 9x9 pixels. Hogere waarden versterken de ruisonderdrukking en vervaging. +TP_LOCALLAB_MEDNONE;Geen +TP_LOCALLAB_MERCOL;Kleur +TP_LOCALLAB_MERDCOL;Voeg samen met achtergrond (ΔE) +TP_LOCALLAB_MERELE;Alleen ophelderen +TP_LOCALLAB_MERFIV;Optellinh +TP_LOCALLAB_MERFOR;Kleur tegenhouden +TP_LOCALLAB_MERFOU;Vermenigvuldig +TP_LOCALLAB_MERGE1COLFRA;Voeg samen met Origineel/Vorige/Achtergrond +TP_LOCALLAB_MERGECOLFRA;Masker: LCh & Structuur +TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Maakt het mogelijk om maskers te maken op basis van de drie LCh-curves en/of een structuurdetectie-algoritme. +TP_LOCALLAB_MERGEMER_TOOLTIP;Houdt rekening met ΔE bij het samenvoegen van bestanden (equivalent van Bereik in dit geval). +TP_LOCALLAB_MERGEOPA_TOOLTIP;Opaciteit = % van de huidige Spot die moet worden samengevoegd met de originele of vorige Spot.\nContrastdrempel: past het resultaat aan als een functie van het contrast in de originele afbeelding. +TP_LOCALLAB_MERHEI;Overlap +TP_LOCALLAB_MERHUE;Tint +TP_LOCALLAB_MERLUCOL;Luminantie +TP_LOCALLAB_MERLUM;Luminositeit +TP_LOCALLAB_MERNIN;Scherm +TP_LOCALLAB_MERONE;Normaal +TP_LOCALLAB_MERSAT;Verzadiging +TP_LOCALLAB_MERSEV;Zacht licht (legacy) +TP_LOCALLAB_MERSEV0;Zacht licht Illusie +TP_LOCALLAB_MERSEV1;Zacht licht W3C +TP_LOCALLAB_MERSEV2;Hard Licht +TP_LOCALLAB_MERSIX;Deel +TP_LOCALLAB_MERTEN;Alleen donker maken +TP_LOCALLAB_MERTHI;Brand kleur +TP_LOCALLAB_MERTHR;Verschil +TP_LOCALLAB_MERTWE;Uitsluiting +TP_LOCALLAB_MERTWO;Aftrekken +TP_LOCALLAB_METHOD_TOOLTIP;'Verbeterd + chromaruisvermindering' verhoogt de verwerkingstijd aanzienlijk maar vermindert onregelmatigheden. +TP_LOCALLAB_MIDTCIE;Middentonen +TP_LOCALLAB_MLABEL;Herstelde data Min=%1 Max=%2 +TP_LOCALLAB_MLABEL_TOOLTIP;De waarden moeten dicht bij Min=0 Max=32768 (logmodus) liggen, maar andere waarden zijn mogelijk. U kunt 'Kap herstelde data (versterking)' en 'Verschuiving' aanpassen om te normaliseren.\nHerstelt afbeeldingsdata zonder samenvoegen. +TP_LOCALLAB_MODE_EXPERT;Geavanceerd +TP_LOCALLAB_MODE_NORMAL;Standaard +TP_LOCALLAB_MODE_SIMPLE;Basis +TP_LOCALLAB_MRFIV;Achtergrond +TP_LOCALLAB_MRFOU;Voorgaande spot +TP_LOCALLAB_MRONE;Geen +TP_LOCALLAB_MRTHR;Originele afbeelding +TP_LOCALLAB_MULTIPL_TOOLTIP;Breedbereik-tintaanpassing: -18EV tot +4EV. De eerste schuifregelaar werkt op zeer donkere tinten tussen -18EV en -6EV. De laatste schuifregelaar werkt op lichte tinten tot 4EV. +TP_LOCALLAB_NEIGH;Radius +TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;Lagere waarden behouden details en textuur, hogere waarden versterken de ruisonderdrukking.\nAls gamma = 3.0 wordt luminantie 'lineair' gebruikt. +TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;Gebruik deze schuif om de hoeveelheid ruisonderdrukking aan te passen aan de grootte van de te verwerken objecten. +TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP;Hogere waarden verbeteren de ruisonderdrukking ten koste van de verwerkingstijd. +TP_LOCALLAB_NLDENOISE_TOOLTIP;Detailherstel werkt op een Laplace-transformatie op uniforme gebieden in plaats van gebieden met details. +TP_LOCALLAB_NLDET;Detailherstel +TP_LOCALLAB_NLFRA;Non-local Means: Luminantie +TP_LOCALLAB_NLFRAME_TOOLTIP;Non-local means ruisonderdrukking neemt een gemiddelde van alle pixels in de afbeelding, gewogen naar hoe gelijkend ze zijn met de doelpixel.\nVermindert verlies van details vergeleken met local-mean algoritmen.\nAlleen luminantieruis wordt in aanmerking genomen. Chrominantieruis wordt het beste aangepakt met wavelets en Fourier-transformaties (DCT).\nKan in combinatie met 'Luminantieruisvermindering per niveau' of op zichzelf worden gebruikt. +TP_LOCALLAB_NLGAM;Gamma +TP_LOCALLAB_NLLUM;Kracht +TP_LOCALLAB_NLPAT;Maximale patch-grootte +TP_LOCALLAB_NLRAD;Maximale straalgrootte +TP_LOCALLAB_NOISECHROCOARSE;Ruw chroma (Wav) +TP_LOCALLAB_NOISECHROC_TOOLTIP;Indien groter dan nul wordt een hoogwaardig algoritme ingeschakeld.\nGrof is voor schuif >=0,02. +TP_LOCALLAB_NOISECHRODETAIL;Chroma detailherstel +TP_LOCALLAB_NOISECHROFINE;Fijn chroma (Wav) +TP_LOCALLAB_NOISEGAM;Gamma +TP_LOCALLAB_NOISEGAM_TOOLTIP;Als gamma = 1 wordt Luminantie 'Lab' gebruikt. Als gamma = 3.0 wordt Luminantie 'lineair' gebruikt.\nLagere waarden behouden details en textuur, hogere waarden versterken de ruisonderdrukking. +TP_LOCALLAB_NOISELEQUAL;Equalizer wit-zwart +TP_LOCALLAB_NOISELUMCOARSE;Luminantie grof coarse (Wav) +TP_LOCALLAB_NOISELUMDETAIL;Luma detailherstel +TP_LOCALLAB_NOISELUMFINE;Luminantie fijn 1 (Wav) +TP_LOCALLAB_NOISELUMFINETWO;Luminantie fijn 2 (Wav) +TP_LOCALLAB_NOISELUMFINEZERO;Luminantie fijn 0 (Wav) +TP_LOCALLAB_NOISEMETH;Onderdruk ruis +TP_LOCALLAB_NOISE_TOOLTIP;Voegt luminantieruis toe. +TP_LOCALLAB_NONENOISE;Geen +TP_LOCALLAB_NUL_TOOLTIP;. +TP_LOCALLAB_OFFS;Verschuiving +TP_LOCALLAB_OFFSETWAV;Verschuiving +TP_LOCALLAB_OPACOL;Opaciteit +TP_LOCALLAB_ORIGLC;Voeg alleen samen met originele afbeelding +TP_LOCALLAB_ORRETILAP_TOOLTIP;Wijzigt ΔE voorafgaand aan wijzigingen aangebracht door 'Bereik'. Dit stelt u in staat om de actie voor verschillende delen van de afbeelding te differentiëren (met betrekking tot de achtergrond bijvoorbeeld). +TP_LOCALLAB_ORRETISTREN_TOOLTIP;Werkt op de Laplaciaanse drempel, hoe groter de actie, hoe meer de verschillen in contrast worden verminderd. +TP_LOCALLAB_PASTELS2;Levendigheid +TP_LOCALLAB_PDE;Contrastversterker - Compressie Dynamisch bereik +TP_LOCALLAB_PDEFRA;Contrastversterker ƒ +TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL-algoritme aangepast voor RawTherapee: geeft verschillende resultaten en vereist andere instellingen vergeleken met hoofdmenu 'Belichting'.\nKan nuttig zijn bij onderbelichting of voor afbeeldingen met een hoog dynamisch bereik. +TP_LOCALLAB_PRECAMGAMUT_TOOLTIP;Indien aangevinkt, zorgt dit voor een kleuromvangcontrole direct na de primaire conversie naar XYZ. +TP_LOCALLAB_PRECAMREFIMAIN_TOOLTIP;Stelt u in staat om het witpunt zodanig te verplaatsen dat het de dominante kleur nadert. Deze actie wijzigt de zuiverheid. In combinatie met 'Verschuif x' en 'Verschuif y, kunt u een beperkte kleurtoning uitvoeren. +TP_LOCALLAB_PRECAMREFI_TOOLTIP;Stelt u in staat om het witpunt zodanig te verplaatsen dat het de dominante kleur nadert. Deze actie wijzigt de zuiverheid. +TP_LOCALLAB_PRECAM_TOOLTIP;'Brondata-aanpassingen' wijzigt het dynamisch bereik met behulp van Log-codering, de tonen van de afbeelding en primaire kleuren (vereenvoudigd Abstract Profiel), en de middentonen, net voor het Ciecam-proces. Deze waarden zijn aanpasbaar:\nGamma: Werkt voornamelijk op lichte tonen\nHelling: Werkt voornamelijk op donkere tonen. U kunt elke gamma- en hellingcombinatie kiezen (waarden >1) en het algoritme zorgt ervoor dat er continuïteit is tussen de lineaire en paraboolvormige delen van de curve.\nPrimaire kleuren doel: Stelt u in staat om de Primaire kleuren van het doel te wijzigen om de kleur van de afbeelding te herstellen of te wijzigen (verzadiging). De kleurbalans wordt behouden wanneer het 'Werkprofiel' en de 'Primaire kleuren doel' vergelijkbaar zijn. Het 'Werkprofiel' wordt niet gewijzigd. U kunt ook de primaire kleuren en de lichtbron (witpunt) fijn aanpassen. Het verplaatsen van een primaire kleur verder weg van het witpunt vermindert de verzadiging en vice versa. Let op de kleuromvang (gamut). +TP_LOCALLAB_PREVHIDE;Verberg extra instellingen +TP_LOCALLAB_PREVIEW;Voorbeeld ΔE +TP_LOCALLAB_PREVSHOW;Toon extra instellingen +TP_LOCALLAB_PRIMILLFRAME;Primaire kleuren & Lichtbron +TP_LOCALLAB_PROXI;ΔE-verval +TP_LOCALLAB_QUAAGRES;Aggressief +TP_LOCALLAB_QUACONSER;Conservatief +TP_LOCALLAB_QUALCURV_METHOD;Soort curve +TP_LOCALLAB_QUAL_METHOD;Globale kwaliteit +TP_LOCALLAB_QUANONEALL;Uit +TP_LOCALLAB_QUANONEWAV;Alleen Non-local means +TP_LOCALLAB_RADIUS;Radius +TP_LOCALLAB_RADIUS_TOOLTIP;Gebruikt een snelle Fourier-transformatie voor straal > 30. +TP_LOCALLAB_RADMASKCOL;Verzachtingsstraal +TP_LOCALLAB_RECOTHRES02_TOOLTIP;Als de waarde van de 'Hersteldrempel' groter is dan 1, houdt het masker in Masker en Modificaties rekening met eerdere wijzigingen van de afbeelding maar niet met die van het huidige gereedschap (bijv. Kleur en Licht, Wavelet, Cam16, enz.)\nAls de waarde van de 'Hersteldrempel' kleiner is dan 1, houdt het masker in Masker en Modificaties geen rekening met eerdere wijzigingen van de afbeelding.\n\nIn beide gevallen werkt de 'Hersteldrempel' op de gemaskerde afbeelding zoals gewijzigd door het huidige gereedschap (Kleur en Licht, Wavelet, Cam16, enz.). +TP_LOCALLAB_RECT;Rechthoek +TP_LOCALLAB_RECURS;Recursieve referenties +TP_LOCALLAB_RECURS_TOOLTIP;Dwingt het algoritme om de referenties opnieuw te berekenen na elke toepassing van een gereedschap.\nOok handig bij het werken met maskers. +TP_LOCALLAB_REN_DIALOG_LAB;Geef de nieuwe Control Spot-naam +TP_LOCALLAB_REN_DIALOG_NAME;Hernoem Control Spot +TP_LOCALLAB_REPARCOL_TOOLTIP;Hiermee kunt u de relatieve sterkte van de Kleur en Licht-afbeelding aanpassen ten opzichte van de originele afbeelding. +TP_LOCALLAB_REPARDEN_TOOLTIP;Hiermee kunt u de relatieve sterkte van de Ruisonderdrukking-afbeelding aanpassen ten opzichte van de originele afbeelding. +TP_LOCALLAB_REPAREXP_TOOLTIP;Hiermee kunt u de relatieve sterkte van de Dynamisch Bereik en Belichting-afbeelding aanpassen ten opzichte van de originele afbeelding. +TP_LOCALLAB_REPARSH_TOOLTIP;Hiermee kunt u de relatieve sterkte van de Schaduwen/Hoge lichten en Toonequalizer-afbeelding aanpassen ten opzichte van de originele afbeelding. +TP_LOCALLAB_REPARTM_TOOLTIP;Hiermee kunt u de relatieve sterkte van de Toonmap-afbeelding aanpassen ten opzichte van de originele afbeelding. +TP_LOCALLAB_REPARW_TOOLTIP;Hiermee kunt u de relatieve sterkte van de Lokaal contrast en Wavelet-afbeelding aanpassen ten opzichte van de originele afbeelding. +TP_LOCALLAB_RESID;Residuele afbeelding +TP_LOCALLAB_RESIDBLUR;Vervaag residuele afbeelding +TP_LOCALLAB_RESIDCHRO;Residuele afbeelding Chroma +TP_LOCALLAB_RESIDCOMP;Comprimmeer Residuele afbeelding +TP_LOCALLAB_RESIDCONT;Residuele afbeelding Contrast +TP_LOCALLAB_RESIDHI;Hoge lichten +TP_LOCALLAB_RESIDHITHR;Drempel hoge lichten +TP_LOCALLAB_RESIDSHA;Schaduwen +TP_LOCALLAB_RESIDSHATHR;Drempel schaduwen +TP_LOCALLAB_RETI;Nevelvermindering & Retinex +TP_LOCALLAB_RETIFRA;Retinex +TP_LOCALLAB_RETIFRAME_TOOLTIP;Retinex kan nuttig zijn voor het verwerken van afbeeldingen: \ndie wazig, mistig of nevelig zijn (naast Nevelvermindering).\ndie grote verschillen in luminantie bevatten.\nHet kan ook worden gebruikt voor speciale effecten (toonmapping). +TP_LOCALLAB_RETIM;Originele Retinex +TP_LOCALLAB_RETITOOLFRA;Retinex-gereedschappen +TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Heeft geen effect wanneer de waarde van 'Helderheid = 1' of 'Duisternis = 2'.\nVoor andere waarden wordt de laatste stap van een 'Multiple-scale Retinex'- algoritme (vergelijkbaar met 'lokaal contrast') toegepast. Deze twee schuiven, geassocieerd met 'Sterkte', stellen u in staat om aanpassingen voorafgaand aan lokaal contrast te maken. +TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Past de interne parameters aan voor een optimale respons.\nHet wordt aangeraden om de waarden van 'Herstelde data' dicht bij Min=0 en Max=32768 (log-modus) te houden, maar andere waarden zijn mogelijk. +TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logaritmische modus introduceert meer contrast maar zal ook meer halo's genereren. +TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;Met de schuiven voor Straal en Variantie kunt u de nevel aanpassen voor de voorgrond of de achtergrond. +TP_LOCALLAB_RETI_SCALE_TOOLTIP;Als Schaal = 1, gedraagt Retinex zich als lokaal contrast met extra mogelijkheden.\nHet verhogen van de waarde van Schaal verhoogt de intensiteit van de recursieve actie ten koste van de verwerkingstijd. +TP_LOCALLAB_RET_TOOLNAME;Nevelvermindering & Retinex +TP_LOCALLAB_REWEI;Herhaling herweging +TP_LOCALLAB_RGB;RGB-tooncurve +TP_LOCALLAB_RGBCURVE_TOOLTIP;In RGB-modus heeft u vier keuzes: Standaard, Gewogen standaard, Luminantie en Filmachtig. +TP_LOCALLAB_ROW_NVIS;Niet zichtbaar +TP_LOCALLAB_ROW_VIS;Zichtbaar +TP_LOCALLAB_RSTPROTECT_TOOLTIP;Rood- en huidskleurbescherming beïnvloedt de schuiven voor Verzadiging, Chroma en Kleurrijkheid. +TP_LOCALLAB_SATCIE;Beperk verzadiging +TP_LOCALLAB_SATUR;Verzadiging +TP_LOCALLAB_SATURV;Verzadiging (s) +TP_LOCALLAB_SCALEGR;Schaal +TP_LOCALLAB_SCALERETI;Schaal +TP_LOCALLAB_SCALTM;Schaal +TP_LOCALLAB_SCOPEMASK;Bereik (ΔE beeldmasker) +TP_LOCALLAB_SCOPEMASK_TOOLTIP;Ingeschakeld als het ΔE-beeldmasker is ingeschakeld.\nLage waarden voorkomen een retouche van het geselecteerde gebied. +TP_LOCALLAB_SENSI;Bereik +TP_LOCALLAB_SENSIEXCLU;Bereik +TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Pas de kleuren aan die moeten worden uitgesloten. +TP_LOCALLAB_SENSIMASK_TOOLTIP;Bereikaanpassing specifiek voor het algemene maskergereedschap.\nWerkt op het verschil tussen de originele afbeelding en het masker.\nGebruikt de luma-, chroma- en tintreferenties van het midden van de spot.\n\nU kunt ook de ΔE van het masker zelf aanpassen met 'Bereik (ΔE beeldmasker)' in 'Instellingen' > 'Masker en Samenvoegen'. +TP_LOCALLAB_SENSI_TOOLTIP;Past het bereik van de actie aan:\nKleine waarden beperken de actie tot kleuren die vergelijkbaar zijn met die in het midden van de spot.\nHoge waarden laten het gereedschap werken op een breder scala aan kleuren. +TP_LOCALLAB_SETTINGS;Instellingen +TP_LOCALLAB_SH1;Schaduwen/Hoge lichten +TP_LOCALLAB_SH2;Equalizer +TP_LOCALLAB_SHADEX;Schaduwen +TP_LOCALLAB_SHADEXCOMP;Schaduwcompressie +TP_LOCALLAB_SHADHIGH;Schaduwen/hoge lichten & Toonequalizer +TP_LOCALLAB_SHADHMASK_TOOLTIP;Vermindert de hoge lichten van het masker op dezelfde manier als het Schaduwen/hoge lichten-algoritme. +TP_LOCALLAB_SHADMASK_TOOLTIP;Verheldert de schaduwen van het masker op dezelfde manier als het Schaduwen/hoge lichten-algoritme. +TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Pas schaduwen en hoge lichten aan met de schuiven voor schaduwen en hoge lichten of met een toonequalizer.\nKan worden gebruikt in plaats van of in combinatie met de Belichtingsmodule.\nKan ook worden gebruikt als een verloopfilter. +TP_LOCALLAB_SHAMASKCOL;Schaduwen +TP_LOCALLAB_SHAPETYPE;Spotvorm +TP_LOCALLAB_SHAPE_TOOLTIP;'Ellips' is de normale modus.\n'Rechthoek' kan in bepaalde gevallen worden gebruikt, bijvoorbeeld om in de volledige afbeeldingsmodus te werken door de begrenzingen buiten het voorbeeldgebied te plaatsen. Stel in dit geval de overgang in op 100.\n\nToekomstige ontwikkelingen zullen polygoonvormen en een Bézier-curve bevatten. +TP_LOCALLAB_SHARAMOUNT;Hoeveelheid +TP_LOCALLAB_SHARBLUR;Vervagingsradius +TP_LOCALLAB_SHARDAMPING;Demping +TP_LOCALLAB_SHARFRAME;Modificaties +TP_LOCALLAB_SHARITER;Herhalingen +TP_LOCALLAB_SHARP;Schaduwen +TP_LOCALLAB_SHARP_TOOLNAME;Schaduwen +TP_LOCALLAB_SHARRADIUS;Straal +TP_LOCALLAB_SHORTC;Korte curves L-masker +TP_LOCALLAB_SHORTCMASK_TOOLTIP;Kortsluit de 2 curves L(L) en L(H).\nHiermee kunt u de huidige afbeelding mengen met de originele afbeelding die is gewijzigd door de maskerbewerking.\nTe gebruiken met maskers 2, 3, 4, 6, 7. +TP_LOCALLAB_SHOWC;Masker & modificaties +TP_LOCALLAB_SHOWC1;Voeg bestand samen +TP_LOCALLAB_SHOWCB;Masker en modificaties +TP_LOCALLAB_SHOWDCT;Toon Fourier (ƒ) proces +TP_LOCALLAB_SHOWE;Masker en modificaties +TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) +TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (eerste) +TP_LOCALLAB_SHOWLC;Masker en modificaties +TP_LOCALLAB_SHOWMASK;Toon masker +TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Toont Maskers en Modificaties.\nLet op, u kunt slechts één gereedschapsmasker tegelijk bekijken.\nToon gewijzigde afbeelding: toont de gewijzigde afbeelding inclusief het effect van modificaties en maskers.\nToon gewijzigde gebieden zonder masker: toont de wijzigingen voordat maskers worden toegepast.\nToon gewijzigde gebieden met masker: toont de wijzigingen nadat een masker is toegepast.\nToon masker: toont het uiterlijk van het masker inclusief het effect van curves en filters.\nToon spotstructuur: hiermee kunt u het structuurdetectiemasker zien wanneer de 'Spotstructuur'-cursor is geactiveerd (indien beschikbaar).\nOpmerking: Het masker wordt toegepast vóór het vormdetectie-algoritme. +TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Stelt u in staat om de verschillende stadia van het Fourier-proces te visualiseren.\nLaplace - berekent de tweede afgeleide van de Laplace-transformatie als functie van de drempel.\nFourier - toont de Laplace-transformatie met DCT.\nPoisson - toont de oplossing van Poisson DCE.\nGeen luminantienormalisatie - toont resultaat zonder enige normalisatie van de luminantie. +TP_LOCALLAB_SHOWMASKTYP1;Vervaging & Ruis +TP_LOCALLAB_SHOWMASKTYP2;Ruisvermindering +TP_LOCALLAB_SHOWMASKTYP3;Vervaging & Ruis + Ruisvermindering +TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Kan worden gebruikt met 'Masker en Modificaties'.\nAls 'Vervagen en ruis' is geselecteerd, kan het masker niet worden gebruikt voor ruisonderdrukking.\nAls ruisonderdrukking is geselecteerd, kan het masker niet worden gebruikt voor 'Vervagen en ruis'.\nAls 'Vervagen en ruis + ruisonderdrukking' is geselecteerd, wordt het masker gedeeld. Houd er rekening mee dat in dit geval de bereikschuiven voor zowel 'Vervagen en ruis' als ruisonderdrukking actief zullen zijn, dus het is raadzaam om de optie 'Toon wijzigingen met masker' te gebruiken bij het maken van aanpassingen. +TP_LOCALLAB_SHOWMNONE;Toon gemodificeerde afbeelding +TP_LOCALLAB_SHOWMODIF;Toon gemodificeerde gebieden zonder masker +TP_LOCALLAB_SHOWMODIF2;Toon gemodificeerde gebieden +TP_LOCALLAB_SHOWMODIFMASK;Toon gemodificeerde gebieden met masker +TP_LOCALLAB_SHOWNORMAL;Geen luminantie-normalisatie +TP_LOCALLAB_SHOWPLUS;Masker en modificaties (Vervaging & Ruisvermindering) +TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) +TP_LOCALLAB_SHOWR;Masker en modificaties +TP_LOCALLAB_SHOWREF;Voorbeeld ΔE +TP_LOCALLAB_SHOWS;Masker en modificaties +TP_LOCALLAB_SHOWSTRUC;Toon spotstructuur (Geavanceerd) +TP_LOCALLAB_SHOWSTRUCEX;Toon spotstructuur (Geavanceerd) +TP_LOCALLAB_SHOWT;Masker en modificaties +TP_LOCALLAB_SHOWVI;Masker en modificaties +TP_LOCALLAB_SHRESFRA;Schaduwen/Hoge lichten & TRC +TP_LOCALLAB_SHTRC_TOOLTIP;Gebaseerd op 'werkprofiel' (alleen degene die zijn geleverd), wijzigt de tonen van de afbeelding door te werken op een TRC (ToonResponsCurve).\nGamma werkt voornamelijk op de lichte tonen.\nHelling voornamelijk op donkere tonen.\nHet wordt aanbevolen dat de TRC van beide apparaten (monitor en uitvoerprofiel) sRGB is (standaard). +TP_LOCALLAB_SH_TOOLNAME;Schaduwen/Hoge lichten & Toonequalizer +TP_LOCALLAB_SIGBLACKSSCIE;Zwartdistributie +TP_LOCALLAB_SIGCIE;Sigmoid +TP_LOCALLAB_SIGFRA;Sigmoid Q & Log-codering Q +TP_LOCALLAB_SIGGAMJCIE;Gamma +TP_LOCALLAB_SIGJZFRA;Sigmoid Jz +TP_LOCALLAB_SIGMAWAV;Versterkingsrespons +TP_LOCALLAB_SIGMOID16_TOOLTIP;Hiermee kunt u een toonmapping-uiterlijk simuleren met zowel 'Ciecam' als 'Sigmoid Q'. Sigmoid Q heeft drie schuiven:\na) Contrast werkt op de vorm van de sigmoïde-curve en daarmee de sterkte\nb) Drempel (Grijspunt) verdeelt de actie volgens de luminantie\nc) Aanpasbaarheid weegt de actie van de sigmoïde met de interne exponentiële functie. +TP_LOCALLAB_SIGMOIDBL;Samenvoegen +TP_LOCALLAB_SIGMOIDLAMBDA;Contrast +TP_LOCALLAB_SIGMOIDLOGAUTO;Auto-drempel +TP_LOCALLAB_SIGMOIDLOGEV_TOOLTIP;Als in de combobox 'Zwart LW en Wit LW' en 'Sigmoid en Log-codering' zijn aangevinkt in plaats van 'Alleen Sigmoid', worden de twee algoritmes 'Log-codering' en 'Sigmoid' samen gebruikt. +TP_LOCALLAB_SIGMOIDNORMCIE;Normaliseer Luminantie +TP_LOCALLAB_SIGMOIDNORMCIEBLEND_TOOLTIP;Mengen beïnvloedt het uiteindelijke aspect van het beeld, het contrast en de luminantie. Verhouding tussen origineel en uitvoerbeeld. +TP_LOCALLAB_SIGMOIDNORMCIE_TOOLTIP;Reconstructie van de luminantie zodat het gemiddelde en de variantie van het uitvoerbeeld rekening houden met die van het origineel.\nAlle aanpassingen die invloed hebben op J of Q worden meegenomen, inclusief die welke niet gerelateerd zijn aan Sigmoid Q. +TP_LOCALLAB_SIGMOIDQJ;Gebruikt Zwart LW & Wit LW +TP_LOCALLAB_SIGMOIDQJCOMPRCIE_TOOLTIP;Wanneer in de combobox-selectie 'Zwart LW en Wit LW', 'Sigmoid en Log encoding Q' of 'Log-codering in plaats van Sigmoid' is aangevinkt. Dit algoritme comprimeert de data boven de waarde van de drempelschuif. De laatste waarde staat voor helderheid (Q) en moet zo dicht mogelijk bij de waarde 'Compressiedrempel' liggen (berekend wanneer 'Auto-drempel' is aangevinkt, vaak > 1). +TP_LOCALLAB_SIGMOIDSENSI;Aanpasbaarheid +TP_LOCALLAB_SIGMOIDTH;Drempel (Grijspunt) +TP_LOCALLAB_SIGMOIDWHITESCIE_TOOLTIP;Hiermee kunt u, in Automatische modus, wanneer het dynamisch bereik van het beeld groot is, de distributie van lichten in witten en diepe zwarten wijzigen.\nKan worden gebruikt met Log-codering of Sigmoid met Zwart LW en Wit LW ingeschakeld.\n\nHet algoritme verandert de basisgegevens niet, maar werkt op de componenten die nodig zijn om het dynamisch bereik, Zwart LW, Wit LW en het Grijspunt te berekenen. +TP_LOCALLAB_SIGMOID_TOOLTIP;Hiermee kunt u een toonmap-uiterlijk simuleren met zowel de 'Jz'- als de 'Sigmoid'-functie. Drie schuifregelaars:\na) Contrast beïnvloedt de vorm van de sigmoïde-curve en daarmee de sterkte\nb) Drempel (Grijspunt) verdeelt de actie op basis van de luminantie\nc) Samenvoegen beïnvloedt het uiteindelijke beeld, het contrast en de luminantie. +TP_LOCALLAB_SIGSLOPJCIE;Helling +TP_LOCALLAB_SIGTRCCIE;Aanpassingen brondata +TP_LOCALLAB_SIGWHITESCIE;Witdistributie +TP_LOCALLAB_SLOMASKCOL;Helling +TP_LOCALLAB_SLOMASK_TOOLTIP;Door Gamma en Helling aan te passen kunt u een zachte transformatie van het masker bewerkstelligen (zonder onregelmatigheden) door geleidelijk 'L' te wijzigen om discontinuïteiten te vermijden. +TP_LOCALLAB_SLOPESMOOTH;Grijsbalans (Helling) +TP_LOCALLAB_SLOPESMOOTHB;Blauwbalans (Helling) +TP_LOCALLAB_SLOPESMOOTHG;Groenbalans (Helling) +TP_LOCALLAB_SLOPESMOOTHR;Roodbalans (Helling) +TP_LOCALLAB_SLOSH;Helling +TP_LOCALLAB_SMOOTHCIE;Versterking hoge lichten +TP_LOCALLAB_SMOOTHCIE_LUM;Luminositeitsmodus +TP_LOCALLAB_SMOOTHCIE_SCA;Schaal Yb Opname +TP_LOCALLAB_SMOOTHCIE_TOOLTIP;Voltooit de bewerkingen uitgevoerd door gamma, helling en middentonen door de lichten iets te verzwakken. Let op, dit is geen vervanging van 'Reconstructie Hoge lichten'.\n\nGamma-gebaseerd en Helling-gebaseerd (Standaard en Geavanceerd) stelt u in staat toonmapping te simuleren met behulp van:\na) Opname-omstandigheden: Zwart LW, Wit LW, Gemiddelde luminantie (Yb%)\nb) Weergaveomstandigheden: Gemiddelde luminantie (Yb%).\n\nSchaal Yb Opname is een functie van Wit LW. +TP_LOCALLAB_SMOOTHCIE_YB;Schaal Yb Weergave +TP_LOCALLAB_SOFT;Zacht licht & Originele Retinex +TP_LOCALLAB_SOFTM;Zacht licht +TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Pas een Zacht-licht mengmodus toe (identiek aan de globale aanpassing). Voer doordrukken en tegenhouden uit met het originele Retinex-algoritme. +TP_LOCALLAB_SOFTRADIUSCOL;Radius verzachting +TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Past een Begeleid filter toe op het uitvoerbeeld om mogelijke onregelmatigheden te verminderen. +TP_LOCALLAB_SOFTRETI;Verminder ΔE-onregelmatgheden +TP_LOCALLAB_SOFT_TOOLNAME;Zacht licht & Originele Retinex +TP_LOCALLAB_SOURCE_ABS;Absolute luminantie +TP_LOCALLAB_SOURCE_GRAY;Gemiddelde luminantie (Yb%) +TP_LOCALLAB_SPECCASE;Specifieke gevallen +TP_LOCALLAB_SPECIAL;Speciaal gebruik van RGB-curven +TP_LOCALLAB_SPECIAL_TOOLTIP;Het selectievakje stelt u in staat om alle andere acties te verwijderen: 'Bereik', maskers, schuiven, enz., (behalve overgangen) en alleen het effect van de RGB-tooncurve te gebruiken. +TP_LOCALLAB_SPOTNAME;Nieuwe spot +TP_LOCALLAB_STD;Standaard +TP_LOCALLAB_STR;Kracht +TP_LOCALLAB_STRBL;Kracht +TP_LOCALLAB_STREN;Compressiesterkte +TP_LOCALLAB_STRENG;Kracht +TP_LOCALLAB_STRENGR;Kracht +TP_LOCALLAB_STRENGRID_TOOLTIP;U kunt het gewenste effect aanpassen met 'kracht', maar u kunt ook de 'bereik'-functie gebruiken om de actie te begrenzen (bijvoorbeeld om een specifieke kleur te isoleren). +TP_LOCALLAB_STRENGTH;Ruis +TP_LOCALLAB_STRENGTHCIELOG;Kracht +TP_LOCALLAB_STRGRID;Kracht +TP_LOCALLAB_STRUC;Structuur +TP_LOCALLAB_STRUCCOL;Spotstructuur +TP_LOCALLAB_STRUCCOL1;Spotstructuur +TP_LOCALLAB_STRUCT_TOOLTIP;Gebruikt het Sobel-algoritme om structuur voor vormdetectie te gebruiken.\nActiveer 'Masker en Modificaties' > 'Toon spotstructuur' (Geavanceerde modus) om een voorbeeld van het masker te zien (zonder wijzigingen).\n\nKan worden gebruikt in combinatie met het Structuurmasker, Vervagingsmasker en Lokaal contrast (op wavelet-niveau) om de randdetectie te verbeteren.\n\nEffecten van aanpassingen met behulp van Helderheid, Contrast, Chrominantie, Belichting of andere niet-masker-gerelateerde hulpmiddelen zijn zichtbaar met 'Toon gewijzigde afbeelding' of 'Toon gewijzigde gebieden met masker'. +TP_LOCALLAB_STRUMASKCOL;Kracht structuurmasker +TP_LOCALLAB_STRUMASK_TOOLTIP;Structuurmasker (schuif) met 'Structuurmasker als hulpmiddel' niet aangevinkt: In dit geval wordt een masker gegenereerd dat de structuur toont, zelfs als geen van de drie curves is geactiveerd. Structuurmaskers zijn beschikbaar voor Masker (Vervaag en Ruisonderdrukking) en masker (Kleur & Licht). +TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Matig gebruik van deze schuif wordt aanbevolen! +TP_LOCALLAB_STYPE;Vorm - methode +TP_LOCALLAB_STYPE_TOOLTIP;U kunt kiezen tussen:\nSymmetrisch - linkerhendel gekoppeld aan rechterhendel, bovenhendel gekoppeld aan onderhendel.\nOnafhankelijk - alle hendels zijn onafhankelijk. +TP_LOCALLAB_SYM;Symmetrisch (muis) +TP_LOCALLAB_SYMSL;Symmetrisch (muis + schuiven) +TP_LOCALLAB_TARGET_GRAY;Gemiddelde luminantie (Yb%) +TP_LOCALLAB_TE_PIVOT;Draaipunt (LW) +TP_LOCALLAB_THRES;Drempel structuur +TP_LOCALLAB_THRESDELTAE;Drempel ΔE-bereik +TP_LOCALLAB_THRESRETI;Drempel +TP_LOCALLAB_THRESWAV;Balansdrempel +TP_LOCALLAB_TLABEL;TM Min=%1 Max=%2 Gemiddeld=%3 Sig=%4 +TP_LOCALLAB_TLABEL_TOOLTIP;Resultaat transmissiekaart.\nMin en Max worden gebruikt door Variantie.\nTm=Min TM=Max van de transmissiekaart.\nU kunt de resultaten normaliseren met de drempelschuif. +TP_LOCALLAB_TM;Toonmappen +TP_LOCALLAB_TM_MASK;Gebruik transmissiemap +TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;Deze schuif beïnvloedt de randgevoeligheid.\nHoe groter de waarde, hoe waarschijnlijker een verandering in contrast als een rand wordt geïnterpreteerd.\nAls deze op nul is ingesteld, heeft de toonmapping een soortgelijk effect als een onscherptemasker. +TP_LOCALLAB_TONEMAPGAM_TOOLTIP;De Gamma-schuif verschuift het toonmapping-effect of naar de schaduwen of naar de hoge lichten. +TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In sommige gevallen kan toonmapping resulteren in een cartooneske uitstraling, en in zeldzame gevallen kunnen zachte maar brede halo's verschijnen.\nHet verhogen van het aantal herwegingsiteraties helpt sommige van deze problemen te bestrijden. +TP_LOCALLAB_TONEMAP_TOOLTIP;Zelfde als het toonmapgereedschap in het hoofdmenu.\nHet gereedschap in het hoofdmenu moet worden gedeactiveerd als dit gereedschap wordt gebruikt. +TP_LOCALLAB_TONEMASCALE_TOOLTIP;Met deze schuif kunt u de overgang tussen 'lokaal' en 'globaal' contrast aanpassen.\nHoe hoger de waarde, hoe groter een detail moet zijn om te worden versterkt. +TP_LOCALLAB_TONE_TOOLNAME;Toonmappen +TP_LOCALLAB_TOOLCOL;Structuurmasker als gereedschap +TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Hiermee kunt u het masker wijzigen, indien aanwezig. +TP_LOCALLAB_TOOLMASK;Maskergereedschappen +TP_LOCALLAB_TOOLMASK_2;Wavelets +TP_LOCALLAB_TOOLMASK_TOOLTIP;Structuurmasker (schuif) met het selectievakje 'Structuurmasker als hulpmiddel' aangevinkt: in dit geval wordt een masker gegenereerd dat de structuur toont nadat een of meer van de twee curves L(L) of LC(H) is gewijzigd.\nHier gedraagt het Structuurmasker zich als de andere Maskerhulpmiddelen: Gamma, Helling, enz.\nHet stelt u in staat de actie op het masker te variëren volgens de structuur van het beeld. +TP_LOCALLAB_TRANSIT;Transitieverloop +TP_LOCALLAB_TRANSITGRAD;Transitie-differentiatie XY +TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Hiermee kunt u de transitie op de y-as variëren. +TP_LOCALLAB_TRANSITVALUE;Transitiewaarde +TP_LOCALLAB_TRANSITWEAK;Transitieverval (lineair-log) +TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Past de transitievervalfunctie aan: 1. lineair, 2. parabolisch, 3. kubiek tot ^25.\nKan worden gebruikt in combinatie met zeer lage transitiewaarden om defecten te verminderen (CBDL, Wavelets, Kleur & Licht). +TP_LOCALLAB_TRANSIT_TOOLTIP;Pas de gladheid van de transitie tussen betrokken en niet-betrokken gebieden aan als een percentage van de straal. +TP_LOCALLAB_TRANSMISSIONGAIN;Transmissieversterking +TP_LOCALLAB_TRANSMISSIONMAP;Transmissiemap +TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmissie volgens transmissie.\nAbscis: transmissie van negatieve waarden (min), gemiddelde en positieve waarden (max).\nOrdinaat: versterking of vermindering.\nU kunt deze curve aanpassen om de Transmissie te wijzigen en onregelmatigheden te verminderen. +TP_LOCALLAB_TRCFRAME;Toonresponscurve (TRC) & Middentonen +TP_LOCALLAB_USEMASK;Laplacian +TP_LOCALLAB_VART;Variantie (contrast) +TP_LOCALLAB_VIBRANCE;Levendigheid & Warm/Koel +TP_LOCALLAB_VIBRA_TOOLTIP;Past de levendigheid aan (in feite hetzelfde als de globale aanpassing).\nVoert het equivalent van een witbalansaanpassing uit met behulp van een CIECAM-algoritme. +TP_LOCALLAB_VIB_TOOLNAME;Levendigheid & Warm/Koel +TP_LOCALLAB_VIS_TOOLTIP;Klik om geselecteerde Controlespot te tonen/verbergen.\nCtrl+klik om alle Controlespots te tonen/verbergen. +TP_LOCALLAB_WARM;Warm/Koel & Kleuronregelmatigheden +TP_LOCALLAB_WARM_TOOLTIP;Deze schuif gebruikt het CIECAM-algoritme en werkt als een witbalansregeling om de kleurtemperatuur van het geselecteerde gebied warmer of koeler te maken.\nIn sommige gevallen kan het ook kleuronregelmatigheden verminderen. +TP_LOCALLAB_WASDEN_TOOLTIP;Luminantieruisonderdrukking: de linkerkant van de curve inclusief de donkergrijs/lichtgrijs grens komt overeen met de eerste drie niveaus 0, 1, 2 (fijne details). De rechterkant van de curve komt overeen met de grovere details (niveaus 3, 4, 5, 6). +TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Balanceert de actie binnen elk niveau. +TP_LOCALLAB_WAT_BLURLC_TOOLTIP;De standaard vervagingsinstelling beïnvloedt alle drie L*a*b*-componenten (luminantie en kleur).\nIndien aangevinkt wordt alleen luminantie vervaagd. +TP_LOCALLAB_WAT_CLARIC_TOOLTIP;'Chroma samenvoegen' wordt gebruikt om de intensiteit van het gewenste effect op chrominantie te selecteren. +TP_LOCALLAB_WAT_CLARIL_TOOLTIP;'Luma samenvoegen' wordt gebruikt om de intensiteit van het gewenste effect op luminantie te selecteren. +TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;'Chroma-niveaus': past de 'a'- en 'b'-componenten van Lab* aan als een verhouding van de luminantiewaarde. +TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;Verschuiving wijzigt de balans tussen laag-contrast en hoog-contrast details.\nHoge waarden versterken contrastveranderingen voor de details met meer contrast, terwijl lage waarden contrastveranderingen voor details met weinig contrast versterken.\nDoor een lage 'Verzwakkingsrespons'-waarde te gebruiken kunt u selecteren welke contrastwaarden worden versterkt. +TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;Door de schuif naar links te bewegen, worden de lagere niveaus geaccentueerd. Naar rechts worden de lagere niveaus verminderd en de hogere niveaus geaccentueerd. +TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;Het residuele beeld gedraagt zich op dezelfde manier als het hoofdbeeld bij het aanpassen van contrast, chroma, enz. +TP_LOCALLAB_WAT_GRADW_TOOLTIP;Hoe meer u de schuif naar rechts beweegt, hoe effectiever het detectie-algoritme zal zijn en hoe minder merkbaar de effecten van lokaal contrast. +TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Laag tot hoog lokaal contrast van links naar rechts op de x-as.\nVerhoogt of verlaagt lokaal contrast op de y-as. +TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;U kunt de verdeling van lokaal contrast aanpassen per wavelet-niveau op basis van de initiële intensiteit van het contrast. Dit zal de effecten van perspectief en reliëf in de afbeelding wijzigen, en/of de contrastwaarden voor zeer lage initiële contrastniveaus verminderen. +TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;'Alleen samenvoegen met origineel beeld', voorkomt dat de 'Wavelet Pyramide'-instellingen interfereren met 'Klaarheid (Clarity)' en 'Scherptemasker'. +TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Vervaagt het residuele beeld, onafhankelijk van de niveaus. +TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Comprimeert het residuele beeld om het contrast te verhogen of te verlagen. +TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;Het effect van de lokale contrastaanpassing is sterker voor details met middelmatig contrast en zwakker voor hoge en lage contrastdetails.\nDeze schuif regelt hoe snel het effect vermindert naar de extreme contrasten.\nHoe hoger de waarde van de schuif, des te breder het contrastbereik dat het volledige effect van de lokale contrastaanpassing ontvangt en hoe hoger het risico op het genereren van onregelmatigheden.\nHoe lager de waarde, hoe gerichter het effect zal zijn op een smal bereik van contrastwaarden. +TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensiteit van rand-effect detectie. +TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Staat toe om het lokale contrast te variëren volgens een gekozen verloop en hoek. De variatie van het luminantiesignaal wordt in acht genomen, en niet de luminantie. +TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Bereik van wavelet-niveaus gebruikt door het hele Wavelets-module. +TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Hiermee kunt u elk niveau van decompositie vervagen.\nDe fijnste tot grofste niveaus van decompositie zijn van links naar rechts. +TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Vergelijkbaar met Contrast per Detailniveaus. Fijne tot grove detailniveaus van links naar rechts op de x-as. +TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Werkt op de balans van de drie richtingen (horizontaal, verticaal en diagonaal), gebaseerd op de luminantie van de afbeelding.\nStandaard worden de schaduwen of hoge lichten verminderd om onregelmatigheden te vermijden. +TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Toont alle 'Randscherpte'-gereedschappen. Het is raadzaam de documentatie van Wavelet-niveaus te lezen. +TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Pas het maximale effect van vervaging op de niveaus aan. +TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Laag tot hoog lokaal contrast van links naar rechts op de x-as\nVerhoog of verlaag lokaal contrast op de y-as. +TP_LOCALLAB_WAT_WAVTM_TOOLTIP;Het lagere (negatieve) deel comprimeert elk niveau van decompositie, waardoor een toonmap-effect ontstaat.\nHet bovenste (positieve) deel verzwakt het contrast per niveau.\nDe fijnste tot grofste niveaus van decompositie zijn van links naar rechts op de x-as. +TP_LOCALLAB_WAV;Lokaal contrast +TP_LOCALLAB_WAVBLUR_TOOLTIP;Hiermee kunt u elk niveau van decompositie vervagen, evenals het residuele beeld. +TP_LOCALLAB_WAVCOMP;Compressie per niveau +TP_LOCALLAB_WAVCOMPRE;Compressie per niveau +TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Pas toon-mapping toe of verminder lokaal contrast op individuele niveaus.\nFijne tot grove detailniveaus van links naar rechts op de x-as. +TP_LOCALLAB_WAVCOMP_TOOLTIP;Pas lokaal contrast toe gebaseerd op de richting van de wavelet-decompositie: horizontaal, verticaal, diagonaal. +TP_LOCALLAB_WAVCON;Contrast per niveau +TP_LOCALLAB_WAVCONTF_TOOLTIP;Vergelijkbaar met Contrast per Detailniveaus. Fijne tot grove detailniveaus van links naar rechts op de x-as. +TP_LOCALLAB_WAVDEN;Luminantie ruisvermindering +TP_LOCALLAB_WAVE;Wavelets +TP_LOCALLAB_WAVEDG;Lokaal contrast +TP_LOCALLAB_WAVEEDG_TOOLTIP;Verbetert de scherpte door de actie van lokaal contrast op de randen te richten. Het heeft dezelfde functies als de corresponderende module in Wavelet-niveaus en gebruikt dezelfde instellingen. +TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Bereik van wavelet-niveaus gebruikt in 'Lokaal contrast' (per wavelet-niveau). +TP_LOCALLAB_WAVGRAD_TOOLTIP;Varieer het lokale contrast volgens een gekozen verloop en hoek. De variatie van het luminantiesignaal wordt in acht genomen, en niet de luminantie. +TP_LOCALLAB_WAVHUE_TOOLTIP;Versterk of verminder de ruisonderdrukking op basis van tint. +TP_LOCALLAB_WAVLEV;Vervaag per niveau +TP_LOCALLAB_WAVMASK;Lokaal contrast +TP_LOCALLAB_WAVMASK_TOOLTIP;Gebruikt wavelets om het lokale contrast van het masker te wijzigen en de structuur (huid, gebouwen, etc.) te versterken of te verzwakken. +TP_LOCALLAB_WEDIANHI;Mediaan Hi +TP_LOCALLAB_WHITE_EV;Wit LW +TP_LOCALLAB_ZCAMFRA;ZCAM Beeldaanpassingen +TP_LOCALLAB_ZCAMTHRES;Haal hoge data op +TP_LOCAL_HEIGHT;Onder +TP_LOCAL_HEIGHT_T;Boven +TP_LOCAL_WIDTH;Rechts +TP_LOCAL_WIDTH_L;Links +TP_LOCRETI_METHOD_TOOLTIP;Laag = Versterk weinig licht.\nUniform = Gelijkmatig verdeeld.\nHoog = Versterk sterk licht. TP_METADATA_EDIT;Pas wijzigingen toe TP_METADATA_MODE;Metadata kopieermodus TP_METADATA_STRIP;Strip alle metadata @@ -1790,21 +3717,42 @@ TP_NEUTRAL;Terugzetten 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 +TP_PCVIGNETTE_LABEL;Vignetteringsfilter 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_CAMERA_CROP_FACTOR;Bijsnijdfactor +TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Brandpuntsafstand +TP_PERSPECTIVE_CAMERA_FRAME;Correctie +TP_PERSPECTIVE_CAMERA_PITCH;Verticaal +TP_PERSPECTIVE_CAMERA_ROLL;Rotatie +TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontale verschuiving +TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Verticale verschuiving +TP_PERSPECTIVE_CAMERA_YAW;Horizontaal +TP_PERSPECTIVE_CONTROL_LINES;Controlelijnen +TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Ctrl+slepen: Teken nieuwe lijn\nRechtsklik: Verwijder lijn +TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP;Minimaal twee horizontale of twee verticale controlelijnen zijn vereist. TP_PERSPECTIVE_HORIZONTAL;Horizontaal TP_PERSPECTIVE_LABEL;Perspectief +TP_PERSPECTIVE_METHOD;Methode +TP_PERSPECTIVE_METHOD_CAMERA_BASED;Camera-gebaseerd +TP_PERSPECTIVE_METHOD_SIMPLE;Simpel +TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Post-correctie aanpassingen +TP_PERSPECTIVE_PROJECTION_PITCH;Verticaal +TP_PERSPECTIVE_PROJECTION_ROTATE;Rotatie +TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Horizontale verschuiving +TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Verticale verschuiving +TP_PERSPECTIVE_PROJECTION_YAW;Horizontaal +TP_PERSPECTIVE_RECOVERY_FRAME;Herstel TP_PERSPECTIVE_VERTICAL;Verticaal TP_PFCURVE_CURVEEDITOR_CH;Tint TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Bepaalt de mate van verzachten per kleur. Hoger = meer, lager = minder. -TP_PREPROCESS_DEADPIXFILT;Dode pixels filter +TP_PREPROCESS_DEADPIXFILT;Dodepixels-filter TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Onderdrukt dode pixels. TP_PREPROCESS_GREENEQUIL;Groenbalans -TP_PREPROCESS_HOTPIXFILT;Hete pixels filter +TP_PREPROCESS_HOTPIXFILT;Hetepixels-filter TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Onderdrukt hete pixels. TP_PREPROCESS_LABEL;Voorbewerking TP_PREPROCESS_LINEDENOISE;Lijnruisfilter @@ -1814,16 +3762,20 @@ 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_PREPROCESS_PDAFLINESFILTER;PDAF-lijnfilter +TP_PREPROCWB_LABEL;Pre-proces witbalans +TP_PREPROCWB_MODE;Modus +TP_PREPROCWB_MODE_AUTO;Auto +TP_PREPROCWB_MODE_CAMERA;Camera 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_PRSHARPENING_TOOLTIP;Verscherp na verkleinen. Werkt alleen als verkleinen actief is en de 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_AUTOIT_TOOLTIP;Deze schuif is alleen actief als Automatische CA-correctie is aangevinkt.\nAuto-correctie werkt conservatief en corrigeert meestal niet alle chromatische afwijkingen.\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 +TP_RAWCACORR_LABEL;Corrigeer chromatische afwijking TP_RAWEXPOS_BLACK_0;Groen 1 (leidend) TP_RAWEXPOS_BLACK_1;Rood TP_RAWEXPOS_BLACK_2;Blauw @@ -1831,77 +3783,81 @@ TP_RAWEXPOS_BLACK_3;Groen 2 TP_RAWEXPOS_BLACK_BLUE;Blauw TP_RAWEXPOS_BLACK_GREEN;Groen TP_RAWEXPOS_BLACK_RED;Rood -TP_RAWEXPOS_LINEAR;Witpunt Correctie +TP_RAWEXPOS_LINEAR;Witpuntcorrectie 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_1PASSMEDIUM;1 keer (Markesteijn) +TP_RAW_2PASS;1-gang+snel +TP_RAW_3PASSBEST;3 gangen (Markesteijn) +TP_RAW_4PASS;3-gangen+snel TP_RAW_AHD;AHD TP_RAW_AMAZE;AMaZE +TP_RAW_AMAZEBILINEAR;AMaZE+Bilineair TP_RAW_AMAZEVNG4;AMaZE+VNG4 TP_RAW_BORDER;Rand TP_RAW_DCB;DCB -TP_RAW_DCBENHANCE;DCB Verbetering +TP_RAW_DCBBILINEAR;DCB+Bilineair +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_DMETHOD_PROGRESSBAR_REFINE;Demozaïekverfijning... +TP_RAW_DMETHOD_TOOLTIP;IGV en LMMSE zijn speciaal bedoeld voor afbeeldingen met hoge ISO-waarden +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 veel ruis bevat, 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;Contrastdrempel TP_RAW_EAHD;EAHD TP_RAW_FALSECOLOR;Stapgrootte kleurfoutonderdrukking TP_RAW_FAST;Snel TP_RAW_HD;Drempel -TP_RAW_HD_TOOLTIP;Lagere waarden maken Hete/Dode pixel detectie agressiever, maar valse positieven kunnen leiden tot meer artefacten. Als er artefacten verschijnen bij het gebruik van de Hete/Dode Pixel Filters verminder dan geleidelijk de drempelwaarde totdat ze verdwijnen. +TP_RAW_HD_TOOLTIP;Lagere waarden maken hete/dodepixel-detectie agressiever, maar valse positieven kunnen leiden tot meer onregelmatigheden. Als er onregelmatigheden verschijnen bij het gebruik van de hete/dodepixel-filters, verminder dan geleidelijk de drempelwaarde tot ze verdwijnen. 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_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ïekmethode dan Pixel Shift gebruikt wordt, selecteert deze de gebruikte sub-afbeelding.\n\nBij gebruik van de Pixel Shift demozaïekmethode op een Pixel Shift RAW worden alle sub-afbeeldingen gebruikt en dit selecteert de sub-afbeelding die gebruikt wordt voor bewegende gebieden. TP_RAW_LABEL;Demozaïekproces TP_RAW_LMMSE;LMMSE -TP_RAW_LMMSEITERATIONS;LMMSE Verbetering Stappen -TP_RAW_LMMSE_TOOLTIP;Toevoegen gamma (stap 1), mediaan (stappen 2-4), en verfijnen (stappen 5-6) om artefacten te verwijderen en de signaal/ruis ratio te verbeteren. +TP_RAW_LMMSEITERATIONS;LMMSE-verbeterstappen +TP_RAW_LMMSE_TOOLTIP;Toevoegen gamma (stap 1), mediaan (stappen 2-4) en verfijnen (stappen 5-6) om onregelmatigheden te verwijderen en de signaal/ruis-ratio te verbeteren. TP_RAW_MONO;Mono -TP_RAW_NONE;Geen (Toont sensor patroon) -TP_RAW_PIXELSHIFT;Pixel Verschuiven +TP_RAW_NONE;Geen (Toont sensorpatroon) +TP_RAW_PIXELSHIFT;Pixel Shift +TP_RAW_PIXELSHIFTAVERAGE;Gebruik gemiddelde voor bewegende delen +TP_RAW_PIXELSHIFTAVERAGE_TOOLTIP;Gebruik het gemiddelde van alle frames in plaats van het geselecteerde frame voor gebieden met beweging.\nGeeft een bewegend effect op langzaam bewegende (overlappende) objecten. 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_PIXELSHIFTEQUALBRIGHT;Balanceer 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_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Ingeschakeld: balanceer elk RGB-kanaal afzonderlijk.\nUitgeschakeld: balanceer alle kanalen evenveel. +TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Balanceer de helderheid van de frames ten opzichte van de helderheid van het geselecteerde frame.\nAls er overbelichte gebieden zijn in de frames, selecteer dan het helderste frame om een magenta kleurzweem te vermijden of selecteer bewegingscorrectie. TP_RAW_PIXELSHIFTGREEN;Controleer groene kanaal voor beweging TP_RAW_PIXELSHIFTHOLEFILL;Vul holtes in verschuivingsmasker TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Vul holtes in het verschuivingsmasker op TP_RAW_PIXELSHIFTMEDIAN;Mediaan -TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Gebruik mediaan voor alle frames inplaats van alleen het geselecteerd frame voor gebieden met beweging.\nVerwijder objecten die voorkomen op verschillende plekken in alle frames.\nGeeft bewegingseffect voor langzaam bewegende (overlappende) objecten. +TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Gebruik mediaan voor alle frames inplaats van alleen het geselecteerde frame voor gebieden met beweging.\nVerwijder objecten die voorkomen op verschillende plekken in alle frames.\nGeeft bewegingseffect voor langzaam bewegende (overlappende) objecten. TP_RAW_PIXELSHIFTMM_AUTO;Automatisch TP_RAW_PIXELSHIFTMM_CUSTOM;Eigen TP_RAW_PIXELSHIFTMM_OFF;Uit -TP_RAW_PIXELSHIFTMOTION;Beweging detectie niveau (vervallen) -TP_RAW_PIXELSHIFTMOTIONMETHOD;Beweging Correctie -TP_RAW_PIXELSHIFTNONGREENCROSS;Controleer rood/blauw kanaal voor beweging +TP_RAW_PIXELSHIFTMOTIONMETHOD;Bewegingscorrectie +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_PIXELSHIFTSIGMA_TOOLTIP;De standaardstraal van 1,0 is goed voor normale ISO-waarden. Verhoog de waarde voor hogere ISO.\n5,0 is een goed startpunt voor afbeeldingen met hoge ISO-waarden.\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_RCDBILINEAR;RCD+Bilineair 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_SENSOR_BAYER_LABEL;Sensor met Bayer-matrix +TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-gang geeft het beste resultaat (aanbevolen voor lage ISO-waarden)\n1-gang geeft hetzelfde resultaat als 3-gang voor hoge ISO-afbeeldingen en is sneller. +TP_RAW_SENSOR_XTRANS_LABEL;Sensor met X-Transmatrix TP_RAW_VNG4;VNG4 TP_RAW_XTRANS;X-Trans TP_RAW_XTRANSFAST;Snelle X-Trans @@ -1914,87 +3870,91 @@ TP_RESIZE_H;H: TP_RESIZE_HEIGHT;Hoogte TP_RESIZE_LABEL;Grootte aanpassen TP_RESIZE_LANCZOS;Lanczos +TP_RESIZE_LE;Lange zijde: +TP_RESIZE_LONG;Korte zijde TP_RESIZE_METHOD;Methode: TP_RESIZE_NEAREST;Dichtstbij TP_RESIZE_SCALE;Schaal +TP_RESIZE_SE;Korte zijde: +TP_RESIZE_SHORT;Korte zijde TP_RESIZE_SPECIFY;Specificeer: TP_RESIZE_W;B: 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_HSL;Histogrambalans HSL +TP_RETINEX_CONTEDIT_LAB;Histogrambalans L*a*b* +TP_RETINEX_CONTEDIT_LH;Tintbalans 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_CD_TOOLTIP;Luminantie volgens luminantie L=f(L).\nCorrigeert ruwe data om halo's en onregelmatigheden te verminderen. TP_RETINEX_CURVEEDITOR_LH;Sterkte=f(H) -TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Sterkte volgens tint Sterkte=f(H)\nDeze curve wijzigt ook chroma wanneer de "Hooglicht" retinex methode wordt gebruikt. +TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Sterkte volgens tint, Sterkte=f(H).\nDeze curve wijzigt ook chroma wanneer de Retinex-methode Hoge lichten wordt gebruikt. TP_RETINEX_CURVEEDITOR_MAP;L=f(L) -TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;Deze curve kan zowel alleen worden gebruikt of in combinatie met een Gaussiaans masker of wavelet masker.\nHou rekening met artefacten! +TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;Deze curve kan zowel losstaand worden gebruikt of in combinatie met een Gaussiaans of wavelet-masker.\nHoud rekening met onregelmatigheden. 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_GAINOFFS;Versterking en verschuiving (helderheid) +TP_RETINEX_GAINTRANSMISSION;Transmissieversterking +TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Versterk of verzwak de transmissiemap om de gewenste luminantie te verkrijgen.\nDe x-as is de transmissie.\nDe y-as is de versterking. TP_RETINEX_GAMMA;Gamma TP_RETINEX_GAMMA_FREE;Vrij TP_RETINEX_GAMMA_HIGH;Hoog TP_RETINEX_GAMMA_LOW;Laag TP_RETINEX_GAMMA_MID;Midden TP_RETINEX_GAMMA_NONE;Geen -TP_RETINEX_GAMMA_TOOLTIP;Hersteld tinten door gamma voor en na Retinex toe te passen. Verschilt van Retinex curves en andere curves (Lab, Exposure, etc.). -TP_RETINEX_GRAD;Transmissie verloop -TP_RETINEX_GRADS;Sterkte verloop +TP_RETINEX_GAMMA_TOOLTIP;Herstel tinten door gamma voor en na Retinex toe te passen. Verschilt van Retinex-curves en andere curves (Lab, Exposure, etc.). +TP_RETINEX_GRAD;Transmissieverloop +TP_RETINEX_GRADS;Sterkteverloop TP_RETINEX_GRADS_TOOLTIP;Indien schuifbalk=0: alle herhalingen zijn gelijk.\nIndien > 0 Sterkte verminderd en herhaling vergroot, en omgekeerd. TP_RETINEX_GRAD_TOOLTIP;Indien schuifbalk=0: alle herhalingen zijn gelijk.\nIndien > 0 Variantie en Drempel worden verkleind als herhaling toeneemt, en omgekeerd. TP_RETINEX_HIGH;Hoog -TP_RETINEX_HIGHLIG;Hooglicht -TP_RETINEX_HIGHLIGHT;Drempel hooglicht -TP_RETINEX_HIGHLIGHT_TOOLTIP;Versterkt de werking van de Hooglicht methode.\nMogelijk moet de "Naburige pixels" worden aangepast en moet de "Witpunt Correctie" in de Raw tab -> Raw Witpuntent worden vergroot. -TP_RETINEX_HSLSPACE_LIN;HSL-Linear +TP_RETINEX_HIGHLIG;Hoge lichten +TP_RETINEX_HIGHLIGHT;Drempel hoge lichten +TP_RETINEX_HIGHLIGHT_TOOLTIP;Versterkt de werking van de Hoge lichten-methode.\nMogelijk moet Naburige pixels worden aangepast en moet de Witpuntcorrectie in de Raw-tab -> Raw Witpunten worden vergroot. +TP_RETINEX_HSLSPACE_LIN;HSL-Lineair TP_RETINEX_HSLSPACE_LOG;HSL-Logaritmisch -TP_RETINEX_ITER;Herhalingen (Tonemapping) -TP_RETINEX_ITERF;Tonemapping -TP_RETINEX_ITER_TOOLTIP;Simuleert tonemapping.\nHoge waarden verlengen de bewerkingstijd. +TP_RETINEX_ITER;Herhalingen (Toonmappen) +TP_RETINEX_ITERF;Toonmappen +TP_RETINEX_ITER_TOOLTIP;Simuleert toonmappen.\nHoge waarden verlengen de bewerkingstijd. 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) -TP_RETINEX_MAP_METHOD_TOOLTIP;Gebruik het masker dat is aangemaakt door de bovenstaande Gausiaanse functie (Straal, Methode) om halo’s en artefacten te verminderen.\n\nCurve: past een diagonale contrast curve toe op het masker.\nHou rekening met artefacten!\n\n Gausiaans: genereerd en gebruikt een ‘Gausiaanse blur’ op het masker.\nVerscherpen: genereert en gebruikt een ‘wavelet’ op het masker.\nLangzaam. +TP_RETINEX_MAP_MAPP;Scherptemasker (wavelet gedeeltelijk) +TP_RETINEX_MAP_MAPT;Scherptemasker (wavelet totaal) +TP_RETINEX_MAP_METHOD_TOOLTIP;Gebruik het masker dat is aangemaakt door de bovenstaande Gausiaanse functie (Straal, Methode) om halo’s en onregelmatigheden te verminderen.\n\nCurve: past een diagonale contrastcurve toe op het masker.\nHou rekening met onregelmatigheden!\n\nGausiaans: genereert en gebruikt een Gausiaanse vervaging op het masker.\nVerscherpen: genereert en gebruikt een wavelet op het masker.\nLangzaam. TP_RETINEX_MAP_NONE;Geen -TP_RETINEX_MEDIAN;Transmissie mediaan filter +TP_RETINEX_MEDIAN;Transmissiemediaan-filter TP_RETINEX_METHOD;Methode -TP_RETINEX_METHOD_TOOLTIP;Laag = versterk lage lichten,\nUniform = gelijkmatig,\nHoog = versterk hoge lichten,\nHooglicht = verwijder magenta in hooglicht. -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_METHOD_TOOLTIP;Laag: schaduwen ophelderen,\nUniform: gelijkmatig,\nHoog: versterk hoge lichten,\nHoge lichten: verwijder magenta in hoge lichten. +TP_RETINEX_MLABEL;Teruggeplaatst sluiervrij Min=%1 Max=%2 +TP_RETINEX_MLABEL_TOOLTIP;De waarden zouden dichtbij Min=0 en Max=32768 (log-modus) moeten liggen, maar andere waarden zijn mogelijk. Pas 'Kap herstelde data (versterking)' en 'Verschuiving' aan om te normaliseren. \nHerstelt beeldgegevens zonder menging. TP_RETINEX_NEIGHBOR;Naburige pixels -TP_RETINEX_NEUTRAL;Beginwaarde -TP_RETINEX_NEUTRAL_TOOLTIP;Zet alles terug naar de beginwaarde. +TP_RETINEX_NEUTRAL;Beginwaarden +TP_RETINEX_NEUTRAL_TOOLTIP;Zet alles terug naar de beginwaarden. 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. +TP_RETINEX_SCALES_TOOLTIP;Als schuifbalk = 0, dan zijn alle herhalingen gelijk.\nIndien > 0 dan worden schaal en straal verkleind als de herhaling toeneemt, en omgekeerd. TP_RETINEX_SETTINGS;Instellingen TP_RETINEX_SKAL;Schaal -TP_RETINEX_SLOPE;Vrij gamma helling +TP_RETINEX_SLOPE;Helling vrij gamma TP_RETINEX_STRENGTH;Sterkte TP_RETINEX_THRESHOLD;Drempel -TP_RETINEX_THRESHOLD_TOOLTIP;Beperkt in/uit.\nIn = afbeelding,\nUit = afbeeldings gauss. +TP_RETINEX_THRESHOLD_TOOLTIP;Beperkt in/uit.\nIn = bron,\nUit = afbeeldings-gauss. TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Gemiddeld=%3 Sigma=%4 TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 -TP_RETINEX_TLABEL_TOOLTIP;Transmissie resultaat.\nMin en Max worden gebruikt door Variantie.\nMeeste en Sigma\nTm=Min TM=Max van de transmissie. +TP_RETINEX_TLABEL_TOOLTIP;Transmissieresultaat.\nMin en Max worden gebruikt door Variantie.\nMeeste en Sigma\nTm=Min TM=Max van de transmissie. TP_RETINEX_TRANF;Transmissie -TP_RETINEX_TRANSMISSION;Transmissie plan -TP_RETINEX_TRANSMISSION_TOOLTIP;Transmissie volgens transmissie.\nAbscis: transmissie van negatieve waarden (min), gemiddelde, en positieve waarden (max).\nOrdinaat: versterken of verminderen. +TP_RETINEX_TRANSMISSION;Transmissiemap +TP_RETINEX_TRANSMISSION_TOOLTIP;Transmissie volgens transmissie.\nAbscis: transmissie van negatieve waarden (min), gemiddelde, en positieve waarden (max).\nOrdinaat: versterking of vermindering. TP_RETINEX_UNIFORM;Uniform TP_RETINEX_VARIANCE;Variantie TP_RETINEX_VARIANCE_TOOLTIP;Lage variantie versterkt lokaal contrast en verzadiging, maar dit kan artefacten veroorzaken. TP_RETINEX_VIEW;Proces TP_RETINEX_VIEW_MASK;Masker -TP_RETINEX_VIEW_METHOD_TOOLTIP;Standaard - Normale afbeelding.\nMasker - Toont het masker.\nOnscherp masker - Toont de afbeelding met een hoge straal.\nTransmissie - Auto/Vast - Toont de transmissie-map, voor enige actie op kontrast en helderheid.\n\nLet op: het masker komt niet overeen met de werkelijkheid, maar is versterkt om het effect beter zichtbaar te maken. +TP_RETINEX_VIEW_METHOD_TOOLTIP;Standaard - Normale weergave.\nMasker - Toont het masker.\nOnscherp masker - Toont de afbeelding met een onscherptemasker met grote straal.\nTransmissie - Auto/Vast - Toont de transmissiemap, voordat actie wordt ondernomen op contrast en helderheid.\n\nLet op: het masker komt niet overeen met de werkelijkheid, maar is versterkt om het effect beter zichtbaar te maken. TP_RETINEX_VIEW_NONE;Standaard TP_RETINEX_VIEW_TRAN;Transmissie - Auto TP_RETINEX_VIEW_TRAN2;Transmissie - Vast @@ -2003,13 +3963,13 @@ TP_RGBCURVES_BLUE;B TP_RGBCURVES_CHANNEL;Kanaal TP_RGBCURVES_GREEN;G TP_RGBCURVES_LABEL;RGB-curven -TP_RGBCURVES_LUMAMODE;Luminositeit Mode -TP_RGBCURVES_LUMAMODE_TOOLTIP;Luminositeit ModeVarieert de toewijzing van de R, G en B kanalen aan de Luminositeit van de afbeelding, zonder dat de kleur van de afbeelding wijzigt. +TP_RGBCURVES_LUMAMODE;Luminositeitsmodus +TP_RGBCURVES_LUMAMODE_TOOLTIP;LuminositeitsmodusVarieert de toewijzing van de R-, G- en B-kanalen aan de luminositeit van de afbeelding, zonder dat de kleur van de afbeelding wijzigt. TP_RGBCURVES_RED;R TP_ROTATE_DEGREE;Graden TP_ROTATE_LABEL;Roteren TP_ROTATE_SELECTLINE;Bepaal rechte lijn -TP_SAVEDIALOG_OK_TOOLTIP;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 @@ -2022,7 +3982,7 @@ 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_CONTRAST;Contrastdrempel TP_SHARPENING_EDRADIUS;Straal TP_SHARPENING_EDTOLERANCE;Randtolerantie TP_SHARPENING_HALOCONTROL;Halocontrole @@ -2040,16 +4000,31 @@ TP_SHARPENING_RLD_ITERATIONS;Herhaling TP_SHARPENING_THRESHOLD;Drempel TP_SHARPENING_USM;Onscherpmasker TP_SHARPENMICRO_AMOUNT;Hoeveelheid -TP_SHARPENMICRO_CONTRAST;Contrast drempel +TP_SHARPENMICRO_CONTRAST;Contrastdrempel 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_SPOT_COUNTLABEL;%1 punt(en) +TP_SPOT_DEFAULT_SIZE;Standaard spot-grootte +TP_SPOT_ENTRYCHANGED;Punt veranderd +TP_SPOT_HINT;Druk op deze knop om in de voorbeeldweergave te werken.\n\nOm een plek te bewerken, beweeg de muis over de witte markering die het bewerkte gebied aangeeft, zodat de bewerkingsgeometrie zichtbaar wordt.\n\nOm een plek toe te voegen, houd Ctrl ingedrukt en klik met de linkermuisknop, sleep de cirkel (de Ctrl-toets kan nu worden losgelaten) naar een bronlocatie en laat de muisknop los.\n\nOm de bron- of bestemmingsplek te verplaatsen, beweeg de muis naar het midden en sleep deze.\n\nDe binnencirkel (maximaal effectgebied) en de vervagingscirkel kunnen worden vergroot of verkleind door er met de muis overheen te bewegen (de cirkel wordt oranje) en deze te slepen (de cirkel wordt rood).\n\nWanneer de wijzigingen zijn voltooid, klikt u met de rechtermuisknop buiten een plek om de plekbewerkingsmodus te beëindigen, of klik opnieuw op deze knop. +TP_SPOT_LABEL;Verwijder vlekken TP_TM_FATTAL_AMOUNT;Hoeveelheid TP_TM_FATTAL_ANCHOR;Anker -TP_TM_FATTAL_LABEL;Dynamisch bereik compressie +TP_TM_FATTAL_LABEL;Compressie dynamisch bereik TP_TM_FATTAL_THRESHOLD;Detail +TP_TONE_EQUALIZER_BANDS;Banden +TP_TONE_EQUALIZER_BAND_0;Zwarten +TP_TONE_EQUALIZER_BAND_1;Schaduwen +TP_TONE_EQUALIZER_BAND_2;Middentonen +TP_TONE_EQUALIZER_BAND_3;Hoge lichten +TP_TONE_EQUALIZER_BAND_4;Witten +TP_TONE_EQUALIZER_DETAIL;Fijnafstemming +TP_TONE_EQUALIZER_LABEL;Toonequalizer +TP_TONE_EQUALIZER_PIVOT;Draaipunt (LW) +TP_TONE_EQUALIZER_SHOW_COLOR_MAP;Toon kleurenmap TP_VIBRANCE_AVOIDCOLORSHIFT;Vermijd kleurverschuiving TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Huidtinten @@ -2063,15 +4038,15 @@ TP_VIBRANCE_PASTELS;Pasteltinten TP_VIBRANCE_PASTSATTOG;Koppel pastel- en verzadigde tinten TP_VIBRANCE_PROTECTSKINS;Bescherm huidtinten TP_VIBRANCE_PSTHRESHOLD;Drempel pastel/verzadiging -TP_VIBRANCE_PSTHRESHOLD_SATTHRESH;Drempel Verzadiging -TP_VIBRANCE_PSTHRESHOLD_TOOLTIP;De verticale as vertegenwoordigt aan de onderkant de pastel tinten en aan de bovenkanten de verzadigde tinten.\nDe horizontale as vertegenwoordigt de verzadigde reeks. -TP_VIBRANCE_PSTHRESHOLD_WEIGTHING;Pastel/verzadigings transitie weging +TP_VIBRANCE_PSTHRESHOLD_SATTHRESH;Drempel verzadiging +TP_VIBRANCE_PSTHRESHOLD_TOOLTIP;De verticale as vertegenwoordigt pasteltinten aan de onderkant en verzadigde tinten aan de bovenkant.\nDe horizontale as vertegenwoordigt het verzadigingsbereik. +TP_VIBRANCE_PSTHRESHOLD_WEIGTHING;Gewicht pastel/verzadigingtransitie TP_VIBRANCE_SATURATED;Verzadigde tinten TP_VIGNETTING_AMOUNT;Hoeveelheid TP_VIGNETTING_CENTER;Centrum TP_VIGNETTING_CENTER_X;Centrum X TP_VIGNETTING_CENTER_Y;Centrum Y -TP_VIGNETTING_LABEL;Vignettering Correctie +TP_VIGNETTING_LABEL;Vignetteringscorrectie TP_VIGNETTING_RADIUS;Straal TP_VIGNETTING_STRENGTH;Sterkte TP_WAVELET_1;Niveau 1 @@ -2091,44 +4066,63 @@ TP_WAVELET_B2;Rest TP_WAVELET_BACKGROUND;Achtergrond TP_WAVELET_BACUR;Curve TP_WAVELET_BALANCE;Contrastbalans d/v-h -TP_WAVELET_BALANCE_TOOLTIP;Wijzigt de balans tussen de wavelet richtingen: vertikaal-horizontaal en diagonaal.\nAls contrast, chromaticiteit of 'rest' tonemapping actief zijn, wordt het effect als gevolg van de balans versterkt. -TP_WAVELET_BALCHRO;Chroma balans -TP_WAVELET_BALCHRO_TOOLTIP;De 'Contrastbalans' curve en schuifbalk wijzigen ook de chromaticiteit balans. +TP_WAVELET_BALANCE_TOOLTIP;Wijzigt de balans tussen de wavelet-richtingen: vertikaal-horizontaal en diagonaal.\nAls tonemapping in contrast, chromaticiteit of residueel actief zijn, wordt het effect als gevolg van de balans versterkt. +TP_WAVELET_BALCHRO;Chroma-balans +TP_WAVELET_BALCHROM;Equalizer kleur +TP_WAVELET_BALCHRO_TOOLTIP;De Contrastbalans-curve en schuifbalk wijzigen ook de chromaticiteit-balans. +TP_WAVELET_BALLUM;Ruisonderdrukkings-equalizer wit-zwart TP_WAVELET_BANONE;Geen TP_WAVELET_BASLI;Schuifbalk -TP_WAVELET_BATYPE;Balans methode +TP_WAVELET_BATYPE;Balansmethode +TP_WAVELET_BL;Vervagingsniveaus +TP_WAVELET_BLCURVE;Vervaag per niveau +TP_WAVELET_BLURFRAME;Vervaag +TP_WAVELET_BLUWAV;Versterkingsrespons 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_CB_TOOLTIP;Met hoge waarden kun je speciale effecten creëren, gelijkend op wat je met de Chroma-module kunt bereiken, maar nu gericht op het residuele beeld. Met kleinere waarden kun je handmatig de witbalans corrigeren. TP_WAVELET_CCURVE;Lokaal contrast TP_WAVELET_CH1;Alle chroma's TP_WAVELET_CH2;Pastel - Verzadigd -TP_WAVELET_CH3;Koppel contrast niveaus +TP_WAVELET_CH3;Koppel contrastniveaus TP_WAVELET_CHCU;Curve -TP_WAVELET_CHR;Koppel Chroma aan contrast +TP_WAVELET_CHR;Koppel Chroma aan Contrast TP_WAVELET_CHRO;Verzadigd - Pastel -TP_WAVELET_CHRO_TOOLTIP;Begrens tussen pastel en verzadigd\n 1-x niveau verzadigd\n x-9 niveau pastel -TP_WAVELET_CHR_TOOLTIP;Wijzig chroma in combinatie met Contrast niveaus +TP_WAVELET_CHROFRAME;Vervaag chrominantie +TP_WAVELET_CHROMAFRAME;Chroma +TP_WAVELET_CHROMCO;Chrominantie grof +TP_WAVELET_CHROMFI;Chrominantie fijn +TP_WAVELET_CHRO_TOOLTIP;Begrens tussen pastel en verzadigd\n1-x niveau verzadigd\nx-9 niveau pastel +TP_WAVELET_CHRWAV;Vervaging chroma +TP_WAVELET_CHR_TOOLTIP;Wijzig chroma in combinatie met contrastniveaus TP_WAVELET_CHSL;Schuifbalken -TP_WAVELET_CHTYPE;Chrominantie methode -TP_WAVELET_COLORT;Dekking Rood-Groen Niveau +TP_WAVELET_CHTYPE;Chrominantiemethode +TP_WAVELET_CLA;Klaarheid (Clarity) +TP_WAVELET_CLARI;Scherptemasker en Klaarheid (Clarity) +TP_WAVELET_COLORT;Dekking Rood-Groen niveau TP_WAVELET_COMPCONT;Contrast +TP_WAVELET_COMPEXPERT;Geavanceerd TP_WAVELET_COMPGAMMA;Compressie gamma -TP_WAVELET_COMPGAMMA_TOOLTIP;Wijzig de gamma van de 'rest afbeelding' zodat data en histogram gelijk kunnen worden gemaakt. -TP_WAVELET_COMPTM;Tonemapping -TP_WAVELET_CONTEDIT;'Na' contrast curve -TP_WAVELET_CONTR;Gamut - controle +TP_WAVELET_COMPGAMMA_TOOLTIP;Door het gamma van het residuele beeld te wijzigen, kun je data en histogram in balans brengen. +TP_WAVELET_COMPLEXLAB;Complexiteit +TP_WAVELET_COMPLEX_TOOLTIP;Standaard: toont minder gereedschappen maar voldoende voor de meeste bewerkingen.\nGeavanceerd: toont alle gereedschappen voor geavanceerde bewerkingen. +TP_WAVELET_COMPNORMAL;Standaard +TP_WAVELET_COMPTM;Toonmappen +TP_WAVELET_CONTEDIT;'Na'-contrastcurve +TP_WAVELET_CONTFRAME;Contrast - Compressie +TP_WAVELET_CONTR;Kleurenscala - controle TP_WAVELET_CONTRA;Contrast -TP_WAVELET_CONTRAST_MINUS;Contrast - -TP_WAVELET_CONTRAST_PLUS;Contrast + -TP_WAVELET_CONTRA_TOOLTIP;Wijzigt het contrast van de 'rest afbeelding'. -TP_WAVELET_CTYPE;Chrominantie sterkte -TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Wijzigt lokaal contrast als een functie van het oorspronkelijke lokale contrast (abscis).\nLage abscis waarden vertegenwoordigen klein lokaal contrast (werkelijke waarden rond 10..20).\n50% abscis vertegenwoordigd gemiddeld lokaal contrast (werkelijke waarden rond 100..300).\n66% abscis vertegenwoordigd standaard deviatie van lokaal contrast (werkelijke waarden rond 300..800).\n100% abscis vertegenwoordigd maximaal lokaal contrast (werkelijke waarden rond 3000..8000). -TP_WAVELET_CURVEEDITOR_CH;Contrast niveau=f(Hue) -TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Wijzigt het contrast van elk niveau als een functie van hue.\nZorg er voor dat de wijzigingen die zijn gemaakt bij de Gamut Hue toepassing niet worden overschreven.\nDe curve werkt alleen als de 'wavelet contrast niveau schuifbalken' groter dan nul zijn. +TP_WAVELET_CONTRAST_MINUS;< Contrast +TP_WAVELET_CONTRAST_PLUS;Contrast > +TP_WAVELET_CONTRA_TOOLTIP;Wijzigt het contrast van de residuele afbeelding. +TP_WAVELET_CTYPE;Chrominantiesterkte +TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Uitgeschakeld als zoom > ~300% +TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Wijzigt lokaal contrast als een functie van het oorspronkelijke lokale contrast (abscis).\nLage absciswaarden vertegenwoordigen weinig lokaal contrast (werkelijke waarden rond 10..20).\n50% abscis vertegenwoordigt gemiddeld lokaal contrast (werkelijke waarden rond 100..300).\n66% abscis vertegenwoordigt de standaarddeviatie van lokaal contrast (werkelijke waarden rond 300..800).\n100% abscis vertegenwoordigt maximaal lokaal contrast (werkelijke waarden rond 3000..8000). +TP_WAVELET_CURVEEDITOR_CH;Contrastniveau=f(Tint) +TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Wijzigt het contrast van elk niveau als een functie van tint.\nZorg er voor dat de wijzigingen die zijn gemaakt bij de Gamut Tint-toepassing niet worden overschreven.\nDe curve werkt alleen als de Wavelet contrastniveauschuifbalken groter zijn dan nul. TP_WAVELET_CURVEEDITOR_CL;L -TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Contrast luminantie curve. Wordt uitgevoerd aan het einde van de wavelet niveau behandeling. +TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Contrast luminantiecurve. Wordt uitgevoerd aan het einde van de Wavelet niveaubehandeling. TP_WAVELET_CURVEEDITOR_HH;HH -TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Wijzigt de rest van de afbeelding 's tint als een functie van tint. +TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Wijzigt de tint van de residuele afbeelding als functie van tint. TP_WAVELET_DALL;Alle richtingen TP_WAVELET_DAUB;Randen TP_WAVELET_DAUB2;D2 - laag @@ -2136,62 +4130,101 @@ TP_WAVELET_DAUB4;D4 - standaard TP_WAVELET_DAUB6;D6 - standaard plus TP_WAVELET_DAUB10;D10 - medium TP_WAVELET_DAUB14;D14 - hoog -TP_WAVELET_DAUB_TOOLTIP;Wijzigt Daubechies coëfficiënt:\nD4 = Standaard,\nD14 = Geeft meestal het beste resultaat met een iets langere verwerkingstijd.\n\nBeïnvloed zowel rand detectie als het algemen resultaat van de eerste niveau´s. De kwaliteit is niet strikt gerelateerd aan deze coëfficiënt en kan variëren per afbeelding en toepassing. -TP_WAVELET_DONE;Richting: Vertikaal -TP_WAVELET_DTHR;Richting: Diagonaal -TP_WAVELET_DTWO;Richting: Horizontaal +TP_WAVELET_DAUBLOCAL;Wavelet Rand-performance +TP_WAVELET_DAUB_TOOLTIP;Wijzigt de Daubechies-coëfficiënten:\nD4 = Standaard,\nD14 = Geeft meestal het beste resultaat met een iets langere verwerkingstijd.\n\nBeïnvloed zowel randdetectie als het algemene resultaat van de eerste niveaus. De kwaliteit is niet strikt gerelateerd aan deze coëfficiënt en kan variëren per afbeelding en toepassing. +TP_WAVELET_DEN5THR;Begeleid drempel +TP_WAVELET_DENCURV;Curve +TP_WAVELET_DENL;Correctie structuur +TP_WAVELET_DENLH;Begeleid drempel niveaus 1-4 +TP_WAVELET_DENLOCAL_TOOLTIP;Gebruik een curve om de ruisonderdrukking te sturen volgens het lokale contrast.\nDe gebieden worden ontdaan van ruis, de structuren blijven behouden. +TP_WAVELET_DENMIX_TOOLTIP;De referentiewaarde van het lokale contrast die door het Begeleid filter wordt gebruikt.\nAfhankelijk van de afbeelding kunnen de resultaten variëren. Dit hangt af van of de ruis wordt gemeten voor of na de ruisonderdrukking. Deze vier keuzes stellen u in staat om verschillende combinaties van de originele en gewijzigde (gereduceerde ruis) afbeeldingen te beoordelen om het beste compromis te vinden. +TP_WAVELET_DENOISE;Gids curve gebaseerd op Lokaal contrast +TP_WAVELET_DENOISEGUID;Begeleide drempel gebaseerd op tint +TP_WAVELET_DENOISEH;Hoge niveaus curve Lokaal contrast +TP_WAVELET_DENOISEHUE;Ruisonderdrukking Tint-equalizer +TP_WAVELET_DENQUA;Modus +TP_WAVELET_DENSIGMA_TOOLTIP;Wijzigt de vorm van de gids +TP_WAVELET_DENSLI;Schuif +TP_WAVELET_DENSLILAB;Methode +TP_WAVELET_DENWAVGUID_TOOLTIP;Gebruikt tint om de actie van het begeleid filter te verminderen of te vermeerderen +TP_WAVELET_DENWAVHUE_TOOLTIP;Versterk of verminder ruisvermindering afhankelijk van de kleur +TP_WAVELET_DETEND;Details +TP_WAVELET_DIRFRAME;Directioneel contrast +TP_WAVELET_DONE;Verticaal +TP_WAVELET_DTHR;Diagonaal +TP_WAVELET_DTWO;Horizontaal TP_WAVELET_EDCU;Curve +TP_WAVELET_EDEFFECT;Versterkingsrespons +TP_WAVELET_EDEFFECT_TOOLTIP;Deze schuif selecteert het bereik van contrastwaarden waarop het volledige effect van elke aanpassing zal worden toegepast. TP_WAVELET_EDGCONT;Lokaal contrast -TP_WAVELET_EDGCONT_TOOLTIP;Schuif de punten naar links om het contrast te verminderen. Naar rechts schuiven vergroot het contrast.\nLinksonder, Linksboven, Rechtsboven, Rechtsonder vertegenwoordigen respectievelijk lokaal contast voor lage waarden, gemiddeld, gemiddeld+stdev, maximum. +TP_WAVELET_EDGCONT_TOOLTIP;Schuif de punten naar links om het contrast te verminderen, naar rechts vergroot het contrast.\nLinksonder, Linksboven, Rechtsboven, Rechtsonder vertegenwoordigen respectievelijk lokaal contast voor lage waarden, gemiddeld, gemiddeld+stdev en maximum. TP_WAVELET_EDGE;Randen verscherpen (Luminantie) -TP_WAVELET_EDGEAMPLI;Basis versterking -TP_WAVELET_EDGEDETECT;Gradiënt gevoeligheid +TP_WAVELET_EDGEAMPLI;Basisversterking +TP_WAVELET_EDGEDETECT;Gradiëntgevoeligheid TP_WAVELET_EDGEDETECTTHR;Drempel laag (ruis) TP_WAVELET_EDGEDETECTTHR2;Drempel hoog (detectie) -TP_WAVELET_EDGEDETECTTHR_TOOLTIP;Wijzigt de rand detectie. Bijvoorbeeld om randverscherping te voorkomen bij fijne details zoals ruis in de lucht. +TP_WAVELET_EDGEDETECTTHR_TOOLTIP;Wijzigt de randdetectie. Bijvoorbeeld om randverscherping te voorkomen bij fijne details zoals ruis in de lucht. TP_WAVELET_EDGEDETECT_TOOLTIP;Beweeg de schuifbalk naar rechts om de randgevoeligheid te vergroten. Dit wijzigt lokaal contrast, randscherpte en ruis. TP_WAVELET_EDGESENSI;Randgevoeligheid -TP_WAVELET_EDGREINF_TOOLTIP;Versterk of verminder de aktie van het eerste niveau en doe het tegenovergestelde voor het tweede niveau en laat de rest ongewijzigd. +TP_WAVELET_EDGREINF_TOOLTIP;Versterk of verminder de actie van het eerste niveau en doe het tegenovergestelde voor het tweede niveau; laat de rest ongewijzigd. TP_WAVELET_EDGTHRESH;Drempel TP_WAVELET_EDGTHRESH_TOOLTIP;Wijzigt de interactie tussen de eerste niveaus en de andere niveaus. Hoe hoger de drempel hoe meer de actie is gecentreerd op de eerste niveaus. Wees voorzichtig met negatieve waarden. Deze versterken de hogere niveaus en kunnen artefacten veroorzaken. TP_WAVELET_EDRAD;Straal -TP_WAVELET_EDRAD_TOOLTIP;Deze straalaanpassing verschilt erg van die in de andere verscherpings tools. De waarde wordt vergeleken met elk niveau op basis van een complexe functie. In dit geval heeft zelfs een nul waarde effect. +TP_WAVELET_EDRAD_TOOLTIP;Deze straalaanpassing verschilt erg van die in de andere verscherpingsgereedschappen. De waarde wordt vergeleken met elk niveau op basis van een complexe functie. In dit geval heeft zelfs een nulwaarde effect. TP_WAVELET_EDSL;Drempel schuifbalk -TP_WAVELET_EDTYPE;Lokaal contrast methode +TP_WAVELET_EDTYPE;Lokaal contrastmethode TP_WAVELET_EDVAL;Waarde TP_WAVELET_FINAL;Finale Bewerking +TP_WAVELET_FINCFRAME;Finaal lokaal contrast TP_WAVELET_FINEST;fijn -TP_WAVELET_HIGHLIGHT;Hoge lichten: Luminantie Reeks (0..100) +TP_WAVELET_FINTHR_TOOLTIP;Gebruikt lokaal contrast om de werking van het Begeleid filter te verminderen of te versterken. +TP_WAVELET_GUIDFRAME;Uiteindelijke verzachting (begeleid filter) +TP_WAVELET_HIGHLIGHT;Hoge lichten: Luminantiereeks (0..100) TP_WAVELET_HS1;Alle luminanties -TP_WAVELET_HS2;Hoge lichten/Schaduwen +TP_WAVELET_HS2;Hoge lichten/schaduwen TP_WAVELET_HUESKIN;Tint reeks (huid) -TP_WAVELET_HUESKIN_TOOLTIP;De laagste punten vormen het begin van de transitie zone, en de bovenste punten het einde. Boven is het effect maximaal.\n\nAls het gebied aanzienlijk moet worden gewijzigd, of als er artefacten ontstaan, dan is de witbalans incorrect. +TP_WAVELET_HUESKIN_TOOLTIP;De laagste punten vormen het begin van de transitiezone en de bovenste punten het einde. Boven is het effect maximaal.\n\nAls het gebied aanzienlijk moet worden gewijzigd, of als er artefacten ontstaan, dan is de witbalans incorrect. TP_WAVELET_HUESKY;Tint Reeks (lucht) -TP_WAVELET_HUESKY_TOOLTIP;De laagste punten vormen het begin van de transitie zone, en de bovenste punten het einde. Boven is het effect maximaal.\n\nAls het gebied aanzienlijk moet worden gewijzigd, of als er artefacten ontstaan, dan is de witbalans incorrect. -TP_WAVELET_ITER;Balans niveau +TP_WAVELET_HUESKY_TOOLTIP;De laagste punten vormen het begin van de transitiezone en de bovenste punten het einde. Boven is het effect maximaal.\n\nAls het gebied aanzienlijk moet worden gewijzigd, of als er artefacten ontstaan, dan is de witbalans incorrect. +TP_WAVELET_ITER;Balansniveau TP_WAVELET_ITER_TOOLTIP;Links: verhoog lage niveaus en verlaag hoge niveaus.\nRechts: verlaag lage niveaus en verhoog hoge niveaus. -TP_WAVELET_LABEL;Wavelet niveaus +TP_WAVELET_LABEL;Wavelet-niveaus +TP_WAVELET_LABGRID_VALUES;Hoog(a)=%1 Hoog(b)=%2\nLaag(a)=%3 Laag(b)=%4 TP_WAVELET_LARGEST;grof TP_WAVELET_LEVCH;Chromaticiteit +TP_WAVELET_LEVDEN;Niveau 5-6 ruisvermindering TP_WAVELET_LEVDIR_ALL;Alle niveaus in alle richtingen TP_WAVELET_LEVDIR_INF;Onder of gelijk aan het niveau -TP_WAVELET_LEVDIR_ONE;Eén Niveau +TP_WAVELET_LEVDIR_ONE;Eén niveau TP_WAVELET_LEVDIR_SUP;Boven het niveau -TP_WAVELET_LEVELS;Wavelet niveaus -TP_WAVELET_LEVELS_TOOLTIP;Kies het aantal detail niveaus. Meer niveaus vereisen meer RAM en de verwerking duurt langer. +TP_WAVELET_LEVELHIGH;Straal 5-6 +TP_WAVELET_LEVELLOW;Straal 1-4 +TP_WAVELET_LEVELS;Wavelet-niveaus +TP_WAVELET_LEVELSIGM;Straal +TP_WAVELET_LEVELS_TOOLTIP;Kies het aantal detailniveaus. Meer niveaus vereisen meer RAM en de verwerking duurt langer. TP_WAVELET_LEVF;Contrast +TP_WAVELET_LEVFOUR;Niveau 5-6 ruisvermindering en begeleide drempel TP_WAVELET_LEVLABEL;Voorbeeld maximum mogelijke niveaus=%1 TP_WAVELET_LEVONE;Niveau 2 TP_WAVELET_LEVTHRE;Niveau 4 TP_WAVELET_LEVTWO;Niveau 3 TP_WAVELET_LEVZERO;Niveau 1 -TP_WAVELET_LINKEDG;Koppel met Randscherpte Waarde +TP_WAVELET_LIMDEN;Interactie niveaus 5-6 op niveaus 1-4 +TP_WAVELET_LINKEDG;Koppel met Randscherptewaarde TP_WAVELET_LIPST;Verbeterde methode -TP_WAVELET_LOWLIGHT;Schaduwen: Luminantie Reeks (0..100) -TP_WAVELET_MEDGREINF;Eerste Niveau +TP_WAVELET_LOWLIGHT;Grovere niveaus luminantiebereik (0..100) +TP_WAVELET_LOWTHR_TOOLTIP;Voorkomt versterking van fijne texturen en ruis +TP_WAVELET_MEDGREINF;Eerste niveau TP_WAVELET_MEDI;Verminder artefacten in blauwe lucht -TP_WAVELET_MEDILEV;Rand detectie -TP_WAVELET_MEDILEV_TOOLTIP;Bij gebruik van Rand detectie:\n- Maak geen gebruik van de lage contrast niveaus's. Dit voorkomt artefacten.\n- Gebruik de hoge waarden van de Gradiënt gevoeligheid.\n\nJe kunt de sterkte moduleren met 'verfijnen' van Ruisonderdrukking. +TP_WAVELET_MEDILEV;Randdetectie +TP_WAVELET_MEDILEV_TOOLTIP;Bij gebruik van Randdetectie:\n- Maak geen gebruik van de lagecontrast-niveaus. Dit voorkomt artefacten.\n- Gebruik de hoge waarden van de Gradiënt-gevoeligheid.\n\nJe kunt de sterkte moduleren met 'verfijnen' van Ruisonderdrukking. +TP_WAVELET_MERGEC;Meng chroma +TP_WAVELET_MERGEL;Meng luma +TP_WAVELET_MIXCONTRAST;Referentie +TP_WAVELET_MIXDENOISE;Ruisvermindering +TP_WAVELET_MIXMIX;Gemengd 50% ruis - 50% ruisvermindering +TP_WAVELET_MIXMIX70;Gemengd 30% ruis - 70% ruisvermindering +TP_WAVELET_MIXNOISE;Ruis TP_WAVELET_NEUTRAL;Neutraal TP_WAVELET_NOIS;Ruisonderdrukking TP_WAVELET_NOISE;Ruisonderdrukking @@ -2200,52 +4233,81 @@ TP_WAVELET_NPLOW;Laag TP_WAVELET_NPNONE;Geen TP_WAVELET_NPTYPE;Naburige pixels TP_WAVELET_NPTYPE_TOOLTIP;Gebruikt de nabijheid van een pixel en acht naburige pixels. Indien weinig verschil, dan worden randen verscherpt. -TP_WAVELET_OPACITY;Dekking Blauw-Geel Niveau -TP_WAVELET_OPACITYW;Contrast balans d/v-h curve -TP_WAVELET_OPACITYWL;Finale lokaal contrast -TP_WAVELET_OPACITYWL_TOOLTIP;Wijzigt het lokaal contrast aan het einde van de wavelet toepassing.\n\nHet lokaal contrast wordt sterker van links naar rechts. -TP_WAVELET_PASTEL;Pastel chromaciteit -TP_WAVELET_PROC;Process +TP_WAVELET_OFFSET_TOOLTIP;De verschuiving wijzigt de balans tussen details met laag contrast en met hoog contrast.\nHoge waarden versterken de contrastveranderingen in de details met hoog contrast, terwijl lage waarden de contrastveranderingen in details met laag contrast versterken.\nDoor een lage verzwakkingsresponswaarde te gebruiken, kunt u selecteren welke contrastwaarden worden versterkt. +TP_WAVELET_OLDSH;Algoritme met negatieve waarden +TP_WAVELET_OPACITY;Dekking Blauw-Geel niveau +TP_WAVELET_OPACITYW;Contrastbalans d/v-h curve +TP_WAVELET_OPACITYWL;Uiteindelijk lokaal contrast +TP_WAVELET_OPACITYWL_TOOLTIP;Wijzigt het lokaal contrast aan het einde van de wavelet-toepassing.\n\nHet lokaal contrast wordt sterker van links naar rechts. +TP_WAVELET_PASTEL;Pastel-chromaciteit +TP_WAVELET_PROC;Proces +TP_WAVELET_PROTAB;Bescherming +TP_WAVELET_QUAAGRES;Agressief +TP_WAVELET_QUACONSER;Conservatief +TP_WAVELET_RADIUS;Straal schaduwen - hoge lichten +TP_WAVELET_RANGEAB;Reeks a en b % TP_WAVELET_RE1;Versterkt TP_WAVELET_RE2;Ongewijzigd TP_WAVELET_RE3;Verminderd +TP_WAVELET_RESBLUR;Vervaging luminantie +TP_WAVELET_RESBLURC;Vervaging chroma +TP_WAVELET_RESBLUR_TOOLTIP;Uitgeschakeld als zoom > ~500% TP_WAVELET_RESCHRO;Chromaticiteit TP_WAVELET_RESCON;Schaduwen TP_WAVELET_RESCONH;Hoge lichten -TP_WAVELET_RESID;Rest van de afbeelding +TP_WAVELET_RESID;Residuele afbeelding TP_WAVELET_SAT;Verzadigd chromaciteit -TP_WAVELET_SETTINGS;Wavelet Instellingen -TP_WAVELET_SKIN;Huidtinten Wijzigen/Beschermen +TP_WAVELET_SETTINGS;Wavelet-instellingen +TP_WAVELET_SHA;Scherptemasker +TP_WAVELET_SHFRAME;Schaduwen/hoge lichten +TP_WAVELET_SHOWMASK;Toon wavelet-masker +TP_WAVELET_SIGM;Straal +TP_WAVELET_SIGMA;Verzwakkingsrespons +TP_WAVELET_SIGMAFIN;Verzwakkingsrespons +TP_WAVELET_SIGMA_TOOLTIP;Het effect van de contrastschuiven is sterker in details met gemiddeld contrast en zwakker in details met hoog en laag contrast.\nMet deze schuif kunt u regelen hoe snel het effect afneemt naar de extreme contrasten.\nHoe hoger de schuif is ingesteld, hoe breder het bereik van contrasten dat een sterke verandering zal ondergaan, en hoe groter het risico op onregelmatigheden.\nHoe lager het is, hoe meer het effect wordt gericht op een nauwer bereik van contrastwaarden. +TP_WAVELET_SKIN;Huidtinten wijzigen/beschermen TP_WAVELET_SKIN_TOOLTIP;Bij -100 worden alleen huidtinten gewijzigd.\nBij 0 worden alle tinten gelijk behandeld.\nBij +100 worden huidtinten beschermd. Alle andere tinten worden gewijzigd. TP_WAVELET_SKY;Tint-tonen (lucht) Wijzigen/Beschermen -TP_WAVELET_SKY_TOOLTIP;Vergroot/verminder chrominantie in de tint reeks\nVermijd artefacten in blauwe lucht als gevolg van micro-contrast, micro-chroma,... +TP_WAVELET_SKY_TOOLTIP;Vergroot/verminder chrominantie in het tintbereik\nVermijd artefacten in blauwe lucht als gevolg van micro-contrast, micro-chroma,... +TP_WAVELET_SOFTRAD;Verzachtingsstraal TP_WAVELET_STREN;Sterkte +TP_WAVELET_STREND;Kracht TP_WAVELET_STRENGTH;Sterkte -TP_WAVELET_SUP;Boven het niveau + overblijvend TP_WAVELET_SUPE;Extra -TP_WAVELET_THR;Drempel Schaduwen -TP_WAVELET_THRES;Max niveau +TP_WAVELET_THR;Drempel schaduwen +TP_WAVELET_THRDEN_TOOLTIP;Genereert een getrapte curve die wordt gebruikt om de ruisonderdrukking aan te sturen als functie van lokaal contrast. De ruisonderdrukking zal worden toegepast op uniforme gebieden met laag lokaal contrast. Gebieden met details (hoger lokaal contrast) worden behouden. +TP_WAVELET_THREND;Drempel lokaal contrast TP_WAVELET_THRESHOLD;Hoge lichten: Aantal te gebruiken niveaus (fijn naar grof - leidend) TP_WAVELET_THRESHOLD2;Schaduwen: Aantal te gebruiken niveaus (grof naar fijn) -TP_WAVELET_THRESHOLD2_TOOLTIP;Alleen niveaus tussen '9' en '9 minus gekozen waarde' worden behandeld als schaduwen\nDe andere niveaus worden volledig behandeld\nHet maximum niveau voor schaduwen wordt beperkt door het aantal Hoge lichten niveaus (9- hoge lichten niveau) -TP_WAVELET_THRESHOLD_TOOLTIP;Alleen niveaus boven de gekozen waarde worden behandeld als hoge lichten\nDe andere niveaus worden volledig behandeld -TP_WAVELET_THRH;Drempel Hoge lichten -TP_WAVELET_TILES;Tegel grootte (* 128) -TP_WAVELET_TILESBIG;Grote Tegels -TP_WAVELET_TILESFULL;Volldige afbeelding -TP_WAVELET_TILESIZE;Tegel grootte -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. -TP_WAVELET_TMTYPE;Compressie methode +TP_WAVELET_THRESHOLD2_TOOLTIP;Alleen niveaus van de gekozen waarde tot het gekozen aantal Wavelet-niveaus zullen worden beïnvloed door het Schaduwluminantiebereik. +TP_WAVELET_THRESHOLD_TOOLTIP;Alleen niveaus beneden en inclusief de gekozen waarde zullen worden beïnvloed door het luminantiebereik van de hoge lichten. +TP_WAVELET_THRH;Drempel hoge lichten +TP_WAVELET_TILESBIG;Grote tegels +TP_WAVELET_TILESFULL;Volledige afbeelding +TP_WAVELET_TILESIZE;Tegelgrootte +TP_WAVELET_TILES_TOOLTIP;De optie 'Volledige afbeelding' geeft een betere kwaliteit en is de aanbevolen keuze. Selecteer 'Grote tegels' als er onvoldoende geheugen beschikbaar is. Raadpleeg RawPedia voor geheugenaanbevelingen. +TP_WAVELET_TMEDGS;Randbehoud +TP_WAVELET_TMSCALE;Schaal +TP_WAVELET_TMSTRENGTH;Compressiesterkte +TP_WAVELET_TMSTRENGTH_TOOLTIP;Bepaalt de sterkte van het toonmappen of de contrastcompressie. Als de waarde anders is dan 0, dan worden de Sterkte- en Gamma-schuifbalken van Toonmappen in de Belichtingstab inactief. +TP_WAVELET_TMTYPE;Compressiemethode TP_WAVELET_TON;Kleurtinten +TP_WAVELET_TONFRAME;Uitgesloten kleuren +TP_WAVELET_USH;Geen +TP_WAVELET_USHARP;Klaarheidmethode (Clarity) +TP_WAVELET_USH_TOOLTIP;Als u het scherptemasker selecteert, kunt u elk niveau (in Instellingen) van 1 tot 4 kiezen voor verwerking.\nAls u Klaarheid (Clarity) selecteert, kunt u elk niveau (in Instellingen) tussen 5 en Extra kiezen. +TP_WAVELET_WAVLOWTHR;Laag contrast drempel +TP_WAVELET_WAVOFFSET;Verschuiving TP_WBALANCE_AUTO;Automatisch +TP_WBALANCE_AUTOITCGREEN;Temperatuurcorrelatie +TP_WBALANCE_AUTOOLD;RGB grijs +TP_WBALANCE_AUTO_HEADER;Automatisch & Verfijning TP_WBALANCE_CAMERA;Camera TP_WBALANCE_CLOUDY;Bewolkt TP_WBALANCE_CUSTOM;Handmatig TP_WBALANCE_DAYLIGHT;Daglicht (zonnig) -TP_WBALANCE_EQBLUERED;Blauw/Rood Balans -TP_WBALANCE_EQBLUERED_TOOLTIP;Wijzigt het normale gedrag van "witbalans" door de blauw/rood balans te verschuiven.\nToepassen wanneer de opname-omstandigheden sterk afwijken van: \na) standaard belichting (bv. onderwater)\nb) de condities waar de calibraties zijn uitgevoerd\nc) de matrices of ICC profielen. +TP_WBALANCE_EQBLUERED;Blauw/Rood-balans +TP_WBALANCE_EQBLUERED_TOOLTIP;Wijzigt het normale gedrag van 'witbalans' door de blauw/rood-balans te veranderen.\nToepassen wanneer de opname-omstandigheden sterk afwijken van: \na) standaardbelichting (bv. onderwater)\nb) de condities waar de kalibraties zijn uitgevoerd\nc) de matrices of ICC-profielen. TP_WBALANCE_FLASH55;Leica TP_WBALANCE_FLASH60;Standaard, Canon, Pentax, Olympus TP_WBALANCE_FLASH65;Nikon, Panasonic, Sony, Minolta @@ -2266,6 +4328,45 @@ TP_WBALANCE_FLUO_HEADER;Fluorescent(TL) TP_WBALANCE_GREEN;Groentint TP_WBALANCE_GTI;GTI TP_WBALANCE_HMI;HMI +TP_WBALANCE_ITCWALG_TOOLTIP;Hiermee kunt u overschakelen naar de andere Alternatieve temperatuur (Alt_temp), indien mogelijk.\nInactief in het geval van 'enkele keuze'. +TP_WBALANCE_ITCWBDELTA_TOOLTIP;Het temperatuurverschil dat in aanmerking moet worden genomen voor elke 'groene' iteratie die geprobeerd is. +TP_WBALANCE_ITCWBFGREEN_TOOLTIP;Vind het beste compromis tussen Student en groen. +TP_WBALANCE_ITCWBMINSIZEPATCH_TOOLTIP;Hiermee kunt u de minimale patchwaarde instellen. Te lage waarden kunnen leiden tot een gebrek aan correlatie. +TP_WBALANCE_ITCWBNOPURPLE_TOOLTIP;Hiermee kunt u magenta/paarse gegevens uit de afbeelding filteren. Als het vakje is aangevinkt, wordt een filter toegepast dat de waarde van Y beperkt. Standaard is deze waarde 0,4. U kunt dit wijzigen in 'opties' Itcwb_Ypurple (Maximaal 1) +TP_WBALANCE_ITCWBPRECIS_TOOLTIP;Hoe lager de waarde, hoe relevanter de data, maar dit verlengt de verwerkingstijd. Aangezien de verwerkingstijd laag is, zou deze parameter over het algemeen op de standaardwaarde moeten blijven staan. +TP_WBALANCE_ITCWBRGREEN_TOOLTIP;Stelt de beoordelingsamplitude van de groene waarde in herhalingen in, van lage amplitude 0,82 tot 1,25 tot maximale amplitude 0,4 tot 4. +TP_WBALANCE_ITCWBSIZEPATCH_TOOLTIP;Deze instelling bepaalt de grootte van kleurdata die door het algoritme worden gebruikt. +TP_WBALANCE_ITCWBSIZE_TOOLTIP;Deze instelling bepaalt het aantal iteraties om de beste overeenkomst te vinden tussen de referentie-spectrale kleuren en die in xyY-waarde van de afbeelding. Een waarde van 3 lijkt een goed compromis. +TP_WBALANCE_ITCWBTHRES_TOOLTIP;Beperkt vergelijkings-sampling tussen spectrale data en beelddata. +TP_WBALANCE_ITCWB_ALG;Verwijder 2-pas algoritme +TP_WBALANCE_ITCWB_CUSTOM;Gebruik aangepaste temperatuur & tint +TP_WBALANCE_ITCWB_DELTA;Delta temperatuur in groene lus +TP_WBALANCE_ITCWB_FGREEN;Vind groene student +TP_WBALANCE_ITCWB_FORCED;Dwingt het gebruik van het volledige CIE-diagram af. +TP_WBALANCE_ITCWB_FRA;Autom. instellingen temperatuurcorrelatie +TP_WBALANCE_ITCWB_FRA_TOOLTIP;Deze instellingen maken, afhankelijk van de afbeeldingen (raw-type, kleurmeting, etc.), een aanpassing van het 'Temperatuurcorrelatie'-algoritme mogelijk. Er is geen absolute regel die deze parameters koppelt aan de verkregen resultaten. +TP_WBALANCE_ITCWB_MINSIZEPATCH;Patch minimumgrootte +TP_WBALANCE_ITCWB_NOPURPLE;Filter op paars +TP_WBALANCE_ITCWB_PRECIS;Precisie-algoritme - schaal gebruikt +TP_WBALANCE_ITCWB_PRIM_ACE;Forceer gebruik van het gehele CIE-diagram +TP_WBALANCE_ITCWB_PRIM_ADOB;Medium sampling +TP_WBALANCE_ITCWB_PRIM_BETA;Medium sampling - nabij Pointers kleuromvang +TP_WBALANCE_ITCWB_PRIM_JDCMAX;Nabij volledig CIE-diagram +TP_WBALANCE_ITCWB_PRIM_REC;Hoge sampling +TP_WBALANCE_ITCWB_PRIM_SRGB;Lage sampling & Gebruik geen camera-instellingen +TP_WBALANCE_ITCWB_PRIM_XYZCAM;Camera XYZ-matrix +TP_WBALANCE_ITCWB_PRIM_XYZCAM2;JDCmax na camera XYZ-matrix +TP_WBALANCE_ITCWB_RGREEN;Groen bereik +TP_WBALANCE_ITCWB_SAMPLING;Lage sampling 5,9 +TP_WBALANCE_ITCWB_SIZE;Grootte ref.kleur vergelijk met histogram +TP_WBALANCE_ITCWB_SIZEPATCH;Grootte kleur-patch +TP_WBALANCE_ITCWB_THRES;Kleuren gebruikt in afbeelding (voorinstelling) +TP_WBALANCE_ITCWCUSTOM_TOOLTIP;Hiermee kunt u Aangepaste instellingen voor Temperatuur en Groen (tint) gebruiken.\n\nGebruiksaanwijzing:\n1) start Itcwb, schakel 'Gebruik Aangepaste temperatuur en tint' in.\n2) Stel 'Temperatuur en tint' in naar wens: vrij, Kies,...(Aangepast)\n3) ga terug naar 'Temperatuurcorrelatie'.\n\nU kunt niet gebruiken: 2-gangen, AWB temperatuurnadruk, Groenverfijning. +TP_WBALANCE_ITCWFORCED_TOOLTIP;Standaard (vakje niet aangevinkt) worden de gegevens die tijdens het scannen worden gesampled, teruggebracht naar het sRGB-profiel, dat het meest verspreid is, zowel voor het kalibreren van DCP- of ICC-profielen met de Colorchecker24, of voor webgebruik.\nAls u afbeeldingen met een zeer hoge kleuromvang hebt (sommige bloemen, kunstmatige kleuren), kan het nodig zijn om het hele CIExy-diagram te gebruiken, het profiel dat wordt gebruikt zal ACESP0 zijn. In dit tweede geval zal het aantal kleuren dat intern aan het algoritme kan worden aangeboden, groter zijn. +TP_WBALANCE_ITCWGREEN;Groen verfijning +TP_WBALANCE_ITCWGREEN_TOOLTIP;Hiermee kunt u de 'tint' (groen) wijzigen die als referentie zal dienen bij het starten van het algoritme. Het heeft in wezen dezelfde rol voor groen als 'AWB temperatuurnadruk' voor temperatuur.\nHet hele algoritme wordt opnieuw berekend. +TP_WBALANCE_ITCWPRIM_TOOLTIP;Hiermee kunt u de beeldsampling selecteren.\n'Dicht bij volledig CIE-diagram' gebruikt bijna alle gegevens die op de sensor aanwezig zijn, inclusief mogelijke imaginaire kleuren.\n'Camera XYZ-matrix' - gebruikt de matrix die rechtstreeks is afgeleid van de Kleurenmatrix.\n'Medium sampling' (standaard) - dicht bij Pointers kleuromvang (gamut): komt grotendeels overeen met de meest voorkomende gevallen van menselijke waarneming.\nDe andere keuze, 'Lage sampling en negeer camera-instellingen', stelt u in staat om hoge gamut-onderdelen van het beeld te isoleren en dwingt in sommige gevallen het algoritme (tint > 0,8, ...) om de camera-instellingen te negeren. Dit zal uiteraard invloed hebben op het resultaat.\n\nDeze sampling heeft alleen invloed op de kanaalvermenigvuldigers, het heeft niets te maken met het 'werkprofiel' en wijzigt de kleuromvang van de afbeelding niet. +TP_WBALANCE_ITCWSAMPLING_TOOLTIP;Hiermee kunt u het oude sampling-algoritme gebruiken om betere compatibiliteit met versie 5.9 te garanderen. U moet Observer 10° (standaard) inschakelen. TP_WBALANCE_JUDGEIII;JudgeIII TP_WBALANCE_LABEL;Witbalans TP_WBALANCE_LAMP_HEADER;Lamp @@ -2273,6 +4374,14 @@ 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_MULLABEL;Vermenigvuldigers: r=%1 g=%2 b=%3 +TP_WBALANCE_MULLABEL_TOOLTIP;Waarden worden ter informatie verstrekt. U kunt ze niet wijzigen. +TP_WBALANCE_OBSERVER10;Observer 10° in plaats van Observer 2° +TP_WBALANCE_OBSERVER10_TOOLTIP;Het kleurbeheer in RawTherapee (Witbalans, kanaalvermenigvuldigers, herstel hoge lichten, ...) gebruikt de spectrale gegevens van de lichtbron en kleuren. Observer is een belangrijke parameter van dit beheer, die rekening houdt met de kijkhoek van het oog. In 1931 werd deze vastgelegd op 2° (bevoorrecht het gebruik van de kegeltjes). In 1964 werd deze vastgelegd op 10° (bevoorrecht het gebruik van de kegeltjes, maar houdt gedeeltelijk rekening met de staafjes).\nIn het zeldzame geval van een kleurverschuiving met Observer 2° (waarschijnlijk door de conversiematrix) moet Observer 10° worden geselecteerd. +TP_WBALANCE_PATCHLABEL;Lees kleuren:%1 Patch: Chroma:%2 Grootte=%3 +TP_WBALANCE_PATCHLABEL_TOOLTIP;Toont het aantal gelezen kleuren (max=237).\nToont de berekende Patch Chroma.\nAWB-temperatuurnadruk probeert deze waarde te verminderen, een minimum lijkt het algoritme te optimaliseren.\n\nPatchgrootte die overeenkomt met chroma-optimalisatie. +TP_WBALANCE_PATCHLEVELLABEL;Patch: ΔE=%1 - data x 9 Min:%2 Max=%3 +TP_WBALANCE_PATCHLEVELLABEL_TOOLTIP;Toont ΔE-patch (ervan uitgaande dat er voldoende spectrale data zijn), tussen beeld en spectrale gegevens.\nToont gelezen data die zijn gevonden. De twee waarden komen overeen met de minimale en maximale datawaarden die in aanmerking zijn genomen. De coëfficiënt x9 moet worden meegenomen om het aantal betrokken pixels in het beeld te verkrijgen. TP_WBALANCE_PICKER;Kies TP_WBALANCE_SHADE;Schaduw TP_WBALANCE_SIZE;Grootte: @@ -2281,8 +4390,12 @@ TP_WBALANCE_SOLUX41;Solux 4100K TP_WBALANCE_SOLUX47;Solux 4700K (leverancier) TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) TP_WBALANCE_SPOTWB;Wijs WB aan -TP_WBALANCE_TEMPBIAS;AWB temperatuur afwijking -TP_WBALANCE_TEMPBIAS_TOOLTIP;Wijzigt de berekening van "auto wit balans"\ndoor een afwijking naar warmere of koelere temperatuur \nDe afwijking wordt uitgedrukt als percentage van de berekende temperatuur,\nszodat het resultaat is "computedTemp + computedTemp * afwijking". +TP_WBALANCE_STUDLABEL;Correlatiefactor: %1 Doorgangen:%2 Slechtst=%3 +TP_WBALANCE_STUDLABEL0;Correlatiefactor: %1 Doorgangen:%2 Alt=%3 +TP_WBALANCE_STUDLABEL1;Correlatiefactor: %1 Doorgangen:%2 Best_alt=%3 +TP_WBALANCE_STUDLABEL_TOOLTIP;Toont berekende Student-correlatie.\nLagere waarden zijn beter, waarbij <0,005 uitstekend is,\n<0,01 goed is, en >0,5 slecht is.\nLage waarden betekenen niet dat de witbalans goed is:\nals de lichtbron niet-standaard is, kunnen de resultaten grillig zijn.\nEen waarde van 1000 betekent dat eerdere berekeningen zijn gebruikt en\nde resultaten waarschijnlijk goed zijn.\n\nGangen: aantal gemaakte gangen.\nAlt_temp: Alternatieve temperatuur. +TP_WBALANCE_TEMPBIAS;AWB temperatuur-afwijking +TP_WBALANCE_TEMPBIAS_TOOLTIP;Wijzigt de berekening van auto-witbalans\ndoor een afwijking naar warmere of koelere temperatuur.\nDe afwijking wordt uitgedrukt als percentage van de berekende temperatuur,\nzodat het resultaat is: computedTemp + computedTemp * afwijking. TP_WBALANCE_TEMPERATURE;Kleurtemperatuur TP_WBALANCE_TUNGSTEN;Tungsten (wolfraam) TP_WBALANCE_WATER1;Onderwater 1 @@ -2290,9 +4403,9 @@ TP_WBALANCE_WATER2;Onderwater 2 TP_WBALANCE_WATER_HEADER;Onderwater ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;Open (nieuw) detailvenster -ZOOMPANEL_ZOOM100;Zoom naar 100%\nSneltoets: z -ZOOMPANEL_ZOOMFITCROPSCREEN;Maak uitsnede passend in het scherm\nSneltoets: f -ZOOMPANEL_ZOOMFITSCREEN;Passend in venster\nSneltoets: Alt-f +ZOOMPANEL_ZOOM100;Zoom naar 100%\nSneltoets: Z +ZOOMPANEL_ZOOMFITCROPSCREEN;Maak uitsnede passend in het scherm\nSneltoets: F +ZOOMPANEL_ZOOMFITSCREEN;Passend in venster\nSneltoets: Alt+F ZOOMPANEL_ZOOMIN;Zoom in\nSneltoets: + ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - @@ -2300,27 +4413,6 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -!ERROR_MSG_METADATA_VALUE;Metadata: error setting %1 to %2 -!EXIFFILTER_PATH;File path -!EXIFPANEL_ACTIVATE_ALL_HINT;Select all tags -!EXIFPANEL_ACTIVATE_NONE_HINT;Unselect all tags -!EXIFPANEL_BASIC_GROUP;Basic -!EXIFPANEL_VALUE_NOT_SHOWN;Not shown -!FILEBROWSER_POPUPINSPECT;Inspect -!FILEBROWSER_POPUPSORTBY;Sort Files -!FILECHOOSER_FILTER_EXECUTABLE;Executable files -!GENERAL_DELETE_ALL;Delete all -!GENERAL_EDIT;Edit -!GENERAL_OTHER;Other -!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-- @@ -2337,1931 +4429,7 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !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 - SC - Shape method -!HISTORY_MSG_503;Local - Spot - Right -!HISTORY_MSG_504;Local - Spot - Left -!HISTORY_MSG_505;Local - Spot - Bottom -!HISTORY_MSG_506;Local - Spot - Top -!HISTORY_MSG_507;Local - Spot - Center -!HISTORY_MSG_508;Local - Spot - Size -!HISTORY_MSG_509;Local - Spot quality method -!HISTORY_MSG_510;Local - TG - Transition value -!HISTORY_MSG_511;Local - SD - ΔE scope threshold -!HISTORY_MSG_512;Local - SD - ΔE decay -!HISTORY_MSG_513;Local - Spot - Excluding - 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 - Spot - Excluding - Spot 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 - SD - ab-L balance -!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 - TG - 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 - TG - 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 Image Mask -!HISTORY_MSG_785;Local - Mask - Scope -!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 - 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 - SC - 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 - TG - Feather gradient -!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 - SD - C-H balance -!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 - SD - ΔE preview color intensity -!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 - SC - 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 - SC - Changes in B/W -!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 - SC - 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 -!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_DIRPYRDENOISE_GAIN;NR - Compensate for lightness -!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_REF_SPOT;FN - Reference input -!HISTORY_MSG_GAMUTMUNSEL;Gamut-Munsell -!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_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_LOCALLAB_TE_PIVOT;Local - Equalizer pivot -!HISTORY_MSG_LOCAL_GAMUTMUNSEL;Local - SC - Avoid Color Shift -!HISTORY_MSG_LOCAL_TMO_SATUR;Local Exp Fattal Saturation -!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_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_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_MSG_WBITC_CUSTOM;Itcwb Custom -!HISTORY_MSG_WBITC_DELTA;Itcwb Delta green -!HISTORY_MSG_WBITC_FGREEN;Itcwb Green - student -!HISTORY_MSG_WBITC_FORCE;Itcwb Force -!HISTORY_MSG_WBITC_GREEN;Green refinement -!HISTORY_MSG_WBITC_MINSIZE;Patch min size -!HISTORY_MSG_WBITC_NOPURPLE;Itcwb Nopurple -!HISTORY_MSG_WBITC_OBS;Remove algo 2 passes -!HISTORY_MSG_WBITC_PONDER;Itcwb ponderated -!HISTORY_MSG_WBITC_PRECIS;Itcwb Precision -!HISTORY_MSG_WBITC_PRIM;Primaries -!HISTORY_MSG_WBITC_RGREEN;Itcwb Green range -!HISTORY_MSG_WBITC_SAMPLING;Low sampling -!HISTORY_MSG_WBITC_SIZE;Itcwb Size -!HISTORY_MSG_WBITC_SORTED;Itcwb ponderated -!HISTORY_MSG_WBITC_THRES;Itcwb Threshold -!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_FLATFIELDFROMMETADATA;Flat-field from Metadata -!PARTIALPASTE_LOCALLAB;Local Adjustments -!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings -!PARTIALPASTE_PREPROCWB;Preprocess White Balance -!PARTIALPASTE_SPOT;Spot removal -!PARTIALPASTE_TONE_EQUALIZER;Tone equalizer -!PREFERENCES_CAMERAPROFILESDIR;Camera profiles directory -!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_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_INSPECTORWINDOW;Open inspector in own window or fullscreen -!PREFERENCES_LENSFUNDBDIR;Lensfun database directory -!PREFERENCES_LENSFUNDBDIR_TOOLTIP;Directory containing the Lensfun database. Leave empty to use the default directories. -!PREFERENCES_LENSPROFILESDIR;Lens profiles directory -!PREFERENCES_LENSPROFILESDIR_TOOLTIP;Directory containing Adobe Lens Correction Profiles (LCPs) -!PREFERENCES_METADATA;Metadata -!PREFERENCES_METADATA_SYNC;Metadata synchronization with XMP sidecars -!PREFERENCES_METADATA_SYNC_NONE;Off -!PREFERENCES_METADATA_SYNC_READ;Read only -!PREFERENCES_METADATA_SYNC_READWRITE;Bidirectional -!PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips -!PREFERENCES_TAB_FAVORITES;Favorites -!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_WBA;White Balance -!PREFERENCES_WBACORR;White Balance - Automatic temperature correlation -!PREFERENCES_WBACORR_TOOLTIP;These settings allow, depending on the images (type of raw file, colorimetry, etc.), an adaptation of the " Temperature correlation " algorithm in order to obtain the best overall results. There is no absolute rule, linking these parameters to the results obtained.\n\nThe settings are of 3 types: \n* those accessible to the user from the GUI.\n* those accessible only in reading from each pp3 file : Itcwb_minsize=20, Itcwb_delta=4 Itcwb_rgreen=1 Itcwb_nopurple=false (See Rawpedia)\n* those accessible to the user in 'options' (see Rawpedia)\n You can use "Awb temperature bias" and "Green refinement" to adjust the results. Each movement of these commands brings a new calculation of temperature, tint and correlation.\n\nPlease note that the 3 indicators 'Correlation factor', 'Patch chroma' and ΔE are given for information only. It is not because one of these indicators is better that the result will necessarily be better. -!PREFERENCES_WBAENA;Show White Balance Auto temperature correlation settings -!PREFERENCES_WBAENACUSTOM;Use Custom temperature & tint -!PREFERENCES_WBAFORC;Forces Extra algoritm -!PREFERENCES_WBAGREENDELTA;Delta temperature in green iterate loop (if Force Extra enabled) -!PREFERENCES_WBANOPURP;No purple color used -!PREFERENCES_WBAPATCH;Number maximum of colors used in picture -!PREFERENCES_WBAPRECIS;Precision algorithm - scale used -!PREFERENCES_WBASIZEREF;Size of reference color compare to size of histogram color -!PREFERENCES_WBASORT;Sort in chroma order instead of histogram -!PREFERENCES_XMP_SIDECAR_MODE;XMP sidecar style -!PREFERENCES_XMP_SIDECAR_MODE_EXT;darktable-like (FILENAME.ext.xmp for FILENAME.ext) -!PREFERENCES_XMP_SIDECAR_MODE_STD;Standard (FILENAME.xmp for FILENAME.ext) -!PREFERENCES_ZOOMONSCROLL;Zoom images by scrolling -!SAVEDLG_BIGTIFF;BigTIFF (no metadata support) -!SORT_ASCENDING;Ascending -!SORT_BY_DATE;By Date -!SORT_BY_EXIF;By EXIF -!SORT_BY_LABEL;By Color Label -!SORT_BY_NAME;By Name -!SORT_BY_RANK;By Rank -!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 -!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_CIECAT_DEGREEOUT;Chromatic Adaptation Viewing -!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_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_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_DIRPYRDENOISE_MAIN_AUTO_GAIN;Compensate for lightness -!TP_DIRPYRDENOISE_MAIN_AUTO_GAIN_TOOLTIP;Alter the noise reduction strength based on the image lightness. Strength is reduced for dark images and increased for bright images. -!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_PICK_SIZE;Size: -!TP_FILMNEGATIVE_REF_LABEL;Input RGB: %1 -!TP_FILMNEGATIVE_REF_PICK;Pick white balance spot -!TP_FILMNEGATIVE_REF_SIZE;Size: -!TP_FILMNEGATIVE_REF_TOOLTIP;Pick a gray patch for white-balancing the output, positive image. -!TP_FLATFIELD_FROMMETADATA;From Metadata -!TP_HLREC_COLOROPP;Inpaint Opposed -!TP_HLREC_HLBLUR;Blur -!TP_HLREC_HLTH;Gain threshold -!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_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_JDCMAX;JDC Max -!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 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 a spot (high values for scope and transition and 'Normal' or 'Inverse' in checkbox).\n-Isolate the foreground by using one or more 'Excluding' spots 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_CHRO46LABEL;Chroma levels 456: Mean=%1 High=%2 -!TP_LOCALLAB_CHROLABEL;Chroma levels 0123: Mean=%1 High=%2 -!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 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 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 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 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 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 layer blend modes (difference, multiply, soft light, overlay, etc.) with opacity control.\nOriginal image: merge current spot with original.\nPrevious spot: merge current spot with previous (if there is only one spot, previous = original).\nBackground: merge current 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;Spot minimum 39*39.\nUse low transition values and high 'Transition decay' and 'Scope' values to simulate smaller 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_FATSAT;Saturation control -!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_GAMUTLABRELA;Lab -!TP_LOCALLAB_GAMUTMUNSELL;Munsell only -!TP_LOCALLAB_GAMUTNON;None -!TP_LOCALLAB_GAMUTXYZABSO;XYZ Absolute -!TP_LOCALLAB_GAMUTXYZRELA;XYZ Relative -!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_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_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_LUM46LABEL;Luma levels 456: Mean=%1 High=%2 -!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_LUMLABEL;Luma levels 0123: Mean=%1 High=%2 -!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 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 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;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_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_TONE_EQUALIZER_BANDS;Bands -!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_DETAIL;Regularization -!TP_TONE_EQUALIZER_LABEL;Tone Equalizer -!TP_TONE_EQUALIZER_PIVOT;Pivot (Ev) -!TP_TONE_EQUALIZER_SHOW_COLOR_MAP;Show tonal map -!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 & Refinement -!TP_WBALANCE_ITCWALG_TOOLTIP;Allows you to switch to the other Alternative temperature (Alt_temp), when possible.\nInactive in the "single choice" case. -!TP_WBALANCE_ITCWBDELTA_TOOLTIP;Fixed for each "green" iteration tried, the temperature difference to be taken into account. -!TP_WBALANCE_ITCWBFGREEN_TOOLTIP;Find the best compromise between Student and green. -!TP_WBALANCE_ITCWBMINSIZEPATCH_TOOLTIP;Allows you to set the minimum patch value. values that are too low can lead to a lack of correlation. -!TP_WBALANCE_ITCWBNOPURPLE_TOOLTIP;Allows you to filter magenta/purple data from the image. If the box is checked a filter limiting the value of Y is applied. By default this value is 0.4. You can change it in 'options' Itcwb_Ypurple (Maximum 1) -!TP_WBALANCE_ITCWBPRECIS_TOOLTIP;The lower the value, the more relevant the data, but increases the processing time. Since the processing time is low, this parameter should generally be able to remain at the default value -!TP_WBALANCE_ITCWBRGREEN_TOOLTIP;Sets the green value review amplitude in iterations, from low amplitude 0.82 to 1.25 to maximum amplitude 0.4 to 4. -!TP_WBALANCE_ITCWBSIZEPATCH_TOOLTIP;This setting sets the size of color datas used by algorithm. -!TP_WBALANCE_ITCWBSIZE_TOOLTIP;This setting sets the number of iterations to find the best correspondence between the reference spectral colors and those in xyY value of the image. A value of 3 seams a good compromise. -!TP_WBALANCE_ITCWBTHRES_TOOLTIP;Limits comparison sampling between spectral data and image data. -!TP_WBALANCE_ITCWB_ALG;Remove 2 pass algorithm -!TP_WBALANCE_ITCWB_CUSTOM;Use Custom temperature & tint -!TP_WBALANCE_ITCWB_DELTA;Delta temperature in green loop -!TP_WBALANCE_ITCWB_FGREEN;Find green student -!TP_WBALANCE_ITCWB_FORCED;Close to full CIE diagram -!TP_WBALANCE_ITCWB_FRA;Auto temperature correlation settings -!TP_WBALANCE_ITCWB_FRA_TOOLTIP;These settings allow, depending on the images (type of raw, colorimetry, etc.), an adaptation of the 'Temperature correlation' algorithm. There is no absolute rule linking these parameters to the results obtained. -!TP_WBALANCE_ITCWB_MINSIZEPATCH;Patch minimum size -!TP_WBALANCE_ITCWB_NOPURPLE;Filter on purple color -!TP_WBALANCE_ITCWB_PRECIS;Precision algorithm - scale used -!TP_WBALANCE_ITCWB_PRIM_ACE;Forces use of the entire CIE diagram -!TP_WBALANCE_ITCWB_PRIM_ADOB;Medium sampling -!TP_WBALANCE_ITCWB_PRIM_BETA;Medium sampling - near Pointer's gamut -!TP_WBALANCE_ITCWB_PRIM_JDCMAX;Close to full CIE diagram -!TP_WBALANCE_ITCWB_PRIM_REC;High sampling -!TP_WBALANCE_ITCWB_PRIM_SRGB;Low sampling & Ignore Camera settings -!TP_WBALANCE_ITCWB_PRIM_XYZCAM;Camera XYZ matrix -!TP_WBALANCE_ITCWB_PRIM_XYZCAM2;JDCmax after Camera XYZ matrix -!TP_WBALANCE_ITCWB_RGREEN;Green range -!TP_WBALANCE_ITCWB_SAMPLING;Low sampling 5.9 -!TP_WBALANCE_ITCWB_SIZE;Size of ref. color compare to histogram -!TP_WBALANCE_ITCWB_SIZEPATCH;Size of color patch -!TP_WBALANCE_ITCWB_THRES;Colors used in picture (preset) -!TP_WBALANCE_ITCWCUSTOM_TOOLTIP;Allows you to use Custom settings Temperature and Green (tint).\n\nUsage tips:\n1) start Itcwb , enable 'Use Custom temperature and tint'.\n2) Set 'Temperature and tint' to your liking :free, Pick,...(Custom)\n3) go back to 'Temperature correlation'.\n\nYou cannot use : 2 passes, AWB temperature bias, Green refinement. -!TP_WBALANCE_ITCWFORCED_TOOLTIP;By default (box not checked) the data scanned during sampling is brought back to the sRGB profile, which is the most widespread, both for calibrating DCP or ICC profiles with the Colorchecker24, or used on the web.\n If you have very high gamut images (some flowers, artificial colors), then it may be necessary to use the entire CIExy diagram, the profile used will be ACESP0. In this second case, the number of colors that can be used in internal to the algorithm will be more important. -!TP_WBALANCE_ITCWGREEN;Green refinement -!TP_WBALANCE_ITCWGREEN_TOOLTIP;Allows you to change the "tint" (green) which will serve as a reference when starting the algorithm. It has substantially the same role for greens as "AWB temperature bias" for temperature.\nThe whole algorithm is recalculated. -!TP_WBALANCE_ITCWPRIM_TOOLTIP;Allows you to select the image sampling.\n'Close to full CIE diagram' almost uses the data present on the sensor, possibly including the imaginary colors.\n'Camera XYZ matrix' - uses the matrix directly derived from Color Matrix.\n'Medium sampling' (default) - near Pointer's gamut: corresponds substantially to the most common cases of human vision.\nThe other choice 'Low sampling and Ignore camera settings' allow you to isolate high gamut parts of the image and forces the algorithm in some cases (tint > 0.8,...) to ignore camera settings. This will obviously have an impact on the result.\n\nThis sampling only has an influence on the channel multipliers, it has nothing to do with the "working profile" and does not modify the gamut of the image. -!TP_WBALANCE_ITCWSAMPLING_TOOLTIP;Allows you to use the old sampling algorithm to ensure better compatibility with 5.9. You must enable Observer 10° (default). -!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_PATCHLABEL;Read colors:%1 Patch: Chroma:%2 Size=%3 -!TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colors (max=237).\nDisplay calculated Patch Chroma.\nAWB temperature bias, lets try to reduce this value, a minimum may seem to optimize the algorithm.\n\nPatch size matching chroma optimization. -!TP_WBALANCE_PATCHLEVELLABEL;Patch: ΔE=%1 - datas x 9 Min:%2 Max=%3 -!TP_WBALANCE_PATCHLEVELLABEL_TOOLTIP;Display ΔE patch (this assumes there is enough spectral data), between image and spectral datas.\n Display read datas found. The 2 values correspond to the minimum and maximum data values taken into account. The coefficient x9 must be taken into account to obtain the number of pixels concerned in the image. -!TP_WBALANCE_STUDLABEL;Correlation factor: %1 Passes:%2 Worst_alt=%3 -!TP_WBALANCE_STUDLABEL0;Correlation factor: %1 Passes:%2 Alt=%3 -!TP_WBALANCE_STUDLABEL1;Correlation factor: %1 Passes:%2 Best_alt=%3 -!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.\n\nPasses : number of passes made.\nAlt_temp : Alternative temperature. !//TP_WBALANCE_ITCWBNOPURPLE_TOOLTIP;By default when "Inpaint opposed" is activated, purple colors are not taken into account. However, if the image does not need highlight reconstruction, or if this image naturally contains purple tints (flowers, etc.), it may be necessary to deactivate, to take into account all the colors. !//TP_WBALANCE_ITCWB_FORCED;Forces use of the entire CIE diagram diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index 94df4424f..38995f726 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -92,8 +92,6 @@ 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 EXIFPANEL_VALUE_NOT_SHOWN;Nie wyświetlane EXPORT_BYPASS;Kroki przetwarzania do pominięcia EXPORT_BYPASS_ALL;Zaznacz / Odznacz wszystkie @@ -1019,7 +1017,6 @@ PREFERENCES_APPEARANCE_COLORPICKERFONT;Czcionka narzędzia do wybierania koloró 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 @@ -1192,6 +1189,7 @@ PROGRESSBAR_LINEDENOISE;Liniowy filtr szumu... PROGRESSBAR_LOADING;Wczytywanie obrazu... PROGRESSBAR_LOADINGTHUMBS;Wczytywanie miniatur... PROGRESSBAR_LOADJPEG;Ładowanie pliku JPEG... +PROGRESSBAR_LOADJXL;Ładowanie pliku JXL... PROGRESSBAR_LOADPNG;Ładowanie pliku PNG... PROGRESSBAR_LOADTIFF;Ładowanie pliku TIFF... PROGRESSBAR_NOIMAGES;Nie znaleziono żadnych obrazów @@ -1540,7 +1538,6 @@ TP_EXPOSURE_COMPRHIGHLIGHTS;Kompresja podświetleń TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Próg kompresji podświetleń TP_EXPOSURE_COMPRSHADOWS;Kompresja cieni TP_EXPOSURE_CONTRAST;Kontrast -TP_EXPOSURE_CURVEEDITOR;Krzywa tonalna TP_EXPOSURE_CURVEEDITOR1;Krzywa Tonalna 1 TP_EXPOSURE_CURVEEDITOR2;Krzywa Tonalna 2 TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Więcej informacji na temat optymalnego wykorzystania obu krzywych jest dostępne w podręczniku (RawTherapee Manual) w dziale:\nThe Toolbox > Exposure Tab > Exposure Panel > Tone Curve\n(Narzędzie > Zakładka Ekspozycji > Krzywe Tonalne) @@ -1631,8 +1628,6 @@ 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 -TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Umieszcza kolory w gamie roboczej przestrzeni kolorów i stosuje korektę Munsell'a TP_LABCURVE_BRIGHTNESS;Światłość TP_LABCURVE_CHROMATICITY;Chromatyczność TP_LABCURVE_CHROMA_TOOLTIP;Aby zastosować tonowanie zdjęcia B&W, ustaw chromatyczność na -100. @@ -2072,6 +2067,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!FILEBROWSER_SHOWRECURSIVE;Show images in sub-folders recursively. !HISTORY_MSG_500;Local - Spot shape !HISTORY_MSG_501;Local - Spot method !HISTORY_MSG_502;Local - SC - Shape method @@ -2087,7 +2083,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !HISTORY_MSG_512;Local - SD - ΔE decay !HISTORY_MSG_513;Local - Spot - Excluding - Scope !HISTORY_MSG_514;Local - Spot structure -!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_515;Selective Editing !HISTORY_MSG_516;Local - Color and light !HISTORY_MSG_517;Local - Enable super !HISTORY_MSG_518;Local - Lightness @@ -2397,7 +2393,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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 - TG - Feather gradient +!HISTORY_MSG_833;Local - Mask 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 @@ -2640,7 +2636,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_1082;Local - CIECAM Auto threshold !HISTORY_MSG_1083;Local - CIECAM Hue !HISTORY_MSG_1084;Local - Uses Black Ev - White Ev !HISTORY_MSG_1085;Local - Jz lightness @@ -2747,16 +2743,23 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !HISTORY_MSG_ICM_AINTENT;Abstract profile intent !HISTORY_MSG_ICM_BLUX;Primaries Blue X !HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_CAT;Matrix adaptation !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_MIDTCIE;Midtones !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_PRESER;Preserve neutral !HISTORY_MSG_ICM_REDX;Primaries Red X !HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_REFI;Refinement Colors +!HISTORY_MSG_ICM_SHIFTX;Refinement Colors - Shift x +!HISTORY_MSG_ICM_SHIFTY;Refinement Colors - Shift y +!HISTORY_MSG_ICM_SMOOTHCIE;Smooth highlights +!HISTORY_MSG_ICM_TRCEXP;Abstract Profile !HISTORY_MSG_ICM_WORKING_GAMMA;TRC - Gamma !HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method !HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method @@ -2764,7 +2767,72 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !HISTORY_MSG_ICM_WORKING_TRC_METHOD;TRC method !HISTORY_MSG_ILLUM;CAL - SC - Illuminant !HISTORY_MSG_LOCALLAB_TE_PIVOT;Local - Equalizer pivot +!HISTORY_MSG_LOCAL_CIEMASK_BLURCONT;Local - CIECAM Mask blur contrast +!HISTORY_MSG_LOCAL_CIEMASK_BLURFFT;Local - CIECAM Mask blur FFTW +!HISTORY_MSG_LOCAL_CIEMASK_BLURRAD;Local - CIECAM Mask blur radius +!HISTORY_MSG_LOCAL_CIEMASK_CHH;Local - CIECAM Mask curve h(h) +!HISTORY_MSG_LOCAL_CIEMASK_HIGH;Local - CIECAM Mask highlights +!HISTORY_MSG_LOCAL_CIEMASK_SHAD;Local - CIECAM Mask shadows +!HISTORY_MSG_LOCAL_CIEMASK_STRU;Local - CIECAM Mask structure +!HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;Local - CIECAM Mask structure as tool +!HISTORY_MSG_LOCAL_CIEMASK_WLC;Local - CIECAM Mask wavelet L(L) +!HISTORY_MSG_LOCAL_CIEMASK_WLEV;Local - CIECAM Mask wavelet levels +!HISTORY_MSG_LOCAL_CIE_ANGGRAD;Local - CIECAM Gradient angle +!HISTORY_MSG_LOCAL_CIE_BLACKS;Local - CIECAM Blacks distribution +!HISTORY_MSG_LOCAL_CIE_BLUXL;Local - CIECAM Blue X +!HISTORY_MSG_LOCAL_CIE_BLUYL;Local - CIECAM Blue Y +!HISTORY_MSG_LOCAL_CIE_BRICOMP;Local - CIECAM Brightness compression +!HISTORY_MSG_LOCAL_CIE_BRICOMPTH;Local - CIECAM Brightness compression threshold +!HISTORY_MSG_LOCAL_CIE_BWCIE;Local - CIECAM Black and white +!HISTORY_MSG_LOCAL_CIE_CAT;Local - Matrix adaptation +!HISTORY_MSG_LOCAL_CIE_DETAILJZ;Local - JzCzHz Local contrast +!HISTORY_MSG_LOCAL_CIE_ENAMASKALL;Local - CIECAM All mask tools +!HISTORY_MSG_LOCAL_CIE_EXPPRECAM;Local - CIECAM Pre-Cam +!HISTORY_MSG_LOCAL_CIE_GAM;Local - CIECAM Gamma +!HISTORY_MSG_LOCAL_CIE_GAMUTCIE;Local - CIECAM Gamut +!HISTORY_MSG_LOCAL_CIE_GREXL;Local - CIECAM Green X +!HISTORY_MSG_LOCAL_CIE_GREYL;Local - CIECAM Green Y +!HISTORY_MSG_LOCAL_CIE_ILL;Local - CIECAM TRC Illuminant +!HISTORY_MSG_LOCAL_CIE_LOGCIEQ;Local - CIECAM Log encoding Q +!HISTORY_MSG_LOCAL_CIE_MIDT;Local - CIECAM Mid Tones +!HISTORY_MSG_LOCAL_CIE_NORM;Local - CIECAM Normalize L +!HISTORY_MSG_LOCAL_CIE_PRIM;Local - CIECAM TRC primaries +!HISTORY_MSG_LOCAL_CIE_REDXL;Local - CIECAM Red X +!HISTORY_MSG_LOCAL_CIE_REDYL;Local - CIECAM Red Y +!HISTORY_MSG_LOCAL_CIE_REFI;Local - CIECAM Refinement colors +!HISTORY_MSG_LOCAL_CIE_SATCIE;Local - CIECAM Saturation control +!HISTORY_MSG_LOCAL_CIE_SHIFTXL;Local - CIECAM Shift x +!HISTORY_MSG_LOCAL_CIE_SHIFTYL;Local - CIECAM Shift y +!HISTORY_MSG_LOCAL_CIE_SIG;Local - Sigmoid +!HISTORY_MSG_LOCAL_CIE_SIGADAP;Local - CIECAM Sigmoid adaptability +!HISTORY_MSG_LOCAL_CIE_SIGMET;Local - CIECAM Sigmoid method +!HISTORY_MSG_LOCAL_CIE_SLOP;Local - CIECAM Slope +!HISTORY_MSG_LOCAL_CIE_SLOPESMO;Local - CIECAM Gray balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOB;Local - CIECAM Blue balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOG;Local - CIECAM Green balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOR;Local - CIECAM Red balance +!HISTORY_MSG_LOCAL_CIE_SMOOTH;Local - CIECAM Scale Yb scene +!HISTORY_MSG_LOCAL_CIE_SMOOTHMET;Local - CIECAM Smooth lights method +!HISTORY_MSG_LOCAL_CIE_SMOOTHYB;Local - CIECAM Scale Yb viewing +!HISTORY_MSG_LOCAL_CIE_SMOOTH_LUM;Local - CIECAM Levels - Luminosity mode +!HISTORY_MSG_LOCAL_CIE_STRGRAD;Local - CIECAM Gradient strength L +!HISTORY_MSG_LOCAL_CIE_STRLOG;Local - CIECAM Log encoding strength +!HISTORY_MSG_LOCAL_CIE_TRC;Local - CIECAM TRC +!HISTORY_MSG_LOCAL_CIE_WHITES;Local - CIECAM Whites distribution +!HISTORY_MSG_LOCAL_DEHAZE_BLACK;Local - Dehaze Black +!HISTORY_MSG_LOCAL_FEATHERCIE;Local - CIECAM Gradient feather +!HISTORY_MSG_LOCAL_FEATHERCOL;Local - Color Gradient feather +!HISTORY_MSG_LOCAL_FEATHEREXE;Local - Exp Gradient feather +!HISTORY_MSG_LOCAL_FEATHERLOG;Local - Log Gradient feather +!HISTORY_MSG_LOCAL_FEATHERMAS;Local - Mask Common gradient feather +!HISTORY_MSG_LOCAL_FEATHERSH;Local - SH Gradient feather +!HISTORY_MSG_LOCAL_FEATHERVIB;Local - Vib Gradient feather +!HISTORY_MSG_LOCAL_FEATHERWAV;Local - Wav Gradient feather !HISTORY_MSG_LOCAL_GAMUTMUNSEL;Local - SC - Avoid Color Shift +!HISTORY_MSG_LOCAL_LOG_BLACKS;Local - Log Blacks distribution +!HISTORY_MSG_LOCAL_LOG_COMPR;Local - Log Compress brightness +!HISTORY_MSG_LOCAL_LOG_SAT;Local - Log Saturation control +!HISTORY_MSG_LOCAL_LOG_WHITES;Local - Log Whites distribution !HISTORY_MSG_LOCAL_TMO_SATUR;Local Exp Fattal Saturation !HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost @@ -2877,18 +2945,18 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_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. -!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB;Selective Editing !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%. +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%, or when capture sharpening is enabled. !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_FLATFIELDFROMMETADATA;Flat-field from Metadata -!PARTIALPASTE_LOCALLAB;Local Adjustments -!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings +!PARTIALPASTE_LOCALLAB;Selective Editing +!PARTIALPASTE_LOCALLABGROUP;Selective Editing Settings !PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !PARTIALPASTE_PREPROCWB;Preprocess White Balance @@ -2901,13 +2969,16 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !PARTIALPASTE_SPOT;Spot removal !PARTIALPASTE_TONE_EQUALIZER;Tone equalizer !PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit +!PREFERENCES_BROWSERECURSIVEDEPTH;Browse sub-folders depth +!PREFERENCES_BROWSERECURSIVEFOLLOWLINKS;Follow symbolic links when browsing sub-folders +!PREFERENCES_BROWSERECURSIVEMAXDIRS;Maximum sub-folders !PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: !PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CAMERAPROFILESDIR;Camera profiles directory !PREFERENCES_CIE;Ciecam !PREFERENCES_CIEARTIF;Avoid artifacts !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs -!PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments +!PREFERENCES_COMPLEXITYLOC;Default complexity for Selective Editing !PREFERENCES_COMPLEXITY_EXP;Advanced !PREFERENCES_COMPLEXITY_NORM;Standard !PREFERENCES_COMPLEXITY_SIMP;Basic @@ -2930,6 +3001,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !PREFERENCES_LENSFUNDBDIR_TOOLTIP;Directory containing the Lensfun database. Leave empty to use the default directories. !PREFERENCES_LENSPROFILESDIR;Lens profiles directory !PREFERENCES_LENSPROFILESDIR_TOOLTIP;Directory containing Adobe Lens Correction Profiles (LCPs) +!PREFERENCES_MAX_ZOOM_TITLE;Maximum zoom !PREFERENCES_METADATA;Metadata !PREFERENCES_METADATA_SYNC;Metadata synchronization with XMP sidecars !PREFERENCES_METADATA_SYNC_NONE;Off @@ -2941,18 +3013,22 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !PREFERENCES_PRINTER;Printer (Soft-Proofing) !PREFERENCES_PROFILESAVEBOTH;Save processing profile both to the cache and next to the input file !PREFERENCES_PRTINTENT;Rendering intent +!PREFERENCES_RAW_DECODER;Raw Decoder +!PREFERENCES_RAW_DECODER_ENABLE_LIBRAW;Use LibRaw !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in 'Single Editor Tab Mode' and when 'Demosaicing method used for the preview at <100% zoom' is set to 'As in PP3'. !PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now !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_SHOWTOOLTIP;Show Selective Editing advice tooltips +!PREFERENCES_SPOTLOC;Define Spot method for Selective Editing !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules !PREFERENCES_TAB_FAVORITES;Favorites !PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview !PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering !PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise +!PREFERENCES_THUMBNAIL_RANK_COLOR_MODE;Load/Save thumbnail rank and color from/to XMP sidecars !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. @@ -2975,6 +3051,27 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !PREFERENCES_XMP_SIDECAR_MODE_EXT;darktable-like (FILENAME.ext.xmp for FILENAME.ext) !PREFERENCES_XMP_SIDECAR_MODE_STD;Standard (FILENAME.xmp for FILENAME.ext) !PREFERENCES_ZOOMONSCROLL;Zoom images by scrolling +!QUEUE_DESTPREVIEW_TITLE;Select a thumbnail to preview its destination path here +!QUEUE_DESTPREVIEW_TOOLTIP;Destination path for the first selected image appears here +!QUEUE_LOCATION_TEMPLATE_HELP_BUTTON_TOOLTIP;Show or hide a help panel with instructions for creating location templates +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_BODY;If you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p-3/converted/%P-4/%f +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_TITLE;Common examples +!QUEUE_LOCATION_TEMPLATE_HELP_INTRO;The output template field allows you to to dynamically customize the destination folder and filename. When you include certain specifiers, which begin with %, they are replaced by the program when each file is being saved.\n\nThe sections below describe each type of specifier. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_1;Using this pathname as an example: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_2;The meanings of the formatting strings are: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_LINUX;/home/tom/photos/2010-10-31/photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_WINDOWS;D:\tom\photos\2010-10-31\photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO;The %dN, %d-N, %pN, %p-N, %PN and %P-N (N = 1..9) specifiers will be replaced by elements of the image file's directory path.\nThe format specifiers operate as follows:\n %dN = Nth directory from the end of the path\n %d-N = Nth directory from the start of the path\n %pN = all directories up to the Nth from the end of the path\n %p-N = the first N directories in the path\n %PN = the last N directories in the path\n %P-N = all directories from the Nth to the end of the path\n %f = base filename (no extension) +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO_WINDOWS;For Windows paths, %d-1 is the drive letter and colon, and %d-2 is the base directory on that drive. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_TITLE;Directories and partial paths +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_BODY;%r will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used. +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_TITLE;Rank +!QUEUE_LOCATION_TEMPLATE_HELP_RESULT_MISMATCH;ERROR: 2nd result is different: +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_BODY;%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'. +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_TITLE;Position/sequence in queue +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_BODY;Three different date/time values may be used in templates:\n %tE"%Y-%m-%d" = when export started\n %tF"%Y-%m-%d" = when file was last saved\n %tP"%Y-%m-%d" = when photo was taken\nThe quoted string defines the format of the resulting date and/or time. The format string %tF"%Y-%m-%d" is just one example. The string can use all conversion specifiers defined for the g_date_time_format function (see https://docs.gtk.org/glib/method.DateTime.format.html).\n\nExample format strings: +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_TITLE;Date and time +!QUEUE_LOCATION_TEMPLATE_HELP_TITLE;Creating an output template !QUEUE_STARTSTOP_TOOLTIP;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !SAVEDLG_BIGTIFF;BigTIFF (no metadata support) !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. @@ -2987,12 +3084,16 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !SORT_BY_NAME;By Name !SORT_BY_RANK;By Rank !SORT_DESCENDING;Descending +!TC_LOCALLAB_PRIM_SHIFTX;Shift x +!TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP;In combination with "Refine colors", allows you to:\n 1) for low values, adjust the image purity.\n 2) for higher values, carry out moderate color toning.\nBe careful not to go outside the CIE xy diagram. +!TC_LOCALLAB_PRIM_SHIFTY;Shift y !TC_PRIM_BLUX;Bx !TC_PRIM_BLUY;By !TC_PRIM_GREX;Gx !TC_PRIM_GREY;Gy !TC_PRIM_REDX;Rx !TC_PRIM_REDY;Ry +!TC_PRIM_REFI;Refine colors (white-point) !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_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. @@ -3086,6 +3187,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_BW;Black and White !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)'. @@ -3101,8 +3203,15 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_ICM_SAVEREFERENCE;Save Reference Image !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_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 three main uses - channel mixer, restore image color (saturation), 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_CAT;Matrix adaptation +!TP_ICM_WORKING_CAT_BRAD;Bradford +!TP_ICM_WORKING_CAT_CAT02;Cat02 +!TP_ICM_WORKING_CAT_CAT16;Cat16 +!TP_ICM_WORKING_CAT_TOOLTIP;Performs the chromatic adaptation of the XYZ conversion matrix. Default: Bradford +!TP_ICM_WORKING_CAT_VK;Von Kries +!TP_ICM_WORKING_CAT_XYZ;XYZ scale !TP_ICM_WORKING_CIEDIAG;CIE xy diagram !TP_ICM_WORKING_ILLU;Illuminant !TP_ICM_WORKING_ILLU_1500;Tungsten 1500K @@ -3114,11 +3223,13 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_ICM_WORKING_ILLU_D65;D65 !TP_ICM_WORKING_ILLU_D80;D80 !TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_E;E !TP_ICM_WORKING_ILLU_NONE;Default !TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_NON;None !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_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination primaries' combo box, 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 @@ -3127,17 +3238,21 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_FREE;Custom LA (sliders) !TP_ICM_WORKING_PRIM_JDCMAX;JDC Max +!TP_ICM_WORKING_PRIM_JDCMAXSTDA;JDC Max stdA !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_TOOLTIP;Performs a gamut control. Destination primaries (Advanced) allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified.\nWhen 'Custom LA (sliders)' is selected, you can modify the values of the 3 primaries (Red, Green, and Blue) for x and y. !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_CORRECTION_METADATA;From file metadata !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_LOCALLAB_ACTIV;Luminance only !TP_LOCALLAB_ACTIVSPOT;Enable Spot @@ -3146,9 +3261,9 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_AUTOGRAYCIE;Automatic !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_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab). Default: Munsell only.\n\nMunsell only: 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. The result is not the same as Lab. !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 @@ -3191,9 +3306,12 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_LOCALLAB_BUTTON_DUPL;Duplicate !TP_LOCALLAB_BUTTON_REN;Rename !TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWEVNONE;None +!TP_LOCALLAB_BWEVSIG;Activated +!TP_LOCALLAB_BWEVSIGLOG;Sigmoid & Log-Encoding !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_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16 (experimental). 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, for example, to match CAM16 processing with the maximum monitor brightness of 400cd/m2. !TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments !TP_LOCALLAB_CAMMODE;CAM model !TP_LOCALLAB_CAMMODE_CAM16;CAM 16 @@ -3233,6 +3351,12 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_SMOOTHFRAME;Highlight Attenuation & Levels +!TP_LOCALLAB_CIE_SMOOTH_EV;Ev based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA;Slope based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF;Gamma based +!TP_LOCALLAB_CIE_SMOOTH_LEVELS;Levels +!TP_LOCALLAB_CIE_SMOOTH_NONE;None !TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) !TP_LOCALLAB_CIRCRADIUS;Spot size !TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the 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. @@ -3248,8 +3372,9 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_COLORDEPREV_TOOLTIP;Preview ΔE button in Settings will only work if you have activated 'Sharpening', 'Soft Light and Original Retinex', 'Blur/Grain and Denoise', 'Dehaze and Retinex', or 'Contrast by Detail Levels' in the 'Add tool to current spot' menu.\nFor others tools, the Preview ΔE button is in the tool, which allows previewing ΔE with several tools enabled. Prefer using Mask and modifications. !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_COLORFRAME;Dominant color !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 @@ -3257,7 +3382,10 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_LOCALLAB_COL_NAME;Name !TP_LOCALLAB_COL_VIS;Status !TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPRCIE;Brightness compression +!TP_LOCALLAB_COMPRCIETH;Compression threshold !TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_COMPRLOG_TOOLTIP;This algorithm compress the data before log conversion, above the threshold slider value. To use in conjunction with Whites distribution. !TP_LOCALLAB_CONTCOL;Contrast threshold !TP_LOCALLAB_CONTFRA;Contrast by level !TP_LOCALLAB_CONTRAST;Contrast @@ -3272,7 +3400,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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 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 spot. -!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combo box 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. @@ -3281,13 +3409,14 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_LOCALLAB_DARKRETI;Darkness !TP_LOCALLAB_DEHAFRA;Dehaze !TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZE_BLACK;Black !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_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. @@ -3307,6 +3436,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_LOCALLAB_DETAILFRA;Edge detection - DCT !TP_LOCALLAB_DETAILSH;Details !TP_LOCALLAB_DETAILTHR;Lum/chrom detail threshold +!TP_LOCALLAB_DISAB_CIECAM;Disable Ciecam or Weak Jz surround !TP_LOCALLAB_DIVGR;Gamma !TP_LOCALLAB_DUPLSPOTNAME;Copy !TP_LOCALLAB_EDGFRA;Edge sharpness @@ -3315,6 +3445,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping !TP_LOCALLAB_ENABLE_MASK;Enable mask !TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENABLE_MASKALL;Enable all mask tools !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 @@ -3330,9 +3461,10 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all selective editing data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\nUse 'Scope' (Excluding) to set the exclusion intensity.\n\n'Full image' allows you to use the selective editing tools on the whole image.\nThe RT Spot delimiters are set beyond the image preview boundaries.\nThe 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.\nNote: 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.\n\n'Global' allows you to use the selective editing tools on the whole image, without using Delta E or transitions. !TP_LOCALLAB_EXECLU;Excluding spot !TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXMAIN;Global !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 @@ -3341,11 +3473,11 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Selective Editing 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 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_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. @@ -3367,7 +3499,8 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_LOCALLAB_FATSAT;Saturation control !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_FEATVALUE;Feather gradient +!TP_LOCALLAB_FEATVALUE_MASK;Feather gradient (Grad. Filters Mask) !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 @@ -3463,7 +3596,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_LABEL;Selective Editing !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 @@ -3508,8 +3641,10 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_LOGCIE;Log encoding +!TP_LOCALLAB_LOGCIEQ;Log Encoding Q (with Ciecam) +!TP_LOCALLAB_LOGCIEQ_TOOLTIP;Activating the checkbox allows you to switch between log encoding based on the 3 RGB channels, and log encoding based solely on Ciecam’s brightness (Q) channel.\nUsing the Q channel instead of the RGB channels helps avoid undesirable edge effects such as hue and saturation shifts.\nHowever, the settings are more difficult to optimise because Q is unbounded and Ciecam alters the data to take into account the surround conditions, simultaneous contrast, etc.\nYou may have to adjust the following:\n Scene conditions: Mean luminance (Yb), Whites & Blacks distribution, Black Ev, White Ev.\n Source Data Adjustments : Brightness compression, Strength.\n\nNote: when using Log Encoding (Q), be careful not to activate the Disable Ciecam option in the Scene Conditions, Surround menu. +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you to use Black Ev, White Ev, White and Black distribution, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using 'Log encoding' with Brightness compression. !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) @@ -3517,7 +3652,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_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 @@ -3530,6 +3665,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_LOGPFRA2;Log Encoding settings !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. @@ -3599,7 +3735,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_MASKUNUSABLE;Mask disabled (Enable in 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 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 @@ -3635,6 +3771,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_LOCALLAB_MERTWE;Exclusion !TP_LOCALLAB_MERTWO;Subtract !TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MIDTCIE;Midtones !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 @@ -3682,10 +3819,15 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_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_PRECAMGAMUT_TOOLTIP;If checked, ensures a gamut control just after primary conversion to XYZ. +!TP_LOCALLAB_PRECAMREFIMAIN_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. In combination with "Shift x" and "Shift y", allows you to carry out moderate color toning. +!TP_LOCALLAB_PRECAMREFI_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. +!TP_LOCALLAB_PRECAM_TOOLTIP;'Source Data Adjustments' modifies the Dynamic Range using Log encoding, the tones of the image and primaries (simplified Abstract Profile), and midtones, just before the Ciecam process. These values are adjustable:\nGamma: Acts mainly on light tones\nSlope: Acts mainly on dark tones. You 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.\nDestination primaries: Allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified. You can also finely adapt the primaries and the illuminant (white-point). Moving a primary away from the white point reduces saturation and vice versa. Pay attention to the gamut. !TP_LOCALLAB_PREVHIDE;Hide additional settings !TP_LOCALLAB_PREVIEW;Preview ΔE !TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PRIMILLFRAME;Primaries & Illuminant !TP_LOCALLAB_PROXI;ΔE decay !TP_LOCALLAB_QUAAGRES;Aggressive !TP_LOCALLAB_QUACONSER;Conservative @@ -3730,10 +3872,11 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_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_SATCIE;Saturation control !TP_LOCALLAB_SATUR;Saturation !TP_LOCALLAB_SATURV;Saturation (s) !TP_LOCALLAB_SCALEGR;Scale @@ -3754,7 +3897,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_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;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. @@ -3800,17 +3943,41 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_SIGBLACKSSCIE;Blacks distribution +!TP_LOCALLAB_SIGCIE;Sigmoid +!TP_LOCALLAB_SIGFRA;Sigmoid Q +!TP_LOCALLAB_SIGGAMJCIE;Gamma !TP_LOCALLAB_SIGJZFRA;Sigmoid Jz !TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOID16_TOOLTIP;Allows you to simulate a tone mapping appearance using both 'Ciecam' and 'Sigmoid Q'. Sigmoid Q has three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc) Adaptability weights the action of the sigmoid by action on the internal exponential function. !TP_LOCALLAB_SIGMOIDBL;Blend !TP_LOCALLAB_SIGMOIDLAMBDA;Contrast -!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDLOGAUTO;Auto threshold +!TP_LOCALLAB_SIGMOIDLOGEV_TOOLTIP;If the combo box selection 'Black Ev and White Ev' is 'Sigmoid and Log encoding' instead of 'Sigmoid only', the two algorithms 'Log encoding' and 'Sigmoid' are used together. +!TP_LOCALLAB_SIGMOIDNORMCIE;Normalize Luminance +!TP_LOCALLAB_SIGMOIDNORMCIEBLEND_TOOLTIP;Blend acts on the final aspect of the image, contrast and luminance. Ratio between original and output image. +!TP_LOCALLAB_SIGMOIDNORMCIE_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image take into account those of the original.\nAll the adjustments acting on J or Q are taken into account, including those which are not relative to Sigmoid Q. +!TP_LOCALLAB_SIGMOIDQJ;Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDQJCOMPRCIE_TOOLTIP;When the combo box selection 'Uses Black Ev and White Ev' is 'Sigmoid and Log encoding Q' or 'Log encoding instead of Sigmoid' checked. This algorithm compress the data above the threshold slider value. The last value stands for brightness (Q) and should be close as possible to the value 'Compression threshold' (calculate when 'Auto threshold" checked, often > 1). +!TP_LOCALLAB_SIGMOIDSENSI;Adaptability !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_SIGMOIDWHITESCIE_TOOLTIP;Allows you, in Automatic when the dynamic range of the image is high, to change the distribution of lights in whites and deep blacks.\nCan be used with Log encoding or Sigmoid with Black Ev and White Ev enabled.\n\nThe algorithm does not change the basic data, but acts on the components necessary to calculate the Dynamic range, Black Ev, White Ev and the Gray point. +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a tone mapping appearance using both the 'Jz' and 'Sigmoid' function. Three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SIGSLOPJCIE;Slope +!TP_LOCALLAB_SIGTRCCIE;Source Data Adjustments +!TP_LOCALLAB_SIGWHITESCIE;Whites distribution !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_SLOPESMOOTH;Gray balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHB;Blue balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHG;Green balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHR;Red balance (Slope) !TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SMOOTHCIE;Highlight Attenuation +!TP_LOCALLAB_SMOOTHCIE_LUM;Luminosity mode +!TP_LOCALLAB_SMOOTHCIE_SCA;Scale Yb Scene +!TP_LOCALLAB_SMOOTHCIE_TOOLTIP;Completes the processing carried out by gamma, slope and midtones by causing a slight lowering of lights. Please note this does not replace Highlight reconstruction.\n\nGamma based and Slope based (Standard and Advanced) allow you to simulate a tone mapping using:\na) Scene conditions: Black-Ev, White-Ev, Mean luminance (Yb%)\nb) Viewing conditions: Mean luminance (Yb%).\n\nScale Yb Scene is function of White-Ev. +!TP_LOCALLAB_SMOOTHCIE_YB;Scale Yb Viewing !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. @@ -3832,13 +3999,14 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_STRENGTHCIELOG;Strength !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_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. @@ -3870,11 +4038,12 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_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_TRCFRAME;Tone Response Curve & Midtones !TP_LOCALLAB_USEMASK;Laplacian !TP_LOCALLAB_VART;Variance (contrast) !TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool @@ -4202,7 +4371,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_WAVELET_WAVOFFSET;Offset !TP_WBALANCE_AUTOITCGREEN;Temperature correlation !TP_WBALANCE_AUTOOLD;RGB grey -!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement +!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement !TP_WBALANCE_ITCWALG_TOOLTIP;Allows you to switch to the other Alternative temperature (Alt_temp), when possible.\nInactive in the "single choice" case. !TP_WBALANCE_ITCWBDELTA_TOOLTIP;Fixed for each "green" iteration tried, the temperature difference to be taken into account. !TP_WBALANCE_ITCWBFGREEN_TOOLTIP;Find the best compromise between Student and green. @@ -4245,7 +4414,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_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).\nIn the rare case of a color drift with "Observer 2°" (probably due to the conversion matrix) "Observer 10°" must be selected. !TP_WBALANCE_PATCHLABEL;Read colors:%1 Patch: Chroma:%2 Size=%3 !TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colors (max=237).\nDisplay calculated Patch Chroma.\nAWB temperature bias, lets try to reduce this value, a minimum may seem to optimize the algorithm.\n\nPatch size matching chroma optimization. !TP_WBALANCE_PATCHLEVELLABEL;Patch: ΔE=%1 - datas x 9 Min:%2 Max=%3 diff --git a/rtdata/languages/Portugues b/rtdata/languages/Portugues index 77ffcaf40..2e07efdba 100644 --- a/rtdata/languages/Portugues +++ b/rtdata/languages/Portugues @@ -76,8 +76,6 @@ EXIFPANEL_RESET;Repor EXIFPANEL_RESETALL;Repor tudo EXIFPANEL_RESETALLHINT;Repor os valores originais de todas as etiquetas. EXIFPANEL_RESETHINT;Repor os valores originais das etiquetas selecionadas. -EXIFPANEL_SHOWALL;Mostrar tudo -EXIFPANEL_SUBDIRECTORY;Sub-pasta EXPORT_BYPASS;Etapas do processamento a ignorar EXPORT_BYPASS_ALL;Marcar / desmarcar tudo EXPORT_BYPASS_DEFRINGE;Ignorar o remover de orlas púrpuras @@ -1197,6 +1195,7 @@ PROFILEPANEL_TOOLTIPSAVE;Guardar o perfil atual.\nCtrl-click para selecio PROGRESSBAR_LOADING;A carregar a imagem... PROGRESSBAR_LOADINGTHUMBS;A carregar as miniaturas... PROGRESSBAR_LOADJPEG;A carregar o ficheiro JPEG... +PROGRESSBAR_LOADJXL;A carregar o ficheiro JXL... PROGRESSBAR_LOADPNG;A carregar o ficheiro PNG... PROGRESSBAR_LOADTIFF;A carregar o ficheiro TIFF... PROGRESSBAR_NOIMAGES;Não foi encontrada nenhuma imagem @@ -1672,8 +1671,6 @@ TP_ICM_WORKING_TRC_SLOPE;Declive TP_ICM_WORKING_TRC_TOOLTIP;Apenas para perfis internos TP_IMPULSEDENOISE_LABEL;Redução de ruído por impulso TP_IMPULSEDENOISE_THRESH;Limite -TP_LABCURVE_AVOIDCOLORSHIFT;Evitar mudança de cor -TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Encaixar as cores na gama do espaço de cores utilizado e aplicar a correção Munsell. TP_LABCURVE_BRIGHTNESS;Claridade TP_LABCURVE_CHROMATICITY;Cromaticidade TP_LABCURVE_CHROMA_TOOLTIP;Para aplicar a tonificação a preto e branco, configure a cromaticidade para -100. @@ -2247,6 +2244,7 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_POPUPSORTBY;Sort Files !FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. +!FILEBROWSER_SHOWRECURSIVE;Show images in sub-folders recursively. !FILECHOOSER_FILTER_EXECUTABLE;Executable files !GENERAL_DELETE_ALL;Delete all !GENERAL_EDIT;Edit @@ -2297,7 +2295,7 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !HISTORY_MSG_512;Local - SD - ΔE decay !HISTORY_MSG_513;Local - Spot - Excluding - Scope !HISTORY_MSG_514;Local - Spot structure -!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_515;Selective Editing !HISTORY_MSG_516;Local - Color and light !HISTORY_MSG_517;Local - Enable super !HISTORY_MSG_518;Local - Lightness @@ -2607,7 +2605,7 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !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 - TG - Feather gradient +!HISTORY_MSG_833;Local - Mask 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 @@ -2850,7 +2848,7 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !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_1082;Local - CIECAM Auto threshold !HISTORY_MSG_1083;Local - CIECAM Hue !HISTORY_MSG_1084;Local - Uses Black Ev - White Ev !HISTORY_MSG_1085;Local - Jz lightness @@ -2944,18 +2942,90 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !HISTORY_MSG_ICM_AINTENT;Abstract profile intent !HISTORY_MSG_ICM_BLUX;Primaries Blue X !HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_CAT;Matrix adaptation !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_MIDTCIE;Midtones !HISTORY_MSG_ICM_PRESER;Preserve neutral !HISTORY_MSG_ICM_REDX;Primaries Red X !HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_REFI;Refinement Colors +!HISTORY_MSG_ICM_SHIFTX;Refinement Colors - Shift x +!HISTORY_MSG_ICM_SHIFTY;Refinement Colors - Shift y +!HISTORY_MSG_ICM_SMOOTHCIE;Smooth highlights +!HISTORY_MSG_ICM_TRCEXP;Abstract Profile !HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method !HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method !HISTORY_MSG_ILLUM;CAL - SC - Illuminant !HISTORY_MSG_LOCALLAB_TE_PIVOT;Local - Equalizer pivot +!HISTORY_MSG_LOCAL_CIEMASK_BLURCONT;Local - CIECAM Mask blur contrast +!HISTORY_MSG_LOCAL_CIEMASK_BLURFFT;Local - CIECAM Mask blur FFTW +!HISTORY_MSG_LOCAL_CIEMASK_BLURRAD;Local - CIECAM Mask blur radius +!HISTORY_MSG_LOCAL_CIEMASK_CHH;Local - CIECAM Mask curve h(h) +!HISTORY_MSG_LOCAL_CIEMASK_HIGH;Local - CIECAM Mask highlights +!HISTORY_MSG_LOCAL_CIEMASK_SHAD;Local - CIECAM Mask shadows +!HISTORY_MSG_LOCAL_CIEMASK_STRU;Local - CIECAM Mask structure +!HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;Local - CIECAM Mask structure as tool +!HISTORY_MSG_LOCAL_CIEMASK_WLC;Local - CIECAM Mask wavelet L(L) +!HISTORY_MSG_LOCAL_CIEMASK_WLEV;Local - CIECAM Mask wavelet levels +!HISTORY_MSG_LOCAL_CIE_ANGGRAD;Local - CIECAM Gradient angle +!HISTORY_MSG_LOCAL_CIE_BLACKS;Local - CIECAM Blacks distribution +!HISTORY_MSG_LOCAL_CIE_BLUXL;Local - CIECAM Blue X +!HISTORY_MSG_LOCAL_CIE_BLUYL;Local - CIECAM Blue Y +!HISTORY_MSG_LOCAL_CIE_BRICOMP;Local - CIECAM Brightness compression +!HISTORY_MSG_LOCAL_CIE_BRICOMPTH;Local - CIECAM Brightness compression threshold +!HISTORY_MSG_LOCAL_CIE_BWCIE;Local - CIECAM Black and white +!HISTORY_MSG_LOCAL_CIE_CAT;Local - Matrix adaptation +!HISTORY_MSG_LOCAL_CIE_DETAILJZ;Local - JzCzHz Local contrast +!HISTORY_MSG_LOCAL_CIE_ENAMASKALL;Local - CIECAM All mask tools +!HISTORY_MSG_LOCAL_CIE_EXPPRECAM;Local - CIECAM Pre-Cam +!HISTORY_MSG_LOCAL_CIE_GAM;Local - CIECAM Gamma +!HISTORY_MSG_LOCAL_CIE_GAMUTCIE;Local - CIECAM Gamut +!HISTORY_MSG_LOCAL_CIE_GREXL;Local - CIECAM Green X +!HISTORY_MSG_LOCAL_CIE_GREYL;Local - CIECAM Green Y +!HISTORY_MSG_LOCAL_CIE_ILL;Local - CIECAM TRC Illuminant +!HISTORY_MSG_LOCAL_CIE_LOGCIEQ;Local - CIECAM Log encoding Q +!HISTORY_MSG_LOCAL_CIE_MIDT;Local - CIECAM Mid Tones +!HISTORY_MSG_LOCAL_CIE_NORM;Local - CIECAM Normalize L +!HISTORY_MSG_LOCAL_CIE_PRIM;Local - CIECAM TRC primaries +!HISTORY_MSG_LOCAL_CIE_REDXL;Local - CIECAM Red X +!HISTORY_MSG_LOCAL_CIE_REDYL;Local - CIECAM Red Y +!HISTORY_MSG_LOCAL_CIE_REFI;Local - CIECAM Refinement colors +!HISTORY_MSG_LOCAL_CIE_SATCIE;Local - CIECAM Saturation control +!HISTORY_MSG_LOCAL_CIE_SHIFTXL;Local - CIECAM Shift x +!HISTORY_MSG_LOCAL_CIE_SHIFTYL;Local - CIECAM Shift y +!HISTORY_MSG_LOCAL_CIE_SIG;Local - Sigmoid +!HISTORY_MSG_LOCAL_CIE_SIGADAP;Local - CIECAM Sigmoid adaptability +!HISTORY_MSG_LOCAL_CIE_SIGMET;Local - CIECAM Sigmoid method +!HISTORY_MSG_LOCAL_CIE_SLOP;Local - CIECAM Slope +!HISTORY_MSG_LOCAL_CIE_SLOPESMO;Local - CIECAM Gray balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOB;Local - CIECAM Blue balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOG;Local - CIECAM Green balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOR;Local - CIECAM Red balance +!HISTORY_MSG_LOCAL_CIE_SMOOTH;Local - CIECAM Scale Yb scene +!HISTORY_MSG_LOCAL_CIE_SMOOTHMET;Local - CIECAM Smooth lights method +!HISTORY_MSG_LOCAL_CIE_SMOOTHYB;Local - CIECAM Scale Yb viewing +!HISTORY_MSG_LOCAL_CIE_SMOOTH_LUM;Local - CIECAM Levels - Luminosity mode +!HISTORY_MSG_LOCAL_CIE_STRGRAD;Local - CIECAM Gradient strength L +!HISTORY_MSG_LOCAL_CIE_STRLOG;Local - CIECAM Log encoding strength +!HISTORY_MSG_LOCAL_CIE_TRC;Local - CIECAM TRC +!HISTORY_MSG_LOCAL_CIE_WHITES;Local - CIECAM Whites distribution +!HISTORY_MSG_LOCAL_DEHAZE_BLACK;Local - Dehaze Black +!HISTORY_MSG_LOCAL_FEATHERCIE;Local - CIECAM Gradient feather +!HISTORY_MSG_LOCAL_FEATHERCOL;Local - Color Gradient feather +!HISTORY_MSG_LOCAL_FEATHEREXE;Local - Exp Gradient feather +!HISTORY_MSG_LOCAL_FEATHERLOG;Local - Log Gradient feather +!HISTORY_MSG_LOCAL_FEATHERMAS;Local - Mask Common gradient feather +!HISTORY_MSG_LOCAL_FEATHERSH;Local - SH Gradient feather +!HISTORY_MSG_LOCAL_FEATHERVIB;Local - Vib Gradient feather +!HISTORY_MSG_LOCAL_FEATHERWAV;Local - Wav Gradient feather !HISTORY_MSG_LOCAL_GAMUTMUNSEL;Local - SC - Avoid Color Shift +!HISTORY_MSG_LOCAL_LOG_BLACKS;Local - Log Blacks distribution +!HISTORY_MSG_LOCAL_LOG_COMPR;Local - Log Compress brightness +!HISTORY_MSG_LOCAL_LOG_SAT;Local - Log Saturation control +!HISTORY_MSG_LOCAL_LOG_WHITES;Local - Log Whites distribution !HISTORY_MSG_LOCAL_TMO_SATUR;Local Exp Fattal Saturation !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold !HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius @@ -3051,20 +3121,22 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 !INSPECTOR_WINDOW_TITLE;Inspector !MAIN_FRAME_PLACES_DEL;Remove -!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB;Selective Editing !MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o !PARTIALPASTE_FILMNEGATIVE;Film negative !PARTIALPASTE_FLATFIELDFROMMETADATA;Flat-field from Metadata -!PARTIALPASTE_LOCALLAB;Local Adjustments -!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings +!PARTIALPASTE_LOCALLAB;Selective Editing +!PARTIALPASTE_LOCALLABGROUP;Selective Editing Settings !PARTIALPASTE_PREPROCWB;Preprocess White Balance !PARTIALPASTE_SPOT;Spot removal !PARTIALPASTE_TONE_EQUALIZER;Tone equalizer -!PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode +!PREFERENCES_BROWSERECURSIVEDEPTH;Browse sub-folders depth +!PREFERENCES_BROWSERECURSIVEFOLLOWLINKS;Follow symbolic links when browsing sub-folders +!PREFERENCES_BROWSERECURSIVEMAXDIRS;Maximum sub-folders !PREFERENCES_CAMERAPROFILESDIR;Camera profiles directory !PREFERENCES_CIE;Ciecam !PREFERENCES_CIEARTIF;Avoid artifacts -!PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments +!PREFERENCES_COMPLEXITYLOC;Default complexity for Selective Editing !PREFERENCES_COMPLEXITY_EXP;Advanced !PREFERENCES_COMPLEXITY_NORM;Standard !PREFERENCES_COMPLEXITY_SIMP;Basic @@ -3084,13 +3156,18 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !PREFERENCES_LENSFUNDBDIR_TOOLTIP;Directory containing the Lensfun database. Leave empty to use the default directories. !PREFERENCES_LENSPROFILESDIR;Lens profiles directory !PREFERENCES_LENSPROFILESDIR_TOOLTIP;Directory containing Adobe Lens Correction Profiles (LCPs) +!PREFERENCES_MAX_ZOOM_TITLE;Maximum zoom !PREFERENCES_METADATA;Metadata !PREFERENCES_METADATA_SYNC;Metadata synchronization with XMP sidecars !PREFERENCES_METADATA_SYNC_NONE;Off !PREFERENCES_METADATA_SYNC_READ;Read only !PREFERENCES_METADATA_SYNC_READWRITE;Bidirectional -!PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips +!PREFERENCES_RAW_DECODER;Raw Decoder +!PREFERENCES_RAW_DECODER_ENABLE_LIBRAW;Use LibRaw +!PREFERENCES_SHOWTOOLTIP;Show Selective Editing advice tooltips +!PREFERENCES_SPOTLOC;Define Spot method for Selective Editing !PREFERENCES_TAB_FAVORITES;Favorites +!PREFERENCES_THUMBNAIL_RANK_COLOR_MODE;Load/Save thumbnail rank and color from/to XMP sidecars !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. @@ -3119,6 +3196,27 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !PROGRESSBAR_HOTDEADPIXELFILTER;Hot/dead pixel filter... !PROGRESSBAR_LINEDENOISE;Line noise filter... !PROGRESSBAR_RAWCACORR;Raw CA correction... +!QUEUE_DESTPREVIEW_TITLE;Select a thumbnail to preview its destination path here +!QUEUE_DESTPREVIEW_TOOLTIP;Destination path for the first selected image appears here +!QUEUE_LOCATION_TEMPLATE_HELP_BUTTON_TOOLTIP;Show or hide a help panel with instructions for creating location templates +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_BODY;If you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p-3/converted/%P-4/%f +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_TITLE;Common examples +!QUEUE_LOCATION_TEMPLATE_HELP_INTRO;The output template field allows you to to dynamically customize the destination folder and filename. When you include certain specifiers, which begin with %, they are replaced by the program when each file is being saved.\n\nThe sections below describe each type of specifier. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_1;Using this pathname as an example: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_2;The meanings of the formatting strings are: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_LINUX;/home/tom/photos/2010-10-31/photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_WINDOWS;D:\tom\photos\2010-10-31\photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO;The %dN, %d-N, %pN, %p-N, %PN and %P-N (N = 1..9) specifiers will be replaced by elements of the image file's directory path.\nThe format specifiers operate as follows:\n %dN = Nth directory from the end of the path\n %d-N = Nth directory from the start of the path\n %pN = all directories up to the Nth from the end of the path\n %p-N = the first N directories in the path\n %PN = the last N directories in the path\n %P-N = all directories from the Nth to the end of the path\n %f = base filename (no extension) +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO_WINDOWS;For Windows paths, %d-1 is the drive letter and colon, and %d-2 is the base directory on that drive. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_TITLE;Directories and partial paths +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_BODY;%r will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used. +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_TITLE;Rank +!QUEUE_LOCATION_TEMPLATE_HELP_RESULT_MISMATCH;ERROR: 2nd result is different: +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_BODY;%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'. +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_TITLE;Position/sequence in queue +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_BODY;Three different date/time values may be used in templates:\n %tE"%Y-%m-%d" = when export started\n %tF"%Y-%m-%d" = when file was last saved\n %tP"%Y-%m-%d" = when photo was taken\nThe quoted string defines the format of the resulting date and/or time. The format string %tF"%Y-%m-%d" is just one example. The string can use all conversion specifiers defined for the g_date_time_format function (see https://docs.gtk.org/glib/method.DateTime.format.html).\n\nExample format strings: +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_TITLE;Date and time +!QUEUE_LOCATION_TEMPLATE_HELP_TITLE;Creating an output template !QUEUE_LOCATION_TITLE;Output Location !SAVEDLG_BIGTIFF;BigTIFF (no metadata support) !SORT_ASCENDING;Ascending @@ -3128,12 +3226,16 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !SORT_BY_NAME;By Name !SORT_BY_RANK;By Rank !SORT_DESCENDING;Descending +!TC_LOCALLAB_PRIM_SHIFTX;Shift x +!TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP;In combination with "Refine colors", allows you to:\n 1) for low values, adjust the image purity.\n 2) for higher values, carry out moderate color toning.\nBe careful not to go outside the CIE xy diagram. +!TC_LOCALLAB_PRIM_SHIFTY;Shift y !TC_PRIM_BLUX;Bx !TC_PRIM_BLUY;By !TC_PRIM_GREX;Gx !TC_PRIM_GREY;Gy !TC_PRIM_REDX;Rx !TC_PRIM_REDY;Ry +!TC_PRIM_REFI;Refine colors (white-point) !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 @@ -3195,6 +3297,7 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !TP_HLREC_COLOROPP;Inpaint Opposed !TP_HLREC_HLBLUR;Blur !TP_HLREC_HLTH;Gain threshold +!TP_ICM_BW;Black and White !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)'. @@ -3207,8 +3310,15 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !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_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 three main uses - channel mixer, restore image color (saturation), 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_CAT;Matrix adaptation +!TP_ICM_WORKING_CAT_BRAD;Bradford +!TP_ICM_WORKING_CAT_CAT02;Cat02 +!TP_ICM_WORKING_CAT_CAT16;Cat16 +!TP_ICM_WORKING_CAT_TOOLTIP;Performs the chromatic adaptation of the XYZ conversion matrix. Default: Bradford +!TP_ICM_WORKING_CAT_VK;Von Kries +!TP_ICM_WORKING_CAT_XYZ;XYZ scale !TP_ICM_WORKING_CIEDIAG;CIE xy diagram !TP_ICM_WORKING_ILLU;Illuminant !TP_ICM_WORKING_ILLU_1500;Tungsten 1500K @@ -3220,11 +3330,13 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !TP_ICM_WORKING_ILLU_D65;D65 !TP_ICM_WORKING_ILLU_D80;D80 !TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_E;E !TP_ICM_WORKING_ILLU_NONE;Default !TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_NON;None !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_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination primaries' combo box, 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 @@ -3233,11 +3345,14 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !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_FREE;Custom LA (sliders) !TP_ICM_WORKING_PRIM_JDCMAX;JDC Max +!TP_ICM_WORKING_PRIM_JDCMAXSTDA;JDC Max stdA !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_TOOLTIP;Performs a gamut control. Destination primaries (Advanced) allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified.\nWhen 'Custom LA (sliders)' is selected, you can modify the values of the 3 primaries (Red, Green, and Blue) for x and y. !TP_ICM_WORKING_PRIM_WID;WideGamut !TP_ICM_WORKING_TRC_18;Prophoto g=1.8 !TP_ICM_WORKING_TRC_22;Adobe g=2.2 @@ -3248,6 +3363,7 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !TP_LENSGEOM_LOG;Logarithmic !TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected !TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected +!TP_LENSPROFILE_CORRECTION_METADATA;From file metadata !TP_LENSPROFILE_MODE_HEADER;Lens Profile !TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion !TP_LENSPROFILE_USE_HEADER;Correct @@ -3258,9 +3374,9 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !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_AUTOGRAYCIE;Automatic !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_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab). Default: Munsell only.\n\nMunsell only: 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. The result is not the same as Lab. !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 @@ -3303,9 +3419,12 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !TP_LOCALLAB_BUTTON_DUPL;Duplicate !TP_LOCALLAB_BUTTON_REN;Rename !TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWEVNONE;None +!TP_LOCALLAB_BWEVSIG;Activated +!TP_LOCALLAB_BWEVSIGLOG;Sigmoid & Log-Encoding !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_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16 (experimental). 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, for example, to match CAM16 processing with the maximum monitor brightness of 400cd/m2. !TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments !TP_LOCALLAB_CAMMODE;CAM model !TP_LOCALLAB_CAMMODE_CAM16;CAM 16 @@ -3345,6 +3464,12 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !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_SMOOTHFRAME;Highlight Attenuation & Levels +!TP_LOCALLAB_CIE_SMOOTH_EV;Ev based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA;Slope based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF;Gamma based +!TP_LOCALLAB_CIE_SMOOTH_LEVELS;Levels +!TP_LOCALLAB_CIE_SMOOTH_NONE;None !TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) !TP_LOCALLAB_CIRCRADIUS;Spot size !TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the 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. @@ -3360,8 +3485,9 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !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_COLORDEPREV_TOOLTIP;Preview ΔE button in Settings will only work if you have activated 'Sharpening', 'Soft Light and Original Retinex', 'Blur/Grain and Denoise', 'Dehaze and Retinex', or 'Contrast by Detail Levels' in the 'Add tool to current spot' menu.\nFor others tools, the Preview ΔE button is in the tool, which allows previewing ΔE with several tools enabled. Prefer using Mask and modifications. !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_COLORFRAME;Dominant color !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 @@ -3369,7 +3495,10 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !TP_LOCALLAB_COL_NAME;Name !TP_LOCALLAB_COL_VIS;Status !TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPRCIE;Brightness compression +!TP_LOCALLAB_COMPRCIETH;Compression threshold !TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_COMPRLOG_TOOLTIP;This algorithm compress the data before log conversion, above the threshold slider value. To use in conjunction with Whites distribution. !TP_LOCALLAB_CONTCOL;Contrast threshold !TP_LOCALLAB_CONTFRA;Contrast by level !TP_LOCALLAB_CONTRAST;Contrast @@ -3384,7 +3513,7 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !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 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 spot. -!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combo box 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. @@ -3393,13 +3522,14 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !TP_LOCALLAB_DARKRETI;Darkness !TP_LOCALLAB_DEHAFRA;Dehaze !TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZE_BLACK;Black !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_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. @@ -3419,6 +3549,7 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !TP_LOCALLAB_DETAILFRA;Edge detection - DCT !TP_LOCALLAB_DETAILSH;Details !TP_LOCALLAB_DETAILTHR;Lum/chrom detail threshold +!TP_LOCALLAB_DISAB_CIECAM;Disable Ciecam or Weak Jz surround !TP_LOCALLAB_DIVGR;Gamma !TP_LOCALLAB_DUPLSPOTNAME;Copy !TP_LOCALLAB_EDGFRA;Edge sharpness @@ -3427,6 +3558,7 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping !TP_LOCALLAB_ENABLE_MASK;Enable mask !TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENABLE_MASKALL;Enable all mask tools !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 @@ -3442,9 +3574,10 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !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_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all selective editing data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\nUse 'Scope' (Excluding) to set the exclusion intensity.\n\n'Full image' allows you to use the selective editing tools on the whole image.\nThe RT Spot delimiters are set beyond the image preview boundaries.\nThe 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.\nNote: 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.\n\n'Global' allows you to use the selective editing tools on the whole image, without using Delta E or transitions. !TP_LOCALLAB_EXECLU;Excluding spot !TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXMAIN;Global !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 @@ -3453,11 +3586,11 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !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_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Selective Editing 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 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_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. @@ -3479,7 +3612,8 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !TP_LOCALLAB_FATSAT;Saturation control !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_FEATVALUE;Feather gradient +!TP_LOCALLAB_FEATVALUE_MASK;Feather gradient (Grad. Filters Mask) !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 @@ -3575,7 +3709,7 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !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_LABEL;Selective Editing !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 @@ -3620,8 +3754,10 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !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_LOGCIE;Log encoding +!TP_LOCALLAB_LOGCIEQ;Log Encoding Q (with Ciecam) +!TP_LOCALLAB_LOGCIEQ_TOOLTIP;Activating the checkbox allows you to switch between log encoding based on the 3 RGB channels, and log encoding based solely on Ciecam’s brightness (Q) channel.\nUsing the Q channel instead of the RGB channels helps avoid undesirable edge effects such as hue and saturation shifts.\nHowever, the settings are more difficult to optimise because Q is unbounded and Ciecam alters the data to take into account the surround conditions, simultaneous contrast, etc.\nYou may have to adjust the following:\n Scene conditions: Mean luminance (Yb), Whites & Blacks distribution, Black Ev, White Ev.\n Source Data Adjustments : Brightness compression, Strength.\n\nNote: when using Log Encoding (Q), be careful not to activate the Disable Ciecam option in the Scene Conditions, Surround menu. +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you to use Black Ev, White Ev, White and Black distribution, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using 'Log encoding' with Brightness compression. !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) @@ -3629,7 +3765,7 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !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_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 @@ -3642,6 +3778,7 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !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_LOGPFRA2;Log Encoding settings !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. @@ -3711,7 +3848,7 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !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_MASKUNUSABLE;Mask disabled (Enable in 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 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 @@ -3747,6 +3884,7 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !TP_LOCALLAB_MERTWE;Exclusion !TP_LOCALLAB_MERTWO;Subtract !TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MIDTCIE;Midtones !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 @@ -3794,10 +3932,15 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !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_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_PRECAMGAMUT_TOOLTIP;If checked, ensures a gamut control just after primary conversion to XYZ. +!TP_LOCALLAB_PRECAMREFIMAIN_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. In combination with "Shift x" and "Shift y", allows you to carry out moderate color toning. +!TP_LOCALLAB_PRECAMREFI_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. +!TP_LOCALLAB_PRECAM_TOOLTIP;'Source Data Adjustments' modifies the Dynamic Range using Log encoding, the tones of the image and primaries (simplified Abstract Profile), and midtones, just before the Ciecam process. These values are adjustable:\nGamma: Acts mainly on light tones\nSlope: Acts mainly on dark tones. You 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.\nDestination primaries: Allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified. You can also finely adapt the primaries and the illuminant (white-point). Moving a primary away from the white point reduces saturation and vice versa. Pay attention to the gamut. !TP_LOCALLAB_PREVHIDE;Hide additional settings !TP_LOCALLAB_PREVIEW;Preview ΔE !TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PRIMILLFRAME;Primaries & Illuminant !TP_LOCALLAB_PROXI;ΔE decay !TP_LOCALLAB_QUAAGRES;Aggressive !TP_LOCALLAB_QUACONSER;Conservative @@ -3842,10 +3985,11 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !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_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_SATCIE;Saturation control !TP_LOCALLAB_SATUR;Saturation !TP_LOCALLAB_SATURV;Saturation (s) !TP_LOCALLAB_SCALEGR;Scale @@ -3866,7 +4010,7 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !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_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;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. @@ -3912,17 +4056,41 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !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_SIGBLACKSSCIE;Blacks distribution +!TP_LOCALLAB_SIGCIE;Sigmoid +!TP_LOCALLAB_SIGFRA;Sigmoid Q +!TP_LOCALLAB_SIGGAMJCIE;Gamma !TP_LOCALLAB_SIGJZFRA;Sigmoid Jz !TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOID16_TOOLTIP;Allows you to simulate a tone mapping appearance using both 'Ciecam' and 'Sigmoid Q'. Sigmoid Q has three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc) Adaptability weights the action of the sigmoid by action on the internal exponential function. !TP_LOCALLAB_SIGMOIDBL;Blend !TP_LOCALLAB_SIGMOIDLAMBDA;Contrast -!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDLOGAUTO;Auto threshold +!TP_LOCALLAB_SIGMOIDLOGEV_TOOLTIP;If the combo box selection 'Black Ev and White Ev' is 'Sigmoid and Log encoding' instead of 'Sigmoid only', the two algorithms 'Log encoding' and 'Sigmoid' are used together. +!TP_LOCALLAB_SIGMOIDNORMCIE;Normalize Luminance +!TP_LOCALLAB_SIGMOIDNORMCIEBLEND_TOOLTIP;Blend acts on the final aspect of the image, contrast and luminance. Ratio between original and output image. +!TP_LOCALLAB_SIGMOIDNORMCIE_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image take into account those of the original.\nAll the adjustments acting on J or Q are taken into account, including those which are not relative to Sigmoid Q. +!TP_LOCALLAB_SIGMOIDQJ;Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDQJCOMPRCIE_TOOLTIP;When the combo box selection 'Uses Black Ev and White Ev' is 'Sigmoid and Log encoding Q' or 'Log encoding instead of Sigmoid' checked. This algorithm compress the data above the threshold slider value. The last value stands for brightness (Q) and should be close as possible to the value 'Compression threshold' (calculate when 'Auto threshold" checked, often > 1). +!TP_LOCALLAB_SIGMOIDSENSI;Adaptability !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_SIGMOIDWHITESCIE_TOOLTIP;Allows you, in Automatic when the dynamic range of the image is high, to change the distribution of lights in whites and deep blacks.\nCan be used with Log encoding or Sigmoid with Black Ev and White Ev enabled.\n\nThe algorithm does not change the basic data, but acts on the components necessary to calculate the Dynamic range, Black Ev, White Ev and the Gray point. +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a tone mapping appearance using both the 'Jz' and 'Sigmoid' function. Three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SIGSLOPJCIE;Slope +!TP_LOCALLAB_SIGTRCCIE;Source Data Adjustments +!TP_LOCALLAB_SIGWHITESCIE;Whites distribution !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_SLOPESMOOTH;Gray balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHB;Blue balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHG;Green balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHR;Red balance (Slope) !TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SMOOTHCIE;Highlight Attenuation +!TP_LOCALLAB_SMOOTHCIE_LUM;Luminosity mode +!TP_LOCALLAB_SMOOTHCIE_SCA;Scale Yb Scene +!TP_LOCALLAB_SMOOTHCIE_TOOLTIP;Completes the processing carried out by gamma, slope and midtones by causing a slight lowering of lights. Please note this does not replace Highlight reconstruction.\n\nGamma based and Slope based (Standard and Advanced) allow you to simulate a tone mapping using:\na) Scene conditions: Black-Ev, White-Ev, Mean luminance (Yb%)\nb) Viewing conditions: Mean luminance (Yb%).\n\nScale Yb Scene is function of White-Ev. +!TP_LOCALLAB_SMOOTHCIE_YB;Scale Yb Viewing !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. @@ -3944,13 +4112,14 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !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_STRENGTHCIELOG;Strength !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_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. @@ -3982,11 +4151,12 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !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_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_TRCFRAME;Tone Response Curve & Midtones !TP_LOCALLAB_USEMASK;Laplacian !TP_LOCALLAB_VART;Variance (contrast) !TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool @@ -4191,7 +4361,7 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !TP_WAVELET_WAVOFFSET;Offset !TP_WBALANCE_AUTOITCGREEN;Temperature correlation !TP_WBALANCE_AUTOOLD;RGB grey -!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement +!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement !TP_WBALANCE_ITCWALG_TOOLTIP;Allows you to switch to the other Alternative temperature (Alt_temp), when possible.\nInactive in the "single choice" case. !TP_WBALANCE_ITCWBDELTA_TOOLTIP;Fixed for each "green" iteration tried, the temperature difference to be taken into account. !TP_WBALANCE_ITCWBFGREEN_TOOLTIP;Find the best compromise between Student and green. @@ -4234,7 +4404,7 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !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_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).\nIn the rare case of a color drift with "Observer 2°" (probably due to the conversion matrix) "Observer 10°" must be selected. !TP_WBALANCE_PATCHLABEL;Read colors:%1 Patch: Chroma:%2 Size=%3 !TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colors (max=237).\nDisplay calculated Patch Chroma.\nAWB temperature bias, lets try to reduce this value, a minimum may seem to optimize the algorithm.\n\nPatch size matching chroma optimization. !TP_WBALANCE_PATCHLEVELLABEL;Patch: ΔE=%1 - datas x 9 Min:%2 Max=%3 diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index c22207212..77c22ff13 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -76,8 +76,6 @@ EXIFPANEL_RESET;Restaurar EXIFPANEL_RESETALL;Restaurar Tudo EXIFPANEL_RESETALLHINT;Restaurar todas as tags aos seus valores originais. EXIFPANEL_RESETHINT;Restaurar as tags selecionadas aos seus valores originais. -EXIFPANEL_SHOWALL;Mostrar tudo -EXIFPANEL_SUBDIRECTORY;Subdiretório EXPORT_BYPASS;Etapas de processamento para ignorar EXPORT_BYPASS_ALL;Selecionar / Desmarcar Tudo EXPORT_BYPASS_DEFRINGE;Ignorar Defringe @@ -835,7 +833,6 @@ IPTCPANEL_TITLE;Título IPTCPANEL_TITLEHINT;Digite um nome curto e legível para a imagem, pode ser o nome do arquivo. IPTCPANEL_TRANSREFERENCE;Identificador (ID) do trabalho IPTCPANEL_TRANSREFERENCEHINT;Digite um número ou identificador necessário para controle ou rastreamento do fluxo de trabalho. -LENSPROFILE_LENS_WARNING;Aviso: o fator de corte usado para o perfil da lente é maior que o fator de corte da câmera, os resultados podem estar errados. MAIN_BUTTON_FULLSCREEN;Tela cheia MAIN_BUTTON_ICCPROFCREATOR;Criador de Perfil ICC MAIN_BUTTON_NAVNEXT_TOOLTIP;Navegue até a próxima imagem relativa à imagem aberta no Editor.\nAtalho: Shift-F4\n\nPara navegar até a próxima imagem relativa à miniatura selecionada no Navegador de Arquivos ou no Diapositivo:\nAtalho: F4 @@ -1014,7 +1011,6 @@ PREFERENCES_APPEARANCE_COLORPICKERFONT;Fonte do seletor de cor PREFERENCES_APPEARANCE_CROPMASKCOLOR;Cor da máscara de corte PREFERENCES_APPEARANCE_MAINFONT;Fonte principal PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Cor do guia do navegador -PREFERENCES_APPEARANCE_PSEUDOHIDPI;Modo pseudo-HiDPI PREFERENCES_APPEARANCE_THEME;Tema PREFERENCES_APPLNEXTSTARTUP;é necessário reiniciar PREFERENCES_AUTOMONPROFILE;Usar o perfil de cores do monitor principal do sistema operacional @@ -1207,6 +1203,7 @@ PROGRESSBAR_LINEDENOISE;Filtro de ruído de linha... PROGRESSBAR_LOADING;Carregando imagem... PROGRESSBAR_LOADINGTHUMBS;Carregando miniaturas... PROGRESSBAR_LOADJPEG;Carregando arquivo JPEG... +PROGRESSBAR_LOADJXL;Carregando arquivo JXL... PROGRESSBAR_LOADPNG;Carregando arquivo PNG... PROGRESSBAR_LOADTIFF;Carregando arquivo TIFF... PROGRESSBAR_NOIMAGES;Nenhuma imagem encontrada @@ -1684,8 +1681,6 @@ TP_ICM_WORKING_TRC_SLOPE;Declive TP_ICM_WORKING_TRC_TOOLTIP;Apenas para perfis internos TP_IMPULSEDENOISE_LABEL;Redução de Ruído por Impulso TP_IMPULSEDENOISE_THRESH;Limite -TP_LABCURVE_AVOIDCOLORSHIFT;Evite mudança de cor -TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Ajuste as cores na gama do espaço de cores de trabalho e aplique a correção Munsell. TP_LABCURVE_BRIGHTNESS;Claridade TP_LABCURVE_CHROMATICITY;Cromaticidade TP_LABCURVE_CHROMA_TOOLTIP;Para aplicar tonificação B&W, configure Cromaticidade para -100. @@ -2252,6 +2247,7 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply 'find' keywords. !FILEBROWSER_POPUPINSPECT;Inspect !FILEBROWSER_POPUPSORTBY;Sort Files +!FILEBROWSER_SHOWRECURSIVE;Show images in sub-folders recursively. !FILECHOOSER_FILTER_EXECUTABLE;Executable files !GENERAL_DELETE_ALL;Delete all !GENERAL_EDIT;Edit @@ -2302,7 +2298,7 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !HISTORY_MSG_512;Local - SD - ΔE decay !HISTORY_MSG_513;Local - Spot - Excluding - Scope !HISTORY_MSG_514;Local - Spot structure -!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_515;Selective Editing !HISTORY_MSG_516;Local - Color and light !HISTORY_MSG_517;Local - Enable super !HISTORY_MSG_518;Local - Lightness @@ -2612,7 +2608,7 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !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 - TG - Feather gradient +!HISTORY_MSG_833;Local - Mask 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 @@ -2855,7 +2851,7 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !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_1082;Local - CIECAM Auto threshold !HISTORY_MSG_1083;Local - CIECAM Hue !HISTORY_MSG_1084;Local - Uses Black Ev - White Ev !HISTORY_MSG_1085;Local - Jz lightness @@ -2951,18 +2947,90 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !HISTORY_MSG_ICM_AINTENT;Abstract profile intent !HISTORY_MSG_ICM_BLUX;Primaries Blue X !HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_CAT;Matrix adaptation !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_MIDTCIE;Midtones !HISTORY_MSG_ICM_PRESER;Preserve neutral !HISTORY_MSG_ICM_REDX;Primaries Red X !HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_REFI;Refinement Colors +!HISTORY_MSG_ICM_SHIFTX;Refinement Colors - Shift x +!HISTORY_MSG_ICM_SHIFTY;Refinement Colors - Shift y +!HISTORY_MSG_ICM_SMOOTHCIE;Smooth highlights +!HISTORY_MSG_ICM_TRCEXP;Abstract Profile !HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method !HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method !HISTORY_MSG_ILLUM;CAL - SC - Illuminant !HISTORY_MSG_LOCALLAB_TE_PIVOT;Local - Equalizer pivot +!HISTORY_MSG_LOCAL_CIEMASK_BLURCONT;Local - CIECAM Mask blur contrast +!HISTORY_MSG_LOCAL_CIEMASK_BLURFFT;Local - CIECAM Mask blur FFTW +!HISTORY_MSG_LOCAL_CIEMASK_BLURRAD;Local - CIECAM Mask blur radius +!HISTORY_MSG_LOCAL_CIEMASK_CHH;Local - CIECAM Mask curve h(h) +!HISTORY_MSG_LOCAL_CIEMASK_HIGH;Local - CIECAM Mask highlights +!HISTORY_MSG_LOCAL_CIEMASK_SHAD;Local - CIECAM Mask shadows +!HISTORY_MSG_LOCAL_CIEMASK_STRU;Local - CIECAM Mask structure +!HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;Local - CIECAM Mask structure as tool +!HISTORY_MSG_LOCAL_CIEMASK_WLC;Local - CIECAM Mask wavelet L(L) +!HISTORY_MSG_LOCAL_CIEMASK_WLEV;Local - CIECAM Mask wavelet levels +!HISTORY_MSG_LOCAL_CIE_ANGGRAD;Local - CIECAM Gradient angle +!HISTORY_MSG_LOCAL_CIE_BLACKS;Local - CIECAM Blacks distribution +!HISTORY_MSG_LOCAL_CIE_BLUXL;Local - CIECAM Blue X +!HISTORY_MSG_LOCAL_CIE_BLUYL;Local - CIECAM Blue Y +!HISTORY_MSG_LOCAL_CIE_BRICOMP;Local - CIECAM Brightness compression +!HISTORY_MSG_LOCAL_CIE_BRICOMPTH;Local - CIECAM Brightness compression threshold +!HISTORY_MSG_LOCAL_CIE_BWCIE;Local - CIECAM Black and white +!HISTORY_MSG_LOCAL_CIE_CAT;Local - Matrix adaptation +!HISTORY_MSG_LOCAL_CIE_DETAILJZ;Local - JzCzHz Local contrast +!HISTORY_MSG_LOCAL_CIE_ENAMASKALL;Local - CIECAM All mask tools +!HISTORY_MSG_LOCAL_CIE_EXPPRECAM;Local - CIECAM Pre-Cam +!HISTORY_MSG_LOCAL_CIE_GAM;Local - CIECAM Gamma +!HISTORY_MSG_LOCAL_CIE_GAMUTCIE;Local - CIECAM Gamut +!HISTORY_MSG_LOCAL_CIE_GREXL;Local - CIECAM Green X +!HISTORY_MSG_LOCAL_CIE_GREYL;Local - CIECAM Green Y +!HISTORY_MSG_LOCAL_CIE_ILL;Local - CIECAM TRC Illuminant +!HISTORY_MSG_LOCAL_CIE_LOGCIEQ;Local - CIECAM Log encoding Q +!HISTORY_MSG_LOCAL_CIE_MIDT;Local - CIECAM Mid Tones +!HISTORY_MSG_LOCAL_CIE_NORM;Local - CIECAM Normalize L +!HISTORY_MSG_LOCAL_CIE_PRIM;Local - CIECAM TRC primaries +!HISTORY_MSG_LOCAL_CIE_REDXL;Local - CIECAM Red X +!HISTORY_MSG_LOCAL_CIE_REDYL;Local - CIECAM Red Y +!HISTORY_MSG_LOCAL_CIE_REFI;Local - CIECAM Refinement colors +!HISTORY_MSG_LOCAL_CIE_SATCIE;Local - CIECAM Saturation control +!HISTORY_MSG_LOCAL_CIE_SHIFTXL;Local - CIECAM Shift x +!HISTORY_MSG_LOCAL_CIE_SHIFTYL;Local - CIECAM Shift y +!HISTORY_MSG_LOCAL_CIE_SIG;Local - Sigmoid +!HISTORY_MSG_LOCAL_CIE_SIGADAP;Local - CIECAM Sigmoid adaptability +!HISTORY_MSG_LOCAL_CIE_SIGMET;Local - CIECAM Sigmoid method +!HISTORY_MSG_LOCAL_CIE_SLOP;Local - CIECAM Slope +!HISTORY_MSG_LOCAL_CIE_SLOPESMO;Local - CIECAM Gray balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOB;Local - CIECAM Blue balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOG;Local - CIECAM Green balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOR;Local - CIECAM Red balance +!HISTORY_MSG_LOCAL_CIE_SMOOTH;Local - CIECAM Scale Yb scene +!HISTORY_MSG_LOCAL_CIE_SMOOTHMET;Local - CIECAM Smooth lights method +!HISTORY_MSG_LOCAL_CIE_SMOOTHYB;Local - CIECAM Scale Yb viewing +!HISTORY_MSG_LOCAL_CIE_SMOOTH_LUM;Local - CIECAM Levels - Luminosity mode +!HISTORY_MSG_LOCAL_CIE_STRGRAD;Local - CIECAM Gradient strength L +!HISTORY_MSG_LOCAL_CIE_STRLOG;Local - CIECAM Log encoding strength +!HISTORY_MSG_LOCAL_CIE_TRC;Local - CIECAM TRC +!HISTORY_MSG_LOCAL_CIE_WHITES;Local - CIECAM Whites distribution +!HISTORY_MSG_LOCAL_DEHAZE_BLACK;Local - Dehaze Black +!HISTORY_MSG_LOCAL_FEATHERCIE;Local - CIECAM Gradient feather +!HISTORY_MSG_LOCAL_FEATHERCOL;Local - Color Gradient feather +!HISTORY_MSG_LOCAL_FEATHEREXE;Local - Exp Gradient feather +!HISTORY_MSG_LOCAL_FEATHERLOG;Local - Log Gradient feather +!HISTORY_MSG_LOCAL_FEATHERMAS;Local - Mask Common gradient feather +!HISTORY_MSG_LOCAL_FEATHERSH;Local - SH Gradient feather +!HISTORY_MSG_LOCAL_FEATHERVIB;Local - Vib Gradient feather +!HISTORY_MSG_LOCAL_FEATHERWAV;Local - Wav Gradient feather !HISTORY_MSG_LOCAL_GAMUTMUNSEL;Local - SC - Avoid Color Shift +!HISTORY_MSG_LOCAL_LOG_BLACKS;Local - Log Blacks distribution +!HISTORY_MSG_LOCAL_LOG_COMPR;Local - Log Compress brightness +!HISTORY_MSG_LOCAL_LOG_SAT;Local - Log Saturation control +!HISTORY_MSG_LOCAL_LOG_WHITES;Local - Log Whites distribution !HISTORY_MSG_LOCAL_TMO_SATUR;Local Exp Fattal Saturation !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold !HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius @@ -3057,20 +3125,23 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !ICCPROFCREATOR_ILL_63;D63 : DCI-P3 Theater !ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 !INSPECTOR_WINDOW_TITLE;Inspector -!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB;Selective Editing !MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o !PARTIALPASTE_FILMNEGATIVE;Film negative !PARTIALPASTE_FLATFIELDFROMMETADATA;Flat-field from Metadata -!PARTIALPASTE_LOCALLAB;Local Adjustments -!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings +!PARTIALPASTE_LOCALLAB;Selective Editing +!PARTIALPASTE_LOCALLABGROUP;Selective Editing Settings !PARTIALPASTE_PREPROCWB;Preprocess White Balance !PARTIALPASTE_SPOT;Spot removal !PARTIALPASTE_TONE_EQUALIZER;Tone equalizer +!PREFERENCES_BROWSERECURSIVEDEPTH;Browse sub-folders depth +!PREFERENCES_BROWSERECURSIVEFOLLOWLINKS;Follow symbolic links when browsing sub-folders +!PREFERENCES_BROWSERECURSIVEMAXDIRS;Maximum sub-folders !PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CAMERAPROFILESDIR;Camera profiles directory !PREFERENCES_CIE;Ciecam !PREFERENCES_CIEARTIF;Avoid artifacts -!PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments +!PREFERENCES_COMPLEXITYLOC;Default complexity for Selective Editing !PREFERENCES_COMPLEXITY_EXP;Advanced !PREFERENCES_COMPLEXITY_NORM;Standard !PREFERENCES_COMPLEXITY_SIMP;Basic @@ -3090,13 +3161,18 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !PREFERENCES_LENSFUNDBDIR_TOOLTIP;Directory containing the Lensfun database. Leave empty to use the default directories. !PREFERENCES_LENSPROFILESDIR;Lens profiles directory !PREFERENCES_LENSPROFILESDIR_TOOLTIP;Directory containing Adobe Lens Correction Profiles (LCPs) +!PREFERENCES_MAX_ZOOM_TITLE;Maximum zoom !PREFERENCES_METADATA;Metadata !PREFERENCES_METADATA_SYNC;Metadata synchronization with XMP sidecars !PREFERENCES_METADATA_SYNC_NONE;Off !PREFERENCES_METADATA_SYNC_READ;Read only !PREFERENCES_METADATA_SYNC_READWRITE;Bidirectional -!PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips +!PREFERENCES_RAW_DECODER;Raw Decoder +!PREFERENCES_RAW_DECODER_ENABLE_LIBRAW;Use LibRaw +!PREFERENCES_SHOWTOOLTIP;Show Selective Editing advice tooltips +!PREFERENCES_SPOTLOC;Define Spot method for Selective Editing !PREFERENCES_TAB_FAVORITES;Favorites +!PREFERENCES_THUMBNAIL_RANK_COLOR_MODE;Load/Save thumbnail rank and color from/to XMP sidecars !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. @@ -3122,6 +3198,27 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !PROGRESSBAR_DECODING;Decoding... !PROGRESSBAR_HOTDEADPIXELFILTER;Hot/dead pixel filter... !PROGRESSBAR_RAWCACORR;Raw CA correction... +!QUEUE_DESTPREVIEW_TITLE;Select a thumbnail to preview its destination path here +!QUEUE_DESTPREVIEW_TOOLTIP;Destination path for the first selected image appears here +!QUEUE_LOCATION_TEMPLATE_HELP_BUTTON_TOOLTIP;Show or hide a help panel with instructions for creating location templates +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_BODY;If you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p-3/converted/%P-4/%f +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_TITLE;Common examples +!QUEUE_LOCATION_TEMPLATE_HELP_INTRO;The output template field allows you to to dynamically customize the destination folder and filename. When you include certain specifiers, which begin with %, they are replaced by the program when each file is being saved.\n\nThe sections below describe each type of specifier. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_1;Using this pathname as an example: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_2;The meanings of the formatting strings are: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_LINUX;/home/tom/photos/2010-10-31/photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_WINDOWS;D:\tom\photos\2010-10-31\photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO;The %dN, %d-N, %pN, %p-N, %PN and %P-N (N = 1..9) specifiers will be replaced by elements of the image file's directory path.\nThe format specifiers operate as follows:\n %dN = Nth directory from the end of the path\n %d-N = Nth directory from the start of the path\n %pN = all directories up to the Nth from the end of the path\n %p-N = the first N directories in the path\n %PN = the last N directories in the path\n %P-N = all directories from the Nth to the end of the path\n %f = base filename (no extension) +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO_WINDOWS;For Windows paths, %d-1 is the drive letter and colon, and %d-2 is the base directory on that drive. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_TITLE;Directories and partial paths +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_BODY;%r will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used. +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_TITLE;Rank +!QUEUE_LOCATION_TEMPLATE_HELP_RESULT_MISMATCH;ERROR: 2nd result is different: +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_BODY;%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'. +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_TITLE;Position/sequence in queue +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_BODY;Three different date/time values may be used in templates:\n %tE"%Y-%m-%d" = when export started\n %tF"%Y-%m-%d" = when file was last saved\n %tP"%Y-%m-%d" = when photo was taken\nThe quoted string defines the format of the resulting date and/or time. The format string %tF"%Y-%m-%d" is just one example. The string can use all conversion specifiers defined for the g_date_time_format function (see https://docs.gtk.org/glib/method.DateTime.format.html).\n\nExample format strings: +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_TITLE;Date and time +!QUEUE_LOCATION_TEMPLATE_HELP_TITLE;Creating an output template !SAVEDLG_BIGTIFF;BigTIFF (no metadata support) !SORT_ASCENDING;Ascending !SORT_BY_DATE;By Date @@ -3130,12 +3227,16 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !SORT_BY_NAME;By Name !SORT_BY_RANK;By Rank !SORT_DESCENDING;Descending +!TC_LOCALLAB_PRIM_SHIFTX;Shift x +!TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP;In combination with "Refine colors", allows you to:\n 1) for low values, adjust the image purity.\n 2) for higher values, carry out moderate color toning.\nBe careful not to go outside the CIE xy diagram. +!TC_LOCALLAB_PRIM_SHIFTY;Shift y !TC_PRIM_BLUX;Bx !TC_PRIM_BLUY;By !TC_PRIM_GREX;Gx !TC_PRIM_GREY;Gy !TC_PRIM_REDX;Rx !TC_PRIM_REDY;Ry +!TC_PRIM_REFI;Refine colors (white-point) !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 @@ -3196,6 +3297,7 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !TP_HLREC_COLOROPP;Inpaint Opposed !TP_HLREC_HLBLUR;Blur !TP_HLREC_HLTH;Gain threshold +!TP_ICM_BW;Black and White !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)'. @@ -3208,8 +3310,15 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !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_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 three main uses - channel mixer, restore image color (saturation), 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_CAT;Matrix adaptation +!TP_ICM_WORKING_CAT_BRAD;Bradford +!TP_ICM_WORKING_CAT_CAT02;Cat02 +!TP_ICM_WORKING_CAT_CAT16;Cat16 +!TP_ICM_WORKING_CAT_TOOLTIP;Performs the chromatic adaptation of the XYZ conversion matrix. Default: Bradford +!TP_ICM_WORKING_CAT_VK;Von Kries +!TP_ICM_WORKING_CAT_XYZ;XYZ scale !TP_ICM_WORKING_CIEDIAG;CIE xy diagram !TP_ICM_WORKING_ILLU;Illuminant !TP_ICM_WORKING_ILLU_1500;Tungsten 1500K @@ -3221,11 +3330,13 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !TP_ICM_WORKING_ILLU_D65;D65 !TP_ICM_WORKING_ILLU_D80;D80 !TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_E;E !TP_ICM_WORKING_ILLU_NONE;Default !TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_NON;None !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_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination primaries' combo box, 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 @@ -3234,11 +3345,14 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !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_FREE;Custom LA (sliders) !TP_ICM_WORKING_PRIM_JDCMAX;JDC Max +!TP_ICM_WORKING_PRIM_JDCMAXSTDA;JDC Max stdA !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_TOOLTIP;Performs a gamut control. Destination primaries (Advanced) allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified.\nWhen 'Custom LA (sliders)' is selected, you can modify the values of the 3 primaries (Red, Green, and Blue) for x and y. !TP_ICM_WORKING_PRIM_WID;WideGamut !TP_ICM_WORKING_TRC_18;Prophoto g=1.8 !TP_ICM_WORKING_TRC_22;Adobe g=2.2 @@ -3247,6 +3361,7 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !TP_ICM_WORKING_TRC_SRGB;sRGB g=2.4 s=12.92 !TP_LENSGEOM_LIN;Linear !TP_LENSGEOM_LOG;Logarithmic +!TP_LENSPROFILE_CORRECTION_METADATA;From file metadata !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 @@ -3256,9 +3371,9 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !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_AUTOGRAYCIE;Automatic !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_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab). Default: Munsell only.\n\nMunsell only: 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. The result is not the same as Lab. !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 @@ -3301,9 +3416,12 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !TP_LOCALLAB_BUTTON_DUPL;Duplicate !TP_LOCALLAB_BUTTON_REN;Rename !TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWEVNONE;None +!TP_LOCALLAB_BWEVSIG;Activated +!TP_LOCALLAB_BWEVSIGLOG;Sigmoid & Log-Encoding !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_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16 (experimental). 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, for example, to match CAM16 processing with the maximum monitor brightness of 400cd/m2. !TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments !TP_LOCALLAB_CAMMODE;CAM model !TP_LOCALLAB_CAMMODE_CAM16;CAM 16 @@ -3343,6 +3461,12 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !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_SMOOTHFRAME;Highlight Attenuation & Levels +!TP_LOCALLAB_CIE_SMOOTH_EV;Ev based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA;Slope based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF;Gamma based +!TP_LOCALLAB_CIE_SMOOTH_LEVELS;Levels +!TP_LOCALLAB_CIE_SMOOTH_NONE;None !TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) !TP_LOCALLAB_CIRCRADIUS;Spot size !TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the 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. @@ -3358,8 +3482,9 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !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_COLORDEPREV_TOOLTIP;Preview ΔE button in Settings will only work if you have activated 'Sharpening', 'Soft Light and Original Retinex', 'Blur/Grain and Denoise', 'Dehaze and Retinex', or 'Contrast by Detail Levels' in the 'Add tool to current spot' menu.\nFor others tools, the Preview ΔE button is in the tool, which allows previewing ΔE with several tools enabled. Prefer using Mask and modifications. !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_COLORFRAME;Dominant color !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 @@ -3367,7 +3492,10 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !TP_LOCALLAB_COL_NAME;Name !TP_LOCALLAB_COL_VIS;Status !TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPRCIE;Brightness compression +!TP_LOCALLAB_COMPRCIETH;Compression threshold !TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_COMPRLOG_TOOLTIP;This algorithm compress the data before log conversion, above the threshold slider value. To use in conjunction with Whites distribution. !TP_LOCALLAB_CONTCOL;Contrast threshold !TP_LOCALLAB_CONTFRA;Contrast by level !TP_LOCALLAB_CONTRAST;Contrast @@ -3382,7 +3510,7 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !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 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 spot. -!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combo box 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. @@ -3391,13 +3519,14 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !TP_LOCALLAB_DARKRETI;Darkness !TP_LOCALLAB_DEHAFRA;Dehaze !TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZE_BLACK;Black !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_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. @@ -3417,6 +3546,7 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !TP_LOCALLAB_DETAILFRA;Edge detection - DCT !TP_LOCALLAB_DETAILSH;Details !TP_LOCALLAB_DETAILTHR;Lum/chrom detail threshold +!TP_LOCALLAB_DISAB_CIECAM;Disable Ciecam or Weak Jz surround !TP_LOCALLAB_DIVGR;Gamma !TP_LOCALLAB_DUPLSPOTNAME;Copy !TP_LOCALLAB_EDGFRA;Edge sharpness @@ -3425,6 +3555,7 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping !TP_LOCALLAB_ENABLE_MASK;Enable mask !TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENABLE_MASKALL;Enable all mask tools !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 @@ -3440,9 +3571,10 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !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_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all selective editing data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\nUse 'Scope' (Excluding) to set the exclusion intensity.\n\n'Full image' allows you to use the selective editing tools on the whole image.\nThe RT Spot delimiters are set beyond the image preview boundaries.\nThe 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.\nNote: 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.\n\n'Global' allows you to use the selective editing tools on the whole image, without using Delta E or transitions. !TP_LOCALLAB_EXECLU;Excluding spot !TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXMAIN;Global !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 @@ -3451,11 +3583,11 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !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_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Selective Editing 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 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_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. @@ -3477,7 +3609,8 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !TP_LOCALLAB_FATSAT;Saturation control !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_FEATVALUE;Feather gradient +!TP_LOCALLAB_FEATVALUE_MASK;Feather gradient (Grad. Filters Mask) !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 @@ -3573,7 +3706,7 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !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_LABEL;Selective Editing !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 @@ -3618,8 +3751,10 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !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_LOGCIE;Log encoding +!TP_LOCALLAB_LOGCIEQ;Log Encoding Q (with Ciecam) +!TP_LOCALLAB_LOGCIEQ_TOOLTIP;Activating the checkbox allows you to switch between log encoding based on the 3 RGB channels, and log encoding based solely on Ciecam’s brightness (Q) channel.\nUsing the Q channel instead of the RGB channels helps avoid undesirable edge effects such as hue and saturation shifts.\nHowever, the settings are more difficult to optimise because Q is unbounded and Ciecam alters the data to take into account the surround conditions, simultaneous contrast, etc.\nYou may have to adjust the following:\n Scene conditions: Mean luminance (Yb), Whites & Blacks distribution, Black Ev, White Ev.\n Source Data Adjustments : Brightness compression, Strength.\n\nNote: when using Log Encoding (Q), be careful not to activate the Disable Ciecam option in the Scene Conditions, Surround menu. +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you to use Black Ev, White Ev, White and Black distribution, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using 'Log encoding' with Brightness compression. !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) @@ -3627,7 +3762,7 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !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_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 @@ -3640,6 +3775,7 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !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_LOGPFRA2;Log Encoding settings !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. @@ -3709,7 +3845,7 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !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_MASKUNUSABLE;Mask disabled (Enable in 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 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 @@ -3745,6 +3881,7 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !TP_LOCALLAB_MERTWE;Exclusion !TP_LOCALLAB_MERTWO;Subtract !TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MIDTCIE;Midtones !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 @@ -3792,10 +3929,15 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !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_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_PRECAMGAMUT_TOOLTIP;If checked, ensures a gamut control just after primary conversion to XYZ. +!TP_LOCALLAB_PRECAMREFIMAIN_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. In combination with "Shift x" and "Shift y", allows you to carry out moderate color toning. +!TP_LOCALLAB_PRECAMREFI_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. +!TP_LOCALLAB_PRECAM_TOOLTIP;'Source Data Adjustments' modifies the Dynamic Range using Log encoding, the tones of the image and primaries (simplified Abstract Profile), and midtones, just before the Ciecam process. These values are adjustable:\nGamma: Acts mainly on light tones\nSlope: Acts mainly on dark tones. You 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.\nDestination primaries: Allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified. You can also finely adapt the primaries and the illuminant (white-point). Moving a primary away from the white point reduces saturation and vice versa. Pay attention to the gamut. !TP_LOCALLAB_PREVHIDE;Hide additional settings !TP_LOCALLAB_PREVIEW;Preview ΔE !TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PRIMILLFRAME;Primaries & Illuminant !TP_LOCALLAB_PROXI;ΔE decay !TP_LOCALLAB_QUAAGRES;Aggressive !TP_LOCALLAB_QUACONSER;Conservative @@ -3840,10 +3982,11 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !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_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_SATCIE;Saturation control !TP_LOCALLAB_SATUR;Saturation !TP_LOCALLAB_SATURV;Saturation (s) !TP_LOCALLAB_SCALEGR;Scale @@ -3864,7 +4007,7 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !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_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;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. @@ -3910,17 +4053,41 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !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_SIGBLACKSSCIE;Blacks distribution +!TP_LOCALLAB_SIGCIE;Sigmoid +!TP_LOCALLAB_SIGFRA;Sigmoid Q +!TP_LOCALLAB_SIGGAMJCIE;Gamma !TP_LOCALLAB_SIGJZFRA;Sigmoid Jz !TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOID16_TOOLTIP;Allows you to simulate a tone mapping appearance using both 'Ciecam' and 'Sigmoid Q'. Sigmoid Q has three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc) Adaptability weights the action of the sigmoid by action on the internal exponential function. !TP_LOCALLAB_SIGMOIDBL;Blend !TP_LOCALLAB_SIGMOIDLAMBDA;Contrast -!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDLOGAUTO;Auto threshold +!TP_LOCALLAB_SIGMOIDLOGEV_TOOLTIP;If the combo box selection 'Black Ev and White Ev' is 'Sigmoid and Log encoding' instead of 'Sigmoid only', the two algorithms 'Log encoding' and 'Sigmoid' are used together. +!TP_LOCALLAB_SIGMOIDNORMCIE;Normalize Luminance +!TP_LOCALLAB_SIGMOIDNORMCIEBLEND_TOOLTIP;Blend acts on the final aspect of the image, contrast and luminance. Ratio between original and output image. +!TP_LOCALLAB_SIGMOIDNORMCIE_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image take into account those of the original.\nAll the adjustments acting on J or Q are taken into account, including those which are not relative to Sigmoid Q. +!TP_LOCALLAB_SIGMOIDQJ;Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDQJCOMPRCIE_TOOLTIP;When the combo box selection 'Uses Black Ev and White Ev' is 'Sigmoid and Log encoding Q' or 'Log encoding instead of Sigmoid' checked. This algorithm compress the data above the threshold slider value. The last value stands for brightness (Q) and should be close as possible to the value 'Compression threshold' (calculate when 'Auto threshold" checked, often > 1). +!TP_LOCALLAB_SIGMOIDSENSI;Adaptability !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_SIGMOIDWHITESCIE_TOOLTIP;Allows you, in Automatic when the dynamic range of the image is high, to change the distribution of lights in whites and deep blacks.\nCan be used with Log encoding or Sigmoid with Black Ev and White Ev enabled.\n\nThe algorithm does not change the basic data, but acts on the components necessary to calculate the Dynamic range, Black Ev, White Ev and the Gray point. +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a tone mapping appearance using both the 'Jz' and 'Sigmoid' function. Three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SIGSLOPJCIE;Slope +!TP_LOCALLAB_SIGTRCCIE;Source Data Adjustments +!TP_LOCALLAB_SIGWHITESCIE;Whites distribution !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_SLOPESMOOTH;Gray balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHB;Blue balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHG;Green balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHR;Red balance (Slope) !TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SMOOTHCIE;Highlight Attenuation +!TP_LOCALLAB_SMOOTHCIE_LUM;Luminosity mode +!TP_LOCALLAB_SMOOTHCIE_SCA;Scale Yb Scene +!TP_LOCALLAB_SMOOTHCIE_TOOLTIP;Completes the processing carried out by gamma, slope and midtones by causing a slight lowering of lights. Please note this does not replace Highlight reconstruction.\n\nGamma based and Slope based (Standard and Advanced) allow you to simulate a tone mapping using:\na) Scene conditions: Black-Ev, White-Ev, Mean luminance (Yb%)\nb) Viewing conditions: Mean luminance (Yb%).\n\nScale Yb Scene is function of White-Ev. +!TP_LOCALLAB_SMOOTHCIE_YB;Scale Yb Viewing !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. @@ -3942,13 +4109,14 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !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_STRENGTHCIELOG;Strength !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_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. @@ -3980,11 +4148,12 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !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_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_TRCFRAME;Tone Response Curve & Midtones !TP_LOCALLAB_USEMASK;Laplacian !TP_LOCALLAB_VART;Variance (contrast) !TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool @@ -4192,7 +4361,7 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !TP_WAVELET_WAVOFFSET;Offset !TP_WBALANCE_AUTOITCGREEN;Temperature correlation !TP_WBALANCE_AUTOOLD;RGB grey -!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement +!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement !TP_WBALANCE_ITCWALG_TOOLTIP;Allows you to switch to the other Alternative temperature (Alt_temp), when possible.\nInactive in the "single choice" case. !TP_WBALANCE_ITCWBDELTA_TOOLTIP;Fixed for each "green" iteration tried, the temperature difference to be taken into account. !TP_WBALANCE_ITCWBFGREEN_TOOLTIP;Find the best compromise between Student and green. @@ -4235,7 +4404,7 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !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_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).\nIn the rare case of a color drift with "Observer 2°" (probably due to the conversion matrix) "Observer 10°" must be selected. !TP_WBALANCE_PATCHLABEL;Read colors:%1 Patch: Chroma:%2 Size=%3 !TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colors (max=237).\nDisplay calculated Patch Chroma.\nAWB temperature bias, lets try to reduce this value, a minimum may seem to optimize the algorithm.\n\nPatch size matching chroma optimization. !TP_WBALANCE_PATCHLEVELLABEL;Patch: ΔE=%1 - datas x 9 Min:%2 Max=%3 diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index 74a08f2d3..ed6fee6a4 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -7,6 +7,7 @@ #007 2014-02-12 Kostia (Kildor) Romanov #008 2018-02-10 Kostia (Kildor) Romanov #009 2018-12-13 Kostia (Kildor) Romanov +#010 2024-04-12 Ilya #100 #101 @LANGUAGE_DISPLAY_NAME=Русский @@ -19,10 +20,12 @@ ADJUSTER_RESET_TO_DEFAULT;Click: Сбросить на значение BATCH_PROCESSING;Пакетная обработка CURVEEDITOR_AXIS_IN;I: CURVEEDITOR_AXIS_OUT;O: +CURVEEDITOR_CATMULLROM;Гибкость CURVEEDITOR_CURVE;Кривая CURVEEDITOR_CURVES;Кривые CURVEEDITOR_CUSTOM;Произвольный CURVEEDITOR_DARKS;Темные тона +CURVEEDITOR_EDITPOINT_HINT;Включить редактирование значений входа/выхода значений.\n\nЩелкните правой кнопкой мыши узел, чтобы выбрать его.\nЩелкните правой кнопкой мыши пустое место, чтобы отменить выбор значения. CURVEEDITOR_HIGHLIGHTS;Света CURVEEDITOR_LIGHTS;Светлые тона CURVEEDITOR_LINEAR;Линейная @@ -54,6 +57,9 @@ DYNPROFILEEDITOR_NEW;Новый DYNPROFILEEDITOR_NEW_RULE;Создать правило подбора DYNPROFILEEDITOR_PROFILE;Профиль обработки EDITWINDOW_TITLE;Редактор +EDIT_OBJECT_TOOLTIP;Отображает виджет в окне предварительного просмотра, который позволяет настроить этот инструмент. +EDIT_PIPETTE_TOOLTIP;Чтобы добавить точку корректировки к кривой, удерживайте клавишу Ctrl, щелкнув левой кнопкой мыши нужное место в предварительном просмотре изображения.\nЧтобы отрегулировать точку, удерживайте клавишу Ctrl, щелкнув левой кнопкой мыши соответствующую область в предварительном просмотре, затем отпустите кнопку Ctrl (если вам не нужен точный контроль) и, удерживая левую кнопку мыши, переместите мышь вверх или вниз, чтобы переместить эту точку вверх или вниз по кривой. +ERROR_MSG_METADATA_VALUE;Метаданные: ошибки настройки %1 на %2 EXIFFILTER_APERTURE;Диафрагма EXIFFILTER_CAMERA;Камера EXIFFILTER_EXPOSURECOMPENSATION;Компенсация экспозиции (EV) @@ -63,12 +69,16 @@ EXIFFILTER_IMAGETYPE;Тип изображения EXIFFILTER_ISO;ISO EXIFFILTER_LENS;Объектив EXIFFILTER_METADATAFILTER;Включить фильтры метаданных +EXIFFILTER_PATH;Путь к файлу EXIFFILTER_SHUTTER;Выдержка +EXIFPANEL_ACTIVATE_ALL_HINT;Выбрать все тэги +EXIFPANEL_ACTIVATE_NONE_HINT;Отменить все тэги EXIFPANEL_ADDEDIT;Добавить EXIFPANEL_ADDEDITHINT;Добавить новый тэг или редактировать существующий EXIFPANEL_ADDTAGDLG_ENTERVALUE;Ввести значение EXIFPANEL_ADDTAGDLG_SELECTTAG;Выбрать тег EXIFPANEL_ADDTAGDLG_TITLE;Добавить/редактировать тег +EXIFPANEL_BASIC_GROUP;Основа EXIFPANEL_KEEP;Записать EXIFPANEL_KEEPHINT;Сохранять выбранные теги при записи файла EXIFPANEL_REMOVE;Удалить @@ -77,12 +87,13 @@ EXIFPANEL_RESET;Сбросить EXIFPANEL_RESETALL;Сбросить все EXIFPANEL_RESETALLHINT;Сбросить все теги в первоначальные значения EXIFPANEL_RESETHINT;Сбросить выбранные теги в первоначальные значения -EXIFPANEL_SHOWALL;Показать всё -EXIFPANEL_SUBDIRECTORY;Подкаталог +EXIFPANEL_VALUE_NOT_SHOWN;Не показывать +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 @@ -99,23 +110,34 @@ EXPORT_FASTEXPORTOPTIONS;Настройки быстрого экспорта EXPORT_INSTRUCTIONS;Настройки быстрого экспорта помогают экономить время и ресурсы, затрачиваемые на установку настроек обработки и запускать очередь обработки, используя вместо этого настройки быстрого экспорта. Этот метод рекомендуется для быстрого создания изображений с низким разрешением, когда скорость обработки в приоритете или когда нужно отмасштабировать одно или несколько изображений без внесения изменений в их сохранённые параметры обработки. 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_AUTODARKFRAME;Автоматический темновой кадр FILEBROWSER_AUTOFLATFIELD;Автоматическое плоское поле +FILEBROWSER_BROWSEPATHBUTTONHINT;Нажмите, чтобы открыть указанный путь, перезагрузить папку и применить ключевые слова «найти». FILEBROWSER_BROWSEPATHHINT;Введите путь для перехода.\nCtrl-O для перехода на диалог ввода текста.\nEnter / Ctrl-Enter (в обозревателе файлов) для перехода;\n\nЯрлыки путей:\n ~ - домашний каталог пользователя\n ! - каталог пользователя с изображениями FILEBROWSER_CACHE;Кэш +FILEBROWSER_CACHECLEARFROMFULL;Очистить все включенные кэшированные профили +FILEBROWSER_CACHECLEARFROMPARTIAL;Очистить все кроме кэшированных профилей FILEBROWSER_CLEARPROFILE;Удалить профиль FILEBROWSER_COLORLABEL_TOOLTIP;Color label\n\nUse dropdown menu or Shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple FILEBROWSER_COPYPROFILE;Скопировать профиль FILEBROWSER_CURRENT_NAME;Текущее имя: FILEBROWSER_DARKFRAME;Темновой кадр +FILEBROWSER_DELETEDIALOG_ALL;Вы уверены, что хотите навсегда удалить все файлы %1 из корзины? FILEBROWSER_DELETEDIALOG_HEADER;Подтверждение удаления файла +FILEBROWSER_DELETEDIALOG_SELECTED;Вы уверены, что хотите навсегда удалить выбранные файлы %1? +FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Вы уверены, что хотите навсегда удалить выбранные файлы %1, включая версию, обработанную в очереди? FILEBROWSER_EMPTYTRASH;Очистить корзину +FILEBROWSER_EMPTYTRASHHINT;Навсегда удалить все файлы из корзины. FILEBROWSER_EXTPROGMENU;Открыть с помощью FILEBROWSER_FLATFIELD;Плоское поле FILEBROWSER_MOVETODARKFDIR;Переместить в каталог темновых кадров @@ -134,6 +156,7 @@ FILEBROWSER_POPUPCOLORLABEL4;Пометка: Синим FILEBROWSER_POPUPCOLORLABEL5;Пометка: Фиолетовым FILEBROWSER_POPUPCOPYTO;Скопировать в... FILEBROWSER_POPUPFILEOPERATIONS;Действия с файлами +FILEBROWSER_POPUPINSPECT;Осмотреть FILEBROWSER_POPUPMOVEEND;Переместить в конец очереди FILEBROWSER_POPUPMOVEHEAD;Переместить в начало очереди FILEBROWSER_POPUPMOVETO;Переместить в... @@ -149,8 +172,11 @@ FILEBROWSER_POPUPRANK2;Рейтинг 2 ** FILEBROWSER_POPUPRANK3;Рейтинг 3 *** FILEBROWSER_POPUPRANK4;Рейтинг 4 **** FILEBROWSER_POPUPRANK5;Рейтинг 5 ***** +FILEBROWSER_POPUPREMOVE;Удалить навсегда +FILEBROWSER_POPUPREMOVEINCLPROC;Удалить навсегда, включая версию, обработанную в очереди FILEBROWSER_POPUPRENAME;Переименовать FILEBROWSER_POPUPSELECTALL;Выбрать все +FILEBROWSER_POPUPSORTBY;Сортировать файлы FILEBROWSER_POPUPTRASH;Удалить в корзину FILEBROWSER_POPUPUNRANK;Снять рейтинг FILEBROWSER_POPUPUNTRASH;Удалить из корзины @@ -175,6 +201,8 @@ FILEBROWSER_SHOWDIRHINT;Сбросить все фильтры.\nГорячая FILEBROWSER_SHOWEDITEDHINT;Показать измененные изображения.\nГорячая клавиша: 7 FILEBROWSER_SHOWEDITEDNOTHINT;Показать не измененные изображения.\nГорячая клавиша: 6 FILEBROWSER_SHOWEXIFINFO;Показать информацию EXIF.\nГорячая клавиша: i\n\nГорячая клавиша в режиме Одиночного редактора: Alt-I +FILEBROWSER_SHOWNOTTRASHHINT;Показывать только изоброжения не в корзине +FILEBROWSER_SHOWORIGINALHINT;Показывать только исходные изображения.\n\nЕсли существует несколько изображений с одинаковым именем файла, но с разными расширениями, оригинальным считается то, расширение которого находится ближе всего к началу списка проанализированных расширений в разделе «Настройки» > «Браузер файлов» > «Проанализированные расширения». FILEBROWSER_SHOWRANK1HINT;Показать изображения с рейтингом 1.\nГорячая клавиша: 1 FILEBROWSER_SHOWRANK2HINT;Показать изображения с рейтингом 2.\nГорячая клавиша: 2 FILEBROWSER_SHOWRANK3HINT;Показать изображения с рейтингом 3.\nГорячая клавиша: 3 @@ -192,7 +220,10 @@ FILEBROWSER_ZOOMOUTHINT;Уменьшить размер эскиза\nГоряч FILECHOOSER_FILTER_ANY;Все файлы FILECHOOSER_FILTER_COLPROF;Цветовые профили FILECHOOSER_FILTER_CURVE;Файлы кривых +FILECHOOSER_FILTER_EXECUTABLE;Исполнямые файлы FILECHOOSER_FILTER_LCP;Файлы коррекции объектива +FILECHOOSER_FILTER_PP;Обработка профилей +FILECHOOSER_FILTER_SAME;Тот же формат, как на этом изоброжении FILECHOOSER_FILTER_TIFF;Файлы TIFF GENERAL_ABOUT;О программе GENERAL_AFTER;После @@ -203,17 +234,21 @@ 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;Нет GENERAL_NONE;Нет GENERAL_OK;OK GENERAL_OPEN;Открыть +GENERAL_OTHER;Прочее GENERAL_PORTRAIT;Портретный GENERAL_RESET;Сбросить GENERAL_SAVE;Сохранить @@ -221,12 +256,23 @@ GENERAL_SAVE_AS;Сохранить как... GENERAL_SLIDER;Ползунок GENERAL_UNCHANGED;(не менялось) GENERAL_WARNING;Внимание +GIMP_PLUGIN_INFO;Добро пожаловать в плагин RawTherapee GIMP!\nПосле завершения редактирования просто закройте главное окно RawTherapee, и изображение будет автоматически импортировано в GIMP. HISTOGRAM_TOOLTIP_B;Показать/скрыть синий канал гистограммы HISTOGRAM_TOOLTIP_BAR;Показать/скрыть панель отображения RGB\nНажмите правую кнопку мыши на предпросмотре изображения, чтобы заблокировать/разблокировать его HISTOGRAM_TOOLTIP_CHRO;Показать/скрыть хроматическую гистограмму +HISTOGRAM_TOOLTIP_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;Необработанная гистограмма +HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB-парад +HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Вектороскоп Hue-Chroma +HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;Вектороскоп Hue-Saturation +HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Волна HISTORY_CHANGED;Изменено HISTORY_CUSTOMCURVE;Пользовательская кривая HISTORY_FROMCLIPBOARD;Из буфера обмена @@ -459,11 +505,176 @@ HISTORY_MSG_247;Кривая 'LH' HISTORY_MSG_248;Кривая 'HH' HISTORY_MSG_249;КпУД: Порог HISTORY_MSG_251;Ч&Б: Алгоритм +HISTORY_MSG_252;CbDL - Кожа смола/защита +HISTORY_MSG_253;CbDL - Устранить дефекты +HISTORY_MSG_254;CbDL - Тон кожи +HISTORY_MSG_255;NR - Фильтр медианы +HISTORY_MSG_256;NR - Тип - Медиана +HISTORY_MSG_257;Цветное тонирование +HISTORY_MSG_258;CT - Цветовая кривая +HISTORY_MSG_259;CT - Кривая непрозрачности +HISTORY_MSG_260;CT - a*[b*] кривая +HISTORY_MSG_261;CT - Метод +HISTORY_MSG_262;CT - b* кривая +HISTORY_MSG_263;CT - Тени - Красные +HISTORY_MSG_264;CT - Тени - Зеленые +HISTORY_MSG_265;CT - Тени - Синие +HISTORY_MSG_266;CT - Средний – Красный +HISTORY_MSG_267;CT - Средний – Зеленый +HISTORY_MSG_268;CT - Средний – Синий +HISTORY_MSG_269;CT - Высокий - Красный +HISTORY_MSG_270;CT - Высокий - Зеленый +HISTORY_MSG_271;CT - Высокий - Синий +HISTORY_MSG_272;CT - Баланс +HISTORY_MSG_273;CT - Цветовой Баланс SMH +HISTORY_MSG_276;CT - Кривая HISTORY_MSG_277;--неиспользуемый-- +HISTORY_MSG_278;CT - Сохранение яркости +HISTORY_MSG_279;CT - Тени +HISTORY_MSG_280;CT - Высокие +HISTORY_MSG_283;CT - Сила +HISTORY_MSG_284;CT - Авто sat. защита +HISTORY_MSG_285;NR - Медиана - Метод +HISTORY_MSG_286;NR - Медиана - Тип +HISTORY_MSG_287;NR - Медиана - Итерации +HISTORY_MSG_288;Flat-Field - управление клипом +HISTORY_MSG_289;Flat-Field - Управление клипом - Авто +HISTORY_MSG_290;Уровень Черного - Красный +HISTORY_MSG_291;Уровень Черного - Зеленый +HISTORY_MSG_292;Уровень Черного - Синий HISTORY_MSG_293;Имитация плёнки HISTORY_MSG_294;Имитация плёнки: Сила HISTORY_MSG_295;Имитация плёнки: Плёнка +HISTORY_MSG_296;NR - Кривая яркости +HISTORY_MSG_297;NR - Режим HISTORY_MSG_298;Фильтр битых пикселей +HISTORY_MSG_299;NR - Кривая цветности +HISTORY_MSG_301;NR - Управление яркостью +HISTORY_MSG_302;NR - Метод цветности +HISTORY_MSG_303;NR - Метод цветности +HISTORY_MSG_304;W - Уровни контрастности +HISTORY_MSG_305;Вейвлет-уровни +HISTORY_MSG_306;W - Прогресс +HISTORY_MSG_307;W - Прогресс +HISTORY_MSG_308;W - Направление процесса +HISTORY_MSG_309;W - ES - Детали +HISTORY_MSG_310;W - Остаток - Небесная смола/защита +HISTORY_MSG_311;W - Вейвлет-уровни +HISTORY_MSG_312;W - Остаток - порог теней +HISTORY_MSG_313;W - Цветность - Sat/past +HISTORY_MSG_314;W - Гамма - уменьшение артефактов +HISTORY_MSG_315;W - Остаток - Контраст +HISTORY_MSG_316;W - Гамма - кожи tar/prot +HISTORY_MSG_317;W - Гамма - Тон кожи +HISTORY_MSG_318;W - Контрастность - более тонкие уровни +HISTORY_MSG_319;W - Контрастность - более тонкий диапазон +HISTORY_MSG_320;W - Контрастность - более грубый диапазон +HISTORY_MSG_321;W - Контрастность - более грубые уровни +HISTORY_MSG_322;W - Гамма – Избегайте смещения цвета +HISTORY_MSG_323;W - ES - Локальный контраст +HISTORY_MSG_324;W - Цветность - Пастель +HISTORY_MSG_325;W - Цветность – Насыщенная +HISTORY_MSG_326;W - Цветность - Метод +HISTORY_MSG_327;W - Контраст – Применить к +HISTORY_MSG_328;W - Цветность – сила связи +HISTORY_MSG_329;W - Тонирование - Непрозрачность RG +HISTORY_MSG_330;W - Тонирование - Непрозрачность BY +HISTORY_MSG_331;W - Уровни контрастности – Экстра +HISTORY_MSG_332;W - Метод укладки плитки +HISTORY_MSG_333;W - Остаток – Тени +HISTORY_MSG_334;W - Остаток – цветность +HISTORY_MSG_335;W - Остаток – Высокие +HISTORY_MSG_336;W - Остаток - порог высоких +HISTORY_MSG_337;W - Остаток – Небесный оттенок +HISTORY_MSG_338;W - ES - Радиус +HISTORY_MSG_339;W - ES - Длина +HISTORY_MSG_340;W - Длина +HISTORY_MSG_341;W - Пограничная производительность +HISTORY_MSG_342;W - ES - Первый уроень +HISTORY_MSG_343;W - Уровни цветности +HISTORY_MSG_344;W - Мет цветность sl/cur +HISTORY_MSG_345;W - ES - Локальный контраст +HISTORY_MSG_346;W - ES - Локальный контрастный метод +HISTORY_MSG_347;W - Шумоподавление - Уровень 1 +HISTORY_MSG_348;W - Шумоподавление - Уровень 2 +HISTORY_MSG_349;W - Шумоподавление - Уровень 3 +HISTORY_MSG_350;W - ES - Обнаружение краёв +HISTORY_MSG_351;W - Остаток - кривая HH +HISTORY_MSG_352;W - Фон +HISTORY_MSG_353;W - ES - Градиентная чувствительность +HISTORY_MSG_354;W - ES - Повышенная +HISTORY_MSG_355;W - ES - Порг низких +HISTORY_MSG_356;W - ES - Порог высоких +HISTORY_MSG_357;W - Шумоподавление - Связь с ES +HISTORY_MSG_358;W - Гамма – CH +HISTORY_MSG_359;Горячий/Мертвый – Порог +HISTORY_MSG_360;TM - Гамма +HISTORY_MSG_361;W - Финал – баланс цветности +HISTORY_MSG_362;W - Остаток - метод сжатия +HISTORY_MSG_363;W - Остаток - прочность на сжатие +HISTORY_MSG_364;W - Финал - Баланс контраста +HISTORY_MSG_365;W - Финал - Баланс Дельты +HISTORY_MSG_366;W - Остаток – Гамма сжатия +HISTORY_MSG_367;W - Финал – кривая контрастности «После» +HISTORY_MSG_368;W - Финал - контрастный баланс +HISTORY_MSG_369;W - Финал - метод баланса +HISTORY_MSG_370;W - Финал – кривая локального контраста +HISTORY_MSG_371;Повышение резкости после изменения размера +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 - Контрольная сумма Halo +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;W - Остаток - Цветовой баланс +HISTORY_MSG_386;W - Остаток - CB зеленый максимум +HISTORY_MSG_387;W - Остаток - CB синий максимум +HISTORY_MSG_388;W - Остаток - CB зеленый средний +HISTORY_MSG_389;W - Остаток - CB синий средний +HISTORY_MSG_390;W - Остаток – зеленый минимум CB +HISTORY_MSG_391;W - Остаток - CB синий низкий +HISTORY_MSG_392;W - Остаток - Цветовой баланс +HISTORY_MSG_393;DCP - Просмотр таблицы +HISTORY_MSG_394;DCP - Базовое воздействие +HISTORY_MSG_395;DCP - Базовая таблица +HISTORY_MSG_396;W - Дополнительный инструмент «Контраст» +HISTORY_MSG_397;W - Дополнительный инструмент «Цветность» +HISTORY_MSG_398;W - Дополнительный инструмент ES +HISTORY_MSG_399;W - Остаточный вспомогательный инструмент +HISTORY_MSG_400;W - Последний подинструмент +HISTORY_MSG_401;W - Дополнительный инструмент для тонирования +HISTORY_MSG_402;W - Дополнительный инструмент шумоподавления +HISTORY_MSG_403;W - ES - Краевая чувствительность +HISTORY_MSG_404;W - ES - Базовое усиление +HISTORY_MSG_405;W - Шумоподавление - Уровень 4 +HISTORY_MSG_406;W - ES - Соседние пиксели +HISTORY_MSG_407;Ретинекс – Метод +HISTORY_MSG_408;Ретинекс - Радиус +HISTORY_MSG_410;Ретинекс - Смещение +HISTORY_MSG_411;Ретинекс - Сила +HISTORY_MSG_412;Ретинекс - Гауссов градиент +HISTORY_MSG_413;Ретинекс - Контраст +HISTORY_MSG_414;Ретинекс - Гистограмма - Лаборатория +HISTORY_MSG_415;Ретинекс - Трансмиссия +HISTORY_MSG_416;Ретинекс +HISTORY_MSG_417;Ретинекс – Медиана передачи +HISTORY_MSG_418;Ретинекс - Порог +HISTORY_MSG_419;Ретинекс - Цветовое пространство +HISTORY_MSG_420;Ретинекс - Гистограмма - HSL +HISTORY_MSG_421;Ретинекс - Гамма +HISTORY_MSG_422;Ретинекс - Гамма +HISTORY_MSG_423;Ретинекс - Гамма-наклон +HISTORY_MSG_424;Ретинекс - порог HL +HISTORY_MSG_426;Ретинекс - эквалайзер оттенков +HISTORY_MSG_427;Цель рендеринга вывода +HISTORY_MSG_428;Мониторинг намерения рендеринга HISTORY_MSG_440;КпУД: Метод HISTORY_MSG_485;Коррекция объектива HISTORY_MSG_486;Коррекция объектива: Камера @@ -535,7 +746,6 @@ IPTCPANEL_RESET;Сбросить IPTCPANEL_RESETHINT;Сбросить профиль на значения по умолчанию IPTCPANEL_SOURCE;Источник IPTCPANEL_TITLE;Название -LENSPROFILE_LENS_WARNING;Внимание: кроп-фактор используемый для анализа объектива больше чем кроп-фактор камеры, результаты могут быть не верны. MAIN_BUTTON_FULLSCREEN;Полный экран MAIN_BUTTON_NAVNEXT_TOOLTIP;Перейти к следующему изображению относительно открытого в редакторе\nГорячая клавиша: Shift+F4\n\nПерейти к следущему изображению относительно выбранного в файловом браузере\nгорячая клавиша F4 MAIN_BUTTON_NAVPREV_TOOLTIP;Перейти к предыдущему изображению относительно открытого в редакторе\nгорячая клавиша: Shift+F4\n\nПерейти к предыдущему изображению относительно выбранного в файловом браузере\nгорячая клавиша F4 @@ -843,6 +1053,7 @@ PROFILEPANEL_TOOLTIPSAVE;Сохранить текущий профиль\nCt PROGRESSBAR_LOADING;Загрузка изображения... PROGRESSBAR_LOADINGTHUMBS;Загрузка миниатюр... PROGRESSBAR_LOADJPEG;Чтение JPEG файла... +PROGRESSBAR_LOADJXL;Чтение JXL файла... PROGRESSBAR_LOADPNG;Чтение PNG файла... PROGRESSBAR_LOADTIFF;Чтение TIFF файла... PROGRESSBAR_NOIMAGES;Изображения не найдены @@ -1158,8 +1369,6 @@ TP_ICM_TONECURVE_TOOLTIP;Использовать встроенную тона TP_ICM_WORKINGPROFILE;Рабочий профиль TP_IMPULSEDENOISE_LABEL;Подавление импульсного шума TP_IMPULSEDENOISE_THRESH;Порог -TP_LABCURVE_AVOIDCOLORSHIFT;Избегать сдвига цветов -TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Умещать цвета в диапазон рабочего цветового пространства и применять коррекцию Манселла TP_LABCURVE_BRIGHTNESS;Яркость TP_LABCURVE_CHROMATICITY;Цветность TP_LABCURVE_CHROMA_TOOLTIP;Для применения тонирования Ч&Б, выставьте Цветность в -100 @@ -1432,223 +1641,12 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: -!CURVEEDITOR_CATMULLROM;Flexible -!CURVEEDITOR_EDITPOINT_HINT;Enable edition of node in/out values.\n\nRight-click on a node to select it.\nRight-click on empty space to de-select the node. -!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. -!ERROR_MSG_METADATA_VALUE;Metadata: error setting %1 to %2 -!EXIFFILTER_PATH;File path -!EXIFPANEL_ACTIVATE_ALL_HINT;Select all tags -!EXIFPANEL_ACTIVATE_NONE_HINT;Unselect all tags -!EXIFPANEL_BASIC_GROUP;Basic -!EXIFPANEL_VALUE_NOT_SHOWN;Not shown -!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_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_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_POPUPSORTBY;Sort Files -!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_EXECUTABLE;Executable files -!FILECHOOSER_FILTER_PP;Processing profiles -!FILECHOOSER_FILTER_SAME;Same format as current photo -!GENERAL_DELETE_ALL;Delete all -!GENERAL_EDIT;Edit -!GENERAL_HELP;Help -!GENERAL_OTHER;Other -!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 +!FILEBROWSER_SHOWRECURSIVE;Show images in sub-folders recursively. !HISTORY_MSG_235;B&W - CM - Auto !HISTORY_MSG_237;B&W - CM -!HISTORY_MSG_252;CbDL - Skin tar/prot -!HISTORY_MSG_253;CbDL - Reduce artifacts -!HISTORY_MSG_254;CbDL - Skin hue -!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_276;CT - Opacity -!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_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Mode -!HISTORY_MSG_299;NR - Chrominance curve -!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 - 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 -!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 -!HISTORY_MSG_396;W - Contrast sub-tool -!HISTORY_MSG_397;W - Chroma sub-tool -!HISTORY_MSG_398;W - ES sub-tool -!HISTORY_MSG_399;W - Residual sub-tool -!HISTORY_MSG_400;W - Final sub-tool -!HISTORY_MSG_401;W - Toning sub-tool -!HISTORY_MSG_402;W - Denoise sub-tool -!HISTORY_MSG_403;W - ES - Edge sensitivity -!HISTORY_MSG_404;W - ES - Base amplification -!HISTORY_MSG_405;W - Denoise - Level 4 -!HISTORY_MSG_406;W - ES - Neighboring pixels -!HISTORY_MSG_407;Retinex - Method -!HISTORY_MSG_408;Retinex - Radius -!HISTORY_MSG_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;--unused-- -!HISTORY_MSG_426;Retinex - Hue equalizer -!HISTORY_MSG_427;Output rendering intent -!HISTORY_MSG_428;Monitor rendering intent !HISTORY_MSG_429;Retinex - Iterations !HISTORY_MSG_430;Retinex - Transmission gradient !HISTORY_MSG_431;Retinex - Strength gradient @@ -1724,7 +1722,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !HISTORY_MSG_512;Local - SD - ΔE decay !HISTORY_MSG_513;Local - Spot - Excluding - Scope !HISTORY_MSG_514;Local - Spot structure -!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_515;Selective Editing !HISTORY_MSG_516;Local - Color and light !HISTORY_MSG_517;Local - Enable super !HISTORY_MSG_518;Local - Lightness @@ -2034,7 +2032,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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 - TG - Feather gradient +!HISTORY_MSG_833;Local - Mask 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 @@ -2277,7 +2275,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_1082;Local - CIECAM Auto threshold !HISTORY_MSG_1083;Local - CIECAM Hue !HISTORY_MSG_1084;Local - Uses Black Ev - White Ev !HISTORY_MSG_1085;Local - Jz lightness @@ -2387,16 +2385,23 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !HISTORY_MSG_ICM_AINTENT;Abstract profile intent !HISTORY_MSG_ICM_BLUX;Primaries Blue X !HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_CAT;Matrix adaptation !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_MIDTCIE;Midtones !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_PRESER;Preserve neutral !HISTORY_MSG_ICM_REDX;Primaries Red X !HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_REFI;Refinement Colors +!HISTORY_MSG_ICM_SHIFTX;Refinement Colors - Shift x +!HISTORY_MSG_ICM_SHIFTY;Refinement Colors - Shift y +!HISTORY_MSG_ICM_SMOOTHCIE;Smooth highlights +!HISTORY_MSG_ICM_TRCEXP;Abstract Profile !HISTORY_MSG_ICM_WORKING_GAMMA;TRC - Gamma !HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method !HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method @@ -2404,7 +2409,72 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !HISTORY_MSG_ICM_WORKING_TRC_METHOD;TRC method !HISTORY_MSG_ILLUM;CAL - SC - Illuminant !HISTORY_MSG_LOCALLAB_TE_PIVOT;Local - Equalizer pivot +!HISTORY_MSG_LOCAL_CIEMASK_BLURCONT;Local - CIECAM Mask blur contrast +!HISTORY_MSG_LOCAL_CIEMASK_BLURFFT;Local - CIECAM Mask blur FFTW +!HISTORY_MSG_LOCAL_CIEMASK_BLURRAD;Local - CIECAM Mask blur radius +!HISTORY_MSG_LOCAL_CIEMASK_CHH;Local - CIECAM Mask curve h(h) +!HISTORY_MSG_LOCAL_CIEMASK_HIGH;Local - CIECAM Mask highlights +!HISTORY_MSG_LOCAL_CIEMASK_SHAD;Local - CIECAM Mask shadows +!HISTORY_MSG_LOCAL_CIEMASK_STRU;Local - CIECAM Mask structure +!HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;Local - CIECAM Mask structure as tool +!HISTORY_MSG_LOCAL_CIEMASK_WLC;Local - CIECAM Mask wavelet L(L) +!HISTORY_MSG_LOCAL_CIEMASK_WLEV;Local - CIECAM Mask wavelet levels +!HISTORY_MSG_LOCAL_CIE_ANGGRAD;Local - CIECAM Gradient angle +!HISTORY_MSG_LOCAL_CIE_BLACKS;Local - CIECAM Blacks distribution +!HISTORY_MSG_LOCAL_CIE_BLUXL;Local - CIECAM Blue X +!HISTORY_MSG_LOCAL_CIE_BLUYL;Local - CIECAM Blue Y +!HISTORY_MSG_LOCAL_CIE_BRICOMP;Local - CIECAM Brightness compression +!HISTORY_MSG_LOCAL_CIE_BRICOMPTH;Local - CIECAM Brightness compression threshold +!HISTORY_MSG_LOCAL_CIE_BWCIE;Local - CIECAM Black and white +!HISTORY_MSG_LOCAL_CIE_CAT;Local - Matrix adaptation +!HISTORY_MSG_LOCAL_CIE_DETAILJZ;Local - JzCzHz Local contrast +!HISTORY_MSG_LOCAL_CIE_ENAMASKALL;Local - CIECAM All mask tools +!HISTORY_MSG_LOCAL_CIE_EXPPRECAM;Local - CIECAM Pre-Cam +!HISTORY_MSG_LOCAL_CIE_GAM;Local - CIECAM Gamma +!HISTORY_MSG_LOCAL_CIE_GAMUTCIE;Local - CIECAM Gamut +!HISTORY_MSG_LOCAL_CIE_GREXL;Local - CIECAM Green X +!HISTORY_MSG_LOCAL_CIE_GREYL;Local - CIECAM Green Y +!HISTORY_MSG_LOCAL_CIE_ILL;Local - CIECAM TRC Illuminant +!HISTORY_MSG_LOCAL_CIE_LOGCIEQ;Local - CIECAM Log encoding Q +!HISTORY_MSG_LOCAL_CIE_MIDT;Local - CIECAM Mid Tones +!HISTORY_MSG_LOCAL_CIE_NORM;Local - CIECAM Normalize L +!HISTORY_MSG_LOCAL_CIE_PRIM;Local - CIECAM TRC primaries +!HISTORY_MSG_LOCAL_CIE_REDXL;Local - CIECAM Red X +!HISTORY_MSG_LOCAL_CIE_REDYL;Local - CIECAM Red Y +!HISTORY_MSG_LOCAL_CIE_REFI;Local - CIECAM Refinement colors +!HISTORY_MSG_LOCAL_CIE_SATCIE;Local - CIECAM Saturation control +!HISTORY_MSG_LOCAL_CIE_SHIFTXL;Local - CIECAM Shift x +!HISTORY_MSG_LOCAL_CIE_SHIFTYL;Local - CIECAM Shift y +!HISTORY_MSG_LOCAL_CIE_SIG;Local - Sigmoid +!HISTORY_MSG_LOCAL_CIE_SIGADAP;Local - CIECAM Sigmoid adaptability +!HISTORY_MSG_LOCAL_CIE_SIGMET;Local - CIECAM Sigmoid method +!HISTORY_MSG_LOCAL_CIE_SLOP;Local - CIECAM Slope +!HISTORY_MSG_LOCAL_CIE_SLOPESMO;Local - CIECAM Gray balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOB;Local - CIECAM Blue balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOG;Local - CIECAM Green balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOR;Local - CIECAM Red balance +!HISTORY_MSG_LOCAL_CIE_SMOOTH;Local - CIECAM Scale Yb scene +!HISTORY_MSG_LOCAL_CIE_SMOOTHMET;Local - CIECAM Smooth lights method +!HISTORY_MSG_LOCAL_CIE_SMOOTHYB;Local - CIECAM Scale Yb viewing +!HISTORY_MSG_LOCAL_CIE_SMOOTH_LUM;Local - CIECAM Levels - Luminosity mode +!HISTORY_MSG_LOCAL_CIE_STRGRAD;Local - CIECAM Gradient strength L +!HISTORY_MSG_LOCAL_CIE_STRLOG;Local - CIECAM Log encoding strength +!HISTORY_MSG_LOCAL_CIE_TRC;Local - CIECAM TRC +!HISTORY_MSG_LOCAL_CIE_WHITES;Local - CIECAM Whites distribution +!HISTORY_MSG_LOCAL_DEHAZE_BLACK;Local - Dehaze Black +!HISTORY_MSG_LOCAL_FEATHERCIE;Local - CIECAM Gradient feather +!HISTORY_MSG_LOCAL_FEATHERCOL;Local - Color Gradient feather +!HISTORY_MSG_LOCAL_FEATHEREXE;Local - Exp Gradient feather +!HISTORY_MSG_LOCAL_FEATHERLOG;Local - Log Gradient feather +!HISTORY_MSG_LOCAL_FEATHERMAS;Local - Mask Common gradient feather +!HISTORY_MSG_LOCAL_FEATHERSH;Local - SH Gradient feather +!HISTORY_MSG_LOCAL_FEATHERVIB;Local - Vib Gradient feather +!HISTORY_MSG_LOCAL_FEATHERWAV;Local - Wav Gradient feather !HISTORY_MSG_LOCAL_GAMUTMUNSEL;Local - SC - Avoid Color Shift +!HISTORY_MSG_LOCAL_LOG_BLACKS;Local - Log Blacks distribution +!HISTORY_MSG_LOCAL_LOG_COMPR;Local - Log Compress brightness +!HISTORY_MSG_LOCAL_LOG_SAT;Local - Log Saturation control +!HISTORY_MSG_LOCAL_LOG_WHITES;Local - Log Whites distribution !HISTORY_MSG_LOCAL_TMO_SATUR;Local Exp Fattal Saturation !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold @@ -2556,10 +2626,10 @@ 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;Selective Editing !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%. +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%, or when capture sharpening is enabled. !MONITOR_PROFILE_SYSTEM;System default !PARTIALPASTE_COLORTONING;Color toning !PARTIALPASTE_DEHAZE;Haze removal @@ -2568,8 +2638,8 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control !PARTIALPASTE_FLATFIELDFROMMETADATA;Flat-field from Metadata -!PARTIALPASTE_LOCALLAB;Local Adjustments -!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings +!PARTIALPASTE_LOCALLAB;Selective Editing +!PARTIALPASTE_LOCALLABGROUP;Selective Editing Settings !PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !PARTIALPASTE_PREPROCWB;Preprocess White Balance !PARTIALPASTE_PRSHARPENING;Post-resize sharpening @@ -2581,7 +2651,9 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !PARTIALPASTE_RETINEX;Retinex !PARTIALPASTE_SPOT;Spot removal !PARTIALPASTE_TONE_EQUALIZER;Tone equalizer -!PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode +!PREFERENCES_BROWSERECURSIVEDEPTH;Browse sub-folders depth +!PREFERENCES_BROWSERECURSIVEFOLLOWLINKS;Follow symbolic links when browsing sub-folders +!PREFERENCES_BROWSERECURSIVEMAXDIRS;Maximum sub-folders !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: @@ -2598,7 +2670,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_COMPLEXITYLOC;Default complexity for Selective Editing !PREFERENCES_COMPLEXITY_EXP;Advanced !PREFERENCES_COMPLEXITY_NORM;Standard !PREFERENCES_COMPLEXITY_SIMP;Basic @@ -2626,6 +2698,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !PREFERENCES_LENSPROFILESDIR;Lens profiles directory !PREFERENCES_LENSPROFILESDIR_TOOLTIP;Directory containing Adobe Lens Correction Profiles (LCPs) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders +!PREFERENCES_MAX_ZOOM_TITLE;Maximum zoom !PREFERENCES_METADATA;Metadata !PREFERENCES_METADATA_SYNC;Metadata synchronization with XMP sidecars !PREFERENCES_METADATA_SYNC_NONE;Off @@ -2644,13 +2717,17 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !PREFERENCES_PROFILESAVELOCATION;Processing profile saving location !PREFERENCES_PRTINTENT;Rendering intent !PREFERENCES_PRTPROFILE;Color profile +!PREFERENCES_RAW_DECODER;Raw Decoder +!PREFERENCES_RAW_DECODER_ENABLE_LIBRAW;Use LibRaw !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !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_SHOWTOOLTIP;Show Selective Editing advice tooltips +!PREFERENCES_SPOTLOC;Define Spot method for Selective Editing !PREFERENCES_TAB_FAVORITES;Favorites +!PREFERENCES_THUMBNAIL_RANK_COLOR_MODE;Load/Save thumbnail rank and color from/to XMP sidecars !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. @@ -2680,6 +2757,27 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !PROGRESSBAR_HOTDEADPIXELFILTER;Hot/dead pixel filter... !PROGRESSBAR_LINEDENOISE;Line noise filter... !PROGRESSBAR_RAWCACORR;Raw CA correction... +!QUEUE_DESTPREVIEW_TITLE;Select a thumbnail to preview its destination path here +!QUEUE_DESTPREVIEW_TOOLTIP;Destination path for the first selected image appears here +!QUEUE_LOCATION_TEMPLATE_HELP_BUTTON_TOOLTIP;Show or hide a help panel with instructions for creating location templates +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_BODY;If you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p-3/converted/%P-4/%f +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_TITLE;Common examples +!QUEUE_LOCATION_TEMPLATE_HELP_INTRO;The output template field allows you to to dynamically customize the destination folder and filename. When you include certain specifiers, which begin with %, they are replaced by the program when each file is being saved.\n\nThe sections below describe each type of specifier. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_1;Using this pathname as an example: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_2;The meanings of the formatting strings are: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_LINUX;/home/tom/photos/2010-10-31/photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_WINDOWS;D:\tom\photos\2010-10-31\photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO;The %dN, %d-N, %pN, %p-N, %PN and %P-N (N = 1..9) specifiers will be replaced by elements of the image file's directory path.\nThe format specifiers operate as follows:\n %dN = Nth directory from the end of the path\n %d-N = Nth directory from the start of the path\n %pN = all directories up to the Nth from the end of the path\n %p-N = the first N directories in the path\n %PN = the last N directories in the path\n %P-N = all directories from the Nth to the end of the path\n %f = base filename (no extension) +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO_WINDOWS;For Windows paths, %d-1 is the drive letter and colon, and %d-2 is the base directory on that drive. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_TITLE;Directories and partial paths +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_BODY;%r will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used. +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_TITLE;Rank +!QUEUE_LOCATION_TEMPLATE_HELP_RESULT_MISMATCH;ERROR: 2nd result is different: +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_BODY;%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'. +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_TITLE;Position/sequence in queue +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_BODY;Three different date/time values may be used in templates:\n %tE"%Y-%m-%d" = when export started\n %tF"%Y-%m-%d" = when file was last saved\n %tP"%Y-%m-%d" = when photo was taken\nThe quoted string defines the format of the resulting date and/or time. The format string %tF"%Y-%m-%d" is just one example. The string can use all conversion specifiers defined for the g_date_time_format function (see https://docs.gtk.org/glib/method.DateTime.format.html).\n\nExample format strings: +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_TITLE;Date and time +!QUEUE_LOCATION_TEMPLATE_HELP_TITLE;Creating an output template !QUEUE_LOCATION_TITLE;Output Location !SAMPLEFORMAT_0;Unknown data format !SAMPLEFORMAT_1;8-bit unsigned @@ -2701,12 +2799,16 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !SORT_BY_NAME;By Name !SORT_BY_RANK;By Rank !SORT_DESCENDING;Descending +!TC_LOCALLAB_PRIM_SHIFTX;Shift x +!TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP;In combination with "Refine colors", allows you to:\n 1) for low values, adjust the image purity.\n 2) for higher values, carry out moderate color toning.\nBe careful not to go outside the CIE xy diagram. +!TC_LOCALLAB_PRIM_SHIFTY;Shift y !TC_PRIM_BLUX;Bx !TC_PRIM_BLUY;By !TC_PRIM_GREX;Gx !TC_PRIM_GREY;Gy !TC_PRIM_REDX;Rx !TC_PRIM_REDY;Ry +!TC_PRIM_REFI;Refine colors (white-point) !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 @@ -2905,6 +3007,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_BW;Black and White !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 @@ -2922,8 +3025,15 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_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 three main uses - channel mixer, restore image color (saturation), 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_CAT;Matrix adaptation +!TP_ICM_WORKING_CAT_BRAD;Bradford +!TP_ICM_WORKING_CAT_CAT02;Cat02 +!TP_ICM_WORKING_CAT_CAT16;Cat16 +!TP_ICM_WORKING_CAT_TOOLTIP;Performs the chromatic adaptation of the XYZ conversion matrix. Default: Bradford +!TP_ICM_WORKING_CAT_VK;Von Kries +!TP_ICM_WORKING_CAT_XYZ;XYZ scale !TP_ICM_WORKING_CIEDIAG;CIE xy diagram !TP_ICM_WORKING_ILLU;Illuminant !TP_ICM_WORKING_ILLU_1500;Tungsten 1500K @@ -2935,11 +3045,13 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_ICM_WORKING_ILLU_D65;D65 !TP_ICM_WORKING_ILLU_D80;D80 !TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_E;E !TP_ICM_WORKING_ILLU_NONE;Default !TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_NON;None !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_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination primaries' combo box, 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 @@ -2948,11 +3060,14 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_FREE;Custom LA (sliders) !TP_ICM_WORKING_PRIM_JDCMAX;JDC Max +!TP_ICM_WORKING_PRIM_JDCMAXSTDA;JDC Max stdA !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_TOOLTIP;Performs a gamut control. Destination primaries (Advanced) allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified.\nWhen 'Custom LA (sliders)' is selected, you can modify the values of the 3 primaries (Red, Green, and Blue) for x and y. !TP_ICM_WORKING_PRIM_WID;WideGamut !TP_ICM_WORKING_TRC;Tone response curve: !TP_ICM_WORKING_TRC_18;Prophoto g=1.8 @@ -2969,6 +3084,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_LENSGEOM_LOG;Logarithmic !TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected !TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected +!TP_LENSPROFILE_CORRECTION_METADATA;From file metadata !TP_LENSPROFILE_MODE_HEADER;Lens Profile !TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion !TP_LENSPROFILE_USE_HEADER;Correct @@ -2979,9 +3095,9 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_AUTOGRAYCIE;Automatic !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_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab). Default: Munsell only.\n\nMunsell only: 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. The result is not the same as Lab. !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 @@ -3024,9 +3140,12 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_LOCALLAB_BUTTON_DUPL;Duplicate !TP_LOCALLAB_BUTTON_REN;Rename !TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWEVNONE;None +!TP_LOCALLAB_BWEVSIG;Activated +!TP_LOCALLAB_BWEVSIGLOG;Sigmoid & Log-Encoding !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_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16 (experimental). 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, for example, to match CAM16 processing with the maximum monitor brightness of 400cd/m2. !TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments !TP_LOCALLAB_CAMMODE;CAM model !TP_LOCALLAB_CAMMODE_CAM16;CAM 16 @@ -3066,6 +3185,12 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_SMOOTHFRAME;Highlight Attenuation & Levels +!TP_LOCALLAB_CIE_SMOOTH_EV;Ev based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA;Slope based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF;Gamma based +!TP_LOCALLAB_CIE_SMOOTH_LEVELS;Levels +!TP_LOCALLAB_CIE_SMOOTH_NONE;None !TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) !TP_LOCALLAB_CIRCRADIUS;Spot size !TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the 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. @@ -3081,8 +3206,9 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_COLORDEPREV_TOOLTIP;Preview ΔE button in Settings will only work if you have activated 'Sharpening', 'Soft Light and Original Retinex', 'Blur/Grain and Denoise', 'Dehaze and Retinex', or 'Contrast by Detail Levels' in the 'Add tool to current spot' menu.\nFor others tools, the Preview ΔE button is in the tool, which allows previewing ΔE with several tools enabled. Prefer using Mask and modifications. !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_COLORFRAME;Dominant color !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 @@ -3090,7 +3216,10 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_LOCALLAB_COL_NAME;Name !TP_LOCALLAB_COL_VIS;Status !TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPRCIE;Brightness compression +!TP_LOCALLAB_COMPRCIETH;Compression threshold !TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_COMPRLOG_TOOLTIP;This algorithm compress the data before log conversion, above the threshold slider value. To use in conjunction with Whites distribution. !TP_LOCALLAB_CONTCOL;Contrast threshold !TP_LOCALLAB_CONTFRA;Contrast by level !TP_LOCALLAB_CONTRAST;Contrast @@ -3105,7 +3234,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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 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 spot. -!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combo box 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. @@ -3114,13 +3243,14 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_LOCALLAB_DARKRETI;Darkness !TP_LOCALLAB_DEHAFRA;Dehaze !TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZE_BLACK;Black !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_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. @@ -3140,6 +3270,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_LOCALLAB_DETAILFRA;Edge detection - DCT !TP_LOCALLAB_DETAILSH;Details !TP_LOCALLAB_DETAILTHR;Lum/chrom detail threshold +!TP_LOCALLAB_DISAB_CIECAM;Disable Ciecam or Weak Jz surround !TP_LOCALLAB_DIVGR;Gamma !TP_LOCALLAB_DUPLSPOTNAME;Copy !TP_LOCALLAB_EDGFRA;Edge sharpness @@ -3148,6 +3279,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping !TP_LOCALLAB_ENABLE_MASK;Enable mask !TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENABLE_MASKALL;Enable all mask tools !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 @@ -3163,9 +3295,10 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all selective editing data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\nUse 'Scope' (Excluding) to set the exclusion intensity.\n\n'Full image' allows you to use the selective editing tools on the whole image.\nThe RT Spot delimiters are set beyond the image preview boundaries.\nThe 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.\nNote: 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.\n\n'Global' allows you to use the selective editing tools on the whole image, without using Delta E or transitions. !TP_LOCALLAB_EXECLU;Excluding spot !TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXMAIN;Global !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 @@ -3174,11 +3307,11 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Selective Editing 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 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_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. @@ -3200,7 +3333,8 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_LOCALLAB_FATSAT;Saturation control !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_FEATVALUE;Feather gradient +!TP_LOCALLAB_FEATVALUE_MASK;Feather gradient (Grad. Filters Mask) !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 @@ -3296,7 +3430,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_LABEL;Selective Editing !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 @@ -3341,8 +3475,10 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_LOGCIE;Log encoding +!TP_LOCALLAB_LOGCIEQ;Log Encoding Q (with Ciecam) +!TP_LOCALLAB_LOGCIEQ_TOOLTIP;Activating the checkbox allows you to switch between log encoding based on the 3 RGB channels, and log encoding based solely on Ciecam’s brightness (Q) channel.\nUsing the Q channel instead of the RGB channels helps avoid undesirable edge effects such as hue and saturation shifts.\nHowever, the settings are more difficult to optimise because Q is unbounded and Ciecam alters the data to take into account the surround conditions, simultaneous contrast, etc.\nYou may have to adjust the following:\n Scene conditions: Mean luminance (Yb), Whites & Blacks distribution, Black Ev, White Ev.\n Source Data Adjustments : Brightness compression, Strength.\n\nNote: when using Log Encoding (Q), be careful not to activate the Disable Ciecam option in the Scene Conditions, Surround menu. +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you to use Black Ev, White Ev, White and Black distribution, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using 'Log encoding' with Brightness compression. !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) @@ -3350,7 +3486,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_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 @@ -3363,6 +3499,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_LOGPFRA2;Log Encoding settings !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. @@ -3432,7 +3569,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_MASKUNUSABLE;Mask disabled (Enable in 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 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 @@ -3468,6 +3605,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_LOCALLAB_MERTWE;Exclusion !TP_LOCALLAB_MERTWO;Subtract !TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MIDTCIE;Midtones !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 @@ -3515,10 +3653,15 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_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_PRECAMGAMUT_TOOLTIP;If checked, ensures a gamut control just after primary conversion to XYZ. +!TP_LOCALLAB_PRECAMREFIMAIN_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. In combination with "Shift x" and "Shift y", allows you to carry out moderate color toning. +!TP_LOCALLAB_PRECAMREFI_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. +!TP_LOCALLAB_PRECAM_TOOLTIP;'Source Data Adjustments' modifies the Dynamic Range using Log encoding, the tones of the image and primaries (simplified Abstract Profile), and midtones, just before the Ciecam process. These values are adjustable:\nGamma: Acts mainly on light tones\nSlope: Acts mainly on dark tones. You 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.\nDestination primaries: Allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified. You can also finely adapt the primaries and the illuminant (white-point). Moving a primary away from the white point reduces saturation and vice versa. Pay attention to the gamut. !TP_LOCALLAB_PREVHIDE;Hide additional settings !TP_LOCALLAB_PREVIEW;Preview ΔE !TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PRIMILLFRAME;Primaries & Illuminant !TP_LOCALLAB_PROXI;ΔE decay !TP_LOCALLAB_QUAAGRES;Aggressive !TP_LOCALLAB_QUACONSER;Conservative @@ -3563,10 +3706,11 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_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_SATCIE;Saturation control !TP_LOCALLAB_SATUR;Saturation !TP_LOCALLAB_SATURV;Saturation (s) !TP_LOCALLAB_SCALEGR;Scale @@ -3587,7 +3731,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_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;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. @@ -3633,17 +3777,41 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_SIGBLACKSSCIE;Blacks distribution +!TP_LOCALLAB_SIGCIE;Sigmoid +!TP_LOCALLAB_SIGFRA;Sigmoid Q +!TP_LOCALLAB_SIGGAMJCIE;Gamma !TP_LOCALLAB_SIGJZFRA;Sigmoid Jz !TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOID16_TOOLTIP;Allows you to simulate a tone mapping appearance using both 'Ciecam' and 'Sigmoid Q'. Sigmoid Q has three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc) Adaptability weights the action of the sigmoid by action on the internal exponential function. !TP_LOCALLAB_SIGMOIDBL;Blend !TP_LOCALLAB_SIGMOIDLAMBDA;Contrast -!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDLOGAUTO;Auto threshold +!TP_LOCALLAB_SIGMOIDLOGEV_TOOLTIP;If the combo box selection 'Black Ev and White Ev' is 'Sigmoid and Log encoding' instead of 'Sigmoid only', the two algorithms 'Log encoding' and 'Sigmoid' are used together. +!TP_LOCALLAB_SIGMOIDNORMCIE;Normalize Luminance +!TP_LOCALLAB_SIGMOIDNORMCIEBLEND_TOOLTIP;Blend acts on the final aspect of the image, contrast and luminance. Ratio between original and output image. +!TP_LOCALLAB_SIGMOIDNORMCIE_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image take into account those of the original.\nAll the adjustments acting on J or Q are taken into account, including those which are not relative to Sigmoid Q. +!TP_LOCALLAB_SIGMOIDQJ;Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDQJCOMPRCIE_TOOLTIP;When the combo box selection 'Uses Black Ev and White Ev' is 'Sigmoid and Log encoding Q' or 'Log encoding instead of Sigmoid' checked. This algorithm compress the data above the threshold slider value. The last value stands for brightness (Q) and should be close as possible to the value 'Compression threshold' (calculate when 'Auto threshold" checked, often > 1). +!TP_LOCALLAB_SIGMOIDSENSI;Adaptability !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_SIGMOIDWHITESCIE_TOOLTIP;Allows you, in Automatic when the dynamic range of the image is high, to change the distribution of lights in whites and deep blacks.\nCan be used with Log encoding or Sigmoid with Black Ev and White Ev enabled.\n\nThe algorithm does not change the basic data, but acts on the components necessary to calculate the Dynamic range, Black Ev, White Ev and the Gray point. +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a tone mapping appearance using both the 'Jz' and 'Sigmoid' function. Three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SIGSLOPJCIE;Slope +!TP_LOCALLAB_SIGTRCCIE;Source Data Adjustments +!TP_LOCALLAB_SIGWHITESCIE;Whites distribution !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_SLOPESMOOTH;Gray balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHB;Blue balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHG;Green balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHR;Red balance (Slope) !TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SMOOTHCIE;Highlight Attenuation +!TP_LOCALLAB_SMOOTHCIE_LUM;Luminosity mode +!TP_LOCALLAB_SMOOTHCIE_SCA;Scale Yb Scene +!TP_LOCALLAB_SMOOTHCIE_TOOLTIP;Completes the processing carried out by gamma, slope and midtones by causing a slight lowering of lights. Please note this does not replace Highlight reconstruction.\n\nGamma based and Slope based (Standard and Advanced) allow you to simulate a tone mapping using:\na) Scene conditions: Black-Ev, White-Ev, Mean luminance (Yb%)\nb) Viewing conditions: Mean luminance (Yb%).\n\nScale Yb Scene is function of White-Ev. +!TP_LOCALLAB_SMOOTHCIE_YB;Scale Yb Viewing !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. @@ -3665,13 +3833,14 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_STRENGTHCIELOG;Strength !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_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. @@ -3703,11 +3872,12 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_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_TRCFRAME;Tone Response Curve & Midtones !TP_LOCALLAB_USEMASK;Laplacian !TP_LOCALLAB_VART;Variance (contrast) !TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool @@ -4197,7 +4367,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_WAVELET_WAVOFFSET;Offset !TP_WBALANCE_AUTOITCGREEN;Temperature correlation !TP_WBALANCE_AUTOOLD;RGB grey -!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement +!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement !TP_WBALANCE_ITCWALG_TOOLTIP;Allows you to switch to the other Alternative temperature (Alt_temp), when possible.\nInactive in the "single choice" case. !TP_WBALANCE_ITCWBDELTA_TOOLTIP;Fixed for each "green" iteration tried, the temperature difference to be taken into account. !TP_WBALANCE_ITCWBFGREEN_TOOLTIP;Find the best compromise between Student and green. @@ -4240,7 +4410,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_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).\nIn the rare case of a color drift with "Observer 2°" (probably due to the conversion matrix) "Observer 10°" must be selected. !TP_WBALANCE_PATCHLABEL;Read colors:%1 Patch: Chroma:%2 Size=%3 !TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colors (max=237).\nDisplay calculated Patch Chroma.\nAWB temperature bias, lets try to reduce this value, a minimum may seem to optimize the algorithm.\n\nPatch size matching chroma optimization. !TP_WBALANCE_PATCHLEVELLABEL;Patch: ΔE=%1 - datas x 9 Min:%2 Max=%3 diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index 1cf1086bf..1cf459b82 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -50,7 +50,6 @@ EXIFPANEL_RESET;Врати EXIFPANEL_RESETALL;Врати све EXIFPANEL_RESETALLHINT;Враћа све ознаке на почетне вредности EXIFPANEL_RESETHINT;Враћа изабрану ознаку на почетну вредности -EXIFPANEL_SUBDIRECTORY;Поддиректоријум EXPORT_BYPASS_ALL;Изабери / поништи све EXPORT_BYPASS_DEFRINGE;Занемари уклањање ореола EXPORT_BYPASS_DIRPYRDENOISE;Занемари уклањање шума @@ -407,7 +406,6 @@ HISTORY_NEWSNAPSHOT;Додај HISTORY_NEWSNAPSHOT_TOOLTIP;Пречица: Alt-s HISTORY_SNAPSHOT;Снимак HISTORY_SNAPSHOTS;Снимак -HRESHOLDSELECTOR_BL;Доле-лево IPTCPANEL_CATEGORY;Категорија IPTCPANEL_CITY;Град IPTCPANEL_COPYHINT;Коппирај ИПТЦ пшодешавања у оставу @@ -430,9 +428,7 @@ MAIN_BUTTON_NAVNEXT_TOOLTIP;Шаље вас на наредну слику у о MAIN_BUTTON_NAVPREV_TOOLTIP;Шаље вас на претходну слику у односу на отворену у прозору за уређивање.\nПречица: Shift-F3\n\nnТакође, омогућа вам да идете на наредну слику у односу на тренутно изабрану у разгледачу или филмској траци.\nПречица: F3 MAIN_BUTTON_NAVSYNC_TOOLTIP;Усаглашава разгледач датотека или филмску траку са делом за уређивање ради умањеног приказа тренутно отворене слике и чисти све изабране филтере.\nПречица: x\n\nКао и претходна операција, али без чишћења изабраних филтера:\nПречица: y\n(Умањени приказ отворене слике неће бити приказан уколико је изфилтриран). MAIN_BUTTON_PREFERENCES;Поставке -MAIN_BUTTON_PUTTOQUEUE;Закажи MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Додаје тренутну слику у заказане Ctrl+B -MAIN_BUTTON_SAVE;Сачувај MAIN_BUTTON_SAVE_TOOLTIP;Чува тренутну слику Ctrl+С MAIN_BUTTON_SENDTOEDITOR;Уреди MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Уређује тренутну слику у спољном програму Ctrl+Е @@ -670,6 +666,7 @@ PROFILEPANEL_TOOLTIPSAVE;Чува тренутни профил PROGRESSBAR_LOADING;Учитавам слику... PROGRESSBAR_LOADINGTHUMBS;Учитавам приказе... PROGRESSBAR_LOADJPEG;Учитавам JPEG датотеку... +PROGRESSBAR_LOADJXL;Учитавам JXL датотеку... PROGRESSBAR_LOADPNG;Учитавам PNG датотеку... PROGRESSBAR_LOADTIFF;Учитавам TIFF датотеку... PROGRESSBAR_NOIMAGES;Нису пронађене слике @@ -708,6 +705,7 @@ SAVEDLG_TIFFUNCOMPRESSED;Незапаковани TIFF SAVEDLG_WARNFILENAME;Датотека ће бити названа SHCSELECTOR_TOOLTIP;Кликните десно дугме миша да поново вратите позицију ова три клизача. THRESHOLDSELECTOR_B;Доле +THRESHOLDSELECTOR_BL;Доле-лево THRESHOLDSELECTOR_BR;Доле-десно THRESHOLDSELECTOR_HINT;Притисните дугме Shift за померање појединачних тачака. THRESHOLDSELECTOR_T;Горе @@ -893,7 +891,6 @@ TP_EXPOSURE_COMPRHIGHLIGHTS;Сабијање светлог TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Праг за чупање светлих делова TP_EXPOSURE_COMPRSHADOWS;Сабијање сенки TP_EXPOSURE_CONTRAST;Контраст -TP_EXPOSURE_CURVEEDITOR;Крива нијанси TP_EXPOSURE_CURVEEDITOR1;Крива тонова 1 TP_EXPOSURE_CURVEEDITOR2;Крива тонова 2 TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Погледајте „Експозиција > Криве тонова“ унутар чланка на сајту RawPedia како би научили како се постижу најбољи резучтати успотребом две криве тонова. @@ -961,8 +958,6 @@ TP_ICM_TONECURVE_TOOLTIP;Употребљава уграђену DCP криву TP_ICM_WORKINGPROFILE;Радни профил TP_IMPULSEDENOISE_LABEL;Импулсно уклањање шума TP_IMPULSEDENOISE_THRESH;Праг -TP_LABCURVE_AVOIDCOLORSHIFT;Избегни померање боја -TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Поставља боје у опсег тренутног радног простора боја и примењује Мунселову корекцију. TP_LABCURVE_BRIGHTNESS;Осветљеност TP_LABCURVE_CHROMATICITY;Боје TP_LABCURVE_CHROMA_TOOLTIP;To apply ЦБ toning, set Chromaticity to -100. @@ -1235,6 +1230,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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. +!FILEBROWSER_SHOWRECURSIVE;Show images in sub-folders recursively. !FILECHOOSER_FILTER_ANY;All files !FILECHOOSER_FILTER_COLPROF;Color profiles (*.icc) !FILECHOOSER_FILTER_CURVE;Curve files @@ -1526,7 +1522,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_512;Local - SD - ΔE decay !HISTORY_MSG_513;Local - Spot - Excluding - Scope !HISTORY_MSG_514;Local - Spot structure -!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_515;Selective Editing !HISTORY_MSG_516;Local - Color and light !HISTORY_MSG_517;Local - Enable super !HISTORY_MSG_518;Local - Lightness @@ -1836,7 +1832,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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 - TG - Feather gradient +!HISTORY_MSG_833;Local - Mask 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 @@ -2079,7 +2075,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_1082;Local - CIECAM Auto threshold !HISTORY_MSG_1083;Local - CIECAM Hue !HISTORY_MSG_1084;Local - Uses Black Ev - White Ev !HISTORY_MSG_1085;Local - Jz lightness @@ -2195,16 +2191,23 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_ICM_AINTENT;Abstract profile intent !HISTORY_MSG_ICM_BLUX;Primaries Blue X !HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_CAT;Matrix adaptation !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_MIDTCIE;Midtones !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_PRESER;Preserve neutral !HISTORY_MSG_ICM_REDX;Primaries Red X !HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_REFI;Refinement Colors +!HISTORY_MSG_ICM_SHIFTX;Refinement Colors - Shift x +!HISTORY_MSG_ICM_SHIFTY;Refinement Colors - Shift y +!HISTORY_MSG_ICM_SMOOTHCIE;Smooth highlights +!HISTORY_MSG_ICM_TRCEXP;Abstract Profile !HISTORY_MSG_ICM_WORKING_GAMMA;TRC - Gamma !HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method !HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method @@ -2217,7 +2220,72 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_LOCALLAB_TE_PIVOT;Local - Equalizer pivot +!HISTORY_MSG_LOCAL_CIEMASK_BLURCONT;Local - CIECAM Mask blur contrast +!HISTORY_MSG_LOCAL_CIEMASK_BLURFFT;Local - CIECAM Mask blur FFTW +!HISTORY_MSG_LOCAL_CIEMASK_BLURRAD;Local - CIECAM Mask blur radius +!HISTORY_MSG_LOCAL_CIEMASK_CHH;Local - CIECAM Mask curve h(h) +!HISTORY_MSG_LOCAL_CIEMASK_HIGH;Local - CIECAM Mask highlights +!HISTORY_MSG_LOCAL_CIEMASK_SHAD;Local - CIECAM Mask shadows +!HISTORY_MSG_LOCAL_CIEMASK_STRU;Local - CIECAM Mask structure +!HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;Local - CIECAM Mask structure as tool +!HISTORY_MSG_LOCAL_CIEMASK_WLC;Local - CIECAM Mask wavelet L(L) +!HISTORY_MSG_LOCAL_CIEMASK_WLEV;Local - CIECAM Mask wavelet levels +!HISTORY_MSG_LOCAL_CIE_ANGGRAD;Local - CIECAM Gradient angle +!HISTORY_MSG_LOCAL_CIE_BLACKS;Local - CIECAM Blacks distribution +!HISTORY_MSG_LOCAL_CIE_BLUXL;Local - CIECAM Blue X +!HISTORY_MSG_LOCAL_CIE_BLUYL;Local - CIECAM Blue Y +!HISTORY_MSG_LOCAL_CIE_BRICOMP;Local - CIECAM Brightness compression +!HISTORY_MSG_LOCAL_CIE_BRICOMPTH;Local - CIECAM Brightness compression threshold +!HISTORY_MSG_LOCAL_CIE_BWCIE;Local - CIECAM Black and white +!HISTORY_MSG_LOCAL_CIE_CAT;Local - Matrix adaptation +!HISTORY_MSG_LOCAL_CIE_DETAILJZ;Local - JzCzHz Local contrast +!HISTORY_MSG_LOCAL_CIE_ENAMASKALL;Local - CIECAM All mask tools +!HISTORY_MSG_LOCAL_CIE_EXPPRECAM;Local - CIECAM Pre-Cam +!HISTORY_MSG_LOCAL_CIE_GAM;Local - CIECAM Gamma +!HISTORY_MSG_LOCAL_CIE_GAMUTCIE;Local - CIECAM Gamut +!HISTORY_MSG_LOCAL_CIE_GREXL;Local - CIECAM Green X +!HISTORY_MSG_LOCAL_CIE_GREYL;Local - CIECAM Green Y +!HISTORY_MSG_LOCAL_CIE_ILL;Local - CIECAM TRC Illuminant +!HISTORY_MSG_LOCAL_CIE_LOGCIEQ;Local - CIECAM Log encoding Q +!HISTORY_MSG_LOCAL_CIE_MIDT;Local - CIECAM Mid Tones +!HISTORY_MSG_LOCAL_CIE_NORM;Local - CIECAM Normalize L +!HISTORY_MSG_LOCAL_CIE_PRIM;Local - CIECAM TRC primaries +!HISTORY_MSG_LOCAL_CIE_REDXL;Local - CIECAM Red X +!HISTORY_MSG_LOCAL_CIE_REDYL;Local - CIECAM Red Y +!HISTORY_MSG_LOCAL_CIE_REFI;Local - CIECAM Refinement colors +!HISTORY_MSG_LOCAL_CIE_SATCIE;Local - CIECAM Saturation control +!HISTORY_MSG_LOCAL_CIE_SHIFTXL;Local - CIECAM Shift x +!HISTORY_MSG_LOCAL_CIE_SHIFTYL;Local - CIECAM Shift y +!HISTORY_MSG_LOCAL_CIE_SIG;Local - Sigmoid +!HISTORY_MSG_LOCAL_CIE_SIGADAP;Local - CIECAM Sigmoid adaptability +!HISTORY_MSG_LOCAL_CIE_SIGMET;Local - CIECAM Sigmoid method +!HISTORY_MSG_LOCAL_CIE_SLOP;Local - CIECAM Slope +!HISTORY_MSG_LOCAL_CIE_SLOPESMO;Local - CIECAM Gray balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOB;Local - CIECAM Blue balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOG;Local - CIECAM Green balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOR;Local - CIECAM Red balance +!HISTORY_MSG_LOCAL_CIE_SMOOTH;Local - CIECAM Scale Yb scene +!HISTORY_MSG_LOCAL_CIE_SMOOTHMET;Local - CIECAM Smooth lights method +!HISTORY_MSG_LOCAL_CIE_SMOOTHYB;Local - CIECAM Scale Yb viewing +!HISTORY_MSG_LOCAL_CIE_SMOOTH_LUM;Local - CIECAM Levels - Luminosity mode +!HISTORY_MSG_LOCAL_CIE_STRGRAD;Local - CIECAM Gradient strength L +!HISTORY_MSG_LOCAL_CIE_STRLOG;Local - CIECAM Log encoding strength +!HISTORY_MSG_LOCAL_CIE_TRC;Local - CIECAM TRC +!HISTORY_MSG_LOCAL_CIE_WHITES;Local - CIECAM Whites distribution +!HISTORY_MSG_LOCAL_DEHAZE_BLACK;Local - Dehaze Black +!HISTORY_MSG_LOCAL_FEATHERCIE;Local - CIECAM Gradient feather +!HISTORY_MSG_LOCAL_FEATHERCOL;Local - Color Gradient feather +!HISTORY_MSG_LOCAL_FEATHEREXE;Local - Exp Gradient feather +!HISTORY_MSG_LOCAL_FEATHERLOG;Local - Log Gradient feather +!HISTORY_MSG_LOCAL_FEATHERMAS;Local - Mask Common gradient feather +!HISTORY_MSG_LOCAL_FEATHERSH;Local - SH Gradient feather +!HISTORY_MSG_LOCAL_FEATHERVIB;Local - Vib Gradient feather +!HISTORY_MSG_LOCAL_FEATHERWAV;Local - Wav Gradient feather !HISTORY_MSG_LOCAL_GAMUTMUNSEL;Local - SC - Avoid Color Shift +!HISTORY_MSG_LOCAL_LOG_BLACKS;Local - Log Blacks distribution +!HISTORY_MSG_LOCAL_LOG_COMPR;Local - Log Compress brightness +!HISTORY_MSG_LOCAL_LOG_SAT;Local - Log Saturation control +!HISTORY_MSG_LOCAL_LOG_WHITES;Local - Log Whites distribution !HISTORY_MSG_LOCAL_TMO_SATUR;Local Exp Fattal Saturation !HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold @@ -2402,10 +2470,10 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !MAIN_TAB_FAVORITES;Favorites !MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !MAIN_TAB_INSPECT; Inspect -!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB;Selective Editing !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%. +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%, or when capture sharpening is enabled. !MONITOR_PROFILE_SYSTEM;System default !NAVIGATOR_B;B: !NAVIGATOR_G;G: @@ -2429,8 +2497,8 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control !PARTIALPASTE_FLATFIELDFROMMETADATA;Flat-field from Metadata !PARTIALPASTE_LOCALCONTRAST;Local contrast -!PARTIALPASTE_LOCALLAB;Local Adjustments -!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings +!PARTIALPASTE_LOCALLAB;Selective Editing +!PARTIALPASTE_LOCALLABGROUP;Selective Editing Settings !PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_METAGROUP;Metadata settings !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -2453,9 +2521,11 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color !PREFERENCES_APPEARANCE_MAINFONT;Main font !PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator guide color -!PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode !PREFERENCES_APPEARANCE_THEME;Theme !PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit +!PREFERENCES_BROWSERECURSIVEDEPTH;Browse sub-folders depth +!PREFERENCES_BROWSERECURSIVEFOLLOWLINKS;Follow symbolic links when browsing sub-folders +!PREFERENCES_BROWSERECURSIVEMAXDIRS;Maximum sub-folders !PREFERENCES_CACHECLEAR;Clear !PREFERENCES_CACHECLEAR_ALL;Clear all cached files: !PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: @@ -2474,7 +2544,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_COMPLEXITYLOC;Default complexity for Selective Editing !PREFERENCES_COMPLEXITY_EXP;Advanced !PREFERENCES_COMPLEXITY_NORM;Standard !PREFERENCES_COMPLEXITY_SIMP;Basic @@ -2516,6 +2586,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !PREFERENCES_LENSPROFILESDIR;Lens profiles directory !PREFERENCES_LENSPROFILESDIR_TOOLTIP;Directory containing Adobe Lens Correction Profiles (LCPs) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders +!PREFERENCES_MAX_ZOOM_TITLE;Maximum zoom !PREFERENCES_METADATA;Metadata !PREFERENCES_METADATA_SYNC;Metadata synchronization with XMP sidecars !PREFERENCES_METADATA_SYNC_NONE;Off @@ -2543,6 +2614,8 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !PREFERENCES_PROFILE_NONE;None !PREFERENCES_PRTINTENT;Rendering intent !PREFERENCES_PRTPROFILE;Color profile +!PREFERENCES_RAW_DECODER;Raw Decoder +!PREFERENCES_RAW_DECODER_ENABLE_LIBRAW;Use LibRaw !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in 'Single Editor Tab Mode' and when 'Demosaicing method used for the preview at <100% zoom' is set to 'As in PP3'. !PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now @@ -2550,7 +2623,8 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_SHOWTOOLTIP;Show Selective Editing advice tooltips +!PREFERENCES_SPOTLOC;Define Spot method for Selective Editing !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules !PREFERENCES_TAB_FAVORITES;Favorites !PREFERENCES_TAB_PERFORMANCE;Performance @@ -2558,6 +2632,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_THUMBNAIL_RANK_COLOR_MODE;Load/Save thumbnail rank and color from/to XMP sidecars !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. @@ -2590,6 +2665,27 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !QINFO_FRAMECOUNT;%2 frames !QINFO_HDR;HDR / %2 frame(s) !QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!QUEUE_DESTPREVIEW_TITLE;Select a thumbnail to preview its destination path here +!QUEUE_DESTPREVIEW_TOOLTIP;Destination path for the first selected image appears here +!QUEUE_LOCATION_TEMPLATE_HELP_BUTTON_TOOLTIP;Show or hide a help panel with instructions for creating location templates +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_BODY;If you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p-3/converted/%P-4/%f +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_TITLE;Common examples +!QUEUE_LOCATION_TEMPLATE_HELP_INTRO;The output template field allows you to to dynamically customize the destination folder and filename. When you include certain specifiers, which begin with %, they are replaced by the program when each file is being saved.\n\nThe sections below describe each type of specifier. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_1;Using this pathname as an example: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_2;The meanings of the formatting strings are: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_LINUX;/home/tom/photos/2010-10-31/photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_WINDOWS;D:\tom\photos\2010-10-31\photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO;The %dN, %d-N, %pN, %p-N, %PN and %P-N (N = 1..9) specifiers will be replaced by elements of the image file's directory path.\nThe format specifiers operate as follows:\n %dN = Nth directory from the end of the path\n %d-N = Nth directory from the start of the path\n %pN = all directories up to the Nth from the end of the path\n %p-N = the first N directories in the path\n %PN = the last N directories in the path\n %P-N = all directories from the Nth to the end of the path\n %f = base filename (no extension) +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO_WINDOWS;For Windows paths, %d-1 is the drive letter and colon, and %d-2 is the base directory on that drive. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_TITLE;Directories and partial paths +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_BODY;%r will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used. +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_TITLE;Rank +!QUEUE_LOCATION_TEMPLATE_HELP_RESULT_MISMATCH;ERROR: 2nd result is different: +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_BODY;%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'. +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_TITLE;Position/sequence in queue +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_BODY;Three different date/time values may be used in templates:\n %tE"%Y-%m-%d" = when export started\n %tF"%Y-%m-%d" = when file was last saved\n %tP"%Y-%m-%d" = when photo was taken\nThe quoted string defines the format of the resulting date and/or time. The format string %tF"%Y-%m-%d" is just one example. The string can use all conversion specifiers defined for the g_date_time_format function (see https://docs.gtk.org/glib/method.DateTime.format.html).\n\nExample format strings: +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_TITLE;Date and time +!QUEUE_LOCATION_TEMPLATE_HELP_TITLE;Creating an output template !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 @@ -2611,13 +2707,16 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !SORT_BY_NAME;By Name !SORT_BY_RANK;By Rank !SORT_DESCENDING;Descending +!TC_LOCALLAB_PRIM_SHIFTX;Shift x +!TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP;In combination with "Refine colors", allows you to:\n 1) for low values, adjust the image purity.\n 2) for higher values, carry out moderate color toning.\nBe careful not to go outside the CIE xy diagram. +!TC_LOCALLAB_PRIM_SHIFTY;Shift y !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 +!TC_PRIM_REFI;Refine colors (white-point) !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. @@ -2836,6 +2935,7 @@ 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_BW;Black and White !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 @@ -2854,8 +2954,15 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_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 three main uses - channel mixer, restore image color (saturation), 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_CAT;Matrix adaptation +!TP_ICM_WORKING_CAT_BRAD;Bradford +!TP_ICM_WORKING_CAT_CAT02;Cat02 +!TP_ICM_WORKING_CAT_CAT16;Cat16 +!TP_ICM_WORKING_CAT_TOOLTIP;Performs the chromatic adaptation of the XYZ conversion matrix. Default: Bradford +!TP_ICM_WORKING_CAT_VK;Von Kries +!TP_ICM_WORKING_CAT_XYZ;XYZ scale !TP_ICM_WORKING_CIEDIAG;CIE xy diagram !TP_ICM_WORKING_ILLU;Illuminant !TP_ICM_WORKING_ILLU_1500;Tungsten 1500K @@ -2867,11 +2974,13 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_ICM_WORKING_ILLU_D65;D65 !TP_ICM_WORKING_ILLU_D80;D80 !TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_E;E !TP_ICM_WORKING_ILLU_NONE;Default !TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_NON;None !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_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination primaries' combo box, 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 @@ -2880,11 +2989,14 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_FREE;Custom LA (sliders) !TP_ICM_WORKING_PRIM_JDCMAX;JDC Max +!TP_ICM_WORKING_PRIM_JDCMAXSTDA;JDC Max stdA !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_TOOLTIP;Performs a gamut control. Destination primaries (Advanced) allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified.\nWhen 'Custom LA (sliders)' is selected, you can modify the values of the 3 primaries (Red, Green, and Blue) for x and y. !TP_ICM_WORKING_PRIM_WID;WideGamut !TP_ICM_WORKING_TRC;Tone response curve: !TP_ICM_WORKING_TRC_18;Prophoto g=1.8 @@ -2902,6 +3014,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected !TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file !TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected +!TP_LENSPROFILE_CORRECTION_METADATA;From file metadata !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 @@ -2920,9 +3033,9 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_AUTOGRAYCIE;Automatic !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_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab). Default: Munsell only.\n\nMunsell only: 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. The result is not the same as Lab. !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 @@ -2965,9 +3078,12 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_LOCALLAB_BUTTON_DUPL;Duplicate !TP_LOCALLAB_BUTTON_REN;Rename !TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWEVNONE;None +!TP_LOCALLAB_BWEVSIG;Activated +!TP_LOCALLAB_BWEVSIGLOG;Sigmoid & Log-Encoding !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_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16 (experimental). 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, for example, to match CAM16 processing with the maximum monitor brightness of 400cd/m2. !TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments !TP_LOCALLAB_CAMMODE;CAM model !TP_LOCALLAB_CAMMODE_CAM16;CAM 16 @@ -3007,6 +3123,12 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_SMOOTHFRAME;Highlight Attenuation & Levels +!TP_LOCALLAB_CIE_SMOOTH_EV;Ev based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA;Slope based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF;Gamma based +!TP_LOCALLAB_CIE_SMOOTH_LEVELS;Levels +!TP_LOCALLAB_CIE_SMOOTH_NONE;None !TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) !TP_LOCALLAB_CIRCRADIUS;Spot size !TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the 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. @@ -3022,8 +3144,9 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_COLORDEPREV_TOOLTIP;Preview ΔE button in Settings will only work if you have activated 'Sharpening', 'Soft Light and Original Retinex', 'Blur/Grain and Denoise', 'Dehaze and Retinex', or 'Contrast by Detail Levels' in the 'Add tool to current spot' menu.\nFor others tools, the Preview ΔE button is in the tool, which allows previewing ΔE with several tools enabled. Prefer using Mask and modifications. !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_COLORFRAME;Dominant color !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 @@ -3031,7 +3154,10 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_LOCALLAB_COL_NAME;Name !TP_LOCALLAB_COL_VIS;Status !TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPRCIE;Brightness compression +!TP_LOCALLAB_COMPRCIETH;Compression threshold !TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_COMPRLOG_TOOLTIP;This algorithm compress the data before log conversion, above the threshold slider value. To use in conjunction with Whites distribution. !TP_LOCALLAB_CONTCOL;Contrast threshold !TP_LOCALLAB_CONTFRA;Contrast by level !TP_LOCALLAB_CONTRAST;Contrast @@ -3046,7 +3172,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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 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 spot. -!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combo box 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. @@ -3055,13 +3181,14 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_LOCALLAB_DARKRETI;Darkness !TP_LOCALLAB_DEHAFRA;Dehaze !TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZE_BLACK;Black !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_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. @@ -3081,6 +3208,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_LOCALLAB_DETAILFRA;Edge detection - DCT !TP_LOCALLAB_DETAILSH;Details !TP_LOCALLAB_DETAILTHR;Lum/chrom detail threshold +!TP_LOCALLAB_DISAB_CIECAM;Disable Ciecam or Weak Jz surround !TP_LOCALLAB_DIVGR;Gamma !TP_LOCALLAB_DUPLSPOTNAME;Copy !TP_LOCALLAB_EDGFRA;Edge sharpness @@ -3089,6 +3217,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping !TP_LOCALLAB_ENABLE_MASK;Enable mask !TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENABLE_MASKALL;Enable all mask tools !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 @@ -3104,9 +3233,10 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all selective editing data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\nUse 'Scope' (Excluding) to set the exclusion intensity.\n\n'Full image' allows you to use the selective editing tools on the whole image.\nThe RT Spot delimiters are set beyond the image preview boundaries.\nThe 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.\nNote: 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.\n\n'Global' allows you to use the selective editing tools on the whole image, without using Delta E or transitions. !TP_LOCALLAB_EXECLU;Excluding spot !TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXMAIN;Global !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 @@ -3115,11 +3245,11 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Selective Editing 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 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_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. @@ -3141,7 +3271,8 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_LOCALLAB_FATSAT;Saturation control !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_FEATVALUE;Feather gradient +!TP_LOCALLAB_FEATVALUE_MASK;Feather gradient (Grad. Filters Mask) !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 @@ -3237,7 +3368,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_LABEL;Selective Editing !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 @@ -3282,8 +3413,10 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_LOGCIE;Log encoding +!TP_LOCALLAB_LOGCIEQ;Log Encoding Q (with Ciecam) +!TP_LOCALLAB_LOGCIEQ_TOOLTIP;Activating the checkbox allows you to switch between log encoding based on the 3 RGB channels, and log encoding based solely on Ciecam’s brightness (Q) channel.\nUsing the Q channel instead of the RGB channels helps avoid undesirable edge effects such as hue and saturation shifts.\nHowever, the settings are more difficult to optimise because Q is unbounded and Ciecam alters the data to take into account the surround conditions, simultaneous contrast, etc.\nYou may have to adjust the following:\n Scene conditions: Mean luminance (Yb), Whites & Blacks distribution, Black Ev, White Ev.\n Source Data Adjustments : Brightness compression, Strength.\n\nNote: when using Log Encoding (Q), be careful not to activate the Disable Ciecam option in the Scene Conditions, Surround menu. +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you to use Black Ev, White Ev, White and Black distribution, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using 'Log encoding' with Brightness compression. !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) @@ -3291,7 +3424,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_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 @@ -3304,6 +3437,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_LOGPFRA2;Log Encoding settings !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. @@ -3373,7 +3507,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_MASKUNUSABLE;Mask disabled (Enable in 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 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 @@ -3409,6 +3543,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_LOCALLAB_MERTWE;Exclusion !TP_LOCALLAB_MERTWO;Subtract !TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MIDTCIE;Midtones !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 @@ -3456,10 +3591,15 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_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_PRECAMGAMUT_TOOLTIP;If checked, ensures a gamut control just after primary conversion to XYZ. +!TP_LOCALLAB_PRECAMREFIMAIN_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. In combination with "Shift x" and "Shift y", allows you to carry out moderate color toning. +!TP_LOCALLAB_PRECAMREFI_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. +!TP_LOCALLAB_PRECAM_TOOLTIP;'Source Data Adjustments' modifies the Dynamic Range using Log encoding, the tones of the image and primaries (simplified Abstract Profile), and midtones, just before the Ciecam process. These values are adjustable:\nGamma: Acts mainly on light tones\nSlope: Acts mainly on dark tones. You 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.\nDestination primaries: Allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified. You can also finely adapt the primaries and the illuminant (white-point). Moving a primary away from the white point reduces saturation and vice versa. Pay attention to the gamut. !TP_LOCALLAB_PREVHIDE;Hide additional settings !TP_LOCALLAB_PREVIEW;Preview ΔE !TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PRIMILLFRAME;Primaries & Illuminant !TP_LOCALLAB_PROXI;ΔE decay !TP_LOCALLAB_QUAAGRES;Aggressive !TP_LOCALLAB_QUACONSER;Conservative @@ -3504,10 +3644,11 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_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_SATCIE;Saturation control !TP_LOCALLAB_SATUR;Saturation !TP_LOCALLAB_SATURV;Saturation (s) !TP_LOCALLAB_SCALEGR;Scale @@ -3528,7 +3669,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_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;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. @@ -3574,17 +3715,41 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_SIGBLACKSSCIE;Blacks distribution +!TP_LOCALLAB_SIGCIE;Sigmoid +!TP_LOCALLAB_SIGFRA;Sigmoid Q +!TP_LOCALLAB_SIGGAMJCIE;Gamma !TP_LOCALLAB_SIGJZFRA;Sigmoid Jz !TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOID16_TOOLTIP;Allows you to simulate a tone mapping appearance using both 'Ciecam' and 'Sigmoid Q'. Sigmoid Q has three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc) Adaptability weights the action of the sigmoid by action on the internal exponential function. !TP_LOCALLAB_SIGMOIDBL;Blend !TP_LOCALLAB_SIGMOIDLAMBDA;Contrast -!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDLOGAUTO;Auto threshold +!TP_LOCALLAB_SIGMOIDLOGEV_TOOLTIP;If the combo box selection 'Black Ev and White Ev' is 'Sigmoid and Log encoding' instead of 'Sigmoid only', the two algorithms 'Log encoding' and 'Sigmoid' are used together. +!TP_LOCALLAB_SIGMOIDNORMCIE;Normalize Luminance +!TP_LOCALLAB_SIGMOIDNORMCIEBLEND_TOOLTIP;Blend acts on the final aspect of the image, contrast and luminance. Ratio between original and output image. +!TP_LOCALLAB_SIGMOIDNORMCIE_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image take into account those of the original.\nAll the adjustments acting on J or Q are taken into account, including those which are not relative to Sigmoid Q. +!TP_LOCALLAB_SIGMOIDQJ;Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDQJCOMPRCIE_TOOLTIP;When the combo box selection 'Uses Black Ev and White Ev' is 'Sigmoid and Log encoding Q' or 'Log encoding instead of Sigmoid' checked. This algorithm compress the data above the threshold slider value. The last value stands for brightness (Q) and should be close as possible to the value 'Compression threshold' (calculate when 'Auto threshold" checked, often > 1). +!TP_LOCALLAB_SIGMOIDSENSI;Adaptability !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_SIGMOIDWHITESCIE_TOOLTIP;Allows you, in Automatic when the dynamic range of the image is high, to change the distribution of lights in whites and deep blacks.\nCan be used with Log encoding or Sigmoid with Black Ev and White Ev enabled.\n\nThe algorithm does not change the basic data, but acts on the components necessary to calculate the Dynamic range, Black Ev, White Ev and the Gray point. +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a tone mapping appearance using both the 'Jz' and 'Sigmoid' function. Three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SIGSLOPJCIE;Slope +!TP_LOCALLAB_SIGTRCCIE;Source Data Adjustments +!TP_LOCALLAB_SIGWHITESCIE;Whites distribution !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_SLOPESMOOTH;Gray balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHB;Blue balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHG;Green balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHR;Red balance (Slope) !TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SMOOTHCIE;Highlight Attenuation +!TP_LOCALLAB_SMOOTHCIE_LUM;Luminosity mode +!TP_LOCALLAB_SMOOTHCIE_SCA;Scale Yb Scene +!TP_LOCALLAB_SMOOTHCIE_TOOLTIP;Completes the processing carried out by gamma, slope and midtones by causing a slight lowering of lights. Please note this does not replace Highlight reconstruction.\n\nGamma based and Slope based (Standard and Advanced) allow you to simulate a tone mapping using:\na) Scene conditions: Black-Ev, White-Ev, Mean luminance (Yb%)\nb) Viewing conditions: Mean luminance (Yb%).\n\nScale Yb Scene is function of White-Ev. +!TP_LOCALLAB_SMOOTHCIE_YB;Scale Yb Viewing !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. @@ -3606,13 +3771,14 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_STRENGTHCIELOG;Strength !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_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. @@ -3644,11 +3810,12 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_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_TRCFRAME;Tone Response Curve & Midtones !TP_LOCALLAB_USEMASK;Laplacian !TP_LOCALLAB_VART;Variance (contrast) !TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool @@ -4189,7 +4356,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_WAVELET_WAVOFFSET;Offset !TP_WBALANCE_AUTOITCGREEN;Temperature correlation !TP_WBALANCE_AUTOOLD;RGB grey -!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement +!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement !TP_WBALANCE_ITCWALG_TOOLTIP;Allows you to switch to the other Alternative temperature (Alt_temp), when possible.\nInactive in the "single choice" case. !TP_WBALANCE_ITCWBDELTA_TOOLTIP;Fixed for each "green" iteration tried, the temperature difference to be taken into account. !TP_WBALANCE_ITCWBFGREEN_TOOLTIP;Find the best compromise between Student and green. @@ -4232,7 +4399,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_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).\nIn the rare case of a color drift with "Observer 2°" (probably due to the conversion matrix) "Observer 10°" must be selected. !TP_WBALANCE_PATCHLABEL;Read colors:%1 Patch: Chroma:%2 Size=%3 !TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colors (max=237).\nDisplay calculated Patch Chroma.\nAWB temperature bias, lets try to reduce this value, a minimum may seem to optimize the algorithm.\n\nPatch size matching chroma optimization. !TP_WBALANCE_PATCHLEVELLABEL;Patch: ΔE=%1 - datas x 9 Min:%2 Max=%3 diff --git a/rtdata/languages/Slovenian b/rtdata/languages/Slovenian index 84ea9e72e..2ad1ed7d6 100644 --- a/rtdata/languages/Slovenian +++ b/rtdata/languages/Slovenian @@ -75,8 +75,6 @@ EXIFPANEL_RESET;Ponastavi EXIFPANEL_RESETALL;Ponastavi vse EXIFPANEL_RESETALLHINT;Ponastavi vse značke na njihove izvirne vrednosti. EXIFPANEL_RESETHINT;Ponastavi izbrane značke na njihove izvirne vrednosti. -EXIFPANEL_SHOWALL;Prikaži vse -EXIFPANEL_SUBDIRECTORY;Podmapa EXPORT_BYPASS;Koraki obdelave za obvoz EXPORT_BYPASS_ALL;Izberi / Odizberi vse EXPORT_BYPASS_DEFRINGE;Izpusti odstranjevanje napak robov @@ -1025,7 +1023,6 @@ PREFERENCES_APPEARANCE_COLORPICKERFONT;Pisava izbire barv PREFERENCES_APPEARANCE_CROPMASKCOLOR;Barve maske obrezovanja PREFERENCES_APPEARANCE_MAINFONT;Glavna pisava PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Glavna barva navigacije -PREFERENCES_APPEARANCE_PSEUDOHIDPI;Psevdo način HiDPI PREFERENCES_APPEARANCE_THEME;Tema PREFERENCES_APPLNEXTSTARTUP;potreben ponovni zagon PREFERENCES_AUTOMONPROFILE;Uporabi profil glavnega monitorja iz operacijskega sistema @@ -1221,6 +1218,7 @@ PROGRESSBAR_LINEDENOISE;Filter linijskega šuma... PROGRESSBAR_LOADING;Nalagam sliko... PROGRESSBAR_LOADINGTHUMBS;Nalagam predogledne sličice... PROGRESSBAR_LOADJPEG;Nalagam datoteko JPEG... +PROGRESSBAR_LOADJXL;Nalagam datoteko JXL... PROGRESSBAR_LOADPNG;Nalagam datoteko PNG... PROGRESSBAR_LOADTIFF;Nalagam datoteko TIFF... PROGRESSBAR_NOIMAGES;Ne najdem nobene slike @@ -1705,8 +1703,6 @@ TP_ICM_WORKING_TRC_SLOPE;Strmina TP_ICM_WORKING_TRC_TOOLTIP;Samo za vgrajene profile. TP_IMPULSEDENOISE_LABEL;Impulzno zmanjšanje šuma TP_IMPULSEDENOISE_THRESH;Prag -TP_LABCURVE_AVOIDCOLORSHIFT;Izogibaj se barvnega pomika -TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Prilagodi barve barvnemu prostoru delovnega barvnega prostora in uporabi Munsellov popravek. TP_LABCURVE_BRIGHTNESS;Svetlost TP_LABCURVE_CHROMATICITY;Kromatičnost TP_LABCURVE_CHROMA_TOOLTIP;Za uporabo črno-belega toniranja nastavi kromatičnost na -100. @@ -2281,6 +2277,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !EXIFPANEL_VALUE_NOT_SHOWN;Not shown !FILEBROWSER_POPUPINSPECT;Inspect !FILEBROWSER_POPUPSORTBY;Sort Files +!FILEBROWSER_SHOWRECURSIVE;Show images in sub-folders recursively. !FILECHOOSER_FILTER_EXECUTABLE;Executable files !GENERAL_DELETE_ALL;Delete all !GENERAL_EDIT;Edit @@ -2330,7 +2327,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !HISTORY_MSG_512;Local - SD - ΔE decay !HISTORY_MSG_513;Local - Spot - Excluding - Scope !HISTORY_MSG_514;Local - Spot structure -!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_515;Selective Editing !HISTORY_MSG_516;Local - Color and light !HISTORY_MSG_517;Local - Enable super !HISTORY_MSG_518;Local - Lightness @@ -2640,7 +2637,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !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 - TG - Feather gradient +!HISTORY_MSG_833;Local - Mask 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 @@ -2883,7 +2880,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !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_1082;Local - CIECAM Auto threshold !HISTORY_MSG_1083;Local - CIECAM Hue !HISTORY_MSG_1084;Local - Uses Black Ev - White Ev !HISTORY_MSG_1085;Local - Jz lightness @@ -2975,18 +2972,90 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !HISTORY_MSG_ICM_AINTENT;Abstract profile intent !HISTORY_MSG_ICM_BLUX;Primaries Blue X !HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_CAT;Matrix adaptation !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_MIDTCIE;Midtones !HISTORY_MSG_ICM_PRESER;Preserve neutral !HISTORY_MSG_ICM_REDX;Primaries Red X !HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_REFI;Refinement Colors +!HISTORY_MSG_ICM_SHIFTX;Refinement Colors - Shift x +!HISTORY_MSG_ICM_SHIFTY;Refinement Colors - Shift y +!HISTORY_MSG_ICM_SMOOTHCIE;Smooth highlights +!HISTORY_MSG_ICM_TRCEXP;Abstract Profile !HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method !HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method !HISTORY_MSG_ILLUM;CAL - SC - Illuminant !HISTORY_MSG_LOCALLAB_TE_PIVOT;Local - Equalizer pivot +!HISTORY_MSG_LOCAL_CIEMASK_BLURCONT;Local - CIECAM Mask blur contrast +!HISTORY_MSG_LOCAL_CIEMASK_BLURFFT;Local - CIECAM Mask blur FFTW +!HISTORY_MSG_LOCAL_CIEMASK_BLURRAD;Local - CIECAM Mask blur radius +!HISTORY_MSG_LOCAL_CIEMASK_CHH;Local - CIECAM Mask curve h(h) +!HISTORY_MSG_LOCAL_CIEMASK_HIGH;Local - CIECAM Mask highlights +!HISTORY_MSG_LOCAL_CIEMASK_SHAD;Local - CIECAM Mask shadows +!HISTORY_MSG_LOCAL_CIEMASK_STRU;Local - CIECAM Mask structure +!HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;Local - CIECAM Mask structure as tool +!HISTORY_MSG_LOCAL_CIEMASK_WLC;Local - CIECAM Mask wavelet L(L) +!HISTORY_MSG_LOCAL_CIEMASK_WLEV;Local - CIECAM Mask wavelet levels +!HISTORY_MSG_LOCAL_CIE_ANGGRAD;Local - CIECAM Gradient angle +!HISTORY_MSG_LOCAL_CIE_BLACKS;Local - CIECAM Blacks distribution +!HISTORY_MSG_LOCAL_CIE_BLUXL;Local - CIECAM Blue X +!HISTORY_MSG_LOCAL_CIE_BLUYL;Local - CIECAM Blue Y +!HISTORY_MSG_LOCAL_CIE_BRICOMP;Local - CIECAM Brightness compression +!HISTORY_MSG_LOCAL_CIE_BRICOMPTH;Local - CIECAM Brightness compression threshold +!HISTORY_MSG_LOCAL_CIE_BWCIE;Local - CIECAM Black and white +!HISTORY_MSG_LOCAL_CIE_CAT;Local - Matrix adaptation +!HISTORY_MSG_LOCAL_CIE_DETAILJZ;Local - JzCzHz Local contrast +!HISTORY_MSG_LOCAL_CIE_ENAMASKALL;Local - CIECAM All mask tools +!HISTORY_MSG_LOCAL_CIE_EXPPRECAM;Local - CIECAM Pre-Cam +!HISTORY_MSG_LOCAL_CIE_GAM;Local - CIECAM Gamma +!HISTORY_MSG_LOCAL_CIE_GAMUTCIE;Local - CIECAM Gamut +!HISTORY_MSG_LOCAL_CIE_GREXL;Local - CIECAM Green X +!HISTORY_MSG_LOCAL_CIE_GREYL;Local - CIECAM Green Y +!HISTORY_MSG_LOCAL_CIE_ILL;Local - CIECAM TRC Illuminant +!HISTORY_MSG_LOCAL_CIE_LOGCIEQ;Local - CIECAM Log encoding Q +!HISTORY_MSG_LOCAL_CIE_MIDT;Local - CIECAM Mid Tones +!HISTORY_MSG_LOCAL_CIE_NORM;Local - CIECAM Normalize L +!HISTORY_MSG_LOCAL_CIE_PRIM;Local - CIECAM TRC primaries +!HISTORY_MSG_LOCAL_CIE_REDXL;Local - CIECAM Red X +!HISTORY_MSG_LOCAL_CIE_REDYL;Local - CIECAM Red Y +!HISTORY_MSG_LOCAL_CIE_REFI;Local - CIECAM Refinement colors +!HISTORY_MSG_LOCAL_CIE_SATCIE;Local - CIECAM Saturation control +!HISTORY_MSG_LOCAL_CIE_SHIFTXL;Local - CIECAM Shift x +!HISTORY_MSG_LOCAL_CIE_SHIFTYL;Local - CIECAM Shift y +!HISTORY_MSG_LOCAL_CIE_SIG;Local - Sigmoid +!HISTORY_MSG_LOCAL_CIE_SIGADAP;Local - CIECAM Sigmoid adaptability +!HISTORY_MSG_LOCAL_CIE_SIGMET;Local - CIECAM Sigmoid method +!HISTORY_MSG_LOCAL_CIE_SLOP;Local - CIECAM Slope +!HISTORY_MSG_LOCAL_CIE_SLOPESMO;Local - CIECAM Gray balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOB;Local - CIECAM Blue balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOG;Local - CIECAM Green balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOR;Local - CIECAM Red balance +!HISTORY_MSG_LOCAL_CIE_SMOOTH;Local - CIECAM Scale Yb scene +!HISTORY_MSG_LOCAL_CIE_SMOOTHMET;Local - CIECAM Smooth lights method +!HISTORY_MSG_LOCAL_CIE_SMOOTHYB;Local - CIECAM Scale Yb viewing +!HISTORY_MSG_LOCAL_CIE_SMOOTH_LUM;Local - CIECAM Levels - Luminosity mode +!HISTORY_MSG_LOCAL_CIE_STRGRAD;Local - CIECAM Gradient strength L +!HISTORY_MSG_LOCAL_CIE_STRLOG;Local - CIECAM Log encoding strength +!HISTORY_MSG_LOCAL_CIE_TRC;Local - CIECAM TRC +!HISTORY_MSG_LOCAL_CIE_WHITES;Local - CIECAM Whites distribution +!HISTORY_MSG_LOCAL_DEHAZE_BLACK;Local - Dehaze Black +!HISTORY_MSG_LOCAL_FEATHERCIE;Local - CIECAM Gradient feather +!HISTORY_MSG_LOCAL_FEATHERCOL;Local - Color Gradient feather +!HISTORY_MSG_LOCAL_FEATHEREXE;Local - Exp Gradient feather +!HISTORY_MSG_LOCAL_FEATHERLOG;Local - Log Gradient feather +!HISTORY_MSG_LOCAL_FEATHERMAS;Local - Mask Common gradient feather +!HISTORY_MSG_LOCAL_FEATHERSH;Local - SH Gradient feather +!HISTORY_MSG_LOCAL_FEATHERVIB;Local - Vib Gradient feather +!HISTORY_MSG_LOCAL_FEATHERWAV;Local - Wav Gradient feather !HISTORY_MSG_LOCAL_GAMUTMUNSEL;Local - SC - Avoid Color Shift +!HISTORY_MSG_LOCAL_LOG_BLACKS;Local - Log Blacks distribution +!HISTORY_MSG_LOCAL_LOG_COMPR;Local - Log Compress brightness +!HISTORY_MSG_LOCAL_LOG_SAT;Local - Log Saturation control +!HISTORY_MSG_LOCAL_LOG_WHITES;Local - Log Whites distribution !HISTORY_MSG_LOCAL_TMO_SATUR;Local Exp Fattal Saturation !HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations !HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera @@ -3075,18 +3144,21 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !ICCPROFCREATOR_ILL_63;D63 : DCI-P3 Theater !ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 !INSPECTOR_WINDOW_TITLE;Inspector -!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB;Selective Editing !MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o !PARTIALPASTE_FLATFIELDFROMMETADATA;Flat-field from Metadata -!PARTIALPASTE_LOCALLAB;Local Adjustments -!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings +!PARTIALPASTE_LOCALLAB;Selective Editing +!PARTIALPASTE_LOCALLABGROUP;Selective Editing Settings !PARTIALPASTE_PREPROCWB;Preprocess White Balance !PARTIALPASTE_SPOT;Spot removal !PARTIALPASTE_TONE_EQUALIZER;Tone equalizer +!PREFERENCES_BROWSERECURSIVEDEPTH;Browse sub-folders depth +!PREFERENCES_BROWSERECURSIVEFOLLOWLINKS;Follow symbolic links when browsing sub-folders +!PREFERENCES_BROWSERECURSIVEMAXDIRS;Maximum sub-folders !PREFERENCES_CAMERAPROFILESDIR;Camera profiles directory !PREFERENCES_CIE;Ciecam !PREFERENCES_CIEARTIF;Avoid artifacts -!PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments +!PREFERENCES_COMPLEXITYLOC;Default complexity for Selective Editing !PREFERENCES_COMPLEXITY_EXP;Advanced !PREFERENCES_COMPLEXITY_NORM;Standard !PREFERENCES_COMPLEXITY_SIMP;Basic @@ -3106,13 +3178,18 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !PREFERENCES_LENSFUNDBDIR_TOOLTIP;Directory containing the Lensfun database. Leave empty to use the default directories. !PREFERENCES_LENSPROFILESDIR;Lens profiles directory !PREFERENCES_LENSPROFILESDIR_TOOLTIP;Directory containing Adobe Lens Correction Profiles (LCPs) +!PREFERENCES_MAX_ZOOM_TITLE;Maximum zoom !PREFERENCES_METADATA;Metadata !PREFERENCES_METADATA_SYNC;Metadata synchronization with XMP sidecars !PREFERENCES_METADATA_SYNC_NONE;Off !PREFERENCES_METADATA_SYNC_READ;Read only !PREFERENCES_METADATA_SYNC_READWRITE;Bidirectional -!PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips +!PREFERENCES_RAW_DECODER;Raw Decoder +!PREFERENCES_RAW_DECODER_ENABLE_LIBRAW;Use LibRaw +!PREFERENCES_SHOWTOOLTIP;Show Selective Editing advice tooltips +!PREFERENCES_SPOTLOC;Define Spot method for Selective Editing !PREFERENCES_TAB_FAVORITES;Favorites +!PREFERENCES_THUMBNAIL_RANK_COLOR_MODE;Load/Save thumbnail rank and color from/to XMP sidecars !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. @@ -3135,6 +3212,27 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !PREFERENCES_XMP_SIDECAR_MODE_EXT;darktable-like (FILENAME.ext.xmp for FILENAME.ext) !PREFERENCES_XMP_SIDECAR_MODE_STD;Standard (FILENAME.xmp for FILENAME.ext) !PREFERENCES_ZOOMONSCROLL;Zoom images by scrolling +!QUEUE_DESTPREVIEW_TITLE;Select a thumbnail to preview its destination path here +!QUEUE_DESTPREVIEW_TOOLTIP;Destination path for the first selected image appears here +!QUEUE_LOCATION_TEMPLATE_HELP_BUTTON_TOOLTIP;Show or hide a help panel with instructions for creating location templates +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_BODY;If you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p-3/converted/%P-4/%f +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_TITLE;Common examples +!QUEUE_LOCATION_TEMPLATE_HELP_INTRO;The output template field allows you to to dynamically customize the destination folder and filename. When you include certain specifiers, which begin with %, they are replaced by the program when each file is being saved.\n\nThe sections below describe each type of specifier. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_1;Using this pathname as an example: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_2;The meanings of the formatting strings are: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_LINUX;/home/tom/photos/2010-10-31/photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_WINDOWS;D:\tom\photos\2010-10-31\photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO;The %dN, %d-N, %pN, %p-N, %PN and %P-N (N = 1..9) specifiers will be replaced by elements of the image file's directory path.\nThe format specifiers operate as follows:\n %dN = Nth directory from the end of the path\n %d-N = Nth directory from the start of the path\n %pN = all directories up to the Nth from the end of the path\n %p-N = the first N directories in the path\n %PN = the last N directories in the path\n %P-N = all directories from the Nth to the end of the path\n %f = base filename (no extension) +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO_WINDOWS;For Windows paths, %d-1 is the drive letter and colon, and %d-2 is the base directory on that drive. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_TITLE;Directories and partial paths +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_BODY;%r will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used. +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_TITLE;Rank +!QUEUE_LOCATION_TEMPLATE_HELP_RESULT_MISMATCH;ERROR: 2nd result is different: +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_BODY;%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'. +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_TITLE;Position/sequence in queue +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_BODY;Three different date/time values may be used in templates:\n %tE"%Y-%m-%d" = when export started\n %tF"%Y-%m-%d" = when file was last saved\n %tP"%Y-%m-%d" = when photo was taken\nThe quoted string defines the format of the resulting date and/or time. The format string %tF"%Y-%m-%d" is just one example. The string can use all conversion specifiers defined for the g_date_time_format function (see https://docs.gtk.org/glib/method.DateTime.format.html).\n\nExample format strings: +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_TITLE;Date and time +!QUEUE_LOCATION_TEMPLATE_HELP_TITLE;Creating an output template !SAVEDLG_BIGTIFF;BigTIFF (no metadata support) !SORT_ASCENDING;Ascending !SORT_BY_DATE;By Date @@ -3143,12 +3241,16 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !SORT_BY_NAME;By Name !SORT_BY_RANK;By Rank !SORT_DESCENDING;Descending +!TC_LOCALLAB_PRIM_SHIFTX;Shift x +!TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP;In combination with "Refine colors", allows you to:\n 1) for low values, adjust the image purity.\n 2) for higher values, carry out moderate color toning.\nBe careful not to go outside the CIE xy diagram. +!TC_LOCALLAB_PRIM_SHIFTY;Shift y !TC_PRIM_BLUX;Bx !TC_PRIM_BLUY;By !TC_PRIM_GREX;Gx !TC_PRIM_GREY;Gy !TC_PRIM_REDX;Rx !TC_PRIM_REDY;Ry +!TC_PRIM_REFI;Refine colors (white-point) !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 @@ -3203,6 +3305,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !TP_HLREC_COLOROPP;Inpaint Opposed !TP_HLREC_HLBLUR;Blur !TP_HLREC_HLTH;Gain threshold +!TP_ICM_BW;Black and White !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)'. @@ -3215,8 +3318,15 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !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_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 three main uses - channel mixer, restore image color (saturation), 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_CAT;Matrix adaptation +!TP_ICM_WORKING_CAT_BRAD;Bradford +!TP_ICM_WORKING_CAT_CAT02;Cat02 +!TP_ICM_WORKING_CAT_CAT16;Cat16 +!TP_ICM_WORKING_CAT_TOOLTIP;Performs the chromatic adaptation of the XYZ conversion matrix. Default: Bradford +!TP_ICM_WORKING_CAT_VK;Von Kries +!TP_ICM_WORKING_CAT_XYZ;XYZ scale !TP_ICM_WORKING_CIEDIAG;CIE xy diagram !TP_ICM_WORKING_ILLU;Illuminant !TP_ICM_WORKING_ILLU_1500;Tungsten 1500K @@ -3228,11 +3338,13 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !TP_ICM_WORKING_ILLU_D65;D65 !TP_ICM_WORKING_ILLU_D80;D80 !TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_E;E !TP_ICM_WORKING_ILLU_NONE;Default !TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_NON;None !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_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination primaries' combo box, 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 @@ -3241,11 +3353,14 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !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_FREE;Custom LA (sliders) !TP_ICM_WORKING_PRIM_JDCMAX;JDC Max +!TP_ICM_WORKING_PRIM_JDCMAXSTDA;JDC Max stdA !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_TOOLTIP;Performs a gamut control. Destination primaries (Advanced) allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified.\nWhen 'Custom LA (sliders)' is selected, you can modify the values of the 3 primaries (Red, Green, and Blue) for x and y. !TP_ICM_WORKING_PRIM_WID;WideGamut !TP_ICM_WORKING_TRC_18;Prophoto g=1.8 !TP_ICM_WORKING_TRC_22;Adobe g=2.2 @@ -3254,6 +3369,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !TP_ICM_WORKING_TRC_SRGB;sRGB g=2.4 s=12.92 !TP_LENSGEOM_LIN;Linear !TP_LENSGEOM_LOG;Logarithmic +!TP_LENSPROFILE_CORRECTION_METADATA;From file metadata !TP_LOCALLAB_ACTIV;Luminance only !TP_LOCALLAB_ACTIVSPOT;Enable Spot !TP_LOCALLAB_ADJ;Equalizer Color @@ -3261,9 +3377,9 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !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_AUTOGRAYCIE;Automatic !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_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab). Default: Munsell only.\n\nMunsell only: 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. The result is not the same as Lab. !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 @@ -3306,9 +3422,12 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !TP_LOCALLAB_BUTTON_DUPL;Duplicate !TP_LOCALLAB_BUTTON_REN;Rename !TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWEVNONE;None +!TP_LOCALLAB_BWEVSIG;Activated +!TP_LOCALLAB_BWEVSIGLOG;Sigmoid & Log-Encoding !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_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16 (experimental). 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, for example, to match CAM16 processing with the maximum monitor brightness of 400cd/m2. !TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments !TP_LOCALLAB_CAMMODE;CAM model !TP_LOCALLAB_CAMMODE_CAM16;CAM 16 @@ -3348,6 +3467,12 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !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_SMOOTHFRAME;Highlight Attenuation & Levels +!TP_LOCALLAB_CIE_SMOOTH_EV;Ev based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA;Slope based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF;Gamma based +!TP_LOCALLAB_CIE_SMOOTH_LEVELS;Levels +!TP_LOCALLAB_CIE_SMOOTH_NONE;None !TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) !TP_LOCALLAB_CIRCRADIUS;Spot size !TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the 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. @@ -3363,8 +3488,9 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !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_COLORDEPREV_TOOLTIP;Preview ΔE button in Settings will only work if you have activated 'Sharpening', 'Soft Light and Original Retinex', 'Blur/Grain and Denoise', 'Dehaze and Retinex', or 'Contrast by Detail Levels' in the 'Add tool to current spot' menu.\nFor others tools, the Preview ΔE button is in the tool, which allows previewing ΔE with several tools enabled. Prefer using Mask and modifications. !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_COLORFRAME;Dominant color !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 @@ -3372,7 +3498,10 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !TP_LOCALLAB_COL_NAME;Name !TP_LOCALLAB_COL_VIS;Status !TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPRCIE;Brightness compression +!TP_LOCALLAB_COMPRCIETH;Compression threshold !TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_COMPRLOG_TOOLTIP;This algorithm compress the data before log conversion, above the threshold slider value. To use in conjunction with Whites distribution. !TP_LOCALLAB_CONTCOL;Contrast threshold !TP_LOCALLAB_CONTFRA;Contrast by level !TP_LOCALLAB_CONTRAST;Contrast @@ -3387,7 +3516,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !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 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 spot. -!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combo box 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. @@ -3396,13 +3525,14 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !TP_LOCALLAB_DARKRETI;Darkness !TP_LOCALLAB_DEHAFRA;Dehaze !TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZE_BLACK;Black !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_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. @@ -3422,6 +3552,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !TP_LOCALLAB_DETAILFRA;Edge detection - DCT !TP_LOCALLAB_DETAILSH;Details !TP_LOCALLAB_DETAILTHR;Lum/chrom detail threshold +!TP_LOCALLAB_DISAB_CIECAM;Disable Ciecam or Weak Jz surround !TP_LOCALLAB_DIVGR;Gamma !TP_LOCALLAB_DUPLSPOTNAME;Copy !TP_LOCALLAB_EDGFRA;Edge sharpness @@ -3430,6 +3561,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping !TP_LOCALLAB_ENABLE_MASK;Enable mask !TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENABLE_MASKALL;Enable all mask tools !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 @@ -3445,9 +3577,10 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !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_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all selective editing data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\nUse 'Scope' (Excluding) to set the exclusion intensity.\n\n'Full image' allows you to use the selective editing tools on the whole image.\nThe RT Spot delimiters are set beyond the image preview boundaries.\nThe 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.\nNote: 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.\n\n'Global' allows you to use the selective editing tools on the whole image, without using Delta E or transitions. !TP_LOCALLAB_EXECLU;Excluding spot !TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXMAIN;Global !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 @@ -3456,11 +3589,11 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !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_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Selective Editing 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 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_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. @@ -3482,7 +3615,8 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !TP_LOCALLAB_FATSAT;Saturation control !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_FEATVALUE;Feather gradient +!TP_LOCALLAB_FEATVALUE_MASK;Feather gradient (Grad. Filters Mask) !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 @@ -3578,7 +3712,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !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_LABEL;Selective Editing !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 @@ -3623,8 +3757,10 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !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_LOGCIE;Log encoding +!TP_LOCALLAB_LOGCIEQ;Log Encoding Q (with Ciecam) +!TP_LOCALLAB_LOGCIEQ_TOOLTIP;Activating the checkbox allows you to switch between log encoding based on the 3 RGB channels, and log encoding based solely on Ciecam’s brightness (Q) channel.\nUsing the Q channel instead of the RGB channels helps avoid undesirable edge effects such as hue and saturation shifts.\nHowever, the settings are more difficult to optimise because Q is unbounded and Ciecam alters the data to take into account the surround conditions, simultaneous contrast, etc.\nYou may have to adjust the following:\n Scene conditions: Mean luminance (Yb), Whites & Blacks distribution, Black Ev, White Ev.\n Source Data Adjustments : Brightness compression, Strength.\n\nNote: when using Log Encoding (Q), be careful not to activate the Disable Ciecam option in the Scene Conditions, Surround menu. +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you to use Black Ev, White Ev, White and Black distribution, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using 'Log encoding' with Brightness compression. !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) @@ -3632,7 +3768,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !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_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 @@ -3645,6 +3781,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !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_LOGPFRA2;Log Encoding settings !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. @@ -3714,7 +3851,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !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_MASKUNUSABLE;Mask disabled (Enable in 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 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 @@ -3750,6 +3887,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !TP_LOCALLAB_MERTWE;Exclusion !TP_LOCALLAB_MERTWO;Subtract !TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MIDTCIE;Midtones !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 @@ -3797,10 +3935,15 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !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_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_PRECAMGAMUT_TOOLTIP;If checked, ensures a gamut control just after primary conversion to XYZ. +!TP_LOCALLAB_PRECAMREFIMAIN_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. In combination with "Shift x" and "Shift y", allows you to carry out moderate color toning. +!TP_LOCALLAB_PRECAMREFI_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. +!TP_LOCALLAB_PRECAM_TOOLTIP;'Source Data Adjustments' modifies the Dynamic Range using Log encoding, the tones of the image and primaries (simplified Abstract Profile), and midtones, just before the Ciecam process. These values are adjustable:\nGamma: Acts mainly on light tones\nSlope: Acts mainly on dark tones. You 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.\nDestination primaries: Allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified. You can also finely adapt the primaries and the illuminant (white-point). Moving a primary away from the white point reduces saturation and vice versa. Pay attention to the gamut. !TP_LOCALLAB_PREVHIDE;Hide additional settings !TP_LOCALLAB_PREVIEW;Preview ΔE !TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PRIMILLFRAME;Primaries & Illuminant !TP_LOCALLAB_PROXI;ΔE decay !TP_LOCALLAB_QUAAGRES;Aggressive !TP_LOCALLAB_QUACONSER;Conservative @@ -3845,10 +3988,11 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !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_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_SATCIE;Saturation control !TP_LOCALLAB_SATUR;Saturation !TP_LOCALLAB_SATURV;Saturation (s) !TP_LOCALLAB_SCALEGR;Scale @@ -3869,7 +4013,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !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_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;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. @@ -3915,17 +4059,41 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !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_SIGBLACKSSCIE;Blacks distribution +!TP_LOCALLAB_SIGCIE;Sigmoid +!TP_LOCALLAB_SIGFRA;Sigmoid Q +!TP_LOCALLAB_SIGGAMJCIE;Gamma !TP_LOCALLAB_SIGJZFRA;Sigmoid Jz !TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOID16_TOOLTIP;Allows you to simulate a tone mapping appearance using both 'Ciecam' and 'Sigmoid Q'. Sigmoid Q has three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc) Adaptability weights the action of the sigmoid by action on the internal exponential function. !TP_LOCALLAB_SIGMOIDBL;Blend !TP_LOCALLAB_SIGMOIDLAMBDA;Contrast -!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDLOGAUTO;Auto threshold +!TP_LOCALLAB_SIGMOIDLOGEV_TOOLTIP;If the combo box selection 'Black Ev and White Ev' is 'Sigmoid and Log encoding' instead of 'Sigmoid only', the two algorithms 'Log encoding' and 'Sigmoid' are used together. +!TP_LOCALLAB_SIGMOIDNORMCIE;Normalize Luminance +!TP_LOCALLAB_SIGMOIDNORMCIEBLEND_TOOLTIP;Blend acts on the final aspect of the image, contrast and luminance. Ratio between original and output image. +!TP_LOCALLAB_SIGMOIDNORMCIE_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image take into account those of the original.\nAll the adjustments acting on J or Q are taken into account, including those which are not relative to Sigmoid Q. +!TP_LOCALLAB_SIGMOIDQJ;Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDQJCOMPRCIE_TOOLTIP;When the combo box selection 'Uses Black Ev and White Ev' is 'Sigmoid and Log encoding Q' or 'Log encoding instead of Sigmoid' checked. This algorithm compress the data above the threshold slider value. The last value stands for brightness (Q) and should be close as possible to the value 'Compression threshold' (calculate when 'Auto threshold" checked, often > 1). +!TP_LOCALLAB_SIGMOIDSENSI;Adaptability !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_SIGMOIDWHITESCIE_TOOLTIP;Allows you, in Automatic when the dynamic range of the image is high, to change the distribution of lights in whites and deep blacks.\nCan be used with Log encoding or Sigmoid with Black Ev and White Ev enabled.\n\nThe algorithm does not change the basic data, but acts on the components necessary to calculate the Dynamic range, Black Ev, White Ev and the Gray point. +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a tone mapping appearance using both the 'Jz' and 'Sigmoid' function. Three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SIGSLOPJCIE;Slope +!TP_LOCALLAB_SIGTRCCIE;Source Data Adjustments +!TP_LOCALLAB_SIGWHITESCIE;Whites distribution !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_SLOPESMOOTH;Gray balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHB;Blue balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHG;Green balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHR;Red balance (Slope) !TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SMOOTHCIE;Highlight Attenuation +!TP_LOCALLAB_SMOOTHCIE_LUM;Luminosity mode +!TP_LOCALLAB_SMOOTHCIE_SCA;Scale Yb Scene +!TP_LOCALLAB_SMOOTHCIE_TOOLTIP;Completes the processing carried out by gamma, slope and midtones by causing a slight lowering of lights. Please note this does not replace Highlight reconstruction.\n\nGamma based and Slope based (Standard and Advanced) allow you to simulate a tone mapping using:\na) Scene conditions: Black-Ev, White-Ev, Mean luminance (Yb%)\nb) Viewing conditions: Mean luminance (Yb%).\n\nScale Yb Scene is function of White-Ev. +!TP_LOCALLAB_SMOOTHCIE_YB;Scale Yb Viewing !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. @@ -3947,13 +4115,14 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !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_STRENGTHCIELOG;Strength !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_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. @@ -3985,11 +4154,12 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !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_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_TRCFRAME;Tone Response Curve & Midtones !TP_LOCALLAB_USEMASK;Laplacian !TP_LOCALLAB_VART;Variance (contrast) !TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool @@ -4190,7 +4360,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !TP_WAVELET_WAVOFFSET;Offset !TP_WBALANCE_AUTOITCGREEN;Temperature correlation !TP_WBALANCE_AUTOOLD;RGB grey -!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement +!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement !TP_WBALANCE_ITCWALG_TOOLTIP;Allows you to switch to the other Alternative temperature (Alt_temp), when possible.\nInactive in the "single choice" case. !TP_WBALANCE_ITCWBDELTA_TOOLTIP;Fixed for each "green" iteration tried, the temperature difference to be taken into account. !TP_WBALANCE_ITCWBFGREEN_TOOLTIP;Find the best compromise between Student and green. @@ -4233,7 +4403,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - !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_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).\nIn the rare case of a color drift with "Observer 2°" (probably due to the conversion matrix) "Observer 10°" must be selected. !TP_WBALANCE_PATCHLABEL;Read colors:%1 Patch: Chroma:%2 Size=%3 !TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colors (max=237).\nDisplay calculated Patch Chroma.\nAWB temperature bias, lets try to reduce this value, a minimum may seem to optimize the algorithm.\n\nPatch size matching chroma optimization. !TP_WBALANCE_PATCHLEVELLABEL;Patch: ΔE=%1 - datas x 9 Min:%2 Max=%3 diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index 0ff9f831f..baef111e5 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -58,7 +58,6 @@ EXIFPANEL_RESET;Återställ EXIFPANEL_RESETALL;Återställ alla EXIFPANEL_RESETALLHINT;Återställ alla etiketter till deras originalvärden EXIFPANEL_RESETHINT;Återställ de valda etiketterna till deras originalvärden -EXIFPANEL_SUBDIRECTORY;Underkatalog EXPORT_BYPASS_ALL;Markera/Avmarkera allt EXPORT_BYPASS_DEFRINGE;Förbigå överstrålning EXPORT_BYPASS_DIRPYRDENOISE;Förbigå brusreducering @@ -618,14 +617,12 @@ IPTCPANEL_RESET;Återställ IPTCPANEL_RESETHINT;Återställ till standardprofilen IPTCPANEL_SOURCE;Källa IPTCPANEL_TITLE;Titel -ISTORY_MSG_372;PRS USM - Radie MAIN_BUTTON_FULLSCREEN;Helskärm MAIN_BUTTON_NAVNEXT_TOOLTIP;Flytta till nästa bild relativt den bild som är öppen i redigeringsvyn\nKortkommando: Shift-F4\n\nFlytta till nästa bild relativt den valda miniatyrbilden i filvyn\nKortkommando: F4 MAIN_BUTTON_NAVPREV_TOOLTIP;Flytta till föregående bild relativt den bild som är öppen i redigeringsvyn\nKortkommando: Shift-F3\n\nFlytta till föregående bild relativt den valda miniatyrbilden i filvyn\nKortkommando: F3 MAIN_BUTTON_NAVSYNC_TOOLTIP;Synkronisera filvyn med redigeringsvyn för att uppdatera förhandsgranskningen av den nu öppna bilden, och för att nollställa filtren i filvyn.\nKortkommando: x\n\nSom ovan, men utan att nollställa filtren i filvyn\nKortkommando: y\n(Notera att förhandsgranskningen av den öppna bildens miniatyrbilder ej visas om den är filtrerad.). MAIN_BUTTON_PREFERENCES;Inställningar MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Lägg till nuvarande bild i behandlingskön.\nKortkommando: Ctrl+b -MAIN_BUTTON_SAVE;Spara MAIN_BUTTON_SAVE_TOOLTIP;Spara nuvarande bild.\nKortkommando: Ctrl+s MAIN_BUTTON_SENDTOEDITOR;Redigera bilden i ett externt program MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Redigera nuvarande bild i externt bildredigeringsprogram.\nKortkommando: Ctrl+e @@ -911,6 +908,7 @@ PROFILEPANEL_TOOLTIPSAVE;Spara nuvarande profil.\nCtrl-klicka för att v PROGRESSBAR_LOADING;Laddar bild... PROGRESSBAR_LOADINGTHUMBS;Laddar miniatyrbilder... PROGRESSBAR_LOADJPEG;Laddar JPEG-fil... +PROGRESSBAR_LOADJXL;Laddar JXL-fil... PROGRESSBAR_LOADPNG;Laddar PNG-fil... PROGRESSBAR_LOADTIFF;Laddar TIFF-fil... PROGRESSBAR_NOIMAGES;Inga bilder funna. @@ -1299,8 +1297,6 @@ TP_ICM_TONECURVE_TOOLTIP;Aktivera för att använda tonkurvor som kan finnas i D TP_ICM_WORKINGPROFILE;Färgrymd TP_IMPULSEDENOISE_LABEL;Brusreducering mha av stegsvar TP_IMPULSEDENOISE_THRESH;Tröskelvärde -TP_LABCURVE_AVOIDCOLORSHIFT;Undvik färgskift -TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Passa färger i färgrymden och applicera Munsell-korrigering TP_LABCURVE_BRIGHTNESS;Ljushet TP_LABCURVE_CHROMATICITY;Kroma TP_LABCURVE_CHROMA_TOOLTIP;För att åstadkomma en S/V-toning, sätt Kroma till -100 @@ -1754,6 +1750,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !FILEBROWSER_POPUPSORTBY;Sort Files !FILEBROWSER_RESETDEFAULTPROFILE;Reset to default !FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. +!FILEBROWSER_SHOWRECURSIVE;Show images in sub-folders recursively. !FILECHOOSER_FILTER_EXECUTABLE;Executable files !GENERAL_CURRENT;Current !GENERAL_DELETE_ALL;Delete all @@ -1874,7 +1871,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !HISTORY_MSG_512;Local - SD - ΔE decay !HISTORY_MSG_513;Local - Spot - Excluding - Scope !HISTORY_MSG_514;Local - Spot structure -!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_515;Selective Editing !HISTORY_MSG_516;Local - Color and light !HISTORY_MSG_517;Local - Enable super !HISTORY_MSG_518;Local - Lightness @@ -2184,7 +2181,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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 - TG - Feather gradient +!HISTORY_MSG_833;Local - Mask 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 @@ -2427,7 +2424,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_1082;Local - CIECAM Auto threshold !HISTORY_MSG_1083;Local - CIECAM Hue !HISTORY_MSG_1084;Local - Uses Black Ev - White Ev !HISTORY_MSG_1085;Local - Jz lightness @@ -2543,16 +2540,23 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !HISTORY_MSG_ICM_AINTENT;Abstract profile intent !HISTORY_MSG_ICM_BLUX;Primaries Blue X !HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_CAT;Matrix adaptation !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_MIDTCIE;Midtones !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_PRESER;Preserve neutral !HISTORY_MSG_ICM_REDX;Primaries Red X !HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_REFI;Refinement Colors +!HISTORY_MSG_ICM_SHIFTX;Refinement Colors - Shift x +!HISTORY_MSG_ICM_SHIFTY;Refinement Colors - Shift y +!HISTORY_MSG_ICM_SMOOTHCIE;Smooth highlights +!HISTORY_MSG_ICM_TRCEXP;Abstract Profile !HISTORY_MSG_ICM_WORKING_GAMMA;TRC - Gamma !HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method !HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method @@ -2565,7 +2569,72 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_LOCALLAB_TE_PIVOT;Local - Equalizer pivot +!HISTORY_MSG_LOCAL_CIEMASK_BLURCONT;Local - CIECAM Mask blur contrast +!HISTORY_MSG_LOCAL_CIEMASK_BLURFFT;Local - CIECAM Mask blur FFTW +!HISTORY_MSG_LOCAL_CIEMASK_BLURRAD;Local - CIECAM Mask blur radius +!HISTORY_MSG_LOCAL_CIEMASK_CHH;Local - CIECAM Mask curve h(h) +!HISTORY_MSG_LOCAL_CIEMASK_HIGH;Local - CIECAM Mask highlights +!HISTORY_MSG_LOCAL_CIEMASK_SHAD;Local - CIECAM Mask shadows +!HISTORY_MSG_LOCAL_CIEMASK_STRU;Local - CIECAM Mask structure +!HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;Local - CIECAM Mask structure as tool +!HISTORY_MSG_LOCAL_CIEMASK_WLC;Local - CIECAM Mask wavelet L(L) +!HISTORY_MSG_LOCAL_CIEMASK_WLEV;Local - CIECAM Mask wavelet levels +!HISTORY_MSG_LOCAL_CIE_ANGGRAD;Local - CIECAM Gradient angle +!HISTORY_MSG_LOCAL_CIE_BLACKS;Local - CIECAM Blacks distribution +!HISTORY_MSG_LOCAL_CIE_BLUXL;Local - CIECAM Blue X +!HISTORY_MSG_LOCAL_CIE_BLUYL;Local - CIECAM Blue Y +!HISTORY_MSG_LOCAL_CIE_BRICOMP;Local - CIECAM Brightness compression +!HISTORY_MSG_LOCAL_CIE_BRICOMPTH;Local - CIECAM Brightness compression threshold +!HISTORY_MSG_LOCAL_CIE_BWCIE;Local - CIECAM Black and white +!HISTORY_MSG_LOCAL_CIE_CAT;Local - Matrix adaptation +!HISTORY_MSG_LOCAL_CIE_DETAILJZ;Local - JzCzHz Local contrast +!HISTORY_MSG_LOCAL_CIE_ENAMASKALL;Local - CIECAM All mask tools +!HISTORY_MSG_LOCAL_CIE_EXPPRECAM;Local - CIECAM Pre-Cam +!HISTORY_MSG_LOCAL_CIE_GAM;Local - CIECAM Gamma +!HISTORY_MSG_LOCAL_CIE_GAMUTCIE;Local - CIECAM Gamut +!HISTORY_MSG_LOCAL_CIE_GREXL;Local - CIECAM Green X +!HISTORY_MSG_LOCAL_CIE_GREYL;Local - CIECAM Green Y +!HISTORY_MSG_LOCAL_CIE_ILL;Local - CIECAM TRC Illuminant +!HISTORY_MSG_LOCAL_CIE_LOGCIEQ;Local - CIECAM Log encoding Q +!HISTORY_MSG_LOCAL_CIE_MIDT;Local - CIECAM Mid Tones +!HISTORY_MSG_LOCAL_CIE_NORM;Local - CIECAM Normalize L +!HISTORY_MSG_LOCAL_CIE_PRIM;Local - CIECAM TRC primaries +!HISTORY_MSG_LOCAL_CIE_REDXL;Local - CIECAM Red X +!HISTORY_MSG_LOCAL_CIE_REDYL;Local - CIECAM Red Y +!HISTORY_MSG_LOCAL_CIE_REFI;Local - CIECAM Refinement colors +!HISTORY_MSG_LOCAL_CIE_SATCIE;Local - CIECAM Saturation control +!HISTORY_MSG_LOCAL_CIE_SHIFTXL;Local - CIECAM Shift x +!HISTORY_MSG_LOCAL_CIE_SHIFTYL;Local - CIECAM Shift y +!HISTORY_MSG_LOCAL_CIE_SIG;Local - Sigmoid +!HISTORY_MSG_LOCAL_CIE_SIGADAP;Local - CIECAM Sigmoid adaptability +!HISTORY_MSG_LOCAL_CIE_SIGMET;Local - CIECAM Sigmoid method +!HISTORY_MSG_LOCAL_CIE_SLOP;Local - CIECAM Slope +!HISTORY_MSG_LOCAL_CIE_SLOPESMO;Local - CIECAM Gray balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOB;Local - CIECAM Blue balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOG;Local - CIECAM Green balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOR;Local - CIECAM Red balance +!HISTORY_MSG_LOCAL_CIE_SMOOTH;Local - CIECAM Scale Yb scene +!HISTORY_MSG_LOCAL_CIE_SMOOTHMET;Local - CIECAM Smooth lights method +!HISTORY_MSG_LOCAL_CIE_SMOOTHYB;Local - CIECAM Scale Yb viewing +!HISTORY_MSG_LOCAL_CIE_SMOOTH_LUM;Local - CIECAM Levels - Luminosity mode +!HISTORY_MSG_LOCAL_CIE_STRGRAD;Local - CIECAM Gradient strength L +!HISTORY_MSG_LOCAL_CIE_STRLOG;Local - CIECAM Log encoding strength +!HISTORY_MSG_LOCAL_CIE_TRC;Local - CIECAM TRC +!HISTORY_MSG_LOCAL_CIE_WHITES;Local - CIECAM Whites distribution +!HISTORY_MSG_LOCAL_DEHAZE_BLACK;Local - Dehaze Black +!HISTORY_MSG_LOCAL_FEATHERCIE;Local - CIECAM Gradient feather +!HISTORY_MSG_LOCAL_FEATHERCOL;Local - Color Gradient feather +!HISTORY_MSG_LOCAL_FEATHEREXE;Local - Exp Gradient feather +!HISTORY_MSG_LOCAL_FEATHERLOG;Local - Log Gradient feather +!HISTORY_MSG_LOCAL_FEATHERMAS;Local - Mask Common gradient feather +!HISTORY_MSG_LOCAL_FEATHERSH;Local - SH Gradient feather +!HISTORY_MSG_LOCAL_FEATHERVIB;Local - Vib Gradient feather +!HISTORY_MSG_LOCAL_FEATHERWAV;Local - Wav Gradient feather !HISTORY_MSG_LOCAL_GAMUTMUNSEL;Local - SC - Avoid Color Shift +!HISTORY_MSG_LOCAL_LOG_BLACKS;Local - Log Blacks distribution +!HISTORY_MSG_LOCAL_LOG_COMPR;Local - Log Compress brightness +!HISTORY_MSG_LOCAL_LOG_SAT;Local - Log Saturation control +!HISTORY_MSG_LOCAL_LOG_WHITES;Local - Log Whites distribution !HISTORY_MSG_LOCAL_TMO_SATUR;Local Exp Fattal Saturation !HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold @@ -2749,10 +2818,10 @@ 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;Selective Editing !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%. +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%, or when capture sharpening is enabled. !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. @@ -2763,8 +2832,8 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control !PARTIALPASTE_FLATFIELDFROMMETADATA;Flat-field from Metadata !PARTIALPASTE_LOCALCONTRAST;Local contrast -!PARTIALPASTE_LOCALLAB;Local Adjustments -!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings +!PARTIALPASTE_LOCALLAB;Selective Editing +!PARTIALPASTE_LOCALLABGROUP;Selective Editing Settings !PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !PARTIALPASTE_PREPROCWB;Preprocess White Balance @@ -2781,9 +2850,11 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_BROWSERECURSIVEDEPTH;Browse sub-folders depth +!PREFERENCES_BROWSERECURSIVEFOLLOWLINKS;Follow symbolic links when browsing sub-folders +!PREFERENCES_BROWSERECURSIVEMAXDIRS;Maximum sub-folders !PREFERENCES_CACHECLEAR;Clear !PREFERENCES_CACHECLEAR_ALL;Clear all cached files: !PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: @@ -2799,7 +2870,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !PREFERENCES_CIE;Ciecam !PREFERENCES_CIEARTIF;Avoid artifacts !PREFERENCES_CMMBPC;Black point compensation -!PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments +!PREFERENCES_COMPLEXITYLOC;Default complexity for Selective Editing !PREFERENCES_COMPLEXITY_EXP;Advanced !PREFERENCES_COMPLEXITY_NORM;Standard !PREFERENCES_COMPLEXITY_SIMP;Basic @@ -2830,6 +2901,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !PREFERENCES_LENSFUNDBDIR_TOOLTIP;Directory containing the Lensfun database. Leave empty to use the default directories. !PREFERENCES_LENSPROFILESDIR;Lens profiles directory !PREFERENCES_LENSPROFILESDIR_TOOLTIP;Directory containing Adobe Lens Correction Profiles (LCPs) +!PREFERENCES_MAX_ZOOM_TITLE;Maximum zoom !PREFERENCES_METADATA;Metadata !PREFERENCES_METADATA_SYNC;Metadata synchronization with XMP sidecars !PREFERENCES_METADATA_SYNC_NONE;Off @@ -2848,9 +2920,12 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !PREFERENCES_PROFILESAVELOCATION;Processing profile saving location !PREFERENCES_PRTINTENT;Rendering intent !PREFERENCES_PRTPROFILE;Color profile +!PREFERENCES_RAW_DECODER;Raw Decoder +!PREFERENCES_RAW_DECODER_ENABLE_LIBRAW;Use LibRaw !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_SHOWTOOLTIP;Show Selective Editing advice tooltips +!PREFERENCES_SPOTLOC;Define Spot method for Selective Editing !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules !PREFERENCES_TAB_FAVORITES;Favorites !PREFERENCES_TAB_PERFORMANCE;Performance @@ -2858,6 +2933,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_THUMBNAIL_RANK_COLOR_MODE;Load/Save thumbnail rank and color from/to XMP sidecars !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. @@ -2890,6 +2966,27 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !QINFO_FRAMECOUNT;%2 frames !QINFO_HDR;HDR / %2 frame(s) !QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!QUEUE_DESTPREVIEW_TITLE;Select a thumbnail to preview its destination path here +!QUEUE_DESTPREVIEW_TOOLTIP;Destination path for the first selected image appears here +!QUEUE_LOCATION_TEMPLATE_HELP_BUTTON_TOOLTIP;Show or hide a help panel with instructions for creating location templates +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_BODY;If you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p-3/converted/%P-4/%f +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_TITLE;Common examples +!QUEUE_LOCATION_TEMPLATE_HELP_INTRO;The output template field allows you to to dynamically customize the destination folder and filename. When you include certain specifiers, which begin with %, they are replaced by the program when each file is being saved.\n\nThe sections below describe each type of specifier. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_1;Using this pathname as an example: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_2;The meanings of the formatting strings are: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_LINUX;/home/tom/photos/2010-10-31/photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_WINDOWS;D:\tom\photos\2010-10-31\photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO;The %dN, %d-N, %pN, %p-N, %PN and %P-N (N = 1..9) specifiers will be replaced by elements of the image file's directory path.\nThe format specifiers operate as follows:\n %dN = Nth directory from the end of the path\n %d-N = Nth directory from the start of the path\n %pN = all directories up to the Nth from the end of the path\n %p-N = the first N directories in the path\n %PN = the last N directories in the path\n %P-N = all directories from the Nth to the end of the path\n %f = base filename (no extension) +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO_WINDOWS;For Windows paths, %d-1 is the drive letter and colon, and %d-2 is the base directory on that drive. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_TITLE;Directories and partial paths +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_BODY;%r will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used. +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_TITLE;Rank +!QUEUE_LOCATION_TEMPLATE_HELP_RESULT_MISMATCH;ERROR: 2nd result is different: +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_BODY;%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'. +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_TITLE;Position/sequence in queue +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_BODY;Three different date/time values may be used in templates:\n %tE"%Y-%m-%d" = when export started\n %tF"%Y-%m-%d" = when file was last saved\n %tP"%Y-%m-%d" = when photo was taken\nThe quoted string defines the format of the resulting date and/or time. The format string %tF"%Y-%m-%d" is just one example. The string can use all conversion specifiers defined for the g_date_time_format function (see https://docs.gtk.org/glib/method.DateTime.format.html).\n\nExample format strings: +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_TITLE;Date and time +!QUEUE_LOCATION_TEMPLATE_HELP_TITLE;Creating an output template !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 @@ -2911,12 +3008,16 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !SORT_BY_NAME;By Name !SORT_BY_RANK;By Rank !SORT_DESCENDING;Descending +!TC_LOCALLAB_PRIM_SHIFTX;Shift x +!TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP;In combination with "Refine colors", allows you to:\n 1) for low values, adjust the image purity.\n 2) for higher values, carry out moderate color toning.\nBe careful not to go outside the CIE xy diagram. +!TC_LOCALLAB_PRIM_SHIFTY;Shift y !TC_PRIM_BLUX;Bx !TC_PRIM_BLUY;By !TC_PRIM_GREX;Gx !TC_PRIM_GREY;Gy !TC_PRIM_REDX;Rx !TC_PRIM_REDY;Ry +!TC_PRIM_REFI;Refine colors (white-point) !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 @@ -3042,6 +3143,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_BW;Black and White !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)'. @@ -3056,8 +3158,15 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_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 three main uses - channel mixer, restore image color (saturation), 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_CAT;Matrix adaptation +!TP_ICM_WORKING_CAT_BRAD;Bradford +!TP_ICM_WORKING_CAT_CAT02;Cat02 +!TP_ICM_WORKING_CAT_CAT16;Cat16 +!TP_ICM_WORKING_CAT_TOOLTIP;Performs the chromatic adaptation of the XYZ conversion matrix. Default: Bradford +!TP_ICM_WORKING_CAT_VK;Von Kries +!TP_ICM_WORKING_CAT_XYZ;XYZ scale !TP_ICM_WORKING_CIEDIAG;CIE xy diagram !TP_ICM_WORKING_ILLU;Illuminant !TP_ICM_WORKING_ILLU_1500;Tungsten 1500K @@ -3069,11 +3178,13 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_ICM_WORKING_ILLU_D65;D65 !TP_ICM_WORKING_ILLU_D80;D80 !TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_E;E !TP_ICM_WORKING_ILLU_NONE;Default !TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_NON;None !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_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination primaries' combo box, 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 @@ -3082,11 +3193,14 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_FREE;Custom LA (sliders) !TP_ICM_WORKING_PRIM_JDCMAX;JDC Max +!TP_ICM_WORKING_PRIM_JDCMAXSTDA;JDC Max stdA !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_TOOLTIP;Performs a gamut control. Destination primaries (Advanced) allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified.\nWhen 'Custom LA (sliders)' is selected, you can modify the values of the 3 primaries (Red, Green, and Blue) for x and y. !TP_ICM_WORKING_PRIM_WID;WideGamut !TP_ICM_WORKING_TRC;Tone response curve: !TP_ICM_WORKING_TRC_18;Prophoto g=1.8 @@ -3104,6 +3218,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected !TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file !TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected +!TP_LENSPROFILE_CORRECTION_METADATA;From file metadata !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 @@ -3122,9 +3237,9 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_AUTOGRAYCIE;Automatic !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_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab). Default: Munsell only.\n\nMunsell only: 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. The result is not the same as Lab. !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 @@ -3167,9 +3282,12 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_LOCALLAB_BUTTON_DUPL;Duplicate !TP_LOCALLAB_BUTTON_REN;Rename !TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWEVNONE;None +!TP_LOCALLAB_BWEVSIG;Activated +!TP_LOCALLAB_BWEVSIGLOG;Sigmoid & Log-Encoding !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_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16 (experimental). 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, for example, to match CAM16 processing with the maximum monitor brightness of 400cd/m2. !TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments !TP_LOCALLAB_CAMMODE;CAM model !TP_LOCALLAB_CAMMODE_CAM16;CAM 16 @@ -3209,6 +3327,12 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_SMOOTHFRAME;Highlight Attenuation & Levels +!TP_LOCALLAB_CIE_SMOOTH_EV;Ev based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA;Slope based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF;Gamma based +!TP_LOCALLAB_CIE_SMOOTH_LEVELS;Levels +!TP_LOCALLAB_CIE_SMOOTH_NONE;None !TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) !TP_LOCALLAB_CIRCRADIUS;Spot size !TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the 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. @@ -3224,8 +3348,9 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_COLORDEPREV_TOOLTIP;Preview ΔE button in Settings will only work if you have activated 'Sharpening', 'Soft Light and Original Retinex', 'Blur/Grain and Denoise', 'Dehaze and Retinex', or 'Contrast by Detail Levels' in the 'Add tool to current spot' menu.\nFor others tools, the Preview ΔE button is in the tool, which allows previewing ΔE with several tools enabled. Prefer using Mask and modifications. !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_COLORFRAME;Dominant color !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 @@ -3233,7 +3358,10 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_LOCALLAB_COL_NAME;Name !TP_LOCALLAB_COL_VIS;Status !TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPRCIE;Brightness compression +!TP_LOCALLAB_COMPRCIETH;Compression threshold !TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_COMPRLOG_TOOLTIP;This algorithm compress the data before log conversion, above the threshold slider value. To use in conjunction with Whites distribution. !TP_LOCALLAB_CONTCOL;Contrast threshold !TP_LOCALLAB_CONTFRA;Contrast by level !TP_LOCALLAB_CONTRAST;Contrast @@ -3248,7 +3376,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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 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 spot. -!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combo box 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. @@ -3257,13 +3385,14 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_LOCALLAB_DARKRETI;Darkness !TP_LOCALLAB_DEHAFRA;Dehaze !TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZE_BLACK;Black !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_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. @@ -3283,6 +3412,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_LOCALLAB_DETAILFRA;Edge detection - DCT !TP_LOCALLAB_DETAILSH;Details !TP_LOCALLAB_DETAILTHR;Lum/chrom detail threshold +!TP_LOCALLAB_DISAB_CIECAM;Disable Ciecam or Weak Jz surround !TP_LOCALLAB_DIVGR;Gamma !TP_LOCALLAB_DUPLSPOTNAME;Copy !TP_LOCALLAB_EDGFRA;Edge sharpness @@ -3291,6 +3421,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping !TP_LOCALLAB_ENABLE_MASK;Enable mask !TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENABLE_MASKALL;Enable all mask tools !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 @@ -3306,9 +3437,10 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all selective editing data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\nUse 'Scope' (Excluding) to set the exclusion intensity.\n\n'Full image' allows you to use the selective editing tools on the whole image.\nThe RT Spot delimiters are set beyond the image preview boundaries.\nThe 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.\nNote: 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.\n\n'Global' allows you to use the selective editing tools on the whole image, without using Delta E or transitions. !TP_LOCALLAB_EXECLU;Excluding spot !TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXMAIN;Global !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 @@ -3317,11 +3449,11 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Selective Editing 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 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_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. @@ -3343,7 +3475,8 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_LOCALLAB_FATSAT;Saturation control !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_FEATVALUE;Feather gradient +!TP_LOCALLAB_FEATVALUE_MASK;Feather gradient (Grad. Filters Mask) !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 @@ -3439,7 +3572,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_LABEL;Selective Editing !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 @@ -3484,8 +3617,10 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_LOGCIE;Log encoding +!TP_LOCALLAB_LOGCIEQ;Log Encoding Q (with Ciecam) +!TP_LOCALLAB_LOGCIEQ_TOOLTIP;Activating the checkbox allows you to switch between log encoding based on the 3 RGB channels, and log encoding based solely on Ciecam’s brightness (Q) channel.\nUsing the Q channel instead of the RGB channels helps avoid undesirable edge effects such as hue and saturation shifts.\nHowever, the settings are more difficult to optimise because Q is unbounded and Ciecam alters the data to take into account the surround conditions, simultaneous contrast, etc.\nYou may have to adjust the following:\n Scene conditions: Mean luminance (Yb), Whites & Blacks distribution, Black Ev, White Ev.\n Source Data Adjustments : Brightness compression, Strength.\n\nNote: when using Log Encoding (Q), be careful not to activate the Disable Ciecam option in the Scene Conditions, Surround menu. +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you to use Black Ev, White Ev, White and Black distribution, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using 'Log encoding' with Brightness compression. !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) @@ -3493,7 +3628,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_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 @@ -3506,6 +3641,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_LOGPFRA2;Log Encoding settings !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. @@ -3575,7 +3711,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_MASKUNUSABLE;Mask disabled (Enable in 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 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 @@ -3611,6 +3747,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_LOCALLAB_MERTWE;Exclusion !TP_LOCALLAB_MERTWO;Subtract !TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MIDTCIE;Midtones !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 @@ -3658,10 +3795,15 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_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_PRECAMGAMUT_TOOLTIP;If checked, ensures a gamut control just after primary conversion to XYZ. +!TP_LOCALLAB_PRECAMREFIMAIN_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. In combination with "Shift x" and "Shift y", allows you to carry out moderate color toning. +!TP_LOCALLAB_PRECAMREFI_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. +!TP_LOCALLAB_PRECAM_TOOLTIP;'Source Data Adjustments' modifies the Dynamic Range using Log encoding, the tones of the image and primaries (simplified Abstract Profile), and midtones, just before the Ciecam process. These values are adjustable:\nGamma: Acts mainly on light tones\nSlope: Acts mainly on dark tones. You 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.\nDestination primaries: Allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified. You can also finely adapt the primaries and the illuminant (white-point). Moving a primary away from the white point reduces saturation and vice versa. Pay attention to the gamut. !TP_LOCALLAB_PREVHIDE;Hide additional settings !TP_LOCALLAB_PREVIEW;Preview ΔE !TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PRIMILLFRAME;Primaries & Illuminant !TP_LOCALLAB_PROXI;ΔE decay !TP_LOCALLAB_QUAAGRES;Aggressive !TP_LOCALLAB_QUACONSER;Conservative @@ -3706,10 +3848,11 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_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_SATCIE;Saturation control !TP_LOCALLAB_SATUR;Saturation !TP_LOCALLAB_SATURV;Saturation (s) !TP_LOCALLAB_SCALEGR;Scale @@ -3730,7 +3873,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_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;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. @@ -3776,17 +3919,41 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_SIGBLACKSSCIE;Blacks distribution +!TP_LOCALLAB_SIGCIE;Sigmoid +!TP_LOCALLAB_SIGFRA;Sigmoid Q +!TP_LOCALLAB_SIGGAMJCIE;Gamma !TP_LOCALLAB_SIGJZFRA;Sigmoid Jz !TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOID16_TOOLTIP;Allows you to simulate a tone mapping appearance using both 'Ciecam' and 'Sigmoid Q'. Sigmoid Q has three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc) Adaptability weights the action of the sigmoid by action on the internal exponential function. !TP_LOCALLAB_SIGMOIDBL;Blend !TP_LOCALLAB_SIGMOIDLAMBDA;Contrast -!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDLOGAUTO;Auto threshold +!TP_LOCALLAB_SIGMOIDLOGEV_TOOLTIP;If the combo box selection 'Black Ev and White Ev' is 'Sigmoid and Log encoding' instead of 'Sigmoid only', the two algorithms 'Log encoding' and 'Sigmoid' are used together. +!TP_LOCALLAB_SIGMOIDNORMCIE;Normalize Luminance +!TP_LOCALLAB_SIGMOIDNORMCIEBLEND_TOOLTIP;Blend acts on the final aspect of the image, contrast and luminance. Ratio between original and output image. +!TP_LOCALLAB_SIGMOIDNORMCIE_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image take into account those of the original.\nAll the adjustments acting on J or Q are taken into account, including those which are not relative to Sigmoid Q. +!TP_LOCALLAB_SIGMOIDQJ;Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDQJCOMPRCIE_TOOLTIP;When the combo box selection 'Uses Black Ev and White Ev' is 'Sigmoid and Log encoding Q' or 'Log encoding instead of Sigmoid' checked. This algorithm compress the data above the threshold slider value. The last value stands for brightness (Q) and should be close as possible to the value 'Compression threshold' (calculate when 'Auto threshold" checked, often > 1). +!TP_LOCALLAB_SIGMOIDSENSI;Adaptability !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_SIGMOIDWHITESCIE_TOOLTIP;Allows you, in Automatic when the dynamic range of the image is high, to change the distribution of lights in whites and deep blacks.\nCan be used with Log encoding or Sigmoid with Black Ev and White Ev enabled.\n\nThe algorithm does not change the basic data, but acts on the components necessary to calculate the Dynamic range, Black Ev, White Ev and the Gray point. +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a tone mapping appearance using both the 'Jz' and 'Sigmoid' function. Three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SIGSLOPJCIE;Slope +!TP_LOCALLAB_SIGTRCCIE;Source Data Adjustments +!TP_LOCALLAB_SIGWHITESCIE;Whites distribution !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_SLOPESMOOTH;Gray balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHB;Blue balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHG;Green balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHR;Red balance (Slope) !TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SMOOTHCIE;Highlight Attenuation +!TP_LOCALLAB_SMOOTHCIE_LUM;Luminosity mode +!TP_LOCALLAB_SMOOTHCIE_SCA;Scale Yb Scene +!TP_LOCALLAB_SMOOTHCIE_TOOLTIP;Completes the processing carried out by gamma, slope and midtones by causing a slight lowering of lights. Please note this does not replace Highlight reconstruction.\n\nGamma based and Slope based (Standard and Advanced) allow you to simulate a tone mapping using:\na) Scene conditions: Black-Ev, White-Ev, Mean luminance (Yb%)\nb) Viewing conditions: Mean luminance (Yb%).\n\nScale Yb Scene is function of White-Ev. +!TP_LOCALLAB_SMOOTHCIE_YB;Scale Yb Viewing !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. @@ -3808,13 +3975,14 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_STRENGTHCIELOG;Strength !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_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. @@ -3846,11 +4014,12 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_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_TRCFRAME;Tone Response Curve & Midtones !TP_LOCALLAB_USEMASK;Laplacian !TP_LOCALLAB_VART;Variance (contrast) !TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool @@ -4191,7 +4360,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_WAVELET_WAVOFFSET;Offset !TP_WBALANCE_AUTOITCGREEN;Temperature correlation !TP_WBALANCE_AUTOOLD;RGB grey -!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement +!TP_WBALANCE_AUTO_HEADER;Automatic & Refinement !TP_WBALANCE_ITCWALG_TOOLTIP;Allows you to switch to the other Alternative temperature (Alt_temp), when possible.\nInactive in the "single choice" case. !TP_WBALANCE_ITCWBDELTA_TOOLTIP;Fixed for each "green" iteration tried, the temperature difference to be taken into account. !TP_WBALANCE_ITCWBFGREEN_TOOLTIP;Find the best compromise between Student and green. @@ -4234,7 +4403,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_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).\nIn the rare case of a color drift with "Observer 2°" (probably due to the conversion matrix) "Observer 10°" must be selected. !TP_WBALANCE_PATCHLABEL;Read colors:%1 Patch: Chroma:%2 Size=%3 !TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colors (max=237).\nDisplay calculated Patch Chroma.\nAWB temperature bias, lets try to reduce this value, a minimum may seem to optimize the algorithm.\n\nPatch size matching chroma optimization. !TP_WBALANCE_PATCHLEVELLABEL;Patch: ΔE=%1 - datas x 9 Min:%2 Max=%3 diff --git a/rtdata/languages/default b/rtdata/languages/default index 0f43a00cc..3eacc3429 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -203,6 +203,7 @@ FILEBROWSER_SHOWRANK4HINT;Show images ranked as 4-star.\nShortcut: Shift-4Shift-5 FILEBROWSER_SHOWRECENTLYSAVEDHINT;Show saved images.\nShortcut: Alt-7 FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 +FILEBROWSER_SHOWRECURSIVE;Show images in sub-folders recursively. FILEBROWSER_SHOWTRASHHINT;Show contents of trash.\nShortcut: Ctrl-t FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Show unranked images.\nShortcut: Shift-0 @@ -757,7 +758,7 @@ HISTORY_MSG_511;Local - SD - ΔE scope threshold HISTORY_MSG_512;Local - SD - ΔE decay HISTORY_MSG_513;Local - Spot - Excluding - Scope HISTORY_MSG_514;Local - Spot structure -HISTORY_MSG_515;Local Adjustments +HISTORY_MSG_515;Selective Editing HISTORY_MSG_516;Local - Color and light HISTORY_MSG_517;Local - Enable super HISTORY_MSG_518;Local - Lightness @@ -1067,7 +1068,7 @@ 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 - TG - Feather gradient +HISTORY_MSG_833;Local - Mask 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 @@ -1310,7 +1311,7 @@ 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_1082;Local - CIECAM Auto threshold HISTORY_MSG_1083;Local - CIECAM Hue HISTORY_MSG_1084;Local - Uses Black Ev - White Ev HISTORY_MSG_1085;Local - Jz lightness @@ -1426,16 +1427,23 @@ 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_CAT;Matrix adaptation 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_MIDTCIE;Midtones 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_PRESER;Preserve neutral HISTORY_MSG_ICM_REDX;Primaries Red X HISTORY_MSG_ICM_REDY;Primaries Red Y +HISTORY_MSG_ICM_REFI;Refinement Colors +HISTORY_MSG_ICM_SHIFTX;Refinement Colors - Shift x +HISTORY_MSG_ICM_SHIFTY;Refinement Colors - Shift y +HISTORY_MSG_ICM_SMOOTHCIE;Smooth highlights +HISTORY_MSG_ICM_TRCEXP;Abstract Profile HISTORY_MSG_ICM_WORKING_GAMMA;TRC - Gamma HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method @@ -1448,7 +1456,72 @@ HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius HISTORY_MSG_LOCALLAB_TE_PIVOT;Local - Equalizer pivot +HISTORY_MSG_LOCAL_CIEMASK_BLURCONT;Local - CIECAM Mask blur contrast +HISTORY_MSG_LOCAL_CIEMASK_BLURFFT;Local - CIECAM Mask blur FFTW +HISTORY_MSG_LOCAL_CIEMASK_BLURRAD;Local - CIECAM Mask blur radius +HISTORY_MSG_LOCAL_CIEMASK_CHH;Local - CIECAM Mask curve h(h) +HISTORY_MSG_LOCAL_CIEMASK_HIGH;Local - CIECAM Mask highlights +HISTORY_MSG_LOCAL_CIEMASK_SHAD;Local - CIECAM Mask shadows +HISTORY_MSG_LOCAL_CIEMASK_STRU;Local - CIECAM Mask structure +HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;Local - CIECAM Mask structure as tool +HISTORY_MSG_LOCAL_CIEMASK_WLC;Local - CIECAM Mask wavelet L(L) +HISTORY_MSG_LOCAL_CIEMASK_WLEV;Local - CIECAM Mask wavelet levels +HISTORY_MSG_LOCAL_CIE_ANGGRAD;Local - CIECAM Gradient angle +HISTORY_MSG_LOCAL_CIE_BLACKS;Local - CIECAM Blacks distribution +HISTORY_MSG_LOCAL_CIE_BLUXL;Local - CIECAM Blue X +HISTORY_MSG_LOCAL_CIE_BLUYL;Local - CIECAM Blue Y +HISTORY_MSG_LOCAL_CIE_BRICOMP;Local - CIECAM Brightness compression +HISTORY_MSG_LOCAL_CIE_BRICOMPTH;Local - CIECAM Brightness compression threshold +HISTORY_MSG_LOCAL_CIE_BWCIE;Local - CIECAM Black and white +HISTORY_MSG_LOCAL_CIE_CAT;Local - Matrix adaptation +HISTORY_MSG_LOCAL_CIE_DETAILJZ;Local - JzCzHz Local contrast +HISTORY_MSG_LOCAL_CIE_ENAMASKALL;Local - CIECAM All mask tools +HISTORY_MSG_LOCAL_CIE_EXPPRECAM;Local - CIECAM Pre-Cam +HISTORY_MSG_LOCAL_CIE_GAM;Local - CIECAM Gamma +HISTORY_MSG_LOCAL_CIE_GAMUTCIE;Local - CIECAM Gamut +HISTORY_MSG_LOCAL_CIE_GREXL;Local - CIECAM Green X +HISTORY_MSG_LOCAL_CIE_GREYL;Local - CIECAM Green Y +HISTORY_MSG_LOCAL_CIE_ILL;Local - CIECAM TRC Illuminant +HISTORY_MSG_LOCAL_CIE_LOGCIEQ;Local - CIECAM Log encoding Q +HISTORY_MSG_LOCAL_CIE_MIDT;Local - CIECAM Mid Tones +HISTORY_MSG_LOCAL_CIE_NORM;Local - CIECAM Normalize L +HISTORY_MSG_LOCAL_CIE_PRIM;Local - CIECAM TRC primaries +HISTORY_MSG_LOCAL_CIE_REDXL;Local - CIECAM Red X +HISTORY_MSG_LOCAL_CIE_REDYL;Local - CIECAM Red Y +HISTORY_MSG_LOCAL_CIE_REFI;Local - CIECAM Refinement colors +HISTORY_MSG_LOCAL_CIE_SATCIE;Local - CIECAM Saturation control +HISTORY_MSG_LOCAL_CIE_SHIFTXL;Local - CIECAM Shift x +HISTORY_MSG_LOCAL_CIE_SHIFTYL;Local - CIECAM Shift y +HISTORY_MSG_LOCAL_CIE_SIG;Local - Sigmoid +HISTORY_MSG_LOCAL_CIE_SIGADAP;Local - CIECAM Sigmoid adaptability +HISTORY_MSG_LOCAL_CIE_SIGMET;Local - CIECAM Sigmoid method +HISTORY_MSG_LOCAL_CIE_SLOP;Local - CIECAM Slope +HISTORY_MSG_LOCAL_CIE_SLOPESMO;Local - CIECAM Gray balance +HISTORY_MSG_LOCAL_CIE_SLOPESMOB;Local - CIECAM Blue balance +HISTORY_MSG_LOCAL_CIE_SLOPESMOG;Local - CIECAM Green balance +HISTORY_MSG_LOCAL_CIE_SLOPESMOR;Local - CIECAM Red balance +HISTORY_MSG_LOCAL_CIE_SMOOTH;Local - CIECAM Scale Yb scene +HISTORY_MSG_LOCAL_CIE_SMOOTHMET;Local - CIECAM Smooth lights method +HISTORY_MSG_LOCAL_CIE_SMOOTHYB;Local - CIECAM Scale Yb viewing +HISTORY_MSG_LOCAL_CIE_SMOOTH_LUM;Local - CIECAM Levels - Luminosity mode +HISTORY_MSG_LOCAL_CIE_STRGRAD;Local - CIECAM Gradient strength L +HISTORY_MSG_LOCAL_CIE_STRLOG;Local - CIECAM Log encoding strength +HISTORY_MSG_LOCAL_CIE_TRC;Local - CIECAM TRC +HISTORY_MSG_LOCAL_CIE_WHITES;Local - CIECAM Whites distribution +HISTORY_MSG_LOCAL_DEHAZE_BLACK;Local - Dehaze Black +HISTORY_MSG_LOCAL_FEATHERCIE;Local - CIECAM Gradient feather +HISTORY_MSG_LOCAL_FEATHERCOL;Local - Color Gradient feather +HISTORY_MSG_LOCAL_FEATHEREXE;Local - Exp Gradient feather +HISTORY_MSG_LOCAL_FEATHERLOG;Local - Log Gradient feather +HISTORY_MSG_LOCAL_FEATHERMAS;Local - Mask Common gradient feather +HISTORY_MSG_LOCAL_FEATHERSH;Local - SH Gradient feather +HISTORY_MSG_LOCAL_FEATHERVIB;Local - Vib Gradient feather +HISTORY_MSG_LOCAL_FEATHERWAV;Local - Wav Gradient feather HISTORY_MSG_LOCAL_GAMUTMUNSEL;Local - SC - Avoid Color Shift +HISTORY_MSG_LOCAL_LOG_BLACKS;Local - Log Blacks distribution +HISTORY_MSG_LOCAL_LOG_COMPR;Local - Log Compress brightness +HISTORY_MSG_LOCAL_LOG_SAT;Local - Log Saturation control +HISTORY_MSG_LOCAL_LOG_WHITES;Local - Log Whites distribution HISTORY_MSG_LOCAL_TMO_SATUR;Local Exp Fattal Saturation HISTORY_MSG_METADATA_MODE;Metadata copy mode HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold @@ -1690,15 +1763,15 @@ MAIN_TAB_DETAIL;Detail MAIN_TAB_DETAIL_TOOLTIP;Shortcut: Alt-d MAIN_TAB_DEVELOP; Batch Edit MAIN_TAB_EXIF;Exif -MAIN_TAB_EXPORT; Fast Export +MAIN_TAB_EXPORT; Fast Export MAIN_TAB_EXPOSURE;Exposure MAIN_TAB_EXPOSURE_TOOLTIP;Shortcut: Alt-e MAIN_TAB_FAVORITES;Favorites MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u -MAIN_TAB_FILTER; Filter +MAIN_TAB_FILTER; Filter MAIN_TAB_INSPECT; Inspect MAIN_TAB_IPTC;IPTC -MAIN_TAB_LOCALLAB;Local +MAIN_TAB_LOCALLAB;Selective Editing MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o MAIN_TAB_METADATA;Metadata MAIN_TAB_METADATA_TOOLTIP;Shortcut: Alt-m @@ -1719,7 +1792,7 @@ MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the focus mask.\nShortcut: Shift MAIN_TOOLTIP_PREVIEWG;Preview the green channel.\nShortcut: g MAIN_TOOLTIP_PREVIEWL;Preview the luminosity.\nShortcut: v\n\n0.299*R + 0.587*G + 0.114*B MAIN_TOOLTIP_PREVIEWR;Preview the red channel.\nShortcut: r -MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. +MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%, or when capture sharpening is enabled. MAIN_TOOLTIP_QINFO;Quick info on the image.\nShortcut: i MAIN_TOOLTIP_SHOWHIDELP1;Show/Hide the left panel.\nShortcut: l MAIN_TOOLTIP_SHOWHIDERP1;Show/Hide the right panel.\nShortcut: Alt-l @@ -1785,8 +1858,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_LOCALLAB;Selective Editing +PARTIALPASTE_LOCALLABGROUP;Selective Editing Settings PARTIALPASTE_METADATA;Metadata mode PARTIALPASTE_METAGROUP;Metadata settings PARTIALPASTE_PCVIGNETTE;Vignette filter @@ -1833,7 +1906,6 @@ PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color PREFERENCES_APPEARANCE_MAINFONT;Main font PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator guide color -PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode PREFERENCES_APPEARANCE_THEME;Theme PREFERENCES_APPLNEXTSTARTUP;restart required PREFERENCES_AUTOMONPROFILE;Use operating system's main monitor color profile @@ -1844,6 +1916,9 @@ PREFERENCES_BEHADDALLHINT;Set all parameters to the Add mode.\nAdjustment PREFERENCES_BEHAVIOR;Behavior PREFERENCES_BEHSETALL;All to 'Set' PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. +PREFERENCES_BROWSERECURSIVEDEPTH;Browse sub-folders depth +PREFERENCES_BROWSERECURSIVEFOLLOWLINKS;Follow symbolic links when browsing sub-folders +PREFERENCES_BROWSERECURSIVEMAXDIRS;Maximum sub-folders PREFERENCES_CACHECLEAR;Clear PREFERENCES_CACHECLEAR_ALL;Clear all cached files: PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: @@ -1866,7 +1941,7 @@ 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_COMPLEXITYLOC;Default complexity for Selective Editing PREFERENCES_COMPLEXITY_EXP;Advanced PREFERENCES_COMPLEXITY_NORM;Standard PREFERENCES_COMPLEXITY_SIMP;Basic @@ -1945,6 +2020,7 @@ PREFERENCES_LENSFUNDBDIR_TOOLTIP;Directory containing the Lensfun database. Lea PREFERENCES_LENSPROFILESDIR;Lens profiles directory PREFERENCES_LENSPROFILESDIR_TOOLTIP;Directory containing Adobe Lens Correction Profiles (LCPs) PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders +PREFERENCES_MAX_ZOOM_TITLE;Maximum zoom PREFERENCES_MENUGROUPEXTPROGS;Group 'Open with' PREFERENCES_MENUGROUPFILEOPERATIONS;Group 'File operations' PREFERENCES_MENUGROUPLABEL;Group 'Color label' @@ -1970,7 +2046,7 @@ PREFERENCES_PANFACTORLABEL;Pan rate amplification PREFERENCES_PARSEDEXT;Parsed Extensions PREFERENCES_PARSEDEXTADD;Add extension PREFERENCES_PARSEDEXTADDHINT;Add entered extension to the list. -PREFERENCES_PARSEDEXTDELHINT;Delete selected extension from the list. +PREFERENCES_PARSEDEXTDELHINT;Delete selected extension from the list.\nPredefined extensions cannot be deleted. PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. PREFERENCES_PERFORMANCE_MEASURE;Measure @@ -1995,6 +2071,8 @@ PREFERENCES_PROPERTY;Property PREFERENCES_PRTINTENT;Rendering intent PREFERENCES_PRTPROFILE;Color profile PREFERENCES_PSPATH;Adobe Photoshop installation directory +PREFERENCES_RAW_DECODER;Raw Decoder +PREFERENCES_RAW_DECODER_ENABLE_LIBRAW;Use LibRaw PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in 'Single Editor Tab Mode' and when 'Demosaicing method used for the preview at <100% zoom' is set to 'As in PP3'. PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now @@ -2007,7 +2085,7 @@ 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_SHOWTOOLTIP;Show Selective Editing advice tooltips PREFERENCES_SHTHRESHOLD;Threshold for clipped shadows PREFERENCES_SINGLETAB;Single Editor Tab Mode PREFERENCES_SINGLETABVERTAB;Single Editor Tab Mode, Vertical Tabs @@ -2015,6 +2093,7 @@ PREFERENCES_SND_HELP;Enter a full file path to set a sound, or leave blank for n PREFERENCES_SND_LNGEDITPROCDONE;Editor processing done PREFERENCES_SND_QUEUEDONE;Queue processing done PREFERENCES_SND_THRESHOLDSECS;After seconds +PREFERENCES_SPOTLOC;Define Spot method for Selective Editing PREFERENCES_STARTUPIMDIR;Image Directory at Startup PREFERENCES_TAB_BROWSER;File Browser PREFERENCES_TAB_COLORMGR;Color Management @@ -2028,6 +2107,7 @@ 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_THUMBNAIL_RANK_COLOR_MODE;Load/Save thumbnail rank and color from/to XMP sidecars 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. @@ -2048,7 +2128,7 @@ PREFERENCES_WBANOPURP;No purple color used PREFERENCES_WBAPATCH;Number maximum of colors used in picture PREFERENCES_WBAPRECIS;Precision algorithm - scale used PREFERENCES_WBASIZEREF;Size of reference color compare to size of histogram color -PREFERENCES_WBASORT;Sort in chroma order instead of histogram +PREFERENCES_WBASORT;Sort in chroma order instead of histogram PREFERENCES_WORKFLOW;Layout PREFERENCES_XMP_SIDECAR_MODE;XMP sidecar style PREFERENCES_XMP_SIDECAR_MODE_EXT;darktable-like (FILENAME.ext.xmp for FILENAME.ext) @@ -2081,6 +2161,7 @@ PROGRESSBAR_LINEDENOISE;Line noise filter... PROGRESSBAR_LOADING;Loading image... PROGRESSBAR_LOADINGTHUMBS;Loading thumbnails... PROGRESSBAR_LOADJPEG;Loading JPEG file... +PROGRESSBAR_LOADJXL;Loading JXL file... PROGRESSBAR_LOADPNG;Loading PNG file... PROGRESSBAR_LOADTIFF;Loading TIFF file... PROGRESSBAR_NOIMAGES;No images found @@ -2101,10 +2182,31 @@ QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) QUEUE_AUTOSTART;Auto-start QUEUE_AUTOSTART_TOOLTIP;Start processing automatically when a new job arrives. QUEUE_DESTFILENAME;Path and file name +QUEUE_DESTPREVIEW_TITLE;Select a thumbnail to preview its destination path here +QUEUE_DESTPREVIEW_TOOLTIP;Destination path for the first selected image appears here QUEUE_FORMAT_TITLE;File Format QUEUE_LOCATION_FOLDER;Save to folder QUEUE_LOCATION_TEMPLATE;Use template -QUEUE_LOCATION_TEMPLATE_TOOLTIP;Specify the output location based on the source photo's location, rank, trash status or position in the queue.\n\nUsing the following pathname as an example:\n/home/tom/photos/2010-10-31/photo1.raw\nthe meaning of the formatting strings follows:\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 will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used.\n\n%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'.\n\nIf you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p2/converted/%d1/%f +QUEUE_LOCATION_TEMPLATE_HELP_BUTTON_TOOLTIP;Show or hide a help panel with instructions for creating location templates +QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_BODY;If you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p-3/converted/%P-4/%f +QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_TITLE;Common examples +QUEUE_LOCATION_TEMPLATE_HELP_INTRO;The output template field allows you to to dynamically customize the destination folder and filename. When you include certain specifiers, which begin with %, they are replaced by the program when each file is being saved.\n\nThe sections below describe each type of specifier. +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_1;Using this pathname as an example: +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_2;The meanings of the formatting strings are: +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_LINUX;/home/tom/photos/2010-10-31/photo1.raw +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_WINDOWS;D:\tom\photos\2010-10-31\photo1.raw +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO;The %dN, %d-N, %pN, %p-N, %PN and %P-N (N = 1..9) specifiers will be replaced by elements of the image file's directory path.\nThe format specifiers operate as follows:\n %dN = Nth directory from the end of the path\n %d-N = Nth directory from the start of the path\n %pN = all directories up to the Nth from the end of the path\n %p-N = the first N directories in the path\n %PN = the last N directories in the path\n %P-N = all directories from the Nth to the end of the path\n %f = base filename (no extension) +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO_WINDOWS;For Windows paths, %d-1 is the drive letter and colon, and %d-2 is the base directory on that drive. +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_TITLE;Directories and partial paths +QUEUE_LOCATION_TEMPLATE_HELP_RANK_BODY;%r will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used. +QUEUE_LOCATION_TEMPLATE_HELP_RANK_TITLE;Rank +QUEUE_LOCATION_TEMPLATE_HELP_RESULT_MISMATCH;ERROR: 2nd result is different: +QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_BODY;%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'. +QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_TITLE;Position/sequence in queue +QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_BODY;Three different date/time values may be used in templates:\n %tE"%Y-%m-%d" = when export started\n %tF"%Y-%m-%d" = when file was last saved\n %tP"%Y-%m-%d" = when photo was taken\nThe quoted string defines the format of the resulting date and/or time. The format string %tF"%Y-%m-%d" is just one example. The string can use all conversion specifiers defined for the g_date_time_format function (see https://docs.gtk.org/glib/method.DateTime.format.html).\n\nExample format strings: +QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_TITLE;Date and time +QUEUE_LOCATION_TEMPLATE_HELP_TITLE;Creating an output template +QUEUE_LOCATION_TEMPLATE_TOOLTIP;Specify the output location based on characteristics such as the source photo's location, rank, trash status or position in the queue.\n\nThe output template field value can include specifiers beginning with %, which are replaced by those characteristics in the actual destination path.\n\nPress the ? button for full instructions. 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 @@ -2143,12 +2245,16 @@ SORT_BY_LABEL;By Color Label SORT_BY_NAME;By Name SORT_BY_RANK;By Rank SORT_DESCENDING;Descending +TC_LOCALLAB_PRIM_SHIFTX;Shift x +TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP;In combination with "Refine colors", allows you to:\n 1) for low values, adjust the image purity.\n 2) for higher values, carry out moderate color toning.\nBe careful not to go outside the CIE xy diagram. +TC_LOCALLAB_PRIM_SHIFTY;Shift y TC_PRIM_BLUX;Bx TC_PRIM_BLUY;By TC_PRIM_GREX;Gx TC_PRIM_GREY;Gy TC_PRIM_REDX;Rx TC_PRIM_REDY;Ry +TC_PRIM_REFI;Refine colors (white-point) THRESHOLDSELECTOR_B;Bottom THRESHOLDSELECTOR_BL;Bottom-left THRESHOLDSELECTOR_BR;Bottom-right @@ -2599,6 +2705,7 @@ TP_ICM_APPLYHUESATMAP_TOOLTIP;Employ the embedded DCP base table (HueSatMap). Th 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_BW;Black and White 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. @@ -2612,8 +2719,8 @@ TP_ICM_INPUTCAMERA_TOOLTIP;Use a simple color matrix from dcraw, an enhanced Raw TP_ICM_INPUTCUSTOM;Custom TP_ICM_INPUTCUSTOM_TOOLTIP;Select your own DCP/ICC color profile file for the camera. TP_ICM_INPUTDLGLABEL;Select Input DCP/ICC Profile... -TP_ICM_INPUTEMBEDDED;Use embedded, if possible -TP_ICM_INPUTEMBEDDED_TOOLTIP;Use color profile embedded in non-raw files. +TP_ICM_INPUTEMBEDDED;Use embedded +TP_ICM_INPUTEMBEDDED_TOOLTIP;Use the color profile embedded in the file.\nIf unavailable, fall back to Camera standard 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 @@ -2636,9 +2743,16 @@ TP_ICM_SAVEREFERENCE_TOOLTIP;Save the linear TIFF image before the input profile TP_ICM_TONECURVE;Tone curve TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only available if the selected DCP has a tone curve. TP_ICM_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_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 three main uses - channel mixer, restore image color (saturation), 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_CAT;Matrix adaptation +TP_ICM_WORKING_CAT_BRAD;Bradford +TP_ICM_WORKING_CAT_CAT02;Cat02 +TP_ICM_WORKING_CAT_CAT16;Cat16 +TP_ICM_WORKING_CAT_TOOLTIP;Performs the chromatic adaptation of the XYZ conversion matrix. Default: Bradford +TP_ICM_WORKING_CAT_VK;Von Kries +TP_ICM_WORKING_CAT_XYZ;XYZ scale TP_ICM_WORKING_CIEDIAG;CIE xy diagram TP_ICM_WORKING_ILLU;Illuminant TP_ICM_WORKING_ILLU_1500;Tungsten 1500K @@ -2650,11 +2764,13 @@ 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_E;E TP_ICM_WORKING_ILLU_NONE;Default TP_ICM_WORKING_ILLU_STDA;stdA 2875K +TP_ICM_WORKING_NON;None 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_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination primaries' combo box, 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 @@ -2663,11 +2779,14 @@ 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_FREE;Custom LA (sliders) TP_ICM_WORKING_PRIM_JDCMAX;JDC Max +TP_ICM_WORKING_PRIM_JDCMAXSTDA;JDC Max stdA 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_TOOLTIP;Performs a gamut control. Destination primaries (Advanced) allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified.\nWhen 'Custom LA (sliders)' is selected, you can modify the values of the 3 primaries (Red, Green, and Blue) for x and y. TP_ICM_WORKING_PRIM_WID;WideGamut TP_ICM_WORKING_TRC;Tone response curve: TP_ICM_WORKING_TRC_18;Prophoto g=1.8 @@ -2725,6 +2844,7 @@ TP_LENSGEOM_LOG;Logarithmic TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected +TP_LENSPROFILE_CORRECTION_METADATA;From file metadata TP_LENSPROFILE_LABEL;Profiled Lens Correction TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. TP_LENSPROFILE_MODE_HEADER;Lens Profile @@ -2744,9 +2864,9 @@ 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_AUTOGRAYCIE;Automatic 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_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab). Default: Munsell only.\n\nMunsell only: 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. The result is not the same as Lab. 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 @@ -2789,9 +2909,12 @@ TP_LOCALLAB_BUTTON_DEL;Delete TP_LOCALLAB_BUTTON_DUPL;Duplicate TP_LOCALLAB_BUTTON_REN;Rename TP_LOCALLAB_BUTTON_VIS;Show/Hide +TP_LOCALLAB_BWEVNONE;None +TP_LOCALLAB_BWEVSIG;Activated +TP_LOCALLAB_BWEVSIGLOG;Sigmoid & Log-Encoding 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_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16 (experimental). 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, for example, to match CAM16 processing with the maximum monitor brightness of 400cd/m2. TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments TP_LOCALLAB_CAMMODE;CAM model TP_LOCALLAB_CAMMODE_CAM16;CAM 16 @@ -2831,6 +2954,12 @@ 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_SMOOTHFRAME;Highlight Attenuation & Levels +TP_LOCALLAB_CIE_SMOOTH_EV;Ev based +TP_LOCALLAB_CIE_SMOOTH_GAMMA;Slope based +TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF;Gamma based +TP_LOCALLAB_CIE_SMOOTH_LEVELS;Levels +TP_LOCALLAB_CIE_SMOOTH_NONE;None TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) TP_LOCALLAB_CIRCRADIUS;Spot size TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the 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. @@ -2846,8 +2975,9 @@ TP_LOCALLAB_CLARI_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLev 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_COLORDEPREV_TOOLTIP;Preview ΔE button in Settings will only work if you have activated 'Sharpening', 'Soft Light and Original Retinex', 'Blur/Grain and Denoise', 'Dehaze and Retinex', or 'Contrast by Detail Levels' in the 'Add tool to current spot' menu.\nFor others tools, the Preview ΔE button is in the tool, which allows previewing ΔE with several tools enabled. Prefer using Mask and modifications. 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_COLORFRAME;Dominant color 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 @@ -2855,7 +2985,10 @@ TP_LOCALLAB_COLOR_TOOLNAME;Color & Light TP_LOCALLAB_COL_NAME;Name TP_LOCALLAB_COL_VIS;Status TP_LOCALLAB_COMPFRA;Directional contrast +TP_LOCALLAB_COMPRCIE;Brightness compression +TP_LOCALLAB_COMPRCIETH;Compression threshold TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +TP_LOCALLAB_COMPRLOG_TOOLTIP;This algorithm compress the data before log conversion, above the threshold slider value. To use in conjunction with Whites distribution. TP_LOCALLAB_CONTCOL;Contrast threshold TP_LOCALLAB_CONTFRA;Contrast by level TP_LOCALLAB_CONTRAST;Contrast @@ -2870,7 +3003,7 @@ 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 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 spot. -TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combo box 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. @@ -2879,13 +3012,14 @@ TP_LOCALLAB_CURVNONE;Disable curves TP_LOCALLAB_DARKRETI;Darkness TP_LOCALLAB_DEHAFRA;Dehaze TP_LOCALLAB_DEHAZ;Strength +TP_LOCALLAB_DEHAZE_BLACK;Black 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_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. @@ -2905,6 +3039,7 @@ TP_LOCALLAB_DETAIL;Local contrast TP_LOCALLAB_DETAILFRA;Edge detection - DCT TP_LOCALLAB_DETAILSH;Details TP_LOCALLAB_DETAILTHR;Lum/chrom detail threshold +TP_LOCALLAB_DISAB_CIECAM;Disable Ciecam or Weak Jz surround TP_LOCALLAB_DIVGR;Gamma TP_LOCALLAB_DUPLSPOTNAME;Copy TP_LOCALLAB_EDGFRA;Edge sharpness @@ -2913,6 +3048,7 @@ 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_ENABLE_MASKALL;Enable all mask tools 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 @@ -2928,9 +3064,10 @@ 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_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all selective editing data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\nUse 'Scope' (Excluding) to set the exclusion intensity.\n\n'Full image' allows you to use the selective editing tools on the whole image.\nThe RT Spot delimiters are set beyond the image preview boundaries.\nThe 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.\nNote: 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.\n\n'Global' allows you to use the selective editing tools on the whole image, without using Delta E or transitions. TP_LOCALLAB_EXECLU;Excluding spot TP_LOCALLAB_EXFULL;Full image +TP_LOCALLAB_EXMAIN;Global 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 @@ -2939,11 +3076,11 @@ TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small 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_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Selective Editing 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 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_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. @@ -2965,7 +3102,8 @@ TP_LOCALLAB_FATLEVEL;Sigma TP_LOCALLAB_FATSAT;Saturation control 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_FEATVALUE;Feather gradient +TP_LOCALLAB_FEATVALUE_MASK;Feather gradient (Grad. Filters Mask) 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 @@ -3061,7 +3199,7 @@ 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_LABEL;Selective Editing 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 @@ -3106,8 +3244,10 @@ TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;Automatically calculates the 'Mean luminance' fo 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_LOGCIE;Log encoding +TP_LOCALLAB_LOGCIEQ;Log Encoding Q (with Ciecam) +TP_LOCALLAB_LOGCIEQ_TOOLTIP;Activating the checkbox allows you to switch between log encoding based on the 3 RGB channels, and log encoding based solely on Ciecam’s brightness (Q) channel.\nUsing the Q channel instead of the RGB channels helps avoid undesirable edge effects such as hue and saturation shifts.\nHowever, the settings are more difficult to optimise because Q is unbounded and Ciecam alters the data to take into account the surround conditions, simultaneous contrast, etc.\nYou may have to adjust the following:\n Scene conditions: Mean luminance (Yb), Whites & Blacks distribution, Black Ev, White Ev.\n Source Data Adjustments : Brightness compression, Strength.\n\nNote: when using Log Encoding (Q), be careful not to activate the Disable Ciecam option in the Scene Conditions, Surround menu. +TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you to use Black Ev, White Ev, White and Black distribution, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using 'Log encoding' with Brightness compression. 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) @@ -3115,7 +3255,7 @@ 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_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 @@ -3128,6 +3268,7 @@ 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_LOGPFRA2;Log Encoding settings 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. @@ -3142,7 +3283,7 @@ 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_LUMLABEL;Luma levels 0123: Mean=%1 High=%2 +TP_LOCALLAB_LUMLABEL;Luma levels 0123: Mean=%1 High=%2 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 @@ -3197,7 +3338,7 @@ TP_LOCALLAB_MASKRESRETI_TOOLTIP;Used to modulate the effect of the Retinex (Lumi 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_MASKUNUSABLE;Mask disabled (Enable in 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 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 @@ -3233,6 +3374,7 @@ 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_MIDTCIE;Midtones 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 @@ -3280,10 +3422,15 @@ TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the 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_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_PRECAMGAMUT_TOOLTIP;If checked, ensures a gamut control just after primary conversion to XYZ. +TP_LOCALLAB_PRECAMREFIMAIN_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. In combination with "Shift x" and "Shift y", allows you to carry out moderate color toning. +TP_LOCALLAB_PRECAMREFI_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. +TP_LOCALLAB_PRECAM_TOOLTIP;'Source Data Adjustments' modifies the Dynamic Range using Log encoding, the tones of the image and primaries (simplified Abstract Profile), and midtones, just before the Ciecam process. These values are adjustable:\nGamma: Acts mainly on light tones\nSlope: Acts mainly on dark tones. You 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.\nDestination primaries: Allows you to change the destination primaries to restore or change image color (saturation). The color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are similar. 'Working Profile' is not modified. You can also finely adapt the primaries and the illuminant (white-point). Moving a primary away from the white point reduces saturation and vice versa. Pay attention to the gamut. TP_LOCALLAB_PREVHIDE;Hide additional settings TP_LOCALLAB_PREVIEW;Preview ΔE TP_LOCALLAB_PREVSHOW;Show additional settings +TP_LOCALLAB_PRIMILLFRAME;Primaries & Illuminant TP_LOCALLAB_PROXI;ΔE decay TP_LOCALLAB_QUAAGRES;Aggressive TP_LOCALLAB_QUACONSER;Conservative @@ -3328,10 +3475,11 @@ TP_LOCALLAB_RETI_SCALE_TOOLTIP;If Scale=1, Retinex behaves like local contrast w 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_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_SATCIE;Saturation control TP_LOCALLAB_SATUR;Saturation TP_LOCALLAB_SATURV;Saturation (s) TP_LOCALLAB_SCALEGR;Scale @@ -3352,7 +3500,7 @@ 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_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;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. @@ -3398,17 +3546,41 @@ 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_SIGBLACKSSCIE;Blacks distribution +TP_LOCALLAB_SIGCIE;Sigmoid +TP_LOCALLAB_SIGFRA;Sigmoid Q +TP_LOCALLAB_SIGGAMJCIE;Gamma TP_LOCALLAB_SIGJZFRA;Sigmoid Jz TP_LOCALLAB_SIGMAWAV;Attenuation response +TP_LOCALLAB_SIGMOID16_TOOLTIP;Allows you to simulate a tone mapping appearance using both 'Ciecam' and 'Sigmoid Q'. Sigmoid Q has three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc) Adaptability weights the action of the sigmoid by action on the internal exponential function. TP_LOCALLAB_SIGMOIDBL;Blend TP_LOCALLAB_SIGMOIDLAMBDA;Contrast -TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +TP_LOCALLAB_SIGMOIDLOGAUTO;Auto threshold +TP_LOCALLAB_SIGMOIDLOGEV_TOOLTIP;If the combo box selection 'Black Ev and White Ev' is 'Sigmoid and Log encoding' instead of 'Sigmoid only', the two algorithms 'Log encoding' and 'Sigmoid' are used together. +TP_LOCALLAB_SIGMOIDNORMCIE;Normalize Luminance +TP_LOCALLAB_SIGMOIDNORMCIEBLEND_TOOLTIP;Blend acts on the final aspect of the image, contrast and luminance. Ratio between original and output image. +TP_LOCALLAB_SIGMOIDNORMCIE_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image take into account those of the original.\nAll the adjustments acting on J or Q are taken into account, including those which are not relative to Sigmoid Q. +TP_LOCALLAB_SIGMOIDQJ;Black Ev & White Ev +TP_LOCALLAB_SIGMOIDQJCOMPRCIE_TOOLTIP;When the combo box selection 'Uses Black Ev and White Ev' is 'Sigmoid and Log encoding Q' or 'Log encoding instead of Sigmoid' checked. This algorithm compress the data above the threshold slider value. The last value stands for brightness (Q) and should be close as possible to the value 'Compression threshold' (calculate when 'Auto threshold" checked, often > 1). +TP_LOCALLAB_SIGMOIDSENSI;Adaptability 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_SIGMOIDWHITESCIE_TOOLTIP;Allows you, in Automatic when the dynamic range of the image is high, to change the distribution of lights in whites and deep blacks.\nCan be used with Log encoding or Sigmoid with Black Ev and White Ev enabled.\n\nThe algorithm does not change the basic data, but acts on the components necessary to calculate the Dynamic range, Black Ev, White Ev and the Gray point. +TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a tone mapping appearance using both the 'Jz' and 'Sigmoid' function. Three sliders:\na) Contrast acts on the shape of the sigmoid curve and consequently on the strength\nb) Threshold (Gray point) distributes the action according to the luminance\nc)Blend acts on the final aspect of the image, contrast and luminance. +TP_LOCALLAB_SIGSLOPJCIE;Slope +TP_LOCALLAB_SIGTRCCIE;Source Data Adjustments +TP_LOCALLAB_SIGWHITESCIE;Whites distribution 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_SLOPESMOOTH;Gray balance (Slope) +TP_LOCALLAB_SLOPESMOOTHB;Blue balance (Slope) +TP_LOCALLAB_SLOPESMOOTHG;Green balance (Slope) +TP_LOCALLAB_SLOPESMOOTHR;Red balance (Slope) TP_LOCALLAB_SLOSH;Slope +TP_LOCALLAB_SMOOTHCIE;Highlight Attenuation +TP_LOCALLAB_SMOOTHCIE_LUM;Luminosity mode +TP_LOCALLAB_SMOOTHCIE_SCA;Scale Yb Scene +TP_LOCALLAB_SMOOTHCIE_TOOLTIP;Completes the processing carried out by gamma, slope and midtones by causing a slight lowering of lights. Please note this does not replace Highlight reconstruction.\n\nGamma based and Slope based (Standard and Advanced) allow you to simulate a tone mapping using:\na) Scene conditions: Black-Ev, White-Ev, Mean luminance (Yb%)\nb) Viewing conditions: Mean luminance (Yb%).\n\nScale Yb Scene is function of White-Ev. +TP_LOCALLAB_SMOOTHCIE_YB;Scale Yb Viewing 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. @@ -3430,13 +3602,14 @@ 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_STRENGTHCIELOG;Strength 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_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. @@ -3468,11 +3641,12 @@ 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_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_TRCFRAME;Tone Response Curve & Midtones TP_LOCALLAB_USEMASK;Laplacian TP_LOCALLAB_VART;Variance (contrast) TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool @@ -4126,7 +4300,7 @@ TP_WAVELET_WAVOFFSET;Offset TP_WBALANCE_AUTO;Auto TP_WBALANCE_AUTOITCGREEN;Temperature correlation TP_WBALANCE_AUTOOLD;RGB grey -TP_WBALANCE_AUTO_HEADER;Automatic & Refinement +TP_WBALANCE_AUTO_HEADER;Automatic & Refinement TP_WBALANCE_CAMERA;Camera TP_WBALANCE_CLOUDY;Cloudy TP_WBALANCE_CUSTOM;Custom @@ -4202,7 +4376,7 @@ 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_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).\nIn the rare case of a color drift with "Observer 2°" (probably due to the conversion matrix) "Observer 10°" must be selected. TP_WBALANCE_PATCHLABEL;Read colors:%1 Patch: Chroma:%2 Size=%3 TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colors (max=237).\nDisplay calculated Patch Chroma.\nAWB temperature bias, lets try to reduce this value, a minimum may seem to optimize the algorithm.\n\nPatch size matching chroma optimization. TP_WBALANCE_PATCHLEVELLABEL;Patch: ΔE=%1 - datas x 9 Min:%2 Max=%3 diff --git a/rtdata/options/options.lin b/rtdata/options/options.lin index fbd8bc6cb..18cb01901 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;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; +ParseExtensions= +ParseExtensionsEnabled= [Output] PathTemplate=%p1/converted/%f diff --git a/rtdata/options/options.osx b/rtdata/options/options.osx index cf31210e6..8d954529f 100644 --- a/rtdata/options/options.osx +++ b/rtdata/options/options.osx @@ -13,8 +13,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;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; +ParseExtensions= +ParseExtensionsEnabled= [Output] PathTemplate=%p1/converted/%f @@ -37,8 +37,3 @@ CustomProfileBuilder= # Default profile name (without extension) to use for standard (8bits) images #ImgDefault=Neutral - -[GUI] -# 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 00b74d07f..a88cc3db2 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;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; +ParseExtensions= +ParseExtensionsEnabled= [Output] PathTemplate=%p1/converted/%f diff --git a/rtdata/themes/RawTherapee - Legacy-GTK3-20_.css b/rtdata/themes/RawTherapee - Legacy.css similarity index 99% rename from rtdata/themes/RawTherapee - Legacy-GTK3-20_.css rename to rtdata/themes/RawTherapee - Legacy.css index ba62fd366..2a8ae4adc 100644 --- a/rtdata/themes/RawTherapee - Legacy-GTK3-20_.css +++ b/rtdata/themes/RawTherapee - Legacy.css @@ -20,7 +20,7 @@ */ /***************************/ -/**/ @import "size - Legacy.css"; /**/ +/**/ @import url("./common/size - Legacy.css"); /**/ /***************************/ /* text-shadow causes a serious performance degradation in rendering the UI, diff --git a/rtdata/themes/RawTherapee-GTK3-_19.css b/rtdata/themes/RawTherapee-GTK3-_19.css deleted file mode 100644 index f4bec23b1..000000000 --- a/rtdata/themes/RawTherapee-GTK3-_19.css +++ /dev/null @@ -1,525 +0,0 @@ -/* - This file is part of RawTherapee. - - Copyright (c) 2015-2017 DrSlony - Copyright (c) 2016-2017 Hombre - - 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 . -*/ - -* { - color: #AAAAAA; -} - -.view:selected { - color: #262626; - background-color: #AAAAAA -} - -/* The Places and Dir browser panels */ -.view { - background-color: #262626; -} -/* The headers of these panels */ -.view .button { - background-color: #363636; - padding: 2px; -} - -.plainback { - background-color: #404040; -} - -GtkBox { - border-width: 0; - border-style: none; - border-radius: 0; - margin: 0; - padding: 0; -} - -GtkGrid { - margin: 2px; - padding: 0; - border-width: 0; - border-style: none; - border-radius: 0; -} - -/* Affects all frames except in the toolbox */ -GtkFrame { - border-width: 0; - border-color: #303030; - border-radius: 0; - border-style: solid; - /*border-style: none none none solid;*/ - padding: 4px; -} - -GtkFrame > GtkLabel { - color: #D8D8D8; -} - -#FileBrowser { - padding: 10px; - margin: 10px; -} - -/* Frames in Preferences */ -#PrefNotebook GtkFrame { - background-color: #3B3B3B; - border: 1px solid #505050; - border-radius: 4px; -} - -/* Frames in the toolbox. Not MyExpander frames. */ -GtkEventBox .frame { - border-color: #565656; -} - -/*.EditorTopPanel .button, .ToolBarPanelFileBrowser .button, .EditorZoomPanel .button {*/ -.button { - padding: 1px; - margin: 1px; -} - -/* Adjusters */ -.text-button { - padding: 0; -} - -/* Any text-button which is a real button, unlike Slider label */ -.text-button.button { - padding: 4px; -} - -.separator { - color: #363636; -} - -GtkProgressBar { - -GtkProgressBar-min-vertical-bar-width: 10; - -GtkProgressBar-min-horizontal-bar-height: 10; -} - -GtkDrawingArea { - border-radius: 0; - background-color: #363636; - border: 1px solid #252525; -} - -GtkDrawingArea:selected { - background-color: #565656; - border-radius: 10px; -} - -GtkImage { - padding: 1px; -} - - - - - -GtkScale.slider { - margin: 1px; -} -GtkScale.slider:hover { - background-image: linear-gradient(#444444, #3E3E3E, #393939); -} -GtkScale.slider:insensitive { - background-image: none; - background-color: #444; - border-color: #282828; -} -GtkScale.trough { - background-color: #2A2A2A; -} -GtkScale.trough:insensitive { - background-color: #444; - border-color: #282828; -} - - - -GtkLabel { - margin: 0 1px; -} - - -GtkButton { - padding: 0; - margin: 1px; -} -GtkButton, GtkButton.flat:hover { - background-image: linear-gradient(#343434, #2E2E2E, #292929); -} - -GtkButton.flat, GtkCheckButton { - background-image: none; -} - -/* Vertical group of buttons in 1 column */ -GtkButton.Top { - border-radius: 10px 4px 0 0; - border-style: solid solid none solid; - margin-bottom: 0; -} -GtkButton.MiddleV { - border-radius: 0; - border-style: none solid none solid; - margin-top: 0; - margin-bottom: 0; -} -GtkButton.Bottom { - border-radius: 0 0 4px 4px; - border-style: none solid solid solid; - margin-top: 0; -} -/* end */ - -/* Horizontal group of buttons in 1 row */ -GtkButton.Left { - border-radius: 4px 0 0 4px; - border-style: solid none solid solid; - margin-right: 0; -} -GtkButton.MiddleH { - border-radius: 0; - border-style: solid none solid none; - margin-left: 0; - margin-right: 0; -} -GtkButton.Right { - border-radius: 0 4px 4px 0; - border-style: solid solid solid none; - margin-left: 0; -} -/* end */ - -/* [1.23[-][+]] */ -GtkEntry, GtkSpinButton { - background-color: #262626; -} - -GtkEntry:insensitive, GtkSpinButton:insensitive { - background-color: #363636; -} - -GtkEntry:hover, GtkSpinButton:hover { - background-color: #565656; -} - -GtkEntry:selected { - color: #262626; - background-color: #AAAAAA; -} - -/* Context menus */ -GtkMenu { - background-color: #262626; - color: #909090; -} - -/* Context menu item */ -.menuitem { - padding: 2px; -} - -#MyExpander { - margin: 10px; - padding: 5px; -} - -/* Tool background */ -#ExpanderBox { - background-color: #363636; - border-width: 1px; - border-style: solid; - border-radius: 4px; - border-color: #252525; - margin: 9px; - padding: 4px; -} - -#ExpanderBox GtkDrawingArea { - background-color: #363636; -} - -#ExpanderBox GtkFrame { - background-color: #3B3B3B; - border-style: solid; - border-width: 1px; - border-radius: 4px; - border-color: #313131; - margin: 3px; - padding: 2px; -} - -#ExpanderBox GtkFrame GtkDrawingArea { - background-color: #3B3B3B; -} - -#ExpanderBox GtkFrame GtkFrame { - background-color: #414141; - border: 1px solid #373737; - border-radius: 4px; - margin: 3px; - padding: 2px; -} - -#ExpanderBox GtkFrame GtkFrame GtkDrawingArea { - background-color: #414141; -} - -/* Sub-tool (MyExpander) background */ -#ExpanderBox2 { - background-color: #3B3B3B; - border: 1px solid #2A2A2A; - border-radius: 4px; - margin: 9px; - padding: 4px; -} - -#ExpanderBox2 GtkDrawingArea { - background-color: #3B3B3B; -} - -#ExpanderBox2 GtkFrame { - background-color: #414141; - border: 1px solid #373737; - border-radius: 4px; - margin: 3px; - padding: 2px; -} - -#ExpanderBox2 GtkFrame GtkDrawingArea { - background-color: #414141; -} - -#ExpanderBox2 GtkFrame GtkFrame { - background-color: #474747; - border: 1px solid #3D3D3D; - border-radius: 4px; - margin: 3px; - padding: 2px; -} - -#ExpanderBox2 GtkFrame GtkFrame GtkDrawingArea { - background-color: #474747; -} - -#MyExpanderTitle { - margin: 5px; - padding: 3px 1px 3px 1px; - font-size: 120%; -} -#MyExpanderTitle GtkLabel { - color: #CCCCCC; -} -#MyExpanderTitle:hover { - background-color: #202020; -} -#MyExpanderTitle GtkEventBox:hover GtkImage { - background-color: #202020; - border-radius: 3px; -} -#MyExpanderTitle:hover GtkLabel { - color: #D8D8D8; -} - -#ExpanderBox2 GtkSeparator, #ExpanderBox3 GtkSeparator { - color: #292929; -} - -/* Editor tab button */ -#MainNotebook > GtkGrid GtkLabel, #MainNotebook > GtkGrid GtkImage { - /* OK */ - padding: 1px; -} - -/* File Browser right side tabs - Toolbox, Inspector, Fast Export, Filter */ -GtkNotebook tab { - background-color: #383838; - border-width: 1px; - border-style: none; - border-color: #262626; - border-radius: 0; - padding: 3px; -} - -GtkNotebook tab:hover { - background-color: #505050; -} - -GtkNotebook tab:active { - border-width: 5px; - border-color: #989898; -} - -/* Get rid of shitty notebook header shadow */ -GtkNotebook.top tab { - border-bottom-style: solid; - padding-bottom: 8px; -} -GtkNotebook.right tab { - border-left-style: solid; - padding-left: 8px; -} -GtkNotebook.bottom tab { - border-top-style: solid; - padding-top: 8px; -} -GtkNotebook.left tab { - border-right-style: solid; - padding-right: 8px; -} - -/* Get rid of notebook frame border - too many borders */ -GtkNotebook.top.header, GtkNotebook.right.header, GtkNotebook.bottom.header, GtkNotebook.left.header { - box-shadow: none; - border-width: 1px; - border-color: #262626; - border-style: none; - border-radius: 0; - background-color: #383838; - padding: 0; -} -/* Get rid of notebook header border - too many borders */ -GtkNotebook.top.header { - /* OK */ - border-bottom-style: solid; -} -GtkNotebook.right.header { - /* OK */ - border-left-style: solid; -} -GtkNotebook.bottom.header { - /* OK */ - border-top-style: solid; -} -GtkNotebook.left.header { - /* OK */ - border-right-style: solid; -} -GtkNotebook.frame { - /* OK */ - border-radius: 0; - border-style: none; -} - -/* Pad notebooks, makes the other borders look nicer */ -GtkNotebook { - /* OK */ - background-color: #484848; - padding: 0; -} - - -#MainNotebook.header { - /* OK */ - background-color: #2A2A2A; -} -#MainNotebook > tab { - /* OK */ - background-color: #2A2A2A; -} -#MainNotebook > tab:hover { - /* OK */ - background-color: #505050; -} -#MainNotebook > tab:active { - /* OK */ - border-color: #989898; -} - -#RightNotebook.header { - /* OK */ - background-color: #2A2A2A; -} -#RightNotebook > tab { - /* OK */ - background-color: #2A2A2A; -} -#RightNotebook > tab:hover { - /* OK */ - background-color: #505050; -} -#RightNotebook > tab:active { - /* OK */ - border-color: #989898; -} - - -/* 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.frame { - border: 1px solid #262626; - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - border-top-left-radius: 0; - border-top-right-radius: 0; - border-top-width: 0; -} - -#MetaPanelNotebook.header { - border: 1px solid #262626; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - border-bottom-width: 0; - padding: 5px; - margin: 5px; -} - -.tooltip { - padding: 0; -} - - -/* make the "partial profile" dialog a little bit more readable */ -#PartialPasteHeader { - margin: 1.5em 0 0 0; - padding: 0; - font-weight: bold; - color: #363636; -} - -#PartialPasteHeaderSep { - color: #D8D8D8; -} - - -#MyFileChooserButton { - padding-left: 3px; - padding-right: 3px; -} - -/* Better on/off state separation for text toggle buttons, e.g. auto-levels or histogram matching. */ -GtkToggleButton.button.text-button { - background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3)); -} - -GtkToggleButton.button.text-button:hover { - background-image: linear-gradient(to bottom, rgba(128,128,128,.3), rgba(64,64,64,.3)); -} - -GtkToggleButton.button.text-button:checked { - background-image: linear-gradient(to bottom, rgba(30,30,30,.3), rgba(0,0,0,.4)); -} - -GtkToggleButton.button.text-button:hover:checked { - background-image: linear-gradient(to bottom, rgba(48,48,48,.3), rgba(0,0,0,.3)); -} diff --git a/rtdata/themes/RawTherapee-GTK3-20_.css b/rtdata/themes/RawTherapee.css similarity index 99% rename from rtdata/themes/RawTherapee-GTK3-20_.css rename to rtdata/themes/RawTherapee.css index b69e543d1..486181ba9 100644 --- a/rtdata/themes/RawTherapee-GTK3-20_.css +++ b/rtdata/themes/RawTherapee.css @@ -19,14 +19,13 @@ */ /***************************/ -/**/ @import "size.css"; /**/ /* TODO: Remove this weird dependency */ +/**/ @import url("./common/size.css"); /**/ /* TODO: Remove this weird dependency */ /***************************/ /** Set style defaults **/ * { color: #BBBBBB; text-shadow: none; /* Keep at none, or suffer serious performance issues */ - font-size: 1em; } *:disabled { @@ -1068,7 +1067,7 @@ dialog frame > label:not(.dummy) { } #ToolPanelNotebook viewport { - padding: 0; + padding: 0; } #ToolPanelNotebook .PanelEnding { @@ -1226,7 +1225,7 @@ dialog frame > label:not(.dummy) { border-top-width: 0.083333333333333333em; } -#Navigator box label { +#Navigator box label { margin: 0; padding: 0; } @@ -1301,6 +1300,11 @@ combobox, .popupbutton-arrow { min-height: 2em; } +/* Visual divider between the icon and arrow in the pop-up button. */ +.image-combo button.Left { + border-right: solid 0.083333333333333333em #202020; +} + /* Makes image-combobox small icons centered */ button.toggle > grid > image { padding: 0.3333333333333333em; diff --git a/rtdata/themes/TooWaBlue - Bright-GTK3-20_.css b/rtdata/themes/TooWaBlue - Bright.css similarity index 98% rename from rtdata/themes/TooWaBlue - Bright-GTK3-20_.css rename to rtdata/themes/TooWaBlue - Bright.css index 19e2eb049..6b12db47c 100644 --- a/rtdata/themes/TooWaBlue - Bright-GTK3-20_.css +++ b/rtdata/themes/TooWaBlue - Bright.css @@ -20,7 +20,7 @@ /*****************************************/ -/**/ @import "TooWaBlue-GTK3-20_.css"; /**/ +/**/ @import "TooWaBlue.css"; /**/ /*****************************************/ /*** Change me *** rgb(red,green,blue) *** allowed values from 0 to 255 for each color ***/ diff --git a/rtdata/themes/TooWaBlue - Dark-GTK3-20_.css b/rtdata/themes/TooWaBlue - Dark.css similarity index 98% rename from rtdata/themes/TooWaBlue - Dark-GTK3-20_.css rename to rtdata/themes/TooWaBlue - Dark.css index 5875e2132..d9ca22dff 100644 --- a/rtdata/themes/TooWaBlue - Dark-GTK3-20_.css +++ b/rtdata/themes/TooWaBlue - Dark.css @@ -20,7 +20,7 @@ /*****************************************/ -/**/ @import "TooWaBlue-GTK3-20_.css"; /**/ +/**/ @import "TooWaBlue.css"; /**/ /*****************************************/ /*** Change me *** rgb(red,green,blue) *** allowed values from 0 to 255 for each color ***/ diff --git a/rtdata/themes/TooWaBlue-GTK3-_19.css b/rtdata/themes/TooWaBlue-GTK3-_19.css deleted file mode 100644 index 31676ca8d..000000000 --- a/rtdata/themes/TooWaBlue-GTK3-_19.css +++ /dev/null @@ -1,881 +0,0 @@ -/* - This file is part of RawTherapee. - - Copyright (c) 2016 TooWaBoo (v1.19.5) - Many thanks to the RawTherapee Developer Team for this great piece of software - - 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 . -*/ - -/*** Change me *** rgb(red,green,blue) *** allowed values from 0 to 255 for each color ***/ - -@define-color accent-color rgb(35,99,166); /*** Highlight/selected color for Tab indicator, List, Dropdown menu, Borders ... ***/ -@define-color text-hl-color rgb(210,210,210); /*** Highlight/selected text color ***/ - -@define-color accent-color2 rgb(35,99,166); /*** Slider, Progressbar, Scrollbar ***/ -@define-color accent-color4 rgb(35,99,166); /*** Slider knob ***/ - -@define-color accent-color3 rgb(35,99,166); /*** Selected thumbnail background color ***/ -@define-color text-hl-color3 rgb(210,210,210); /*** Selected thumbnail text color ***/ - -/*** Change me end ************************************************************************/ - -@define-color text-color rgb(180,180,180); -@define-color text-hl-color2 rgb(192,192,192); -@define-color text-tbEntry rgb(192,192,192); -@define-color bg-dark-grey rgb(36,36,36); -@define-color bg-grey rgb(70,70,70); -@define-color bg-light-grey rgb(88,88,88); -@define-color border-color rgba(255,255,255,.25); -@define-color bg-list-hover rgba(255,255,255,.065); -@define-color bg-scale-entry rgba(0,0,0,.14); -@define-color bg-button-border rgba(0,0,0,.48); -@define-color bg-button-border-hover rgba(0,0,0,.58); -@define-color bg-entry-border rgba(0,0,0,.40); -@define-color bg-button-hover rgba(0,0,0,.22); -@define-color bg-spin-button-hover rgba(0,0,0,.25); -@define-color bg-entry-IPTC @bg-dark-grey; -@define-color view-grid-border rgb(64,64,64); - -* { - color: @text-color; - transition: none; - text-shadow: none; - icon-shadow: none; - box-shadow: none; - outline-style: none; /* removes the ugly dotted focus line */ - border-image: none; - -GtkCheckButton-indicator-size: 16; - -GtkCheckMenuItem-indicator-size: 16; - -GtkCheckButton-indicator-spacing: 2; -} - -.undershoot { - background-image: none; /* removes the dotted scrollbar line */ -} -GtkWindow { - background-color: @bg-light-grey; -} -GtkDialog { - background-color: @bg-grey; - -GtkDialog-content-area-spacing: 7; - -GtkDialog-action-area-border: 0; - -GtkDialog-content-area-border: 8; -} - -GtkFontChooser, -GtkColorChooser { - -GtkDialog-action-area-border: 4; - -GtkDialog-content-area-border: 0; -} - -.frame { - border: none; -} -#PrefNotebook > .frame { - border: 1px solid rgba(0,0,0,.50); - border-top: none; -} -#BatchQueueButtonsMainContainer GtkFrame { - padding: 4px 4px 4px 10px; -} - -/*** Add space between buttons and image area***/ -#BeforeAfterContainer GtkFrame { - padding: 2px 0 4px; -} -/*** Add space between before/after image ***/ -#BeforeAfterContainer GtkContainer:nth-child(1) > GtkContainer:nth-child(2) GtkFrame { - padding-right: 14px; -} - -/*** Menu bubble box ***/ -GtkPopover { - background-color: @bg-grey; - border: 1px solid @accent-color; - border-radius: 0; -} - -.menu { - background-color: @bg-dark-grey; - border: 1px solid @accent-color; -} -.menu > .menuitem { - padding: 2px 4px; -} -.menu > .menuitem:hover { - background-color: @accent-color; -} -.menu > .menuitem:hover > * > *, -.menu > .menuitem:hover > * { - color: @text-hl-color; -} - -GtkNotebook { - padding: 4px; - background-color: @bg-light-grey; -} -GtkDialog GtkNotebook { - padding: 2px 0 0; -} -#PrefNotebook { - padding: 4px 8px; -} -#RightNotebook { - padding: 0 0 0 4px; -} - -GtkPaned { - -GtkPaned-handle-size: 4px; - background-color: transparent; -} -.pane-separator { - background-color: @bg-light-grey; -} -GtkDialog .pane-separator { - background-color: @bg-grey; -} - -/*** Separator ***/ -.separator { - color: @bg-light-grey; -} -GtkDialog .separator { - color: @border-color; -} -#RightNotebook .separator { - color: @bg-dark-grey; -} - /*** Navigator ***/ -#Navigator .separator { - color: @view-grid-border; -} -/*** end ***/ - -/*** Background color image area***/ -GtkDrawingArea { - background-color: @bg-grey; - border: 1px solid rgba(0,0,0,.32); -} -/*** Histogram ***/ -#HistogramPanel, -#HistogramArea { - background-color: @bg-dark-grey; - border: none; -} -/*** Histogram RGB-Bar***/ -#HistogramRGBArea { - background-color: rgb(128,128,128); - border: none; -} -/*** Navigator ***/ -#Navigator GtkDrawingArea { - background-color: @bg-dark-grey; - border: 1px solid @bg-dark-grey; -} -#Navigator { - background-color: @bg-dark-grey; - border-top: 156px solid @bg-light-grey; -} - -#RightNotebook GtkDrawingArea { - background-color: @bg-dark-grey; -} - -/*** Label ***/ - .label { - padding: 0 4px; -} - /*** Increase space between labels in navigater ***/ -#Navigator .label { - padding: 6px 0 3px; -} -#Navigator GtkTable .label { - padding: 0 0 4px; -} - /***/ -GtkDialog .label, -#ToolPanelNotebook .label, -.notebook tab .label { - padding: 0 1px; -} -.button .label { - padding: 0; -} - - /*** Add left and right space between frame and labels ***/ -.frame > .label, -#ToolPanelNotebook .frame > .label { - padding: 4px; -} -#BatchQueueButtonsMainContainer GtkFrame:nth-child(3) > .label{ - padding: 2px 0px 4px; -} - -#MyExpanderTitle .label { - padding: 2px 3px; -} -/*** end ***/ - -.tooltip { - border-radius: 0; - padding: 0; -} -.tooltip.background { - background-color: @bg-dark-grey; - border: 1px solid @accent-color; -} - -/*** PartialPaste ***/ -#PartialPaste:nth-child(2) { - background-color: @bg-light-grey; - border: 1px solid rgba(0,0,0,.50); -} -#PartialPaste > .frame { - padding: 8px 10px; -} -#PartialPasteHeaderSep { - color: rgb(192,192,192); -} -#PartialPasteHeader .label { - color: rgb(213,213,213); -} -/*** end ***/ - -/*** Scrollbar ***/ -.scrollbar.trough { - background-color: rgba(0,0,0,.38); - background-image: none; - border: none; -} -.scrollbar.slider:active { - background-color: shade(@accent-color2,1.12); -} - -/*** end ***/ - -/*** Scale & Progressbar ***/ -.scale { - box-shadow: inset 0 1px rgba(255, 255, 255, 0.1), 0 1px rgba(242, 242, 242, 0.1); - -GtkRange-trough-border: 6; - -GtkScale-slider-length: 15; - -GtkRange-slider-width: 15; -} -.scale.trough, -#ToolPanelNotebook .scale.trough { - background-color: @bg-scale-entry; - border-color: @bg-dark-grey; - box-shadow: inset 0 1px rgba(255, 255, 255, 0.1), 0 1px rgba(242, 242, 242, 0.1); -} -.scale.trough.highlight, -#ToolPanelNotebook .scale.trough.highlight { - box-shadow: inset 0 1px rgba(255, 255, 255, 0.1), 0 1px rgba(242, 242, 242, 0.1); - background-image: none; - background-color: @accent-color2; - border: 1px solid @bg-dark-grey; - color: @text-hl-color2; -} -.scale.slider, -#ToolPanelNotebook .scale.slider { - background-image: linear-gradient(to bottom, shade (@accent-color4,1.15), shade (@accent-color4,.85)); - border: 1px solid shade(@bg-dark-grey, 1.25); - box-shadow: none; -} -.scale.fine-tune { - -GtkRange-trough-border: 5; -} -.scale.scale-has-marks-below { - -GtkRange-trough-border: 6; - -GtkScale-slider-length: 6; - -GtkRange-slider-width: 19; -} -.scale.slider.scale-has-marks-below { - border-radius: 0 0 20px 20px; - border: 1px solid @bg-dark-grey; -} -.scale.fine-tune.scale-has-marks-below { - -GtkRange-trough-border: 5; -} -.scale.slider:hover, -#ToolPanelNotebook .scale.slider:hover { - background-image: linear-gradient(to bottom, shade (@accent-color4,1.25), shade (@accent-color4,.95)); -} - -.scale.slider:active, -#ToolPanelNotebook .scale.slider:active { - background-image: linear-gradient(to bottom, shade (@accent-color4,1.25), shade (@accent-color4,.95)); -} - -GtkProgressBar { - -GtkProgressBar-min-vertical-bar-width: 8; - -GtkProgressBar-min-horizontal-bar-height: 8; - -GtkProgressBar-yspacing: 4px; - border-radius: 10px; - box-shadow: inset 0 1px rgba(255, 255, 255, 0.1), 0 1px rgba(242, 242, 242, 0.1); -} -.progressbar { - background-image: none; - background-color: @accent-color2; - border-color: @bg-dark-grey; -} -GtkProgressBar.trough { - background-image: none; - background-color: @bg-scale-entry; -} -#MainNotebook > GtkGrid GtkProgressBar { - box-shadow: none; -} -#MainNotebook > GtkGrid GtkProgressBar.trough { - background-image: none; - background-color: @bg-dark-grey; - border-color: @bg-dark-grey; -} -/*** end ***/ - -/*** Load/Save ***/ -GtkFileChooserWidget { - background-color: @bg-grey; -} -GtkFileChooserWidget > GtkBox { - border-bottom-color: @bg-dark-grey; -} -GtkFileChooserWidget GtkBox { - background-color: transparent; -} -GtkFileChooserWidget GtkListBox * { - padding-top: 1px; - padding-bottom: 1px; -} -GtkFileChooserWidget GtkListBox { - background-color: @bg-dark-grey; -} -GtkFileChooserWidget .list-row * { - padding: 1px 4px; -} -GtkFileChooserWidget .list-row:hover { - background-color: @bg-list-hover; -} -GtkFileChooserWidget .list-row:hover * { - color: @text-hl-color2; -} -GtkFileChooserWidget .list-row:selected { - background-color: @accent-color; -} -GtkFileChooserWidget .list-row:selected * { - color: @text-hl-color; -} -/*** end ***/ - -/*** Tab Bars ***/ -.notebook tab, .notebook.header { - background-color: @bg-dark-grey; - border-color: @bg-dark-grey; -} -#MainNotebook tab { - padding: 5px; -} -.notebook tab.top { - border-width: 0 0 5px 0; -} -.notebook tab.left { - border-width: 0 5px 0 0; -} -#RightNotebook tab.left, -#PrefNotebook tab, -GtkDialog tab { - padding: 9px; -} -#ToolPanelNotebook tab { - padding: 10px 2px 7px; -} -#MetaPanelNotebook tab { - padding: 8px 4px; -} - -.notebook tab:active { - border-color: @accent-color; -} - -/*** end ***/ - -/*** File Browser ***/ -#FileBrowser GtkDrawingArea { - background-color: @bg-grey; -} -#FileBrowser GtkDrawingArea:selected { - background-color: @accent-color3; - color: @text-hl-color3; -} -/*** end ***/ - -/*** Image ***/ -GtkImage { - padding: 0; -} -#MainNotebook > GtkGrid GtkImage { - padding: 1px; -} - -#ToolPanelNotebook GtkImage{ - padding: 0 4px; -} -#MyExpanderTitle GtkImage{ - padding: 0; -} - -#ToolPanelNotebook tab GtkImage, -#ToolPanelNotebook .button GtkImage { - padding: 1px 0; -} - -GtkDialog .button GtkImage{ - padding: 0; -} -GtkFileChooserWidget .button GtkImage{ - padding: 0 4px; -} -/*** end ***/ - -/*** Toolpanel ***/ -#ToolPanelNotebook { - background-color: @bg-dark-grey; - padding: 0; - border-top: 4px solid @bg-dark-grey; -} - -#ToolPanelNotebook GtkScrolledWindow GtkViewport.frame { - padding: 0 4px; -} -#ToolPanelNotebook .separator { - color: transparent; -} -#ToolPanelNotebook GtkFrame, -#PrefNotebook GtkFrame { - border: 1px solid @border-color; - border-radius: 0; - padding: 5px; -} - -#ToolPanelNotebook GtkDrawingArea { - background-color: @bg-dark-grey; - border-color: @bg-light-grey; - color: @text-color; -} -#ToolPanelNotebook GtkDrawingArea { - border-radius: 1px; /* BUG: if 0, scale mini sliders look funny */ -} - -#ExpanderBox #ExpanderBox, -#ExpanderBox2, -#ExpanderBox3 { - border: 1px solid @border-color; -} - -#ExpanderBox, -#ExpanderBox2, -#ExpanderBox3 { - background-color: @bg-grey; - border-radius: 0; -} - -#MyExpanderTitle .label { - color: @text-color; -} -#MyExpanderTitle:hover .label { - color: @text-hl-color2; -} -/*** end ***/ - -/*** View ***/ -.view { - background-color: @bg-dark-grey; - border-color: @view-grid-border; -} -#PrefNotebook .view { - background-color: @bg-grey; -} -#MainNotebook .view.cell:nth-child(2) { - padding: 1px 0px 1px 4px; -} -.view row:hover { - background-color: @bg-list-hover; - color: @text-hl-color2; -} -#PrefNotebook .view row:hover { - background-color: @bg-light-grey; - color: @text-hl-color2; -} -.view row:selected { - color: @text-hl-color; - background-color: @accent-color; -} -#PrefNotebook .view row:selected { - color: @text-hl-color; - background-color: @accent-color; -} -/*** end ***/ - -/*** Metadata ***/ -#MetaPanelNotebook { - padding: 8px 11px 0; -} -#MetaPanelNotebook GtkScrolledWindow GtkViewport.frame { - padding: 8px 10px; -} -#MetaPanelNotebook.frame { - background-color: @bg-grey; - border-bottom: none; - border-top: 4px solid @bg-dark-grey; - border-left: 9px solid @bg-dark-grey; - border-right: 9px solid @bg-dark-grey; -} -#MetaPanelNotebook .separator { - color: @border-color; -} -#MetaPanelNotebook.header { - background-color: @bg-dark-grey; - -} -#MetaPanelNotebook GtkTreeView { - padding: 1px; - background-color: @bg-grey; -} -#MetaPanelNotebook .frame GtkTreeView { - padding: 0px; - background-color: @bg-entry-IPTC; -} -#MetaPanelNotebook GtkTreeView:hover, -#MetaPanelNotebook .frame GtkTreeView:hover { - background-color: @bg-list-hover; - color: @text-hl-color; -} -#MetaPanelNotebook GtkTreeView:selected, -#MetaPanelNotebook .frame GtkTreeView:selected { - color: @text-hl-color; - background-color: @accent-color; -} -#MetaPanelNotebook GtkTextView { - color: @text-color; - background-color: @bg-entry-IPTC; - padding: 2px 4px; -} -/*** end ***/ - -/*** Entry ***/ -.entry { - background-image: none; - background-color: @bg-scale-entry; - border: 1px solid @bg-entry-border; - border-radius: 0; - padding: 2px 4px; - color: @text-color; - box-shadow: inset 1px 1px rgba(0, 0, 0, 0.08), 0 1px rgba(242 , 242, 242, 0.1); -} -#FileBrowser .entry { - padding: 3px 4px; -} -.entry:focused:selected { - color: @text-hl-color; - background-color: @accent-color; -} -.entry:not(:focused):not(:insensitive) {/*Workaround*/ - color: @text-color; - background-color: transparent; -} -.entry:not(:selected):not(:insensitive) { - color: @text-color; - background-color: @bg-scale-entry; -} -#ToolPanelNotebook .entry { - padding: 0 4px 0 8px; - border-radius: 20px 0 0 20px; - background-color: rgba(255,255,255,.12); - border: 1px solid rgba(0,0,0,.46); - color: @text-tbEntry; - box-shadow: inset 1px 1px rgba(0, 0, 0, .12), 0 1px rgba(255 , 255, 255, 0.12); -} -#ToolPanelNotebook .entry:focused:selected { - color: @text-hl-color; - background-color: @accent-color; -} -#ToolPanelNotebook .entry:not(:focused):not(:insensitive) {/*Workaround*/ - color: @text-tbEntry; - background-color: transparent; -} -#ToolPanelNotebook .entry:not(:selected):not(:insensitive) { - color: @text-tbEntry; - background-color: rgba(255,255,255,.12); -} - -#MetaPanelNotebook .entry { - color: @text-color; - background-color: @bg-entry-IPTC; - border: none; - border-radius: 0; - padding: 2px 4px; - box-shadow: none; -} -#MetaPanelNotebook .entry:focused:selected { - color: @text-hl-color; - background-color: @accent-color; - box-shadow: none; -} -#MetaPanelNotebook .entry:not(:focused):not(:insensitive) {/*Workaround*/ - color: @text-color; - background-color: transparent; - box-shadow: none; -} -#MetaPanelNotebook .entry:not(:selected):not(:insensitive) { - color: @text-color; - background-color: @bg-entry-IPTC; - box-shadow: none; -} -/*** end ***/ - -/*** Buttons ***/ -.button { - background-color: transparent; - border: 1px solid @bg-button-border; - border-radius: 0; - padding: 3px 4px; - box-shadow: inset 0 1px rgba(242, 242, 242, 0.1), 0 1px rgba(242, 242, 242, 0.1); - background-image: linear-gradient(to bottom, rgba(0,0,0,.05), rgba(0,0,0,.14) 40%, rgba(0,0,0,.26)); -} -.message-dialog .dialog-action-area .button { - padding: 6px; - } - -.button.Left + .button:not(.image-button).Right { - border-left: none; -} -GtkComboBox .button { - padding: 4px 3px; -} -#ToolPanelNotebook .button, -GtkDialog .button, -#BatchQueueButtonsMainContainer .button { - padding: 0px 3px; -} -#BatchQueueButtons .button { - padding-top: 6px; - padding-bottom: 6px -} -#BeforeAfterContainer .button { - padding: 2px; -} - - /*** Fix: Space between first Retinex Comboboxes ***/ -GtkLabel + GtkComboBox + GtkComboBox { - padding-left: 4px; -} - -.text-button { - padding: 0 2px 0 0; -} -#PartialPaste .text-button { - padding: 0 8px 0 2px; - -GtkCheckButton-indicator-spacing: 1; -} -#ToolPanelNotebook GtkFrame > .text-button { - padding: 0 3px 0 0; -} - -.button.text-button { - padding: 5px 12px; -} -#ToolPanelNotebook .button.text-button, -#PrefNotebook .button.text-button, -GtkFileChooserWidget .button.text-button, -#RightNotebook .button.text-button { - padding: 3px 4px; -} -GtkPopover .button.text-button { - padding: 2px 4px; -} - -.spinbutton .button { - background-image: none; - background-color: transparent; - border: none; - border-radius: 0; - padding: 2px; - box-shadow: none; -} -#ToolPanelNotebook .spinbutton .button { - padding: 0; -} - -.button:hover { - background-color: rgba(0, 0, 0,.18); -} -#ToolPanelNotebook .spinbutton .button:hover { - background-color: @bg-spin-button-hover; -} - -.button:active, -.button:checked { - background-image: linear-gradient(to bottom, rgb(41,41,41), rgb(37,37,37) 40%, rgb(25,25,25)); - background-color: transparent; - border-color: black; -} - -#MainNotebook > GtkGrid .button { - padding: 2px; - border: 4px solid @bg-dark-grey; - background-color: transparent; - background-image: none; - box-shadow: none; -} -#MainNotebook tab .button { - padding: 1px; - border-top: 4px solid @bg-dark-grey; - border-bottom: 4px solid @bg-dark-grey; - border-left: none; - border-right: none; - background-color: transparent; - background-image: none; - box-shadow: none; -} -#MainNotebook > GtkGrid .button:hover, -#MainNotebook tab .button:hover { - background-color: rgba(255,255,255,.20); - box-shadow: inset 0 1px rgba(255, 255, 255, 0.12); - background-image: linear-gradient(to bottom, rgba(0,0,0,.05), rgba(0,0,0,.12) 40%, rgba(0,0,0,.24)); -} -#MainNotebook > GtkGrid .button:active, -#MainNotebook tab .button:active { - background-color: rgba(255,255,255,.27); - box-shadow: inset 0 1px rgba(255, 255, 255, 0.12); - background-image: linear-gradient(to bottom, rgba(0,0,0,.05), rgba(0,0,0,.12) 40%, rgba(0,0,0,.24)); -} -.view .button { - background-color: rgb(20,20,20); - padding: 1px 5px 2px; - background-image: none; - border-color: black; - box-shadow: none; -} -.menu .button.bottom, -.menu .button.bottom:insensitive { - background-color: rgb(20,20,20); - border-color: @accent-color; - border-width: 0 1px 1px 1px; - background-image: none; - box-shadow: none; -} -.menu .button.top, -.menu .button.top:insensitive { - background-color: rgb(20,20,20); - border-color: @accent-color; - border-width: 1px 1px 0 1px; - background-image: none; - box-shadow: none; -} -#fullButton, -#histButton { - padding: 5px; - border: none; - background-color: @bg-dark-grey; - background-image: none; - box-shadow: none; -} -/*** end ***/ - -/*** Check & Radio buttons ***/ -.check, -.check row { - -gtk-icon-source: url("images/twb/checkbox-unchecked.png"); -} -.check:checked, -.check row:checked { - -gtk-icon-source: url("images/twb/checkbox-checked.png"); -} -.check:insensitive, -.check row:insensitive { - -gtk-icon-source: url("images/twb/checkbox-unchecked-disabled.png"); -} -.check:checked:insensitive, -.check row:checked:insensitive { - -gtk-icon-source: url("images/twb/checkbox-checked-disabled.png"); -} -.check:inconsistent, -.check row:inconsistent { - -gtk-icon-source: url("images/twb/checkbox-inconsistent.png"); -} -.check:inconsistent:insensitive, -.check row:inconsistent:insensitive { - -gtk-icon-source: url("images/twb/checkbox-inconsistent-disabled.png"); -} - -.radio, -.radio row { - -gtk-icon-source: url("images/twb/radio-unchecked.png"); -} -.radio:checked, -.radio row:checked { - -gtk-icon-source: url("images/twb/radio-checked.png"); -} -.radio:insensitive, -.radio row:insensitive { - -gtk-icon-source: url("images/twb/radio-unchecked-disabled.png"); -} -.radio:checked:insensitive, -.radio row:checked:insensitive { - -gtk-icon-source: url("images/twb/radio-checked-disabled.png"); -} -.radio:inconsistent, -.radio row:inconsistent { - -gtk-icon-source: url("images/twb/radio-inconsistent.png"); -} -.radio:inconsistent:insensitive, -.radio row:inconsistent:insensitive { - -gtk-icon-source: url("images/twb/radio-inconsistent-disabled.png"); -} -/*** end ***/ - -/*** Disabled Items ***/ - -*:insensitive, -#ToolPanelNotebook *:insensitive { - color: rgb(128,128,128); - box-shadow: none; -} -#ToolPanelNotebook .entry:insensitive { - color: rgb(144,144,144); - background-color: rgba(255,255,255,.06); - box-shadow: none; -} -.button:insensitive { - background-image: none; - background-color: rgba(0,0,0,.10); - border-color: rgba(0,0,0,.30); - box-shadow: none; -} -.spinbutton .button:insensitive { - background-image: none; - background-color: transparent; - border: none; - box-shadow: none; -} -.scale.slider:insensitive, -.scale.trough.highlight:insensitive, -.scale.trough:insensitive, -#ToolPanelNotebook .scale.slider:insensitive, -#ToolPanelNotebook .scale.trough.highlight:insensitive, -#ToolPanelNotebook .scale.trough:insensitive { - background-color: rgb(65,65,65); - box-shadow: none; - background-image: none; -} -/*** end ***/ diff --git a/rtdata/themes/TooWaBlue-GTK3-20_.css b/rtdata/themes/TooWaBlue.css similarity index 100% rename from rtdata/themes/TooWaBlue-GTK3-20_.css rename to rtdata/themes/TooWaBlue.css diff --git a/rtdata/themes/TooWaGrey - Average Surround-GTK3-20_.css b/rtdata/themes/TooWaGrey - Average Surround.css similarity index 98% rename from rtdata/themes/TooWaGrey - Average Surround-GTK3-20_.css rename to rtdata/themes/TooWaGrey - Average Surround.css index 8f045e206..1574edf03 100644 --- a/rtdata/themes/TooWaGrey - Average Surround-GTK3-20_.css +++ b/rtdata/themes/TooWaGrey - Average Surround.css @@ -20,7 +20,7 @@ /*****************************************/ -/**/ @import "TooWaBlue-GTK3-20_.css"; /**/ +/**/ @import "TooWaBlue.css"; /**/ /*****************************************/ /*** Change me *** rgb(red,green,blue) *** allowed values from 0 to 255 for each color ***/ diff --git a/rtdata/themes/TooWaGrey - Bright-GTK3-20_.css b/rtdata/themes/TooWaGrey - Bright.css similarity index 98% rename from rtdata/themes/TooWaGrey - Bright-GTK3-20_.css rename to rtdata/themes/TooWaGrey - Bright.css index 579ca7a00..34120efe7 100644 --- a/rtdata/themes/TooWaGrey - Bright-GTK3-20_.css +++ b/rtdata/themes/TooWaGrey - Bright.css @@ -20,7 +20,7 @@ /*****************************************/ -/**/ @import "TooWaBlue-GTK3-20_.css"; /**/ +/**/ @import "TooWaBlue.css"; /**/ /*****************************************/ /*** Change me *** rgb(red,green,blue) *** allowed values from 0 to 255 for each color ***/ diff --git a/rtdata/themes/TooWaGrey - Dark-GTK3-20_.css b/rtdata/themes/TooWaGrey - Dark.css similarity index 98% rename from rtdata/themes/TooWaGrey - Dark-GTK3-20_.css rename to rtdata/themes/TooWaGrey - Dark.css index 8d6d05152..9ef4dda31 100644 --- a/rtdata/themes/TooWaGrey - Dark-GTK3-20_.css +++ b/rtdata/themes/TooWaGrey - Dark.css @@ -20,7 +20,7 @@ /*****************************************/ -/**/ @import "TooWaBlue-GTK3-20_.css"; /**/ +/**/ @import "TooWaBlue.css"; /**/ /*****************************************/ /*** Change me *** rgb(red,green,blue) *** allowed values from 0 to 255 for each color ***/ diff --git a/rtdata/themes/TooWaGrey-GTK3-20_.css b/rtdata/themes/TooWaGrey.css similarity index 98% rename from rtdata/themes/TooWaGrey-GTK3-20_.css rename to rtdata/themes/TooWaGrey.css index 0b29ed2e7..ba3910d9c 100644 --- a/rtdata/themes/TooWaGrey-GTK3-20_.css +++ b/rtdata/themes/TooWaGrey.css @@ -20,7 +20,7 @@ /*****************************************/ -/**/ @import "TooWaBlue-GTK3-20_.css"; /**/ +/**/ @import "TooWaBlue.css"; /**/ /*****************************************/ /*** Change me *** rgb(red,green,blue) *** allowed values from 0 to 255 for each color ***/ diff --git a/rtdata/themes/size - Legacy.css b/rtdata/themes/common/size - Legacy.css similarity index 100% rename from rtdata/themes/size - Legacy.css rename to rtdata/themes/common/size - Legacy.css diff --git a/rtdata/themes/size.css b/rtdata/themes/common/size.css similarity index 100% rename from rtdata/themes/size.css rename to rtdata/themes/common/size.css diff --git a/rtdata/themes/images/svg/twb/checkbox-checked-disabled.svg b/rtdata/themes/images/svg/twb/checkbox-checked-disabled.svg deleted file mode 100644 index 1103ee917..000000000 --- a/rtdata/themes/images/svg/twb/checkbox-checked-disabled.svg +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/rtdata/themes/images/svg/twb/checkbox-checked.svg b/rtdata/themes/images/svg/twb/checkbox-checked.svg deleted file mode 100644 index c7d28d45d..000000000 --- a/rtdata/themes/images/svg/twb/checkbox-checked.svg +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/rtdata/themes/images/svg/twb/checkbox-inconsistent-disabled.svg b/rtdata/themes/images/svg/twb/checkbox-inconsistent-disabled.svg deleted file mode 100644 index ee55c4f6f..000000000 --- a/rtdata/themes/images/svg/twb/checkbox-inconsistent-disabled.svg +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/rtdata/themes/images/svg/twb/checkbox-inconsistent.svg b/rtdata/themes/images/svg/twb/checkbox-inconsistent.svg deleted file mode 100644 index e0f5bd362..000000000 --- a/rtdata/themes/images/svg/twb/checkbox-inconsistent.svg +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/rtdata/themes/images/svg/twb/checkbox-unchecked-disabled.svg b/rtdata/themes/images/svg/twb/checkbox-unchecked-disabled.svg deleted file mode 100644 index 635dae59b..000000000 --- a/rtdata/themes/images/svg/twb/checkbox-unchecked-disabled.svg +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/rtdata/themes/images/svg/twb/checkbox-unchecked.svg b/rtdata/themes/images/svg/twb/checkbox-unchecked.svg deleted file mode 100644 index 0adfe66cc..000000000 --- a/rtdata/themes/images/svg/twb/checkbox-unchecked.svg +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/rtdata/themes/images/svg/twb/radio-checked-disabled.svg b/rtdata/themes/images/svg/twb/radio-checked-disabled.svg deleted file mode 100644 index f415b4be7..000000000 --- a/rtdata/themes/images/svg/twb/radio-checked-disabled.svg +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/rtdata/themes/images/svg/twb/radio-checked.svg b/rtdata/themes/images/svg/twb/radio-checked.svg deleted file mode 100644 index c6f9b4ee8..000000000 --- a/rtdata/themes/images/svg/twb/radio-checked.svg +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/rtdata/themes/images/svg/twb/radio-inconsistent-disabled.svg b/rtdata/themes/images/svg/twb/radio-inconsistent-disabled.svg deleted file mode 100644 index e41f3ff9c..000000000 --- a/rtdata/themes/images/svg/twb/radio-inconsistent-disabled.svg +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/rtdata/themes/images/svg/twb/radio-inconsistent.svg b/rtdata/themes/images/svg/twb/radio-inconsistent.svg deleted file mode 100644 index 65ea2a8e8..000000000 --- a/rtdata/themes/images/svg/twb/radio-inconsistent.svg +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/rtdata/themes/images/svg/twb/radio-unchecked-disabled.svg b/rtdata/themes/images/svg/twb/radio-unchecked-disabled.svg deleted file mode 100644 index 60098048f..000000000 --- a/rtdata/themes/images/svg/twb/radio-unchecked-disabled.svg +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/rtdata/themes/images/svg/twb/radio-unchecked.svg b/rtdata/themes/images/svg/twb/radio-unchecked.svg deleted file mode 100644 index 8b448f3cf..000000000 --- a/rtdata/themes/images/svg/twb/radio-unchecked.svg +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/rtdata/themes/images/twb/checkbox-checked-disabled.png b/rtdata/themes/images/twb/checkbox-checked-disabled.png deleted file mode 100644 index 8458b5987..000000000 Binary files a/rtdata/themes/images/twb/checkbox-checked-disabled.png and /dev/null differ diff --git a/rtdata/themes/images/twb/checkbox-checked.png b/rtdata/themes/images/twb/checkbox-checked.png deleted file mode 100644 index 83d3744d3..000000000 Binary files a/rtdata/themes/images/twb/checkbox-checked.png and /dev/null differ diff --git a/rtdata/themes/images/twb/checkbox-inconsistent-disabled.png b/rtdata/themes/images/twb/checkbox-inconsistent-disabled.png deleted file mode 100644 index 96c5fbe5f..000000000 Binary files a/rtdata/themes/images/twb/checkbox-inconsistent-disabled.png and /dev/null differ diff --git a/rtdata/themes/images/twb/checkbox-inconsistent.png b/rtdata/themes/images/twb/checkbox-inconsistent.png deleted file mode 100644 index 373f218be..000000000 Binary files a/rtdata/themes/images/twb/checkbox-inconsistent.png and /dev/null differ diff --git a/rtdata/themes/images/twb/checkbox-unchecked-disabled.png b/rtdata/themes/images/twb/checkbox-unchecked-disabled.png deleted file mode 100644 index 985dd07cc..000000000 Binary files a/rtdata/themes/images/twb/checkbox-unchecked-disabled.png and /dev/null differ diff --git a/rtdata/themes/images/twb/checkbox-unchecked.png b/rtdata/themes/images/twb/checkbox-unchecked.png deleted file mode 100644 index 747a9c8c3..000000000 Binary files a/rtdata/themes/images/twb/checkbox-unchecked.png and /dev/null differ diff --git a/rtdata/themes/images/twb/radio-checked-disabled.png b/rtdata/themes/images/twb/radio-checked-disabled.png deleted file mode 100644 index 0947a5e06..000000000 Binary files a/rtdata/themes/images/twb/radio-checked-disabled.png and /dev/null differ diff --git a/rtdata/themes/images/twb/radio-checked.png b/rtdata/themes/images/twb/radio-checked.png deleted file mode 100644 index 48cfc16ae..000000000 Binary files a/rtdata/themes/images/twb/radio-checked.png and /dev/null differ diff --git a/rtdata/themes/images/twb/radio-inconsistent-disabled.png b/rtdata/themes/images/twb/radio-inconsistent-disabled.png deleted file mode 100644 index a59b179e1..000000000 Binary files a/rtdata/themes/images/twb/radio-inconsistent-disabled.png and /dev/null differ diff --git a/rtdata/themes/images/twb/radio-inconsistent.png b/rtdata/themes/images/twb/radio-inconsistent.png deleted file mode 100644 index abe1e28ba..000000000 Binary files a/rtdata/themes/images/twb/radio-inconsistent.png and /dev/null differ diff --git a/rtdata/themes/images/twb/radio-unchecked-disabled.png b/rtdata/themes/images/twb/radio-unchecked-disabled.png deleted file mode 100644 index 6cbc076f2..000000000 Binary files a/rtdata/themes/images/twb/radio-unchecked-disabled.png and /dev/null differ diff --git a/rtdata/themes/images/twb/radio-unchecked.png b/rtdata/themes/images/twb/radio-unchecked.png deleted file mode 100644 index e28db04f9..000000000 Binary files a/rtdata/themes/images/twb/radio-unchecked.png and /dev/null differ diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index 6f329f7be..d3a137959 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -45,6 +45,14 @@ endif() if(EXIV2_INCLUDE_DIRS) include_directories("${EXIV2_INCLUDE_DIRS}") endif() +if(JXL_INCLUDE_DIRS) + include_directories("${JXL_INCLUDE_DIRS}") +endif() +if(NOT WITH_SYSTEM_LIBRAW) + include_directories("${CMAKE_SOURCE_DIR}/rtengine/libraw") +else() + include_directories("${LIBRAW_INCLUDE_DIRS}") +endif() link_directories( "${EXPAT_LIBRARY_DIRS}" @@ -145,6 +153,7 @@ set(RTENGINESOURCEFILES jpeg_ijg/jpeg_memsrc.cc labimage.cc lcp.cc + lensmetadata.cc lmmse_demosaic.cc loadinitial.cc metadata.cc @@ -246,10 +255,17 @@ target_link_libraries(rtengine ${RSVG_LIBRARIES} ${KLT_LIBRARIES} ${EXIV2_LIBRARIES} + ${JXL_LIBRARIES} + ${LIBRAW_LIBRARIES} ) if(OpenMP_FOUND) target_link_libraries(rtengine ${OpenMP_CXX_LIBRARIES}) endif() +# Configure LibRaw +if(NOT WITH_SYSTEM_LIBRAW) + include(LibRaw.cmake) +endif() + install(FILES ${CAMCONSTSFILE} DESTINATION "${DATADIR}" PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ) diff --git a/rtengine/LibRaw.cmake b/rtengine/LibRaw.cmake new file mode 100644 index 000000000..433312212 --- /dev/null +++ b/rtengine/LibRaw.cmake @@ -0,0 +1,124 @@ +# LibRaw has its own configuration script and uses make to build. Here we add +# the LibRaw configuration commands so they run during the CMake configuration. +# Also, add a target which always runs make. + +set(LIBRAW_DIR "${CMAKE_CURRENT_BINARY_DIR}/libraw") +set(LIBRAW_LIB_DIR "${LIBRAW_DIR}/lib") +set(LIBRAW_PHANTOM_FILE "${LIBRAW_LIB_DIR}/phantom_file") +if(DEFINED ENV{SHELL}) + set(SHELL "$ENV{SHELL}") +else() + set(SHELL "sh") +endif() + +add_custom_target( + LibRaw ALL + DEPENDS ${LIBRAW_PHANTOM_FILE} # Ensures target always executes. +) + +# Configuration flags. +set(CONFIGURE_FLAGS "--disable-examples") +set(LIBRAW_CXX_FLAGS "${CXX_FLAGS} -std=gnu++11 -Wno-error=unknown-pragmas") +# Let the configure script handle OpenMP flags. +string(REPLACE "${OpenMP_CXX_FLAGS}" "" LIBRAW_CXX_FLAGS "${LIBRAW_CXX_FLAGS}") +if(OPTION_OMP) + set(CONFIGURE_FLAGS "${CONFIGURE_FLAGS} --enable-openmp") +else() + set(CONFIGURE_FLAGS "${CONFIGURE_FLAGS} --disable-openmp") +endif() +set(CONFIGURE_FLAGS "${CONFIGURE_FLAGS} CC=\"${CMAKE_C_COMPILER}\"") +set(CONFIGURE_FLAGS "${CONFIGURE_FLAGS} CXX=\"${CMAKE_CXX_COMPILER}\"") +set(CONFIGURE_FLAGS "${CONFIGURE_FLAGS} CXXFLAGS=\"${LIBRAW_CXX_FLAGS}\"") + +# Configuration commands. +message(STATUS "Configuring LibRaw") +execute_process( + COMMAND cp -p -R "${CMAKE_CURRENT_SOURCE_DIR}/libraw" . + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" + RESULT_VARIABLE PROCESS_RESULT + COMMAND_ECHO STDOUT +) +if(PROCESS_RESULT AND NOT PROCESS_RESULT EQUAL 0) + message(FATAL_ERROR "Could not copy LibRaw files into build directory") +endif() +execute_process( + COMMAND "${SHELL}" -l -c "autoreconf -v --install" + WORKING_DIRECTORY "${LIBRAW_DIR}" + RESULT_VARIABLE PROCESS_RESULT + COMMAND_ECHO STDOUT +) +if(PROCESS_RESULT AND NOT PROCESS_RESULT EQUAL 0) + message(FATAL_ERROR "Could not generate LibRaw configuration script") +endif() +execute_process( + COMMAND "${SHELL}" -l -c "./configure ${CONFIGURE_FLAGS}" + WORKING_DIRECTORY "${LIBRAW_DIR}" + RESULT_VARIABLE PROCESS_RESULT + COMMAND_ECHO STDOUT +) +if(PROCESS_RESULT AND NOT PROCESS_RESULT EQUAL 0) + execute_process( + COMMAND cat config.log + WORKING_DIRECTORY "${LIBRAW_DIR}" + COMMAND_ECHO STDOUT + ) + message(FATAL_ERROR "LibRaw configure failed") +endif() + +# Build flags. +set(LIBRAW_MAKE_FLAGS "") +if(CMAKE_GENERATOR MATCHES ".*Makefiles.*") + set(LIBRAW_MAKE_COMMAND "$(MAKE)") +else() + # If not using Makefiles, set number of jobs equal to logical processors + # count. Not necessary for make because of the jobserver. + execute_process( + COMMAND "${SHELL}" -l -c "nproc" + OUTPUT_VARIABLE LOGICAL_PROCESSORS + RESULT_VARIABLE PROCESS_RESULT + ERROR_QUIET + ) + if(PROCESS_RESULT AND NOT PROCESS_RESULT EQUAL 0) + execute_process( + COMMAND "${SHELL}" -l -c "sysctl -n hw.ncpu" + OUTPUT_VARIABLE LOGICAL_PROCESSORS + RESULT_VARIABLE PROCESS_RESULT + ERROR_QUIET + ) + endif() + if(PROCESS_RESULT AND NOT PROCESS_RESULT EQUAL 0) + execute_process( + COMMAND "${SHELL}" -l -c "getconf _NPROCESSORS_ONLN" + OUTPUT_VARIABLE LOGICAL_PROCESSORS + RESULT_VARIABLE PROCESS_RESULT + ERROR_QUIET + ) + endif() + if(PROCESS_RESULT AND NOT PROCESS_RESULT EQUAL 0) + set(LOGICAL_PROCESSORS "1") + endif() + string(STRIP "${LOGICAL_PROCESSORS}" LOGICAL_PROCESSORS) + set(LIBRAW_MAKE_FLAGS "${LIBRAW_MAKE_FLAGS} -j${LOGICAL_PROCESSORS}") + + set(LIBRAW_MAKE_COMMAND "make") +endif() + +# Build commands. +add_custom_command( + OUTPUT "${LIBRAW_PHANTOM_FILE}" "${LIBRAW_LIB_DIR}/.libs/libraw_r.a" + COMMAND cp -p -R "${CMAKE_CURRENT_SOURCE_DIR}/libraw" .. + COMMAND "${SHELL}" -l -c "${LIBRAW_MAKE_COMMAND} ${LIBRAW_MAKE_FLAGS}" + COMMENT "Building LibRaw" + WORKING_DIRECTORY libraw + VERBATIM +) + +# Add a `make clean-libraw` command because there's no good way to automatically +# clean the LibRaw build with `make`clean`. +add_custom_target( + clean-libraw + COMMAND make clean + COMMAND rm -rf lib + WORKING_DIRECTORY libraw +) + diff --git a/rtengine/camconst.json b/rtengine/camconst.json index fe3dc1c55..54bc65c23 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1447,12 +1447,25 @@ Camera constants: }, { // Quality C - "make_model": [ "FUJIFILM GFX 100", "FUJIFILM GFX100S" ], + "make_model": [ "FUJIFILM GFX 100", "FUJIFILM GFX100S", "FUJIFILM GFX 100S", "FUJIFILM GFX 100 II" ], "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 ] } + ], + "pdaf_pattern" : [ 0, 18 ], // From ART + "pdaf_offset" : 0 + }, + + { // Quality C + "make_model": [ "FUJIFILM GFX100 II" ], + "dcraw_matrix" : [ 12806, -5779, -1110, -3546, 11507, 2318, -177, 996, 5715 ], // adobe dcp d65 + "raw_crop": [ + // multi-aspect crop to account for 16-shot pixel shift images + { "frame" : [11808, 8754], "crop" : [ 0, 0, 11664, 8750 ] }, + // this crop has been copied from the GFX 100 one, no sample pixel shift images are available + { "frame" : [23616, 17508], "crop" : [ 0, 4, 23328, 17468 ] } ] }, @@ -1528,6 +1541,11 @@ Camera constants: "ranges": { "white": 3838 } }, + { // Quality B + "make_model": [ "Fujifilm X-H2S" ], + "raw_crop": [ 0, 5, 6264, 4176 ] + }, + { // Quality B "make_model": [ "FUJIFILM X-T10", "FUJIFILM X-E2" ], "dcraw_matrix": [ 8458,-2451,-855,-4597,12447,2407,-1475,2482,6526 ], // DNG D65 @@ -2090,6 +2108,11 @@ Camera constants: "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 C + "make_model" : "Nikon Z f", + "dcraw_matrix" : [ 11607, -4491, -977, -4522, 12460, 2304, -458, 1519, 7616 ] // DNG v16.1 + }, + { // 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 @@ -2206,7 +2229,7 @@ Camera constants: }, { // Quality B - "make_model": "OLYMPUS TG-6", + "make_model": [ "OLYMPUS TG-6", "OM Digital Solutions TG-7" ], "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 }, @@ -2312,6 +2335,13 @@ Camera constants: "ranges": { "black": 15, "white": 4050 } // 15 is BL offset. dcraw/RT read the base offset from Exif and calculates total BL = BLbase+BLoffset }, + { // Quality C + "make_model": "Panasonic DMC-FX150", + "raw_crop": [ + { "frame": [ 4508, 2498 ], "crop": [ 0, 0, 4429, 2496] } // 16:9 ratio needs to shave a few extra pixels from dcraw's crop. + ] + }, + { // Quality A, replicated from rawimage.cc "make_model": "Panasonic DMC-FZ150", "dcraw_matrix": [ 10435,-3208,-72,-2293,10506,2067,-486,1725,4682 ], // RT, copy from custom dcp d55 @@ -3010,6 +3040,11 @@ Camera constants: "pdaf_offset" : 3 }, + { // Quality C + "make_model": [ "Sony ILCE-6700" ], + "raw_crop": [ 0, 0, 6244, 4168 ] + }, + { // Quality C "make_model": "Sony ILCE-7C", "dcraw_matrix": [ 7374, -2389, -551, -5435, 13162, 2519, -1006, 1795, 6552 ] @@ -3097,7 +3132,17 @@ 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 + "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 + "pdaf_pattern": [ 0,12,18,36,42,60,66,72,78,96,108,120,126,138,156,168,180,186,192,198,210,222,228,240,246,252,270,276,282,288,306,312,318,330,336,348,360,366,372,378,390,396,408,420 ], // Assume the pattern is the same as the ILCE-7CR. + "pdaf_offset": 1 + }, + + { // Quality B + "make_model": [ "Sony ILCE-7CR", "Sony ILCE-7RM5" ], // 7RM5 is assumed to have the same sensor as the 7CR. + "dcraw_matrix": [ 8200, -2976, -719, -4296, 12053, 2532, -429, 1282, 5774 ], // DNG v15.2 for ILCE-7CR and ILCE-7RM5. + "raw_crop": [ 0, 0, 9564, 6374 ], // From ART + "pdaf_pattern": [ 0,12,18,36,42,60,66,72,78,96,108,120,126,138,156,168,180,186,192,198,210,222,228,240,246,252,270,276,282,288,306,312,318,330,336,348,360,366,372,378,390,396,408,420 ], // From issue #6938. Slightly different every repetition, maybe the real pattern is 3 or more multiples of 420 pixels. This is a composite. + "pdaf_offset": 1 }, { // Quality B, assumed correct for 9M2 as well @@ -3112,6 +3157,11 @@ Camera constants: "pdaf_offset" : -7 }, + { // Quality C + "make_model": "SONY ILCE-9M3", + "raw_crop": [ 8, 8, 6008, 4008 ] // From ART + }, + { // 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 diff --git a/rtengine/ciecam02.cc b/rtengine/ciecam02.cc index 25f0c852d..264fd5ab7 100644 --- a/rtengine/ciecam02.cc +++ b/rtengine/ciecam02.cc @@ -229,7 +229,7 @@ float Ciecam02::achromatic_response_to_whitefloat ( float x, float y, float z, f gpa = nonlinear_adaptationfloat ( gp, fl ); bpa = nonlinear_adaptationfloat ( bp, fl ); - return ((2.0f * rpa) + gpa + ((1.0f / 20.0f) * bpa) - 0.305f) * nbb; + return ((2.0f * rpa) + gpa + (0.05f * bpa) - 0.305f) * nbb; } void Ciecam02::xyz_to_cat02float ( float &r, float &g, float &b, float x, float y, float z, int c16, float plum) diff --git a/rtengine/color.cc b/rtengine/color.cc index 4e139a868..16104ae86 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -25,11 +25,67 @@ #include "opthelper.h" #include "iccstore.h" #include +#include "linalgebra.h" using namespace std; -namespace rtengine +namespace rtengine { +namespace { + +typedef Vec3f A3; + +// D50 <-> D65 adapted from darktable, thanks to Alberto Griggio + +void XYZ_D50_to_D65(float &X, float &Y, float &Z) { + // Bradford adaptation matrix from http://www.brucelindbloom.com/index.html?Eqn_ChromAdapt.html + constexpr float M[3][3] = { + { 0.9555766f, -0.0230393f, 0.0631636f }, + { -0.0282895f, 1.0099416f, 0.0210077f }, + { 0.0122982f, -0.0204830f, 1.3299098f } + }; + A3 res = dot_product(M, A3(X, Y, Z)); + X = res[0]; + Y = res[1]; + Z = res[2]; +} + + +void XYZ_D65_to_D50(float &X, float &Y, float &Z) +{ + // Bradford adaptation matrix from http://www.brucelindbloom.com/index.html?Eqn_ChromAdapt.html + constexpr float M[3][3] = { + { 1.0478112f, 0.0228866f, -0.0501270f }, + { 0.0295424f, 0.9904844f, -0.0170491f }, + { -0.0092345f, 0.0150436f, 0.7521316f } + }; + A3 res = dot_product(M, A3(X, Y, Z)); + X = res[0]; + Y = res[1]; + Z = res[2]; +} + +/* +float PQ(float X) +{ + X = std::max(X, 1e-10f); + const float XX = std::pow(X*1e-4f, 0.1593017578125f); + return std::pow( + (0.8359375f + 18.8515625f*XX) / (1 + 18.6875f*XX), + 134.034375f); +} + + +float PQ_inv(float X) +{ + X = std::max(X, 1e-10f); + const auto XX = std::pow(X, 7.460772656268214e-03f); + return 1e4f * std::pow( + (0.8359375f - XX) / (18.6875f*XX - 18.8515625f), + 6.277394636015326f); +} +*/ +} // namespace cmsToneCurve* Color::linearGammaTRC; LUTf Color::cachef; @@ -1911,7 +1967,146 @@ 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) +// code take in ART thanks to Alberto Griggio +//----------------------------------------------------------------------------- +// oklab color space from https://bottosson.github.io/posts/oklab/ +//----------------------------------------------------------------------------- + +void Color::xyz2oklab(float X, float Y, float Z, float &L, float &a, float &b) +{ + XYZ_D50_to_D65(X, Y, Z); + + constexpr float M1[3][3] = { + {0.8189330101f, 0.3618667424f, -0.1288597137f}, + {0.0329845436f, 0.9293118715f, 0.0361456387f}, + {0.0482003018f, 0.2643662691f, 0.6338517070f} + }; + + A3 lms = dot_product(M1, A3(X, Y, Z)); + for (int i = 0; i < 3; ++i) { + lms[i] = xcbrtf(lms[i]); + } + + constexpr float M2[3][3] = { + {0.2104542553f, 0.7936177850f, -0.0040720468f}, + {1.9779984951f, -2.4285922050f, 0.4505937099f}, + {0.0259040371f, 0.7827717662f, -0.8086757660f} + }; + + lms = dot_product(M2, lms); + + L = lms[0]; + a = lms[1]; + b = lms[2]; +} + + +void Color::oklab2xyz(float L, float a, float b, float &X, float &Y, float &Z) +{ + constexpr float M2_inv[3][3] = { + {1.f, 0.39633779f, 0.21580376f}, + {1.00000001f, -0.10556134f, -0.06385417f}, + {1.00000005f, -0.08948418f, -1.29148554f} + }; + + A3 lms = dot_product(M2_inv, A3(L, a, b)); + for (int i = 0; i < 3; ++i) { + lms[i] = SQR(lms[i])*lms[i]; + } + + constexpr float M1_inv[3][3] = { + {1.22701385f, -0.55779998f, 0.28125615f}, + {-0.04058018f, 1.11225687f, -0.07167668f}, + {-0.07638128f, -0.42148198f, 1.58616322} + }; + + lms = dot_product(M1_inv, lms); + X = lms[0]; + Y = lms[1]; + Z = lms[2]; + + XYZ_D65_to_D50(X, Y, Z); +} + + +// https://www.itu.int/dms_pubrec/itu-r/rec/bt/R-REC-BT.2100-2-201807-I!!PDF-F.pdf +// Perceptual Quantization / SMPTE standard ST.2084 +float Color::eval_PQ_curve(float x, bool oetf) +{ + constexpr float M1 = 2610.0 / 16384.0; + constexpr float M2 = (2523.0 / 4096.0) * 128.0; + constexpr float C1 = 3424.0 / 4096.0; + constexpr float C2 = (2413.0 / 4096.0) * 32.0; + constexpr float C3 = (2392.0 / 4096.0) * 32.0; + + if (x == 0.f) { + return 0.f; + } + + float res = 0.f; + if (oetf) { + // assume 1.0 is 100 nits, normalise so that 1.0 is 10000 nits + float p = std::pow(std::max(x, 0.f) / 100.f, M1); + float num = C1 + C2 * p; + float den = 1.f + C3 * p; + res = std::pow(num / den, M2); + } else { + float p = std::pow(x, 1.f / M2); + float num = std::max(p - C1, 0.f); + float den = C2 - C3 * p; + res = std::pow(num / den, 1.f / M1) * 100.f; + } + return res; +} + + +// https://www.itu.int/dms_pubrec/itu-r/rec/bt/R-REC-BT.2100-2-201807-I!!PDF-F.pdf +// Hybrid Log-Gamma +float Color::eval_HLG_curve(float x, bool oetf) +{ + constexpr float A = 0.17883277f; + constexpr float B = 0.28466892f; // 1.f - 4.f * A + constexpr float C = 0.55991072953f; // 0.5f - A * std::log(4.f * A) + + if (x == 0.f) { + return 0.f; + } + + float res = 0.f; + if (oetf) { + // assume 1.0 is 100 nits, normalise so that 1.0 is 1000 nits + float e = LIM01(x / 10.f); + res = (e <= 1.f/12.f) ? std::sqrt(3.f * e) : A * std::log(12.f * e - B) + C; + } else { + res = (x <= 0.5f) ? SQR(x) / 3.f : (std::exp((x - C) / A) + B) / 12.f; + res *= 10.f; + } + + return res; +} + + +float Color::eval_ACEScct_curve(float x, bool forward) +{ + if (forward) { + if (x <= 0.078125f) { + return 10.5402377416545f * x + 0.0729055341958355f; + } else { + return (std::log2(x) + 9.72f) / 17.52f; + } + } else { + if (x <= 0.155251141552511f) { + return (x - 0.0729055341958355f) / 10.5402377416545f; + } else { + return std::exp2(x * 17.52f - 9.72f); + } + } +} + +// end code take in ART thanks to Alberto Griggio + + +void Color::primaries_to_xyz(double p[6], double Wx, double Wz, double *pxyz, int cat) { //calculate Xr, Xg, Xb, Yr, Yb, Tg, Zr,Zg Zb double Wy = 1.0; @@ -1967,29 +2162,112 @@ void Color::primaries_to_xyz(double p[6], double Wx, double Wz, double *pxyz) mat_xyz[2][1] = Sb * Yb; mat_xyz[2][2] = Sb * Zb; - //chromatic adaptation Bradford + //chromatic adaptation 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; + if( cat == 0 ) {//i bradford + 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; + } else if ( cat == 1 ) {// icat16 + MaBradford[0][0] = 1.86206786; + MaBradford[0][1] = -1.01125463; + MaBradford[0][2] = 0.14918677; + MaBradford[1][0] = 0.38752654; + MaBradford[1][1] = 0.62144744; + MaBradford[1][2] = -0.00897398; + MaBradford[2][0] = -0.0158415; + MaBradford[2][1] = -0.03412294; + MaBradford[2][2] = 1.04996444; + } else if ( cat == 2 ) {// icat02 + MaBradford[0][0] = 0.99015849; + MaBradford[0][1] = -0.00838772; + MaBradford[0][2] = 0.018229217; + MaBradford[1][0] = 0.239565979; + MaBradford[1][1] = 0.758664642; + MaBradford[1][2] = 0.001770137; + MaBradford[2][0] = 0.0; + MaBradford[2][1] = 0.0; + MaBradford[2][2] = 1.0; + } else if ( cat == 3 ) {//Von Kries + MaBradford[0][0] = 0.40024; + MaBradford[0][1] = -0.2263; + MaBradford[0][2] = 0.0; + MaBradford[1][0] = 0.7076; + MaBradford[1][1] = 1.16532; + MaBradford[1][2] = 0.0; + MaBradford[2][0] = -0.08081; + MaBradford[2][1] = 0.0457; + MaBradford[2][2] = 0.91822; + } else if ( cat == 4 ) {//None XYZ + MaBradford[0][0] = 1.0; + MaBradford[0][1] = 0.0; + MaBradford[0][2] = 0.0; + MaBradford[1][0] = 0.0; + MaBradford[1][1] = 1.0; + MaBradford[1][2] = 0.0; + MaBradford[2][0] = 0.0; + MaBradford[2][1] = 0.0; + MaBradford[2][2] = 1.0; + } 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; - + if( cat == 0 ) {//Bradford + 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; + } else if ( cat == 1 ) { //cat16 + Ma_oneBradford[0][0] = 0.401288; + Ma_oneBradford[0][1] = 0.650173; + Ma_oneBradford[0][2] = -0.051461; + Ma_oneBradford[1][0] = -0.250268; + Ma_oneBradford[1][1] = 1.204414; + Ma_oneBradford[1][2] = 0.045854; + Ma_oneBradford[2][0] = -0.002079; + Ma_oneBradford[2][1] = 0.048952; + Ma_oneBradford[2][2] = 0.953127; + } else if ( cat == 2 ) { //cat02 + Ma_oneBradford[0][0] = 1.007245; + Ma_oneBradford[0][1] = 0.011136; + Ma_oneBradford[0][2] = -0.018381; + Ma_oneBradford[1][0] = -0.318061; + Ma_oneBradford[1][1] = 1.314589; + Ma_oneBradford[1][2] = 0.003471; + Ma_oneBradford[2][0] = 0.0; + Ma_oneBradford[2][1] = 0.0; + Ma_oneBradford[2][2] = 1.0; + } else if ( cat == 3 ) { //Von Kries + Ma_oneBradford[0][0] = 1.8599364; + Ma_oneBradford[0][1] = 0.3611914; + Ma_oneBradford[0][2] = 0.0; + Ma_oneBradford[1][0] = -1.1293816; + Ma_oneBradford[1][1] = 0.6388125; + Ma_oneBradford[1][2] = 0.0; + Ma_oneBradford[2][0] = 0.2198974; + Ma_oneBradford[2][1] = -0.0000064; + Ma_oneBradford[2][2] = 1.0890636; + } else if ( cat == 4 ) { //none XYZ + Ma_oneBradford[0][0] = 1.0; + Ma_oneBradford[0][1] = 0.0; + Ma_oneBradford[0][2] = 0.0; + Ma_oneBradford[1][0] = 0.0; + Ma_oneBradford[1][1] = 1.0; + Ma_oneBradford[1][2] = 0.0; + Ma_oneBradford[2][0] = 0.0; + Ma_oneBradford[2][1] = 0.0; + Ma_oneBradford[2][2] = 1.0; + } //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]; @@ -2078,16 +2356,15 @@ void Color::primaries_to_xyz(double p[6], double Wx, double Wz, double *pxyz) * 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]) { - float epsil = 0.0001f; - float intermXYZ = X + 15 * Y + 3 * Z; - if(intermXYZ <= 0.f) { - intermXYZ = epsil; - } - - float u = 4 * X / (intermXYZ) - u0; + 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.0f; @@ -2118,14 +2395,12 @@ void Color::gamutmap(float &X, float Y, float &Z, const double p[3][3]) v = v * (double) lam_min + v0; X = (9 * u * Y) / (4 * v); - float intermuv = 12 - 3 * u - 20 * v; - if(intermuv < 0.f) { - intermuv = 0.f; - } + float intermuv = 12 - 3 * u - 20 * v; + if(intermuv < 0.f) { + intermuv = 0.f; + } Z = (intermuv) * Y / (4 * v); - - } void Color::skinredfloat ( float J, float h, float sres, float Sp, float dred, float protect_red, int sk, float rstprotection, float ko, float &s) diff --git a/rtengine/color.h b/rtengine/color.h index 3622a9e36..c20ac97ee 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -127,8 +127,8 @@ public: constexpr static float D50x = 0.9642f; //0.96422; constexpr static float D50z = 0.8249f; //0.82521; - 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 u0 = 4.0 * static_cast(D50x) / (static_cast(D50x) + 15.0 + 3.0 * static_cast(D50z)); + constexpr static double v0 = 9.0 / (static_cast(D50x) + 15.0 + 3.0 * static_cast(D50z)); constexpr static double epskap = 8.0; constexpr static float epskapf = epskap; @@ -1399,7 +1399,36 @@ static inline void Lab2XYZ(vfloat L, vfloat a, vfloat b, vfloat &x, vfloat &y, v //static inline float gamma (double x) { return gammatab[x]; } //static inline float igamma_srgb (double x) { return igammatab_srgb[x]; } + // code take in ART thanks to Alberto Griggio + // Rec.2100 PQ curve + // https://www.itu.int/dms_pubrec/itu-r/rec/bt/R-REC-BT.2100-2-201807-I!!PDF-F.pdf + // Perceptual Quantization / SMPTE standard ST.2084 + static float eval_PQ_curve(float x, bool oetf); + // Hybrid-log gamma curve + // https://www.itu.int/dms_pubrec/itu-r/rec/bt/R-REC-BT.2100-2-201807-I!!PDF-F.pdf + static float eval_HLG_curve(float x, bool oetf); + + static float eval_ACEScct_curve(float x, bool inverse); + + static void xyz2oklab(float X, float Y, float Z, float &L, float &a, float &b); + static void oklab2xyz(float L, float a, float b, float &X, float &Y, float &Z); + + template + static void rgb2oklab(float R, float G, float B, float &L, float &a, float &b, const T ws[3][3]) + { + float X, Y, Z; + rgbxyz(R, G, B, X, Y, Z, ws); + xyz2oklab(X, Y, Z, L, a, b); + } + + template + static void oklab2rgb(float L, float a, float b, float &R, float &G, float &B, const T iws[3][3]) + { + float X, Y, Z; + oklab2xyz(L, a, b, X, Y, Z); + xyz2rgb(X, Y, Z, R, G, B, iws); + } // -------------------------------- Jacques's Munsell correction @@ -1847,13 +1876,13 @@ static inline void Lab2XYZ(vfloat L, vfloat a, vfloat b, vfloat &x, vfloat &y, v */ 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 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, int cat); /** * @brief Get HSV's hue from the Lab's hue diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc index 1c98b3e8b..f8a4b60b2 100644 --- a/rtengine/colortemp.cc +++ b/rtengine/colortemp.cc @@ -32,7 +32,6 @@ namespace rtengine { - 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}, diff --git a/rtengine/colortemp.h b/rtengine/colortemp.h index db69abe2d..00b79ef85 100644 --- a/rtengine/colortemp.h +++ b/rtengine/colortemp.h @@ -31,9 +31,9 @@ using color_match_type = double [97][3]; constexpr double MINTEMP = 1500.0; constexpr double MAXTEMP = 60000.0; constexpr double MINGREEN = 0.02; -constexpr double MAXGREEN = 10.0; -constexpr double MINEQUAL = 0.8; -constexpr double MAXEQUAL = 1.5; +constexpr double MAXGREEN = 100.0; +constexpr double MINEQUAL = 0.5; +constexpr double MAXEQUAL = 2.; constexpr double INITIALBLACKBODY = 4000.0; enum class StandardObserver { diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index 940b3c0c0..96ade2e36 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -1124,14 +1124,18 @@ DCPProfile::DCPProfile(const Glib::ustring& filename) : 1.00000f }; - FILE* const file = g_fopen(filename.c_str(), "rb"); + const std::unique_ptr> file( + g_fopen(filename.c_str(), "rb"), + [](std::FILE *file) { + std::fclose(file); + }); if (file == nullptr) { printf ("Unable to load DCP profile '%s' !", filename.c_str()); return; } - DCPMetadata md(file); + DCPMetadata md(file.get()); if (!md.parse()) { printf ("Unable to load DCP profile '%s'.", filename.c_str()); return; @@ -1173,8 +1177,9 @@ DCPProfile::DCPProfile(const Glib::ustring& filename) : // Color Matrix (one is always there) if (!md.find(TAG_KEY_COLOR_MATRIX_1)) { - std::cerr << "DCP '" << filename << "' is missing 'ColorMatrix1'. Skipped." << std::endl; - fclose(file); + if (settings->verbose) { + std::cerr << "DCP '" << filename.c_str() << "' is missing 'ColorMatrix1'. Skipped." << std::endl; + } return; } @@ -1351,10 +1356,6 @@ DCPProfile::DCPProfile(const Glib::ustring& filename) : } } - if (file) { - fclose(file); - } - valid = true; } diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 236414c31..5626482fe 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -6124,7 +6124,7 @@ get2_256: // imCanon.ColorDataVer = 11; imCanon.ColorDataSubVer = get2(); - fseek(ifp, save1 + ((0x0069+0x0064) << 1), SEEK_SET); + fseek(ifp, save1 + (0x0069 << 1), SEEK_SET); FORC4 cam_mul[c ^ (c >> 1)] = (float)get2(); offsetChannelBlackLevel2 = save1 + ((0x0069+0x0102) << 1); @@ -6458,16 +6458,123 @@ int CLASS parse_tiff_ifd (int base) FORC3 cam_mul[c] = get2(); break; case 45: - if (pana_raw && len == 1 && type == 3) - { - RT_pana_info.encoding = get2(); - } - break; + if (pana_raw && len == 1 && type == 3) { + RT_pana_info.encoding = get2(); + } + break; case 46: - if (type != 7 || fgetc(ifp) != 0xff || fgetc(ifp) != 0xd8) break; - thumb_offset = ftell(ifp) - 2; - thumb_length = len; - break; + if (type != 7 || fgetc(ifp) != 0xff || fgetc(ifp) != 0xd8) break; + thumb_offset = ftell(ifp) - 2; + thumb_length = len; + break; + case 57: + if (pana_raw && len == 26 && type == 7) { + ushort cnt = get2(); + if (cnt > 6) cnt = 6; + for (i = 0; i < cnt; i++) + RT_pana_info.v8tags.tag39[i] = get4(); + } + break; + case 58: + if (pana_raw && type == 7 && len == 26) { + ushort cnt = get2(); + if (cnt > 6) cnt = 6; + for (i = 0; i < cnt; i++) { + get2(); + RT_pana_info.v8tags.tag3A[i] = get2(); + } + } + break; + case 59: + if (pana_raw && type == 3 && len == 1) + RT_pana_info.v8tags.tag3B = get2(); + break; + case 60: + case 61: + case 62: + case 63: + if (pana_raw && type == 3 && len == 1) + RT_pana_info.v8tags.initial[tag - 0x3c] = get2(); + break; + case 64: + if (pana_raw && type == 7 && len == 70) { + ushort count = get2(); + if (count > 17) count = 17; + for (i = 0; i < count; i++) { + ushort v1 = get2(); + if (v1 > 16u) v1 = 16u; + RT_pana_info.v8tags.tag40a[i] = v1; + ushort v2 = get2(); + if (v2 > 0xfffu) v2 = 0xfffu; + RT_pana_info.v8tags.tag40b[i] = v2; + } + } + break; + case 65: + if (pana_raw && type == 7 && len == 36) { + ushort count = get2(); + if (count > 17) count = 17; + for (i = 0; i < count; i++) { + ushort v1 = get2(); + if (v1 > 0x40u) v1 = 64; + RT_pana_info.v8tags.tag41[i] = v1; + } + } + break; + case 66: + if (pana_raw && type == 3 && len == 1) { + ushort val = get2(); + if (val > 5) val = 5; + RT_pana_info.v8tags.stripe_count = val; + } + break; + case 67: + if (pana_raw && type == 3 && len == 1) { + ushort val = get2(); + if (val > 5) val = 5; + RT_pana_info.v8tags.tag43 = val; + } + break; + case 68: + if (pana_raw && type == 7 && len == 50) { + ushort count = get2(); + if (count > 5) count = 5; + for (i = 0; i < count; i++) + RT_pana_info.v8tags.stripe_offsets[i] = get4(); + } + break; + case 69: + if (pana_raw && type == 7 && len == 50) { + ushort count = get2(); + if (count > 5) count = 5; + for (i = 0; i < count; i++) + RT_pana_info.v8tags.stripe_left[i] = get4(); + } + break; + case 70: + if (pana_raw && type == 7 && len == 50) { + ushort count = get2(); + if (count > 5) count = 5; + for (i = 0; i < count; i++) + RT_pana_info.v8tags.stripe_compressed_size[i] = get4(); + } + break; + case 71: + if (pana_raw && type == 7 && len == 26) { + ushort count = get2(); + if (count > 5) count = 5; + for (i = 0; i < count; i++) + RT_pana_info.v8tags.stripe_width[i] = get2(); + } + break; + case 72: + if (pana_raw && type == 7 && len == 26) { + ushort count = get2(); + if (count > 5) count = 5; + for (i = 0; i < count; i++) + RT_pana_info.v8tags.stripe_height[i] = get2(); + } + break; case 61440: /* Fuji HS10 table */ fseek (ifp, get4()+base, SEEK_SET); parse_tiff_ifd (base); @@ -6483,9 +6590,10 @@ int CLASS parse_tiff_ifd (int base) break; case 258: /* BitsPerSample */ case 61443: - tiff_ifd[ifd].samples = len & 7; + if(!tiff_ifd[ifd].samples || tag != 258) + tiff_ifd[ifd].samples = len & 7; if ((tiff_ifd[ifd].bps = getint(type)) > 32) - tiff_ifd[ifd].bps = 8; + tiff_ifd[ifd].bps = 8; if (tiff_bps < tiff_ifd[ifd].bps) tiff_bps = tiff_ifd[ifd].bps; break; @@ -6937,71 +7045,9 @@ it under the terms of the one of two licenses as you choose: ((int *)mask)[i] = getint(type); black = 0; break; - case 51008: /* OpcodeList1 */ - { - unsigned oldOrder = order; - order = 0x4d4d; // always big endian per definition in https://www.adobe.com/content/dam/acom/en/products/photoshop/pdfs/dng_spec_1.4.0.0.pdf chapter 7 - unsigned ntags = get4(); // read the number of opcodes - if (ntags < ifp->size / 12) { // rough check for wrong value (happens for example with DNG files from DJI FC6310) - while (ntags-- && !ifp->eof) { - unsigned opcode = get4(); - fseek (ifp, 8, SEEK_CUR); // skip 8 bytes as they don't interest us currently - if (opcode == 4) { // FixBadPixelsConstant - fseek (ifp, 4, SEEK_CUR); // skip 4 bytes as we know that the opcode 4 takes 4 byte - if(get4() == 0) { // if raw 0 values should be treated as bad pixels, set zero_is_bad to true (1). That's the only value currently supported by rt - zero_is_bad = 1; - } - } else { - fseek (ifp, get4(), SEEK_CUR); - } - } - } - order = oldOrder; - break; - } case 51009: /* OpcodeList2 */ - { - meta_offset = ftell(ifp); - 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; - } + meta_offset = ftell(ifp); + break; case 64772: /* Kodak P-series */ if (len < 13) break; fseek (ifp, 16, SEEK_CUR); @@ -7181,7 +7227,7 @@ void CLASS apply_tiff() load_raw = &CLASS olympus_load_raw; // ------- RT ------- if (!strncmp(make,"SONY",4) && - (!strncmp(model,"ILCE-7RM3",9) || !strncmp(model,"ILCE-7RM4",9)) && + (!strncmp(model,"ILCE-7RM3",9) || !strncmp(model,"ILCE-7RM4",9) || !strncmp(model,"ILCE-1",6)) && tiff_samples == 4 && tiff_ifd[raw].bytes == raw_width*raw_height*tiff_samples*2) { load_raw = &CLASS sony_arq_load_raw; @@ -8006,6 +8052,12 @@ void CLASS adobe_coeff (const char *make, const char *model) { 11438,-3762,-1115,-2409,9914,2497,-1227,2295,5300 } }, { "Apple QuickTake", 0, 0, /* DJC */ { 21392,-5653,-3353,2406,8010,-415,7166,1427,2078 } }, + { "Broadcom RPi IMX219", 66, 0x3ff, + { 5302,1083,-728,-5320,14112,1699,-863,2371,5136 } }, /* LibRaw */ // From LibRaw + { "Broadcom RPi OV5647", 16, 0x3ff, + { 12782,-4059,-379,-478,9066,1413,1340,1513,5176 } }, /* DJC */ // From LibRaw + { "Broadcom Pi", 16, 0x3ff, + { 12782,-4059,-379,-478,9066,1413,1340,1513,5176 } }, /* DJC */ // From LibRaw { "Canon EOS D2000", 0, 0, { 24542,-10860,-3401,-1490,11370,-297,2858,-605,3225 } }, { "Canon EOS D6000", 0, 0, @@ -8044,6 +8096,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6071,-747,-856,-7653,15365,2441,-2025,2553,7315 } }, { "Canon EOS 50D", 0, 0x3d93, { 4920,616,-593,-6493,13964,2784,-1774,3178,7005 } }, + { "Canon EOS 250D", 0, 0, + { 9079,-1923,-1236,-4677,12454,2492,-922,2319,5565 } }, // From LibRaw { "Canon EOS 60D", 0, 0x2ff7, { 6719,-994,-925,-4408,12426,2211,-887,2129,6051 } }, { "Canon EOS 70D", 0, 0x3bc7, @@ -8054,6 +8108,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 7457,-671,-937,-4849,12495,2643,-1213,2354,5492 } }, { "Canon EOS 100D", 0, 0x350f, { 6602,-841,-939,-4472,12458,2247,-975,2039,6148 } }, + { "Canon EOS 250D", 0, 0, + { 9079,-1923,-1236,-4677,12454,2492,-922,2319,5565 } }, // From LibRaw { "Canon EOS 200D", 0, 0, { 7377,-742,-998,-4235,11981,2549,-673,1918,5538 } }, { "Canon EOS 300D", 0, 0xfa0, @@ -8078,8 +8134,14 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6362,-823,-847,-4426,12109,2616,-743,1857,5635 } }, { "Canon EOS 760D", 0, 0x350f, { 6362,-823,-847,-4426,12109,2616,-743,1857,5635 } }, + { "Canon EOS 850D", 0, 0, + { 9079,-1923,-1236,-4677,12454,2492,-922,2319,5565}}, // From LibRaw { "Canon EOS 800D", 0, 0, { 6970,-512,-968,-4425,12161,2553,-739,1982,5601 } }, + { "EOS 850D", 0, 0, + { 9079,-1923,-1236,-4677,12454,2492,-922,2319,5565}}, // From LibRaw + { "Canon EOS 90D", 0, 0, + { 11498, -3759, -1516, -5073, 12954, 2349, -892, 1867, 6118}}, // From LibRaw { "Canon EOS 1000D", 0, 0xe43, { 6771,-1139,-977,-7818,15123,2928,-1244,1437,7533 } }, { "Canon EOS 1100D", 0, 0x3510, @@ -8092,12 +8154,46 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, { "Canon EOS 3000D", 0, 0, { 6939,-1016,-866,-4428,12473,2177,-1175,2178,6162 } }, + { "Canon EOS RP", 0, 0, + { 8608,-2097,-1178,-5425,13265,2383,-1149,2238,5680 } }, // From LibRaw + { "Canon EOS R3", 0, 0, + { 9423,-2839,-1195,-4532,12377,2415,-483,1374,5276 } }, // From LibRaw + { "Canon EOS R50", 0, 0, + { 9269, -2012, -1107, -3990, 11762, 2527, -569, 2093, 4913 } }, // From LibRaw + { "Canon EOS R100", 0, 0, + { 8230, -1515, -1032, -4179, 12005, 2454, -649, 2076, 4711 } }, // From LibRaw + { "Canon EOS R5", 0, 0, + { 9766,-2953,-1254,-4276,12116,2433,-437,1336,5131 } }, // From LibRaw + { "Canon EOS R6 Mark II", 0, 0, + { 9539, -2795, -1224, -4175, 11998, 2458, -465, 1755,6048 } }, // From LibRaw + { "Canon EOS R6", 0, 0, + { 8293,-1611,-1132,-4759,12711,2275,-1013,2415,5509 } }, // From LibRaw + { "Canon EOS R7", 0, 0, + { 10424, -3138, -1300, -4221, 11938, 2584, -547, 1658, 6183 } }, // From LibRaw + { "Canon EOS R8", 0, 0, + { 9539, -2795, -1224, -4175, 11998, 2458, -465, 1755, 6048 } }, // From LibRaw + { "Canon EOS R10", 0, 0, + { 9269, -2012, -1107, -3990, 11762, 2527, -569, 2093, 4913 } }, // From LibRaw + { "Canon EOS Ra", 0, 0, + { 22880,-11531,-2223,-2034,10469,1809, 316,1401,5769 } }, // From LibRaw + { "Canon EOS R", 0, 0, + { 8293,-1789,-1094,-5025,12925,2327,-1199,2769,6108 } }, // v.2 // From LibRaw + { "Canon EOS M6 Mark II", 0, 0, + { 11498,-3759,-1516,-5073,12954,2349,-892,1867,6118 } }, // From LibRaw { "Canon EOS M6", 0, 0, { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, + { "Canon EOS M50 Mark II", 0, 0, + { 10463,-2173,-1437,-4856,12635,2482,-1216,2915,7237 } }, // From LibRaw + { "Canon EOS M50", 0, 0, + { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, // From LibRaw { "Canon EOS M5", 0, 0, /* also M50 */ { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, { "Canon EOS M3", 0, 0, { 6362,-823,-847,-4426,12109,2616,-743,1857,5635 } }, + { "Canon EOS M200", 0, 0, + { 10463,-2173,-1437,-4856,12635,2482,-1216,2915,7237 } }, // From LibRaw + { "Canon EOS M2", 0, 0, + { 6400,-480,-888,-5294,13416,2047,-1296,2203,6137 } }, // From LibRaw { "Canon EOS M100", 0, 0, { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, { "Canon EOS M10", 0, 0, @@ -8120,6 +8216,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 4374,3631,-1743,-7520,15212,2472,-2892,3632,8161 } }, { "Canon EOS-1D C", 0, 0x3c4e, { 6847,-614,-1014,-4669,12737,2139,-1197,2488,6846 } }, + { "Canon EOS-1D X Mark III", 0, 0, + { 8971, -2022, -1242, -5405, 13249, 2380, -1280, 2483, 6072}}, // From LibRaw { "Canon EOS-1D X Mark II", 0, 0, { 7596,-978,-967,-4808,12571,2503,-1398,2567,5752 } }, { "Canon EOS-1D X", 0, 0x3c4e, @@ -8128,12 +8226,16 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6806,-179,-1020,-8097,16415,1687,-3267,4236,7690 } }, { "Canon EOS C500", 853, 0, /* DJC */ { 17851,-10604,922,-7425,16662,763,-3660,3636,22278 } }, + { "Canon PowerShot 600", 0, 0, + { -3822,10019,1311,4085,-157,3386,-5341,10829,4812,-1969,10969,1126 } }, // From LibRaw { "Canon PowerShot A530", 0, 0, { 0 } }, /* don't want the A5 matrix */ { "Canon PowerShot A50", 0, 0, { -5300,9846,1776,3436,684,3939,-5540,9879,6200,-1404,11175,217 } }, { "Canon PowerShot A5", 0, 0, { -4801,9475,1952,2926,1611,4094,-5259,10164,5947,-1554,10883,547 } }, + { "Canon PowerShot D10", 127, 0, + { 14052,-5229,-1156,-1325,9420,2252,-498,1957,4116 } }, /* DJC */ // From LibRaw { "Canon PowerShot G10", 0, 0, { 11093,-3906,-1028,-5047,12492,2879,-1003,1750,5561 } }, { "Canon PowerShot G11", 0, 0, @@ -8146,6 +8248,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8020,-2687,-682,-3704,11879,2052,-965,1921,5556 } }, { "Canon PowerShot G1 X Mark III", 0, 0, { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, + { "Canon PowerShot G1 X Mark II", 0, 0, + { 7378,-1255,-1043,-4088,12251,2048,-876,1946,5805 } }, // From LibRaw { "Canon PowerShot G1 X", 0, 0, { 7378,-1255,-1043,-4088,12251,2048,-876,1946,5805 } }, { "Canon PowerShot G1", 0, 0, @@ -8156,12 +8260,18 @@ void CLASS adobe_coeff (const char *make, const char *model) { 9701,-3857,-921,-3149,11537,1817,-786,1817,5147 } }, { "Canon PowerShot G3", 0, 0, { 9212,-2781,-1073,-6573,14189,2605,-2300,2844,7664 } }, + { "Canon PowerShot G5 X Mark II",0, 0, + { 11629, -5713, -914, -2706, 11090, 1842, -206, 1225, 5515 } }, // From LibRaw { "Canon PowerShot G5 X", 0, 0, { 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 } }, { "Canon PowerShot G5", 0, 0, { 9757,-2872,-933,-5972,13861,2301,-1622,2328,7212 } }, { "Canon PowerShot G6", 0, 0, { 9877,-3775,-871,-7613,14807,3072,-1448,1305,7485 } }, + { "Canon PowerShot G7 X Mark III", 0, 0, + { 11629, -5713, -914, -2706, 11090, 1842, -206, 1225, 5515 } }, // From LibRaw + { "Canon PowerShot G7 X Mark II", 0, 0, + { 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 } }, // From LibRaw { "Canon PowerShot G7 X", 0, 0, { 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 } }, { "Canon PowerShot G9 X Mark II", 0, 0, @@ -8198,14 +8308,24 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8039,-2643,-654,-3783,11230,2930,-206,690,4194 } }, { "Canon PowerShot S120", 0, 0, { 6961,-1685,-695,-4625,12945,1836,-1114,2152,5518 } }, + { "Canon PowerShot SD300", 0, 0, + { 6526,-1720,-1075,-1390,5945,602,-90,820,2380 } }, // CHDK // From LibRaw { "Canon PowerShot SX1 IS", 0, 0, { 6578,-259,-502,-5974,13030,3309,-308,1058,4970 } }, + { "Canon PowerShot SX20 IS", 0, 0, + { 8275,-2904,-1260,-128,5305,505,51,481,2450 } }, // CHDK // From LibRaw + { "Canon PowerShot SX30 IS", 0, 0, + { 13014,-4698,-1026,-2001,9615,2386,-164,1423,3759 } }, // CHDK // From LibRaw { "Canon PowerShot SX50 HS", 0, 0, { 12432,-4753,-1247,-2110,10691,1629,-412,1623,4926 } }, { "Canon PowerShot SX60 HS", 0, 0, { 13161,-5451,-1344,-1989,10654,1531,-47,1271,4955 } }, + { "Canon PowerShot SX70 HS", 0, 0, + { 18285,-8907,-1951,-1845,10688,1323,364,1101,5139 } }, // From LibRaw { "Canon PowerShot A3300", 0, 0, /* DJC */ { 10826,-3654,-1023,-3215,11310,1906,0,999,4960 } }, + { "Canon PowerShot A460", 0, 0, + { 6493,-2338,-885,-1589,5934,697,-445,1368,2543 } }, // CHDK // From LibRaw { "Canon PowerShot A470", 0, 0, /* DJC */ { 12513,-4407,-1242,-2680,10276,2405,-878,2215,4734 } }, { "Canon PowerShot A610", 0, 0, /* DJC */ @@ -8220,14 +8340,24 @@ void CLASS adobe_coeff (const char *make, const char *model) { 9427,-3036,-959,-2581,10671,1911,-1039,1982,4430 } }, { "Canon PowerShot A720", 0, 0, /* DJC */ { 14573,-5482,-1546,-1266,9799,1468,-1040,1912,3810 } }, + { "Canon PowerShot S2 IS", 0, 0, + { 5477,-1435,-992,-1868,6639,510,-58,792,2670 } }, // CHDK // From LibRaw { "Canon PowerShot S3 IS", 0, 0, /* DJC */ { 14062,-5199,-1446,-4712,12470,2243,-1286,2028,4836 } }, { "Canon PowerShot SX110 IS", 0, 0, /* DJC */ { 14134,-5576,-1527,-1991,10719,1273,-1158,1929,3581 } }, + { "Canon PowerShot SX120 IS", 0, 0, + { 7286,-2242,-1047,41,4401,457,269,684,1864 } }, // CHDK // From LibRaw { "Canon PowerShot SX220", 0, 0, /* DJC */ { 13898,-5076,-1447,-1405,10109,1297,-244,1860,3687 } }, + { "Canon PowerShot SX710 HS", 0, 0, + { 13161,-5451,-1344,-1989,10654,1531,-47,1271,4955 } }, // From LibRaw { "Canon IXUS 160", 0, 0, /* DJC */ { 11657,-3781,-1136,-3544,11262,2283,-160,1219,4700 } }, + { "Casio EX-F1", 0, 0, + { 9084,-2016,-848,-6711,14351,2570,-1059,1725,6135 } }, // From LibRaw + { "Casio EX-FH100", 0, 0, + { 12771,-4179,-1558,-2149,10938,1375,-453,1751,4494 } }, // From LibRaw { "Casio EX-S20", 0, 0, /* DJC */ { 11634,-3924,-1128,-4968,12954,2015,-1588,2648,7206 } }, { "Casio EX-Z750", 0, 0, /* DJC */ @@ -8246,6 +8376,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6596,-2079,-562,-4782,13016,1933,-970,1581,5181 } }, { "Epson R-D1", 0, 0, { 6827,-1878,-732,-8429,16012,2564,-704,592,7145 } }, + { "Fujifilm DBP for GX680", 128, 0x0fff, + { 12741,-4916,-1420,-8510,16791,1715,-1767,2302,7771 } }, /* temp, copy from S2Pro */ // From LibRaw { "Fujifilm E550", 0, 0, { 11044,-3888,-1120,-7248,15168,2208,-1531,2277,8069 } }, { "Fujifilm E900", 0, 0, @@ -8258,9 +8390,15 @@ void CLASS adobe_coeff (const char *make, const char *model) { 13690,-5358,-1474,-3369,11600,1998,-132,1554,4395 } }, { "Fujifilm F7", 0, 0, { 10004,-3219,-1201,-7036,15047,2107,-1863,2565,7736 } }, + { "Fujifilm F810", 0, 0, + { 11044,-3888,-1120,-7248,15167,2208,-1531,2276,8069 } }, // From LibRaw { "Fujifilm F8", 0, 0, { 13690,-5358,-1474,-3369,11600,1998,-132,1554,4395 } }, - { "Fujifilm GFX 50S", 0, 0, + { "Fujifilm GFX 100 II", 0, 0, + { 12806,-5779,-1110,-3546,11507,2318,-177,996,5715 } }, // From LibRaw + { "Fujifilm GFX 100", 0, 0, // same CMs: "GFX 100", "GFX 100S"/"GFX100S", "GFX 100 IR" + { 16212,-8423,-1583,-4336,12583,1937,-195,726,6199 } }, // From LibRaw + { "Fujifilm GFX 50", 0, 0, // same CMs: "GFX 50S", "GFX 50R", "GFX 50S II" { 11756,-4754,-874,-3056,11045,2305,-381,1457,6006 } }, { "Fujifilm S100FS", 514, 0, { 11521,-4355,-1065,-6524,13767,3058,-1466,1984,6045 } }, @@ -8304,7 +8442,7 @@ void CLASS adobe_coeff (const char *make, const char *model) { 21461,-10807,-1441,-2332,10599,1999,289,875,7703 } }, { "Fujifilm IS Pro", 0, 0, { 12300,-5110,-1304,-9117,17143,1998,-1947,2448,8100 } }, - { "Fujifilm HS10 HS11", 0, 0xf68, + { "Fujifilm HS10", 0, 0xf68, { 12440,-3954,-1183,-1123,9674,1708,-83,1614,4086 } }, { "Fujifilm HS2", 0, 0xfef, { 13690,-5358,-1474,-3369,11600,1998,-132,1554,4395 } }, @@ -8320,6 +8458,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 10592,-4262,-1008,-3514,11355,2465,-870,2025,6386 } }, { "Fujifilm X100T", 0, 0, { 10592,-4262,-1008,-3514,11355,2465,-870,2025,6386 } }, + { "Fujifilm X100V", 0, 0, + { 13426,-6334,-1177,-4244,12136,2371,580,1303,5980 } }, // From LibRaw { "Fujifilm X100", 0, 0, { 12161,-4457,-1069,-5034,12874,2400,-795,1724,6904 } }, { "Fujifilm X10", 0, 0, @@ -8334,6 +8474,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 } }, { "Fujifilm X-Pro2", 0, 0, { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, + { "Fujifilm X-Pro3", 0, 0, + { 13426,-6334,-1177,-4244,12136,2371,580,1303,5980 } }, // From LibRaw { "Fujifilm X-A10", 0, 0, { 11540,-4999,-991,-2949,10963,2278,-382,1049,5605 } }, { "Fujifilm X-A20", 0, 0, @@ -8346,6 +8488,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 12407,-5222,-1086,-2971,11116,2120,-294,1029,5284 } }, { "Fujifilm X-A5", 0, 0, { 11673,-4760,-1041,-3988,12058,2166,-771,1417,5569 } }, + { "Fujifilm X-A7", 0, 0, + { 15055,-7391,-1274,-4062,12071,2238,-610,1217,6147 } }, // From LibRaw { "Fujifilm X-E1", 0, 0, { 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 } }, { "Fujifilm X-E2S", 0, 0, @@ -8354,22 +8498,123 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8458,-2451,-855,-4597,12447,2407,-1475,2482,6526 } }, { "Fujifilm X-E3", 0, 0, { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, + { "Fujifilm X-E4", 0, 0, + { 13426, -6334, -1177, -4244, 12136, 2371, -580, 1303, 5980 } }, // From LibRaw { "Fujifilm X-H1", 0, 0, { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, + { "Fujifilm X-H2S", 0, 0, + { 12836, -5909, -1032, -3087, 11132, 2236, -35, 872, 5330 } }, // From LibRaw + { "Fujifilm X-H2", 0, 0, + { 11809, -5358, -1141, -4248, 12164, 2343, -514, 1097, 5848 } }, // From LibRaw { "Fujifilm X-M1", 0, 0, { 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 } }, + { "Fujifilm X-S20", 0, 0, + { 12836, -5909, -1032, -3087, 11132, 2236, -35, 872, 5330 } }, // From LibRaw + { "Fujifilm X-S10", 0, 0, + { 13426,-6334,-1177,-4244,12136,2371,-580,1303,5980 } }, // From LibRaw { "Fujifilm X-S1", 0, 0, { 13509,-6199,-1254,-4430,12733,1865,-331,1441,5022 } }, + { "Fujifilm X-T100", 0, 0, + { 11673,-4760,-1041,-3988,12058,2166,-771,1417,5569 } }, // From LibRaw { "Fujifilm X-T1", 0, 0, /* also X-T10 */ { 8458,-2451,-855,-4597,12447,2407,-1475,2482,6526 } }, + { "Fujifilm X-T200", 0, 0, + { 15055,-7391,-1274,-4062,12071,2238,-610,1217,6147 } }, // From LibRaw { "Fujifilm X-T2", 0, 0, /* also X-T20 */ { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, + { "Fujifilm X-T3", 0, 0, // same CMs: X-T3, X-T30, "X-T30 II" + { 13426,-6334,-1177,-4244,12136,2371,580,1303,5980 } }, // v.2 // From LibRaw + { "Fujifilm X-T4", 0, 0, + { 13426,-6334,-1177,-4244,12136,2371,580,1303,5980 } }, // From LibRaw + { "Fujifilm X-T5", 0, 0, + { 11809, -5358, -1141, -4248, 12164, 2343, -514, 1097, 5848 } }, // From LibRaw + { "Fujifilm XF10", 0, 0, + { 11673,-4760,-1041,-3988,12058,2166,-771,1417,5569 } }, // From LibRaw { "Fujifilm XF1", 0, 0, { 13509,-6199,-1254,-4430,12733,1865,-331,1441,5022 } }, { "Fujifilm XQ", 0, 0, /* XQ1 and XQ2 */ { 9252,-2704,-1064,-5893,14265,1717,-1101,2341,4349 } }, + { "GITUP G3DUO", 130, 62000, + { 8489,-2583,-1036,-8051,15583,2643,-1307,1407,7354 } }, // From LibRaw + { "GITUP GIT2P", 4160, 0, + { 8489,-2583,-1036,-8051,15583,2643,-1307,1407,7354 } }, // From LibRaw + { "GITUP GIT2", 3200, 0, + { 8489,-2583,-1036,-8051,15583,2643,-1307,1407,7354 } }, // From LibRaw { "GoPro HERO5 Black", 0, 0, { 10344,-4210,-620,-2315,10625,1948,93,1058,5541 } }, + { "Hasselblad L1D-20c", 0, 0, + { 7310, -2746, -646, -2991, 10847, 2469, 163, 585, 6324}}, // From LibRaw +// TODO: These Hasselblad camera names are from LibRaw. dcraw names are different. +// { "Hasselblad 16-Uncoated-3FR", 0, 0, +// { 8519, -3260, -280, -5081, 13459, 1738, -1449, 2960, 7809}}, +// { "Hasselblad 16-Uncoated-FFF", 0, 0, +// { 8068, -2959, -108, -5788, 13608, 2389, -1002, 2237, 8162}}, +// { "Hasselblad 16-Uncoated", 0, 0, +// { 8519, -3260, -280, -5081, 13459, 1738, -1449, 2960, 7809}}, +// { "Hasselblad 22-Uncoated-3FR", 0, 0, +// { 8523, -3257, -280, -5078, 13458, 1743, -1449, 2961, 7809}}, +// { "Hasselblad 22-Uncoated-FFF", 0, 0, +// { 8068, -2959, -108, -5788, 13608, 2389, -1002, 2237, 8162}}, +// { "Hasselblad 22-Uncoated", 0, 0, +// { 8519, -3260, -280, -5081, 13459, 1738, -1449, 2960, 7809}}, +// { "Hasselblad 31-Uncoated-FFF", 0, 0, +// { 5155, -1201, 200, -5841, 13197, 2950, -1101, 2317, 6988}}, +// { "Hasselblad 31-Uncoated", 0, 0, +// { 5458, -1448, 145, -4479, 12338, 2401, -1659, 3086, 6710}}, +// { "Hasselblad 39-Uncoated-3FR", 0, 0, +// { 3904, -100, 262, -4318, 12407, 2128, -1598, 3594, 6233}}, +// { "Hasselblad 39-Uncoated-FFF", 0, 0, +// { 4739, -932, 295, -4829, 12220, 2952, -1027, 2341, 7083}}, +// { "Hasselblad 39-Uncoated", 0, 0, +// { 3894, -110, 287, -4672, 12610, 2295, -2092, 4100, 6196}}, +// { "Hasselblad 39-Coated-3FR", 0, 0, +// { 5427, -1147, 173, -3834, 12073, 1969, -1444, 3320, 5621}}, +// { "Hasselblad 39-Coated-FFF", 0, 0, +// { 5323, -1233, 399, -4926, 12362, 2894, -856, 2471, 5961}}, +// { "Hasselblad 39-Coated", 0, 0, +// { 3857, 452, -46, -6008, 14477, 1596, -2627, 4481, 5718}}, +// { "Hasselblad 40-Coated5-3FR", 0, 0, +// { 7014, -2067, -540, -4821, 13016, 1980, -1663, 3089, 6940}}, +// { "Hasselblad 40-Coated5-FFF", 0, 0, +// { 5963, -1357, -172, -5439, 12762, 3007, -964, 2222, 7172}}, +// { "Hasselblad 40-Coated5", 0, 0, +// { 6159, -1402, -177, -5439, 12762, 3007, -955, 2200, 7104}}, +// { "Hasselblad 40-Coated-3FR", 0, 0, +// { 6550, -1681, -399, -4626, 12598, 2257, -1807, 3354, 6486}}, +// { "Hasselblad 40-Coated-FFF", 0, 0, +// { 6041, -1375, -174, -5439, 10000, 3007, -930, 2145, 6923}}, +// { "Hasselblad 40-Coated", 0, 0, +// { 6159, -1402, -177, -5439, 12762, 3007, -955, 2200, 7104}}, +// { "Hasselblad 50-Coated5-3FR", 0, 0, +// { 5707, -693, -382, -4285, 12669, 1773, -1615, 3519, 5410}}, +// { "Hasselblad 50-Coated5-FFF", 0, 0, +// { 5263, -612, 39, -4950, 12426, 2843, -935, 2423, 5941}}, +// { "Hasselblad 50-Coated5", 0, 0, +// { 5656, -659, -346, -3923, 12306, 1791, -1602, 3509, 5442}}, +// { "Hasselblad 50-Coated-3FR", 0, 0, +// { 5656, -659, -346, -3923, 12305, 1790, -1602, 3509, 5442}}, +// { "Hasselblad 50-Coated-FFF", 0, 0, +// { 5280, -614, 39, -4950, 12426, 2843, -939, 2434, 5968}}, +// { "Hasselblad 50-Coated", 0, 0, +// { 5656, -659, -346, -3923, 12306, 1791, -1602, 3509, 5442}}, +// { "Hasselblad 50-15-Coated5-II-3FR", 0, 0, +// { 10887, -6152, 1034, -3564, 12412, 4224, 63, 626, 10123}}, +// { "Hasselblad 50-15-Coated5-II-FFF", 0, 0, +// { 4932, -835, 141, -4878, 11868, 3437, -1138, 1961, 7067}}, +// { "Hasselblad 50-15-Coated5-II", 0, 0, +// { 8737, -4937, 830, -2860, 9961, 3390, 51, 502, 8124}}, +// { "Hasselblad 50-15-Coated5", 0, 0, +// { 4932,-835,141,-4878,11868,3437,-1138,1961,7067 } }, +// { "Hasselblad 60-Coated-3FR", 0, 0, +// { 9296, 336, -1088, -6442, 14323, 2289, -1433, 2942, 5756}}, +// { "Hasselblad 60-Coated", 0, 0, +// { 9662, -684, -279, -4903, 12293, 2950, -344, 1669, 6024}}, +// { "Hasselblad 100-17-Coated5", 0, 0, +// { 5110, -1357, -308, -5573, 12835, 3077, -1279, 2025, 7010}}, +// { "Hasselblad 100-20-Coated6", 0, 0, +// { 6468,-1899,-545,-4526,12267,2542,-388,1276,6096 } }, + { "HTC One A9", 64, 1023, + { 101,-20,-2,-11,145,41,-24,1,56 } }, /* this is FM1 transposed */ // From LibRaw { "Imacon Ixpress", 0, 0, /* DJC */ { 7025,-1415,-704,-5188,13765,1424,-1248,2742,6038 } }, { "Kodak NC2000", 0, 0, @@ -8380,11 +8625,11 @@ void CLASS adobe_coeff (const char *make, const char *model) { 20620,-7572,-2801,-103,10073,-396,3551,-233,2220 } }, { "Kodak DCS420", 0, 0, { 10868,-1852,-644,-1537,11083,484,2343,628,2216 } }, - { "Kodak DCS460", 0, 0, + { "Kodak DCS46", 0, 0, // same CM as EOSDCS1 and DCS465 DB { 10592,-2206,-967,-1944,11685,230,2206,670,1273 } }, { "Kodak EOSDCS1", 0, 0, { 10592,-2206,-967,-1944,11685,230,2206,670,1273 } }, - { "Kodak EOSDCS3B", 0, 0, + { "Kodak EOSDCS3", 0, 0, { 9898,-2700,-940,-2478,12219,206,1985,634,1031 } }, { "Kodak DCS520C", 178, 0, { 24542,-10860,-3401,-1490,11370,-297,2858,-605,3225 } }, @@ -8410,6 +8655,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 16414,-6060,-1470,-3555,13037,473,2545,122,4948 } }, { "Kodak ProBack", 0, 0, { 21179,-8316,-2918,-915,11019,-165,3477,-180,4210 } }, + { "Kodak PIXPRO AZ901", 0, 0, // dng + { 21875, -8006, -2558, 634, 8194, 1104, 1535, 951, 6969}}, // From LibRaw { "Kodak P712", 0, 0, { 9658,-3314,-823,-5163,12695,2768,-1342,1843,6044 } }, { "Kodak P850", 0, 0xf7c, @@ -8424,16 +8671,62 @@ void CLASS adobe_coeff (const char *make, const char *model) { 11749,-4048,-1309,-1867,10572,1489,-138,1449,4522 } }, { "Kodak EASYSHARE Z1015", 0, 0xef1, { 11265,-4286,-992,-4694,12343,2647,-1090,1523,5447 } }, + { "Leaf AFi 54S", 0, 0, + { 8236, 1746, -1313, -8251, 15953, 2428, -3672, 5786, 5771}}, // From LibRaw + { "Leaf AFi 65S", 0, 0, + { 7914, 1414, -1190, -8776, 16582, 2280, -2811, 4605, 5562}}, // From LibRaw + { "Leaf AFi 75S", 0, 0, + { 7914, 1414, -1190, -8776, 16582, 2280, -2811, 4605, 5562}}, // From LibRaw { "Leaf CMost", 0, 0, { 3952,2189,449,-6701,14585,2275,-4536,7349,6536 } }, + { "Leaf Credo 40", 0, 0, + { 8035, 435, -962, -6001, 13872, 2320, -1159, 3065, 5434}}, // From LibRaw + { "Leaf Credo 50", 0, 0, // emb + { 10325, 845, -604, -4113, 13385, 481, -1791, 4163, 6924}}, // From LibRaw + { "Leaf Credo 60", 0, 0, + { 8035, 435, -962, -6001, 13872, 2320, -1159, 3065, 5434}}, // From LibRaw + { "Leaf Credo 80", 0, 0, + { 6294, 686, -712, -5435, 13417, 2211, -1006, 2435, 5042}}, // From LibRaw + { "Leaf Valeo 11", 0, 0, + { 8236, 1746, -1313, -8251, 15953, 2428, -3672, 5786, 5771}}, // From LibRaw + { "Leaf Valeo 17", 0, 0, + { 8236, 1746, -1313, -8251, 15953, 2428, -3672, 5786, 5771}}, // From LibRaw + { "Leaf Valeo 22", 0, 0, + { 8236, 1746, -1313, -8251, 15953, 2428, -3672, 5786, 5771}}, // From LibRaw { "Leaf Valeo 6", 0, 0, { 3952,2189,449,-6701,14585,2275,-4536,7349,6536 } }, + { "Leaf AFi-II 7", 0, 0, + { 7691,-108,-339,-6185,13627,2833,-2046,3899,5952 } }, // From LibRaw + { "Leaf AFi-II 10", 0, 0, + { 6719,1147,-148,-6929,14061,3176,-1781,3343,5424 } }, // From LibRaw + { "Leaf Aptus 17", 0, 0, + { 8236, 1746, -1313, -8251, 15953, 2428, -3672, 5786, 5771}}, // From LibRaw + { "Leaf Aptus 22", 0, 0, + { 8236, 1746, -1313, -8251, 15953, 2428, -3672, 5786, 5771}}, // From LibRaw { "Leaf Aptus 54S", 0, 0, { 8236,1746,-1314,-8251,15953,2428,-3673,5786,5771 } }, + { "Leaf Aptus 65S", 0, 0, + { 7914, 1414, -1190, -8776, 16582, 2280, -2811, 4605, 5562}}, // From LibRaw { "Leaf Aptus 65", 0, 0, { 7914,1414,-1190,-8777,16582,2280,-2811,4605,5562 } }, + { "Leaf Aptus 75S", 0, 0, + { 7914, 1414, -1190, -8776, 16582, 2280, -2811, 4605, 5562}}, // From LibRaw { "Leaf Aptus 75", 0, 0, { 7914,1414,-1190,-8777,16582,2280,-2811,4605,5562 } }, + { "Leaf Aptus-II 5", 0, 0, + { 7914,1414,-1190,-8777,16582,2280,-2811,4605,5562 } }, // From LibRaw + { "Leaf Aptus-II 6", 0, 0, + { 7989,-113,-352,-6185,13627,2833,-2028,3866,5901 } }, // From LibRaw + { "Leaf Aptus-II 7", 0, 0, + { 8209,-116,-362,-6185,13627,2833,-1962,3740,5709 } }, // From LibRaw + { "Leaf Aptus-II 8", 0, 0, + { 7361,1257,-163,-6929,14061,3176,-1839,3454,5603 } }, // From LibRaw + { "Leaf Aptus-II 10R", 0, 0, + { 7167,1224,-158,-6929,14061,3176,-1826,3429,5562 } }, // From LibRaw + { "Leaf Aptus-II 10", 0, 0, + { 7527,1285,-166,-6929,14061,3176,-1995,3747,6077 } }, // From LibRaw + { "Leaf Aptus-II 12", 0, 0, + { 7361,1257,-163,-6929,14061,3176,-1695,3182,5162 } }, // From LibRaw { "Leaf", 0, 0, { 8236,1746,-1314,-8251,15953,2428,-3673,5786,5771 } }, { "Mamiya ZD", 0, 0, @@ -8444,6 +8737,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8983,-2942,-963,-6556,14476,2237,-2426,2887,8014 } }, { "Minolta DiMAGE 7Hi", 0, 0xf7d, { 11368,-3894,-1242,-6521,14358,2339,-2475,3056,7285 } }, + { "Minolta DiMAGE 7i", 0, 0xf7d, + { 11050,-3791,-1199,-7875,15585,2434,-2797,3359,7560 } }, // From LibRaw { "Minolta DiMAGE 7", 0, 0xf7d, { 9144,-2777,-998,-6676,14556,2281,-2470,3019,7744 } }, { "Minolta DiMAGE A1", 0, 0xf8b, @@ -8484,6 +8779,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 } }, { "Nikon D3400", 0, 0, { 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 } }, + { "Nikon D3500", 0, 0, + { 8821,-2938,-785,-4178,12142,2287,-824,1651,6860 } }, // From LibRaw { "Nikon D300", 0, 0, { 9030,-1992,-715,-8465,16302,2255,-2689,3217,8069 } }, { "Nikon D3X", 0, 0, @@ -8526,6 +8823,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8178,-2245,-609,-4857,12394,2776,-1207,2086,7298 } }, { "Nikon D60", 0, 0, { 8736,-2458,-935,-9075,16894,2251,-1354,1242,8263 } }, + { "Nikon D6", 0, 0, + { 9028,-3423,-1035,-6321,14265,2217,-1013,1683,6928 } }, // From LibRaw { "Nikon D7000", 0, 0, { 8198,-2239,-724,-4871,12389,2798,-1043,2050,7181 } }, { "Nikon D7100", 0, 0, @@ -8534,6 +8833,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 } }, { "Nikon D7500", 0, 0, { 8813,-3210,-1036,-4703,12868,2021,-1054,1940,6129 } }, + { "Nikon D780", 0, 0, + { 9943,-3269,-839,-5323,13269,2259,-1198,2083,7557 } }, // From LibRaw { "Nikon D750", 0, 0, { 9020,-2890,-715,-4535,12436,2348,-934,1919,7086 } }, { "Nikon D700", 0, 0, @@ -8542,6 +8843,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 7732,-2422,-789,-8238,15884,2498,-859,783,7330 } }, { "Nikon D850", 0, 0, { 10405,-3755,-1270,-5461,13787,1793,-1040,2015,6785 } }, + { "Nikon D810A", 0, 0, + { 11973,-5685,-888,-1965,10326,1901,-115,1123,7169 } }, // From LibRaw { "Nikon D810", 0, 0, { 9369,-3195,-791,-4488,12430,2301,-893,1796,6872 } }, { "Nikon D800", 0, 0, @@ -8580,6 +8883,24 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8489,-2583,-1036,-8051,15583,2643,-1307,1407,7354 } }, { "Nikon E8800", 0, 0, { 7971,-2314,-913,-8451,15762,2894,-1442,1520,7610 } }, + { "Nikon Z 30", 0, 0, + { 10339,-3822,-890,-4183,12023,2436,-671,1638,7049 } }, // From LibRaw + { "Nikon Z 50", 0, 0, + { 11640,-4829,-1079,-5107,13006,2325,-972,1711,7380 } }, // From LibRaw + { "Nikon Z 5", 0, 0, + { 8695,-2558,-648,-5015,12711,2575,-1279,2215,7514 } }, // From LibRaw + { "Nikon Z 6", 0, 0, + { 9943,-3269,-839,-5323,13269,2259,-1198,2083,7557 } }, // 'Z 6'(v.2) // From LibRaw, 'Z 6_2' + { "Nikon Z 7", 0, 0, + { 13705,-6004,-1400,-5464,13568,2062,-940,1706,7618 } }, // 'Z 7'(v.2), 'Z 7_2' // From LibRaw + { "Nikon Z 8", 0, 0, + {11423,-4564,-1123,-4816,12895,2119,-210,1061,7282 } }, // From LibRaw + { "Nikon Z 9", 0, 0, + { 13389,-6049,-1441,-4544,12757,1969,229,498,7390 } }, // From LibRaw + { "Nikon Z fc", 0, 0, + { 11640,-4829,-1079,-5107,13006,2325,-972,1711,7380 } }, // From LibRaw + { "Nikon COOLPIX A1000", 0, 0, + { 10601,-3487,-1127,-2931,11443,1676,-587,1740,5278 } }, // From LibRaw { "Nikon COOLPIX A", 0, 0, { 8198,-2239,-724,-4871,12389,2798,-1043,2050,7181 } }, { "Nikon COOLPIX B700", 200, 0, @@ -8588,6 +8909,10 @@ void CLASS adobe_coeff (const char *make, const char *model) { 10321,-3920,-931,-2750,11146,1824,-442,1545,5539 } }, { "Nikon COOLPIX P340", 200, 0, { 10321,-3920,-931,-2750,11146,1824,-442,1545,5539 } }, + { "Nikon Coolpix P950", 0, 0, + { 13307, -5641, -1290, -2048, 10581, 1689, -64, 1222, 5176}}, // From LibRaw + { "Nikon COOLPIX P1000", 0, 0, + { 14294,-6116,-1333,-1628,10219,1637,-14,1158,5022 } }, // From LibRaw { "Nikon COOLPIX P6000", 0, 0, { 9698,-3367,-914,-4706,12584,2368,-837,968,5801 } }, { "Nikon COOLPIX P7000", 0, 0, @@ -8668,6 +8993,10 @@ void CLASS adobe_coeff (const char *make, const char *model) { 7575,-2159,-571,-3722,11341,2725,-1434,2819,6271 } }, { "Olympus E-P5", 0, 0, { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, + { "Olympus E-P7", 0, 0, + { 9476,-3182,-765,-2613,10958,1893,-449,1315,5268 } }, // From LibRaw + { "Olympus E-PL10", 0, 0, + { 9197,-3190,-659,-2606,10830,2039,-458,1250,5458 } }, // From LibRaw { "Olympus E-PL1s", 0, 0, { 11409,-3872,-1393,-4572,12757,2003,-709,1810,7415 } }, { "Olympus E-PL1", 0, 0, @@ -8690,12 +9019,20 @@ void CLASS adobe_coeff (const char *make, const char *model) { 7575,-2159,-571,-3722,11341,2725,-1434,2819,6271 } }, { "Olympus E-PM2", 0, 0, { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, + { "Olympus E-M10MarkIV", 0, 0, + { 9476,-3182,-765,-2613,10958,1893,-449,1315,5268 } }, // From LibRaw { "Olympus E-M10", 0, 0, /* also E-M10 Mark II & III */ { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, + { "Olympus E-M1X", 0, 0, + { 11896,-5110,-1076,-3181,11378,2048,-519,1224,5166 } }, // From LibRaw + { "Olympus E-M1MarkIII", 0, 0, + { 11896,-5110,-1076,-3181,11378,2048,-519,1224,5166 } }, // From LibRaw { "Olympus E-M1Mark II", 0, 0, { 9383,-3170,-763,-2457,10702,2020,-384,1236,5552 } }, { "Olympus E-M1", 0, 0, { 7687,-1984,-606,-4327,11928,2721,-1381,2339,6452 } }, + { "Olympus E-M5MarkIII", 0, 0, + { 11896,-5110,-1076,-3181,11378,2048,-519,1224,5166 } }, // From LibRaw { "Olympus E-M5MarkII", 0, 0, { 9422,-3258,-711,-2655,10898,2015,-512,1354,5512 } }, { "Olympus E-M5", 0, 0xfe1, @@ -8717,13 +9054,15 @@ void CLASS adobe_coeff (const char *make, const char *model) { 11597,-4006,-1049,-5432,12799,2957,-1029,1750,6516 } }, { "Olympus SP560UZ", 0, 0xff9, { 10915,-3677,-982,-5587,12986,2911,-1168,1968,6223 } }, + { "Olympus SP565UZ", 0, 0, + { 11856,-4469,-1159,-4814,12368,2756,-993,1779,5589 } }, // From LibRaw { "Olympus SP570UZ", 0, 0, { 11522,-4044,-1146,-4736,12172,2904,-988,1829,6039 } }, { "Olympus STYLUS1", 0, 0, { 8360,-2420,-880,-3928,12353,1739,-1381,2416,5173 } }, { "Olympus TG-4", 0, 0, { 11426,-4159,-1126,-2066,10678,1593,-120,1327,4998 } }, - { "Olympus TG-5", 0, 0, + { "Olympus TG-", 0, 0, // same CMs: TG-5, TG-6 { 10899,-3833,-1082,-2112,10736,1575,-267,1452,5269 } }, { "Olympus XZ-10", 0, 0, { 9777,-3483,-925,-2886,11297,1800,-602,1663,5134 } }, @@ -8733,6 +9072,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 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 + { "OM Digital Solutions OM-5", 0, 0, + { 11896, -5110, -1076, -3181, 11378, 2048, -519, 1224, 5166 } }, // From LibRaw { "OmniVision", 0, 0, /* DJC */ { 12782,-4059,-379,-478,9066,1413,1340,1513,5176 } }, { "Pentax *ist DL2", 0, 0, @@ -8745,6 +9086,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 10371,-2333,-1206,-8688,16231,2602,-1230,1116,11282 } }, { "Pentax *ist D", 0, 0, { 9651,-2059,-1189,-8881,16512,2487,-1460,1345,10687 } }, + { "Pentax K-01", 0, 0, + { 8134,-2728,-645,-4365,11987,2694,-838,1509,6498 } }, // From LibRaw { "Pentax K10D", 0, 0, { 9566,-2863,-803,-7170,15172,2112,-818,803,9705 } }, { "Pentax K1", 0, 0, @@ -8765,10 +9108,16 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8596,-2981,-639,-4202,12046,2431,-685,1424,6122 } }, { "Pentax K-30", 0, 0, { 8710,-2632,-1167,-3995,12301,1881,-981,1719,6535 } }, + { "Pentax K-3 Mark III", 0, 0, + { 9251, -3817, -1069, -4627, 12667, 2175, -798, 1660, 5633 } }, // From LibRaw { "Pentax K-3 II", 0, 0, { 8626,-2607,-1155,-3995,12301,1881,-1039,1822,6925 } }, { "Pentax K-3", 0, 0, { 7415,-2052,-721,-5186,12788,2682,-1446,2157,6773 } }, + { "Pentax K-500", 0, 0, + { 8109,-2740,-608,-4593,12175,2731,-1006,1515,6545 } }, // From LibRaw + { "Pentax K-50", 0, 0, + { 8109,-2740,-608,-4593,12175,2731,-1006,1515,6545 } }, // From LibRaw { "Pentax K-5 II", 0, 0, { 8170,-2725,-639,-4440,12017,2744,-771,1465,6599 } }, { "Pentax K-5", 0, 0, @@ -8785,8 +9134,18 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8617,-3228,-1034,-4674,12821,2044,-803,1577,5728 } }, { "Pentax Q-S1", 0, 0, { 12995,-5593,-1107,-1879,10139,2027,-64,1233,4919 } }, + { "Pentax Q7", 0, 0, + { 10901,-3938,-1025,-2743,11210,1738,-823,1805,5344 } }, // From LibRaw + { "Pentax Q10", 0, 0, + { 11562,-4183,-1172,-2357,10919,1641,-582,1726,5112 } }, // From LibRaw + { "Pentax Q", 0, 0, + { 11731,-4169,-1267,-2015,10727,1473,-217,1492,4870 } }, // From LibRaw + { "Pentax MX-1", 0, 0, + { 9296,-3146,-888,-2860,11287,1783,-618,1698,5151 } }, // From LibRaw { "Pentax 645D", 0, 0x3e00, { 10646,-3593,-1158,-3329,11699,1831,-667,2874,6287 } }, + { "Pentax 645Z", 0, 0, + { 9519,-3591,-664,-4074,11725,2671,-624,1501,6653 } }, // From LibRaw { "Panasonic DMC-CM1", 15, 0, { 8770,-3194,-820,-2871,11281,1803,-513,1552,4434 } }, { "Panasonic DC-FZ80", 0, 0, @@ -8825,6 +9184,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 11340,-4069,-1275,-7555,15266,2448,-2960,3426,7685 } }, { "Leica DIGILUX 2", 0, 0, { 11340,-4069,-1275,-7555,15266,2448,-2960,3426,7685 } }, + { "Panasonic DC-LX100M2", 15, 0, + { 8585,-3127,-833,-4005,12250,1953,-650,1494,4862 } }, // v.2 // From LibRaw { "Panasonic DMC-LX100", 15, 0, { 8844,-3538,-768,-3709,11762,2200,-698,1792,5220 } }, { "Leica D-LUX (Typ 109)", 15, 0, @@ -8855,6 +9216,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 10148,-3743,-991,-2837,11366,1659,-701,1893,4899 } }, { "Panasonic DMC-LX9", 15, 0, { 7790,-2736,-755,-3452,11870,1769,-628,1647,4898 } }, + { "Panasonic DC-FZ10002", 15, 0, + { 9803,-4185,-992,-4066,12578,1628,-838,1824,5288 } }, // From LibRaw { "Panasonic DMC-FZ1000", 15, 0, { 7830,-2696,-763,-3325,11667,1866,-641,1712,4824 } }, { "Leica V-LUX (Typ 114)", 15, 0, @@ -8889,8 +9252,26 @@ void CLASS adobe_coeff (const char *make, const char *model) { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, { "Panasonic DMC-G8", 15, 0xfff, /* G8, G80, G81, G85 */ { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, + { "Panasonic DC-S1R", 0, 0, + { 11822,-5321,-1249,-5958,15114,766,-614,1264,7043 } }, // From LibRaw + { "Panasonic DC-S1H", 0, 0, + { 9397,-3719,-805,-5425,13326,2309,-972,1715,6034 } }, // From LibRaw + { "Panasonic DC-S1", 0, 0, + { 9744,-3905,-779,-4899,12807,2324,-798,1630,5827 } }, // From LibRaw + { "Panasonic DC-S5M2", 0, 0, /* DC-S5M2, DC-S5M2X */ + { 10308,-4206,-783,-4088,12102,2229,-125,1051,5912 } }, + { "Panasonic DC-S5", 0, 0, + { 9744,-3905,-779,-4899,12807,2324,-798,1630,5827 } }, // From LibRaw + { "Panasonic DC-G99", 15, 0, + { 9657,-3963,-748,-3361,11378,2258,-568,1415,5158 } }, // From LibRaw + { "Panasonic DC-G100", 15, 0, + { 8370,-2869,-710,-3389,11372,2298,-640,1599,4887 } }, // From LibRaw + { "Panasonic DC-G9M2", 0, 0, + { 8325,-3456,-623,-4330,12089,2528,-860,2646,5984 } }, { "Panasonic DC-G9", 15, 0xfff, { 7685,-2375,-634,-3687,11700,2249,-748,1546,5111 } }, + { "Panasonic DC-GF10", 15, 0, + { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, // From LibRaw { "Panasonic DMC-GF1", 15, 0xf92, { 7888,-1902,-1011,-8106,16085,2099,-2353,2866,7330 } }, { "Panasonic DMC-GF2", 15, 0xfff, @@ -8917,8 +9298,12 @@ void CLASS adobe_coeff (const char *make, const char *model) { 7122,-2108,-512,-3155,11201,2231,-541,1423,5045 } }, { "Panasonic DC-GH5S", 15, 0, { 6929,-2355,-708,-4192,12534,1828,-1097,1989,5195 } }, + { "Panasonic DC-GH5M2", 0, 0, + { 9300,-3659,-755,-2981,10988,2287,-190,1077,5016 } }, { "Panasonic DC-GH5", 15, 0, { 7641,-2336,-605,-3218,11299,2187,-485,1338,5121 } }, + { "Panasonic DC-GH6", 0, 0, + { 7949,-3491,-710,-3435,11681,1977,-503,1622,5065 } }, { "Panasonic DMC-GM1", 15, 0, { 6770,-1895,-744,-5232,13145,2303,-1664,2691,5703 } }, { "Panasonic DMC-GM5", 15, 0, @@ -8947,28 +9332,74 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8550,-2908,-842,-3195,11529,1881,-338,1603,4631 } }, { "Panasonic DMC-ZS70", 15, 0, { 9052,-3117,-883,-3045,11346,1927,-205,1520,4730 } }, + { "Panasonic DMC-ZS80", 15, 0, + { 12194,-5340,-1329,-3035,11394,1858,-50,1418,5219 } }, // From LibRaw { "Leica S (Typ 007)", 0, 0, { 6063,-2234,-231,-5210,13787,1500,-1043,2866,6997 } }, + { "Leica X2", 0, 0, + { 8336,-2853,-699,-4425,11989,2760,-954,1625,6396 } }, // From LibRaw + { "Leica X1", 0, 0, + { 9055,-2611,-666,-4906,12652,2519,-555,1384,7417 } }, // From LibRaw { "Leica X", 0, 0, /* X and X-U, both (Typ 113) */ { 7712,-2059,-653,-3882,11494,2726,-710,1332,5958 } }, { "Leica Q (Typ 116)", 0, 0, { 11865,-4523,-1441,-5423,14458,935,-1587,2687,4830 } }, + { "Leica Q2", 0, 0, + { 12312,-5440,-1307,-6408,15499,824,-1075,1677,7220 } }, // From LibRaw { "Leica M (Typ 262)", 0, 0, { 6653,-1486,-611,-4221,13303,929,-881,2416,7226 } }, + { "Leica M (Typ 2", 0, 0, // same CMs: "M (Typ 240)", "M-D (Typ 262)" + { 7199,-2140,-712,-4005,13327,649,-810,2521,6673 } }, // From LibRaw { "Leica SL (Typ 601)", 0, 0, { 11865,-4523,-1441,-5423,14458,935,-1587,2687,4830 } }, + { "Leica S2", 0, 0, + { 5627,-721,-447,-4423,12456,2192,-1048,2948,7379 } }, // From LibRaw + { "Leica S3", 0, 0, + { 5092,-1630,-470,-6313,14297,2170,-1603,3135,5982 } }, // From LibRaw + { "Leica S", 0, 0, // same CMs: "S-E (Typ 006)", "S (Typ 006)" + { 5749,-1072,-382,-4274,12432,2048,-1166,3104,7105 } }, // From LibRaw { "Leica TL2", 0, 0, { 5836,-1626,-647,-5384,13326,2261,-1207,2129,5861 } }, { "Leica TL", 0, 0, { 5463,-988,-364,-4634,12036,2946,-766,1389,6522 } }, + { "Leica T", 0, 0, // same CMs: TL, "T (Typ 701)" + { 6295,-1679,-475,-5586,13046,2837,-1410,1889,7075 } }, // From LibRaw { "Leica CL", 0, 0, { 7414,-2393,-840,-5127,13180,2138,-1585,2468,5064 } }, + { "Leica M8", 0, 0, + { 7675,-2196,-305,-5860,14119,1856,-2425,4006,6578 } }, // From LibRaw + { "Leica M9", 0, 0, + { 6687,-1751,-291,-3556,11373,2492,-548,2204,7146 } }, // From LibRaw { "Leica M10", 0, 0, { 8249,-2849,-620,-5415,14756,565,-957,3074,6517 } }, { "Phase One H 20", 0, 0, /* DJC */ { 1313,1855,-109,-6715,15908,808,-327,1840,6020 } }, { "Phase One H 25", 0, 0, { 2905,732,-237,-8134,16626,1476,-3038,4253,7517 } }, + { "Phase One IQ140", 0, 0, + { 8035,435,-962,-6001,13872,2320,-1159,3065,5434 } }, // From LibRaw + { "Phase One IQ150", 0, 0, + {10325,845,-604,-4113,13385,481,-1791,4163,6924}}, /* temp */ /* emb // From LibRaw */ + { "Phase One IQ160", 0, 0, + { 8035,435,-962,-6001,13872,2320,-1159,3065,5434 } }, // From LibRaw + { "Phase One IQ180", 0, 0, + { 6294,686,-712,-5435,13417,2211,-1006,2435,5042 } }, // From LibRaw + { "Phase One IQ250",0, 0, + {10325,845,-604,-4113,13385,481,-1791,4163,6924}}, /* emb */ // From LibRaw + { "Phase One IQ260", 0, 0, + { 8035,435,-962,-6001,13872,2320,-1159,3065,5434 } }, // From LibRaw + { "Phase One IQ280", 0, 0, + { 6294,686,-712,-5435,13417,2211,-1006,2435,5042 } }, // From LibRaw + { "Phase One IQ3 100MP", 0, 0, + { 10999,354,-742,-4590,13342,937,-1060,2166,8120} }, /* emb */ // From LibRaw + { "Phase One IQ3 50MP", 0, 0, + {10058,1079,-587,-4135,12903,944,-916,2726,7480}}, /* emb */ // From LibRaw + { "Phase One IQ3 60MP", 0, 0, + { 8035,435,-962,-6001,13872,2320,-1159,3065,5434 } }, // From LibRaw + { "Phase One IQ3 80MP", 0, 0, + { 6294,686,-712,-5435,13417,2211,-1006,2435,5042 } }, // From LibRaw + { "Phase One P21", 0, 0, + { 6516,-2050,-507,-8217,16703,1479,-3492,4741,8489 } }, // From LibRaw { "Phase One P 2", 0, 0, { 2905,732,-237,-8134,16626,1476,-3038,4253,7517 } }, { "Phase One P 30", 0, 0, @@ -8981,20 +9412,60 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8035,435,-962,-6001,13872,2320,-1159,3065,5434 } }, { "Photron BC2-HD", 0, 0, /* DJC */ { 14603,-4122,-528,-1810,9794,2017,-297,2763,5936 } }, + { "Polaroid x530", 0, 0, + { 13458,-2556,-510,-5444,15081,205,0,0,12120 } }, // From LibRaw { "Red One", 704, 0xffff, /* DJC */ { 21014,-7891,-2613,-3056,12201,856,-2203,5125,8042 } }, + { "Ricoh S10 24-72mm F2.5-4.4 VC", 0, 0, + { 10531,-4043,-878,-2038,10270,2052,-107,895,4577 } }, // From LibRaw + { "Ricoh GR A12 50mm F2.5 MACRO", 0, 0, + { 8849,-2560,-689,-5092,12831,2520,-507,1280,7104 } }, // From LibRaw + { "Ricoh GR DIGITAL 2", 0, 0, + { 8846,-2704,-729,-5265,12708,2871,-1471,1955,6218 } }, // From LibRaw + { "Ricoh GR DIGITAL 3", 0, 0, + { 8170,-2496,-655,-5147,13056,2312,-1367,1859,5265 } }, // From LibRaw + { "Ricoh GR DIGITAL 4", 0, 0, + { 8771,-3151,-837,-3097,11015,2389,-703,1343,4924 } }, // From LibRaw + { "Ricoh GR III", 0, 0, + { 6127,-1777,-585,-5913,13699,2428,-1088,1780,6017 } }, // From LibRaw { "Ricoh GR II", 0, 0, { 4630,-834,-423,-4977,12805,2417,-638,1467,6115 } }, { "Ricoh GR", 0, 0, { 3708,-543,-160,-5381,12254,3556,-1471,1929,8234 } }, + { "Ricoh GX200", 0, 0, + { 8040,-2368,-626,-4659,12543,2363,-1125,1581,5660 } }, // From LibRaw + { "Ricoh GXR Mount A12", 0, 0, + { 7834,-2182,-739,-5453,13409,2241,-952,2005,6620 } }, // From LibRaw + { "Ricoh GXR A12 50mm", 0, 0, + { 8849,-2560,-689,-5092,12831,2520,-507,1280,7104 } }, // From LibRaw + { "Ricoh GXR A12 28mm", 0, 0, + { 10228,-3159,-933,-5304,13158,2371,-943,1873,6685 } }, // From LibRaw + { "Ricoh GXR A16", 0, 0, + { 7837,-2538,-730,-4370,12184,2461,-868,1648,5830 } }, // From LibRaw + { "Ricoh GXR P10", 0, 0, + { 13168,-5128,-1663,-3006,11569,1611,-373,1244,4907 } }, // From LibRaw + { "Ricoh GXR S10", 0, 0, + { 8963,-2926,-754,-4881,12921,2164,-1464,1944,4901 } }, // From LibRaw { "Samsung EX1", 0, 0x3e00, { 8898,-2498,-994,-3144,11328,2066,-760,1381,4576 } }, { "Samsung EX2F", 0, 0x7ff, { 10648,-3897,-1055,-2022,10573,1668,-492,1611,4742 } }, { "Samsung EK-GN120", 0, 0, { 7557,-2522,-739,-4679,12949,1894,-840,1777,5311 } }, + { "Samsung Galaxy S6", 0, 0, // same CMs: "Galaxy S6", "Galaxy S6 Edge" + { 13699,-5767,-1384,-4449,13879,499,-467,1691,5892 } }, // From LibRaw + { "Samsung Galaxy S7", 0, 0, // same CMs: "Galaxy S7", "Galaxy S7 Edge" + { 9927,-3704,-1024,-3935,12758,1257,-389,1512,4993 } }, // From LibRaw + { "Samsung Galaxy S8", 0, 0, // same CMs: "Galaxy S8", "Galaxy S8+" + { 9927,-3704,-1024,-3935,12758,1257,-389,1512,4993 } }, // From LibRaw + { "Samsung Galaxy S9", 0, 0, // same CMs: "Galaxy S9", "Galaxy S9+" + { 13292,-6142,-1268,-4095,12890,1283,-557,1930,5163 } }, // From LibRaw + { "Samsung Galaxy Note 9 Rear Camera", 0, 0, + { 13292,-6142,-1268,-4095,12890,1283,-557,1930,5163 } }, // From LibRaw { "Samsung NX mini", 0, 0, { 5222,-1196,-550,-6540,14649,2009,-1666,2819,5657 } }, + { "Samsung NX U", 0, 0, + { 7557,-2522,-739,-4679,12949,1894,-840,1777,5311 } }, // From LibRaw { "Samsung NX3300", 0, 0, { 8060,-2933,-761,-4504,12890,1762,-630,1489,5227 } }, { "Samsung NX3000", 0, 0, @@ -9021,6 +9492,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 10686,-4042,-1052,-3595,13238,276,-464,1259,5931 } }, { "Samsung WB2000", 0, 0xfff, { 12093,-3557,-1155,-1000,9534,1733,-22,1787,4576 } }, + { "Samsung WB5000", 0, 0, + { 7675, -2195, -305, -5860, 14118, 1857, -2425, 4007, 6578}}, // From LibRaw { "Samsung GX-1", 0, 0, { 10504,-2438,-1189,-8603,16207,2531,-1022,863,12242 } }, { "Samsung GX20", 0, 0, /* copied from Pentax K20D */ @@ -9035,6 +9508,20 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8512,-2641,-694,-8042,15670,2526,-1821,2117,7414 } }, { "Sony DSC-V3", 0, 0, { 7511,-2571,-692,-7894,15088,3060,-948,1111,8128 } }, + { "Sony DSC-HX9", 200, 0, // same CMs: DSC-HX95, DSC-HX99. RT: BL divided by 4 + { 13076,-5686,-1481,-4027,12851,1251,-167,725,4937 } }, // From LibRaw + { "Sony ZV-1", 200, 0, // same CMs: ZV-1, ZV-1B, ZV-1M2. RT: BL divided by 4 + { 8280,-2987,-703,-3531,11645,2133,-550,1542,5312 } }, // From LibRaw + { "Sony ZV-E10", 0, 0, + { 6355,-2067,-490,-3653,11542,2400,-406,1258,5506 } }, // From LibRaw + { "Sony ZV-E1", 0, 0, + { 6912,-2127,-469,-4470,12175,2587,-398,1478,6492 } }, // From LibRaw + { "Sony DSC-RX100M7", 0, 0, + {10315, -4390, -937, -4859, 12734, 2365, -734, 1537, 5997 } }, // From LibRaw + { "Sony DSC-RX100M6", 0, 0, + { 7325,-2321,-596,-3494,11674,2055,-668,1562,5031 } }, // From LibRaw + { "Sony DSC-RX100M5A", 0, 0, + { 11176,-4700,-965,-4004,12184,2032,-763,1726,5876 } }, // From LibRaw { "Sony DSC-RX100M", 0, 0, /* M2, M3, M4, and M5 */ { 6596,-2079,-562,-4782,13016,1933,-970,1581,5181 } }, { "Sony DSC-RX100", 0, 0, @@ -9045,6 +9532,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6679,-1825,-745,-5047,13256,1953,-1580,2422,5183 } }, { "Sony DSC-RX1RM2", 0, 0, { 6629,-1900,-483,-4618,12349,2550,-622,1381,6514 } }, + { "Sony DSC-RX1R", 0, 0, + { 6344,-1612,-462,-4863,12477,2681,-865,1786,6899 } }, // From LibRaw { "Sony DSC-RX1", 0, 0, { 6344,-1612,-462,-4863,12477,2681,-865,1786,6899 } }, { "Sony DSC-RX0", 200, 0, @@ -9085,26 +9574,56 @@ void CLASS adobe_coeff (const char *make, const char *model) { 5991,-1732,-443,-4100,11989,2381,-704,1467,5992 } }, { "Sony ILCA-99M2", 0, 0, { 6660,-1918,-471,-4613,12398,2485,-649,1433,6447 } }, - { "Sony ILCE-6", 0, 0, /* 6300, 6500 */ + { "Sony ILCE-1", 0, 0, + { 8161, -2947, -739, -4811, 12668, 2389, -437, 1229, 6524}}, // From LibRaw + { "Sony ILCE-6100", 0, 0, + { 7657,-2847,-607,-4083,11966,2389,-684,1418,5844 } }, // From LibRaw + { "Sony ILCE-6300", 0, 0, { 5973,-1695,-419,-3826,11797,2293,-639,1398,5789 } }, + { "Sony ILCE-6400", 0, 0, + { 7657,-2847,-607,-4083,11966,2389,-684,1418,5844 } }, // From LibRaw + { "Sony ILCE-6500", 0, 0, + { 5973,-1695,-419,-3826,11797,2293,-639,1398,5789 } }, + { "Sony ILCE-6600", 0, 0, + { 7657,-2847,-607,-4083,11966,2389,-684,1418,5844 } }, // From LibRaw + { "Sony ILCE-6700", 0, 0, + { 6972,-2408,-600,-4330,12101,2515,-388,1277,5847 } }, { "Sony ILCE-7M2", 0, 0, { 5271,-712,-347,-6153,13653,2763,-1601,2366,7242 } }, { "Sony ILCE-7M3", 0, 0, { 7374,-2389,-551,-5435,13162,2519,-1006,1795,6552 } }, + { "Sony ILCE-7M4", 0, 0, + { 7460,-2365,-588,-5687,13442,2474,-624,1156,6584 } }, // From LibRaw + { "Sony ILCE-7SM3", 0, 0, + { 6912,-2127,-469,-4470,12175,2587,-398,1478,6492 } }, // From LibRaw { "Sony ILCE-7S", 0, 0, /* also ILCE-7SM2 */ { 5838,-1430,-246,-3497,11477,2297,-748,1885,5778 } }, + { "Sony ILCE-7RM5", 0, 0, + { 8200, -2976, -719, -4296, 12053, 2532, -429, 1282, 5774 } }, // From LibRaw + { "Sony ILCE-7RM4", 0, 0, // same CMs: ILCE-7RM4, ILCE-7RM4A + { 7662, -2686,-660,-5240, 12965,2530, -796, 1508, 6167 } }, // From LibRaw { "Sony ILCE-7RM3", 0, 0, { 6640,-1847,-503,-5238,13010,2474,-993,1673,6527 } }, { "Sony ILCE-7RM2", 0, 0, { 6629,-1900,-483,-4618,12349,2550,-622,1381,6514 } }, { "Sony ILCE-7R", 0, 0, { 4913,-541,-202,-6130,13513,2906,-1564,2151,7183 } }, + { "Sony ILCE-7CR", 0, 0, + { 8200,-2976,-719,-4296,12053,2532,-429,1282,5774 } }, // temp // From LibRaw + { "Sony ILCE-7CM2", 0, 0, + { 7460,-2365,-588,-5687,13442,2474,-624,1156,6584 } }, // temp // From LibRaw + { "Sony ILCE-7C", 0, 0, + { 7374,-2389,-551,-5435,13162,2519,-1006,1795,6552 } }, // From LibRaw { "Sony ILCE-7", 0, 0, { 5271,-712,-347,-6153,13653,2763,-1601,2366,7242 } }, { "Sony ILCE-9", 0, 0, { 6389,-1703,-378,-4562,12265,2587,-670,1489,6550 } }, { "Sony ILCE", 0, 0, /* 3000, 5000, 5100, 6000, and QX1 */ { 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 } }, + { "Sony ILME-FX30", 0, 0, + { 6972, -2408, -600, -4330, 12101, 2515, -388, 1277, 5847 } }, // From LibRaw + { "Sony ILME-FX3", 0, 0, + { 6912, -2127, -469, -4470, 12175, 2587, -398, 1478, 6492 } }, // From LibRaw { "Sony NEX-5N", 0, 0, { 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 } }, { "Sony NEX-5R", 0, 0, @@ -9125,6 +9644,10 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6129,-1545,-418,-4930,12490,2743,-977,1693,6615 } }, { "Sony NEX-7", 0, 0, { 5491,-1192,-363,-4951,12342,2948,-911,1722,7192 } }, + { "Sony NEX-VG30", 0, 0, + { 6129,-1545,-418,-4930,12490,2743,-977,1693,6615 } }, // From LibRaw + { "Sony NEX-VG900", 0, 0, + { 6344,-1612,-462,-4863,12477,2681,-865,1786,6899 } }, // From LibRaw { "Sony NEX", 0, 0, /* NEX-C3, NEX-F3 */ { 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 } }, { "Sony SLT-A33", 0, 0, @@ -9676,7 +10199,7 @@ void CLASS identify() apply_tiff(); if (!strcmp(model, "X-T3")) { height = raw_height - 2; - } else if (!strcmp(model, "GFX 100") || !strcmp(model, "GFX100S")) { + } else if (!strcmp(model, "GFX 100") || !strcmp(model, "GFX100S") || !strcmp(model, "GFX100 II")) { load_flags = 0; } if (!load_raw) { @@ -10434,7 +10957,7 @@ konica_400z: filters = 0x16161616; load_raw = &CLASS packed_load_raw; load_flags = 30; - } else if (!strcmp(make,"Olympus")) { + } else if (!strcmp(make,"Olympus") || !strncmp(make, "OM Digi", 7)) { height += height & 1; if (exif_cfa) filters = exif_cfa; if (width == 4100) width -= 4; @@ -11151,70 +11674,6 @@ 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 diff --git a/rtengine/dcraw.h b/rtengine/dcraw.h index f932e2472..83112ce9e 100644 --- a/rtengine/dcraw.h +++ b/rtengine/dcraw.h @@ -24,7 +24,6 @@ #include "myfile.h" #include -#include "dnggainmap.h" #include "settings.h" class DCraw @@ -67,6 +66,7 @@ public: ,getbithuff(this,ifp,zero_after_ff) ,nikbithuff(ifp) { + shrink=0; memset(&hbd, 0, sizeof(hbd)); aber[0]=aber[1]=aber[2]=aber[3]=1; gamm[0]=0.45;gamm[1]=4.5;gamm[2]=gamm[3]=gamm[4]=gamm[5]=0; @@ -109,16 +109,24 @@ protected: unsigned black, cblack[4102], maximum, mix_green, raw_color, zero_is_bad; unsigned zero_after_ff, is_raw, dng_version, is_foveon, data_error; unsigned tile_width, tile_length, gpsdata[32], load_flags, row_padding; - bool xtransCompressed = false; + + struct fuji_q_table + { + int8_t *q_table; /* quantization table */ + int raw_bits; + int total_values; + int max_grad; // sdp val + int q_grad_mult; // quant_gradient multiplier + int q_base; + }; + struct fuji_compressed_params { - char *q_table; /* quantization table */ - int q_point[5]; /* quantization points */ + struct fuji_q_table qt[4]; + void *buf; int max_bits; int min_value; - int raw_bits; - int total_values; - int maxDiff; + int max_value; ushort line_width; }; @@ -135,6 +143,13 @@ protected: _ltotal }; + // tables of gradients for single sample level + struct fuji_grads + { + int_pair grads[41]; + int_pair lossy_grads[3][5]; + }; + struct fuji_compressed_block { int cur_bit; // current bit being read (from left to right) int cur_pos; // current position in a buffer @@ -144,13 +159,22 @@ protected: uchar *cur_buf; // currently read block int fillbytes; // Counter to add extra byte for block size N*16 rtengine::IMFILE *input; - struct int_pair grad_even[3][41]; // tables of gradients - struct int_pair grad_odd[3][41]; + fuji_grads even[3]; // tables of even gradients + fuji_grads odd[3]; // tables of odd gradients ushort *linealloc; ushort *linebuf[_ltotal]; }; - int fuji_total_lines, fuji_total_blocks, fuji_block_width, fuji_bits, fuji_raw_type; + /** + * Metadata for merged pixel-shift image. + */ + struct MergedPixelshift + { + bool is_merged_pixelshift = false; + unsigned sub_frame_shot_select; + }; + + int fuji_total_lines, fuji_total_blocks, fuji_block_width, fuji_bits, fuji_raw_type, fuji_lossless; ushort raw_height, raw_width, height, width, top_margin, left_margin; ushort shrink, iheight, iwidth, fuji_width, thumb_width, thumb_height; @@ -176,14 +200,7 @@ protected: ThreeValBool RT_matrix_from_constant; std::string RT_software; double RT_baseline_exposure; - - struct PanasonicRW2Info { - ushort bpp; - ushort encoding; - PanasonicRW2Info(): bpp(0), encoding(0) {} - }; - PanasonicRW2Info RT_pana_info; - std::vector gainMaps; + struct MergedPixelshift merged_pixelshift; public: struct CanonCR3Data { @@ -214,17 +231,34 @@ public: short CR3_CTMDtag; }; + struct PanasonicRW2Info { + struct v8_tags_t + { + uint32_t tag39[6]; + uint16_t tag3A[6]; + uint16_t tag3B; + uint16_t initial[4]; + uint16_t tag40a[17], tag40b[17], tag41[17]; + uint16_t stripe_count; // 0x42 + uint16_t tag43; + int64_t stripe_offsets[5]; //0x44 + uint16_t stripe_left[5]; // 0x45 + uint32_t stripe_compressed_size[5]; //0x46 + uint16_t stripe_width[5]; //0x47 + uint16_t stripe_height[5]; + }; + + ushort bpp; + ushort encoding; + v8_tags_t v8tags; + PanasonicRW2Info(): bpp(0), encoding(0), v8tags{} {} + }; + 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; @@ -235,9 +269,11 @@ public: protected: CanonCR3Data RT_canon_CR3_data; - + CanonLevelsData RT_canon_levels_data; + PanasonicRW2Info RT_pana_info; + float cam_mul[4], pre_mul[4], cmatrix[3][4], rgb_cam[3][4]; void (DCraw::*write_thumb)(); @@ -374,6 +410,8 @@ void adobe_copy_pixel (unsigned row, unsigned col, ushort **rp); void lossless_dng_load_raw(); void packed_dng_load_raw(); void deflate_dng_load_raw(); +void init_fuji_main_qtable(fuji_compressed_params *params, uchar q_base); +void init_fuji_main_grads(const fuji_compressed_params *params, fuji_compressed_block *info); void init_fuji_compr(struct fuji_compressed_params* info); void fuji_fill_buffer(struct fuji_compressed_block *info); void init_fuji_block(struct fuji_compressed_block* info, const struct fuji_compressed_params *params, INT64 raw_offset, unsigned dsize); @@ -381,8 +419,8 @@ void copy_line_to_xtrans(struct fuji_compressed_block* info, int cur_line, int c void copy_line_to_bayer(struct fuji_compressed_block* info, int cur_line, int cur_block, int cur_block_width); void fuji_zerobits(struct fuji_compressed_block* info, int *count); void fuji_read_code(struct fuji_compressed_block* info, int *data, int bits_to_read); -int fuji_decode_sample_even(struct fuji_compressed_block* info, const struct fuji_compressed_params * params, ushort* line_buf, int pos, struct int_pair* grads); -int fuji_decode_sample_odd(struct fuji_compressed_block* info, const struct fuji_compressed_params * params, ushort* line_buf, int pos, struct int_pair* grads); +int fuji_decode_sample_even(struct fuji_compressed_block* info, const struct fuji_compressed_params* params, ushort* line_buf, int pos, struct fuji_grads* grad_params); +int fuji_decode_sample_odd(struct fuji_compressed_block* info, const struct fuji_compressed_params* params, ushort* line_buf, int pos, struct fuji_grads* grad_params); void fuji_decode_interpolation_even(int line_width, ushort* line_buf, int pos); void fuji_extend_generic(ushort *linebuf[_ltotal], int line_width, int start, int end); void fuji_extend_red(ushort *linebuf[_ltotal], int line_width); @@ -390,11 +428,13 @@ void fuji_extend_green(ushort *linebuf[_ltotal], int line_width); void fuji_extend_blue(ushort *linebuf[_ltotal], int line_width); void xtrans_decode_block(struct fuji_compressed_block* info, const struct fuji_compressed_params *params); void fuji_bayer_decode_block(struct fuji_compressed_block* info, const struct fuji_compressed_params *params); -void fuji_decode_strip(const struct fuji_compressed_params* info_common, int cur_block, INT64 raw_offset, unsigned dsize); +void fuji_decode_strip (fuji_compressed_params* params, int cur_block, INT64 raw_offset, unsigned dsize, uchar *q_bases); void fuji_compressed_load_raw(); -void fuji_decode_loop(const struct fuji_compressed_params* common_info, int count, INT64* raw_block_offsets, unsigned *block_sizes); +void fuji_decode_loop(fuji_compressed_params* common_info, int count, INT64* raw_block_offsets, unsigned *block_sizes, uchar *q_bases); void parse_fuji_compressed_header(); -void fuji_14bit_load_raw(); +void fuji_14bit_load_raw(); +void pana8_decode_loop(void *data); +bool pana8_decode_strip(void* data, int stream); void pentax_load_raw(); void nikon_load_raw(); int nikon_is_compressed(); @@ -486,6 +526,7 @@ private: void panasonicC6_load_raw(); void panasonicC7_load_raw(); +void panasonicC8_load_raw(); void canon_rmf_load_raw(); void panasonic_load_raw(); diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 85661edd3..e630d1936 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -813,7 +813,8 @@ 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 (needstransform || ((todo & (M_TRANSFORM | M_RGBCURVE)) && params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled && params.colorappearance.modelmethod != "02")) { if (!transCrop) { transCrop = new Imagefloat(cropw, croph); } @@ -834,7 +835,8 @@ void Crop::update(int todo) transCrop = nullptr; } - if ((todo & (M_TRANSFORM | M_RGBCURVE)) && params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled && !params.colorappearance.enabled) { + // if ((todo & (M_TRANSFORM | M_RGBCURVE)) && params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled && !params.colorappearance.enabled) { + if ((todo & (M_TRANSFORM | M_RGBCURVE)) && params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled && params.colorappearance.modelmethod != "02") { const int W = baseCrop->getWidth(); const int H = baseCrop->getHeight(); @@ -896,6 +898,7 @@ void Crop::update(int todo) auto& locllmasCurve = parent->locllmasCurve; auto& lochhmasCurve = parent->lochhmasCurve; auto& lochhhmasCurve = parent->lochhhmasCurve; + auto& lochhhmascieCurve = parent->lochhhmascieCurve; auto& locccmasexpCurve = parent->locccmasexpCurve; auto& locllmasexpCurve = parent->locllmasexpCurve; auto& lochhmasexpCurve = parent->lochhmasexpCurve; @@ -935,6 +938,7 @@ void Crop::update(int todo) auto& locwavCurvejz = parent->locwavCurvejz; auto& loclmasCurveblwav = parent->loclmasCurveblwav; auto& loclmasCurvecolwav = parent->loclmasCurvecolwav; + auto& loclmasCurveciewav = parent->loclmasCurveciewav; auto& loclevwavCurve = parent->loclevwavCurve; auto& locconwavCurve = parent->locconwavCurve; auto& loccompwavCurve = parent->loccompwavCurve; @@ -958,6 +962,7 @@ void Crop::update(int todo) 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 lhhmascieutili = lochhhmascieCurve.Set(params.locallab.spots.at(sp).HHhmaskciecurve); 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); @@ -993,6 +998,7 @@ void Crop::update(int todo) 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 lmasutiliciewav = loclmasCurveciewav.Set(params.locallab.spots.at(sp).LLmaskciecurvewav); 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); @@ -1056,6 +1062,11 @@ void Crop::update(int todo) float stdretie = parent->stdretis[sp]; float fab = 1.f; + float maxicam = -1000.f; + float rdx, rdy, grx, gry, blx, bly = 0.f; + float meanx, meany, meanxe, meanye = 0.f; + int ill = 2; + int prim = 3; float minCD; float maxCD; float mini; @@ -1073,6 +1084,9 @@ void Crop::update(int todo) float Lnresi = 0.f; float Lhighresi46 = 0.f; float Lnresi46 = 0.f; + float contsig = params.locallab.spots.at(sp).contsigqcie; + + float lightsig = params.locallab.spots.at(sp).lightsigqcie; /* huerefp[sp] = huere; chromarefp[sp] = chromare; lumarefp[sp] = lumare; @@ -1111,7 +1125,7 @@ void Crop::update(int todo) czlocalcurve2,localczutili, czjzlocalcurve2,localczjzutili, - locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, lochhhmasCurve, lhhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, + locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, lochhhmasCurve, lhhmasutili, lochhhmascieCurve, lhhmascieutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmasvibCurve, lcmasvibutili, locllmasvibCurve, llmasvibutili, lochhmasvibCurve, lhmasvibutili, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, @@ -1127,6 +1141,7 @@ void Crop::update(int todo) lochhhmas_Curve, lhhmas_utili, loclmasCurveblwav,lmasutiliblwav, loclmasCurvecolwav,lmasutilicolwav, + loclmasCurveciewav,lmasutiliciewav, locwavCurve, locwavutili, locwavCurvejz, locwavutilijz, loclevwavCurve, loclevwavutili, @@ -1141,7 +1156,7 @@ void Crop::update(int todo) 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, + meantme, stdtme, meanretie, stdretie, fab, maxicam,rdx, rdy, grx, gry, blx, bly, meanx, meany, meanxe, meanye, prim, ill, contsig, lightsig, highresi, nresi, highresi46, nresi46, Lhighresi, Lnresi, Lhighresi46, Lnresi46); LocallabListener::locallabDenoiseLC denoiselc; @@ -1224,7 +1239,7 @@ void Crop::update(int todo) czlocalcurve2,localczutili, czjzlocalcurve2,localczjzutili, - locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili,lochhhmasCurve, lhhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, + locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili,lochhhmasCurve, lhhmasutili, lochhhmascieCurve, lhhmascieutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmasvibCurve, lcmasvibutili, locllmasvibCurve, llmasvibutili, lochhmasvibCurve, lhmasvibutili, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, @@ -1240,6 +1255,7 @@ void Crop::update(int todo) loclmasCurveblwav,lmasutiliblwav, loclmasCurvecolwav,lmasutilicolwav, + loclmasCurveciewav,lmasutiliciewav, locwavCurve, locwavutili, locwavCurvejz, locwavutilijz, loclevwavCurve, loclevwavutili, @@ -1253,7 +1269,7 @@ void Crop::update(int todo) 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, + meantme, stdtme, meanretie, stdretie, fab, maxicam, rdx, rdy, grx, gry, blx, bly, meanx, meany, meanxe, meanye, prim, ill, contsig, lightsig, highresi, nresi, highresi46, nresi46, Lhighresi, Lnresi, Lhighresi46, Lnresi46); } @@ -1316,21 +1332,24 @@ void Crop::update(int todo) 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)) { + // if ((params.colorappearance.enabled && !params.colorappearance.tonecie) || (!params.colorappearance.enabled)) { + if ((params.colorappearance.enabled && !params.colorappearance.tonecie) || (params.colorappearance.modelmethod != "02")) { parent->ipf.EPDToneMap(labnCrop, 0, skip); } //parent->ipf.EPDToneMap(labnCrop, 5, 1); //Go with much fewer than normal iterates for fast redisplay. // for all treatments Defringe, Sharpening, Contrast detail , Microcontrast they are activated if "CIECAM" function are disabled if (skip == 1) { - if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { + // if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { + if ((params.colorappearance.enabled && !settings->autocielab) || (params.colorappearance.modelmethod != "02")) { parent->ipf.impulsedenoise(labnCrop); parent->ipf.defringe(labnCrop); } parent->ipf.MLsharpen(labnCrop); - if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { + // if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { + if ((params.colorappearance.enabled && !settings->autocielab) || (params.colorappearance.modelmethod != "02")) { parent->ipf.MLmicrocontrast(labnCrop); parent->ipf.sharpening(labnCrop, params.sharpening, parent->sharpMask); } @@ -1339,7 +1358,8 @@ void Crop::update(int todo) // if (skip==1) { if (params.dirpyrequalizer.cbdlMethod == "aft") { - if (((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled))) { + // if (((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled))) { + if (((params.colorappearance.enabled && !settings->autocielab) || (params.colorappearance.modelmethod != "02"))) { parent->ipf.dirpyrequalizer(labnCrop, skip); // parent->ipf.Lanczoslab (labnCrop,labnCrop , 1.f/skip); } @@ -1599,7 +1619,7 @@ void Crop::update(int todo) parent->ipf.softLight(labnCrop, params.softlight); - if (params.icm.workingTRC != ColorManagementParams::WorkingTrc::NONE) { + if (params.icm.workingTRC != ColorManagementParams::WorkingTrc::NONE && params.icm.trcExp) { const int GW = labnCrop->W; const int GH = labnCrop->H; std::unique_ptr provis; @@ -1623,8 +1643,52 @@ void Crop::update(int todo) 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); + int locprim = 0; + bool gamutcontrol = params.icm.gamut; + int catc = rtengine::toUnderlying(params.icm.wcat); + float rdx, rdy, grx, gry, blx, bly = 0.f; + float meanx, meany, meanxe, meanye = 0.f; + parent->ipf.workingtrc(0, tmpImage1.get(), tmpImage1.get(), GW, GH, -5, prof, 2.4, 12.92310, 0, ill, 0, 0, rdx, rdy, grx, gry, blx, bly,meanx, meany, meanxe, meanye, cmsDummy, true, false, false, false); + parent->ipf.workingtrc(0, tmpImage1.get(), tmpImage1.get(), GW, GH, 5, prof, gamtone, slotone, catc, illum, prim, locprim, rdx, rdy, grx, gry, blx, bly, meanx, meany, meanxe, meanye, cmsDummy, false, true, true, gamutcontrol); + const int midton = params.icm.wmidtcie; + + if(midton != 0) { + ToneEqualizerParams params; + params.enabled = true; + params.regularization = 0.f; + params.pivot = 0.f; + params.bands[0] = 0; + params.bands[2] = midton; + params.bands[4] = 0; + params.bands[5] = 0; + int mid = abs(midton); + int threshmid = 50; + if(mid > threshmid) { + params.bands[1] = sign(midton) * (mid - threshmid); + params.bands[3] = sign(midton) * (mid - threshmid); + } + parent->ipf.toneEqualizer(tmpImage1.get(), params, prof, skip, false); + } + + const bool smoothi = params.icm.wsmoothcie; + if(smoothi) { + ToneEqualizerParams params; + params.enabled = true; + params.regularization = 0.f; + params.pivot = 0.f; + params.bands[0] = 0; + params.bands[1] = 0; + params.bands[2] = 0; + params.bands[3] = 0; + params.bands[4] = -40;//arbitrary value to adapt with WhiteEvjz - here White Ev # 10 + params.bands[5] = -80;//8 Ev and above + bool Evsix = true; + if(Evsix) {//EV = 6 majority of images + params.bands[4] = -15; + } + + parent->ipf.toneEqualizer(tmpImage1.get(), params, prof, skip, false); + } parent->ipf.rgb2lab(*tmpImage1, *labnCrop, params.icm.workingProfile); //labnCrop and provis @@ -1786,7 +1850,7 @@ bool check_need_larger_crop_for_lcp_distortion(int fw, int fh, int x, int y, int return false; } - return (params.lensProf.useDist && (params.lensProf.useLensfun() || params.lensProf.useLcp())); + return (params.lensProf.useDist && (params.lensProf.useLensfun() || params.lensProf.useLcp() || params.lensProf.useMetadata())); } } // namespace diff --git a/rtengine/dynamicprofile.cc b/rtengine/dynamicprofile.cc index 774d23ee9..3ae009537 100644 --- a/rtengine/dynamicprofile.cc +++ b/rtengine/dynamicprofile.cc @@ -24,6 +24,7 @@ #include #include #include +#include #include "rtengine.h" #include "../rtgui/options.h" @@ -174,9 +175,10 @@ bool DynamicProfileRules::loadRules() { dynamicRules.clear(); Glib::KeyFile kf; + const Glib::ustring fileName = Glib::build_filename (Options::rtdir, "dynamicprofile.cfg"); try { - if (!kf.load_from_file (Glib::build_filename (Options::rtdir, "dynamicprofile.cfg"))) { + if (!(Glib::file_test(fileName, Glib::FILE_TEST_EXISTS) && kf.load_from_file (fileName))) { return false; } } catch (Glib::Error &e) { diff --git a/rtengine/ffmanager.cc b/rtengine/ffmanager.cc index bd6428127..8a7d6a524 100644 --- a/rtengine/ffmanager.cc +++ b/rtengine/ffmanager.cc @@ -145,6 +145,7 @@ void ffInfo::updateRawImage() int H = ri->get_height(); int W = ri->get_width(); ri->compress_image(0); + ri->set_prefilters(); int rSize = W * ((ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS || ri->get_colors() == 1) ? 1 : 3); acc_t **acc = new acc_t*[H]; @@ -165,6 +166,7 @@ void ffInfo::updateRawImage() if( !temp->loadRaw(true)) { temp->compress_image(0); //\ TODO would be better working on original, because is temporary + temp->set_prefilters(); nFiles++; if( ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS || ri->get_colors() == 1 ) { @@ -204,6 +206,7 @@ void ffInfo::updateRawImage() ri = nullptr; } else { ri->compress_image(0); + ri->set_prefilters(); } } diff --git a/rtengine/fujicompressed.cc b/rtengine/fujicompressed.cc index c1c620657..0bae92356 100644 --- a/rtengine/fujicompressed.cc +++ b/rtengine/fujicompressed.cc @@ -31,75 +31,164 @@ int bitDiff (int value1, int value2) return decBits; } +static inline int log2ceil(int val) +{ + int result = 0; + if (val--) + do + ++result; + while (val >>= 1); + + return result; } -void CLASS init_fuji_compr (struct fuji_compressed_params* info) +void setup_qlut(int8_t *qt, int *q_point) { - int cur_val; - char *qt; + for (int curVal = -q_point[4]; curVal <= q_point[4]; ++qt, ++curVal) + { + if (curVal <= -q_point[3]) + *qt = -4; + else if (curVal <= -q_point[2]) + *qt = -3; + else if (curVal <= -q_point[1]) + *qt = -2; + else if (curVal < -q_point[0]) + *qt = -1; + else if (curVal <= q_point[0]) + *qt = 0; + else if (curVal < q_point[1]) + *qt = 1; + else if (curVal < q_point[2]) + *qt = 2; + else if (curVal < q_point[3]) + *qt = 3; + else + *qt = 4; + } +} +} // namespace + +void CLASS init_fuji_main_qtable(fuji_compressed_params *params, uchar q_base) +{ + fuji_q_table *qt = params->qt; + int qp[5]; + int maxVal = params->max_value + 1; + qp[0] = q_base; + qp[1] = 3 * q_base + 0x12; + qp[2] = 5 * q_base + 0x43; + qp[3] = 7 * q_base + 0x114; + qp[4] = params->max_value; + if (qp[1] >= maxVal || qp[1] < q_base + 1) + qp[1] = q_base + 1; + if (qp[2] < qp[1] || qp[2] >= maxVal) + qp[2] = qp[1]; + if (qp[3] < qp[2] || qp[3] >= maxVal) + qp[3] = qp[2]; + setup_qlut(qt->q_table, qp); + qt->q_base = q_base; + qt->max_grad = 0; + qt->total_values = (qp[4] + 2 * q_base) / (2 * q_base + 1) + 1; + qt->raw_bits = log2ceil(qt->total_values); + qt->q_grad_mult = 9; + params->max_bits = 4 * log2ceil(qp[4] + 1); +} + +void CLASS init_fuji_main_grads(const fuji_compressed_params *params, fuji_compressed_block *info) +{ + int max_diff = std::max(2, (params->qt->total_values + 0x20) >> 6); + for (int j = 0; j < 3; j++) { + for (int i = 0; i < 41; i++) { + info->even[j].grads[i].value1 = max_diff; + info->even[j].grads[i].value2 = 1; + info->odd[j].grads[i].value1 = max_diff; + info->odd[j].grads[i].value2 = 1; + } + } +} + +void CLASS init_fuji_compr (struct fuji_compressed_params* params) +{ if ((fuji_block_width % 3 && fuji_raw_type == 16) || (fuji_block_width & 1 && fuji_raw_type == 0)) { derror(); } - info->q_table = (char *) malloc (2 << fuji_bits); - merror (info->q_table, "init_fuji_compr()"); + size_t q_table_size = 2 << fuji_bits; + if (fuji_lossless) { + params->buf = malloc(q_table_size); + } else { + params->buf = malloc(3 * q_table_size); + } + merror (params->buf, "init_fuji_compr()"); if (fuji_raw_type == 16) { - info->line_width = (fuji_block_width * 2) / 3; + params->line_width = (fuji_block_width * 2) / 3; } else { - info->line_width = fuji_block_width >> 1; + params->line_width = fuji_block_width >> 1; } - info->q_point[0] = 0; - info->q_point[1] = 0x12; - info->q_point[2] = 0x43; - info->q_point[3] = 0x114; - info->q_point[4] = (1 << fuji_bits) - 1; - info->min_value = 0x40; + params->min_value = 0x40; + params->max_value = (1 << fuji_bits) - 1; - cur_val = -info->q_point[4]; - - for (qt = info->q_table; cur_val <= info->q_point[4]; ++qt, ++cur_val) { - if (cur_val <= -info->q_point[3]) { - *qt = -4; - } else if (cur_val <= -info->q_point[2]) { - *qt = -3; - } else if (cur_val <= -info->q_point[1]) { - *qt = -2; - } else if (cur_val < 0) { - *qt = -1; - } else if (cur_val == 0) { - *qt = 0; - } else if (cur_val < info->q_point[1]) { - *qt = 1; - } else if (cur_val < info->q_point[2]) { - *qt = 2; - } else if (cur_val < info->q_point[3]) { - *qt = 3; - } else { - *qt = 4; - } + // setup qtables + if (fuji_lossless) + { + // setup main qtable only, zero the rest + memset(params->qt + 1, 0, 3 * sizeof(fuji_q_table)); + params->qt[0].q_table = (int8_t *)params->buf; + params->qt[0].q_base = -1; + init_fuji_main_qtable(params, 0); } + else + { + // setup 3 extra qtables - main one will be set for each block + memset(params->qt, 0, sizeof(fuji_q_table)); + int qp[5]; - // 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(); - //} - info->total_values = (1 << fuji_bits); - info->raw_bits = fuji_bits; - info->max_bits = 4 * info->raw_bits; - info->maxDiff = info->total_values >> 6; + qp[0] = 0; + qp[4] = params->max_value; + + // table 0 + params->qt[1].q_table = (int8_t *)params->buf; + params->qt[1].q_base = 0; + params->qt[1].max_grad = 5; + params->qt[1].q_grad_mult = 3; + params->qt[1].total_values = qp[4] + 1; + params->qt[1].raw_bits = log2ceil(params->qt[1].total_values); + + qp[1] = qp[4] >= 0x12 ? 0x12 : qp[0] + 1; + qp[2] = qp[4] >= 0x43 ? 0x43 : qp[1]; + qp[3] = qp[4] >= 0x114 ? 0x114 : qp[2]; + setup_qlut(params->qt[1].q_table, qp); + + // table 1 + params->qt[2].q_table = params->qt[1].q_table + q_table_size; + params->qt[2].q_base = 1; + params->qt[2].max_grad = 6; + params->qt[2].q_grad_mult = 3; + params->qt[2].total_values = (qp[4] + 2) / 3 + 1; + params->qt[2].raw_bits = log2ceil(params->qt[2].total_values); + + qp[0] = params->qt[2].q_base; + qp[1] = qp[4] >= 0x15 ? 0x15 : qp[0] + 1; + qp[2] = qp[4] >= 0x48 ? 0x48 : qp[1]; + qp[3] = qp[4] >= 0x11B ? 0x11B : qp[2]; + setup_qlut(params->qt[2].q_table, qp); + + // table 2 + params->qt[3].q_table = params->qt[2].q_table + q_table_size; + params->qt[3].q_base = 2; + params->qt[3].max_grad = 7; + params->qt[3].q_grad_mult = 3; + params->qt[3].total_values = (qp[4] + 4) / 5 + 1; + params->qt[3].raw_bits = log2ceil(params->qt[3].total_values); + + qp[0] = params->qt[3].q_base; + qp[1] = qp[4] >= 0x18 ? 0x18 : qp[0] + 1; + qp[2] = qp[4] >= 0x4D ? 0x4D : qp[1]; + qp[3] = qp[4] >= 0x122 ? 0x122 : qp[2]; + setup_qlut(params->qt[3].q_table, qp); + } } #define FUJI_BUF_SIZE 0x10000u @@ -157,17 +246,26 @@ void CLASS init_fuji_block (struct fuji_compressed_block* info, const struct fuj info->cur_bit = 0; info->cur_pos = 0; info->cur_buf_offset = raw_offset; - - for (int j = 0; j < 3; j++) - for (int i = 0; i < 41; i++) { - info->grad_even[j][i].value1 = params->maxDiff; - info->grad_even[j][i].value2 = 1; - info->grad_odd[j][i].value1 = params->maxDiff; - info->grad_odd[j][i].value2 = 1; - } - info->cur_buf_size = 0; fuji_fill_buffer (info); + + // init grads for lossy and lossless + if (fuji_lossless) { + init_fuji_main_grads(params, info); + } else { + // init static grads for lossy only - main ones are done per line + for (int k = 0; k < 3; ++k) { + int max_diff = std::max(2, ((params->qt[k + 1].total_values + 0x20) >> 6)); + for (int j = 0; j < 3; ++j) { + for (int i = 0; i < 5; ++i) { + info->even[j].lossy_grads[k][i].value1 = max_diff; + info->even[j].lossy_grads[k][i].value2 = 1; + info->odd[j].lossy_grads[k][i].value1 = max_diff; + info->odd[j].lossy_grads[k][i].value2 = 1; + } + } + } + } } void CLASS copy_line_to_xtrans (struct fuji_compressed_block* info, int cur_line, int cur_block, int cur_block_width) @@ -278,7 +376,7 @@ void CLASS copy_line_to_bayer (struct fuji_compressed_block *info, int cur_line, } -#define fuji_quant_gradient(i,v1,v2) (9*i->q_table[i->q_point[4]+(v1)] + i->q_table[i->q_point[4]+(v2)]) +#define fuji_quant_gradient(max, q, v1, v2) (q->q_grad_mult * q->q_table[(max) + (v1)] + q->q_table[(max) + (v2)]) inline void CLASS fuji_zerobits (struct fuji_compressed_block* info, int *count) { @@ -340,7 +438,7 @@ inline void CLASS fuji_read_code (struct fuji_compressed_block* info, int *data, info->cur_bit = (8 - (bits_left_in_byte & 7)) & 7; } -int CLASS fuji_decode_sample_even (struct fuji_compressed_block* info, const struct fuji_compressed_params * params, ushort* line_buf, int pos, struct int_pair* grads) +int CLASS fuji_decode_sample_even (struct fuji_compressed_block* info, const struct fuji_compressed_params* params, ushort* line_buf, int pos, struct fuji_grads* grad_params) { int interp_val = 0; int errcnt = 0; @@ -354,11 +452,22 @@ int CLASS fuji_decode_sample_even (struct fuji_compressed_block* info, const str int grad, gradient, diffRcRb, diffRfRb, diffRdRb; - grad = fuji_quant_gradient (params, Rb - Rf, Rc - Rb); - gradient = std::abs (grad); - diffRcRb = std::abs (Rc - Rb); - diffRfRb = std::abs (Rf - Rb); - diffRdRb = std::abs (Rd - Rb); + diffRcRb = std::abs(Rc - Rb); + diffRfRb = std::abs(Rf - Rb); + diffRdRb = std::abs(Rd - Rb); + + const fuji_q_table *qt = params->qt; + int_pair *grads = grad_params->grads; + for (int i = 1; params->qt[0].q_base >= i && i < 4; ++i) { + if (diffRfRb + diffRcRb <= params->qt[i].max_grad) { + qt = params->qt + i; + grads = grad_params->lossy_grads[i - 1]; + break; + } + } + + grad = fuji_quant_gradient(params->max_value, qt, Rb - Rf, Rc - Rb); + gradient = std::abs(grad); if ( diffRcRb > diffRfRb && diffRcRb > diffRdRb ) { interp_val = Rf + Rd + 2 * Rb; @@ -371,16 +480,16 @@ int CLASS fuji_decode_sample_even (struct fuji_compressed_block* info, const str fuji_zerobits (info, &sample); - if (sample < params->max_bits - params->raw_bits - 1) { + if (sample < params->max_bits - qt->raw_bits - 1) { int decBits = bitDiff (grads[gradient].value1, grads[gradient].value2); fuji_read_code (info, &code, decBits); code += sample << decBits; } else { - fuji_read_code (info, &code, params->raw_bits); + fuji_read_code (info, &code, qt->raw_bits); code++; } - if (code < 0 || code >= params->total_values) { + if (code < 0 || code >= qt->total_values) { errcnt++; } @@ -400,19 +509,19 @@ int CLASS fuji_decode_sample_even (struct fuji_compressed_block* info, const str grads[gradient].value2++; if (grad < 0) { - interp_val = (interp_val >> 2) - code; + interp_val = (interp_val >> 2) - code * (2 * qt->q_base + 1); } else { - interp_val = (interp_val >> 2) + code; + interp_val = (interp_val >> 2) + code * (2 * qt->q_base + 1); } - if ( interp_val < 0 ) { - interp_val += params->total_values; - } else if (interp_val > params->q_point[4]) { - interp_val -= params->total_values; + if (interp_val < -qt->q_base) { + interp_val += qt->total_values * (2 * qt->q_base + 1); + } else if (interp_val > qt->q_base + params->max_value) { + interp_val -= qt->total_values * (2 * qt->q_base + 1); } - if ( interp_val >= 0 ) { - line_buf_cur[0] = std::min (interp_val, params->q_point[4]); + if (interp_val >= 0) { + line_buf_cur[0] = std::min(interp_val, params->max_value); } else { line_buf_cur[0] = 0; } @@ -420,7 +529,7 @@ int CLASS fuji_decode_sample_even (struct fuji_compressed_block* info, const str return errcnt; } -int CLASS fuji_decode_sample_odd (struct fuji_compressed_block* info, const struct fuji_compressed_params * params, ushort* line_buf, int pos, struct int_pair* grads) +int CLASS fuji_decode_sample_odd (struct fuji_compressed_block* info, const struct fuji_compressed_params* params, ushort* line_buf, int pos, struct fuji_grads* grad_params) { int interp_val = 0; int errcnt = 0; @@ -435,7 +544,20 @@ int CLASS fuji_decode_sample_odd (struct fuji_compressed_block* info, const stru int grad, gradient; - grad = fuji_quant_gradient (params, Rb - Rc, Rc - Ra); + int diffRcRa = std::abs(Rc - Ra); + int diffRbRc = std::abs(Rb - Rc); + + const fuji_q_table *qt = params->qt; + int_pair *grads = grad_params->grads; + for (int i = 1; params->qt[0].q_base >= i && i < 4; ++i) + if (diffRbRc + diffRcRa <= params->qt[i].max_grad) + { + qt = params->qt + i; + grads = grad_params->lossy_grads[i - 1]; + break; + } + + grad = fuji_quant_gradient(params->max_value, qt, Rb - Rc, Rc - Ra); gradient = std::abs (grad); if ((Rb > Rc && Rb > Rd) || (Rb < Rc && Rb < Rd)) { @@ -446,16 +568,16 @@ int CLASS fuji_decode_sample_odd (struct fuji_compressed_block* info, const stru fuji_zerobits (info, &sample); - if (sample < params->max_bits - params->raw_bits - 1) { + if (sample < params->max_bits - qt->raw_bits - 1) { int decBits = bitDiff (grads[gradient].value1, grads[gradient].value2); fuji_read_code (info, &code, decBits); code += sample << decBits; } else { - fuji_read_code (info, &code, params->raw_bits); + fuji_read_code (info, &code, qt->raw_bits); code++; } - if (code < 0 || code >= params->total_values) { + if (code < 0 || code >= qt->total_values) { errcnt++; } @@ -475,19 +597,19 @@ int CLASS fuji_decode_sample_odd (struct fuji_compressed_block* info, const stru grads[gradient].value2++; if (grad < 0) { - interp_val -= code; + interp_val -= code * (2 * qt->q_base + 1); } else { - interp_val += code; + interp_val += code * (2 * qt->q_base + 1); } - if ( interp_val < 0 ) { - interp_val += params->total_values; - } else if (interp_val > params->q_point[4]) { - interp_val -= params->total_values; + if (interp_val < -qt->q_base) { + interp_val += qt->total_values * (2 * qt->q_base + 1); + } else if (interp_val > qt->q_base + params->max_value) { + interp_val -= qt->total_values * (2 * qt->q_base + 1); } - if ( interp_val >= 0 ) { - line_buf_cur[0] = std::min (interp_val, params->q_point[4]); + if (interp_val >= 0) { + line_buf_cur[0] = std::min(interp_val, params->max_value); } else { line_buf_cur[0] = 0; } @@ -552,14 +674,14 @@ void CLASS xtrans_decode_block (struct fuji_compressed_block* info, const struct if (g_even_pos < line_width) { fuji_decode_interpolation_even (line_width, info->linebuf[_R2] + 1, r_even_pos); r_even_pos += 2; - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G2] + 1, g_even_pos, info->grad_even[0]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G2] + 1, g_even_pos, &info->even[0]); g_even_pos += 2; } if (g_even_pos > 8) { - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R2] + 1, r_odd_pos, info->grad_odd[0]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R2] + 1, r_odd_pos, &info->odd[0]); r_odd_pos += 2; - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G2] + 1, g_odd_pos, info->grad_odd[0]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G2] + 1, g_odd_pos, &info->odd[0]); g_odd_pos += 2; } } @@ -571,16 +693,16 @@ void CLASS xtrans_decode_block (struct fuji_compressed_block* info, const struct while (g_even_pos < line_width || g_odd_pos < line_width) { if (g_even_pos < line_width) { - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G3] + 1, g_even_pos, info->grad_even[1]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G3] + 1, g_even_pos, &info->even[1]); g_even_pos += 2; fuji_decode_interpolation_even (line_width, info->linebuf[_B2] + 1, b_even_pos); b_even_pos += 2; } if (g_even_pos > 8) { - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G3] + 1, g_odd_pos, info->grad_odd[1]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G3] + 1, g_odd_pos, &info->odd[1]); g_odd_pos += 2; - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B2] + 1, b_odd_pos, info->grad_odd[1]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B2] + 1, b_odd_pos, &info->odd[1]); b_odd_pos += 2; } } @@ -594,7 +716,7 @@ void CLASS xtrans_decode_block (struct fuji_compressed_block* info, const struct while (g_even_pos < line_width || g_odd_pos < line_width) { if (g_even_pos < line_width) { if (r_even_pos & 3) { - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_R3] + 1, r_even_pos, info->grad_even[2]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_R3] + 1, r_even_pos, &info->even[2]); } else { fuji_decode_interpolation_even (line_width, info->linebuf[_R3] + 1, r_even_pos); } @@ -605,9 +727,9 @@ void CLASS xtrans_decode_block (struct fuji_compressed_block* info, const struct } if (g_even_pos > 8) { - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R3] + 1, r_odd_pos, info->grad_odd[2]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R3] + 1, r_odd_pos, &info->odd[2]); r_odd_pos += 2; - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G4] + 1, g_odd_pos, info->grad_odd[2]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G4] + 1, g_odd_pos, &info->odd[2]); g_odd_pos += 2; } } @@ -620,22 +742,22 @@ void CLASS xtrans_decode_block (struct fuji_compressed_block* info, const struct while (g_even_pos < line_width || g_odd_pos < line_width) { if (g_even_pos < line_width) { - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G5] + 1, g_even_pos, info->grad_even[0]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G5] + 1, g_even_pos, &info->even[0]); g_even_pos += 2; if ((b_even_pos & 3) == 2) { fuji_decode_interpolation_even (line_width, info->linebuf[_B3] + 1, b_even_pos); } else { - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_B3] + 1, b_even_pos, info->grad_even[0]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_B3] + 1, b_even_pos, &info->even[0]); } b_even_pos += 2; } if (g_even_pos > 8) { - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G5] + 1, g_odd_pos, info->grad_odd[0]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G5] + 1, g_odd_pos, &info->odd[0]); g_odd_pos += 2; - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B3] + 1, b_odd_pos, info->grad_odd[0]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B3] + 1, b_odd_pos, &info->odd[0]); b_odd_pos += 2; } } @@ -651,18 +773,18 @@ void CLASS xtrans_decode_block (struct fuji_compressed_block* info, const struct if ((r_even_pos & 3) == 2) { fuji_decode_interpolation_even (line_width, info->linebuf[_R4] + 1, r_even_pos); } else { - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_R4] + 1, r_even_pos, info->grad_even[1]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_R4] + 1, r_even_pos, &info->even[1]); } r_even_pos += 2; - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G6] + 1, g_even_pos, info->grad_even[1]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G6] + 1, g_even_pos, &info->even[1]); g_even_pos += 2; } if (g_even_pos > 8) { - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R4] + 1, r_odd_pos, info->grad_odd[1]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R4] + 1, r_odd_pos, &info->odd[1]); r_odd_pos += 2; - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G6] + 1, g_odd_pos, info->grad_odd[1]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G6] + 1, g_odd_pos, &info->odd[1]); g_odd_pos += 2; } } @@ -679,7 +801,7 @@ void CLASS xtrans_decode_block (struct fuji_compressed_block* info, const struct g_even_pos += 2; if (b_even_pos & 3) { - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_B4] + 1, b_even_pos, info->grad_even[2]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_B4] + 1, b_even_pos, &info->even[2]); } else { fuji_decode_interpolation_even (line_width, info->linebuf[_B4] + 1, b_even_pos); } @@ -688,9 +810,9 @@ void CLASS xtrans_decode_block (struct fuji_compressed_block* info, const struct } if (g_even_pos > 8) { - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G7] + 1, g_odd_pos, info->grad_odd[2]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G7] + 1, g_odd_pos, &info->odd[2]); g_odd_pos += 2; - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B4] + 1, b_odd_pos, info->grad_odd[2]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B4] + 1, b_odd_pos, &info->odd[2]); b_odd_pos += 2; } } @@ -715,16 +837,16 @@ void CLASS fuji_bayer_decode_block (struct fuji_compressed_block *info, const st while (g_even_pos < line_width || g_odd_pos < line_width) { if (g_even_pos < line_width) { - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_R2] + 1, r_even_pos, info->grad_even[0]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_R2] + 1, r_even_pos, &info->even[0]); r_even_pos += 2; - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G2] + 1, g_even_pos, info->grad_even[0]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G2] + 1, g_even_pos, &info->even[0]); g_even_pos += 2; } if (g_even_pos > 8) { - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R2] + 1, r_odd_pos, info->grad_odd[0]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R2] + 1, r_odd_pos, &info->odd[0]); r_odd_pos += 2; - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G2] + 1, g_odd_pos, info->grad_odd[0]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G2] + 1, g_odd_pos, &info->odd[0]); g_odd_pos += 2; } } @@ -736,16 +858,16 @@ void CLASS fuji_bayer_decode_block (struct fuji_compressed_block *info, const st while (g_even_pos < line_width || g_odd_pos < line_width) { if (g_even_pos < line_width) { - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G3] + 1, g_even_pos, info->grad_even[1]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G3] + 1, g_even_pos, &info->even[1]); g_even_pos += 2; - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_B2] + 1, b_even_pos, info->grad_even[1]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_B2] + 1, b_even_pos, &info->even[1]); b_even_pos += 2; } if (g_even_pos > 8) { - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G3] + 1, g_odd_pos, info->grad_odd[1]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G3] + 1, g_odd_pos, &info->odd[1]); g_odd_pos += 2; - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B2] + 1, b_odd_pos, info->grad_odd[1]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B2] + 1, b_odd_pos, &info->odd[1]); b_odd_pos += 2; } } @@ -758,16 +880,16 @@ void CLASS fuji_bayer_decode_block (struct fuji_compressed_block *info, const st while (g_even_pos < line_width || g_odd_pos < line_width) { if (g_even_pos < line_width) { - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_R3] + 1, r_even_pos, info->grad_even[2]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_R3] + 1, r_even_pos, &info->even[2]); r_even_pos += 2; - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G4] + 1, g_even_pos, info->grad_even[2]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G4] + 1, g_even_pos, &info->even[2]); g_even_pos += 2; } if (g_even_pos > 8) { - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R3] + 1, r_odd_pos, info->grad_odd[2]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R3] + 1, r_odd_pos, &info->odd[2]); r_odd_pos += 2; - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G4] + 1, g_odd_pos, info->grad_odd[2]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G4] + 1, g_odd_pos, &info->odd[2]); g_odd_pos += 2; } } @@ -780,16 +902,16 @@ void CLASS fuji_bayer_decode_block (struct fuji_compressed_block *info, const st while (g_even_pos < line_width || g_odd_pos < line_width) { if (g_even_pos < line_width) { - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G5] + 1, g_even_pos, info->grad_even[0]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G5] + 1, g_even_pos, &info->even[0]); g_even_pos += 2; - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_B3] + 1, b_even_pos, info->grad_even[0]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_B3] + 1, b_even_pos, &info->even[0]); b_even_pos += 2; } if (g_even_pos > 8) { - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G5] + 1, g_odd_pos, info->grad_odd[0]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G5] + 1, g_odd_pos, &info->odd[0]); g_odd_pos += 2; - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B3] + 1, b_odd_pos, info->grad_odd[0]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B3] + 1, b_odd_pos, &info->odd[0]); b_odd_pos += 2; } } @@ -802,16 +924,16 @@ void CLASS fuji_bayer_decode_block (struct fuji_compressed_block *info, const st while (g_even_pos < line_width || g_odd_pos < line_width) { if (g_even_pos < line_width) { - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_R4] + 1, r_even_pos, info->grad_even[1]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_R4] + 1, r_even_pos, &info->even[1]); r_even_pos += 2; - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G6] + 1, g_even_pos, info->grad_even[1]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G6] + 1, g_even_pos, &info->even[1]); g_even_pos += 2; } if (g_even_pos > 8) { - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R4] + 1, r_odd_pos, info->grad_odd[1]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R4] + 1, r_odd_pos, &info->odd[1]); r_odd_pos += 2; - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G6] + 1, g_odd_pos, info->grad_odd[1]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G6] + 1, g_odd_pos, &info->odd[1]); g_odd_pos += 2; } } @@ -824,16 +946,16 @@ void CLASS fuji_bayer_decode_block (struct fuji_compressed_block *info, const st while (g_even_pos < line_width || g_odd_pos < line_width) { if (g_even_pos < line_width) { - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G7] + 1, g_even_pos, info->grad_even[2]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G7] + 1, g_even_pos, &info->even[2]); g_even_pos += 2; - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_B4] + 1, b_even_pos, info->grad_even[2]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_B4] + 1, b_even_pos, &info->even[2]); b_even_pos += 2; } if (g_even_pos > 8) { - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G7] + 1, g_odd_pos, info->grad_odd[2]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G7] + 1, g_odd_pos, &info->odd[2]); g_odd_pos += 2; - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B4] + 1, b_odd_pos, info->grad_odd[2]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B4] + 1, b_odd_pos, &info->odd[2]); b_odd_pos += 2; } } @@ -846,11 +968,21 @@ void CLASS fuji_bayer_decode_block (struct fuji_compressed_block *info, const st } } -void CLASS fuji_decode_strip (const struct fuji_compressed_params* info_common, int cur_block, INT64 raw_offset, unsigned dsize) +void CLASS fuji_decode_strip (fuji_compressed_params* params, int cur_block, INT64 raw_offset, unsigned dsize, uchar *q_bases) { int cur_block_width, cur_line; unsigned line_size; - struct fuji_compressed_block info; + fuji_compressed_block info; + fuji_compressed_params *info_common = params; + + if (!fuji_lossless) { + int buf_size = sizeof(fuji_compressed_params) + (2 << fuji_bits); + + info_common = (fuji_compressed_params *)malloc(buf_size); + memcpy(info_common, params, sizeof(fuji_compressed_params)); + info_common->qt[0].q_table = (int8_t *)(info_common + 1); + info_common->qt[0].q_base = -1; + } init_fuji_block (&info, info_common, raw_offset, dsize); line_size = sizeof (ushort) * (info_common->line_width + 2); @@ -869,6 +1001,17 @@ void CLASS fuji_decode_strip (const struct fuji_compressed_params* info_common, ztable[3] = {{_R2, 3}, {_G2, 6}, {_B2, 3}}; for (cur_line = 0; cur_line < fuji_total_lines; cur_line++) { + // init grads and main qtable + if (!fuji_lossless) + { + int q_base = q_bases ? q_bases[cur_line] : 0; + if (!cur_line || q_base != info_common->qt[0].q_base) + { + init_fuji_main_qtable(info_common, q_bases[cur_line]); + init_fuji_main_grads(info_common, &info); + } + } + if (fuji_raw_type == 16) { xtrans_decode_block (&info, info_common); } else { @@ -894,6 +1037,8 @@ void CLASS fuji_decode_strip (const struct fuji_compressed_params* info_common, } // release data + if (!fuji_lossless) + free (info_common); free (info.linealloc); #ifndef MYFILE_MMAP free (info.cur_buf); @@ -916,8 +1061,8 @@ void CLASS fuji_compressed_load_raw() struct fuji_compressed_params common_info; int cur_block; unsigned *block_sizes; + uchar *q_bases = 0; INT64 raw_offset, *raw_block_offsets; - //struct fuji_compressed_block info; init_fuji_compr (&common_info); @@ -927,17 +1072,30 @@ void CLASS fuji_compressed_load_raw() raw_block_offsets = (INT64*) malloc (sizeof (INT64) * fuji_total_blocks); merror (raw_block_offsets, "fuji_compressed_load_raw()"); - raw_offset = sizeof (unsigned) * fuji_total_blocks; + fseek(ifp, data_offset, SEEK_SET); + int sizesToRead = sizeof(unsigned) * fuji_total_blocks; + if (fread(block_sizes, 1, sizesToRead, ifp) != sizesToRead) + { + free(block_sizes); + free(raw_block_offsets); + derror(); + return; + } - if (raw_offset & 0xC) { - raw_offset += 0x10 - (raw_offset & 0xC); + raw_offset = ((sizeof(unsigned) * fuji_total_blocks) + 0xF) & ~0xF; + + // read q bases for lossy + if (!fuji_lossless) { + int total_q_bases = fuji_total_blocks * ((fuji_total_lines + 0xF) & ~0xF); + q_bases = (uchar *)malloc(total_q_bases); + merror (q_bases, "fuji_compressed_load_raw()"); + fseek(ifp, raw_offset + data_offset, SEEK_SET); + fread(q_bases, 1, total_q_bases, ifp); + raw_offset += total_q_bases; } raw_offset += data_offset; - fseek (ifp, data_offset, SEEK_SET); - fread (block_sizes, 1, sizeof (unsigned)*fuji_total_blocks, ifp); - raw_block_offsets[0] = raw_offset; // calculating raw block offsets @@ -950,33 +1108,34 @@ void CLASS fuji_compressed_load_raw() raw_block_offsets[cur_block] = raw_block_offsets[cur_block - 1] + block_sizes[cur_block - 1] ; } - fuji_decode_loop (&common_info, fuji_total_blocks, raw_block_offsets, block_sizes); + fuji_decode_loop (&common_info, fuji_total_blocks, raw_block_offsets, block_sizes, q_bases); - free (block_sizes); - free (raw_block_offsets); - free (common_info.q_table); + free(q_bases); + free(block_sizes); + free(raw_block_offsets); + free(common_info.buf); } -void CLASS fuji_decode_loop (const struct fuji_compressed_params* common_info, int count, INT64* raw_block_offsets, unsigned *block_sizes) +void CLASS fuji_decode_loop (fuji_compressed_params* common_info, int count, INT64* raw_block_offsets, unsigned *block_sizes, uchar *q_bases) { + const int lineStep = (fuji_total_lines + 0xF) & ~0xF; #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,1) // dynamic scheduling is faster if count > number of cores (e.g. count for GFX 50S is 12) #endif for (int cur_block = 0; cur_block < count ; cur_block++) { - fuji_decode_strip (common_info, cur_block, raw_block_offsets[cur_block], block_sizes[cur_block]); + fuji_decode_strip(common_info, cur_block, raw_block_offsets[cur_block], block_sizes[cur_block], q_bases ? q_bases + cur_block * lineStep : 0); } } - void CLASS parse_fuji_compressed_header() { uchar header[16]; ushort signature; - uchar version; + uchar lossless; uchar h_raw_type; uchar h_raw_bits; ushort h_raw_height; @@ -987,10 +1146,10 @@ void CLASS parse_fuji_compressed_header() ushort h_total_lines; fseek (ifp, data_offset, SEEK_SET); - fread (header, 1, sizeof (header), ifp); + if (fread(header, 1, sizeof (header), ifp) != sizeof(header)) return; signature = sgetn (2, header); - version = header[2]; + lossless = header[2]; h_raw_type = header[3]; h_raw_bits = header[4]; h_raw_height = sgetn (2, header + 5); @@ -1000,32 +1159,29 @@ void CLASS parse_fuji_compressed_header() h_blocks_in_row = header[13]; h_total_lines = sgetn (2, header + 14); - // general validation if (signature != 0x4953 - || version != 1 - || h_raw_height > 0x3000 + || lossless > 1 + || h_raw_height > 0x4002 || h_raw_height < 6 || h_raw_height % 6 - || h_raw_width > 0x3000 + || h_raw_width > 0x4200 || h_raw_width < 0x300 || h_raw_width % 24 - || h_raw_rounded_width > 0x3000 - || h_block_size != 0x300 + || h_raw_rounded_width > 0x4200 || h_raw_rounded_width < h_block_size || h_raw_rounded_width % h_block_size || h_raw_rounded_width - h_raw_width >= h_block_size + || h_block_size != 0x300 || h_blocks_in_row > 0x10 || h_blocks_in_row == 0 || h_blocks_in_row != h_raw_rounded_width / h_block_size - || h_total_lines > 0x800 + || h_total_lines > 0xAAB || h_total_lines == 0 || h_total_lines != h_raw_height / 6 || (h_raw_bits != 12 && h_raw_bits != 14 && h_raw_bits != 16) - || (h_raw_type != 16 && h_raw_type != 0)) { - xtransCompressed = false; - return; - } + || (h_raw_type != 16 && h_raw_type != 0)) + return; // modify data fuji_total_lines = h_total_lines; @@ -1033,6 +1189,7 @@ void CLASS parse_fuji_compressed_header() fuji_block_width = h_block_size; fuji_bits = h_raw_bits; fuji_raw_type = h_raw_type; + fuji_lossless = lossless; raw_width = h_raw_width; raw_height = h_raw_height; data_offset += 16; diff --git a/rtengine/iccmatrices.h b/rtengine/iccmatrices.h index be685b676..6c5203744 100644 --- a/rtengine/iccmatrices.h +++ b/rtengine/iccmatrices.h @@ -94,12 +94,50 @@ constexpr double xyz_jdcmax[3][3] = {//prim red 0.734702 0.265302 gr 0.021908 0. {0.8394088, 0.0163780, 0.1084133}, {0.3031122, 0.6954651, 0.0014227}, {-0.000048, 0.0357376, 0.7891671} + +/* + {0.878152, -0.035991, 0.122039},//stdA + {0.293869, 0.682893, 0.023238}, + {0.020725, 0.025411, 0.778763} +*/ +/* + {0.831816, 0.041363, 0.091021},//D80 + {0.307370, 0.714525, -0.021895}, + {-0.004335, 0.039442, 0.789793} + */ +}; + +constexpr double xyz_jdcmaxstdA[3][3] = {//prim red 0.734702 0.265302 gr 0.021908 0.930288 bl 0.120593 0.001583 + + {0.878152, -0.035991, 0.122039},//stdA + {0.293869, 0.682893, 0.023238}, + {0.020725, 0.025411, 0.778763} +}; + +constexpr double jdcmaxstdA_xyz[3][3] = { + + {1.1209647, 0.06568858, -0.177625},//stdA + {-0.481904, 1.437746, 0.03261678}, + {-0.0141074, -0.0486617, 1.28775} + }; constexpr double jdcmax_xyz[3][3] = { {1.1984508, -0.0197646, -0.1646037}, {-0.5223824, 1.4466349, 0.0691553}, {0.0236634, -0.0655113, 1.2640260} + + /* + {1.1209647, 0.06568858, -0.177625},//stdA + {-0.481904, 1.437746, 0.03261678}, + {-0.0141074, -0.0486617, 1.28775} + */ + /* + {1.2247276, -0.0630103, -0.142892},//D80 + {-0.525835, 1.424446, 0.100089}, + {0.032982, -0.0714782, 1.260371} + */ + }; diff --git a/rtengine/iccstore.cc b/rtengine/iccstore.cc index af1b94fbe..86a9c214b 100644 --- a/rtengine/iccstore.cc +++ b/rtengine/iccstore.cc @@ -197,9 +197,9 @@ cmsHPROFILE createXYZProfile() return rtengine::ICCStore::createFromMatrix(mat, false, "XYZ"); } -const double(*wprofiles[])[3] = {xyz_sRGB, xyz_adobe, xyz_prophoto, xyz_widegamut, xyz_jdcmax, xyz_beta, xyz_best, xyz_rec2020, xyz_ACESp0, xyz_ACESp1, xyz_bruce};// -const double(*iwprofiles[])[3] = {sRGB_xyz, adobe_xyz, prophoto_xyz, widegamut_xyz, jdcmax_xyz, beta_xyz, best_xyz, rec2020_xyz, ACESp0_xyz, ACESp1_xyz, bruce_xyz};// -const char* wpnames[] = {"sRGB", "Adobe RGB", "ProPhoto", "WideGamut", "JDCmax", "Beta RGB", "BestRGB", "Rec2020", "ACESp0", "ACESp1", "BruceRGB"};// +const double(*wprofiles[])[3] = {xyz_sRGB, xyz_adobe, xyz_prophoto, xyz_widegamut, xyz_jdcmax, xyz_jdcmaxstdA, xyz_beta, xyz_best, xyz_rec2020, xyz_ACESp0, xyz_ACESp1, xyz_bruce};// +const double(*iwprofiles[])[3] = {sRGB_xyz, adobe_xyz, prophoto_xyz, widegamut_xyz, jdcmax_xyz, jdcmaxstdA_xyz, beta_xyz, best_xyz, rec2020_xyz, ACESp0_xyz, ACESp1_xyz, bruce_xyz};// +const char* wpnames[] = {"sRGB", "Adobe RGB", "ProPhoto", "WideGamut", "JDCmax", "JDCmax stdA", "Beta RGB", "BestRGB", "Rec2020", "ACESp0", "ACESp1", "BruceRGB"};// //default = gamma inside profile //BT709 g=2.22 s=4.5 sRGB g=2.4 s=12.92310 //linear g=1.0 diff --git a/rtengine/imagedata.cc b/rtengine/imagedata.cc index 6507a970d..e9458f3ce 100644 --- a/rtengine/imagedata.cc +++ b/rtengine/imagedata.cc @@ -16,6 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ +#include #include #include #include @@ -27,6 +28,7 @@ #include #include +#include "dnggainmap.h" #include "imagedata.h" #include "imagesource.h" #include "metadata.h" @@ -63,6 +65,171 @@ auto to_long(const Iterator &iter, Integer n = Integer{0}) -> decltype( #endif } +/** + * Convenience class for reading data from a metadata tag's bytes value. + * + * It maintains an offset. Data is read starting from the offset, then the + * offset is advanced to the byte after the last byte read. + */ +class TagValueReader +{ + using DataContainer = std::vector; + using DataOffset = DataContainer::difference_type; + + DataContainer data; + DataOffset offset{0}; + Exiv2::ByteOrder defaultByteOrder; + + /** + * Reads a value at the current offset. + * + * @tparam T Value's type. + * @tparam getter Function that interprets the data using a given byte order + * and returns the value at a given location. + * @return The value. + */ + template + T readValue() + { + T value = getter(data.data() + offset, defaultByteOrder); + offset += sizeof(T); + return value; + } + +public: + /** + * Creates a reader for the given value with the given byte order. + * + * @param value The value. + * @param defaultByteOrder The byte order of the value's data. + */ + TagValueReader(const Exiv2::Value &value, Exiv2::ByteOrder defaultByteOrder = Exiv2::bigEndian) : + data(value.size()), + defaultByteOrder(defaultByteOrder) + { + value.copy(data.data(), Exiv2::invalidByteOrder); + } + + /** + * Returns the value's size in bytes. + */ + std::size_t size() const + { + return data.size(); + } + + /** + * Checks if the current offset is at or beyond the end of the data. + */ + bool isEnd() const + { + return offset > 0 && static_cast(offset) >= data.size(); + } + + /** + * Reads a double from the current offset and advances the offset. + */ + double readDouble() + { + return readValue(); + } + + /** + * Reads a float from the current offset and advances the offset. + */ + float readFloat() + { + return readValue(); + } + + /** + * Reads an unsigned integer from the current offset and advances the + * offset. + */ + std::uint32_t readUInt() + { + return readValue(); + } + + /** + * Sets the offset. + */ + void seekAbsolute(DataOffset newOffset) + { + offset = newOffset; + } + + /** + * Advances the offset by the given amount. + */ + void seekRelative(DataOffset offsetDifference) + { + offset += offsetDifference; + } +}; + +std::uint32_t readFixBadPixelsConstant(TagValueReader &reader) +{ + reader.seekRelative(12); // Skip DNG spec version, flags, and tag size. + return reader.readUInt(); +} + +GainMap readGainMap(TagValueReader &reader) +{ + reader.seekRelative(12); // Skip DNG spec version, flags, and tag size. + GainMap gainMap; + gainMap.Top = reader.readUInt(); + gainMap.Left = reader.readUInt(); + gainMap.Bottom = reader.readUInt(); + gainMap.Right = reader.readUInt(); + gainMap.Plane = reader.readUInt(); + gainMap.Planes = reader.readUInt(); + gainMap.RowPitch = reader.readUInt(); + gainMap.ColPitch = reader.readUInt(); + gainMap.MapPointsV = reader.readUInt(); + gainMap.MapPointsH = reader.readUInt(); + gainMap.MapSpacingV = reader.readDouble(); + gainMap.MapSpacingH = reader.readDouble(); + gainMap.MapOriginV = reader.readDouble(); + gainMap.MapOriginH = reader.readDouble(); + gainMap.MapPlanes = reader.readUInt(); + 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(reader.readFloat()); + } + return gainMap; +} + +void readOpcodesList( + const Exiv2::Value &value, + std::uint32_t *fixBadPixelsConstant, + bool *hasFixBadPixelsConstant, + std::vector *gainMaps) +{ + TagValueReader reader(value); + std::uint32_t ntags = reader.readUInt(); // read the number of opcodes + if (ntags >= reader.size() / 12) { // rough check for wrong value (happens for example with DNG files from DJI FC6310) + return; + } + while (ntags-- && !reader.isEnd()) { + unsigned opcode = reader.readUInt(); + if (opcode == 4 && (fixBadPixelsConstant || hasFixBadPixelsConstant)) { + const auto constant = readFixBadPixelsConstant(reader); + if (fixBadPixelsConstant) { + *fixBadPixelsConstant = constant; + } + if (hasFixBadPixelsConstant) { + *hasFixBadPixelsConstant = true; + } + } else if (opcode == 9 && gainMaps && gainMaps->size() < 4) { + gainMaps->push_back(readGainMap(reader)); + } else { + reader.seekRelative(8); // skip 8 bytes as they don't interest us currently + reader.seekRelative(reader.readUInt()); + } + } +} } namespace rtengine { @@ -107,6 +274,7 @@ FramesData::FramesData(const Glib::ustring &fname, time_t ts) : sampleFormat(IIOSF_UNKNOWN), isPixelShift(false), isHDR(false), + isDNG(false), w_(-1), h_(-1) { @@ -760,6 +928,24 @@ FramesData::FramesData(const Glib::ustring &fname, time_t ts) : #endif } } + + std::uint32_t dngVersion = 0; + if (find_exif_tag("Exif.Image.DNGVersion") && pos->count() == 4) { + for (int i = 0; i < 4; i++) { + dngVersion = (dngVersion << 8) + static_cast(to_long(pos, i)); + } + } + + isDNG = dngVersion; + + // Read DNG OpcodeList1. + if (dngVersion && (find_exif_tag("Exif.SubImage1.OpcodeList1") || find_exif_tag("Exif.Image.OpcodeList1"))) { + readOpcodesList(pos->value(), &fixBadPixelsConstant, &hasFixBadPixelsConstant_, nullptr); + } + // Read DNG OpcodeList2. + if (dngVersion && (find_exif_tag("Exif.SubImage1.OpcodeList2") || find_exif_tag("Exif.Image.OpcodeList2"))) { + readOpcodesList(pos->value(), nullptr, nullptr, &gain_maps_); + } } catch (const std::exception& e) { if (settings->verbose) { std::cerr << "EXIV2 ERROR: " << e.what() << std::endl; @@ -778,6 +964,11 @@ bool FramesData::getHDR() const return isHDR; } +bool FramesData::getDNG() const +{ + return isDNG; +} + std::string FramesData::getImageType() const { return isPixelShift ? "PS" : isHDR ? "HDR" : "STD"; @@ -1001,6 +1192,20 @@ void FramesData::fillBasicTags(Exiv2::ExifData &exif) const set_exif(exif, "Exif.Photo.DateTimeOriginal", buf); } +std::uint32_t FramesData::getFixBadPixelsConstant() const +{ + return fixBadPixelsConstant; +} + +bool FramesData::hasFixBadPixelsConstant() const +{ + return hasFixBadPixelsConstant_; +} + +std::vector FramesData::getGainMaps() const +{ + return gain_maps_; +} void FramesData::getDimensions(int &w, int &h) const { diff --git a/rtengine/imagedata.h b/rtengine/imagedata.h index 08f55bd62..5b9eb5d9a 100644 --- a/rtengine/imagedata.h +++ b/rtengine/imagedata.h @@ -22,6 +22,7 @@ #include #include +#include "dnggainmap.h" #include "imageio.h" #include "metadata.h" @@ -59,6 +60,10 @@ private: time_t modTimeStamp; bool isPixelShift; bool isHDR; + bool isDNG; + std::uint32_t fixBadPixelsConstant; + bool hasFixBadPixelsConstant_{false}; + std::vector gain_maps_; int w_; int h_; @@ -69,6 +74,7 @@ public: unsigned int getFrameCount() const override; bool getPixelShift() const override; bool getHDR() const override; + bool getDNG() const override; std::string getImageType() const override; IIOSampleFormat getSampleFormat() const override; bool hasExif() const override; @@ -88,6 +94,9 @@ public: std::string getOrientation() const override; Glib::ustring getFileName() const override; int getRating() const override; + std::uint32_t getFixBadPixelsConstant() const override; + bool hasFixBadPixelsConstant() const override; + std::vector getGainMaps() const override; void getDimensions(int &w, int &h) const override; void fillBasicTags(Exiv2::ExifData &exif) const; diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index e2c6c1310..36c16f0d2 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -25,6 +25,11 @@ #include #include +#ifdef LIBJXL +#include "jxl/decode_cxx.h" +#include "jxl/resizable_parallel_runner_cxx.h" +#endif + #include #include #include @@ -285,6 +290,7 @@ int ImageIO::loadPNG (const Glib::ustring &fname) if (png_get_valid(png, info, PNG_INFO_tRNS)) { png_set_tRNS_to_alpha(png); + png_set_strip_alpha(png); } if (color_type & PNG_COLOR_MASK_ALPHA) { @@ -479,7 +485,11 @@ int ImageIO::loadJPEGFromMemory (const char* buffer, int bufsize) int ImageIO::loadJPEG (const Glib::ustring &fname) { - FILE *file = g_fopen(fname.c_str (), "rb"); + std::unique_ptr file( + g_fopen(fname.c_str(), "rb"), + [](FILE *f) { + fclose(f); + }); if (!file) { return IMIO_CANNOTREADFILE; @@ -490,7 +500,7 @@ int ImageIO::loadJPEG (const Glib::ustring &fname) cinfo.err = my_jpeg_std_error(&jerr); jpeg_create_decompress(&cinfo); - my_jpeg_stdio_src (&cinfo, file); + my_jpeg_stdio_src (&cinfo, file.get()); #if defined( _WIN32 ) && defined( __x86_64__ ) && !defined(__clang__) if ( __builtin_setjmp((reinterpret_cast(cinfo.src))->error_jmp_buf) == 0 ) { @@ -552,7 +562,7 @@ int ImageIO::loadJPEG (const Glib::ustring &fname) jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); - fclose(file); + file.reset(); if (pl) { pl->setProgressStr ("PROGRESSBAR_READY"); @@ -822,6 +832,171 @@ int ImageIO::loadTIFF (const Glib::ustring &fname) return IMIO_SUCCESS; } +#ifdef LIBJXL +#define _PROFILE_ JXL_COLOR_PROFILE_TARGET_ORIGINAL +// adapted from libjxl +int ImageIO::loadJXL(const Glib::ustring &fname) +{ + if (pl) { + pl->setProgressStr("PROGRESSBAR_LOADJXL"); + pl->setProgress(0.0); + } + + std::vector icc_profile; + std::vector buffer; + std::size_t buffer_size = 0; + + JxlBasicInfo info = {}; + JxlPixelFormat format = {}; + + format.num_channels = 3; + format.data_type = JXL_TYPE_FLOAT; + format.endianness = JXL_NATIVE_ENDIAN; + format.align = 0; + + std::vector const compressed = getFileData(fname); + + if (compressed.empty()) { + std::cerr << "Error: loadJXL failed to get data from file" << std::endl; + return IMIO_READERROR; + } + + // multi-threaded parallel runner. + auto runner = JxlResizableParallelRunnerMake(nullptr); + + auto dec = JxlDecoderMake(nullptr); + + if (JXL_DEC_SUCCESS != + JxlDecoderSubscribeEvents(dec.get(), JXL_DEC_BASIC_INFO | + JXL_DEC_COLOR_ENCODING | + JXL_DEC_FULL_IMAGE)) { + std::cerr << "Error: JxlDecoderSubscribeEvents failed" << std::endl; + return IMIO_HEADERERROR; + } + + if (JXL_DEC_SUCCESS != + JxlDecoderSetParallelRunner(dec.get(), JxlResizableParallelRunner, + runner.get())) { + std::cerr << "Error: JxlDecoderSetParallelRunner failed" << std::endl; + return IMIO_HEADERERROR; + } + + // grand decode loop... + JxlDecoderSetInput(dec.get(), compressed.data(), compressed.size()); + + while (true) { + JxlDecoderStatus status = JxlDecoderProcessInput(dec.get()); + + if (status == JXL_DEC_BASIC_INFO) { + if (JXL_DEC_SUCCESS != JxlDecoderGetBasicInfo(dec.get(), &info)) { + std::cerr << "Error: JxlDecoderGetBasicInfo failed" << std::endl; + return IMIO_HEADERERROR; + } + + JxlResizableParallelRunnerSetThreads( + runner.get(), + JxlResizableParallelRunnerSuggestThreads(info.xsize, info.ysize)); + } else if (status == JXL_DEC_COLOR_ENCODING) { + // check for ICC profile + deleteLoadedProfileData(); + embProfile = nullptr; + std::size_t icc_size = 0; + + if (JXL_DEC_SUCCESS != +#if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0, 9, 0) + JxlDecoderGetICCProfileSize(dec.get(), &format, _PROFILE_, &icc_size) +#else + JxlDecoderGetICCProfileSize(dec.get(), _PROFILE_, &icc_size) +#endif + ) { + std::cerr << "Warning: JxlDecoderGetICCProfileSize failed" << std::endl; + } + + if (icc_size > 0) { + icc_profile.resize(icc_size); + + if (JXL_DEC_SUCCESS != +#if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0, 9, 0) + JxlDecoderGetColorAsICCProfile( + dec.get(), &format, _PROFILE_, + icc_profile.data(), icc_profile.size()) +#else + JxlDecoderGetColorAsICCProfile( + dec.get(), _PROFILE_, + icc_profile.data(), icc_profile.size()) +#endif + ) { + std::cerr << "Warning: JxlDecoderGetColorAsICCProfile failed" << std::endl; + } else { + embProfile = cmsOpenProfileFromMem(icc_profile.data(), + icc_profile.size()); + } + } else { + std::cerr << "Warning: Empty ICC data." << std::endl; + } + } else if (status == JXL_DEC_NEED_IMAGE_OUT_BUFFER) { + // Note: If assert is triggered, change to assignment. + // We want maximum bit depth from the decoder, + // regardless of the original encoding intent. + assert(format.data_type == JXL_TYPE_FLOAT); + + if (JXL_DEC_SUCCESS != + JxlDecoderImageOutBufferSize(dec.get(), &format, &buffer_size)) { + std::cerr << "Error: JxlDecoderImageOutBufferSize failed" << std::endl; + return IMIO_READERROR; + } + + buffer.resize(buffer_size); + + if (JXL_DEC_SUCCESS != JxlDecoderSetImageOutBuffer(dec.get(), &format, buffer.data(), buffer.size())) { + std::cerr << "Error: JxlDecoderSetImageOutBuffer failed" << std::endl; + return IMIO_READERROR; + } + } else if (status == JXL_DEC_FULL_IMAGE || + status == JXL_DEC_FRAME) { + // Nothing to do. If the image is an animation, more full frames + // may be decoded. This example only keeps the first one. + break; + } else if (status == JXL_DEC_SUCCESS) { + // Decoding complete. Decoder will be released automatically. + break; + } else if (status == JXL_DEC_NEED_MORE_INPUT) { + std::cerr << "Error: Decoder needs more input data" << std::endl; + return IMIO_READERROR; + } else if (status == JXL_DEC_ERROR) { + std::cerr << "Error: Decoder error" << std::endl; + return IMIO_READERROR; + } else { + std::cerr << "Error: Unknown decoder status" << std::endl; + return IMIO_READERROR; + } + } // end grand decode loop + + std::size_t width = info.xsize; + std::size_t height = info.ysize; + + allocate(width, height); + + std::size_t line_length = width * 3 * 4; + + for (std::size_t row = 0; row < height; ++row) { + setScanline(row, buffer.data() + (row * line_length), 32); + + if (pl && !(row % 100)) { + pl->setProgress((double)(row + 1) / height); + } + } + + if (pl) { + pl->setProgressStr("PROGRESSBAR_READY"); + pl->setProgress(1.0); + } + + return IMIO_SUCCESS; +} +#undef _PROFILE_ +#endif // LIBJXL + int ImageIO::loadPPMFromMemory(const char* buffer, int width, int height, bool swap, int bps) { allocate (width, height); @@ -1310,6 +1485,10 @@ int ImageIO::load (const Glib::ustring &fname) return loadPNG (fname); } else if (hasJpegExtension(fname)) { return loadJPEG (fname); +#ifdef LIBJXL + } else if (hasJxlExtension(fname)) { + return loadJXL(fname); +#endif } else if (hasTiffExtension(fname)) { return loadTIFF (fname); } else { diff --git a/rtengine/imageio.h b/rtengine/imageio.h index 813bfcc61..3703839b2 100644 --- a/rtengine/imageio.h +++ b/rtengine/imageio.h @@ -90,6 +90,10 @@ public: int load (const Glib::ustring &fname); int save (const Glib::ustring &fname) const; +#ifdef LIBJXL + int loadJXL (const Glib::ustring &fname); +#endif + int loadPNG (const Glib::ustring &fname); int loadJPEG (const Glib::ustring &fname); int loadTIFF (const Glib::ustring &fname); diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 50bc38baf..892fe61b4 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -204,15 +204,15 @@ public: return dirpyrdenoiseExpComp; } // functions inherited from the InitialImage interface - Glib::ustring getFileName () final + Glib::ustring getFileName() const final override { return fileName; } - cmsHPROFILE getEmbeddedProfile () final + cmsHPROFILE getEmbeddedProfile() const final override { return embProfile; } - const FramesMetaData* getMetaData () final + const FramesMetaData *getMetaData() const final override { return idata; } diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 5358f2880..127c65248 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -860,7 +860,8 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) 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))) { + // 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.modelmethod != "02"))) { // Forking the image assert(oprevi); Imagefloat *op = oprevi; @@ -875,14 +876,15 @@ 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) { + 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) { + // if ((todo & (M_TRANSFORM | M_RGBCURVE)) && params->dirpyrequalizer.cbdlMethod == "bef" && params->dirpyrequalizer.enabled && !params->colorappearance.enabled) { + if ((todo & (M_TRANSFORM | M_RGBCURVE)) && params->dirpyrequalizer.cbdlMethod == "bef" && params->dirpyrequalizer.enabled && params->colorappearance.modelmethod != "02") { const int W = oprevi->getWidth(); const int H = oprevi->getHeight(); LabImage labcbdl(W, H); @@ -904,9 +906,15 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) params->toneCurve.black, params->toneCurve.hlcompr, params->toneCurve.hlcomprthresh, params->toneCurve.hrenabled); } - if (params->toneCurve.histmatching) { + if (params->toneCurve.histmatching ) { + bool exectrcexp = false;//store if Abstract profile enabled + exectrcexp = params->icm.trcExp; if (!params->toneCurve.fromHistMatching) { + if(params->icm.trcExp) { + params->icm.trcExp = false;//disabled Abstract profile, if hismatching + } imgsrc->getAutoMatchedToneCurve(params->icm, params->raw, params->wb.observer, params->toneCurve.curve); + params->icm.trcExp = exectrcexp;//restore Abstract profile } if (params->toneCurve.autoexp) { @@ -930,6 +938,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if (params->locallab.enabled && !params->locallab.spots.empty()) { const int sizespot = (int)params->locallab.spots.size(); const LocallabParams::LocallabSpot defSpot; + std::vector locallciebef; float *sourceg = nullptr; sourceg = new float[sizespot]; @@ -951,6 +960,14 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) Autogr = new bool[sizespot]; bool *autocie = nullptr; autocie = new bool[sizespot]; + int *whits = nullptr; + whits = new int[sizespot]; + int *blacks = nullptr; + blacks = new int[sizespot]; + int *whitslog = nullptr; + whitslog = new int[sizespot]; + int *blackslog = nullptr; + blackslog = new int[sizespot]; float *locx = nullptr; @@ -975,6 +992,10 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) whiteev[sp] = params->locallab.spots.at(sp).whiteEv; sourceg[sp] = params->locallab.spots.at(sp).sourceGray; sourceab[sp] = params->locallab.spots.at(sp).sourceabs; + whits[sp] = params->locallab.spots.at(sp).whitescie; + blacks[sp] = params->locallab.spots.at(sp).blackscie; + whitslog[sp] = params->locallab.spots.at(sp).whiteslog; + blackslog[sp] = params->locallab.spots.at(sp).blackslog; 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; @@ -1011,9 +1032,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) 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]); + ipf.getAutoLogloc(sp, imgsrc, sourceg, blackev, whiteev, Autogr, sourceab, whits, blacks, whitslog, blackslog, fw, fh, xsta, xend, ysta, yend, SCALE); params->locallab.spots.at(sp).blackEv = blackev[sp]; params->locallab.spots.at(sp).whiteEv = whiteev[sp]; params->locallab.spots.at(sp).blackEvjz = blackev[sp]; @@ -1022,10 +1041,25 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) params->locallab.spots.at(sp).sourceabs = sourceab[sp]; params->locallab.spots.at(sp).sourceGraycie = sourceg[sp]; params->locallab.spots.at(sp).sourceabscie = sourceab[sp]; + params->locallab.spots.at(sp).whitescie = whits[sp]; + params->locallab.spots.at(sp).blackscie = blacks[sp]; + params->locallab.spots.at(sp).whiteslog = whitslog[sp]; + params->locallab.spots.at(sp).blackslog = blackslog[sp]; float jz1 = defSpot.jz100; + + LocallabListener::locallabcieBEF locciebef; + locciebef.blackevbef = blackev[sp]; + locciebef.whiteevbef = whiteev[sp]; + locciebef.sourcegbef = sourceg[sp]; + locciebef.sourceabbef = sourceab[sp]; + locciebef.targetgbef = targetg[sp]; + locciebef.autocomputbef = autocomput[sp]; + locciebef.autociebef = autocie[sp]; + locciebef.jz1bef = jz1; + locallciebef.push_back(locciebef); if (locallListener) { - locallListener->logencodChanged(blackev[sp], whiteev[sp], sourceg[sp], sourceab[sp], targetg[sp], autocomput[sp], autocie[sp], jz1); + locallListener->ciebefChanged(locallciebef,params->locallab.selspot); } } } @@ -1043,6 +1077,10 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) delete [] blackev; delete [] targetg; delete [] sourceab; + delete [] whits; + delete [] blacks; + delete [] whitslog; + delete [] blackslog; delete [] sourceg; delete [] cie; delete [] log; @@ -1092,6 +1130,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) float avge, meantme, stdtme, meanretie, stdretie; //std::vector locallref; std::vector locallretiminmax; + std::vector locallcielc; + std::vector locallsetlc; + std::vector locallciesig; huerefs.resize(params->locallab.spots.size()); huerefblurs.resize(params->locallab.spots.size()); chromarefblurs.resize(params->locallab.spots.size()); @@ -1114,6 +1155,11 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) lumarefp = new float[sizespot]; float *fabrefp = nullptr; fabrefp = new float[sizespot]; + //new controls mainfp and scopefp with multi spots + int *mainfp = nullptr; + mainfp = new int[sizespot]; + int *scopefp = nullptr; + scopefp = new int[sizespot]; for (int sp = 0; sp < (int)params->locallab.spots.size(); sp++) { @@ -1124,7 +1170,11 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if (params->locallab.spots.at(sp).equilret && params->locallab.spots.at(sp).expreti) { savenormreti.reset(new LabImage(*oprevl, true)); } - + + // if(params->locallab.spots.at(sp).colorscope != 30) {//compatibility with old method in controlspotpanel to change scope - default value 30 + // scopefp[sp]= params->locallab.spots.at(sp).colorscope; + // } + // Set local curves of current spot to LUT locRETgainCurve.Set(params->locallab.spots.at(sp).localTgaincurve); locRETtransCurve.Set(params->locallab.spots.at(sp).localTtranscurve); @@ -1138,6 +1188,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) 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 lhhmascieutili = lochhhmascieCurve.Set(params->locallab.spots.at(sp).HHhmaskciecurve); 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); @@ -1168,13 +1219,13 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) 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 lmasutiliciewav = loclmasCurveciewav.Set(params->locallab.spots.at(sp).LLmaskciecurvewav); 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); @@ -1215,7 +1266,10 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) double shcompr = params->locallab.spots.at(sp).shcompr; double br = params->locallab.spots.at(sp).lightness; double cont = params->locallab.spots.at(sp).contrast; - + float contsig = params->locallab.spots.at(sp).contsigqcie; + + float lightsig = params->locallab.spots.at(sp).lightsigqcie; + if (black < 0. && params->locallab.spots.at(sp).expMethod == "pde") { black *= 1.5; } @@ -1232,6 +1286,11 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) meanretie = 0.f; stdretie = 0.f; float fab = 1.f; + float maxicam = -1000.f; + float rdx, rdy, grx, gry, blx, bly = 0.f; + float meanx, meany, meanxe, meanye = 0.f; + int ill = 2; + int prim = 3; 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 @@ -1257,7 +1316,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) 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; @@ -1296,14 +1354,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) 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 @@ -1328,7 +1378,11 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) float Lnresi = 0.f; float Lhighresi46 = 0.f; float Lnresi46 = 0.f; - + Glib::ustring prof = params->icm.workingProfile; + if(params->locallab.spots.at(sp).complexcie == 2) { + params->locallab.spots.at(sp).primMethod = prof;//in Basic mode set to Working profile + } + 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, @@ -1353,7 +1407,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, - locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, lochhhmasCurve, lhhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, + locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, lochhhmasCurve, lhhmasutili, lochhhmascieCurve, lhhmascieutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmasvibCurve, lcmasvibutili, locllmasvibCurve, llmasvibutili, lochhmasvibCurve, lhmasvibutili, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, @@ -1369,6 +1423,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) lochhhmas_Curve, lhhmas_utili, loclmasCurveblwav, lmasutiliblwav, loclmasCurvecolwav, lmasutilicolwav, + loclmasCurveciewav, lmasutiliciewav, locwavCurve, locwavutili, locwavCurvejz, locwavutilijz, loclevwavCurve, loclevwavutili, @@ -1382,12 +1437,59 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) 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, + meantm, stdtm, meanreti, stdreti, fab, maxicam, rdx, rdy, grx, gry, blx, bly, meanx, meany, meanxe, meanye, prim, ill, contsig, lightsig, highresi, nresi, highresi46, nresi46, Lhighresi, Lnresi, Lhighresi46, Lnresi46); fabrefp[sp] = fab; + //Illuminant + float w_x = 0.3f; + float w_y = 0.3f; + if(ill == 2) { + w_x = 0.3457f; + w_y = 0.3585f; + } else if(ill == 4) { + w_x = 0.3217f; + w_y = 0.3377f; + } else if(ill == 5) { + w_x = 0.3127f; + w_y = 0.3290f; + } else if(ill == 1) { + w_x = 0.376137f; + w_y = 0.374021f; + } else if(ill == 3) { + w_x = 0.332424f; + w_y = 0.347426f; + } else if(ill == 6) { + w_x = 0.293756f; + w_y = 0.309185f; + } else if(ill == 7) {//D120 + w_x = 0.269669f; + w_y = 0.28078f; + } else if(ill == 8) {//stdA + w_x = 0.447573f; + w_y = 0.407440f; + } else if(ill == 9) {//2000K + w_x = 0.526591f; + w_y = 0.41331f; + } else if(ill == 10) {//1500K + w_x = 0.585703f; + w_y = 0.393157f; + } else if(ill == 20) { + w_x = 0.333333f; + w_y = 0.333333f; + } + //move white-point in GUI + double refin = params->locallab.spots.at(sp).refi; + double arefi = (w_y - meany) / (w_x - meanx); + double brefi = w_y - arefi * w_x; + double scalrefi = meanx - w_x; + w_x = w_x + scalrefi * refin; + w_y = w_x * arefi + brefi; + + + if (istm) { //calculate mean and sigma on full image for use by normalize_mean_dt float meanf = 0.f; float stdf = 0.f; @@ -1425,6 +1527,28 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) retiMinMax.Tmax = Tmax; locallretiminmax.push_back(retiMinMax); + //save Locallab CIE primaries and white for current spot + LocallabListener::locallabcieLC loccielc; + loccielc.redxlc = rdx; + loccielc.redylc = rdy; + loccielc.grexlc = grx; + loccielc.greylc = gry; + loccielc.bluxlc = blx; + loccielc.bluylc = bly; + loccielc.wxlc = w_x; + loccielc.wylc = w_y; + loccielc.meanxlc = meanx; + loccielc.meanylc = meany; + loccielc.meanxelc = meanxe; + loccielc.meanyelc = meanye; + locallcielc.push_back(loccielc); + + LocallabListener::locallabcieSIG locciesig; + locciesig.contsigq = contsig; + locciesig.lightsigq = lightsig; + locallciesig.push_back(locciesig); + + // 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); @@ -1434,46 +1558,89 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) // 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); + + // new used linked to global and scope + mainfp[sp] = 0; + if (params->locallab.spots.at(sp).spotMethod == "main") { + mainfp[sp] = 3; + } else if (params->locallab.spots.at(sp).spotMethod == "full") { + mainfp[sp] = 2; + } + //keep using tools + bool iscolor = params->locallab.spots.at(sp).expcolor; + bool issh = params->locallab.spots.at(sp).expshadhigh; + bool isvib = params->locallab.spots.at(sp).expvibrance; + bool isexpos = params->locallab.spots.at(sp).expexpose; + bool issoft = params->locallab.spots.at(sp).expsoft; + bool isblur = params->locallab.spots.at(sp).expblur; + bool istom = params->locallab.spots.at(sp).exptonemap; + bool isret = params->locallab.spots.at(sp).expreti; + bool issharp = params->locallab.spots.at(sp).expsharp; + bool iscont = params->locallab.spots.at(sp).expcontrast; + bool iscbdl = params->locallab.spots.at(sp).expcbdl; + bool islog = params->locallab.spots.at(sp).explog; + bool ismas = params->locallab.spots.at(sp).expmask; + bool iscie = params->locallab.spots.at(sp).expcie; + // bool isset = iscolor || issh || isvib; + + //set select spot settings + LocallabListener::locallabsetLC locsetlc; + locsetlc.mainf = mainfp[sp]; + locsetlc.iscolo = iscolor; + locsetlc.iss = issh; + locsetlc.isvi = isvib; + locsetlc.isexpo = isexpos; + locsetlc.issof = issoft; + locsetlc.isblu = isblur; + locsetlc.isto = istom; + locsetlc.isre = isret; + locsetlc.isshar = issharp; + locsetlc.iscon = iscont; + locsetlc.iscbd = iscbdl; + locsetlc.islo = islog; + locsetlc.isma = ismas; + locsetlc.isci = iscie; + locallsetlc.push_back(locsetlc); + if (locallListener) { - // locallListener->refChanged(locallref, params->locallab.selspot); locallListener->refChanged2(huerefp, chromarefp, lumarefp, fabrefp, params->locallab.selspot); locallListener->minmaxChanged(locallretiminmax, params->locallab.selspot); - } + if (params->locallab.spots.at(sp).expprecam) { + locallListener->cieChanged(locallcielc,params->locallab.selspot); + } + locallListener->sigChanged(locallciesig,params->locallab.selspot); + /* + if(params->locallab.spots.at(sp).colorscope != 0) {//compatibility with old method in controlspotpanel + locallListener->scopeChangedcol(scopefp[sp], params->locallab.selspot, iscolor); + locallListener->scopeChangedsh(scopefp[sp], params->locallab.selspot, issh); + locallListener->scopeChangedvib(scopefp[sp], params->locallab.selspot, isvib); + locallListener->scopeChangedset(scopefp[sp], params->locallab.selspot, isset); + //params->locallab.spots.at(sp).colorscope = 30; + } + */ + // if (mainfp[sp] >= 0) {//minimize call to idle register + //used by Global fullimage. + locallListener->maiChanged(locallsetlc,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); - } - */ + delete [] mainfp; + delete [] scopefp; ipf.lab2rgb(*nprevl, *oprevi, params->icm.workingProfile); //************************************************************* // end locallab @@ -1661,12 +1828,14 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) ipf.vibrance(nprevl, params->vibrance, params->toneCurve.hrenabled, params->icm.workingProfile); ipf.labColorCorrectionRegions(nprevl); - if ((params->colorappearance.enabled && !params->colorappearance.tonecie) || (!params->colorappearance.enabled)) { + // if ((params->colorappearance.enabled && !params->colorappearance.tonecie) || (!params->colorappearance.enabled)) { + if ((params->colorappearance.enabled && !params->colorappearance.tonecie) || (params->colorappearance.modelmethod != "02")) { ipf.EPDToneMap(nprevl, 0, scale); } if (params->dirpyrequalizer.cbdlMethod == "aft") { - if (((params->colorappearance.enabled && !settings->autocielab) || (!params->colorappearance.enabled))) { + // if (((params->colorappearance.enabled && !settings->autocielab) || (!params->colorappearance.enabled))) { + if (((params->colorappearance.enabled && !settings->autocielab) || (params->colorappearance.modelmethod != "02"))) { ipf.dirpyrequalizer(nprevl, scale); } } @@ -1886,7 +2055,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) ipf.softLight(nprevl, params->softlight); - if (params->icm.workingTRC != ColorManagementParams::WorkingTrc::NONE) { + if (params->icm.workingTRC != ColorManagementParams::WorkingTrc::NONE && params->icm.trcExp) { const int GW = nprevl->W; const int GH = nprevl->H; std::unique_ptr provis; @@ -1903,15 +2072,58 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) 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); + bool gamutcontrol = params->icm.gamut; + int catc = toUnderlying(params->icm.wcat); + int locprim = 0; + float rdx, rdy, grx, gry, blx, bly = 0.f; + float meanx, meany, meanxe, meanye = 0.f; + + ipf.workingtrc(0, tmpImage1.get(), tmpImage1.get(), GW, GH, -5, prof, 2.4, 12.92310, 0, ill, 0, 0, rdx, rdy, grx, gry, blx, bly, meanx, meany, meanxe, meanye, dummy, true, false, false, false); + ipf.workingtrc(0, tmpImage1.get(), tmpImage1.get(), GW, GH, 5, prof, gamtone, slotone, catc, illum, prim, locprim, rdx, rdy, grx, gry, blx, bly, meanx, meany, meanxe, meanye, dummy, false, true, true, gamutcontrol); + const int midton = params->icm.wmidtcie; + if(midton != 0) { + ToneEqualizerParams params; + params.enabled = true; + params.regularization = 0.f; + params.pivot = 0.f; + params.bands[0] = 0; + params.bands[2] = midton; + params.bands[4] = 0; + params.bands[5] = 0; + int mid = abs(midton); + int threshmid = 50; + if(mid > threshmid) { + params.bands[1] = sign(midton) * (mid - threshmid); + params.bands[3] = sign(midton) * (mid - threshmid); + } + ipf.toneEqualizer(tmpImage1.get(), params, prof, scale, false); + } + const bool smoothi = params->icm.wsmoothcie; + if(smoothi) { + ToneEqualizerParams params; + params.enabled = true; + params.regularization = 0.f; + params.pivot = 0.f; + params.bands[0] = 0; + params.bands[1] = 0; + params.bands[2] = 0; + params.bands[3] = 0; + params.bands[4] = -40;//arbitrary value to adapt with WhiteEvjz - here White Ev # 10 + params.bands[5] = -80;//8 Ev and above + bool Evsix = true; + if(Evsix) {//EV = 6 majority of images + params.bands[4] = -15; + } + + ipf.toneEqualizer(tmpImage1.get(), params, prof, scale, false); + } ipf.rgb2lab(*tmpImage1, *nprevl, params->icm.workingProfile); @@ -1934,7 +2146,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) tmpImage1.reset(); - if (prim == 13) {//pass red gre blue xy in function of area dats Ciexy + if (prim == 14) {//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; @@ -2020,9 +2232,18 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) wy = 0.3932f; break; } + + + //move white point in GUI + double refin = params->icm.refi; + double arefi = (wy - meany) / (wx - meanx); + double brefi = wy - arefi * wx; + double scalrefi = meanx - wx; + wx = wx + scalrefi * refin; + wy = wx * arefi + brefi; if (primListener) { - primListener->iprimChanged(r_x, r_y, b_x, b_y, g_x, g_y, wx, wy); + primListener->iprimChanged(r_x, r_y, b_x, b_y, g_x, g_y, wx, wy, meanx, meany); } } } @@ -2116,6 +2337,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } double tempsym = 5003.; + double greensym = 1.; int wmodel = 0;//wmodel allows - arbitrary - choice of illuminant and temp with choice if (params->colorappearance.wbmodel == "RawT") { @@ -2128,28 +2350,37 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if (params->colorappearance.catmethod == "symg" && wmodel == 2) { tempsym = params->wb.temperature;//force white balance in symmetric - } else { + } else if(params->colorappearance.autotempout) { if (params->colorappearance.illum == "iA") {//otherwise force illuminant source tempsym = 2856.; + greensym = 1.; } else if (params->colorappearance.illum == "i41") { tempsym = 4100.; + greensym = 1.; } else if (params->colorappearance.illum == "i50") { tempsym = 5003.; + greensym = 1.; } else if (params->colorappearance.illum == "i55") { tempsym = 5503.; } else if (params->colorappearance.illum == "i60") { tempsym = 6000. ; + greensym = 1.; } else if (params->colorappearance.illum == "i65") { tempsym = 6504.; + greensym = 1.; } else if (params->colorappearance.illum == "i75") { tempsym = 7504.; + greensym = 1.; } else if (params->colorappearance.illum == "ifree") { tempsym = params->wb.temperature;//force white balance in symmetric + greensym = 1.; } + } else { + tempsym = params->colorappearance.tempout; + greensym = params->colorappearance.greenout; } - - if (params->colorappearance.enabled && params->colorappearance.autotempout) { - acListener->wbCamChanged(tempsym, 1.f); //real temp and tint = 1. + if (params->colorappearance.enabled && acListener) { + acListener->wbCamChanged(tempsym, greensym, params->colorappearance.autotempout); //real temp and tint. } } else { diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index e236aed17..f276bc30a 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -305,6 +305,7 @@ protected: LocLLmaskCurve locllmasCurve; LocHHmaskCurve lochhmasCurve; LocHHmaskCurve lochhhmasCurve; + LocHHmaskCurve lochhhmascieCurve; LocCCmaskCurve locccmasexpCurve; LocLLmaskCurve locllmasexpCurve; LocHHmaskCurve lochhmasexpCurve; @@ -343,6 +344,7 @@ protected: LocwavCurve locwavCurve; LocwavCurve loclmasCurveblwav; LocwavCurve loclmasCurvecolwav; + LocwavCurve loclmasCurveciewav; LocwavCurve loclevwavCurve; LocwavCurve locconwavCurve; LocwavCurve loccompwavCurve; diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 2e02a352c..79bd81c65 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -4778,13 +4778,22 @@ void ImProcFunctions::chromiLuminanceCurve(PipetteBuffer *pipetteBuffer, int pW, histLCurve[Lprov1 * histLFactor]++; } - 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 if (bwToning) { atmp -= lold->a[i][j]; btmp -= lold->b[i][j]; + Chprov1 = sqrt(SQR(atmp) + SQR(btmp)) / 327.68f; + if (Chprov1 == 0.f) { + sincosval.x = 0.f; + sincosval.y = 1.f; + } else { + sincosval.x = btmp / (327.68f * Chprov1); + sincosval.y = atmp / (327.68f * Chprov1); + } + } else { + Chprov1 = sqrt(SQR(atmp) + SQR(btmp)) / 327.68f; } lnew->L[i][j] = Lprov1 * 327.68f; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 19d8b0a03..c8c6e166e 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -130,6 +130,7 @@ class ImProcFunctions bool needsGradient() const; bool needsVignetting() const; bool needsLCP() const; + bool needsMetadata() const; bool needsLensfun() const; // static cmsUInt8Number* Mempro = NULL; @@ -155,7 +156,7 @@ enum class BlurType { ~ImProcFunctions(); bool needsLuminanceOnly() const { - return !(needsCA() || needsDistortion() || needsRotation() || needsPerspective() || needsLCP() || needsLensfun()) && (needsVignetting() || needsPCVignetting() || needsGradient()); + return !(needsCA() || needsDistortion() || needsRotation() || needsPerspective() || needsLCP() || needsLensfun() || needsMetadata()) && (needsVignetting() || needsPCVignetting() || needsGradient()); } void setScale(double iscale); @@ -193,7 +194,8 @@ enum class BlurType { 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 ciecamloc_02float(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, float &maxicam, float &comtsig, float &lightsig); 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, @@ -252,7 +254,7 @@ enum class BlurType { float strumask, bool astool, const LocCCmaskCurve & locccmasCurve, bool lcmasutili, const LocLLmaskCurve & locllmasCurve, bool llmasutili, - const LocHHmaskCurve & lochhmasCurve, bool lhmasutili, const LocHHmaskCurve & lochhhmasCurve, bool lhhmasutili, + 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, @@ -270,10 +272,10 @@ enum class BlurType { 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); + void mean_dt(const float * data, int size, double& mean_p, double& dt_p, double nbstd); 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 normalize_mean_dt(float *data, const float *ref, int size, float mod, float sigm, float mdef, float sdef, float mdef2, float sdef2, double nbstd); 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); @@ -291,7 +293,7 @@ enum class BlurType { //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 getAutoLogloc(int sp, ImageSource *imgsrc, float *sourceg, float *blackev, float *whiteev, bool *Autogr, float *sourceab, int *whits, int *blacks, int *whitslog, int *blackslog, 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, @@ -331,7 +333,7 @@ enum class BlurType { 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& locccmasCurve, bool lcmasutili, const LocLLmaskCurve& locllmasCurve, bool llmasutili, const LocHHmaskCurve& lochhmasCurve, bool lhmasutili, const LocHHmaskCurve& llochhhmasCurve, bool lhhmasutili, const LocHHmaskCurve& llochhhmascieCurve, bool lhhmascieutili, 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, @@ -348,6 +350,7 @@ enum class BlurType { const LocwavCurve& loclmasCurveblwav, bool lmasutiliblwav, const LocwavCurve& loclmasCurvecolwav, bool lmasutilicolwav, + const LocwavCurve& loclmasCurveciewav, bool lmasutiliciewav, const LocwavCurve& locwavCurve, bool locwavutili, const LocwavCurve& locwavCurvejz, bool locwavutilijz, const LocwavCurve& loclevwavCurve, bool loclevwavutili, @@ -362,8 +365,12 @@ enum class BlurType { 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& meantm, float& stdtm, float& meanreti, float& stdreti, float &fab, float &maxicam, float &rdx, float &rdy, float &grx, float &gry, float &blx, float &bly, float &meanx, float &meany, float &meanxe, float &meanye, int &prim, int &ill, float &contsig, float &lightsig, float &highresi, float &nresi, float &highresi46, float &nresi46, float &Lhighresi, float &Lnresi, float &Lhighresi46, float &Lnresi46); + + void tone_eqcam2(ImProcFunctions *ipf, Imagefloat *rgb, int whits, int blacks, const Glib::ustring &workingProfile, double scale, bool multithread); + void tone_eqdehaz(ImProcFunctions *ipf, Imagefloat *rgb, int whits, int blacks, const Glib::ustring &workingProfile, double scale, bool multithread); + void tone_eqcam(ImProcFunctions *ipf, Imagefloat *rgb, int midtone, const Glib::ustring &workingProfile, double scale, bool multithread); 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); @@ -489,7 +496,7 @@ enum class BlurType { void BadpixelsLab(LabImage * lab, double radius, int thresh, float chrom); void dehaze(Imagefloat *rgb, const procparams::DehazeParams &dehazeParams); - void dehazeloc(Imagefloat *rgb, const procparams::DehazeParams &dehazeParams); + void dehazeloc(Imagefloat *rgb, const procparams::DehazeParams &dehazeParams, int sk, int sp); void ToneMapFattal02(Imagefloat *rgb, const procparams::FattalToneMappingParams &fatParams, int detail_level, int Lalone, float **Lum, int WW, int HH, int algo, bool sat); 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); @@ -505,7 +512,9 @@ enum class BlurType { 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, Glib::ustring &profile, double gampos, double slpos, int &illum, int prim, cmsHTRANSFORM &transform, bool normalizeIn = true, bool normalizeOut = true, bool keepTransForm = false) const; + void workingtrc(int sp, Imagefloat* src, Imagefloat* dst, int cw, int ch, int mul, Glib::ustring &profile, double gampos, double slpos, int cat, int &illum, int prim, int locprim, + float &rdx, float &rdy, float &grx, float &gry, float &blx, float &bly, float &meanx, float &meany, float &meanxe, float &meanye, + cmsHTRANSFORM &transform, bool normalizeIn = true, bool normalizeOut = true, bool keepTransForm = false, bool gamutcontrol = 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; diff --git a/rtengine/init.cc b/rtengine/init.cc index 04faa98a8..731c26a20 100644 --- a/rtengine/init.cc +++ b/rtengine/init.cc @@ -44,6 +44,7 @@ const Settings* settings; MyMutex* lcmsMutex = nullptr; MyMutex *fftwMutex = nullptr; +MyMutex *librawMutex = nullptr; int init (const Settings* s, const Glib::ustring& baseDir, const Glib::ustring& userSettingsDir, bool loadAll) { @@ -120,6 +121,8 @@ int init (const Settings* s, const Glib::ustring& baseDir, const Glib::ustring& delete lcmsMutex; lcmsMutex = new MyMutex; fftwMutex = new MyMutex; + delete librawMutex; + librawMutex = new MyMutex; return 0; } diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index 5ccec4a1e..b5403080e 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -454,7 +454,7 @@ void ImProcFunctions::dehaze(Imagefloat *img, const DehazeParams &dehazeParams) } } -void ImProcFunctions::dehazeloc(Imagefloat *img, const DehazeParams &dehazeParams) +void ImProcFunctions::dehazeloc(Imagefloat *img, const DehazeParams &dehazeParams, int sk, int sp) { //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 @@ -476,6 +476,13 @@ void ImProcFunctions::dehazeloc(Imagefloat *img, const DehazeParams &dehazeParam float ambient[3]; float maxDistance = 0.f; + int whit = 0; + int blac = params->locallab.spots.at(sp).dehazeblack; + + if(blac != 0) { + ImProcFunctions::tone_eqdehaz(this, img, whit, blac, params->icm.workingProfile, sk, multiThread); + } + { array2D& R = dark; // R and dark can safely use the same buffer, which is faster and reduces memory allocations/deallocations array2D G(W, H); diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index 7620068a4..d2b2c9f2c 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -34,7 +34,8 @@ namespace rtengine { -namespace { +namespace +{ inline void copyAndClampLine(const float *src, unsigned char *dst, const int W) { @@ -65,10 +66,12 @@ inline void copyAndClamp(const LabImage *src, unsigned char *dst, const double r rgb_xyzv[i][j] = F2V(rgb_xyzf[i][j]); } } + #endif #ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) if (multiThread) + #pragma omp parallel for schedule(dynamic,16) if (multiThread) #endif + for (int i = 0; i < H; ++i) { float* rL = src->L[i]; float* ra = src->a[i]; @@ -80,19 +83,21 @@ inline void copyAndClamp(const LabImage *src, unsigned char *dst, const double r 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::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::Lab2XYZ(rL[j], ra[j], rb[j], x_, y_, z_); Color::xyz2rgb(x_, y_, z_, R, G, B, rgb_xyzf); rbuffer[j] = Color::gamma2curve[R]; gbuffer[j] = Color::gamma2curve[G]; @@ -106,16 +111,18 @@ inline void copyAndClamp(const LabImage *src, unsigned char *dst, const double r } #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::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 } } @@ -250,7 +257,7 @@ Image8* ImProcFunctions::lab2rgb(LabImage* lab, int cx, int cy, int cw, int ch, lcmsMutex->lock(); cmsHPROFILE LabIProf = cmsCreateLab4Profile(nullptr); - cmsHTRANSFORM hTransform = cmsCreateTransform (LabIProf, TYPE_Lab_DBL, oprof, TYPE_RGB_FLT, icm.outputIntent, flags); + cmsHTRANSFORM hTransform = cmsCreateTransform(LabIProf, TYPE_Lab_DBL, oprof, TYPE_RGB_FLT, icm.outputIntent, flags); cmsCloseProfile(LabIProf); lcmsMutex->unlock(); @@ -284,7 +291,7 @@ Image8* ImProcFunctions::lab2rgb(LabImage* lab, int cx, int cy, int cw, int ch, buffer[iy++] = rb[j] / 327.68f; } - cmsDoTransform (hTransform, buffer, outbuffer, cw); + cmsDoTransform(hTransform, buffer, outbuffer, cw); copyAndClampLine(outbuffer, data + ix, cw); } } // End of parallelization @@ -351,9 +358,10 @@ Imagefloat* ImProcFunctions::lab2rgbOut(LabImage* lab, int cx, int cy, int cw, i image->ExecCMSTransform(hTransform, *lab, cx, cy); cmsDeleteTransform(hTransform); + cmsCloseProfile(iprof); image->normalizeFloatTo65535(); } else { - + #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) if (multiThread) #endif @@ -389,35 +397,133 @@ Imagefloat* ImProcFunctions::lab2rgbOut(LabImage* lab, int cx, int cy, int cw, i } 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; +{ + //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 + #pragma omp for schedule(dynamic, 16) nowait #endif - for (int i = 0; i < ch; ++i) + + 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]); + 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]); - } + 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, Glib::ustring &profile, double gampos, double slpos, int &illum, int prim, cmsHTRANSFORM &transform, bool normalizeIn, bool normalizeOut, bool keepTransForm) const +void ImProcFunctions::workingtrc(int sp, Imagefloat* src, Imagefloat* dst, int cw, int ch, int mul, Glib::ustring &profile, double gampos, double slpos, int cat, int &illum, int prim, int locprim, + float &rdx, float &rdy, float &grx, float &gry, float &blx, float &bly, float &meanx, float &meany, float &meanxe, float &meanye, + cmsHTRANSFORM &transform, bool normalizeIn, bool normalizeOut, bool keepTransForm, bool gamutcontrol) const { const TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); + double wb2[3][3]; + float epsilon = 0.000001f; + + // if(gamutcontrol) { +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int i = 0; i < ch; ++i) + for (int j = 0; j < cw; ++j) { + src->r(i, j) = (float) rtengine::max(src->r(i, j), epsilon); + src->g(i, j) = (float) rtengine::max(src->g(i, j), epsilon); + src->b(i, j) = (float) rtengine::max(src->b(i, j), epsilon); + } + // } + + + + if (mul == 5) {//only second pass workingtrc - avoid this code first pass + for (int r = 0; r < 3; ++r) { + for (int c = 0; c < 3; ++c) { + wb2[r][c] = wprof[r][c]; + } + } + + //provis - samme approach as in WB itcwb + //we can add others function on colors ...others than mean (actually) + int precision = 3; + const int bfw = cw / precision + ((cw % precision) > 0 ? 1 : 0); + const int bfh = ch / precision + ((ch % precision) > 0 ? 1 : 0); + + Imagefloat *provis = nullptr; + provis = new Imagefloat(bfw, bfh);//cw, ch + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int i = 0; i < bfh ; ++i) { + const int ii = i * precision; + + if (ii < ch) { + for (int j = 0, jj = 0; j < bfw ; ++j, jj += precision) { + provis->r(i, j) = src->r(ii, jj); + provis->g(i, j) = src->g(ii, jj); + provis->b(i, j) = src->b(ii, jj); + } + } + } + + +// I try to find the dominant color by a simple way (average of x and y) +// It is probably intellectually more relevant to place this algorithm at the end, but it is complex at the GUI level (at least for me). +// The errors made are relatively minimal and result seems good enough + meanx = 0.f; + meany = 0.f; + +#ifdef _OPENMP + #pragma omp parallel for reduction(+:meanx, meany) if(multiThread) +#endif + + for (int y = 0; y < bfh ; ++y) { + for (int x = 0; x < bfw ; ++x) { + const float RR = provis->r(y, x); + const float GG = provis->g(y, x); + const float BB = provis->b(y, x); + float xcb, ycb, zcb; + Color::rgbxyz(RR, GG, BB, xcb, ycb, zcb, wb2); + float X_r = xcb; + float Y_r = ycb; + float Z_r = zcb; + if(gamutcontrol) { + Color::gamutmap(X_r, Y_r, Z_r, wb2);//gamut control + } + const float som = X_r + Y_r + Z_r; + X_r = X_r / som; + Y_r = Y_r / som; + meanx += X_r; + meany += Y_r; + } + } + + meanx /= (bfh * bfw); + meany /= (bfh * bfw); + meanx += 0.005f; + meany += 0.005f; //ampirical mean delta with value end in process + + if (settings->verbose) { + printf("Estimation dominant color : x=%f y=%f\n", (double) meanx, (double) meany); + } + + delete provis; + } + 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 @@ -434,7 +540,7 @@ 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" || profile == "JDCmax") { + if (profile == "sRGB" || profile == "Adobe RGB" || profile == "ProPhoto" || profile == "WideGamut" || profile == "BruceRGB" || profile == "Beta RGB" || profile == "BestRGB" || profile == "Rec2020" || profile == "ACESp0" || profile == "ACESp1" || profile == "JDCmax" || profile == "JDCmax stdA") { if (settings->verbose) { printf("Profile=%s\n", profile.c_str()); } @@ -454,22 +560,22 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, 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; + double r = (double) src->r(i, j); + double g = (double) src->g(i, j); + double b = (double) src->b(i, j); + r = (Color::igammatab_srgb[r]) / 65535.; + g = (Color::igammatab_srgb[g]) / 65535.; + b = (Color::igammatab_srgb[b]) / 65535.; + 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 + 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 @@ -509,7 +615,78 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, float greyy = params->icm.grey; float epsil = 0.0001f; - if (prim == 13) {//convert datas area to xy + double Wx = 1.0; + double Wz = 1.0; + cmsCIExyY xyD; + + if (locprim == 1 && mul == 5) { + rdx = params->locallab.spots.at(sp).redxl; + rdy = params->locallab.spots.at(sp).redyl; + grx = params->locallab.spots.at(sp).grexl; + gry = params->locallab.spots.at(sp).greyl; + blx = params->locallab.spots.at(sp).bluxl; + bly = params->locallab.spots.at(sp).bluyl; + + if (params->locallab.spots.at(sp).illMethod == "d50") { + illum = 2; + xyD = {0.3457, 0.3585, 1.0}; // near LCMS values but not perfect... it's a compromise!! + Wx = 0.964295676; + Wz = 0.825104603; + } else if (params->locallab.spots.at(sp).illMethod == "d60") { + illum = 4; + Wx = 0.952646075; + Wz = 1.008825184; + xyD = {0.32168, 0.33767, 1.0}; + } else if (params->locallab.spots.at(sp).illMethod == "d65") { + illum = 5; + Wx = 0.95045471; + Wz = 1.08905029; + xyD = {0.312700492, 0.329000939, 1.0}; + } else if (params->locallab.spots.at(sp).illMethod == "d41") { + illum = 1; + Wx = 0.991488263; + Wz = 0.631604625; + xyD = {0.376137, 0.374021, 1.0}; + } else if (params->locallab.spots.at(sp).illMethod == "d55") { + illum = 3; + Wx = 0.956565934; + Wz = 0.920253249; + xyD = {0.332424, 0.347426, 1.0}; + } else if (params->locallab.spots.at(sp).illMethod == "d80") { + illum = 6; + Wx = 0.950095542; + Wz = 1.284213976; + xyD = {0.293756, 0.309185, 1.0}; + } else if (params->locallab.spots.at(sp).illMethod == "d120") { + illum = 7; + Wx = 0.979182; + Wz = 1.623623; + xyD = {0.269669, 0.28078, 1.0}; + } else if (params->locallab.spots.at(sp).illMethod == "stda") { + illum = 8; + Wx = 1.098500393; + Wz = 0.355848714; + xyD = {0.447573, 0.407440, 1.0}; + } else if (params->locallab.spots.at(sp).illMethod == "T2000") { + illum = 9; + Wx = 1.274335; + Wz = 0.145233; + xyD = {0.526591, 0.41331, 1.0}; + } else if (params->locallab.spots.at(sp).illMethod == "T1500") { + illum = 10; + Wx = 1.489921; + Wz = 0.053826; + xyD = {0.585703, 0.393157, 1.0}; + } else if (params->locallab.spots.at(sp).illMethod == "iE") { + illum = 20; + Wx = 1.; + Wz = 1.; + xyD = {0.333333, 0.333333, 1.0}; + } + + } + + if (prim == 14 && locprim == 0 && mul == 5) {//convert datas area to xy float redgraphx = params->icm.labgridcieALow; float redgraphy = params->icm.labgridcieBLow; float blugraphx = params->icm.labgridcieAHigh; @@ -560,76 +737,307 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, return; } + enum class ColorTemp { + D50 = 5003, // for Widegamut, ProPhoto Best, Beta -> D50 + D65 = 6504, // for sRGB, AdobeRGB, Bruce Rec2020 -> D65 + D60 = 6005 // for ACES AP0 and AP1 + }; + double tempv4 = 5003.; + double p[6]; //primaries - switch (ColorManagementParams::Primaries(prim)) { - case ColorManagementParams::Primaries::DEFAULT: { - break; + if (locprim == 0 && mul == 5) { + 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: { + profile = "ACESp0"; + break; + } + + case ColorManagementParams::Primaries::JDC_MAX: { + profile = "JDCmax"; + break; + } + + case ColorManagementParams::Primaries::JDC_MAXSTDA: { + profile = "JDCmax stdA"; + 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; + } + } + } else if (locprim == 1 && mul == 5) { + //local primaries + if (prim == 1) { + p[0] = 0.6400; // sRGB primaries + p[1] = 0.3300; + p[2] = 0.3000; + p[3] = 0.6000; + p[4] = 0.1500; + p[5] = 0.0600; + tempv4 = 6504.; + Wx = 0.95045471; + Wz = 1.08905029; + rdx = p[0]; + rdy = p[1]; + grx = p[2]; + gry = p[3]; + blx = p[4]; + bly = p[5]; + + } else if (prim == 2) { + p[0] = 0.6400; //Adobe primaries + p[1] = 0.3300; + p[2] = 0.2100; + p[3] = 0.7100; + p[4] = 0.1500; + p[5] = 0.0600; + tempv4 = 6504.; + Wx = 0.95045471; + Wz = 1.08905029; + rdx = p[0]; + rdy = p[1]; + grx = p[2]; + gry = p[3]; + blx = p[4]; + bly = p[5]; + + } else if (prim == 3) { + p[0] = 0.7347; //ProPhoto and default primaries + p[1] = 0.2653; + p[2] = 0.1596; + p[3] = 0.8404; + p[4] = 0.0366; + p[5] = 0.0001; + Wx = 0.964295676; + Wz = 0.825104603; + rdx = p[0]; + rdy = p[1]; + grx = p[2]; + gry = p[3]; + blx = p[4]; + bly = p[5]; + + } else if (prim == 4) { + p[0] = 0.7080; // Rec2020 primaries + p[1] = 0.2920; + p[2] = 0.1700; + p[3] = 0.7970; + p[4] = 0.1310; + p[5] = 0.0460; + tempv4 = 6504.; + Wx = 0.95045471; + Wz = 1.08905029; + rdx = p[0]; + rdy = p[1]; + grx = p[2]; + gry = p[3]; + blx = p[4]; + bly = p[5]; + + } else if (prim == 5) { + p[0] = 0.713; // ACES P1 primaries + p[1] = 0.293; + p[2] = 0.165; + p[3] = 0.830; + p[4] = 0.128; + p[5] = 0.044; + tempv4 = 6004.; + Wx = 0.952646075; + Wz = 1.008825184; + rdx = p[0]; + rdy = p[1]; + grx = p[2]; + gry = p[3]; + blx = p[4]; + bly = p[5]; + + } else if (prim == 6) { + p[0] = 0.7350; //Widegamut primaries + p[1] = 0.2650; + p[2] = 0.1150; + p[3] = 0.8260; + p[4] = 0.1570; + p[5] = 0.0180; + Wx = 0.964295676; + Wz = 0.825104603; + rdx = p[0]; + rdy = p[1]; + grx = p[2]; + gry = p[3]; + blx = p[4]; + bly = p[5]; + } else if (prim == 7) { + p[0] = 0.7347; //ACESp0 primaries + p[1] = 0.2653; + p[2] = 0.; + p[3] = 1.0; + p[4] = 0.0001; + p[5] = -0.0770; + tempv4 = 6004.; + Wx = 0.952646075; + Wz = 1.008825184; + rdx = p[0]; + rdy = p[1]; + grx = p[2]; + gry = p[3]; + blx = p[4]; + bly = p[5]; + } else if (prim == 8) { + p[0] = 0.734702; // JDC max primaries + p[1] = 0.265302; + p[2] = 0.021908; + p[3] = 0.930288; + p[4] = 0.120593; + p[5] = 0.001583; + Wx = 0.964295676; + Wz = 0.825104603; + rdx = p[0]; + rdy = p[1]; + grx = p[2]; + gry = p[3]; + blx = p[4]; + bly = p[5]; + } else if (prim == 9) { + p[0] = 0.734702; // JDC max primaries + p[1] = 0.265302; + p[2] = 0.021908; + p[3] = 0.930288; + p[4] = 0.120593; + p[5] = 0.001583; + Wx = 1.098500393; + Wz = 0.355848714; + rdx = p[0]; + rdy = p[1]; + grx = p[2]; + gry = p[3]; + blx = p[4]; + bly = p[5]; + } else if (prim == 10) { + p[0] = 0.64; // Bruce primaries + p[1] = 0.33; + p[2] = 0.28; + p[3] = 0.65; + p[4] = 0.15; + p[5] = 0.06; + Wx = 0.95045471; + Wz = 1.08905029; + rdx = p[0]; + rdy = p[1]; + grx = p[2]; + gry = p[3]; + blx = p[4]; + bly = p[5]; + } else if (prim == 11) { + p[0] = 0.6888; // Beta primaries + p[1] = 0.3112; + p[2] = 0.1986; + p[3] = 0.7551; + p[4] = 0.1265; + p[5] = 0.0352; + Wx = 0.964295676; + Wz = 0.825104603; + rdx = p[0]; + rdy = p[1]; + grx = p[2]; + gry = p[3]; + blx = p[4]; + bly = p[5]; + } else if (prim == 12) { + p[0] = 0.7347; // Best primaries + p[1] = 0.2653; + p[2] = 0.2150; + p[3] = 0.7750; + p[4] = 0.13; + p[5] = 0.0350; + Wx = 0.964295676; + Wz = 0.825104603; + rdx = p[0]; + rdy = p[1]; + grx = p[2]; + gry = p[3]; + blx = p[4]; + bly = p[5]; + } else if (prim == 15) { + p[0] = rdx; + p[1] = rdy; + p[2] = grx; + p[3] = gry; + p[4] = blx; + p[5] = bly; + } else { + p[0] = 0.7347; //ProPhoto and default primaries + p[1] = 0.2653; + p[2] = 0.1596; + p[3] = 0.8404; + p[4] = 0.0366; + p[5] = 0.0001; + Wx = 0.964295676; + Wz = 0.825104603; + rdx = p[0]; + rdy = p[1]; + grx = p[2]; + gry = p[3]; + blx = p[4]; + bly = p[5]; } - 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: { - profile = "ACESp0"; - break; - } - - case ColorManagementParams::Primaries::JDC_MAX: { - profile = "JDCmax"; - 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) { @@ -655,161 +1063,165 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, // int select_temp = 1; //5003K constexpr double eps = 0.000000001; // not divide by zero - enum class ColorTemp { - D50 = 5003, // for Widegamut, ProPhoto Best, Beta -> D50 - D65 = 6504, // for sRGB, AdobeRGB, Bruce Rec2020 -> D65 - D60 = 6005 // for ACES AP0 and AP1 - - }; - 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") { - p[0] = 0.7350; //Widegamut primaries - p[1] = 0.2650; - p[2] = 0.1150; - p[3] = 0.8260; - p[4] = 0.1570; - p[5] = 0.0180; - illum = toUnderlying(ColorManagementParams::Illuminant::D50); - Wx = 0.964295676; - Wz = 0.825104603; + if (locprim == 0 && mul ==5) { + if (profile == "WideGamut") { + p[0] = 0.7350; //Widegamut primaries + p[1] = 0.2650; + p[2] = 0.1150; + p[3] = 0.8260; + p[4] = 0.1570; + p[5] = 0.0180; + 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; - p[2] = 0.2100; - p[3] = 0.7100; - p[4] = 0.1500; - p[5] = 0.0600; - tempv4 = 6504.; - illum = toUnderlying(ColorManagementParams::Illuminant::D65); - Wx = 0.95045471; - Wz = 1.08905029; + } else if (profile == "Adobe RGB") { + p[0] = 0.6400; //Adobe primaries + p[1] = 0.3300; + p[2] = 0.2100; + p[3] = 0.7100; + p[4] = 0.1500; + p[5] = 0.0600; + 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; - p[2] = 0.3000; - p[3] = 0.6000; - p[4] = 0.1500; - p[5] = 0.0600; - 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; + p[2] = 0.3000; + p[3] = 0.6000; + p[4] = 0.1500; + p[5] = 0.0600; + 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; - p[2] = 0.2800; - p[3] = 0.6500; - p[4] = 0.1500; - p[5] = 0.0600; - 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; + p[2] = 0.2800; + p[3] = 0.6500; + p[4] = 0.1500; + p[5] = 0.0600; + 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; - p[2] = 0.1986; - 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 == "Beta RGB") { + p[0] = 0.6888; // Beta primaries + p[1] = 0.3112; + p[2] = 0.1986; + p[3] = 0.7551; + p[4] = 0.1265; + p[5] = 0.0352; + 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; - p[2] = 0.2150; - 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 == "BestRGB") { + p[0] = 0.7347; // Best primaries + p[1] = 0.2653; + p[2] = 0.2150; + p[3] = 0.7750; + p[4] = 0.1300; + p[5] = 0.0350; + 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; - p[2] = 0.1700; - p[3] = 0.7970; - p[4] = 0.1310; - p[5] = 0.0460; - tempv4 = 6504.; - illum = toUnderlying(ColorManagementParams::Illuminant::D65); - Wx = 0.95045471; - Wz = 1.08905029; + } else if (profile == "Rec2020") { + p[0] = 0.7080; // Rec2020 primaries + p[1] = 0.2920; + p[2] = 0.1700; + p[3] = 0.7970; + p[4] = 0.1310; + p[5] = 0.0460; + 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; - p[2] = 0.0000; - p[3] = 1.0; - p[4] = 0.0001; - p[5] = -0.0770; - tempv4 = 6004.; - illum = toUnderlying(ColorManagementParams::Illuminant::D60); - Wx = 0.952646075; - Wz = 1.008825184; + } else if (profile == "ACESp0") { + p[0] = 0.7347; // ACES P0 primaries + p[1] = 0.2653; + p[2] = 0.0000; + p[3] = 1.0; + p[4] = 0.0001; + p[5] = -0.0770; + tempv4 = 6004.; + illum = toUnderlying(ColorManagementParams::Illuminant::D60); + Wx = 0.952646075; + Wz = 1.008825184; - } else if (profile == "JDCmax") { - p[0] = 0.734702; // JDC max primaries - p[1] = 0.265302; - p[2] = 0.021908; - p[3] = 0.930288; - p[4] = 0.120593; - p[5] = 0.001583; - illum = toUnderlying(ColorManagementParams::Illuminant::D50); - Wx = 0.964295676; - Wz = 0.825104603; + } else if (profile == "JDCmax") { + p[0] = 0.734702; // JDC max primaries + p[1] = 0.265302; + p[2] = 0.021908; + p[3] = 0.930288; + p[4] = 0.120593; + p[5] = 0.001583; + illum = toUnderlying(ColorManagementParams::Illuminant::D50); + Wx = 0.964295676; + Wz = 0.825104603; - } else if (profile == "ACESp1") { - p[0] = 0.713; // ACES P1 primaries - p[1] = 0.293; - p[2] = 0.165; - p[3] = 0.830; - p[4] = 0.128; - p[5] = 0.044; - tempv4 = 6004.; - illum = toUnderlying(ColorManagementParams::Illuminant::D60); - Wx = 0.952646075; - Wz = 1.008825184; + } else if (profile == "JDCmax stdA") { + p[0] = 0.734702; // JDC max primaries and stdA + p[1] = 0.265302; + p[2] = 0.021908; + p[3] = 0.930288; + p[4] = 0.120593; + p[5] = 0.001583; + illum = toUnderlying(ColorManagementParams::Illuminant::STDA); + Wx = 1.098500393; + Wz = 0.355848714; - } else if (profile == "ProPhoto") { - p[0] = 0.7347; //ProPhoto and default primaries - p[1] = 0.2653; - p[2] = 0.1596; - p[3] = 0.8404; - p[4] = 0.0366; - p[5] = 0.0001; - illum = toUnderlying(ColorManagementParams::Illuminant::D50); - Wx = 0.964295676; - Wz = 0.825104603; + } else if (profile == "ACESp1") { + p[0] = 0.713; // ACES P1 primaries + p[1] = 0.293; + p[2] = 0.165; + p[3] = 0.830; + p[4] = 0.128; + p[5] = 0.044; + tempv4 = 6004.; + illum = toUnderlying(ColorManagementParams::Illuminant::D60); + Wx = 0.952646075; + Wz = 1.008825184; - } 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; - p[2] = 0.1596; - p[3] = 0.8404; - p[4] = 0.0366; - p[5] = 0.0001; + } else if (profile == "ProPhoto") { + p[0] = 0.7347; //ProPhoto and default primaries + p[1] = 0.2653; + p[2] = 0.1596; + p[3] = 0.8404; + p[4] = 0.0366; + p[5] = 0.0001; + 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; + p[2] = 0.1596; + p[3] = 0.8404; + p[4] = 0.0366; + p[5] = 0.0001; + } } + if (slpos == 0) { slpos = eps; } @@ -826,153 +1238,192 @@ 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); + if(rtengine::settings->verbose) { + printf("ga0=%f ga1=%f ga2=%f ga3=%f ga4=%f\n", gammaParams[0], gammaParams[1], gammaParams[2], gammaParams[3], gammaParams[4]); + } // 7 parameters for smoother curves - cmsCIExyY xyD; +// cmsCIExyY xyD; 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; + if (locprim == 0 && mul == 5) { + + switch (ColorManagementParams::Illuminant(illum)) { + case ColorManagementParams::Illuminant::DEFAULT: + case ColorManagementParams::Illuminant::STDA: + case ColorManagementParams::Illuminant::TUNGSTEN_2000K: + case ColorManagementParams::Illuminant::TUNGSTEN_1500K: + case ColorManagementParams::Illuminant::E:{ + 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; + } } - case ColorManagementParams::Illuminant::D41: { - tempv4 = 4100.; - ills = "D41"; - break; - } + cmsWhitePointFromTemp(&xyD, tempv4); - case ColorManagementParams::Illuminant::D50: { - tempv4 = 5003.; - ills = "D50"; - break; - } + switch (ColorManagementParams::Illuminant(illum)) { + case ColorManagementParams::Illuminant::DEFAULT: { + break; + } - case ColorManagementParams::Illuminant::D55: { - tempv4 = 5500.; - ills = "D55"; - break; - } + case ColorManagementParams::Illuminant::D55: { + Wx = 0.956565934; + Wz = 0.920253249; + break; + } - case ColorManagementParams::Illuminant::D60: { - tempv4 = 6004.; - ills = "D60"; - break; - } + case ColorManagementParams::Illuminant::D80: { + Wx = 0.950095542; + Wz = 1.284213976; + break; + } - case ColorManagementParams::Illuminant::D65: { - tempv4 = 6504.; - ills = "D65"; - break; - } + case ColorManagementParams::Illuminant::D41: { + Wx = 0.991488263; + Wz = 0.631604625; + break; + } - case ColorManagementParams::Illuminant::D80: { - tempv4 = 8000.; - ills = "D80"; - 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::D120: { - tempv4 = 12000.; - ills = "D120"; - 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; + } + + case ColorManagementParams::Illuminant::E: { + Wx = 1.; + Wz = 1.; + xyD = {0.33333, 0.33333, 1.0}; + ills = "E"; + break; + } + } } - cmsWhitePointFromTemp(&xyD, tempv4); + //xyD + //meanx, meany + // adjust refinement (purity) with a simple algorithm + if (mul == 5) { + double refin = 0.; - switch (ColorManagementParams::Illuminant(illum)) { - case ColorManagementParams::Illuminant::DEFAULT: { - break; + if (locprim == 1) { + refin = params->locallab.spots.at(sp).refi; + meanx += params->locallab.spots.at(sp).shiftxl; + meany += params->locallab.spots.at(sp).shiftyl; + } else if (locprim == 0) { + refin = params->icm.refi; + meanx += params->icm.shiftx; + meany += params->icm.shifty; } - 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 arefi = (xyD.y - meany) / (xyD.x - meanx); + double brefi = xyD.y - arefi * xyD.x; + double scalrefi = 0.98 * (meanx - xyD.x); + xyD.x = xyD.x + scalrefi * refin; + xyD.y = xyD.x * arefi + brefi; + // recalculate Wx Wy + Wx = xyD.x / xyD.y; + Wz = (1. - xyD.x - xyD.y) / xyD.y; } double wprofpri[9]; - if (gamutcontrol) { - //xyz in functiuon primaries and illuminant - Color::primaries_to_xyz(p, Wx, Wz, wprofpri); + //xyz in function primaries and illuminant + Color::primaries_to_xyz(p, Wx, Wz, wprofpri, cat); - 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 - } + 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 } } @@ -995,11 +1446,17 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, cmsWriteTag(oprofdef, cmsSigBlueTRCTag, GammaTRC[2]); //to read XYZ values and illuminant - if (rtengine::settings->verbose) { + if (rtengine::settings->verbose && mul == 5) { 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()); + + if (locprim == 0) { + printf("Illuminant=%s\n", ills.c_str()); + } else { + printf("Illuminant=%s\n", params->locallab.spots.at(sp).illMethod.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); @@ -1062,6 +1519,42 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, } } +// alternative to find dominant color xy +// Not use : +// 1) GUI complex at least for mean +// 2) small difference for meanxe, meanye with meanx , meany above in most cases + /* + if (locprim == 1) { + meanxe = 0.f; + meanye = 0.f; + + #ifdef _OPENMP + #pragma omp parallel for reduction(+:meanxe, meanye) if(multiThread) + #endif + for (int y = 0; y < ch ; ++y) { + for (int x = 0; x < cw ; ++x) { + const float RR = dst->r(y,x); + const float GG = dst->g(y,x); + const float BB = dst->b(y,x); + float xcb, ycb, zcb; + Color::rgbxyz(RR, GG, BB, xcb, ycb, zcb, wb2);//use sRGB Adobe Rec2020 ACESp0 + + float X_r = xcb; + float Y_r = ycb; + float Z_r = zcb; + Color::gamutmap(X_r, Y_r, Z_r, wb2);//gamut control + const float som = X_r + Y_r + Z_r; + X_r = X_r / som; + Y_r = Y_r / som; + meanxe += X_r; + meanye += Y_r; + } + } + meanxe /= (ch*cw); + meanye /= (ch*cw); + printf("DiffmeanxE=%f DiffmeanyE=%f \n", (double) (meanxe - meanx), (double) (meanye - meany)); + } + */ if (!keepTransForm) { cmsDeleteTransform(hTransform); hTransform = nullptr; diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 5c7959225..13f974d1a 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . - * 2016 - 2020 Jacques Desmis + * 2016 - 2024 Jacques Desmis * 2016 - 2020 Ingo Weyrich */ @@ -76,7 +76,8 @@ constexpr double czlim = rtengine::RT_SQRT1_2;// 0.70710678118654752440; constexpr float clipLoc(float x) { - return rtengine::LIM(x, 0.f, 32767.f); + //return rtengine::LIM(x, 0.f, 32767.f);//remove leads to bad behavior + return x; } constexpr float clipDE(float x) @@ -84,14 +85,20 @@ constexpr float clipDE(float x) return rtengine::LIM(x, 0.3f, 1.f); } +constexpr float clipR(float x) +{ + return rtengine::LIM(x, 0.f, 65535.f);//used when Laplacian Contrast attenuator +} + + constexpr float clipC(float x) { - return rtengine::LIM(x, -42000.f, 42000.f); + return rtengine::LIM(x, -100000.f, 100000.f);//increase LIM from 42000 to 1000000 to avoid clip and also imaginaries colors } constexpr float clipChro(float x) { - return rtengine::LIM(x, 0.f, 140.f); + return rtengine::LIM(x, 0.f, 300.f);//increase LIM from 140 to 300 to avoid clip and also imaginaries colors } constexpr double clipazbz(double x) @@ -172,7 +179,8 @@ constexpr float exclusion(float a, float 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 +{ + //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 @@ -182,8 +190,9 @@ void calcdif(float lmr, float &lmrc) 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; + + if (lmr < 11.6f) { + lmrc = a0 * lmr; } else if (lmr < 60.f) { lmrc = a1 * lmr + b1; } else { @@ -212,6 +221,7 @@ void calcGammaLut(double gamma, double ts, LUTf &gammaLut) #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 @@ -220,6 +230,7 @@ void calcGammaLut(double gamma, double ts, LUTf &gammaLut) #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 @@ -252,6 +263,7 @@ float calcLocalFactorrect(const float lox, const float loy, const float lcx, con 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)))); @@ -306,6 +318,7 @@ void deltaEforLaplace(float *dE, const float lap, int bfw, int bfh, rtengine::La #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; @@ -319,14 +332,15 @@ void deltaEforLaplace(float *dE, const float lap, int bfw, int bfh, rtengine::La } const float ade = 1.f / (maxdE - maxC); - // const float bde = -ade * 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] + bde : 1.f; dE[y * bfw + x] = dE[y * bfw + x] >= maxdE ? ade * (dE[y * bfw + x] - maxC) : 1.f; } @@ -390,23 +404,29 @@ void SobelCannyLuma(float **sobelL, float **luma, int bfw, int bfh, float radius 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; } @@ -421,7 +441,7 @@ float igammalog(float x, float p, float s, float g2, float g4) #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 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 @@ -434,9 +454,9 @@ float gammalog(float x, float p, float s, float g3, float g4) #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 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 } @@ -458,7 +478,7 @@ struct local_params { float balance; float balanceh; int colorde; - int cir; + float cir; bool recur; float thr; float stru; @@ -487,19 +507,25 @@ struct local_params { float angmaexp; float str_mas; float ang_mas; + float feather_mas; float strexp; float angexp; + float featherexp; float strSH; float angSH; + float featherSH; float strcol; float strcolab; float strcolh; float angcol; + float feathcol; float strvib; float strvibab; float strvibh; float angvib; + float feathervib; float angwav; + float featherwav; float strwav; float blendmaL; float radmaL; @@ -515,6 +541,7 @@ struct local_params { float basew; float anglog; + float featherlog; float strlog; float softradiusexp; float softradiuscol; @@ -684,7 +711,10 @@ struct local_params { float lowthrcie; float higthrcie; float decaycie; - + float blurciemask; + float contciemask; + bool islogcie; + bool issmoothcie; int noiselequal; float noisechrodetail; float bilat; @@ -701,8 +731,10 @@ struct local_params { float noisecf; float noisecc; float mulloc[6]; - int mullocsh[5]; + int mullocsh[6]; int detailsh; + int whitescie; + int midtcie; double tePivot; float threshol; float chromacb; @@ -777,7 +809,17 @@ struct local_params { float targetgray; float blackev; float whiteev; + float sourcegraycie; + float targetgraycie; + float blackevjz; + float whiteevjz; float detail; + float detailcie; + float strgradcie; + float anggradcie; + float feathercie; + bool satcie; + bool satlog; int sensilog; int sensicie; int sensimas; @@ -815,6 +857,12 @@ struct local_params { float mLjz; float mCjz; float softrjz; + bool fftcieMask; + float comprlo; + float comprlocie; + int moka; + int sursouci; + int smoothciem; }; @@ -822,7 +870,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall { int w = oW; int h = oH; - int circr = locallab.spots.at(sp).circrad; + float 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); @@ -838,7 +886,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall // 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); + thre = LIM(thre, 0.f, 15.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; @@ -879,13 +927,14 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall } 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; - } -*/ + + /* + 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") { @@ -897,15 +946,30 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall 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).smoothciemet == "none") { + lp.smoothciem = 0; + } else if (locallab.spots.at(sp).smoothciemet == "Ev") { + lp.smoothciem = 1; + } else if (locallab.spots.at(sp).smoothciemet == "gam") { + lp.smoothciem = 2; + } else if (locallab.spots.at(sp).smoothciemet == "gamnorol") { + lp.smoothciem = 3; + } else if (locallab.spots.at(sp).smoothciemet == "level") { + lp.smoothciem = 4; + } + + if (locallab.spots.at(sp).spotMethod == "norm") { lp.fullim = 0; - } else if(locallab.spots.at(sp).spotMethod == "exc"){ + } else if (locallab.spots.at(sp).spotMethod == "exc") { lp.fullim = 1; - } else if (locallab.spots.at(sp).spotMethod == "full"){ + } else if (locallab.spots.at(sp).spotMethod == "full") { lp.fullim = 2; + } else if (locallab.spots.at(sp).spotMethod == "main") {//new Global + lp.fullim = 3; } - // printf("Lpfullim=%i\n", lp.fullim); - + lp.fftColorMask = locallab.spots.at(sp).fftColorMask; lp.prevdE = prevDeltaE; lp.showmaskcolmet = llColorMask; @@ -920,13 +984,15 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall 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.fftcieMask = locallab.spots.at(sp).fftcieMask; + lp.islogcie = locallab.spots.at(sp).logcie && locallab.spots.at(sp).expprecam; + lp.issmoothcie = locallab.spots.at(sp).smoothcie; 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 @@ -935,7 +1001,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall 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.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; @@ -985,7 +1051,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall } 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; @@ -1005,13 +1071,14 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall } 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).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) { @@ -1046,6 +1113,8 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.excmet = 1; } else if (locallab.spots.at(sp).spotMethod == "full") { lp.excmet = 2; + } else if (locallab.spots.at(sp).spotMethod == "main") { + lp.excmet = 3; } if (locallab.spots.at(sp).merMethod == "mone") { @@ -1143,7 +1212,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall if (locallab.spots.at(sp).shape == "ELI") { lp.shapmet = 0; - } else /*if (locallab.spots.at(sp).shape == "RECT")*/ { + } else { /*if (locallab.spots.at(sp).shape == "RECT")*/ lp.shapmet = 1; } @@ -1177,8 +1246,9 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall 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; @@ -1254,9 +1324,9 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall multi[y] = ((float) locallab.spots.at(sp).mult[y]); } - float multish[5]; + float multish[6]; - for (int y = 0; y < 5; y++) { + for (int y = 0; y < 6; y++) { multish[y] = ((float) locallab.spots.at(sp).multsh[y]); } @@ -1311,22 +1381,29 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall 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 feathermask = ((float) locallab.spots.at(sp).feather_mask); float strexpo = ((float) locallab.spots.at(sp).strexp); float angexpo = ((float) locallab.spots.at(sp).angexp); + float featherexpo = ((float) locallab.spots.at(sp).featherexp); float strSH = ((float) locallab.spots.at(sp).strSH); float angSH = ((float) locallab.spots.at(sp).angSH); + float featherSH = ((float) locallab.spots.at(sp).featherSH); 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 feathcol = ((float) locallab.spots.at(sp).feathercol); 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 feathervib = ((float) locallab.spots.at(sp).feathervib); float strwav = ((float) locallab.spots.at(sp).strwav); float angwav = ((float) locallab.spots.at(sp).angwav); + float featherwav = ((float) locallab.spots.at(sp).featherwav); float strlog = ((float) locallab.spots.at(sp).strlog); float anglog = ((float) locallab.spots.at(sp).anglog); + float featherlog = ((float) locallab.spots.at(sp).featherlog); float softradiusexpo = ((float) locallab.spots.at(sp).softradiusexp); float softradiuscolor = ((float) locallab.spots.at(sp).softradiuscol); float softradiusreti = ((float) locallab.spots.at(sp).softradiusret); @@ -1419,7 +1496,33 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall 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.sourcegraycie = (float) locallab.spots.at(sp).sourceGraycie; + lp.targetgraycie = (float) locallab.spots.at(sp).targetGraycie; + + if (locallab.spots.at(sp).modecam == "cam16") { + lp.moka = 1; + } else if (locallab.spots.at(sp).modecam == "jz") { + lp.moka = 2; + } + + if (locallab.spots.at(sp).sursourcie == "Average") { + lp.sursouci = 0; + } else if (locallab.spots.at(sp).sursourcie == "Dim") { + lp.sursouci = 1; + } else if (locallab.spots.at(sp).sursourcie == "Dark") { + lp.sursouci = 2; + } else if (locallab.spots.at(sp).sursourcie == "exDark") { + lp.sursouci = 3; + } else if (locallab.spots.at(sp).sursourcie == "disacie") { + lp.sursouci = 4; + } + + lp.satcie = (float) locallab.spots.at(sp).satcie; + lp.satlog = (float) locallab.spots.at(sp).satlog; + lp.blackevjz = (float) locallab.spots.at(sp).blackEvjz; + lp.whiteevjz = (float) locallab.spots.at(sp).whiteEvjz; lp.detail = locallab.spots.at(sp).detail; + lp.detailcie = 0.01 * locallab.spots.at(sp).detailcie; lp.sensilog = locallab.spots.at(sp).sensilog; lp.Autogray = locallab.spots.at(sp).Autogray; lp.autocompute = locallab.spots.at(sp).autocompute; @@ -1429,6 +1532,16 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall 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); + float blurciemask = (float) locallab.spots.at(sp).blurcie; + float contciemask = (float) locallab.spots.at(sp).contcie; + float strgradcie = ((float) locallab.spots.at(sp).strgradcie); + float anggradcie = ((float) locallab.spots.at(sp).anggradcie); + float feathercie = ((float) locallab.spots.at(sp).feathercie); + + lp.comprlo = locallab.spots.at(sp).comprlog; + lp.comprlocie = locallab.spots.at(sp).comprcie; + + lp.deltaem = locallab.spots.at(sp).deltae; lp.scalereti = scaleret; lp.cir = circr; @@ -1459,23 +1572,30 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.angmaexp = angmaskexpo; lp.str_mas = strmask; lp.ang_mas = angmask; - + lp.feather_mas = feathermask; + lp.strexp = strexpo; lp.angexp = angexpo; + lp.featherexp = featherexpo; lp.strSH = strSH; lp.angSH = angSH; + lp.featherSH = featherSH; lp.strcol = strcol; lp.strcolab = strcolab; lp.strcolh = strcolh; lp.angcol = angcol; + lp.feathcol = feathcol; lp.strvib = strvib; lp.strvibab = strvibab; lp.strvibh = strvibh; lp.angvib = angvib; + lp.feathervib = feathervib; lp.strwav = strwav; lp.angwav = angwav; + lp.featherwav = featherwav; lp.strlog = strlog; lp.anglog = anglog; + lp.featherlog = featherlog; lp.softradiusexp = softradiusexpo; lp.softradiuscol = softradiuscolor; lp.softradiusret = softradiusreti; @@ -1649,7 +1769,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.lowthrr = local_lowthrr; lp.higthrr = local_higthrr; lp.decayr = local_decayr; - + lp.recothrl = local_recothrl; lp.lowthrl = local_lowthrl; lp.higthrl = local_higthrl; @@ -1660,7 +1780,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.noiselc4 = lnoiselc4; lp.noiselc5 = lnoiselc5; lp.noiselc6 = lnoiselc6; - + lp.noisecf = local_noisecf; lp.noisecc = local_noisecc; lp.sensden = local_sensiden; @@ -1684,6 +1804,11 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.blurma = (float) locallab.spots.at(sp).blurmask; lp.fftma = locallab.spots.at(sp).fftmask; lp.contma = (float) locallab.spots.at(sp).contmask; + lp.blurciemask = blurciemask; + lp.contciemask = 0.01f * contciemask; + lp.strgradcie = strgradcie; + lp.anggradcie = anggradcie; + lp.feathercie = feathercie; lp.blendmacie = blendmaskcie; lp.radmacie = radmaskcie; @@ -1694,14 +1819,16 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.mulloc[y] = LIM(multi[y], 0.f, 4.f);//to prevent crash with old pp3 integer } - for (int y = 0; y < 5; y++) { + for (int y = 0; y < 6; y++) { lp.mullocsh[y] = multish[y]; } - lp.activspot = locallab.spots.at(sp).activ; - + lp.activspot = locallab.spots.at(sp).activ; lp.detailsh = locallab.spots.at(sp).detailSH; lp.tePivot = locallab.spots.at(sp).tePivot; + lp.whitescie = locallab.spots.at(sp).whitescie; + lp.midtcie = locallab.spots.at(sp).midtcie; + lp.threshol = thresho; lp.chromacb = chromcbdl; lp.expvib = locallab.spots.at(sp).expvibrance && lp.activspot ; @@ -1759,10 +1886,10 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall 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.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; @@ -1822,6 +1949,7 @@ static void calcTransition(const float lox, const float loy, const float ach, co 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); } @@ -1832,6 +1960,7 @@ static void calcTransition(const float lox, const float loy, const float ach, co 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); } @@ -1844,6 +1973,7 @@ static void calcTransition(const float lox, const float loy, const float ach, co 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); } @@ -1854,6 +1984,7 @@ static void calcTransition(const float lox, const float loy, const float ach, co 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); } @@ -1921,7 +2052,8 @@ float find_gray(float source_gray, float target_gray) 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 { +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; @@ -1929,18 +2061,21 @@ void ImProcFunctions::mean_sig (const float* const * const savenormL, float &mea #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) { @@ -1952,7 +2087,7 @@ inline float power_norm(float r, float g, float b) float g2 = SQR(g); float b2 = SQR(b); float d = r2 + g2 + b2; - float n = r*r2 + g*g2 + b*b2; + float n = r * r2 + g * g2 + b * b2; return n / std::max(d, 1e-12f); } @@ -1968,12 +2103,15 @@ inline float gray2ev(float gray) return std::log2(0.18f / gray); } +// copyright 2018 Alberto Griggio 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; + constexpr float hi = std::numeric_limits::max() / 100.f; + return std::min(hi, power_norm(r, g, b) / 2.f + 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)); @@ -1983,18 +2121,52 @@ inline float norm(float r, float g, float b, TMatrix ws) // basic log encoding taken from ACESutil.Lin_to_Log2, from // https://github.com/ampas/aces-dev // (as seen on pixls.us) +// copyright 2018 Alberto Griggio 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; + // BENCHFUN + float gray = 0.1f; + float shadows_range = 0.f; + bool comprlog = 0.f; + float comprfactorlog = 0.f; + float dynamic_range = 1.f; + float targray = 0.1f; + + bool satcontrol = false; + + if(lp.logena) { + gray = 0.01f * lp.sourcegray; + shadows_range = lp.blackev; + comprlog = lp.comprlo > 0.f; + comprfactorlog = lp.comprlo; + dynamic_range = max(lp.whiteev - lp.blackev, 0.5f); + targray = lp.targetgray; + satcontrol = lp.satlog; + + } else if (lp.cieena) { + gray = 0.01f * lp.sourcegraycie; + shadows_range = lp.blackevjz; + comprlog = lp.comprlocie > 0.f; + comprfactorlog = lp.comprlocie; + dynamic_range = max(lp.whiteevjz - lp.blackevjz, 0.5f); + targray = lp.targetgraycie; + satcontrol = lp.satcie; + } + float comprthlog = 1.f; - 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 base = targray > 1 && targray < 100 && dynamic_range > 0 ? find_gray(std::abs(shadows_range) / dynamic_range, 0.01f * targray) : 0.f; const float linbase = rtengine::max(base, 2.f);//2 to avoid bad behavior TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); + float ac = -5.f;//max 4 + float bc = 4.f; + if(comprlog < 0.6f) { + comprthlog = ac * comprlog + bc; + } else { + comprthlog = 1.f; + } + if (settings->verbose) { printf("Base Log encoding std=%5.1f\n", (double) linbase); } @@ -2008,9 +2180,16 @@ void ImProcFunctions::log_encode(Imagefloat *rgb, struct local_params & lp, bool x = rtengine::max(x, noise); x = rtengine::max(x / gray, noise); + if (comprlog && x >= comprthlog) + { + x = intp(comprfactorlog, (std::tanh((x - comprthlog) / comprthlog) + 1.f) * comprthlog, x); + } + + x = rtengine::max((xlogf(x) / log2 - shadows_range) / dynamic_range, noise); assert(x == x); + if (linbase > 0.f) { x = xlog2lin(x, linbase); @@ -2019,18 +2198,47 @@ void ImProcFunctions::log_encode(Imagefloat *rgb, struct local_params & lp, bool if (scale) { return x * 65535.f; - } else { + } else + { return x; } }; - const float detail = lp.detail; + const auto sf = + [=](float s, float c) -> float + { + if (c > noise) { + return 1.f - min(std::abs(s) / c, 1.f); + } else { + return 0.f; + } + }; +//added 2024 02 + const auto apply_sat = + [&](float &r, float &g, float &b, float f) -> void + { + float ll = Color::rgbLuminance(r, g, b, ws); + float rl = r - ll; + float gl = g - ll; + float bl = b - ll; + float s = intp(max(sf(rl, r), sf(gl, g), sf(bl, b)), pow_F(f, 0.3f) * 0.6f + 0.4f, 1.f); + r = ll + s * rl; + g = ll + s * gl; + b = ll + s * bl; + }; + + + float detail = lp.detail;//Log encoding + if(lp.cieena) {//Cam16 + detail = lp.detailcie; + } 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); @@ -2042,10 +2250,15 @@ void ImProcFunctions::log_encode(Imagefloat *rgb, struct local_params & lp, bool float mm = apply(m); float f = mm / m; f = min(f, 1000000.f); - + r *= f; b *= f; g *= f; + + if (satcontrol && f < 1.f) { + apply_sat(r, g, b, f); + } + r = CLIP(r); g = CLIP(g); b = CLIP(b); @@ -2070,6 +2283,7 @@ void ImProcFunctions::log_encode(Imagefloat *rgb, struct local_params & lp, bool #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; @@ -2079,6 +2293,7 @@ void ImProcFunctions::log_encode(Imagefloat *rgb, struct local_params & lp, bool 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); @@ -2088,6 +2303,7 @@ void ImProcFunctions::log_encode(Imagefloat *rgb, struct local_params & lp, bool #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); @@ -2103,28 +2319,36 @@ void ImProcFunctions::log_encode(Imagefloat *rgb, struct local_params & lp, bool float f2 = apply(t2) / t2; f = intp(blend, f, f2); f = min(f, 1000000.f); - - // assert(std::isfinite(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)); + assert(std::isfinite(r)); + assert(std::isfinite(g)); + assert(std::isfinite(b)); + + if (satcontrol && f < 1.f) { + apply_sat(r, g, b, f); + } + + } } } } } - -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) + +// Copyright 2018 Alberto Griggio +void ImProcFunctions::getAutoLogloc(int sp, ImageSource *imgsrc, float *sourceg, float *blackev, float *whiteev, bool *Autogr, float *sourceab, int *whits, int *blacks, int *whitslog, int *blackslog, 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) +// improvment white aand black toen_eqcam 9 2023 const PreviewProps pp(0, 0, fw, fh, SCALE); Imagefloat img(int(fw / SCALE + 0.5), int(fh / SCALE + 0.5)); @@ -2148,13 +2372,27 @@ void ImProcFunctions::getAutoLogloc(int sp, ImageSource *imgsrc, float *sourceg, 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; + int nc = 0; + + int whit = -whits[sp]; + int blac = -blacks[sp]; + + if(params->locallab.spots.at(sp).expcie && params->locallab.spots.at(sp).Autograycie) { + ImProcFunctions::tone_eqcam2(this, &img, whit, blac, params->icm.workingProfile, SCALE, multiThread); + } + + int whitlog = -whitslog[sp]; + int blaclog = -blackslog[sp]; + + if(params->locallab.spots.at(sp).explog && params->locallab.spots.at(sp).autocompute) { + ImProcFunctions::tone_eqcam2(this, &img, whitlog, blaclog, params->icm.workingProfile, SCALE, multiThread); + } + 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 + 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++; @@ -2164,15 +2402,18 @@ void ImProcFunctions::getAutoLogloc(int sp, ImageSource *imgsrc, float *sourceg, 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 + + + maxVal *= 1.5f; + minVal *= 0.5f; + //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/ @@ -2199,7 +2440,7 @@ void ImProcFunctions::getAutoLogloc(int sp, ImageSource *imgsrc, float *sourceg, for (int y = hsta; y < hend; ++y) { for (int x = wsta; x < wend; ++x) { - const float l = img.g(y, x) / 65535.f; + const float l = YY[y][x]; if (l >= gmin && l <= gmax) { tot += static_cast(l); @@ -2220,12 +2461,13 @@ void ImProcFunctions::getAutoLogloc(int sp, ImageSource *imgsrc, float *sourceg, 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; @@ -2237,7 +2479,6 @@ void ImProcFunctions::getAutoLogloc(int sp, ImageSource *imgsrc, float *sourceg, //calculate La - Absolute luminance shooting const FramesMetaData* metaData = imgsrc->getMetaData(); - float fnum = metaData->getFNumber(); // F number float fiso = metaData->getISOSpeed() ; // ISO float fspeed = metaData->getShutterSpeed() ; // Speed @@ -2251,17 +2492,19 @@ void ImProcFunctions::getAutoLogloc(int sp, ImageSource *imgsrc, float *sourceg, 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 + 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; @@ -2269,6 +2512,205 @@ void tone_eq(ImProcFunctions *ipf, Imagefloat *rgb, const struct local_params &l std::copy(lp.mullocsh, lp.mullocsh + params.bands.size(), params.bands.begin()); ipf->toneEqualizer(rgb, params, workingProfile, scale, multithread); } + +void ImProcFunctions::tone_eqcam(ImProcFunctions *ipf, Imagefloat *rgb, int midtone, const Glib::ustring &workingProfile, double scale, bool multithread) +{ + ToneEqualizerParams params; + params.enabled = true; + params.regularization = 0.f; + params.pivot = 0.f; + params.bands[0] = 0; + params.bands[2] = midtone; + params.bands[4] = 0; + params.bands[5] = 0; + int mid = abs(midtone); + int threshmid = 50; + if(mid > threshmid) { + params.bands[1] = sign(midtone) * (mid - threshmid); + params.bands[3] = sign(midtone) * (mid - threshmid); + } + + ipf->toneEqualizer(rgb, params, workingProfile, scale, multithread); +} + +void tone_eqsmooth(ImProcFunctions *ipf, Imagefloat *rgb, const struct local_params &lp, const Glib::ustring &workingProfile, double scale, bool multithread) +{ + //smooth highlights after TRC + ToneEqualizerParams params; + params.enabled = true; + params.regularization = 0.f; + params.pivot = 0.f; + params.bands[0] = 0; + params.bands[1] = 0; + params.bands[2] = 0; + params.bands[3] = 0; + params.bands[4] = -30;//arbitrary value to adapt with WhiteEvjz - here White Ev # 10 + params.bands[5] = -100;//8 Ev and above + if(lp.whiteevjz < 6) {//EV = 6 majority of images + params.bands[4] = -15; + } + if(lp.islogcie) {//with log encoding Cie + params.bands[4] = -15; + params.bands[5] = -50; + if(lp.whiteevjz < 6) { + params.bands[4] = -10; + } + } + + ipf->toneEqualizer(rgb, params, workingProfile, scale, multithread); +} + +void ImProcFunctions::tone_eqcam2(ImProcFunctions *ipf, Imagefloat *rgb, int whits, int blacks, const Glib::ustring &workingProfile, double scale, bool multithread) +{ + ToneEqualizerParams params; + params.enabled = true; + params.regularization = 0.f; + params.pivot = 0.f; + params.bands[0] = blacks; + int bla = abs(blacks); + int threshblawhi = 50; + int threshblawhi2 = 70; + int threshblawhi3 = 40; + if(bla > threshblawhi) { + params.bands[1] = sign(blacks) * (bla - threshblawhi); + } + if(bla > threshblawhi2) { + params.bands[2] = sign(blacks) * (bla - threshblawhi2); + } + + params.bands[4] = whits; + int whi = abs(whits); + if(whi > threshblawhi) { + params.bands[3] = sign(whits) * (whi - threshblawhi); + } + if(whi > threshblawhi3) { + params.bands[5] = sign(whits) * (whi - threshblawhi3); + } + + ipf->toneEqualizer(rgb, params, workingProfile, scale, multithread); +} + + +// tone mapping from +// https://github.com/thatcherfreeman/utility-dctls/ +// Copyright of the original code +/* +MIT License + +Copyright (c) 2023 Thatcher Freeman + +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. +*/ + +/* +// I also took some code from Alberto Grigio +*/ +//Copyright (c) 2023 Thatcher Freeman +// Adapted to Rawtherapee Jacques Desmis mars 2024 jdesmis@gmail.com + +float rolloff_function(float x, float dr, float b, float c, float kmid) +{ + return (dr * (x / (x + b)) + c) * kmid;//Simple sigmoid (rather a polynomial asymptotic power function) ponderate with kmid - take into account if need Mean Yb scene and Mean Yb viewing and slope value +} +//Copyright (c) 2023 Thatcher Freeman +// Adapted to Rawtherapee Jacques Desmis mars 2024 jdesmis@gmail.com +float scene_contrast(float x, float mid_gray_scene, float gamma) +{ + return mid_gray_scene * std::pow(x / mid_gray_scene, gamma);//apply gamma +} +//Copyright (c) 2023 Thatcher Freeman +// Adapted to Rawtherapee Jacques Desmis mars 2024 jdesmis@gmail.com +float do_get(float x, bool rolloff_, float mid_gray_scene, float gamma, float dr, float b, float c, float kmid) +{ + if (rolloff_ && x <= mid_gray_scene) {//general smooth - till Yb scene + return x; + } else { + return rolloff_function(scene_contrast(x, mid_gray_scene, gamma), dr, b, c, kmid);//simulate polynomial power function with a slope to begin + } +} + +//Copyright (c) 2023 Thatcher Freeman +// Adapted to Rawtherapee Jacques Desmis 25 mars 2024 +void tonemapFreeman(float target_slope, float target_sloper, float target_slopeg , float target_slopeb, float white_point, float black_point, float mid_gray_scene, float mid_gray_view, bool rolloff, LUTf& lut, LUTf& lutr, LUTf& lutg, LUTf& lutb, int mode, bool scale, bool takeyb) +{ + float dr;//Dynamic Range + float b; + float c;//black point + float gamma; + float gammar; + float gammag; + float gammab; + float mid_gray_scene_;//Mean luminance - Scene conditions + // mid_gray_view //Mean luminance - Viewing conditions + + c = black_point; + dr = white_point - c; + + if(scale) {//scale Yb mean luminance scene with white : dr and black + mid_gray_scene_ = mid_gray_scene * dr + c; + } else { + mid_gray_scene_ = mid_gray_scene; + } + + b = (dr / (mid_gray_scene_ - c)) * (1.f - ((mid_gray_scene_ - c) / dr)) * mid_gray_scene_;//b - ponderate mid_gray_scene taking into account the total DR, and the dark part below the mid_gray_scene + gamma = target_slope * (float) std::pow((mid_gray_scene_ + b), 2.0) / (dr * b);//Caculate gamma with slope and mid_gray_scene + gammar = target_sloper * (float) std::pow((mid_gray_scene_ + b), 2.0) / (dr * b);//Caculate gamma with slope and mid_gray_scene + gammag = target_slopeg * (float) std::pow((mid_gray_scene_ + b), 2.0) / (dr * b);//Caculate gamma with slope and mid_gray_scene + gammab = target_slopeb * (float) std::pow((mid_gray_scene_ + b), 2.0) / (dr * b);//Caculate gamma with slope and mid_gray_scene + float kmid = 1.f;//general case + //float kyb = 1.f; + if(takeyb){ + kmid = mid_gray_scene / mid_gray_view; + kmid = cbrt(kmid); + } + // if(mode == 3 && target_slope != 1.f ) {//case tone-mapping +/* + + float midutil = mid_gray_view / mid_gray_scene;//take into account ratio between Yb source and Yb viewing + float midk = 1.f; + float k_slope = 2.2f; + if(target_slope >= 1.f) { + midk = pow_F(midutil, k_slope * (target_slope - 1.f));//ponderation in function target_slope when "slope user" < 1.f + } + kmid = midk; + + } +*/ + if (mode == 3 && settings->verbose) { + printf("b=%f gamma=%f slope=%f DynRange=%f kmid=%f black=%f Yb-scale=%f\n", (double) b, (double) gamma, (double) target_slope, (double) dr, (double) kmid, (double) c, (double) mid_gray_scene_); + } + //lut - take from Alberto Griggio + if(mode == 4) { + for (int i = 0; i < 65536; ++i) {// i - value image RGB + lutr[i] = do_get(float(i) / 65535.f, rolloff, mid_gray_scene_, gammar, dr, b, c, kmid);//call main function + lutg[i] = do_get(float(i) / 65535.f, rolloff, mid_gray_scene_, gammag, dr, b, c, kmid);//call main function + lutb[i] = do_get(float(i) / 65535.f, rolloff, mid_gray_scene_, gammab, dr, b, c, kmid);//call main function + } + } else { + kmid = 1.f; + for (int i = 0; i < 65536; ++i) {// i - value image RGB + lut[i] = do_get(float(i) / 65535.f, rolloff, mid_gray_scene_, gamma, dr, b, c, kmid);//call main function + } + } +} + + void ImProcFunctions::loccont(int bfw, int bfh, LabImage* tmp1, float rad, float stren, int sk) { if (rad > 0.f) { @@ -2277,6 +2719,7 @@ void ImProcFunctions::loccont(int bfw, int bfh, LabImage* tmp1, float rad, float #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]; @@ -2284,99 +2727,150 @@ void ImProcFunctions::loccont(int bfw, int bfh, LabImage* tmp1, float rad, float 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]); + 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) +void ImProcFunctions::tone_eqdehaz(ImProcFunctions *ipf, Imagefloat *rgb, int whits, int blacks, const Glib::ustring &workingProfile, double scale, bool multithread) +{ + ToneEqualizerParams params; + params.enabled = true; + params.regularization = 0.f; + params.pivot = 0.f; + double blred = 0.4; + params.bands[0] = blred * blacks; + int bla = abs(blacks); + int threshblawhi = 50; + int threshblawhi2 = 85; + if(bla > threshblawhi) { + params.bands[1] = blred * sign(blacks) * (bla - threshblawhi); + } + if(bla > threshblawhi2) { + params.bands[2] = blred * sign(blacks) * (bla - threshblawhi2); + } + + params.bands[4] = whits; + int whi = abs(whits); + if(whi > threshblawhi) { + params.bands[3] = sign(whits) * (whi - threshblawhi); + } + + ipf->toneEqualizer(rgb, params, workingProfile, scale, multithread); +} + + +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)); + 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) { +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; + 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; } - } while (!inGamut); + + 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 -) +void ImProcFunctions::ciecamloc_02float(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, float &maxicam, float &contsig, float &lightsig + ) { // BENCHFUN -//possibility to reenable Zcam - if(!params->locallab.spots.at(sp).activ) {//disable all ciecam functions + 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) { + } 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; + // bool islogq = params->locallab.spots.at(sp).logcie; + // bool istrc = params->locallab.spots.at(sp).trccie; + bool issig = true; //params->locallab.spots.at(sp).sigcie; //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; + 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 sigmoidnorm = params->locallab.spots.at(sp).normcie; + int mobwev = 0; + float sumcamq01 = 0.5f; + if (params->locallab.spots.at(sp).bwevMethod == "none") { + mobwev = 0; + } else if (params->locallab.spots.at(sp).bwevMethod == "sig") { + mobwev = 1; + } else if (params->locallab.spots.at(sp).bwevMethod == "logsig") { + mobwev = 2; + } + + float senssig = (float) params->locallab.spots.at(sp).sigmoidsenscie; 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]}, @@ -2386,41 +2880,45 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L 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") { + + if(lp.moka == 1) { mocam = 1; - } else if(params->locallab.spots.at(sp).modecam == "jz") { + } else if (lp.moka == 2) { mocam = 2; -// } else if(params->locallab.spots.at(sp).modecam == "zcam") { -// mocam = 3; } int mecamcurve = 0; - if(params->locallab.spots.at(sp).toneMethodcie == "one") { + + if (params->locallab.spots.at(sp).toneMethodcie == "one") { mecamcurve = 0; - } else if(params->locallab.spots.at(sp).toneMethodcie == "two") { + } else if (params->locallab.spots.at(sp).toneMethodcie == "two") { mecamcurve = 1; } int mecamcurve2 = 0; - if(params->locallab.spots.at(sp).toneMethodcie2 == "onec") { + + if (params->locallab.spots.at(sp).toneMethodcie2 == "onec") { mecamcurve2 = 0; - } else if(params->locallab.spots.at(sp).toneMethodcie2 == "twoc") { + } else if (params->locallab.spots.at(sp).toneMethodcie2 == "twoc") { mecamcurve2 = 1; - } else if(params->locallab.spots.at(sp).toneMethodcie2 == "thrc") { + } 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 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; + // const float ath = sigmoidth - 1.f; + // const float bth = 1; + float sila = pow_F(sigmoidlambda, senssig); + sila = LIM01(sila); + const float sigm = 3.3f + 7.1f * (1.f - sila); //e^10.4 = 32860 => sigm vary from 3.3 to 10.4 + float bl = std::min(sigmoidbl, 1.f);//reused old slider + if(params->locallab.spots.at(sp).logcieq) { + bl = 0.01f * (float) params->locallab.spots.at(sp).strcielog; + bl = std::min(bl, 1.f); + } //end sigmoid int width = lab->W, height = lab->H; @@ -2439,63 +2937,63 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L //for J light and contrast LUTf CAMBrightCurveJ(32768, LUT_CLIP_BELOW | LUT_CLIP_ABOVE); LUTf CAMBrightCurveQ(32768, LUT_CLIP_BELOW | LUT_CLIP_ABOVE); - + LUTf CAMBrightCurveQsig(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); + 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 + #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 + 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; + 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.93f; + koef = 0.87f; } } else { - koef = 0.87f; + if (currL > 60.f) { + koef = 0.85f; + } else { + koef = 0.8f; + } } } 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; + if (currL > 10.f) { + if (currL > 20.f) { + if (currL > 40.f) { + koef = 0.75f; + } else { + koef = 0.7f; + } } else { - koef = 0.7f; + koef = 0.9f; } } else { - koef = 0.9f; + koef = 1.0; } - } 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 } - - 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 @@ -2516,7 +3014,8 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L float lightL = 0.f; float contQ = 0.f; float lightQ = 0.f; - if(iscie) { + + 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. @@ -2526,55 +3025,86 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L 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) { + + if (iscie) { contthresL = params->locallab.spots.at(sp).contthrescie; } else { contthresL = params->locallab.spots.at(sp).contthres; } + float contthresQ = contthresL; - if(contL < 0.f) { + + if (contL < 0.f) { contthresL *= -1; - } + } + float thL = 0.6f; thL = 0.3f * contthresL + 0.6f; - - if(contQ < 0.f) { + + if (contQ < 0.f) { contthresQ *= -1; - } + } + float thQ = 0.6f; thQ = 0.3f * contthresQ + 0.6f; + float thQsig = 0.6f; Ciecam02::curveJfloat(lightL, contL, thL, hist16J, CAMBrightCurveJ); //lightness J and contrast J CAMBrightCurveJ /= 327.68f; + double podcont = 40.;//50 + double podcont0 = 40.;//50 + double podcont1 = 30.;//35. + double ka = -(podcont0 - podcont1) / 0.5; + double kb = podcont1 - ka; + + double podlight = 35.; + double podlight0 = 35.; + double podlight1 = 40.;//45 + double kal = -(podlight0 - podlight1) / 0.5; + double kbl = podlight1 - kal; + double contbase = params->locallab.spots.at(sp).sigmoidldacie; + + if(contbase <= 0.5) { + podcont = podcont0; + podlight = podlight0; + + } else { + podcont = ka * contbase + kb; + podlight = kal * contbase + kbl; + } Ciecam02::curveJfloat(lightQ, contQ, thQ, hist16Q, CAMBrightCurveQ); //brightness Q and contrast Q + lightsig = -podlight * contbase; + contsig = podcont * contbase; + Ciecam02::curveJfloat(lightsig, contsig, thQsig, hist16Q, CAMBrightCurveQsig); //brightness Q and contrast Q bypass. } - - + + int tempo = 5000; - if(params->locallab.spots.at(sp).expvibrance && call == 2) { + + 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){ + } else if (params->locallab.spots.at(sp).warm < 0) { tempo = 5000 - 70 * params->locallab.spots.at(sp).warm; } } - if(ciec) { - if(iscie) { + 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){ + } 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){ + } else if (params->locallab.spots.at(sp).catad < 0) { tempo = 5000 - 70 * params->locallab.spots.at(sp).catad; } } @@ -2590,19 +3120,26 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L 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") { + + if (ciec) { + if (iscie) { + //surround source with only 2 choices (because Log encoding before) + if(lp.sursouci == 0) { f = 1.0f, c = 0.69f, nc = 1.0f; - } else if (params->locallab.spots.at(sp).sursourcie == "Dim") { + } else if (lp.sursouci == 1){ f = 0.9f; c = 0.59f; nc = 0.9f; - } else if (params->locallab.spots.at(sp).sursourcie == "Dark") { + } else if (lp.sursouci == 2) { f = 0.8f; c = 0.525f; nc = 0.8f; + } else if (lp.sursouci == 3) { + f = 0.8f; + c = 0.41f; + nc = 0.8f; + } else if (lp.sursouci == 4) { + f = 1.0f, c = 0.702f, nc = 1.0f;//very small surround effect for Jz - Also disable Ciecam further } } else { if (params->locallab.spots.at(sp).sursour == "Average") { @@ -2615,11 +3152,15 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L f = 0.8f; c = 0.525f; nc = 0.8f; + } else if (params->locallab.spots.at(sp).sursour == "exDark") { + f = 0.8f; + c = 0.41f; + nc = 0.8f; } } //viewing condition for surround - if(iscie) { + 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") { @@ -2651,7 +3192,7 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L c2 = 0.41f; nc2 = 0.8f; } - + } } @@ -2667,8 +3208,9 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L //La and la2 = ambiant luminosity scene and viewing la = 400.f; float la2 = 400.f; - if(ciec) { - if(iscie) { + + if (ciec) { + if (iscie) { la = params->locallab.spots.at(sp).sourceabscie; la2 = params->locallab.spots.at(sp).targabscie; } else { @@ -2683,8 +3225,9 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L //algoritm's params float yb = 18.f; yb2 = 18; - if(ciec) { - if(iscie) { + + 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; @@ -2693,47 +3236,51 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L 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") { + 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(lp.sursouci == 0) { f = 1.0f, c = 0.69f, nc = 1.0f; - } else if (params->locallab.spots.at(sp).sursourcie == "Dim") { + } else if (lp.sursouci == 1){ f = 0.9f; c = 0.59f; nc = 0.9f; - } else if (params->locallab.spots.at(sp).sursourcie == "Dark") { + } else if (lp.sursouci == 2) { f = 0.8f; c = 0.525f; nc = 0.8f; + } else if (lp.sursouci == 3) { + f = 0.8f; + c = 0.41f; + nc = 0.8f; + } else if (lp.sursouci == 4) { + f = 1.0f, c = 0.702f, nc = 1.0f;//very small surround effect for Jz } + } - + 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) { + 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; + cchr = -99.8f; } schr = params->locallab.spots.at(sp).saturlcie; if (schr > 0.f) { - schr = schr / 2.f; //divide sensibility for saturation + schr = schr / 2.f; //divide sensibility for saturation } if (schr == -100.f) { @@ -2745,24 +3292,22 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L 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; + cchr = -99.8f; } schr = params->locallab.spots.at(sp).saturl; if (schr > 0.f) { - schr = schr / 2.f; //divide sensibility for saturation + schr = schr / 2.f; //divide sensibility for saturation } if (schr == -100.f) { @@ -2774,6 +3319,7 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L if (mchr == -100.0f) { mchr = -99.8f ; } + if (mchr == 100.0f) { mchr = 99.9f; } @@ -2790,9 +3336,11 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L float cz, wh, pfl; int c16 = 16;//always cat16 bool c20 = true; - if(c20 && plum > 100.f) { + + 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(); @@ -2813,17 +3361,20 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L 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) { + + if (jzamountchroma < 0.05) { jzamountchroma = 0.05; } - if(jzamountchroma > 2.) { + + 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; @@ -2833,7 +3384,8 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L #endif const float epsil = 0.0001f; const float coefQ = 32767.f / wh; - const float coefq = 1 / wh; + const float coefq = 1.f / 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) ; @@ -2845,7 +3397,7 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L 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 + if ((mocam == 2) && call == 0) { //Jz az bz ==> Jz Cz Hz before Ciecam16 double mini = 1000.; double maxi = -1000.; double sum = 0.; @@ -2861,13 +3413,13 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L 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) + #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) { + + 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]; @@ -2887,51 +3439,59 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L 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) { + Ciecam02::xyz2jzczhz(Jz, az, bz, xx, yy, zz, pl, L_p, M_p, S_p, zcam); + + if (Jz > maxi) { maxi = Jz; } - if(Jz < mini) { + + 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... + // 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) + //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 + //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 aj = maxi - bj; double to_screen = (aj * interm + bj) / maxi; //to screen - remapping of Jz in function real scene absolute luminance -// if (settings->verbose) { +// 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 + + 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); - } + + 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)); @@ -2944,20 +3504,21 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L 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) { + 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; + 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; @@ -2966,9 +3527,9 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L 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 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, @@ -2986,17 +3547,18 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L DCT_NURBS, 0, 0, miny, miny + lightreal / 150., - maxy, min (1.0, maxy + delta + lightreal / 300.0), + 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 , + 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) { @@ -3005,52 +3567,58 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L } } } + float mjjz = lp.mLjz; - if(wavcurvejz && lp.mLjz == 0.f) { + + 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); + //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 { + 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); + 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; - }; + 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) + #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]; @@ -3071,7 +3639,7 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L 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); + 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; @@ -3079,7 +3647,8 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L 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) { + + 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]; @@ -3088,11 +3657,12 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L } } - if(highhs > 0 || shadhs > 0) { + 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]; @@ -3101,21 +3671,22 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L } } } + //others "Lab" treatment...to adapt - - if(wavcurvejz || mjjz != 0.f || lp.mCjz != 0.f) {//local contrast wavelet and clarity + + 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 + // 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 + // adapt maximum level wavelet to size of crop while ((1 << maxlevelspot) >= (minwin * sk) && maxlevelspot > 1) { --maxlevelspot ; } @@ -3123,23 +3694,27 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L 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) { + if (mjjz != 0.f || lp.mCjz != 0.f) { float mL0 = 0.f; float mC0 = 0.f; bool exec = false; @@ -3161,18 +3736,20 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L 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); } @@ -3180,55 +3757,62 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L //new curves Hz #ifdef _OPENMP - #pragma omp parallel for if (multiThread) + #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 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) { + + if (jzch == false) { kcc = 1.f; - } else if(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 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); - } + + 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; + 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]); + + + 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 ) { + + if (Hz < 0.0f) { Hz += (2.f * rtengine::RT_PI_F); } @@ -3239,80 +3823,88 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L } } - 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 (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); - } + 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) + #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; - } + + 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 + #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) { + 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)); + 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]; @@ -3320,57 +3912,67 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L double Jz = LIM01(JJz[i][k]); Jz *= to_one; double Cz = sqrt(az * az + bz * bz); + //log encoding - if(logjz) { + 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 + if (issigjz && iscie) { //sigmoid Jz float val = Jz; - if(islogjz) { + + if (islogjz) { val = std::max((xlog(Jz) / log2 - shadows_range) / (dynamic_range + 1.5), noise);//in range EV } - if(sigmoidthjz >= 1.f) { + + if (sigmoidthjz >= 1.f) { thjz = athjz * val + bthjz;//threshold } else { thjz = atjz * val + btjz; } - sigmoidla (val, thjz, sigmjz);//sigmz "slope" of sigmoid - + + sigmoidla(val, thjz, sigmjz); //sigmz "slope" of sigmoid + Jz = LIM01((double) bljz * Jz + (double) val); } - if(Qtoj == true) {//lightness instead of brightness + 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))); + + //contrast + Jz = LIM01(jz_contrast.getVal(LIM01(Jz))); + //brightness and lightness - if(lightreal > 0) { + if (lightreal > 0) { Jz = LIM01(jz_light.getVal(Jz)); } - if(lightreal < 0) { + + 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); + + 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) { + if (Qtoj == false) { Jz /= to_one; } else { Jz = sqrt(Jz); @@ -3378,54 +3980,65 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L } double Hz; - //remapping Cz - Hz = xatan2 ( bz, az ); + //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)); + 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); + 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); + if (Hz < 0.0) { + Hz += (2. * rtengine::RT_PI); } + //Chroma slider - if(chromz < 0.) { + 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 + double pocz = pow(fcz, 1. - 0.0024 * chromz); //increase value - before 0.0017 Cz = maxcz * pocz; - // Cz = Cz * (1. + 0.005 * chromz);//linear + // Cz = Cz * (1. + 0.005 * chromz);//linear } + //saturation slider - if(saturz != 0.) { - double js = Jz/ maxjzw;//divide by Jz white + if (saturz != 0.) { + double js = Jz / maxjzw; //divide by Jz white js = SQR(js); - if(js <= 0.) { + + if (js <= 0.) { js = 0.0000001; } + double Sz = Cz / (js); - if(saturz < 0.) { + + 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); + + if (Hz < 0.0) { + Hz += (2. * rtengine::RT_PI); } + Cz = clipcz(Cz); double2 sincosval = xsincos(Hz); az = clipazbz(Cz * sincosval.y); @@ -3437,16 +4050,17 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L az = az / (to_screen); Jz = LIM01(Jz / (to_screen)); - if(jabcie) {//Not used does not work at all + + if (jabcie) { //Not used does not work at all Jz = clipjz05(Jz); - gamutjz (Jz, az, bz, pl, wip, 0.94, 0.004); + 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); + 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); @@ -3461,35 +4075,36 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L } } } - -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 + //lp.sursouci==4 disable ciecam + if ((mocam == 1 && lp.sursouci!= 4)|| mocam ==2 || call == 1 || call == 2 || call == 10) { //CAM16 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; - } + if (settings->verbose && (mocam == 1 || call == 1)) {//display only if choice cam16 + //information on Cam16 scene conditions - allows user to see choices's incidences + float maxicamq = -1000.f; + float maxicamj = -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; + } - + //find main values Cam16 #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) + #pragma omp parallel for reduction(min:minicam) reduction(max:maxicamj) 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) { + + 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]; @@ -3501,87 +4116,156 @@ if(mocam == 0 || mocam == 1 || call == 1 || call == 2 || call == 10) {//call=2 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; + Q, M, s, aw, fl, wh, + x, y, z, + xw1, yw1, zw1, + c, nc, pow1, nbb, ncb, pfl, cz, d, c16, plum); + + if (J > maxicamj) { + maxicamj = J; } - if(J < minicam) { + + if (J < minicam) { minicam = J; } + sumcam += J; - if(Q > maxicamq) { + if (Q > maxicamq) { maxicamq = Q; } - if(Q < minicamq) { + + if (Q < minicamq) { minicamq = Q; } + sumcamq += Q; - if(s > maxisat) { + if (s > maxisat) { maxisat = s; } - if(s < minisat) { + + if (s < minisat) { minisat = s; } + sumsat += s; - if(M > maxiM) { + if (M > maxiM) { maxiM = M; } - if(M < miniM) { + + if (M < miniM) { miniM = M; } - sumM += M; + sumM += M; + } + } + + nccam = height * width; + sumcam = sumcam / nccam; + sumcamq /= nccam; + sumsat /= nccam; + sumM /= nccam; + + if (settings->verbose) { + 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 meanQ1=%2.3f\n", (double) plum, (double) minicam, (double) maxicamj, (double) sumcam, (double) minicamq, (double) maxicamq, (double) sumcamq, (double) (sumcamq * coefq)); + 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); + } + // maxicam = maxicamq;//maximum Brightness + if(sumcamq < maxicamq) { + // maxicam = sumcamq + 0.2f * minicamq;//maximum Brightness take into account + maxicam = sumcamq;//maximum Brightness take into account + //ponderate maxicam with mean and mini + } else { + maxicam = 0.4f * sumcamq + 0.6f * maxicamq; + } + sumcamq01 = sumcamq * coefq; + + } + + float base = 10.f; + float linbaseor = 10.f; + float linbase = 10.f; + float gray = 15.f; + + const bool compr = params->locallab.spots.at(sp).comprcie > 0.; + float comprfactor = params->locallab.spots.at(sp).comprcie; + float comprth = 1.f; //0.1 + params->locallab.spots.at(sp).comprcieth; + + double drref = 8.5; //Dynamic Range standard + + double drd = ((double) dynamic_range - drref) / drref; + + double dratt = (double) dynamic_range / drref; + comprfactor = 0.4f * comprfactor * (float) dratt;//adapt comprfactor to Dynamic Range + float newgray = 0.18f; + + if ((params->locallab.spots.at(sp).logcie && params->locallab.spots.at(sp).logcieq) || mobwev != 0) {//increase Dyn Range when log encoding + dynamic_range += 0.2;//empirical value + gray = 0.01f * (float) params->locallab.spots.at(sp).sourceGraycie; + const float targetgraycie = params->locallab.spots.at(sp).targetGraycie; + float targetgraycor = 0.01f * targetgraycie; + 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; + linbaseor = std::max(base, 2.f);//2. minimal base log to avoid very bad results + + float maxQgray = coefq * maxicam / gray; + maxicam = maxQgray;//setting threshold comprcieth + const float log2 = xlogf(2.f); + + float corlog = xlogf(maxicam)/log2;//correction base logarithme + linbase = linbaseor / corlog; + newgray = gray; //gray - 0.022f * (6.f - maxicam);//empirical formula to take into account Q in DR. 6.f =>approach to mean overall images + + if (settings->verbose) { + printf("Gray=%1.3f newgray=%1.3f MaxicamQ=%3.2f Base log encode corrected Q=%5.1f Base log encode origig Q=%5.1f\n", (double) gray, (double) newgray, (double) maxicam, (double) linbase, (double) linbaseor); + } + + } + + const auto applytoq = + [ = ](float x) -> float { + + x = rtengine::max(x, (float) noise); + x = rtengine::max(x / newgray, (float) noise);//gray = gain - before log conversion + + if (compr && x >= comprth)//comprth = maxicam + { + x = intp(comprfactor, (std::tanh((x - comprth) / comprth) + 1.f) * comprth, x); //as sigmoid... but tanh (tg hyperbolic), inspired by the work of alberto Grigio + } + + 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; + }; + + //prepare Normalize luminance + float *datain = nullptr; + float *data = nullptr; + float *datanorm = nullptr; + + if ((sigmoidnorm && issigq) || params->locallab.spots.at(sp).logcieq) { + datain = new float[width* height]; + data = new float[width * height]; + datanorm = new float[width * height]; +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, 16) +#endif + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + datain[(y) * width + (x)] = lab->L[y][x]; + } } } - 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 @@ -3599,11 +4283,12 @@ if(mocam == 0 || mocam == 1 || call == 1 || call == 2 || call == 10) {//call=2 float sbuffer[bufferLength] ALIGNED16; #endif #ifdef _OPENMP - #pragma omp for schedule(dynamic, 16) + #pragma omp for schedule(dynamic, 16) #endif + for (int i = 0; i < height; i++) { #ifdef __SSE2__ - // vectorized conversion from Lab to jchqms + // vectorized conversion from Lab to jchqms int k; vfloat c655d35 = F2V(655.35f); @@ -3615,10 +4300,10 @@ if(mocam == 0 || mocam == 1 || call == 1 || call == 2 || call == 10) {//call=2 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)); + 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); @@ -3639,10 +4324,10 @@ if(mocam == 0 || mocam == 1 || call == 1 || call == 2 || call == 10) {//call=2 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); + 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; @@ -3657,7 +4342,7 @@ if(mocam == 0 || mocam == 1 || call == 1 || call == 2 || call == 10) {//call=2 float J, C, h, Q, M, s; #ifdef __SSE2__ - // use precomputed values from above + // use precomputed values from above J = Jbuffer[j]; C = Cbuffer[j]; h = hbuffer[j]; @@ -3677,10 +4362,10 @@ if(mocam == 0 || mocam == 1 || call == 1 || call == 2 || call == 10) {//call=2 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); + 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; @@ -3689,50 +4374,58 @@ if(mocam == 0 || mocam == 1 || call == 1 || call == 2 || call == 10) {//call=2 Qpro = Q; Mpro = M; spro = s; - /* - */ - if(ciec) { + + if (ciec && mocam == 1) {//only Cam16 bool jp = false; - if ((cielocalcurve && localcieutili) && mecamcurve == 1) { + + if (params->locallab.spots.at(sp).logcie && params->locallab.spots.at(sp).logcieq && iscie) {//log encoding Q + float val = Qpro * coefq; + + if (val > (float) noise) { + float mm = applytoq(val); + float f = mm / val; + Qpro *= f; + } + } + // if (issig && issigq && iscie && !islogq && mobwev != 2) { //sigmoid Q only and black Ev & white Ev + if (issig && issigq && iscie && mobwev != 2) { //sigmoid Q only and black Ev & white Ev + float val = Qpro * coefq; + + if (mobwev == 1) { + val = std::max((xlog(val) / log2 - shadows_range) / (dynamic_range + 1.5), noise);//in range EV + } + + float sigreal = sigmoidth * sumcamq01;//correction for sigmoid Q take into account mean Q + + if (sigreal >= 1.f) { + th = (sigreal - 1.f) * val + 1.f; + } else { + th = (1.f - sigreal) * val + sigreal; + } + + sigmoidla(val, th, sigm); + Qpro = std::max(Qpro + val / coefq, 0.f); + Qpro = CAMBrightCurveQsig[(float)(Qpro * coefQ)] / coefQ; //brightness and contrast + + Jpro = SQR((10.f * Qpro) / wh); + + } + + if ((cielocalcurve && localcieutili) && mecamcurve == 1) {//curve Q 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) { + + 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); @@ -3746,7 +4439,7 @@ if(mocam == 0 || mocam == 1 || call == 1 || call == 2 || call == 10) {//call=2 spro = 100.0f * sqrtf(Mpro / Qpro); if (Jpro > 99.9f) { - Jpro = 99.9f; + Jpro = 99.9f; } Jpro = CAMBrightCurveJ[(float)(Jpro * 327.68f)]; //lightness CIECAM02 + contrast @@ -3762,14 +4455,14 @@ if(mocam == 0 || mocam == 1 || call == 1 || call == 2 || call == 10) {//call=2 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) { + + if ((cielocalcurve && localcieutili) && mecamcurve == 0) {//curve J float Jj = (float) Jpro * 327.68f; float Jold = Jj; Jj = 0.5f * cielocalcurve[Jj * 2.f]; @@ -3780,8 +4473,9 @@ if(mocam == 0 || mocam == 1 || call == 1 || call == 2 || call == 10) {//call=2 Jpro = 1.f; } } - if (cielocalcurve2 && localcieutili2) { - if(mecamcurve2 == 0) { + + if (cielocalcurve2 && localcieutili2) {//chroma saturation colorfullness + if (mecamcurve2 == 0) {//chroma float parsat = 0.8f; //0.68; float coef = 327.68f / parsat; float Cc = (float) Cpro * coef; @@ -3792,7 +4486,7 @@ if(mocam == 0 || mocam == 1 || call == 1 || call == 2 || call == 10) {//call=2 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) { + } else if (mecamcurve2 == 1) {//saturation float parsat = 0.8f; //0.6 float coef = 327.68f / parsat; float Ss = (float) spro * coef; @@ -3807,7 +4501,7 @@ if(mocam == 0 || mocam == 1 || call == 1 || call == 2 || call == 10) {//call=2 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) { + } else if (mecamcurve2 == 2) {//colorfullness float parsat = 0.8f; //0.68; float coef = 327.68f / parsat; float Mm = (float) Mpro * coef; @@ -3822,7 +4516,6 @@ if(mocam == 0 || mocam == 1 || call == 1 || call == 2 || call == 10) {//call=2 Cpro = Mpro / coe; } } - } //retrieve values C,J...s @@ -3843,9 +4536,9 @@ if(mocam == 0 || mocam == 1 || call == 1 || call == 2 || call == 10) {//call=2 //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); + 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); @@ -3867,9 +4560,9 @@ if(mocam == 0 || mocam == 1 || call == 1 || call == 2 || call == 10) {//call=2 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)); + 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); @@ -3883,7 +4576,7 @@ if(mocam == 0 || mocam == 1 || call == 1 || call == 2 || call == 10) {//call=2 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; @@ -3893,303 +4586,54 @@ if(mocam == 0 || mocam == 1 || call == 1 || call == 2 || call == 10) {//call=2 #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 + + if ((mocam == 1 && (sigmoidnorm && issigq)) || params->locallab.spots.at(sp).logcieq) { //Normalize luminance + #ifdef _OPENMP - #pragma omp parallel for reduction(min:miniiz) reduction(max:maxiiz) reduction(+:sumiz) if(multiThread) + #pragma omp parallel for schedule(dynamic, 16) #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; + for (int y = 0; y < height; y++) { //data after ciecam + for (int x = 0; x < width; x++) { + data[(y) * width + (x)] = lab->L[y][x]; + datanorm[(y) * width + (x)] = lab->L[y][x]; + } } - } - 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 - }); + double nbs = 1.; + drd = std::max(drd, 1.); + if (bl > 0.5f) { + nbs = (1.7 * (double) bl * drd);//take into account DR to increase variance in image source + } + if(!params->locallab.spots.at(sp).logcieq) {// not with log encoding Q + normalize_mean_dt(datanorm, datain, height * width, 1.f, 1.f, 0.f, 0.f, 0.f, 0.f, nbs);//normalize luminance + } #ifdef _OPENMP - #pragma omp parallel for if(multiThread) + #pragma omp parallel for schedule(dynamic, 16) #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); + + for (int ir = 0; ir < height; ir++) { + for (int jr = 0; jr < width; jr++) { + if(!params->locallab.spots.at(sp).logcieq) {// if not Log encoding ciecam + data[ir * width + jr] = intp(bl, data[ir * width + jr], datanorm[ir * width + jr]);//blend with original + } else { + data[ir * width + jr] = intp(bl, data[ir * width + jr], datain[ir * width + jr]);//blend with original + } + lab->L[ir][jr] = data[ir * width + jr]; + } } } -#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)); + delete [] datain; + delete [] data; + delete [] datanorm; + } - 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) @@ -4197,11 +4641,13 @@ void ImProcFunctions::softproc(const LabImage* bufcolorig, const LabImage* bufco 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; @@ -4211,7 +4657,7 @@ void ImProcFunctions::softproc(const LabImage* bufcolorig, const LabImage* bufco 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 * 0.1f * rad + bepsil; const float epsil = aepsil * rad + bepsil; const float blur = 10.f / sk * (thres + 0.f * rad); @@ -4220,6 +4666,7 @@ void ImProcFunctions::softproc(const LabImage* bufcolorig, const LabImage* bufco #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]); @@ -4230,6 +4677,7 @@ void ImProcFunctions::softproc(const LabImage* bufcolorig, const LabImage* bufco #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; @@ -4247,6 +4695,7 @@ void ImProcFunctions::softproc(const LabImage* bufcolorig, const LabImage* bufco #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]; @@ -4257,6 +4706,7 @@ void ImProcFunctions::softproc(const LabImage* bufcolorig, const LabImage* bufco #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; @@ -4266,7 +4716,7 @@ void ImProcFunctions::softproc(const LabImage* bufcolorig, const LabImage* bufco 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 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); @@ -4275,6 +4725,7 @@ void ImProcFunctions::softproc(const LabImage* bufcolorig, const LabImage* bufco #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]; @@ -4292,6 +4743,7 @@ void ImProcFunctions::softprocess(const LabImage* bufcolorig, array2D &bu #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); @@ -4303,6 +4755,7 @@ void ImProcFunctions::softprocess(const LabImage* bufcolorig, array2D &bu #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)); @@ -4320,6 +4773,7 @@ void ImProcFunctions::softprocess(const LabImage* bufcolorig, array2D &bu #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; @@ -4333,26 +4787,30 @@ void ImProcFunctions::exlabLocal(local_params& lp, float strlap, int bfh, int bf //exposure local constexpr float maxran = 65536.f; - if(lp.laplacexp == 0.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 - + 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 + + if (!lp.invex) { // Laplacian not in inverse bw = bfwr; bh = bfhr; @@ -4369,6 +4827,7 @@ void ImProcFunctions::exlabLocal(local_params& lp, float strlap, int bfh, int bf float bb = blap - 30.f * aa; float lap; + if (diffde > 80.f) { lap = alap; } else if (diffde < 30.f) { @@ -4378,8 +4837,9 @@ void ImProcFunctions::exlabLocal(local_params& lp, float strlap, int bfh, int bf } #ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) if (multiThread) + #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]; @@ -4389,20 +4849,22 @@ void ImProcFunctions::exlabLocal(local_params& lp, float strlap, int bfh, int bf 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) + #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 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 @@ -4414,7 +4876,7 @@ void ImProcFunctions::exlabLocal(local_params& lp, float strlap, int bfh, int bf lab->L[ir][jr] = 0.5f * tonecurve[2 * L]; } } - } else if(!lp.invex) {//for PDE algorithms + } 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; @@ -4422,6 +4884,7 @@ void ImProcFunctions::exlabLocal(local_params& lp, float strlap, int bfh, int bf #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]; @@ -4464,6 +4927,7 @@ void ImProcFunctions::addGaNoise(LabImage *lab, LabImage *dst, const float mean, #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; @@ -4517,7 +4981,10 @@ void ImProcFunctions::DeNoise_Local(int call, const struct local_params& lp, Lab //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; + float ach = lp.trans / 100.f; + if(lp.fullim == 3 ) {//disabled transit + ach = 1.f; + } const float factnoise1 = 1.f + (lp.noisecf) / 500.f; const float factnoise2 = 1.f + (lp.noisecc) / 500.f; @@ -4576,6 +5043,7 @@ void ImProcFunctions::DeNoise_Local(int call, const struct local_params& lp, Lab #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 @@ -4590,9 +5058,12 @@ void ImProcFunctions::DeNoise_Local(int call, const struct local_params& lp, Lab if (lp.shapmet == 0) { calcTransition(lox, loy, ach, lp, zone, localFactor); - } else /*if (lp.shapmet == 1)*/ { + } else { /*if (lp.shapmet == 1)*/ calcTransitionrect(lox, loy, ach, lp, zone, localFactor); } + if(lp.fullim == 3 ) {//disabled scope + localFactor = 1.f; + } if (zone == 0) { // outside selection and outside transition zone => no effect, keep original values continue; @@ -4610,6 +5081,7 @@ void ImProcFunctions::DeNoise_Local(int call, const struct local_params& lp, Lab 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 @@ -4626,6 +5098,9 @@ void ImProcFunctions::DeNoise_Local(int call, const struct local_params& lp, Lab difa = tmp1.a[y][x] - original->a[y][x]; difb = tmp1.b[y][x] - original->b[y][x]; } + if(lp.fullim == 3 ) {//disable scope + reducdEL = reducdEa = reducdEb = 1.f; + } difL *= localFactor * reducdEL; difa *= localFactor * reducdEa; @@ -4668,10 +5143,13 @@ void ImProcFunctions::DeNoise_Local2(const struct local_params& lp, LabImage* or 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; + float ach = lp.trans / 100.f; + if(lp.fullim == 3 ) {//disabled transit + ach = 1.f; + } const float factnoise1 = 1.f + (lp.noisecf) / 500.f; const float factnoise2 = 1.f + (lp.noisecc) / 500.f; @@ -4713,8 +5191,8 @@ void ImProcFunctions::DeNoise_Local2(const struct local_params& lp, LabImage* or } } - // const int begx = lp.xc - lp.lxL; - // const int begy = lp.yc - lp.lyT; +// const int begx = lp.xc - lp.lxL; +// const int begy = lp.yc - lp.lyT; constexpr float r327d68 = 1.f / 327.68f; #ifdef _OPENMP @@ -4737,7 +5215,7 @@ void ImProcFunctions::DeNoise_Local2(const struct local_params& lp, LabImage* or // 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; @@ -4748,6 +5226,9 @@ void ImProcFunctions::DeNoise_Local2(const struct local_params& lp, LabImage* or } else { /*if (lp.shapmet == 1)*/ calcTransitionrect(lox, loy, ach, lp, zone, localFactor); } + if(lp.fullim == 3 ) {//disabled scope + localFactor = 1.f; + } if (zone == 0) { // outside selection and outside transition zone => no effect, keep original values continue; @@ -4769,13 +5250,16 @@ void ImProcFunctions::DeNoise_Local2(const struct local_params& lp, LabImage* or 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]; + 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]; + if(lp.fullim == 3 ) {//disable scope + reducdEL = reducdEa = reducdEb = 1.f; + } difL *= localFactor * reducdEL; difa *= localFactor * reducdEa; @@ -4847,6 +5331,7 @@ void ImProcFunctions::InverseReti_Local(const struct local_params & lp, const fl #ifdef _OPENMP #pragma omp for schedule(dynamic,16) #endif + for (int y = 0; y < transformed->H; y++) { int loy = cy + y; @@ -4858,13 +5343,16 @@ void ImProcFunctions::InverseReti_Local(const struct local_params & lp, const fl if (lp.shapmet == 0) { calcTransition(lox, loy, ach, lp, zone, localFactor); - } else /*if (lp.shapmet == 1)*/ { + } 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); + float reducdE = calcreducdE(dE, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, lp.sensh); + if(lp.fullim == 3 ) {//disable scope + reducdE = 1.f; + } switch (zone) { case 0: { // outside selection and outside transition zone => full effect, no transition @@ -4880,6 +5368,7 @@ void ImProcFunctions::InverseReti_Local(const struct local_params & lp, const fl transformed->a[y][x] = clipC(original->a[y][x] + difa * reducdE); transformed->b[y][x] = clipC(original->b[y][x] + difb * reducdE); } + break; } @@ -4902,6 +5391,7 @@ void ImProcFunctions::InverseReti_Local(const struct local_params & lp, const fl transformed->a[y][x] = clipC(original->a[y][x] + difa * reducdE); transformed->b[y][x] = clipC(original->b[y][x] + difb * reducdE); } + break; } @@ -4987,6 +5477,7 @@ void ImProcFunctions::InverseBlurNoise_Local(LabImage * originalmask, const stru #ifdef _OPENMP #pragma omp for schedule(dynamic,16) #endif + for (int y = 0; y < transformed->H; y++) { int loy = cy + y; @@ -5001,24 +5492,30 @@ void ImProcFunctions::InverseBlurNoise_Local(LabImage * originalmask, const stru } else { calcTransitionrect(lox, loy, ach, lp, zone, localFactor); } - float reducdE; + + 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); + if(lp.fullim == 3 ) {//disabled scope + reducdE = 1.f; + } + } 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); + 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); @@ -5076,24 +5573,26 @@ static void mean_fab(int xstart, int ystart, int bfw, int bfh, LabImage* bufexpo if (nbfab > 0) { double sumab = 0.0; -#ifdef _OPENMP +#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) { + 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])); + + // sumab += static_cast(std::fabs(bufexporig->a[y][x])); + // sumab += static_cast(std::fabs(bufexporig->b[y][x])); } } @@ -5104,12 +5603,14 @@ static void mean_fab(int xstart, int ystart, int bfw, int bfh, LabImage* bufexpo #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) { + + if (maxm > (double) maxfab) { maxfab = (float) maxm; } @@ -5122,10 +5623,12 @@ static void mean_fab(int xstart, int ystart, int bfw, int bfh, LabImage* bufexpo const float stddv = std::sqrt(som / nbfab); float fabprov = meanfab + multsigma * stddv * multchrom;//with 3 sigma about 99% cases - if(fabprov > maxfab) { + + if (fabprov > maxfab) { fabprov = maxfab; } - fab = max(fabprov, 0.90f* maxfab);//Find maxi between mean + 3 sigma and 90% max (90 arbitrary empirical value) + + 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; @@ -5148,19 +5651,24 @@ void calclocalGradientParams(const struct local_params& lp, struct grad_params& int h = bfh; float stops = 0.f; float angs = 0.f; + double varfeath = 0.25; //0.01f * lp.feath; if (indic == 0) { stops = -lp.strmaexp; angs = lp.angmaexp; + varfeath = 0.01f * lp.feath;//for all masks when present } else if (indic == 1) { stops = lp.strexp; angs = lp.angexp; + varfeath = 0.01f * lp.featherexp; } else if (indic == 2) { stops = lp.strSH; angs = lp.angSH; + varfeath = 0.01f * lp.featherSH; } else if (indic == 3) { stops = lp.strcol; angs = lp.angcol; + varfeath = 0.01f * lp.feathcol; } else if (indic == 4) { float redu = 1.f; @@ -5172,38 +5680,49 @@ void calclocalGradientParams(const struct local_params& lp, struct grad_params& stops = redu * lp.strcolab; angs = lp.angcol; + varfeath = 0.01f * lp.feathcol; } else if (indic == 5) { stops = lp.strcolab; angs = lp.angcol; + varfeath = 0.01f * lp.feathcol; } else if (indic == 6) { stops = lp.strcolh; angs = lp.angcol; + varfeath = 0.01f * lp.feathcol; } else if (indic == 7) { stops = lp.strvib; angs = lp.angvib; + varfeath = 0.01f * lp.feathervib; } 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; + varfeath = 0.01f * lp.feathervib; } else if (indic == 9) { stops = lp.strvibh; angs = lp.angvib; + varfeath = 0.01f * lp.feathervib; } else if (indic == 10) { stops = std::fabs(lp.strwav); angs = lp.angwav; + varfeath = 0.01f * lp.featherwav; } else if (indic == 11) { stops = lp.strlog; angs = lp.anglog; + varfeath = 0.01f * lp.featherlog; } else if (indic == 12) { stops = -lp.str_mas; angs = lp.ang_mas; + varfeath = 0.01f * lp.feather_mas; + } else if (indic == 15) { + stops = lp.strgradcie; + angs = lp.anggradcie; + varfeath = 0.01f * lp.feathercie; } @@ -5211,7 +5730,7 @@ void calclocalGradientParams(const struct local_params& lp, struct grad_params& 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; + // 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); @@ -5302,6 +5821,7 @@ void ImProcFunctions::blendstruc(int bfw, int bfh, LabImage* bufcolorig, float r #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; @@ -5323,6 +5843,7 @@ void ImProcFunctions::blendstruc(int bfw, int bfh, LabImage* bufcolorig, float r #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]; @@ -5337,6 +5858,7 @@ static void blendmask(const local_params& lp, int xstart, int ystart, int cx, in #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) #endif + for (int y = 0; y < bfh ; y++) { const int loy = y + ystart + cy; @@ -5345,13 +5867,19 @@ static void blendmask(const local_params& lp, int xstart, int ystart, int cx, in int zone; float localFactor = 1.f; - const float achm = lp.trans / 100.f; + float achm = lp.trans / 100.f; + if(lp.fullim == 3 ) {//disable transit + achm = 1.f; + } if (lp.shapmet == 0) { calcTransition(lox, loy, achm, lp, zone, localFactor); - } else /*if (lp.shapmet == 1)*/ { + } else { /*if (lp.shapmet == 1)*/ calcTransitionrect(lox, loy, achm, lp, zone, localFactor); } + if(lp.fullim == 3 ) {//disable scope + localFactor = 1.f; + } if (inv == 0) { if (zone > 0) { @@ -5434,6 +5962,7 @@ void ImProcFunctions::deltaEforMask(float **rdE, int bfw, int bfh, LabImage* buf #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); @@ -5442,6 +5971,7 @@ void ImProcFunctions::deltaEforMask(float **rdE, int bfw, int bfh, LabImage* buf 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) { @@ -5476,7 +6006,8 @@ static void showmask(int lumask, const local_params& lp, int xstart, int ystart, { float lum = fabs(lumask * 400.f); float colo = 0.f; - if(lumask < 0.f) { + + if (lumask < 0.f) { lum *= 1.4f; colo = 30000.f + 12.f * lum; } @@ -5484,6 +6015,7 @@ static void showmask(int lumask, const local_params& lp, int xstart, int ystart, #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) #endif + for (int y = 0; y < bfh; y++) { const int loy = y + ystart + cy; @@ -5495,7 +6027,7 @@ static void showmask(int lumask, const local_params& lp, int xstart, int ystart, if (lp.shapmet == 0) { calcTransition(lox, loy, achm, lp, zone, localFactor); - } else /*if (lp.shapmet == 1)*/ { + } else { /*if (lp.shapmet == 1)*/ calcTransitionrect(lox, loy, achm, lp, zone, localFactor); } @@ -5523,33 +6055,32 @@ void ImProcFunctions::laplacian(const array2D &src, array2D &dst, const int H = bfh; const auto X = - [W](int x) -> int - { - return x < 0 ? x+2 : (x >= W ? x-2 : 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); - }; + [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); - }; + [&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) + # pragma omp parallel for if (multiThread) #endif + for (int y = 0; y < H; ++y) { - int n = Y(y-1), s = Y(y+1); + 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); + 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; } @@ -5561,7 +6092,7 @@ void ImProcFunctions::laplacian(const array2D &src, array2D &dst, void ImProcFunctions::discrete_laplacian_threshold(float * data_out, const float * data_in, size_t nx, size_t ny, float t) { - // BENCHFUN + // BENCHFUN if (!data_in || !data_out) { fprintf(stderr, "a pointer is NULL and should not be so\n"); @@ -5579,11 +6110,14 @@ void ImProcFunctions::discrete_laplacian_threshold(float * data_out, const float #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]; @@ -5648,7 +6182,7 @@ void ImProcFunctions::rex_poisson_dct(float * data, size_t nx, size_t ny, double * @author Nicolas Limare * some adaptations for Rawtherapee */ - // BENCHFUN + // BENCHFUN /* * get the cosinus tables @@ -5673,11 +6207,13 @@ void ImProcFunctions::rex_poisson_dct(float * data, size_t nx, size_t ny, double #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; @@ -5686,7 +6222,7 @@ void ImProcFunctions::rex_poisson_dct(float * data, size_t nx, size_t ny, double } -void ImProcFunctions::mean_dt(const float* data, size_t size, double& mean_p, double& dt_p) +void ImProcFunctions::mean_dt(const float* data, int size, double& mean_p, double& dt_p, double nbstd) { double mean = 0.; @@ -5695,7 +6231,8 @@ void ImProcFunctions::mean_dt(const float* data, size_t size, double& mean_p, do #ifdef _OPENMP #pragma omp parallel for reduction(+:mean,dt) if(multiThread) #endif - for (size_t i = 0; i < size; i++) { + + for (int i = 0; i < size; i++) { mean += static_cast(data[i]); dt += static_cast(SQR(data[i])); } @@ -5704,10 +6241,10 @@ void ImProcFunctions::mean_dt(const float* data, size_t size, double& mean_p, do dt /= size; dt -= SQR(mean); mean_p = mean; - dt_p = std::sqrt(dt); + dt_p = nbstd * 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) +void ImProcFunctions::normalize_mean_dt(float * data, const float * ref, int size, float mod, float sigm, float mdef, float sdef, float mdef2, float sdef2, double nbstd) { /* * Copyright 2009-2011 IPOL Image Processing On Line http://www.ipol.im/ @@ -5728,18 +6265,18 @@ void ImProcFunctions::normalize_mean_dt(float * data, const float * ref, size_t double mean_ref, mean_data, dt_ref, dt_data; /* compute mean and variance of the two arrays */ - if(mdef!= 0.f && sdef != 0.f) { + if (mdef != 0.f && sdef != 0.f) { mean_ref = mdef; dt_ref = sdef; } else { - mean_dt(ref, size, mean_ref, dt_ref); + mean_dt(ref, size, mean_ref, dt_ref, nbstd); } - if(mdef2!= 0.f && sdef2 != 0.f) { - // printf("OK shortcut\n"); + + if (mdef2 != 0.f && sdef2 != 0.f) { mean_data = mdef2; dt_data = sdef2; } else { - mean_dt(data, size, mean_data, dt_data); + mean_dt(data, size, mean_data, dt_data, 1.0); } /* compute the normalization coefficients */ @@ -5754,7 +6291,8 @@ void ImProcFunctions::normalize_mean_dt(float * data, const float * ref, size_t #ifdef _OPENMP #pragma omp parallel for if(multiThread) #endif - for (size_t i = 0; i < size; i++) { + + for (int i = 0; i < size; i++) { data[i] = (modma * data[i] + sigmmmodmb) + onesmod * ref[i];//normalize mean and stdv and balance PDE } @@ -5773,18 +6311,21 @@ void ImProcFunctions::retinex_pde(const float * datain, float * dataout, int bfw * adapted for Rawtherapee by Jacques Desmis 6-2019 */ - // BENCHFUN - + // 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(); @@ -5792,6 +6333,7 @@ void ImProcFunctions::retinex_pde(const float * datain, float * dataout, int bfw } float *data_tmp = (float *) fftwf_malloc(sizeof(float) * bfw * bfh); + if (!data_tmp) { fprintf(stderr, "allocation error\n"); abort(); @@ -5801,6 +6343,7 @@ void ImProcFunctions::retinex_pde(const float * datain, float * dataout, int bfw 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(); @@ -5823,10 +6366,12 @@ void ImProcFunctions::retinex_pde(const float * datain, float * dataout, int bfw 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); @@ -5844,13 +6389,17 @@ void ImProcFunctions::retinex_pde(const float * datain, float * dataout, int bfw #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]); } @@ -5859,6 +6408,7 @@ void ImProcFunctions::retinex_pde(const float * datain, float * dataout, int bfw 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++) { @@ -5885,7 +6435,7 @@ void ImProcFunctions::retinex_pde(const float * datain, float * dataout, int bfw 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); + normalize_mean_dt(data_tmp, datain, bfw * bfh, 1.f, 1.f, 0.f, 0.f, 0.f, 0.f, 1.); } if (show == 0 || show == 4) { @@ -5893,6 +6443,7 @@ void ImProcFunctions::retinex_pde(const float * datain, float * dataout, int bfw #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]); @@ -5907,15 +6458,19 @@ void ImProcFunctions::retinex_pde(const float * datain, float * dataout, int bfw } fftwf_free(data_tmp); + if (datashow) { fftwf_free(datashow); } + fftwf_cleanup(); #ifdef RT_FFTW3F_OMP + if (multiThread) { fftwf_cleanup_threads(); } + #endif } @@ -5945,14 +6500,16 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int 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); + // printf("Fab=%f corfab=%f maxfab=%f\n", (double) fab, (double) corfab, (double) maxfab); float chromult = 1.f; - if(chrom > 0.f){ + + if (chrom > 0.f) { chromult = 1.f + 0.003f * chrom; } else { chromult = 1.f + 0.01f * chrom; } - // chromult * corfab * kmaskC + + // chromult * corfab * kmaskC float kinv = 1.f; float kneg = 1.f; @@ -5965,6 +6522,7 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int #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]; @@ -6021,7 +6579,7 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int if (rm > 0) { float **mb = blendblur; #ifdef _OPENMP - #pragma omp parallel if (multiThread) + #pragma omp parallel if (multiThread) #endif { gaussianBlur(mb, mb, bfw, bfh, rm); @@ -6031,7 +6589,7 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int if (blu_ma >= 0.25f) { if (!fftt) { // || (lp.fftColorMask && call != 2)) { #ifdef _OPENMP - #pragma omp parallel if (multiThread) + #pragma omp parallel if (multiThread) #endif { gaussianBlur(bufcolorig->L, blur, bfw, bfh, blu_ma / sk); @@ -6066,16 +6624,19 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int tmpab.clear(true); #ifdef _OPENMP - #pragma omp parallel for if (multiThread) + #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) { + + if (noisevarab_r > 0.f) { int wavelet_leve = 6; int minwin1 = rtengine::min(bfw, bfh); @@ -6094,11 +6655,11 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int #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); + 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]; + noisevarchrom = new float[bfw * bfh]; float nvch = 0.6f;//high value float nvcl = 0.1f;//low value float seuil = 4000.f;//low @@ -6107,10 +6668,11 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int float ac = (nvch - nvcl) / (seuil - seuil2); float bc = nvch - seuil * ac; int bfw2 = (bfw + 1) / 2; - + #ifdef _OPENMP - #pragma omp parallel for if (multiThread) + #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])); @@ -6123,13 +6685,15 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int 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); @@ -6140,34 +6704,37 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int } } } - - 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); + 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) + #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]; @@ -6175,12 +6742,13 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int 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); + // printf("Fab den=%f \n", (double) fab1); fab = fab1;//fab denoise - + } + // end code denoise mask chroma @@ -6197,6 +6765,7 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int #ifdef _OPENMP #pragma omp for schedule(dynamic, 16) #endif + for (int ir = 0; ir < bfh; ir++) { #ifdef __SSE2__ @@ -6204,12 +6773,12 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int 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(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(bufcolorig->b[ir][i], bufcolorig->a[ir][i]); atan2Buffer[i] = xatan2f(tmpab.b[ir][i], tmpab.a[ir][i]); } } @@ -6239,13 +6808,13 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int } if (locllmasCurve && llmasutili) { - // printf("s"); + // 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(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)]); } @@ -6253,7 +6822,7 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int #ifdef __SSE2__ const float huema = atan2Buffer[jr]; #else - // const float huema = xatan2f(bufcolorig->b[ir][jr], bufcolorig->a[ir][jr]); + // 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); @@ -6290,27 +6859,31 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int } } } - + if (lap > 0.f && pde) { array2D mask; mask(bfw, bfh); - float amount = LIM01(float(lap)/100.f); + 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 @@ -6319,6 +6892,7 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int } std::unique_ptr bufprov; + if (delt) { bufprov.reset(new LabImage(bfw, bfh)); bufprov->CopyFrom(bufmaskblurcol, multiThread); @@ -6346,6 +6920,7 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int #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]); @@ -6360,6 +6935,7 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int #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]); @@ -6371,6 +6947,7 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int #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]]; @@ -6416,9 +6993,11 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int #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]; @@ -6428,6 +7007,7 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int 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; @@ -6440,13 +7020,13 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int 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 @@ -6457,12 +7037,13 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int 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) + #pragma omp parallel for if (multiThread) #endif + for (int i = 0; i < W_L * H_L; i++) { - if(loclmasCurvecolwav && lmasutilicolwav) { + if (loclmasCurvecolwav && lmasutilicolwav) { float absciss; float &val = wav_L[dir][i]; @@ -6478,6 +7059,7 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int } float klev = 1.f; + if (level >= level_hl && level <= level_hr) { klev = 1.f; } @@ -6493,7 +7075,7 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int klev = ahigh * level + bhigh; } } - + float kc = klev * (loclmasCurvecolwav[absciss * 500.f] - 0.5f); float amplieffect = kc <= 0.f ? 1.f : 4.f; @@ -6501,14 +7083,14 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int kinterm = kinterm <= 0.f ? 0.01f : kinterm; val *= kinterm; - + } } } - + } } - + wdspot->reconstruct(bufmaskblurcol->L[0], 1.f); delete wdspot; @@ -6518,6 +7100,7 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int #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]); @@ -6575,6 +7158,7 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int #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]; @@ -6587,38 +7171,40 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int struct grad_params gp; - if ((indic == 0 && lp.strmaexp != 0.f) || (indic ==12 && lp.str_mas != 0.f)) { + 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); - } + /* + if (lap > 0.f) { + const float *datain = bufmaskblurcol->L[0]; + const std::unique_ptr data_tmp(new float[bfh * bfw]); -#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]; + 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; @@ -6692,6 +7278,7 @@ void ImProcFunctions::InverseSharp_Local(float **loctemp, const float hueref, co #ifdef _OPENMP #pragma omp for schedule(dynamic,16) #endif + for (int y = 0; y < transformed->H; y++) { int loy = cy + y; @@ -6702,7 +7289,7 @@ void ImProcFunctions::InverseSharp_Local(float **loctemp, const float hueref, co if (lp.shapmet == 0) { calcTransition(lox, loy, ach, lp, zone, localFactor); - } else /*if (lp.shapmet == 1)*/ { + } else { /*if (lp.shapmet == 1)*/ calcTransitionrect(lox, loy, ach, lp, zone, localFactor); } @@ -6765,6 +7352,7 @@ void ImProcFunctions::InverseSharp_Local(float **loctemp, const float hueref, co transformed->b[y][x] = 0.f; } } + break; } @@ -6833,6 +7421,7 @@ void ImProcFunctions::Sharp_Local(int call, float **loctemp, int senstype, const #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 @@ -6848,7 +7437,7 @@ void ImProcFunctions::Sharp_Local(int call, float **loctemp, int senstype, const if (lp.shapmet == 0) { calcTransition(lox, loy, ach, lp, zone, localFactor); - } else /*if (lp.shapmet == 1)*/ { + } else { /*if (lp.shapmet == 1)*/ calcTransitionrect(lox, loy, ach, lp, zone, localFactor); } @@ -6902,7 +7491,7 @@ void ImProcFunctions::Sharp_Local(int call, float **loctemp, int senstype, const 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 + // BENCHFUN { const float ach = lp.trans / 100.f; const float varsens = lp.sensexclu; @@ -6947,8 +7536,8 @@ void ImProcFunctions::Exclude_Local(float **deltaso, float hueref, float chromar #pragma omp barrier #pragma omp for schedule(dynamic,16) #endif - for (int y = 0; y < transformed->H; y++) - { + + 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 @@ -6977,7 +7566,7 @@ void ImProcFunctions::Exclude_Local(float **deltaso, float hueref, float chromar if (lp.shapmet == 0) { calcTransition(lox, loy, ach, lp, zone, localFactor); - } else /*if (lp.shapmet == 1)*/ { + } else { /*if (lp.shapmet == 1)*/ calcTransitionrect(lox, loy, ach, lp, zone, localFactor); } @@ -7038,13 +7627,13 @@ void ImProcFunctions::Exclude_Local(float **deltaso, float hueref, float chromar } - - + + 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 + //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); @@ -7072,17 +7661,19 @@ void ImProcFunctions::transit_shapedetect_retinex(int call, int senstype, LabIma 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; -*/ + /* + 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)); @@ -7117,8 +7708,8 @@ void ImProcFunctions::transit_shapedetect_retinex(int call, int senstype, LabIma #ifdef _OPENMP #pragma omp for schedule(dynamic,16) #endif - for (int y = ystart; y < yend; y++) - { + + for (int y = ystart; y < yend; y++) { const int loy = cy + y; for (int x = xstart; x < xend; x++) { @@ -7128,7 +7719,7 @@ void ImProcFunctions::transit_shapedetect_retinex(int call, int senstype, LabIma if (lp.shapmet == 0) { calcTransition(lox, loy, ach, lp, zone, localFactor); - } else /*if (lp.shapmet == 1)*/ { + } else { /*if (lp.shapmet == 1)*/ calcTransitionrect(lox, loy, ach, lp, zone, localFactor); } @@ -7172,8 +7763,8 @@ void ImProcFunctions::transit_shapedetect_retinex(int call, int senstype, LabIma 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]; + // clc = previewreti ? settings->previewselection * 100.f : bufchro[y][x]; + clc = previewreti ? reducdE * 10000.f * lp.colorde : bufchro[y][x]; } @@ -7260,8 +7851,7 @@ void ImProcFunctions::transit_shapedetect_retinex(int call, int senstype, LabIma } } - if (showmas || retishow || previewreti) - { + if (showmas || retishow || previewreti) { return; } @@ -7272,7 +7862,7 @@ void ImProcFunctions::transit_shapedetect_retinex(int call, int senstype, LabIma 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 + // 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); @@ -7284,14 +7874,11 @@ void ImProcFunctions::transit_shapedetect(int senstype, const LabImage * bufexpo const float ach = lp.trans / 100.f; float varsens = lp.sensex; - if (senstype == 6 || senstype == 7) //cbdl - { + if (senstype == 6 || senstype == 7) { //cbdl varsens = lp.senscb; - } else if (senstype == 8) //TM - { + } else if (senstype == 8) { //TM varsens = lp.senstm; - } else if (senstype == 10) //local contrast - { + } else if (senstype == 10) { //local contrast varsens = lp.senslc; } @@ -7326,8 +7913,7 @@ void ImProcFunctions::transit_shapedetect(int senstype, const LabImage * bufexpo const bool usemasktm = (lp.showmasktmmet == 2 || lp.enatmMask || lp.showmasktmmet == 4) && senstype == 8; const bool usemaskall = (usemaskcb || usemasktm); - if (usemaskall) - { + if (usemaskall) { origblurmask.reset(new LabImage(bfw, bfh)); #ifdef _OPENMP @@ -7339,24 +7925,26 @@ void ImProcFunctions::transit_shapedetect(int senstype, const LabImage * bufexpo 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! - { + + 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); + normalize_mean_dt(data, datain, bfh * bfw, 1.f, 1.f, 0.f, 0.f, 0.f, 0.f, 1.); #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]; @@ -7373,8 +7961,8 @@ void ImProcFunctions::transit_shapedetect(int senstype, const LabImage * bufexpo #ifdef _OPENMP #pragma omp for schedule(dynamic,16) #endif - for (int y = 0; y < bfh; y++) - { + + 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]; @@ -7405,8 +7993,8 @@ void ImProcFunctions::transit_shapedetect(int senstype, const LabImage * bufexpo #ifdef _OPENMP #pragma omp for schedule(dynamic,16) #endif - for (int y = ystart; y < yend; y++) - { + + for (int y = ystart; y < yend; y++) { const int loy = cy + y; #ifdef __SSE2__ @@ -7435,7 +8023,7 @@ void ImProcFunctions::transit_shapedetect(int senstype, const LabImage * bufexpo if (lp.shapmet == 0) { calcTransition(lox, loy, ach, lp, zone, localFactor); - } else /*if (lp.shapmet == 1)*/ { + } else { /*if (lp.shapmet == 1)*/ calcTransitionrect(lox, loy, ach, lp, zone, localFactor); } @@ -7523,7 +8111,7 @@ void ImProcFunctions::transit_shapedetect(int senstype, const LabImage * bufexpo 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) { + } else if (/* previewcb ||*/ previewtm || lp.prevdE) { if (std::fabs(difb) < 500.f) { difb += difL; } @@ -7564,6 +8152,7 @@ void ImProcFunctions::InverseColorLight_Local(bool tonequ, bool tonecurv, int sp #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]; @@ -7580,19 +8169,24 @@ void ImProcFunctions::InverseColorLight_Local(bool tonequ, bool tonecurv, int sp 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 + int locprim = 0; + float rdx, rdy, grx, gry, blx, bly = 0.f; + float meanx, meany, meanxe, meanye = 0.f; + workingtrc(0, tmpImage.get(), tmpImage.get(), GW, GH, -5, prof, 2.4, 12.92310, 0, ill, 0, 0, rdx, rdy, grx, gry, blx, bly , meanx, meany, meanxe, meanye, dummy, true, false, 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(0, tmpImage.get(), tmpImage.get(), GW, GH, 1, prof, gamtone, slotone, 0, ill, 0, locprim, rdx, rdy, grx, gry, blx, bly , meanx, meany, meanxe, meanye, dummy, false, true, true, false);//be careful no gamut control } if (tonequ) { tone_eq(this, tmpImage.get(), lp, params->icm.workingProfile, sk, multiThread); + // tone_eq(tmpImage.get(), lp, params->icm.workingProfile, sk, multiThread); } rgb2lab(*tmpImage, *temp, params->icm.workingProfile); @@ -7605,6 +8199,7 @@ void ImProcFunctions::InverseColorLight_Local(bool tonequ, bool tonecurv, int sp #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 @@ -7633,6 +8228,7 @@ void ImProcFunctions::InverseColorLight_Local(bool tonequ, bool tonecurv, int sp #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; @@ -7647,6 +8243,7 @@ void ImProcFunctions::InverseColorLight_Local(bool tonequ, bool tonecurv, int sp #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" @@ -7665,6 +8262,7 @@ void ImProcFunctions::InverseColorLight_Local(bool tonequ, bool tonecurv, int sp #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]]; @@ -7731,6 +8329,7 @@ void ImProcFunctions::InverseColorLight_Local(bool tonequ, bool tonecurv, int sp #ifdef _OPENMP #pragma omp for schedule(dynamic,16) #endif + for (int y = 0; y < transformed->H; y++) { const int loy = cy + y; @@ -7750,12 +8349,13 @@ void ImProcFunctions::InverseColorLight_Local(bool tonequ, bool tonecurv, int sp if (lp.shapmet == 0) { calcTransition(lox, loy, ach, lp, zone, localFactor); - } else /*if (lp.shapmet == 1)*/ { + } 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)); @@ -7911,7 +8511,7 @@ void ImProcFunctions::calc_ref(int sp, LabImage * original, LabImage * transform int nsb = 0; // single precision for the result float avA, avB, avL; - int spotSize = 0.88623f * rtengine::max(1, lp.cir / sk); //18 + int spotSize = 0.88623f * rtengine::max(1.f, lp.cir / sk); //18 //O.88623 = std::sqrt(PI / 4) ==> square equal to circle int spotSise2; // = 0.88623f * max (1, lp.cir / sk); //18 @@ -7922,7 +8522,7 @@ void ImProcFunctions::calc_ref(int sp, LabImage * original, LabImage * transform LabImage *origblur = nullptr; LabImage *blurorig = nullptr; - int spotSi = 1 + 2 * rtengine::max(1, lp.cir / sk); + int spotSi = 1 + 2 * rtengine::max(1.f, lp.cir / sk); if (spotSi < 5) { spotSi = 5; @@ -7941,7 +8541,7 @@ void ImProcFunctions::calc_ref(int sp, LabImage * original, LabImage * transform isdenoise = true; } - if (isdenoise) { + if (isdenoise) { origblur = new LabImage(spotSi, spotSi); blurorig = new LabImage(spotSi, spotSi); @@ -8105,11 +8705,12 @@ void optfft(int N_fftwsize, int &bfh, int &bfw, int &bfhr, int &bfwr, struct loc int ftsizeW = 1; int deltaw = 150; int deltah = 150; - - if(W < 4000) { + + if (W < 4000) { deltaw = 80; } - if(H < 4000) { + + if (H < 4000) { deltah = 80; } @@ -8127,14 +8728,15 @@ void optfft(int N_fftwsize, int &bfh, int &bfw, int &bfhr, int &bfwr, struct loc 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) + + 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]; @@ -8144,7 +8746,7 @@ void optfft(int N_fftwsize, int &bfh, int &bfw, int &bfhr, int &bfwr, struct loc } if (settings->verbose) { - if(fulima == 2) { + if (fulima == 2) { printf("Full image: ftsizeWF=%i ftsizeH=%i\n", ftsizeW, ftsizeH); } else { @@ -8157,6 +8759,7 @@ void optfft(int N_fftwsize, int &bfh, int &bfw, int &bfhr, int &bfwr, struct loc bool reduW = false; bool reduH = false; bool exec = true; + if (ystart == 0 && yend < H) { lp.ly -= (bfh - ftsizeH); } else if (ystart != 0 && yend == H) { @@ -8168,7 +8771,7 @@ void optfft(int N_fftwsize, int &bfh, int &bfw, int &bfhr, int &bfwr, struct loc lp.ly -= (bfh - ftsizeH); } } else if (ystart == 0 && yend == H) { - // bfhr = ftsizeH; + // bfhr = ftsizeH; bfhr = bfh; reduH = true; exec = false; @@ -8185,11 +8788,12 @@ void optfft(int N_fftwsize, int &bfh, int &bfw, int &bfhr, int &bfwr, struct loc lp.lx -= (bfw - ftsizeW); } } else if (xstart == 0 && xend == W) { - // bfwr = ftsizeW; + // 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); @@ -8287,6 +8891,7 @@ void ImProcFunctions::BlurNoise_Local(LabImage *tmp1, LabImage * originalmask, c #ifdef _OPENMP #pragma omp for schedule(dynamic,16) #endif + for (int y = ystart; y < yend; y++) { const int loy = cy + y; @@ -8296,7 +8901,7 @@ void ImProcFunctions::BlurNoise_Local(LabImage *tmp1, LabImage * originalmask, c if (lp.shapmet == 0) { calcTransition(lox, loy, ach, lp, zone, localFactor); - } else /*if (lp.shapmet == 1)*/ { + } else { /*if (lp.shapmet == 1)*/ calcTransitionrect(lox, loy, ach, lp, zone, localFactor); } @@ -8365,14 +8970,6 @@ void ImProcFunctions::transit_shapedetect2(int sp, float meantm, float stdtm, in 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 @@ -8395,9 +8992,24 @@ void ImProcFunctions::transit_shapedetect2(int sp, float meantm, float stdtm, in varsens = lp.sensilog; } else if (senstype == 20) { //common mask varsens = lp.sensimas; - } else if (senstype == 31) { //ciecam + } else if (senstype == 31) { //ciecam varsens = lp.sensicie; - } + } + int bfhr = bfh; + int bfwr = bfw; + + if (lp.blurcolmask >= 0.25f && lp.fftColorMask && call == 2 && senstype == 0) { + optfft(N_fftwsize, bfh, bfw, bfhr, bfwr, lp, original->H, original->W, xstart, ystart, xend, yend, cx, cy, lp.fullim); + } + + if (lp.blurciemask >= 0.25f && lp.fftcieMask && call == 2 && senstype == 31) { + optfft(N_fftwsize, bfh, bfw, bfhr, bfwr, lp, original->H, original->W, xstart, ystart, xend, yend, cx, cy, lp.fullim); + } + + bfh = bfhr; + bfw = bfwr; + + bool delt = lp.deltaem; //sobel sobelref /= 100.f; @@ -8424,19 +9036,19 @@ void ImProcFunctions::transit_shapedetect2(int sp, float meantm, float stdtm, in 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 previewvib = ((lp.showmaskvibmet == 4) && senstype == 2 && lp.fullim != 3); + const bool previewexp = ((lp.showmaskexpmet == 5) && senstype == 1 && lp.fullim != 3); + const bool previewcol = ((lp.showmaskcolmet == 5) && senstype == 0 && lp.fullim != 3); + const bool previewSH = ((lp.showmaskSHmet == 4) && senstype == 9 && lp.fullim != 3); + const bool previewtm = ((lp.showmasktmmet == 4) && senstype == 8 && lp.fullim != 3); + const bool previewlc = ((lp.showmasklcmet == 4) && senstype == 10 && lp.fullim != 3); 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); + const bool previewmas = ((lp.showmask_met == 3) && senstype == 20 && lp.fullim != 3); + const bool previewlog = ((lp.showmasklogmet == 4) && senstype == 11 && lp.fullim != 3); + const bool previewcie = ((lp.showmaskciemet == 4) && senstype == 31 && lp.fullim != 3); float radius = 3.f / sk; @@ -8468,9 +9080,11 @@ void ImProcFunctions::transit_shapedetect2(int sp, float meantm, float stdtm, in float aadark = -1.f; float bbdark = darklim; bool usemask = true; - if(originalmask == nullptr) { + + 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; @@ -8481,6 +9095,7 @@ void ImProcFunctions::transit_shapedetect2(int sp, float meantm, float stdtm, in 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)); @@ -8504,29 +9119,32 @@ void ImProcFunctions::transit_shapedetect2(int sp, float meantm, float stdtm, in #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 + + 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, 1.); + } else if (call == 1) { //dcrop float ma = meantm; float sa = stdtm; - float ma2 = (float) params->locallab.spots.at(sp).noiselumc; + 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); + normalize_mean_dt(data, datain, bfw * bfh, 1.f, 1.f, ma, sa, ma2, sa2, 1.); } - - - - + + + + #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]; @@ -8541,14 +9159,14 @@ void ImProcFunctions::transit_shapedetect2(int sp, float meantm, float stdtm, in const float repart = 1.0f - 0.01f * lp.repartm; #ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) if(multiThread) + #pragma omp parallel for schedule(dynamic,16) if(multiThread) #endif - for (int y = ystart; y < yend; y++){ + 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]); + 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]); } } } @@ -8561,6 +9179,7 @@ void ImProcFunctions::transit_shapedetect2(int sp, float meantm, float stdtm, in #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]; @@ -8574,19 +9193,26 @@ void ImProcFunctions::transit_shapedetect2(int sp, float meantm, float stdtm, in 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) { + int limvarsens = 50;//begin change calculation reduction deltaE + if ((senstype == 11 || (senstype == 31 && lp.islogcie)) && (varsens < limvarsens)) { + //increase a bit lp.thr and lp.iterat and kL if HDR only with log encoding and CAM16 Jz lp.thr *= 1.2f; lp.iterat *= 1.2f; - kL *= 1.2f; + kL /= 1.2f; + } else if ((senstype == 11 || (senstype == 31 && lp.islogcie)) && (varsens >= limvarsens)) {//for log encoding and cam16 is log encode used + lp.thr += 10.f;//increase threshold deltaE + lp.thr = LIM(lp.thr, 0.f, 15.0f); + lp.balance -= 2.3f; + lp.balance = LIM(lp.balance, 0.05f, 2.5f); // down balance ab-L + kL = lp.balance / SQR(327.68f); } - + 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; @@ -8603,6 +9229,7 @@ void ImProcFunctions::transit_shapedetect2(int sp, float meantm, float stdtm, in #ifdef _OPENMP #pragma omp for schedule(dynamic,16) #endif + for (int y = 0; y < bfh; y++) { const int loy = y + ystart + cy; @@ -8626,14 +9253,20 @@ void ImProcFunctions::transit_shapedetect2(int sp, float meantm, float stdtm, in const int lox = x + xstart + cx; int zone; float localFactor = 1.f; - const float achm = lp.trans / 100.f; + float achm = lp.trans / 100.f; + if(lp.fullim == 3 ) {//disable transit + achm = 1.f; + } //calculate transition if (lp.shapmet == 0) { calcTransition(lox, loy, achm, lp, zone, localFactor); - } else /*if (lp.shapmet == 1)*/ { + } else { /*if (lp.shapmet == 1)*/ calcTransitionrect(lox, loy, achm, lp, zone, localFactor); } + if(lp.fullim == 3 ) {//disable scope + localFactor = 1.f; + } // float hueh = 0; #ifdef __SSE2__ @@ -8672,9 +9305,20 @@ void ImProcFunctions::transit_shapedetect2(int sp, float meantm, float stdtm, in const float dE = rsob + std::sqrt(kab * (kch * chrodelta2 + kH * huedelta2) + kL * SQR(refL - maskptr->L[y][x])); //reduction action with deltaE float reducdE = calcreducdE(dE, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, varsens); + if(lp.fullim == 3 ) {//disable scope + reducdE = 1.f; + } + if ((senstype == 11 || ( senstype == 31 && lp.islogcie)) && (varsens >= limvarsens)) { + int maxvarsens = 90;//arbitrary value to get maximum incidence + float ared = (1.f - reducdE) / (maxvarsens - limvarsens); + float bred = 1.f - ared * maxvarsens; + reducdE = ared * varsens + bred; + reducdE = LIM(reducdE, 0.1f, 1.f); + } if(varsens == 100.f) { reducdE = 1.f; } + 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]); @@ -8684,7 +9328,8 @@ void ImProcFunctions::transit_shapedetect2(int sp, float meantm, float stdtm, in 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) { + + if (lp.blwh) { cla = 0.f; clb = 0.f; } @@ -8699,7 +9344,7 @@ void ImProcFunctions::transit_shapedetect2(int sp, float meantm, float stdtm, in if (zone > 0) { //simplified transformed with deltaE and transition - transformed->L[y + ystart][x + xstart] = clipLoc(original->L[y + ystart][x + xstart] + factorx * realstrdE); + transformed->L[y + ystart][x + xstart] = clipLoc(original->L[y + ystart][x + xstart] + factorx * realstrdE);//clipLoc now do nothing...just keep in ace off float diflc = factorx * realstrdE; transformed->a[y + ystart][x + xstart] = clipC(original->a[y + ystart][x + xstart] + factorx * realstradE); const float difa = factorx * realstradE; @@ -8796,17 +9441,20 @@ void ImProcFunctions::exposure_pde(float * dataor, float * datain, float * datao 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); + normalize_mean_dt(data, dataor, bfw * bfh, mod, 1.f, 0.f, 0.f, 0.f, 0.f, 1.); { #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]); @@ -8844,6 +9492,7 @@ void ImProcFunctions::fftw_convol_blur(float * input, float * output, int bfw, i fftwf_init_threads(); fftwf_plan_with_nthreads(omp_get_max_threads()); } + #endif @@ -8892,6 +9541,7 @@ void ImProcFunctions::fftw_convol_blur(float * input, float * output, int bfw, i #ifdef _OPENMP #pragma omp parallel for if (multiThread) #endif + for (int j = 0; j < bfh; j++) { int index = j * bfw; @@ -8911,6 +9561,7 @@ void ImProcFunctions::fftw_convol_blur(float * input, float * output, int bfw, i #ifdef _OPENMP #pragma omp parallel for if (multiThread) #endif + for (int j = 0; j < bfh; j++) { int index = j * bfw; @@ -8929,6 +9580,7 @@ void ImProcFunctions::fftw_convol_blur(float * input, float * output, int bfw, i #ifdef _OPENMP #pragma omp parallel for if (multiThread) #endif + for (int j = 0; j < bfh; j++) { int index = j * bfw; @@ -8940,6 +9592,7 @@ void ImProcFunctions::fftw_convol_blur(float * input, float * output, int bfw, i #ifdef _OPENMP #pragma omp parallel for if (multiThread) #endif + for (int j = 0; j < bfh; j++) { int index = j * bfw; @@ -8956,6 +9609,7 @@ void ImProcFunctions::fftw_convol_blur(float * input, float * output, int bfw, i #ifdef _OPENMP #pragma omp parallel for if (multiThread) #endif + for (int index = 0; index < image_size; index++) { //restore data output[index] /= image_sizechange; } @@ -8964,9 +9618,11 @@ void ImProcFunctions::fftw_convol_blur(float * input, float * output, int bfw, i fftwf_free(out); #ifdef RT_FFTW3F_OMP + if (multiThread) { fftwf_cleanup_threads(); } + #endif } @@ -8991,6 +9647,7 @@ void ImProcFunctions::fftw_convol_blur2(float **input2, float **output2, int bfw #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]; @@ -9002,6 +9659,7 @@ void ImProcFunctions::fftw_convol_blur2(float **input2, float **output2, int bfw #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]; @@ -9086,6 +9744,7 @@ void ImProcFunctions::fftw_tile_blur(int GW, int GH, int tilssize, int max_numbl #ifdef _OPENMP #pragma omp for #endif + for (int vblk = 0; vblk < numblox_H; ++vblk) { int top = (vblk - 1) * offset; @@ -9198,6 +9857,7 @@ void ImProcFunctions::fftw_tile_blur(int GW, int GH, int tilssize, int max_numbl #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]; @@ -9238,6 +9898,7 @@ void ImProcFunctions::wavcbd(wavelet_decomposition &wdspot, int level_bl, int ma #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); @@ -9377,9 +10038,11 @@ void ImProcFunctions::Compresslevels(float **Source, int W_L, int H_L, float com #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]); @@ -9393,7 +10056,9 @@ void ImProcFunctions::Compresslevels(float **Source, int W_L, int H_L, float com const vfloat resultv = multv * xexpf(xlogf(valv + madLv) * exponev); STVFU(Source[y][x], resultv); } + #endif + for (; x < W_L; x++) { float expone = 1.f; @@ -9421,78 +10086,82 @@ void ImProcFunctions::Compresslevels(float **Source, int W_L, int H_L, float com 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; + float mean[10]; + float meanN[10]; + float sigma[10]; + float sigmaN[10]; + float MaxP[10]; + float MaxN[10]; - if (level >= level_hl && level <= level_hr) { - klev = 1.f; + 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_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; } + } - if (level_hr != level_br) { - if (level > level_hr && level <= level_br) { - klev = ahigh * level + bhigh; - } - } - float* const* wav_L = wdspot.level_coeffs(level); + 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]; + 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) + #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; - } + for (int i = 0; i < W_L * H_L; i++) { + const float val = std::fabs(wav_L[dir][i]); - const float kc = klev * (locwavCurve[absciss * 500.f] - 0.5f); - const float reduceeffect = kc <= 0.f ? 1.f : strength; + float absciss; - float kinterm = 1.f + reduceeffect * kc; - kinterm = kinterm <= 0.f ? 0.01f : kinterm; - - wav_L[dir][i] *= kinterm <= 0.f ? 0.01f : kinterm; + 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, @@ -9519,6 +10188,7 @@ void ImProcFunctions::wavcont(const struct local_params& lp, float ** tmp, wavel 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]; @@ -9532,9 +10202,11 @@ void ImProcFunctions::wavcont(const struct local_params& lp, float ** tmp, wavel 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 @@ -9551,15 +10223,19 @@ void ImProcFunctions::wavcont(const struct local_params& lp, float ** tmp, wavel #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]); } @@ -9610,16 +10286,20 @@ void ImProcFunctions::wavcont(const struct local_params& lp, float ** tmp, wavel #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 @@ -9635,6 +10315,7 @@ void ImProcFunctions::wavcont(const struct local_params& lp, float ** tmp, wavel #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 @@ -9655,6 +10336,7 @@ void ImProcFunctions::wavcont(const struct local_params& lp, float ** tmp, wavel #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; @@ -9663,11 +10345,13 @@ void ImProcFunctions::wavcont(const struct local_params& lp, float ** tmp, wavel } 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); @@ -9682,15 +10366,19 @@ void ImProcFunctions::wavcont(const struct local_params& lp, float ** tmp, wavel #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]); } @@ -9733,11 +10421,13 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float #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]; @@ -9793,6 +10483,7 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float klev = ahighg * level + bhighg; } } + klev *= 0.8f; const float threshold = mean[level] + lp.sigmalc2 * sigma[level]; float lutFactor; @@ -9808,6 +10499,7 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float 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]) { @@ -9835,6 +10527,7 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float if (radblur > 0.f && blurena) { float* src[H_Level]; + for (int i = 0; i < H_Level; ++i) { src[i] = &wav_L0[i * W_Level]; } @@ -9860,6 +10553,7 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float 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; @@ -9873,6 +10567,7 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float #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; @@ -9903,7 +10598,7 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float } } - ImProcFunctions::shadowsHighlights(temp.get(), true, 1, lp.residhi, lp.residsha , 40, sk, lp.residhithr, lp.residshathr); + ImProcFunctions::shadowsHighlights(temp.get(), true, 1, lp.residhi, lp.residsha, 40, sk, lp.residhithr, lp.residshathr); #ifdef _OPENMP #pragma omp parallel for if (multiThread) @@ -9922,6 +10617,7 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float #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]); } @@ -9938,6 +10634,7 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float #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; } @@ -10004,6 +10701,7 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float 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); @@ -10013,7 +10711,7 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float // 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; @@ -10024,6 +10722,7 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float #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 @@ -10035,12 +10734,13 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float 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; + 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]); @@ -10079,6 +10779,7 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float } float kampli; + if (alph > eddlipinfl) { kampli = alipinfl * alph + blipinfl; //If beta low reduce kampli kampli = SQR(bet) * kampli * aamp; @@ -10121,11 +10822,13 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float if (lp.edgwmet != 1) { float brepart; + if (lp.edgwmet == 0) { brepart = 3.f; - } else /*if (lp.edgwmet == 2)*/ { + } 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 @@ -10143,6 +10846,7 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float 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 @@ -10152,6 +10856,7 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float 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" @@ -10186,11 +10891,13 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float #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 { @@ -10198,11 +10905,12 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float } 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])*/ { + } else { /*if (std::fabs(wav_L[dir][k]) < mean[lvl])*/ absciss = amean * std::fabs(wav_L[dir][k]); } @@ -10226,6 +10934,7 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float 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) @@ -10257,41 +10966,52 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float 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; @@ -10301,18 +11021,21 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float //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; @@ -10321,20 +11044,26 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float if (isworking && (lp.residgam != 2.4f || lp.residslop != 12.92f)) { tonecur = true; } - - if(tonecur) { + + 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(); @@ -10345,6 +11074,7 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float #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]; @@ -10358,15 +11088,19 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float 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 + int ill = 0; + int locprim = 0; + float rdx, rdy, grx, gry, blx, bly = 0.f; + float meanx, meany, meanxe, meanye = 0.f; + workingtrc(0, tmpImage, tmpImage, W_Level, H_Level, -5, prof, 2.4, 12.92310, 0, ill, 0, 0, rdx, rdy, grx, gry, blx, bly ,meanx, meany, meanxe, meanye, dummy, true, false, false, false); + workingtrc(0, tmpImage, tmpImage, W_Level, H_Level, 1, prof, lp.residgam, lp.residslop, 0, ill, 0, locprim, rdx, rdy, grx, gry, blx, bly , meanx, meany, meanxe, meanye, dummy, false, true, true, false);//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]; @@ -10384,7 +11118,7 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float 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 + // BENCHFUN fftwf_plan plan_forward_blox[2]; fftwf_plan plan_backward_blox[2]; @@ -10462,6 +11196,7 @@ void ImProcFunctions::fftw_denoise(int sk, int GW, int GH, int max_numblox_W, in #ifdef _OPENMP #pragma omp for #endif + for (int vblk = 0; vblk < numblox_H; ++vblk) { int top = (vblk - 1) * offset; @@ -10560,27 +11295,31 @@ void ImProcFunctions::fftw_denoise(int sk, int GW, int GH, int max_numblox_W, in }//end of vertical block loop } - //Threshold DCT from Alberto Grigio, adapted to Rawtherapee + //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 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); + 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; @@ -10591,7 +11330,7 @@ void ImProcFunctions::fftw_denoise(int sk, int GW, int GH, int max_numblox_W, in float thr = log2lin(float(detail_thresh) / 200.f, 100.f); buildBlendMask(prov, mask, GW, GH, thr); #ifdef _OPENMP - #pragma omp parallel if (multiThread) + #pragma omp parallel if (multiThread) #endif { gaussianBlur(mask, mask, GW, GH, 20.0 / sk); @@ -10600,18 +11339,20 @@ void ImProcFunctions::fftw_denoise(int sk, int GW, int GH, int max_numblox_W, in 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]; @@ -10649,7 +11390,7 @@ void ImProcFunctions::fftw_denoise(int sk, int GW, int GH, int max_numblox_W, in 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 + // 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 @@ -10669,7 +11410,7 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct 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"); + //StopWatch Stop1("locallab Denoise called"); if (aut == 0) { MyMutex::MyLock lock(*fftwMutex); @@ -10702,21 +11443,24 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct 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 ; - } + int minwin = rtengine::min(GW, GH); + int maxlevelspot = 10;//maximum possible + bool isnois = true; - 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; - } + // 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)) { @@ -10749,18 +11493,22 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct 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) { + if (gamma > 1.f) { #ifdef _OPENMP -# pragma omp parallel for schedule(dynamic,16) if (multiThread) + # 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) { + + 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]); } } @@ -10782,6 +11530,7 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct #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); @@ -10842,6 +11591,7 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct #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]; @@ -10855,7 +11605,7 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct } } - if(lp.enablMask && lp.lnoiselow !=1.f && lp.smasktyp != 0) { + 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; @@ -10863,8 +11613,8 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct float low = lp.thrlow; float lowc; calcdif(low, lowc); - - if(higc < lowc) { + + if (higc < lowc) { higc = lowc + 0.01f; } @@ -10872,10 +11622,11 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct 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) + #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]; @@ -10888,22 +11639,23 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct } else { noisevarlum[(ir >> 1) * GW2 + (jr >> 1)] *= ahigh * lmr + bhigh; } - } + } } - if(HHhuecurve) { - //same code as in wavelet levels - + if (HHhuecurve) { + //same code as in wavelet levels + #ifdef _OPENMP - #pragma omp parallel for + #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)]; + noisevarlum[(ir >> 1)*GW2 + (jr >> 1)] *= noisevarhue[(ir >> 1) * GW2 + (jr >> 1)]; } } @@ -10911,7 +11663,7 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct 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){ + } else if (lp.quamet == 1) { WaveletDenoiseAll_BiShrinkL(Ldecomp, noisevarlum, madL, vari, edge, numThreads); @@ -11124,6 +11876,7 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct #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])); @@ -11143,7 +11896,7 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct 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){ + } 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); @@ -11161,6 +11914,7 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct #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]; @@ -11181,6 +11935,7 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct #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]; @@ -11204,6 +11959,7 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct #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]; @@ -11222,26 +11978,38 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct } if(gamma > 1.f) { #ifdef _OPENMP -# pragma omp parallel for schedule(dynamic,16) if (multiThread) + # 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]); } } } +//<<<<<<< HEAD +// if (lp.nlstr > 0) { +// NLMeans(tmp1.L, lp.nlstr, lp.nldet, lp.nlpat, lp.nlrad, lp.nlgam, GW, GH, float (sk), multiThread); +// } + +// if (lp.smasktyp != 0) { +// if (lp.enablMask && lp.recothrd != 1.f) { +//======= if(lp.smasktyp != 0) { if(lp.enablMask && lp.recothrd != 1.f) { LabImage tmp3(GW, GH); - for (int ir = 0; ir < GH; ir++){ + 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]; @@ -11261,23 +12029,26 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct float mid = 0.01f * lp.midthrd; float midch = 0.01f * lp.midthrdch; - if(higc < lowc) { + 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 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; @@ -11288,7 +12059,8 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct k = ahigh * lmr + bhigh; kch = ahigh * lmr + bhigh; } - if(lp.invmaskd) { + + if (lp.invmaskd) { masklum[ir][jr] = 1.f - pow_F(k, lp.decayd); masklumch[ir][jr] = 1.f - pow_F(kch, lp.decayd); } else { @@ -11302,16 +12074,19 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct 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) { + 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(); } @@ -11424,6 +12199,7 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct #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; @@ -11442,20 +12218,25 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct 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) { + + if (gamma > 1.f) { #ifdef _OPENMP -# pragma omp parallel for schedule(dynamic,16) if (multiThread) + # 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]); + + 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]); } } } @@ -11474,6 +12255,7 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct #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); @@ -11539,6 +12321,7 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct #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]; @@ -11551,56 +12334,59 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct 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; + 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) + #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; + + 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) { + if (HHhuecurve) { //same code as in wavelet levels #ifdef _OPENMP - #pragma omp parallel for + #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)]; + noisevarlum[(ir >> 1)* bfw2 + (jr >> 1)] *= noisevarhue[(ir >> 1) * bfw2 + (jr >> 1)]; } } @@ -11822,6 +12608,7 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct #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])); @@ -11840,7 +12627,7 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct 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){ + } 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); @@ -11858,6 +12645,7 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct #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]; @@ -11882,6 +12670,7 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct #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]; @@ -11903,6 +12692,7 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct #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]; @@ -11918,19 +12708,23 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct } } - if(gamma > 1.f) { + if (gamma > 1.f) { #ifdef _OPENMP -# pragma omp parallel for schedule(dynamic,16) if (multiThread) + # 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]); @@ -11938,17 +12732,18 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct } } - if(lp.nlstr > 0) { + 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) { + if (lp.enablMask && lp.recothrd != 1.f) { LabImage tmp3(bfw, bfh); #ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) if (multiThread) + #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; @@ -11958,7 +12753,7 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct 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]; - } + } } } @@ -11967,7 +12762,8 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct array2D masklumch; masklum(bfw, bfh); masklumch(bfw, bfh); - for (int ir = 0; ir < bfh; ir++){ + + for (int ir = 0; ir < bfh; ir++) { for (int jr = 0; jr < bfw; jr++) { masklum[ir][jr] = 1.f; masklumch[ir][jr] = 1.f; @@ -11983,54 +12779,61 @@ void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct float mid = 0.01f * lp.midthrd; float midch = 0.01f * lp.midthrdch; - if(higc < lowc) { + 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 alow = th / lowc; float blow = 1.f - th; #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, lox = cx + x; x < xend; x++, lox++) { - const float lM = bufmaskblurbl->L[y][x]; + 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; + 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; + 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; + 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); + + 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); + 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) + #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]; @@ -12111,6 +12914,7 @@ void ImProcFunctions::clarimerge(const struct local_params& lp, float &mL, float #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); @@ -12151,6 +12955,7 @@ void ImProcFunctions::clarimerge(const struct local_params& lp, float &mL, float #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); @@ -12187,6 +12992,7 @@ void ImProcFunctions::clarimerge(const struct local_params& lp, float &mL, float #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); @@ -12237,7 +13043,7 @@ void ImProcFunctions::avoidcolshi(const struct local_params& lp, int sp, LabImag 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")) { + if (params->locallab.spots.at(sp).expcie && (params->locallab.spots.at(sp).modecam == "jz" || params->locallab.spots.at(sp).modecam == "cam16")) { execmunsell = false; } @@ -12410,12 +13216,13 @@ void ImProcFunctions::avoidcolshi(const struct local_params& lp, int sp, LabImag 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); + if (avoidgamut == 3) {//-0.3f arbitrary coeff, 04-2024 change mistake where 0.5f => -0.3f + xg = rtengine::LIM(xg - 0.3f * (x0 - xg), 0.f, 65535.f); + yg = rtengine::LIM(yg - 0.3f * (y0 - yg), 0.f, 65535.f); + zg = rtengine::LIM(zg - 0.3f * (z0 - zg), 0.f, 65535.f); } + //Color::gamutmap(xg, yg, zg, wp);//Put XYZ in gamut wp float aag2, bbg2; Color::XYZ2Lab(xg, yg, zg, Lag, aag2, bbg2); @@ -12448,6 +13255,7 @@ void ImProcFunctions::avoidcolshi(const struct local_params& lp, int sp, LabImag 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); } @@ -12551,15 +13359,18 @@ void ImProcFunctions::avoidcolshi(const struct local_params& lp, int sp, LabImag 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 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; @@ -12570,22 +13381,25 @@ void maskrecov(const LabImage * bufcolfin, LabImage * original, LabImage * bufma float lowc; calcdif(low, lowc); - if(higc < 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 alow = th / lowc; float blow = 1.f - th; #ifdef _OPENMP - #pragma omp parallel for if (multiThread) + #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) { @@ -12593,8 +13407,10 @@ void maskrecov(const LabImage * bufcolfin, LabImage * original, LabImage * bufma } else { masklum[ir][jr] = ahigh * lmr + bhigh; } + float k = masklum[ir][jr]; - if(invmask == false) { + + if (invmask == false) { masklum[ir][jr] = 1 - pow(k, decay); } else { masklum[ir][jr] = pow(k, decay); @@ -12603,21 +13419,23 @@ void maskrecov(const LabImage * bufcolfin, LabImage * original, LabImage * bufma } } - for (int i = 0; i < 3; ++i) { - boxblur(static_cast(masklum), static_cast(masklum), 10 / sk, bfw, bfh, false); - } + 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) + #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]; - } + + 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(); + } + + masklum.free(); } //thanks to Alberto Griggio @@ -12627,33 +13445,33 @@ void ImProcFunctions::detail_mask(const array2D &src, array2D &mas const int H = bfh; mask(W, H); - array2D L2(W/4, H/4);//ARRAY2D_ALIGNED); - array2D m2(W/4, H/4);//ARRAY2D_ALIGNED) + 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) + # 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); + + 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); + + 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); - }; + [](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) + # pragma omp parallel for if (multithread) #endif for (int y = 0; y < H; ++y) { @@ -12663,9 +13481,9 @@ void ImProcFunctions::detail_mask(const array2D &src, array2D &mas } if (blur_type == BlurType::GAUSS) { - + #ifdef _OPENMP -# pragma omp parallel if (multithread) + # pragma omp parallel if (multithread) #endif { gaussianBlur(mask, mask, W, H, blur); @@ -12677,7 +13495,7 @@ void ImProcFunctions::detail_mask(const array2D &src, array2D &mas } } } - + } // basic idea taken from Algorithm 3 in the paper: @@ -12694,11 +13512,12 @@ void ImProcFunctions::NLMeans(float **img, int strength, int detail_thresh, int if (!strength) { return; } - // printf("Scale=%f\n", scale); - if(scale > 5.f) {//avoid to small values - leads to crash - but enough to evaluate noise + + // printf("Scale=%f\n", scale); + if (scale > 5.f) { //avoid to small values - leads to crash - but enough to evaluate noise return; } - BENCHFUN + // BENCHFUN const int W = bfw; const int H = bfh; // printf("W=%i H=%i\n", W, H); @@ -12711,19 +13530,24 @@ void ImProcFunctions::NLMeans(float **img, int strength, int detail_thresh, int //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) + # 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) { + + 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)) @@ -12751,44 +13575,49 @@ void ImProcFunctions::NLMeans(float **img, int strength, int detail_thresh, int // 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); + 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]; + 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) + # 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; + 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; + 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) + # 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; @@ -12796,27 +13625,29 @@ void ImProcFunctions::NLMeans(float **img, int strength, int detail_thresh, int } constexpr int lutsz = 8192; - constexpr float lutfactor = 100.f / float(lutsz-1); + 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) + # 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_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__ @@ -12826,147 +13657,162 @@ void ImProcFunctions::NLMeans(float **img, int strength, int detail_thresh, int #endif #ifdef _OPENMP - #pragma omp parallel if (multithread) + #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); + // 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) + #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; + for (int tile = 0; tile < ntiles; ++tile) { + const int tile_y = tile / ntiles_x; + const int tile_x = tile % ntiles_x; - 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 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 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 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 score = - [&](int tx, int ty, int zx, int zy) -> float - { + 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); + 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 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)); + St[0][xx] = St[0][xx - 1] + score(tx, ty, xx, 0); } - } - // 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; + + 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); - } + 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; + for (; xx < end_x - border; ++xx) { + int x = xx - border; + int sx = xx + tx; + int sy = yy + ty; - assert(!xisinff(dst[y][x])); - assert(!xisnanf(dst[y][x])); + 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])); + // 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); + _MM_SET_FLUSH_ZERO_MODE(oldMode); #endif } // omp parallel #ifdef _OPENMP -# pragma omp parallel for schedule(dynamic,16) if (multithread) + # 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]); } @@ -12975,8 +13821,9 @@ void ImProcFunctions::NLMeans(float **img, int strength, int detail_thresh, int for (int i = 0; i < hei; ++i) { delete[] dst[i]; } + delete[] dst; - + } void ImProcFunctions::Lab_Local( @@ -13005,7 +13852,7 @@ void ImProcFunctions::Lab_Local( 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& locccmasCurve, bool lcmasutili, const LocLLmaskCurve& locllmasCurve, bool llmasutili, const LocHHmaskCurve& lochhmasCurve, bool lhmasutili, const LocHHmaskCurve& llochhhmasCurve, bool lhhmasutili, const LocHHmaskCurve& llochhhmascieCurve, bool lhhmascieutili, 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, @@ -13021,6 +13868,7 @@ void ImProcFunctions::Lab_Local( const LocHHmaskCurve& lochhhmas_Curve, bool lhhmas_utili, const LocwavCurve& loclmasCurveblwav, bool lmasutiliblwav, const LocwavCurve& loclmasCurvecolwav, bool lmasutilicolwav, + const LocwavCurve& loclmasCurveciewav, bool lmasutiliciewav, const LocwavCurve& locwavCurve, bool locwavutili, const LocwavCurve& locwavCurvejz, bool locwavutilijz, const LocwavCurve& loclevwavCurve, bool loclevwavutili, @@ -13031,12 +13879,12 @@ void ImProcFunctions::Lab_Local( 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, + 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& meantm, float& stdtm, float& meanreti, float& stdreti, float &fab,float &maxicam, float &rdx, float &rdy, float &grx, float &gry, float &blx, float &bly, float &meanx, float &meany, float &meanxe, float &meanye, int &prim, int &ill, float &contsig, float &lightsig, float& highresi, float& nresi, float& highresi46, float& nresi46, float& Lhighresi, float& Lnresi, float& Lhighresi46, float& Lnresi46 ) @@ -13082,6 +13930,7 @@ void ImProcFunctions::Lab_Local( #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; @@ -13102,6 +13951,7 @@ void ImProcFunctions::Lab_Local( #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; @@ -13125,6 +13975,7 @@ void ImProcFunctions::Lab_Local( #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; @@ -13138,8 +13989,8 @@ void ImProcFunctions::Lab_Local( } //encoding lab at the beginning - if (lp.logena && (call <=3 || lp.prevdE || lp.showmasklogmet == 2 || lp.enaLMask || lp.showmasklogmet == 3 || lp.showmasklogmet == 4)) { - + 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); @@ -13164,6 +14015,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -13203,6 +14055,7 @@ void ImProcFunctions::Lab_Local( if (lp.showmasklogmet == 0) { zero = true; } + float chrom = lp.chromaL; float rad = lp.radmaL; float blendm = lp.blendmaL; @@ -13237,6 +14090,7 @@ void ImProcFunctions::Lab_Local( return; } + if (lp.showmasklogmet == 0 || lp.showmasklogmet == 1 || lp.showmasklogmet == 2 || lp.showmasklogmet == 4 || lp.enaLMask) { bufexpfin->CopyFrom(bufexporig.get(), multiThread); @@ -13246,35 +14100,40 @@ void ImProcFunctions::Lab_Local( #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); - } + + 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)); - } + + 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); + 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, maxicam, contsig, lightsig); } @@ -13282,11 +14141,12 @@ void ImProcFunctions::Lab_Local( 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, 10, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz, maxicam, contsig, lightsig); } - 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); + 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, maxicam, contsig, lightsig); float rad = params->locallab.spots.at(sp).detailcie; loccont(bfw, bfh, bufexpfin.get(), rad, 15.f, sk); @@ -13298,37 +14158,40 @@ void ImProcFunctions::Lab_Local( struct grad_params gplog; calclocalGradientParams(lp, gplog, ystart, xstart, bfw, bfh, 11); #ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) if(multiThread) + #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; + //end graduated - if(lp.recothrl < 1.f) { - recoth = -1.f * recoth + 2.f; - } + float recoth = lp.recothrl; - 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.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; @@ -13364,12 +14227,13 @@ void ImProcFunctions::Lab_Local( 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)); + 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]; @@ -13487,6 +14351,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -13537,12 +14402,15 @@ void ImProcFunctions::Lab_Local( #pragma omp parallel if (multiThread) #endif { - if (lp.chromet == 0) { + if (lp.chromet == 0) + { gaussianBlur(tmp1->L, tmp1->L, bfw, bfh, radius); - } else if (lp.chromet == 1) { + } 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) { + } 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); @@ -13567,12 +14435,15 @@ void ImProcFunctions::Lab_Local( #pragma omp parallel if (multiThread) #endif { - if (lp.chromet == 0) { + if (lp.chromet == 0) + { gaussianBlur(original->L, tmp1->L, TW, TH, radius); - } else if (lp.chromet == 1) { + } 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) { + } 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); @@ -13701,6 +14572,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -13720,11 +14592,12 @@ void ImProcFunctions::Lab_Local( 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]; @@ -13736,6 +14609,7 @@ void ImProcFunctions::Lab_Local( } } + array2D iR(bfw, bfh, rr, 0); array2D iG(bfw, bfh, gg, 0); array2D iB(bfw, bfh, bb, 0); @@ -13759,11 +14633,12 @@ void ImProcFunctions::Lab_Local( #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]); + 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]; @@ -13777,16 +14652,19 @@ void ImProcFunctions::Lab_Local( #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]); + 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) { + + 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; @@ -13799,33 +14677,37 @@ void ImProcFunctions::Lab_Local( float lowc; calcdif(low, lowc); - if(higc < 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 alow = th / lowc; float blow = 1.f - th; - + #ifdef _OPENMP - #pragma omp parallel for if (multiThread) + #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) { + + if (lp.invmask == true) { float k = masklum[ir][jr]; - masklum[ir][jr] = 1 - k*k; + masklum[ir][jr] = 1 - k * k; } } @@ -13834,8 +14716,9 @@ void ImProcFunctions::Lab_Local( } #ifdef _OPENMP - #pragma omp parallel for if (multiThread) + #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]; @@ -13843,6 +14726,7 @@ void ImProcFunctions::Lab_Local( tmp1->b[i][j] = (tmp3->b[i][j] - tmp1->b[i][j]) * LIM01(masklum[i][j]) + tmp1->b[i][j]; } } + masklum.free(); } @@ -13855,6 +14739,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -13879,6 +14764,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -13914,11 +14800,12 @@ void ImProcFunctions::Lab_Local( #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]); + 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]; @@ -13932,16 +14819,19 @@ void ImProcFunctions::Lab_Local( #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]); + 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) { + + 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; @@ -13954,27 +14844,30 @@ void ImProcFunctions::Lab_Local( float lowc; calcdif(low, lowc); - if(higc < 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 alow = th / lowc; float blow = 1.f - th; - + #ifdef _OPENMP - #pragma omp parallel for if (multiThread) + #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); } @@ -13985,8 +14878,9 @@ void ImProcFunctions::Lab_Local( } #ifdef _OPENMP - #pragma omp parallel for if (multiThread) + #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]; @@ -13994,6 +14888,7 @@ void ImProcFunctions::Lab_Local( tmp1->b[i][j] = (tmp3->b[i][j] - tmp1->b[i][j]) * LIM01(masklum[i][j]) + tmp1->b[i][j]; } } + masklum.free(); } @@ -14004,8 +14899,8 @@ void ImProcFunctions::Lab_Local( if (tmp1.get()) { if (lp.blurmet == 0) { //blur and noise (center) - - if(lp.smasktyp != 1) { + + 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); @@ -14017,8 +14912,8 @@ void ImProcFunctions::Lab_Local( 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, 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); @@ -14053,6 +14948,7 @@ void ImProcFunctions::Lab_Local( #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; @@ -14107,7 +15003,7 @@ void ImProcFunctions::Lab_Local( const int bfw = xend - xstart; if (bfw >= mDEN && bfh >= mDEN) { - // printf("OK TM\n"); + // printf("OK TM\n"); array2D buflight(bfw, bfh); JaggedArray bufchro(bfw, bfh); std::unique_ptr bufgb(new LabImage(bfw, bfh)); @@ -14129,31 +15025,35 @@ void ImProcFunctions::Lab_Local( #ifdef _OPENMP #pragma omp parallel if (multiThread) { - #pragma omp for schedule(dynamic,16) nowait + #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]; + + 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 + #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]; + + 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) + #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]; + + 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 @@ -14232,29 +15132,32 @@ void ImProcFunctions::Lab_Local( 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); + 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, maxicam, contsig, lightsig); + } + + 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, maxicam, contsig, lightsig); + + float rad = params->locallab.spots.at(sp).detailcie; + loccont(bfw, bfh, tmp1.get(), rad, 15.f, sk); } - 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) { + + 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) + #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]; @@ -14264,6 +15167,7 @@ void ImProcFunctions::Lab_Local( } } } + bool enatmMasktmap = params->locallab.spots.at(sp).enatmMaskaft; if (enatmMasktmap) { @@ -14307,6 +15211,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -14336,6 +15241,7 @@ void ImProcFunctions::Lab_Local( #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; @@ -14343,15 +15249,16 @@ void ImProcFunctions::Lab_Local( } } - if(lp.enatmMask && lp.recothrt != 1.f) { + if (lp.enatmMask && lp.recothrt != 1.f) { float recoth = lp.recothrt; - if(lp.recothrt < 1.f) { + if (lp.recothrt < 1.f) { recoth = -1.f * recoth + 2.f; } + float hig = lp.higthrt; float low = lp.lowthrt; - // float recoth = lp.recothrt; + // 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); @@ -14359,11 +15266,12 @@ void ImProcFunctions::Lab_Local( // 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) { + 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(); @@ -14380,7 +15288,7 @@ void ImProcFunctions::Lab_Local( //end TM - if ((lp.dehaze != 0 || lp.prevdE) && lp.retiena ) { + 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); @@ -14395,6 +15303,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -14414,7 +15323,7 @@ void ImProcFunctions::Lab_Local( dehazeParams.saturation = lp.dehazeSaturation; dehazeParams.depth = lp.depth; lab2rgb(*bufexpfin, *tmpImage.get(), params->icm.workingProfile); - dehazeloc(tmpImage.get(), dehazeParams); + dehazeloc(tmpImage.get(), dehazeParams, sk, sp); 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); @@ -14447,17 +15356,18 @@ void ImProcFunctions::Lab_Local( bufreti = new LabImage(TW, TH); bufmask = new LabImage(TW, TH); - bufmaskorigreti = 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); + // 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; @@ -14470,6 +15380,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -14479,21 +15390,22 @@ void ImProcFunctions::Lab_Local( 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]; - - + // 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 @@ -14513,10 +15425,15 @@ void ImProcFunctions::Lab_Local( #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); + float reducdE = calcreducdE(dE, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sensibefore); + if(lp.fullim == 3 ) {//disable scope + reducdE = 1.f; + } + reducDE[y][x] = clipDE(reducdE); } @@ -14529,6 +15446,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -14556,11 +15474,13 @@ void ImProcFunctions::Lab_Local( #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) { + + if (params->locallab.spots.at(sp).equilret && params->locallab.spots.at(sp).expreti) { + if (call == 3) { savenormreti->L[ir][jr] = tmpl->L[ir][jr]; } } @@ -14573,23 +15493,24 @@ void ImProcFunctions::Lab_Local( #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 + 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, 1.); + } else if (call == 1) { //dcrop float ma = meanreti; float sa = stdreti; - float ma2 = (float) params->locallab.spots.at(sp).sensihs; + 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); + normalize_mean_dt(data, datain, Hd * Wd, 1.f, 1.f, ma, sa, ma2, sa2, 1.); } } @@ -14597,6 +15518,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -14606,7 +15528,7 @@ void ImProcFunctions::Lab_Local( delete [] data; } - if(lp.enaretiMask && lp.recothrr != 1.f) { + if (lp.enaretiMask && lp.recothrr != 1.f) { float hig = lp.higthrr; float low = lp.lowthrr; float recoth = lp.recothrr; @@ -14620,6 +15542,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -14651,6 +15574,7 @@ void ImProcFunctions::Lab_Local( #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) { @@ -14664,6 +15588,7 @@ void ImProcFunctions::Lab_Local( #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]); @@ -14692,6 +15617,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -14715,6 +15641,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -14730,6 +15657,7 @@ void ImProcFunctions::Lab_Local( #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; @@ -14760,6 +15688,7 @@ void ImProcFunctions::Lab_Local( delete buforigmas; } } + delete bufreti; } } @@ -14810,6 +15739,7 @@ void ImProcFunctions::Lab_Local( #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; @@ -14823,6 +15753,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -14859,10 +15790,15 @@ void ImProcFunctions::Lab_Local( #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); + float reducdE = calcreducdE(dE, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sensibefore); + if(lp.fullim == 3 ) {//disable scope + reducdE = 1.f; + } + reducDE[y - ystart][x - xstart] = clipDE(reducdE); } } @@ -14879,6 +15815,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -14911,6 +15848,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -14923,6 +15861,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -14930,17 +15869,19 @@ void ImProcFunctions::Lab_Local( } } - normalize_mean_dt(data.get(), datain.get(), Hd * Wd, 1.f, 1.f, 0.f, 0.f, 0.f, 0.f); + normalize_mean_dt(data.get(), datain.get(), Hd * Wd, 1.f, 1.f, 0.f, 0.f, 0.f, 0.f, 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) { tmpl->L[ir][jr] = data[ir * Wd + jr]; } } } - if(lp.enaretiMask && lp.recothrr != 1.f) { + + if (lp.enaretiMask && lp.recothrr != 1.f) { float hig = lp.higthrr; float low = lp.lowthrr; float recoth = lp.recothrr; @@ -14955,6 +15896,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -14970,6 +15912,7 @@ void ImProcFunctions::Lab_Local( #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; @@ -14991,6 +15934,7 @@ void ImProcFunctions::Lab_Local( #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])); @@ -15003,6 +15947,7 @@ void ImProcFunctions::Lab_Local( #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]); @@ -15029,6 +15974,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -15050,6 +15996,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -15065,6 +16012,7 @@ void ImProcFunctions::Lab_Local( #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; @@ -15087,7 +16035,7 @@ void ImProcFunctions::Lab_Local( delete tmpl; delete bufmask; delete bufmaskorigreti; - + if (!lp.enaretiMasktmap && lp.enaretiMask) { if (buforig) { delete buforig; @@ -15097,6 +16045,7 @@ void ImProcFunctions::Lab_Local( delete buforigmas; } } + delete bufreti; } } @@ -15111,6 +16060,7 @@ void ImProcFunctions::Lab_Local( 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); @@ -15129,6 +16079,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -15213,6 +16164,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -15232,12 +16184,12 @@ void ImProcFunctions::Lab_Local( 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) { + + if (lp.enacbMask && lp.recothrcb != 1.f) { float hig = lp.higthrcb; float low = lp.lowthrcb; float recoth = lp.recothrcb; @@ -15245,7 +16197,7 @@ void ImProcFunctions::Lab_Local( 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); @@ -15258,6 +16210,7 @@ void ImProcFunctions::Lab_Local( #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])); @@ -15287,6 +16240,7 @@ void ImProcFunctions::Lab_Local( #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]))); @@ -15302,6 +16256,7 @@ void ImProcFunctions::Lab_Local( #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; @@ -15311,14 +16266,15 @@ void ImProcFunctions::Lab_Local( 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); } - + } } } @@ -15328,6 +16284,7 @@ void ImProcFunctions::Lab_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); @@ -15353,6 +16310,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -15431,6 +16389,7 @@ void ImProcFunctions::Lab_Local( #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++) { @@ -15440,13 +16399,13 @@ void ImProcFunctions::Lab_Local( } } */ - 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]; + 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; @@ -15459,14 +16418,14 @@ void ImProcFunctions::Lab_Local( 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]; - } - } + // 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"); @@ -15475,6 +16434,7 @@ void ImProcFunctions::Lab_Local( #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); @@ -15507,13 +16467,13 @@ void ImProcFunctions::Lab_Local( } 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); @@ -15523,12 +16483,13 @@ void ImProcFunctions::Lab_Local( 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); @@ -15536,23 +16497,29 @@ void ImProcFunctions::Lab_Local( 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) { + + if (gamma1 != 1.f) { #ifdef _OPENMP -# pragma omp parallel for schedule(dynamic,16) if (multiThread) + # pragma omp parallel for schedule(dynamic,16) if (multiThread) #endif + for (int y = 0; y < bfh; ++y) { - int x = 0; + 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) { + + 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]); } } @@ -15565,19 +16532,23 @@ void ImProcFunctions::Lab_Local( // 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 + // rtengine::Color::calcGamma(pwr, ts, g_a); // call to calcGamma with selected gamma and slope - if(gamma1 != 1.f) { + if (gamma1 != 1.f) { #ifdef _OPENMP -# pragma omp parallel for schedule(dynamic,16) if (multiThread) -#endif + # 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]); } @@ -15587,30 +16558,30 @@ void ImProcFunctions::Lab_Local( 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); + + 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, maxicam, contsig, lightsig); } - if(lp.enavibMask && lp.recothrv != 1.f) { + if (lp.enavibMask && lp.recothrv != 1.f) { float recoth = lp.recothrv; - if(lp.recothrv < 1.f) { + if (lp.recothrv < 1.f) { recoth = -1.f * recoth + 2.f; } float hig = lp.higthrv; float low = lp.lowthrv; - // float recoth = lp.recothrv; + // 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) { + 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); - + } } @@ -15629,7 +16600,7 @@ void ImProcFunctions::Lab_Local( //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) { + if (lp.mullocsh[0] != 0 || lp.mullocsh[1] != 0 || lp.mullocsh[2] != 0 || lp.mullocsh[3] != 0 || lp.mullocsh[4] != 0 || lp.mullocsh[5] != 0) { tonequ = true; } @@ -15667,6 +16638,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -15745,6 +16717,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -15768,6 +16741,7 @@ void ImProcFunctions::Lab_Local( #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); @@ -15786,10 +16760,12 @@ void ImProcFunctions::Lab_Local( 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 + int ill = 0; + int locprim = 0; + float rdx, rdy, grx, gry, blx, bly = 0.f; + float meanx, meany, meanxe, meanye = 0.f; + workingtrc(0, tmpImage, tmpImage, bfw, bfh, -5, prof, 2.4, 12.92310, 0, ill, 0, 0, rdx, rdy, grx, gry, blx, bly , meanx, meany, meanxe, meanye, dummy, true, false, false, false); + workingtrc(0, tmpImage, tmpImage, bfw, bfh, 1, prof, gamtone, slotone, 0, ill, 0, locprim, rdx, rdy, grx, gry, blx, bly , meanx, meany, meanxe, meanye, dummy, false, true, true, false);//be careful no gamut control } if (tonequ) { @@ -15802,16 +16778,16 @@ void ImProcFunctions::Lab_Local( } } - if(lp.enaSHMask && lp.recothrs != 1.f) { + if (lp.enaSHMask && lp.recothrs != 1.f) { float recoth = lp.recothrs; - if(lp.recothrs < 1.f) { + if (lp.recothrs < 1.f) { recoth = -1.f * recoth + 2.f; } float hig = lp.higthrs; float low = lp.lowthrs; - // float recoth = lp.recothrs; + // 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); @@ -15822,8 +16798,9 @@ void ImProcFunctions::Lab_Local( int bh = bufexporig->H; #ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) if(multiThread) + #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]); @@ -15832,11 +16809,12 @@ void ImProcFunctions::Lab_Local( } } - if(lp.recothrs >= 1.f) { + 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; @@ -15856,6 +16834,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -15952,6 +16931,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -15977,6 +16957,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -15989,6 +16970,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -16022,6 +17004,7 @@ void ImProcFunctions::Lab_Local( } } } + if (loclevwavCurve && loclevwavutili) { for (int i = 0; i < 500; i++) { if (loclevwavCurve[i] != 0.f) { @@ -16030,6 +17013,7 @@ void ImProcFunctions::Lab_Local( } } } + if (locconwavCurve && locconwavutili) { for (int i = 0; i < 500; i++) { if (locconwavCurve[i] != 0.5f) { @@ -16038,6 +17022,7 @@ void ImProcFunctions::Lab_Local( } } } + if (loccompwavCurve && loccompwavutili) { for (int i = 0; i < 500; i++) { if (loccompwavCurve[i] != 0.f) { @@ -16046,6 +17031,7 @@ void ImProcFunctions::Lab_Local( } } } + if (loccomprewavCurve && loccomprewavutili) { for (int i = 0; i < 500; i++) { if (loccomprewavCurve[i] != 0.75f) { @@ -16092,6 +17078,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -16112,6 +17099,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -16204,6 +17192,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -16217,6 +17206,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -16272,7 +17262,7 @@ void ImProcFunctions::Lab_Local( 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 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; @@ -16288,18 +17278,22 @@ void ImProcFunctions::Lab_Local( 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) { + if (gamma != 1.f) { #ifdef _OPENMP -# pragma omp parallel for schedule(dynamic,16) if (multiThread) + # pragma omp parallel for schedule(dynamic,16) if (multiThread) #endif + for (int y = 0; y < tmp1->H; ++y) { - int x = 0; + 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]))); + 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) { + + 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]); } } @@ -16309,11 +17303,12 @@ void ImProcFunctions::Lab_Local( 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, 10, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz, maxicam, contsig, lightsig); } - 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); + 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, maxicam, contsig, lightsig); float rad = params->locallab.spots.at(sp).detailcie; loccont(bfw, bfh, tmp1.get(), rad, 5.f, sk); @@ -16321,17 +17316,21 @@ void ImProcFunctions::Lab_Local( - if(gamma != 1.f) { + if (gamma != 1.f) { #ifdef _OPENMP -# pragma omp parallel for schedule(dynamic,16) if (multiThread) + # 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]); } @@ -16359,6 +17358,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -16375,6 +17375,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -16387,6 +17388,7 @@ void ImProcFunctions::Lab_Local( #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]); @@ -16411,6 +17413,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -16428,6 +17431,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -16441,6 +17445,7 @@ void ImProcFunctions::Lab_Local( #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]); @@ -16457,6 +17462,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -16464,6 +17470,7 @@ void ImProcFunctions::Lab_Local( tmpresid->b[y][x] = tmp1->b[y][x]; } } + clarimerge(lp, mL, mC, exec, tmpresid.get(), wavelet_level, sk, numThreads); } @@ -16491,6 +17498,7 @@ void ImProcFunctions::Lab_Local( #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]); @@ -16504,20 +17512,21 @@ void ImProcFunctions::Lab_Local( } } - if(lp.enalcMask && lp.recothrw != 1.f) { - float recoth = lp.recothrw; + 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); + 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; @@ -16525,18 +17534,21 @@ void ImProcFunctions::Lab_Local( #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]); - } + + 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) { + } + + 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(); } @@ -16564,26 +17576,28 @@ void ImProcFunctions::Lab_Local( 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; - } + if(lp.fullim >= 2) {//full-iamge and global - 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); + 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; @@ -16594,113 +17608,136 @@ void ImProcFunctions::Lab_Local( } } } - 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) { + + 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) + # pragma omp parallel for schedule(dynamic,16) if (multiThread) #endif - for (int y = 0; y < bfh; ++y) { - int x = 0; + + 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]); - } - } + + 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]))); } - - //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]); - } - } + + for (; x < bfw; ++x) { + bufsh[y][x] = 32768.f * igammalog(bufsh[y][x] / 32768.f, gamma1, ts1, g_a[2], g_a[4]); } - //sharpen simpleprocess - Sharp_Local(call, loctemp2, 0, hueref, chromaref, lumaref, lp, original, transformed, cx, cy, sk); + } + } + + + //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) { + 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) + # pragma omp parallel for schedule(dynamic,16) if (multiThread) #endif - for (int y = 0; y < bfh; ++y) { - int x = 0; + + 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]); - } - } + + 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]))); } - - - 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) { + +#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]))); - } + # pragma omp parallel for schedule(dynamic,16) if (multiThread) #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]); - } - } + + 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]))); } - //sharpen dcrop - Sharp_Local(call, loctemp, 0, hueref, chromaref, lumaref, lp, original, transformed, cx, cy, sk); + +#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; @@ -16717,18 +17754,23 @@ void ImProcFunctions::Lab_Local( 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) { + + if (gamma1 != 1.f) { #ifdef _OPENMP -# pragma omp parallel for schedule(dynamic,16) if (multiThread) + # 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) { + + 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]); } } @@ -16736,24 +17778,29 @@ void ImProcFunctions::Lab_Local( 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) { + if (gamma1 != 1.f) { #ifdef _OPENMP -# pragma omp parallel for schedule(dynamic,16) if (multiThread) -#endif + # 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]); @@ -16815,6 +17862,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -16828,24 +17876,28 @@ void ImProcFunctions::Lab_Local( 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) { + if (gamma1 != 1.f) { #ifdef _OPENMP -# pragma omp parallel for schedule(dynamic,16) if (multiThread) + # pragma omp parallel for schedule(dynamic,16) if (multiThread) #endif - for (int y = 0; y < bfh; ++y) { + + for (int y = 0; y < bfh; ++y) { int x = 0; #ifdef __SSE2__ - for (; x < bfw - 3; x += 4) { + + 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]); - } + + 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); + const int spotSi = rtengine::max(1 + 2 * rtengine::max(1.f, lp.cir / sk), 5.f); if (bfw > 2 * spotSi && bfh > 2 * spotSi && lp.struexp > 0.f) { blend2(bfw, bfh); @@ -16855,6 +17907,7 @@ void ImProcFunctions::Lab_Local( #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; @@ -16865,7 +17918,7 @@ void ImProcFunctions::Lab_Local( if (lp.shapmet == 0) { calcTransition(lox, loy, achm, lp, zone, localFactor); - } else /*if (lp.shapmet == 1)*/ { + } else { /*if (lp.shapmet == 1)*/ calcTransitionrect(lox, loy, achm, lp, zone, localFactor); } @@ -16944,6 +17997,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -16952,18 +18006,17 @@ void ImProcFunctions::Lab_Local( } } - - 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 } @@ -16975,12 +18028,13 @@ void ImProcFunctions::Lab_Local( } 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) { + 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); } } @@ -16994,6 +18048,7 @@ void ImProcFunctions::Lab_Local( #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); @@ -17010,11 +18065,13 @@ void ImProcFunctions::Lab_Local( #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; @@ -17025,7 +18082,8 @@ void ImProcFunctions::Lab_Local( const std::unique_ptr tmpImagefat(new Imagefloat(bfwr, bfhr)); lab2rgb(*bufexpfin, *tmpImagefat, params->icm.workingProfile); int alg = 0; - if(fatParams.anchor == 50.f) { + + if (fatParams.anchor == 50.f) { alg = 1; } bool satu = false; @@ -17034,13 +18092,15 @@ void ImProcFunctions::Lab_Local( } ToneMapFattal02(tmpImagefat.get(), fatParams, 3, 0, nullptr, 0, 0, alg, satu);//last parameter alg = 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, 10, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz, maxicam, contsig, lightsig); } - 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); + 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, maxicam, contsig, lightsig); float rad = params->locallab.spots.at(sp).detailcie; loccont(bfw, bfh, bufexpfin.get(), rad, 15.f, sk); @@ -17048,8 +18108,8 @@ void ImProcFunctions::Lab_Local( } - if (lp.laplacexp > 0.1f) { - + if (lp.laplacexp > 0.1f) {//don't use if an other spot use Dehaze. + //printf("EXEC ATTENUATOR\n"); MyMutex::MyLock lock(*fftwMutex); std::unique_ptr datain(new float[bfwr * bfhr]); std::unique_ptr dataout(new float[bfwr * bfhr]); @@ -17059,12 +18119,14 @@ void ImProcFunctions::Lab_Local( 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) { @@ -17084,6 +18146,7 @@ void ImProcFunctions::Lab_Local( #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 @@ -17096,6 +18159,7 @@ void ImProcFunctions::Lab_Local( #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 @@ -17104,6 +18168,7 @@ void ImProcFunctions::Lab_Local( } } } + if (lp.shadex > 0) { if (lp.expcomp == 0.f) { @@ -17117,7 +18182,7 @@ void ImProcFunctions::Lab_Local( lp.expcomp = 0.001f; // to enabled } } - + //shadows with ipshadowshighlight if ((lp.expcomp != 0.f) || (exlocalcurve && localexutili)) { if (lp.shadex > 0) { @@ -17135,6 +18200,7 @@ void ImProcFunctions::Lab_Local( #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; @@ -17145,6 +18211,7 @@ void ImProcFunctions::Lab_Local( } } } + /* float gamma = lp.gamex; rtengine::GammaValues g_a; //gamma parameters @@ -17152,17 +18219,21 @@ void ImProcFunctions::Lab_Local( 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) { + if (gamma1 != 1.f) { #ifdef _OPENMP -# pragma omp parallel for schedule(dynamic,16) if (multiThread) -#endif + # 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]); } @@ -17172,22 +18243,22 @@ void ImProcFunctions::Lab_Local( 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) { + + if (lp.enaExpMask && lp.recothre != 1.f) { float recoth = lp.recothre; - if(lp.recothre < 1.f) { + if (lp.recothre < 1.f) { recoth = -1.f * recoth + 2.f; } float hig = lp.higthre; float low = lp.lowthre; - // float recoth = lp.recothre; + // 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; @@ -17195,8 +18266,9 @@ void ImProcFunctions::Lab_Local( int bh = bufexporig->H; #ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) if(multiThread) + #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]); @@ -17205,7 +18277,7 @@ void ImProcFunctions::Lab_Local( } } - if(lp.recothre >= 1.f) { + 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); @@ -17236,6 +18308,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -17371,6 +18444,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -17385,30 +18459,34 @@ void ImProcFunctions::Lab_Local( } } - 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 + 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) { + if (gamma1 != 1.f) { #ifdef _OPENMP -# pragma omp parallel for schedule(dynamic,16) if (multiThread) + # pragma omp parallel for schedule(dynamic,16) if (multiThread) #endif - for (int y = 0; y < bufcolorig->H; ++y) { + + for (int y = 0; y < bufcolorig->H; ++y) { int x = 0; #ifdef __SSE2__ - for (; x < bufcolorig->W - 3; x += 4) { + + 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]); - } + + 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 int spotSi = rtengine::max(1 + 2 * rtengine::max(1.f, lp.cir / sk), 5.f); const bool blends = bfw > 2 * spotSi && bfh > 2 * spotSi && lp.struco > 0.f; if (blends) { @@ -17419,6 +18497,7 @@ void ImProcFunctions::Lab_Local( #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; @@ -17429,7 +18508,7 @@ void ImProcFunctions::Lab_Local( if (lp.shapmet == 0) { calcTransition(lox, loy, achm, lp, zone, localFactor); - } else /*if (lp.shapmet == 1)*/ { + } else { /*if (lp.shapmet == 1)*/ calcTransitionrect(lox, loy, achm, lp, zone, localFactor); } @@ -17440,6 +18519,7 @@ void ImProcFunctions::Lab_Local( } } } + return; } } @@ -17472,6 +18552,7 @@ void ImProcFunctions::Lab_Local( 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") { @@ -17518,6 +18599,7 @@ void ImProcFunctions::Lab_Local( #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++) { @@ -17591,6 +18673,7 @@ void ImProcFunctions::Lab_Local( #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; @@ -17601,7 +18684,7 @@ void ImProcFunctions::Lab_Local( if (lp.shapmet == 0) { calcTransition(lox, loy, achm, lp, zone, localFactor); - } else /*if (lp.shapmet == 1)*/ { + } else { /*if (lp.shapmet == 1)*/ calcTransitionrect(lox, loy, achm, lp, zone, localFactor); } @@ -17625,6 +18708,7 @@ void ImProcFunctions::Lab_Local( } bool HHcurve = false; + if (lochhCurve && HHutili) { for (int i = 0; i < 500; i++) { if (lochhCurve[i] != 0.5f) { @@ -17655,6 +18739,7 @@ void ImProcFunctions::Lab_Local( 1, 1 }); bool LHcurve = false; + if (loclhCurve && LHutili) { for (int i = 0; i < 500; i++) { if (loclhCurve[i] != 0.5f) { @@ -17663,7 +18748,9 @@ void ImProcFunctions::Lab_Local( } } } + bool CHcurve = false; + if (locchCurve && CHutili) { for (int i = 0; i < 500; i++) { if (locchCurve[i] != 0.5f) { @@ -17672,17 +18759,21 @@ void ImProcFunctions::Lab_Local( } } } + double amountchrom = 0.01 * settings->amchroma; - if(amountchrom < 0.05) { + + if (amountchrom < 0.05) { amountchrom = 0.05; } - if(amountchrom > 2.) { + + 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]; @@ -17757,16 +18848,16 @@ void ImProcFunctions::Lab_Local( 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; + 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 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); + // 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 @@ -17774,7 +18865,7 @@ void ImProcFunctions::Lab_Local( 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 + //for negative { float khue = 1.9f; //in reserve in case of! l_r *= (1.f + khue * valparamneg); @@ -17783,9 +18874,10 @@ void ImProcFunctions::Lab_Local( 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) + const float valparam = 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; @@ -17815,6 +18907,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -17824,6 +18917,7 @@ void ImProcFunctions::Lab_Local( } bool nottransit = false; + if (lp.mergemet >= 2) { //merge result with original nottransit = true; bufcolreserv.reset(new LabImage(bfw, bfh)); @@ -17833,6 +18927,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -17849,9 +18944,9 @@ void ImProcFunctions::Lab_Local( 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; + 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; } } } @@ -17862,6 +18957,7 @@ void ImProcFunctions::Lab_Local( #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); @@ -17876,6 +18972,7 @@ void ImProcFunctions::Lab_Local( #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); @@ -17891,6 +18988,7 @@ void ImProcFunctions::Lab_Local( #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); @@ -17900,6 +18998,7 @@ void ImProcFunctions::Lab_Local( 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) { @@ -17907,6 +19006,7 @@ void ImProcFunctions::Lab_Local( } float newhr = HH + cor; + if (newhr > rtengine::RT_PI_F) { newhr -= 2 * rtengine::RT_PI_F; } else if (newhr < -rtengine::RT_PI_F) { @@ -17947,6 +19047,7 @@ void ImProcFunctions::Lab_Local( #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]); @@ -17965,6 +19066,7 @@ void ImProcFunctions::Lab_Local( #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]); @@ -17982,6 +19084,7 @@ void ImProcFunctions::Lab_Local( #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]); @@ -17999,6 +19102,7 @@ void ImProcFunctions::Lab_Local( #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]); @@ -18011,6 +19115,7 @@ void ImProcFunctions::Lab_Local( #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]); @@ -18023,6 +19128,7 @@ void ImProcFunctions::Lab_Local( #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) { @@ -18071,6 +19177,7 @@ void ImProcFunctions::Lab_Local( #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]); @@ -18087,6 +19194,7 @@ void ImProcFunctions::Lab_Local( #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]); @@ -18110,10 +19218,12 @@ void ImProcFunctions::Lab_Local( 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)); @@ -18131,6 +19241,7 @@ void ImProcFunctions::Lab_Local( #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)); @@ -18142,6 +19253,7 @@ void ImProcFunctions::Lab_Local( #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)); @@ -18153,6 +19265,7 @@ void ImProcFunctions::Lab_Local( #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)); @@ -18164,6 +19277,7 @@ void ImProcFunctions::Lab_Local( #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)); @@ -18175,6 +19289,7 @@ void ImProcFunctions::Lab_Local( #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)); @@ -18186,6 +19301,7 @@ void ImProcFunctions::Lab_Local( #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)); @@ -18197,6 +19313,7 @@ void ImProcFunctions::Lab_Local( #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)); @@ -18208,6 +19325,7 @@ void ImProcFunctions::Lab_Local( #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)); @@ -18219,6 +19337,7 @@ void ImProcFunctions::Lab_Local( #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)); @@ -18230,6 +19349,7 @@ void ImProcFunctions::Lab_Local( #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)); @@ -18241,6 +19361,7 @@ void ImProcFunctions::Lab_Local( #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)); @@ -18252,6 +19373,7 @@ void ImProcFunctions::Lab_Local( #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)); @@ -18263,6 +19385,7 @@ void ImProcFunctions::Lab_Local( #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)); @@ -18274,6 +19397,7 @@ void ImProcFunctions::Lab_Local( #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)); @@ -18286,6 +19410,7 @@ void ImProcFunctions::Lab_Local( #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)); @@ -18297,6 +19422,7 @@ void ImProcFunctions::Lab_Local( #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)); @@ -18313,6 +19439,7 @@ void ImProcFunctions::Lab_Local( #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]); @@ -18326,22 +19453,24 @@ void ImProcFunctions::Lab_Local( 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) + #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]); + + 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); } @@ -18353,6 +19482,7 @@ void ImProcFunctions::Lab_Local( #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); @@ -18366,6 +19496,7 @@ void ImProcFunctions::Lab_Local( #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); @@ -18380,6 +19511,7 @@ void ImProcFunctions::Lab_Local( #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); @@ -18412,24 +19544,28 @@ void ImProcFunctions::Lab_Local( -/* - 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) { + /* + 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 + # 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]))); + 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]); } @@ -18440,39 +19576,43 @@ void ImProcFunctions::Lab_Local( 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; + //mask recovery - if(lp.recothrc < 1.f) { - recoth = -1.f * recoth + 2.f; + 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); } - 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; + 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) + #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]); + + 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) { + + 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); @@ -18524,6 +19664,7 @@ void ImProcFunctions::Lab_Local( #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]; @@ -18586,20 +19727,22 @@ void ImProcFunctions::Lab_Local( } } } - + //begin common mask - if(lp.maskena) { + 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); @@ -18611,7 +19754,7 @@ void ImProcFunctions::Lab_Local( std::unique_ptr bufmaskblurcol; std::unique_ptr originalmaskcol; std::unique_ptr bufcolreserv; - + int wo = original->W; int ho = original->H; LabImage *origsav = nullptr; @@ -18627,9 +19770,11 @@ void ImProcFunctions::Lab_Local( 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]; @@ -18645,6 +19790,7 @@ void ImProcFunctions::Lab_Local( 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; @@ -18653,15 +19799,17 @@ void ImProcFunctions::Lab_Local( 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 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 = 0.1 * 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; @@ -18691,15 +19839,17 @@ void ImProcFunctions::Lab_Local( 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]; @@ -18712,6 +19862,7 @@ void ImProcFunctions::Lab_Local( 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); @@ -18728,8 +19879,9 @@ void ImProcFunctions::Lab_Local( rtengine::guidedFilter(guid, ble, ble, r2, 0.2f * epsil, multiThread); #ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) if (multiThread) + #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]); @@ -18739,39 +19891,52 @@ void ImProcFunctions::Lab_Local( } } } - + 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; +//end common mask + //Cie + rdx = params->locallab.spots.at(sp).redxl; + rdy = params->locallab.spots.at(sp).redyl; + grx = params->locallab.spots.at(sp).grexl; + gry = params->locallab.spots.at(sp).greyl; + blx = params->locallab.spots.at(sp).bluxl; + bly = params->locallab.spots.at(sp).bluyl; + + 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) { + + if (lp.blurciemask >= 0.25f && lp.fftcieMask && call == 2) { + optfft(N_fftwsize, bfh, bfw, bfh, bfw, lp, original->H, original->W, xstart, ystart, xend, yend, cx, cy, lp.fullim); + } + + 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)); @@ -18782,172 +19947,643 @@ void ImProcFunctions::Lab_Local( #ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) if (multiThread) + #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); + 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 elements for 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, maxicam, contsig, lightsig); + } + + 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; + const int level_bl = params->locallab.spots.at(sp).csthresholdcie.getBottomLeft(); + const int level_hl = params->locallab.spots.at(sp).csthresholdcie.getTopLeft(); + const int level_br = params->locallab.spots.at(sp).csthresholdcie.getBottomRight(); + const int level_hr = params->locallab.spots.at(sp).csthresholdcie.getTopRight(); + + 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; + bool astool = params->locallab.spots.at(sp).toolcie; + const float strumask = 0.02 * params->locallab.spots.at(sp).strumaskcie; + const int shado = params->locallab.spots.at(sp).shadmaskcie; + const int highl = params->locallab.spots.at(sp).highmaskcie; + + maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufexporig.get(), bufmaskorigcie.get(), originalmaskcie.get(), original, reserved, inv, lp, + strumask, astool, + locccmascieCurve, lcmascieutili, locllmascieCurve, llmascieutili, lochhmascieCurve, lhmascieutili, llochhhmascieCurve, lhhmascieutili, multiThread, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmaskcielocalcurve, localmaskcieutili, loclmasCurveciewav, lmasutiliciewav, + level_bl, level_hl, level_br, level_hr, + shortcu, delt, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, lp.fftcieMask, lp.blurciemask, lp.contciemask, -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) { +#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 (params->locallab.spots.at(sp).expprecam && params->locallab.spots.at(sp).modecam == "cam16") { + 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] / 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[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 equalR = maxFactorToxyz / toxyz[1][0]; + float equalG = maxFactorToxyz / toxyz[1][1]; + float equalB = maxFactorToxyz / toxyz[1][2]; + //inverse matrix user select + 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]} + }; + 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]} + }; + + + Imagefloat *tmpImage = nullptr; + tmpImage = new Imagefloat(bfw, bfh); + Imagefloat *tmpImagelog = nullptr; + tmpImagelog = new Imagefloat(bfw, bfh); + + lab2rgb(*bufexpfin, *tmpImage, params->icm.workingProfile); + Glib::ustring prof = params->icm.workingProfile; + + float gamtone = params->locallab.spots.at(sp).gamjcie; + float slotone = params->locallab.spots.at(sp).slopjcie; + cmsHTRANSFORM dummy = nullptr; + //int prim = 3; + int typ = 1; + rdx = params->locallab.spots.at(sp).redxl; + rdy = params->locallab.spots.at(sp).redyl; + grx = params->locallab.spots.at(sp).grexl; + gry = params->locallab.spots.at(sp).greyl; + blx = params->locallab.spots.at(sp).bluxl; + bly = params->locallab.spots.at(sp).bluyl; + /* + if (params->locallab.spots.at(sp).complexcie == 2) { + printf("Mode complexity=%i Prov=%s\n", params->locallab.spots.at(sp).complexcie, prof.c_str()); + printf("prim=%s \n", params->locallab.spots.at(sp).primMethod.c_str()); + } + */ + if (params->locallab.spots.at(sp).primMethod == "beta") { + typ = 5; + ill = 2; + prim = 11; + } else if (params->locallab.spots.at(sp).primMethod == "srgb") { + prim = 1; + ill = 5; + typ = 5; + } else if (params->locallab.spots.at(sp).primMethod == "ado") { + prim = 2; + ill = 5; + typ = 5; + } else if (params->locallab.spots.at(sp).primMethod == "pro") { + prim = 3; + ill = 2; + typ = 5; + } else if (params->locallab.spots.at(sp).primMethod == "rec") { + prim = 4; + ill = 5; + typ = 5; + } else if (params->locallab.spots.at(sp).primMethod == "ac1") { + prim = 5; + ill = 4; + typ = 5; + } else if (params->locallab.spots.at(sp).primMethod == "wid") { + prim = 6; + ill = 2; + typ = 5; + } else if (params->locallab.spots.at(sp).primMethod == "jdcmax") { + prim = 8; + ill = 2; + typ = 5; + } else if (params->locallab.spots.at(sp).primMethod == "jdcmaxstdA") { + prim = 9; + ill = 8; + typ = 5; + } else if (params->locallab.spots.at(sp).primMethod == "ac0") { + prim = 7; + ill = 4; + typ = 5; + } else if (params->locallab.spots.at(sp).primMethod == "best") { + prim = 12; + ill = 2; + typ = 5; + } else if (params->locallab.spots.at(sp).primMethod == "bru") { + prim = 10; + ill = 5; + typ = 5; + } else if (params->locallab.spots.at(sp).primMethod == "free") { + prim = 15; + typ = 5; + + rdx = params->locallab.spots.at(sp).redxl; + rdy = params->locallab.spots.at(sp).redyl; + grx = params->locallab.spots.at(sp).grexl; + gry = params->locallab.spots.at(sp).greyl; + blx = params->locallab.spots.at(sp).bluxl; + bly = params->locallab.spots.at(sp).bluyl; + + } + int catx = 0; + if (params->locallab.spots.at(sp).catMethod == "brad") { + catx = 0; + } else if (params->locallab.spots.at(sp).catMethod == "cat16") { + catx = 1; + } else if (params->locallab.spots.at(sp).catMethod == "cat02") { + catx = 2; + } else if (params->locallab.spots.at(sp).catMethod == "vky") { + catx = 3; + } else if (params->locallab.spots.at(sp).catMethod == "xyz") { + catx = 4; + } + + params->locallab.spots.at(sp).catMethod; + int locprim = 1; + bool gamcie = params->locallab.spots.at(sp).gamutcie; + float rx, ry, gx, gy, bx, by = 0.f; + float mx, my, mxe, mye = 0.f; + + workingtrc(sp, tmpImage, tmpImage, bfw, bfh, -5, prof, 2.4, 12.92310, 0, ill, 0, 0, rx, ry, gx, gy, bx, by, mx, my, mxe, mye, dummy, true, false, false, false); + workingtrc(sp, tmpImage, tmpImage, bfw, bfh, typ, prof, gamtone, slotone, catx, ill, prim, locprim, rdx, rdy, grx, gry, blx, bly, meanx, meany, meanxe, meanye, dummy, false, true, true, gamcie);//with gamut control + + if(lp.midtcie != 0) { + ImProcFunctions::tone_eqcam(this, tmpImage, lp.midtcie, params->icm.workingProfile, sk, multiThread); + } + + tmpImage->copyData(tmpImagelog); + + if(params->locallab.spots.at(sp).logcie && !params->locallab.spots.at(sp).logcieq) { + log_encode(tmpImagelog, lp, multiThread, bfw, bfh); + float strlog = 0.01f * (float) params->locallab.spots.at(sp).strcielog; + + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, 16) +#endif + + for (int y = 0; y < bfh; ++y) { + for (int x = 0; x < bfw; ++x) { + tmpImage->r(y, x) = intp(strlog, tmpImagelog->r(y, x), tmpImage->r(y, x)); + tmpImage->g(y, x) = intp(strlog, tmpImagelog->g(y, x), tmpImage->g(y, x)); + tmpImage->b(y, x) = intp(strlog, tmpImagelog->b(y, x), tmpImage->b(y, x)); + + } + } + } + + if(lp.smoothciem == 1) { + tone_eqsmooth(this, tmpImage, lp, params->icm.workingProfile, sk, multiThread);//reduce Ev > 0 < 12 + } else if(lp.smoothciem == 2 || lp.smoothciem == 3 || lp.smoothciem == 4) {// 2 - only smmoth highlightd - 3 - Tone mapping with slope and mid_grey + + //TonemapFreeman - Copyright (c) 2023 Thatcher Freeman + float mid_gray = 0.01f * lp.sourcegraycie;//Mean luminance Yb Scene + float mid_gray_view = 0.01f * lp.targetgraycie;//Mean luminance Yb Viewing + // if(mode == 3 && target_slope != 1.f ) {//case tone-mapping +/* if(params->locallab.spots.at(sp).{ + float midutil = mid_gray_view / mid_gray_scene;//take into account ratio between Yb source and Yb viewing + float midk = 1.f; + float k_slope = 2.2f; + if(target_slope >= 1.f) { + midk = pow_F(midutil, k_slope * (target_slope - 1.f));//ponderation in function target_slope when "slope user" < 1.f } + kmid = midk; + + } +*/ + lp.whiteevjz = LIM(lp.whiteevjz, 0.1f, 31.5f);//limit whiteEv to avoid crash + float white_point = xexpf(lp.whiteevjz * std::log(2.f) + xlogf(mid_gray));//lp.whiteevjz White_Ev + lp.blackevjz = LIM(lp.blackevjz, -15.5f, -0.2f);//limit BlackEv to avoid crash + float black_point = xexpf(lp.blackevjz * std::log(2.f) + xlogf(mid_gray));//lp.blackevjz Black_Ev + bool rolloff = true;//only soften highlights + float slopegray = 1.f;//slopegray between 0.8 and 1.6 - lineary light the shadows by the user - the gamma is calculated according to slope and the characteristics of the image DR, White, Black + float slopegrayr = 1.f; + float slopegrayg = 1.f; + float slopegrayb = 1.f; + int mode = 1; + float slopsmoot = 1.f - ((float) params->locallab.spots.at(sp).slopesmo - 1.f);//modify response so when increase slope the grays are becoming lighter + float slopsmootr = 1.f - ((float) params->locallab.spots.at(sp).slopesmor - 1.f); + float slopsmootg = 1.f - ((float) params->locallab.spots.at(sp).slopesmog - 1.f); + float slopsmootb = 1.f - ((float) params->locallab.spots.at(sp).slopesmob - 1.f); + bool takeyb = params->locallab.spots.at(sp).smoothcieyb; + bool lummod = params->locallab.spots.at(sp).smoothcielum; + float maxsl= 4.f;//maximum real slope + float minslider = 0.01f;//minimum slider value > 0.f + float aa = (1.9f - maxsl) / (0.1f - minslider);//interpolation : 1.9f slope value for slider = 0.1f + float bb = 1.9f - 0.1f * aa; + + if(lp.smoothciem == 3) {//slope activ, only with choice gamma - slope - based + rolloff = false;//allows tone-mapping slope + if(slopsmoot < 0.1f) { + slopsmoot = aa * slopsmoot + bb; + } + slopegray = slopsmoot; + slopegrayr = slopsmoot; + slopegrayg = slopsmoot; + slopegrayb = slopsmoot; + mode = 3; + }//modify slope + if(lp.smoothciem == 4) {//levels + rolloff = false;//allows tone-mapping slope + if(slopsmootr < 0.1f) { + slopsmootr = aa * slopsmootr + bb; + } + slopegrayr = slopsmootr; + if(slopsmootg < 0.1f) { + slopsmootg = aa * slopsmootg + bb; + } + slopegrayg = slopsmootg; + if(slopsmootb < 0.1f) { + slopsmootb = aa * slopsmootb + bb; + } + slopegrayb = slopsmootb; + mode = 4; + } + + LUTf lut(65536, LUT_CLIP_OFF);//take from Alberto Griggio + LUTf lutr(65536, LUT_CLIP_OFF); + LUTf lutg(65536, LUT_CLIP_OFF); + LUTf lutb(65536, LUT_CLIP_OFF); + bool scale = lp.issmoothcie;//scale Yb mid_gray - WhiteEv and BlavkEv + + tonemapFreeman(slopegray, slopegrayr, slopegrayg, slopegrayb, white_point, black_point, mid_gray, mid_gray_view, rolloff, lut, lutr, lutg, lutb, mode, scale, takeyb); + + if(lp.smoothciem == 4) { + if(lummod) {//luminosity mode by Lab conversion + #ifdef _OPENMP + #pragma omp parallel for +#endif + for (int y = 0; y < bfh ; ++ y) { + for (int x = 0; x < bfw ; ++x) { + float r = tmpImage->r(y, x); + float g = tmpImage->g(y, x); + float b = tmpImage->b(y, x); + //convert to Lab to get a&b before RGB + float xx = toxyz[0][0] * r + toxyz[0][1] * g + toxyz[0][2] * b; + float yy = toxyz[1][0] * r + toxyz[1][1] * g + toxyz[1][2] * b; + float zz = toxyz[2][0] * r + toxyz[2][1] * g + toxyz[2][2] * b; + + float fx = xx < MAXVALF ? Color::cachef[xx] : 327.68f * std::cbrt(xx / MAXVALF); + float fy = yy < MAXVALF ? Color::cachef[yy] : 327.68f * std::cbrt(yy / MAXVALF); + float fz = zz < MAXVALF ? Color::cachef[zz] : 327.68f * std::cbrt(zz / MAXVALF); + + float a_1 = 500.0f * (fx - fy); + float b_1 = 200.0f * (fy - fz); + float rNew = 65535.f * lutr[tmpImage->r(y, x)]; + float gNew = 65535.f * lutg[tmpImage->g(y, x)]; + float bNew = 65535.f * lutb[tmpImage->b(y, x)]; + r += (rNew - r) * equalR; + g += (gNew - g) * equalG; + b += (bNew - b) * equalB; + float newy = toxyz[1][0] * r + toxyz[1][1] * g + toxyz[1][2] * b; + float L_2 = newy <= MAXVALF ? Color::cachefy[newy] : 327.68f * (116.f * xcbrtf(newy / MAXVALF) - 16.f); + 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_) ; + if (params->locallab.spots.at(sp).avoidgamutMethod != "NONE") {//possibility of deactivating to see usefulness. is it necessary? + Color::gamutmap(x_, y_, z_, wp);//if none disabled + } + Color::xyz2rgb(x_, y_, z_, r, g, b, wip); + tmpImage->r(y, x) = r; + tmpImage->g(y, x) = g; + tmpImage->b(y, x) = b; + } + } + } else {//RGG case + #ifdef _OPENMP + #pragma omp parallel for +#endif + for (int y = 0; y < bfh ; ++ y) {//apply Lut tone-mapping or smooth: thanks to Alberto - gain time. + for (int x = 0; x < bfw ; ++x) { + tmpImage->r(y, x) = 65535.f * lutr[tmpImage->r(y, x)]; + tmpImage->g(y, x) = 65535.f * lutg[tmpImage->g(y, x)]; + tmpImage->b(y, x) = 65535.f * lutb[tmpImage->b(y, x)]; + } + } + } + } else {//Slope case + #ifdef _OPENMP + #pragma omp parallel for +#endif + for (int y = 0; y < bfh ; ++ y) {//apply Lut tone-mapping or smooth: thanks to Alberto - gain time. + for (int x = 0; x < bfw ; ++x) { + tmpImage->r(y, x) = 65535.f * lut[tmpImage->r(y, x)]; + tmpImage->g(y, x) = 65535.f * lut[tmpImage->g(y, x)]; + tmpImage->b(y, x) = 65535.f * lut[tmpImage->b(y, x)]; + } + } + } + } + + rgb2lab(*tmpImage, *bufexpfin, params->icm.workingProfile); + + delete tmpImage; + delete tmpImagelog; + } + + 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, maxicam, contsig, lightsig); + } + } + + if (lp.strgradcie != 0.f) { + + struct grad_params gp; + calclocalGradientParams(lp, gp, ystart, xstart, bfw, bfh, 15); +#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.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 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 = 0.30f; + bool exec_lc = true; + if(lp.moka == 1 && lp.sursouci == 4) {//disable local contrast if user do not want to use ciecam and Cam16 (I make this choice) + exec_lc = false; + } + if(lp.moka == 1) { //cam16 + radcie = 0.01 * params->locallab.spots.at(sp).detailcie; + } else if(lp.moka == 2) { //Jz + radcie = 0.01 * params->locallab.spots.at(sp).detailciejz; + } + if(radcie > 0.f && exec_lc) { + //local contrast + //ampirical ponderation, to verify + float surrsour_ampl_str = 1.f;//amount + float surrsour_ampl_dark = 1.f;//dark + float surrsour_ampl_radius = 1.f;//radius + if(lp.sursouci == 0) {//Average + surrsour_ampl_str = 0.9f; + surrsour_ampl_dark = 1.f; + surrsour_ampl_radius = 1.f; + } else if(lp.sursouci == 1) {//Dim + surrsour_ampl_str = 1.f; + surrsour_ampl_dark = 1.1f; + surrsour_ampl_radius = 1.05f; + } else if(lp.sursouci == 2) {//Dark + surrsour_ampl_str = 1.2f; + surrsour_ampl_dark = 1.2f; + surrsour_ampl_radius = 1.1f; + } else if(lp.sursouci == 3) {//Ex Dark + surrsour_ampl_str = 1.4f; + surrsour_ampl_radius = 1.2f; + surrsour_ampl_dark = 1.5f; + } else if(lp.sursouci == 4 && lp.moka == 2) {//less than average for Jz + surrsour_ampl_str = 0.9f; + surrsour_ampl_radius = 0.9f; + surrsour_ampl_dark = 1.f; + } + LocalContrastParams localContrastParams; + LocallabParams locallabparams; + localContrastParams.enabled = true; + localContrastParams.radius = rtengine::min((double) surrsour_ampl_radius * 80., 100.); + localContrastParams.amount = rtengine::min(radcie * surrsour_ampl_str, 1.f); + localContrastParams.darkness = rtengine::min((double) surrsour_ampl_dark * 1., 3.); + localContrastParams.lightness = 1.; + bool fftwlc = false; + + ImProcFunctions::localContrast(bufexpfin.get(), bufexpfin->L, localContrastParams, fftwlc, sk); + } + if (params->locallab.spots.at(sp).bwcie) { +#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->a[ir][jr] = 0.f; + bufexpfin->b[ir][jr] = 0.f; + } + } + } + + + 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); + } + } + } + int bw = transformed->W; + int bh = transformed->H; + bool notzero = false; //verify that RGB values are > 0.f issue 7121 to avoid crash. Could perhaps be used in other cases as RGB curves (main) + bool notlaplacian = false;//no use of strong Laplacian + + float epsi = 0.000001f; + + + if((lp.laplacexp > 1.f && lp.exposena) || (lp.strng > 2.f && lp.sfena)){//strong Laplacian + notlaplacian = true; + } + + if(((lp.laplacexp > 0.f && lp.laplacexp <= 1.f) && lp.exposena && lp.blac == 0.f)) { // use Laplacian with very small values + notzero = true; + } else if ((lp.laplacexp > 0.f && lp.laplacexp <= 1.f) && lp.exposena && lp.blac != 0.f) {//for curvelocal simplebasecurve with black + notlaplacian = true; + } + + ToneCurveMode curveMode = params->toneCurve.curveMode;//Tone curve does not allow negative values + if((curveMode == ToneCurveMode::PERCEPTUAL) || (curveMode == ToneCurveMode::STD) || (curveMode == ToneCurveMode::WEIGHTEDSTD) || (curveMode == ToneCurveMode::FILMLIKE) || (curveMode == ToneCurveMode::SATANDVALBLENDING) || (curveMode == ToneCurveMode::LUMINANCE)) { + notzero = true; + } + + ToneCurveMode curveMode2 = params->toneCurve.curveMode2;//Tone curve does not allow negative values + if((curveMode2 == ToneCurveMode::PERCEPTUAL) || (curveMode2 == ToneCurveMode::STD) || (curveMode2 == ToneCurveMode::WEIGHTEDSTD) || (curveMode2 == ToneCurveMode::FILMLIKE) || (curveMode2 == ToneCurveMode::SATANDVALBLENDING) || (curveMode2 == ToneCurveMode::LUMINANCE)) { + notzero = true; + } + + if(params->rgbCurves.enabled || params->hsvequalizer.enabled || params->chmixer.enabled || params->colorToning.enabled ) {//rgb curves, HSV, Channel mixer, Color Toning does not allow negative values. Perhaps others cases ? + notzero = true; + } + + if(notlaplacian || notzero) {//allows memory and conversion labrgb only in these cases + const std::unique_ptr prov1(new Imagefloat(bw, bh)); + lab2rgb(*transformed, *prov1, params->icm.workingProfile); + + if(notlaplacian) {//clip value above 65535.f and > epsilon when Contrast attenuator with high values Laplacian or Original Retinex +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int i = 0; i < bh; ++i) + for (int j = 0; j < bw; ++j) { + prov1->r(i, j) = clipR(rtengine::max(prov1->r(i, j), epsi)); + prov1->g(i, j) = clipR(rtengine::max(prov1->g(i, j), epsi)); + prov1->b(i, j) = clipR(rtengine::max(prov1->b(i, j), epsi)); + } + } else if(notzero) {//standard case only with small values Laplace no clip +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int i = 0; i < bh; ++i) + for (int j = 0; j < bw; ++j) { + prov1->r(i, j) = rtengine::max(prov1->r(i, j), epsi); + prov1->g(i, j) = rtengine::max(prov1->g(i, j), epsi); + prov1->b(i, j) = rtengine::max(prov1->b(i, j), epsi); + } + } + rgb2lab(*prov1, *transformed, params->icm.workingProfile); + } // Gamut and Munsell control - very important do not deactivated to avoid crash diff --git a/rtengine/iptoneequalizer.cc b/rtengine/iptoneequalizer.cc index 7fb6c791f..350260a92 100644 --- a/rtengine/iptoneequalizer.cc +++ b/rtengine/iptoneequalizer.cc @@ -22,7 +22,11 @@ const std::vector> colormap = { {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}, + {1.f, 0.f, 0.f}, + {1.f, 0.f, 0.f}, {1.f, 0.f, 0.f} + }; @@ -72,16 +76,16 @@ void toneEqualizer( }; // Build the luma channels: band-pass filters with gaussian windows of // std 2 EV, spaced by 2 EV - const float centers[12] = { + const float centers[15] = { -16.0f, -14.0f, -12.0f, -10.0f, -8.0f, -6.0f, - -4.0f, -2.0f, 0.0f, 2.0f, 4.0f, 6.0f + -4.0f, -2.0f, 0.0f, 2.0f, 4.0f, 6.0f, 8.0f, 10.0f, 12.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] = { + const float factors[15] = { 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 @@ -93,7 +97,12 @@ void toneEqualizer( 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 + conv(params.bands[4], 3.f, 2.f), // 6 EV + // this settings under are very rarely used...images with very high DR - I add a slider, but it's not the goal: the goal is white distribution (in very rare case) + // I have not change "main" Tone Equalizer. + conv(params.bands[5], 3.f, 2.f), // 8 EV Added for white distribution (Cam16 and Log encode) and images with very high DR + conv(params.bands[5], 3.f, 2.f), // 10 EV Added for white distribution(Cam16 and Log encode) and images with very high DR + conv(params.bands[5], 3.f, 2.f) // 12 EV Added for white distribution(Cam16 and Log encode) and images with very high DR }; rtengine::TMatrix ws = rtengine::ICCStore::getInstance()->workingSpaceMatrix(workingProfile); @@ -125,7 +134,7 @@ void toneEqualizer( #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 l = rtengine::LIM(log2(rtengine::max(Y[y][x], 1e-9f)), centers[0], centers[13]); float ll = round(l * base_posterization) / base_posterization; Y2[y][x] = Y[y][x]; Y[y][x] = exp2(ll); @@ -145,12 +154,12 @@ void toneEqualizer( // For every pixel luminance, the sum of the gaussian masks float w_sum = 0.f; - for (int i = 0; i < 12; ++i) { + for (int i = 0; i < 15; ++i) { w_sum += gauss(centers[i], 0.f); } constexpr float luma_lo = -14.f; - constexpr float luma_hi = 4.f; + constexpr float luma_hi = 6.f; const auto process_pixel = [&](float y) -> float { @@ -161,7 +170,7 @@ void toneEqualizer( // luminance channel to current pixel float correction = 0.0f; - for (int c = 0; c < 12; ++c) + for (int c = 0; c < 15; ++c) { correction += gauss(centers[c], luma) * factors[c]; } @@ -198,7 +207,7 @@ void toneEqualizer( // build the correction as the sum of the contribution of each // luminance channel to current pixel - for (int c = 0; c < 12; ++c) { + for (int c = 0; c < 15; ++c) { float w = gauss(centers[c], luma); for (int i = 0; i < 3; ++i) { ret[i] += w * cur_colormap[c][i]; @@ -213,10 +222,10 @@ void toneEqualizer( #ifdef __SSE2__ - vfloat vfactors[12]; - vfloat vcenters[12]; + vfloat vfactors[15]; + vfloat vcenters[15]; - for (int i = 0; i < 12; ++i) { + for (int i = 0; i < 15; ++i) { vfactors[i] = F2V(factors[i]); vcenters[i] = F2V(centers[i]); } @@ -240,7 +249,7 @@ void toneEqualizer( vfloat correction = zerov; - for (int c = 0; c < 12; ++c) + for (int c = 0; c < 15; ++c) { correction += vgauss(vcenters[c], luma) * vfactors[c]; } diff --git a/rtengine/iptransform.cc b/rtengine/iptransform.cc index 3d384ee62..10f37e781 100644 --- a/rtengine/iptransform.cc +++ b/rtengine/iptransform.cc @@ -26,6 +26,7 @@ #include "rt_math.h" #include "rtengine.h" #include "rtlensfun.h" +#include "lensmetadata.h" #include "sleef.h" using namespace std; @@ -420,7 +421,6 @@ homogeneous::Matrix perspectiveMatrix(double camera_focal_length, double 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") ? @@ -515,14 +515,14 @@ bool ImProcFunctions::transCoord (int W, int H, const std::vector &src, break; } - if (pLCPMap && params->lensProf.useDist) { - pLCPMap->correctDistortion(x_d, y_d, w2, h2); - } - // rotate double Dx = x_d * cost - y_d * sint; double Dy = x_d * sint + y_d * cost; + if (pLCPMap && params->lensProf.useDist && pLCPMap->hasDistortionCorrection()) { + pLCPMap->correctDistortion(Dx, Dy, w2, h2); + } + // distortion correction double s = 1; @@ -660,7 +660,13 @@ void ImProcFunctions::transform (Imagefloat* original, Imagefloat* transformed, std::unique_ptr pLCPMap; - if (needsLensfun()) { + if (needsMetadata()) { + auto corr = MetadataLensCorrectionFinder::findCorrection(metadata); + if (corr) { + corr->initCorrections(oW, oH, params->coarse, rawRotationDeg); + pLCPMap = std::move(corr); + } + } else if (needsLensfun()) { pLCPMap = LFDatabase::getInstance()->findModifier(params->lensProf, metadata, oW, oH, params->coarse, rawRotationDeg); } else if (needsLCP()) { // don't check focal length to allow distortion correction for lenses without chip const std::shared_ptr pLCPProf = LCPStore::getInstance()->getProfile (params->lensProf.lcpFile); @@ -676,7 +682,7 @@ void ImProcFunctions::transform (Imagefloat* original, Imagefloat* transformed, } } - if (! (needsCA() || needsDistortion() || needsRotation() || needsPerspective() || needsLCP() || needsLensfun()) && (needsVignetting() || needsPCVignetting() || needsGradient())) { + if (! (needsCA() || needsDistortion() || needsRotation() || needsPerspective() || needsLCP() || needsMetadata() || needsLensfun()) && (needsVignetting() || needsPCVignetting() || needsGradient())) { transformLuminanceOnly (original, transformed, cx, cy, oW, oH, fW, fH); } else { bool highQuality; @@ -686,24 +692,8 @@ void ImProcFunctions::transform (Imagefloat* original, Imagefloat* transformed, highQuality = false; } else { highQuality = true; - // agriggio: CA correction via the lens profile has to be - // performed before separately from the the other transformations - // (except for the coarse rotation/flipping). In order to not - // change the code too much, I simply introduced a new mode - // TRANSFORM_HIGH_QUALITY_CA, which applies *only* profile-based - // CA correction. So, the correction in this case occurs in two - // steps, using an intermediate temporary image. There's room for - // optimization of course... - if (pLCPMap && params->lensProf.useCA && pLCPMap->isCACorrectionAvailable()) { - tmpimg.reset(new Imagefloat(transformed->getWidth(), transformed->getHeight())); - dest = tmpimg.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(), useOriginalBuffer); - } } } @@ -1094,8 +1084,10 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I // set up stuff, depending on the mode we are enum PerspType { NONE, SIMPLE, CAMERA_BASED }; - const bool enableLCPDist = pLCPMap && params->lensProf.useDist; + const bool enableLCPDist = pLCPMap && params->lensProf.useDist && pLCPMap->hasDistortionCorrection(); + const bool enableLCPCA = pLCPMap && params->lensProf.useCA && pLCPMap->hasCACorrection(); const bool enableCA = highQuality && needsCA(); + const bool doCACorrection = enableCA || enableLCPCA; const bool enableGradient = needsGradient(); const bool enablePCVignetting = needsPCVignetting(); const bool enableVignetting = needsVignetting(); @@ -1240,25 +1232,33 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I break; } - if (enableLCPDist) { - pLCPMap->correctDistortion(x_d, y_d, w2, h2); - } - // rotate - const double Dxc = x_d * cost - y_d * sint; - const double Dyc = x_d * sint + y_d * cost; + const double Dxr = x_d * cost - y_d * sint; + const double Dyr = x_d * sint + y_d * cost; - // distortion correction - double s = 1.0; + for (int c = 0; c < (doCACorrection ? 3 : 1); ++c) { + double Dx = Dxr; + double Dy = Dyr; - if (enableDistortion) { - const double r = sqrt(Dxc * Dxc + Dyc * Dyc) / maxRadius; - s = 1.0 - distAmount + distAmount * r; - } + if (enableLCPDist && enableLCPCA) { + pLCPMap->correctDistortionAndCA(Dx, Dy, w2, h2, c); + } else if (enableLCPDist) { + pLCPMap->correctDistortion(Dx, Dy, w2, h2); + } else if (enableLCPCA) { + pLCPMap->correctCA(Dx, Dy, w2, h2, c); + } - for (int c = 0; c < (enableCA ? 3 : 1); ++c) { - double Dx = Dxc * (s + chDist[c]); - double Dy = Dyc * (s + chDist[c]); + // distortion correction + double s = 1.0; + + if (enableDistortion) { + const double r = sqrt(Dx * Dx + Dy * Dy) / maxRadius; + s = 1.0 - distAmount + distAmount * r; + } + + // CA correction + Dx *= s + chDist[c]; + Dy *= s + chDist[c]; // de-center Dx += w2; @@ -1305,13 +1305,13 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I 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) { + if (doCACorrection) { 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 { - if (enableCA) { + if (doCACorrection) { 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); @@ -1325,7 +1325,7 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I const int x2 = LIM(xc + 1, 0, original->getWidth() - 1); if (useLog) { - if (enableCA) { + if (doCACorrection) { 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); @@ -1333,7 +1333,7 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I 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 { - if (enableCA) { + if (doCACorrection) { 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); @@ -1343,7 +1343,7 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I } } } else { - if (enableCA) { + if (doCACorrection) { // not valid (source pixel x,y not inside source image, etc.) chTrans[c][y][x] = 0; } else { @@ -1357,77 +1357,6 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I } } - -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** chTrans[3] = {transformed->r.ptrs, transformed->g.ptrs, 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) -#endif - - for (int y = 0; y < transformed->getHeight(); y++) { - for (int x = 0; x < transformed->getWidth(); x++) { - for (int c = 0; c < 3; c++) { - double Dx = x; - double Dy = y; - - pLCPMap->correctCA(Dx, Dy, cx, cy, c); - - // Extract integer and fractions of coordinates - int xc = (int)Dx; - Dx -= (double)xc; - int yc = (int)Dy; - Dy -= (double)yc; - - // Convert only valid pixels - if (yc >= 0 && yc < original->getHeight() && xc >= 0 && xc < original->getWidth()) { - - // multiplier for vignetting correction - if (yc > 0 && yc < original->getHeight() - 2 && xc > 0 && xc < original->getWidth() - 2) { - // all interpolation pixels inside image - 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); - 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.) - chTrans[c][y][x] = 0; - } - } - } - } -} - - double ImProcFunctions::getTransformAutoFill (int oW, int oH, const LensCorrection *pLCPMap) const { if (!needsCA() && !needsDistortion() && !needsRotation() && !needsPerspective() && (!params->lensProf.useDist || pLCPMap == nullptr)) { @@ -1500,6 +1429,11 @@ bool ImProcFunctions::needsVignetting () const return params->vignetting.amount; } +bool ImProcFunctions::needsMetadata () const +{ + return params->lensProf.useMetadata(); +} + bool ImProcFunctions::needsLCP () const { return params->lensProf.useLcp(); @@ -1517,9 +1451,8 @@ bool ImProcFunctions::needsTransform (int oW, int oH, int rawRotationDeg, const 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; + return needsCA () || needsDistortion () || needsRotation () || needsPerspective () || needsGradient () || needsPCVignetting () || needsVignetting () || needsLCP() || needsMetadata() || needsLf; } } - diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index e5e90a77f..536b89295 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -345,6 +345,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.BAmet = 2; } } + int minwinnoise = rtengine::min(imwidth, imheight); cp.sigm = params->wavelet.sigma; @@ -355,7 +356,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.resena = params->wavelet.expresid; cp.finena = params->wavelet.expfinal; cp.toningena = params->wavelet.exptoning; - cp.noiseena = params->wavelet.expnoise; + cp.noiseena = params->wavelet.expnoise && minwinnoise > 128;//128 limit for 6 levels wavelet denoise issue 7146 cp.blena = params->wavelet.expbl; cp.chrwav = 0.01f * params->wavelet.chrwav; @@ -434,7 +435,10 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.CHmet = 0; cp.HSmet = false; - if (params->wavelet.CHmethod == "with") { + + if (params->wavelet.CHmethod == "without") { + cp.CHmet = 0; + } else if (params->wavelet.CHmethod == "with") { cp.CHmet = 1; } else if (params->wavelet.CHmethod == "link") { cp.CHmet = 2; @@ -4139,8 +4143,8 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float maxkoeLi, bool lipschitz, float diagacc = 1.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 && waOpacityCurveSH) { + if (cp.HSmet && cp.contena) { + // if (cp.HSmet && cp.contena && waOpacityCurveSH) {//waOpacityCurveSH no long use 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]; diff --git a/rtengine/jdatasrc.cc b/rtengine/jdatasrc.cc index fa13b9dd1..48d428914 100644 --- a/rtengine/jdatasrc.cc +++ b/rtengine/jdatasrc.cc @@ -247,186 +247,13 @@ my_error_exit (j_common_ptr cinfo) #endif } - -#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. - * Applications may override this method to send JPEG messages somewhere - * other than stderr. - * - * On Windows, printing to stderr is generally completely useless, - * so we provide optional code to produce an error-dialog popup. - * Most Windows applications will still prefer to override this routine, - * but if they don't, it'll do something at least marginally useful. - * - * NOTE: to use the library in an environment that doesn't support the - * C stdio library, you may have to delete the call to fprintf() entirely, - * not just not use this routine. - */ - -METHODDEF(void) -output_message (j_common_ptr cinfo) -{ - char buffer[JMSG_LENGTH_MAX]; - - /* Create the message */ - (*cinfo->err->format_message) (cinfo, buffer); - -#ifdef USE_WINDOWS_MESSAGEBOX - /* Display it in a message dialog box */ - MessageBox(GetActiveWindow(), buffer, "JPEG Library Error", - MB_OK | MB_ICONERROR); -#else - /* Send it to stderr, adding a newline */ - fprintf(stderr, "%s\n", buffer); -#endif -} - - -/* - * Decide whether to emit a trace or warning message. - * msg_level is one of: - * -1: recoverable corrupt-data warning, may want to abort. - * 0: important advisory messages (always display to user). - * 1: first level of tracing detail. - * 2,3,...: successively more detailed tracing messages. - * An application might override this method if it wanted to abort on warnings - * or change the policy about which messages to display. - */ - -METHODDEF(void) -emit_message (j_common_ptr cinfo, int msg_level) -{ - struct jpeg_error_mgr * err = cinfo->err; - - if (msg_level < 0) { - /* It's a warning message. Since corrupt files may generate many warnings, - * the policy implemented here is to show only the first warning, - * unless trace_level >= 3. - */ - if (err->num_warnings == 0 || err->trace_level >= 3) { - (*err->output_message) (cinfo); - } - - /* Always count warnings in num_warnings. */ - err->num_warnings++; - } else { - /* It's a trace message. Show it if trace_level >= msg_level. */ - if (err->trace_level >= msg_level) { - (*err->output_message) (cinfo); - } - } -} - - -/* - * Format a message string for the most recent JPEG error or message. - * The message is stored into buffer, which should be at least JMSG_LENGTH_MAX - * characters. Note that no '\n' character is added to the string. - * Few applications should need to override this method. - */ - -METHODDEF(void) -format_message (j_common_ptr cinfo, char * buffer) -{ - struct jpeg_error_mgr * err = cinfo->err; - int msg_code = err->msg_code; - const char * msgtext = nullptr; - const char * msgptr; - char ch; - boolean isstring; - - /* Look up message string in proper table */ - if (msg_code > 0 && msg_code <= err->last_jpeg_message) { - msgtext = err->jpeg_message_table[msg_code]; - } else if (err->addon_message_table != nullptr && - msg_code >= err->first_addon_message && - msg_code <= err->last_addon_message) { - msgtext = err->addon_message_table[msg_code - err->first_addon_message]; - } - - /* Defend against bogus message number */ - if (msgtext == nullptr) { - err->msg_parm.i[0] = msg_code; - msgtext = err->jpeg_message_table[0]; - } - - /* Check for string parameter, as indicated by %s in the message text */ - isstring = FALSE; - msgptr = msgtext; - - while ((ch = *msgptr++) != '\0') { - if (ch == '%') { - if (*msgptr == 's') { - isstring = TRUE; - } - - break; - } - } - - /* Format the message into the passed buffer */ - if (isstring) { - snprintf(buffer, JMSG_LENGTH_MAX, msgtext, err->msg_parm.s); - } else - 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], - err->msg_parm.i[6], err->msg_parm.i[7]); -} - - -/* - * Reset error state variables at start of a new image. - * This is called during compression startup to reset trace/error - * processing to default state, without losing any application-specific - * method pointers. An application might possibly want to override - * this method if it has additional error processing state. - */ - -METHODDEF(void) -reset_error_mgr (j_common_ptr cinfo) -{ - cinfo->err->num_warnings = 0; - /* trace_level is not reset since it is an application-supplied parameter */ - cinfo->err->msg_code = 0; /* may be useful as a flag for "no error" */ -} - - GLOBAL(struct jpeg_error_mgr *) my_jpeg_std_error (struct jpeg_error_mgr * err) { + err = jpeg_std_error(err); + /* override these functions */ err->error_exit = my_error_exit; - err->emit_message = emit_message; - err->output_message = output_message; - err->format_message = format_message; - err->reset_error_mgr = reset_error_mgr; - - err->trace_level = 0; /* default = no tracing */ - err->num_warnings = 0; /* no warnings emitted yet */ - err->msg_code = 0; /* may be useful as a flag for "no error" */ - - /* Initialize message table pointers */ - err->jpeg_message_table = jpeg_std_message_table; - err->last_jpeg_message = (int) JMSG_LASTMSGCODE - 1; - - err->addon_message_table = nullptr; - err->first_addon_message = 0; /* for safety */ - err->last_addon_message = 0; return err; } diff --git a/rtengine/lcp.cc b/rtengine/lcp.cc index 7507bbb11..0947cf709 100644 --- a/rtengine/lcp.cc +++ b/rtengine/lcp.cc @@ -985,11 +985,29 @@ rtengine::LCPMapper::LCPMapper( isFisheye = pProf->isFisheye; } -bool rtengine::LCPMapper::isCACorrectionAvailable() const +bool rtengine::LCPMapper::hasDistortionCorrection() const +{ + // assume lcp always provides distortion correction + return true; +} + +bool rtengine::LCPMapper::hasCACorrection() const { return enableCA; } +bool rtengine::LCPMapper::hasVignettingCorrection() const +{ + // assume lcp always provides vignetting correction + return true; +} + +void rtengine::LCPMapper::correctDistortionAndCA(double &x, double &y, int cx, int cy, int channel) const +{ + correctDistortion(x, y, cx, cy); + correctCA(x, y, cx, cy, channel); +} + void rtengine::LCPMapper::correctDistortion(double &x, double &y, int cx, int cy) const { x += cx; diff --git a/rtengine/lcp.h b/rtengine/lcp.h index b59cc84c6..114131b4a 100644 --- a/rtengine/lcp.h +++ b/rtengine/lcp.h @@ -166,8 +166,13 @@ private: class LensCorrection { public: virtual ~LensCorrection() {} + + virtual bool hasDistortionCorrection() const = 0; + virtual bool hasCACorrection() const = 0; + virtual bool hasVignettingCorrection() const = 0; + + virtual void correctDistortionAndCA(double &x, double &y, int cx, int cy, int channel) 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; virtual void processVignette3Channels(int width, int height, float** rawData) const = 0; @@ -194,8 +199,12 @@ public: ); + bool hasDistortionCorrection() const override; + bool hasCACorrection() const override; + bool hasVignettingCorrection() const override; + + void correctDistortionAndCA(double &x, double &y, int cx, int cy, int channel) 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; void processVignette3Channels(int width, int height, float** rawData) const override; diff --git a/rtengine/lensmetadata.cc b/rtengine/lensmetadata.cc new file mode 100644 index 000000000..89a1ab13b --- /dev/null +++ b/rtengine/lensmetadata.cc @@ -0,0 +1,1043 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2024 Rawtherapee developers + * + * 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 "lensmetadata.h" + +namespace rtengine +{ + +namespace +{ + +/* interpolateLinearSpline does a simple linear spline interpolation. Values + * outside the external knots will return the value of the nearest knot without + * any additional interpolation. */ +double interpolateLinearSpline(const std::vector &xi, const std::vector &yi, double x) +{ + if (x < xi[0]) { + return yi[0]; + } + + for (size_t i = 1; i < xi.size(); i++) { + if (x >= xi[i - 1] && x <= xi[i]) { + double dydx = (yi[i] - yi[i - 1]) / (xi[i] - xi[i - 1]); + + return yi[i - 1] + (x - xi[i - 1]) * dydx; + } + } + + return yi[yi.size() - 1]; +} + +} // namespace + +CenterRadiusMetadataLensCorrection::CenterRadiusMetadataLensCorrection(const FramesMetaData *meta) : + swap_xy(false) +{ + metadata = Exiv2Metadata(meta->getFileName()); + metadata.load(); +} + +void CenterRadiusMetadataLensCorrection::initCorrections(int width, int height, const procparams::CoarseTransformParams &coarse, int rawRotationDeg) +{ + if (rawRotationDeg >= 0) { + int rot = (coarse.rotate + rawRotationDeg) % 360; + swap_xy = (rot == 90 || rot == 270); + if (swap_xy) { + std::swap(width, height); + } + } + + w2 = width * 0.5f; + h2 = height * 0.5f; + rf = 1 / std::sqrt(SQR(w2) + SQR(h2)); +} + +void CenterRadiusMetadataLensCorrection::process(double &x, double &y, int cx, int cy, int channel, bool dist, bool ca) const +{ + double xx = x + cx; + double yy = y + cy; + if (swap_xy) { + std::swap(xx, yy); + } + + double xc = xx - w2; + double yc = yy - h2; + + double rout = rf * std::sqrt(SQR(xc) + SQR(yc)); + double cf = 1; + if (dist && ca) { + cf = distortionAndCACorrectionFactor(rout, channel); + } else if (dist) { + cf = distortionCorrectionFactor(rout); + } else if (ca) { + cf = caCorrectionFactor(rout, channel); + } + + x = cf * xc + w2; + y = cf * yc + h2; + + if (swap_xy) { + std::swap(x, y); + } + x -= cx; + y -= cy; +} + +void CenterRadiusMetadataLensCorrection::correctDistortionAndCA(double &x, double &y, int cx, int cy, int channel) const +{ + if (!hasDistortionCorrection() || !hasCACorrection()) { + return; + } + + process(x, y, cx, cy, channel, true, true); +} + +void CenterRadiusMetadataLensCorrection::correctDistortion(double &x, double &y, int cx, int cy) const +{ + if (!hasDistortionCorrection()) { + return; + } + + process(x, y, cx, cy, 1, true, false); +} + +void CenterRadiusMetadataLensCorrection::correctCA(double &x, double &y, int cx, int cy, int channel) const +{ + if (!hasCACorrection()) { + return; + } + + process(x, y, cx, cy, channel, false, true); +} + +void CenterRadiusMetadataLensCorrection::processVignetteNChannels(int width, int height, float **rawData, int channels) const +{ + if (!hasVignettingCorrection()) { + return; + } + + for (int y = 0; y < height; ++y) { + for (int x = 0; x < width; ++x) { + double xc = x - w2; + double yc = y - h2; + double sf = vignettingCorrectionFactor(rf * std::sqrt(SQR(xc) + SQR(yc))); + for (int c = 0; c < channels; c++) { + rawData[y][x + c] *= sf; + } + } + } +} + +void CenterRadiusMetadataLensCorrection::processVignette(int width, int height, float **rawData) const +{ + return processVignetteNChannels(width, height, rawData, 1); +} + +void CenterRadiusMetadataLensCorrection::processVignette3Channels(int width, int height, float **rawData) const +{ + return processVignetteNChannels(width, height, rawData, 3); +} + +/* Fuji, Sony, Olympus metadata handling and algorithms adapted from + * - src/iop/lens.cc + * - src/common/exif.cc + * in darktable 4.6 */ +/* + This file is part of darktable, + Copyright (C) 2019-2024 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 . +*/ + +class SonyMetadataLensCorrection : public CenterRadiusMetadataLensCorrection +{ +public: + SonyMetadataLensCorrection(const FramesMetaData *meta) : + CenterRadiusMetadataLensCorrection(meta) + { + parse(); + setup(); + } + +private: + int nc; + std::array distortion; + std::array ca_r; + std::array ca_b; + std::array vignetting; + + std::vector knots; + std::vector dist; + std::array, 3> ca; + std::vector vig; + + void parse() + { + if (Exiv2::versionNumber() < EXIV2_MAKE_VERSION(0, 27, 4)) { + throw std::runtime_error("cannot get Sony correction data, too old exiv2 version " + Exiv2::versionString()); + } + + auto &exif = metadata.exifData(); + + auto posd = exif.findKey(Exiv2::ExifKey("Exif.SubImage1.DistortionCorrParams")); + auto posc = exif.findKey(Exiv2::ExifKey("Exif.SubImage1.ChromaticAberrationCorrParams")); + auto posv = exif.findKey(Exiv2::ExifKey("Exif.SubImage1.VignettingCorrParams")); + + /* Sony metadata corrections parameters define some splines with N knots */ + if (posd == exif.end() || posc == exif.end() || posv == exif.end()) { + throw std::runtime_error("cannot get Sony correction data"); + } + + const int nc = to_long(posd); + if (nc <= 16 && 2 * nc == to_long(posc) && nc == to_long(posv)) { + this->nc = nc; + for (int i = 0; i < nc; i++) { + distortion[i] = to_long(posd, i + 1); + ca_r[i] = to_long(posc, i + 1); + ca_b[i] = to_long(posc, nc + i + 1); + vignetting[i] = to_long(posv, i + 1); + } + } else { + throw std::runtime_error("cannot get Sony correction data"); + } + } + + void setup() + { + knots.resize(nc); + dist.resize(nc); + vig.resize(nc); + for (int i = 0; i < 3; ++i) { + ca[i].resize(nc); + } + + for (int i = 0; i < this->nc; i++) { + knots[i] = (i + 0.5) / (nc - 1); + + dist[i] = distortion[i] * powf(2, -14) + 1; + + ca[0][i] = ca[1][i] = ca[2][i] = 1.f; + ca[0][i] *= ca_r[i] * powf(2, -21) + 1; + ca[2][i] *= ca_b[i] * powf(2, -21) + 1; + + vig[i] = 1 / powf(2, 0.5f - powf(2, vignetting[i] * powf(2, -13) - 1)); + } + } + + double distortionCorrectionFactor(double rout) const override + { + return interpolateLinearSpline(knots, dist, rout); + } + + double caCorrectionFactor(double rout, int channel) const override + { + return interpolateLinearSpline(knots, ca[channel], rout); + } + + double distortionAndCACorrectionFactor(double rout, int channel) const override + { + return distortionCorrectionFactor(rout) * caCorrectionFactor(rout, channel); + } + + double vignettingCorrectionFactor(double r) const override + { + return interpolateLinearSpline(knots, vig, r); + } + + bool hasDistortionCorrection() const override { return true; } + bool hasVignettingCorrection() const override { return true; } + bool hasCACorrection() const override { return true; } +}; + +class FujiMetadataLensCorrection : public CenterRadiusMetadataLensCorrection +{ +public: + FujiMetadataLensCorrection(const FramesMetaData *meta) : + CenterRadiusMetadataLensCorrection(meta) + { + parse(); + setup(); + } + +private: + const static int MAXKNOTS = 16; + + int nc; + double cropf; + + std::array fuji_knots; + std::array fuji_distortion; + std::array fuji_ca_r; + std::array fuji_ca_b; + std::array fuji_vignetting; + + std::vector knots_dist; + std::vector dist; + std::array, 3> ca; + std::vector knots_vig; + std::vector vig; + + void parse() + { + if (Exiv2::versionNumber() < EXIV2_MAKE_VERSION(0, 27, 4)) { + throw std::runtime_error("cannot get Fuji correction data, too old exiv2 version " + Exiv2::versionString()); + } + + auto &exif = metadata.exifData(); + + /* FujiFilm metadata corrections parameters define some splines with N knots */ + auto posd = exif.findKey(Exiv2::ExifKey("Exif.Fujifilm.GeometricDistortionParams")); + auto posc = exif.findKey(Exiv2::ExifKey("Exif.Fujifilm.ChromaticAberrationParams")); + auto posv = exif.findKey(Exiv2::ExifKey("Exif.Fujifilm.VignettingParams")); + + // X-Trans IV/V + if (posd != exif.end() && posc != exif.end() && posv != exif.end() && + posd->count() == 19 && posc->count() == 29 && posv->count() == 19) { + const int nc = 9; + this->nc = nc; + + for (int i = 0; i < nc; i++) { + const float kd = posd->toFloat(i + 1); + const float kc = posc->toFloat(i + 1); + const float kv = posv->toFloat(i + 1); + + // Check that the knots position is the same for distortion, ca and vignetting, + if (kd != kc || kd != kv) { + throw std::runtime_error("cannot get Fuji correction data: unexpected data"); + } + + fuji_knots[i] = kd; + fuji_distortion[i] = posd->toFloat(i + 10); + fuji_ca_r[i] = posc->toFloat(i + 10); + fuji_ca_b[i] = posc->toFloat(i + 19); + fuji_vignetting[i] = posv->toFloat(i + 10); + } + + // Account for the 1.25x crop modes in some Fuji cameras + auto it = exif.findKey(Exiv2::ExifKey("Exif.Fujifilm.CropMode")); + + if (it != exif.end() && (to_long(it) == 2 || to_long(it) == 4)) { + cropf = 1.25f; + } else { + cropf = 1; + } + } + // X-Trans I/II/III + else if (posd != exif.end() && posc != exif.end() && posv != exif.end() && + posd->count() == 23 && posc->count() == 31 && posv->count() == 23) { + const int nc = 11; + this->nc = nc; + + for (int i = 0; i < nc; i++) { + const float kd = posd->toFloat(i + 1); + float kc = 0; + // ca data doesn't provide first knot (0) + if (i != 0) kc = posc->toFloat(i); + const float kv = posv->toFloat(i + 1); + // check that the knots position is the same for distortion, ca and vignetting, + if (kd != kc || kd != kv) { + throw std::runtime_error("cannot get Fuji correction data: unexpected data"); + } + + fuji_knots[i] = kd; + fuji_distortion[i] = posd->toFloat(i + 12); + + // ca data doesn't provide first knot (0) + if (i == 0) { + fuji_ca_r[i] = 0; + fuji_ca_b[i] = 0; + } else { + fuji_ca_r[i] = posc->toFloat(i + 10); + fuji_ca_b[i] = posc->toFloat(i + 20); + } + fuji_vignetting[i] = posv->toFloat(i + 12); + } + + // Account for the 1.25x crop modes in some Fuji cameras + auto it = exif.findKey(Exiv2::ExifKey("Exif.Fujifilm.CropMode")); + + if (it != exif.end() && (to_long(it) == 2 || to_long(it) == 4)) { + cropf = 1.25f; + } else { + cropf = 1; + } + } else { + throw std::runtime_error("cannot get Fuji correction data"); + } + } + + void setup() + { + std::vector knots_in; + std::vector distortion_in; + std::vector ca_r_in; + std::vector ca_b_in; + + // add a knot with no corrections at 0 value if not existing + int size = nc; + if (fuji_knots[0] > 0.f) { + knots_in.push_back(0); + distortion_in.push_back(1); + ca_r_in.push_back(0); + ca_b_in.push_back(0); + + knots_vig.push_back(0); + vig.push_back(1); + + size++; + } + + knots_in.reserve(size); + vig.reserve(size); + + for (int i = 0; i < nc; i++) { + knots_in.push_back(cropf * fuji_knots[i]); + distortion_in.push_back(fuji_distortion[i] / 100 + 1); + ca_r_in.push_back(fuji_ca_r[i]); + ca_b_in.push_back(fuji_ca_b[i]); + + // vignetting correction is applied before distortion correction. So the + // spline is related to the source image before distortion. + knots_vig.push_back(cropf * fuji_knots[i]); + + vig.push_back(100 / fuji_vignetting[i]); + } + + knots_dist.resize(MAXKNOTS); + dist.resize(MAXKNOTS); + for (int i = 0; i < 3; ++i) { + ca[i].resize(MAXKNOTS); + } + + // convert from spline related to source image (input is source image + // radius) to spline related to dest image (input is dest image radius) + for (int i = 0; i < MAXKNOTS; i++) { + const double rin = static_cast(i) / static_cast(nc - 1); + const double m = interpolateLinearSpline(knots_in, distortion_in, rin); + const double r = rin / m; + knots_dist[i] = r; + + dist[i] = m; + + const double mcar = interpolateLinearSpline(knots_in, ca_r_in, rin); + const double mcab = interpolateLinearSpline(knots_in, ca_b_in, rin); + + ca[0][i] = ca[1][i] = ca[2][i] = 1.f; + ca[0][i] *= mcar + 1; + ca[2][i] *= mcab + 1; + } + } + + double distortionCorrectionFactor(double rout) const override + { + return interpolateLinearSpline(knots_dist, dist, rout); + } + + double caCorrectionFactor(double rout, int channel) const override + { + return interpolateLinearSpline(knots_dist, ca[channel], rout); + } + + double distortionAndCACorrectionFactor(double rout, int channel) const override + { + return distortionCorrectionFactor(rout) * caCorrectionFactor(rout, channel); + } + + double vignettingCorrectionFactor(double r) const override + { + return interpolateLinearSpline(knots_vig, vig, r); + } + + bool hasDistortionCorrection() const override { return true; } + bool hasVignettingCorrection() const override { return true; } + bool hasCACorrection() const override { return true; } +}; + +class OlympusMetadataLensCorrection : public CenterRadiusMetadataLensCorrection +{ +public: + OlympusMetadataLensCorrection(const FramesMetaData *meta) : + CenterRadiusMetadataLensCorrection(meta), has_dist(false), has_ca(false) + { + parse(); + } + +private: + bool has_dist, has_ca; + + double drs; + double dk2; + double dk4; + double dk6; + + double car0; + double car2; + double car4; + double cab0; + double cab2; + double cab4; + + void parse() + { + if (Exiv2::versionNumber() < EXIV2_MAKE_VERSION(0, 27, 4)) { + throw std::runtime_error("cannot get Olympus correction data, too old exiv2 version " + Exiv2::versionString()); + } + + auto &exif = metadata.exifData(); + + std::array distortion; + std::array cacorr; + + auto it = exif.findKey(Exiv2::ExifKey("Exif.OlympusIp.0x150a")); + if (it != exif.end() && it->count() == 4) { + for (int i = 0; i < 4; ++i) { + distortion[i] = it->toFloat(i); + } + has_dist = true; + } + + it = exif.findKey(Exiv2::ExifKey("Exif.OlympusIp.0x150c")); + if (it != exif.end() && it->count() == 6) { + for (int i = 0; i < 6; ++i) { + cacorr[i] = it->toFloat(i); + } + has_ca = true; + } + + if (has_dist) { + drs = distortion[3]; + dk2 = distortion[0]; + dk4 = distortion[1]; + dk6 = distortion[2]; + } + + if (has_ca) { + car0 = cacorr[0]; + car2 = cacorr[1]; + car4 = cacorr[2]; + cab0 = cacorr[3]; + cab2 = cacorr[4]; + cab4 = cacorr[5]; + } + + if (!has_dist && !has_ca) { + throw std::runtime_error("no Olympus correction data"); + } + } + + double distortionCorrectionFactor(double rout) const override + { + // The distortion polynomial maps a radius Rout in the output + // (undistorted) image, where the corner is defined as Rout=1, to a + // radius in the input (distorted) image, where the corner is defined + // as Rin=1. + // Rin = Rout*drs * (1 + dk2 * (Rout*drs)^2 + dk4 * (Rout*drs)^4 + dk6 * (Rout*drs)^6) + // + // cf is Rin / Rout. + + const double rs2 = std::pow(rout * drs, 2); + const double cf = drs * (1 + rs2 * (dk2 + rs2 * (dk4 + rs2 * dk6))); + + return cf; + } + + double caCorrectionFactor(double rout, int channel) const override + { + // ca corrects only red and blue channel + if (channel != 0 && channel != 2) return 1; + + // CA correction is applied as: + // Rin = Rout * ((1 + car0) + car2 * Rout^2 + car4 * Rout^4) + // + // cf is Rin / Rout. + + const double r2 = powf(rout, 2); + if (channel == 0) { + return 1 + (car0 + r2 * (car2 + r2 * car4)); + } else if (channel == 2) { + return 1 + (cab0 + r2 * (cab2 + r2 * cab4)); + } + + return 1; + } + + double distortionAndCACorrectionFactor(double rout, int channel) const override + { + return distortionCorrectionFactor(rout) * caCorrectionFactor(rout, channel); + } + + double vignettingCorrectionFactor(double r) const override + { + return 1; + } + + bool hasDistortionCorrection() const override { return has_dist; } + // Olympus cameras have a shading correction option that fixes vignetting + // already in the raw file. Looks like they don't report vignetting + // correction parameters inside metadata even if shading correction is + // disabled. + bool hasVignettingCorrection() const override { return false; } + bool hasCACorrection() const override { return has_ca; } +}; + +/* Panasonic metadata lens correction + * Currently disabled since the algorithm is not stable and works well with only some lenses. + * + * Data extraction and distortion correction formula from: + * https://web.archive.org/web/20120701131817/https://syscall.eu/#pana + * + * TODO(sgotti) + * * CA corrections not yet reverse engineered. + * * From a post on the exiftool forum: + * https://exiftool.org/forum/index.php?topic=9366.0 + * looks like there's another additional tag that provides similar data and it's + * used by newer cameras. + */ +class PanasonicMetadataLensCorrection : public CenterRadiusMetadataLensCorrection +{ +public: + PanasonicMetadataLensCorrection(const FramesMetaData *meta) : + CenterRadiusMetadataLensCorrection(meta), has_dist(false), a(0), b(0), c(0) + { + // Currently disabled since the algorithm is not stable and works well with only some lenses. + throw std::runtime_error("panasonic correction disabled as it's not yet working properly"); + + // parse(); + } + +private: + bool has_dist; + double scale, a, b, c; + + void parse() + { + if (Exiv2::versionNumber() < EXIV2_MAKE_VERSION(0, 27, 4)) { + throw std::runtime_error("cannot get Panasonic correction data, too old exiv2 version " + Exiv2::versionString()); + } + + auto &exif = metadata.exifData(); + + auto it = exif.findKey(Exiv2::ExifKey("Exif.PanasonicRaw.0x0119")); + if (it != exif.end()) { + std::vector buf; + buf.resize(it->value().size()); + it->value().copy(buf.data(), Exiv2::littleEndian); + + const Exiv2::byte *data = buf.data(); + // n is currently unused + // uint32_t n = Exiv2::getShort(data + 24, Exiv2::littleEndian); + scale = 1.0f / (1.0f + Exiv2::getShort(data + 10, Exiv2::littleEndian) / 32768.0f); + a = Exiv2::getShort(data + 16, Exiv2::littleEndian) / 32768.0f; + b = Exiv2::getShort(data + 8, Exiv2::littleEndian) / 32768.0f; + c = Exiv2::getShort(data + 22, Exiv2::littleEndian) / 32768.0f; + + has_dist = true; + } + } + + double distortionCorrectionFactor(double rout) const override + { + const double rs2 = std::pow(rout, 2); + + const double rin = scale * rout * (1 + rs2 * (a + rs2 * (b + rs2 * c))); + const double cf = rout / rin; + + return cf; + } + + double caCorrectionFactor(double rout, int channel) const override + { + return 1; + } + + double distortionAndCACorrectionFactor(double rout, int channel) const override + { + return distortionCorrectionFactor(rout); + } + + double vignettingCorrectionFactor(double r) const override + { + return 1; + } + + bool hasDistortionCorrection() const override { return has_dist; } + // Panasonic cameras have a shading correction option that fixes vignetting + // already in the raw file. Looks like they don't report vignetting + // correction parameters inside metadata even if shading correction is + // disabled. + bool hasVignettingCorrection() const override { return false; } + bool hasCACorrection() const override { return false; } +}; + +// Class DNGMetadatalensCorrection handles OpcodeList3 operations: operations to +// be done after demosaicing. +// OpcodeList1 is already handled by rawimagesource.cc. OpcodeList2 is not yet +// handled by rawtherapee. +// TODO(sgotti): dng spec provides clear rules on how and when to process the +// various opcodeList1/2/3 and the order of the various operations that should +// be done. +// Currently we only handle a subset of all the available opcodes and only one +// WarpRectilinar for distortion and FixVignetteRadial for vignetting (that's +// usually the case with Leica DNGs and ADC generated DNGs). +// This should be extended to support more exotic operations lists (i.e. +// multiple WarpRectilinear) +class DNGMetadataLensCorrection : public MetadataLensCorrection +{ +public: + DNGMetadataLensCorrection(const FramesMetaData *meta) : + MetadataLensCorrection(), swap_xy(false) + { + metadata = Exiv2Metadata(meta->getFileName()); + metadata.load(); + + parse(); + } + +private: + Exiv2Metadata metadata; + + bool swap_xy; + int width, height; + + double crx_d; + double cry_d; + double crx_v; + double cry_v; + + double cx_d; + double cy_d; + double m_v; + + double cx_v; + double cy_v; + double m_d; + + int planes; + + bool has_dist, has_ca, has_vign; + std::array, 3> warp_rectilinear; + std::array vignette_radial; + + void initCorrections(int width, int height, const procparams::CoarseTransformParams &coarse, int rawRotationDeg) override + { + if (rawRotationDeg >= 0) { + int rot = (coarse.rotate + rawRotationDeg) % 360; + swap_xy = (rot == 90 || rot == 270); + if (swap_xy) { + std::swap(width, height); + } + } + + this->width = width; + this->height = height; + + setup(); + } + + void parse() + { + std::set processed_opcodes; + + has_dist = has_ca = has_vign = false; + + auto &exif = metadata.exifData(); + + auto it = exif.findKey(Exiv2::ExifKey("Exif.SubImage1.OpcodeList3")); + + if (it != exif.end()) { + std::vector buf; + buf.resize(it->value().size()); + it->value().copy(buf.data(), Exiv2::invalidByteOrder); + + const Exiv2::byte *data = buf.data(); + uint32_t num_entries = Exiv2::getULong(data, Exiv2::bigEndian); + size_t idx = 4; + + for (size_t i = 0; i < num_entries && idx < buf.size(); ++i) { + uint32_t opcodeID = Exiv2::getULong(data + idx, Exiv2::bigEndian); + idx += 4; + idx += 4; // version + uint32_t flags = Exiv2::getULong(data + idx, Exiv2::bigEndian); + idx += 4; + size_t paramSize = Exiv2::getULong(data + idx, Exiv2::bigEndian); + idx += 4; + + if (idx + paramSize > buf.size()) { + throw std::runtime_error("error parsing DNG OpcodeList3"); + } + + if (processed_opcodes.find(opcodeID) != processed_opcodes.end()) { + // we currently handle only one opcode per type and ignore next ones if provided. + if (settings->verbose) { + std::printf("DNG OpcodeList3 %s opcode %d already processed\n", flags & 1 ? "optional" : "mandatory", opcodeID); + } + + idx += paramSize; + continue; + } + + processed_opcodes.insert(opcodeID); + + // we currently handle only one dist correction + if (opcodeID == 1 && !has_dist) { // WarpRectilinear + + planes = Exiv2::getULong(data + idx, Exiv2::bigEndian); + + if ((planes != 1) && (planes != 3)) { + throw std::runtime_error("cannot parse DNG WarpRectilinear"); + } + + for (int p = 0; p < planes; p++) { + for (int i = 0; i < 6; i++) { + warp_rectilinear[p][i] = Exiv2::getDouble(data + idx + 4 + 8 * (i + p * 6), Exiv2::bigEndian); + } + } + + crx_d = Exiv2::getDouble(data + idx + 4 + 8 * (0 + planes * 6), Exiv2::bigEndian); + cry_d = Exiv2::getDouble(data + idx + 4 + 8 * (1 + planes * 6), Exiv2::bigEndian); + + has_dist = true; + if (planes == 3) { + has_ca = true; + } + + // we currently handle only one vignetting correction + } else if (opcodeID == 3 && !has_vign) { // FixVignetteRadial + size_t start = idx; + size_t end = idx + 7 * 8; + if (end > buf.size()) { + throw std::runtime_error("cannot parse DNG FixVignetteRadial"); + } + for (int j = 0; j < 5; j++) { + vignette_radial[j] = Exiv2::getDouble(data + start, Exiv2::bigEndian); + start += 8; + } + crx_v = Exiv2::getDouble(data + start, Exiv2::bigEndian); + start += 8; + cry_v = Exiv2::getDouble(data + start, Exiv2::bigEndian); + has_vign = true; + + } else { + if (settings->verbose) { + std::printf("DNG OpcodeList3 has unsupported %s opcode %d\n", flags & 1 ? "optional" : "mandatory", opcodeID); + } + } + + idx += paramSize; + } + } + + if (!has_dist && !has_vign) { + throw std::runtime_error("no known DNG correction data"); + } + } + + void setup() + { + cx_d = crx_d * width; + cy_d = cry_d * height; + cx_v = crx_v * width; + cy_v = cry_v * height; + double mx_d = std::max(cx_d, width - cx_d); + double my_d = std::max(cy_d, height - cy_d); + m_d = std::sqrt(SQR(mx_d) + SQR(my_d)); + double mx_v = std::max(cx_v, width - cx_v); + double my_v = std::max(cy_v, height - cy_v); + m_v = std::sqrt(SQR(mx_v) + SQR(my_v)); + } + + void correctPlaneDistortion(double &x, double &y, int cx, int cy, int plane) const + { + if (plane < 0 || plane > 2 || plane > planes) { + return; + } + + double xx = x + cx; + double yy = y + cy; + if (swap_xy) { + std::swap(xx, yy); + } + + const double cx1 = cx_d; + const double cy1 = cy_d; + const double m = m_d; + + const double dx = (xx - cx1) / m; + const double dy = (yy - cy1) / m; + const double dx2 = SQR(dx); + const double dy2 = SQR(dy); + const double r2 = dx2 + dy2; + const double f = warp_rectilinear[plane][0] + r2 * (warp_rectilinear[plane][1] + r2 * (warp_rectilinear[plane][2] + r2 * warp_rectilinear[plane][3])); + const double dx_r = f * dx; + const double dy_r = f * dy; + const double dxdy2 = 2 * dx * dy; + const double dx_t = warp_rectilinear[plane][4] * dxdy2 + warp_rectilinear[plane][5] * (r2 + 2 * dx2); + const double dy_t = warp_rectilinear[plane][5] * dxdy2 + warp_rectilinear[plane][4] * (r2 + 2 * dy2); + + x = cx1 + m * (dx_r + dx_t); + y = cy1 + m * (dy_r + dy_t); + + if (swap_xy) { + std::swap(x, y); + } + x -= cx; + y -= cy; + } + + void correctDistortionAndCA(double &x, double &y, int cx, int cy, int channel) const override + { + if (!hasDistortionCorrection() || !hasCACorrection()) { + return; + } + + correctPlaneDistortion(x, y, cx, cy, channel); + } + + void correctDistortion(double &x, double &y, int cx, int cy) const override + { + if (!hasDistortionCorrection()) { + return; + } + + int plane = 1; // 3 planes correction, use plane 1 (green) + if (planes == 1) { + plane = 0; // 1 single plane correction + } + + correctPlaneDistortion(x, y, cx, cy, plane); + } + + void correctCA(double &x, double &y, int cx, int cy, int channel) const override + { + if (!hasCACorrection()) { + return; + } + + // we use plane 0 (red) and plane 2 (blue) for ca correction + if (channel != 0 && channel != 2) return; + if (planes != 3) return; + + double xgreen = x, ygreen = y; + correctPlaneDistortion(xgreen, ygreen, cx, cy, 1); + + double xch = x, ych = y; + correctPlaneDistortion(xch, ych, cx, cy, channel); + + // Calculate diff from green plane + x += xch - xgreen; + y += ych - ygreen; + } + + void processVignetteNChannels(int width, int height, float **rawData, int channels) const + { + if (!hasVignettingCorrection()) { + return; + } + + const double cx = cx_v; + const double cy = cy_v; + const double m2 = 1.f / SQR(m_v); + + for (int y = 0; y < height; ++y) { + for (int x = 0; x < width; ++x) { + const double r2 = m2 * (SQR(x - cx) + SQR(y - cy)); + const double g = 1.f + r2 * (vignette_radial[0] + r2 * (vignette_radial[1] + r2 * (vignette_radial[2] + r2 * (vignette_radial[3] + r2 * vignette_radial[4])))); + for (int c = 0; c < channels; ++c) { + rawData[y][x*channels + c] *= g; + } + } + } + } + + void processVignette(int width, int height, float **rawData) const override + { + return processVignetteNChannels(width, height, rawData, 1); + } + + void processVignette3Channels(int width, int height, float **rawData) const override + { + return processVignetteNChannels(width, height, rawData, 3); + } + + bool isCACorrectionAvailable() const + { + return hasCACorrection(); + } + + bool hasDistortionCorrection() const override { return has_dist; } + bool hasVignettingCorrection() const override { return has_vign; } + bool hasCACorrection() const override { return has_ca; } +}; + +std::unique_ptr MetadataLensCorrectionFinder::findCorrection(const FramesMetaData *meta) +{ + static const std::unordered_set makers = { + "SONY", + "FUJIFILM", + "OLYMPUS", + "OM DIGITAL SOLUTIONS", + "PANASONIC", + }; + + std::string make = Glib::ustring(meta->getMake()).uppercase(); + + if (!meta->getDNG() && makers.find(make) == makers.end()) { + return nullptr; + } + + std::unique_ptr correction; + + try { + if (meta->getDNG()) { + correction.reset(new DNGMetadataLensCorrection(meta)); + } else if (make == "SONY") { + correction.reset(new SonyMetadataLensCorrection(meta)); + } else if (make == "FUJIFILM") { + correction.reset(new FujiMetadataLensCorrection(meta)); + } else if (make == "OLYMPUS" || make == "OM DIGITAL SOLUTIONS") { + correction.reset(new OlympusMetadataLensCorrection(meta)); + } else if (make == "PANASONIC") { + correction.reset(new PanasonicMetadataLensCorrection(meta)); + } + } catch (std::exception &exc) { + if (settings->verbose) { + std::cerr << "error parsing lens metadata: " << exc.what() << std::endl; + } + + correction.reset(nullptr); + } + + return correction; +} + +} // namespace rtengine diff --git a/rtengine/lensmetadata.h b/rtengine/lensmetadata.h new file mode 100644 index 000000000..ac042b7ce --- /dev/null +++ b/rtengine/lensmetadata.h @@ -0,0 +1,89 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2024 Rawtherapee developers + * + * 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 "lcp.h" +#include "metadata.h" +#include "procparams.h" +#include "rtengine.h" + +namespace rtengine +{ + +/* MetadataLensCorrection is an abstract class for various lens correction based on raw file metadata + this metadata is vendor dependent */ +class MetadataLensCorrection : public LensCorrection, + public NonCopyable +{ +public: + virtual void initCorrections(int width, int height, const procparams::CoarseTransformParams &coarse, int rawRotationDeg) = 0; +}; + +/* CenterRadiusMetadataLensCorrection is an abstract class the extends MetadataLensCorrection to easily handle center radius based corrections */ +class CenterRadiusMetadataLensCorrection : public MetadataLensCorrection +{ +public: + CenterRadiusMetadataLensCorrection(const FramesMetaData *meta); + + void process(double &x, double &y, int cx, int cy, int channel, bool dist, bool ca) const; + + void correctDistortionAndCA(double &x, double &y, int cx, int cy, int channel) const override; + void correctDistortion(double &x, double &y, int cx, int cy) 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; + void processVignette3Channels(int width, int height, float **rawData) const override; + + void processVignetteNChannels(int width, int height, float **rawData, int channels) const; + void initCorrections(int width, int height, const procparams::CoarseTransformParams &coarse, int rawRotationDeg) override; + + /* Implementers should implement the below methods */ + virtual bool hasDistortionCorrection() const override = 0; + virtual bool hasCACorrection() const override = 0; + virtual bool hasVignettingCorrection() const override = 0; + + /* These methods should return the distortion correction factor (cf) for the + * provided radius rout (radius of the output image (corrected)). + * So rin = rout * cf + * */ + virtual double distortionCorrectionFactor(double rout) const = 0; + virtual double caCorrectionFactor(double rout, int channel) const = 0; + virtual double distortionAndCACorrectionFactor(double rout, int channel) const = 0; + + /* This methods should return the vignetting correction factor (cf) for the + * provided radius */ + virtual double vignettingCorrectionFactor(double r) const = 0; + +protected: + bool swap_xy; + double w2; + double h2; + double rf; + Exiv2Metadata metadata; +}; + +/* MetadataLensCorrectionFinder tries to find and return MetadataLensCorrection for the provided metadata */ +class MetadataLensCorrectionFinder +{ +public: + static std::unique_ptr findCorrection(const FramesMetaData *meta); +}; + +} // namespace rtengine diff --git a/rtengine/libraw.README b/rtengine/libraw.README new file mode 100644 index 000000000..1070cd2cd --- /dev/null +++ b/rtengine/libraw.README @@ -0,0 +1,7 @@ +To upgrade the internal copy of LibRaw, + +1. Find the commit hash of the version you are upgrading to. LibRaw tags releases. For snapshots, search the commits in the master branch. +2. cd into the root of this repository. +3. Run 'git subtree --squash -P rtengine/libraw/ pull https://github.com/LibRaw/LibRaw.git '. This will use the git subtree pull command to merge all commits up to from the LibRaw GitHub repository. The --squash option squashes the commits to make the commit history cleaner. The '-P rtengine/libraw/' tells git subtree where the LibRaw project is located in this repository. +4. Fix any merge conflicts. Remember to commit the merge. +5. git subtree will create two commits. The first is the squashed commit. The second is a merge commit. Edit the merge commit message and add the message 'Upgrade LibRaw to .', where is the LibRaw version ('0.21.2' or 'snapshot 202403', for example). If there are merge conflicts, you can add the message before committing. If there are no merge conflicts or if you forgot to add the message, use 'git commit --amend' to edit the message. diff --git a/rtengine/libraw/.clang-format b/rtengine/libraw/.clang-format new file mode 100644 index 000000000..d01efd4b3 --- /dev/null +++ b/rtengine/libraw/.clang-format @@ -0,0 +1,4 @@ +BreakBeforeBraces: Allman +ColumnLimit: 120 +SortIncludes: false +TabWidth: 4 diff --git a/rtengine/libraw/COPYRIGHT b/rtengine/libraw/COPYRIGHT new file mode 100644 index 000000000..3c6f41246 --- /dev/null +++ b/rtengine/libraw/COPYRIGHT @@ -0,0 +1,27 @@ + ** LibRaw: Raw images processing library ** + +Copyright (C) 2008-2024 LibRaw LLC (http://www.libraw.org, info@libraw.org) + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + +LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, +dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. +LibRaw do not use RESTRICTED code from dcraw.c + +LibRaw uses DCB demosaic and FBDD denoise licensed under BSD-like 3-clause license +DCB and FBDD are Copyright (C) 2010, Jacek Gozdz (cuniek@kft.umcs.lublin.pl) + +LibRaw uses X3F library to unpack Foveon Files, licensed BSD-style license +Copyright (c) 2010, Roland Karlsson (roland@proxel.se) +All rights reserved. + +LibRaw uses pieces of code from Adobe DNG SDK 1.4, +Copyright (c) 2005 Adobe Systems Incorporated, licensed under MIT license + diff --git a/rtengine/libraw/Changelog.txt b/rtengine/libraw/Changelog.txt new file mode 100644 index 000000000..50fb003b5 --- /dev/null +++ b/rtengine/libraw/Changelog.txt @@ -0,0 +1,2848 @@ +2024-03-30 Alex Tutubalin + + LibRaw-snapshot-202403 + + * Raw format support + 1) Panasonic encoding 8 + + 2) Sony YCC (Medium/Small compression) pseudo-RAW support: + -- normal processing (3-channel RGB output) + -- or YCbCr output if LIBRAW_RAWSPECIAL_SRAW_NO_RGB bit is set + in imgdata.rawparams.specials (one may specify the + LIBRAW_RAWSPECIAL_SRAW_NO_INTERPOLATE flag too avoid Cb/Cr interpolation) + Note: if YCbCr is selected, Cb/Cr neutral points are adjusted to 8192 + (to fit histogram/range area of the Y channel) + -- RAW (pseudo-RAW) data is already white balanced, so + imgdata.color.as_shot_wb_applied is set to + LIBRAW_ASWB_APPLIED | LIBRAW_ASWB_SONY + + 3) DNG 1.7 (including JPEG-XL compression) support via Adobe DNG SDK 1.7.x integration + + 4) Canon CRN files: embedded RAW extracted + + * Camera support + - Canon EOS R6 Mark II, EOS R8, EOS R50, EOS R100, EOS Ra + - Fujifilm GFX100-II, X-T5, X-S20, X-H2, X-H2S: support of files with wrong metadata (pre 1.03 fw) + - GoPro HERO11, HERO12 (via GoPro SDK) + - Hasselblad X2D-100c + - Leica Q3, M11 Monochrom + - Nikon Z30, Z8 (HE/HE* formats are not supported) + - OM Digital OM-5 + - Panasonic DC-G9 II, DC-ZS200D / ZS220D, DC-TZ200D / TZ202D / TZ220D, DC-S5-II, DC-GH6 + - Sony A7C-II, A7CR, ILCE-6700, ZV-1M2, ZV-E1, ILCE-7RM5 (A7R-V), ILME-FX30, + A1: support for files damaged by exiftool + - Multiple DJI and Skydio drones + - tested with multiple smartphones with DNG format recorded. + + * Sony DSC-HX95: improved metadata parsing + + * Better support for cropped images from latest Fujifilm cameras + (X-H2, X-H2S, X-T5) + + * As planned in LibRaw snapshot 202101 release notes, OLD_VIDEOCAMS + support is dropped. + These cameras are no longer supported: + - old RED Cine cameras + - Canon C500 + - ARRI video/digital cinema cameras + + * JPEG-XL previews (DNG 1.7) support: + - new bit for imgdata.rawparams.options: LIBRAW_RAWOPTIONS_ALLOW_JPEGXL_PREVIEWS (not set by default) + - if the bit is set, LibRaw will perceive such previews in the same way as JPEG ones + (largest preview is selected by default, etc). + - tformat field for such preview is set to LIBRAW_THUMBNAIL_JPEGXL + - image metadata (width/height/channels count) is not parsed for JPEG-XL previews + + * New patch for RawSpeed3: 05.no-phase-one-correction.patch + this patch disables RawSpeed's PhaseOne flat field correction (not needed because + LibRaw uses own P1-metadata based correction) + + * RawSpeed3/PhaseOne compressed files: scale unpacked data to match camer black level data. + + * New imgdata.params.use_p1_correction parameter + If set to non-zero (default): PhaseOne compressed files will be corrected (linearization; defect mapping) + based on metadata contained in file. + + * New possible bit in imgdata.process_warnings: LIBRAW_WARN_VENDOR_CROP_SUGGESTED + If set: unknown/untested RAW image frame size passed to LibRaw, cropping may be incorrect. + It is suggested to use LibRaw::adjust_to_raw_inset_crop(1) for vendor specified crop. + + * Better handling of DNG RAW Previews with Stage2 opcodes + + * Added imgdata.makernotes.sony.AspectRatio field + - if parsed: contains aspect ratio (width to height) + - if not parsed: initialized to -999.f + + * Nikon Z8/HLG mode: do not add 10 bit/unknown format thumbnails to the thumb_list + + * Canon CR2 16-bit bitmap previes: do not convert from Kodak colorspace + + * New compile-defined limit LIBRAW_MAX_PROFILE_SIZE_MB: + limits allocation/read size for embedded color profile (default: 256Mb) + + * Embedded color profile allocation/read size: limited by input file size. + + * Check against corrupted LJPEG header in Canon sRAW decoder + + * Better support for Sony metadata + + * Better handling of memory allocation errors in unpack_thumb() + + * Support for 8bit/Monochrome DNG Previews + + * LibRaw::thumbOK(): return 0 for YCbCr thumbnails (because + unpack_thumb() will always return error: no correct thumbnails + with this format found in the image samples yet) + + * Improved Sigma X3F files model recognition + + * Placeholder for DNG/YCC preview decoding: such previews are recorded + by Samsung S21 Ultra smartfone, while all present samples contains + broken data; Right now 'no preview' returned for such files. + + * Support for BW bitmap previews in LibRaw::dcraw_thumb_writer + + * Phase One: explicitly switch to monochrome mode if firmware string + contains 'Achromatic' word + + * tiff parser: check for IFD offset before parsing it + +2022-07-01 Alex Tutubalin + + LibRaw 0.21 + + == Camera format support == + * Phase One/Leaf IIQ-S v2 support + * Canon CR3 filmrolls + * Canon CRM (movie) files + * Tiled bit-packed (and 16-bit unpacked) DNGs + * (non-standard) Deflate-compressed integer DNG files are allowed + +== Camera support == + + * Canon EOS R3, R7 and R10 + * Fujifilm X-H2S, X-T30 II + * OM System OM-1 + * Leica M11 + * Sony A7-IV (ILCE-7M4) + * DJI Mavic 3 + * Nikon Z9: standard compression formats only + + == Multiple (resolution) thumbnails support == + + * New imgdata.thumbs_list data item with data fields: + + int thumbcount: thumbnail count + libraw_thumbnail_item_t thumblist[LIBRAW_THUMBNAIL_MAXCOUNT]: list of thumbnails + + libraw_thumbnail_item_t fields: + + enum LibRaw_internal_thumbnail_formats tformat: internal thumbnail format + (this is not PPM/JPEG, but internal type related to thumbnail reading/unpacking method) + + ushort twidth, theight: thumbnail image size. + + ushort tflip: image rotation (see notes below) + + unsigned tlength: on-disk data size (not uncompressed for compressed formats) + + unsigned tmisc: bit depth and channel count: (color << 5) | bitsperpixel + + INT64 toffset: Thumbnail data offset in file + + Notes: + - Only TIFF-based and CR3 files are parsed for thumbnail list, other formats will have + thumbcount = 1. + + - If no thumbnails are found in file: thumbcount will be set to 1 and + thumblist[0] will be initialized with data from thumbnail fields, + so LibRaw::unpack_thumb_ex(0) will do the same as LibRaw::unpack_thumb() + + - Thumbnail image size may be unknown (not recorded in metadata), in this case twidth and theight are zero. + Usually small(er) thumbnails will always have twidth/theight filled, while largest one may have these fields set to zero. + + - Thumbnail rotation (tflip) is filled only for TIFF-based RAWs (if Orientation tag is not present in IFD, default zero value is used) + For non-tiff images, tflip is initialized to 0xffff (not known...) + + - There is no code to select thumbnail based on some criteria (e.g. minimal resolution), it is left to user to implement such a criteria, if needed + (see unpack_thumb_ex() call below) + + - If you want to get largest possible thumbnail: just use old unpack_thumb() call to get it. + + * new API call: LibRaw::unpack_thumb_ex(int i): + Unpacks i-th thumbnail if it exists into imgdata.thumbnail structure + i should be non-zero and less then imgdata.thumbs_list.thumbcount. + + * samples/simple_dcraw.cpp: new -E command line switch to extract all thumbnails from input file(s) + + == (Experimental) RawSpeed "version 3" (develop branch) support. == + + Build with -DUSE_RAWSPEED3, see details in RawSpeed3/README.md + + LibRaw::capabilities will set bit LIBRAW_CAPS_RAWSPEED3 if compiled w/ + RawSpeed-v3 support + + If file was processed (or tried to process) via RawSpeed-v3, these bits + are raised in imgdata.process_warnings: + LIBRAW_WARN_RAWSPEED3_PROCESSED - processed via RawSpeed v3 + LIBRAW_WARN_RAWSPEED3_PROBLEM - not processed (due to exception in RawSpeed library) + LIBRAW_WARN_RAWSPEED3_UNSUPPORTED - unsupported file + LIBRAW_WARN_RAWSPEED3_NOTLISTED - file not listed in cameras.xml data + + RawSpeed-v3 support is controlled via libraw_decoder_info.t->flags + (LIBRAW_DECODER_TRYRAWSPEED3 bit). + The bit is set for: + - lossless jpeg decoder + - Canon sRAW decoder + - lossless compressed and packed-compressed DNG decoders + - Pentax decoder + - Nikon (compressed) decoder + - Phase One Compressed and Hasselblad/Compressed decoders + - bitpacked decoder + - Panasonic (old 12-bit compression) decoder + - Olympus decoder + - Sony ARW (v1 and v2) decoders + - Samsung (version 1) decoder + + * (Experimental) Fine control of RawSpeed version selection/use. + To enable, build LibRaw with -DUSE_RAWSPEED_BITS + LibRaw::capabilities will set bit LIBRAW_CAPS_RAWSPEED_BITS if compiled + with this flag. + If enabled: + imgdata.rawparams.use_rawspeed becomes bit-field (instead of 0/1 off/on) + with bits: + LIBRAW_RAWSPEEDV1_USE - use RawSpeed Version 1 (if compiled with) + LIBRAW_RAWSPEEDV1_FAILONUNKNOWN - do not process unknown files + (not listed in RawSpeed v1 camera definitions file) + LIBRAW_RAWSPEEDV1_IGNOREERRORS - ignore mirror decoding errors (out of range data,etc) + + LIBRAW_RAWSPEEDV3_USE - Use RawSpeed Version 3 (if compiled with) + LIBRAW_RAWSPEEDV3_FAILONUNKNOWN - do not process unknown files + LIBRAW_RAWSPEEDV3_IGNOREERRORS - ignore minor decoding errors + + == Misc changes/improvements == + * New compile time define LIBRAW_OWN_SWAB + to use on platforms without swab() in C/C++ runtime + + * New imgdata.rawparams.options bit: LIBRAW_RAWOPTIONS_CANON_IGNORE_MAKERNOTES_ROTATION + If set: image orientation is set based on TIFF/IFD0:Orientation tag, + makernotes orientation data is ignored + + * Nikon makernotes: read NEFCompression tag for HE/HE* files + + * Nikon orientation tag: more fixed offsets for known cameras + + * Adobe DNG SDK 1.6 support (meaning, just an additional patch for GPR SDK) + + * removed LibRaw::memerr(), memory allocation failures are already handled + in LibRaw_memmgr::*alloc w/ exception thrown + + * removed memory error callback, out-of-memory error should be handled via + returned error code check, all related parameters (e.g. LibRaw constructor + option to not set such callback) is also removed + + * imgdata.params.adjust_maximum_thr is settable via C-API libraw_set_adjust_maximum_thr(..) + + * New rawoptions/processing flags for DNG processing if compiled + with Adobe DNG SDK: + LIBRAW_RAWOPTIONS_DNG_STAGE2_IFPRESENT,LIBRAW_RAWOPTIONS_DNG_STAGE3_IFPRESENT + If these flag(s) are set: Stage2/Stage3 processing will be performed + only if OpcodeList2/OpcodeList3 tags are present in the input DNG file + Old (hard) flags (LIBRAW_RAWOPTIONS_DNG_STAGE2 and + LIBRAW_RAWOPTIONS_DNG_STAGE3) are not removed and will force Stage2/3 + processing if set (regardless of input file tags) + + * New imgdata.rawparams.options bit: LIBRAW_RAWOPTIONS_DNG_ADD_MASKS + If set: DNG Transparency Masks will be extracted (if selected via shot_select) + + * New decoder flag: LIBRAW_DECODER_UNSUPPORTED_FORMAT + + == Bugs fixed == + + * Fixed possible out-of-buffer read in Nikon orientation tag parser + + * Windows datastream: fixed logic errors (not showing up in real life) + + * Out-of-range read-only array access in postprocessing if output_color is set to 0 (raw color) + + * Minolta Z2 was not recognized correctly on 32-bit systems + + * Fixed possible buffer overflow in Kodak C330 decoder + + * dcraw_process(): check for buffer allocation results to avoid NULL deref + +2021-10-11 Alex Tutubalin + * Camera support: + Apple iPhone 13 Pro + GoPro HERO10 (if compiled w/ USE_GPR_SDK) + Ricoh GR III + Sony Xperia 1 III + + * Fuji RAF files: XMP block extraction + + * Fixed a typo in LIBRAW_OPTIONS_* flag names + (was LIBRAW_OPIONS, old flags names not removed due to compatibility) + + * samples/raw-identify.cpp: -v flag documented in usage print. + +2021-09-14 Alex Tutubalin + * Camera support: + Fujifilm GFX 50S II + Nikon Z fc + Sony A7R-IIIA (ILCE-7RM3A), A7R-IVA (ILCE-7RM4A) + + * API/datastruct Changes: + - imgdata.params.shot_select moved to imgdata.rawparams.shot_select + (because this is decode-time option, not postprocessing option) + + - libraw_open_bayer(...) added to C-API + + - imgdata.makernotes.canon: separate SensorLeftBorder,SensorTopBorder.... + (and many other datafields) are united in libraw_area_t (rectangle) + groups for crop areas and optical black areas. + + * src/libraw_cxx.cpp completely removed from source tree to not confuse users. + (also all mentions are removed from Makefiles) + + * Better Olympus makernotes parsing: LiveND mode, Panorama mode tags. + + * clang-cl compatibility: + - defines _MSC_VER, but _forceinline is not supported + - warnings eliminated in Windows buffered datastream + + * Canon/12-bit files: adjust color.linear_max and makernotes.canon values + to match data range. + +2021-08-04 Alex Tutubalin + * Camera support: + Sony ZV-E10 + * DNG/Floating point: additional metadata check to refuse ambiguous/corrupted files. + * DNG/Floating point: correct handling of striped files (never seen in wild) + * Rawspeed support: disallow Nikon D6/Compressed processing + * Bug fixed: raw_inset_crops[] ctop/cheight was not adjusted right if vendor-specified + ctop equals to 1. + +2021-07-20 Alex Tutubalin + * Camera support: + Olympus E-P7 + +2021-07-08 Alex Tutubalin + * Camera support: + Panasonic GH5 Mark II + Pentax K3 Mark III + several phones w/ DNG files (checked) + + * Camera format support: Panasonic v6/12 bit + * Compile-time raw size limits implemented: + LIBRAW_MAX_NONDNG_RAW_FILE_SIZE - max file size for non-DNG files (default: 2GB - 1 byte) + LIBRAW_MAX_DNG_RAW_FILE_SIZE - max DNG file size limit (4GB-1 if compiled w/ DNG SDK, 2GB-1 otherwise) + + * ACES output: color conversion changed to provide D65 white point + + * Fix for Canon 5D Mark II/sRAW1 incorrect camera provided crop + +2021-05-07 Alex Tutubalin + * Camera support: + Fujifilm GFX 100S, X-E4: improved color data + Canon EOS M50 Mark II was supported but not listed in camera list + DJI Mavic Air 2S + GOPRO Hero9 + * Support for RaspberryPi HQ camera (if compiled w/ USE_6BY9RPI) + * Improved support for RPi V1/V2 cameras: + - white balance data extraction + - color matrix extracted to imgdata.color.cmatrix to use with + use_camera_matrix. + - full-size thumbnail/preview support for JPEG+RAW files (raspistill -r) + * Fuji GFX100/GFX100S: PixelShift metadata extraction. + * RawSpeed (master): fixed bug in old Samsung/compressed decoder, + apply this patch to RawSpeed: RawSpeed/rawspeed.samsung-decoder.patch + * DCI-P3 and Rec 2020 output colorspaces + * Eliminated multiple signed/unsigned mismatch warnings (reported by gcc11) + * fixed possible 1-byte stack underrun while handling text tags with zero length + * XMP block size in CR3 files limited to 1MB + * Preview block size in CR3 files limited to 100MB + * Fixed wrong handling of linear DNG files created from Pentax out-of-camera + DNGs + +2021-02-18 Alex Tutubalin + * Improved Phase One Compressed defects masking, thanks to Alexey Danilchenko + * Sony ILCE-1/Lossless compressed support + +2021-02-16 Alex Tutubalin + * Additional fields in libraw_internal_data.unpacker_data: + - INT64: exif_offset: base offset of 1st EXIF IFD in file + - INT64: ifd0_offset: base offset of 1st TIFF IFD (IFD0) in file + - unsigned cr3_exif_length, cr3_ifd0_lenght : CR3-specific length of + exif and ifd0 sections. + +2021-02-08 Alex Tutubalin + * CRX (CR3) decoder: fixed typo in constant; this does not affect any + known still photo (CR3) sample(s), but allows to use the decoder with + some video (CRM) files. + + * Imported user-contributed improvements to OpenMP postprocessing + (AHD and X-Trans demosaic) + + * Bugfix: overwrite (wrong) TIFF/Orientation tag value with Metadata/Camera Orientation + value for EOS 40D only. + +2021-02-04 Alex Tutubalin + * imgdata.sizes.raw_inset_crop rearranged: + now it is imgdata.sizes.raw_inset_crops[2]: + - item at [0] is the same as imgdatra.sizes.raw_inset_crop in previous + versions + - item at [1] is 'user crop', in particular: + -- set by DNG DefaultUserCrop tag + -- or set via raw aspect ratio tags (e.g. 16:9 aspect on Fujifilm cameras) + raw_inset_crops[1] is filled only if aspect ratio tags provides different + aspect ratio compared to raw_inset_crops[0]. + + There are no flags to check if raw_inset_crops[Nth] is filled; to see if it is filled check + the values of: + ctop/cleft < 0xffff (0xffff => standard values if not initialized) + ctop+cheight <= sizes.raw_height + cleft+cwidth <= sizes.raw_width + + Note: raw_inset_crops may be fooled by metadata (makernotes), use some correctness check before use. + + * LIBRAW_RAWOPTIONS_USE_DNG_DEFAULT_CROP processing flag removed, + DNG DefaultCrop* tags are parsed into raw_inset_crops[0] + + * new LibRaw call LibRaw::adjust_to_raw_inset_crop(unsigned mask, float maxcrop = 0.55f) + Promotes imgdata.sizes.raw_inset_crops[] values to + imgdata.sizes.*margin and imgdata.sizes.width/height fields + + mask: if bit 1 is set: prefer raw_inset_crops[1] + if bit 0 is set: prefer raw_inset_crops[0] + + maxcrop: limits crop to not less than (original width/height)*maxcrop; if raw_inset_crops[i] + data results in tighter crop, than this item is ignored. + + return value: index in raw_inset_crops[] used increased by one, so + 0: no changes made + 1: [0]th data used + 2: [1]th data used + + Note: this call SHOULD be used after LibRaw::unpack(), otherwise black level + calculation from masked area may be fooled resulting in wrong black levels. + +2021-01-21 Alex Tutubalin + + == LibRaw snapshot 202101 == + + = Camera format support: = + Lossy compressed CR3 files + Lossy compressed RAF files + Uncompressed floating point DNG files (16-24-32 bit) + Deflate compressed striped DNG files + XMP and HEIF-preview extraction from CR3 files + + = Camera support = + Apple iPhone 12 Max, iPhone 12 Max Pro + Canon EOS R5, EOS R6, EOS 850D, EOS-1D X Mark III (lossy compressed files) + FujiFilm X-S10 + Hasselblad CFV II 50C", + Leica M10-R, Q2 Monochrom, S3, SL2-S + Nikon Z 5, Z 6 II, Z 7 II + Olympus E-M10 Mark IV + Panasonic DC-G100 / G110, DC-S5 + Sony ILCE-7C (A7C), ILCE-7SM3 (A7S III) + Zeiss ZX1 + Plus multiple DNG-recording cameraphones/drones/etc. + + = Almost dropped camera support: = + Old/partially supported video/cinema cameras support is available only if + LibRaw is compiled with USE_OLD_VIDEOCAMS defined (this #define is + converted internally to LIBRAW_OLD_VIDEO_SUPPORT defined). + This affects: + Arri cameras + Canon C500 + RED Cine cameras + We plan to keep the support in LibRaw 0.21 (if compiled with define + mentioned above) and completely drop the support after 0.21. + If you're using LibRaw to decode RED Cine files, see LibRaw*datastreams + section below (in short: you'll need to use old fstream-based datastream + under Windows). + Cinema DNG files are not affected by this. + + = API/ABI changes = + + * Decoding parameters + imgdata.params is split into + imgdata.rawparams: parameters used for metadata/raw data decoding + imgdata.params: parameters used at postprocessing stage + + imgdata.params.raw_processing options are split into two sub-options sets + imgdata.rawparams.options: raw processing flags, useful for normal + operations + imgdata.rawparams.specials: special modes (e.g decoding only delta + pixels from Sony ARW) + + Old LIBRAW_PROCESSING_* flags are renamed to LIBRAW_RAWOPTIONS_* and + LIBRAW_RAWSPECIAL* + LIBRAW_PROCESSING_DP2Q_INTERPOLATE... flags are renamed to + LIBRAW_RAWSPECIAL_NODP2Q_INTERPOLATE with inverted meaning (with the + goal to have zero imgdata.rawparams.specials in normal use). + + * New processing flag LIBRAW_RAWOPTIONS_PROVIDE_NONSTANDARD_WB + If set (default is not), and when applicable, color.cam_mul[] and + color.WB_Coeffs/WBCT_Coeffs will contain WB settings for a + non-standard workflow. + Right now only Sony DSC-F828 is affected: camera-recorded white balance + can't be directly applied to raw data because WB is for RGB, while raw + data is RGBE. + + * New processing flag: LIBRAW_RAWOPTIONS_CAMERAWB_FALLBACK_TO_DAYLIGHT + If set (default is not), LibRaw::dcraw_process() will fallback to + daylight WB (excluding some very specific cases like Canon D30). + This is how LibRaw 0.19 (and older) works. + If not set: LibRaw::dcraw_process() will fallback to calculated auto WB if + camera WB is requested, but appropriate white balance was not found in + metadata. + + * Removed LIBRAW_PROCESSING_SKIP_MAKERNOTES processing flag: with new + Windows(-handle) datastreams metadata parsing performance is enough + to not skip makernotes parsing. + + * new output parameter: imgdata.params.output_flags and new + enum LibRaw_output_flags + Right now the only flag is implemented: LIBRAW_OUTPUT_FLAGS_PPMMETA + setting it will result into metadata written to PPM/PGM output file + + * LibRaw_*datastreams change and corresponding open_file() parameters change + LibRaw_file_datastream (based on iostreams) is moved under + #ifdef LIBRAW_USE_DEPRECATED_IOSTREAMS_DATASTREAM + Standard datastreams are: + LibRaw_bigfile_datastream (FILE* based) for POSIX systems + LibRaw_bigfile_buffered_datastream - for use with Win32 syscalls + API changes: + if LIBRAW_USE_DEPRECATED_IOSTREAMS_DATASTREAM is NOT defined, than + LibRaw::open_file() and similar calls drops the last INT64 max_buffered_sz + parameter which defines automatic selection between iostreams and + FILE* based datasteams. + + Note: LibRaw_bigfile_buffered_datastream does NOT implements + make_jas_stream() call, so RED Cine file decoding is not possible with + this datastream. Use deprecaded iostreams implementation instead. + + We plan to keep LIBRAW_USE_DEPRECATED_IOSTREAMS_DATASTREAM up to + LibRaw 0.21 and drop in 0.22. + + * Fuji decoder: + fuji_decode_loop/fuji_decode_strip parameters has changed; look into source + code for details if you're implementing your own fuji_decode_loop() + call in subclass to provide parallel fuji decoding. + + * Canon CR3 H265 (HEIF) preview limited support: + - new format value: LIBRAW_THUMBNAIL_H265 + - this thumbnail is NOT extracted by LibRaw::make_mem_thumb() yet; + + * LibRaw::capabilities + Two bits added: + LIBRAW_CAPS_ZLIB if compiled with USE_ZLIB + LIBRAW_CAPS_JPEG if compiled with USE_JPEG + + + * Windows datastreams: CreateFile2 is used if compiled for UWP. + + * API-datastruct: clarified behavior with use_camera_wb=1 setting. + + * identify(): restored the differentiation between fsize and flen. + + * New compile-time LIBRAW_FORCE_OPENMP to skip compiler version check + (if LibRaw user is absolutely sure that OpenMP is supported by compiler) + +2020-10-14 Alex Tutubalin + + * LibRaw 0.20.2 + Reverted 0.20.1 change: + - const buffer for open_buffer() and open_bayer() calls + Because of 0.20.0 ABI break + +2020-10-14 Alex Tutubalin + + * LibRaw 0.20.1 + * Improvements: + - exif callback is called on EXIF GPS and EXIF Interop IFDs + - open_bayer call documented + - Canon (ColorDatsSubver==32): parse Specular White instead of hardcoded value + * Fixes for normal files processing: + - Olympus XZ-1: do not provide linear_max (it is wrong in metadata) + - Nikon Z cameras: added space in camera list + - raw-identify: fixed wb-preset print + - Pentax Optio 33WR: maker index was incorrect + - dcraw_emu: corrected help line for -6 option. + - raw-identify: corrected range check for color matrices print + - use_camera_matrix option: fixed a bug introduced when making + compiler more happy. + + * Fixes for damaged/special crafted files processing: + - Fix for truncated CR3 files parsing + - DNG metadata merger: all color loops are limited to MIN(4,colors) + - Check for marings: should be less than raw image size + - Check for xmpdata present in Samsung Lens ID assignment + - Check for column range in leaf_hdr decoder + - Additional checks in Hasselblad model parser + - Fuji rotate: better limits check + - DNG files: limit tiff_samples + + * Not fixes, but makes ASAN/compilers/etc happy: + - corrected GPS EXIF output + - const buffer for open_buffer() and open_bayer() calls + + +2020-07-23 Alex Tutubalin + + * LibRaw 0.20 + +== Camera Format support == + Canon CR3 + GoPro (via GPR SDK) + Panasonic 14-bit + Fujifilm compressed/16bit + Rapsberry Pi RAW+JPEG format (if USE_6BY9RPI defined) + Foveon X3F support changed: it is supported only if USE_X3FTOOLS defined + at build (see below for 'Imported code policy changed') + +== Camera support (+59, 1131 total) == + Canon: PowerShot G5 X Mark II, G7 X Mark III, SX70 HS, + EOS R, EOS RP, EOS 90D, EOS 250D, EOS M6 Mark II, EOS M50, EOS M200 + EOS 1DX Mark III (lossless files only) + DJI Mavic Air, Osmo Action + FujiFilm GFX 100, X-A7, X-Pro3, X100V, X-T4 (uncompressed/lossless compressed only), X-T200 + GoPro Fusion, HERO5, HERO6, HERO7, HERO8 + Hasselblad L1D-20c, X1D II 50C + Leica D-LUX7, Q-P, Q2, V-LUX5, C-Lux / CAM-DC25, SL2, M10 Monochrom + Nikon D780, Z50, P950 + Olympus TG-6, E-M5 Mark III, E-PL10, E-M1 Mark III, + Panasonic DC-FZ1000 II, DC-G90, DC-S1, DC-S1R, DC-S1H, DC-TZ95 + PhaseOne IQ4 150MP + Ricoh GR III + Sony A7R IV, A9 II, ILCE-6100, ILCE-6600, RX0 II, RX100 VII + Zenit M + +also multiple smartphones (the tested ones are listed in LibRaw::cameraList) + +== Source code re-arranged == + * dcraw.c is not used in the generation and build processes + * dcraw_common.cpp and libraw_cxx.cpp are split into multiple code chunks + placed in separate subfolders (decoders/ for raw data decoders, + metadata/ for metadata parsers, etc) + * dcraw_common.cpp and libraw_cxx.cpp remain to preserve existing + build environments (these files are now just a bunch of #include directives). + * It is possible to build LibRaw + a)without postprocessing functions (dcraw_process() and called function) + b)without postprocessing and LibRaw::raw2image() call (and called function). + It may be useful to reduce library memory/code footprint. + See Makefile.devel.nopp and Makefile.devel.noppr2i for the list of source + files needed to build reduced/stripped library. + +== Normalized make/model == + +There is a huge number of identical cameras sold under different names, +depending on the market (e.g. multiple Panasonic or Canon models) +and even some identical cameras sold under different brands +(Panasonic -> Leica, Sony -> Hasselblad). + +To reduce clutter, a normalization mechanism has been implemented in LibRaw: + +In imgdata.idata: + char normalized_make[64]; - primary vendor name (e.g. Panasonic for + Leica re-branded cameras) + char normalized_model[64]; - primary camera model name + unsigned maker_index; - primary vendor name in indexed form (enum + LibRaw_cameramaker_index, LIBRAW_CAMERAMAKER_* constant). +These fields are always filled upon LibRaw::open_file()/open_buffer() calls. + +const char* LibRaw::cameramakeridx2maker(int index): converts maker_index +to normalized_make. + +We recommend that you use these normalized names in a variety of data tables +(color profiles, etc.) to reduce the number of duplicate entries. + +New vendor index values will be added strictly to the end of the +LibRaw_cameramaker_index table, ensuring that the numbers assigned to +vendors that are already known to LibRaw will not change. + +== DNG frame selection == + + DNG frames selection code re-worked: + - by default all frames w/ the NewSubfileType tag equal to 0 + (high-res image) are added to the list of available images (selection + performed via imgdata.params.shot_select field, as usual) + - the special case for Fuju SuperCCD (SamplesPerPixel == 2) works as + before: shot_select=1 will extract second sub-image. + - Additional flags to imgdata.params.raw_processing_options: + LIBRAW_PROCESSING_DNG_ADD_ENHANCED - will add Enhanced DNG frame + (NewSubfileType == 16) to the list of available frames + LIBRAW_PROCESSING_DNG_ADD_PREVIEWS - will add previews + (NewSubfileType == 1) to the list. + + - By default, DNG frames are not reordered and are available in same order + as in DNG (LibRaw traverses IFD/Sub-IFD trees in deep-first order). + To prioritize the largest image, set LIBRAW_PROCESSING_DNG_PREFER_LARGEST_IMAGE + bit in imgdata.params.raw_processing_options. + + - DNG Stage2/Stage3 processing via DNG SDK (request via flags in + raw_processing_options) + +== Imported code policy disclaimer == + + We've changed the policy regarding 3rd party code imported into LibRaw. + + We (like other authors of open-source RAW parsers) gladly import support + code for various RAW formats from other projects (if the license allows it). + This is done to expand camera support. + Unfortunately, not all imported code can tolerate truncated or otherwise + damaged raw files, as well as arbitrary conditions or arbitrary data; + not all authors handle rejecting unexpected input well. + + LibRaw is now widely used in various projects, including ImageMagick, which, + in turn, is often used on web sites to process any input images, including + arbitrary data from unknown users. + This opens up wide possibilities for exploiting the various vulnerabilities + present in the code borrowed from other projects into LibRaw. In order to + avoid such security risks, - the borrowed code will no longer compile + by default. + We are not able to support it in general case, and the authors refuse + to add code to reject unexpected input. + + Thus, if you use some kind of camera for which the support is disabled + by default, you need to recompile LibRaw for your specific case. + + Formats currently affected: + X3F (Foveon) file format. + Code is imported from Kalpanika X3F tools: https://github.com/Kalpanika/x3f + To turn the support on, define USE_X3FTOOLS + + Rapsberry Pi RAW+JPEG format. + Code is imported from https://github.com/6by9/dcraw/, + To turn the support on, define USE_6BY9RPI + Format support is indicated via LibRaw::capabilities() call with flags: + LIBRAW_CAPS_X3FTOOLS - Foveon support + LIBRAW_CAPS_RPI6BY9 - RPi RAW+JPEG support + +== GoPro .gpr format support == + GoPro format supported via open-source GPR SDK + See README.GoPro.txt for details. + +== Windows support/Windows unicode (wchar_t*) filenames support == + +* (old) LibRaw's WIN32 external define split into 3 defines to fine tune + compiler/api compatibility: + LIBRAW_WIN32_DLLDEFS - use to compile DLLs (__dllimport/__dllexport attributes) + LIBRAW_WIN32_UNICODEPATHS - indicates that runtime has calls/datatypes for wchar_t filenames + LIBRAW_WIN32_CALLS - use Win32 calls where appropriative (binary mode for files, LibRaw_windows_datastream, _snprintf instead of snprintf, etc). + + If the (old) WIN32 macro is defined at compile time, all three new defines are defined in libraw.h + If not, these defines are defined based on compiler version/libc++ defines + +* LibRaw::open_file(wchar_t*) is always compiled in under Windows, but + if LIBRAW_WIN32_UNICODEPATHS (see above) is not defined, this call will + return LIBRAW_NOT_IMPLEMENTED. + Use (LibRaw::capabilities() & LIBRAW_CAPS_UNICODEPATHS) on runtime + to check that this call was really implemented (or check for #ifdef LIBRAW_WIN32_UNICODEPATHS after #include ) + +== LibRaw*datastream simplified == + + * tempbuffer_open, subfile_open are not used, so removed from + LibRaw_abstract_datastream and derived classes. + + * jpeg_src() call implemented using ->read() call and own buffering + (16k buffer). + * buffering_off() call added. It should be used in derived classes + to switch from buffered reads to unbuffered. + +== minor/unsorted changes == + * new flag LIBRAW_WARN_DNGSDK_PROCESSED to indicate decoder used + * LibRaw::open() call, max_buf_size special meaning: + == 1 => open using bigfile_datastream + == 2 => open using file_datastream + * Add support for zlib during configure + * Fixed multiple problems found by OSS-Fuzz + * Lots of changes in imgdata.makernotes (hope someone will document it) + * DNG SDK could be used (if enabled) to unpack multi-image DNG files. + * DNG whitelevel calculated via BitsPerSample if not set via tags. + * DNG: support for LinearDNG w/ BlackLevelRepeat.. pattern + * Generic Arri camera format replaced w/ list of specific camera models in supported cameras list. + * new samples/rawtextdump sample: allows one to dump (small selection) of RAW data in text format. + * samples/raw-identify: + * +M/-M params (same as in dcraw_emu) + * -L parameter to get file list from a file + * -m paramerer to use mmap'ed IO. + * -t parameter for timing + * samples/dcraw_emu: fixed +M handling + * better support for Nikon Coolscan 16-bit NEF files. + * Visual Studio project files: re-generated to .vcxproj (Visual Studio 2019), different + intermediate folders for different sub-projects to allow 1-step rebuild. + * imgdata.makernotes...cameraspecific: removed the vendor name prefix from variables. + * Bayer images: ensure that even margins have the same COLOR() for both the active sensor area and the full sensor area. + * raw processing flag bit LIBRAW_PROCESSING_CHECK_DNG_ILLUMINANT inverted and renamed to + LIBRAW_PROCESSING_DONT_CHECK_DNG_ILLUMINANT. If not set, DNG illuminant will be checked. + * New libraw_decoder_t flags: + LIBRAW_DECODER_FLATDATA - in-file data could be used as is (if byte order matches), e.g. via mmap() + LIBRAW_DECODER_FLAT_BG2_SWAPPED - special flag for Sony ARQ: indicates R-G-G2-B channel + order in 4-color data + * Camera-recorded image crop data is parsed into imgdata.sizes.raw_inset_crop structure: + ctop,cleft,cwidth,cheight - crop size. + aspect - LibRawImageAspects enum (3to2, 4to3, etc) + * New define LIBRAW_NO_WINSOCK2 to not include winsock2.h on compile + + * New processing flag LIBRAW_PROCESSING_PROVIDE_NONSTANDARD_WB + If set (default is not), and when applicable, color.cam_mul[] and + color.WB_Coeffs/WBCT_Coeffs will contain WB settings for a non-standard + workflow. + Right now only Sony DSC-F828 is affected: camera-recorded white balance + can't be directly applied to raw data because WB is for RGB, while raw + data is RGBE. + + * New processing flag: LIBRAW_PROCESSING_CAMERAWB_FALLBACK_TO_DAYLIGHT + If set (default is not), LibRaw::dcraw_process() will fallback to + daylight WB (excluding some very specific cases like Canon D30). + This is how LibRaw 0.19 (and older) works. + If not set: LibRaw::dcraw_process() will fallback to calculated auto WB if + camera WB is requested, but appropriate white balance was not found in + metadata. + + * Google changes cherry-picked (thanks to Jamie Pinheiro) + * speedup: ppg interpolate: const loop invariant + + * Bugs fixed + -Fixed several UBs found by OSS Fuzz + -Fixed several problems found by other fuzzers. + - Thumbnail size range check (CVE-2020-15503) + Thanks to Jennifer Gehrke of Recurity Labs GmbH for problem report. + - fixed possible overflows in canon and sigma makernotes parsers + - fixed possible buffer overrun in crx (cr3) decoder + - fixed memory leak in crx decoder (if compiled with LIBRAW_NO_CR3_MEMPOOL) + - fixed possible overrun in Sony SRF and SR2 metadata parsers + + * Fixed typo in longitude (member of parsed GPS structure), update required for code that uses it. + + +2019-03-05 Alex Tutubalin + * Camera support + Canon A560 (CHDK hack) + FujiFilm X-T30 + Nikon Coolpix A1000 + Olympus E-M1X + Sony ILCE-6400 + Several dng files from phones and drones was tested + and added to built-in camera list too. + + * Multiple names for same Panasonic cameras are processed via + aliaces mechanics, no multiple duplicate fields in adobe_coeffs() table + + * Better makernotes parsing for many cameras + + * Better parsing of makernotes embedded into DNG files created by + Adobe DNG Converter + + * New imgdata.params.raw_processing_options value: LIBRAW_PROCESSING_ZEROFILTERS_FOR_MONOCHROMETIFFS + - If this bit is set + - and TIFF file contains SamplesPerPixel == 1 + - and filters value was not guessed from metadata parsing + LibRaw will assume the file is monochrome, not bayer. + This option is needed for monochrome scan processing (Imacon X1 etc). + This option may broke old TIF-like RAW files processing (Kodak 760,etc) + use with care (it is better to let user choose). + +2018-12-12 Alex Tutubalin + * Camera support: + Canon: PowerShot A480 (CHDK hack), EOS 2000D, EOS 4000D + Eyedeas E1 + FujiFilm: GFX 50R, XF10, X-T3, X-T100, DBP680 + GITUP G3 DUO (16:9 mode only, use custom camera for 4:3) + Kodak PIXPRO AZ901 + Leica M10-D, M10-P + Nikon D3500, Z6, Z7, P1000 + Panasonic LX100M2 + Pentax K-1 II + Sony A7 III, HX95, HX99, RX100-VA, RX100-VI + + * Fixed long standing bug in remove_zeroes: first two rows/cols was unprocessed + * Better parsing for NEF files modified (damaged) by NikonTransfer + * Better parsing for floating point DNG black levels (into color.dnglevels.fblack and dng_fcblack[], similar + to color.black and color.cblack[] for other formats). + * More flexible limit for RAW decoding memory usage: + imgdata.params.max_raw_memory_mb (default is LIBRAW_MAX_ALLOC_MB_DEFAULT) + + * New flags for imgdata.params.raw_processing_options: + LIBRAW_PROCESSING_CHECK_DNG_ILLUMINANT - will check DNG illuminant field when selecting color matrix + (note: incompatibility with previous versions, so default is not set). + LIBRAW_PROCESSING_DNGSDK_ZEROCOPY - will not copy data from Adobe DNG SDK decoded buffer, but use it as is + + * Switched from auto_ptr to unique_ptr, to get back define LIBRAW_USE_AUTOPTR + + * dcraw_emu: it is now possible to create output filename in a more flexible manner, via -Z switch: + -Z - will output to stdout + -Z ext will output into inputfilename.ext + -Z .ext will output into inputfilename.inputext.ext + + +2018-11-22 Alex Tutubalin + * Finally: got Sinar 4shot sample, works fine now + * OpenMP critical sections for malloc/free; extra #ifdefs removed; bin/dcraw_dist could be built again using Makefile.devel + * additional checks in parse_phase_one() + * more checks on file offsets/tag len in parse_minolta + * more checks in parse_ciff + * Mempool check reworked + * Old Leaf (16bit/3color/TIFF) support + * Fix cameraWB->autoWB fallback + * Polaroid x530 channel swap; get metadata pointer for Foveon files + * Fixed Secunia Advisory SA86384 + - possible infinite loop in unpacked_load_raw() + - possible infinite loop in parse_rollei() + - possible infinite loop in parse_sinar_ia() + Credits: Laurent Delosieres, Secunia Research at Flexera + + * LibRaw 0.19.1-Release + +2018-06-28 Alex Tutubalin + * changed wrong fix for Canon D30 white balance + * fixed possible stack overrun while reading zero-sized strings + * fixed possible integer overflow + * LibRaw 0.19.0-Release + +2018-06-11 Alex Tutubalin + * Sony uncompressed/untiled DNGs: do not set bits-per-sample to 14 bit + * Do not change tiff_bps for DNG files + * Another possible stack overflow in kodak radc reader + * Secunia Advisory SA83507, credits Kasper Leigh Haabb, + Secunia Research at Flexera" + - parse_qt: possible integer overflow + - reject broken/crafted NOKIARAW files + * LibRaw 0.19-Beta6 + +2018-05-10 Alex Tutubalin + * Put rogue printf's behind #ifdef DCRAW_VERBOSE + * Exceptions was not caught in x3f_new_from_file resulting in x3f handle leak + * packed_load_raw(): EOF check on each row + * define LIBRAW_USE_CALLOC_INSTEAD_OF_MALLOC to use ::calloc instead of + ::malloc in LibRaw_mem_mgr malloc calls; + Note: realloc is not changed, so only partial fix + * Fixed possible div by zero in EOS D30 WB data parse + * U-suffix for filter-var manipulation consts + * restored static specifier for utf2char() lost in previous bugfix + * Fixed stack overrun in kodak_radc_load_raw + * Secunia Advisory SA83050: possible infinite loop in parse_minolta() + * LibRaw 0.19-Beta5 + +2018-05-03 Alex Tutubalin + * CVE-2018-10529 fixed: out of bounds read in X3F parser + * CVE-2018-10528 fixed: possible stack overrun in X3F parser + * LibRaw 0.19-Beta4 + +2018-04-24 Alex Tutubalin + * LibRaw 0.19-Beta3 + * fixed lot of bugs reported by ImageMagic/oss-fuzz + * fixed several bugs reported by Secunia team (adv 81800, + Credit: Laurent Delosieres, Secunia Research at Flexera) + +2018-03-22 Alex Tutubalin + * LibRaw 0.19-Beta2 + * Better handling of broken JPEG thumbnails + * Panasonic GH5S/G9-hires decoder, thanks to Alexey Danilchenko + Note: ABI has changed due to this patch, so shlib version increased + * Fujifilm X-A5/A20 metadata parsing fix + * New error code LIBRAW_TOO_BIG: image data size excess LIBRAW_MAX_ALLOC_MB + * winsock2 included before windows.h to make MinGW happy + +2018-02-23 Alex Tutubalin + + * LibRaw 0.19-Beta1 + + * 84 cameras added compared to 0.18 (1014 total): + Apple + iPhone 8(*), iPhone 8 plus, iPhone X + BlackMagic + URSA Mini 4k, URSA Mini 4.6k, URSA Mini Pro 4.6k + Canon CHDK hack + PowerShot A410, A540, D10, ELPH 130 IS, ELPH 160 IS, SD750, + SX100 IS,SX130 IS, SX160 IS, SX510 HS, SX10 IS, IXUS 900Ti + Canon + PowerShot G1 X Mark III, G9 X Mark II, EOS 6D Mark II, EOS 77D, + EOS 200D, EOS 800D, EOS M6, EOS M100 + Casio EX-ZR4100/5100 + DJI + Phantom4 Pro/Pro+, Zenmuse X5, Zenmuse X5R + FujiFilm + S6500fd, GFX 50S, X100f, X-A3, X-A5, X-A10, X-A20, X-E3, X-H1, X-T20 + GITUP GIT2P + Hasselblad + H6D-100c, A6D-100c + Huawei + P9 (EVA-L09/AL00), Honor6a, Honor9, Mate10 (BLA-L29) + Leica + CL, M10, TL2 + LG + V20 (F800K), VS995, + Nikon + D850, D5600, D7500, Coolpix B700 + Olympus + E-PL9, E-M10 Mark III, TG-5 + OnePlus + One, A3303, A5000 + Panasonic + DMC-FZ45, DMC-FZ72, DC-FZ80/82, DC-G9 (std. res mode only), DC-GF10/GF90, + DC-GH5, DC-GX9, DC-GX800/850/GF9, DMC-LX1, DC-ZS70 (DC-TZ90/91/92, DC-T93), + DC-TZ100/101/ZS100, DC-TZ200/ZS200 + PARROT + Bebop 2, Bebop Drone + Pentax KP + PhaseOne IQ3 100MP Trichromatic + Samsung + Galaxy Nexus, Galaxy S3, S6 (SM-G920F), S7, S7 Edge, S8 (SM-G950U), + Sony + A7R III, A9, DSC-RX0, DSC-RX10IV + Yi M1 + YUNEEC + CGO3, CGO3P + Xiaoyi YIAC3 (YI 4k) + + Note(*): for mobile phones with DNG format recording, only really tested cameras + are added to supported camera list. Really LibRaw should support any correct DNG. + + * No more built-in support for LibRaw demosaic packs (GPL2/GPL3). + We're unable to support this (very old code), so we'll be happy to transfer this + code to some maintainer who wish to work with it. + + In LibRaw 0.19 we provide extension API: user-settable callbacks to be called in + code points where demosaic pack code was called. + + - int callbacks.pre_identify_cb(void *) => to be called in LibRaw::open_datastream + before call to (standard) identify() function. If this call returns 1, this means + that RAW file is identified and all metadata fields are set, so no need to run + standard identify code. + - void callbacks.post_identify_cb(void*) => called just after identify(), but before + any cleanup code; + - dcraw_process() callbacks are called before dcraw_process phases (name speaks for itself): + pre_subtractblack_cb, pre_scalecolors_cb, pre_preinterpolate_cb, pre_interpolate_cb, + interpolate_bayer_cb, interpolate_xtrans_cb, post_interpolate_cb, pre_converttorgb_cb, + post_converttorgb_cb + + All these new callbacks are called with (this) as the only arg. + To continue LibRaw-demosaic-pack-GPLx support one need to subclass LibRaw, set needed + callbacks in (e.g.) constructor code, than these callbacks to be called + + * Better DNG parser: + - support for DefaultCrop Origin/Size tags (add LIBRAW_PROCESSING_USE_DNG_DEFAULT_CROP to raw_processing_options to enable) + - better parsing for nested DNG tags (use tag from RAW IFD, fallback to IFD0 if no tag in current IFD) + - DNG PreviewColorspace extracted into dng_levels.preview_colorspace + + * Metadata extraction: + - Better extraction of camera measured balance (LIBRAW_WBI_Auto and WBI_Measured), + this not the same as 'as shot' if some preset/manual tune is used. + - Extraction of camera custom balances (LIBRAW_WBI_CustomN) + - Nikon data compression tag extracted into makernotes.nikon.NEFCompression + - Hasselblad BaseISO and Gain extracted into makernotes.hasselblad + - Canon multishot params extracted into makernotes.canon.multishot + - lot of other vendor-specific makernotes data (see data structures definitions for details). + + * New LibRaw::open_bayer call allows to pass sensor dump w/o metadata directly to LibRaw: + virtual int open_bayer(unsigned char *data, unsigned datalen, + ushort _raw_width, ushort _raw_height, ushort _left_margin, ushort _top_margin, + ushort _right_margin, ushort _bottom_margin, + unsigned char procflags, unsigned char bayer_pattern, unsigned unused_bits, unsigned otherflags, + unsigned black_level); + Parameters: + data, datalen - buffer passed + width/height/margins - speaks for itself + procflags: + for 10-bit format: + 1: "4 pixels in 5 bytes" packing is used + 0: "6 pixels in 8 bytes" packing is used + for 16-bit format: + 1: Big-endian data + bayer_pattern: one of LIBRAW_OPENBAYER_RGGB,LIBRAW_OPENBAYER_BGGR, + LIBRAW_OPENBAYER_GRBG,LIBRAW_OPENBAYER_GBRG + unused_bits: count of upper zero bits + otherflags: + Bit 1 - filter (average neighbors) for pixels with values of zero + Bits 2-4 - the orientation of the image (0=do not rotate, 3=180, 5=90CCW, 6=90CW) + black_level: file black level (it also may be specified via imgdata.params) + + see samples/openbayer_sample.cpp for usage sample (note, this sample is 'sample only', suited for + Kodak KAI-0340 sensor, you'll need change open_bayer() params for your data). + + * Color data added/updated/fixed for many cameras + + * Correct data maximum for Fuji X-* cameras + + * Thumbnail processing: + - JPEG thumbnails: if compiled with libjpeg, color count is extracted into imgdata.thumbnail.tcolors + - PPM (bitmap) thumbnails: color count is set according to thumbnail IFD tag + - PPM16 thumbnails: if LIBRAW_PROCESSING_USE_PPM16_THUMBS set in raw_processing_options, than thumbnail will be extracted + as is, not converted to 8 bit. thumbnail.tformat is set to LIBRAW_THUMBNAIL_BITMAP16 in this case. + Untested, because it is hard to find RAWs with 16-bit bitmaps. + +== Compatibility fixes + + * struct tiff_tag renamed to libraw_tiff_tag + * pow64f renamed to libraw_pow64f + +== Bugs fixed: + + * COLOR(r,c) works correctly on X-Trans files + +== Security fixes: +Secunia #81000: +Credit: Laurent Delosieres, Secunia Research at Flexera + * leaf_hdr_load_raw: check for image pointer for demosaiced raw + * NOKIARAW parser: check image dimensions readed from file + * quicktake_100_load_raw: check width/height limits + +Secunia #79000: +Credit: Laurent Delosieres, Secunia Research at Flexera + * All legacy (RGB raw) image loaders checks for imgdata.image is not NULL + * kodak_radc_load_raw: check image size before processing + * legacy memory allocator: allocate max(widh,raw_width)*max(height,raw_height) + +Secunia #76000: + * Fixed fuji_width handling if file is neither fuji nor DNG + * Fixed xtrans interpolate for broken xtrans pattern + * Fixed panasonic decoder + * LibRaw 0.18.6 + +Other fixes: + * Checks for width+left_margin/height+top_margin not larger than 64k + * LIBRAW_MAX_ALLOC_MB define limits maximum image/raw_image allocation + (default is 2048 so 2Gb per array) + * LibRaw::read_shorts item count is now unsigned + * Fixed possible out of bound access in Kodak 65000 loader + * CVE-2017-14348: Fix for possible heap overrun in Canon makernotes parser + Credit: Henri Salo from Nixu Corporation + * Fix for CVE-2017-13735 + * CVE-2017-14265: Additional check for X-Trans CFA pattern data + * Fixed several errors (Secunia advisory SA75000) + * ACES colorspace output option included in dcraw_emu help page + * Avoided possible 32-bit overflows in Sony metadata parser + * Phase One flat field code called even for half-size + + +2016-12-27 Alex Tutubalin + * Licensing changes: + - there is no 'LibRaw Software License 27032010' licensing anymore (and all signed + agreements have expired) + - LibRaw is now dual-licensed: LGPL 2.1 or CDDL 1.0 + + * Camera support (+87): + Apple: iPad Pro, iPhone SE, iPhone 6s, iPhone 6 plus, iPhone 7, iPhone 7 plus + BlackMagic Micro Cinema Camera, URSA, URSA Mini + Canon PowerShot G5 X, PowerShot G7 X Mark II, PowerShot G9 X, + IXUS 160 (CHDK hack), EOS 5D Mark IV, EOS 80D, EOS 1300D, EOS M10, EOS M5, + EOS-1D X Mark II + Casio EX-ZR4000/5000 + DXO One, + FujiFilm X-Pro2, X70, X-E2S, X-T2 + Gione E7 + GITUP GIT2 + Google Pixel,Pixel XL + Hasselblad X1D, True Zoom + HTC MyTouch 4G, One (A9), One (M9), 10 + Huawei P9 + Leica M (Typ 262), M-D (Typ 262), S (Typ 007), SL (Typ 601), X-U (Typ 113), TL + LG G3, G4 + Meizy MX4 + Nikon D5, D500, D3400 + Olympus E-PL8, E-M10 Mark II, Pen F, SH-3, E-M1-II + Panasonic DMC-G8/80/81/85, DMC-GX80/85, DMC-TZ80/81/85/ZS60, DMC-TZ100/101/ZS100,DMC-LX9/10/15, FZ2000/FZ2500 + Pentax K-1, K-3 II, K-70 + PhaseOne IQ3 100MP + RaspberryPi Camera, Camera V2 + Ricoh GR II + Samsung Galaxy S7, S7 Edge + Sigma sd Quattro + Sony A7S II, ILCA-68 (A68),ILCE-6300,DSC-RX1R II,DSC-RX10III, DSC-RX100V,ILCA-99M2 (A99-II), a6500 + IMX214, IMX219, IMX230, IMX298-mipi 16mp, IMX219-mipi 8mp, Xperia L + PtGrey GRAS-50S5C + YUNEEC CGO4 + Xiaomi MI3, RedMi Note3 Pro + + * Floating point DNG support: + - new data fields: + imgdata.rawdata.float_image - bayer float data + imgdata.rawdata.float3_image - 3-component float data + imgdata.rawdata.float4_image - 4-component float data + imgdata.color.fmaximum - float data maximum (calculated from real data, + rounded to 1.0 if below 1.0) + - new raw processing flag + LIBRAW_PROCESSING_CONVERTFLOAT_TO_INT - converts float data to 16-bit + integer immediately after decoding with default parameters + - new API Calls: + int LibRaw::is_floating_point() returns non-zero if RAW file contains + floating point data + int LibRaw::have_fpdata() returns non-zero if rawdata.float*_image is not + null (so FP data has been unpacked but not converted to integrer, see below). + LibRaw::convertFloatToInt(float dmin=4096.f, float dmax=32767.f, float dtarget = 16383.f) + converts float/float3/float4_image to raw_image/color3/color4_image with or without scaling: + - if both real data maximum and metadata maximum are within the range ( >= dmin && <=dmax), float + data is just converted to integer + - if data is out of the range given above, values are scaled so real data maximum becomes dtarget + - if data was rescaled (normalized), scale multiplier is stored in imgdata.color.fnorm + + * LibRaw can be built with Adobe DNG SDK support to decode exotic DNG formats (e.g. 8 bit). + See README.DNGSDK.txt for details + + * New API calls + unsigned LibRaw::capabilities and C-API libraw_capabilities() + allows developers to determine LibRaw compile flags at runtime. + Returns ORed bit fields: + LIBRAW_CAPS_RAWSPEED - LibRaw was compiled with RawSpeed Support + LIBRAW_CAPS_DNGSDK - LibRaw was compiled with Adobe DNG SDK + LIBRAW_CAPS_DEMOSAICSGPL2, LIBRAW_CAPS_DEMOSAICSGPL3 - LibRaw was compiled with demosaic packs (GPL2/GPL3) + + * More metadata parsed: + - White balance coefficients stored in the raw file are extracted into: + int imgdata.color.WBCoeffs[256][4] - array indexed by EXIF lightsource type + for example, WBCoeffs[21][..] contains coefficients for D65 lightsource + float imgdata.color.WBCT_Coeffs[64][5] contains white balance data specified + for given color temperature: WBCT_Coeffs[i][0] contains temperature value, + and [1]..[4] are WB coefficients. + - DNG analog balance, per-channel black/white level, and forward matrix + - vendor specific metadata stored in vendor-specific data structures + + * new C-API calls: + void libraw_set_user_mul(libraw_data_t *lr,int index, float val); + void libraw_set_ca_correction(libraw_data_t *lr,int ca_correc, float ca_red, float ca_blue); + void libraw_set_cfalinenoise(libraw_data_t *lr,int cfaline, float linenoise); + void libraw_set_wf_debanding(libraw_data_t *lr, int wf_debanding, float wfd0, float wfd1, float wfd2, float wfd3); + void libraw_set_interpolation_passes(libraw_data_t *lr,int passes); + + * Existing API changes: + imgdata.params fields (all very specific purpose): sony_arw2_options, sraw_ycc, and params.x3f_flags + replaced with single bit-field raw_processing_options + See LIBRAW_PROCESSING_* bits in documentation. + + * zlib library is optional + Use -DUSE_ZLIB to compile with zlib (to provide deflate DNG support) + * libjpeg version: jpeg_mem_src() is mandatory, so use libjpeg-turbo + or libjpeg 8+ + * Fixes in vng_interpolate to make modern compilers happy + * Fixed bug in Sony SR2 files black level + * DNG files with BlackLevel both in vendor makernotes and BlackLevel: + BlackLevel tag always takes precedence + * strlen replaced with strnlen in most cases, added local version of strnlen + * ChannelBlackLevel added to canon makernotes + * unpack_thumb() data size/offset check against file size + +2015-08-15 Alex Tutubalin + + * LibRaw 0.17 + + * Fixed dcraw.c ljpeg_start possibly buffer overrun + + * fixed several bugs detected by using American Fuzzy Lop + + * C-API extension to support 3DLut Creator + + * More metadata parsing/extraction: + - XMP packet extracted (if exists) + - DNG Color information parsed + - GPS data (partially) parsed + - EXIF/Makernotes parsed for used optics (for both RAW files and DNG converted by Adobe convertor). + + * Exif/Makernotes parser callback (called for each processed tag) + + * Sony ARW2.3 decoder: + - params.sony_arw2_hack removed, decoded data are always in 0...17k range (note the difference with dcraw!) + - Additional processing options for Sony lossy compression technical analysis. + + * Dcraw 9.26 imported (but some changes not approved because Libraw do it better) with some exceptions: + - no Pentax K3-II frame selection code + - no built-in JPEG decompressor + + * Many improvements in data decoding/processing: + - Correct decoding of black level values from metadata for many formats, LibRaw do not rely on hardcoded black levels. + + * 224 camera models added to supported camera list. + Some of them are new (released since LibRaw 0.16 come out), some was supported before, but missed from the list. + Added cameras are: + + Alcatel 5035D + BlackMagic Pocket Cinema Camera, Production Camera 4k + Canon PowerShot A550, A3300 IS, G1 X Mark II, G7 X, SD950, SX60 HS, EOS 7D Mark II, EOS 20Da, EOS 60Da, EOS 1200D, EOS-1D C, 5DS, 5DS R, 750D, 760D, M2, M3, G3 X + Casio EX-FC300S, EX-FC400S, EX-Z1080, EX-ZR700, EX-ZR710, EX-ZR750, EX-ZR800, EX-ZR850, EX-ZR1000, EX-ZR1100, ZR1200, ZR1300, EX-ZR1500, EX-100, EX-10 + Digital Bolex D16,D16M + DJI 4384x3288, + Epson R-D1s, R-D1x + FujiFilm E505,S1,S205EXR,HS10,HS11,HS22EXR,HS33EXR,HS35EXR,F505EXR,F605EXR,F775EXR,F900EXR,X100T,X30,X-T1,X-T1 Graphite Silver, XQ2, X-A2, X-T10 + Hasselblad H5D-60, H5D-50,H5D-50c,H5D-40,H4D-60,H4D-50,H4D-40,H4D-31,H3DII-22,H3DII-31,H3DII-39,H3DII-50,H3D-22,H3D-31,H3D-39,H2D-22,H2D-39,CF-22,CF-31,CF-39,Stellar II,HV + HTC UltraPixel + Imacon Ixpress 96, 96C, 384, 384C (single shot only),132C, 528C (single shot only) + ISG 2020x1520 + Ikonoskop A-Cam dII Panchromatic, A-Cam dII + Kinefinity KineMINI, KineRAW Mini, KineRAW S35 + Kodak DCS460D, S-1 + Leaf Credo 50 + Lenovo a820 + Leica Digital-Modul-R, D-Lux (Typ 109), M (Typ 240), Monochrom (Typ 240), M-E, M-P, R8, S, T (Typ 701), X (Typ 113), X2, X-E (Typ 102), V-Lux (Typ 114), Monochrom (Typ 246), Q + Matrix 4608x3288 + Nikon D4s, D600, D610, D750, D800, D800E, D810, D3300, D5500, Df, 1 J4, 1 S2, 1 V3, Coolpix P340, Coolscan NEF, D7200, 1 J5,D810A + Nokia 1200x1600 + Olympus E-450, E-600, E-PL6, E-PL7, E-M1, E-M10, E-M5 Mark II, SP565UZ, STYLUS1s, SH-2, TG-4, AIR-A01 + Panasonic DMC-CM1, DMC-FZ7, DMC-FZ70, DMC-FZ1000, DMC-GF7, DMC-GH4, AG-GH4, DMC-GM1s, DMC-GM5, DMC-LX100, DMC-TZ60/61/SZ40, DMC-TZ70, FZ300/330, GX8 + Pentax GR, K110D, K-01, K-S1, Q, QS-1, 645Z, K-S2, K3 II + PhaseOne IQ250, IQ260, IQ260 Achromatic, IQ280, Achromatic+, P 20+, P 21, P 25+, P 30+, P 40+ + Ricoh GXR MOUNT A12, GXR MOUNT A16 24-85mm F3.5-5.5, GXR, S10 24-72mm F2.5-4.4 VC, GXR, GR A12 50mm F2.5 MACRO, GXR, GR LENS A12 28mm F2.5, GXR, GXR P10 + Samsung GX-1L, NX1, NX5, NX1000, NX1100, NX30, NX300, NX300M, NX3000, NX mini, Galaxy S3, Galaxy Nexus, NX500 + Sigma dp1 Quattro, dp2 Quattro, dp3 Quattro, dp0 Quattro + Sinar eMotion 22, eMotion 54, eSpirit 65, eMotion 75, eVolution 75, Sinarback 54 + Sony A7 II, A7S, ILCA-77M2 (A77-II), ILCE-3000, ILCE-5000, ILCE-5100, ILCE-6000, ILCE-QX1, DSC-RX100III, DSLR-A560, NEX-VG20, NEX-VG30, NEX-VG900, IMX135-mipi 13mp, IMX135-QCOM, IMX072-mipi, RX100-IV, A7R-II, RX10-II + + * Fujifilm F700/S20Pro second frame support + +2014-02-01 Alex Tutubalin + * Updated Oly E-M10 & Panasonic TZ60/61 color data + * Updated foveon SD9-14 white level + * Support for 1x1 BlackLevelRepeatDim + +2014-01-31 Alex Tutubalin + * imported dcraw 1.461: fixed error in BlackLevelDim handling + * Accurate work with pattern black-level (cblack[6+]) + * Support for Olympus E-M10 and Fujifilm X-T1 + * Adjusted possible maximum value for Sigma SD9 small raws + +2014-01-27 Alex Tutubalin + * dcraw 1.460: Nikon D3300, Panasonic DMC-TZ61, Sony ILCE-5000 +2014-01-25 Alex Tutubalin + * PhaseOne IQ250 support (both compressed and uncompressed) +2014-01-21 Alex Tutubalin + * imgdata.params.sony_arw2_hack removed. + It always on for ARW2-files. + * New imgdata.params.sony_arw2_options processing flags + Values: + LIBRAW_SONYARW2_NONE - normal processing + LIBRAW_SONYARW2_BASEONLY - BASE pixels outputeed, delta pixels set to 0 + LIBRAW_SONYARW2_DELTAONLY - Delta pixels written to raw data, base pixels zeroed + LIBRAW_SONYARW2_DELTAZEROBASE - Only deltas written without base offset + +2014-01-20 Alex Tutubalin + * Imported dcraw 9.20: + - Support for DNG BlackLevelRepeatDim tags + - imgdata.color.cblack[] holds variable BlackLevel for DNG files (up to ~4k values) + - imgdata.params.use_camera_matrix is now ON by default. Set it to 3 if you want + to force use of DNG embedded matrix. + - Tone curve for Canon RMF format supported + - Color data for Canon C500 + * Additional camera support: + Alcatel 5035D + DJI 4384x3288 + Fujifilm F900EXR + Kodak 12MP + Matrix 4608x3288 + Nokia 1200x1600 + Olympus E-PL6 + Panasonic DMC-FZ7 + +2014-01-17 Alex Tutubalin + * Camera support: + Added: Fujifilm XE2, XQ1 + Color data updated: Nikon D4 1 AW1/J3, Fuji X-M2 + Fixes: Nikon D610 visible image area, Canon A3300 bayer + pattern + * RawSpeed support: enabled processing for cameras, + unknown to RawSpeed + * Fixed error in LibRaw::unpack_thumb() + * little improve performance in my_strcasestr + * Fix compiler errors for VS2012/OpenMP + * Fixed typo which prevents to use Demosaic Pack GPL2 + * LibRaw 0.16.0-Release + +2013-11-15 Alex Tutubalin + * New cameras supported + Leica C, X VARIO + Nikon D5300, D610, Df, 1 AW1 + Nokia Lumia 1020, 1520 + Olympus STYLUS1 + Pentax K-3 + Sony RX10, A3000 (ILCE-3000), + * Color data updated: + Canon S120 + Nikon P7800, 1 J3 + Olympus E-M1 + * Corrected image visible area sizes + Canon G16 + Sigma pre-Merrill cameras: small and medium-sized RAWs + + * Better EXIF parsing: + - ISO values for new Nikon cameras (D4, D800) + - black level extraction for Nikon D5300 + - correct Olympus color data conversion + + * Better Visual Studio compatibility (esp. old versions) + * Cmake build: added ws2_32 library for MinGW builds + * LibRaw 0.16.0-Beta1 + +2013-10-22 Alex Tutubalin + * Support for new cameras: + Sony A7, A7R + Panasonic GM1 + + * Sony RX1R and RX100M2 color data updated. + + * Sony cameras model name is set by SonyModelID EXIF tag + + * Sony ARW2: black level and color matrix extracted from EXIF data + + * Samsung: black level and color matrix extracted from EXIF; + Camera multipliers are now extracted correctly even if black is not 0 + + * Better source compatibility with Mac OS X compilation + + * Better source compatibility with Win32 compilation + + * DNG without Compression tag assumed uncompressed + + * Better X3F-tools based Foveon support: + - new Foveon metadata parser based on X3F-tools. So, if LibRaw compiled + without demosaic-pack-GPL2, then no dcraw Foveon code used. + - Support for Medium resolution RAWs from DPx Merrill and SD1 cameras. + RAW data extracted as is (4800x1600 pixels), aspect ratio is set to + 0.5, so these RAWs are processed to full-size 4800x3200 RGB. + - Support for Foveon thumbnail extraction. Only JPEG and bitmap + thumbnails extracted, but 'foveon' (RAW) thumbnails are really not used + in production cameras. + - New imgdata.params.force_foveon_x3f flag + Forces use of x3f-tools based code for Foveon processing if LibRaw + compiled with demosaic-pack-GPL2 (and does nothing if LibRaw compiled + without this pack). + New flag -disadcf added to dcraw_emu sample to use this flag. + - LibRaw do not calls exit() on broken Foveon files. + + * API/ABI changed, so all code using LibRaw should be recompiled. + + * LibRaw 0.16.0-Alpha3 + + +2013-10-16 Alex Tutubalin + * Support for new cameras: + Canon S120 (preliminary color data), G16 + Fujifilm X-A1 (preliminary color data) + Hasselblad Lunar, Stellar + Nikon P7800 (preliminary color data) + Pentax K50, K500, Q7 + Samsung Galaxy NX (EK-GN120) + Sony NEX-5T + + * Updated color data for: + Samsung NX300 + Sony RX1R + Sigma SD1, SD1 Merrill, DPxx (only if non-GPL2 foveon decoder used) + + * Image dimensions table for Foveon cameras (only if + non-GPL2 foveon decoder used) + + * Fixed memory leak in x3f-tools code (new Foveon decoder) + * Fixed DHT-demosaic incompatibility with MS VisualStudio in OpenMP directives + * Additional image size checks. + * LibRaw 0.16-Alpha2 + +2013-09-22 Alex Tutubalin + * Support for new cameras: + Baumer TXG14 + Blackmagic Cinema + Canon EOS 70D, C500 + Fujifilm X-M1 + Nikon D5200 + Olympus E-P5,E-M1 + OmniVision OV5647 (Raspberry Pi) + Panasonic LF1, GX7, GF6 + Richon GR + Samsung NX300, NX1100, NX2000 + Sony RX100II, RX1R, NEX-3N + + * Support for Foveon sensor based on X3F code by Roland Karlsson + BSD-like license, so included in main LibRaw code. + No 'foveon interpolation', so no way to get good colors from + old Sigma cameras (SD9, SD14, Polaroid x530). For modern Foveon cameras + one may try to create ICC profile (not supplied). + + TODO: thumbnail extraction, fast cancellation + + Old foveon_*_load_raw (from dcraw) code is used if compiled with + LIBRAW_DEMOSAIC_PACK_GPL2 + + * API Changes: + + + New parameters in imgdata.params: + - imgdata.params.no_interpolation - disables interpolation step in + LibRaw::dcraw_process() call. + - imgdata.params.no_auto_scale - disables call to scale_colors() in + LibRaw::dcraw_process() call. + - imgdata.params.sraw_ycc - disables Canon sRAW YCbCr to RGB conversion + in LibRaw::unpack() call (use for RAW analyzers + + + New Fuji X-Trans handling: + - imgdata.iparams.filters value is now 9 for Fuji X-Trans (instead of 2) + - imgdata.iparams.xtrans[6][6] matrix contains row/col to color mapping + for Fuji X-Trans sensor. + + + LibRaw::setCancelFlag() - use for fast decoder termination + + + LibRaw_abstract_datastream::make_byte_buffer() call is not needed more. + + + New demosaic code: DHT Demosaic by Anton Petrusevich + Set params.user_qual=11 to use. + + + New demosaic code: Modified AHD Demosaic by Anton Petrusevich + Set params.user_qual=12 to use. + + + New C-API call libraw_COLOR(libraw_data_t *t, int row,int col) + (so LibRaw::COLOR(row,col) exposed to C-API users) + + * Removed faster lossless jpeg decoder ported from RawSpeed library + some years ago. Build LibRaw with RawSpeed to get fast decoding. + + * Fixed decoding error for some Canon sRAW files. + + * Disabled RawSpeed's bad pixel processing if RawSpeed used. + + * EOS M and EOS 70D added to unique Canon ID table + + * Canon EOS model name normalized by unique ID table + + * Backported 0.15.4 input data checks + + * Support for CMake builds + + * Updated RawSpeed supported camera list + + * Internals changed, so all code using LibRaw should be recompiled. + + * LibRaw 0.16.0-Alpha1 + +2013-05-23 Alex Tutubalin + + LibRaw 0.15-Release + + New camera/format support: + * Adobe DNG: fast Load DNG (LightRoom 4.x), support for + lossy-compressed DNG (LR 4.x, requires libjpeg 6+) + * Canon: G1 X, SX220 HS, EOS 5D Mark III, EOS 650D, EOS 1D-X, + 100D (Rebel SL1), 700D (Rebel T5i), 6D, EOS M, G15, S110, SX50 + * Casio: EX-ZR100,EX-Z8 + * Fujifilm: X-S1, HS30EXR, X1-Pro,X-E1, X20, X100S, SL1000, HS50EXR, + F800EXR, XF1 + * Leica: D-LUX6 and V-LUX4 + * Nikon: D4, D3200, D800, D800E, 1 J2, 1 V2, D600, 1 J3, 1 S1, Coolpix A, + Coolpix P330, Coolpix P7700, D7100 + * Olympus: E-M5, XZ-2, XZ-10, E-PL5, E-PM2 + * Panasonic: G5, G6, DMC-GF5, FZ200, GH3, LX7 + * Pentax: MX-1, K-5 II, K-5 IIs, K-30, Q10 + * Samsung: EX2F, NX20, NX210, support for the new firmware for NX100 + * Sigma: SD15, SD1, SD1 Merill, DP1, DP1S, DP1X, DP2, DP2S, DP2X + (only with Demosaic-pack-GPL2) + * Sony: SLT-A58, RX-1, SLT-A99, NEX-5R, NEX-6, NEX-F3, SLT-A37, SLT-A57 + * Multishot files: Imacon Ixpress 39Mpix + +API changes: + 1. dcraw_process() can now be called several times with different parameters + without re-opening and unpacking the file for second and consecutive + calls to dcraw_process + + 2. deleted (nobody uses those) + - LibRaw::dcraw_document_mode_processing (and respective C-API) + - imgdata.color.color_flags data field + + 3. LibRaw::unpack() now decodes data into different buffers, the buffer + depends on the raw data type + - imgdata.rawdata.raw_image - 1 color component per pixel, + for b/w and Bayer type sensors + - imgdata.rawdata.color3_image - 3 color components per pixel, + sRAW/mRAW files, RawSpeed decoding + - imgdata.rawdata.color4_image - 4 components per pixel, the 4th + component can be void + + 4. Support for compiling with RawSpeed library, http://rawstudio.org/blog/?p=800 + details are in README.RawSpeed + + 5. Suppression of banding + + 6. New API calls + - recycle_datastream(), + - open_file(wchar_t*) (Win32) + + +2012-04-05 Alex Tutubalin + * Casio EX-Z500 support + * (possible) I/O exceptions on file open caught in open_datastream + * Fixed possible read-after-buffer in Sony ARW2 decoder + * Fixed mingw32 errors when compiling LibRaw_windows_datastream + * Makefile.msvc: support of OpenMP and LCMS (uncomment to use) + * Fixed decoding of some Leaf Aptus II files + * LibRaw 0.14.6-Release + +2011-12-24 Alex Tutubalin + * Fixed bug (uninitialized variable) in SMAL format decoding. + + * Imported new dcraw 9.12 (1.446): support for Leica V-LUX 3, + updated color data for Canon S100, Fujifilm X10, Nikon 1 J1/V1, + Panasonic GX1, Samsung NX200, Sony NEX-7 + + * LibRaw 0.14.5-Release + +2011-12-12 Alex Tutubalin + + * Fixes to Panasonic/Leica file parser to prevent crash + on broken jpegs. + + * Fixes to include order in src/libraw_datastream.cpp to + better compile with KDEWIN + + * Floating-point DNGs are rejected on early processing stage. + + * Support for new cameras: Canon S100, Fuji X10, Panasonic GX1, + Samsung NX200, Sony NEX-7. + + * LibRaw 0.14.4-Release + + +2011-10-26 Alex Tutubalin + * Bug fixes in black level subtraction code for PhaseOne files + + * New API call LibRaw::get_internal_data_pointer() for developers + who need access to libraw_internal_data fields (i.e. + Fuji SuperCCD layout). + + * doc/API-overview fixes to reflect 0.14 changes + + * LibRaw 0.14.3-Release + +2011-10-19 Alex Tutubalin + * Fixed bug in Canon 1D and 1Ds files decoding. + * New decoder information bit DECODER_HASRAWCURVE + * LibRaw 0.14.2-Release + +2011-10-11 Alex Tutubalin + * Imported dcraw 9.11/1.445: + + Support for new cameras added: Fujifilm F600EXR, Nikon P7100, + Olympus E-PL3 and E-PM1, Panasonic DMC-FZ150, Sony NEX-5N, + A65 and A77. + + Changed color data for: Olympus E-P3, Panasonic G3 and GF3, + PhaseOne H25, P40 and P65, Sony NEX-C3, NEX-5, NEX-3, A35 and A55. + + Support for dark frame extraction on Sony cameras. + + * DCB demosaicing: reserving 6 pixels instead of 3 to suppress + colored image frame. + * LibRaw 0.14.1-Release + +2011-09-21 Alex Tutubalin + * Cosmetic changes to make Visual C++/OpenMP more happy + * Fix megapixel calculation for postprocessing_benchmark in half mode + * Shlib version number increment + * LibRaw 0.14.0-Release + +2011-09-04 Alex Tutubalin + * Fixed bug with Kodak thumbnail extraction + * raw2image_ex() always return value + * LibRaw 0.14.0-Beta2 + +2011-09-02 Alex Tutubalin + * Cosmetic changes to LibRaw_file_datastream interface + + * OpenMP speedup of postprocessing steps (up to 50% for + half mode and 4-core machine) + + * LibRaw 0.14.0-Beta1 + +2011-08-20 Alex Tutubalin + + * Patch to dcraw_emu for SunStudio compiler compatibility + + * Fixed crash in unprocessed_raw sample due to uninitialized + timestamp variable. + + * Fixed crash in raw decoding if raw_width/raw_height is + less than resulting image width/height. + + * imgdata.sizes.flip is set from user_flip only on + postprocessing and/or adjust_sizes_info_only() + + * Fixed buffer overrun for some LJPEG-compressed files + + * Most of LibRaw_datastream function bodies are moved to + separate source file + + * LibRaw_windows_datastream is merged to main sourcetree + + * LibRaw 0.14.0-Alpha5 + +2011-08-11 Alex Tutubalin + * Imported dcraw 9.10 (1.444), support for new cameras added: + ARRIRAW format, Canon SX30 IS, Leica D-LUX 5 and V-LUX2, + Olympus E-P3, Panasonic G3 and GF3, Sony NEX-C3 and SLT-A35 + + * Support for RedOne digital movie cameras (R3D format). + To enable this support you should: + + install libjasper JPEG2000 support library + + + compile LibRaw with -DUSE_JASPER compiler switch (./configure + will do it for you) + + + If you use own LibRaw_datastream implementation, you should + implement make_jas_stream() call for your datastream. See + bottom of src/libraw_cxx.cpp for implementations in datafile + and mem-buffer LibRaw streams. + + * Bugfix: green matching is turned off if output image is shrinked + due to wavelet filtering or aberration correction. + + * fixed open_file()/adjust_sizes_info_only() code path + + * Removed imgdata.sizes.bottom_margin and right_margin data fields + use imgdata.sizes.raw_width - width - left_margin to get right one, + the same with bottom_margin. + + * minor ./configure cleanup + + * Qmake files and Visual Studio Project files are updated. + + * New version check macros: + For use at runtime checks: + LIBRAW_RUNTIME_CHECK_VERSION_EXACT() - checks that runtime + major/minor version numbers are same with compile-time values. + + LIBRAW_RUNTIME_CHECK_VERSION_NOTLESS() - checks that runtime + version is not less that compile-time one. + + For use at compile-time in preprocessor directives: + LIBRAW_COMPILE_CHECK_VERSION_EXACT(major,minor) - Compile-time + check that LibRaw version is exact major.minor. + + LIBRAW_COMPILE_CHECK_VERSION_NOTLESS(major,minor) - Compile-time + check that version is not less than major.minor. + + * all client code should be recompiled due to internals change. + + * LibRaw 0.14.0-Alpha4 + +2011-07-19 Alex Tutubalin + * New sample samples/postprocessing_benchmark.cpp + This sample measures postprocessing speed. + All demosaic methods, averaged white balance, median + filtering, wavelet filtration, highlight recovery, and + cropping are supported. + + * Removed LibRaw::rotate_fuji_raw() call and corresponding C-API call. + + * The LibRaw::adjust_sizes_info_only() call may be called repeated + and mixed with dcraw_process() call. + + * Postprocessing speedup and optimization, especially if cropping set. + + * Cropping works for FujiCCD raws. For the technical reasons, the position + of top-left corner of crop area will be rounded to the nearest + multiple of 4 (the corner is shifted top-left). + + * LibRaw 0.14.0-Alpha3 + +2011-07-15 Alex Tutubalin + * imported cropping code from 0.13 branch + +2011-07-12 Alex Tutubalin + * samples/multirender_test - check for different clip settings + +2011-07-11 Alex Tutubalin + * New call LibRaw::free_image(), deallocates imgdata.image buffer. + Use this call if current postprocessing results are not + needed, but it is to early to call recycle() because + dcraw_process() may be called later. + + * New C-API calls + libraw_raw2image() - C API for LibRaw::raw2image() + libraw_free_image() - C API for LibRaw::free_image() + libraw_get_decoder_info() - C API for LibRaw::get_decoder_info() + + * Bugfix: change of params.user_flip aftee open()/unpack() + calls should work. + + * LibRaw 0.14.0-Alpha2 + +2011-07-10 Alex Tutubalin + * Multiple rendering (LibRaw::dcraw_process() calls) allowed + without re-opening RAW file thrfough the sequence of open()/unpack() + calls. + You should be able to change any processing parameters (except + shot_select parameter) between dcraw_process() calls. + + + New sample in samples/multirender_test.cpp: renders data 4 times: + in half and full modes with different white balance settings. + + + Unprocessed RAW data is stored in separate data buffer: + (2 bytes per pixel for all Bayer-pattern images, + 8 bytes per pixel for Foveon, sRAW, and other full-color raw + formats), so now LibRaw uses 25% more memory for full processing of + most common Bayer images; while for just unpack memory is reduced + 4 times. + + + New call LibRaw::raw2image() fills imgdata.image array + with fresh copy of data. + There is no need to call raw2image() separately if you use + dcraw_process() or dcraw_document_mode_processing() calls. + + + New call LibRaw::get_decoder_info() to determine raw data + storage layout. See samples/unprocessed_raw.cpp for an example + of how to use it. + + If your code uses usual open()/unpack()/dcraw_process() call + sequence, then NOTHING CHANGED: your program should produce same + results. For interactive programs you may skip open()/unpack() + calls after adjusting processing parameters, so user should see + image refreshed much faster. + + If your code uses raw data (open+unpack calls), you need to call + LibRaw::raw2image(), and imgdata.image will contain same bitmap + as in LibRaw 0.13.x + + If you code uses access to masked borders data, you need to + rewrite it. See samples/unprocessed_raw.cpp as a sample. + + Unfortunately, documentation is untouched yet. This problem will be + fixed in next Alpha release. + + Other changes: + + * No separate imgdata.masked_pixels buffers, Bayer raw formats are read + to buffer with borders. So, no ugly add_masked_border_to_bitmap() + call. + + * No filtering_mode parameter. Raw tone curve is applied + at unpack() stage; zero pixels removed on postprocessing stage. + + * unprocessed_raw and 4colors samples are adjusted to use + new RAW data storage layout. + + * all client code should be recompiled due to internals change. + + * LibRaw 0.14.0-Alpha1 + +2011-07-03 Alex Tutubalin + * Cosmetic cleanup in Libraw_memmgr code + + * Permit OpenMP support on MS VS2008 + + * More general mem_image interface: + + New call get_mem_image_format returns bitmap size and bit depth + + New call copy_mem_image can copy bitmap into buffer with + different color order (RGB/BGR) and line stride + + dcraw_make_mem_image() uses calls mentioned above + + see documentation for info on these function parameters. + + * libraw/librawwindows.h implements LibRaw_datastream class based + on Windows memory mapped files.Win32/64-only + Thanks to Linc Brookes. + + * Fixed parallel make errors in configure/Makefile.am + + * LibRaw 0.13.6-Release + + +2011-05-18 Alex Tutubalin + * Imported new dcraw 9.08/1.443: + + New color data for Canon 600D and 1100D, Fuji S200EXR + + New camera supported: Fuji HS20EXR and F550EXR, Kodak Z990, + Nikon D5100, Olympus E-PL1s and XZ-1, + Samsung NX11, Sony A230 and 290. + * LibRaw 0.13.5-Release + +2011-04-02 Alex Tutubalin + * Imported new dcraw 9.07/1.442: + + Support for Canon 600D and 1100D, Hasselblad H4D-60, + Olympus E-PL2 + * Color data for Leaf Aptus II and Canon Powershot S2 IS + * LibRaw 0.13.4-Release + +2011-03-30 Alex Tutubalin + * Preliminary support for Leaf Aptus II cameras (no color data yet): + Leaf Aptus II 6,7,8,10 and 12 are tested, Aptus II 5 should work. + * Preliminary support for Fujifilm X100 camera (again, no color data). + * Fixed possible after the end of buffer read when working with + in-memory data. + * Fixed possible loss of JPEG stream sync marks in LJPEG decoder + (this bug was found only for Leaf Aptus II RAWs). + * LibRaw 0.13.3-Release + +2011-03-08 Alex Tutubalin + * Fixed broken camera white balance reading for some Sony cameras + * LibRaw 0.13.2-Release + +2011-02-25 Alex Tutubalin + * Sony A390 support (colordata from A380) + * Leica D-LUX 4: fixed typo in camera name in colordata + +2011-02-15 Alex Tutubalin + * New -mem option for dcraw_emu: I/O via allocated buffer + * Removed debug printf from LibRaw_memory_buffer code + * Preliminary shared library support + +2011-02-12 Alex Tutubalin + * Added qmake .pro and Visual Studio 2008 sln/vcproj project files +2011-02-07 Alex Tutubalin + * dcraw_emu documentation updated + * ./configure stuff changed for correct linking on some systems + * FBDD denoising is disabled for full-color images and 4-color bayer + data (including forced 4-color via four_color_rgb option) + * LibRaw 0.13.1-Release + +2011-02-05 Alex Tutubalin + * ./configure fixes for PACKAGE_REQUIRES + * Makefile.msvc: correct compiler flags for demosaic packs + * dcraw.c 9.06/1.440 imported: + + New camera support: Canon S95, Casio EX-Z1080, Panasonic GF2 + and GH2, Samsung NX100, Sony A-580 + + New color data for: Canon G12, Nikon D3100, D7000 and P7000, + Olympus E-5, Pentax K-r and K-5, Samsung NX10 and WB2000 + * green_matching() code is disabled for half-size processing + * LibRaw 0.13.0-Release + +2011-01-15 Alex Tutubalin + * Fallback to old huffman decoder for Sony files with unspecified + data length (Sony A100) + * Fixed incomplete data fields reset in LibRaw::recycle() + * LibRaw 0.13.0-Beta3 + +2011-01-13 Alex Tutubalin + * Better parsing of unknown command-line params in dcraw_emu sample + * Brigtness table in ahd_demosaic is calculated in reversed order + to prevent possible (very unlikely) multithreaded app problem. + * New exposure correction code based on linear-cubic root combination. + New working correction range is from 0.25 (-2 stops) to 8 (+3 stops) + * LibRaw 0.13.0-Beta2 + +2011-01-10 Alex Tutubalin + * Fixed file extension in half_mt.c sample + +2011-01-10 Alex Tutubalin + * Three patches provided by Jacques Desmis: + - Exposure correction before demosaic (demosaic pack GPL3) + - OpenMP speed-up in median filters (demosaic pack GPL2) + - OpenMP speed-up in green equilibration (demosaic pack GPL3) + * Merged 0.12.2-0.12.3 changes: + - Patches for ./configure system for better LCMS2 support + - Patches for ./configure system + - math.h included before any other includes to make KDE compile + with Visual C++ happy + - Fuji FinePix S5500 size adjusted to ignore (rare?) garbage + at top of frame. + * all client code should be recompiled due to internals change. + * LibRaw 0.13.0-Beta1 + +2010-12-22 Alex Tutubalin + * Zero copy huffman buffer for LibRaw_buffer_datastream + * Fixed memory leak in compressed NEFs handling + * LibRaw 0.13.0-Alpha2 + +2010-12-20 Alex Tutubalin + * Demosaic-pack-GPL3 changes: + + New noise reduction methods before demosaic + - Banding suppression + - High-frequency noise suppression + - Green channel equalization + + New chromatic aberration correction. + All three methods are written by Emil Martinec for Raw Therapee. + Adapted to LibRaw by Jacques Desmis + + * Merged Foveon code fix from LibRaw 0.12.1 + + * LJPEG decompressor speed-up (about 1.5 times for Canon cameras + and slightly less for others). Some ideas are from RawSpeed library. + + * all client code should be recompiled due to internals change. + + * LibRaw 0.13.0-Alpha1 + +2010-12-12 Alex Tutubalin + * Thread-safe and demosaic packs support for MinGW build + * Demosaic packs support for MS VC build + * LibRaw 0.12.0-Release + +2010-12-09 Alex Tutubalin + * Fixed bug in add_masked_borders_to_bitmap() call for cameras + with odd pixels border. + * New command line options for unprocessed_raw sample: + -B - subtract black level, -M - add masked pixels to bitmap. + * Foveon-sensor cameras added to supported camera list if + compiled with demosaic pack GPL2 + * LibRaw 0.12.0-Beta4 + +2010-12-05 Alex Tutubalin + * Demosaic packs support in Makefile.dist + * Foveon support in LibRaw demosaic pack GPL2 + * all client code should be recompiled due to internals change. + * LibRaw 0.12.0-Beta3 + +2010-11-27 Alex Tutubalin + * Fixed allocation bug in lmmse_interpolation (demosaic-pack-GPL2) + * In LMMSE and AMaZE interpolators allocation changed to calloc + to make valgrind happy with uninitialized values + * Changes in distribution-making scripts + * LibRaw 0.12.0-Beta2 + +2010-11-21 Alex Tutubalin + * Fixes to green_matching code by Sergey Pavlov + +2010-11-20 Alex Tutubalin + * Update for new demosaic-pack-GPL3 + * LibRaw 0.12.0-Beta1 + +2010-11-19 Alex Tutubalin + * Demosaic pack(s) supported via ./configure + +2010-11-17 Alex Tutubalin + * LCMS2 support + * afd_interpolate(2,1) instead of (5,0) + * dcraw_emu sample command line keys added and reordered + to reflect changes in LibRaw 0.12. + * Nikon P7000: color matrix data and black level patch for ISO >=400 + Thanks to Gunnar Thorburn + * Support for several industrial cameras based on Sony ICX 625/655 + sensor: JAI BB500CL/GE, SVS625CL, ptGrey GRAS-50S5C + Thanks to kaare + +2010-11-15 Alex Tutubalin + + * Several demosaic algorithms, found in other open-source RAW processing + packages are implemented in LibRaw. + + 1) DCB demosaic and FBDD denoise by Jacek Gozdz are included in + main LibRaw source. + 2) GPL2 demosaic pack with these demosaic methods: + * AFD and LMMSE implementations from PerfectRaw by Manuel Llorens + * VCD, Modified AHD, post-demosaic refinemend and median + filters by Paul Lee + 3) GPL3 demosaic pack with AMaZe interpolation by Emil Martinec + + See more details in README.demosaic-packs + + * Current implementation of dcraw_emu sample allows only selection + of demosaic method (via -q) options. All other parameters change + will be implemented later. + + * LibRaw 0.12-alpha1 + +2010-11-11 Alex Tutubalin + * Imported 0.11(2) version changes: + + Fixed dcraw_emu command line processing code + + OpenMP is completely disabled on MacOS X if compiled with -pthread + due to well-known MacOS problem. + + dcraw 9.05 (1.439) imported, many new cameras supported: + Canon: G12, SX120, 60D, + Hasselblad H4D, Nokia X2, Olympus E-5, + Nikon: D3100, D7000, P7000, + Panasonic: FZ40, FZ100, LX5, + Pentax: K-r, K-5, 645D, + Samsung GX20, WB2000 + * LibRaw 0.12-alpha0 + +2010-11-08 Alex Tutubalin + * Fixes for Sun Studio compiler compatibility + * Fixes for Visual Studio 2010 compatibility + * All russian-language files are converted to UTF-8 + * LibRaw 0.11.0-Release + +2010-10-18 Alex Tutubalin + * Disabled OpenMP for wavelet_denoise under Mac OS X + * More Visual C++ 2003 warnings cleaned in libraw/*h files + * LibRaw 0.11-Beta7 + +2010-10-16 Alex Tutubalin + * internal/dcraw_fileio.c can be compiled with -DDCRAW_VERBOSE again + * fixed comment style in libraw_datastream.h + * LibRaw 0.11-Beta6 + +2010-10-15 Alex Tutubalin + + * New changes to I/O layer. Three LibRaw_*datastream clasees are + exists: + + LibRaw_buffer_datastream - buffer reaging + + LibRaw_file_datastream - file reading using iostreams + (large files are no supported on some systems) + + LibRaw_bigfile_datastream - FILE*-based file I/O + + * file/bigfile_datastream is selected automatically by + LibRaw::open_file based on input file size. + By default, files larger than 250Mb are opened using + bigfile interface, you may change this behaviour + by using second optional parameter of open_file() + + * There is no way to use default parameter values in C API, + so new call libraw_open_file_ex added with two parameters + (file name and minimal file size for bigfile_datastream use). + + * all client code should be recompiled due to internals change. + + * All LibRaw_abstract_datastream functions are virtual again. You may + (again) use your own I/O layer. + + * new -d key for dcraw_emu sample: print timings of processing stages + + * simple_dcraw sample simplified: no mmap code + + * LibRaw 0.11-Beta5 + +2010-10-08 Alex Tutubalin + * Fixed bug in exception handling in OpenMP sections in + AHD interpolation code. + + * LibRaw_datastreams are now C++ iostreams based instead of old + plain FILE* calls. + LibRaw::open_file() in multithreaded programs are WAY faster + on many OSes (Linux, Windows, MacOSX) because of no extra locks. + + * all client code should be recompiled due to internals change. + + * LibRaw 0.11-Beta4 + + +2010-10-01 Alex Tutubalin + * Fixed bug in LibRaw::dcraw_process() code: for half_size + processing, params.four_color_rgb was set to 1 internally + and not returned back after postprocessing. + + * Several Visual Studio 2003 compatibility fixes + + * AHD interpolation refactored. Now it is about 10% faster than + dcraw in single-process mode and up to 1.5 times faster on + 4-core and OpenMP (total execution time counted, not AHD itself) + Thanks to Adam Hooper + * AHD interpolation refactored. Now it is about 10% faster than + dcraw in single-process mode and up to 1.5 times faster on + 4-core and OpenMP (total execution time counted, not AHD itself) + Thanks to Adam Hooper + + * LibRaw 0.11-Beta3 + +2010-09-07 Alex Tutubalin + * Phase One files: LibRaw::unpack() sets colordata.black to + approximately correct value. + + * Fixed minor error in setting colordata.maximum value + for Phase One files. + + * LibRaw::subtract_black() sets colordata.black and + colordata.cblack[] to zero to preserve data integrity. + + * LibRaw 0.11-Beta2 + + +2010-09-04 Alex Tutubalin + + * It is now possible to crop output image on postprocessing + stage (dcraw_process). Coordinates and size of the output box + are set via imgdata.params.cropbox[4] parameter. Look into + LibRaw documentation for more details. + + + New fatal error code LIBRAW_BAD_CROP + + + New dcraw_emu sample command line switch: -B x y w h + (sets cropbox) + + Thanks to Patrick and Jan. + + * Processing pipeline has changed: the black level is subtracted + from data on postprocessing stage either automatically + (on dcraw_process() stage) or by special LibRaw API call: + + + New API calls: LibRaw::subtract_black() (C++ API) and + libraw_subtract_black (C API). + If you use dcraw_process() or dcraw_document_mode_processing() + calls YOU DON'T NEED to call subtract_black() directly. + + + The raw preprocessing mode LIBRAW_FILTERING_NOBLACKS + is deprecated and removed from LibRaw. + + * New ./configure script. + Use ./configure -h for usage details. + Thanks to Siddhesh Poyarekar + + * New API cals static LibRaw::dcraw_clear_mem() (C++ API) + and libraw_dcraw_clear_mem(..) (C API). + This calls are used to free memory, allocated by + dcraw_make_mem_image() and dcraw_make_mem_thumb() instead + of free() call. + + In some cases LibRaw and calling process have different + memory managers, so free() of make_mem_image() data + results to program crash (especially in Win32/VisualStudio + environment). + + * LibRaw::free() is now private instead of public (again). + + * Minor changes and bugfixes: + + + Memory allocation exceptions (std::bad_alloc) are caught, + so LibRaw API calls will return reasonable error codes + instead of C++ exception (possibly unhandled). + This problem is very unlikely to see in wild: if application + cannot allocate small data for internal structure, it will + always fail on allocation for RAW image data. + + + WIN32/VisualStudio 2008/2010: fopen,fscanf and sscanf calls + in Libraw_datastream code are changed to *_s (secure) ones. + + + Debug print removed from fatal error handler. + + + Mmaped I/O for dcraw_emu sample is turned on via -E switch + now (because old -B switch is used for setting cropbox). + + * all client code should be recompiled due to structures size change + + * LibRaw 0.11-Beta1 + + +2010-07-31 Alex Tutubalin + * dcraw 9.04 (1.438) imported: changes in tiff metadata parser, + fixed a typo in Canon A720 model name + * small patch in Sony ARW2 unpacking code to make valgrind happy + * LibRaw 0.10.0-Beta3. + +2010-07-05 Alex Tutubalin + * dcraw 9.03 (1.437) imported: + + New cameras: Canon SX20, Nikon D3s, Olympus E-P2, Panasoni DMC-GF1, + Samsung EX1, Sony A450 + + Color data changed for some cameras + + * LibRaw 0.10.0-Beta2. + +2010-06-06 Alex Tutubalin + * dcraw 9.01 (1.434) imported: + + Separate black levels for each color channel. + + New cameras: Canon 550D, Casio EX-Z1050, Fuji HS10/HS11, + Kodak Z981, Panasonic G2 and G10, Phase One P65, + Samsung NX-10 and WB550, Sony NEX-3 and NEX-5. + + Fixed file descriptor leak in dark frame subtraction processing + + * Fixed dcraw 9.01's bug in DNG black level processing + + * Preliminary support for Sony A450 camera. + + * New command-line switch -h in mem_image sample (half_size support) + + * Some patches by Johannes Hanika (darktable author): + + OpenMP speedup for PPG-interpolation + + green_matching - suppress of 'color maze' on cameras with + different green channel sensitivity. This option is turns on + by filed with same name in imgdata.params + + * all client code should be recompiled due to structures size + change + + * LibRaw::free() is now public instead of private. + + * LibRaw 0.10.0-Beta1. + +2010-05-15 Alex Tutubalin + * Fixed bug in 8-bit RAW processing code + * LibRaw 0.9.1-Release + +2010-04-26 Alex Tutubalin + * OpenMP support: OpenMP is possible under MinGW (untested) + * LibRaw 0.9.0-Release + +2010-04-21 Alex Tutubalin + * Finally fixed inconsistency in Fuji files processing + * New COLOR(row,col) call to get bayer color index in image[] array + * Old FC() call is deprecated and will be removed in future releases + * unprocessed_raw sample switched to COLOR() call + * LibRaw 0.9.0-Beta5 + + +2010-04-10 Alex Tutubalin + * Fixed bug in unpacking DNG files made from Fuji RAFs. + * LibRaw 0.9.0-Beta4 + +2010-04-09 Alex Tutubalin + + * Fixed typecast error (problem reported only on gcc 4.2.1/32bit) + in CRW files processing. + + * C++ API call LibRaw::adjust_maximum() is now deprecated and + de-documented, use params.adjust_maximum_thr instead (on by default) + + * C-API call libraw_adjust_maximum() removed. + + * New postprocessing parameter params.adjust_maximum_thr + This parameter replaces LibRaw::adjust_maximum(), but more flexible + Defaults are reasonable (0.75, same as in old adjust_maximum), + look into documentation for more details. + + * Removed last OpenMP warning + + * dcraw_emu's -c parameter now wants numeric (float) argument. This value + is assigned to params.adjust_maximum_thr. + Use -c 0.0 for dcraw compatibility. + + * all client code should be recompiled due to structures size + change + + * LibRaw 0.9.0-Beta3 + + +2010-03-29 Alex Tutubalin + * Fixed a bug in channel_maximum[] calculation for + Panasonic cameras. + * channel_maximum[] data now calculated for ALL cameras. + * OpenMP warnings suppressed. + * Documented the -c command-line switch for dcraw_emu sample. + * Removed extra messages from dcraw_emu sample. + * LibRaw 0.9.0-Beta2 + +2010-03-28 Alex Tutubalin + + New licensing: + + * Triple licensing (selected by LibRaw user): + + + LGPL 2.1 (http://www.gnu.org/licenses/lgpl-2.1.html) + + CDDL 1.0 (http://www.opensource.org/licenses/cddl1.txt) + + LibRaw Software License (27 March 2010 version) + (http://www.libraw.org/data/LICENSE.LibRaw.pdf) + + * There is no separate LibRaw-Lite and LibRaw-Commercial versions, + only single LibRaw. + Current LibRaw-Lite and LibRaw-Commercial users should switch + to LibRaw without loss of functionality. + It is possible to change licensig too (e.g. from LGPL to CDDL + for LibRaw-Lite users and from LibRaw License to LGPL or CDDL + for LibRaw-Commercial users). + + * No Foveon support :( + It is not possible to get good color from Foveon sensors with + *any* converter. So, there is no need to support these cameras. + Dcraw's Foveon-processing code is too strict licensed (GPL), + so we choose to drop it. + + New Features: + + * New data field colordata.channel_maximum[4] - per channel data + maximum (calculated for most cameras, 0 for others). + + * New call LibRaw::adjust_maximum() (and libraw_adjust_maximum() in C API). + This call changes hardcoded colordata.maximum value to calculated + at unpack stage. This helps suppress false color in highlights + (magenta clouds and so). + + * New command line parameter -c for dcraw_emu sample. Calls adjust_maximum() + for each processed file. + + * all client code should be recompiled due to structures size + change + + * LibRaw 0.9.0-Beta1 + +2010-02-06 Alex Tutubalin + * Fixed ambiguity in pow/sqrt calls (to make Sun C++ compiler happy) + * OpenMP is not supported under MS Visual Studio + * Masked a bug in RIFF format parser + * LibRaw 0.8.6 + +2009-12-30 Alex Tutubalin + * Fixed bug in simple_dcraw sample parameters processing + * Imported dcraw 8.99 (1.432): + + New cameras: Canon: 1D mk IV, Canon S90; Casio Z750, + Nikon D3S, Pentax K-x, Sony A-500/550, Fuji S200EXR + + New color data for Canon G11 and Sony A850 + + Changes in Canon sRAW processing + + Changes in Kodak metadata processing + + Changes in uncompressed Fuji files processing (FinePix S5xxx) + * LibRaw 0.8.5 + +2009-11-21 Alex Tutubalin + + Fixed a bug in processing of uncompressed Phase One files + * LibRaw 0.8.4 + +2009-10-24 Alex Tutubalin + + Imported dcraw 8.98/1.431: + * New Cameras: Canon 7D, Panasonic GF1, Sony A850 and A380, + Casio Z850, Nikon D300s + + changes in libraw_datastream.h to make compilers more happy + * LibRaw 0.8.3 + +2009-09-02 Alex Tutubalin + + Fixed bug in Hasselblad .3FR unpacking code + * Imported dcraw 8.97/1.428: Nikon D3000 image width fix + * LibRaw 0.8.2 + +2009-08-31 Alex Tutubalin + + Enum LibRaw_thumbnail_formats (LIBRAW_IMAGE_*) values changed to + match values in enum LibRaw_image_formats (LIBRAW_THUMBNAIL_*). + You need to recompile all sources using these constants. + +2009-08-30 Alex Tutubalin + * Imported dcraw 8.97/1.427: + + new cameras: Canon A470, Canon G11 (without color data), + Nikon D3000, Olympus E-P1, Panasonic DMC-FZ35/FZ38 + + some changes in decoding code. + * Fixes for Microsoft Visual C++ 6.0 compatibility + * C-API dcraw_make_mem_thumb() call finally exported in API + * LibRaw 0.8.1 + +2009-08-24 Alex Tutubalin + * Imported dcraw 8.96/1.426 + + New cameras: Casio EX-Z60 and EX-Z75, Kodak Z980, + Nikon D5000, Olympus X200, D560Z,C350Z,E620, + Pentax K7, Sony A330. + + New color data for many cameras + + Generalized unpacker code for Canon and Casio P&S cameras + * LibRaw 0.8.0-Release + +2009-08-13 Alex Tutubalin + * RAW files larger than 2Gb are supported on: + - Unix (all supported: FreeBSD, MacOS X, Linux) + - Windows (with C runtime version >= 8.0) + * bzero replaced with memset to make Solaris users happy + * All applications on 32-bit systems should be recompiled + due to data structures size changes. + * Minor fixes in windows makefile + * LibRaw 0.8.0-Beta5 + +2009-07-21 Alex Tutubalin + * Imported dcraw 8.95 (1.425): + + new huffman tree code + + New cameras supported: AGFAPHOTO DC-833m, Casio EX-S20, + Phase One P65, Samsung S850 + + Removed hardcoded white-balance data for many P&S cameras. + It is recommended to set params.use_camera_wb to 1 for + safe WB. + * Fixes for Nikon D5000 files: no pink stripe at + right side of frame + * C-wrapper: added missed calls + libraw_dcraw_make_mem_image + libraw_dcraw_ make_mem_thumb + * Minor fixes to make non-gcc compilers more happy + * Internal structures changed, full recompilation of all client + code is needed. + * LibRaw 0.8.0-Beta4 + +2009-06-08 Alex Tutubalin + * Fixes: gamma curve processing was not performed in + dcraw_write_mem_image() + * Fixes: gamma curve processing was not performed for + Kodak thumbnails + * LibRaw 0.8.0-Beta3 + +2009-06-05 Alex Tutubalin + * Fixes in documentation: params.gamm[] described more precisely + * Fixes in version number, 0.8-beta1 was mistakenly 0.0.0-beta1 + * LibRaw 0.8.0-Beta2 + +2009-06-04 Alex Tutubalin + * Imported dcraw 8.94 (1.423): + + New camera support: + Canon: SX1, 500D/Rebel T1i, A570, A590, SX110 + Kodak Z1015, Motorola PIXL, Olympus E30, Panasonic DMC-GH1 + + Improved color data for Nikon D3X + + New gamma curve model + + Many changes in RAW unpacking code + + Canon cameras: black level is not subtracted if set + params.document_mode > 1 + + * API changed: params.gamma_16bit field removed. Gamma curve is + set via params.gamm[0]/gamm[1] values (see documentation and + samples for details) + * LibRaw::identify() split to avoid MS VS2008 bug (too many + nested blocks) + + * Samples: dcraw_emu and mem_image samples supports new dcraw + 16bit/gamma semantics: + -6: set 16 bit output + -4: set 16 bit output and linear gamma curve and no auto + brightness + * LibRaw 0.8.0-Beta1 + +2009-04-28 Alex Tutubalin + * Identify sample renamed to raw-identify (name conflict + with ImageMagic) + * Copyright notice changes + * Many compiler warnings removed + +2009-04-07 Alex Tutubalin + * More accurate types conversion in libraw_datastream.h + * New postprocessing parameter auto_bright_thr: set portion of + clipped pixels for auto brightening code (instead of + dcraw-derived hardcoded 1%) + * -U option for dcraw_emu sample sets auto_bright_thr parameter + * all client code should be recompiled due to structures size + change + * LibRaw 0.7.2-Release + +2009-03-22 Alex Tutubalin + * Fixed typo in OpenMP support code + * MinGW support + * dcraw source is included in distribution + * LibRaw 0.7.1-Release + +2009-03-15 Alex Tutubalin + * Fuji SuperCCD RAWs: color channels unshuffled on RAW + read stage (moved from postprocessing stage) + + * LibRaw 0.7.0-Release + +2009-03-13 Alex Tutubalin + * dcraw 8.93/1.421 imported: + + more accurate pentax dSLR support + + fixes in Kodak 620x/720x identification + + faster identification procedure for some formats. + * LibRaw 0.7.0-Beta5 + + +2009-03-08 Alex Tutubalin + * dcraw 8.92/1.420 imported: + + user-specified gamma curve + + Pentax K2000/Km support + + Changes in Canon sRAW processing (support for 5D2 fw 1.07) + + * all client code should be recompiled + + * LibRaw 0.7.0-Beta4 + +2009-02-13 Alex Tutubalin + * bugfix: 4channels sample finally subtracts black by default + * dcraw 8.91/1.419 imported: + + fixes in RIFF files parsing + + * LibRaw 0.7.0-Beta3 + +2009-02-12 Alex Tutubalin + * Black level was not calculated for Canon RAWs in + some filtering modes + + * 4channels sample prints calculated black level + (scaled if autoscaling used). + Also output file names for this sample now includes + color channel name (R/G/B/G2 or C/M/Y/G) + + * LibRaw 0.7.0-Beta2 + +2009-02-09 Alex Tutubalin + * New sample 4channels: splits RAW color channels into four + separate TIFFs + + * LibRaw 0.7.0-Beta1 + +2009-02-07 Alex Tutubalin + * Fixed bug in external jpeg metadata reading code. + + * Cleaned some C++ warnings + + * dcraw 8.91/1.418 imported + + Hasselblad V96C support + + * You need to clean and recompile client code which + uses LibRaw_*_datastream classes. + + * LibRaw 0.7.0-Alpha6 + +2009-01-30 Alex Tutubalin + + * New data input framework is created. It is possible now to + easyly implement your own data input interface for LibRaw + (e.g. for reading RAW data from network data stream) + + * All older programs using previous LibRaw versions are + compatible at source code level. + + * LibRaw can read RAW data from memory buffer via + new LibRaw::open_buffer() API call (implemented on top of + new input framework). + This call used in sample application dcraw_emu and simple_dcraw + (with -B command-line switch) to test new API. + + * Error handling callback functions now can be called with + NULL filename passed (if underlying data stream object + does not know file name). + So, client error handling callbacks should work with NULL + filename. + + * All client code should be recompiled + + * Imported dcraw 8.90/1.417: + + Support for loading White Balance data from + Sony ARW files edited with Sony IDC software. + + * LibRaw 0.7.0-Alpha5 + +2009-01-17 Alex Tutubalin + * Raw filtering mode LIBRAW_FILTERING_NOPOSTPROCESS has renamed + to LIBRAW_FILTERING_NORAWCURVE for better reflect its purpose. + This filtering_mode bit turns off tone curve applying on + RAW data on bayer-pattern cameras with raw tone curve: + + Adobe DNG (only RAW with bayer pattern) + + Nikon compressed NEF + + Some Kodak cameras + + Sony A700/A900 (tone curve applied to 8-bit raws) + + * unprocessed_raw sample: added command-line key -N, this key + turns on LIBRAW_FILTERING_NORAWCURVE filtering mode. + + * New scheme of Fuji RAW processing (introduced in 0.7-Alpha3) + supports DNG files generated from Fuji RAF. + + * Imported dcraw 8.90/1.416: + + better support for Samsung S85 + + fixed possible integer overflow in wavelet denoising code + + * LibRaw 0.7.0-Alpha4 + + +2009-01-14 Alex Tutubalin + * Black mask extraction supported for all files with bayer data + (one component per pixel). Black mask data not available + for multi-component data (Foveon, Canon sRAW, Sinar 4-shot, + Kodak YCC/YRGB). + + * Black level subtraction can be turned off for all bayer + cameras (added support for PhaseOne backs). + + * Fujifilm camera processing model changed: + + RAW data is extracted without 45-degree rotation + + dcraw-compatible rotation is performed on postptocessing stage + + it is possible to rotate RAW data without postprocessing + by LibRaw::rotate_fuji_raw() call. + + * New filtering mode setting: LIBRAW_FILTERING_NOPOSTPROCESS + This bits turns off RAW tone curve processing based on tone curve + readed from RAW metadata. + This mode supported only for PhaseOne backs now (to be supported + on all relevant cameras in nearest future releases) + + * Black level data (got from RAW data) are stored for PhaseOne backs. + + * Black level subtraction bug (derived from dcraw) fixed + for PhaseOne files. + + * Fixed processing of -s parameter for dcraw_emu sample + + * Parameter -s N (select shot number) added to + unprocessed_raw sample. + + * Imported dcraw 8.90/1.414: + + changes in QuickTake 100 metadata processing + + changes in external jpeg processing code + + Samsung S85 support + + * All client code should be recompiled + + * LibRaw 0.7.0-Alpha3 released + +2009-01-10 Alex Tutubalin + * Fixed bug in add_masked_borders: crash if output dimensions + is already larger than raw dimensions + * Fixed out of bounds in samples/unprocessed_raw.cpp for files + with non-square pixels + + * LibRaw 0.7.0-Alpha2 released + +2009-01-08 Alex Tutubalin + * Fixed bug in 0.7.0-a0: black frame size has not reset, + so in batch processing there is an error in black frame + size for files without black frame. + + * Implemented reading of black/masked pixels data for + near all cameras with masked pixels, exclding: + + Canon sRAW, Leaf (MOS), Sinar 4-shot - more than one + color component in black frame (redesign of black frame + data structures required). + + Fuji SuperCCD: need to design right methods of extraction + (should we rotate and resize black pixels as active ones??) + + * Tested for most dSLR data formats with masked pixels: 7 of 9 + untested formats are from old P&S cameras. + + * New call LibRaw::unpack_function_name() returns unpack function name + (useful for testers only) + + * New identify sample parameters (useful for test-suite builders + to check test coverage): + -u - print unpack function name + -f - print masked frame size + These parameters works only for identify run without -v parameter + + * Imported dcraw 8.89/1.411 + + changes in Panasonic FZ50 files parsing + + * LibRaw 0.7.0-Alpha1 released + + +2009-01-05 Alex Tutubalin + * It is possible to turn off RAW data filtration (black level + subtraction, zero pixels averaging): + + supported on all cameras except Foveon and Phase One + + filtraction controlled by new parameter "filtering_mode" + + it is possible to expand API by filtering procedures + built for specific camera model. + + * Black border (masked pixels) extraction: + + API (data structures) for storing black mask. + + Black mask extraction supported only for limited list of + data formats: + - Canon .CRW, .CR2 (with exception of sRAW),A600, A5 + - Adobe DNG (both converted RAW and native DNG) + - Nikon NEF (compressed only) + this list to be expanded in future LibRaw versions + * New call add_masked_borders_to_bitmap makes full bitmap + 'masked border' + image + * Usage sample for functionality listed above: + samples/unprocessed_raw + * Imported dcraw 8.89/1.410: + + fixed bugs in Hasselblad .fff decoding + + fixes in Imacon metadata decoding + * Documentation changes + * All client code should be recompiled + * LibRaw 0.7.0-Alpha0 + + +2009-01-01 Alex Tutubalin + * Fixed a bug (filedescriptor and buffer memory leak) in thumbnail + extraction when called before metadata analysis. + Thanks to Albert Astalis Cid. + * LibRaw 0.6.4 Release + +2008-12-11 Alex Tutubalin + * Imported new edition of dcraw 8.89 (version 1.409) + * Nikon NEF decoding changed + * LibRaw 0.6.3 Release + +2008-12-03 Alex Tutubalin + * fixed bug in Panasonic .RW2 processing (only for thread-safe version, + single-threaded version was not affected) + * All client code should be recompiled + * LibRaw 0.6.2 Release + +2008-12-03 Alex Tutubalin + * Imported dcraw 8.89 (version 1.407) + * New cameras: + Canon G10 & 5D Mk2, Leaf AFi 7, Leica D-LUX4, Panasonic FX150 & G1, + Fujifilm IS Pro, + * Changed camera support (color conversion tables): + Canon 50D, Nikon D90 & P6000, Panasonic LX3 & FZ28, Sony A900 + * LibRaw 0.6.2 beta + +2008-09-25 Alex Tutubalin + * Added new data field float LibRaw::imgdata.color.cam_xyz[4][3]. + This field contains constant table (different for each camera) for + Camera RGB->XYZ conversion. + * All client code should be recompiled + * LibRaw 0.6.1 Release + +2008-09-18 Alex Tutubalin + * dcraw 8.88 imported: + - new cameras (Canon 50D, Sony A900, Nikon D90 & P6000, + Panasonic LX3 FZ28) + - new method of black point subtraction for Canon cameras, + preliminary banding suppression. + * Stack memory usage lowered (some thread data moved to dynamic + memory) + * some patches for MSVC compatibility + * LibRaw 0.6.0 Release + +2008-09-16 Alex Tutubalin + * Enum definitions changed to make gcc -pedantic happy + * Compiler/preprocessor flags does not affects LibRaw class field set + (i.e. structure for thread local storage is always allocated) + * Default library compilation mode (i.e. sources imported in another + project) is thread-safe + +2008-09-14 Alex Tutubalin + * OpenMP support for most CPU consuming steps of processing: + ahd_interpolation. wavelet_denoise + 10-30% speed-up of full processing pipe on 2-core CPU + OpenMP supported only on gcc (Linux/FreeBSD and Mac OS X) + + * LibRaw 0.6.0-Beta-1 + +2008-09-10 Alex Tutubalin + * All set_**handler accepts additional void* pointer, which should point to + callback private data. This pointer passed to user callback when it called. + + * LibRaw 0.6.0-alpha5 + + * All client code should be recompiled + +2008-09-10 Alex Tutubalin + * New processing stages in enum LibRaw_progress: + LIBRAW_PROGRESS_BAD_PIXELS LIBRAW_PROGRESS_DARK_FRAME + (reserved stages LIBRAW_PROGRESS_RESERVED_PRE1-PRE2 has removed) + * libraw_strprogress() - convert progress code into string + + * Added progress/cancellation user callbacks + + new fatal error code: CANCELLED_BY_CALLBACK + + sample usage in samples/dcraw_emu.cpp (try run it with -v -v -v opts) + + * LibRaw 0.6.0-alpha4 + + * All client code should be recompiled + +2008-09-08 Alex Tutubalin + * ICC-profiles support (same as in dcraw) + + input/output profiles (specified as path to 'icc' file or 'embed' for + embedded input profile) + + additional warnings + + LCMS library used + + * support of bad pixel map (caller should specify path to bad pixel file + in dcraw-compatible format) + + * dark frame subtraction support (caller should supply path to 16-bit PGM + map). samples/simple_dcraw.cpp - -4 option added for dark frame file + generation + + * support of bad pixeld map (dcraw-compatible format) + + * the dcraw_emu sample supports all new features (ICC, dark frame, bad + pixels) + + * libraw/libraw_version.h, defines, calls and macros for version checks: + + LibRaw::version(), LibRaw::versionNumber(), LIBRAW_CHECK_VERSION() + + * List of supported cameras: + + LibRaw::cameraCount() + + LibRaw::cameraList() + + * fixed error in adjust_sizes_info_only + + * documentation changes + + * LibRaw 0.6.0-alpha3 + +2008-09-07 Alex Tutubalin + * samples/mem_image.c - bitwise equal output with dcraw -4 + (PPMs outputted with network byte order) + * LibRaw 0.6.0-alpha2 + +2008-09-06 Alex Tutubalin + * Added calls dcraw_make_mem_image and dcraw_make_mem_image: + + functions (and supporting code) + + documentation changed + + new sample code samples/mem_image.cpp + * Added processing parameter LibRaw::imgdata.params.gamma_16bit + (set to 1 to make gamma correction for 16-bit output) + * LibRaw 0.6.0-alpha1 + +2008-08-28 Alex Tutubalin + * dcraw 1.404 (8.87) imported: + - 6 new cameras supported (Canon 1000D, A720, SD300; + Nikon D700, Oly E-520,Kodak C603) + * Licensing changed to GPL v2 + +2008-05-02 Alex Tutubalin + * mmap/malloc+read IO-layer removed due to no performance gain. + FILE I/O returned + +2008-05-02 Alex Tutubalin + * dcraw 1.403 imported + - changes in ljpeg decompression (index values cut to 12 bit) + - changes in parse_foveon() jpeg thumbnail extraction + * LibRaw 0.5.3 released + +2008-04-24 Alex Tutubalin + * Linux build of samples/identify fixed + * documentation editorial + * LibRaw 0.5.2 released + +2008-04-21 Alex Tutubalin + * All documentation translated to English + * English changelog started :) + * minor bug (include path) fixed in samples/half_mt + * LibRaw 0.5.1 released diff --git a/rtengine/libraw/DEVELOPER-NOTES b/rtengine/libraw/DEVELOPER-NOTES new file mode 100644 index 000000000..1434d83bd --- /dev/null +++ b/rtengine/libraw/DEVELOPER-NOTES @@ -0,0 +1,20 @@ + +=== Notes for LibRaw contributor === + +0. Repository + LibRaw public repository is located on GitHub + URL: + http://github.com/LibRaw/LibRaw - main page + git://github.com/LibRaw/LibRaw.git - git URL + +If you wish to participate in LibRaw development please use GitHub fork. + +LibRaw distribution files are prepared by ./mkdist.sh script + This script + - generates ./configure script from autotools stuff + - removes developer Makefile + - fetches 'Official' dcraw.c from Dave Coffin's site + - removes itself + +Feel free to contact us (info@libraw.org or Contact form on www.libraw.org) if +you have any questions or suggestions. diff --git a/rtengine/libraw/GoPro/dng-sdk-1_4-allow-VC5-validate.diff b/rtengine/libraw/GoPro/dng-sdk-1_4-allow-VC5-validate.diff new file mode 100644 index 000000000..354567e34 --- /dev/null +++ b/rtengine/libraw/GoPro/dng-sdk-1_4-allow-VC5-validate.diff @@ -0,0 +1,21 @@ +diff --git a/source/dng_ifd.cpp b/source/dng_ifd.cpp +index 174f18f..2974323 100644 +--- a/source/dng_ifd.cpp ++++ b/source/dng_ifd.cpp +@@ -3168,6 +3168,7 @@ bool dng_ifd::IsValidDNG (dng_shared &shared, + case ccUncompressed: + break; + ++ case 9: /* VC5 compression support */ + case ccJPEG: + { + +@@ -3202,7 +3203,7 @@ bool dng_ifd::IsValidDNG (dng_shared &shared, + break; + + } +- ++ + case ccLossyJPEG: + { + diff --git a/rtengine/libraw/GoPro/dng-sdk-1_6-1_7-hide-ccVc5-definitiion.diff b/rtengine/libraw/GoPro/dng-sdk-1_6-1_7-hide-ccVc5-definitiion.diff new file mode 100644 index 000000000..1b356d0eb --- /dev/null +++ b/rtengine/libraw/GoPro/dng-sdk-1_6-1_7-hide-ccVc5-definitiion.diff @@ -0,0 +1,13 @@ +--- a/gpr_sdk/private/gpr_read_image.cpp ++++ b/gpr_sdk/private/gpr_read_image.cpp +@@ -68,8 +68,10 @@ gpr_read_image::gpr_read_image( gpr_buffer_auto* vc5_buffer ) : _vc5_buffer(vc5_ + } + + #if GPR_WRITING || GPR_READING ++#if !defined(qDNG_1_6) && !defined(qDNGSupportJXL) + const int ccVc5 = 9; // Vc5 compression type + #endif ++#endif + + void gpr_read_image::ReadTile (dng_host &host, + const dng_ifd &ifd, diff --git a/rtengine/libraw/GoPro/dng-sdk-1_6-hide-ccVc5-definitiion.diff b/rtengine/libraw/GoPro/dng-sdk-1_6-hide-ccVc5-definitiion.diff new file mode 100644 index 000000000..63a2fba1e --- /dev/null +++ b/rtengine/libraw/GoPro/dng-sdk-1_6-hide-ccVc5-definitiion.diff @@ -0,0 +1,15 @@ +diff --git a/gpr_sdk/private/gpr_read_image.cpp b/gpr_sdk/private/gpr_read_image.cpp +index c611b3f..9200a5b 100644 +--- a/gpr_sdk/private/gpr_read_image.cpp ++++ b/gpr_sdk/private/gpr_read_image.cpp +@@ -68,8 +68,10 @@ gpr_read_image::gpr_read_image( gpr_buffer_auto* vc5_buffer ) : _vc5_buffer(vc5_ + } + + #if GPR_WRITING || GPR_READING ++#ifndef qDNG_1_6 + const int ccVc5 = 9; // Vc5 compression type + #endif ++#endif + + void gpr_read_image::ReadTile (dng_host &host, + const dng_ifd &ifd, diff --git a/rtengine/libraw/GoPro/dng-sdk-allow-VC5-validate.diff b/rtengine/libraw/GoPro/dng-sdk-allow-VC5-validate.diff new file mode 100644 index 000000000..354567e34 --- /dev/null +++ b/rtengine/libraw/GoPro/dng-sdk-allow-VC5-validate.diff @@ -0,0 +1,21 @@ +diff --git a/source/dng_ifd.cpp b/source/dng_ifd.cpp +index 174f18f..2974323 100644 +--- a/source/dng_ifd.cpp ++++ b/source/dng_ifd.cpp +@@ -3168,6 +3168,7 @@ bool dng_ifd::IsValidDNG (dng_shared &shared, + case ccUncompressed: + break; + ++ case 9: /* VC5 compression support */ + case ccJPEG: + { + +@@ -3202,7 +3203,7 @@ bool dng_ifd::IsValidDNG (dng_shared &shared, + break; + + } +- ++ + case ccLossyJPEG: + { + diff --git a/rtengine/libraw/GoPro/gpr_read_image.cpp-dng16.diff b/rtengine/libraw/GoPro/gpr_read_image.cpp-dng16.diff new file mode 100644 index 000000000..1761abc01 --- /dev/null +++ b/rtengine/libraw/GoPro/gpr_read_image.cpp-dng16.diff @@ -0,0 +1,29 @@ +--- gpr_read_image.cpp.orig 2019-08-30 12:20:00.326653300 +0300 ++++ gpr_read_image.cpp 2019-08-31 10:43:26.568184100 +0300 +@@ -67,6 +67,10 @@ + fDecodeVC5 = true; + } + + void gpr_read_image::ReadTile (dng_host &host, + const dng_ifd &ifd, + dng_stream &stream, +@@ -77,7 +81,8 @@ + uint32 tileByteCount, + AutoPtr &compressedBuffer, + AutoPtr &uncompressedBuffer, +- AutoPtr &subTileBlockBuffer) ++ AutoPtr &subTileBlockBuffer, ++ bool usingMultipleThreads) + { + + if( ifd.fCompression == ccVc5 ) +@@ -122,7 +127,8 @@ + tileByteCount, + compressedBuffer, + uncompressedBuffer, +- subTileBlockBuffer); ++ subTileBlockBuffer, ++ usingMultipleThreads); + } + } + diff --git a/rtengine/libraw/GoPro/gpr_read_image.cpp-dng17.diff b/rtengine/libraw/GoPro/gpr_read_image.cpp-dng17.diff new file mode 100644 index 000000000..86f4e67b7 --- /dev/null +++ b/rtengine/libraw/GoPro/gpr_read_image.cpp-dng17.diff @@ -0,0 +1,17 @@ +diff --git a/gpr_sdk/private/gpr_read_image.cpp b/gpr_sdk/private/gpr_read_image.cpp +index c611b3f..4f8fe88 100644 +--- a/gpr_sdk/private/gpr_read_image.cpp ++++ b/gpr_sdk/private/gpr_read_image.cpp +@@ -79,7 +81,12 @@ void gpr_read_image::ReadTile (dng_host &host, + uint32 plane, + uint32 planes, + uint32 tileByteCount, ++// DNG 1.7 detection ++#ifdef qDNGSupportJXL ++ std::shared_ptr &compressedBuffer, ++#else + AutoPtr &compressedBuffer, ++#endif + AutoPtr &uncompressedBuffer, + AutoPtr &subTileBlockBuffer, + bool usingMultipleThreads) diff --git a/rtengine/libraw/GoPro/gpr_read_image.cpp.diff b/rtengine/libraw/GoPro/gpr_read_image.cpp.diff new file mode 100644 index 000000000..1761abc01 --- /dev/null +++ b/rtengine/libraw/GoPro/gpr_read_image.cpp.diff @@ -0,0 +1,29 @@ +--- gpr_read_image.cpp.orig 2019-08-30 12:20:00.326653300 +0300 ++++ gpr_read_image.cpp 2019-08-31 10:43:26.568184100 +0300 +@@ -67,6 +67,10 @@ + fDecodeVC5 = true; + } + + void gpr_read_image::ReadTile (dng_host &host, + const dng_ifd &ifd, + dng_stream &stream, +@@ -77,7 +81,8 @@ + uint32 tileByteCount, + AutoPtr &compressedBuffer, + AutoPtr &uncompressedBuffer, +- AutoPtr &subTileBlockBuffer) ++ AutoPtr &subTileBlockBuffer, ++ bool usingMultipleThreads) + { + + if( ifd.fCompression == ccVc5 ) +@@ -122,7 +127,8 @@ + tileByteCount, + compressedBuffer, + uncompressedBuffer, +- subTileBlockBuffer); ++ subTileBlockBuffer, ++ usingMultipleThreads); + } + } + diff --git a/rtengine/libraw/GoPro/gpr_read_image.h-dng16.diff b/rtengine/libraw/GoPro/gpr_read_image.h-dng16.diff new file mode 100644 index 000000000..413b55a51 --- /dev/null +++ b/rtengine/libraw/GoPro/gpr_read_image.h-dng16.diff @@ -0,0 +1,12 @@ +--- gpr_read_image.h.orig 2019-08-30 12:20:00.326653300 +0300 ++++ gpr_read_image.h 2019-08-30 20:56:11.138246800 +0300 +@@ -56,7 +56,8 @@ + uint32 tileByteCount, + AutoPtr &compressedBuffer, + AutoPtr &uncompressedBuffer, +- AutoPtr &subTileBlockBuffer); ++ AutoPtr &subTileBlockBuffer, ++ bool usingMultipleThreads ); + }; + + #endif // GPR_READING diff --git a/rtengine/libraw/GoPro/gpr_read_image.h-dng17.diff b/rtengine/libraw/GoPro/gpr_read_image.h-dng17.diff new file mode 100644 index 000000000..a18db1652 --- /dev/null +++ b/rtengine/libraw/GoPro/gpr_read_image.h-dng17.diff @@ -0,0 +1,17 @@ +diff --git a/gpr_sdk/private/gpr_read_image.h b/gpr_sdk/private/gpr_read_image.h +index 159310b..f7d3ce1 100644 +--- a/gpr_sdk/private/gpr_read_image.h ++++ b/gpr_sdk/private/gpr_read_image.h +@@ -54,7 +54,12 @@ public: + uint32 plane, + uint32 planes, + uint32 tileByteCount, ++// DNG 1.7 detection ++#ifdef qDNGSupportJXL ++ std::shared_ptr &compressedBuffer, ++#else + AutoPtr &compressedBuffer, ++#endif + AutoPtr &uncompressedBuffer, + AutoPtr &subTileBlockBuffer, + bool usingMultipleThreads ); diff --git a/rtengine/libraw/GoPro/gpr_read_image.h.diff b/rtengine/libraw/GoPro/gpr_read_image.h.diff new file mode 100644 index 000000000..413b55a51 --- /dev/null +++ b/rtengine/libraw/GoPro/gpr_read_image.h.diff @@ -0,0 +1,12 @@ +--- gpr_read_image.h.orig 2019-08-30 12:20:00.326653300 +0300 ++++ gpr_read_image.h 2019-08-30 20:56:11.138246800 +0300 +@@ -56,7 +56,8 @@ + uint32 tileByteCount, + AutoPtr &compressedBuffer, + AutoPtr &uncompressedBuffer, +- AutoPtr &subTileBlockBuffer); ++ AutoPtr &subTileBlockBuffer, ++ bool usingMultipleThreads ); + }; + + #endif // GPR_READING diff --git a/rtengine/libraw/INSTALL b/rtengine/libraw/INSTALL new file mode 100644 index 000000000..b575753d7 --- /dev/null +++ b/rtengine/libraw/INSTALL @@ -0,0 +1,51 @@ + +========= Installing LibRaw ======== + +I. Installation steps + +1. Unpack the distribution file: + + $ tar xzvf LibRaw-0.xx.yy.tar.gz + +2. Go to LibRaw folder and run ./configure and make: + + $ cd LibRaw-0.xx.yy + $ ./configure [...optional args...] + $ make + +3. install by run make install as root: + + $ sudo make install + +If you're using Github snapshot, create ./configure script: + autoreconf --install +before using it (you'll need autotools installed). + +Alternatively, you may use pre-created Makefiles (Makefile.dist for Unix, +Makefile.msvc for Windows/VisualStudio) and add/remove options by editing +these Makefiles + + +II. ./configure options + +--enable-openmp +--disable-openmp + + Enable/disable OpenMP support if compiler supports it. + OpenMP is enabled by default. + + +--enable-lcms +--disable-lcms + + Enable/disable LCMS color engine support. If enabled, ./configure will try to + find lcms library. Both LCMS-1.x and LCMS-2.x are supported + LCMS support is enabled by default + + +--enable-examples +--disable-examples + + Enables/disables examples compilation and installation. Enabled by default + + diff --git a/rtengine/libraw/LICENSE.CDDL b/rtengine/libraw/LICENSE.CDDL new file mode 100644 index 000000000..8ee560c09 --- /dev/null +++ b/rtengine/libraw/LICENSE.CDDL @@ -0,0 +1,340 @@ +COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + +1. Definitions. + +1.1. Contributor means each individual or entity that creates or +contributes to the creation of Modifications. + +1.2. Contributor Version means the combination of the Original +Software, prior Modifications used by a Contributor (if any), +and the Modifications made by that particular Contributor. + +1.3. Covered Software means (a) the Original Software, or (b) +Modifications, or (c) the combination of files containing +Original Software with files containing Modifications, in each +case including portions thereof. + +1.4. Executable means the Covered Software in any form other +than Source Code. + +1.5. Initial Developer means the individual or entity that first +makes Original Software available under this License. + +1.6. Larger Workmeans a work which combines Covered Software or +portions thereof with code not governed by the terms of this +License. + +1.7. License means this document. + +1.8. Licensable means having the right to grant, to the maximum +extent possible, whether at the time of the initial grant or +subsequently acquired, any and all of the rights conveyed herein. + +1.9. Modifications means the Source Code and Executable form of +any of the following: A. Any file that results from an addition +to, deletion from or modification of the contents of a file +containing Original Software or previous Modifications; B. Any +new file that contains any part of the Original Software or +previous Modification; or C. Any new file that is contributed or +otherwise made available under the terms of this License. + +1.10. Original Software means the Source Code and Executable +form of computer software code that is originally released under +this License. + +1.11. Patent Claims means any patent claim(s), now owned or +hereafter acquired, including without limitation, method, +process, and apparatus claims, in any patent Licensable by +grantor. + +1.12. Source Code means (a) the common form of computer software +code in which modifications are made and (b) associated +documentation included in or with such code. + +1.13. You (or Your) means an individual or a legal entity +exercising rights under, and complying with all of the terms of, +this License. For legal entities, You includes any entity which +controls, is controlled by, or is under common control with You. +For purposes of this definition, control means (a) the power, +direct or indirect, to cause the direction or management of such +entity, whether by contract or otherwise, or (b) ownership of +more than fifty percent (50%) of the outstanding shares or +beneficial ownership of such entity. + +2. License Grants. + +2.1. The Initial Developer Grant. Conditioned upon Your +compliance with Section 3.1 below and subject to third party +intellectual property claims, the Initial Developer hereby +grants You a world-wide, royalty-free, non-exclusive license: + +(a) under intellectual property rights (other than patent or +trademark) Licensable by Initial Developer, to use, reproduce, +modify, display, perform, sublicense and distribute the Original +Software (or portions thereof), with or without Modifications, +and/or as part of a Larger Work; and + +(b) under Patent Claims infringed by the making, using or +selling of Original Software, to make, have made, use, practice, +sell, and offer for sale, and/or otherwise dispose of the +Original Software (or portions thereof); + +(c) The licenses granted in Sections 2.1(a) and (b) are +effective on the date Initial Developer first distributes or +otherwise makes the Original Software available to a third party +under the terms of this License; + +(d) Notwithstanding Section 2.1(b) above, no patent license is +granted: (1) for code that You delete from the Original +Software, or (2) for infringements caused by: (i) the +modification of the Original Software, or (ii) the combination +of the Original Software with other software or devices. + +2.2. Contributor Grant. Conditioned upon Your compliance with +Section 3.1 below and subject to third party intellectual +property claims, each Contributor hereby grants You a +world-wide, royalty-free, non-exclusive license: + +(a) under intellectual property rights (other than patent or +trademark) Licensable by Contributor to use, reproduce, modify, +display, perform, sublicense and distribute the Modifications +created by such Contributor (or portions thereof), either on an +unmodified basis, with other Modifications, as Covered Software +and/or as part of a Larger Work; and + +(b) under Patent Claims infringed by the making, using, or +selling of Modifications made by that Contributor either alone +and/or in combination with its Contributor Version (or portions +of such combination), to make, use, sell, offer for sale, have +made, and/or otherwise dispose of: (1) Modifications made by +that Contributor (or portions thereof); and (2) the combination +of Modifications made by that Contributor with its Contributor +Version (or portions of such combination). + +(c) The licenses granted in Sections 2.2(a) and 2.2(b) +areeffective on the date Contributor first distributes or +otherwise makes the Modifications available to a third party. + +(d) Notwithstanding Section 2.2(b) above, no patent license is +granted: (1) for any code that Contributor has deleted from the +Contributor Version; (2) for infringements caused by: (i) third +party modifications of Contributor Version, or (ii) the +combination of Modifications made by that Contributor with other +software (except as part of the Contributor Version) or other +devices; or (3) under Patent Claims infringed by Covered +Software in the absence of Modifications made by that +Contributor. + +3. Distribution Obligations. + +3.1. Availability of Source Code. Any Covered Software that You +distribute or otherwise make available in Executable form must +also be made available in Source Code form and that Source Code +form must be distributed only under the terms of this License. +You must include a copy of this License with every copy of the +Source Code form of the Covered Software You distribute or +otherwise make available. You must inform recipients of any such +Covered Software in Executable form as to how they can obtain +such Covered Software in Source Code form in a reasonable manner +on or through a medium customarily used for software exchange. + +3.2. Modifications. The Modifications that You create or to +which You contribute are governed by the terms of this License. +You represent that You believe Your Modifications are Your +original creation(s) and/or You have sufficient rights to grant +the rights conveyed by this License. + +3.3. Required Notices. You must include a notice in each of Your +Modifications that identifies You as the Contributor of the +Modification. You may not remove or alter any copyright, patent +or trademark notices contained within the Covered Software, or +any notices of licensing or any descriptive text giving +attribution to any Contributor or the Initial Developer. + +3.4. Application of Additional Terms. You may not offer or +impose any terms on any Covered Software in Source Code form +that alters or restricts the applicable version of this License +or the recipients rights hereunder. You may choose to offer, and +to charge a fee for, warranty, support, indemnity or liability +obligations to one or more recipients of Covered +Software. However, you may do so only on Your own behalf, and +not on behalf of the Initial Developer or any Contributor. You +must make it absolutely clear that any such warranty, support, +indemnity or liability obligation is offered by You alone, and +You hereby agree to indemnify the Initial Developer and every +Contributor for any liability incurred by the Initial Developer +or such Contributor as a result of warranty, support, indemnity +or liability terms You offer. + +3.5. Distribution of Executable Versions. You may distribute the +Executable form of the Covered Software under the terms of this +License or under the terms of a license of Your choice, which +may contain terms different from this License, provided that You +are in compliance with the terms of this License and that the +license for the Executable form does not attempt to limit or +alter the recipients rights in the Source Code form from the +rights set forth in this License. If You distribute the Covered +Software in Executable form under a different license, You must +make it absolutely clear that any terms which differ from this +License are offered by You alone, not by the Initial Developer +or Contributor. You hereby agree to indemnify the Initial +Developer and every Contributor for any liability incurred by +the Initial Developer or such Contributor as a result of any +such terms You offer. + +3.6. Larger Works. You may create a Larger Work by combining +Covered Software with other code not governed by the terms of +this License and distribute the Larger Work as a single product. +In such a case, You must make sure the requirements of this +License are fulfilled for the Covered Software. + +4. Versions of the License. + +4.1. New Versions. Sun Microsystems, Inc. is the initial license +steward and may publish revised and/or new versions of this +License from time to time. Each version will be given a +distinguishing version number. Except as provided in Section +4.3, no one other than the license steward has the right to +modify this License. + +4.2. Effect of New Versions. You may always continue to use, +distribute or otherwise make the Covered Software available +under the terms of the version of the License under which You +originally received the Covered Software. If the Initial +Developer includes a notice in the Original Software prohibiting +it from being distributed or otherwise made available under any +subsequent version of the License, You must distribute and make +the Covered Software available under the terms of the version of +the License under which You originally received the Covered +Software. Otherwise, You may also choose to use, distribute or +otherwise make the Covered Software available under the terms of +any subsequent version of the License published by the license +steward. + +4.3. Modified Versions. When You are an Initial Developer and +You want to create a new license for Your Original Software, You +may create and use a modified version of this License if You: +(a) rename the license and remove any references to the name of +the license steward (except to note that the license differs +from this License); and (b) otherwise make it clear that the +license contains terms which differ from this License. + +5. DISCLAIMER OF WARRANTY. COVERED SOFTWARE IS PROVIDED UNDER +THIS LICENSE ON AN AS IS BASIS, WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, +WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, +MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. +THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED +SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE +DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY +OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, +REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN +ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE +IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +6. TERMINATION. + +6.1. This License and the rights granted hereunder will +terminate automatically if You fail to comply with terms herein +and fail to cure such breach within 30 days of becoming aware of +the breach. Provisions which, by their nature, must remain in +effect beyond the termination of this License shall survive. + +6.2. If You assert a patent infringement claim (excluding +declaratory judgment actions) against Initial Developer or a +Contributor (the Initial Developer or Contributor against whom +You assert such claim is referred to as Participant) alleging +that the Participant Software (meaning the Contributor Version +where the Participant is a Contributor or the Original Software +where the Participant is the Initial Developer) directly or +indirectly infringes any patent, then any and all rights granted +directly or indirectly to You by such Participant, the Initial +Developer (if the Initial Developer is not the Participant) and +all Contributors under Sections 2.1 and/or 2.2 of this License +shall, upon 60 days notice from Participant terminate +prospectively and automatically at the expiration of such 60 day +notice period, unless if within such 60 day period You withdraw +Your claim with respect to the Participant Software against such +Participant either unilaterally or pursuant to a written +agreement with Participant. + +6.3. In the event of termination under Sections 6.1 or 6.2 +above, all end user licenses that have been validly granted by +You or any distributor hereunder prior to termination (excluding +licenses granted to You by any distributor) shall survive +termination. + +7. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO +LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR +OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER +CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY +SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY +INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY +CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST +PROFITS, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR +MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, +EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY +OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO +LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH +PARTYS NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH +LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR +LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS +EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +8. U.S. GOVERNMENT END USERS. The Covered Software is a +commercial item, as that term is defined in 48 C.F.R. 2.101 +(Oct. 1995), consisting of commercial computer software (as that +term is defined at 48 C.F.R. 252.227-7014(a)(1)) and commercial +computer software documentation as such terms are used in 48 +C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and +48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all +U.S. Government End Users acquire Covered Software with only +those rights set forth herein. This U.S. Government Rights +clause is in lieu of, and supersedes, any other FAR, DFAR, or +other clause or provision that addresses Government rights in +computer software under this License. + +9. MISCELLANEOUS. This License represents the complete agreement +concerning subject matter hereof. If any provision of this +License is held to be unenforceable, such provision shall be +reformed only to the extent necessary to make it enforceable. +This License shall be governed by the law of the jurisdiction +specified in a notice contained within the Original Software +(except to the extent applicable law, if any, provides +otherwise), excluding such jurisdictions conflict-of-law +provisions. Any litigation relating to this License shall be +subject to the jurisdiction of the courts located in the +jurisdiction and venue specified in a notice contained within +the Original Software, with the losing party responsible for +costs, including, without limitation, court costs and reasonable +attorneys fees and expenses. The application of the United +Nations Convention on Contracts for the International Sale of +Goods is expressly excluded. Any law or regulation which +provides that the language of a contract shall be construed +against the drafter shall not apply to this License. You agree +that You alone are responsible for compliance with the United +States export administration regulations (and the export control +laws and regulation of any other countries) when You use, +distribute or otherwise make available any Covered Software. + +10. RESPONSIBILITY FOR CLAIMS. As between Initial Developer and +the Contributors, each party is responsible for claims and +damages arising, directly or indirectly, out of its utilization +of rights under this License and You agree to work with Initial +Developer and Contributors to distribute such responsibility on +an equitable basis. Nothing herein is intended or shall be +deemed to constitute any admission of liability. + +---------------------------------------------------------------- + +NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND +DISTRIBUTION LICENSE (CDDL): This code is released under the +CDDL and shall be governed by the laws of the State of +California (excluding conflict-of-law provisions). Any +litigation relating to this License shall be subject to the +jurisdiction of the Federal Courts of the Northern District of +California and the state courts of the State of California, with +venue lying in Santa Clara County, California. + +---------------------------------------------------------------- + diff --git a/rtengine/libraw/LICENSE.LGPL b/rtengine/libraw/LICENSE.LGPL new file mode 100644 index 000000000..3b204400c --- /dev/null +++ b/rtengine/libraw/LICENSE.LGPL @@ -0,0 +1,458 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/rtengine/libraw/LibRaw.pro b/rtengine/libraw/LibRaw.pro new file mode 100644 index 000000000..09cda53c6 --- /dev/null +++ b/rtengine/libraw/LibRaw.pro @@ -0,0 +1,19 @@ +TEMPLATE=subdirs +CONFIG+=ordered +SUBDIRS= \ + buildfiles/dcraw_emu.pro \ + buildfiles/libraw.pro \ + buildfiles/postprocessing_benchmark.pro \ + buildfiles/dcraw_half.pro \ +# buildfiles/half_mt.pro \ + buildfiles/mem_image.pro \ + buildfiles/raw-identify.pro \ + buildfiles/simple_dcraw.pro \ + buildfiles/multirender_test.pro \ + buildfiles/unprocessed_raw.pro \ + buildfiles/4channels.pro \ + buildfiles/rawtextdump.pro \ + buildfiles/openbayer_sample.pro + +CONFIG-=qt + diff --git a/rtengine/libraw/LibRaw.sln b/rtengine/libraw/LibRaw.sln new file mode 100644 index 000000000..405887b69 --- /dev/null +++ b/rtengine/libraw/LibRaw.sln @@ -0,0 +1,123 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30011.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dcraw_emu", "buildfiles\dcraw_emu.vcxproj", "{48688DB8-559A-3DE2-ADDE-5BD27BFEDDA2}" + ProjectSection(ProjectDependencies) = postProject + {A71D2131-F425-381F-8A9A-29D60132A046} = {A71D2131-F425-381F-8A9A-29D60132A046} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libraw", "buildfiles\libraw.vcxproj", "{A71D2131-F425-381F-8A9A-29D60132A046}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "postprocessing_benchmark", "buildfiles\postprocessing_benchmark.vcxproj", "{5C66A8FA-D211-3E2F-A2F1-0C3C665689CC}" + ProjectSection(ProjectDependencies) = postProject + {A71D2131-F425-381F-8A9A-29D60132A046} = {A71D2131-F425-381F-8A9A-29D60132A046} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dcraw_half", "buildfiles\dcraw_half.vcxproj", "{C6EACFA3-9FC5-393B-BCF6-2874B05E4581}" + ProjectSection(ProjectDependencies) = postProject + {A71D2131-F425-381F-8A9A-29D60132A046} = {A71D2131-F425-381F-8A9A-29D60132A046} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mem_image", "buildfiles\mem_image.vcxproj", "{BF8A2750-B847-3BA6-9EAF-05F43380F46C}" + ProjectSection(ProjectDependencies) = postProject + {A71D2131-F425-381F-8A9A-29D60132A046} = {A71D2131-F425-381F-8A9A-29D60132A046} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "raw-identify", "buildfiles\raw-identify.vcxproj", "{7C4F61DB-717E-36C9-B20E-36F8E218AB51}" + ProjectSection(ProjectDependencies) = postProject + {A71D2131-F425-381F-8A9A-29D60132A046} = {A71D2131-F425-381F-8A9A-29D60132A046} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "simple_dcraw", "buildfiles\simple_dcraw.vcxproj", "{AD1E31D8-A022-3672-982F-C8280A0D6458}" + ProjectSection(ProjectDependencies) = postProject + {A71D2131-F425-381F-8A9A-29D60132A046} = {A71D2131-F425-381F-8A9A-29D60132A046} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multirender_test", "buildfiles\multirender_test.vcxproj", "{30D21208-219A-3AA8-ADCF-E6B1FFAF6A73}" + ProjectSection(ProjectDependencies) = postProject + {A71D2131-F425-381F-8A9A-29D60132A046} = {A71D2131-F425-381F-8A9A-29D60132A046} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unprocessed_raw", "buildfiles\unprocessed_raw.vcxproj", "{1333E21E-D3B5-3640-9A4D-D8955082B855}" + ProjectSection(ProjectDependencies) = postProject + {A71D2131-F425-381F-8A9A-29D60132A046} = {A71D2131-F425-381F-8A9A-29D60132A046} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "4channels", "buildfiles\4channels.vcxproj", "{F68CBE78-B27A-3A05-BCD3-293E8CAC1C52}" + ProjectSection(ProjectDependencies) = postProject + {A71D2131-F425-381F-8A9A-29D60132A046} = {A71D2131-F425-381F-8A9A-29D60132A046} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rawtextdump", "buildfiles\rawtextdump.vcxproj", "{53A1E3F0-8032-348E-B3BF-3E540A45005F}" + ProjectSection(ProjectDependencies) = postProject + {A71D2131-F425-381F-8A9A-29D60132A046} = {A71D2131-F425-381F-8A9A-29D60132A046} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "openbayer_sample", "buildfiles\openbayer_sample.vcxproj", "{EF67FEF1-4B19-3765-A660-9F8E9333DEF3}" + ProjectSection(ProjectDependencies) = postProject + {A71D2131-F425-381F-8A9A-29D60132A046} = {A71D2131-F425-381F-8A9A-29D60132A046} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {48688DB8-559A-3DE2-ADDE-5BD27BFEDDA2}.Debug|x64.ActiveCfg = Debug|x64 + {48688DB8-559A-3DE2-ADDE-5BD27BFEDDA2}.Debug|x64.Build.0 = Debug|x64 + {48688DB8-559A-3DE2-ADDE-5BD27BFEDDA2}.Release|x64.ActiveCfg = Release|x64 + {48688DB8-559A-3DE2-ADDE-5BD27BFEDDA2}.Release|x64.Build.0 = Release|x64 + {A71D2131-F425-381F-8A9A-29D60132A046}.Debug|x64.ActiveCfg = Debug|x64 + {A71D2131-F425-381F-8A9A-29D60132A046}.Debug|x64.Build.0 = Debug|x64 + {A71D2131-F425-381F-8A9A-29D60132A046}.Release|x64.ActiveCfg = Release|x64 + {A71D2131-F425-381F-8A9A-29D60132A046}.Release|x64.Build.0 = Release|x64 + {5C66A8FA-D211-3E2F-A2F1-0C3C665689CC}.Debug|x64.ActiveCfg = Debug|x64 + {5C66A8FA-D211-3E2F-A2F1-0C3C665689CC}.Debug|x64.Build.0 = Debug|x64 + {5C66A8FA-D211-3E2F-A2F1-0C3C665689CC}.Release|x64.ActiveCfg = Release|x64 + {5C66A8FA-D211-3E2F-A2F1-0C3C665689CC}.Release|x64.Build.0 = Release|x64 + {C6EACFA3-9FC5-393B-BCF6-2874B05E4581}.Debug|x64.ActiveCfg = Debug|x64 + {C6EACFA3-9FC5-393B-BCF6-2874B05E4581}.Debug|x64.Build.0 = Debug|x64 + {C6EACFA3-9FC5-393B-BCF6-2874B05E4581}.Release|x64.ActiveCfg = Release|x64 + {C6EACFA3-9FC5-393B-BCF6-2874B05E4581}.Release|x64.Build.0 = Release|x64 + {BF8A2750-B847-3BA6-9EAF-05F43380F46C}.Debug|x64.ActiveCfg = Debug|x64 + {BF8A2750-B847-3BA6-9EAF-05F43380F46C}.Debug|x64.Build.0 = Debug|x64 + {BF8A2750-B847-3BA6-9EAF-05F43380F46C}.Release|x64.ActiveCfg = Release|x64 + {BF8A2750-B847-3BA6-9EAF-05F43380F46C}.Release|x64.Build.0 = Release|x64 + {7C4F61DB-717E-36C9-B20E-36F8E218AB51}.Debug|x64.ActiveCfg = Debug|x64 + {7C4F61DB-717E-36C9-B20E-36F8E218AB51}.Debug|x64.Build.0 = Debug|x64 + {7C4F61DB-717E-36C9-B20E-36F8E218AB51}.Release|x64.ActiveCfg = Release|x64 + {7C4F61DB-717E-36C9-B20E-36F8E218AB51}.Release|x64.Build.0 = Release|x64 + {AD1E31D8-A022-3672-982F-C8280A0D6458}.Debug|x64.ActiveCfg = Debug|x64 + {AD1E31D8-A022-3672-982F-C8280A0D6458}.Debug|x64.Build.0 = Debug|x64 + {AD1E31D8-A022-3672-982F-C8280A0D6458}.Release|x64.ActiveCfg = Release|x64 + {AD1E31D8-A022-3672-982F-C8280A0D6458}.Release|x64.Build.0 = Release|x64 + {30D21208-219A-3AA8-ADCF-E6B1FFAF6A73}.Debug|x64.ActiveCfg = Debug|x64 + {30D21208-219A-3AA8-ADCF-E6B1FFAF6A73}.Debug|x64.Build.0 = Debug|x64 + {30D21208-219A-3AA8-ADCF-E6B1FFAF6A73}.Release|x64.ActiveCfg = Release|x64 + {30D21208-219A-3AA8-ADCF-E6B1FFAF6A73}.Release|x64.Build.0 = Release|x64 + {1333E21E-D3B5-3640-9A4D-D8955082B855}.Debug|x64.ActiveCfg = Debug|x64 + {1333E21E-D3B5-3640-9A4D-D8955082B855}.Debug|x64.Build.0 = Debug|x64 + {1333E21E-D3B5-3640-9A4D-D8955082B855}.Release|x64.ActiveCfg = Release|x64 + {1333E21E-D3B5-3640-9A4D-D8955082B855}.Release|x64.Build.0 = Release|x64 + {F68CBE78-B27A-3A05-BCD3-293E8CAC1C52}.Debug|x64.ActiveCfg = Debug|x64 + {F68CBE78-B27A-3A05-BCD3-293E8CAC1C52}.Debug|x64.Build.0 = Debug|x64 + {F68CBE78-B27A-3A05-BCD3-293E8CAC1C52}.Release|x64.ActiveCfg = Release|x64 + {F68CBE78-B27A-3A05-BCD3-293E8CAC1C52}.Release|x64.Build.0 = Release|x64 + {53A1E3F0-8032-348E-B3BF-3E540A45005F}.Debug|x64.ActiveCfg = Debug|x64 + {53A1E3F0-8032-348E-B3BF-3E540A45005F}.Debug|x64.Build.0 = Debug|x64 + {53A1E3F0-8032-348E-B3BF-3E540A45005F}.Release|x64.ActiveCfg = Release|x64 + {53A1E3F0-8032-348E-B3BF-3E540A45005F}.Release|x64.Build.0 = Release|x64 + {EF67FEF1-4B19-3765-A660-9F8E9333DEF3}.Debug|x64.ActiveCfg = Debug|x64 + {EF67FEF1-4B19-3765-A660-9F8E9333DEF3}.Debug|x64.Build.0 = Debug|x64 + {EF67FEF1-4B19-3765-A660-9F8E9333DEF3}.Release|x64.ActiveCfg = Release|x64 + {EF67FEF1-4B19-3765-A660-9F8E9333DEF3}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {FB319846-66B9-4F61-8285-5EA4D2F09634} + EndGlobalSection +EndGlobal diff --git a/rtengine/libraw/Makefile.am b/rtengine/libraw/Makefile.am new file mode 100644 index 000000000..c5bd647da --- /dev/null +++ b/rtengine/libraw/Makefile.am @@ -0,0 +1,141 @@ +# autoconf macros +ACLOCAL_AMFLAGS = -I m4 +AUTOMAKE_OPTIONS=subdir-objects + +LIBRAW_SHLIB_VER = @LIBRAW_SHLIB_VERSION@ +LIBRAW_RELEASE_VER = @LIBRAW_RELEASE_VERSION@ + +# Headers +nobase_include_HEADERS = libraw/libraw.h \ + libraw/libraw_alloc.h \ + libraw/libraw_const.h \ + libraw/libraw_datastream.h \ + libraw/libraw_internal.h \ + libraw/libraw_types.h \ + libraw/libraw_version.h + +# Docs +doc_DATA = COPYRIGHT \ + LICENSE.CDDL \ + LICENSE.LGPL \ + Changelog.txt + +# pkg-config .pc files +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libraw.pc libraw_r.pc + +# Libraries +lib_LTLIBRARIES = lib/libraw.la lib/libraw_r.la + +lib_libraw_a_CPPFLAGS = -DLIBRAW_NOTHREADS -w +lib_libraw_a_SOURCES = src/libraw_c_api.cpp \ + src/libraw_datastream.cpp src/decoders/canon_600.cpp \ + src/decoders/crx.cpp src/decoders/pana8.cpp src/decoders/decoders_dcraw.cpp \ + src/decoders/sonycc.cpp src/decompressors/losslessjpeg.cpp \ + src/decoders/decoders_libraw_dcrdefs.cpp \ + src/decoders/decoders_libraw.cpp src/decoders/dng.cpp \ + src/decoders/fp_dng.cpp src/decoders/fuji_compressed.cpp \ + src/decoders/generic.cpp src/decoders/kodak_decoders.cpp \ + src/decoders/load_mfbacks.cpp src/decoders/smal.cpp \ + src/decoders/unpack_thumb.cpp src/decoders/unpack.cpp \ + src/demosaic/aahd_demosaic.cpp src/demosaic/ahd_demosaic.cpp \ + src/demosaic/dcb_demosaic.cpp src/demosaic/dht_demosaic.cpp \ + src/demosaic/misc_demosaic.cpp src/demosaic/xtrans_demosaic.cpp \ + src/integration/dngsdk_glue.cpp src/integration/rawspeed_glue.cpp\ + src/metadata/adobepano.cpp src/metadata/canon.cpp \ + src/metadata/ciff.cpp src/metadata/cr3_parser.cpp \ + src/metadata/epson.cpp src/metadata/exif_gps.cpp \ + src/metadata/fuji.cpp src/metadata/identify_tools.cpp \ + src/metadata/identify.cpp src/metadata/kodak.cpp \ + src/metadata/leica.cpp src/metadata/makernotes.cpp \ + src/metadata/mediumformat.cpp src/metadata/minolta.cpp \ + src/metadata/misc_parsers.cpp src/metadata/nikon.cpp \ + src/metadata/normalize_model.cpp src/metadata/olympus.cpp \ + src/metadata/hasselblad_model.cpp \ + src/metadata/p1.cpp src/metadata/pentax.cpp src/metadata/samsung.cpp \ + src/metadata/sony.cpp src/metadata/tiff.cpp \ + src/postprocessing/aspect_ratio.cpp \ + src/postprocessing/dcraw_process.cpp src/postprocessing/mem_image.cpp \ + src/postprocessing/postprocessing_aux.cpp \ + src/postprocessing/postprocessing_utils_dcrdefs.cpp \ + src/postprocessing/postprocessing_utils.cpp \ + src/preprocessing/ext_preprocess.cpp src/preprocessing/raw2image.cpp \ + src/preprocessing/subtract_black.cpp src/tables/cameralist.cpp \ + src/tables/colorconst.cpp src/tables/colordata.cpp \ + src/tables/wblists.cpp src/utils/curves.cpp \ + src/utils/decoder_info.cpp src/utils/init_close_utils.cpp \ + src/utils/open.cpp src/utils/phaseone_processing.cpp \ + src/utils/read_utils.cpp src/utils/thumb_utils.cpp \ + src/utils/utils_dcraw.cpp src/utils/utils_libraw.cpp \ + src/write/apply_profile.cpp src/write/file_write.cpp \ + src/write/tiff_writer.cpp src/x3f/x3f_parse_process.cpp \ + src/x3f/x3f_utils_patched.cpp + + +lib_libraw_r_a_CXXFLAGS = -pthread -w +lib_libraw_r_a_CFLAGS = -pthread -w +lib_libraw_la_SOURCES = $(lib_libraw_a_SOURCES) +lib_libraw_r_la_SOURCES = $(lib_libraw_a_SOURCES) + +lib_libraw_la_LDFLAGS = -no-undefined -version-info $(LIBRAW_SHLIB_VER) +lib_libraw_r_la_LDFLAGS = -no-undefined -version-info $(LIBRAW_SHLIB_VER) + + +# Sample binaries +if EXAMPLES +bin_PROGRAMS = bin/raw-identify \ + bin/unprocessed_raw \ + bin/4channels \ + bin/rawtextdump \ + bin/simple_dcraw \ + bin/mem_image \ + bin/dcraw_half \ + bin/half_mt \ + bin/multirender_test \ + bin/postprocessing_benchmark \ + bin/dcraw_emu +endif + +bin_raw_identify_SOURCES = samples/raw-identify.cpp +bin_raw_identify_CPPFLAGS = $(lib_libraw_a_CPPFLAGS) +bin_raw_identify_LDADD = lib/libraw.la + +bin_unprocessed_raw_SOURCES = samples/unprocessed_raw.cpp +bin_unprocessed_raw_CPPFLAGS = $(lib_libraw_a_CPPFLAGS) +bin_unprocessed_raw_LDADD = lib/libraw.la + +bin_rawtextdump_SOURCES = samples/rawtextdump.cpp +bin_rawtextdump_CPPFLAGS = $(lib_libraw_a_CPPFLAGS) +bin_rawtextdump_LDADD = lib/libraw.la + +bin_4channels_SOURCES = samples/4channels.cpp +bin_4channels_CPPFLAGS = $(lib_libraw_a_CPPFLAGS) +bin_4channels_LDADD = lib/libraw.la + +bin_simple_dcraw_SOURCES = samples/simple_dcraw.cpp +bin_simple_dcraw_CPPFLAGS = $(lib_libraw_a_CPPFLAGS) +bin_simple_dcraw_LDADD = lib/libraw.la + +bin_multirender_test_SOURCES = samples/multirender_test.cpp +bin_multirender_test_CPPFLAGS = $(lib_libraw_a_CPPFLAGS) +bin_multirender_test_LDADD = lib/libraw.la + +bin_postprocessing_benchmark_SOURCES = samples/postprocessing_benchmark.cpp +bin_postprocessing_benchmark_CPPFLAGS = $(lib_libraw_a_CPPFLAGS) +bin_postprocessing_benchmark_LDADD = lib/libraw.la + +bin_mem_image_SOURCES = samples/mem_image_sample.cpp +bin_mem_image_CPPFLAGS = $(lib_libraw_a_CPPFLAGS) +bin_mem_image_LDADD = lib/libraw.la + +bin_dcraw_half_SOURCES = samples/dcraw_half.c +bin_dcraw_half_CPPFLAGS = $(lib_libraw_a_CPPFLAGS) +bin_dcraw_half_LDADD = lib/libraw.la + +bin_half_mt_SOURCES = samples/half_mt.c +bin_half_mt_CFLAGS = $(lib_libraw_r_a_CXXFLAGS) +bin_half_mt_LDADD = lib/libraw_r.la + +bin_dcraw_emu_SOURCES = samples/dcraw_emu.cpp +bin_dcraw_emu_CPPFLAGS = $(lib_libraw_a_CPPFLAGS) +bin_dcraw_emu_LDADD = lib/libraw.la diff --git a/rtengine/libraw/Makefile.devel b/rtengine/libraw/Makefile.devel new file mode 100644 index 000000000..73da195e3 --- /dev/null +++ b/rtengine/libraw/Makefile.devel @@ -0,0 +1,507 @@ +all: library all_samples + +CC=clang +CXX=clang++ + +#CC=gcc +#CXX=g++ + +LDADD+=-lz + +CFLAGS=-DLIBRAW_USE_AUTOPTR +CFLAGS+= -g -I. -pedantic -Wno-long-long -Wno-overflow -O3 + +# macOS dual arch +# CFLAGS+=-arch x86_64 -arch arm64 + +# RawSpeed Support +# CFLAGS+=-DUSE_RAWSPEED -I../RawSpeed -I/opt/local/include/libxml2 +# LDADD+=-L../RawSpeed/RawSpeed/release -lrawspeed -L/opt/local/include -ljpeg -lxml2 +# RAWSPEED_DATA=../RawSpeed/data/cameras.xml + +# RawSpeed3 Support +#CFLAGS+=-DUSE_RAWSPEED3 -DUSE_RAWSPEED_BITS -I./RawSpeed3/ +#LDADD+=-L../RawSpeed-v3/release -lrawspeed3 -L/usr/local/lib -ljpeg -lz + + +# DNG SDK Support +# CFLAGS+=-DUSE_DNGSDK -I../dng_sdk/source +# LDADDD+=-L../dng_sdk/release -ldng -ljpeg -lz + +# LCMS support +# For lcms2 set -DUSE_LCMS2 +#CFLAGS+=-DUSE_LCMS2 -I/opt/local/include +#LDADD+=-L/opt/local/lib -llcms + +# ZLIB support (FP dng) +CFLAGS+=-DUSE_ZLIB +LDADD+=-lz + +# JPEG support for DNG and Kodak +CFLAGS+=-DUSE_JPEG -I/usr/local/include +LDADD+=-L/usr/local/lib -ljpeg + +# LIBJPEG8: +CFLAGS+=-DUSE_JPEG8 + +CSTFLAGS=$(CFLAGS) -DLIBRAW_NOTHREADS +HEADERS=libraw/libraw.h libraw/libraw_alloc.h libraw/libraw_const.h \ + libraw/libraw_datastream.h libraw/libraw_internal.h \ + libraw/libraw_types.h libraw/libraw_version.h \ + internal/dcraw_defs.h internal/dcraw_fileio_defs.h internal/defines.h \ + internal/dmp_include.h internal/libraw_cameraids.h internal/libraw_cxx_defs.h \ + internal/libraw_internal_funcs.h internal/var_defines.h internal/x3f_tools.h + +LIB_OBJECTS= object/libraw_datastream.o object/libraw_c_api.o \ + object/cameralist.o object/fuji_compressed.o \ + object/crx.o object/pana8.o object/fp_dng.o object/decoders_libraw.o \ + object/sonycc.o object/losslessjpeg.o \ + object/unpack.o object/unpack_thumb.o \ + object/rawspeed_glue.o object/dngsdk_glue.o \ + object/colorconst.o object/utils_libraw.o object/init_close_utils.o \ + object/decoder_info.o object/open.o object/phaseone_processing.o \ + object/thumb_utils.o \ + object/tiff_writer.o object/subtract_black.o object/postprocessing_utils.o \ + object/dcraw_process.o object/raw2image.o object/mem_image.o \ + object/x3f_utils_patched.o object/x3f_parse_process.o \ + object/read_utils.o object/curves.o object/utils_dcraw.o \ + object/colordata.o \ + object/canon_600.o object/decoders_dcraw.o \ + object/decoders_libraw_dcrdefs.o object/generic.o \ + object/kodak_decoders.o object/dng.o object/smal.o \ + object/load_mfbacks.o \ + object/sony.o object/nikon.o object/samsung.o object/cr3_parser.o \ + object/canon.o object/epson.o object/olympus.o object/leica.o \ + object/fuji.o object/adobepano.o object/pentax.o object/p1.o \ + object/makernotes.o object/exif_gps.o object/kodak.o \ + object/tiff.o object/ciff.o object/mediumformat.o object/minolta.o \ + object/identify_tools.o \ + object/hasselblad_model.o object/normalize_model.o object/identify.o \ + object/misc_parsers.o object/wblists.o \ + object/postprocessing_aux.o object/postprocessing_utils_dcrdefs.o \ + object/aspect_ratio.o \ + object/misc_demosaic.o object/xtrans_demosaic.o object/ahd_demosaic.o \ + object/dht_demosaic.o object/aahd_demosaic.o object/dcb_demosaic.o \ + object/file_write.o \ + object/ext_preprocess.o object/apply_profile.o + + +LIB_MT_OBJECTS= object/libraw_datastream.mt.o object/libraw_c_api.mt.o \ + object/cameralist.mt.o object/fuji_compressed.mt.o \ + object/crx.mt.o object/pana8.mt.o object/fp_dng.mt.o \ + object/sonycc.mt.o object/losslessjpeg.mt.o \ + object/decoders_libraw.mt.o \ + object/unpack.mt.o object/unpack_thumb.mt.o \ + object/rawspeed_glue.mt.o object/dngsdk_glue.mt.o \ + object/colorconst.mt.o object/utils_libraw.mt.o \ + object/init_close_utils.mt.o \ + object/decoder_info.mt.o object/open.mt.o object/phaseone_processing.mt.o \ + object/thumb_utils.mt.o \ + object/tiff_writer.mt.o object/subtract_black.mt.o \ + object/postprocessing_utils.mt.o object/dcraw_process.mt.o \ + object/raw2image.mt.o object/mem_image.mt.o \ + object/x3f_utils_patched.mt.o object/x3f_parse_process.mt.o \ + object/read_utils.mt.o object/curves.mt.o object/utils_dcraw.mt.o \ + object/colordata.mt.o \ + object/canon_600.mt.o object/decoders_dcraw.mt.o \ + object/decoders_libraw_dcrdefs.mt.o object/generic.mt.o \ + object/kodak_decoders.mt.o object/dng.mt.o object/smal.mt.o \ + object/load_mfbacks.mt.o \ + object/sony.mt.o object/nikon.mt.o object/samsung.mt.o \ + object/cr3_parser.mt.o object/canon.mt.o object/epson.mt.o \ + object/olympus.mt.o object/leica.mt.o \ + object/fuji.mt.o object/adobepano.mt.o object/pentax.mt.o object/p1.mt.o \ + object/makernotes.mt.o object/exif_gps.mt.o object/kodak.mt.o \ + object/tiff.mt.o object/ciff.mt.o object/mediumformat.mt.o \ + object/minolta.mt.o \ + object/identify_tools.mt.o \ + object/hasselblad_model.mt.o object/normalize_model.mt.o object/identify.mt.o \ + object/misc_parsers.mt.o object/wblists.mt.o \ + object/postprocessing_aux.mt.o object/postprocessing_utils_dcrdefs.mt.o \ + object/aspect_ratio.mt.o \ + object/misc_demosaic.mt.o object/xtrans_demosaic.mt.o \ + object/ahd_demosaic.mt.o object/dht_demosaic.mt.o \ + object/aahd_demosaic.mt.o object/dcb_demosaic.mt.o \ + object/file_write.mt.o \ + object/ext_preprocess.mt.o object/apply_profile.mt.o + + +LR_INCLUDES=libraw/libraw.h libraw/libraw_alloc.h \ + libraw/libraw_const.h libraw/libraw_datastream.h \ + libraw/libraw_internal.h libraw/libraw_types.h \ + libraw/libraw_version.h + +library: lib/libraw.a lib/libraw_r.a + +all_samples: bin/raw-identify bin/simple_dcraw bin/dcraw_emu \ + bin/dcraw_half bin/half_mt bin/mem_image \ + bin/unprocessed_raw bin/4channels bin/multirender_test \ + bin/postprocessing_benchmark bin/rawtextdump + +## RawSpeed xml file + +RawSpeed/rawspeed_xmldata.cpp: ${RAWSPEED_DATA} + ./rsxml2c.sh ${RAWSPEED_DATA} > RawSpeed/rawspeed_xmldata.cpp + +## Samples ## +bin/raw-identify: lib/libraw.a samples/raw-identify.cpp $(HEADERS) + $(CXX) ${CFLAGS} -o bin/raw-identify samples/raw-identify.cpp -L./lib -lraw -lm ${LDADD} + +bin/simple_dcraw: lib/libraw.a samples/simple_dcraw.cpp $(HEADERS) + $(CXX) -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/simple_dcraw samples/simple_dcraw.cpp -L./lib -lraw -lm ${LDADD} + +bin/multirender_test: lib/libraw.a samples/multirender_test.cpp $(HEADERS) + $(CXX) -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/multirender_test samples/multirender_test.cpp -L./lib -lraw -lm ${LDADD} + +bin/postprocessing_benchmark: lib/libraw.a samples/postprocessing_benchmark.cpp $(HEADERS) + $(CXX) -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/postprocessing_benchmark samples/postprocessing_benchmark.cpp -L./lib -lraw -lm ${LDADD} + +bin/unprocessed_raw: lib/libraw.a samples/unprocessed_raw.cpp $(HEADERS) + $(CXX) -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/unprocessed_raw samples/unprocessed_raw.cpp -L./lib -lraw -lm ${LDADD} + +bin/rawtextdump: lib/libraw.a samples/rawtextdump.cpp $(HEADERS) + ${CXX} -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/rawtextdump samples/rawtextdump.cpp -L./lib -lraw -lm ${LDADD} + +bin/4channels: lib/libraw.a samples/4channels.cpp $(HEADERS) + $(CXX) -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/4channels samples/4channels.cpp -L./lib -lraw -lm ${LDADD} + +bin/mem_image: lib/libraw.a samples/mem_image_sample.cpp $(HEADERS) + $(CXX) ${CFLAGS} -o bin/mem_image samples/mem_image_sample.cpp -L./lib -lraw -lm ${LDADD} + +bin/dcraw_half: lib/libraw.a samples/dcraw_half.c $(HEADERS) + $(CC) ${CFLAGS} -o bin/dcraw_half samples/dcraw_half.c -L./lib -lraw -lm -lstdc++ ${LDADD} + +bin/half_mt: lib/libraw_r.a samples/half_mt.c $(HEADERS) + $(CC) -pthread ${CFLAGS} -o bin/half_mt samples/half_mt.c -L./lib -lraw_r -lm -lstdc++ ${LDADD} + +bin/dcraw_emu: lib/libraw.a samples/dcraw_emu.cpp $(HEADERS) + $(CXX) ${CFLAGS} -o bin/dcraw_emu samples/dcraw_emu.cpp -L./lib -lraw_r -lm ${LDADD} + +lib/libraw.a: ${LIB_OBJECTS} + rm -f lib/libraw.a + ar crv lib/libraw.a ${LIB_OBJECTS} + ranlib lib/libraw.a + +lib/libraw_r.a: ${LIB_MT_OBJECTS} + rm -f lib/libraw_r.a + ar crv lib/libraw_r.a ${LIB_MT_OBJECTS} + ranlib lib/libraw_r.a + +clean: + rm -fr bin/*.dSYM + rm -f *.o *~ src/*~ samples/*~ internal/*~ libraw/*~ lib/lib*.a bin/[4a-z]* object/*.o object/*.mto dcraw/*~ doc/*~ bin/*~ src/*/*~ + +## script-created rules +object/libraw_c_api.o: src/libraw_c_api.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/libraw_c_api.o src/libraw_c_api.cpp +object/libraw_c_api.mt.o: src/libraw_c_api.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/libraw_c_api.mt.o src/libraw_c_api.cpp + +object/libraw_datastream.o: src/libraw_datastream.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/libraw_datastream.o src/libraw_datastream.cpp +object/libraw_datastream.mt.o: src/libraw_datastream.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/libraw_datastream.mt.o src/libraw_datastream.cpp +object/canon_600.o: src/decoders/canon_600.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/canon_600.o src/decoders/canon_600.cpp +object/canon_600.mt.o: src/decoders/canon_600.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/canon_600.mt.o src/decoders/canon_600.cpp +object/crx.o: src/decoders/crx.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/crx.o src/decoders/crx.cpp +object/crx.mt.o: src/decoders/crx.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/crx.mt.o src/decoders/crx.cpp +object/pana8.o: src/decoders/pana8.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/pana8.o src/decoders/pana8.cpp +object/pana8.mt.o: src/decoders/pana8.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/pana8.mt.o src/decoders/pana8.cpp +object/sonycc.o: src/decoders/sonycc.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/sonycc.o src/decoders/sonycc.cpp +object/sonycc.mt.o: src/decoders/sonycc.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/sonycc.mt.o src/decoders/sonycc.cpp +object/losslessjpeg.o: src/decompressors/losslessjpeg.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/losslessjpeg.o src/decompressors/losslessjpeg.cpp +object/losslessjpeg.mt.o: src/decompressors/losslessjpeg.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/losslessjpeg.mt.o src/decompressors/losslessjpeg.cpp +object/decoders_dcraw.o: src/decoders/decoders_dcraw.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/decoders_dcraw.o src/decoders/decoders_dcraw.cpp +object/decoders_dcraw.mt.o: src/decoders/decoders_dcraw.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/decoders_dcraw.mt.o src/decoders/decoders_dcraw.cpp +object/decoders_libraw_dcrdefs.o: src/decoders/decoders_libraw_dcrdefs.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/decoders_libraw_dcrdefs.o src/decoders/decoders_libraw_dcrdefs.cpp +object/decoders_libraw_dcrdefs.mt.o: src/decoders/decoders_libraw_dcrdefs.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/decoders_libraw_dcrdefs.mt.o src/decoders/decoders_libraw_dcrdefs.cpp +object/decoders_libraw.o: src/decoders/decoders_libraw.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/decoders_libraw.o src/decoders/decoders_libraw.cpp +object/decoders_libraw.mt.o: src/decoders/decoders_libraw.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/decoders_libraw.mt.o src/decoders/decoders_libraw.cpp +object/dng.o: src/decoders/dng.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/dng.o src/decoders/dng.cpp +object/dng.mt.o: src/decoders/dng.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/dng.mt.o src/decoders/dng.cpp +object/fp_dng.o: src/decoders/fp_dng.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/fp_dng.o src/decoders/fp_dng.cpp +object/fp_dng.mt.o: src/decoders/fp_dng.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/fp_dng.mt.o src/decoders/fp_dng.cpp +object/fuji_compressed.o: src/decoders/fuji_compressed.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/fuji_compressed.o src/decoders/fuji_compressed.cpp +object/fuji_compressed.mt.o: src/decoders/fuji_compressed.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/fuji_compressed.mt.o src/decoders/fuji_compressed.cpp +object/generic.o: src/decoders/generic.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/generic.o src/decoders/generic.cpp +object/generic.mt.o: src/decoders/generic.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/generic.mt.o src/decoders/generic.cpp +object/kodak_decoders.o: src/decoders/kodak_decoders.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/kodak_decoders.o src/decoders/kodak_decoders.cpp +object/kodak_decoders.mt.o: src/decoders/kodak_decoders.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/kodak_decoders.mt.o src/decoders/kodak_decoders.cpp +object/load_mfbacks.o: src/decoders/load_mfbacks.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/load_mfbacks.o src/decoders/load_mfbacks.cpp +object/load_mfbacks.mt.o: src/decoders/load_mfbacks.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/load_mfbacks.mt.o src/decoders/load_mfbacks.cpp +object/smal.o: src/decoders/smal.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/smal.o src/decoders/smal.cpp +object/smal.mt.o: src/decoders/smal.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/smal.mt.o src/decoders/smal.cpp +object/unpack_thumb.o: src/decoders/unpack_thumb.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/unpack_thumb.o src/decoders/unpack_thumb.cpp +object/unpack_thumb.mt.o: src/decoders/unpack_thumb.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/unpack_thumb.mt.o src/decoders/unpack_thumb.cpp +object/unpack.o: src/decoders/unpack.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/unpack.o src/decoders/unpack.cpp +object/unpack.mt.o: src/decoders/unpack.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/unpack.mt.o src/decoders/unpack.cpp +object/aahd_demosaic.o: src/demosaic/aahd_demosaic.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/aahd_demosaic.o src/demosaic/aahd_demosaic.cpp +object/aahd_demosaic.mt.o: src/demosaic/aahd_demosaic.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/aahd_demosaic.mt.o src/demosaic/aahd_demosaic.cpp +object/ahd_demosaic.o: src/demosaic/ahd_demosaic.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/ahd_demosaic.o src/demosaic/ahd_demosaic.cpp +object/ahd_demosaic.mt.o: src/demosaic/ahd_demosaic.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/ahd_demosaic.mt.o src/demosaic/ahd_demosaic.cpp +object/dcb_demosaic.o: src/demosaic/dcb_demosaic.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/dcb_demosaic.o src/demosaic/dcb_demosaic.cpp +object/dcb_demosaic.mt.o: src/demosaic/dcb_demosaic.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/dcb_demosaic.mt.o src/demosaic/dcb_demosaic.cpp +object/dht_demosaic.o: src/demosaic/dht_demosaic.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/dht_demosaic.o src/demosaic/dht_demosaic.cpp +object/dht_demosaic.mt.o: src/demosaic/dht_demosaic.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/dht_demosaic.mt.o src/demosaic/dht_demosaic.cpp +object/misc_demosaic.o: src/demosaic/misc_demosaic.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/misc_demosaic.o src/demosaic/misc_demosaic.cpp +object/misc_demosaic.mt.o: src/demosaic/misc_demosaic.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/misc_demosaic.mt.o src/demosaic/misc_demosaic.cpp +object/xtrans_demosaic.o: src/demosaic/xtrans_demosaic.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/xtrans_demosaic.o src/demosaic/xtrans_demosaic.cpp +object/xtrans_demosaic.mt.o: src/demosaic/xtrans_demosaic.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/xtrans_demosaic.mt.o src/demosaic/xtrans_demosaic.cpp +object/dngsdk_glue.o: src/integration/dngsdk_glue.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/dngsdk_glue.o src/integration/dngsdk_glue.cpp +object/dngsdk_glue.mt.o: src/integration/dngsdk_glue.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/dngsdk_glue.mt.o src/integration/dngsdk_glue.cpp +object/rawspeed_glue.o: src/integration/rawspeed_glue.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/rawspeed_glue.o src/integration/rawspeed_glue.cpp +object/rawspeed_glue.mt.o: src/integration/rawspeed_glue.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/rawspeed_glue.mt.o src/integration/rawspeed_glue.cpp +object/adobepano.o: src/metadata/adobepano.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/adobepano.o src/metadata/adobepano.cpp +object/adobepano.mt.o: src/metadata/adobepano.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/adobepano.mt.o src/metadata/adobepano.cpp +object/canon.o: src/metadata/canon.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/canon.o src/metadata/canon.cpp +object/canon.mt.o: src/metadata/canon.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/canon.mt.o src/metadata/canon.cpp +object/ciff.o: src/metadata/ciff.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/ciff.o src/metadata/ciff.cpp +object/ciff.mt.o: src/metadata/ciff.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/ciff.mt.o src/metadata/ciff.cpp +object/cr3_parser.o: src/metadata/cr3_parser.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/cr3_parser.o src/metadata/cr3_parser.cpp +object/cr3_parser.mt.o: src/metadata/cr3_parser.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/cr3_parser.mt.o src/metadata/cr3_parser.cpp +object/epson.o: src/metadata/epson.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/epson.o src/metadata/epson.cpp +object/epson.mt.o: src/metadata/epson.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/epson.mt.o src/metadata/epson.cpp +object/exif_gps.o: src/metadata/exif_gps.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/exif_gps.o src/metadata/exif_gps.cpp +object/exif_gps.mt.o: src/metadata/exif_gps.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/exif_gps.mt.o src/metadata/exif_gps.cpp +object/fuji.o: src/metadata/fuji.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/fuji.o src/metadata/fuji.cpp +object/fuji.mt.o: src/metadata/fuji.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/fuji.mt.o src/metadata/fuji.cpp +object/identify_tools.o: src/metadata/identify_tools.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/identify_tools.o src/metadata/identify_tools.cpp +object/identify_tools.mt.o: src/metadata/identify_tools.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/identify_tools.mt.o src/metadata/identify_tools.cpp +object/identify.o: src/metadata/identify.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/identify.o src/metadata/identify.cpp +object/identify.mt.o: src/metadata/identify.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/identify.mt.o src/metadata/identify.cpp +object/kodak.o: src/metadata/kodak.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/kodak.o src/metadata/kodak.cpp +object/kodak.mt.o: src/metadata/kodak.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/kodak.mt.o src/metadata/kodak.cpp +object/leica.o: src/metadata/leica.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/leica.o src/metadata/leica.cpp +object/leica.mt.o: src/metadata/leica.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/leica.mt.o src/metadata/leica.cpp +object/makernotes.o: src/metadata/makernotes.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/makernotes.o src/metadata/makernotes.cpp +object/makernotes.mt.o: src/metadata/makernotes.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/makernotes.mt.o src/metadata/makernotes.cpp +object/mediumformat.o: src/metadata/mediumformat.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/mediumformat.o src/metadata/mediumformat.cpp +object/mediumformat.mt.o: src/metadata/mediumformat.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/mediumformat.mt.o src/metadata/mediumformat.cpp +object/minolta.o: src/metadata/minolta.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/minolta.o src/metadata/minolta.cpp +object/minolta.mt.o: src/metadata/minolta.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/minolta.mt.o src/metadata/minolta.cpp +object/misc_parsers.o: src/metadata/misc_parsers.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/misc_parsers.o src/metadata/misc_parsers.cpp +object/misc_parsers.mt.o: src/metadata/misc_parsers.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/misc_parsers.mt.o src/metadata/misc_parsers.cpp +object/nikon.o: src/metadata/nikon.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/nikon.o src/metadata/nikon.cpp +object/nikon.mt.o: src/metadata/nikon.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/nikon.mt.o src/metadata/nikon.cpp +object/hasselblad_model.o: src/metadata/hasselblad_model.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/hasselblad_model.o src/metadata/hasselblad_model.cpp +object/hasselblad_model.mt.o: src/metadata/hasselblad_model.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/hasselblad_model.mt.o src/metadata/hasselblad_model.cpp +object/normalize_model.o: src/metadata/normalize_model.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/normalize_model.o src/metadata/normalize_model.cpp +object/normalize_model.mt.o: src/metadata/normalize_model.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/normalize_model.mt.o src/metadata/normalize_model.cpp +object/olympus.o: src/metadata/olympus.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/olympus.o src/metadata/olympus.cpp +object/olympus.mt.o: src/metadata/olympus.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/olympus.mt.o src/metadata/olympus.cpp +object/p1.o: src/metadata/p1.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/p1.o src/metadata/p1.cpp +object/p1.mt.o: src/metadata/p1.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/p1.mt.o src/metadata/p1.cpp +object/pentax.o: src/metadata/pentax.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/pentax.o src/metadata/pentax.cpp +object/pentax.mt.o: src/metadata/pentax.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/pentax.mt.o src/metadata/pentax.cpp +object/samsung.o: src/metadata/samsung.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/samsung.o src/metadata/samsung.cpp +object/samsung.mt.o: src/metadata/samsung.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/samsung.mt.o src/metadata/samsung.cpp +object/sony.o: src/metadata/sony.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/sony.o src/metadata/sony.cpp +object/sony.mt.o: src/metadata/sony.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/sony.mt.o src/metadata/sony.cpp +object/tiff.o: src/metadata/tiff.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/tiff.o src/metadata/tiff.cpp +object/tiff.mt.o: src/metadata/tiff.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/tiff.mt.o src/metadata/tiff.cpp +object/aspect_ratio.o: src/postprocessing/aspect_ratio.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/aspect_ratio.o src/postprocessing/aspect_ratio.cpp +object/aspect_ratio.mt.o: src/postprocessing/aspect_ratio.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/aspect_ratio.mt.o src/postprocessing/aspect_ratio.cpp +object/dcraw_process.o: src/postprocessing/dcraw_process.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/dcraw_process.o src/postprocessing/dcraw_process.cpp +object/dcraw_process.mt.o: src/postprocessing/dcraw_process.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/dcraw_process.mt.o src/postprocessing/dcraw_process.cpp +object/mem_image.o: src/postprocessing/mem_image.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/mem_image.o src/postprocessing/mem_image.cpp +object/mem_image.mt.o: src/postprocessing/mem_image.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/mem_image.mt.o src/postprocessing/mem_image.cpp +object/postprocessing_aux.o: src/postprocessing/postprocessing_aux.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/postprocessing_aux.o src/postprocessing/postprocessing_aux.cpp +object/postprocessing_aux.mt.o: src/postprocessing/postprocessing_aux.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/postprocessing_aux.mt.o src/postprocessing/postprocessing_aux.cpp +object/postprocessing_utils_dcrdefs.o: src/postprocessing/postprocessing_utils_dcrdefs.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/postprocessing_utils_dcrdefs.o src/postprocessing/postprocessing_utils_dcrdefs.cpp +object/postprocessing_utils_dcrdefs.mt.o: src/postprocessing/postprocessing_utils_dcrdefs.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/postprocessing_utils_dcrdefs.mt.o src/postprocessing/postprocessing_utils_dcrdefs.cpp +object/postprocessing_utils.o: src/postprocessing/postprocessing_utils.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/postprocessing_utils.o src/postprocessing/postprocessing_utils.cpp +object/postprocessing_utils.mt.o: src/postprocessing/postprocessing_utils.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/postprocessing_utils.mt.o src/postprocessing/postprocessing_utils.cpp +object/raw2image.o: src/preprocessing/raw2image.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/raw2image.o src/preprocessing/raw2image.cpp +object/raw2image.mt.o: src/preprocessing/raw2image.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/raw2image.mt.o src/preprocessing/raw2image.cpp +object/ext_preprocess.o: src/preprocessing/ext_preprocess.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/ext_preprocess.o src/preprocessing/ext_preprocess.cpp +object/ext_preprocess.mt.o: src/preprocessing/ext_preprocess.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/ext_preprocess.mt.o src/preprocessing/ext_preprocess.cpp +object/subtract_black.o: src/preprocessing/subtract_black.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/subtract_black.o src/preprocessing/subtract_black.cpp +object/subtract_black.mt.o: src/preprocessing/subtract_black.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/subtract_black.mt.o src/preprocessing/subtract_black.cpp +object/cameralist.o: src/tables/cameralist.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/cameralist.o src/tables/cameralist.cpp +object/cameralist.mt.o: src/tables/cameralist.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/cameralist.mt.o src/tables/cameralist.cpp +object/colorconst.o: src/tables/colorconst.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/colorconst.o src/tables/colorconst.cpp +object/colorconst.mt.o: src/tables/colorconst.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/colorconst.mt.o src/tables/colorconst.cpp +object/colordata.o: src/tables/colordata.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/colordata.o src/tables/colordata.cpp +object/colordata.mt.o: src/tables/colordata.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/colordata.mt.o src/tables/colordata.cpp +object/wblists.o: src/tables/wblists.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/wblists.o src/tables/wblists.cpp +object/wblists.mt.o: src/tables/wblists.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/wblists.mt.o src/tables/wblists.cpp +object/curves.o: src/utils/curves.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/curves.o src/utils/curves.cpp +object/curves.mt.o: src/utils/curves.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/curves.mt.o src/utils/curves.cpp +object/decoder_info.o: src/utils/decoder_info.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/decoder_info.o src/utils/decoder_info.cpp +object/decoder_info.mt.o: src/utils/decoder_info.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/decoder_info.mt.o src/utils/decoder_info.cpp +object/init_close_utils.o: src/utils/init_close_utils.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/init_close_utils.o src/utils/init_close_utils.cpp +object/init_close_utils.mt.o: src/utils/init_close_utils.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/init_close_utils.mt.o src/utils/init_close_utils.cpp +object/open.o: src/utils/open.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/open.o src/utils/open.cpp +object/open.mt.o: src/utils/open.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/open.mt.o src/utils/open.cpp +object/phaseone_processing.o: src/utils/phaseone_processing.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/phaseone_processing.o src/utils/phaseone_processing.cpp +object/phaseone_processing.mt.o: src/utils/phaseone_processing.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/phaseone_processing.mt.o src/utils/phaseone_processing.cpp +object/read_utils.o: src/utils/read_utils.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/read_utils.o src/utils/read_utils.cpp +object/read_utils.mt.o: src/utils/read_utils.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/read_utils.mt.o src/utils/read_utils.cpp +object/thumb_utils.o: src/utils/thumb_utils.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/thumb_utils.o src/utils/thumb_utils.cpp +object/thumb_utils.mt.o: src/utils/thumb_utils.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/thumb_utils.mt.o src/utils/thumb_utils.cpp +object/utils_dcraw.o: src/utils/utils_dcraw.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/utils_dcraw.o src/utils/utils_dcraw.cpp +object/utils_dcraw.mt.o: src/utils/utils_dcraw.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/utils_dcraw.mt.o src/utils/utils_dcraw.cpp +object/utils_libraw.o: src/utils/utils_libraw.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/utils_libraw.o src/utils/utils_libraw.cpp +object/utils_libraw.mt.o: src/utils/utils_libraw.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/utils_libraw.mt.o src/utils/utils_libraw.cpp +object/apply_profile.o: src/write/apply_profile.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/apply_profile.o src/write/apply_profile.cpp +object/apply_profile.mt.o: src/write/apply_profile.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/apply_profile.mt.o src/write/apply_profile.cpp +object/file_write.o: src/write/file_write.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/file_write.o src/write/file_write.cpp +object/file_write.mt.o: src/write/file_write.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/file_write.mt.o src/write/file_write.cpp +object/tiff_writer.o: src/write/tiff_writer.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/tiff_writer.o src/write/tiff_writer.cpp +object/tiff_writer.mt.o: src/write/tiff_writer.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/tiff_writer.mt.o src/write/tiff_writer.cpp +object/x3f_parse_process.o: src/x3f/x3f_parse_process.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/x3f_parse_process.o src/x3f/x3f_parse_process.cpp +object/x3f_parse_process.mt.o: src/x3f/x3f_parse_process.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/x3f_parse_process.mt.o src/x3f/x3f_parse_process.cpp +object/x3f_utils_patched.o: src/x3f/x3f_utils_patched.cpp $(HEADERS) + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/x3f_utils_patched.o src/x3f/x3f_utils_patched.cpp +object/x3f_utils_patched.mt.o: src/x3f/x3f_utils_patched.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/x3f_utils_patched.mt.o src/x3f/x3f_utils_patched.cpp diff --git a/rtengine/libraw/Makefile.devel.nopp b/rtengine/libraw/Makefile.devel.nopp new file mode 100644 index 000000000..e84d1e9d4 --- /dev/null +++ b/rtengine/libraw/Makefile.devel.nopp @@ -0,0 +1,234 @@ +all: library all_samples + +CC=clang +CXX=clang++ + +#CC=gcc +#CXX=g++ + +LDADD+=-lz + +CFLAGS=-DLIBRAW_USE_AUTOPTR +CFLAGS+= -g -I. -pedantic -Wno-long-long -Wno-overflow -O3 + +# RawSpeed Support +# CFLAGS+=-DUSE_RAWSPEED -I../RawSpeed -I/opt/local/include/libxml2 +# LDADD+=-L../RawSpeed/RawSpeed/release -lrawspeed -L/opt/local/include -ljpeg -lxml2 +# RAWSPEED_DATA=../RawSpeed/data/cameras.xml + +# DNG SDK Support +# CFLAGS+=-DUSE_DNGSDK -I../dng_sdk/source +# LDADDD+=-L../dng_sdk/release -ldng -ljpeg -lz + +# LCMS support +# For lcms2 set -DUSE_LCMS2 +#CFLAGS+=-DUSE_LCMS2 -I/opt/local/include +#LDADD+=-L/opt/local/lib -llcms + + +# JPEG support for DNG and Kodak +CFLAGS+=-DUSE_JPEG -I/usr/local/include +LDADD+=-L/usr/local/lib -ljpeg + +# LIBJPEG8: +CFLAGS+=-DUSE_JPEG8 + +CSTFLAGS=$(CFLAGS) -DLIBRAW_NOTHREADS + +LIB_OBJECTS= object/libraw_datastream.o \ + object/cameralist.o object/fuji_compressed.o \ + object/crx.o object/pana8.o object/fp_dng.o object/decoders_libraw.o \ + object/sonycc.o object/losslessjpeg.o \ + object/unpack.o object/unpack_thumb.o \ + object/rawspeed_glue.o object/dngsdk_glue.o \ + object/colorconst.o object/utils_libraw.o object/init_close_utils.o \ + object/decoder_info.o object/open.o object/phaseone_processing.o \ + object/thumb_utils.o \ + object/tiff_writer.o object/subtract_black.o \ + object/raw2image.o \ + object/x3f_utils_patched.o object/x3f_parse_process.o \ + object/read_utils.o object/curves.o object/utils_dcraw.o \ + object/colordata.o \ + object/canon_600.o object/decoders_dcraw.o \ + object/decoders_libraw_dcrdefs.o object/generic.o \ + object/kodak_decoders.o object/dng.o object/smal.o \ + object/load_mfbacks.o \ + object/sony.o object/nikon.o object/samsung.o object/cr3_parser.o \ + object/canon.o object/epson.o object/olympus.o object/leica.o \ + object/fuji.o object/adobepano.o object/pentax.o object/p1.o \ + object/makernotes.o object/exif_gps.o object/kodak.o \ + object/tiff.o object/ciff.o object/mediumformat.o object/minolta.o \ + object/identify_tools.o \ + object/hasselblad_model.o object/normalize_model.o object/identify.o \ + object/misc_parsers.o object/wblists.o \ + object/file_write.o \ + object/ext_preprocess.o \ + object/postprocessing_ph.o \ + + + +LR_INCLUDES=libraw/libraw.h libraw/libraw_alloc.h \ + libraw/libraw_const.h libraw/libraw_datastream.h \ + libraw/libraw_internal.h libraw/libraw_types.h \ + libraw/libraw_version.h + +LRLIB=lib/libraw_nopp.a + +library: $(LRLIB) + +all_samples: bin/raw-identify bin/unprocessed_raw bin/4channels + +## Samples ## +bin/raw-identify: $(LRLIB) samples/raw-identify.cpp + $(CXX) ${CFLAGS} -o bin/raw-identify samples/raw-identify.cpp -L./lib -lraw_nopp -lm ${LDADD} + +bin/unprocessed_raw: $(LRLIB) samples/unprocessed_raw.cpp + $(CXX) -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/unprocessed_raw samples/unprocessed_raw.cpp -L./lib -lraw_nopp -lm ${LDADD} + +bin/4channels: $(LRLIB) samples/4channels.cpp + $(CXX) -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/4channels samples/4channels.cpp -L./lib -lraw_nopp -lm ${LDADD} + +$(LRLIB): ${LIB_OBJECTS} + rm -f $(LRLIB) + ar crv $(LRLIB) ${LIB_OBJECTS} + ranlib $(LRLIB) + +clean: + rm -fr bin/*.dSYM + rm -f *.o *~ src/*~ samples/*~ internal/*~ libraw/*~ lib/lib*.a bin/[4a-z]* object/*.o dcraw/*~ doc/*~ bin/*~ src/*/*~ + +## script-created rules +object/libraw_c_api.o: src/libraw_c_api.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/libraw_c_api.o src/libraw_c_api.cpp +object/libraw_datastream.o: src/libraw_datastream.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/libraw_datastream.o src/libraw_datastream.cpp +object/canon_600.o: src/decoders/canon_600.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/canon_600.o src/decoders/canon_600.cpp +object/crx.o: src/decoders/crx.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/crx.o src/decoders/crx.cpp +object/pana8.o: src/decoders/pana8.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/pana8.o src/decoders/pana8.cpp +object/sonycc.o: src/decoders/sonycc.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/sonycc.o src/decoders/sonycc.cpp +object/losslessjpeg.o: src/decompressors/losslessjpeg.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/losslessjpeg.o src/decompressors/losslessjpeg.cpp +object/decoders_dcraw.o: src/decoders/decoders_dcraw.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/decoders_dcraw.o src/decoders/decoders_dcraw.cpp +object/decoders_libraw_dcrdefs.o: src/decoders/decoders_libraw_dcrdefs.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/decoders_libraw_dcrdefs.o src/decoders/decoders_libraw_dcrdefs.cpp +object/decoders_libraw.o: src/decoders/decoders_libraw.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/decoders_libraw.o src/decoders/decoders_libraw.cpp +object/dng.o: src/decoders/dng.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/dng.o src/decoders/dng.cpp +object/fp_dng.o: src/decoders/fp_dng.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/fp_dng.o src/decoders/fp_dng.cpp +object/fuji_compressed.o: src/decoders/fuji_compressed.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/fuji_compressed.o src/decoders/fuji_compressed.cpp +object/generic.o: src/decoders/generic.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/generic.o src/decoders/generic.cpp +object/kodak_decoders.o: src/decoders/kodak_decoders.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/kodak_decoders.o src/decoders/kodak_decoders.cpp +object/load_mfbacks.o: src/decoders/load_mfbacks.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/load_mfbacks.o src/decoders/load_mfbacks.cpp +object/smal.o: src/decoders/smal.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/smal.o src/decoders/smal.cpp +object/unpack_thumb.o: src/decoders/unpack_thumb.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/unpack_thumb.o src/decoders/unpack_thumb.cpp +object/unpack.o: src/decoders/unpack.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/unpack.o src/decoders/unpack.cpp +object/dngsdk_glue.o: src/integration/dngsdk_glue.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/dngsdk_glue.o src/integration/dngsdk_glue.cpp +object/rawspeed_glue.o: src/integration/rawspeed_glue.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/rawspeed_glue.o src/integration/rawspeed_glue.cpp +object/adobepano.o: src/metadata/adobepano.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/adobepano.o src/metadata/adobepano.cpp +object/canon.o: src/metadata/canon.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/canon.o src/metadata/canon.cpp +object/ciff.o: src/metadata/ciff.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/ciff.o src/metadata/ciff.cpp +object/cr3_parser.o: src/metadata/cr3_parser.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/cr3_parser.o src/metadata/cr3_parser.cpp +object/epson.o: src/metadata/epson.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/epson.o src/metadata/epson.cpp +object/exif_gps.o: src/metadata/exif_gps.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/exif_gps.o src/metadata/exif_gps.cpp +object/fuji.o: src/metadata/fuji.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/fuji.o src/metadata/fuji.cpp +object/identify_tools.o: src/metadata/identify_tools.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/identify_tools.o src/metadata/identify_tools.cpp +object/identify.o: src/metadata/identify.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/identify.o src/metadata/identify.cpp +object/kodak.o: src/metadata/kodak.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/kodak.o src/metadata/kodak.cpp +object/leica.o: src/metadata/leica.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/leica.o src/metadata/leica.cpp +object/makernotes.o: src/metadata/makernotes.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/makernotes.o src/metadata/makernotes.cpp +object/mediumformat.o: src/metadata/mediumformat.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/mediumformat.o src/metadata/mediumformat.cpp +object/minolta.o: src/metadata/minolta.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/minolta.o src/metadata/minolta.cpp +object/misc_parsers.o: src/metadata/misc_parsers.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/misc_parsers.o src/metadata/misc_parsers.cpp +object/nikon.o: src/metadata/nikon.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/nikon.o src/metadata/nikon.cpp +object/hasselblad_model.o: src/metadata/hasselblad_model.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/hasselblad_model.o src/metadata/hasselblad_model.cpp +object/normalize_model.o: src/metadata/normalize_model.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/normalize_model.o src/metadata/normalize_model.cpp +object/olympus.o: src/metadata/olympus.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/olympus.o src/metadata/olympus.cpp +object/p1.o: src/metadata/p1.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/p1.o src/metadata/p1.cpp +object/pentax.o: src/metadata/pentax.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/pentax.o src/metadata/pentax.cpp +object/samsung.o: src/metadata/samsung.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/samsung.o src/metadata/samsung.cpp +object/sony.o: src/metadata/sony.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/sony.o src/metadata/sony.cpp +object/tiff.o: src/metadata/tiff.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/tiff.o src/metadata/tiff.cpp + +object/postprocessing_ph.o: src/postprocessing/postprocessing_ph.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/postprocessing_ph.o src/postprocessing/postprocessing_ph.cpp + +object/raw2image.o: src/preprocessing/raw2image.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/raw2image.o src/preprocessing/raw2image.cpp +object/ext_preprocess.o: src/preprocessing/ext_preprocess.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/ext_preprocess.o src/preprocessing/ext_preprocess.cpp +object/subtract_black.o: src/preprocessing/subtract_black.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/subtract_black.o src/preprocessing/subtract_black.cpp +object/cameralist.o: src/tables/cameralist.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/cameralist.o src/tables/cameralist.cpp +object/colorconst.o: src/tables/colorconst.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/colorconst.o src/tables/colorconst.cpp +object/colordata.o: src/tables/colordata.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/colordata.o src/tables/colordata.cpp +object/wblists.o: src/tables/wblists.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/wblists.o src/tables/wblists.cpp +object/curves.o: src/utils/curves.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/curves.o src/utils/curves.cpp +object/decoder_info.o: src/utils/decoder_info.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/decoder_info.o src/utils/decoder_info.cpp +object/init_close_utils.o: src/utils/init_close_utils.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/init_close_utils.o src/utils/init_close_utils.cpp +object/open.o: src/utils/open.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/open.o src/utils/open.cpp +object/phaseone_processing.o: src/utils/phaseone_processing.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/phaseone_processing.o src/utils/phaseone_processing.cpp +object/read_utils.o: src/utils/read_utils.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/read_utils.o src/utils/read_utils.cpp +object/thumb_utils.o: src/utils/thumb_utils.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/thumb_utils.o src/utils/thumb_utils.cpp +object/utils_dcraw.o: src/utils/utils_dcraw.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/utils_dcraw.o src/utils/utils_dcraw.cpp +object/utils_libraw.o: src/utils/utils_libraw.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/utils_libraw.o src/utils/utils_libraw.cpp +object/file_write.o: src/write/file_write.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/file_write.o src/write/file_write.cpp +object/tiff_writer.o: src/write/tiff_writer.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/tiff_writer.o src/write/tiff_writer.cpp +object/x3f_parse_process.o: src/x3f/x3f_parse_process.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/x3f_parse_process.o src/x3f/x3f_parse_process.cpp +object/x3f_utils_patched.o: src/x3f/x3f_utils_patched.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/x3f_utils_patched.o src/x3f/x3f_utils_patched.cpp diff --git a/rtengine/libraw/Makefile.devel.noppr2i b/rtengine/libraw/Makefile.devel.noppr2i new file mode 100644 index 000000000..7fb9bc71d --- /dev/null +++ b/rtengine/libraw/Makefile.devel.noppr2i @@ -0,0 +1,230 @@ +all: library all_samples + +CC=clang +CXX=clang++ + +#CC=gcc +#CXX=g++ + +LDADD+=-lz + +CFLAGS=-DLIBRAW_USE_AUTOPTR +CFLAGS+= -g -I. -pedantic -Wno-long-long -Wno-overflow -O3 + +# RawSpeed Support +# CFLAGS+=-DUSE_RAWSPEED -I../RawSpeed -I/opt/local/include/libxml2 +# LDADD+=-L../RawSpeed/RawSpeed/release -lrawspeed -L/opt/local/include -ljpeg -lxml2 +# RAWSPEED_DATA=../RawSpeed/data/cameras.xml + +# DNG SDK Support +# CFLAGS+=-DUSE_DNGSDK -I../dng_sdk/source +# LDADDD+=-L../dng_sdk/release -ldng -ljpeg -lz + +# LCMS support +# For lcms2 set -DUSE_LCMS2 +#CFLAGS+=-DUSE_LCMS2 -I/opt/local/include +#LDADD+=-L/opt/local/lib -llcms + +# JPEG support for DNG and Kodak +CFLAGS+=-DUSE_JPEG -I/usr/local/include +LDADD+=-L/usr/local/lib -ljpeg + +# LIBJPEG8: +CFLAGS+=-DUSE_JPEG8 + +CSTFLAGS=$(CFLAGS) -DLIBRAW_NOTHREADS + +LIB_OBJECTS= object/libraw_datastream.o \ + object/cameralist.o object/fuji_compressed.o \ + object/crx.o object/pana8.o object/fp_dng.o object/decoders_libraw.o \ + object/sonycc.o object/losslessjpeg.o \ + object/unpack.o object/unpack_thumb.o \ + object/rawspeed_glue.o object/dngsdk_glue.o \ + object/colorconst.o object/utils_libraw.o object/init_close_utils.o \ + object/decoder_info.o object/open.o object/phaseone_processing.o \ + object/thumb_utils.o \ + object/x3f_utils_patched.o object/x3f_parse_process.o \ + object/read_utils.o object/curves.o object/utils_dcraw.o \ + object/colordata.o \ + object/canon_600.o object/decoders_dcraw.o \ + object/decoders_libraw_dcrdefs.o object/generic.o \ + object/kodak_decoders.o object/dng.o object/smal.o \ + object/load_mfbacks.o \ + object/sony.o object/nikon.o object/samsung.o object/cr3_parser.o \ + object/canon.o object/epson.o object/olympus.o object/leica.o \ + object/fuji.o object/adobepano.o object/pentax.o object/p1.o \ + object/makernotes.o object/exif_gps.o object/kodak.o \ + object/tiff.o object/ciff.o object/mediumformat.o object/minolta.o \ + object/identify_tools.o \ + object/hasselblad_model.o object/normalize_model.o object/identify.o \ + object/misc_parsers.o object/wblists.o \ + object/write_ph.o \ + object/postprocessing_ph.o \ + object/preprocessing_ph.o \ + + + +LR_INCLUDES=libraw/libraw.h libraw/libraw_alloc.h \ + libraw/libraw_const.h libraw/libraw_datastream.h \ + libraw/libraw_internal.h libraw/libraw_types.h \ + libraw/libraw_version.h + +LRLIB=lib/libraw_noppr2i.a + +library: $(LRLIB) + +all_samples: bin/raw-identify + +## Samples ## +bin/raw-identify: $(LRLIB) samples/raw-identify.cpp + $(CXX) ${CFLAGS} -o bin/raw-identify samples/raw-identify.cpp -L./lib -lraw_noppr2i -lm ${LDADD} + +$(LRLIB): ${LIB_OBJECTS} + rm -f $(LRLIB) + ar crv $(LRLIB) ${LIB_OBJECTS} + ranlib $(LRLIB) + +clean: + rm -fr bin/*.dSYM + rm -f *.o *~ src/*~ samples/*~ internal/*~ libraw/*~ lib/lib*.a bin/[4a-z]* object/*.o dcraw/*~ doc/*~ bin/*~ src/*/*~ + +## script-created rules +object/libraw_c_api.o: src/libraw_c_api.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/libraw_c_api.o src/libraw_c_api.cpp +object/libraw_datastream.o: src/libraw_datastream.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/libraw_datastream.o src/libraw_datastream.cpp +object/canon_600.o: src/decoders/canon_600.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/canon_600.o src/decoders/canon_600.cpp +object/crx.o: src/decoders/crx.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/crx.o src/decoders/crx.cpp +object/pana8.o: src/decoders/pana8.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/pana8.o src/decoders/pana8.cpp +object/sonycc.o: src/decoders/sonycc.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/sonycc.o src/decoders/sonycc.cpp +object/losslessjpeg.o: src/decompressors/losslessjpeg.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/losslessjpeg.o src/decompressors/losslessjpeg.cpp +object/decoders_dcraw.o: src/decoders/decoders_dcraw.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/decoders_dcraw.o src/decoders/decoders_dcraw.cpp +object/decoders_libraw_dcrdefs.o: src/decoders/decoders_libraw_dcrdefs.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/decoders_libraw_dcrdefs.o src/decoders/decoders_libraw_dcrdefs.cpp +object/decoders_libraw.o: src/decoders/decoders_libraw.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/decoders_libraw.o src/decoders/decoders_libraw.cpp +object/dng.o: src/decoders/dng.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/dng.o src/decoders/dng.cpp +object/fp_dng.o: src/decoders/fp_dng.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/fp_dng.o src/decoders/fp_dng.cpp +object/fuji_compressed.o: src/decoders/fuji_compressed.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/fuji_compressed.o src/decoders/fuji_compressed.cpp +object/generic.o: src/decoders/generic.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/generic.o src/decoders/generic.cpp +object/kodak_decoders.o: src/decoders/kodak_decoders.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/kodak_decoders.o src/decoders/kodak_decoders.cpp +object/load_mfbacks.o: src/decoders/load_mfbacks.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/load_mfbacks.o src/decoders/load_mfbacks.cpp +object/smal.o: src/decoders/smal.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/smal.o src/decoders/smal.cpp +object/unpack_thumb.o: src/decoders/unpack_thumb.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/unpack_thumb.o src/decoders/unpack_thumb.cpp +object/unpack.o: src/decoders/unpack.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/unpack.o src/decoders/unpack.cpp +object/dngsdk_glue.o: src/integration/dngsdk_glue.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/dngsdk_glue.o src/integration/dngsdk_glue.cpp +object/rawspeed_glue.o: src/integration/rawspeed_glue.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/rawspeed_glue.o src/integration/rawspeed_glue.cpp +object/adobepano.o: src/metadata/adobepano.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/adobepano.o src/metadata/adobepano.cpp +object/canon.o: src/metadata/canon.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/canon.o src/metadata/canon.cpp +object/ciff.o: src/metadata/ciff.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/ciff.o src/metadata/ciff.cpp +object/cr3_parser.o: src/metadata/cr3_parser.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/cr3_parser.o src/metadata/cr3_parser.cpp +object/epson.o: src/metadata/epson.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/epson.o src/metadata/epson.cpp +object/exif_gps.o: src/metadata/exif_gps.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/exif_gps.o src/metadata/exif_gps.cpp +object/fuji.o: src/metadata/fuji.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/fuji.o src/metadata/fuji.cpp +object/identify_tools.o: src/metadata/identify_tools.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/identify_tools.o src/metadata/identify_tools.cpp +object/identify.o: src/metadata/identify.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/identify.o src/metadata/identify.cpp +object/kodak.o: src/metadata/kodak.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/kodak.o src/metadata/kodak.cpp +object/leica.o: src/metadata/leica.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/leica.o src/metadata/leica.cpp +object/makernotes.o: src/metadata/makernotes.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/makernotes.o src/metadata/makernotes.cpp +object/mediumformat.o: src/metadata/mediumformat.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/mediumformat.o src/metadata/mediumformat.cpp +object/minolta.o: src/metadata/minolta.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/minolta.o src/metadata/minolta.cpp +object/misc_parsers.o: src/metadata/misc_parsers.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/misc_parsers.o src/metadata/misc_parsers.cpp +object/nikon.o: src/metadata/nikon.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/nikon.o src/metadata/nikon.cpp +object/hasselblad_model.o: src/metadata/hasselblad_model.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/hasselblad_model.o src/metadata/hasselblad_model.cpp +object/normalize_model.o: src/metadata/normalize_model.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/normalize_model.o src/metadata/normalize_model.cpp +object/olympus.o: src/metadata/olympus.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/olympus.o src/metadata/olympus.cpp +object/p1.o: src/metadata/p1.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/p1.o src/metadata/p1.cpp +object/pentax.o: src/metadata/pentax.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/pentax.o src/metadata/pentax.cpp +object/samsung.o: src/metadata/samsung.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/samsung.o src/metadata/samsung.cpp +object/sony.o: src/metadata/sony.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/sony.o src/metadata/sony.cpp +object/tiff.o: src/metadata/tiff.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/tiff.o src/metadata/tiff.cpp + +object/preprocessing_ph.o: src/preprocessing/preprocessing_ph.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/preprocessing_ph.o src/preprocessing/preprocessing_ph.cpp + +object/postprocessing_ph.o: src/postprocessing/postprocessing_ph.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/postprocessing_ph.o src/postprocessing/postprocessing_ph.cpp + +object/raw2image.o: src/preprocessing/raw2image.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/raw2image.o src/preprocessing/raw2image.cpp +object/ext_preprocess.o: src/preprocessing/ext_preprocess.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/ext_preprocess.o src/preprocessing/ext_preprocess.cpp +object/subtract_black.o: src/preprocessing/subtract_black.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/subtract_black.o src/preprocessing/subtract_black.cpp +object/cameralist.o: src/tables/cameralist.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/cameralist.o src/tables/cameralist.cpp +object/colorconst.o: src/tables/colorconst.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/colorconst.o src/tables/colorconst.cpp +object/colordata.o: src/tables/colordata.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/colordata.o src/tables/colordata.cpp +object/wblists.o: src/tables/wblists.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/wblists.o src/tables/wblists.cpp +object/curves.o: src/utils/curves.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/curves.o src/utils/curves.cpp +object/decoder_info.o: src/utils/decoder_info.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/decoder_info.o src/utils/decoder_info.cpp +object/init_close_utils.o: src/utils/init_close_utils.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/init_close_utils.o src/utils/init_close_utils.cpp +object/open.o: src/utils/open.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/open.o src/utils/open.cpp +object/phaseone_processing.o: src/utils/phaseone_processing.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/phaseone_processing.o src/utils/phaseone_processing.cpp +object/read_utils.o: src/utils/read_utils.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/read_utils.o src/utils/read_utils.cpp +object/thumb_utils.o: src/utils/thumb_utils.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/thumb_utils.o src/utils/thumb_utils.cpp +object/utils_dcraw.o: src/utils/utils_dcraw.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/utils_dcraw.o src/utils/utils_dcraw.cpp +object/utils_libraw.o: src/utils/utils_libraw.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/utils_libraw.o src/utils/utils_libraw.cpp +object/write_ph.o: src/write/write_ph.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/write_ph.o src/write/write_ph.cpp +object/file_write.o: src/write/file_write.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/file_write.o src/write/file_write.cpp +object/tiff_writer.o: src/write/tiff_writer.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/tiff_writer.o src/write/tiff_writer.cpp +object/x3f_parse_process.o: src/x3f/x3f_parse_process.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/x3f_parse_process.o src/x3f/x3f_parse_process.cpp +object/x3f_utils_patched.o: src/x3f/x3f_utils_patched.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/x3f_utils_patched.o src/x3f/x3f_utils_patched.cpp diff --git a/rtengine/libraw/Makefile.dist b/rtengine/libraw/Makefile.dist new file mode 100644 index 000000000..4fd4ba989 --- /dev/null +++ b/rtengine/libraw/Makefile.dist @@ -0,0 +1,511 @@ +all: library all_samples + +#CFLAGS=-arch i386 -arch x86_64 -O3 -I. -w +CFLAGS=-O3 -I. -w +CC=gcc +CXX=g++ + +# OpenMP support +#CFLAGS+=-fopenmp + +# RawSpeed Support +#CFLAGS+=-pthread -DUSE_RAWSPEED -I../RawSpeed -I/usr/local/include/libxml2 +#LDADD+=-L../RawSpeed/RawSpeed -lrawspeed -L/usr/local/lib -ljpeg -lxml2 +#RAWSPEED_DATA=../RawSpeed/data/cameras.xml + +# RawSpeed3 Support +#CFLAGS+=-DUSE_RAWSPEED3 -DUSE_RAWSPEED_BITS -I./RawSpeed3/ +#LDADD+=-L../RawSpeed-v3/release -lrawspeed3 -L/usr/local/lib -ljpeg -lz + +# DNG SDK Support +# CFLAGS+=-DUSE_DNGSDK -I../dng_sdk/source +# LDADDD+=-L../dng_sdk/release -ldng -lXMPCore -ljpeg -lz + +# ZLIB support (FP dng) +CFLAGS+=-DUSE_ZLIB +LDADD+=-lz + +# JPEG support for lossy DNG +#CFLAGS+=-DUSE_JPEG -I/usr/local/include +#LDADD+=-L/usr/local/lib -ljpeg +# LIBJPEG8: +#CFLAGS+=-DUSE_JPEG8 + +# LCMS support +#CFLAGS+=-DUSE_LCMS -I/usr/local/include +#LDADD+=-L/usr/local/lib -llcms + +# LCMS2.x support +#CFLAGS+=-DUSE_LCMS2 -I/usr/local/include +#LDADD+=-L/usr/local/lib -llcms2 + +CSTFLAGS=$(CFLAGS) -DLIBRAW_NOTHREADS + +LIB_OBJECTS= object/libraw_datastream.o object/libraw_c_api.o \ + object/cameralist.o object/fuji_compressed.o \ + object/crx.o object/pana8.o object/fp_dng.o object/decoders_libraw.o \ + object/sonycc.o object/losslessjpeg.o \ + object/unpack.o object/unpack_thumb.o \ + object/rawspeed_glue.o object/dngsdk_glue.o \ + object/colorconst.o object/utils_libraw.o object/init_close_utils.o \ + object/decoder_info.o object/open.o object/phaseone_processing.o \ + object/thumb_utils.o \ + object/tiff_writer.o object/subtract_black.o object/postprocessing_utils.o \ + object/dcraw_process.o object/raw2image.o object/mem_image.o \ + object/x3f_utils_patched.o object/x3f_parse_process.o \ + object/read_utils.o object/curves.o object/utils_dcraw.o \ + object/colordata.o \ + object/canon_600.o object/decoders_dcraw.o \ + object/decoders_libraw_dcrdefs.o object/generic.o \ + object/kodak_decoders.o object/dng.o object/smal.o \ + object/load_mfbacks.o \ + object/sony.o object/nikon.o object/samsung.o object/cr3_parser.o \ + object/canon.o object/epson.o object/olympus.o object/leica.o \ + object/fuji.o object/adobepano.o object/pentax.o object/p1.o \ + object/makernotes.o object/exif_gps.o object/kodak.o \ + object/tiff.o object/ciff.o object/mediumformat.o object/minolta.o \ + object/identify_tools.o \ + object/hasselblad_model.o object/normalize_model.o object/identify.o \ + object/misc_parsers.o object/wblists.o \ + object/postprocessing_aux.o object/postprocessing_utils_dcrdefs.o \ + object/aspect_ratio.o \ + object/misc_demosaic.o object/xtrans_demosaic.o object/ahd_demosaic.o \ + object/dht_demosaic.o object/aahd_demosaic.o object/dcb_demosaic.o \ + object/file_write.o \ + object/ext_preprocess.o object/apply_profile.o + + +LIB_MT_OBJECTS= object/libraw_datastream.mt.o object/libraw_c_api.mt.o \ + object/cameralist.mt.o object/fuji_compressed.mt.o \ + object/crx.mt.o object/pana8.mt.o object/fp_dng.mt.o object/decoders_libraw.mt.o \ + object/sonycc.mt.o object/losslessjpeg.mt.o \ + object/unpack.mt.o object/unpack_thumb.mt.o \ + object/rawspeed_glue.mt.o object/dngsdk_glue.mt.o \ + object/colorconst.mt.o object/utils_libraw.mt.o \ + object/init_close_utils.mt.o \ + object/decoder_info.mt.o object/open.mt.o object/phaseone_processing.mt.o \ + object/thumb_utils.mt.o \ + object/tiff_writer.mt.o object/subtract_black.mt.o \ + object/postprocessing_utils.mt.o object/dcraw_process.mt.o \ + object/raw2image.mt.o object/mem_image.mt.o \ + object/x3f_utils_patched.mt.o object/x3f_parse_process.mt.o \ + object/read_utils.mt.o object/curves.mt.o object/utils_dcraw.mt.o \ + object/colordata.mt.o \ + object/canon_600.mt.o object/decoders_dcraw.mt.o \ + object/decoders_libraw_dcrdefs.mt.o object/generic.mt.o \ + object/kodak_decoders.mt.o object/dng.mt.o object/smal.mt.o \ + object/load_mfbacks.mt.o \ + object/sony.mt.o object/nikon.mt.o object/samsung.mt.o \ + object/cr3_parser.mt.o object/canon.mt.o object/epson.mt.o \ + object/olympus.mt.o object/leica.mt.o \ + object/fuji.mt.o object/adobepano.mt.o object/pentax.mt.o object/p1.mt.o \ + object/makernotes.mt.o object/exif_gps.mt.o object/kodak.mt.o \ + object/tiff.mt.o object/ciff.mt.o object/mediumformat.mt.o \ + object/minolta.mt.o \ + object/identify_tools.mt.o \ + object/hasselblad_model.mt.o object/normalize_model.mt.o object/identify.mt.o \ + object/misc_parsers.mt.o object/wblists.mt.o \ + object/postprocessing_aux.mt.o object/postprocessing_utils_dcrdefs.mt.o \ + object/aspect_ratio.mt.o \ + object/misc_demosaic.mt.o object/xtrans_demosaic.mt.o \ + object/ahd_demosaic.mt.o object/dht_demosaic.mt.o \ + object/aahd_demosaic.mt.o object/dcb_demosaic.mt.o \ + object/file_write.mt.o \ + object/ext_preprocess.mt.o object/apply_profile.mt.o + + +LR_INCLUDES=libraw/libraw.h libraw/libraw_alloc.h \ + libraw/libraw_const.h libraw/libraw_datastream.h \ + libraw/libraw_internal.h libraw/libraw_types.h \ + libraw/libraw_version.h + +library: lib/libraw.a lib/libraw_r.a + +all_samples: bin/raw-identify bin/simple_dcraw bin/dcraw_emu bin/dcraw_half bin/half_mt bin/mem_image \ + bin/unprocessed_raw bin/4channels bin/multirender_test bin/postprocessing_benchmark \ + bin/rawtextdump + +install: library + @if [ -d /usr/local/include ] ; then cp -R libraw /usr/local/include/ ; else echo 'no /usr/local/include' ; fi + @if [ -d /usr/local/lib ] ; then cp lib/libraw.a lib/libraw_r.a /usr/local/lib/ ; else echo 'no /usr/local/lib' ; fi + +install-binaries: all_samples + @if [ -d /usr/local/bin ] ; then cp bin/[a-z]* /usr/local/bin/ ; else echo 'no /usr/local/bin' ; fi + + +## RawSpeed xml file + +RawSpeed/rawspeed_xmldata.cpp: ${RAWSPEED_DATA} + ./rsxml2c.sh ${RAWSPEED_DATA} > RawSpeed/rawspeed_xmldata.cpp + +#binaries + +bin/raw-identify: lib/libraw.a samples/raw-identify.cpp + ${CXX} -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/raw-identify samples/raw-identify.cpp -L./lib -lraw -lm ${LDADD} + +bin/unprocessed_raw: lib/libraw.a samples/unprocessed_raw.cpp + ${CXX} -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/unprocessed_raw samples/unprocessed_raw.cpp -L./lib -lraw -lm ${LDADD} + +bin/4channels: lib/libraw.a samples/4channels.cpp + ${CXX} -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/4channels samples/4channels.cpp -L./lib -lraw -lm ${LDADD} + +bin/rawtextdump: lib/libraw.a samples/rawtextdump.cpp + ${CXX} -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/rawtextdump samples/rawtextdump.cpp -L./lib -lraw -lm ${LDADD} + +bin/simple_dcraw: lib/libraw.a samples/simple_dcraw.cpp + ${CXX} -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/simple_dcraw samples/simple_dcraw.cpp -L./lib -lraw -lm ${LDADD} + +bin/multirender_test: lib/libraw.a samples/multirender_test.cpp + ${CXX} -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/multirender_test samples/multirender_test.cpp -L./lib -lraw -lm ${LDADD} + +bin/postprocessing_benchmark: lib/libraw.a samples/postprocessing_benchmark.cpp + ${CXX} -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/postprocessing_benchmark samples/postprocessing_benchmark.cpp -L./lib -lraw -lm ${LDADD} + +bin/mem_image: lib/libraw.a samples/mem_image_sample.cpp + ${CXX} -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/mem_image samples/mem_image_sample.cpp -L./lib -lraw -lm ${LDADD} + +bin/dcraw_half: lib/libraw.a object/dcraw_half.o + ${CC} -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/dcraw_half object/dcraw_half.o -L./lib -lraw -lm -lstdc++ ${LDADD} + +bin/half_mt: lib/libraw_r.a object/half_mt.o + ${CC} -pthread ${CFLAGS} -o bin/half_mt object/half_mt.o -L./lib -lraw_r -lm -lstdc++ ${LDADD} + +bin/dcraw_emu: lib/libraw.a samples/dcraw_emu.cpp + ${CXX} -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/dcraw_emu samples/dcraw_emu.cpp -L./lib -lraw -lm ${LDADD} + +#objects + +object/dcraw_half.o: samples/dcraw_half.c + ${CC} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/dcraw_half.o samples/dcraw_half.c + +object/half_mt.o: samples/half_mt.c + ${CC} -c -pthread ${CFLAGS} -o object/half_mt.o samples/half_mt.c + + +lib/libraw.a: ${LIB_OBJECTS} + rm -f lib/libraw.a + ar crv lib/libraw.a ${LIB_OBJECTS} + ranlib lib/libraw.a + +lib/libraw_r.a: ${LIB_MT_OBJECTS} + rm -f lib/libraw_r.a + ar crv lib/libraw_r.a ${LIB_MT_OBJECTS} + ranlib lib/libraw_r.a + +clean: + rm -fr bin/*.dSYM + rm -f *.o *~ src/*~ samples/*~ internal/*~ libraw/*~ lib/lib*.a bin/[4a-z]* object/*o dcraw/*~ doc/*~ bin/*~ src/*/*~ + +### generated +object/libraw_c_api.o: src/libraw_c_api.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/libraw_c_api.o src/libraw_c_api.cpp +object/libraw_c_api.mt.o: src/libraw_c_api.cpp + ${CXX} -c ${CFLAGS} -o object/libraw_c_api.mt.o src/libraw_c_api.cpp +object/libraw_datastream.o: src/libraw_datastream.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/libraw_datastream.o src/libraw_datastream.cpp +object/libraw_datastream.mt.o: src/libraw_datastream.cpp + ${CXX} -c ${CFLAGS} -o object/libraw_datastream.mt.o src/libraw_datastream.cpp +object/canon_600.o: src/decoders/canon_600.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/canon_600.o src/decoders/canon_600.cpp +object/canon_600.mt.o: src/decoders/canon_600.cpp + ${CXX} -c ${CFLAGS} -o object/canon_600.mt.o src/decoders/canon_600.cpp +object/crx.o: src/decoders/crx.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/crx.o src/decoders/crx.cpp +object/crx.mt.o: src/decoders/crx.cpp + ${CXX} -c ${CFLAGS} -o object/crx.mt.o src/decoders/crx.cpp +object/pana8.o: src/decoders/pana8.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/pana8.o src/decoders/pana8.cpp +object/pana8.mt.o: src/decoders/pana8.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/pana8.mt.o src/decoders/pana8.cpp +object/sonycc.o: src/decoders/sonycc.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/sonycc.o src/decoders/sonycc.cpp +object/sonycc.mt.o: src/decoders/sonycc.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/sonycc.mt.o src/decoders/sonycc.cpp +object/losslessjpeg.o: src/decompressors/losslessjpeg.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/losslessjpeg.o src/decompressors/losslessjpeg.cpp +object/losslessjpeg.mt.o: src/decompressors/losslessjpeg.cpp $(HEADERS) + ${CXX} -c ${CFLAGS} -o object/losslessjpeg.mt.o src/decompressors/losslessjpeg.cpp +object/decoders_dcraw.o: src/decoders/decoders_dcraw.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/decoders_dcraw.o src/decoders/decoders_dcraw.cpp +object/decoders_dcraw.mt.o: src/decoders/decoders_dcraw.cpp + ${CXX} -c ${CFLAGS} -o object/decoders_dcraw.mt.o src/decoders/decoders_dcraw.cpp +object/decoders_libraw_dcrdefs.o: src/decoders/decoders_libraw_dcrdefs.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/decoders_libraw_dcrdefs.o src/decoders/decoders_libraw_dcrdefs.cpp +object/decoders_libraw_dcrdefs.mt.o: src/decoders/decoders_libraw_dcrdefs.cpp + ${CXX} -c ${CFLAGS} -o object/decoders_libraw_dcrdefs.mt.o src/decoders/decoders_libraw_dcrdefs.cpp +object/decoders_libraw.o: src/decoders/decoders_libraw.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/decoders_libraw.o src/decoders/decoders_libraw.cpp +object/decoders_libraw.mt.o: src/decoders/decoders_libraw.cpp + ${CXX} -c ${CFLAGS} -o object/decoders_libraw.mt.o src/decoders/decoders_libraw.cpp +object/dng.o: src/decoders/dng.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/dng.o src/decoders/dng.cpp +object/dng.mt.o: src/decoders/dng.cpp + ${CXX} -c ${CFLAGS} -o object/dng.mt.o src/decoders/dng.cpp +object/fp_dng.o: src/decoders/fp_dng.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/fp_dng.o src/decoders/fp_dng.cpp +object/fp_dng.mt.o: src/decoders/fp_dng.cpp + ${CXX} -c ${CFLAGS} -o object/fp_dng.mt.o src/decoders/fp_dng.cpp +object/fuji_compressed.o: src/decoders/fuji_compressed.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/fuji_compressed.o src/decoders/fuji_compressed.cpp +object/fuji_compressed.mt.o: src/decoders/fuji_compressed.cpp + ${CXX} -c ${CFLAGS} -o object/fuji_compressed.mt.o src/decoders/fuji_compressed.cpp +object/generic.o: src/decoders/generic.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/generic.o src/decoders/generic.cpp +object/generic.mt.o: src/decoders/generic.cpp + ${CXX} -c ${CFLAGS} -o object/generic.mt.o src/decoders/generic.cpp +object/kodak_decoders.o: src/decoders/kodak_decoders.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/kodak_decoders.o src/decoders/kodak_decoders.cpp +object/kodak_decoders.mt.o: src/decoders/kodak_decoders.cpp + ${CXX} -c ${CFLAGS} -o object/kodak_decoders.mt.o src/decoders/kodak_decoders.cpp +object/load_mfbacks.o: src/decoders/load_mfbacks.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/load_mfbacks.o src/decoders/load_mfbacks.cpp +object/load_mfbacks.mt.o: src/decoders/load_mfbacks.cpp + ${CXX} -c ${CFLAGS} -o object/load_mfbacks.mt.o src/decoders/load_mfbacks.cpp +object/smal.o: src/decoders/smal.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/smal.o src/decoders/smal.cpp +object/smal.mt.o: src/decoders/smal.cpp + ${CXX} -c ${CFLAGS} -o object/smal.mt.o src/decoders/smal.cpp +object/unpack_thumb.o: src/decoders/unpack_thumb.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/unpack_thumb.o src/decoders/unpack_thumb.cpp +object/unpack_thumb.mt.o: src/decoders/unpack_thumb.cpp + ${CXX} -c ${CFLAGS} -o object/unpack_thumb.mt.o src/decoders/unpack_thumb.cpp +object/unpack.o: src/decoders/unpack.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/unpack.o src/decoders/unpack.cpp +object/unpack.mt.o: src/decoders/unpack.cpp + ${CXX} -c ${CFLAGS} -o object/unpack.mt.o src/decoders/unpack.cpp +object/aahd_demosaic.o: src/demosaic/aahd_demosaic.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/aahd_demosaic.o src/demosaic/aahd_demosaic.cpp +object/aahd_demosaic.mt.o: src/demosaic/aahd_demosaic.cpp + ${CXX} -c ${CFLAGS} -o object/aahd_demosaic.mt.o src/demosaic/aahd_demosaic.cpp +object/ahd_demosaic.o: src/demosaic/ahd_demosaic.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/ahd_demosaic.o src/demosaic/ahd_demosaic.cpp +object/ahd_demosaic.mt.o: src/demosaic/ahd_demosaic.cpp + ${CXX} -c ${CFLAGS} -o object/ahd_demosaic.mt.o src/demosaic/ahd_demosaic.cpp +object/dcb_demosaic.o: src/demosaic/dcb_demosaic.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/dcb_demosaic.o src/demosaic/dcb_demosaic.cpp +object/dcb_demosaic.mt.o: src/demosaic/dcb_demosaic.cpp + ${CXX} -c ${CFLAGS} -o object/dcb_demosaic.mt.o src/demosaic/dcb_demosaic.cpp +object/dht_demosaic.o: src/demosaic/dht_demosaic.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/dht_demosaic.o src/demosaic/dht_demosaic.cpp +object/dht_demosaic.mt.o: src/demosaic/dht_demosaic.cpp + ${CXX} -c ${CFLAGS} -o object/dht_demosaic.mt.o src/demosaic/dht_demosaic.cpp +object/misc_demosaic.o: src/demosaic/misc_demosaic.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/misc_demosaic.o src/demosaic/misc_demosaic.cpp +object/misc_demosaic.mt.o: src/demosaic/misc_demosaic.cpp + ${CXX} -c ${CFLAGS} -o object/misc_demosaic.mt.o src/demosaic/misc_demosaic.cpp +object/xtrans_demosaic.o: src/demosaic/xtrans_demosaic.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/xtrans_demosaic.o src/demosaic/xtrans_demosaic.cpp +object/xtrans_demosaic.mt.o: src/demosaic/xtrans_demosaic.cpp + ${CXX} -c ${CFLAGS} -o object/xtrans_demosaic.mt.o src/demosaic/xtrans_demosaic.cpp +object/dngsdk_glue.o: src/integration/dngsdk_glue.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/dngsdk_glue.o src/integration/dngsdk_glue.cpp +object/dngsdk_glue.mt.o: src/integration/dngsdk_glue.cpp + ${CXX} -c ${CFLAGS} -o object/dngsdk_glue.mt.o src/integration/dngsdk_glue.cpp +object/rawspeed_glue.o: src/integration/rawspeed_glue.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/rawspeed_glue.o src/integration/rawspeed_glue.cpp +object/rawspeed_glue.mt.o: src/integration/rawspeed_glue.cpp + ${CXX} -c ${CFLAGS} -o object/rawspeed_glue.mt.o src/integration/rawspeed_glue.cpp +object/adobepano.o: src/metadata/adobepano.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/adobepano.o src/metadata/adobepano.cpp +object/adobepano.mt.o: src/metadata/adobepano.cpp + ${CXX} -c ${CFLAGS} -o object/adobepano.mt.o src/metadata/adobepano.cpp +object/canon.o: src/metadata/canon.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/canon.o src/metadata/canon.cpp +object/canon.mt.o: src/metadata/canon.cpp + ${CXX} -c ${CFLAGS} -o object/canon.mt.o src/metadata/canon.cpp +object/ciff.o: src/metadata/ciff.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/ciff.o src/metadata/ciff.cpp +object/ciff.mt.o: src/metadata/ciff.cpp + ${CXX} -c ${CFLAGS} -o object/ciff.mt.o src/metadata/ciff.cpp +object/cr3_parser.o: src/metadata/cr3_parser.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/cr3_parser.o src/metadata/cr3_parser.cpp +object/cr3_parser.mt.o: src/metadata/cr3_parser.cpp + ${CXX} -c ${CFLAGS} -o object/cr3_parser.mt.o src/metadata/cr3_parser.cpp +object/epson.o: src/metadata/epson.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/epson.o src/metadata/epson.cpp +object/epson.mt.o: src/metadata/epson.cpp + ${CXX} -c ${CFLAGS} -o object/epson.mt.o src/metadata/epson.cpp +object/exif_gps.o: src/metadata/exif_gps.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/exif_gps.o src/metadata/exif_gps.cpp +object/exif_gps.mt.o: src/metadata/exif_gps.cpp + ${CXX} -c ${CFLAGS} -o object/exif_gps.mt.o src/metadata/exif_gps.cpp +object/fuji.o: src/metadata/fuji.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/fuji.o src/metadata/fuji.cpp +object/fuji.mt.o: src/metadata/fuji.cpp + ${CXX} -c ${CFLAGS} -o object/fuji.mt.o src/metadata/fuji.cpp +object/identify_tools.o: src/metadata/identify_tools.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/identify_tools.o src/metadata/identify_tools.cpp +object/identify_tools.mt.o: src/metadata/identify_tools.cpp + ${CXX} -c ${CFLAGS} -o object/identify_tools.mt.o src/metadata/identify_tools.cpp +object/identify.o: src/metadata/identify.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/identify.o src/metadata/identify.cpp +object/identify.mt.o: src/metadata/identify.cpp + ${CXX} -c ${CFLAGS} -o object/identify.mt.o src/metadata/identify.cpp +object/kodak.o: src/metadata/kodak.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/kodak.o src/metadata/kodak.cpp +object/kodak.mt.o: src/metadata/kodak.cpp + ${CXX} -c ${CFLAGS} -o object/kodak.mt.o src/metadata/kodak.cpp +object/leica.o: src/metadata/leica.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/leica.o src/metadata/leica.cpp +object/leica.mt.o: src/metadata/leica.cpp + ${CXX} -c ${CFLAGS} -o object/leica.mt.o src/metadata/leica.cpp +object/makernotes.o: src/metadata/makernotes.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/makernotes.o src/metadata/makernotes.cpp +object/makernotes.mt.o: src/metadata/makernotes.cpp + ${CXX} -c ${CFLAGS} -o object/makernotes.mt.o src/metadata/makernotes.cpp +object/mediumformat.o: src/metadata/mediumformat.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/mediumformat.o src/metadata/mediumformat.cpp +object/mediumformat.mt.o: src/metadata/mediumformat.cpp + ${CXX} -c ${CFLAGS} -o object/mediumformat.mt.o src/metadata/mediumformat.cpp +object/minolta.o: src/metadata/minolta.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/minolta.o src/metadata/minolta.cpp +object/minolta.mt.o: src/metadata/minolta.cpp + ${CXX} -c ${CFLAGS} -o object/minolta.mt.o src/metadata/minolta.cpp +object/misc_parsers.o: src/metadata/misc_parsers.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/misc_parsers.o src/metadata/misc_parsers.cpp +object/misc_parsers.mt.o: src/metadata/misc_parsers.cpp + ${CXX} -c ${CFLAGS} -o object/misc_parsers.mt.o src/metadata/misc_parsers.cpp +object/nikon.o: src/metadata/nikon.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/nikon.o src/metadata/nikon.cpp +object/nikon.mt.o: src/metadata/nikon.cpp + ${CXX} -c ${CFLAGS} -o object/nikon.mt.o src/metadata/nikon.cpp +object/hasselblad_model.o: src/metadata/hasselblad_model.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/hasselblad_model.o src/metadata/hasselblad_model.cpp +object/hasselblad_model.mt.o: src/metadata/hasselblad_model.cpp + ${CXX} -c ${CFLAGS} -o object/hasselblad_model.mt.o src/metadata/hasselblad_model.cpp +object/normalize_model.o: src/metadata/normalize_model.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/normalize_model.o src/metadata/normalize_model.cpp +object/normalize_model.mt.o: src/metadata/normalize_model.cpp + ${CXX} -c ${CFLAGS} -o object/normalize_model.mt.o src/metadata/normalize_model.cpp +object/olympus.o: src/metadata/olympus.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/olympus.o src/metadata/olympus.cpp +object/olympus.mt.o: src/metadata/olympus.cpp + ${CXX} -c ${CFLAGS} -o object/olympus.mt.o src/metadata/olympus.cpp +object/p1.o: src/metadata/p1.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/p1.o src/metadata/p1.cpp +object/p1.mt.o: src/metadata/p1.cpp + ${CXX} -c ${CFLAGS} -o object/p1.mt.o src/metadata/p1.cpp +object/pentax.o: src/metadata/pentax.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/pentax.o src/metadata/pentax.cpp +object/pentax.mt.o: src/metadata/pentax.cpp + ${CXX} -c ${CFLAGS} -o object/pentax.mt.o src/metadata/pentax.cpp +object/samsung.o: src/metadata/samsung.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/samsung.o src/metadata/samsung.cpp +object/samsung.mt.o: src/metadata/samsung.cpp + ${CXX} -c ${CFLAGS} -o object/samsung.mt.o src/metadata/samsung.cpp +object/sony.o: src/metadata/sony.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/sony.o src/metadata/sony.cpp +object/sony.mt.o: src/metadata/sony.cpp + ${CXX} -c ${CFLAGS} -o object/sony.mt.o src/metadata/sony.cpp +object/tiff.o: src/metadata/tiff.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/tiff.o src/metadata/tiff.cpp +object/tiff.mt.o: src/metadata/tiff.cpp + ${CXX} -c ${CFLAGS} -o object/tiff.mt.o src/metadata/tiff.cpp +object/aspect_ratio.o: src/postprocessing/aspect_ratio.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/aspect_ratio.o src/postprocessing/aspect_ratio.cpp +object/aspect_ratio.mt.o: src/postprocessing/aspect_ratio.cpp + ${CXX} -c ${CFLAGS} -o object/aspect_ratio.mt.o src/postprocessing/aspect_ratio.cpp +object/dcraw_process.o: src/postprocessing/dcraw_process.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/dcraw_process.o src/postprocessing/dcraw_process.cpp +object/dcraw_process.mt.o: src/postprocessing/dcraw_process.cpp + ${CXX} -c ${CFLAGS} -o object/dcraw_process.mt.o src/postprocessing/dcraw_process.cpp +object/mem_image.o: src/postprocessing/mem_image.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/mem_image.o src/postprocessing/mem_image.cpp +object/mem_image.mt.o: src/postprocessing/mem_image.cpp + ${CXX} -c ${CFLAGS} -o object/mem_image.mt.o src/postprocessing/mem_image.cpp +object/postprocessing_aux.o: src/postprocessing/postprocessing_aux.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/postprocessing_aux.o src/postprocessing/postprocessing_aux.cpp +object/postprocessing_aux.mt.o: src/postprocessing/postprocessing_aux.cpp + ${CXX} -c ${CFLAGS} -o object/postprocessing_aux.mt.o src/postprocessing/postprocessing_aux.cpp +object/postprocessing_utils_dcrdefs.o: src/postprocessing/postprocessing_utils_dcrdefs.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/postprocessing_utils_dcrdefs.o src/postprocessing/postprocessing_utils_dcrdefs.cpp +object/postprocessing_utils_dcrdefs.mt.o: src/postprocessing/postprocessing_utils_dcrdefs.cpp + ${CXX} -c ${CFLAGS} -o object/postprocessing_utils_dcrdefs.mt.o src/postprocessing/postprocessing_utils_dcrdefs.cpp +object/postprocessing_utils.o: src/postprocessing/postprocessing_utils.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/postprocessing_utils.o src/postprocessing/postprocessing_utils.cpp +object/postprocessing_utils.mt.o: src/postprocessing/postprocessing_utils.cpp + ${CXX} -c ${CFLAGS} -o object/postprocessing_utils.mt.o src/postprocessing/postprocessing_utils.cpp +object/raw2image.o: src/preprocessing/raw2image.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/raw2image.o src/preprocessing/raw2image.cpp +object/raw2image.mt.o: src/preprocessing/raw2image.cpp + ${CXX} -c ${CFLAGS} -o object/raw2image.mt.o src/preprocessing/raw2image.cpp +object/ext_preprocess.o: src/preprocessing/ext_preprocess.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/ext_preprocess.o src/preprocessing/ext_preprocess.cpp +object/ext_preprocess.mt.o: src/preprocessing/ext_preprocess.cpp + ${CXX} -c ${CFLAGS} -o object/ext_preprocess.mt.o src/preprocessing/ext_preprocess.cpp +object/subtract_black.o: src/preprocessing/subtract_black.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/subtract_black.o src/preprocessing/subtract_black.cpp +object/subtract_black.mt.o: src/preprocessing/subtract_black.cpp + ${CXX} -c ${CFLAGS} -o object/subtract_black.mt.o src/preprocessing/subtract_black.cpp +object/cameralist.o: src/tables/cameralist.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/cameralist.o src/tables/cameralist.cpp +object/cameralist.mt.o: src/tables/cameralist.cpp + ${CXX} -c ${CFLAGS} -o object/cameralist.mt.o src/tables/cameralist.cpp +object/colorconst.o: src/tables/colorconst.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/colorconst.o src/tables/colorconst.cpp +object/colorconst.mt.o: src/tables/colorconst.cpp + ${CXX} -c ${CFLAGS} -o object/colorconst.mt.o src/tables/colorconst.cpp +object/colordata.o: src/tables/colordata.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/colordata.o src/tables/colordata.cpp +object/colordata.mt.o: src/tables/colordata.cpp + ${CXX} -c ${CFLAGS} -o object/colordata.mt.o src/tables/colordata.cpp +object/wblists.o: src/tables/wblists.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/wblists.o src/tables/wblists.cpp +object/wblists.mt.o: src/tables/wblists.cpp + ${CXX} -c ${CFLAGS} -o object/wblists.mt.o src/tables/wblists.cpp +object/curves.o: src/utils/curves.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/curves.o src/utils/curves.cpp +object/curves.mt.o: src/utils/curves.cpp + ${CXX} -c ${CFLAGS} -o object/curves.mt.o src/utils/curves.cpp +object/decoder_info.o: src/utils/decoder_info.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/decoder_info.o src/utils/decoder_info.cpp +object/decoder_info.mt.o: src/utils/decoder_info.cpp + ${CXX} -c ${CFLAGS} -o object/decoder_info.mt.o src/utils/decoder_info.cpp +object/init_close_utils.o: src/utils/init_close_utils.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/init_close_utils.o src/utils/init_close_utils.cpp +object/init_close_utils.mt.o: src/utils/init_close_utils.cpp + ${CXX} -c ${CFLAGS} -o object/init_close_utils.mt.o src/utils/init_close_utils.cpp +object/open.o: src/utils/open.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/open.o src/utils/open.cpp +object/open.mt.o: src/utils/open.cpp + ${CXX} -c ${CFLAGS} -o object/open.mt.o src/utils/open.cpp +object/phaseone_processing.o: src/utils/phaseone_processing.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/phaseone_processing.o src/utils/phaseone_processing.cpp +object/phaseone_processing.mt.o: src/utils/phaseone_processing.cpp + ${CXX} -c ${CFLAGS} -o object/phaseone_processing.mt.o src/utils/phaseone_processing.cpp +object/read_utils.o: src/utils/read_utils.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/read_utils.o src/utils/read_utils.cpp +object/read_utils.mt.o: src/utils/read_utils.cpp + ${CXX} -c ${CFLAGS} -o object/read_utils.mt.o src/utils/read_utils.cpp +object/thumb_utils.o: src/utils/thumb_utils.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/thumb_utils.o src/utils/thumb_utils.cpp +object/thumb_utils.mt.o: src/utils/thumb_utils.cpp + ${CXX} -c ${CFLAGS} -o object/thumb_utils.mt.o src/utils/thumb_utils.cpp +object/utils_dcraw.o: src/utils/utils_dcraw.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/utils_dcraw.o src/utils/utils_dcraw.cpp +object/utils_dcraw.mt.o: src/utils/utils_dcraw.cpp + ${CXX} -c ${CFLAGS} -o object/utils_dcraw.mt.o src/utils/utils_dcraw.cpp +object/utils_libraw.o: src/utils/utils_libraw.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/utils_libraw.o src/utils/utils_libraw.cpp +object/utils_libraw.mt.o: src/utils/utils_libraw.cpp + ${CXX} -c ${CFLAGS} -o object/utils_libraw.mt.o src/utils/utils_libraw.cpp +object/apply_profile.o: src/write/apply_profile.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/apply_profile.o src/write/apply_profile.cpp +object/apply_profile.mt.o: src/write/apply_profile.cpp + ${CXX} -c ${CFLAGS} -o object/apply_profile.mt.o src/write/apply_profile.cpp +object/file_write.o: src/write/file_write.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/file_write.o src/write/file_write.cpp +object/file_write.mt.o: src/write/file_write.cpp + ${CXX} -c ${CFLAGS} -o object/file_write.mt.o src/write/file_write.cpp +object/tiff_writer.o: src/write/tiff_writer.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/tiff_writer.o src/write/tiff_writer.cpp +object/tiff_writer.mt.o: src/write/tiff_writer.cpp + ${CXX} -c ${CFLAGS} -o object/tiff_writer.mt.o src/write/tiff_writer.cpp +object/x3f_parse_process.o: src/x3f/x3f_parse_process.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/x3f_parse_process.o src/x3f/x3f_parse_process.cpp +object/x3f_parse_process.mt.o: src/x3f/x3f_parse_process.cpp + ${CXX} -c ${CFLAGS} -o object/x3f_parse_process.mt.o src/x3f/x3f_parse_process.cpp +object/x3f_utils_patched.o: src/x3f/x3f_utils_patched.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/x3f_utils_patched.o src/x3f/x3f_utils_patched.cpp +object/x3f_utils_patched.mt.o: src/x3f/x3f_utils_patched.cpp + ${CXX} -c ${CFLAGS} -o object/x3f_utils_patched.mt.o src/x3f/x3f_utils_patched.cpp diff --git a/rtengine/libraw/Makefile.mingw b/rtengine/libraw/Makefile.mingw new file mode 100644 index 000000000..e9172e10f --- /dev/null +++ b/rtengine/libraw/Makefile.mingw @@ -0,0 +1,300 @@ +all: library all_samples + +CFLAGS=-O3 -I. -w +CC=gcc +CXX=g++ + +# OpenMP support +#CFLAGS+=-fopenmp + +# RawSpeed Support +#CFLAGS+=-pthread -DUSE_RAWSPEED -I../RawSpeed -I/usr/local/include/libxml2 +#LDADD+=-L../RawSpeed/RawSpeed -lrawspeed -L/usr/local/lib -ljpeg -lxml2 +#RAWSPEED_DATA=../RawSpeed/data/cameras.xml + +# DNG SDK Support +# CFLAGS+=-DUSE_DNGSDK -I../dng_sdk/source +# LDADDD+=-L../dng_sdk/release -ldng -lXMPCore -ljpeg -lz + +# JPEG support for lossy DNG +#CFLAGS+=-DUSE_JPEG -I/usr/local/include +#LDADD+=-L/usr/local/lib -ljpeg +# LIBJPEG8: +#CFLAGS+=-DUSE_JPEG8 + +# LCMS support +#CFLAGS+=-DUSE_LCMS -I/usr/local/include +#LDADD+=-L/usr/local/lib -llcms + +# LCMS2.x support +#CFLAGS+=-DUSE_LCMS2 -I/usr/local/include +#LDADD+=-L/usr/local/lib -llcms2 + +CSTFLAGS=$(CFLAGS) -DLIBRAW_NOTHREADS + +LIB_OBJECTS= object/libraw_datastream.o object/libraw_c_api.o \ + object/cameralist.o object/fuji_compressed.o \ + object/crx.o object/pana8.o object/fp_dng.o object/decoders_libraw.o \ + object/losslessjpeg.o object/sonycc.o \ + object/unpack.o object/unpack_thumb.o \ + object/rawspeed_glue.o object/dngsdk_glue.o \ + object/colorconst.o object/utils_libraw.o object/init_close_utils.o \ + object/decoder_info.o object/open.o object/phaseone_processing.o \ + object/thumb_utils.o \ + object/tiff_writer.o object/subtract_black.o object/postprocessing_utils.o \ + object/dcraw_process.o object/raw2image.o object/mem_image.o \ + object/x3f_utils_patched.o object/x3f_parse_process.o \ + object/read_utils.o object/curves.o object/utils_dcraw.o \ + object/colordata.o \ + object/canon_600.o object/decoders_dcraw.o \ + object/decoders_libraw_dcrdefs.o object/generic.o \ + object/kodak_decoders.o object/dng.o object/smal.o \ + object/load_mfbacks.o \ + object/sony.o object/nikon.o object/samsung.o object/cr3_parser.o \ + object/canon.o object/epson.o object/olympus.o object/leica.o \ + object/fuji.o object/adobepano.o object/pentax.o object/p1.o \ + object/makernotes.o object/exif_gps.o object/kodak.o \ + object/tiff.o object/ciff.o object/mediumformat.o object/minolta.o \ + object/identify_tools.o \ + object/hasselblad_model.o object/normalize_model.o object/identify.o \ + object/misc_parsers.o object/wblists.o \ + object/postprocessing_aux.o object/postprocessing_utils_dcrdefs.o \ + object/aspect_ratio.o \ + object/misc_demosaic.o object/xtrans_demosaic.o object/ahd_demosaic.o \ + object/dht_demosaic.o object/aahd_demosaic.o object/dcb_demosaic.o \ + object/file_write.o \ + object/ext_preprocess.o object/apply_profile.o + + + +LR_INCLUDES=libraw/libraw.h libraw/libraw_alloc.h \ + libraw/libraw_const.h libraw/libraw_datastream.h \ + libraw/libraw_internal.h libraw/libraw_types.h \ + libraw/libraw_version.h + +library: lib/libraw.a + +all_samples: bin/raw-identify bin/simple_dcraw bin/dcraw_emu bin/dcraw_half bin/mem_image \ + bin/unprocessed_raw bin/4channels bin/multirender_test bin/postprocessing_benchmark \ + bin/rawtextdump + +install: library + @if [ -d /usr/local/include ] ; then cp -R libraw /usr/local/include/ ; else echo 'no /usr/local/include' ; fi + @if [ -d /usr/local/lib ] ; then cp lib/libraw.a lib/libraw_r.a /usr/local/lib/ ; else echo 'no /usr/local/lib' ; fi + +install-binaries: all_samples + @if [ -d /usr/local/bin ] ; then cp bin/[a-z]* /usr/local/bin/ ; else echo 'no /usr/local/bin' ; fi + + +#binaries + +bin/raw-identify: lib/libraw.a samples/raw-identify.cpp + ${CXX} -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/raw-identify samples/raw-identify.cpp -L./lib -lraw -lws2_32 -lm ${LDADD} + +bin/unprocessed_raw: lib/libraw.a samples/unprocessed_raw.cpp + ${CXX} -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/unprocessed_raw samples/unprocessed_raw.cpp -L./lib -lraw -lws2_32 -lm ${LDADD} + +bin/4channels: lib/libraw.a samples/4channels.cpp + ${CXX} -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/4channels samples/4channels.cpp -L./lib -lraw -lws2_32 -lm ${LDADD} + +bin/rawtextdump: lib/libraw.a samples/rawtextdump.cpp + ${CXX} -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/rawtextdump samples/rawtextdump.cpp -L./lib -lraw -lws2_32 -lm ${LDADD} + +bin/simple_dcraw: lib/libraw.a samples/simple_dcraw.cpp + ${CXX} -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/simple_dcraw samples/simple_dcraw.cpp -L./lib -lraw -lws2_32 -lm ${LDADD} + +bin/multirender_test: lib/libraw.a samples/multirender_test.cpp + ${CXX} -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/multirender_test samples/multirender_test.cpp -L./lib -lraw -lws2_32 -lm ${LDADD} + +bin/postprocessing_benchmark: lib/libraw.a samples/postprocessing_benchmark.cpp + ${CXX} -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/postprocessing_benchmark samples/postprocessing_benchmark.cpp -L./lib -lraw -lws2_32 -lm ${LDADD} + +bin/mem_image: lib/libraw.a samples/mem_image_sample.cpp + ${CXX} -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/mem_image samples/mem_image_sample.cpp -L./lib -lraw -lws2_32 -lm ${LDADD} + +bin/dcraw_half: lib/libraw.a object/dcraw_half.o + ${CC} -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/dcraw_half object/dcraw_half.o -L./lib -lraw -lws2_32 -lm -lstdc++ ${LDADD} + +bin/dcraw_emu: lib/libraw.a samples/dcraw_emu.cpp + ${CXX} -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/dcraw_emu samples/dcraw_emu.cpp -L./lib -lraw -lws2_32 -lm ${LDADD} + +#objects + +object/dcraw_half.o: samples/dcraw_half.c + ${CC} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/dcraw_half.o samples/dcraw_half.c + +object/half_mt.o: samples/half_mt.c + ${CC} -c -pthread ${CFLAGS} -o object/half_mt.o samples/half_mt.c + + +lib/libraw.a: ${LIB_OBJECTS} + rm -f lib/libraw.a + ar crv lib/libraw.a ${LIB_OBJECTS} + ranlib lib/libraw.a + +lib/libraw_r.a: ${LIB_MT_OBJECTS} + rm -f lib/libraw_r.a + ar crv lib/libraw_r.a ${LIB_MT_OBJECTS} + ranlib lib/libraw_r.a + +clean: + rm -fr bin/*.dSYM + rm -f *.o *~ src/*~ samples/*~ internal/*~ libraw/*~ lib/lib*.a bin/[4a-z]* object/*o dcraw/*~ doc/*~ bin/*~ src/*/*~ + +### generated +object/libraw_c_api.o: src/libraw_c_api.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/libraw_c_api.o src/libraw_c_api.cpp +object/libraw_datastream.o: src/libraw_datastream.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/libraw_datastream.o src/libraw_datastream.cpp +object/canon_600.o: src/decoders/canon_600.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/canon_600.o src/decoders/canon_600.cpp +object/crx.o: src/decoders/crx.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/crx.o src/decoders/crx.cpp +object/pana8.o: src/decoders/pana8.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/pana8.o src/decoders/pana8.cpp +object/sonycc.o: src/decoders/sonycc.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/sonycc.o src/decoders/sonycc.cpp +object/losslessjpeg.o: src/decompressors/losslessjpeg.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/losslessjpeg.o src/decompressors/losslessjpeg.cpp +object/decoders_dcraw.o: src/decoders/decoders_dcraw.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/decoders_dcraw.o src/decoders/decoders_dcraw.cpp +object/decoders_libraw_dcrdefs.o: src/decoders/decoders_libraw_dcrdefs.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/decoders_libraw_dcrdefs.o src/decoders/decoders_libraw_dcrdefs.cpp +object/decoders_libraw.o: src/decoders/decoders_libraw.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/decoders_libraw.o src/decoders/decoders_libraw.cpp +object/dng.o: src/decoders/dng.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/dng.o src/decoders/dng.cpp +object/fp_dng.o: src/decoders/fp_dng.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/fp_dng.o src/decoders/fp_dng.cpp +object/fuji_compressed.o: src/decoders/fuji_compressed.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/fuji_compressed.o src/decoders/fuji_compressed.cpp +object/generic.o: src/decoders/generic.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/generic.o src/decoders/generic.cpp +object/kodak_decoders.o: src/decoders/kodak_decoders.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/kodak_decoders.o src/decoders/kodak_decoders.cpp +object/load_mfbacks.o: src/decoders/load_mfbacks.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/load_mfbacks.o src/decoders/load_mfbacks.cpp +object/smal.o: src/decoders/smal.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/smal.o src/decoders/smal.cpp +object/unpack_thumb.o: src/decoders/unpack_thumb.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/unpack_thumb.o src/decoders/unpack_thumb.cpp +object/unpack.o: src/decoders/unpack.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/unpack.o src/decoders/unpack.cpp +object/aahd_demosaic.o: src/demosaic/aahd_demosaic.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/aahd_demosaic.o src/demosaic/aahd_demosaic.cpp +object/ahd_demosaic.o: src/demosaic/ahd_demosaic.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/ahd_demosaic.o src/demosaic/ahd_demosaic.cpp +object/dcb_demosaic.o: src/demosaic/dcb_demosaic.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/dcb_demosaic.o src/demosaic/dcb_demosaic.cpp +object/dht_demosaic.o: src/demosaic/dht_demosaic.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/dht_demosaic.o src/demosaic/dht_demosaic.cpp +object/misc_demosaic.o: src/demosaic/misc_demosaic.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/misc_demosaic.o src/demosaic/misc_demosaic.cpp +object/xtrans_demosaic.o: src/demosaic/xtrans_demosaic.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/xtrans_demosaic.o src/demosaic/xtrans_demosaic.cpp +object/dngsdk_glue.o: src/integration/dngsdk_glue.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/dngsdk_glue.o src/integration/dngsdk_glue.cpp +object/rawspeed_glue.o: src/integration/rawspeed_glue.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/rawspeed_glue.o src/integration/rawspeed_glue.cpp +object/adobepano.o: src/metadata/adobepano.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/adobepano.o src/metadata/adobepano.cpp +object/canon.o: src/metadata/canon.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/canon.o src/metadata/canon.cpp +object/ciff.o: src/metadata/ciff.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/ciff.o src/metadata/ciff.cpp +object/cr3_parser.o: src/metadata/cr3_parser.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/cr3_parser.o src/metadata/cr3_parser.cpp +object/epson.o: src/metadata/epson.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/epson.o src/metadata/epson.cpp +object/exif_gps.o: src/metadata/exif_gps.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/exif_gps.o src/metadata/exif_gps.cpp +object/fuji.o: src/metadata/fuji.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/fuji.o src/metadata/fuji.cpp +object/identify_tools.o: src/metadata/identify_tools.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/identify_tools.o src/metadata/identify_tools.cpp +object/identify.o: src/metadata/identify.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/identify.o src/metadata/identify.cpp +object/kodak.o: src/metadata/kodak.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/kodak.o src/metadata/kodak.cpp +object/leica.o: src/metadata/leica.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/leica.o src/metadata/leica.cpp +object/makernotes.o: src/metadata/makernotes.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/makernotes.o src/metadata/makernotes.cpp +object/mediumformat.o: src/metadata/mediumformat.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/mediumformat.o src/metadata/mediumformat.cpp +object/minolta.o: src/metadata/minolta.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/minolta.o src/metadata/minolta.cpp +object/misc_parsers.o: src/metadata/misc_parsers.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/misc_parsers.o src/metadata/misc_parsers.cpp +object/nikon.o: src/metadata/nikon.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/nikon.o src/metadata/nikon.cpp +object/hasselblad_model.o: src/metadata/hasselblad_model.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/hasselblad_model.o src/metadata/hasselblad_model.cpp +object/normalize_model.o: src/metadata/normalize_model.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/normalize_model.o src/metadata/normalize_model.cpp +object/olympus.o: src/metadata/olympus.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/olympus.o src/metadata/olympus.cpp +object/p1.o: src/metadata/p1.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/p1.o src/metadata/p1.cpp +object/pentax.o: src/metadata/pentax.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/pentax.o src/metadata/pentax.cpp +object/samsung.o: src/metadata/samsung.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/samsung.o src/metadata/samsung.cpp +object/sony.o: src/metadata/sony.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/sony.o src/metadata/sony.cpp +object/tiff.o: src/metadata/tiff.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/tiff.o src/metadata/tiff.cpp +object/aspect_ratio.o: src/postprocessing/aspect_ratio.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/aspect_ratio.o src/postprocessing/aspect_ratio.cpp +object/dcraw_process.o: src/postprocessing/dcraw_process.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/dcraw_process.o src/postprocessing/dcraw_process.cpp +object/mem_image.o: src/postprocessing/mem_image.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/mem_image.o src/postprocessing/mem_image.cpp +object/postprocessing_aux.o: src/postprocessing/postprocessing_aux.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/postprocessing_aux.o src/postprocessing/postprocessing_aux.cpp +object/postprocessing_utils_dcrdefs.o: src/postprocessing/postprocessing_utils_dcrdefs.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/postprocessing_utils_dcrdefs.o src/postprocessing/postprocessing_utils_dcrdefs.cpp +object/postprocessing_utils.o: src/postprocessing/postprocessing_utils.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/postprocessing_utils.o src/postprocessing/postprocessing_utils.cpp +object/raw2image.o: src/preprocessing/raw2image.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/raw2image.o src/preprocessing/raw2image.cpp +object/ext_preprocess.o: src/preprocessing/ext_preprocess.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/ext_preprocess.o src/preprocessing/ext_preprocess.cpp +object/subtract_black.o: src/preprocessing/subtract_black.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/subtract_black.o src/preprocessing/subtract_black.cpp +object/cameralist.o: src/tables/cameralist.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/cameralist.o src/tables/cameralist.cpp +object/colorconst.o: src/tables/colorconst.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/colorconst.o src/tables/colorconst.cpp +object/colordata.o: src/tables/colordata.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/colordata.o src/tables/colordata.cpp +object/wblists.o: src/tables/wblists.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/wblists.o src/tables/wblists.cpp +object/curves.o: src/utils/curves.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/curves.o src/utils/curves.cpp +object/decoder_info.o: src/utils/decoder_info.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/decoder_info.o src/utils/decoder_info.cpp +object/init_close_utils.o: src/utils/init_close_utils.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/init_close_utils.o src/utils/init_close_utils.cpp +object/open.o: src/utils/open.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/open.o src/utils/open.cpp +object/phaseone_processing.o: src/utils/phaseone_processing.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/phaseone_processing.o src/utils/phaseone_processing.cpp +object/read_utils.o: src/utils/read_utils.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/read_utils.o src/utils/read_utils.cpp +object/thumb_utils.o: src/utils/thumb_utils.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/thumb_utils.o src/utils/thumb_utils.cpp +object/utils_dcraw.o: src/utils/utils_dcraw.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/utils_dcraw.o src/utils/utils_dcraw.cpp +object/utils_libraw.o: src/utils/utils_libraw.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/utils_libraw.o src/utils/utils_libraw.cpp +object/apply_profile.o: src/write/apply_profile.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/apply_profile.o src/write/apply_profile.cpp +object/file_write.o: src/write/file_write.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/file_write.o src/write/file_write.cpp +object/tiff_writer.o: src/write/tiff_writer.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/tiff_writer.o src/write/tiff_writer.cpp +object/x3f_parse_process.o: src/x3f/x3f_parse_process.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/x3f_parse_process.o src/x3f/x3f_parse_process.cpp +object/x3f_utils_patched.o: src/x3f/x3f_utils_patched.cpp + ${CXX} -c -DLIBRAW_NOTHREADS ${CFLAGS} -o object/x3f_utils_patched.o src/x3f/x3f_utils_patched.cpp diff --git a/rtengine/libraw/Makefile.msvc b/rtengine/libraw/Makefile.msvc new file mode 100644 index 000000000..80bfcad05 --- /dev/null +++ b/rtengine/libraw/Makefile.msvc @@ -0,0 +1,648 @@ +# Additional compiler flags (OpenMP, SSEx, AVX, ...) + +#COPT_OPT=/arch:SSE2 /arch:AVX + +# Compile with RawSpeed support +#CFLAGS_RAWSPEED=/DUSE_RAWSPEED /I"..\\RawSpeed" /I"..\\RawSpeed\include" /I"..\\RawSpeed\include\libjpeg" +#LDFLAGS_RAWSPEED=..\RawSpeed\lib\rawspeed.lib ..\RawSpeed\lib\libxml2.lib ..\RawSpeed\lib\iconv.lib ..\RawSpeed\lib\charset.lib ..\RawSpeed\lib\turbojpeg-static.lib + +# Compile with DNG SDK support +#CFLAGS_DNG=/DUSE_DNGSDK /I"..\\dng_sdk\\source" +#LDFLAGS_DNG=..\\dng_sdk\\release\\libdng.lib ..\\dng_sdk\\release\\XMPCore.lib +# you may also need to specify zlib.lib and jpeg.lib in the line above + +# LCMS 1.x support +#LCMS_DEF=/DUSE_LCMS /DCMS_DLL /I..\lcms-1.19\include +#LCMS_LIB=..\lcms-1.19\bin\lcms.lib + +# LCMS 2.x support +#LCMS_DEF=/DUSE_LCMS2 /DCMS_DLL /I..\lcms2-2.3\include +#LCMS_LIB=..\lcms2-2.3\bin\lcms2_dll.lib + +# JPEG support for DNG +#JPEG_DEF=/DUSE_JPEG /I..\jpeg-8d +#JPEG_LIB=..\jpeg-8d\Release\jpeg.lib + + +SAMPLES=bin\raw-identify.exe bin\simple_dcraw.exe bin\dcraw_emu.exe bin\dcraw_half.exe \ + bin\half_mt.exe bin\mem_image.exe bin\unprocessed_raw.exe bin\4channels.exe \ + bin\multirender_test.exe bin\postprocessing_benchmark.exe bin\openbayer_sample.exe \ + bin\rawtextdump.exe + +LIBSTATIC=lib\libraw_static.lib +DLL=bin\libraw.dll +LIBDLL=lib\libraw.lib + +all: $(DLL) $(LIBSTATIC) $(SAMPLES) + +$(LIBDLL): $(DLL) + +# Guess LIBPATH from $INCLUDE + +LIB_OBJECTS= object\libraw_datastream_st.obj object\libraw_c_api_st.obj \ + object\cameralist_st.obj object\fuji_compressed_st.obj \ + object\crx_st.obj object\pana8_st.obj object\fp_dng_st.obj object\decoders_libraw_st.obj \ + object\sonycc_st.obj object\losslessjpeg_st.obj \ + object\unpack_st.obj object\unpack_thumb_st.obj \ + object\rawspeed_glue_st.obj object\dngsdk_glue_st.obj \ + object\colorconst_st.obj object\utils_libraw_st.obj object\init_close_utils_st.obj \ + object\decoder_info_st.obj object\open_st.obj object\phaseone_processing_st.obj \ + object\thumb_utils_st.obj \ + object\tiff_writer_st.obj object\subtract_black_st.obj object\postprocessing_utils_st.obj \ + object\dcraw_process_st.obj object\raw2image_st.obj object\mem_image_st.obj \ + object\x3f_utils_patched_st.obj object\x3f_parse_process_st.obj \ + object\read_utils_st.obj object\curves_st.obj object\utils_dcraw_st.obj \ + object\colordata_st.obj \ + object\canon_600_st.obj object\decoders_dcraw_st.obj \ + object\decoders_libraw_dcrdefs_st.obj object\generic_st.obj \ + object\kodak_decoders_st.obj object\dng_st.obj object\smal_st.obj \ + object\load_mfbacks_st.obj \ + object\sony_st.obj object\nikon_st.obj object\samsung_st.obj object\cr3_parser_st.obj \ + object\canon_st.obj object\epson_st.obj object\olympus_st.obj object\leica_st.obj \ + object\fuji_st.obj object\adobepano_st.obj object\pentax_st.obj object\p1_st.obj \ + object\makernotes_st.obj object\exif_gps_st.obj object\kodak_st.obj \ + object\tiff_st.obj object\ciff_st.obj object\mediumformat_st.obj object\minolta_st.obj \ + object\identify_tools_st.obj \ + object\hasselblad_model_st.obj object\normalize_model_st.obj object\identify_st.obj \ + object\misc_parsers_st.obj object\wblists_st.obj \ + object\postprocessing_aux_st.obj object\postprocessing_utils_dcrdefs_st.obj \ + object\aspect_ratio_st.obj \ + object\misc_demosaic_st.obj object\xtrans_demosaic_st.obj object\ahd_demosaic_st.obj \ + object\dht_demosaic_st.obj object\aahd_demosaic_st.obj object\dcb_demosaic_st.obj \ + object\file_write_st.obj \ + object\ext_preprocess_st.obj object\apply_profile_st.obj + + +DLL_OBJECTS= object\libraw_datastream.obj object\libraw_c_api.obj \ + object\cameralist.obj object\fuji_compressed.obj \ + object\crx.obj object\pana8.obj object\fp_dng.obj object\decoders_libraw.obj \ + object\sonycc.obj object\losslessjpeg.obj \ + object\unpack.obj object\unpack_thumb.obj \ + object\rawspeed_glue.obj object\dngsdk_glue.obj \ + object\colorconst.obj object\utils_libraw.obj \ + object\init_close_utils.obj \ + object\decoder_info.obj object\open.obj object\phaseone_processing.obj \ + object\thumb_utils.obj \ + object\tiff_writer.obj object\subtract_black.obj \ + object\postprocessing_utils.obj object\dcraw_process.obj \ + object\raw2image.obj object\mem_image.obj \ + object\x3f_utils_patched.obj object\x3f_parse_process.obj \ + object\read_utils.obj object\curves.obj object\utils_dcraw.obj \ + object\colordata.obj \ + object\canon_600.obj object\decoders_dcraw.obj \ + object\decoders_libraw_dcrdefs.obj object\generic.obj \ + object\kodak_decoders.obj object\dng.obj object\smal.obj \ + object\load_mfbacks.obj \ + object\sony.obj object\nikon.obj object\samsung.obj \ + object\cr3_parser.obj object\canon.obj object\epson.obj \ + object\olympus.obj object\leica.obj \ + object\fuji.obj object\adobepano.obj object\pentax.obj object\p1.obj \ + object\makernotes.obj object\exif_gps.obj object\kodak.obj \ + object\tiff.obj object\ciff.obj object\mediumformat.obj \ + object\minolta.obj \ + object\identify_tools.obj \ + object\hasselblad_model.obj object\normalize_model.obj object\identify.obj \ + object\misc_parsers.obj object\wblists.obj \ + object\postprocessing_aux.obj object\postprocessing_utils_dcrdefs.obj \ + object\aspect_ratio.obj \ + object\misc_demosaic.obj object\xtrans_demosaic.obj \ + object\ahd_demosaic.obj object\dht_demosaic.obj \ + object\aahd_demosaic.obj object\dcb_demosaic.obj \ + object\file_write.obj \ + object\ext_preprocess.obj object\apply_profile.obj + + +CC=cl.exe +COPT=/EHsc /MP /MD /I. /DWIN32 /O2 /W0 /nologo $(COPT_OPT) $(CFLAGSG2) $(CFLAGSG3) $(LCMS_DEF) $(JPEG_DEF) $(CFLAGS_RAWSPEED) $(CFLAGS_DNG) + +LINKLIB=$(LIBDLL) $(LDFLAGS_RAWSPEED) $(LDFLAGS_DNG) + + + +# Samples - default to dynamic (DLL) link, uncomment next lines +#CFLAGS2=/DLIBRAW_NODLL +#LINKLIB=$(LIBSTATIC) + +bin\raw-identify.exe: $(LINKLIB) samples\raw-identify.cpp + $(CC) $(COPT) $(CFLAGS2) /Fe"bin\\raw-identify.exe" /Fo"object\\" samples\raw-identify.cpp $(LINKLIB) + +bin\unprocessed_raw.exe: $(LINKLIB) samples\unprocessed_raw.cpp + $(CC) $(COPT) $(CFLAGS2) /Fe"bin\\unprocessed_raw.exe" /Fo"object\\" samples\unprocessed_raw.cpp $(LINKLIB) ws2_32.lib + +bin\4channels.exe: $(LINKLIB) samples\4channels.cpp + $(CC) $(COPT) $(CFLAGS2) /Fe"bin\\4channels.exe" /Fo"object\\" samples\4channels.cpp $(LINKLIB) + +bin\rawtextdump.exe: $(LINKLIB) samples\rawtextdump.cpp + $(CC) $(COPT) $(CFLAGS2) /Fe"bin\\rawtextdump.exe" /Fo"object\\" samples\rawtextdump.cpp $(LINKLIB) + +bin\simple_dcraw.exe: $(LINKLIB) samples\simple_dcraw.cpp + $(CC) $(COPT) $(CFLAGS2) /Fe"bin\\simple_dcraw.exe" /Fo"object\\" samples\simple_dcraw.cpp $(LINKLIB) + +bin\postprocessing_benchmark.exe: $(LINKLIB) samples\postprocessing_benchmark.cpp + $(CC) $(COPT) $(CFLAGS2) /Fe"bin\\postprocessing_benchmark.exe" /Fo"object\\" samples\postprocessing_benchmark.cpp $(LINKLIB) + +bin\multirender_test.exe: $(LINKLIB) samples\multirender_test.cpp + $(CC) $(COPT) $(CFLAGS2) /Fe"bin\\multirender_test.exe" /Fo"object\\" samples\multirender_test.cpp $(LINKLIB) + +bin\openbayer_sample.exe: $(LINKLIB) samples\openbayer_sample.cpp + $(CC) $(COPT) $(CFLAGS2) /Fe"bin\\openbayer_sample.exe" /Fo"object\\" samples\openbayer_sample.cpp $(LINKLIB) + +bin\mem_image.exe: $(LINKLIB) samples\mem_image_sample.cpp + $(CC) $(COPT) $(CFLAGS2) /Fe"bin\\mem_image.exe" /Fo"object\\" samples\mem_image_sample.cpp $(LINKLIB) + +bin\dcraw_emu.exe: $(LINKLIB) samples\dcraw_emu.cpp + $(CC) $(COPT) $(CFLAGS2) /Fe"bin\\dcraw_emu.exe" /Fo"object\\" samples\dcraw_emu.cpp $(LINKLIB) + +bin\dcraw_half.exe: $(LINKLIB) samples\dcraw_half.c + $(CC) $(COPT) $(CFLAGS2) /Fe"bin\\dcraw_half.exe" /Fo"object\\" samples\dcraw_half.c $(LINKLIB) + +bin\half_mt.exe: $(LINKLIB) samples\half_mt_win32.c + $(CC) $(COPT) $(CFLAGS2) /Fe"bin\\half_mt.exe" /Fo"object\\" samples\half_mt_win32.c $(LINKLIB) + +# DLL build + +$(DLL): $(DLL_OBJECTS) + -del /f $(DLL) $(LIBDLL) + cl $(COPT) /LD $(DLL_OBJECTS) $(LDFLAGS_RAWSPEED) $(LDFLAGS_DNG) $(LCMS_LIB) $(JPEG_LIB) /link /out:"$(DLL)" /implib:"$(LIBDLL)" + +# LIBRARY BUILD +$(LIBSTATIC): $(LIB_OBJECTS) + -del /f $(LIBSTATIC) + lib /OUT:$(LIBSTATIC) /LTCG $(LIB_OBJECTS) + +# clean +clean: + -del $(LIBSTATIC) $(LIBDLL) lib\*.exp + -del $(LIB_OBJECTS) $(DLL_OBJECTS) + -del object\*.o + -del $(DLL) $(SAMPLES) + +# OBJ generation rules +object\canon_600_st.obj: src\decoders\canon_600.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\canon_600_st.obj" /c src\decoders\canon_600.cpp + +object\canon_600.obj: src\decoders\canon_600.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\canon_600.obj" /c src\decoders\canon_600.cpp + +object\crx_st.obj: src\decoders\crx.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\crx_st.obj" /c src\decoders\crx.cpp + +object\crx.obj: src\decoders\crx.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\crx.obj" /c src\decoders\crx.cpp + +object\pana8_st.obj: src\decoders\pana8.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\pana8_st.obj" /c src\decoders\pana8.cpp + +object\pana8.obj: src\decoders\pana8.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\pana8.obj" /c src\decoders\pana8.cpp + +object\sonycc_st.obj: src\decoders\sonycc.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\sonycc_st.obj" /c src\decoders\sonycc.cpp + +object\sonycc.obj: src\decoders\sonycc.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\sonycc.obj" /c src\decoders\sonycc.cpp + +object\losslessjpeg_st.obj: src\decompressors\losslessjpeg.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\losslessjpeg_st.obj" /c src\decompressors\losslessjpeg.cpp + +object\losslessjpeg.obj: src\decompressors\losslessjpeg.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\losslessjpeg.obj" /c src\decompressors\losslessjpeg.cpp + +object\decoders_dcraw_st.obj: src\decoders\decoders_dcraw.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\decoders_dcraw_st.obj" /c src\decoders\decoders_dcraw.cpp + +object\decoders_dcraw.obj: src\decoders\decoders_dcraw.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\decoders_dcraw.obj" /c src\decoders\decoders_dcraw.cpp + +object\decoders_libraw_dcrdefs_st.obj: src\decoders\decoders_libraw_dcrdefs.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\decoders_libraw_dcrdefs_st.obj" /c src\decoders\decoders_libraw_dcrdefs.cpp + +object\decoders_libraw_dcrdefs.obj: src\decoders\decoders_libraw_dcrdefs.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\decoders_libraw_dcrdefs.obj" /c src\decoders\decoders_libraw_dcrdefs.cpp + +object\decoders_libraw_st.obj: src\decoders\decoders_libraw.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\decoders_libraw_st.obj" /c src\decoders\decoders_libraw.cpp + +object\decoders_libraw.obj: src\decoders\decoders_libraw.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\decoders_libraw.obj" /c src\decoders\decoders_libraw.cpp + +object\dng_st.obj: src\decoders\dng.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\dng_st.obj" /c src\decoders\dng.cpp + +object\dng.obj: src\decoders\dng.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\dng.obj" /c src\decoders\dng.cpp + +object\fp_dng_st.obj: src\decoders\fp_dng.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\fp_dng_st.obj" /c src\decoders\fp_dng.cpp + +object\fp_dng.obj: src\decoders\fp_dng.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\fp_dng.obj" /c src\decoders\fp_dng.cpp + +object\fuji_compressed_st.obj: src\decoders\fuji_compressed.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\fuji_compressed_st.obj" /c src\decoders\fuji_compressed.cpp + +object\fuji_compressed.obj: src\decoders\fuji_compressed.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\fuji_compressed.obj" /c src\decoders\fuji_compressed.cpp + +object\generic_st.obj: src\decoders\generic.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\generic_st.obj" /c src\decoders\generic.cpp + +object\generic.obj: src\decoders\generic.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\generic.obj" /c src\decoders\generic.cpp + +object\kodak_decoders_st.obj: src\decoders\kodak_decoders.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\kodak_decoders_st.obj" /c src\decoders\kodak_decoders.cpp + +object\kodak_decoders.obj: src\decoders\kodak_decoders.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\kodak_decoders.obj" /c src\decoders\kodak_decoders.cpp + +object\load_mfbacks_st.obj: src\decoders\load_mfbacks.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\load_mfbacks_st.obj" /c src\decoders\load_mfbacks.cpp + +object\load_mfbacks.obj: src\decoders\load_mfbacks.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\load_mfbacks.obj" /c src\decoders\load_mfbacks.cpp + +object\smal_st.obj: src\decoders\smal.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\smal_st.obj" /c src\decoders\smal.cpp + +object\smal.obj: src\decoders\smal.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\smal.obj" /c src\decoders\smal.cpp + +object\unpack_thumb_st.obj: src\decoders\unpack_thumb.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\unpack_thumb_st.obj" /c src\decoders\unpack_thumb.cpp + +object\unpack_thumb.obj: src\decoders\unpack_thumb.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\unpack_thumb.obj" /c src\decoders\unpack_thumb.cpp + +object\unpack_st.obj: src\decoders\unpack.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\unpack_st.obj" /c src\decoders\unpack.cpp + +object\unpack.obj: src\decoders\unpack.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\unpack.obj" /c src\decoders\unpack.cpp + +object\aahd_demosaic_st.obj: src\demosaic\aahd_demosaic.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\aahd_demosaic_st.obj" /c src\demosaic\aahd_demosaic.cpp + +object\aahd_demosaic.obj: src\demosaic\aahd_demosaic.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\aahd_demosaic.obj" /c src\demosaic\aahd_demosaic.cpp + +object\ahd_demosaic_st.obj: src\demosaic\ahd_demosaic.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\ahd_demosaic_st.obj" /c src\demosaic\ahd_demosaic.cpp + +object\ahd_demosaic.obj: src\demosaic\ahd_demosaic.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\ahd_demosaic.obj" /c src\demosaic\ahd_demosaic.cpp + +object\dcb_demosaic_st.obj: src\demosaic\dcb_demosaic.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\dcb_demosaic_st.obj" /c src\demosaic\dcb_demosaic.cpp + +object\dcb_demosaic.obj: src\demosaic\dcb_demosaic.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\dcb_demosaic.obj" /c src\demosaic\dcb_demosaic.cpp + +object\dht_demosaic_st.obj: src\demosaic\dht_demosaic.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\dht_demosaic_st.obj" /c src\demosaic\dht_demosaic.cpp + +object\dht_demosaic.obj: src\demosaic\dht_demosaic.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\dht_demosaic.obj" /c src\demosaic\dht_demosaic.cpp + +object\misc_demosaic_st.obj: src\demosaic\misc_demosaic.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\misc_demosaic_st.obj" /c src\demosaic\misc_demosaic.cpp + +object\misc_demosaic.obj: src\demosaic\misc_demosaic.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\misc_demosaic.obj" /c src\demosaic\misc_demosaic.cpp + +object\xtrans_demosaic_st.obj: src\demosaic\xtrans_demosaic.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\xtrans_demosaic_st.obj" /c src\demosaic\xtrans_demosaic.cpp + +object\xtrans_demosaic.obj: src\demosaic\xtrans_demosaic.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\xtrans_demosaic.obj" /c src\demosaic\xtrans_demosaic.cpp + +object\dngsdk_glue_st.obj: src\integration\dngsdk_glue.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\dngsdk_glue_st.obj" /c src\integration\dngsdk_glue.cpp + +object\dngsdk_glue.obj: src\integration\dngsdk_glue.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\dngsdk_glue.obj" /c src\integration\dngsdk_glue.cpp + +object\rawspeed_glue_st.obj: src\integration\rawspeed_glue.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\rawspeed_glue_st.obj" /c src\integration\rawspeed_glue.cpp + +object\rawspeed_glue.obj: src\integration\rawspeed_glue.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\rawspeed_glue.obj" /c src\integration\rawspeed_glue.cpp + +object\adobepano_st.obj: src\metadata\adobepano.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\adobepano_st.obj" /c src\metadata\adobepano.cpp + +object\adobepano.obj: src\metadata\adobepano.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\adobepano.obj" /c src\metadata\adobepano.cpp + +object\canon_st.obj: src\metadata\canon.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\canon_st.obj" /c src\metadata\canon.cpp + +object\canon.obj: src\metadata\canon.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\canon.obj" /c src\metadata\canon.cpp + +object\ciff_st.obj: src\metadata\ciff.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\ciff_st.obj" /c src\metadata\ciff.cpp + +object\ciff.obj: src\metadata\ciff.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\ciff.obj" /c src\metadata\ciff.cpp + +object\cr3_parser_st.obj: src\metadata\cr3_parser.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\cr3_parser_st.obj" /c src\metadata\cr3_parser.cpp + +object\cr3_parser.obj: src\metadata\cr3_parser.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\cr3_parser.obj" /c src\metadata\cr3_parser.cpp + +object\epson_st.obj: src\metadata\epson.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\epson_st.obj" /c src\metadata\epson.cpp + +object\epson.obj: src\metadata\epson.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\epson.obj" /c src\metadata\epson.cpp + +object\exif_gps_st.obj: src\metadata\exif_gps.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\exif_gps_st.obj" /c src\metadata\exif_gps.cpp + +object\exif_gps.obj: src\metadata\exif_gps.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\exif_gps.obj" /c src\metadata\exif_gps.cpp + +object\fuji_st.obj: src\metadata\fuji.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\fuji_st.obj" /c src\metadata\fuji.cpp + +object\fuji.obj: src\metadata\fuji.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\fuji.obj" /c src\metadata\fuji.cpp + +object\identify_tools_st.obj: src\metadata\identify_tools.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\identify_tools_st.obj" /c src\metadata\identify_tools.cpp + +object\identify_tools.obj: src\metadata\identify_tools.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\identify_tools.obj" /c src\metadata\identify_tools.cpp + +object\identify_st.obj: src\metadata\identify.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\identify_st.obj" /c src\metadata\identify.cpp + +object\identify.obj: src\metadata\identify.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\identify.obj" /c src\metadata\identify.cpp + +object\kodak_st.obj: src\metadata\kodak.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\kodak_st.obj" /c src\metadata\kodak.cpp + +object\kodak.obj: src\metadata\kodak.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\kodak.obj" /c src\metadata\kodak.cpp + +object\leica_st.obj: src\metadata\leica.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\leica_st.obj" /c src\metadata\leica.cpp + +object\leica.obj: src\metadata\leica.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\leica.obj" /c src\metadata\leica.cpp + +object\makernotes_st.obj: src\metadata\makernotes.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\makernotes_st.obj" /c src\metadata\makernotes.cpp + +object\makernotes.obj: src\metadata\makernotes.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\makernotes.obj" /c src\metadata\makernotes.cpp + +object\mediumformat_st.obj: src\metadata\mediumformat.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\mediumformat_st.obj" /c src\metadata\mediumformat.cpp + +object\mediumformat.obj: src\metadata\mediumformat.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\mediumformat.obj" /c src\metadata\mediumformat.cpp + +object\minolta_st.obj: src\metadata\minolta.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\minolta_st.obj" /c src\metadata\minolta.cpp + +object\minolta.obj: src\metadata\minolta.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\minolta.obj" /c src\metadata\minolta.cpp + +object\misc_parsers_st.obj: src\metadata\misc_parsers.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\misc_parsers_st.obj" /c src\metadata\misc_parsers.cpp + +object\misc_parsers.obj: src\metadata\misc_parsers.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\misc_parsers.obj" /c src\metadata\misc_parsers.cpp + +object\nikon_st.obj: src\metadata\nikon.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\nikon_st.obj" /c src\metadata\nikon.cpp + +object\nikon.obj: src\metadata\nikon.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\nikon.obj" /c src\metadata\nikon.cpp + +object\hasselblad_model_st.obj: src\metadata\hasselblad_model.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\hasselblad_model_st.obj" /c src\metadata\hasselblad_model.cpp + +object\hasselblad_model.obj: src\metadata\hasselblad_model.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\hasselblad_model.obj" /c src\metadata\hasselblad_model.cpp + +object\normalize_model_st.obj: src\metadata\normalize_model.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\normalize_model_st.obj" /c src\metadata\normalize_model.cpp + +object\normalize_model.obj: src\metadata\normalize_model.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\normalize_model.obj" /c src\metadata\normalize_model.cpp + +object\olympus_st.obj: src\metadata\olympus.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\olympus_st.obj" /c src\metadata\olympus.cpp + +object\olympus.obj: src\metadata\olympus.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\olympus.obj" /c src\metadata\olympus.cpp + +object\p1_st.obj: src\metadata\p1.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\p1_st.obj" /c src\metadata\p1.cpp + +object\p1.obj: src\metadata\p1.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\p1.obj" /c src\metadata\p1.cpp + +object\pentax_st.obj: src\metadata\pentax.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\pentax_st.obj" /c src\metadata\pentax.cpp + +object\pentax.obj: src\metadata\pentax.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\pentax.obj" /c src\metadata\pentax.cpp + +object\samsung_st.obj: src\metadata\samsung.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\samsung_st.obj" /c src\metadata\samsung.cpp + +object\samsung.obj: src\metadata\samsung.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\samsung.obj" /c src\metadata\samsung.cpp + +object\sony_st.obj: src\metadata\sony.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\sony_st.obj" /c src\metadata\sony.cpp + +object\sony.obj: src\metadata\sony.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\sony.obj" /c src\metadata\sony.cpp + +object\tiff_st.obj: src\metadata\tiff.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\tiff_st.obj" /c src\metadata\tiff.cpp + +object\tiff.obj: src\metadata\tiff.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\tiff.obj" /c src\metadata\tiff.cpp + +object\aspect_ratio_st.obj: src\postprocessing\aspect_ratio.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\aspect_ratio_st.obj" /c src\postprocessing\aspect_ratio.cpp + +object\aspect_ratio.obj: src\postprocessing\aspect_ratio.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\aspect_ratio.obj" /c src\postprocessing\aspect_ratio.cpp + +object\dcraw_process_st.obj: src\postprocessing\dcraw_process.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\dcraw_process_st.obj" /c src\postprocessing\dcraw_process.cpp + +object\dcraw_process.obj: src\postprocessing\dcraw_process.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\dcraw_process.obj" /c src\postprocessing\dcraw_process.cpp + +object\mem_image_st.obj: src\postprocessing\mem_image.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\mem_image_st.obj" /c src\postprocessing\mem_image.cpp + +object\mem_image.obj: src\postprocessing\mem_image.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\mem_image.obj" /c src\postprocessing\mem_image.cpp + +object\postprocessing_aux_st.obj: src\postprocessing\postprocessing_aux.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\postprocessing_aux_st.obj" /c src\postprocessing\postprocessing_aux.cpp + +object\postprocessing_aux.obj: src\postprocessing\postprocessing_aux.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\postprocessing_aux.obj" /c src\postprocessing\postprocessing_aux.cpp + +object\postprocessing_utils_dcrdefs_st.obj: src\postprocessing\postprocessing_utils_dcrdefs.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\postprocessing_utils_dcrdefs_st.obj" /c src\postprocessing\postprocessing_utils_dcrdefs.cpp + +object\postprocessing_utils_dcrdefs.obj: src\postprocessing\postprocessing_utils_dcrdefs.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\postprocessing_utils_dcrdefs.obj" /c src\postprocessing\postprocessing_utils_dcrdefs.cpp + +object\postprocessing_utils_st.obj: src\postprocessing\postprocessing_utils.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\postprocessing_utils_st.obj" /c src\postprocessing\postprocessing_utils.cpp + +object\postprocessing_utils.obj: src\postprocessing\postprocessing_utils.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\postprocessing_utils.obj" /c src\postprocessing\postprocessing_utils.cpp + +object\ext_preprocess_st.obj: src\preprocessing\ext_preprocess.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\ext_preprocess_st.obj" /c src\preprocessing\ext_preprocess.cpp + +object\ext_preprocess.obj: src\preprocessing\ext_preprocess.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\ext_preprocess.obj" /c src\preprocessing\ext_preprocess.cpp + +object\raw2image_st.obj: src\preprocessing\raw2image.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\raw2image_st.obj" /c src\preprocessing\raw2image.cpp + +object\raw2image.obj: src\preprocessing\raw2image.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\raw2image.obj" /c src\preprocessing\raw2image.cpp + +object\subtract_black_st.obj: src\preprocessing\subtract_black.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\subtract_black_st.obj" /c src\preprocessing\subtract_black.cpp + +object\subtract_black.obj: src\preprocessing\subtract_black.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\subtract_black.obj" /c src\preprocessing\subtract_black.cpp + +object\cameralist_st.obj: src\tables\cameralist.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\cameralist_st.obj" /c src\tables\cameralist.cpp + +object\cameralist.obj: src\tables\cameralist.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\cameralist.obj" /c src\tables\cameralist.cpp + +object\colorconst_st.obj: src\tables\colorconst.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\colorconst_st.obj" /c src\tables\colorconst.cpp + +object\colorconst.obj: src\tables\colorconst.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\colorconst.obj" /c src\tables\colorconst.cpp + +object\colordata_st.obj: src\tables\colordata.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\colordata_st.obj" /c src\tables\colordata.cpp + +object\colordata.obj: src\tables\colordata.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\colordata.obj" /c src\tables\colordata.cpp + +object\wblists_st.obj: src\tables\wblists.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\wblists_st.obj" /c src\tables\wblists.cpp + +object\wblists.obj: src\tables\wblists.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\wblists.obj" /c src\tables\wblists.cpp + +object\curves_st.obj: src\utils\curves.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\curves_st.obj" /c src\utils\curves.cpp + +object\curves.obj: src\utils\curves.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\curves.obj" /c src\utils\curves.cpp + +object\decoder_info_st.obj: src\utils\decoder_info.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\decoder_info_st.obj" /c src\utils\decoder_info.cpp + +object\decoder_info.obj: src\utils\decoder_info.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\decoder_info.obj" /c src\utils\decoder_info.cpp + +object\init_close_utils_st.obj: src\utils\init_close_utils.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\init_close_utils_st.obj" /c src\utils\init_close_utils.cpp + +object\init_close_utils.obj: src\utils\init_close_utils.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\init_close_utils.obj" /c src\utils\init_close_utils.cpp + +object\open_st.obj: src\utils\open.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\open_st.obj" /c src\utils\open.cpp + +object\open.obj: src\utils\open.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\open.obj" /c src\utils\open.cpp + +object\phaseone_processing_st.obj: src\utils\phaseone_processing.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\phaseone_processing_st.obj" /c src\utils\phaseone_processing.cpp + +object\phaseone_processing.obj: src\utils\phaseone_processing.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\phaseone_processing.obj" /c src\utils\phaseone_processing.cpp + +object\read_utils_st.obj: src\utils\read_utils.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\read_utils_st.obj" /c src\utils\read_utils.cpp + +object\read_utils.obj: src\utils\read_utils.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\read_utils.obj" /c src\utils\read_utils.cpp + +object\thumb_utils_st.obj: src\utils\thumb_utils.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\thumb_utils_st.obj" /c src\utils\thumb_utils.cpp + +object\thumb_utils.obj: src\utils\thumb_utils.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\thumb_utils.obj" /c src\utils\thumb_utils.cpp + +object\utils_dcraw_st.obj: src\utils\utils_dcraw.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\utils_dcraw_st.obj" /c src\utils\utils_dcraw.cpp + +object\utils_dcraw.obj: src\utils\utils_dcraw.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\utils_dcraw.obj" /c src\utils\utils_dcraw.cpp + +object\utils_libraw_st.obj: src\utils\utils_libraw.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\utils_libraw_st.obj" /c src\utils\utils_libraw.cpp + +object\utils_libraw.obj: src\utils\utils_libraw.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\utils_libraw.obj" /c src\utils\utils_libraw.cpp + +object\apply_profile_st.obj: src\write\apply_profile.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\apply_profile_st.obj" /c src\write\apply_profile.cpp + +object\apply_profile.obj: src\write\apply_profile.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\apply_profile.obj" /c src\write\apply_profile.cpp + +object\file_write_st.obj: src\write\file_write.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\file_write_st.obj" /c src\write\file_write.cpp + +object\file_write.obj: src\write\file_write.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\file_write.obj" /c src\write\file_write.cpp + +object\tiff_writer_st.obj: src\write\tiff_writer.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\tiff_writer_st.obj" /c src\write\tiff_writer.cpp + +object\tiff_writer.obj: src\write\tiff_writer.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\tiff_writer.obj" /c src\write\tiff_writer.cpp + +object\x3f_parse_process_st.obj: src\x3f\x3f_parse_process.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\x3f_parse_process_st.obj" /c src\x3f\x3f_parse_process.cpp + +object\x3f_parse_process.obj: src\x3f\x3f_parse_process.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\x3f_parse_process.obj" /c src\x3f\x3f_parse_process.cpp + +object\x3f_utils_patched_st.obj: src\x3f\x3f_utils_patched.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\x3f_utils_patched_st.obj" /c src\x3f\x3f_utils_patched.cpp + +object\x3f_utils_patched.obj: src\x3f\x3f_utils_patched.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\x3f_utils_patched.obj" /c src\x3f\x3f_utils_patched.cpp + +object\libraw_c_api_st.obj: src\libraw_c_api.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\libraw_c_api_st.obj" /c src\libraw_c_api.cpp + +object\libraw_c_api.obj: src\libraw_c_api.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\libraw_c_api.obj" /c src\libraw_c_api.cpp + +object\libraw_datastream_st.obj: src\libraw_datastream.cpp + $(CC) $(COPT) /DLIBRAW_NODLL /DLIBRAW_BUILDLIB /Fo"object\\libraw_datastream_st.obj" /c src\libraw_datastream.cpp + +object\libraw_datastream.obj: src\libraw_datastream.cpp + $(CC) $(COPT) /DLIBRAW_BUILDLIB /Fo"object\\libraw_datastream.obj" /c src\libraw_datastream.cpp + diff --git a/rtengine/libraw/README.DNGSDK.txt b/rtengine/libraw/README.DNGSDK.txt new file mode 100644 index 000000000..00f6ce497 --- /dev/null +++ b/rtengine/libraw/README.DNGSDK.txt @@ -0,0 +1,49 @@ +LibRaw can decode most common DNG formats (Bayer/Linear, 16-bit integer and +floating point) by itself (you need to use zlib for deflate decompression +support and libjpeg for lossy compressed DNGs). + +Some rare flavours of DNG files (e.g. for 8-bit files) are not implemented in +LibRaw. These files never come from camera or DNG files created by +Adobe DNG Converter, but created by some processing software that uses DNG as +intermediate format. + +To decode such files you need to compile LibRaw with Adobe DNG SDK. This SDK +to be used internally, standard LibRaw API remains untouched (you may specify +what kinds of DNG files you want to decode via Adobe code, see below). + +To build LibRaw with DNG SDK specify USE_DNGSDK in defines and adjust +include/linker path settings to point to DNG SDK's include and library folders. + +DNG SDK Version compatibility: + + - DNG SDK 1.6 and 1.7 are tested with LibRaw newer then 0.21 + If you want to use LibRaw with Modern DNG files please use: + -- DNG SDK 1.7 for JpegXL compressed files + -- DNG SDK 1.6+ to access Enhanced DNG frames + + - DNG SDK 1.5 may work too, but have not tested w/ LibRaw. + - Since LibRaw 0.20, DNG SDK 1.4 or newer is required + - There are several DNG SDK 1.4 versions circulated, the oldest known is + dated May 2012, you'll need the last one (dated June 2015). + - This version is available from Adobe site: + http://download.adobe.com/pub/adobe/dng/dng_sdk_1_4.zip + +In your application + + * create dng_host object (or derived object, e.g. with multithreaded) entity in your program; + * pass it to LibRaw via LibRaw::set_dng_host(dng_host *) call to enable DNG SDK use on runtime + * adjust imgdata.rawparams.use_dngsdk parameter with one of this values + (ORed bitwise): + LIBRAW_DNG_NONE - do not use DNG SDK for DNG processing + LIBRAW_DNG_FLOAT - process floating point DNGs via Adobe DNG SDK + LIBRAW_DNG_LINEAR - process 'linear DNG' (i.e. demosaiced) + LIBRAW_DNG_DEFLATE - process DNGs compressed with deflate (gzip) + LIBRAW_DNG_XTRANS - process Fuji X-Trans DNGs (6x6 CFA) + LIBRAW_DNG_OTHER - process other files (so usual 2x2 bayer) + LIBRAW_DNG_8BIT - process 8bit DNGs (e.g. JPEG compressed ones) + + Default value for this field: + LIBRAW_DNG_DEFAULT=LIBRAW_DNG_FLOAT|LIBRAW_DNG_LINEAR|LIBRAW_DNG_DEFLATE | LIBRAW_DNG_8BIT + + You also may use this macro to pass all supported DNGs to Adobe SDK: + LIBRAW_DNG_ALL = LIBRAW_DNG_FLOAT|LIBRAW_DNG_LINEAR|LIBRAW_DNG_XTRANS|LIBRAW_DNG_OTHER | LIBRAW_DNG_8BIT diff --git a/rtengine/libraw/README.GoPro.txt b/rtengine/libraw/README.GoPro.txt new file mode 100644 index 000000000..5ce7c67c2 --- /dev/null +++ b/rtengine/libraw/README.GoPro.txt @@ -0,0 +1,124 @@ +GoPro HERO/Fusion .GPR files are DNG files by nature, but with own wavelet-based codec. + +GoPro provides GPR SDK for reading these files, available at https://github.com/gopro/gpr + +LibRaw is able to use this GPR SDK to read GoPro HERO/Fusion files. + +To enable this support: + +1. Build GPR SDK (see NOTES section below) +2. Build LibRaw with -DUSE_DNGSDK and -DUSE_GPRSDK compiler flags + (you'll need to adjust INCLUDE path and linker flags to add GPR SDK files to compile/link). + + +NOTES: +I. GPR SDK comes with (patched) Adobe DNG SDK source (v1.4 but outdated). + This DNG SDK is *NOT* compatible with LibRaw since 0.20 due to + internals change . + +II. So, you need to patch latest Adobe DNG SDK v1.4 (dated 2015), this version + is available from Adobe: + http://download.adobe.com/pub/adobe/dng/dng_sdk_1_4.zip + or use Adobe DNG SDK v1.6 or v1.7 + + (most likely, this apply for v1.5 too, but not tested/checked): + + a) For Adobe DNG SDK v1.4 you'll need to enable dng_ifd.fCompression value == 9 in + dng_ifd::IsValidCFA() call + Use provided patch: LibRaw/GoPro/dng-sdk-1_4-allow-VC5-validate.diff + (it may not apply to any Adobe DNG SDK version, if so apply it by hands). + + This compression type is already handled (passed via validation) + in Adobe DNG SDK v1.6/1.7 + + b) Adobe DNG SDK v1.6/1.7 defines the ccVc5 constant in dng_tag_values.h + so GPR SDK's gpr_read_image.cpp will not compile due to constant redefinition + so use provided patch: + + For Adobe DNG SDK 1.6 (only): LibRaw/GoPro/dng-sdk-1_6-hide-ccVc5-definitiion.diff + For Adobe DNG SDK 1.6 or 1.7: LibRaw/GoPro/dng-sdk-1_6-1_7-hide-ccVc5-definitiion.diff + + to use Adobe's definitiion + + c) Newer (than supplied w/ GPR SDK) Adobe SDK versions changes + dng_read_image::ReadTile interface, please apply patches + * For all versions of Adobe DNG SDK: + + LibRaw/GoPro/gpr_read_image.cpp-dng16.diff + and LibRaw/GoPro/gpr_read_image.h-dng16.diff to your GPR SDK code + + * For Adone DNG SDK 1.7 (in addition to two -dng16.diff patches listed in previous section): + LibRaw/GoPro/gpr_read_image.h-dng16.diff + LibRaw/GoPro/gpr_read_image.h-dng17.diff + + d) GPR SDK's gpr_sdk/private/gpr.cpp uses own (added) dng_host method + GetGPMFPayload so it will not compile with Adobes (not patched) + dng_host.h + LibRaw does not use high-level interface provided by gpr.cpp, so + possible problem solutions are: + - either compile GPR SDK without gpr_sdk/private/gpr.cpp file + - or provide GPR's dng_host.h while building GPR SDK. + (in our software we use 1st method). + + + + See Note VII below for detailed GPR SDK build instructions w/ Cmake + +III. LibRaw uses private gpr_read_image() interface + So you'll need to add PATH_TO/gpr_sdk/gpr_sdk/private to -I compiler flags. + +IV. -DUSE_GPRSDK LibRaw build flag requires -DUSE_DNGSDK. LibRaw will not + compile if USE_GPRSDK is set, but USE_DNGSDK is not + +V. LibRaw will use DNG SDK to unpack GoPro files even if imgdata.params.use_dng_sdk is set to 0. + +VI. If LibRaw is built with -DUSE_GPRSDK, LibRaw::capabilities will return LIBRAW_CAPS_GPRSDK flag. + +VII. GPR SDK build using cmake (contributed by our user, great thanks) + +1. replace gopro's toplevel CMakeLists.txt with this one (this builds only a subset of the libraries): +------------------------------------ +# minimum required cmake version +cmake_minimum_required( VERSION 3.5 FATAL_ERROR ) + +set(CMAKE_SUPPRESS_REGENERATION true) +set(CMAKE_C_FLAGS "-std=c99") + +# project name +project( gpr ) + +option(DNGINCLUDEDIR "Adobe DNG toolkit include directory") +INCLUDE_DIRECTORIES( ${DNGINCLUDEDIR} ) + +# DNG toolkit requires C++11 minimum: +set_property(GLOBAL PROPERTY CXX_STANDARD 17) + +# add needed subdirectories +add_subdirectory( "source/lib/common" ) +add_subdirectory( "source/lib/vc5_common" ) +add_subdirectory( "source/lib/vc5_decoder" ) +add_subdirectory( "source/lib/gpr_sdk" ) + +set_property(TARGET gpr_sdk PROPERTY CXX_STANDARD 17) + +IF (WIN32) +TARGET_COMPILE_DEFINITIONS( gpr_sdk PUBLIC -DqWinOS=1 -DqMacOS=0 -DqLinux=0) +ELSEIF (APPLE) +TARGET_COMPILE_DEFINITIONS( gpr_sdk PUBLIC -DqWinOS=0 -DqMacOS=1 -DqLinux=0) +ELSE() +TARGET_COMPILE_DEFINITIONS( gpr_sdk PUBLIC -DqWinOS=0 -DqMacOS=0 -DqLinux=1) +ENDIF() +---------------------------------------- + +2. apply the two patches of README.GoPro.txt section II b. +the patch of section IIa is not needed with libdng1.5. + +3. delete these two files: +/source/lib/gpr_sdk/private/gpr.cpp +/source/lib/gpr_sdk/private/gpr_image_writer.cpp + +4. run CMAKE with -DDNGINCLUDEDIR, pointing to the headers from Adobe dng 1.5. + +5. build. You get 4 libraries "gpr_sdk", "vc5_common", "vc5_decoder", "common", the rest is ignored. + + diff --git a/rtengine/libraw/README.RawSpeed.txt b/rtengine/libraw/README.RawSpeed.txt new file mode 100644 index 000000000..fb4b94c93 --- /dev/null +++ b/rtengine/libraw/README.RawSpeed.txt @@ -0,0 +1,62 @@ +================= Compile LibRaw with RawSpeed support ======================== + +0) RawSpeed version: + LibRaw supports 'master' version of RawSpeed library: https://github.com/darktable-org/rawspeed/tree/master + + Although this version is really outdated, newer versions does not looks stable enough for production + use (for example, this critical issue not fixed for 10+ months: https://github.com/darktable-org/rawspeed/issues/100 ) + +1) Prerequisites + +To build RawSpeed you need libxml2, iconv, and JPEG library installed on your +system. + +2) Build RawSpeed: + + -- consult http://rawstudio.org/blog/?p=800 for details + + -- Win32: you need POSIX Threads for Win32 installed on your system + (http://sources.redhat.com/pthreads-win32/) + + -- use provided RawSpeed/rawspeed.samsung-decoder.patch to fix + old Samsung decoder bug + + -- you may use qmake .pro files supplied in LibRaw distribution + (RawSpeed/rawspeed.qmake-pro-files.patch) + Adjust path to libraries/includes according to your setup. + + -- Win32: you need to add __declspec(..) to external C++ classes. + Use patch provided with LibRaw (RawSpeed/rawspeed.win32-dll.patch) + + -- Unix: you need to define rawspeed_get_number_of_processor_cores() call + For most unix systems (Linux, MacOS X 10.4+, FreeBSD) patch provided + with LibRaw (RawSpeed/rawspeed.cpucount-unix.patch) should work. + +3) Build LibRaw with RawSpeed support: + + Win32: + --Uncomment CFLAGS_RAWSPEED and LDFLAGS_RAWSPEED lines in + Makefile.msvc. Adjust paths to libraries/includes if needed. + -- run nmake -f Makefile.msvc + + Unix/MacOS: + -- Uncomment CFLAGS/LDADD lines in RawSpeed section in Makefile.dist + -- Uncomment RAWSPEED_DATA line if you wish to rebuild + internal copy of RawSpeed's cameras.xml + -- run make -f Makefile.dist + + Compile options: + -- You may specify -DNOSONY_RAWSPEED define if you do not want to use + RawSpeed's Sony formats decoder (because result of this decoder is + different from LibRaw's built-in decoder) + +4) Build/run your Apps with LibRaw+RawSpeed + + -- Build as usual, no changes required in your apps unless you + access LibRaw::imgdata.rawdata.raw_image[] directly + + -- you may turn off RawSpeed support on runtime by setting + imgdata.params.use_rawspeed to 0. + + -- You'll need all shared libraries you linked to at runtime (libxml2, + iconv, LibJPEG, and posix threads on Win32). diff --git a/rtengine/libraw/README.cmake b/rtengine/libraw/README.cmake new file mode 100644 index 000000000..0fc6d4adb --- /dev/null +++ b/rtengine/libraw/README.cmake @@ -0,0 +1,9 @@ +Due to inability to support (user contributed) Cmake scripts, +the cmake builds are not officially supported by LibRaw team +since October 23, 2014 + +The scripts are moved to separate github repository +github.com:LibRaw/LibRaw-cmake.git + +Checkout from this repo if you want to use Cmake to build LibRaw. + diff --git a/rtengine/libraw/README.demosaic-packs b/rtengine/libraw/README.demosaic-packs new file mode 100644 index 000000000..8e1077eea --- /dev/null +++ b/rtengine/libraw/README.demosaic-packs @@ -0,0 +1,17 @@ +======================= LibRaw demosaic pack(s) =============================== + +We were forced to stop supporting LibRaw demosaic packs: the contributed code +is out of date for several years, initial contributors has no interest in it. + +We too: we (LibRaw team) focused on RAW decode and metadata extraction, but not +on postprocessing (demosaic, noise suppression, etc). + +So, LibRaw-demosaic-pack-GPLn are abandoned now. We will be happy to convey +their support and development to any developer who will show interest. + +LibRaw 0.19 contains callback calls placed instead of calls to demosaic pack routines. +So, adaptation of demosaic packs to new LibRaw should be easy (and, of course, we'll +provide some support and/or implement additional callbacks if needed). + + + diff --git a/rtengine/libraw/README.md b/rtengine/libraw/README.md new file mode 100644 index 000000000..8f00255f7 --- /dev/null +++ b/rtengine/libraw/README.md @@ -0,0 +1,106 @@ +# LibRaw +## Library for reading and processing of RAW digicam images + + The LibRaw library provides a simple and unified interface for extracting out of RAW files generated by digital photo cameras the following: + +* RAW data (_pixel values)_ +* Metadata necessary for processing RAW (_geometry, CFA / Bayer pattern, black level, white balance, etc.)_ +* Embedded preview / thumbnail. + +The library is intended for use with programs that work with RAW files, such as: + +* RAW viewers +* RAW converters +* RAW data analyzers +* Software for stitching and compositing multi-frame aggregates like panoramas and image stacks. + +Using the LibRaw library allows one to focus on the substantive part of processing the data contained in RAW files, without getting distracted by the wide variety of RAW file and metadata formats, compression algorithms, etc. + +The library�s development is focused on: + +* Support for new cameras and formats +* Improving extraction of metadata necessary for RAW processing +* Providing an interface for reading other types of metadata. + +Additionally, the LibRaw library offers some basic RAW conversion, intended for cases when such conversion is not the main function of the LibRaw-using application _(for example: a viewer for 500+ graphic file formats, including RAW)._ These methods are inherited from the Dave Coffin�s dcraw.c utility _(see below the �Project history� section);_ their further development is not currently planned, because we do not consider production-quality rendering to be in the scope of LibRaw�s functionality _(the methods are retained for compatibility with prior versions and for rapid-fire testing of RAW support and other aspects)._ + +## Licensing + + +The LibRaw library is distributed free of charge and with open-source code subject to two licenses: + +1\. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + +2\. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + +To use the LibRaw library in an application, you can choose the license that better suits your needs. + +If you modify/add/improve the LibRaw source code, then your patches can only be included into the library�s official source code if you agree to it being distributed under both of the above licenses. + +We do not guarantee that the licensing will not change in future versions of LibRaw. + +## Update policy + + +### Major/minor releases + +* Major releases _(for example, 0.20)_ are published once every year and a half to two years. +* When the first public beta version of a major release is published, the list of supported cameras and formats is frozen; we try (but do not guarantee) to freeze the API/ABI as well. +* The public major release contains only that code which has been sufficiently tested on a wide user base (including in our commercial products). Something very new may not be included in it (but it will probably be included in a public snapshot, see below). +* Minor updates _(0.20.1, 0.20.2�)_ do not change the API/ABI and new cameras are not added; generally they are just bugfixes. +* Bugfixes are published as soon as possible in the [public GitHub repository](https://github.com/LibRaw/LibRaw). +* Minor version increments: these are generally published if a serious error has been fixed, one that potentially affects many library users (for example, a possible stack overflow). + +### Public snapshots + +* Public snapshots are published every 7-9 months in the [public GitHub repository](https://github.com/LibRaw/LibRaw). +* These versions contain support for new cameras that was added after the previous major release. The API/ABI of public snapshots is not frozen, and may change. +* Public snapshots are always tested on a fairly large user base, and may be considered suitable for use in programs that work with files with known origins (that is, recorded directly by users� digital cameras). However, public snapshots should not be considered sufficiently reliable for processing files that are specially constructed for vulnerability testing; that is, they should not be used in public services that allow for anonymous processing of files of unknown provenance + +## Support and feedback + +* You can submit a bug report in one of the following ways: + * [Issues](https://github.com/LibRaw/LibRaw/issues) on GitHub + * The libraw.org [forum](https://www.libraw.org/forum) + * [Feedback form](https://www.libraw.org/contact) on libraw.org + * E-mail us at [info@libraw.org](mailto:info@libraw.org) +* Questions can be asked on the forum, through the feedback form, and via the email indicated above. + Please do not use Issues on GitHub for questions; it is intended specifically for problem reports. +* We prefer to process additions to the source code via the [Pull Requests](https://github.com/LibRaw/LibRaw/pulls) on GitHub. + +We cannot guarantee any response to requests submitted via the above methods. If you need a guaranteed response for a bug report and/or for extending technical support, please use the Extended Support option. + +## Project history + + +The LibRaw project was launched in 2008, based on the [dcraw.c](https://www.dechifro.org/dcraw/) (Dave Coffin) utility, with its goals being to: + +* Convert dcraw.c into a library that could be used by other programs, while also somewhat improving the structure of dcraw.c (removing global variables, making it thread-safe, etc.) +* Import changes made to dcraw.c +* Improve/expand the extraction of metadata. + +Unfortunately, support for dcraw.c was reduced to a minimum in 2015, and completely ceased in 2018. Since then, support for new cameras (including support for new formats) has been done entirely by the LibRaw team. + +The code that implements rendering of RAW to RGB is inherited from dcraw.c, without major changes (though a set of changes was implemented to speed up and parallelize this code). + +In the early-to-mid 2010s, we gladly expanded post-processing implemented in LibRaw, and readily accepted the input of outside developers (new/improved methods for debayerization/demosaicing, systematic noise reduction etc.). + +Experience has shown that the LibRaw team cannot support this added code on their own, while contributors do not provide support and development of the code they suggest and it ends up abandoned. As such, the majority of the modifications that are implemented by people outside the LibRaw team was moved to the [LibRaw-demosaic-pack-�.](https://github.com/LibRaw?tab=repositories), where they remain in their original form (but these projects are still present in our GitHub). + +Thus, we arrive at our current status, described in the first part of this text. + +## Copyrights and Acknowledgements + +Copyright (C) 2008-2024 LibRaw LLC + +LibRaw uses code from Dave Coffin�s dcraw.c utility (without RESTRICTED/GPL2 code): + +Copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net + +LibRaw uses DCB demosaic code by Jaceck Gozdz distributed under BSD license: + +Copyright (C) 2010, Jacek Gozdz (mailto:cuniek@kft.umcs.lublin.pl) + +LibRaw uses Roland Karlsson�s X3F tools source code, licensed under BSD license: + +Copyright (c) 2010, Roland Karlsson (roland@proxel.se) \ No newline at end of file diff --git a/rtengine/libraw/RawSpeed/rawspeed.cpucount-unix.patch b/rtengine/libraw/RawSpeed/rawspeed.cpucount-unix.patch new file mode 100644 index 000000000..4ddbdeae6 --- /dev/null +++ b/rtengine/libraw/RawSpeed/rawspeed.cpucount-unix.patch @@ -0,0 +1,15 @@ +diff --git a/RawSpeed/Common.cpp b/RawSpeed/Common.cpp +index abec232..6990c04 100644 +--- a/RawSpeed/Common.cpp ++++ b/RawSpeed/Common.cpp +@@ -31,5 +31,10 @@ void* _aligned_malloc(size_t bytes, size_t alignment) { + else + return NULL; + } ++#include ++int rawspeed_get_number_of_processor_cores() ++{ ++ return sysconf( _SC_NPROCESSORS_ONLN ); ++} + + #endif diff --git a/rtengine/libraw/RawSpeed/rawspeed.qmake-pro-files.patch b/rtengine/libraw/RawSpeed/rawspeed.qmake-pro-files.patch new file mode 100644 index 000000000..d77db7c4c --- /dev/null +++ b/rtengine/libraw/RawSpeed/rawspeed.qmake-pro-files.patch @@ -0,0 +1,84 @@ +diff --git a/RawSpeed/rawspeed-lib.pro b/RawSpeed/rawspeed-lib.pro +new file mode 100644 +index 0000000..1599ddf +--- /dev/null ++++ b/RawSpeed/rawspeed-lib.pro +@@ -0,0 +1,42 @@ ++TEMPLATE=lib ++TARGET=rawspeed ++ ++win32:INCLUDEPATH+=d:/Qt/iconv/include d:/Qt/libxml2/include/libxml2 d:/Qt/pthreads/include d:/Qt/libjpeg-turbo/include ++win32:LIBS+=-Ld:/Qt/iconv/lib/x86 -liconv -Ld:/Qt/libxml2/lib/x86 -llibxml2 -Ld:/Qt/pthreads/lib/x86 -lpthreadVC2 -Ld:/Qt/libjpeg-turbo/lib/x86 -ljpeg8 ++ ++unix:INCLUDEPATH+=/usr/local/include /usr/local/include/libxml2 ++unix:CONFIG+=staticlib ++ ++INCLUDEPATH+=. ++ ++HEADERS = ArwDecoder.h BitPumpJPEG.h BitPumpMSB.h BitPumpMSB32.h \ ++ BitPumpPlain.h BlackArea.h ByteStream.h ByteStreamSwap.h \ ++ Camera.h CameraMetaData.h CameraMetadataException.h \ ++ CameraSensorInfo.h ColorFilterArray.h Common.h Cr2Decoder.h \ ++ DngDecoder.h DngDecoderSlices.h DngOpcodes.h FileIOException.h \ ++ FileMap.h FileReader.h IOException.h LJpegDecompressor.h \ ++ LJpegPlain.h NefDecoder.h NikonDecompressor.h OrfDecoder.h \ ++ PefDecoder.h PentaxDecompressor.h Point.h RawDecoder.h \ ++ RawDecoderException.h RawImage.h RawParser.h Rw2Decoder.h SrwDecoder.h \ ++ StdAfx.h TiffEntry.h TiffEntryBE.h TiffIFD.h TiffIFDBE.h TiffParser.h \ ++ TiffParserException.h TiffParserHeaderless.h TiffParserOlympus.h \ ++ TiffTag.h dlldef.h ++ ++SOURCES = \ ++ ArwDecoder.cpp BitPumpJPEG.cpp BitPumpMSB.cpp BitPumpMSB32.cpp \ ++ BitPumpPlain.cpp BlackArea.cpp ByteStream.cpp ByteStreamSwap.cpp \ ++ Camera.cpp CameraMetaData.cpp CameraMetadataException.cpp \ ++ CameraSensorInfo.cpp ColorFilterArray.cpp Common.cpp Cr2Decoder.cpp \ ++ DngDecoder.cpp DngDecoderSlices.cpp DngOpcodes.cpp \ ++ FileIOException.cpp FileMap.cpp FileReader.cpp IOException.cpp \ ++ LJpegDecompressor.cpp LJpegPlain.cpp NefDecoder.cpp \ ++ NikonDecompressor.cpp OrfDecoder.cpp PefDecoder.cpp \ ++ PentaxDecompressor.cpp RawDecoder.cpp RawDecoderException.cpp \ ++ RawImage.cpp RawImageDataFloat.cpp RawImageDataU16.cpp RawParser.cpp \ ++ Rw2Decoder.cpp SrwDecoder.cpp TiffEntry.cpp TiffEntryBE.cpp\ ++ TiffIFD.cpp TiffIFDBE.cpp TiffParser.cpp TiffParserException.cpp \ ++ TiffParserHeaderless.cpp TiffParserOlympus.cpp ++ ++DEFINES+=RAWSPEED_BUILDLIB ++CONFIG-=qt ++win32:QMAKE_CXXFLAGS+=/O2 /arch:SSE2 /fp:fast /MP +diff --git a/RawSpeed/rawspeed-test.pro b/RawSpeed/rawspeed-test.pro +new file mode 100644 +index 0000000..518aa98 +--- /dev/null ++++ b/RawSpeed/rawspeed-test.pro +@@ -0,0 +1,21 @@ ++TEMPLATE=app ++TARGET=rawspeed-test ++ ++SOURCES=RawSpeed.cpp ++ ++win32:CONFIG(debug,debug|release) { ++ LIBDIR = debug ++} else { ++ LIBDIR = release ++} ++ ++ ++INCLUDEPATH+=../ ++ ++unix:INCLUDEPATH+=/usr/local/include /usr/local/include/libxml2 ++unix:LIBS+=-L. -lrawspeed -L/usr/local/lib -lxml2 -ljpeg ++win32:LIBS+=-L$$LIBDIR -llibrawspeed ++win32:LIBS+=-Ld:/Qt/iconv/lib/x86 -liconv -Ld:/Qt/libxml2/lib/x86 -llibxml2a -Ld:/Qt/pthreads/lib/x86 -lpthreadVC2 -Ld:/Qt/libjpeg-turbo/lib/x86 -ljpeg8 ++win32:INCLUDEPATH+=d:/Qt/iconv/include d:/Qt/libxml2/include/libxml2 d:/Qt/pthreads/include d:/Qt/libjpeg-turbo/include ++CONFIG-=qt ++CONFIG+=console +diff --git a/RawSpeed/rawspeed.pro b/RawSpeed/rawspeed.pro +new file mode 100644 +index 0000000..df2a0b9 +--- /dev/null ++++ b/RawSpeed/rawspeed.pro +@@ -0,0 +1,3 @@ ++TEMPLATE=subdirs ++SUBDIRS=rawspeed-lib.pro rawspeed-test.pro ++ diff --git a/rtengine/libraw/RawSpeed/rawspeed.samsung-decoder.patch b/rtengine/libraw/RawSpeed/rawspeed.samsung-decoder.patch new file mode 100644 index 000000000..f62754a83 --- /dev/null +++ b/rtengine/libraw/RawSpeed/rawspeed.samsung-decoder.patch @@ -0,0 +1,39 @@ +diff --git a/RawSpeed/SrwDecoder.cpp b/RawSpeed/SrwDecoder.cpp +index fa46499..1aff689 100644 +--- a/RawSpeed/SrwDecoder.cpp ++++ b/RawSpeed/SrwDecoder.cpp +@@ -141,7 +141,7 @@ void SrwDecoder::decodeCompressed( TiffIFD* raw ) + // First we decode even pixels + for (int c = 0; c < 16; c += 2) { + int b = len[(c >> 3)]; +- int32 adj = ((int32) bits.getBits(b) << (32-b) >> (32-b)); ++ int32 adj = b > 0 ? ((int32) bits.getBits(b) << (32-b) >> (32-b)) :0; + img[c] = adj + img_up[c]; + } + // Now we decode odd pixels +@@ -149,7 +149,7 @@ void SrwDecoder::decodeCompressed( TiffIFD* raw ) + // is beyond me, it will hurt compression a deal. + for (int c = 1; c < 16; c += 2) { + int b = len[2 | (c >> 3)]; +- int32 adj = ((int32) bits.getBits(b) << (32-b) >> (32-b)); ++ int32 adj = b > 0 ? ((int32) bits.getBits(b) << (32-b) >> (32-b)) :0; + img[c] = adj + img_up2[c]; + } + } else { +@@ -158,14 +158,14 @@ void SrwDecoder::decodeCompressed( TiffIFD* raw ) + int pred_left = x ? img[-2] : 128; + for (int c = 0; c < 16; c += 2) { + int b = len[(c >> 3)]; +- int32 adj = ((int32) bits.getBits(b) << (32-b) >> (32-b)); ++ int32 adj = b > 0 ? ((int32) bits.getBits(b) << (32-b) >> (32-b)) :0; + img[c] = adj + pred_left; + } + // Now we decode odd pixels + pred_left = x ? img[-1] : 128; + for (int c = 1; c < 16; c += 2) { + int b = len[2 | (c >> 3)]; +- int32 adj = ((int32) bits.getBits(b) << (32-b) >> (32-b)); ++ int32 adj = b > 0 ? ((int32) bits.getBits(b) << (32-b) >> (32-b)) :0; + img[c] = adj + pred_left; + } + } diff --git a/rtengine/libraw/RawSpeed/rawspeed.uncompressed-color-dng.patch b/rtengine/libraw/RawSpeed/rawspeed.uncompressed-color-dng.patch new file mode 100644 index 000000000..ebabdfd08 --- /dev/null +++ b/rtengine/libraw/RawSpeed/rawspeed.uncompressed-color-dng.patch @@ -0,0 +1,13 @@ +diff --git a/RawSpeed/DngDecoder.cpp b/RawSpeed/DngDecoder.cpp +index 56c701b..98f2474 100644 +--- a/RawSpeed/DngDecoder.cpp ++++ b/RawSpeed/DngDecoder.cpp +@@ -216,7 +216,7 @@ RawImage DngDecoder::decodeRawInternal() { + if (bps != 8 && bps != 16) + big_endian = true; + try { +- readUncompressedRaw(in, size, pos, width*bps / 8, bps, big_endian ? BitOrder_Jpeg : BitOrder_Plain); ++ readUncompressedRaw(in, size, pos, mRaw->getCpp()*width*bps / 8, bps, big_endian ? BitOrder_Jpeg : BitOrder_Plain); + } catch(IOException &ex) { + if (i > 0) + mRaw->setError(ex.what()); diff --git a/rtengine/libraw/RawSpeed/rawspeed.win32-dll.patch b/rtengine/libraw/RawSpeed/rawspeed.win32-dll.patch new file mode 100644 index 000000000..4cb90194a --- /dev/null +++ b/rtengine/libraw/RawSpeed/rawspeed.win32-dll.patch @@ -0,0 +1,186 @@ +diff --git a/RawSpeed/Camera.h b/RawSpeed/Camera.h +index 7b3045d..4363c1b 100644 +--- a/RawSpeed/Camera.h ++++ b/RawSpeed/Camera.h +@@ -6,6 +6,7 @@ + #include + #include "BlackArea.h" + #include "CameraMetadataException.h" ++#include "dlldef.h" + /* + RawSpeed - RAW file decoder. + +@@ -30,7 +31,7 @@ + + namespace RawSpeed { + +-class Camera ++class DllDef Camera + { + public: + Camera(xmlDocPtr doc, xmlNodePtr cur); +diff --git a/RawSpeed/CameraMetaData.h b/RawSpeed/CameraMetaData.h +index 616b2bb..c6b8031 100644 +--- a/RawSpeed/CameraMetaData.h ++++ b/RawSpeed/CameraMetaData.h +@@ -27,9 +27,10 @@ + http://www.klauspost.com + */ + ++#include "dlldef.h" + namespace RawSpeed { + +-class CameraMetaData ++class DllDef CameraMetaData + { + public: + CameraMetaData(); +diff --git a/RawSpeed/CameraMetadataException.h b/RawSpeed/CameraMetadataException.h +index 55a2814..52d5ea1 100644 +--- a/RawSpeed/CameraMetadataException.h ++++ b/RawSpeed/CameraMetadataException.h +@@ -22,10 +22,11 @@ + #ifndef CAMERA_METADATA_EXCEPTION_H + #define CAMERA_METADATA_EXCEPTION_H + ++#include "dlldef.h" + + namespace RawSpeed { + +-void ThrowCME(const char* fmt, ...); ++void DllDef ThrowCME(const char* fmt, ...); + + class CameraMetadataException : + public std::runtime_error +diff --git a/RawSpeed/FileMap.h b/RawSpeed/FileMap.h +index 5c15918..bcd2a79 100644 +--- a/RawSpeed/FileMap.h ++++ b/RawSpeed/FileMap.h +@@ -25,6 +25,7 @@ + */ + + #include "IOException.h" ++#include "dlldef.h" + + namespace RawSpeed { + +@@ -36,7 +37,7 @@ namespace RawSpeed { + * This can also be done as a MemMap + * + *****************************/ +-class FileMap ++class DllDef FileMap + { + public: + FileMap(uint32 _size); // Allocates the data array itself +diff --git a/RawSpeed/FileReader.h b/RawSpeed/FileReader.h +index 7448ec2..fb42ac0 100644 +--- a/RawSpeed/FileReader.h ++++ b/RawSpeed/FileReader.h +@@ -24,10 +24,11 @@ + + #include "FileIOException.h" + #include "FileMap.h" ++#include "dlldef.h" + + namespace RawSpeed { + +-class FileReader ++class DllDef FileReader + { + public: + FileReader(LPCWSTR filename); +diff --git a/RawSpeed/RawDecoder.h b/RawSpeed/RawDecoder.h +index a6c4708..b35cae5 100644 +--- a/RawSpeed/RawDecoder.h ++++ b/RawSpeed/RawDecoder.h +@@ -9,6 +9,7 @@ + #include "BitPumpPlain.h" + #include "CameraMetaData.h" + #include "TiffIFD.h" ++#include "dlldef.h" + + /* + RawSpeed - RAW file decoder. +@@ -48,7 +49,7 @@ class RawDecoderThread + RawDecoder* parent; + }; + +-class RawDecoder ++class DllDef RawDecoder + { + public: + /* Construct decoder instance - FileMap is a filemap of the file to be decoded */ +diff --git a/RawSpeed/RawImage.h b/RawSpeed/RawImage.h +index 5741760..74cea96 100644 +--- a/RawSpeed/RawImage.h ++++ b/RawSpeed/RawImage.h +@@ -26,13 +26,15 @@ + http://www.klauspost.com + */ + ++#include "dlldef.h" ++ + namespace RawSpeed { + + class RawImage; + class RawImageWorker; + typedef enum {TYPE_USHORT16, TYPE_FLOAT32} RawImageType; + +-class RawImageData ++class DllDef RawImageData + { + friend class RawImageWorker; + public: +@@ -125,7 +127,7 @@ protected: + int end_y; + }; + +- class RawImage { ++ class DllDef RawImage { + public: + static RawImage create(RawImageType type = TYPE_USHORT16); + static RawImage create(iPoint2D dim, RawImageType type = TYPE_USHORT16, uint32 componentsPerPixel = 1); +diff --git a/RawSpeed/RawParser.h b/RawSpeed/RawParser.h +index 9ef86e3..1b3cb83 100644 +--- a/RawSpeed/RawParser.h ++++ b/RawSpeed/RawParser.h +@@ -25,10 +25,11 @@ + + #include "FileMap.h" + #include "RawDecoder.h" ++#include "dlldef.h" + + namespace RawSpeed { + +-class RawParser ++class DllDef RawParser + { + public: + RawParser(FileMap* input); +diff --git a/RawSpeed/dlldef.h b/RawSpeed/dlldef.h +new file mode 100644 +index 0000000..c806451 +--- /dev/null ++++ b/RawSpeed/dlldef.h +@@ -0,0 +1,20 @@ ++#ifndef DLLDEF_H ++#define DLLDEF_H ++ ++#ifdef _WIN32 ++#ifdef _MSC_VER ++#pragma warning( disable: 4251 ) ++#endif ++#ifdef RAWSPEED_NODLL ++# define DllDef ++#else ++# ifdef RAWSPEED_BUILDLIB ++# define DllDef __declspec( dllexport ) ++# else ++# define DllDef __declspec( dllimport ) ++# endif ++#endif ++#else ++# define DllDef ++#endif ++#endif diff --git a/rtengine/libraw/RawSpeed/rawspeed_xmldata.cpp b/rtengine/libraw/RawSpeed/rawspeed_xmldata.cpp new file mode 100644 index 000000000..9e629ccb6 --- /dev/null +++ b/rtengine/libraw/RawSpeed/rawspeed_xmldata.cpp @@ -0,0 +1,4115 @@ +const char *_rawspeed_data_xml[]={ +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"\n", +"]>\n", +"\n", +"\n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" Canon EOS REBEL SL1\n", +" Canon EOS Kiss X7\n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" Canon EOS DIGITAL REBEL XT\n", +" Canon EOS Kiss Digital N\n", +" Canon EOS 350D\n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" Canon EOS DIGITAL REBEL XSi\n", +" Canon EOS Kiss Digital X2\n", +" Canon EOS Kiss X2\n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" Canon EOS REBEL T5i\n", +" Canon EOS Kiss X7i\n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" Canon EOS REBEL T1i\n", +" Canon EOS Kiss X3\n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" Canon EOS REBEL T2i\n", +" Canon EOS Kiss X4\n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" Canon EOS REBEL T3i\n", +" Canon EOS Kiss X5\n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" Canon EOS REBEL T4i\n", +" Canon EOS Kiss X6i\n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" Canon EOS DIGITAL REBEL XS\n", +" Canon EOS Kiss Digital F\n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" Canon EOS REBEL T3\n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" Canon EOS REBEL T5\n", +" Canon EOS Kiss X70\n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" Canon EOS DIGITAL REBEL XTi\n", +" Canon EOS Kiss Digital X\n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" NIKON D800E\n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +"\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +"\t\t\t\t\n", +"\t\t\t\t\t\t\t\t\n", +"\t\t\t\t\t\t\t\t\t\t\t\tRED\n", +"\t\t\t\t\t\t\t\t\t\t\t\tGREEN\n", +"\t\t\t\t\t\t\t\t\t\t\t\tGREEN\n", +"\t\t\t\t\t\t\t\t\t\t\t\tBLUE\n", +"\t\t\t\t\t\t\t\t\n", +"\t\t\t\t\t\t\t\t\n", +"\t\t\t\t\t\t\t\t\n", +"\t\t\t\t\n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" DMC-FZ38\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" DMC-FZ38\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" DMC-FZ40\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" DMC-FZ40\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" DMC-FZ72\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" DMC-FZ72\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +"\n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" BLUE\n", +" RED\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" GREEN\n", +" RED\n", +" BLUE\n", +" GREEN\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" BLUE\n", +" GREEN\n", +" GREEN\n", +" RED\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" RED\n", +" GREEN\n", +" GREEN\n", +" BLUE\n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +" \n", +"\n", +0 +}; diff --git a/rtengine/libraw/RawSpeed3/README.md b/rtengine/libraw/RawSpeed3/README.md new file mode 100644 index 000000000..9b4b80ca5 --- /dev/null +++ b/rtengine/libraw/RawSpeed3/README.md @@ -0,0 +1,70 @@ +# About RawSpeed v3 + +The current version of the RawSpeed library (https://github.com/darktable-org/rawspeed ) does not have a version number, we call it "version 3" to distinguish it from RawSpeed/master, the version number is taken from darktable 3.x (which uses this library). + +This library provides faster decoding of some RAW formats (even faster than RawSpeed v1), the difference can be tens of percent (without using OpenMP) for Huffman-compressed files (Canon CR2, Nikon NEF, etc). + +Unfortunately, the RawSpeed-v3 source code is constantly changing and this is due not so much to the development of the library (support for new cameras, formats, etc.), but to the fact that the current maintainer is using it as an aid in self-development as a programmer. + +They are extremely reluctant to accept 3rd-party patches to this library, therefore, the fixes necessary for correct work with LibRaw have been added to the LibRaw distribution (see below). All our patches, of course, are suitable only for a specific version (commit-id) of RawSpeed-v3, if you want to use a different version, you will have to adjust them. + +# Building RawSpeed v3 and C-API wrapper + +## Preparing the source +1. Take a specific commit from github + https://github.com/darktable-org/rawspeed/commit/de70ef5fbc62cde91009c8cff7a206272abe631e + +2. Apply the following patches from LibRaw/RawSpeed3/patches folder: + * **01.CameraMeta-extensibility.patch** - allows derived classes from CameraMeta, which allows loading camera descriptions not only from a disk file. + * **02.Makernotes-processing.patch** - fixes an error in processing the Makernotes tag. + * **03.remove-limits-and-logging.patch** - removes debug printing and file size limits. This patch is optional, but if you are going to decode files from cameras that were not available at the time a particular version of RawSpeed was created, then this patch can be useful. + * **04.clang-cl-compatibility.patch -** fixes for compatibility with Microsoft C++ library. + * **05.no-phase-one-correction.patch -** disables RawSpeed's PhaseOne flat field correction because LibRaw implements own + +## Building the RawSpeed-v3 library + +We **do not** offer advice on building RawSpeed3, if you need such advice please contact the maintainer of the library. At a minimum, it **can be** compiled with Clang (XCode) on macOS and clang-cl (MSVC) on Windows. + +Use your favorite build system. Files for CMake come with RawSpeed, but any other build system can be used (in that case you probably will need to create your own rawspeedconfig.h instead of one created via CMake). + +In our projects we use RawSpeed-v3 without OpenMP. + +## Building the C-API wrapper +To simplify the integration with LibRaw, we have implemented a simple wrapper with a C interface, which hides everything unnecessary, thus: +* To build LibRaw (with RawSpeed-v3 support) you do not need access to RawSpeed .h-files +* When building LibRaw and RawSpeed-v3 using different compilers there is no issue with C++ name mangling. + +The wrapper sources are in the **LibRaw/RawSpeed3/rawspeed3_c_api folder**, they include four files: +1. **rawspeed3_capi.h** - header file +2. **rawspeed3_capi.cpp** - wrapper sources +3. **rsxml2c.sh** - shell script that will convert RawSpeed/data/cameras.xml to a C++ file containing camera definitions +4. **rawspeed3_capi_test.cpp** - test program for checking the build correctness and operation ability. + +The wrapper provides simple *decode only* interface (init library, decode RAW passed via buffer, free decoded file buffer, release the library) it is self-documented via comments in the rawspeed3_capi.h file. + +To make a file with camera definitions, run the command (you can add it to the build system): +`sh ./rawspeed3_c_api/rsxml2c.sh < path/to/RawSpeed/data/cameras.xml > rawspeed3_c_api/cameras.cpp` + +The **rsxml2c.sh** script requires **cat**, **tr**, and **sed** unix command-line utilities installed, there is no specific version requirements. + +Add the resulting file (LibRaw/RawSpeed3/rawspeed3_c_api/cameras.cpp) and LibRaw/RawSpeed3/rawspeed3_c_api/rawspeed3_capi.cpp, to the build of the RawSpeed-v3 (dynamic) library, which you learned to build in the previous step. +If building Windows DLL: rawspeed3_capi.cpp should be compiled with -DRAWSPEED_BUILDLIB to create dll export entries automatically. + +To check that everything works, you can use the LibRaw/RawSpeed3/rawspeed3_c_api/rawspeed3_capi_test.cpp test program, it should be possible to build it and link with RawSpeed-v3 (+ C-API); and after that this test program should be ready to decode RAW files passed to it from command line. + +# Building LibRaw with RawSpeed-v3 support +When building, specify the following parameters +* LibRaw/RawSpeed3/rawspeed3_c_api to the search path for include files +* Specify preprocessor flags -DUSE_RAWSPEED3 -DUSE_RAWSPEED_BITS: + * USE_RAWSPEED3 enables the use of RawSpeed-v3 + * USE_RAWSPEED_BITS enables (a more granulated) control of RawSpeed-v3 / RawSpeed processing +* set the RawSpeed-v3 (+ C-API) library, obtained in the previous steps, as an input linker file + +# Using LibRaw with RawSpeed-v3 Support +Use LibRaw as usual. Enable RawSpeed3 use by setting bits in imgdata.rawparams.userawspeed (LIBRAW_RAWSPEEDV3_USE, LIBRAW_RAWSPEEDV3_IGNOREERRORS, LIBRAW_RAWSPEEDV3_FAILONUNKNOWN) +If RawSpeed was set as the decoder the following bits will be set in imgdata.processwarnings: +* LIBRAW_WARN_RAWSPEED3_PROCESSED - if decoding was successful +* LIBRAW_WARN_RAWSPEED3_PROBLEM - if decoding attempt failed +(flags and bits are described in LibRaw's Changelog) + +With RawSpeed-v3, the entire RAW file is read into the memory buffer (as it is with RawSpeed version 1), so it increases LibRaw memory footprint. diff --git a/rtengine/libraw/RawSpeed3/patches/01.CameraMeta-extensibility.patch b/rtengine/libraw/RawSpeed3/patches/01.CameraMeta-extensibility.patch new file mode 100644 index 000000000..1ee6057e2 --- /dev/null +++ b/rtengine/libraw/RawSpeed3/patches/01.CameraMeta-extensibility.patch @@ -0,0 +1,13 @@ +diff --git a/src/librawspeed/metadata/CameraMetaData.h b/src/librawspeed/metadata/CameraMetaData.h +index c2f6f1dd..13cab9c9 100644 +--- a/src/librawspeed/metadata/CameraMetaData.h ++++ b/src/librawspeed/metadata/CameraMetaData.h +@@ -41,7 +41,7 @@ struct CameraId { + } + }; + +-class CameraMetaData { ++class CameraMetaData final { + public: + CameraMetaData() = default; + diff --git a/rtengine/libraw/RawSpeed3/patches/02.Makernotes-processing.patch b/rtengine/libraw/RawSpeed3/patches/02.Makernotes-processing.patch new file mode 100644 index 000000000..25e7b13f3 --- /dev/null +++ b/rtengine/libraw/RawSpeed3/patches/02.Makernotes-processing.patch @@ -0,0 +1,36 @@ +diff --git a/src/librawspeed/tiff/TiffIFD.cpp b/src/librawspeed/tiff/TiffIFD.cpp +index e732eae2..05251dd9 100644 +--- a/src/librawspeed/tiff/TiffIFD.cpp ++++ b/src/librawspeed/tiff/TiffIFD.cpp +@@ -143,6 +143,7 @@ TiffRootIFDOwner TiffIFD::parseMakerNote(NORangesSet* ifds, + string make = makeEntry != nullptr ? trimSpaces(makeEntry->getString()) : ""; + + ByteStream bs = t->getData(); ++ auto bufbegin = bs.begin() + bs.getPosition(); + + // helper function for easy setup of ByteStream buffer for the different maker note types + // 'rebase' means position 0 of new stream equals current position +@@ -159,7 +160,9 @@ TiffRootIFDOwner TiffIFD::parseMakerNote(NORangesSet* ifds, + bs.skipBytes(newPosition); + }; + +- if (bs.hasPrefix("AOC\0", 4)) { ++ if (bs.hasPrefix("LSI1\0", 5)) { // Skip LSI1 makernotes ++ return std::make_unique(this, ifds, bs, UINT32_MAX); // UINT32_MAX offset => special handling, empty IFD ++ } else if (bs.hasPrefix("AOC\0", 4)) { + setup(false, 6, 4, "Pentax makernote"); + } else if (bs.hasPrefix("PENTAX", 6)) { + setup(true, 10, 8, "Pentax makernote"); +@@ -197,6 +200,12 @@ TiffRootIFDOwner TiffIFD::parseMakerNote(NORangesSet* ifds, + } + } + ++ auto readed = bs.begin() - bufbegin + bs.getPosition(); ++ ByteStream bscheck(bs); ++ const auto IFDSize = 6 + 12 * bscheck.getU16(); ++ ++ if(IFDSize > t->count - readed) // IFDSize too big, probably binary Makernotes dir, not TIFF-like, could not be handled by TiffRootIFD reader ++ return std::make_unique(this, ifds, bs, UINT32_MAX); // // UINT32_MAX offset => special handling, empty IFD + // Attempt to parse the rest as an IFD + return std::make_unique(this, ifds, bs, bs.getPosition()); + } diff --git a/rtengine/libraw/RawSpeed3/patches/03.remove-limits-and-logging.patch b/rtengine/libraw/RawSpeed3/patches/03.remove-limits-and-logging.patch new file mode 100644 index 000000000..c1fb7b591 --- /dev/null +++ b/rtengine/libraw/RawSpeed3/patches/03.remove-limits-and-logging.patch @@ -0,0 +1,245 @@ +diff --git a/src/librawspeed/common/Common.cpp b/src/librawspeed/common/Common.cpp +index 8c8c5663..d9b5e463 100644 +--- a/src/librawspeed/common/Common.cpp ++++ b/src/librawspeed/common/Common.cpp +@@ -36,6 +36,7 @@ writeLog(DEBUG_PRIO priority, const char* format, ...) { + #else + + void writeLog(DEBUG_PRIO priority, const char* format, ...) { ++#if 0 + #ifndef _DEBUG + if (priority < DEBUG_PRIO_INFO) + #endif // _DEBUG +@@ -55,6 +56,7 @@ void writeLog(DEBUG_PRIO priority, const char* format, ...) { + if (priority < DEBUG_PRIO_INFO) + #endif // _DEBUG + fprintf(stdout, "%s", "\n"); ++#endif + } + + #endif +diff --git a/src/librawspeed/common/RawspeedException.h b/src/librawspeed/common/RawspeedException.h +index 33b9cc29..a9f503a7 100644 +--- a/src/librawspeed/common/RawspeedException.h ++++ b/src/librawspeed/common/RawspeedException.h +@@ -45,12 +45,13 @@ template + "Don't have thread-local-storage! Exception text may be garbled if used multithreaded" + static char buf[bufSize]; + #endif +- ++#if 0 + va_list val; + va_start(val, fmt); + vsnprintf(buf.data(), sizeof(buf), fmt, val); + va_end(val); + writeLog(DEBUG_PRIO_EXTRA, "EXCEPTION: %s", buf.data()); ++#endif + throw T(buf.data()); + } + +diff --git a/src/librawspeed/decoders/ArwDecoder.cpp b/src/librawspeed/decoders/ArwDecoder.cpp +index f1d5a63c..2025d260 100644 +--- a/src/librawspeed/decoders/ArwDecoder.cpp ++++ b/src/librawspeed/decoders/ArwDecoder.cpp +@@ -186,8 +186,8 @@ RawImage ArwDecoder::decodeRawInternal() { + } + } + +- if (width == 0 || height == 0 || height % 2 != 0 || width > 9600 || +- height > 6376) ++ if (width == 0 || height == 0 || height % 2 != 0 /* || width > 9600 || ++ height > 6376 */) + ThrowRDE("Unexpected image dimensions found: (%u; %u)", width, height); + + bool arw1 = uint64_t(counts->getU32()) * 8 != width * height * bitPerPixel; +@@ -241,7 +241,7 @@ void ArwDecoder::DecodeUncompressed(const TiffIFD* raw) { + + mRaw->dim = iPoint2D(width, height); + +- if (width == 0 || height == 0 || width > 9600 || height > 6376) ++ if (width == 0 || height == 0 /* || width > 9600 || height > 6376 */) + ThrowRDE("Unexpected image dimensions found: (%u; %u)", width, height); + + if (c2 == 0) +diff --git a/src/librawspeed/decoders/IiqDecoder.cpp b/src/librawspeed/decoders/IiqDecoder.cpp +index 31c460d9..61b04e1a 100644 +--- a/src/librawspeed/decoders/IiqDecoder.cpp ++++ b/src/librawspeed/decoders/IiqDecoder.cpp +@@ -185,7 +185,7 @@ RawImage IiqDecoder::decodeRawInternal() { + } + + // FIXME: could be wrong. max "active pixels" in "Sensor+" mode - "101 MP" +- if (width == 0 || height == 0 || width > 11976 || height > 8854) ++ if (width == 0 || height == 0 /* || width > 11976 || height > 8854 */) + ThrowRDE("Unexpected image dimensions found: (%u; %u)", width, height); + + if (split_col > width || split_row > height) +diff --git a/src/librawspeed/decoders/MosDecoder.cpp b/src/librawspeed/decoders/MosDecoder.cpp +index 9f01a11c..db4b8f50 100644 +--- a/src/librawspeed/decoders/MosDecoder.cpp ++++ b/src/librawspeed/decoders/MosDecoder.cpp +@@ -113,7 +113,7 @@ RawImage MosDecoder::decodeRawInternal() { + uint32_t height = raw->getEntry(IMAGELENGTH)->getU32(); + + // FIXME: could be wrong. max "active pixels" - "80 MP" +- if (width == 0 || height == 0 || width > 10328 || height > 7760) ++ if (width == 0 || height == 0 /* || width > 10328 || height > 7760 */) + ThrowRDE("Unexpected image dimensions found: (%u; %u)", width, height); + + mRaw->dim = iPoint2D(width, height); +diff --git a/src/librawspeed/decoders/NefDecoder.cpp b/src/librawspeed/decoders/NefDecoder.cpp +index 222c62f0..7314ca15 100644 +--- a/src/librawspeed/decoders/NefDecoder.cpp ++++ b/src/librawspeed/decoders/NefDecoder.cpp +@@ -214,7 +214,7 @@ void NefDecoder::DecodeUncompressed() { + + mRaw->dim = iPoint2D(width, height); + +- if (width == 0 || height == 0 || width > 8288 || height > 5520) ++ if (width == 0 || height == 0 /* || width > 8288 || height > 5520 */) + ThrowRDE("Unexpected image dimensions found: (%u; %u)", width, height); + + if (counts->count != offsets->count) { +@@ -370,8 +370,8 @@ void NefDecoder::DecodeSNefUncompressed() { + uint32_t width = raw->getEntry(IMAGEWIDTH)->getU32(); + uint32_t height = raw->getEntry(IMAGELENGTH)->getU32(); + +- if (width == 0 || height == 0 || width % 2 != 0 || width > 3680 || +- height > 2456) ++ if (width == 0 || height == 0 || width % 2 != 0 /* || width > 3680 || ++ height > 2456 */) + ThrowRDE("Unexpected image dimensions found: (%u; %u)", width, height); + + mRaw->dim = iPoint2D(width, height); +diff --git a/src/librawspeed/decoders/OrfDecoder.cpp b/src/librawspeed/decoders/OrfDecoder.cpp +index 7eb1a901..de557d5f 100644 +--- a/src/librawspeed/decoders/OrfDecoder.cpp ++++ b/src/librawspeed/decoders/OrfDecoder.cpp +@@ -109,7 +109,7 @@ RawImage OrfDecoder::decodeRawInternal() { + uint32_t width = raw->getEntry(IMAGEWIDTH)->getU32(); + uint32_t height = raw->getEntry(IMAGELENGTH)->getU32(); + +- if (!width || !height || width % 2 != 0 || width > 10400 || height > 7796) ++ if (!width || !height || width % 2 != 0 /* || width > 10400 || height > 7796 */ ) + ThrowRDE("Unexpected image dimensions found: (%u; %u)", width, height); + + mRaw->dim = iPoint2D(width, height); +diff --git a/src/librawspeed/decoders/RafDecoder.cpp b/src/librawspeed/decoders/RafDecoder.cpp +index 5baf02b9..27e67e7a 100644 +--- a/src/librawspeed/decoders/RafDecoder.cpp ++++ b/src/librawspeed/decoders/RafDecoder.cpp +@@ -79,7 +79,7 @@ RawImage RafDecoder::decodeRawInternal() { + } else + ThrowRDE("Unable to locate image size"); + +- if (width == 0 || height == 0 || width > 11808 || height > 8754) ++ if (width == 0 || height == 0 /* || width > 11808 || height > 8754 */ ) + ThrowRDE("Unexpected image dimensions found: (%u; %u)", width, height); + + if (raw->hasEntry(FUJI_LAYOUT)) { +@@ -334,7 +334,7 @@ int RafDecoder::isCompressed() { + } else + ThrowRDE("Unable to locate image size"); + +- if (width == 0 || height == 0 || width > 11808 || height > 8754) ++ if (width == 0 || height == 0 /* || width > 11808 || height > 8754 */) + ThrowRDE("Unexpected image dimensions found: (%u; %u)", width, height); + + uint32_t count = raw->getEntry(FUJI_STRIPBYTECOUNTS)->getU32(); +diff --git a/src/librawspeed/decoders/RawDecoder.cpp b/src/librawspeed/decoders/RawDecoder.cpp +index a69727f6..e5315a42 100644 +--- a/src/librawspeed/decoders/RawDecoder.cpp ++++ b/src/librawspeed/decoders/RawDecoder.cpp +@@ -62,7 +62,7 @@ void RawDecoder::decodeUncompressed(const TiffIFD *rawIFD, BitOrder order) { + uint32_t height = rawIFD->getEntry(IMAGELENGTH)->getU32(); + uint32_t bitPerPixel = rawIFD->getEntry(BITSPERSAMPLE)->getU32(); + +- if (width == 0 || height == 0 || width > 5632 || height > 3720) ++ if (width == 0 || height == 0 /* || width > 5632 || height > 3720 */) + ThrowRDE("Unexpected image dimensions found: (%u; %u)", width, height); + + mRaw->dim = iPoint2D(width, height); +diff --git a/src/librawspeed/decoders/Rw2Decoder.cpp b/src/librawspeed/decoders/Rw2Decoder.cpp +index 0e9d111d..a54de998 100644 +--- a/src/librawspeed/decoders/Rw2Decoder.cpp ++++ b/src/librawspeed/decoders/Rw2Decoder.cpp +@@ -72,7 +72,7 @@ RawImage Rw2Decoder::decodeRawInternal() { + uint32_t width = raw->getEntry(static_cast(2))->getU16(); + + if (isOldPanasonic) { +- if (width == 0 || height == 0 || width > 4330 || height > 2751) ++ if (width == 0 || height == 0 /* || width > 4330 || height > 2751 */) + ThrowRDE("Unexpected image dimensions found: (%u; %u)", width, height); + + TiffEntry *offsets = raw->getEntry(STRIPOFFSETS); +diff --git a/src/librawspeed/decompressors/HasselbladDecompressor.cpp b/src/librawspeed/decompressors/HasselbladDecompressor.cpp +index 0d650065..aaa70fb5 100644 +--- a/src/librawspeed/decompressors/HasselbladDecompressor.cpp ++++ b/src/librawspeed/decompressors/HasselbladDecompressor.cpp +@@ -41,8 +41,8 @@ HasselbladDecompressor::HasselbladDecompressor(const ByteStream& bs, + ThrowRDE("Unexpected component count / data type"); + + // FIXME: could be wrong. max "active pixels" - "100 MP" +- if (mRaw->dim.x == 0 || mRaw->dim.y == 0 || mRaw->dim.x % 2 != 0 || +- mRaw->dim.x > 12000 || mRaw->dim.y > 8816) { ++ if (mRaw->dim.x == 0 || mRaw->dim.y == 0 || mRaw->dim.x % 2 != 0 /* || ++ mRaw->dim.x > 12000 || mRaw->dim.y > 8816 */) { + ThrowRDE("Unexpected image dimensions found: (%u; %u)", mRaw->dim.x, + mRaw->dim.y); + } +diff --git a/src/librawspeed/decompressors/NikonDecompressor.cpp b/src/librawspeed/decompressors/NikonDecompressor.cpp +index ca39cd0a..54568243 100644 +--- a/src/librawspeed/decompressors/NikonDecompressor.cpp ++++ b/src/librawspeed/decompressors/NikonDecompressor.cpp +@@ -442,8 +442,8 @@ NikonDecompressor::NikonDecompressor(const RawImage& raw, ByteStream metadata, + mRaw->getBpp() != sizeof(uint16_t)) + ThrowRDE("Unexpected component count / data type"); + +- if (mRaw->dim.x == 0 || mRaw->dim.y == 0 || mRaw->dim.x % 2 != 0 || +- mRaw->dim.x > 8288 || mRaw->dim.y > 5520) ++ if (mRaw->dim.x == 0 || mRaw->dim.y == 0 || mRaw->dim.x % 2 != 0 /* || ++ mRaw->dim.x > 8288 || mRaw->dim.y > 5520 */) + ThrowRDE("Unexpected image dimensions found: (%u; %u)", mRaw->dim.x, + mRaw->dim.y); + +diff --git a/src/librawspeed/decompressors/OlympusDecompressor.cpp b/src/librawspeed/decompressors/OlympusDecompressor.cpp +index b859b562..dc8aa0bc 100644 +--- a/src/librawspeed/decompressors/OlympusDecompressor.cpp ++++ b/src/librawspeed/decompressors/OlympusDecompressor.cpp +@@ -56,7 +56,7 @@ OlympusDecompressor::OlympusDecompressor(const RawImage& img) : mRaw(img) { + const uint32_t w = mRaw->dim.x; + const uint32_t h = mRaw->dim.y; + +- if (w == 0 || h == 0 || w % 2 != 0 || w > 10400 || h > 7792) ++ if (w == 0 || h == 0 || w % 2 != 0 /* || w > 10400 || h > 7792 */) + ThrowRDE("Unexpected image dimensions found: (%u; %u)", w, h); + } + +diff --git a/src/librawspeed/decompressors/PentaxDecompressor.cpp b/src/librawspeed/decompressors/PentaxDecompressor.cpp +index 11b1d677..c2adc2e6 100644 +--- a/src/librawspeed/decompressors/PentaxDecompressor.cpp ++++ b/src/librawspeed/decompressors/PentaxDecompressor.cpp +@@ -49,8 +49,8 @@ PentaxDecompressor::PentaxDecompressor(const RawImage& img, + mRaw->getBpp() != sizeof(uint16_t)) + ThrowRDE("Unexpected component count / data type"); + +- if (!mRaw->dim.x || !mRaw->dim.y || mRaw->dim.x % 2 != 0 || +- mRaw->dim.x > 8384 || mRaw->dim.y > 6208) { ++ if (!mRaw->dim.x || !mRaw->dim.y || mRaw->dim.x % 2 != 0 /* || ++ mRaw->dim.x > 8384 || mRaw->dim.y > 6208 */) { + ThrowRDE("Unexpected image dimensions found: (%u; %u)", mRaw->dim.x, + mRaw->dim.y); + } +diff --git a/src/librawspeed/decompressors/SonyArw2Decompressor.cpp b/src/librawspeed/decompressors/SonyArw2Decompressor.cpp +index 8f935d9c..3cbc7e26 100644 +--- a/src/librawspeed/decompressors/SonyArw2Decompressor.cpp ++++ b/src/librawspeed/decompressors/SonyArw2Decompressor.cpp +@@ -45,7 +45,7 @@ SonyArw2Decompressor::SonyArw2Decompressor(const RawImage& img, + const uint32_t w = mRaw->dim.x; + const uint32_t h = mRaw->dim.y; + +- if (w == 0 || h == 0 || w % 32 != 0 || w > 9600 || h > 6376) ++ if (w == 0 || h == 0 || w % 32 != 0 /* || w > 9600 || h > 6376 */) + ThrowRDE("Unexpected image dimensions found: (%u; %u)", w, h); + + // 1 byte per pixel diff --git a/rtengine/libraw/RawSpeed3/patches/04.clang-cl-compatibility.patch b/rtengine/libraw/RawSpeed3/patches/04.clang-cl-compatibility.patch new file mode 100644 index 000000000..b4879d068 --- /dev/null +++ b/rtengine/libraw/RawSpeed3/patches/04.clang-cl-compatibility.patch @@ -0,0 +1,37 @@ +diff --git a/src/librawspeed/common/DefaultInitAllocatorAdaptor.h b/src/librawspeed/common/DefaultInitAllocatorAdaptor.h +index 2ff8969e..fa18c312 100644 +--- a/src/librawspeed/common/DefaultInitAllocatorAdaptor.h ++++ b/src/librawspeed/common/DefaultInitAllocatorAdaptor.h +@@ -27,8 +27,12 @@ + namespace rawspeed { + + template , +- typename = std::enable_if_t::value>> +-class DefaultInitAllocatorAdaptor { ++#ifdef _MSC_VER ++ typename = std::enable_if_t> ++#else ++ typename = std::enable_if_t::value >> ++#endif ++ class DefaultInitAllocatorAdaptor { + public: + using allocator_traits = std::allocator_traits; + +diff --git a/src/librawspeed/decompressors/VC5Decompressor.cpp b/src/librawspeed/decompressors/VC5Decompressor.cpp +index c498ac3a..de4ae412 100644 +--- a/src/librawspeed/decompressors/VC5Decompressor.cpp ++++ b/src/librawspeed/decompressors/VC5Decompressor.cpp +@@ -398,7 +398,12 @@ VC5Decompressor::VC5Decompressor(ByteStream bs, const RawImage& img) + wavelet.height = waveletHeight; + + wavelet.bands.resize( +- &wavelet == channel.wavelets.begin() ? 1 : Wavelet::maxBands); ++#ifdef _MSC_VER ++ Wavelet::maxBands ++#else ++ &wavelet == channel.wavelets.begin() ? 1 : Wavelet::maxBands ++#endif ++ ); + } + } + diff --git a/rtengine/libraw/RawSpeed3/patches/05.no-phase-one-correction.patch b/rtengine/libraw/RawSpeed3/patches/05.no-phase-one-correction.patch new file mode 100644 index 000000000..28fdd3bed --- /dev/null +++ b/rtengine/libraw/RawSpeed3/patches/05.no-phase-one-correction.patch @@ -0,0 +1,16 @@ +diff --git a/src/librawspeed/decoders/IiqDecoder.cpp b/src/librawspeed/decoders/IiqDecoder.cpp +index 61b04e1a..b6113679 100644 +--- a/src/librawspeed/decoders/IiqDecoder.cpp ++++ b/src/librawspeed/decoders/IiqDecoder.cpp +@@ -212,9 +212,10 @@ RawImage IiqDecoder::decodeRawInternal() { + PhaseOneDecompressor p(mRaw, std::move(strips)); + mRaw->createData(); + p.decompress(); +- ++#if 0 + if (correction_meta_data.getSize() != 0 && iiq) + CorrectPhaseOneC(correction_meta_data, split_row, split_col); ++#endif + + for (int i = 0; i < 3; i++) + mRaw->metadata.wbCoeffs[i] = wb.getFloat(); diff --git a/rtengine/libraw/RawSpeed3/rawspeed3_c_api/rawspeed3_capi.cpp b/rtengine/libraw/RawSpeed3/rawspeed3_c_api/rawspeed3_capi.cpp new file mode 100644 index 000000000..1394aeb3c --- /dev/null +++ b/rtengine/libraw/RawSpeed3/rawspeed3_c_api/rawspeed3_capi.cpp @@ -0,0 +1,251 @@ +#include "rawspeed3_capi.h" +#include "RawSpeed-API.h" +#define HAVE_PUGIXML +#include <../pugixml/pugixml.hpp> // for xml_document, xml_pars... + +extern const char* _rawspeed3_data_xml; + +class rawspeed3_handle_data +{ +public: + rawspeed3_handle_data(const char* cameradefs, bool is_file); + void release(); + int decodefile(rawspeed3_ret_t* resultp, const void *data, size_t datasize, bool allowunknown); + ~rawspeed3_handle_data(); +private: + std::unique_ptr cameraMeta; + std::unique_ptr rawParser; + std::unique_ptr rawDecoder; +}; + + +/* API calls */ + +extern "C" +{ + +/* + void rawspeed3_clearresult(rawspeed3_ret_t* r) + + Clears (inits) results structure +*/ +DllDef void rawspeed3_clearresult(rawspeed3_ret_t* r) +{ + if(!r) return; + r->width = r->height = r->bpp = r->cpp = 0; + r->status = rawspeed_inited; + r->pitch = r->filters = 0; + r->pixeldata = nullptr; +} + +/* + rawspeed3_init() + Init rawspeed3 Camera, returns: 0 on failure, pointer to data block on success + Cameradefs: cameras.xml in string (is_file == false) or file (is_file == true) +*/ + +DllDef rawspeed3_handle_t rawspeed3_init(const char* cameradefs, bool is_file) +{ + /* Create rawspeed3_handle_data and return it as void document */ + if(!cameradefs) return nullptr; + try + { + /* code */ + auto *handle = new rawspeed3_handle_data(cameradefs, is_file); + return (void*)handle; + } + catch(const std::exception& e) + { + return nullptr; + } +} + +/* + rawspeed3_initdefault() + Init rawspeed3 Cameradefs with built-in cameras.xml (converted to _rawspeed3_data_xml), + returns: 0 on failure, pointer to data block on success +*/ + +DllDef rawspeed3_handle_t rawspeed3_initdefault() +{ + return rawspeed3_init(_rawspeed3_data_xml,false); +} + +/* + rawspeed3_decodefile(..) + parse/decode RAW file passed via memory + Parameters: + handle - rawspeed3_handle_t => handle created by rawspeed3_init() + resultp -> pointer to rawspeed3_ret_t to be filled with + data -> data buffer with raw file + datasize -> size of this buffer + allowunknown -> allow to process unknown cameras (not listed in cameras.xml) + Return values: + 0 -> OK + >=1 -> decode error + -1 -> Incorrect parameters passed (handle, or data, or datasize) +*/ + +DllDef int rawspeed3_decodefile(rawspeed3_handle_t handle, rawspeed3_ret_t* resultp, + const void *data, size_t datasize, bool allowunknown) +{ + if(!handle || !resultp || !data || datasize > 2UL * 1024UL * 1024UL * 1024UL) + { + if(resultp) + resultp->status = rawspeed3_param_error; + return -1; + } + rawspeed3_clearresult(resultp); + auto *p = static_cast(handle); + return p->decodefile(resultp,data,datasize,allowunknown); +} + +/* + void rawspeed3_release(rawspeed3_handle_t handle) + + release internal raw data buffer and error code; +*/ + +/* release internal raw data buffer and errmessage (if any) */ +DllDef void rawspeed3_release(rawspeed3_handle_t handle) +{ + if(!handle) return; + auto *p = static_cast(handle); + p->release(); +} + +/* close handle: release all internal data */ +DllDef void rawspeed3_close(rawspeed3_handle_t handle) +{ + if(!handle) return; + auto *p = static_cast(handle); + delete p; +} + +} /* extern "C" */ + +// == Implementation + +int rawspeed3_handle_data::decodefile(rawspeed3_ret_t* resultp, + const void *data, size_t datasize, bool allowunknown) +{ + if(!cameraMeta) + { + resultp->status = rawspeed3_not_inited; + return rawspeed3_not_inited; + } + try + { + rawspeed::Buffer buffer( static_cast(data),datasize); + release(); + rawParser = std::make_unique(buffer); + auto d(rawParser->getDecoder(cameraMeta.get())); + if(!d) + { + resultp->status = rawspeed3_no_decoder; + return rawspeed3_no_decoder; + } + + d->applyCrop = false; + d->failOnUnknown = !allowunknown; + d->interpolateBadPixels = false; + d->applyStage1DngOpcodes = false; + d->fujiRotate = false; + d->applyCrop = false; + + try { + d->checkSupport(cameraMeta.get()); + } catch (...) { + release(); + resultp->status = rawspeed3_not_supported; + return resultp->status; + } + + rawspeed::RawImage r = d->mRaw; + d->decodeMetaData(cameraMeta.get()); + + d->checkSupport(cameraMeta.get()); + d->decodeRaw(); + d->decodeMetaData(cameraMeta.get()); + r = d->mRaw; + + rawDecoder = std::move(d); + // we're here w/o exceptions: success + const rawspeed::iPoint2D dimUncropped = r->getUncroppedDim(); + resultp->width = dimUncropped.x; + resultp->height = dimUncropped.y; + resultp->filters = r->cfa.getDcrawFilter(); + resultp->cpp = r->getCpp(); + resultp->bpp = r->getBpp(); + resultp->pitch = r->pitch; + resultp->pixeldata = r->getDataUncropped(0,0); + const auto errors = r->getErrors(); + resultp->status = errors.empty()? rawspeed3_ok : rawspeed3_ok_warnings; + return resultp->status; + /* code */ + } + catch(...) + { + resultp->status = rawspeed3_processing_error; + return rawspeed3_processing_error; + } +} + +namespace rawspeed +{ + class CameraMetaDataFromMem : public CameraMetaData + { + public: + explicit CameraMetaDataFromMem(const char* xmlstring); + }; +} + + +rawspeed3_handle_data::rawspeed3_handle_data(const char* cameradefs, bool is_file) + : rawParser(nullptr) +{ + cameraMeta = is_file ? std::make_unique(cameradefs) + : std::make_unique (cameradefs); +} +rawspeed3_handle_data::~rawspeed3_handle_data() +{ + release(); + cameraMeta.reset(); +} + +void rawspeed3_handle_data::release() +{ + if(rawDecoder) + rawDecoder.reset(); + if (rawParser) + rawParser.reset(); +} + +// Camera metadata from mem +namespace rawspeed +{ + CameraMetaDataFromMem::CameraMetaDataFromMem(const char* document) + { + using pugi::xml_node; + using pugi::xml_document; + using pugi::xml_parse_result; + + xml_document doc; + xml_parse_result result = doc.load_string(document); + + if (!result) + throw "Camera definitions parse error"; + + for (xml_node camera : doc.child("Cameras").children("Camera")) + { + const auto* cam = addCamera(std::make_unique(camera)); + + if (cam == nullptr) + continue; + + // Create cameras for aliases. + for (auto i = 0UL; i < cam->aliases.size(); i++) + addCamera(std::make_unique(cam, i)); + } + } +} // namespace rawspeed diff --git a/rtengine/libraw/RawSpeed3/rawspeed3_c_api/rawspeed3_capi.h b/rtengine/libraw/RawSpeed3/rawspeed3_c_api/rawspeed3_capi.h new file mode 100644 index 000000000..fb2b55100 --- /dev/null +++ b/rtengine/libraw/RawSpeed3/rawspeed3_c_api/rawspeed3_capi.h @@ -0,0 +1,83 @@ +#pragma once +#include +#include + +#ifdef _MSC_VER +#ifdef RAWSPEED_BUILDLIB +#define DllDef __declspec(dllexport) +#else +#define DllDef __declspec(dllimport) +#endif +#else +#define DllDef +#endif + + +#ifdef __cplusplus +extern "C" +{ +#endif + +enum rawspeed3_error_codes +{ + rawspeed_inited = -2, + rawspeed3_param_error = -1, + rawspeed3_ok = 0, + rawspeed3_ok_warnings = 1, + rawspeed3_not_inited = 2, + rawspeed3_processing_error = 3, + rawspeed3_no_decoder = 4, + rawspeed3_not_supported = 5, +}; + +typedef void *rawspeed3_handle_t; + +/* RAW file parsing results */ +typedef struct +{ + int status; /* -1: param error, 0 => OK, >=1 error code */ + uint16_t width, height, bpp, cpp; + unsigned pitch, filters; + const void *pixeldata; +}rawspeed3_ret_t; + +/* API calls */ +DllDef void rawspeed3_clearresult(rawspeed3_ret_t*); +/* + rawspeed3_init() + Init rawspeed3 Camera, returns: 0 on failure, pointer to data block on success + Cameradefs: cameras.xml in string (is_file == false) or file (is_file == true) +*/ +DllDef rawspeed3_handle_t rawspeed3_init(const char* cameradefs, bool is_file); + +/* init with built-in cameras.xml */ +DllDef rawspeed3_handle_t rawspeed3_initdefault(); + +/* + rawspeed3_decodefile(..) + parse/decode RAW file passed via memory + Parameters: + handle - rawspeed3_handle_t => handle created by rawspeed3_init() + resultp -> pointer to rawspeed3_ret_t to be filled with + data -> data buffer with raw file + datasize -> size of this buffer + allowunknown -> allow to process unknown cameras (not listed in cameras.xml) + Return values: + 0 -> OK + 1 -> decode warnings (not fatal) + >1 -> error code + -1 -> Incorrect parameters passed (handle, or data, or datasize) +*/ +DllDef int rawspeed3_decodefile(rawspeed3_handle_t handle, rawspeed3_ret_t* resultp, + const void *data, size_t datasize, bool allowunknown); + +/* release internal raw data buffer */ +DllDef void rawspeed3_release(rawspeed3_handle_t handle); + +/* close handle: release all internal data */ +DllDef void rawspeed3_close(rawspeed3_handle_t handle); + + +#ifdef __cplusplus +} /* Extern C */ +#endif diff --git a/rtengine/libraw/RawSpeed3/rawspeed3_c_api/rawspeed3_capi_test.cpp b/rtengine/libraw/RawSpeed3/rawspeed3_c_api/rawspeed3_capi_test.cpp new file mode 100644 index 000000000..a56ac1e16 --- /dev/null +++ b/rtengine/libraw/RawSpeed3/rawspeed3_c_api/rawspeed3_capi_test.cpp @@ -0,0 +1,71 @@ +#include "rawspeed3_capi.h" +#include +#include +#include +#include + + + +std::vector readfile(char *fn) +{ + std::ifstream is(fn,std::ifstream::binary); + if(is) + { + is.seekg(0, is.end); + size_t length = is.tellg(); + is.seekg(0, is.beg); + std::vector ret; + ret.resize(length+1); + is.read ((char*)ret.data(),length); + is.close(); + ret[length] = 0; // zero terminated + std::cout << "File: " << fn << " size:" << ret.size() << std::endl; + return ret; + } + else + return std::vector(); +} + + +int main(int ac, char *av[]) +{ + if(ac < 2) + { + std::cout << "Usage: " << av[0] << " rawfile rawfile2 ...." << std::endl; + return 1; + } + rawspeed3_handle_t handle = rawspeed3_initdefault(); + if(!handle) + { + std::cerr << "Unable to init rs3" << std::endl; + return 2; + } + + for(int i = 1; i < ac; i++) + { + std::vector rawdata = readfile(av[i]); + if (rawdata.size() < 100) { + std::cerr << "Input file " << av[i] << " too small or nonexistent" << std::endl; + continue; + } + rawspeed3_ret_t result; + int q = rawspeed3_decodefile(handle, &result, rawdata.data(), + rawdata.size(), true); + if (q >= rawspeed3_ok && q <= rawspeed3_ok_warnings) { + std::cout << "File decoded code=" << result.status <<" width=" << result.width + << " height=" << result.height + << " pitch=" << result.pitch + << " filters=" << std::hex << result.filters << std::dec + << " channels=" << result.cpp + << " bpp=" << result.bpp + << std::endl; + } else + std::cout << "RawSpeed wrapper error code:" << result.status + << std::endl; + + rawspeed3_release(handle); + } + + rawspeed3_close(handle); + +} \ No newline at end of file diff --git a/rtengine/libraw/RawSpeed3/rawspeed3_c_api/rsxml2c.sh b/rtengine/libraw/RawSpeed3/rawspeed3_c_api/rsxml2c.sh new file mode 100644 index 000000000..32b6b4612 --- /dev/null +++ b/rtengine/libraw/RawSpeed3/rawspeed3_c_api/rsxml2c.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +echo "const char *_rawspeed3_data_xml=" +cat $1 | tr -d '\015' | sed -e 's/\\/\\\\/g;s/"/\\"/g;s/ /\\t/g;s/^/"/;s/$/\\n"/' +echo "\"\\0\";" diff --git a/rtengine/libraw/bin/.keep_me b/rtengine/libraw/bin/.keep_me new file mode 100644 index 000000000..139597f9c --- /dev/null +++ b/rtengine/libraw/bin/.keep_me @@ -0,0 +1,2 @@ + + diff --git a/rtengine/libraw/buildfiles/4channels.pro b/rtengine/libraw/buildfiles/4channels.pro new file mode 100644 index 000000000..d200a3821 --- /dev/null +++ b/rtengine/libraw/buildfiles/4channels.pro @@ -0,0 +1,5 @@ +include (libraw-common.pro) +win32:LIBS+=libraw.lib +unix:LIBS+=-lraw +CONFIG-=qt +SOURCES=../samples/4channels.cpp diff --git a/rtengine/libraw/buildfiles/4channels.vcxproj b/rtengine/libraw/buildfiles/4channels.vcxproj new file mode 100644 index 000000000..50855bd49 --- /dev/null +++ b/rtengine/libraw/buildfiles/4channels.vcxproj @@ -0,0 +1,145 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {F68CBE78-B27A-3A05-BCD3-293E8CAC1C52} + 4channels + Qt4VSv1.0 + 10.0.18362.0 + 10.0.18362.0 + + + + v142 + debug-x86_64\ + false + NotSet + Application + debug-x86_64\4channels.obj\ + 4channels + + + v142 + release-x86_64\ + false + NotSet + Application + release-x86_64\4channels.obj\ + 4channels + + + + + + + + + + + + debug-x86_64\ + debug-x86_64\4channels.obj\ + 4channels + true + release-x86_64\ + release-x86_64\4channels.obj\ + 4channels + true + false + + + + .;..;%(AdditionalIncludeDirectories) + -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus %(AdditionalOptions) + debug-x86_64\4channels.obj\ + false + ProgramDatabase + Sync + true + debug-x86_64\4channels.obj\ + Disabled + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;%(PreprocessorDefinitions) + false + MultiThreadedDebugDLL + true + true + TurnOffAllWarnings + + + ws2_32.lib;libraw.lib;%(AdditionalDependencies) + debug-x86_64;%(AdditionalLibraryDirectories) + "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) + true + true + true + $(OutDir)\4channels.exe + true + Console + true + + + Unsigned + None + 0 + + + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;_DEBUG;%(PreprocessorDefinitions) + + + + + .;..;%(AdditionalIncludeDirectories) + -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus %(AdditionalOptions) + release-x86_64\4channels.obj\ + false + None + Sync + true + release-x86_64\4channels.obj\ + MaxSpeed + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;NDEBUG;%(PreprocessorDefinitions) + false + + MultiThreadedDLL + true + true + TurnOffAllWarnings + + + ws2_32.lib;libraw.lib;%(AdditionalDependencies) + release-x86_64;%(AdditionalLibraryDirectories) + "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) + true + false + true + false + true + $(OutDir)\4channels.exe + true + Console + true + + + Unsigned + None + 0 + + + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;NDEBUG;%(PreprocessorDefinitions) + + + + + + + + \ No newline at end of file diff --git a/rtengine/libraw/buildfiles/4channels.vcxproj.filters b/rtengine/libraw/buildfiles/4channels.vcxproj.filters new file mode 100644 index 000000000..db3096c98 --- /dev/null +++ b/rtengine/libraw/buildfiles/4channels.vcxproj.filters @@ -0,0 +1,18 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + \ No newline at end of file diff --git a/rtengine/libraw/buildfiles/dcraw_emu.pro b/rtengine/libraw/buildfiles/dcraw_emu.pro new file mode 100644 index 000000000..5dce5a378 --- /dev/null +++ b/rtengine/libraw/buildfiles/dcraw_emu.pro @@ -0,0 +1,6 @@ +include (libraw-common.pro) +win32:LIBS+=libraw.lib +unix:LIBS+=-lraw +CONFIG-=qt +CONFIG+=debug_and_release +SOURCES=../samples/dcraw_emu.cpp diff --git a/rtengine/libraw/buildfiles/dcraw_emu.vcxproj b/rtengine/libraw/buildfiles/dcraw_emu.vcxproj new file mode 100644 index 000000000..053cbe4fb --- /dev/null +++ b/rtengine/libraw/buildfiles/dcraw_emu.vcxproj @@ -0,0 +1,145 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {48688DB8-559A-3DE2-ADDE-5BD27BFEDDA2} + dcraw_emu + Qt4VSv1.0 + 10.0.18362.0 + 10.0.18362.0 + + + + v142 + debug-x86_64\ + false + NotSet + Application + debug-x86_64\dcraw_emu.obj\ + dcraw_emu + + + v142 + release-x86_64\ + false + NotSet + Application + release-x86_64\dcraw_emu.obj\ + dcraw_emu + + + + + + + + + + + + debug-x86_64\ + debug-x86_64\dcraw_emu.obj\ + dcraw_emu + true + release-x86_64\ + release-x86_64\dcraw_emu.obj\ + dcraw_emu + true + false + + + + .;..;%(AdditionalIncludeDirectories) + -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus %(AdditionalOptions) + debug-x86_64\dcraw_emu.obj\ + false + ProgramDatabase + Sync + true + debug-x86_64\dcraw_emu.obj\ + Disabled + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;%(PreprocessorDefinitions) + false + MultiThreadedDebugDLL + true + true + TurnOffAllWarnings + + + ws2_32.lib;libraw.lib;%(AdditionalDependencies) + debug-x86_64;%(AdditionalLibraryDirectories) + "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) + true + true + true + $(OutDir)\dcraw_emu.exe + true + Console + true + + + Unsigned + None + 0 + + + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;_DEBUG;%(PreprocessorDefinitions) + + + + + .;..;%(AdditionalIncludeDirectories) + -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus %(AdditionalOptions) + release-x86_64\dcraw_emu.obj\ + false + None + Sync + true + release-x86_64\dcraw_emu.obj\ + MaxSpeed + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;NDEBUG;%(PreprocessorDefinitions) + false + + MultiThreadedDLL + true + true + TurnOffAllWarnings + + + ws2_32.lib;libraw.lib;%(AdditionalDependencies) + release-x86_64;%(AdditionalLibraryDirectories) + "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) + true + false + true + false + true + $(OutDir)\dcraw_emu.exe + true + Console + true + + + Unsigned + None + 0 + + + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;NDEBUG;%(PreprocessorDefinitions) + + + + + + + + \ No newline at end of file diff --git a/rtengine/libraw/buildfiles/dcraw_emu.vcxproj.filters b/rtengine/libraw/buildfiles/dcraw_emu.vcxproj.filters new file mode 100644 index 000000000..6ba9db16c --- /dev/null +++ b/rtengine/libraw/buildfiles/dcraw_emu.vcxproj.filters @@ -0,0 +1,18 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + \ No newline at end of file diff --git a/rtengine/libraw/buildfiles/dcraw_half.pro b/rtengine/libraw/buildfiles/dcraw_half.pro new file mode 100644 index 000000000..fef2a3059 --- /dev/null +++ b/rtengine/libraw/buildfiles/dcraw_half.pro @@ -0,0 +1,6 @@ +include (libraw-common.pro) +win32:LIBS+=libraw.lib +unix:LIBS+=-lraw +CONFIG-=qt +CONFIG+=debug_and_release +SOURCES=../samples/dcraw_half.c diff --git a/rtengine/libraw/buildfiles/dcraw_half.vcxproj b/rtengine/libraw/buildfiles/dcraw_half.vcxproj new file mode 100644 index 000000000..f528fc2f9 --- /dev/null +++ b/rtengine/libraw/buildfiles/dcraw_half.vcxproj @@ -0,0 +1,145 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {C6EACFA3-9FC5-393B-BCF6-2874B05E4581} + dcraw_half + Qt4VSv1.0 + 10.0.18362.0 + 10.0.18362.0 + + + + v142 + debug-x86_64\ + false + NotSet + Application + debug-x86_64\dcraw_half.obj\ + dcraw_half + + + v142 + release-x86_64\ + false + NotSet + Application + release-x86_64\dcraw_half.obj\ + dcraw_half + + + + + + + + + + + + debug-x86_64\ + debug-x86_64\dcraw_half.obj\ + dcraw_half + true + release-x86_64\ + release-x86_64\dcraw_half.obj\ + dcraw_half + true + false + + + + .;..;%(AdditionalIncludeDirectories) + -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus %(AdditionalOptions) + debug-x86_64\dcraw_half.obj\ + false + ProgramDatabase + Sync + true + debug-x86_64\dcraw_half.obj\ + Disabled + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;%(PreprocessorDefinitions) + false + MultiThreadedDebugDLL + true + true + TurnOffAllWarnings + + + ws2_32.lib;libraw.lib;%(AdditionalDependencies) + debug-x86_64;%(AdditionalLibraryDirectories) + "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) + true + true + true + $(OutDir)\dcraw_half.exe + true + Console + true + + + Unsigned + None + 0 + + + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;_DEBUG;%(PreprocessorDefinitions) + + + + + .;..;%(AdditionalIncludeDirectories) + -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus %(AdditionalOptions) + release-x86_64\dcraw_half.obj\ + false + None + Sync + true + release-x86_64\dcraw_half.obj\ + MaxSpeed + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;NDEBUG;%(PreprocessorDefinitions) + false + + MultiThreadedDLL + true + true + TurnOffAllWarnings + + + ws2_32.lib;libraw.lib;%(AdditionalDependencies) + release-x86_64;%(AdditionalLibraryDirectories) + "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) + true + false + true + false + true + $(OutDir)\dcraw_half.exe + true + Console + true + + + Unsigned + None + 0 + + + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;NDEBUG;%(PreprocessorDefinitions) + + + + + + + + \ No newline at end of file diff --git a/rtengine/libraw/buildfiles/dcraw_half.vcxproj.filters b/rtengine/libraw/buildfiles/dcraw_half.vcxproj.filters new file mode 100644 index 000000000..53de0eaaa --- /dev/null +++ b/rtengine/libraw/buildfiles/dcraw_half.vcxproj.filters @@ -0,0 +1,18 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + \ No newline at end of file diff --git a/rtengine/libraw/buildfiles/half_mt.pro b/rtengine/libraw/buildfiles/half_mt.pro new file mode 100644 index 000000000..4d0bfba56 --- /dev/null +++ b/rtengine/libraw/buildfiles/half_mt.pro @@ -0,0 +1,10 @@ +include (libraw-common.pro) +win32:LIBS+=libraw.lib +unix:LIBS+=-lraw +CONFIG-=qt +CONFIG+=debug_and_release +win32 { + SOURCES=../samples/half_mt_win32.c +} else { + SOURCES=../samples/half_mt.c +} diff --git a/rtengine/libraw/buildfiles/libraw-common-lib.pro b/rtengine/libraw/buildfiles/libraw-common-lib.pro new file mode 100644 index 000000000..34eff4954 --- /dev/null +++ b/rtengine/libraw/buildfiles/libraw-common-lib.pro @@ -0,0 +1,28 @@ +win32 { + QMAKE_CXXFLAGS+=/MP + !contains(QMAKE_HOST.arch, x86_64) { + SUFF="x86" + } else { + ## Windows x64 (64bit) specific build here + SUFF="x86_64" + } +} + +CONFIG(debug,debug|release) { + win32:OUTD=debug-$$SUFF + win32:OUTDE=debug-$$SUFF + macx:OUTD=debug +} else { + win32:OUTD=release-$$SUFF + win32:OUTDE=release-$$SUFF + macx:OUTD=release +} + +INCLUDEPATH+=../ +OBJECTS_DIR = $$OUTD/$${TARGET}.obj +MOC_DIR = $$OUTD/ +RCC_DIR = $$OUTD/ +UI_DIR = $$OUTD/ +DESTDIR = $$OUTD/ +LIBS+=-L$$OUTD +CONFIG+=warn_off \ No newline at end of file diff --git a/rtengine/libraw/buildfiles/libraw-common.pro b/rtengine/libraw/buildfiles/libraw-common.pro new file mode 100644 index 000000000..c1638b3a9 --- /dev/null +++ b/rtengine/libraw/buildfiles/libraw-common.pro @@ -0,0 +1,8 @@ +win32:CONFIG+=console +win32:LIBS+=libraw.lib +unix:LIBS+=-lraw +win32-g++: +{ + LIBS += -lws2_32 +} +include (libraw-common-lib.pro) \ No newline at end of file diff --git a/rtengine/libraw/buildfiles/libraw.pro b/rtengine/libraw/buildfiles/libraw.pro new file mode 100644 index 000000000..786123f13 --- /dev/null +++ b/rtengine/libraw/buildfiles/libraw.pro @@ -0,0 +1,71 @@ +TEMPLATE=lib +TARGET=libraw +INCLUDEPATH+=../ +include (libraw-common-lib.pro) + +HEADERS=../libraw/libraw.h \ + ../libraw/libraw_alloc.h \ + ../libraw/libraw_const.h \ + ../libraw/libraw_datastream.h \ + ../libraw/libraw_types.h \ + ../libraw/libraw_internal.h \ + ../libraw/libraw_version.h \ + ../internal/defines.h \ + ../internal/var_defines.h \ + ../internal/libraw_internal_funcs.h \ + ../internal/dcraw_defs.h ../internal/dcraw_fileio_defs.h \ + ../internal/dmp_include.h ../internal/libraw_cxx_defs.h \ + ../internal/x3f_tools.h + +CONFIG +=precompiled_headers + +CONFIG-=qt +CONFIG+=warn_off +CONFIG+=debug_and_release +macx: CONFIG+= static x86 x86_64 +macx: QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.5 +DEFINES+=LIBRAW_BUILDLIB + +SOURCES+= ../src/libraw_datastream.cpp ../src/decoders/canon_600.cpp \ + ../src/decoders/crx.cpp ../src/decoders/decoders_dcraw.cpp \ + ../src/decoders/decoders_libraw_dcrdefs.cpp ../src/decoders/pana8.cpp \ + ../src/decompressors/losslessjpeg.cpp ../src/decoders/sonycc.cpp \ + ../src/decoders/decoders_libraw.cpp ../src/decoders/dng.cpp \ + ../src/decoders/fp_dng.cpp ../src/decoders/fuji_compressed.cpp \ + ../src/decoders/generic.cpp ../src/decoders/kodak_decoders.cpp \ + ../src/decoders/load_mfbacks.cpp ../src/decoders/smal.cpp \ + ../src/decoders/unpack_thumb.cpp ../src/decoders/unpack.cpp \ + ../src/demosaic/aahd_demosaic.cpp ../src/demosaic/ahd_demosaic.cpp \ + ../src/demosaic/dcb_demosaic.cpp ../src/demosaic/dht_demosaic.cpp \ + ../src/demosaic/misc_demosaic.cpp ../src/demosaic/xtrans_demosaic.cpp \ + ../src/integration/dngsdk_glue.cpp ../src/integration/rawspeed_glue.cpp \ + ../src/metadata/adobepano.cpp ../src/metadata/canon.cpp \ + ../src/metadata/ciff.cpp ../src/metadata/cr3_parser.cpp \ + ../src/metadata/epson.cpp ../src/metadata/exif_gps.cpp \ + ../src/metadata/fuji.cpp ../src/metadata/identify_tools.cpp \ + ../src/metadata/hasselblad_model.cpp \ + ../src/metadata/identify.cpp ../src/metadata/kodak.cpp \ + ../src/metadata/leica.cpp ../src/metadata/makernotes.cpp \ + ../src/metadata/mediumformat.cpp ../src/metadata/minolta.cpp \ + ../src/metadata/misc_parsers.cpp ../src/metadata/nikon.cpp \ + ../src/metadata/normalize_model.cpp ../src/metadata/olympus.cpp \ + ../src/metadata/p1.cpp ../src/metadata/pentax.cpp \ + ../src/metadata/samsung.cpp ../src/metadata/sony.cpp \ + ../src/metadata/tiff.cpp ../src/postprocessing/aspect_ratio.cpp \ + ../src/postprocessing/dcraw_process.cpp ../src/postprocessing/mem_image.cpp \ + ../src/postprocessing/postprocessing_aux.cpp \ + ../src/postprocessing/postprocessing_utils_dcrdefs.cpp \ + ../src/postprocessing/postprocessing_utils.cpp \ + ../src/preprocessing/ext_preprocess.cpp ../src/preprocessing/raw2image.cpp \ + ../src/preprocessing/subtract_black.cpp ../src/tables/cameralist.cpp \ + ../src/tables/colorconst.cpp ../src/tables/colordata.cpp \ + ../src/tables/wblists.cpp ../src/utils/curves.cpp \ + ../src/utils/decoder_info.cpp ../src/utils/init_close_utils.cpp \ + ../src/utils/open.cpp ../src/utils/phaseone_processing.cpp \ + ../src/utils/read_utils.cpp ../src/utils/thumb_utils.cpp \ + ../src/utils/utils_dcraw.cpp ../src/utils/utils_libraw.cpp \ + ../src/write/apply_profile.cpp ../src/write/file_write.cpp \ + ../src/write/tiff_writer.cpp ../src/x3f/x3f_parse_process.cpp \ + ../src/x3f/x3f_utils_patched.cpp \ + ../src/libraw_c_api.cpp + diff --git a/rtengine/libraw/buildfiles/libraw.vcxproj b/rtengine/libraw/buildfiles/libraw.vcxproj new file mode 100644 index 000000000..9d3277818 --- /dev/null +++ b/rtengine/libraw/buildfiles/libraw.vcxproj @@ -0,0 +1,237 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {A71D2131-F425-381F-8A9A-29D60132A046} + libraw + Qt4VSv1.0 + 10.0.18362.0 + 10.0.18362.0 + + + + v142 + debug-x86_64\ + false + NotSet + DynamicLibrary + debug-x86_64\libraw.obj\ + libraw + + + v142 + release-x86_64\ + false + NotSet + DynamicLibrary + release-x86_64\libraw.obj\ + libraw + + + + + + + + + + + + debug-x86_64\ + debug-x86_64\libraw.obj\ + libraw + true + release-x86_64\ + release-x86_64\libraw.obj\ + libraw + true + false + + + + .;..;..;%(AdditionalIncludeDirectories) + -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus %(AdditionalOptions) + debug-x86_64\libraw.obj\ + false + ProgramDatabase + Sync + true + debug-x86_64\libraw.obj\ + Disabled + _WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;LIBRAW_BUILDLIB;%(PreprocessorDefinitions) + false + MultiThreadedDebugDLL + true + true + TurnOffAllWarnings + + + debug-x86_64;%(AdditionalLibraryDirectories) + true + true + true + true + $(OutDir)\libraw.dll + true + Windows + true + + + Unsigned + None + 0 + + + _WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;LIBRAW_BUILDLIB;_DEBUG;%(PreprocessorDefinitions) + + + + + .;..;..;%(AdditionalIncludeDirectories) + -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus %(AdditionalOptions) + release-x86_64\libraw.obj\ + false + None + Sync + true + release-x86_64\libraw.obj\ + MaxSpeed + _WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;LIBRAW_BUILDLIB;NDEBUG;%(PreprocessorDefinitions) + false + + MultiThreadedDLL + true + true + TurnOffAllWarnings + + + release-x86_64;%(AdditionalLibraryDirectories) + true + false + true + true + false + true + $(OutDir)\libraw.dll + true + Windows + true + + + Unsigned + None + 0 + + + _WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;LIBRAW_BUILDLIB;NDEBUG;%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/rtengine/libraw/buildfiles/libraw.vcxproj.filters b/rtengine/libraw/buildfiles/libraw.vcxproj.filters new file mode 100644 index 000000000..e4daa9442 --- /dev/null +++ b/rtengine/libraw/buildfiles/libraw.vcxproj.filters @@ -0,0 +1,295 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/rtengine/libraw/buildfiles/mem_image.pro b/rtengine/libraw/buildfiles/mem_image.pro new file mode 100644 index 000000000..8b3c38ce9 --- /dev/null +++ b/rtengine/libraw/buildfiles/mem_image.pro @@ -0,0 +1,6 @@ +include (libraw-common.pro) +win32:LIBS+=libraw.lib +unix:LIBS+=-lraw +CONFIG-=qt +CONFIG+=debug_and_release +SOURCES=../samples/mem_image_sample.cpp diff --git a/rtengine/libraw/buildfiles/mem_image.vcxproj b/rtengine/libraw/buildfiles/mem_image.vcxproj new file mode 100644 index 000000000..a242e32e3 --- /dev/null +++ b/rtengine/libraw/buildfiles/mem_image.vcxproj @@ -0,0 +1,145 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {BF8A2750-B847-3BA6-9EAF-05F43380F46C} + mem_image + Qt4VSv1.0 + 10.0.18362.0 + 10.0.18362.0 + + + + v142 + debug-x86_64\ + false + NotSet + Application + debug-x86_64\mem_image.obj\ + mem_image + + + v142 + release-x86_64\ + false + NotSet + Application + release-x86_64\mem_image.obj\ + mem_image + + + + + + + + + + + + debug-x86_64\ + debug-x86_64\mem_image.obj\ + mem_image + true + release-x86_64\ + release-x86_64\mem_image.obj\ + mem_image + true + false + + + + .;..;%(AdditionalIncludeDirectories) + -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus %(AdditionalOptions) + debug-x86_64\mem_image.obj\ + false + ProgramDatabase + Sync + true + debug-x86_64\mem_image.obj\ + Disabled + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;%(PreprocessorDefinitions) + false + MultiThreadedDebugDLL + true + true + TurnOffAllWarnings + + + ws2_32.lib;libraw.lib;%(AdditionalDependencies) + debug-x86_64;%(AdditionalLibraryDirectories) + "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) + true + true + true + $(OutDir)\mem_image.exe + true + Console + true + + + Unsigned + None + 0 + + + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;_DEBUG;%(PreprocessorDefinitions) + + + + + .;..;%(AdditionalIncludeDirectories) + -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus %(AdditionalOptions) + release-x86_64\mem_image.obj\ + false + None + Sync + true + release-x86_64\mem_image.obj\ + MaxSpeed + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;NDEBUG;%(PreprocessorDefinitions) + false + + MultiThreadedDLL + true + true + TurnOffAllWarnings + + + ws2_32.lib;libraw.lib;%(AdditionalDependencies) + release-x86_64;%(AdditionalLibraryDirectories) + "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) + true + false + true + false + true + $(OutDir)\mem_image.exe + true + Console + true + + + Unsigned + None + 0 + + + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;NDEBUG;%(PreprocessorDefinitions) + + + + + + + + \ No newline at end of file diff --git a/rtengine/libraw/buildfiles/mem_image.vcxproj.filters b/rtengine/libraw/buildfiles/mem_image.vcxproj.filters new file mode 100644 index 000000000..45631183a --- /dev/null +++ b/rtengine/libraw/buildfiles/mem_image.vcxproj.filters @@ -0,0 +1,18 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + \ No newline at end of file diff --git a/rtengine/libraw/buildfiles/multirender_test.pro b/rtengine/libraw/buildfiles/multirender_test.pro new file mode 100644 index 000000000..653437ebc --- /dev/null +++ b/rtengine/libraw/buildfiles/multirender_test.pro @@ -0,0 +1,6 @@ +include (libraw-common.pro) +win32:LIBS+=libraw.lib +unix:LIBS+=-lraw +CONFIG-=qt +CONFIG+=debug_and_release +SOURCES=../samples/multirender_test.cpp diff --git a/rtengine/libraw/buildfiles/multirender_test.vcxproj b/rtengine/libraw/buildfiles/multirender_test.vcxproj new file mode 100644 index 000000000..729f3adab --- /dev/null +++ b/rtengine/libraw/buildfiles/multirender_test.vcxproj @@ -0,0 +1,145 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {30D21208-219A-3AA8-ADCF-E6B1FFAF6A73} + multirender_test + Qt4VSv1.0 + 10.0.18362.0 + 10.0.18362.0 + + + + v142 + debug-x86_64\ + false + NotSet + Application + debug-x86_64\multirender_test.obj\ + multirender_test + + + v142 + release-x86_64\ + false + NotSet + Application + release-x86_64\multirender_test.obj\ + multirender_test + + + + + + + + + + + + debug-x86_64\ + debug-x86_64\multirender_test.obj\ + multirender_test + true + release-x86_64\ + release-x86_64\multirender_test.obj\ + multirender_test + true + false + + + + .;..;%(AdditionalIncludeDirectories) + -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus %(AdditionalOptions) + debug-x86_64\multirender_test.obj\ + false + ProgramDatabase + Sync + true + debug-x86_64\multirender_test.obj\ + Disabled + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;%(PreprocessorDefinitions) + false + MultiThreadedDebugDLL + true + true + TurnOffAllWarnings + + + ws2_32.lib;libraw.lib;%(AdditionalDependencies) + debug-x86_64;%(AdditionalLibraryDirectories) + "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) + true + true + true + $(OutDir)\multirender_test.exe + true + Console + true + + + Unsigned + None + 0 + + + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;_DEBUG;%(PreprocessorDefinitions) + + + + + .;..;%(AdditionalIncludeDirectories) + -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus %(AdditionalOptions) + release-x86_64\multirender_test.obj\ + false + None + Sync + true + release-x86_64\multirender_test.obj\ + MaxSpeed + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;NDEBUG;%(PreprocessorDefinitions) + false + + MultiThreadedDLL + true + true + TurnOffAllWarnings + + + ws2_32.lib;libraw.lib;%(AdditionalDependencies) + release-x86_64;%(AdditionalLibraryDirectories) + "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) + true + false + true + false + true + $(OutDir)\multirender_test.exe + true + Console + true + + + Unsigned + None + 0 + + + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;NDEBUG;%(PreprocessorDefinitions) + + + + + + + + \ No newline at end of file diff --git a/rtengine/libraw/buildfiles/multirender_test.vcxproj.filters b/rtengine/libraw/buildfiles/multirender_test.vcxproj.filters new file mode 100644 index 000000000..ffad024b3 --- /dev/null +++ b/rtengine/libraw/buildfiles/multirender_test.vcxproj.filters @@ -0,0 +1,18 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + \ No newline at end of file diff --git a/rtengine/libraw/buildfiles/openbayer_sample.pro b/rtengine/libraw/buildfiles/openbayer_sample.pro new file mode 100644 index 000000000..fb14035b3 --- /dev/null +++ b/rtengine/libraw/buildfiles/openbayer_sample.pro @@ -0,0 +1,6 @@ +include (libraw-common.pro) +win32:LIBS+=libraw.lib +unix:LIBS+=-lraw +CONFIG-=qt +CONFIG+=debug_and_release +SOURCES=../samples/openbayer_sample.cpp diff --git a/rtengine/libraw/buildfiles/openbayer_sample.vcxproj b/rtengine/libraw/buildfiles/openbayer_sample.vcxproj new file mode 100644 index 000000000..92cfcf6e7 --- /dev/null +++ b/rtengine/libraw/buildfiles/openbayer_sample.vcxproj @@ -0,0 +1,145 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {EF67FEF1-4B19-3765-A660-9F8E9333DEF3} + openbayer_sample + Qt4VSv1.0 + 10.0.18362.0 + 10.0.18362.0 + + + + v142 + debug-x86_64\ + false + NotSet + Application + debug-x86_64\openbayer_sample.obj\ + openbayer_sample + + + v142 + release-x86_64\ + false + NotSet + Application + release-x86_64\openbayer_sample.obj\ + openbayer_sample + + + + + + + + + + + + debug-x86_64\ + debug-x86_64\openbayer_sample.obj\ + openbayer_sample + true + release-x86_64\ + release-x86_64\openbayer_sample.obj\ + openbayer_sample + true + false + + + + .;..;%(AdditionalIncludeDirectories) + -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus %(AdditionalOptions) + debug-x86_64\openbayer_sample.obj\ + false + ProgramDatabase + Sync + true + debug-x86_64\openbayer_sample.obj\ + Disabled + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;%(PreprocessorDefinitions) + false + MultiThreadedDebugDLL + true + true + TurnOffAllWarnings + + + ws2_32.lib;libraw.lib;%(AdditionalDependencies) + debug-x86_64;%(AdditionalLibraryDirectories) + "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) + true + true + true + $(OutDir)\openbayer_sample.exe + true + Console + true + + + Unsigned + None + 0 + + + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;_DEBUG;%(PreprocessorDefinitions) + + + + + .;..;%(AdditionalIncludeDirectories) + -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus %(AdditionalOptions) + release-x86_64\openbayer_sample.obj\ + false + None + Sync + true + release-x86_64\openbayer_sample.obj\ + MaxSpeed + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;NDEBUG;%(PreprocessorDefinitions) + false + + MultiThreadedDLL + true + true + TurnOffAllWarnings + + + ws2_32.lib;libraw.lib;%(AdditionalDependencies) + release-x86_64;%(AdditionalLibraryDirectories) + "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) + true + false + true + false + true + $(OutDir)\openbayer_sample.exe + true + Console + true + + + Unsigned + None + 0 + + + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;NDEBUG;%(PreprocessorDefinitions) + + + + + + + + \ No newline at end of file diff --git a/rtengine/libraw/buildfiles/openbayer_sample.vcxproj.filters b/rtengine/libraw/buildfiles/openbayer_sample.vcxproj.filters new file mode 100644 index 000000000..914c2fecd --- /dev/null +++ b/rtengine/libraw/buildfiles/openbayer_sample.vcxproj.filters @@ -0,0 +1,18 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + \ No newline at end of file diff --git a/rtengine/libraw/buildfiles/postprocessing_benchmark.pro b/rtengine/libraw/buildfiles/postprocessing_benchmark.pro new file mode 100644 index 000000000..145037dda --- /dev/null +++ b/rtengine/libraw/buildfiles/postprocessing_benchmark.pro @@ -0,0 +1,4 @@ +include (libraw-common.pro) +CONFIG-=qt +CONFIG+=debug_and_release +SOURCES=../samples/postprocessing_benchmark.cpp diff --git a/rtengine/libraw/buildfiles/postprocessing_benchmark.vcxproj b/rtengine/libraw/buildfiles/postprocessing_benchmark.vcxproj new file mode 100644 index 000000000..a94e078b6 --- /dev/null +++ b/rtengine/libraw/buildfiles/postprocessing_benchmark.vcxproj @@ -0,0 +1,145 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {5C66A8FA-D211-3E2F-A2F1-0C3C665689CC} + postprocessing_benchmark + Qt4VSv1.0 + 10.0.18362.0 + 10.0.18362.0 + + + + v142 + debug-x86_64\ + false + NotSet + Application + debug-x86_64\postprocessing_benchmark.obj\ + postprocessing_benchmark + + + v142 + release-x86_64\ + false + NotSet + Application + release-x86_64\postprocessing_benchmark.obj\ + postprocessing_benchmark + + + + + + + + + + + + debug-x86_64\ + debug-x86_64\postprocessing_benchmark.obj\ + postprocessing_benchmark + true + release-x86_64\ + release-x86_64\postprocessing_benchmark.obj\ + postprocessing_benchmark + true + false + + + + .;..;%(AdditionalIncludeDirectories) + -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus %(AdditionalOptions) + debug-x86_64\postprocessing_benchmark.obj\ + false + ProgramDatabase + Sync + true + debug-x86_64\postprocessing_benchmark.obj\ + Disabled + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;%(PreprocessorDefinitions) + false + MultiThreadedDebugDLL + true + true + TurnOffAllWarnings + + + libraw.lib;ws2_32.lib;%(AdditionalDependencies) + debug-x86_64;%(AdditionalLibraryDirectories) + "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) + true + true + true + $(OutDir)\postprocessing_benchmark.exe + true + Console + true + + + Unsigned + None + 0 + + + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;_DEBUG;%(PreprocessorDefinitions) + + + + + .;..;%(AdditionalIncludeDirectories) + -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus %(AdditionalOptions) + release-x86_64\postprocessing_benchmark.obj\ + false + None + Sync + true + release-x86_64\postprocessing_benchmark.obj\ + MaxSpeed + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;NDEBUG;%(PreprocessorDefinitions) + false + + MultiThreadedDLL + true + true + TurnOffAllWarnings + + + libraw.lib;ws2_32.lib;%(AdditionalDependencies) + release-x86_64;%(AdditionalLibraryDirectories) + "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) + true + false + true + false + true + $(OutDir)\postprocessing_benchmark.exe + true + Console + true + + + Unsigned + None + 0 + + + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;NDEBUG;%(PreprocessorDefinitions) + + + + + + + + \ No newline at end of file diff --git a/rtengine/libraw/buildfiles/postprocessing_benchmark.vcxproj.filters b/rtengine/libraw/buildfiles/postprocessing_benchmark.vcxproj.filters new file mode 100644 index 000000000..66b0fc6b4 --- /dev/null +++ b/rtengine/libraw/buildfiles/postprocessing_benchmark.vcxproj.filters @@ -0,0 +1,18 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + \ No newline at end of file diff --git a/rtengine/libraw/buildfiles/raw-identify.pro b/rtengine/libraw/buildfiles/raw-identify.pro new file mode 100644 index 000000000..539a14d0b --- /dev/null +++ b/rtengine/libraw/buildfiles/raw-identify.pro @@ -0,0 +1,6 @@ +include (libraw-common.pro) +win32:LIBS+=libraw.lib +unix:LIBS+=-lraw +CONFIG-=qt +CONFIG+=debug_and_release +SOURCES=../samples/raw-identify.cpp diff --git a/rtengine/libraw/buildfiles/raw-identify.vcxproj b/rtengine/libraw/buildfiles/raw-identify.vcxproj new file mode 100644 index 000000000..a31613727 --- /dev/null +++ b/rtengine/libraw/buildfiles/raw-identify.vcxproj @@ -0,0 +1,145 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {7C4F61DB-717E-36C9-B20E-36F8E218AB51} + raw-identify + Qt4VSv1.0 + 10.0.18362.0 + 10.0.18362.0 + + + + v142 + debug-x86_64\ + false + NotSet + Application + debug-x86_64\raw-identify.obj\ + raw-identify + + + v142 + release-x86_64\ + false + NotSet + Application + release-x86_64\raw-identify.obj\ + raw-identify + + + + + + + + + + + + debug-x86_64\ + debug-x86_64\raw-identify.obj\ + raw-identify + true + release-x86_64\ + release-x86_64\raw-identify.obj\ + raw-identify + true + false + + + + .;..;%(AdditionalIncludeDirectories) + -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus %(AdditionalOptions) + debug-x86_64\raw-identify.obj\ + false + ProgramDatabase + Sync + true + debug-x86_64\raw-identify.obj\ + Disabled + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;%(PreprocessorDefinitions) + false + MultiThreadedDebugDLL + true + true + TurnOffAllWarnings + + + ws2_32.lib;libraw.lib;%(AdditionalDependencies) + debug-x86_64;%(AdditionalLibraryDirectories) + "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) + true + true + true + $(OutDir)\raw-identify.exe + true + Console + true + + + Unsigned + None + 0 + + + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;_DEBUG;%(PreprocessorDefinitions) + + + + + .;..;%(AdditionalIncludeDirectories) + -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus %(AdditionalOptions) + release-x86_64\raw-identify.obj\ + false + None + Sync + true + release-x86_64\raw-identify.obj\ + MaxSpeed + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;NDEBUG;%(PreprocessorDefinitions) + false + + MultiThreadedDLL + true + true + TurnOffAllWarnings + + + ws2_32.lib;libraw.lib;%(AdditionalDependencies) + release-x86_64;%(AdditionalLibraryDirectories) + "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) + true + false + true + false + true + $(OutDir)\raw-identify.exe + true + Console + true + + + Unsigned + None + 0 + + + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;NDEBUG;%(PreprocessorDefinitions) + + + + + + + + \ No newline at end of file diff --git a/rtengine/libraw/buildfiles/raw-identify.vcxproj.filters b/rtengine/libraw/buildfiles/raw-identify.vcxproj.filters new file mode 100644 index 000000000..0762ede28 --- /dev/null +++ b/rtengine/libraw/buildfiles/raw-identify.vcxproj.filters @@ -0,0 +1,18 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + \ No newline at end of file diff --git a/rtengine/libraw/buildfiles/rawtextdump.pro b/rtengine/libraw/buildfiles/rawtextdump.pro new file mode 100644 index 000000000..f7afd2151 --- /dev/null +++ b/rtengine/libraw/buildfiles/rawtextdump.pro @@ -0,0 +1,6 @@ +include (libraw-common.pro) +win32:LIBS+=libraw.lib +unix:LIBS+=-lraw +CONFIG-=qt +CONFIG+=debug_and_release +SOURCES=../samples/rawtextdump.cpp diff --git a/rtengine/libraw/buildfiles/rawtextdump.vcxproj b/rtengine/libraw/buildfiles/rawtextdump.vcxproj new file mode 100644 index 000000000..a2c44589b --- /dev/null +++ b/rtengine/libraw/buildfiles/rawtextdump.vcxproj @@ -0,0 +1,145 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {53A1E3F0-8032-348E-B3BF-3E540A45005F} + rawtextdump + Qt4VSv1.0 + 10.0.18362.0 + 10.0.18362.0 + + + + v142 + debug-x86_64\ + false + NotSet + Application + debug-x86_64\rawtextdump.obj\ + rawtextdump + + + v142 + release-x86_64\ + false + NotSet + Application + release-x86_64\rawtextdump.obj\ + rawtextdump + + + + + + + + + + + + debug-x86_64\ + debug-x86_64\rawtextdump.obj\ + rawtextdump + true + release-x86_64\ + release-x86_64\rawtextdump.obj\ + rawtextdump + true + false + + + + .;..;%(AdditionalIncludeDirectories) + -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus %(AdditionalOptions) + debug-x86_64\rawtextdump.obj\ + false + ProgramDatabase + Sync + true + debug-x86_64\rawtextdump.obj\ + Disabled + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;%(PreprocessorDefinitions) + false + MultiThreadedDebugDLL + true + true + TurnOffAllWarnings + + + ws2_32.lib;libraw.lib;%(AdditionalDependencies) + debug-x86_64;%(AdditionalLibraryDirectories) + "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) + true + true + true + $(OutDir)\rawtextdump.exe + true + Console + true + + + Unsigned + None + 0 + + + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;_DEBUG;%(PreprocessorDefinitions) + + + + + .;..;%(AdditionalIncludeDirectories) + -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus %(AdditionalOptions) + release-x86_64\rawtextdump.obj\ + false + None + Sync + true + release-x86_64\rawtextdump.obj\ + MaxSpeed + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;NDEBUG;%(PreprocessorDefinitions) + false + + MultiThreadedDLL + true + true + TurnOffAllWarnings + + + ws2_32.lib;libraw.lib;%(AdditionalDependencies) + release-x86_64;%(AdditionalLibraryDirectories) + "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) + true + false + true + false + true + $(OutDir)\rawtextdump.exe + true + Console + true + + + Unsigned + None + 0 + + + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;NDEBUG;%(PreprocessorDefinitions) + + + + + + + + \ No newline at end of file diff --git a/rtengine/libraw/buildfiles/rawtextdump.vcxproj.filters b/rtengine/libraw/buildfiles/rawtextdump.vcxproj.filters new file mode 100644 index 000000000..33dedcd60 --- /dev/null +++ b/rtengine/libraw/buildfiles/rawtextdump.vcxproj.filters @@ -0,0 +1,18 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + \ No newline at end of file diff --git a/rtengine/libraw/buildfiles/simple_dcraw.pro b/rtengine/libraw/buildfiles/simple_dcraw.pro new file mode 100644 index 000000000..f28a6ef67 --- /dev/null +++ b/rtengine/libraw/buildfiles/simple_dcraw.pro @@ -0,0 +1,6 @@ +include (libraw-common.pro) +win32:LIBS+=libraw.lib +unix:LIBS+=-lraw +CONFIG-=qt +CONFIG+=debug_and_release +SOURCES=../samples/simple_dcraw.cpp diff --git a/rtengine/libraw/buildfiles/simple_dcraw.vcxproj b/rtengine/libraw/buildfiles/simple_dcraw.vcxproj new file mode 100644 index 000000000..4d1529dee --- /dev/null +++ b/rtengine/libraw/buildfiles/simple_dcraw.vcxproj @@ -0,0 +1,145 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {AD1E31D8-A022-3672-982F-C8280A0D6458} + simple_dcraw + Qt4VSv1.0 + 10.0.18362.0 + 10.0.18362.0 + + + + v142 + debug-x86_64\ + false + NotSet + Application + debug-x86_64\simple_dcraw.obj\ + simple_dcraw + + + v142 + release-x86_64\ + false + NotSet + Application + release-x86_64\simple_dcraw.obj\ + simple_dcraw + + + + + + + + + + + + debug-x86_64\ + debug-x86_64\simple_dcraw.obj\ + simple_dcraw + true + release-x86_64\ + release-x86_64\simple_dcraw.obj\ + simple_dcraw + true + false + + + + .;..;%(AdditionalIncludeDirectories) + -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus %(AdditionalOptions) + debug-x86_64\simple_dcraw.obj\ + false + ProgramDatabase + Sync + true + debug-x86_64\simple_dcraw.obj\ + Disabled + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;%(PreprocessorDefinitions) + false + MultiThreadedDebugDLL + true + true + TurnOffAllWarnings + + + ws2_32.lib;libraw.lib;%(AdditionalDependencies) + debug-x86_64;%(AdditionalLibraryDirectories) + "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) + true + true + true + $(OutDir)\simple_dcraw.exe + true + Console + true + + + Unsigned + None + 0 + + + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;_DEBUG;%(PreprocessorDefinitions) + + + + + .;..;%(AdditionalIncludeDirectories) + -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus %(AdditionalOptions) + release-x86_64\simple_dcraw.obj\ + false + None + Sync + true + release-x86_64\simple_dcraw.obj\ + MaxSpeed + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;NDEBUG;%(PreprocessorDefinitions) + false + + MultiThreadedDLL + true + true + TurnOffAllWarnings + + + ws2_32.lib;libraw.lib;%(AdditionalDependencies) + release-x86_64;%(AdditionalLibraryDirectories) + "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) + true + false + true + false + true + $(OutDir)\simple_dcraw.exe + true + Console + true + + + Unsigned + None + 0 + + + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;NDEBUG;%(PreprocessorDefinitions) + + + + + + + + \ No newline at end of file diff --git a/rtengine/libraw/buildfiles/simple_dcraw.vcxproj.filters b/rtengine/libraw/buildfiles/simple_dcraw.vcxproj.filters new file mode 100644 index 000000000..3f714b9d7 --- /dev/null +++ b/rtengine/libraw/buildfiles/simple_dcraw.vcxproj.filters @@ -0,0 +1,18 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + \ No newline at end of file diff --git a/rtengine/libraw/buildfiles/unprocessed_raw.pro b/rtengine/libraw/buildfiles/unprocessed_raw.pro new file mode 100644 index 000000000..b9e0df77d --- /dev/null +++ b/rtengine/libraw/buildfiles/unprocessed_raw.pro @@ -0,0 +1,6 @@ +include (libraw-common.pro) +win32:LIBS+=libraw.lib +unix:LIBS+=-lraw +CONFIG-=qt +CONFIG+=debug_and_release +SOURCES=../samples/unprocessed_raw.cpp diff --git a/rtengine/libraw/buildfiles/unprocessed_raw.vcxproj b/rtengine/libraw/buildfiles/unprocessed_raw.vcxproj new file mode 100644 index 000000000..11c64d335 --- /dev/null +++ b/rtengine/libraw/buildfiles/unprocessed_raw.vcxproj @@ -0,0 +1,145 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {1333E21E-D3B5-3640-9A4D-D8955082B855} + unprocessed_raw + Qt4VSv1.0 + 10.0.18362.0 + 10.0.18362.0 + + + + v142 + debug-x86_64\ + false + NotSet + Application + debug-x86_64\unprocessed_raw.obj\ + unprocessed_raw + + + v142 + release-x86_64\ + false + NotSet + Application + release-x86_64\unprocessed_raw.obj\ + unprocessed_raw + + + + + + + + + + + + debug-x86_64\ + debug-x86_64\unprocessed_raw.obj\ + unprocessed_raw + true + release-x86_64\ + release-x86_64\unprocessed_raw.obj\ + unprocessed_raw + true + false + + + + .;..;%(AdditionalIncludeDirectories) + -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus %(AdditionalOptions) + debug-x86_64\unprocessed_raw.obj\ + false + ProgramDatabase + Sync + true + debug-x86_64\unprocessed_raw.obj\ + Disabled + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;%(PreprocessorDefinitions) + false + MultiThreadedDebugDLL + true + true + TurnOffAllWarnings + + + ws2_32.lib;libraw.lib;%(AdditionalDependencies) + debug-x86_64;%(AdditionalLibraryDirectories) + "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) + true + true + true + $(OutDir)\unprocessed_raw.exe + true + Console + true + + + Unsigned + None + 0 + + + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;_DEBUG;%(PreprocessorDefinitions) + + + + + .;..;%(AdditionalIncludeDirectories) + -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus %(AdditionalOptions) + release-x86_64\unprocessed_raw.obj\ + false + None + Sync + true + release-x86_64\unprocessed_raw.obj\ + MaxSpeed + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;NDEBUG;%(PreprocessorDefinitions) + false + + MultiThreadedDLL + true + true + TurnOffAllWarnings + + + ws2_32.lib;libraw.lib;%(AdditionalDependencies) + release-x86_64;%(AdditionalLibraryDirectories) + "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) + true + false + true + false + true + $(OutDir)\unprocessed_raw.exe + true + Console + true + + + Unsigned + None + 0 + + + _CONSOLE;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;NDEBUG;%(PreprocessorDefinitions) + + + + + + + + \ No newline at end of file diff --git a/rtengine/libraw/buildfiles/unprocessed_raw.vcxproj.filters b/rtengine/libraw/buildfiles/unprocessed_raw.vcxproj.filters new file mode 100644 index 000000000..5a9b32589 --- /dev/null +++ b/rtengine/libraw/buildfiles/unprocessed_raw.vcxproj.filters @@ -0,0 +1,18 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + \ No newline at end of file diff --git a/rtengine/libraw/clist2c.pl b/rtengine/libraw/clist2c.pl new file mode 100755 index 000000000..622a5a65f --- /dev/null +++ b/rtengine/libraw/clist2c.pl @@ -0,0 +1,12 @@ +#!/usr/bin/perl + +while (<>) + { + chomp; + s/^\s+//; + s/^\s+\*\s+//; + s/^\s+//; + s/\"/\\\"/g; + s/\s+$//; + print "\"$_\",\n"; + } diff --git a/rtengine/libraw/clist2html.pl b/rtengine/libraw/clist2html.pl new file mode 100755 index 000000000..70da7375e --- /dev/null +++ b/rtengine/libraw/clist2html.pl @@ -0,0 +1,54 @@ +#!/usr/bin/perl +use Data::Dumper; + +@makes=( "AgfaPhoto", "Canon", "Casio", "Digital Bolex", "Epson", "Fujifilm", "Imacon", + "Mamiya", "Minolta", "Motorola", "Kodak", "Konica", "Leica", "Hasselblad", + "Nikon", "Nokia", "Olympus", "Pentax", "Phase One", "Ricoh", + "Samsung", "Sigma", "Sinar", "Sony" ); + +MAINLOOP: +while(<>) +{ + chomp; + $cname = $_; + $cname=~s/^\s+//g; + $cname=~s/\s+$//g; + for my $camera (@makes) + { + if ($cname=~/\Q$camera\E\s+(.*)/) + { + + $model = $1; + push @{$cameralist->{$camera}},$model; + next MAINLOOP; + } + } + if($cname=~/(\S+)\s+(.*)/) + { + ($make,$model) = ($1,$2); + push @{$cameralist->{$make}},$model; + next MAINLOOP; + } + push @{$cameralist->{$make}},"NO MODEL"; + +} +my $havenx1=0; +print "
    \n"; +for my $make (sort keys %$cameralist) +{ + if( $#{$cameralist->{$make}} < 1) + { + print "
  • $make $cameralist->{$make}->[0]
  • \n"; + + } + else + { + print "
  • $make\n
      \n"; + for my $model (@{$cameralist->{$make}}) + { + print "
    • $model
    • \n"; + } + print "
    \n
  • \n"; + } +} +print "
\n"; diff --git a/rtengine/libraw/configure.ac b/rtengine/libraw/configure.ac new file mode 100644 index 000000000..092182727 --- /dev/null +++ b/rtengine/libraw/configure.ac @@ -0,0 +1,131 @@ +# Initialization +AC_INIT([LibRaw], m4_esyscmd([./version.sh]), [info@libraw.org], [], [http://www.libraw.org]) +AM_INIT_AUTOMAKE([foreign no-define]) +#AM_SILENT_RULES([yes]) +AC_CONFIG_MACRO_DIR([m4]) +AC_CANONICAL_HOST + +# Tools to use +AC_PROG_CXX +AC_PROG_CC +AC_PROG_LIBTOOL +AC_ENABLE_SHARED +AC_ENABLE_STATIC +AC_LIBTOOL_WIN32_DLL +AC_LIBTOOL_SETUP +AC_SUBST(LIBTOOL_DEPS) + +# Config files to generate + +AC_CONFIG_FILES([ + Makefile + libraw.pc + libraw_r.pc +]) + +# check if we want OpenMP support +AC_ARG_ENABLE([openmp], + [ --enable-openmp Enable OpenMP support], + [case "${enableval}" in + yes) openmp=true ;; + no) openmp=false ;; + *) AC_MSG_ERROR([bad value ${enableval} for --enable-openmp]) ;; + esac],[openmp=true]) + +if test x$openmp = xtrue ; then + AX_OPENMP([ + CXXFLAGS="$CXXFLAGS $OPENMP_CFLAGS" + CFLAGS="$CFLAGS $OPENMP_CFLAGS" + AC_SUBST([PC_OPENMP],[" $OPENMP_CFLAGS"]) + ],[ + AC_MSG_WARN([OpenMP support cannot be enabled because your system doesn't support it.]) + ]) +fi + +# check for libjpeg v8 +AC_ARG_ENABLE([jpeg], + [ --enable-jpeg Enable JPEG support for Lossy compressed DNG files], + [case "${enableval}" in + yes) jpeg=true ;; + no) jpeg=false ;; + *) AC_MSG_ERROR([bad value ${enableval} for --enable-jpeg]) ;; + esac],[jpeg=true]) + +if test x$jpeg = xtrue; then + AC_CHECK_LIB([jpeg], [jpeg_mem_src], + [ + AC_CHECK_HEADERS([jpeglib.h], [ + CPPFLAGS="$CPPFLAGS -DUSE_JPEG -DUSE_JPEG8" + LIBS="$LIBS -ljpeg" + AC_SUBST([PACKAGE_LIBS_PRIVATE],"-ljpeg $PACKAGE_LIBS_PRIVATE") + ], AC_MSG_WARN([no jpeg headers found])) + ], + AC_MSG_WARN([libjpeg not found]) + ) +fi + +# check if we want zlib support +AC_ARG_ENABLE([zlib], + [ --enable-zlib Enable zlib support for deflate compressed DNG files], + [case "${enableval}" in + yes) zlib=true ;; + no) zlib=false ;; + *) AC_MSG_ERROR([bad value ${enableval} for --enable-zlib]) ;; + esac],[zlib=true]) + +if test x$zlib = xtrue; then + PKG_CHECK_MODULES([ZLIB],[zlib],[ + CPPFLAGS="$CPPFLAGS $ZLIB_CFLAGS -DUSE_ZLIB" + LIBS="$LIBS $ZLIB_LIBS" + AC_SUBST([PACKAGE_REQUIRES],[zlib]) + ], + AC_MSG_WARN([zlib support cannot be enabled]) + ) +fi + +# check if we want LCMS support +AC_ARG_ENABLE([lcms], + [ --enable-lcms Enable LCMS support], + [case "${enableval}" in + yes) lcms=true ;; + no) lcms=false ;; + *) AC_MSG_ERROR([bad value ${enableval} for --enable-lcms]) ;; + esac],[lcms=true]) + +if test x$lcms = xtrue; then + PKG_CHECK_MODULES([LCMS2],[lcms2],[ + CPPFLAGS="$CPPFLAGS $LCMS2_CFLAGS -DUSE_LCMS2" + LIBS="$LIBS $LCMS2_LIBS" + AC_SUBST([PACKAGE_REQUIRES],[lcms2]) + ],[ + PKG_CHECK_MODULES([LCMS],[lcms],[ + CPPFLAGS="$CPPFLAGS $LCMS_CFLAGS -DUSE_LCMS" + LIBS="$LIBS $LCMS_LIBS" + AC_SUBST([PACKAGE_REQUIRES],[lcms]) + ],[ + AC_MSG_WARN([LCMS support cannot be enabled]) + ]) + ]) +fi + +# check if we want build examples +AC_ARG_ENABLE([examples], + [ --enable-examples Enable building of examples], + [case "${enableval}" in + yes) examples=true ;; + no) examples=false ;; + *) AC_MSG_ERROR([bad value ${enableval} for --enable-examples]) ;; + esac],[examples=true]) +AM_CONDITIONAL([EXAMPLES], [test x$examples = xtrue]) + +LIBS="$LIBS -lm" + +case "${host_os}" in + *mingw32*) LIBS="$LIBS -lws2_32" ;; +esac + +AC_SUBST([LIBRAW_SHLIB_VERSION],m4_esyscmd([./shlib-version.sh])) +AC_SUBST([LIBRAW_RELEASE_VERSION],m4_esyscmd([./version.sh])) + +AC_OUTPUT + diff --git a/rtengine/libraw/doc/API-C.html b/rtengine/libraw/doc/API-C.html new file mode 100644 index 000000000..0421bed08 --- /dev/null +++ b/rtengine/libraw/doc/API-C.html @@ -0,0 +1,188 @@ + + + + + +

LibRaw: C API[back to Index]

+

LibRaw: C API

+

LibRaw C API is a wrapper around C++ API; therefore, virtually all + documentation to C API functions is represented by a set of hyperlinks to + the corresponding places in the description of C++ + API.

+

Contents

+
    +
  1. Initialization and denitialization
  2. +
  3. Returned values
  4. +
  5. Data loading
  6. +
  7. Parameters getters/setters
  8. +
  9. Auxiliary Functions
  10. +
  11. Data Postprocessing, Emulation of dcraw Behavior + +
  12. +
  13. Writing to Output Files
  14. +
  15. Writing processing results to memory buffer
  16. +
+

+

Initialization and denitialization

+
+
libraw_data_t *libraw_init(unsigned int flags);
+
The function returns the pointer to the instance + of libraw_data_t structure.
+ The resultant pointer should be passed as the first argument to all C + API functions (except for libraw_strerror).
+ Returns NULL in case of error, pointer to the structure in all other + cases.
+
void libraw_close(libraw_data_t *);
+
Closes libraw_data_t handler and deallocates all memory.
+
+

+

Returned values

+

Functions of C API return EINVAL (see errno.h) if the null pointer was + passed to them as the first argument. In all other cases, the C++ + API return code is returned.

+

+

Data Loading from a File/Buffer

+
+
int libraw_open_file(libraw_data_t*, const char *)
+
int libraw_open_file_ex(libraw_data_t*, const char *,INT64 + bigfile_size)
+
WIN32: int libraw_open_wfile(libraw_data_t*, const wchar_t *)
+
WIN32: int libraw_open_wfile_ex(libraw_data_t*, const wchar_t *,INT64 + bigfile_size)
+
See LibRaw::open_file()
+
int libraw_open_buffer(libraw_data_t*, void *buffer, size_t bufsize)
+
See LibRaw::open_buffer()
+
int libraw_open_bayer(libraw_data_t *lr, unsigned char *data, unsigned + datalen, ushort _raw_width, ushort _raw_height, ushort _left_margin, + ushort _top_margin, ushort _right_margin, ushort _bottom_margin, + unsigned char procflags, unsigned char bayer_battern, unsigned + unused_bits, unsigned otherflags, unsigned black_level)
+
See LibRaw::open_bayer()
+
int libraw_unpack(libraw_data_t*);
+
See LibRaw::unpack()
+
int libraw_unpack_thumb(libraw_data_t*);
+
See LibRaw::unpack_thumb()
+
int libraw_unpack_thumb_ex(libraw_data_t*,int);
+
See LibRaw::unpack_thumb_ex()
+
+

+

Parameters setters/getters

+

These functions provides interface to imgdata.params, .sizes and .color + fields which works regardless of LibRaw versions used when building + calling app and the library itself.

+
    +
  • int libraw_get_raw_height(libraw_data_t *lr);
  • +
  • int libraw_get_raw_width(libraw_data_t *lr);
  • +
  • int libraw_get_iheight(libraw_data_t *lr);
  • +
  • int libraw_get_iwidth(libraw_data_t *lr);
  • +
  • float libraw_get_cam_mul(libraw_data_t *lr,int index);
  • +
  • float libraw_get_pre_mul(libraw_data_t *lr,int index);
  • +
  • float libraw_get_rgb_cam(libraw_data_t *lr,int index1, int index2);
  • +
  • libraw_iparams_t *libraw_get_iparams(libraw_data_t *lr);
  • +
  • libraw_lensinfo_t *libraw_get_lensinfo(libraw_data_t *lr);
  • +
  • libraw_imgother_t *libraw_get_imgother(libraw_data_t *lr);
  • +
  • int libraw_get_color_maximum(libraw_data_t *lr);
  • +
  • void libraw_set_user_mul(libraw_data_t *lr,int index, float val);
  • +
  • void libraw_set_demosaic(libraw_data_t *lr,int value);
  • +
  • void libraw_set_adjust_maximum_thr(libraw_data_t *lr,float value);
  • +
  • void libraw_set_output_color(libraw_data_t *lr,int value);
  • +
  • void libraw_set_output_bps(libraw_data_t *lr,int value);
  • +
  • void libraw_set_gamma(libraw_data_t *lr,int index, float value);
  • +
  • void libraw_set_no_auto_bright(libraw_data_t *lr,int value);
  • +
  • void libraw_set_bright(libraw_data_t *lr,float value);
  • +
  • void libraw_set_highlight(libraw_data_t *lr,int value);
  • +
  • void libraw_set_fbdd_noiserd(libraw_data_t *lr,int value);
  • +
  • int libraw_adjust_to_raw_inset_crop(libraw_data_t *lr, unsigned mask, float maxcrop);
  • +
+

+

Auxiliary Functions

+
+
const char* libraw_version()
+
See LibRaw::version()
+
int libraw_versionNumber()
+
See LibRaw::versionNumber()
+
+
See LibRaw::versionNumber()
+
bool LIBRAW_CHECK_VERSION(major,minor,patch)
+
See LIBRAW_CHECK_VERSION
+
unsigned libraw_capabilities()
+
See LibRaw::capabilities()
+
int libraw_cameraCount()
+
See LibRaw::cameraCount()
+
const char* libraw_cameraList()
+
See LibRaw::cameraList()
+
int libraw_get_decoder_info(libraw_data_t*,libraw_decoder_info_t *);
+
See LibRaw::get_decoder_info()
+
const char* libraw_unpack_function_name(libraw_data_t*);
+
See LibRaw::unpack_function_name()
+
int libraw_COLOR(libraw_data_t*,int row,int col);
+
See LibRaw::COLOR()
+
void libraw_subtract_black(libraw_data_t*);
+
See LibRaw::subtract_black()
+
void libraw_recycle_datastream(libraw_data_t*);
+
See LibRaw::recycle_datastream()
+
void libraw_recycle(libraw_data_t*);
+
See LibRaw::recycle()
+
const char *libraw_strerror(int errorcode);
+
See LibRaw::strerror
+
const char *libraw_strprogress(enum LibRaw_progress);
+
See LibRaw::strprogress
+
void libraw_set_dataerror_handler(libraw_data_t*,data_callback func, + void *);
+
See LibRaw::set_dataerror_handler()
+
void libraw_set_progress_handler(libraw_data_t*,progress_callback + func, void *);
+
See LibRaw::set_progress_handler()
+
+

+

Data Postprocessing, Emulation of dcraw Behavior

+

+

Setting of Parameters

+

The postprocessing parameters for the calls described below are set, just + as for C++ API, via setting of fields in the libraw_output_params_t + structure:

+
 libraw_data_t *ptr = libraw_init(0);
+ ptr->params.output_tiff = 1; //  output to TIFF
+    
+

Fields of this structure are described in the documentation + to libraw_output_params_t. For notes on their use, see API + notes.

+

+

Emulation of dcraw Behavior

+
+
int libraw_raw2image(libraw_data_t*);
+
See LibRaw::raw2image
+
int libraw_free_image(libraw_data_t*);
+
See LibRaw::free_image
+
int libraw_adjust_sizes_info_only(libraw_data_t*);
+
See LibRaw::adjust_sizes_info_only()
+
int libraw_dcraw_process(libraw_data_t* lr);
+
See LibRaw::dcraw_process()
+
+

Writing to Output Files

+
+
int libraw_dcraw_ppm_tiff_writer(libraw_data_t* lr,const char + *filename);
+
See LibRaw::dcraw_ppm_tiff_writer()
+
int libraw_dcraw_thumb_writer(libraw_data_t* lr,const char *fname);
+
See LibRaw::dcraw_thumb_writer()
+
+

Writing processing results to memory buffer

+
+
libraw_processed_image_t *libraw_dcraw_make_mem_image(libraw_data_t* + lr,int * errcode)
+
See LibRaw::dcraw_make_mem_image()
+
libraw_processed_image_t *libraw_dcraw_make_mem_thumb(libraw_data_t* + lr,int * errcode)
+
See LibRaw::dcraw_make_mem_thumb()
+
void libraw_dcraw_clear_mem(libraw_processed_image_t *);
+
See LibRaw::dcraw_clear_mem()
+

+
+
+

[back to Index]

+ + diff --git a/rtengine/libraw/doc/API-CXX.html b/rtengine/libraw/doc/API-CXX.html new file mode 100644 index 000000000..cf78531b2 --- /dev/null +++ b/rtengine/libraw/doc/API-CXX.html @@ -0,0 +1,877 @@ + + + + + +

LibRaw C++ API[back to Index]

+

LibRaw C++ API

+

Contents

+
    +
  1. LibRaw Objects
  2. +
  3. Returned values
  4. +
  5. Methods Loading Data from a File + +
  6. +
  7. Auxiliary Functions + +
  8. +
  9. Data Postprocessing: Emulation of dcraw Behavior + +
  10. +
  11. Data Output to Files: Emulation of dcraw Behavior + +
  12. +
  13. Copying unpacked data into memory buffer + +
  14. +
  15. Input layer abstraction + +
  16. +
+

+

LibRaw Objects

+

The main LibRaw object (class) is created either without parameters or + with flags determining the object behavior.

+
#include "libraw/libraw.h"
...

LibRaw ImageProcessor(unsigned int flags=0);
...
+

Flags (several flags are combined via operator |, i.e., bitwise OR):

+
    +
  • LIBRAW_OPTIONS_NO_DATAERR_CALLBACK: do not set the + standard file read error handler (standard + handler outputs the error report in stderr).
  • +
+

Three groups of methods are used for image processing

+ +

The results of processing are placed in the imgdata field of type libraw_data_t; + the same data set contains fields that control the postprocessing and + output.

+

+

Returned Values

+

All LibRaw API functions return an integer number in accordance with the + return code convention. Please read + the descriptions of this convention + and LibRaw behavior in cases of fatal errors.

+

+

Methods Loading Data from a File

+

+

int LibRaw::open_datastream(LibRaw_abstract_datastream *stream)

+

Opens a datastream with RAW data, reads metadata (EXIF) from it, and + fills the following structures:

+ +

The function returns an integer number in accordance with the return + code convention: positive if any system call has returned an error, + negative (from the LibRaw + error list) if there has been an error situation within LibRaw.

+

Before file opening, recycle() is always called; + hence, if several images are processed in the batch mode, there is no need + to call recycle() at the end of each processing cycle.

+

Input data: pointer to object, derived from LibRaw_abstract_datastream + class. This object should be initialized and ready to read. This object + should be destroyed in calling application after use.

+

+

int LibRaw::open_file(const char *filename[,INT64 bigfile_size])

+

Win32 only: int LibRaw::open_file(const wchar_t *filename[,INT64 + bigfile_size])

+

Creates an LibRaw_file_datastream object, + calls open_datastream(). If succeed, sets + internal flag which signals to destroy internal datastream object on recycle(). + On failure, just created file_datastream destroyed immediately.

+

Second optional parameter bigfile_size controls + background I/O interface used for file operations. For files smaller than + bigfile_size the LibRaw_file_datastream + will be used and the LibRaw_bigfile_datastream + otherwise.

+

The function returns an integer number in accordance with the return + code convention: positive if any system call has returned an error, + negative (from the LibRaw + error list) if there has been an error situation within LibRaw.

+

+

int LibRaw::open_buffer(void *buffer, size_t bufsize)

+

Created an LibRaw_buffer_datastream + object, calls open_datastream(). If + succeed, sets internal flag which signals to destroy internal datastream + object on recycle(). On failure, just created + file_datastream destroyed immediately.

+

The function returns an integer number in accordance with the return + code convention: positive if any system call has returned an error, + negative (from the LibRaw + error list) if there has been an error situation within LibRaw.

+

+

int LibRaw::open_bayer(unsigned char *data, unsigned datalen, ushort + _raw_width, ushort _raw_height, ushort _left_margin, ushort _top_margin, + ushort _right_margin, ushort _bottom_margin, unsigned char procflags, + unsigned char bayer_pattern, unsigned unused_bits, unsigned otherflags, + unsigned black_level)

+

Parameters:

+
    +
  • data, datalen - buffer passed
  • +
  • _raw_width/_raw_height/*margin - image size and margins
  • +
  • procflags: +
      +
    • for 10-bit format: +
        +
      • 1: "4 pixels in 5 bytes" packing is used
      • +
      • 0: "6 pixels in 8 bytes" packing is used
      • +
      +
    • +
    • for 16-bit format: +
        +
      • 1: Big-endian data
      • +
      +
    • +
    +
  • +
  • bayer_pattern: one of LIBRAW_OPENBAYER_RGGB,LIBRAW_OPENBAYER_BGGR, + LIBRAW_OPENBAYER_GRBG,LIBRAW_OPENBAYER_GBRG
  • +
  • unused_bits: count of upper zero bits
  • +
  • otherflags: +
      +
    • Bit 1 - filter (average neighbors) for pixels with values of zero +
    • +
    • Bits 2-4 - the orientation of the image (0=do not rotate, 3=180, + 5=90CCW, 6=90CW)
    • +
    +
  • +
  • black_level: file black level (it also may be specified via + imgdata.params)
  • +
+ See samples/openbayer_sample.cpp for usage sample (note, this sample is + 'sample only', suited for Kodak KAI-0340 sensor, you'll need change + open_bayer() params for your data). +

+

int LibRaw::unpack(void)

+

Unpacks the RAW files of the image, calculates the black level (not for + all formats). The results are placed in imgdata.image.

+

Data reading is sometimes (not frequently) affected by settings made in + imgdata.params (libraw_output_params_t); + see API notes for details.

+

The function returns an integer number in accordance with the return + code convention: positive if any system call has returned an error, + negative (from the LibRaw + error list) if there has been an error situation within LibRaw.

+

+

int LibRaw::unpack_thumb(void)

+

int LibRaw::unpack_thumb_ex(int i)

+

+

unpack_thumb(): reads (or unpacks) the default (largest) image preview + (thumbnail), placing the result into the imgdata.thumbnail.thumb buffer.

+

unpack_thumb_ex(int i): reads i-th thumbnail (thumbnails list is + available in imgdata.thumbs_list structure).

+

JPEG previews are placed into this buffer without any changes (with the + header etc.). Other preview formats are placed into the buffer in the form + of the unpacked bitmap image (three components, 8 bits per component).
+ The thumbnail format is written to the imgdata.thumbnail.tformat field; + for the possible values, see description + of constants and data structures.

+

The function returns an integer number in accordance with the return + code convention: positive if any system call has returned an error, + negative (from the LibRaw + error list) if there has been an error situation within LibRaw.

+

+

+

+

Auxiliary Functions

+

Library version check

+

+

const char* LibRaw::version()

+

Returns string representation of LibRaw version in + MAJOR.MINOR.PATCH-Status format (i.e. 0.6.0-Alpha2 or 0.6.1-Release).

+

+

int LibRaw::versionNumber()

+

Returns integer representation of LibRaw version. During LibRaw + development, the version number is always increase .

+

+

bool LIBRAW_CHECK_VERSION(major,minor,patch)

+

Macro for version check in caller applications. Returns 'true' if current + library version is greater or equal to set in macro parameters. This macro + executes at runtime (not at compile time) and may be used for checking + version of dynamically loaded LibRaw (from DLL/shared library).

+

List of supported RAW formats (cameras)

+

+

int LibRaw::cameraCount()

+

Returns count of cameras supported.

+

+

const char** LibRaw::cameraList()

+

Returns list of supported cameras. Latest item of list is set to NULL + (for easy printing).

+

+

int LibRaw::set_rawspeed_camerafile(char *path_to_cameras_xml)

+

(Only if LibRaw was built with RawSpeed support).

+

Loads XML file with RawSpeed camera description data (cameras.xml) + specified by path_to_cameras_xml. Returns 0 on success, nonzero on error. +

+

int LibRaw::get_decoder_info(libraw_decoder_info_t *)

+

The function fills libraw_decoder_info_t + structure by passed pointer with current raw decoder data.

+

The function returns an integer number in accordance with the return + code convention: positive if any system call has returned an error, + negative (from the LibRaw + error list) if there has been an error situation within LibRaw.

+

+

const char* LibRaw::unpack_function_name()

+

Returns function name of file unpacking function. Intended only for + LibRaw test suite designers to use in test coverage evaluation.

+

+

void LibRaw::setCancelFlag()

+

This call sets internal fast cancel flags. If set, current Raw decoder + will be terminated ASAP. This call is useful if you need to cancel all + LibRaw decoders in multithreaded program (e.g. for fast program + termination or just for cancel current processing).

+

+

void LibRaw::clearCancelFlag()

+

This call clears internal fast cancel flags, so (early) terminated LibRaw + decoder may work again.

+

+

int LibRaw::COLOR(int row, int col)

+

This call returns pixel color (color component number) in bayer pattern at + row,col. The returned value is in 0..3 range for 4-component Bayer (RGBG2, + CMYG and so on) and in 0..2 range for 3-color data.

+

Color indexes returned could be used as index in imgdata.idata.cdesc + string to get color 'name'.

+

+

int LibRaw::error_count()

+

This call returns count of non-fatal data errors (out of range, etc) + occurred in unpack() stage.

+

+

int LibRaw::subtract_black()

+

This call will subtract black level values from RAW data (for suitable + RAW data). colordata.data_maximum + and colordata.maximum and black level data (colordata.black + and colordata.cblack) will be adjusted too.

+

This call should be used if you postprocess RAW data by your own code. + LibRaw postprocessing functions will call subtract_black() + by oneself.

+

The function returns an integer number in accordance with the return + code convention: positive if any system call has returned an error, + negative (from the LibRaw + error list) if there has been an error situation within LibRaw.

+ +

int LibRaw::adjust_to_raw_inset_crop(unsigned mask, float maxcrop = + 0.55f)

+

Promotes imgdata.sizes.raw_inset_crops[] values to imgdata.sizes.*margin + and imgdata.sizes.width/height fields

+

Parameters
+ mask:

+
    +
  • if bit 1 is set: prefer raw_inset_crops[1]
  • +
  • if bit 0 is set: prefer raw_inset_crops[0]
  • +
+

maxcrop: limits crop to not less than (original width/height)*maxcrop; if + raw_inset_crops[i] data results in tighter crop, than this item is + ignored.

+

return value: index in raw_inset_crops[] used increased by one, so

+
    +
  • 0: no changes made
  • +
  • 1: [0]th data used
  • +
  • 2: [1]th data used
  • +
+

Note: this call SHOULD be used after LibRaw::unpack(), otherwise black + level calculation from masked area may be fooled resulting in wrong black + levels.

+

+

Support for floating point data

+

Libraw can read floating point DNG files (no other RAW formats may use + floating point) with or without conversion to integer data. Floating point + values are stored in imgdata.rawdata buffers:

+
    +
  • float * float_image (if + not NULL) points to floating point bayer data
  • +
  • float (*float3_image)[3] + (if not NULL) points to floating point 3-channel buffer
  • +
  • float (*float4_image)[4] + (if not NULL) points to floating point 4-channel buffer
  • +
+

Function calls for floating point support:

+
    +
  • int LibRaw::is_floating_point(); + function will return 1 if file contains floating point data
  • +
  • int LibRaw::have_fpdata(); + function will return 1 if FP data has read (decoded) into memory and not + converted to integer data
  • +
  • int LibRaw::convertFloatToInt(float dmin=4096.f, float dmax=32767.f, + float dtarget = 16383.f) converts floating point data to integer. If + data maximum is out of dmin..dmax range, than data scaled to set maximum + to dtarget
  • +
+

+

Support for YCC formats (Canon sRAW/mRAW and Nikon Small NEF)

+
       int LibRaw::is_sraw();
int LibRaw::is_nikon_sraw();
int LibRaw::sraw_midpoint()
+
    +
  • is_sraw() call returns nonzero if current image is YCC-based.
  • +
  • is_nikon_sraw() call returns nonzero for Nikon Small NEF files
  • +
  • sraw_midpoint() call returns neutral (gray) point for color channels
  • +
+

+

void LibRaw::set_dng_host(void* p)

+

If LibRaw is compiled with Adobe DNG SDK support and you wish to use this + support:

+
    +
  • you need to create own dng_host object
  • +
  • and pass it to LibRaw object using this function
  • +
+

void LibRaw::recycle_datastream(void)

+

This call closes input datastream with associated data buffer and + unblocks opened file.

+

void LibRaw::recycle(void)

+

Frees the allocated data of LibRaw instance, enabling one to process the + next file using the same processor. Repeated calls of recycle() are quite + possible and do not conflict with anything.

+

+

LibRaw::~LibRaw()

+

Destructor, which consists in calling recycle().

+

+

const char* LibRaw::strprogress(enum LibRaw_progress code)

+

Converts progress stage code to description string (in English).

+

+

const char* LibRaw::strerror(int errorcode)

+

Analog of strerror(3) function: outputs the text descriptions of LibRaw + error codes (in English).

+

+

Setting Error Notification Functions

+

In process of RAW conversion LibRaw can call user-setted callback. This + callback can be used for:

+
    +
  • Dynamic status update (progress bar and so on).
  • +
  • Cancel of processing (for example, user pressed Cancel button).
  • +
+

Also, work of the library may cause two types of exceptional situations + that require notification of the calling application:

+
    +
  • Memory shortage
  • +
  • Data read error.
  • +
+

An application may set its own callbacks that will be called in the cases + mentioned above to notify the user (or the calling program).

+

+

Progress indication/processing termination

+
        typedef int (*progress_callback)(void *callback_data,enum LibRaw_progress stage, int iteration, int expected);
void LibRaw::set_progress_handler(progress_callback func,void *callback_data);
+

LibRaw user can set own callback which will be called 10-50 times during + RAW postprocessing by dcraw_process().

+

This callback may terminate current image processing by returning of + non-zero value. In such case all processing will be cancelled immediately + and all resources will be returned to system by recycle() call. Current + call of dcraw_process() will return error code + LIBRAW_CANCELLED_BY_CALLBACK.

+

Callback parameters:

+
+
void *callback_data
+
void*-pointer, passed as 2nd argument to set_progress_handler(). This + pointer should be used to pass additional data to callback (i.e. thread + local data and so on).
+
enum LibRaw_progress stage
+
Current processing stage. This number can be converted to string by + call to LibRaw::strprogress. Not all + processing stages are covered by callback calls.
+
int iteration
+
Iteration number within current stage (from 0 to expected-1).
+
int expected
+
Expected number of iterations on current stage.
+
+

Callback should return value of: 0 for continue + processing and non-zero for immediate cancel of + processing.

+

 

+

If LibRaw compiled with OpenMP support, iteration parameter may not + always increase within one stage. Out of order callback calls are + possible.

+

Callback code sample:

+
int my_progress_callback(void *data,enum LibRaw_progress p,int iteration, int expected)
{
char *passed_string = (char *data);
printf("Callback: %s pass %d of %d, data passed: %s\n",libraw_strprogress(p),iteration,expected,passed_string);
if(timeout || key_pressed )
return 1; // cancel processing immediately
else
return 0; // can continue
}
+

+

User-specified exif tag parser callback

+
       typedef void (*exif_parser_callback) (void *context, int tag, int type, int len,unsigned int ord, void *ifp);
void LibRaw::set_exifparser_handler( exif_parser_callback cb,void *context);
+

Callback to be called on each parsed EXIF/Makernotes tag with parameters:

+
    +
  • context - pointer to context passed to set_exifparser_handler();
  • +
  • tag - EXIF/Makernotes tag value
  • +
  • type - TIFF(EXIF) tag type
  • +
  • len - tag length
  • +
  • ord - byte order (II or MM)
  • +
  • void *ifp - pointer to LibRaw_abstract_datastream, positioned to tag + data
  • +
+

+

File Read Error Notifier

+
        typedef void (*data_callback)(void *callback_data,const char *file, const int offset);
void LibRaw::set_dataerror_handler(data_callback func, void *callback_data);
+

The user can define his or her own function to be called in the case of + error in the input data. It is a void function receiving two parameters:

+
    +
  • void *callback_data - void*-pointer, passed as 2nd + argument to set_progress_handler(). This pointer should be used to pass + additional data to callback (i.e. thread local data and so on).
  • +
  • file is the name of the RAW file whose processing + evoked the file read error. This name can be NULL if + underlying data input layer does not know the name. So, if calling + application sets own callback, this callback should work with NULL file + name.
  • +
  • offset is -1 at end-of-file (if LibRaw expects more + data) or a positive number equal to the file position (bytes from file + beginning) where the unpacking error occurred.
  • +
+

The callback function is intended for information purposes: it notifies + the user or the program code that processing is impossible.

+

If the user does not set his or her own handler, the standard one (output + of error message in stderr) will be used.

+

One can set the null handler by passing NULL to set_dataerror_handler; + then no notifier function will be called. The same effect can be achieved + by creating a LibRaw object with the LIBRAW_OPTIONS_NO_DATAERR_CALLBACK + flag in the constructor.

+

In the case of error in the input data, processing of the current file is + terminated and a notifier is called; all allocated resources are freed, + and recycle() is performed. The current call will + return LIBRAW_IO_ERROR.
+ At an attempt to continue data processing, all subsequent calls will + return LIBRAW_OUT_OF_ORDER_CALL. Processing of a new file may be started + in the usual way, by calling LibRaw::open_file().

+

+

Data Postprocessing: Emulation of dcraw Behavior

+

Instead of writing one's own Bayer pattern postprocessing, one can use + the dcraw functions, which are called after the calls of open_file() + + unpack() /+ unpack_thumb()/

+

+

Parameter Setting

+

Virtually all parameters that can be set through the dcraw command line + are specified by assigning values to fields of the LibRaw::imgdata.params + structure. The type of this structure is libraw_output_params_t; + all fields are listed and described in sufficient detail in the description + of data structures.

+

+

int LibRaw::raw2image

+

This function allocates buffer for postprocessing (imgdata.image) and + fills it with data layout compatible with LibRaw 0.13/0.14 and below. If + the buffer is already allocated, it will be free()ed and allocated again.

+

This function should be called only if your code do postprocessing stage. + If you use LibRaw's postprocessing calls (see below) you don't need to + call raw2image().

+

The function returns an integer number in accordance with the return + code convention: positive if any system call has returned an error, + negative (from the LibRaw + error list) if there has been an error situation within LibRaw.

+

+

void LibRaw::free_image

+

This function releases the imgdata.image buffer allocated by raw2image();

+

This method should be called if current postprocessing results are not + needed by the program (e.g. already copied somewhere), but new + postprocessing calls (with another settings) are possible, so it is to + early to call recycle().

+

+

int LibRaw::adjust_sizes_info_only(void)

+

The function calculates the correct size of the output image + (imgdata.sizes.iwidth and imgdata.sizes.iheight) for the following cases:

+
    +
  • Files from Fuji cameras (with a 45-degree rotation)
  • +
  • Files from cameras with non-square pixels
  • +
  • Images shot by a rotated camera.
  • +
+

In the aforementioned cases, the function changes the fields of the image + output size; note that this change cannot be repeated again.

+

+

int LibRaw::dcraw_process(void)

+

The function emulates the postprocessing capabilities available in dcraw.
+ Called after calling LibRaw::unpack();

+

The entire functionality of dcraw (set via the field values in imgdata.params) + is supported, except for

+
    +
  • Dark frame subtraction
  • +
  • Work with bad pixels.
  • +
+

The function is intended solely for demonstration and testing purposes; + it is assumed that its source code will be used in most real applications + as the reference material concerning the order of RAW data processing.

+

The function returns an integer number in accordance with the error + code convention: positive if any system call has returned an error, + negative (from the LibRaw + error list) if there has been an error situation within LibRaw.

+

+

Data Output to Files: Emulation of dcraw Behavior

+

In spite of the abundance of libraries for file output in any formats, + LibRaw includes calls that emulate the file output provided by dcraw. This + is done primarily for easier verification of library work: the resultant + files must be binary identical.

+

+

int LibRaw::dcraw_ppm_tiff_writer(const char *outfile)

+

The function outputs the postprocessing results to a file in the PPM/PGM + or TIFF format (the format is set via imgdata.params.output_tiff). The + results are binary identical to those provided by dcraw.

+

If "-" is passed as outfile, the function will write to standard output + (stdout).

+

The function returns an integer number in accordance with the error + code convention: positive if any system call has returned an error, + negative (from the LibRaw + error list) if there has been an error situation within LibRaw.

+

+

int LibRaw::dcraw_thumb_writer(const char *thumbfile)

+

Writes the thumbnail to a file in the PPM format for bitmap thumbnails + and in the JPEG format for JPEG thumbnails, i.e., in the format completely + identical to the results provided by dcraw.

+

The function returns an integer number in accordance with the error + code convention: positive if any system call has returned an error, + negative (from the LibRaw + error list) if there has been an error situation within LibRaw.

+

+

Copying unpacked data into memory buffer

+

There is several function calls for store unpacked data into memory + buffer (after using dcraw_process() and so on):

+
    +
  • get_mem_image_format - get resulting bitmap size and + bit depth.
  • +
  • copy_mem_image - copy postprocessed data into some + memory buffer with different color order and line stride.
  • +
  • dcraw_make_mem_image - store processed image data + into allocated buffer;
  • +
  • dcraw_make_mem_thumb - store extracted thumbnail into + buffer as JPEG-file image (for most cameras) or as RGB-bitmap.
  • +
+

For usage primer see samples/mem_image.c sample.

+

 

+

+

void get_mem_image_format(int *widthp, int *heightp, int *colorsp, int + *bpp) const - return processing bitmap size

+

This function returns size of postprocessed image:

+
    +
  • Image width is returned in *widthp;
  • +
  • Bitmap height is returned in *heightp;
  • +
  • Image color count is returned in *colorsp;
  • +
  • Bits per pixel (8 or 16) is returned in *bpp;
  • +
+

+

int LibRaw::copy_mem_image(void* scan0, int stride, int bgr) - copies + postprocessed bitmap data into buffer

+

Function parameters:

+
    +
  • void *scan0 - pointer to buffer to copy data to. The buffer should be + at least stride*image_height bytes;
  • +
  • int stride - stride of each other image line (row) in bytes. Usually + image_width*(bit_per_pixel/8)*image_colors, but may be more if you wish + to align image rows to, for example, 8 or 16 or 32 bytes to make CPU + more happy.
  • +
  • int bgr - pixel copy order. RGB if bgr==0 and BGR otherwise.
  • +
+

The function returns an integer number in accordance with the error + code convention: positive if any system call has returned an error, + negative (from the LibRaw + error list) if there has been an error situation within LibRaw.

+

+

libraw_processed_image_t *dcraw_make_mem_image(int *errorcode=NULL) - + store unpacked and processed image into memory buffer as RGB-bitmap

+

This function allocates memory buffer and stores unpacked-preprocessed + image into this buffer. Function returns allocated structure libraw_processed_image_t + with filled fields. Always returns data as RGB bitmap (i.e. type + field is equal to LIBRAW_IMAGE_BITMAP).

+

dcraw_process() should be called before dcraw_make_mem_image();

+

Returns NULL in case of an error. If caller has passed not-NULL value as + errorcode parameter, than *errorcode will be set to error code according + to error code convention.

+

NOTE! Memory, allocated for return value will not be + fried at destructor or LibRaw::recycle calls. Caller of + dcraw_make_mem_image should free this memory by call to LibRaw::dcraw_clear_mem().

+

+

libraw_processed_image_t *dcraw_make_mem_thumb(int *errorcode=NULL) - + store unpacked thumbnail into memory buffer

+

This function allocates memory buffer and stores thumbnail data in it. + Function returns allocated structure libraw_processed_image_t + with filled fields. For most RAW images allocated structure will contains + JPEG image (i.e. type field is equal to + LIBRAW_IMAGE_JPEG). For some cameras with RGB-bitmap thumbnail (Kodak + SLRs) returned structure contains RGB bitmap (type field + is equal to LIBRAW_IMAGE_JPEG, see structure description for details).

+

unpack_thumb() should be called before dcraw_make_mem_thumb();

+

Returns NULL in case of an error. If caller has passed not-NULL value as + errorcode parameter, than *errorcode will be set to error code according + to error code convention.

+

NOTE! Memory, allocated for return value will not be + fried at destructor or LibRaw::recycle calls. Caller of + dcraw_make_mem_image should free this memory by call to LibRaw::dcraw_clear_mem().

+

void LibRaw::dcraw_clear_mem(libraw_processed_image_t *)

+

This function will free the memory allocated by dcraw_make_mem_image + or dcraw_make_mem_thumb.

+

This is static class member, so call syntax should be + LibRaw::dcraw_clear_mem(...).

+

This call translates directly to free() system function, but it is better + to use dcraw_clear_mem because LibRaw (DLL) may be compiled with memory + manager other than in calling application.

+

+

Input layer abstraction

+

+

class LibRaw_abstract_datastream - abstract RAW read interface

+

LibRaw reads RAW-data by calling (virtual) methods of C++ object derived + from LibRaw_abstract_datastream. This C++ class does not + implement any read, but defines interface to be called. Call to base class + methods always results in error.

+

+

LibRaw_abstract_datastream class methods

+

+
Object verification
+
+
virtual int valid()
+
Checks input datastream validity. Returns 1 on valid stream and 0 if + datastream was created on non-valid input parameters (wrong filename for + file stream and so on).
+
+

+
Stream read and positioning
+

This group of methods implements file object (FILE*) semantics.

+
+
virtual int read(void * ptr,size_t size, size_t nmemb)
+
Similar to fread(ptr,size,nmemb,file).
+
virtual int seek(off_t o, int whence)
+
Similar to fseek(file,o,whence).
+
virtual int tell(
+
Similar to ftell(file).
+
virtual int get_char()
+
Similar to getc(file)/fgetc(file).
+
virtual char* gets(char *s, int n)
+
Similar to fgets(s,n,file).
+
virtual int eof()
+
Similar to feof(file).
+
virtual int scanf_one(const char *fmt, void *val)
+
Simplified variant of fscanf(file,fmt,val): format string is always + contains one argument to read. So, variable args call is not needed and + only one pointer to data passed.
+
virtual int jpeg_src(void * p);
+
Initializes read structures in j_decompress_ptr object passed as *p. + This object is used by libjpeg for JPEG data reading from datastream. +

Returns -1 on error and 0 on success.

+
+
+

+
Other methods
+

This group of methods includes several supplementary calls. These calls + are used to temporary switch to another data stream (file and/or memory + buffer).

+
+
virtual const char* fname()
+
Returns name of opened file if datastream object knows it (for + example, LibRaw_file_datastream used). Filename used + in: +
    +
  • error notification callbacks;
  • +
  • generation of filename of JPEG-file with metadata when needed + (i.e. cameras with 'Diag RAW hack').
  • +
+
+
virtual int subfile_open(const char *fn)
+
This call temporary switches input to file fn. + Returns 0 on success and error code on error.
+ The function used to read metadata from external JPEG file (on cameras + with "Diag RAW hack").
+ This call is not implemented for LibRaw_buffer_datastream, + so external JPEG processing is not possible when buffer datastream used. +
+ This function should be implemented in real input class, base class call + always return error.
+ Working implementation sample can be found in LibRaw_file_datastream + implementation in libraw/libraw_datastream.h file.
+
virtual void subfile_close()
+
This call switches input stream from temporary open file back to main + data stream.
+
virtual int tempbuffer_open(void *buf, size_t size)
+
This call temporary switches input to LibRaw_buffer_datastream + object, created from buf.
+ This method is needed for Sony encrypted metadata parser. +

This call implemented in base class (LibRaw_abstract_datastream), + there is no need to reimplement in in derived classes.
+ Possible activity of temporary datastream requires very accurate + programming when implementing datastreams derived from base LibRaw_abstract_datastream. + See below for more details.

+
+
virtual void tempbuffer_close()
+
This call switch input back from temporary datastream to main stream. + This call implemented in base LibRaw_abstract_datastream + class.
+
+

+

Derived input classes included in LibRaw

+

There is three "standard" input classes in LibRaw distribution:

+ +

LibRaw C++ interface users can implement their own input classes and use + them via LibRaw::open_datastream call. + Requirements and implementation specifics are described below.

+

+

class LibRaw_file_datastream - file input interface

+

This class implements input from file.

+

Class methods:

+
+
LibRaw_file_datastream(const char *fname)
+
This constructor creates LibRaw_file_datastream + object from file fname.
+ Unfortunately, C++ constructor cannot return an error. So if bad + filename passed (e.g. nonexistent file) object is created as non-valid + (valid() call returns zero).
+
+

All other class methods are described + above.
+ This class implements all possible methods, including fname() and + subfile_open().

+

+

class LibRaw_bigfile_datastream - file input interface

+

This class implements input from file.

+

Class methods:

+
+
LibRaw_bigfile_datastream(const char *fname)
+
This constructor creates LibRaw_bigfile_datastream + object from file fname.
+ Unfortunately, C++ constructor cannot return an error. So if bad + filename passed (e.g. nonexistent file) object is created as non-valid + (valid() call returns zero).
+
+

The difference between file and bigfile + datastreams are obvious from class name: bigfile one supports large files + (more than 2Gb) on all supported systems. File one uses streambuf + interface which is limited to 2Gb on many systems.

+

All other class methods are described + above.
+ This class implements all possible methods, including fname() and + subfile_open().

+

+

class LibRaw_buffer_datastream - memory buffer input interface

+

This class implements input from memory buffer.

+

Class methods:

+
+
LibRaw_buffer_datastream(void *buffer, size_t bsize)
+
This constructor creates datastream object from buffer + with size bsize.
+ It is not possibly to verify the pointer passed, so buffer address is + checked against 0 and -1 only.
+
+

All other class methods are described + above.
+ This class does not implement fname() and subfile_open() calls, so + external JPEG metadata parsing is not possible.

+

+

Own datastream derived classes

+

To create own read interface LibRaw user should implement C++ class + derived from LibRaw_abstract_datastream with all read + methods.
+ LibRaw standard implementations may be used as reference. See libraw/libraw_datastream.h + file for details (all standard LibRaw input classes are implemented using + inline functions only).

+

+

[back to Index]

+ + diff --git a/rtengine/libraw/doc/API-datastruct.html b/rtengine/libraw/doc/API-datastruct.html new file mode 100644 index 000000000..1907b36b5 --- /dev/null +++ b/rtengine/libraw/doc/API-datastruct.html @@ -0,0 +1,1361 @@ + + + + LibRaw: Data Structures and Constants + + +

LibRaw: Data Structures and Constants [back to + Index]

+

LibRaw: Data Structures and Constants

+

LibRaw data structures are defined in header file libraw/libraw_types.h
+ Constants used in its work are defined in file libraw/libraw_const.h

+

Contents:

+
    +
  1. Data structures +
      +
    1. libraw_data_t: Main Data Structure in + LibRaw
    2. +
    3. Structure libraw_iparams_t: Main + Parameters of the Image
    4. +
    5. Structure libraw_image_sizes_t: + Image Dimensions
    6. +
    7. Structure libraw_colordata_t: Color + Information
    8. +
    9. Structure libraw_imgother_t: Other + Parameters of the Image
    10. +
    11. Structure libraw_rawdata_t: holds + unpacked RAW data
    12. +
    13. Structure libraw_thumbnail_t: + Description of extracted Thumbnail
    14. +
    15. Structure + libraw_thumbnail_list_t: Description of file's thumbnail list
    16. +
    17. Structure libraw_lensinfo_t - lens + data, extracted from EXIF/Makernotes
    18. +
    19. Structure + libraw_raw_unpack_params_t: metadata and raw decoding options and + flags
    20. +
    21. Structure + libraw_output_params_t: Management of dcraw-style postprocessing
    22. +
    23. Structure libraw_callbacks_t: + user-settable callbacks
    24. +
    25. Structure + libraw_processed_image_t - result set for + dcraw_make_mem_image()/dcraw_make_mem_thumb() functions
    26. +
    +
  2. +
  3. Input abstraction layer + +
  4. +
  5. Constants +
      +
    1. enum LibRaw_errors: Error Codes
    2. +
    3. enum LibRaw_decoder_flags - RAW data + format description
    4. +
    5. enum LibRaw_progress: Current State of LibRaw + Object
    6. +
    7. enum + LibRaw_thumbnail_formats: Thumbnail Data Formats
    8. +
    9. Nonstandard Situations (Warnings) during RAW + Data Processing
    10. +
    11. enum LibRaw_image_formats - + possible types of data, contains in libraw_processed_image_t + structure
    12. +
    13. enum + LibRaw_processing_options - flags that affects extracted RAW data
    14. +
    15. enum LibRaw_rawspecial_t - special + raw extraction modes
    16. +
    +
  6. +
+

+

Data Structures

+

+

libraw_data_t: Main Data Structure of LibRaw

+

Structure libraw_data_t is a "wrapping" for data structures accessible to + the user of the library.
+ When one uses C++ API, it is accessible as LibRaw::imgdata + (class_instance.imgdata). The data in this structure appear after a file + is opened through open_file (and other open_ calls), except for the image + itself (filled by unpack()) and data containing the preview information + (filled by calling unpack_thumb()).

+

Data fields:

+
+
unsigned int progress_flags;
+
This field records the past phases of image + processing .
+
unsigned int process_warnings;
+
This field records suspicious situations + (warnings) that have emerged during image processing.
+
libraw_iparams_t idata;
+
The structure describes the main image parameters retrieved from the + RAW file. Fields of this structure are described in detail + below .
+
libraw_image_sizes_t sizes;
+
The structure describes the geometrical parameters of the image. + Fields of this structure are described in detail + below .
+
libraw_lensinfo_t lens;
+
The structure describes lens used for the shot. Fields of this + structure are described in detail below + .
+
libraw_makernotes_t makernotes;
+
The structure contains camera/vendor specific metadata extracted from + file. No description provided, sorry, if you're interested in particular + tag/camera/vendor - use Exiftool documentation as a reference
+
libraw_colordata_t color;
+
The structure contains color data retrieved from the file. Fields of + this structure are described in detail + below .
+
libraw_imgother_t other;
+
Data structure for information purposes: it contains the image + parameters that have been extracted from the file but are not needed in + further file processing. Fields of this structure are described in + detail below .
+
libraw_thumbnail_t thumbnail;
+
Data structure containing information on the preview and the preview + data themselves. All fields of this structure but thumbnail itself are + filled when open_file() is called. Thumbnail read by unpack_thumb() + call. The fields are described in detail + below .
+
libraw_rawdata_t rawdata;
+
Data structure with pointer to raw-data buffer. Details are described + below .
+
ushort (*image)[4];
+
The memory area that contains the image pixels per se. It is filled + when raw2image() or dcraw_process() is called.
+
libraw_output_params_t params;
+
Data structure intended for management of image postprocessing (using + the dcraw emulator). Fields of this structure are described in detail below .
+
libraw_callbacks_t callbacks;
+
user-settable callbacks
+
+

+

Structure libraw_iparams_t: Main Parameters of the Image

+
+
char make[64];
+
Camera manufacturer.
+
char model[64];
+
Camera model.
+
normalized_make[64]
+
There is a huge number of identical cameras sold under different + names, depending on the market (e.g. multiple Panasonic or Canon models) + and even some identical cameras sold under different brands (Panasonic + -> Leica, Sony -> Hasselblad). normalized_make contains primary + vendor name (e.g. Panasonic for Leica re-branded cameras).
+
normalized_model[64]
+
Primary camera model name.
+
unsigned maker_index
+
Primary vendor name in indexed form (enum LibRaw_cameramaker_index, + LIBRAW_CAMERAMAKER_* constant)
+
char software[64];
+
Softwary name/version (mostly for DNG files, to distinguish in-camera + DNGs from Adobe DNG Converter produced ones).
+
unsigned raw_count;
+
Number of RAW images in file (0 means that the file has not been + recognized).
+
unsigned is_foveon;
+
Nonzero for Sigma Foveon images
+
unsigned dng_version;
+
DNG version (for the DNG format).
+
int colors;
+
Number of colors in the file.
+
unsigned filters;
+
Bit mask describing the order of color pixels in the matrix (0 for + full-color images). 32 bits of this field describe 16 pixels (8 rows + with two pixels in each, from left to right and from top to bottom). + Each two bits have values 0 to 3, which correspond to four possible + colors. Convenient work with this field is ensured by the + COLOR(row,column) function, which returns the number of the active color + for a given pixel.
+ Values less than 1000 are reserved as special cases: +
    +
  • 1 - Leaf Catchlight with 16x16 bayer matrix;
  • +
  • 9 - Fuji X-Trans (6x6 matrix)
  • +
  • 3..8 and 10..999 - are unused.
  • +
+
+
char xtrans[6][6];
+
char xtrans_abs[6][6];
+
These matrices contains Fuji X-Trans row/col to color mapping. First + one is relative to visible area, while second is positioned relative to + sensor edges.
+
char cdesc[5];
+
Description of colors numbered from 0 to 3 (RGBG,RGBE,GMCY, or GBTG).
+
unsigned xmplen; char *xmpdata;
+
XMP packed data length and pointer to extracted XMP packet.
+
+

+

Structure libraw_image_sizes_t: Image Dimensions

+

Structure libraw_image_sizes_t is a collection of all file data that + describe the size of the image.

+

Data fields:

+
+
ushort raw_height, raw_width;
+
Full size of RAW image (including the frame) in pixels.
+
ushort height, width;
+
Size of visible ("meaningful") part of the image (without the frame).
+
ushort top_margin, left_margin;
+
Coordinates of the top left corner of the frame (the second corner is + calculated from the full size of the image and size of its visible + part).
+
ushort iheight, iwidth;
+
Size of the output image (may differ from height/width for cameras + that require image rotation or have non-square pixels).
+
unsigned raw_pitch;
+
Full size of raw data row in bytes .
+
double pixel_aspect;
+
Pixel width/height ratio. If it is not unity, scaling of the image + along one of the axes is required during output.
+
int flip;
+
Image orientation (0 if does not require rotation; 3 if requires + 180-deg rotation; 5 if 90 deg counterclockwise, 6 if 90 deg clockwise).
+
libraw_raw_inset_crop_t raw_inset_crops[2];
+
(libraw_raw_inset_crop_t: ushort cleft, ctop, + cwidth, cheight;) +
    +
  • item at[0] contains standard crop data parsed from camera metadata + (DNG: DefaultCrop* tags, other formats: vendor specific tags)
  • +
  • item at [1] is 'user crop', in particular:
    + - set by DNG DefaultUserCrop tag
    + - or set via raw aspect ratio tags (e.g. 16:9 aspect on Fujifilm + cameras) raw_inset_crops[1] is filled only if aspect ratio tags + provides different aspect ratio compared to raw_inset_crops[0].
  • +
+
+
+

+

Structure libraw_colordata_t: Color Information

+

Structure libraw_colordata_t unites all color data, both retrieved from + the RAW file and calculated on the basis of the image itself. For + different cameras, there are different ways of color handling.

+

Data fields:

+
+
ushort curve[0x10000];
+
Camera tone curve. May be read from file as is, or calculated, + depending on file format;
+
unsigned black;
+
Black level. Depending on the camera, it may be zero (this means that + black has been subtracted at the unpacking stage or by the camera + itself), calculated at the unpacking stage, read from the RAW file, or + hardcoded.
+
unsigned cblack[4102];
+
Per-channel black level correction. First 4 values are per-channel + correction, next two are black level pattern block size, than + cblack[4]*cblack[5] correction values (for indexes + [6....6+cblack[4]*cblack[5]).
+
unsigned data_maximum;
+
Maximum pixel value in current file. Calculated at raw2image or + dcraw_process() calls.
+
unsigned maximum;
+
Maximum pixel value. Calculated from the data for most cameras, + hardcoded for others. This value may be changed on postprocessing stage + (when black subtraction performed) and by automated maximum adjustment + (this adjustment performed if params.adjust_maximum_thr + is set to nonzero).
+
unsigned linear_max[4];
+
Per-channel linear data maximum read from file metadata. If RAW file + does not contains this data, linear_max[] is set to zero. Black value is + not subtracted
+
float fmaximum;
+
Maximum pixel value in real image for floating data files.
+
float fnorm;
+
Normalization coefficient used while converting floating point raw + data to integer.
+
ushort white[8][8];
+
Block of white pixels extracted from files CIFF/CRW. Not extracted for + other formats. Used to calculate white balance coefficients.
+
float cam_xyz[4][3];
+
Camera RGB - XYZ conversion matrix. This matrix is constant (different + for different models). Last row is zero for RGB cameras and non-zero for + different color models (CMYG and so on).
+
float cam_mul[4];
+
White balance coefficients (as shot). Either read from file or + calculated.
+
float pre_mul[4];
+
White balance coefficients for daylight (daylight balance). Either + read from file, or calculated on the basis of file data, or taken from + hardcoded constants.
+
float cmatrix[3][4];
+
Camera color data read from RAW file (if any)
+
float rgb_cam[3][4];
+
Camera to sRGB conversion matrix
+
float ccm[3][4];
+
Camera color correction matrix read from file metadata (uniform + matrix if no such data in file)
+
ph1_t phase_one_data;
+
Color data block that is read for Phase One cameras.
+
float flash_used;
+
float canon_ev;
+
Fields used for white balance calculations (for some P&S Canon + cameras).
+
char model2[64];
+
Firmware revision (for some cameras).
+
char UniqueCameraModel[64],LocalizedCameraModel[64];
+
Values from DNG tags with same names.
+
void *profile;
+
Pointer to the retrieved ICC profile (if it is present in the RAW + file).
+
unsigned profile_length;
+
Length of ICC profile in bytes.
+
unsigned black_stat[8];
+
Black level statistics if calculated from masked area: 4 sum of pixel + values, than 4 pixel counts (per channel).
+
libraw_dng_color_t dng_color[2];
+
Color data read from DNG: illuminant, calibration matrix and color + matrix for two light sources. (see DNG specs for details).
+
libraw_dng_levels_t dng_levels
+
DNG black/white levels, analog balance, WB for active IFD. See DNG + specs for details.
+
int WB_Coeffs[256][4]
+
Index: EXIF color source value, [i][0..3] WB Coeffs
+
float WBCT_Coeffs[64][5]
+
Color temperature in [i][0], WB coeffs in [i][1..4]
+
int as_shot_wb_applied
+
Set to 1 if WB already applied in camera (multishot modes; small raw)
+
libraw_P1_color_t P1_color[2]
+
Phase-one specific color data
+
unsigned raw_bps
+
RAW bits per pixel (PhaseOne: Raw format used)
+
int ExifColorSpace
+
EXIF color space parsed from EXIF tags: LIBRAW_COLORSPACE_Unknown, + LIBRAW_COLORSPACE_sRGB, or LIBRAW_COLORSPACE_Adobe
+
+

+

Structure libraw_imgother_t: Other Parameters of the Image

+

Data fields:

+
+
float iso_speed;
+
ISO sensitivity.
+
float shutter;
+
Shutter speed.
+
float aperture;
+
Aperture.
+
float focal_len;
+
Focal length.
+
time_t timestamp;
+
Date of shooting.
+
unsigned shot_order;
+
Serial number of image.
+
unsigned gpsdata[32];
+
GPS data (unparsed block, to write to output as is).
+
libraw_gps_info_t parsed_gps;
+
Parsed GPS-data: longitude/latitude/altitude and time stamp.
+
char desc[512];
+
Image description.
+
char artist[64];
+
Author of image.
+
float FlashEC;
+
Flash exposure compensation.
+
+

+

Structure libraw_rawdata_t: holds unpacked RAW data

+

Structure libraw_rawdata_t holds:

+
    +
  • RAW-data from sensor, read and unpacked by the + unpack() call.
  • +
  • "backup" copy of color and over data modified during postprocessing. + When postprocessing calls repeats, the needed data is restored from this + backup.
  • +
+

Data fields:

+
+
void *raw_alloc;
+
Buffer allocated to hold RAW-data
+
unsigned short *raw_image;
+
Pointer to buffer with one-component (bayer) data.
+
unsigned short (*color3_image)[3];
+
Pointer to 3-component pixel array.
+
unsigned short (*color4_image)[4];
+
Pointer to buffer with 4-component pixel data data
+
float *float_image;
+
Pointer to buffer with one-component (bayer) data in FP-format.
+
float (*float3_image)[3];
+
Pointer to 3-component FP pixel array.
+
float (*float4_image)[4];
+
Pointer to buffer with 4-component pixel data data
+
+

After call to unpack() only one of + these fields is non-NULL.

+

All other fields of this structure are for internal use and should not be + touched by user code.

+

Structure libraw_thumbnail_t: Description of Thumbnail

+

Structure libraw_thumbnail_t describes all parameters associated with the + preview saved in the RAW file.

+

Data fields:

+
+
LibRaw_thumbnail_formats tformat;
+
Thumbnail data format. One of the values among enum + LibRaw_thumbnail_formats .
+
ushort twidth, theight;
+
Dimensions of the preview image in pixels.
+
unsigned tlength;
+
Thumbnail length in bytes.
+
int tcolors;
+
Number of colors in the preview.
+
char *thumb;
+
Pointer to thumbmail, extracted from the data file.
+
+

+

Structure libraw_thumbnail_list_t: thumbnails present in the RAW file

+

libraw_thumbnail_list_t holds list of thumbnails (previews) present in + RAW file.

+

Data fields:

+
+
int thumbcount;
+
Thumbnail count
+
libraw_thumbnail_item_t thumblist[LIBRAW_THUMBNAIL_MAXCOUNT];
+
Array of libraw_thumbnail_item_t, one for each thumbnail: +
+
enum LibRaw_internal_thumbnail_formats tformat
+
Internal thumbnail format (this field stores thumbnail decoder + needed for thumbnail extraction)
+
ushort twidth, theight
+
Thumbnail image size. Note: these fields may be zero (so, image + size is unknown at parse phase)
+
ushort tflip
+
Thumbnail image rotation, it may differ from main image rotation. + This field may be set to 0xffff, this means 'rotation is not known'
+
unsigned tlength;
+
Thumbnail on-disk data size
+
unsigned tmisc;
+
Bits per pixel and color count: (color << 5) | bits
+
INT64 toffset;
+
Thumbnail data offset in file
+
+
+
+

+ Note: even if no thumbnails were found in TIFF/CR3 structure, the + thumbcount field will be initialized to 1 and thumblist[0] will be + initialized to thumbnail data from the thumbnail data, so + LibRaw::unpack_thumb_ex(0) will do the same as LibRaw::unpack_thumb(). +

+

+

Structure libraw_lensinfo_t: parsed lens data

+

The following parameters are extracted from Makernotes and EXIF, to help + identify which lens was mounted on the camera. If the value is missing in + Makernotes or EXIF, the parameter is set to zero with some exceptions + noted below. In some cases the values for the fields like CameraFormat and + CameraMount are set based on the camera model and/or camera ID.

+

libraw_makernotes_lens_t structure:

+
    +
  • LensID (if not -1) and CamID + (camera id, if non-zero) values are compatible with those used in + exiftool, like |0x0010 CanonModelID| and |22 LensType| see http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Canon.html + or 0x0207/CameraType and 0x0201/LensType (see http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Olympus.html + )
  • +
  • Lens string, if not empty, contains the lens name + present in Makernotes.
  • +
  • LensFormat and CameraFormat + currently provide one of value from enum LibRaw_camera_formats;
  • +
  • In a similar manner, values for LensMount and CameraMount + follow the enum LibRaw_camera_mounts;
  • +
  • In some cases, the Makernotes for MF cameras contain either an id for + the body, or a string containing the name of the body. The name is + copied to body field, while the id is converted to the + appropriate body name and also copied to 'body' field. In other cases + the 'body' field is empty.
  • +
  • FocalType is set based on Makernotes tag, if present. + The values are:
  • +
      +
    • -1 Undefined
    • +
    • 0 Unknown;
    • +
    • 1 Fixed focal length lens
    • +
    • 2 Zoom lens
    • +
    +
  • LensFeatures_pre - lens name prefix and LensFeatures_suf + - lens name suffix: (if not empty) some cameras record alphabet soup + that characterizes the lens in separate Makernote tags (see, for + example, 0xb02a LensSpec at http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Sony.html + ), and for some lenses those acronyms can be derived from the 'Lens' + field itself (see processCanonCameraInfo). Those can also help better + lens identification.
  • +
  • MinFocal and MaxFocal , if + non-zero, contain the minimum and maximum focal lengths for the lens + mounted on the camera.
  • +
  • MaxAp4MinFocal, MaxAp4MaxFocal, MinAp4MinFocal, + MinAp4MaxFocal - if non-zero, contain maximum aperture + available at minimal focal length, maximum aperture available at maximum + focal length, minimum aperture available at minimal focal length, + minimum aperture available at maximum focal length, respectively.
  • +
  • MaxAp and MinAp, if non-zero, + contain the maximum aperture for the lens (usually it is the maximum + aperture for minimal focal length) and the minimum aperture across the + focal length range. For zooms with variable maximum aperture this is + usually the minimum aperture for the maximum focal length.
  • +
  • CurFocal, if non-zero, is current focal length - that + is the focal length used to take the shot.
  • +
  • CurAp, if non-zero, is current aperture.
  • +
  • MaxAp4CurFocal and MinAp4CurFocal, + if non-zero, contain the minimum and maximum apertures for the current + focal length.
  • +
  • LensFStops - if non-zero, contains the number of + aperture "clicks" or the number of f-stops, depending on the model of + the camera.
  • +
  • TeleconverterID, AdapterID, AttachmentID, + if non-zero, are the numbers extracted from Makernotes to identify lens + accessories used to take the shot.
  • +
  • Teleconverter, Adapter, Attachment, + if non-empty, are the strings containing the names of the accessories as + they appear in Makernotes, or for some cameras, decoded from a numeric + field in Makernotes.
  • +
  • FocalUnits - an auxiliary field, should not be needed + most of the cases. See Canon.pm module in exiftool for more information + on this value.
  • +
  • FocalLengthIn35mmFormat, if non-zero: for some reason + certain Samsung cameras record this value in Makernotes instead of the + EXIF proper. Also used for Sigma cameras.
  • +
+

libraw_nikonlens_t structure:

+

Contains additional parameters needed to identify the lens on a Nikon + camera using a table - please see Nikon LensID Values at http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html

+

libraw_dnglens_t structure:

+

Contains minimum focal length, maximum focal length, maximum aperture + available at minimal focal length, and maximum aperture available at + maximum focal length, extracted from EXIF field of a DNG raw file.

+

libraw_lensinfo_t structure:

+

Contains all the structures described above, plus parameters extracted + directly from EXIF fields:

+
    +
  • MinFocal and MaxFocal , if + non-zero, contain the minimum and maximum focal lengths for the lens + mounted on the camera.
  • +
  • MaxAp4MinFocal, MaxAp4MaxFocal - if + non-zero, contain maximum aperture available at minimal focal length and + maximum aperture available at maximum focal length
  • +
  • LensMake, if not empty, contains a string with the + lens manufacturer name.
  • +
  • Lens, if not empty, contains the lens name as + recorded in EXIF
  • +
  • FocalLengthIn35mmFormat - if non-zero, same as + FocalLengthIn35mmFilm in EXIF standard, tag 0xa405.
  • +
  • EXIF_MaxAp - if non-zero, contains the value derived + from EXIF tag 0x9205.
  • +
+

+

Structure libraw_raw_unpack_params_t: RAW decoding options and flags

+

Structure libraw_raw_unpack_params_t contains fields/flags that affects + RAWdata and metadata decoding

+
+
int options
+
Processing options used on unpack() phase for specific image formats, + see below for possible values: + LibRaw_processing_options
+
unsigned shot_select;
+
dcraw keys: -s
+ Selection of image number for processing (for formats that contain + several RAW images in one file).
+
int specials
+
Special processing mode (e.g. omit YCC to RGB conversion), see below + for possible values. + LibRaw_rawspecial_t
+
int max_raw_memory_mb
+
Stop processing if raw buffer size grows larger than that value (in + megabytes). Default is LIBRAW_MAX_ALLOC_MB_DEFAULT (2048Mb)
+
int sony_arw2_posterization_thr
+
If LIBRAW_PROCESSING_SONYARW2_DELTATOVALUE used for + raw_processing_options, sets the level to suppress posterization display + in shadows.
+
float coolscan_nef_gamma;
+
Gamma value for Coolscan NEF decoding (no way to get if from file, it + should be set by calling application).
+
char p4shot_order[5];
+
Shot order for Pentax 4shot files. Default is "3102".
+
+

+

Structure libraw_output_params_t: management of dcraw-style + postprocessing

+

Structure libraw_output_params_t (imgdata.params) is used for management + of dcraw-compatible calls dcraw_process(), dcraw_ppm_tiff_writer(), and + dcraw_thumb_writer(). Fields of this structure correspond to command line + keys of dcraw.

+

Data fields:

+
+
unsigned greybox[4];
+
dcraw keys: -A x y w h
+ 4 numbers corresponding to the coordinates (in pixels) of the rectangle + that is used to calculate the white balance. X and Y are coordinates of + the left-top rectangle corner; w and h are the rectangle's width and + height, respectively.
+
unsigned cropbox[4];
+
dcraw keys: none
+ This field sets the image cropping rectangle. Cropbox[0] and cropbox[1] + are the rectangle's top-left corner coordinates, remaining two values + are width and height respectively. All coordinates are applied before + any image rotation.
+
double aber[4];
+
dcraw keys: -C
+ Correction of chromatic aberrations; the only specified values are
+ aber[0], the red multiplier
+ aber[2], the blue multiplier. For some formats, it affects + RAW data reading , since correction of aberrations changes the + output size.
+
double gamm[6];
+
dcraw keys: -g power toe_slope
+ Sets user gamma-curve. Library user should set first two fields of gamm + array:
+ gamm[0] - inverted gamma value)
+ gamm[1] - slope for linear part (so called toe slope). Set to zero for + simple power curve.
+ Remaining 4 values are filled automatically.
+ By default settings for rec. BT.709 are used: power 2.222 (i.e. + gamm[0]=1/2.222) and slope 4.5. For sRGB curve use gamm[0]=1/2.4 and + gamm[1]=12.92, for linear curve set gamm[0]/gamm[1] to 1.0.
+
float user_mul[4];
+
dcraw keys: -r mul0 mul1 mul2 mul3
+ 4 multipliers (r,g,b,g) of the user's white balance.
+
float bright;
+
dcraw keys: -b
+ Brightness (default 1.0).
+
float threshold;
+
dcraw keys: -n
+ Parameter for noise reduction through wavelet denoising.
+
int half_size;
+
dcraw keys: -h
+ Outputs the image in 50% size. For some formats, it affects + RAW data reading .
+
int four_color_rgb;
+
dcraw keys: -f
+ Switches on separate interpolations for two green components.
+
int highlight;
+
dcraw keys: -H
+ 0-9: Highlight mode (0=clip, 1=unclip, 2=blend, 3+=rebuild).
+
int use_auto_wb;
+
dcraw keys: -a
+ Use automatic white balance obtained after averaging over the entire + image.
+
int use_camera_wb;
+
dcraw keys: -w
+ If possible, use the white balance from the camera. +

If camera-recorded WB is not available, dcraw_process() will + fallback to:

+
    +
  • Auto-WB if bit LIBRAW_PROCESSING_CAMERAWB_FALLBACK_TO_DAYLIGHT is + not set in params.raw_processing_options (or for the rare specific + case: no valid WB index was parsed from CRW file)
  • +
  • Daylight-WB if abovementioned bit is not set.
  • +
+
+
int use_camera_matrix;
+
dcraw keys: +M/-M
+
    +
  • 0: do not use embedded color profile
  • +
  • 1 (default): use embedded color profile (if present) for DNG files + (always); for other files only if use_camera_wb is set;
  • +
  • 3: use embedded color data (if present) regardless of white + balance setting.
  • +
+
+
int output_color;
+
dcraw keys: -o
+ [0-8] Output colorspace (raw, sRGB, Adobe, Wide, ProPhoto, XYZ, ACES, + DCI-P3, Rec. 2020).
+
char* output_profile;
+
dcraw keys: -o filename
+ Path to output profile ICC file (used only if LibRaw compiled with LCMS + support)
+
char* camera_profile;
+
dcraw keys: -p file
+ Path to input (camera) profile ICC file (or 'embed' for embedded + profile). Used only if LCMS support compiled in.
+
char* bad_pixels;
+
dcraw keys: -P file
+ Path to file with bad pixels map (in dcraw format: "column row + date-of-pixel-death-in-UNIX-format", one pixel per row).
+
char* dark_frame;
+
dcraw keys: -K file
+ Path to dark frame file (in 16-bit PGM format)
+
int output_bps;
+
dcraw keys: -4
+ 8 bit (default)/16 bit (key -4).
+
int output_tiff;
+
dcraw keys: -T
+ 0/1: output PPM/TIFF.
+
int output_flags;
+
dcraw keys: none
+ Bitfield that allows to set output file options: +
    +
  • LIBRAW_OUTPUT_FLAGS_PPMMETA - write additional + metadata into PPM/PGM output files
  • +
+
+
int user_flip;
+
dcraw keys: -t
+ [0-7] Flip image (0=none, 3=180, 5=90CCW, 6=90CW). Default -1, which + means taking the corresponding value from RAW.
+ For some formats, affects RAW data reading + , e.g., unpacking of thumbnails from Kodak cameras.
+
int user_qual;
+
dcraw keys: -q
+ 0-10: interpolation quality: +
    +
  • 0 - linear interpolation
  • +
  • 1 - VNG interpolation
  • +
  • 2 - PPG interpolation
  • +
  • 3 - AHD interpolation
  • +
  • 4 - DCB interpolation
  • +
  • 11 - DHT interpolation
  • +
  • 12 - Modified AHD interpolation (by Anton Petrusevich)
  • +
+
+
int user_black;
+
dcraw keys: -k
+ User black level.
+
int user_cblack[4];
+
dcraw keys: none
+ Per-channel corrections to user_black.
+
int user_sat;
+
dcraw keys: -S
+ Saturation adjustment.
+
int med_passes;
+
dcraw keys: -m
+ Number of median filter passes.
+
int no_auto_bright;
+
dcraw keys: -W
+ Don't use automatic increase of brightness by histogram.
+
float auto_bright_thr;
+
dcraw keys: none
+ Portion of clipped pixels when auto brightness increase is used. Default + value is 0.01 (1%) for dcraw compatibility. Recommended value for modern + low-noise multimegapixel cameras depends on shooting style. Values in + 0.001-0.00003 range looks reasonable.
+
float adjust_maximum_thr;
+
dcraw keys: none
+ This parameters controls auto-adjusting of maximum value based on + channel_maximum[] data, calculated from real frame data. If calculated + maximum is greater than adjust_maximum_thr*maximum, than maximum is set + to calculated_maximum.
+ Default: 0.75. If you set this value above 0.99999, than default value + will be used. If you set this value below 0.00001, than no maximum + adjustment will be performed.
+ Adjusting maximum should not damage any picture (esp. if you use default + value) and is very useful for correcting channel overflow problems + (magenta clouds on landscape shots, green-blue highlights for indoor + shots).
+
int use_fuji_rotate;
+
dcraw keys: -j
+ Default -1 (use), 0 - don't use rotation for cameras on a Fuji sensor.
+
int green_matching;
+
Turns on fixing of green channels disbalance. dcraw keys: + none
+ Default: 0 (not use), 1 - turns on this postprocessing stage. + green_matching requires additional memory for image data.
+
int dcb_iterations
+
dcraw keys: none
+ Number of DCB correction passes. Default is -1 (no correction). Useful + only for DCB interpolation.
+
int dcb_enhance_fl
+
dcraw keys: none
+ nonzero: DCB interpolation with enhance interpolated colors.
+
int fbdd_noiserd
+
dcraw keys: none
+ Controls FBDD noise reduction before demosaic. +
    +
  • 0 - do not use FBDD noise reduction
  • +
  • 1 - light FBDD reduction
  • +
  • 2 (and more) - full FBDD reduction
  • +
+
+
int exp_correc; float exp_shift,exp_preser;
+
Exposure correction before demosaic.
+
    +
  • exp_correc: positive value turns the feature on (default: off).
  • +
  • exp_shift: exposure shift in linear scale. Usable range from 0.25 + (2-stop darken) to 8.0 (3-stop lighter). Default: 1.0 (no exposure + shift).
  • +
  • exp_preser: preserve highlights when lighten the image. Usable + range from 0.0 (no preservation) to 1.0 (full preservation). 0.0 is + the default value.
  • +
+
+
int use_rawspeed;
+
Turns on using RawSpeed library for data unpacking (only if RawSpeed + support compiled in).
+
int use_dng_sdk;
+
Turns on using Adobe DNG SDK (if compiled with it and dng host is set: +
+
    +
  • 0 - do not use
  • +
  • 1 - use for speciality formats (Float, Linear DNG, deflate + compression, 8 bit)
  • +
  • 2 - use for all DNG files
  • +
+
+
int no_auto_scale;
+
Disables pixel values scaling (call to LibRaw::scale_colors()) in + LibRaw::dcraw_process().
+ This is special use value because white balance is + performed in scale_colors(), so skipping it will result in non-balanced + image.
+ This setting is targeted to use with no_interpolation, or with own + interpolation callback call.
+
int no_interpolation;
+
Disables call to demosaic code in LibRaw::dcraw_process()
+
int use_p1_correction;
+
If set to non-zero (default): PhaseOne compressed files will be corrected (linearization; defect mapping) + based on metadata contained in file.
+
+

+

Structure libraw_callbacks_t: user-settable callbacks

+
+
data_callback data_cb
+
Called on data error, settable via set_dataerror_handler. See C++ + API for details.
+
progress_callback progress_cb
+
Called on process callback, settable via set_progress_handler. See C++ API for details.
+
exif_parser_callback exif_cb, params: (void *context, int tag, int + type, int len, unsigned int ord, void *ifp)
+
Called by EXIF/TIFF IFD parsers on each processed tag.
+ Parameters: +
    +
  • context: user-specified context, set via set_exifparser_handler()
  • +
  • tag: 16-bit of TIFF/EXIF tag or'ed with +
      +
    • 0 - for EXIF parsing
    • +
    • 0x20000 - for Kodak makernotes parsing
    • +
    • 0x30000 - for Panasonic makernotes parsing
    • +
    • 0x40000 - for EXIF Interop IFD parsing
    • +
    • 0x50000 - for EXIF GPS IFD parsing
    • +
    • (ifdN + 1) << 20) - for TIFF ifdN
    • +
    +
  • +
  • type: tag type (see TIFF/EXIF specs)
  • +
  • len: tag length
  • +
  • ord: byte order: 0x4949 for intel, 0x4d4d for motorola
  • +
  • ifp: pointer to LibRaw_abstract_datastream input stream, + positioned to start of data. There is no need to restore data + position in callback.
  • +
+
+
int pre_identify_cb(void *)
+
Called with this pointer as the only arg before calling to + LibRaw::identify. If this callback return non-zero value, that means + that identify() is not needed and all internal data fields are filled + with values.
+
void post_identify_cb(void *)
+
Called after identify() from open_datastream(). May be used to tune + internal variables after metadata parse.
+
dcraw_process() callbacks
+
These callbacks are called before/after dcraw_process phases, the only + passed parameter is this pointer +
    +
  • pre_subtractblack_cb - called before black subtraction
  • +
  • pre_scalecolors_cb - called before scale_colors() call
  • +
  • pre_preinterpolate_cb - called before interpolaton (demosaic)
  • +
  • interpolate_bayer_cb - if set, called for bayer demosaic + (regardless of params.user_qual value)
  • +
  • interpolate_xtrans_cb - if set, called for X-Trans demosaic
  • +
  • post_interpolate_cb - called after demosaic step. Note: if this + callback is set, standard median_filter() is not called. So, if you + need median filtering you should call it from callback function.
  • +
  • pre_converttorgb_cb - called after convert_to_rgb()
  • +
  • post_converttorgb_cb - called after convert_to_rgb(), so very last + processing step.
  • +
+
+
+

+

Structure libraw_decoder_info_t: RAW decoder name and data format

+

This structure describes RAW format decoder name and data format:

+
+
const char *decoder_name
+
Decoder function name
+
unsigned decoder_flags
+
Decoder data format. See list of + LibRaw_decoder_flags for details.
+
+

+

Structure libraw_processed_image_t - result set for + dcraw_make_mem_image()/dcraw_make_mem_thumb() functions

+

Structure libraw_processed_image_t is produced by call of + dcraw_make_mem_image()/dcraw_make_mem_thumb() and contains in-memory image + of interpolated data or thumbnail.

+

Data fields:

+
+
LibRaw_image_formats type
+
This field records type of data, containing in remaining fields of + structure. +
    +
  • LIBRAW_IMAGE_BITMAP - structure contains RGB + bitmap. All metadata fields (see below) are valid and describes + image data.
  • +
  • LIBRAW_IMAGE_JPEG - structure contain + in-memory image of JPEG file. Only type, data_size and data fields + are valid (and nonzero);
  • +
+
+
ushort height,width
+
Image size (in pixels). Valid only if type==LIBRAW_IMAGE_BITMAP.
+
ushort colors, bits
+
Number of colors components (1 or 3) and color depth in bits (8 or + 16). These fields are valid only if type==LIBRAW_IMAGE_BITMAP.
+
ushort gamma_corrected
+
Is bitmap data gamma-corrected (always 1 for 8-bit data, may be 0 or 1 + for 16-bit). Valid only if type==LIBRAW_IMAGE_BITMAP.
+
unsigned int data_size
+
Size of data field (in bytes). For bitmap image + equal to (height*width*colors * (bits/8)). For JPEG image - exact JPEG + size (i.e. extracted thnumbnail size + JPEG header + EXIF header).
+
unsigned char data[]
+
Data array itself. Should be interpreted as RGB triplets for bitmap + type and as JPEG file for JPEG type.
+
+

+

Input abstraction layer

+

RAW data input (read) in LibRaw implemented by calling methods of object + derived from LibRaw_abstract_datastream abstract + class. Full list of methods is described in + href="API-CXX.html#datastream">C++ API reference.

+

There is two ready to use implementations of datastream objects:

+ +

LibRaw user can create own datastream object derived from + LibRaw_abstract_datastream . For example, such object may + implement reading RAW data directly from camera (by remote interface). + LibRaw can use these objects via + LibRaw::open_datastream() interface.

+

Datastreams can be used either via + LibRaw::open_datastream() call (in this case datastream object + should be created an maintained by user) or via + LibRaw::open_file() and + LibRaw::open_buffer() shortcuts.

+

Only C++ API users may use object-oriented + interface and implement own input interfaces. For C + API users only built-on + libraw_open_file()/libraw_open_buffer() shortcuts are + available.

+

+

Data fields

+

Definition:

+
	class LibRaw_abstract_datastream {...protected: LibRaw_abstract_datastream *substream;}
+
+

Description: Objects derived from + LibRaw_abstract_datastream always contains pointer to secondary data + stream (substream). This substream initialized internally when needed + (really used only for Sony RAW data) and used for temporary switch input + stream to temporary memory buffer allocated internally in LibRaw.

+

Substream usage details described more precisely in + own datastream objects creation guide .

+

+

Constants

+

+

enum LibRaw_errors: Error Codes

+

All functions returning integer numbers must return either errno or one + of the following error codes (see also + error code conventions ).

+

Fatal errors (return of such an error code implies + that file processing has to be terminated, since the state of data + structures is unknown).

+
+
LIBRAW_UNSUFFICIENT_MEMORY
+
Attempt to get memory from the system has failed.
+ All allocated resources will be freed, + recycle() will be called, and the LibRaw object will be brought + to the state "right after creation."
+
LIBRAW_DATA_ERROR
+
A fatal error emerged during data unpacking.
+ All allocated resources will be freed, + recycle() will be called, and the LibRaw object will be brought + to the state "right after creation."
+
LIBRAW_IO_ERROR
+
A fatal error emerged during file reading (premature end-of-file + encountered or file is corrupt).
+ All allocated resources will be freed, + recycle() will be called, and the LibRaw object will be brought + to the state "right after creation."
+
LIBRAW_CANCELLED_BY_CALLBACK
+
Processing cancelled due to calling application demand (by returning + nonzero code from progress callback + ).
+ All allocated resources will be freed, + recycle() will be called, and the LibRaw object will be brought + to the state "right after creation."
+
LIBRAW_BAD_CROP
+
The incorrect cropping coordinates are set via params.cropbox[]: the + left-top corner of cropping rectangle is outside the image. The + processing will be cancelled, all allocated resources will be freed, LIBRAW_TOO_BIG
+
Raw data size exceeds data limit.
+ +
+ +

Non-Fatal Errors

+
+
+
LIBRAW_SUCCESS=0
+
No error; function terminated successfully.
+
LIBRAW_UNSPECIFIED_ERROR
+
An unknown error has been encountered. This code should never be + generated.
+
LIBRAW_FILE_UNSUPPORTED
+
Unsupported file format (attempt to open a RAW file with a format + unknown to the program).
+
LIBRAW_REQUEST_FOR_NONEXISTENT_IMAGE
+
Attempt to retrieve a RAW image with a number absent in the data + file (only for formats supporting storage of several images in a + file).
+
LIBRAW_OUT_OF_ORDER_CALL
+
API functions have been called in wrong order (e.g., unpack() before + open_file() ) or the previous stage has ended with an error + (e.g., unpack() is called after open_file() has returned an + error).
+
LIBRAW_NO_THUMBNAIL
+
Returned upon an attempt to retrieve a thumbnail from a file + containing no preview.
+
LIBRAW_UNSUPPORTED_THUMBNAIL
+
RAW file contains a preview of unsupported format.
+
LIBRAW_INPUT_CLOSED
+
Input stream is not available for reading.
+
LIBRAW_NOT_IMPLEMENTED
+
Decoder for specific RAW storage/compression format is not + implemented.
+
LIBRAW_REQUEST_FOR_NONEXISTENT_THUMBNAIL
+
Attempt to retrieve a non-existent thumbnail by (invalid) index.
+
+

+

enum LibRaw_decoder_flags - RAW data format description

+

Depending of capabilities of given data format, the buffer with RAW data + may have different layouts:

+
+
LIBRAW_DECODER_HASCURVE
+
This flag is set if decoder uses RAW tone curve and curve data may be + modified before call to decoder (i.e. curve values are not read or + calculated within decoder).
+
LIBRAW_DECODER_SONYARW2
+
This flag is set if file format is Sony ARW2.3, so sony_arw2_options + is applicable.
+
LIBRAW_DECODER_TRYRAWSPEED
+
This flag is set if file format is (possibly) supported by RawSpeed + library, so unpack() will try to use it.
+
LIBRAW_DECODER_FIXEDMAXC
+
Do not use automated maximum calculation for this data format.
+
LIBRAW_DECODER_OWNALLOC
+
Decoder allocates data, no need to pass allocated memory to decoder.
+
LIBRAW_DECODER_ADOBECOPYPIXEL
+
Internal flag, special to adobe DNG decoder.
+
LIBRAW_DECODER_LEGACY_WITH_MARGINS
+
Special flag uset for 4-channel (legacy) decoders with black/masked + areas
+
LIBRAW_DECODER_3CHANNEL
+
3-component full-color data (not usual 4-component)
+
+

+

enum LibRaw_progress: Current State of LibRaw Object

+

LibRaw::imgdata.progress_flags contains a bit mask describing all stages + of file processing that have already been performed.

+

File opening and RAW data extraction phase.

+
+
LIBRAW_PROGRESS_START=0
+
Object just created, no processing carried out.
+
LIBRAW_PROGRESS_OPEN
+
File to be processed has been opened.
+
LIBRAW_PROGRESS_IDENTIFY
+
Data identification performed, format recognized, metadata extracted.
+
LIBRAW_PROGRESS_SIZE_ADJUST
+
Data sizes adjusted (for files that require such adjustment, namely, + certain files from Kodak cameras).
+
LIBRAW_PROGRESS_LOAD_RAW
+
RAW data loaded.
+
+

The following flags are set during usage of image processing + that has been taken from dcraw.

+
+
LIBRAW_PROGRESS_RAW2_IMAGE
+
imgdata.image array allocated and filled with data.
+
LIBRAW_PROGRESS_REMOVE_ZEROES
+
Zero values removed for cameras that require such removal (Panasonic + cameras).
+
LIBRAW_PROGRESS_BAD_PIXELS
+
Bad (dead) pixels removed.
+
LIBRAW_PROGRESS_DARK_FRAME
+
Dark frame subtracted from RAW data.
+
LIBRAW_PROGRESS_FOVEON_INTERPOLATE
+
Interpolation for cameras with a Foveon sensor performed.
+
LIBRAW_PROGRESS_SCALE_COLORS
+
White balance performed.
+
LIBRAW_PROGRESS_PRE_INTERPOLATE
+
Image size reduction (for the half_size mode) performed, as well as + copying of 2nd green channel to the 1st one in points where the second + channel is present and the first one is absent.
+
LIBRAW_PROGRESS_INTERPOLATE
+
Interpolation (debayer) performed.
+
LIBRAW_PROGRESS_MIX_GREEN
+
Averaging of green channels performed.
+
LIBRAW_PROGRESS_MEDIAN_FILTER
+
Median filtration performed.
+
LIBRAW_PROGRESS_HIGHLIGHTS
+
Work with highlights performed.
+
LIBRAW_PROGRESS_FUJI_ROTATE
+
For images from Fuji cameras, rotation performed (or + adjust_sizes_info_only() called).
+
LIBRAW_PROGRESS_FLIP
+
Dimensions recalculated for images shot with a rotated camera + (sizes.iwidth/sizes.iheight swapped).
+
LIBRAW_PROGRESS_CONVERT_RGB
+
Conversion into output RGB space performed.
+
LIBRAW_PROGRESS_STRETCH
+
Image dimensions changed for cameras with non-square pixels.
+
LIBRAW_PROGRESS_STAGE17 - LIBRAW_PROGRESS_STAGE27
+
Reserved for possible appearance of other processing stages.
+
+

The following flags are set during loading of thumbnails.

+

LIBRAW_PROGRESS_THUMB_LOAD Thumbnail data have been + loaded (for Kodak cameras, the necessary conversions have also been made). + LIBRAW_PROGRESS_TRESERVED1 - LIBRAW_PROGRESS_TRESERVED3 + Reserved for possible future processing stages.

+

+

enum LibRaw_whitebalance_code - names for standard light sources

+

LIBRAW_WBI_lightsource_name, where name and value are standard EXIF light + sources.

+

enum LibRaw_camera_mounts - codes for camera mounts

+

Constant name (e.g. LIBRAW_MOUNT_Leica_SL) speaks for itself

+

enum LibRaw_runtime_capabilities - libraw capabilities set at build

+
    +
  • LIBRAW_CAPS_RAWSPEED - compiled with RawSpeed
  • +
  • LIBRAW_CAPS_DNGSDK - compiled with Adobe DNG SDK
  • +
  • LIBRAW_CAPS_GPRSDK - compiled w/ GoPro GPR SDK
  • +
  • LIBRAW_CAPS_UNICODEPATHS - compiled with Windows + unicode (wchar_t*) filenames support
  • +
+

+

enum LibRaw_thumbnail_formats: Thumbnail Data Formats

+

Thumbnail data format is written in the imgdata.thumbnail.tformat data + field.
+ Presently LibRaw knows about four thumbnail formats, among which two are + unpacked:

+
+
LIBRAW_THUMBNAIL_UNKNOWN
+
Format unknown or thumbnail not yet read.
+
LIBRAW_THUMBNAIL_JPEG
+
The thumbnail buffer contains a JPEG file (read from the RAW file "as + is," without any manipulations performed on it).
+
LIBRAW_THUMBNAIL_BITMAP
+
The thumbnail buffer contains the gamma-adjusted RGB bitmap (for Kodak + cameras, the gamma correction is performed with allowance for maximum + values and the white balance is set in accordance with the camera + settings).
+ In this format, each pixel of the image is represented by a 8-bit RGB + triplet.
+
LIBRAW_THUMBNAIL_BITMAP16
+
The thumbnail buffer contains the gamma-adjusted 16-bit RGB bitmap. To + get this format instead of LIBRAW_THUMBNAIL_BITMAP you + need to set LIBRAW_PROCESSING_USE_PPM16_THUMBS in + processing options.
+
LIBRAW_THUMBNAIL_LAYER
+
Data format is presently recognized upon opening of RAW file but not + supported: not unpacked into LibRaw::unpack_thumb.
+
LIBRAW_THUMBNAIL_ROLLEI
+
Data format is presently recognized upon opening of RAW file but not + supported: not unpacked into LibRaw::unpack_thumb.
+
LIBRAW_THUMBNAIL_H265
+
The thumbnail buffer contains a H.265 data frame (read from RAW file + as is, no manipulations performed on it).
+
LIBRAW_THUMBNAIL_JPEGXL
+
The thumbnail buffer contains a JPEG-XL data frame (read from RAW file + as is, no manipulations performed on it).
+
+

+

Nonstandard Situations (Warnings) during RAW Data Processing

+

Some suspicious situations emerging during image processing are not fatal + but may affect the result of data retrieval or postprocessing. Such states + are indicated by setting a bit in the imgdata.process_warnings field.

+
+
LIBRAW_WARN_BAD_CAMERA_WB
+
Postprocessing must use white balance of the camera but this balance + is not suitable for use.
+
LIBRAW_WARN_NO_METADATA
+
Only for cameras where the metadata are taken from an external JPEG + file: metadata extraction has failed.
+
LIBRAW_WARN_NO_JPEGLIB
+
Only for P&S Kodak cameras: data in JPEG format. At the same time, + open_file() will return LIBRAW_FILE_UNSUPPORTED.
+
LIBRAW_WARN_NO_EMBEDDED_PROFILE
+
(only if LCMS support compiled in). Caller set embedded input profile + use, but no such profile exists in RAW.
+
LIBRAW_WARN_NO_INPUT_PROFILE
+
(only if LCMS support compiled in). Error when opening input profile + ICC file.
+
LIBRAW_WARN_BAD_OUTPUT_PROFILE
+
(only if LCMS support compiled in). Error when opening output profile + ICC file.
+
LIBRAW_WARN_NO_BADPIXELMAP
+
Error when opening bad pixels map file.
+
LIBRAW_WARN_BAD_DARKFRAME_FILE
+
Error when opening dark frame file.
+
LIBRAW_WARN_BAD_DARKFRAME_DIM
+
Dark frame file either differs in dimensions from RAW-file processed, + or have wrong format. Dark frame should be in 16-bit PGM format (one can + generate it using simple_dcraw -4 -D).
+
LIBRAW_WARN_RAWSPEED_PROBLEM
+
Problems detected in RawSpeed decompressor. The image data processed + by LibRaw own decoder.
+
LIBRAW_WARN_RAWSPEED_UNSUPPORTED
+
This file not supported by RawSpeed (although compatible decoder + exists).
+
LIBRAW_WARN_RAWSPEED_PROCESSED
+
Not warning, but information. The file was decoded by RawSpeed.
+
LIBRAW_WARN_FALLBACK_TO_AHD
+
Incorrect/unsupported user_qual was set, AHD demosaic used instead.
+
LIBRAW_WARN_PARSEFUJI_PROCESSED
+
Not really a warning, but flag that fuji parser was used.
+
LIBRAW_DNGSDK_PROCESSED
+
Not really a warning: image was decoded by DNG SDK
+
LIBRAW_DNG_IMAGES_REORDERED
+
DNG sub0images was reordered
+
LIBRAW_DNG_STAGE2_APPLIED
+
DNG Stage2 conversion was performed
+
LIBRAW_DNG_STAGE3_APPLIED
+
DNG Stage3 conversion was performed
+
LIBRAW_WARN_VENDOR_CROP_SUGGESTED
+
If set: unknown/untested RAW image frame size passed to LibRaw, cropping may be incorrect. +

It is suggested to use LibRaw::adjust_to_raw_inset_crop(1) for vendor specified crop. +
+
+
+
+

+

enum LibRaw_image_formats - possible types of data, contains in + libraw_processed_image_t structure

+

type field of libraw_processed_image_t structure may + have one of these values:

+
+
LIBRAW_IMAGE_BITMAP
+
The structure contains RGB-bitmap, metadata described in other fields + of libraw_processed_image_t.
+
LIBRAW_IMAGE_JPEG
+
libraw_processed_image_t structure contains JPEG image (in memory). + Only data_size field is meaningful.
+
+

+

enum enum LibRaw_processing_options - bit that affects RAW data + extraction

+ These flags could be OR'ed with imgdata.params.raw_processing_options: +

Pentax 4-shot options:

+
    +
  • LIBRAW_RAWOPTIONS_PENTAX_PS_ALLFRAMES - merge all frames for + Pentax 4-shot files
  • +
+

Floating point DNG files:

+
    +
  • LIBRAW_RAWOPTIONS_CONVERTFLOAT_TO_INT - convert FP data to + 16-bit integer
  • +
+

Sony ARQ Files:

+
    +
  • LIBRAW_RAWOPTIONS_ARQ_SKIP_CHANNEL_SWAP - do not perform Sony + ARQ channel swap to RGBG channel format, but use RGGB original channel + order
  • +
+

DNG processing flags:

+
    +
  • LIBRAW_RAWOPTIONS_DONT_CHECK_DNG_ILLUMINANT - skip DNG + illuminant check when parsing DNG color data (use for compatibility w/ + older LibRaw versions).
  • +
  • LIBRAW_RAWOPTIONS_DNGSDK_ZEROCOPY - do not copy data extracted + by Adobe DNG SDK into separate buffer, but use DNG SDK buffer as is.
  • +
  • LIBRAW_RAWOPTIONS_DNG_ADD_ENHANCED - if set, LibRaw will add + Enhanced DNG frame (NewSubfileType == 16) to the list of available + frames.
  • +
  • LIBRAW_RAWOPTIONS_DNG_ADD_PREVIEWS - if set, LibRaw will add + previews (NewSubfileType == 1) to the frames list.
  • +
  • LIBRAW_RAWOPTIONS_DNG_PREFER_LARGEST_IMAGE- By default, DNG + frames are not reordered and are available in same order as in DNG  + (LibRaw traverses IFD/Sub-IFD trees in deep-first order).This bit will + prioritize the largest image
  • +
  • LIBRAW_RAWOPTIONS_DNG_STAGE2 - request DNG Stage2 + processing (by DNG SDK)
  • +
  • LIBRAW_RAWOPTIONS_DNG_STAGE3 - request DNG Stage3 + processing
  • +
  • LIBRAW_RAWOPTIONS_DNG_ALLOWSIZECHANGE - by default, + if image size parsed by DNG SDK does not match image dimensions parsed + by LibRaw, processing will stop with LIBRAW_DATA_ERROR code. This flags + allows size change in LibRaw::unpack() stage.
  • +
  • LIBRAW_RAWOPTIONS_DNG_DISABLEWBADJUST - by default, + for DNG images with different per-channel maximums WB adjustment + procedure is performed. This flag disables such adjustment.
  • +
+ Other flags +
    +
  • LIBRAW_RAWOPTIONS_NO_ROTATE_FOR_KODAK_THUMBNAILS - disable + auto-rotation for Kodak PPM bitmaps
  • +
  • LIBRAW_RAWOPTIONS_USE_PPM16_THUMBS - enable 16-bit PPM + thumbnails
  • +
  • LIBRAW_RAWOPTIONS_ZEROFILTERS_FOR_MONOCHROMETIFFS - by default, + LibRaw assigns bayer pattern for Monochrome TIFF files (e.g. images from + Kodak 760).This does not work as expected if input file is really + monochrome (e.g. scan from Imacon X1 in monochrome mode).This flag will + force monochrome mode for TIFF RAWs w/o bayer filter tags (so, it will + break old Kodak processing). It is better to make it settable via user + interaction.
  • +
  • LIBRAW_RAWOPTIONS_PROVIDE_NONSTANDARD_WB - If set and + when applicable, color.cam_mul[] and color.WB_Coeffs/WBCT_Coeffs will + contain WB settings for a non-standard workflow. Right now only Sony + DSC-F828 is affected: camera-recorded white balance can't be directly + applied to raw data because WB is for RGB, while raw data is RGBE.
  • +
  • LIBRAW_RAWOPTIONS_CAMERAWB_FALLBACK_TO_DAYLIGHT - if + use_camera_wb is set, but no camera-recorded white balance present in + metadata, then fallback to daylight WB (default: fallback to + auto-balance).
  • +
  • LIBRAW_RAWOPTIONS_CHECK_THUMBNAILS_KNOWN_VENDORS - + Some cameras (e.g.Ricoh) may record broken thumbnail in file:data offset + plus data size is beyond filecontents. This flag enforces size+offset + checks for files from known vendors (this will result into correct but + smaller thumbnail selected).
  • +
  • LIBRAW_RAWOPTIONS_CHECK_THUMBNAILS_ALL_VENDORS - same + is above, but check is performed regardless of vendor (Make tag).
  • +
  • LIBRAW_RAWOPTIONS_ALLOW_JPEGXL_PREVIEWS - + if set, LibRaw will perceive such previews in the same way as JPEG onesgest preview is + selected by default, etc).

    + tformat field for such preview is set to LIBRAW_THUMBNAIL_JPEGXL. Image metadata (width/height/channels count) is not parsed for JPEG-XL previews +

  • +
+
    +
+

+

enum LibRaw_rawspecial_t - special/non standard RAW extraction modes

+ These flags are applied to imgdata.rawparams: +

Sony ARW2.3 processing options: (for more details see + http://www.rawdigger.com/howtouse/sony-craw-arw2-posterization-detection)

+
    +
  • LIBRAW_RAWSPECIAL_SONYARW2_BASEONLY - decode only base pixels, + leave delta pixels as zero;
  • +
  • LIBRAW_RAWSPECIAL_SONYARW2_DELTAONLY - decode only delta pixels + with base pixels zeroed;
  • +
  • LIBRAW_RAWSPECIAL_SONYARW2_DELTAZEROBASE - decode delta pixels, + do not add base value;
  • +
  • LIBRAW_RAWSPECIAL_SONYARW2_DELTATOVALUE - show possible + posterization areas;
  • +
+

Sigma Quattro decoding flags:

+
    +
  • LIBRAW_RAWSPECIAL_NODP2Q_INTERPOLATERG - disable R/G channels + interpolation
  • +
  • LIBRAW_RAWSPECIAL_NODP2Q_INTERPOLATEAF - disable data + interpolation of low-sensitivity (AF or overexposure control) points on + Quattro sensors.
  • +
+

Canon/Nikon small RAW (YCC) decoding flags (do not use both at same + time):

+
    +
  • LIBRAW_RAWSPECIAL_SRAW_NO_RGB - disable YCC to RGB conversion
  • +
  • LIBRAW_RAWSPECIAL_SRAW_NO_INTERPOLATE - disable missing color + values interpolation
  • +
+ [back to Index] + + diff --git a/rtengine/libraw/doc/API-notes.html b/rtengine/libraw/doc/API-notes.html new file mode 100644 index 000000000..68dc72d65 --- /dev/null +++ b/rtengine/libraw/doc/API-notes.html @@ -0,0 +1,305 @@ + + + + + +

LibRaw: General Notes on API[back to Index]

+

LibRaw: General Notes on API

+

Contents

+
    +
  1. LibRaw editions
  2. +
  3. Error Code Conventions and Error Handling
  4. +
  5. Nonstandard Situations That Are Not Errors
  6. +
  7. Input Layer Abstraction
  8. +
  9. Thread Safety
  10. +
  11. The Use of C++
  12. +
  13. Parameters of the LibRaw::imgdata.params + Structure Affecting the Behavior of open_file/unpack/unpack_thumb
  14. +
  15. Memory Usage +
      +
    1. Stack Usage
    2. +
    3. Dynamic Memory Management
    4. +
    5. Dynamic Memory Usage +
        +
      1. Memory Buffer for the RAW Image
      2. +
      3. Memory for the Postprocessed Image
      4. +
      5. Memory for the Decoded Thumbnail
      6. +
      7. Memory for RAW Unpacking
      8. +
      9. Memory for Postprocessing
      10. +
      11. Memory for File Writing
      12. +
      13. Unpacking into memory buffer
      14. +
      +
    6. +
    +
  16. +
  17. Incompatibilities with dcraw +
      +
    1. Automatic maximum search/brightness + adjustment
    2. +
    3. Processing of Thumbnails from Kodak + cameras
    4. +
    +
  18. +
+

+

LibRaw Versions

+

Since version 0.9, there is only one LibRaw variants. Older versions have + three separate editions (normal, -Lite and -Commercial versions).

+

+

Error Code Conventions and Error Handling

+

The following conventions concern the returned errors:

+
    +
  1. All functions that can return an error code have integer type of + return data.
  2. +
  3. If there is no error, the return value is 0 (LIBRAW_SUCCESS).
  4. +
  5. If an error has happened in a system call, the return value is errno + (a positive number), which can be analyzed using strerror() or similar + means.
  6. +
  7. All LibRaw's own error codes are negative; each of these errors + belongs to one of two types: +
    +
    Non-fatal errors
    +
    Non-fatal errors do not forbid execution of other functions in the + processing succession (e.g., unpack_thumb() + can easily return the code corresponding to "preview is absent" but + this does not prevent further call of unpack().
    +
    Fatal errors
    +
    In the case of fatal errors (memory shortage, input data error, + data unpacking failure), the current stage of processing is + terminated and all allocated resources are freed.
    + If an attempt to continue processing is made, all subsequent API + calls will return the LIBRAW_OUT_OF_ORDER_CALL error.
    + At the same time, the LibRaw instance in which a fatal error has + occurred can process the next RAW files in the usual way (by calling + open_file() (or other input + methods), then unpack(), etc.).
    +
    +
  8. +
  9. The macro LIBRAW_FATAL_ERROR(error code) checks if an error is fatal + or not.
  10. +
  11. The error codes are listed and + deciphered here.
  12. +
+

+

Nonstandard Situations That Are Not Errors

+

If the program has encountered a nonstandard situation that does not + prevent retrieval of some data from a file, it sends a signal by setting + the corresponding bit in imgdata.process_warnings. + The possible types of warnings are listed + and deciphered here.

+

+

Input Layer Abstraction

+

LibRaw uses objects derived from LibRaw_abstract_datastream + for data input. Semantics of these objects is similar to 'file with + arbitrary seek' object: both read and seek operations are used.

+

Some RAW formats requires temporary switch to another data stream created + on top on memory buffer for metadata read. Methods for doing so are + implemented in base class LibRaw_abstract_datastream + by internal data field substream. Look into source code + of LibRaw_file_datastream + class in libraw/libraw_datastream.h file for more + details.
+ When implementing own datastream classes, you need to take substream + into account and pass control to methods of this field if it is active + (not NULL).

+

If datastream implementation knows name of input file, it should provide + fname() call. This name will be used in error + callbacks and in guessing name of JPEG file with metadata (for RAW + files with external metadata).

+

For external metadata support input class should implement subfile_open()/subfile_close() + methods. .
+ Sample of these methods implementation may be found in LibRaw_file_datastream + class (look into libraw/libraw_datastream.h file for + details).

+

+

Thread safety

+

Thread safety is ensured if a LibRaw object is created and used within + one thread. At the same time, the number of threads (each with its own + LibRaw object) is not limited in any way (except by memory requirements).

+

If a LibRaw object is created in one execution thread and used in + another, external synchronization is necessary.

+

There is two libraries under Unix environment (Linux/FreeBSD/MacOS): + libraw_r.a (thread-safe) and libraw.a (single-threaded, slightly faster).

+

Thread-safe library version stores intermediate unpacker data into LibRaw + class data. So, several copies of LibRaw, working in parallel, is + possible.

+

Not thread-safe library uses global variable for intermediate data store + which is faster but not reenterant. This non-thread-safe library still may + be used in multi-threaded apps, but only if exactly one LibRaw class copy + exists in program.

+

Windows version is similar to multi-threaded Unix one.

+

+

The Use of C++

+

Exception situations within LibRaw are handled using the C++ exception + mechanism. All exceptions are caught inside the library functions and + should not penetrate outside.

+

Memory is allocated/freed using functions malloc(calloc)/free rather than + new/delete.

+

If C API is used, references to C++ calls new/delete still remain, and so + linking with libstdc++(Unix)/....(Windows) is necessary.

+

+

Parameters of the LibRaw::imgdata.params Structure Affecting the + Behavior of open_file/unpack/unpack_thumb

+

Most data fields of structure LibRaw::imgdata.params affect only data + postprocessing, but there are some exceptions, which have been + inherited by the current version of LibRaw from/ dcraw source texts (these + dependences will be gradually removed).

+
+
imgdata.params.use_camera_matrix and + imgdata.params.use_camera_wb
+
These fields affect loading of RAW data for cameras with a color + matrix.
+ Attention! If parameter imgdata.params.use_camera_matrix + is not set by the user, it is copied from imgdata.params.use_camera_wb + at the stage of file opening.
+
imgdata.params.user_flip
+
If this parameter is greater than or equal to zero, assignment imgdata.sizes.flip + = imgdata.params.user_flip is performed at the open_file() + stage.
+
imgdata.params.shot_select
+
This parameter makes it possible to select the number of the extracted + image for data formats in which storage of several RAW images in one + data file is possible.
+
imgdata.params.half_size
+
Affects RAW data loading for Phase One and Sinar backs. Also, it this + parameter is set then image bitmap will be reduced by half in each + dimension. In later case, all 4 components of bitmap will be filled + during data extraction phase.
+
imgdata.params.threshold, imgdata.params.aber
+
If these parameters used, then half-sized bitmap will be used for data + unpacking. See above for details.
+
imgdata.params.use_camera_wb
+
Affects loading of white balance matrix for Leaf backs.
+
+

+

Memory Usage

+

+

Stack Usage

+

An instance of the LibRaw class has its own size about 800 Kb; + if constructions like LibRaw imageProcessor; are used, this + memory is stack-allocated.

+

Methods of class LibRaw (and C API calls) may allocate up to 130-140 Kb + of data on the stack (to place auto variables) during their work.

+

Thus, the work of one LibRaw instance may require about 1MB + of stack memory. This is not a problem for most contemporary + architectures. However, when working in a multithreaded environment, one + should not forget to allocate a sufficient amount of memory for the thread + stack.

+

In the case of dynamic allocation (LibRaw *iProcessor = new LibRaw;), + the requirements to stack memory will decrease by ~800 Kb, which is the + size of a class instance). If C API is used, the + LibRaw instance is allocated dynamically.

+

+

Dynamic Memory Management

+

LibRaw keeps record of all allocated dynamic memory blocks; in the case + of an exceptional situation (fatal error), they are all freed. The code + for keeping this record is fairly primitive and not designed to consider + allocation of many blocks (in the normal situation, allocation takes place + from 2 to 6 times during file processing); this fact should be taken into + account by developers trying to add new methods to LibRaw.

+

+

Dynamic Memory Usage

+

LibRaw uses dynamic memory

+
    +
  • for the decoded image;
  • +
  • for the decoded thumbnail;
  • +
  • for the postprocessed image;
  • +
  • for the ICC profile retrieved from the RAW file (if available);
  • +
  • for temporary data at the stage of RAW file unpacking;
  • +
  • for temporary data at the stage of postprocessing and result output;
  • +
  • for reading of the RAW source file (only under Win32).
  • +
+

+

Memory buffer for the RAW image

+

Decoded RAW data are stored:

+
    +
  • one 16-bit value per pixel for "bayer" images. The masked pixels + (black or dark or masked frame) are stored with image data.
  • +
  • Free or four 16-bit values for full-color images (Foveon, Linear DNG, + Canon sRAW etc.).
  • +
  • one,three, or four 32-bit floating point values per pixel for + floating-point data.
  • +
+

The buffer for RAW data is allocated by unpack() + call and freed upon calling recycle().

+

+

Memory for the Postprocessed Image

+

On postprocessing stage each pixel contains four 16-bit values, one for + each possible color channel (some sensors are actually 4-color).

+

The buffer for the decoded image is allocated upon calling raw2image() + or dcraw_process()

+

The buffer freed upon calling recycle() + or free_image() calls.

+

+

Memory for the Decoded Thumbnail

+

Memory for the thumbmail is allocated upon calling unpack_thumb() + and freed upon calling recycle(). The + size of the allocated buffer is precisely adjusted to the thumbnail size, + i.e., up to several Mb.

+

+

+

Memory for RAW Unpacking

+

Memory for temporary buffer needed during RAW data unpacking may be + allocated during the work of unpack() + and freed before completion of this function. The sizes of the allocated + buffers are small, up to tens of Kb.

+

+

Memory for Postprocessing

+

During image postprocessing (inherited from dcraw), memory for the + histogram (128 Kb) is allocated. This memory is allocated upon calling dcraw_process() and freed upon + calling recycle().

+

In addition, during the work of dcraw_process() + and during the usage of some available possibilities, like

+
    +
  • rotation of images from FUJI cameras;
  • +
  • correction of chromatic aberrations;
  • +
  • image size changes (including correction of non-square pixels);
  • +
  • highlight recovery;
  • +
+

a temporary buffer with the size equal to the size of the resultant image + (6-8 bytes per pixel for various processing stages) will be allocated. As + soon as the intermediate substage of processing is completed, the buffer + with the previous copy of the image will be freed.
+ If postprocessing is not used, then temporary buffers are not allocated.

+

+

Memory for File Writing

+

Upon calling dcraw_ppm_tiff_writer(), + memory for a single row of the output image is allocated. The allocated + memory is freed before the end of this call.

+

+

Unpacking into memory buffer

+

Functions dcraw_make_mem_image() + dcraw_make_mem_thumb() + (and complementary calls in C-API) allocates memory for entire output + datasets (full RGB bitmap and thumbnail, respectively).To free allocated + memory use dcraw_clear_mem() + function.

+

+

Incompatibilities with dcraw

+

+

Automatic maximum search/brightness adjustment

+

Many camera formats really use less data range, than possible by format + nature (bit count). If data maximum estimated incorrectly (too low) this + may resuls in colored highlights ('pink clouds') because of data cut at + wrong level.

+

To prevent this, LibRaw uses real data maximum from current file if this + maximum is larger than format maximum multiplied by + imdata.params.adjust_maximum_thr value (default is 0.75).

+

To turn off this feature (and repeat dcraw.c pink clouds) set + imdata.params.adjust_maximum_thr to 0.0

+

+

Processing of Thumbnails from Kodak cameras

+

In some Kodak cameras, the preview (thumbnail) is stored in the form of + uncorrected image. During its extraction using dcraw -e, + the white balance, color conversion, and other settings are the same as + those used for extraction of the main RAW data (including defect removal + and dark frame subtraction, which is erroneous, since the image size is + different).
+ In LibRaw::unpack_thumb() calls, the white balance taken from the camera + ("as shot") is used and no settings from imgdata.params are considered.

+

For all other cameras, thumbnails are extracted "as is," without any + color conversions, both in dcraw and in LibRaw.

+

[back to Index]

+ + diff --git a/rtengine/libraw/doc/API-overview.html b/rtengine/libraw/doc/API-overview.html new file mode 100644 index 000000000..a29014aa9 --- /dev/null +++ b/rtengine/libraw/doc/API-overview.html @@ -0,0 +1,66 @@ + + + + Overview of LibRaw API (C++) + + + + [back to Index] +

Overview of LibRaw API (C++)

+

General Remarks

+
    +
  1. The entire processing is carried out by an instance of the LibRaw class, which is an image processor.
  2. +
  3. One image processor can simultaneously process only one data source file, but consecutive processing of any number of files +is possible.
  4. +
  5. There may be several simultaneously working image processors in a software program (e.g., in different threads), although one +should remember that each image processor may require much memory.
  6. +
  7. Reading of source data from the RAW file requires virtually no customization (see API Notes for exceptions to this rule).
  8. +
  9. All data extracted from the RAW file are accessible through data fields of the image processor (LibRaw class instance).
  10. +
  11. Although LibRaw is not intended for RAW data postprocessing, the library includes calls that enable complete +emulation of the dcraw utility. +
  12. All customization for the processing is performed via data fields of the LibRaw class.
  13. +
+ +

Brief Demonstration

+

+ The example below contains no error processing for the sake of brevity. +

+
+#include "libraw/libraw.h"
+int process_image(char *file)
+{
+        // Let us create an image processor
+        LibRaw iProcessor;
+
+        // Open the file and read the metadata
+        iProcessor.open_file(file);
+
+        // The metadata are accessible through data fields of the class
+        printf("Image size: %d x %d\n",iProcessor.imgdata.sizes.width,iProcessor.imgdata.sizes.height);
+
+        // Let us unpack the image
+        iProcessor.unpack();
+
+        // Convert from imgdata.rawdata to imgdata.image:
+        iProcessor.raw2image();
+
+        // And let us print its dump; the data are accessible through data fields of the class
+        for(i = 0;i lt; iProcessor.imgdata.sizes.iwidth *  iProcessor.imgdata.sizes.iheight; i++)
+           printf("i=%d R=%d G=%d B=%d G2=%d\n",
+                        i,
+                        iProcessor.imgdata.image[i][0],
+                        iProcessor.imgdata.image[i][1],
+                        iProcessor.imgdata.image[i][2],
+                        iProcessor.imgdata.image[i][3]
+                );
+
+        // Finally, let us free the image processor for work with the next image
+        iProcessor.recycle();
+}
+
+ + + [back to Index] + + diff --git a/rtengine/libraw/doc/Install-LibRaw.html b/rtengine/libraw/doc/Install-LibRaw.html new file mode 100644 index 000000000..3fb1aea0e --- /dev/null +++ b/rtengine/libraw/doc/Install-LibRaw.html @@ -0,0 +1,123 @@ + + + + + LibRaw Compilation and Installation + + [back to Index] +

LibRaw Compilation and Installation

+

LibRaw is distributed in the form of source codes. For further use, they + should be compiled (and, if desired, placed into system folders with + libraries and include-files).

+ +

Unix Systems (FreeBSD, Linux, Mac OS X)

+

To build the library, you will need a working C++ compiler (gcc 3+ and + clang 2+ are OK) and the make utility.

+

Additional libraries (optional):

+
    +
  • zlib (used to decode deflated DNGs)
  • +
  • libjpeg8 (used to decode lossy DNGs and several old Kodak cameras)
  • +
+

LibRaw has been tested on 32- and 64-bit Unix systems working on x86- + (and AMD64-) compatible processors. Building and work on other + architectures have not been tested.

+

Compilation of Library and Examples

+

Unpack the downloaded distribution package.

+
        tar xzvf LibRaw-X.YY.tar.gz
+
+

For GitHub downloads (clones), perform ./configure script generation via

+
        autoreconf --install
+

Go to LibRaw directory and run ./configure and make:

+
cd LibRaw-X.YY
+./configure # with optional args
+make
+    
+

As a result, you will compile

+
    +
  • Library libraw.a in the lib/ folder
  • +
  • Examples in the bin/ folder (source + codes of examples are in the samples/ folder).
  • +
+

In the current version, only static libraries are built:

+
    +
  • libraw.a: non-thread-safe version
  • +
  • libraw_r.a: thread-safe
  • +
+

Build parameters

+

./configure script have some non-standard parameters:

+
+
--enable-openmp
+ --disable-openmp
+
Enable/disable OpenMP support if compiler supports it. OpenMP is + enabled by default.
+
--enable-lcms
+ --disable-lcms
+
Enable/disable LCMS color engine support. If enabled, ./configure + will try to find lcms library. Both LCMS-1.x and LCMS-2.x are supported + LCMS support is enabled by default
+
--enable-examples
+ --disable-examples
+
Enables/disables examples compilation and installation. Enabled by + default
+
+

Installation and Usage

+

To install the library, run

+
    sudo make install
+    
+

It will place the libraries in /usr/local/lib, the include-files + in /usr/local/include (subfolder of libraw) and LibRaw samples to + /usr/local/bin. You can override installation path by using + ./configure script.
+ To use LibRaw, add the following parameters to the compiler call (when + building your own projects):

+
    +
  • Path to include-files: -I/usr/local/include
  • +
  • Path to libraries: -L/usr/local/lib
  • +
  • Library: -lraw (ordinary version) or -lraw_r (thread-safe version).
  • +
+

Windows: Building under Cygwin

+

Building and installation are completely similar to building + and installation under Unix systems.

+

Windows: Native Building

+

Building under Windows has three steps:

+
    +
  • Unpack the distribution package (if you have got no tar+gzip, take the + LibRaw distribution package in the .ZIP format) and go to folder + LibRaw-X.YYY.
  • +
  • Set the environment parameters so that the compiler/linker would find + the libraries and include-files. For Visual C++, this is done by running + vcvars32.bat.
  • +
  • Run
    + nmake -f Makefile.msvc
    +
  • +
+

You may need to edit Makefile.msvc to provide libjpeg/zlib + paths to INCLUDE/LIB.

+

If all paths are set correctly and the include-files/libraries have been + found, then the following will be compiled:

+
    +
  • Library libraw_static.lib in folder lib
  • +
  • Dynamic library bin/libraw.dll and linking library for it + lib/libraw.lib
  • +
  • Examples in folder bin/.
  • +
+

Only the thread-safe library is built under Win32, but it can be used + with non-threaded applications as well. All examples are linked with the + dynamic library (DLL); if static linking is necessary, one should link + applications with library libraw_static.lib and set the preprocessor + option /DLIBRAW_NODLL during compilation.

+

Windows-version compiles without LCMS support for now.

+

During building of DLL, all public functions are exported; further, the + exported subset may be reduced.

+

Unfortunately, paths to include/ libraries depend on the way Visual C + (or other compiler) is installed; therefore, it is impossible to specify + some standard paths in Makefile.msvc.

+

Windows Installation

+

No installation under Windows is supported. It is assumed that all DLLs + will be supplied together with the software using them (and this software + will perform the installation). Accordingly, in building of programs using + LibRaw, the paths to libraries, DLLs, and include-files should be + specified manually.

+ [back to Index] + + diff --git a/rtengine/libraw/doc/Samples-LibRaw.html b/rtengine/libraw/doc/Samples-LibRaw.html new file mode 100644 index 000000000..c72a3f945 --- /dev/null +++ b/rtengine/libraw/doc/Samples-LibRaw.html @@ -0,0 +1,213 @@ + + + + + +

LibRaw: Usage Examples[back to Index]

+

LibRaw: Usage Examples

+

Overview of Examples in the Distribution Package (samples/*)

+

The LibRaw package contains several examples illustrating the use of this + library. Their source codes are located in the samples/ folder, and after + library build they will be in the bin/ folder:

+
    +
  • raw-identify The only LibRaw call it uses is open_file(); + further code prints the values of the fields of the imgdata structure.
    +
    raw-identify -v provides extensive dump of + metadata/
    + Command line key -u shows unpacking function name, + while -u -f prints function name and masked are sizes.
    + raw-identify -w will print white balance tables stored + in RAW file.
  • +
  • simple_dcraw A simple "emulation" of dcraw + reproducing the behavior of dcraw [-e] [-v] [-T].  + A simplified version of this example is considered + below.
    + -B command-line switch turns on use of open_buffer() + API call used via mmap() of input file (Unix only).
  • +
  • dcraw_half Demonstrates the use of C + API. The example emulates the behavior of dcraw -h + (no other control parameters can be specified in this example).
  • +
  • dcraw_emu Almost complete emulation of dcraw (except for + keys -D -d -E -i -v -e, which are considered in other usage examples). + Of most interest is processing of command line keys (copied from dcraw). +
    +

    This sample supports additional command-line parameters absent in + original dcraw:

    +
    +
    -mmap
    +
    Use open_buffer() + interface. Buffer prepared by mmap() call. This option not supported + under Win32.
    +
    -meme
    +
    Use open_buffer() + interface. Buffer prepared by malloc()+read() calls.
    +
    -c float-value
    +
    This key sets params.adjust_maximum_thr + parameter.
    + Use -c 0 to completely disable automatic maximum calculation.
    + Default value: 0.75
    +
    -timing
    +
    Turns on detailed timing print.
    +
    -G
    +
    Turns on "green_matching" mode to suppress color mazes on cameras + with different green channels.
    +
    -B x y w h
    +
    Crops output to rectangle with width w, height h and x,y + coordinates of left upper corner. All coordinates applied before any + image rotation.
    +
    -F
    +
    Will use FILE I/O (bigfile_datastream) instead on standard + LibRaw_file_datastream.
    +
    -dcbi N
    +
    Sets number of additional DCB-demosaic iterations (option valid + only for -q 4, i.e. for DCB demosaic).
    +
    -dcbe
    +
    Turns on DCB color enhance mode (only for DCB demosaic, -q 4).
    +
    -aexpo e p
    +
    Turns on exposure correction. e is exposure shift in linear scale + from 0.25 (darken 2 stops) to 8.0 (lighten 3 stops). p is highlights + preservation amount from 0.0 (no preservation, full clipping) to 1.0 + (full preservation, S-like curve in highlights).
    +
    -apentax4shot
    +
    Will merge 4 frames from Pentax 4-shot RAWs
    +
    -apentax4shotorder abce
    +
    Order of frames in pentax 4-shot files (default is 3102)
    +
    -mmap
    +
    Use mmap + memory IO instead of file IO (unix only)
    +
    -disars
    +
    Disable RawSpeed library (if compiled with this library)
    +
    -doutputflags N
    +
    set imgdata.params.output_flags to N
    +
    -disinterp
    +
    Do not run interpolation step
    +
    -dsrawrgb1
    +
    Disable YCbCr to RGB conversion for sRAW (Cb/Cr interpolation + enabled)
    +
    -dsrawrgb2
    +
    Disable YCbCr to RGB conversion for sRAW (Cb/Cr interpolation + disabled)
    +
    +
  • +
  • half_mt Emulation of dcraw -h. It + "understands" the following keys: -a (automatic white balance over the + entire image), -w (white balance of the camera), -T (output in the tiff + format), and -J n (number of parallel threads launched for image + processing).
    + On multiprocessor/multicore computers, the speed gain is notable in the + case of mass processing. On a Win32 machine, the example is assembled + from the initial file half_mt_win32.c, since work with threads under + Windows is fundamentally different and it it easier to copy simple + source codes than write one complex code.
  • +
  • mem_image This sample uses dcraw_make_mem_image + and dcraw_make_mem_thumb + calls, than writes data in PPM format.
  • +
  • unprocessed_raw This sample extracts (mostly) + unaltered RAW data including masked pixels data (on supported cameras). + If black frame exists and black frame extraction is supported for given + format, masked pixels data is added to resulting .TIFF file. Command + line options: -q - be quiet, -A - + autoscale data (integer multiplier), -g + gamma-correction (gamma 2.2) for data (instead of precise linear one), -B + turns on black level subtraction
  • +
  • 4channnels - splits RAW-file into four separate + 16-bit grayscale TIFFs (per RAW channel).
    + Command line switches: +
      +
    • -s N selects N-th image from RAW with multiple + images
    • +
    • -g gamma correction (gamma 2.2)
    • +
    • -A values autoscale by auto-calculated integer + factor
    • +
    • -B turn off black subtraction
    • +
    • -N no RAW curve
    • +
    +
  • +
  • multirender_test - very simple example of multiple + rendering on one file without reopen.
  • +
  • postprocessing_benchmark - will print timings of RAW + processing steps
  • +
+

Example of docmode

+

Below we consider the samples/simple_dcraw.cpp example, which emulates + the behavior of dcraw [-e][-v][-t]. To save space, let + us assume that keys -t -v are always specified (to avoid comments on + command line parsing) and there is always one parameter (name of file), + which is the only one and always passed to the program.

+
int main(int ac, char *av[])
+{
+ int i, ret, verbose=0, output_thumbs=0;
+ char outfn[1024],thumbfn[1024];
+ // Creation of image processing object
+ LibRaw RawProcessor;
+ // The date in TIFF is written in the local format; let us specify the timezone for compatibility with dcraw
+ putenv ((char*)"TZ=UTC");
+// Let us define variables for convenient access to fields of RawProcessor
+#define P1 RawProcessor.imgdata.idata
+#define S RawProcessor.imgdata.sizes
+#define C RawProcessor.imgdata.color
+#define T RawProcessor.imgdata.thumbnail
+#define P2 RawProcessor.imgdata.other
+#define OUT RawProcessor.imgdata.params
+ OUT.output_tiff = 1; // Let us output TIFF
+ // Let us open the file
+ if( (ret = RawProcessor.open_file(av[1])) != LIBRAW_SUCCESS)
+ {
+ fprintf(stderr,"Cannot open %s: %s\n",av[i],libraw_strerror(ret));
+ // recycle() is needed only if we want to free the resources right now.
+ // If we process files in a cycle, the next open_file()
+ // will also call recycle(). If a fatal error has happened, it means that recycle()
+ // has already been called (repeated call will not cause any harm either).
+ RawProcessor.recycle();
+ goto end;
+ }
+ // Let us unpack the image
+ if( (ret = RawProcessor.unpack() ) != LIBRAW_SUCCESS)
+ {
+ fprintf(stderr,"Cannot unpack_thumb %s: %s\n",av[i],libraw_strerror(ret));
+ if(LIBRAW_FATAL_ERROR(ret))
+ goto end;
+ // if there has been a non-fatal error, we will try to continue
+ }
+ // Let us unpack the thumbnail
+ if( (ret = RawProcessor.unpack_thumb() ) != LIBRAW_SUCCESS)
+ {
+ // error processing is completely similar to the previous case
+ fprintf(stderr,"Cannot unpack_thumb %s: %s\n",av[i],libraw_strerror(ret));
+ if(LIBRAW_FATAL_ERROR(ret))
+ goto end;
+ }
+ else // We have successfully unpacked the thumbnail, now let us write it to a file
+ {
+ snprintf(thumbfn,sizeof(thumbfn),"%s.%s",av[i],T.tformat == LIBRAW_THUMBNAIL_JPEG ? "thumb.jpg" : "thumb.ppm");
+ if( LIBRAW_SUCCESS != (ret = RawProcessor.dcraw_thumb_writer(thumbfn)))
+ {
+ fprintf(stderr,"Cannot write %s: %s\n",thumbfn,libraw_strerror(ret));
+ // in the case of fatal error, we should terminate processing of the current file
+ if(LIBRAW_FATAL_ERROR(ret))
+ goto end;
+ }
+ }
+ // Data unpacking
+ ret = RawProcessor.dcraw_process();
+ if(LIBRAW_SUCCESS != ret ) // error at the previous step
+ {
+ fprintf(stderr,"Cannot do postprocessing on %s: %s\n",av[i],libraw_strerror(ret));
+ if(LIBRAW_FATAL_ERROR(ret))
+ goto end;
+ }
+ else // Successful document processing
+ {
+ snprintf(outfn,sizeof(outfn),"%s.%s", av[i], "tiff");
+ if( LIBRAW_SUCCESS != (ret = RawProcessor.dcraw_ppm_tiff_writer(outfn)))
+ fprintf(stderr,"Cannot write %s: error %d\n",outfn,ret);
+ }
+ // we don't evoke recycle() or call the destructor; C++ will do everything for us
+ return 0;
+end:
+ // got here after an error
+ return 1;
+}
+
+

[back to Index]

+ + diff --git a/rtengine/libraw/doc/Why-LibRaw.html b/rtengine/libraw/doc/Why-LibRaw.html new file mode 100644 index 000000000..90105a871 --- /dev/null +++ b/rtengine/libraw/doc/Why-LibRaw.html @@ -0,0 +1,65 @@ + + + + + +

Purpose and Objectives[back to Index]

+

LibRaw Project Goals and Objectives

+

Who May Be Interested in This Project

+

The proposed project and the software products generated within this project are intended for:

+
    +
  • Developers of RAW converters, including current and new developments
  • +
  • Developers of applications that need access to decoded RAW data (for pre-processing, stitching, stacking, color profiling, etc.)
  • +
  • Those willing to write their own graphic interface for RAW file processing
  • +
  • Developers and enthusiasts creating their own primary and auxiliary data processing algorithms, including +
      +
    • Interpolation (demosaic),
    • +
    • Noise reduction
    • +
    • White balance
    • +
    • Correction of aberrations and distortions
    • +
    • RAW data analysis
    • +
    • Comparison of cameras and lenses
    • +
    • and so on...
    • +
    +
  • +
+

Some History

+

The LibRaw project started in 2008. At that time dcraw was very popular as a method of accessing RAW data. It was hard to find a more or less popular camera that was not supported by this utility; while the implementation of RAW data extraction in dcraw was of a very high quality.

+

However, developers and enthusiasts were experiencing a number of difficulties when using dcraw. First, the author of dcraw refused to turn his product into a handy library. Besides, dcraw contains a number of questionable features that may hinder its use without modifications, as well as instances of distortions in the photographic sense of it. As a result, once every several months, with each new release of dcraw, virtually all developers, part of them listed on the dcraw Web site, were to check the differences, figure out the patches, and apply those patches to their dcraw-based code and libraries.

+

As for enthusiasts, the "entry cost" of verifying their own ideas and implementing their own algorithms in such an environment is often unreasonably high: they have to either use the dcraw command line, thus being forced to use the unavoidable early processing stages, or understand the source code and maintain their own library based on it.

+

Thus, the inconveniences of dcraw make the developers' community quite small and halt further evolution and improvement of RAW format converters.

+

Our project started with the idea to get a library based on dcraw, only better. Today we are well past that initial goal, not in the least because dcraw is not actively supported since 2015, and the latest release was published nearly 2 years ago, in May 2016. Since then several distinctly different RAW formats (introduced by Fujifilm, Nikon, Pentax, Samsung, Sigma, Sony) emerged, none of which is supported by dcraw. Additionally, we see it necessary to extract more metadata to help better interpretation of RAW data and to add flexibility to the RAW conversion process.

+

Goals and Objectives

+

We are maintaining LibRaw as a library providing access to decoded raw data and metadata useful for correct interpretation of the said data. Thus:

+
    +
  1. To keep on adding RAW decoding for new and previously unsupported cameras
  2. +
  3. To continue the development of a stable and consistent API suitable for other applications (RAW converters, data analyzers, panorama stitchers, etc.)
  4. +
  5. To have RAW processing as separate independent parts (groups of API calls) +
      +
    • Reading, decoding, and unpacking of RAW data: this is the main functionality of LibRaw
    • +
    • Data conversions: interpolation, white balance, etc.: this part of LibRaw is frozen: we ported dcraw functionality, but expect that library users will create own postprocessing code.
    • +
    • File output of the processing results. This part is very primitive, only tiff and ppm output is supported.
    • +
    +
  6. +
+

The latter two groups of functions are maintained to provide some postprocessing/saving ability from scratch, without writing own code. We do not have any plans to extend/improve this code.

+
    +
  1. To improve the procedures of RAW data retrieval and decoding.
  2. +
  3. To supply other developers with a "framework" (freeware and open-source), e.g., for experimenting with their own methods of RAW data processing (interpolation, noise reduction, white balance, etc.; some directions of the possible efforts are listed above), so that they could create their own GUI programs and interfaces without developing the entire RAW converter.
  4. +
+

LibRaw Release Schedule

+
    +
  1. Production releases will be published at intervals of 1-1.5 years. Production releases will be maintained through bugfixes. New cameras will not be added to production releases, but only to snapshots and non-stable/beta releases. Patch (bugfix) releases of production releases should provide API/ABI consistency (so, version 0.21.5 should be binary compatible with 0.21.0).
  2. +
  3. Snapshots are planned to be released every 2-3 quarters. Snapshots will include support for new cameras, stable and tested in our own applications. API calls and internal routines may be changed. No binary compatibility maintained, to upgrade to newer snapshot one need to recompile application that uses it.
  4. +
  5. Non-stable/beta releases with new features, like initial support for some new RAW format that needs extensive testing by the community.  No exact schedule, to be published as needed.
  6. +
+

How You Can Help/Participate

+

We welcome any help, however:

+
    +
  1. If you are submitting any core functionality extensions/improvements, that is, something that has to do with the decoding of RAW and/or metadata, that would be highly valuable and we will maintain your submission on our own, if necessary; you dont need to be committed.
  2. +
  3. If your contribution adds to post-processing, please be committed to supporting and maintaining such a contribution. Our previous experience with such contributions has been less than positive, exactly because of the lack of maintenance on the part of the contributors. We are unable to maintain such contributions on our own, because our primary goal is to maintain RAW and metadata decoding.
  4. +
+

[back to Index]

+ + diff --git a/rtengine/libraw/doc/index.html b/rtengine/libraw/doc/index.html new file mode 100644 index 000000000..3401fe62b --- /dev/null +++ b/rtengine/libraw/doc/index.html @@ -0,0 +1,38 @@ + + + + + LibRaw: better dcraw (library) + + +

LibRaw: RAW image decoding/processing library

+

LibRaw is a library for reading RAW files from digital photo cameras (CRW/CR2, NEF, RAF, DNG, MOS, KDC, DCR, etc.; virtually all RAW formats are supported). It pays special attention to correct retrieval of data required for subsequent RAW conversion.

+

The library is intended for embedding in RAW converters, data analyzers, and other programs using RAW files as the initial data.

+

Contents

+
    +
  1. Copyright
  2. +
  3. Purpose and Objectives
  4. +
  5. Overview of LibRaw API (C++)
  6. +
  7. Compilation and Installation
  8. +
  9. Data Structures, Error Codes, and Constants
  10. +
  11. C++ API
  12. +
  13. C API
  14. +
  15. Notes on API (error code conventions, memory usage)
  16. +
  17. Examples
  18. +
+ +

Copyright

+

LibRaw library, Copyright (C) 2008-2024 LibRaw LLC (info@libraw.org)
+ The library includes source code from
+ dcraw.c, Dave Coffin's raw photo decoder
+ Copyright 1997-2016 by Dave Coffin, dcoffin a cybercom o net
+

+

LibRaw is distributed for free under two different licenses:

+ + You may use one of these licensing modes and switch between them. +

+ + diff --git a/rtengine/libraw/export-dist.sh b/rtengine/libraw/export-dist.sh new file mode 100755 index 000000000..a462558be --- /dev/null +++ b/rtengine/libraw/export-dist.sh @@ -0,0 +1,28 @@ +#!/bin/sh + +DEST=$1 +VERSION=$2 +if test x$VERSION = x ; then + VERSION=`./version.sh` + echo VERSION set to $VERSION +fi + +if test -d $DEST ; then + echo Using $DEST/$VERSION +else + echo Usage: $0 destination-dir + exit 1 +fi +cd .. +for dir in LibRaw +do + cd $dir + git pull origin + cd .. +done +for dir in LibRaw +do + cd $dir + git archive --prefix=$dir-$VERSION/ $VERSION | (cd $DEST; tar xvf - ) + cd .. +done diff --git a/rtengine/libraw/internal/dcraw_defs.h b/rtengine/libraw/internal/dcraw_defs.h new file mode 100644 index 000000000..b53752511 --- /dev/null +++ b/rtengine/libraw/internal/dcraw_defs.h @@ -0,0 +1,66 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#ifndef DCRAW_DEFS_H +#define DCRAW_DEFS_H + +#include +#define LIBRAW_LIBRARY_BUILD +#define LIBRAW_IO_REDEFINED +#include "libraw/libraw.h" +#include "libraw/libraw_types.h" +#include "internal/defines.h" +#include "internal/var_defines.h" + +#define stmread(buf, maxlen, fp) stread(buf, MIN(maxlen, sizeof(buf)), fp) +#define strbuflen(buf) strnlen(buf, sizeof(buf) - 1) +#define makeIs(idx) (maker_index == idx) +#define strnXcat(buf, string) \ + strncat(buf, string, LIM(sizeof(buf) - strbuflen(buf) - 1, 0, sizeof(buf))) + +// DNG was written by: +#define nonDNG 0 +#define CameraDNG 1 +#define AdobeDNG 2 + +// Makernote tag type: +#define is_0x927c 0 /* most cameras */ +#define is_0xc634 2 /* Adobe DNG, Sony SR2, Pentax */ + +// abbreviations +#define ilm imgdata.lens.makernotes +#define icWBC imgdata.color.WB_Coeffs +#define icWBCCTC imgdata.color.WBCT_Coeffs +#define imCanon imgdata.makernotes.canon +#define imFuji imgdata.makernotes.fuji +#define imHassy imgdata.makernotes.hasselblad +#define imKodak imgdata.makernotes.kodak +#define imNikon imgdata.makernotes.nikon +#define imOly imgdata.makernotes.olympus +#define imPana imgdata.makernotes.panasonic +#define imPentax imgdata.makernotes.pentax +#define imPhaseOne imgdata.makernotes.phaseone +#define imRicoh imgdata.makernotes.ricoh +#define imSamsung imgdata.makernotes.samsung +#define imSony imgdata.makernotes.sony +#define imCommon imgdata.makernotes.common + + +#define ph1_bits(n) ph1_bithuff(n, 0) +#define ph1_huff(h) ph1_bithuff(*h, h + 1) +#define getbits(n) getbithuff(n, 0) +#define gethuff(h) getbithuff(*h, h + 1) + +#endif diff --git a/rtengine/libraw/internal/dcraw_fileio_defs.h b/rtengine/libraw/internal/dcraw_fileio_defs.h new file mode 100644 index 000000000..68bd8581f --- /dev/null +++ b/rtengine/libraw/internal/dcraw_fileio_defs.h @@ -0,0 +1,25 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#ifndef DCRAW_FILEIO_DEFS_H +#define DCRAW_FILEIO_DEFS_H + +#include +#define LIBRAW_LIBRARY_BUILD +#include "libraw/libraw.h" +#include "internal/defines.h" +#include "internal/var_defines.h" + +#endif diff --git a/rtengine/libraw/internal/defines.h b/rtengine/libraw/internal/defines.h new file mode 100644 index 000000000..a24666a8d --- /dev/null +++ b/rtengine/libraw/internal/defines.h @@ -0,0 +1,187 @@ +/* + Copyright 2008-2024 LibRaw LLC (info@libraw.org) + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + This file is generated from Dave Coffin's dcraw.c + dcraw.c -- Dave Coffin's raw photo decoder + Copyright 1997-2010 by Dave Coffin, dcoffin a cybercom o net + + Look into dcraw homepage (probably http://cybercom.net/~dcoffin/dcraw/) + for more information +*/ + +#ifndef LIBRAW_INT_DEFINES_H +#define LIBRAW_INT_DEFINES_H +#ifndef USE_JPEG +#define NO_JPEG +#endif + +#define DCRAW_VERSION "9.26" + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif +#define _USE_MATH_DEFINES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef __CYGWIN__ +#include +#endif +#if defined LIBRAW_WIN32_CALLS +#include +#ifndef LIBRAW_NO_WINSOCK2 +#include +#pragma comment(lib, "ws2_32.lib") +#endif +#define snprintf _snprintf +#define strcasecmp stricmp +#define strncasecmp strnicmp +#else +#include +#include +#include +typedef long long INT64; +typedef unsigned long long UINT64; +#endif + +#ifdef NODEPS +#define NO_JPEG +#define NO_LCMS +#endif +#ifndef NO_JPEG +#include /* Decode compressed Kodak DC120 photos */ +#endif /* and Adobe Lossy DNGs */ +#ifndef NO_LCMS +#ifdef USE_LCMS +#include /* Support color profiles */ +#else +#include /* Support color profiles */ +#endif +#endif +#ifdef LOCALEDIR +#include +#define _(String) gettext(String) +#else +#define _(String) (String) +#endif + +#ifdef LJPEG_DECODE +#error Please compile dcraw.c by itself. +#error Do not link it with ljpeg_decode. +#endif + +#ifndef LONG_BIT +#define LONG_BIT (8 * sizeof(long)) +#endif +#define FORC(cnt) for (c = 0; c < cnt; c++) +#define FORC3 FORC(3) +#define FORC4 FORC(4) +#define FORCC for (c = 0; c < colors && c < 4; c++) + +#define SQR(x) ((x) * (x)) +#define ABS(x) (((int)(x) ^ ((int)(x) >> 31)) - ((int)(x) >> 31)) +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#define LIM(x, min, max) MAX(min, MIN(x, max)) +#define ULIM(x, y, z) ((y) < (z) ? LIM(x, y, z) : LIM(x, z, y)) +#define CLIP(x) LIM((int)(x), 0, 65535) +#define CLIP15(x) LIM((int)(x), 0, 32767) +#define SWAP(a, b) \ + { \ + a = a + b; \ + b = a - b; \ + a = a - b; \ + } + +#define my_swap(type, i, j) \ + { \ + type t = i; \ + i = j; \ + j = t; \ + } + +#ifdef __GNUC__ +inline +#elif defined(_MSC_VER) +__forceinline +#else +static +#endif +float fMAX(float a, float b) { return MAX(a, b); } + +/* + In order to inline this calculation, I make the risky + assumption that all filter patterns can be described + by a repeating pattern of eight rows and two columns + + Do not use the FC or BAYER macros with the Leaf CatchLight, + because its pattern is 16x16, not 2x8. + + Return values are either 0/1/2/3 = G/M/C/Y or 0/1/2/3 = R/G1/B/G2 + + PowerShot 600 PowerShot A50 PowerShot Pro70 Pro90 & G1 + 0xe1e4e1e4: 0x1b4e4b1e: 0x1e4b4e1b: 0xb4b4b4b4: + + 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 + 0 G M G M G M 0 C Y C Y C Y 0 Y C Y C Y C 0 G M G M G M + 1 C Y C Y C Y 1 M G M G M G 1 M G M G M G 1 Y C Y C Y C + 2 M G M G M G 2 Y C Y C Y C 2 C Y C Y C Y + 3 C Y C Y C Y 3 G M G M G M 3 G M G M G M + 4 C Y C Y C Y 4 Y C Y C Y C + PowerShot A5 5 G M G M G M 5 G M G M G M + 0x1e4e1e4e: 6 Y C Y C Y C 6 C Y C Y C Y + 7 M G M G M G 7 M G M G M G + 0 1 2 3 4 5 + 0 C Y C Y C Y + 1 G M G M G M + 2 C Y C Y C Y + 3 M G M G M G + + All RGB cameras use one of these Bayer grids: + + 0x16161616: 0x61616161: 0x49494949: 0x94949494: + + 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 + 0 B G B G B G 0 G R G R G R 0 G B G B G B 0 R G R G R G + 1 G R G R G R 1 B G B G B G 1 R G R G R G 1 G B G B G B + 2 B G B G B G 2 G R G R G R 2 G B G B G B 2 R G R G R G + 3 G R G R G R 3 B G B G B G 3 R G R G R G 3 G B G B G B + */ + +// _RGBG means R, G1, B, G2 sequence +#define GRBG_2_RGBG(q) (q ^ (q >> 1) ^ 1) +#define RGGB_2_RGBG(q) (q ^ (q >> 1)) +#define BG2RG1_2_RGBG(q) (q ^ 2) +#define G2BRG1_2_RGBG(q) (q ^ (q >> 1) ^ 3) +#define GRGB_2_RGBG(q) (q ^ 1) +#define RBGG_2_RGBG(q) ((q >> 1) | ((q & 1) << 1)) + +#define RAWINDEX(row, col) ((row)*raw_width + (col)) +#define RAW(row, col) raw_image[(row)*raw_width + (col)] +#define BAYER(row, col) \ + image[((row) >> shrink) * iwidth + ((col) >> shrink)][FC(row, col)] + +#define BAYER2(row, col) \ + image[((row) >> shrink) * iwidth + ((col) >> shrink)][fcol(row, col)] +#define BAYERC(row, col, c) \ + imgdata.image[((row) >> IO.shrink) * S.iwidth + ((col) >> IO.shrink)][c] + +#endif diff --git a/rtengine/libraw/internal/dmp_include.h b/rtengine/libraw/internal/dmp_include.h new file mode 100644 index 000000000..ab85279c2 --- /dev/null +++ b/rtengine/libraw/internal/dmp_include.h @@ -0,0 +1,27 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#ifndef DMP_INCLUDE_H +#define DMP_INCLUDE_H + +#define LIBRAW_LIBRARY_BUILD +#define LIBRAW_IO_REDEFINED +#include "libraw/libraw.h" +#include "internal/defines.h" +#define SRC_USES_SHRINK +#define SRC_USES_BLACK +#define SRC_USES_CURVE + +#endif diff --git a/rtengine/libraw/internal/libraw_cameraids.h b/rtengine/libraw/internal/libraw_cameraids.h new file mode 100644 index 000000000..419bdeaad --- /dev/null +++ b/rtengine/libraw/internal/libraw_cameraids.h @@ -0,0 +1,334 @@ +/* -*- C++ -*- + * File: internal/libraw_cameraids.h + * Copyright 2008-2024 LibRaw LLC (info@libraw.org) + * Created: Sat Aug 17, 2020 + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#ifndef LIBRAW_CONST_H +#define LIBRAW_CONST_H + +#define CanonID_EOS_M50 0x00000412ULL +#define CanonID_EOS_M6_Mark_II 0x00000811ULL +#define CanonID_EOS_M200 0x00000812ULL +#define CanonID_EOS_D30 0x01140000ULL +#define CanonID_EOS_D60 0x01668000ULL +#define CanonID_EOS_M3 0x03740000ULL +#define CanonID_EOS_M10 0x03840000ULL +#define CanonID_EOS_M5 0x03940000ULL +#define CanonID_EOS_M100 0x03980000ULL +#define CanonID_EOS_M6 0x04070000ULL +#define CanonID_EOS_1D (0x80000000ULL + 0x001ULL) +#define CanonID_EOS_1Ds (0x80000000ULL + 0x167ULL) +#define CanonID_EOS_10D (0x80000000ULL + 0x168ULL) +#define CanonID_EOS_1D_Mark_III (0x80000000ULL + 0x169ULL) +#define CanonID_EOS_300D (0x80000000ULL + 0x170ULL) +#define CanonID_EOS_1D_Mark_II (0x80000000ULL + 0x174ULL) +#define CanonID_EOS_20D (0x80000000ULL + 0x175ULL) +#define CanonID_EOS_450D (0x80000000ULL + 0x176ULL) +#define CanonID_EOS_1Ds_Mark_II (0x80000000ULL + 0x188ULL) +#define CanonID_EOS_350D (0x80000000ULL + 0x189ULL) +#define CanonID_EOS_40D (0x80000000ULL + 0x190ULL) +#define CanonID_EOS_5D (0x80000000ULL + 0x213ULL) +#define CanonID_EOS_1Ds_Mark_III (0x80000000ULL + 0x215ULL) +#define CanonID_EOS_5D_Mark_II (0x80000000ULL + 0x218ULL) +#define CanonID_EOS_1D_Mark_II_N (0x80000000ULL + 0x232ULL) +#define CanonID_EOS_30D (0x80000000ULL + 0x234ULL) +#define CanonID_EOS_400D (0x80000000ULL + 0x236ULL) +#define CanonID_EOS_7D (0x80000000ULL + 0x250ULL) +#define CanonID_EOS_500D (0x80000000ULL + 0x252ULL) +#define CanonID_EOS_1000D (0x80000000ULL + 0x254ULL) +#define CanonID_EOS_50D (0x80000000ULL + 0x261ULL) +#define CanonID_EOS_1D_X (0x80000000ULL + 0x269ULL) +#define CanonID_EOS_550D (0x80000000ULL + 0x270ULL) +#define CanonID_EOS_1D_Mark_IV (0x80000000ULL + 0x281ULL) +#define CanonID_EOS_5D_Mark_III (0x80000000ULL + 0x285ULL) +#define CanonID_EOS_600D (0x80000000ULL + 0x286ULL) +#define CanonID_EOS_60D (0x80000000ULL + 0x287ULL) +#define CanonID_EOS_1100D (0x80000000ULL + 0x288ULL) +#define CanonID_EOS_7D_Mark_II (0x80000000ULL + 0x289ULL) +#define CanonID_EOS_650D (0x80000000ULL + 0x301ULL) +#define CanonID_EOS_6D (0x80000000ULL + 0x302ULL) +#define CanonID_EOS_1D_C (0x80000000ULL + 0x324ULL) +#define CanonID_EOS_70D (0x80000000ULL + 0x325ULL) +#define CanonID_EOS_700D (0x80000000ULL + 0x326ULL) +#define CanonID_EOS_1200D (0x80000000ULL + 0x327ULL) +#define CanonID_EOS_1D_X_Mark_II (0x80000000ULL + 0x328ULL) +#define CanonID_EOS_M (0x80000000ULL + 0x331ULL) +#define CanonID_EOS_100D (0x80000000ULL + 0x346ULL) +#define CanonID_EOS_760D (0x80000000ULL + 0x347ULL) +#define CanonID_EOS_5D_Mark_IV (0x80000000ULL + 0x349ULL) +#define CanonID_EOS_80D (0x80000000ULL + 0x350ULL) +#define CanonID_EOS_M2 (0x80000000ULL + 0x355ULL) +#define CanonID_EOS_5DS (0x80000000ULL + 0x382ULL) +#define CanonID_EOS_750D (0x80000000ULL + 0x393ULL) +#define CanonID_EOS_5DS_R (0x80000000ULL + 0x401ULL) +#define CanonID_EOS_1300D (0x80000000ULL + 0x404ULL) +#define CanonID_EOS_800D (0x80000000ULL + 0x405ULL) +#define CanonID_EOS_6D_Mark_II (0x80000000ULL + 0x406ULL) +#define CanonID_EOS_77D (0x80000000ULL + 0x408ULL) +#define CanonID_EOS_200D (0x80000000ULL + 0x417ULL) +#define CanonID_EOS_R5 (0x80000000ULL + 0x421ULL) +#define CanonID_EOS_3000D (0x80000000ULL + 0x422ULL) +#define CanonID_EOS_R (0x80000000ULL + 0x424ULL) +#define CanonID_EOS_1D_X_Mark_III (0x80000000ULL + 0x428ULL) +#define CanonID_EOS_1500D (0x80000000ULL + 0x432ULL) +#define CanonID_EOS_RP (0x80000000ULL + 0x433ULL) +#define CanonID_EOS_850D (0x80000000ULL + 0x435ULL) +#define CanonID_EOS_250D (0x80000000ULL + 0x436ULL) +#define CanonID_EOS_90D (0x80000000ULL + 0x437ULL) +#define CanonID_EOS_R3 (0x80000000ULL + 0x450ULL) +#define CanonID_EOS_R6 (0x80000000ULL + 0x453ULL) +#define CanonID_EOS_R7 (0x80000000ULL + 0x464ULL) +#define CanonID_EOS_R10 (0x80000000ULL + 0x465ULL) +#define CanonID_EOS_M50_Mark_II (0x80000000ULL + 0x468ULL) +#define CanonID_EOS_R50 (0x80000000ULL + 0x480ULL) +#define CanonID_EOS_R6m2 (0x80000000ULL + 0x481ULL) +#define CanonID_EOS_R8 (0x80000000ULL + 0x487ULL) +#define CanonID_EOS_R100 (0x80000000ULL + 0x498ULL) + +// CanonID_EOS_D2000C after Canon's TIFF2CR2 convertor: +#define CanonID_EOS_D2000C (0x80000000ULL + 0x520ULL) +// CanonID_EOS_D6000C id after Canon's TIFF2CR2 convertor: +#define CanonID_EOS_D6000C (0x80000000ULL + 0x560ULL) + +#define OlyID_str2hex(str) ((unsigned long long)str[0]<<32 | str[1]<<24 | str[2]<<16 | str[3]<<8 | str[4]) +#define OlyID_E_20 OlyID_str2hex("D4029") +#define OlyID_E_1 OlyID_str2hex("D4040") +#define OlyID_E_300 OlyID_str2hex("D4041") +#define OlyID_SP_550UZ OlyID_str2hex("D4321") +#define OlyID_SP_510UZ OlyID_str2hex("D4322") +#define OlyID_SP_560UZ OlyID_str2hex("D4355") +#define OlyID_SP_570UZ OlyID_str2hex("D4364") +#define OlyID_SP_565UZ OlyID_str2hex("D4374") +#define OlyID_XZ_1 OlyID_str2hex("D4401") +#define OlyID_XZ_2 OlyID_str2hex("D4531") +#define OlyID_XZ_10 OlyID_str2hex("D4546") +#define OlyID_STYLUS_1 OlyID_str2hex("D4572") +#define OlyID_SH_2 OlyID_str2hex("D4585") +#define OlyID_TG_4 OlyID_str2hex("D4586") +#define OlyID_TG_5 OlyID_str2hex("D4593") +#define OlyID_TG_6 OlyID_str2hex("D4603") +#define OlyID_E_10 OlyID_str2hex("D4842") +#define OlyID_AIR_A01 OlyID_str2hex("K0055") +#define OlyID_NORMA OlyID_str2hex("NORMA") +#define OlyID_E_330 OlyID_str2hex("S0003") +#define OlyID_E_500 OlyID_str2hex("S0004") +#define OlyID_E_400 OlyID_str2hex("S0009") +#define OlyID_E_510 OlyID_str2hex("S0010") +#define OlyID_E_3 OlyID_str2hex("S0011") +#define OlyID_E_410 OlyID_str2hex("S0013") +#define OlyID_E_420 OlyID_str2hex("S0016") +#define OlyID_E_30 OlyID_str2hex("S0017") +#define OlyID_E_520 OlyID_str2hex("S0018") +#define OlyID_E_P1 OlyID_str2hex("S0019") +#define OlyID_E_620 OlyID_str2hex("S0023") +#define OlyID_E_P2 OlyID_str2hex("S0026") +#define OlyID_E_PL1 OlyID_str2hex("S0027") +#define OlyID_E_450 OlyID_str2hex("S0029") +#define OlyID_E_600 OlyID_str2hex("S0030") +#define OlyID_E_P3 OlyID_str2hex("S0032") +#define OlyID_E_5 OlyID_str2hex("S0033") +#define OlyID_E_PL2 OlyID_str2hex("S0034") +#define OlyID_E_M5 OlyID_str2hex("S0036") +#define OlyID_E_PL3 OlyID_str2hex("S0038") +#define OlyID_E_PM1 OlyID_str2hex("S0039") +#define OlyID_E_PL1s OlyID_str2hex("S0040") +#define OlyID_E_PL5 OlyID_str2hex("S0042") +#define OlyID_E_PM2 OlyID_str2hex("S0043") +#define OlyID_E_P5 OlyID_str2hex("S0044") +#define OlyID_E_PL6 OlyID_str2hex("S0045") +#define OlyID_E_PL7 OlyID_str2hex("S0046") +#define OlyID_E_M1 OlyID_str2hex("S0047") +#define OlyID_E_M10 OlyID_str2hex("S0051") +#define OlyID_E_M5_Mark_II OlyID_str2hex("S0052") +#define OlyID_E_M10_Mark_II OlyID_str2hex("S0059") +#define OlyID_PEN_F OlyID_str2hex("S0061") +#define OlyID_E_PL8 OlyID_str2hex("S0065") +#define OlyID_E_M1_Mark_II OlyID_str2hex("S0067") +#define OlyID_E_M10_Mark_III OlyID_str2hex("S0068") +#define OlyID_E_PL9 OlyID_str2hex("S0076") +#define OlyID_E_M1X OlyID_str2hex("S0080") +#define OlyID_E_PL10 OlyID_str2hex("S0085") +#define OlyID_E_M10_Mark_IV OlyID_str2hex("S0088") +#define OlyID_E_M5_Mark_III OlyID_str2hex("S0089") +#define OlyID_E_M1_Mark_III OlyID_str2hex("S0092") +#define OlyID_E_P7 OlyID_str2hex("S0093") +#define OlyID_OM_1 OlyID_str2hex("S0095") +#define OlyID_OM_5 OlyID_str2hex("S0101") +#define OlyID_C_3030Z OlyID_str2hex("SX351") +#define OlyID_C_5050Z OlyID_str2hex("SX558") +#define OlyID_C_350Z OlyID_str2hex("SX751") +#define OlyID_C_740UZ OlyID_str2hex("SX754") +#define OlyID_C_5060WZ OlyID_str2hex("SX756") +#define OlyID_C_8080WZ OlyID_str2hex("SX757") +#define OlyID_C_770UZ OlyID_str2hex("SX772") +#define OlyID_C_7070WZ OlyID_str2hex("SX851") +#define OlyID_C_7000Z OlyID_str2hex("SX852") +#define OlyID_SP_500UZ OlyID_str2hex("SX853") +#define OlyID_SP_310 OlyID_str2hex("SX854") +#define OlyID_SP_350 OlyID_str2hex("SX855") +#define OlyID_SP_320 OlyID_str2hex("SX873") + +#define PentaxID_Optio_S 0x1296cULL +#define PentaxID_Optio_S_V101 0x12971ULL +#define PentaxID_staristD 0x12994ULL +#define PentaxID_Optio_33WR 0x129c6ULL +#define PentaxID_Optio_S4 0x129d5ULL +#define PentaxID_Optio_750Z 0x12a66ULL +#define PentaxID_staristDS 0x12aa2ULL +#define PentaxID_staristDL 0x12b1aULL +#define PentaxID_staristDS2 0x12b60ULL +#define PentaxID_GX_1S 0x12b62ULL +#define PentaxID_staristDL2 0x12b7eULL +#define PentaxID_GX_1L 0x12b80ULL +#define PentaxID_K100D 0x12b9cULL +#define PentaxID_K110D 0x12b9dULL +#define PentaxID_K100D_Super 0x12ba2ULL +#define PentaxID_K10D 0x12c1eULL +#define PentaxID_GX10 0x12c20ULL +#define PentaxID_K20D 0x12cd2ULL +#define PentaxID_GX20 0x12cd4ULL +#define PentaxID_K200D 0x12cfaULL +#define PentaxID_K2000 0x12d72ULL +#define PentaxID_K_m 0x12d73ULL +#define PentaxID_K_7 0x12db8ULL +#define PentaxID_K_x 0x12dfeULL +#define PentaxID_645D 0x12e08ULL +#define PentaxID_K_r 0x12e6cULL +#define PentaxID_K_5 0x12e76ULL +#define PentaxID_Q 0x12ee4ULL +#define PentaxID_K_01 0x12ef8ULL +#define PentaxID_K_30 0x12f52ULL +#define PentaxID_Q10 0x12f66ULL +#define PentaxID_K_5_II 0x12f70ULL +#define PentaxID_K_5_II_s 0x12f71ULL +#define PentaxID_Q7 0x12f7aULL +#define PentaxID_MX_1 0x12f84ULL +#define PentaxID_K_50 0x12fb6ULL +#define PentaxID_K_3 0x12fc0ULL +#define PentaxID_K_500 0x12fcaULL +#define PentaxID_645Z 0x13010ULL +#define PentaxID_K_S1 0x1301aULL +#define PentaxID_K_S2 0x13024ULL +#define PentaxID_Q_S1 0x1302eULL +#define PentaxID_K_1 0x13092ULL +#define PentaxID_K_3_II 0x1309cULL +#define PentaxID_GR_III 0x1320eULL +#define PentaxID_K_70 0x13222ULL +#define PentaxID_KP 0x1322cULL +#define PentaxID_K_1_Mark_II 0x13240ULL +#define PentaxID_K_3_III 0x13254ULL +#define PentaxID_GR_IIIx 0x1329aULL + +#define SonyID_DSC_R1 0x002ULL +#define SonyID_DSLR_A100 0x100ULL +#define SonyID_DSLR_A900 0x101ULL +#define SonyID_DSLR_A700 0x102ULL +#define SonyID_DSLR_A200 0x103ULL +#define SonyID_DSLR_A350 0x104ULL +#define SonyID_DSLR_A300 0x105ULL +#define SonyID_DSLR_A900_APSC 0x106ULL +#define SonyID_DSLR_A380 0x107ULL +#define SonyID_DSLR_A330 0x108ULL +#define SonyID_DSLR_A230 0x109ULL +#define SonyID_DSLR_A290 0x10aULL +#define SonyID_DSLR_A850 0x10dULL +#define SonyID_DSLR_A850_APSC 0x10eULL +#define SonyID_DSLR_A550 0x111ULL +#define SonyID_DSLR_A500 0x112ULL +#define SonyID_DSLR_A450 0x113ULL +#define SonyID_NEX_5 0x116ULL +#define SonyID_NEX_3 0x117ULL +#define SonyID_SLT_A33 0x118ULL +#define SonyID_SLT_A55 0x119ULL +#define SonyID_DSLR_A560 0x11aULL +#define SonyID_DSLR_A580 0x11bULL +#define SonyID_NEX_C3 0x11cULL +#define SonyID_SLT_A35 0x11dULL +#define SonyID_SLT_A65 0x11eULL +#define SonyID_SLT_A77 0x11fULL +#define SonyID_NEX_5N 0x120ULL +#define SonyID_NEX_7 0x121ULL +#define SonyID_NEX_VG20 0x122ULL +#define SonyID_SLT_A37 0x123ULL +#define SonyID_SLT_A57 0x124ULL +#define SonyID_NEX_F3 0x125ULL +#define SonyID_SLT_A99 0x126ULL +#define SonyID_NEX_6 0x127ULL +#define SonyID_NEX_5R 0x128ULL +#define SonyID_DSC_RX100 0x129ULL +#define SonyID_DSC_RX1 0x12aULL +#define SonyID_NEX_VG900 0x12bULL +#define SonyID_NEX_VG30 0x12cULL +#define SonyID_ILCE_3000 0x12eULL +#define SonyID_SLT_A58 0x12fULL +#define SonyID_NEX_3N 0x131ULL +#define SonyID_ILCE_7 0x132ULL +#define SonyID_NEX_5T 0x133ULL +#define SonyID_DSC_RX100M2 0x134ULL +#define SonyID_DSC_RX10 0x135ULL +#define SonyID_DSC_RX1R 0x136ULL +#define SonyID_ILCE_7R 0x137ULL +#define SonyID_ILCE_6000 0x138ULL +#define SonyID_ILCE_5000 0x139ULL +#define SonyID_DSC_RX100M3 0x13dULL +#define SonyID_ILCE_7S 0x13eULL +#define SonyID_ILCA_77M2 0x13fULL +#define SonyID_ILCE_5100 0x153ULL +#define SonyID_ILCE_7M2 0x154ULL +#define SonyID_DSC_RX100M4 0x155ULL +#define SonyID_DSC_RX10M2 0x156ULL +#define SonyID_DSC_RX1RM2 0x158ULL +#define SonyID_ILCE_QX1 0x15aULL +#define SonyID_ILCE_7RM2 0x15bULL +#define SonyID_ILCE_7SM2 0x15eULL +#define SonyID_ILCA_68 0x161ULL +#define SonyID_ILCA_99M2 0x162ULL +#define SonyID_DSC_RX10M3 0x163ULL +#define SonyID_DSC_RX100M5 0x164ULL +#define SonyID_ILCE_6300 0x165ULL +#define SonyID_ILCE_9 0x166ULL +#define SonyID_ILCE_6500 0x168ULL +#define SonyID_ILCE_7RM3 0x16aULL +#define SonyID_ILCE_7M3 0x16bULL +#define SonyID_DSC_RX0 0x16cULL +#define SonyID_DSC_RX10M4 0x16dULL +#define SonyID_DSC_RX100M6 0x16eULL +#define SonyID_DSC_HX99 0x16fULL +#define SonyID_DSC_RX100M5A 0x171ULL +#define SonyID_ILCE_6400 0x173ULL +#define SonyID_DSC_RX0M2 0x174ULL +#define SonyID_DSC_HX95 0x175ULL +#define SonyID_DSC_RX100M7 0x176ULL +#define SonyID_ILCE_7RM4 0x177ULL +#define SonyID_ILCE_9M2 0x178ULL +#define SonyID_ILCE_6600 0x17aULL +#define SonyID_ILCE_6100 0x17bULL +#define SonyID_ZV_1 0x17cULL +#define SonyID_ILCE_7C 0x17dULL +#define SonyID_ZV_E10 0x17eULL +#define SonyID_ILCE_7SM3 0x17fULL +#define SonyID_ILCE_1 0x180ULL +#define SonyID_ILME_FX3 0x181ULL +#define SonyID_ILCE_7RM3A 0x182ULL +#define SonyID_ILCE_7RM4A 0x183ULL +#define SonyID_ILCE_7M4 0x184ULL +// #define SonyID_ZV_1F 0x185ULL // Sony ZV-1F doesn't save raw +#define SonyID_ILCE_7RM5 0x186ULL +#define SonyID_ILME_FX30 0x187ULL +#define SonyID_ZV_E1 0x189ULL +#define SonyID_ILCE_6700 0x18aULL +#define SonyID_ZV_1M2 0x18bULL +#define SonyID_ILCE_7CR 0x18cULL +#define SonyID_ILCE_7CM2 0x18dULL +#endif diff --git a/rtengine/libraw/internal/libraw_checked_buffer.h b/rtengine/libraw/internal/libraw_checked_buffer.h new file mode 100644 index 000000000..a5de6fd99 --- /dev/null +++ b/rtengine/libraw/internal/libraw_checked_buffer.h @@ -0,0 +1,28 @@ +#pragma once + +#include +#include "../libraw/libraw_types.h" + +class checked_buffer_t +{ +public: + // create with internal storage + checked_buffer_t(short ord, int size); + checked_buffer_t(short ord, unsigned char *dd, int ss); + ushort sget2(int offset); + void checkoffset(int off); + unsigned char operator[](int idx); + unsigned sget4(int offset); + double sgetreal(int type, int offset); + unsigned char *data() { return _data; } + + int tiff_sget(unsigned save, INT64 *tag_offset, unsigned *tag_id, unsigned *tag_type, INT64 *tag_dataoffset, + unsigned *tag_datalen, int *tag_dataunitlen); +protected: + short _order; + + private: + unsigned char *_data; + int _len; + std::vector storage; +}; diff --git a/rtengine/libraw/internal/libraw_cxx_defs.h b/rtengine/libraw/internal/libraw_cxx_defs.h new file mode 100644 index 000000000..d249414c0 --- /dev/null +++ b/rtengine/libraw/internal/libraw_cxx_defs.h @@ -0,0 +1,115 @@ +/* -*- C++ -*- + * File: internal/libraw_cxx_defs.h + * Copyright 2008-2024 LibRaw LLC (info@libraw.org) + * Created: Sat Aug 17, 2020 + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#ifndef _LIBRAW_CXX_DEFS_H +#define _LIBRAW_CXX_DEFS_H + +#include +#include +#include +#include +#include +#include +#include +#define LIBRAW_LIBRARY_BUILD +#include "libraw/libraw.h" +#include "internal/defines.h" +#ifdef USE_ZLIB +#include +#endif + +#ifndef LIBRAW_WIN32_CALLS +#include +#else +#ifndef LIBRAW_NO_WINSOCK2 +#include +#endif +#include +#endif +#ifdef USE_RAWSPEED +void *make_camera_metadata(); +void clear_camera_metadata(void*); +void clear_rawspeed_decoder(void*); +#endif + + +#define P1 imgdata.idata +#define S imgdata.sizes +#ifndef LIBRAW_DNGSDK_CONFLICT +#define O imgdata.params +#define C imgdata.color +#define T imgdata.thumbnail +#define MN imgdata.makernotes +#ifndef LIBRAW_EXPAT_CONFLICT +#define IO libraw_internal_data.internal_output_params +#define ID libraw_internal_data.internal_data +#endif +#endif + +#define makeIs(idx) (imgdata.idata.maker_index == idx) +#define mnCamID imgdata.lens.makernotes.CamID + +#define EXCEPTION_HANDLER(e) \ + do \ + { \ + switch (e) \ + { \ + case LIBRAW_EXCEPTION_MEMPOOL: \ + recycle(); \ + return LIBRAW_MEMPOOL_OVERFLOW; \ + case LIBRAW_EXCEPTION_ALLOC: \ + recycle(); \ + return LIBRAW_UNSUFFICIENT_MEMORY; \ + case LIBRAW_EXCEPTION_TOOBIG: \ + recycle(); \ + return LIBRAW_TOO_BIG; \ + case LIBRAW_EXCEPTION_DECODE_RAW: \ + case LIBRAW_EXCEPTION_DECODE_JPEG: \ + recycle(); \ + return LIBRAW_DATA_ERROR; \ + case LIBRAW_EXCEPTION_DECODE_JPEG2000: \ + recycle(); \ + return LIBRAW_DATA_ERROR; \ + case LIBRAW_EXCEPTION_IO_EOF: \ + case LIBRAW_EXCEPTION_IO_CORRUPT: \ + recycle(); \ + return LIBRAW_IO_ERROR; \ + case LIBRAW_EXCEPTION_CANCELLED_BY_CALLBACK: \ + recycle(); \ + return LIBRAW_CANCELLED_BY_CALLBACK; \ + case LIBRAW_EXCEPTION_BAD_CROP: \ + recycle(); \ + return LIBRAW_BAD_CROP; \ + case LIBRAW_EXCEPTION_UNSUPPORTED_FORMAT: \ + recycle(); \ + return LIBRAW_FILE_UNSUPPORTED; \ + default: \ + return LIBRAW_UNSPECIFIED_ERROR; \ + } \ + } while (0) + +// copy-n-paste from image pipe +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#define LIM(x, min, max) MAX(min, MIN(x, max)) +#ifndef CLIP +#define CLIP(x) LIM(x, 0, 65535) +#endif +#define THUMB_READ_BEYOND 16384 + +#define ZERO(a) memset(&a, 0, sizeof(a)) + +#endif diff --git a/rtengine/libraw/internal/libraw_internal_funcs.h b/rtengine/libraw/internal/libraw_internal_funcs.h new file mode 100644 index 000000000..ebb3efcb1 --- /dev/null +++ b/rtengine/libraw/internal/libraw_internal_funcs.h @@ -0,0 +1,414 @@ +/* -*- C++ -*- + * File: libraw_internal_funcs.h + * Copyright 2008-2024 LibRaw LLC (info@libraw.org) + * Created: Sat Mar 14, 2008 + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#ifndef _LIBRAW_INTERNAL_FUNCS_H +#define _LIBRAW_INTERNAL_FUNCS_H + +#ifndef LIBRAW_LIBRARY_BUILD +#error "This file should be used only for libraw library build" +#else + +/* inline functions */ + static int stread(char *buf, size_t len, LibRaw_abstract_datastream *fp); + static int getwords(char *line, char *words[], int maxwords, int maxlen); + static void remove_trailing_spaces(char *string, size_t len); + static void remove_caseSubstr(char *string, char *remove); + static void removeExcessiveSpaces(char *string); + static void trimSpaces(char *s); +/* static tables/variables */ + static libraw_static_table_t tagtype_dataunit_bytes; + static libraw_static_table_t Canon_wbi2std; + static libraw_static_table_t Canon_KeyIsZero_Len2048_linenums_2_StdWBi; + static libraw_static_table_t Canon_KeyIs0x0410_Len3072_linenums_2_StdWBi; + static libraw_static_table_t Canon_KeyIs0x0410_Len2048_linenums_2_StdWBi; + static libraw_static_table_t Canon_D30_linenums_2_StdWBi; + static libraw_static_table_t Canon_G9_linenums_2_StdWBi; + + static libraw_static_table_t Fuji_wb_list1; + static libraw_static_table_t FujiCCT_K; + static libraw_static_table_t Fuji_wb_list2; + + static libraw_static_table_t Pentax_wb_list1; + static libraw_static_table_t Pentax_wb_list2; + + static libraw_static_table_t Oly_wb_list1; + static libraw_static_table_t Oly_wb_list2; + + static libraw_static_table_t Sony_SRF_wb_list; + static libraw_static_table_t Sony_SR2_wb_list; + static libraw_static_table_t Sony_SR2_wb_list1; +/* */ + int find_ifd_by_offset(int ); + void libraw_swab(void *arr, size_t len); + ushort sget2 (uchar *s); + ushort sget2Rev(uchar *s); + libraw_area_t get_CanonArea(); + int parseCR3(INT64 oAtomList, INT64 szAtomList, short &nesting, char *AtomNameStack, short& nTrack, short &TrackType); + void selectCRXTrack(); + void parseCR3_Free(); + int parseCR3_CTMD(short trackNum); + int selectCRXFrame(short trackNum, unsigned frameIndex); + void setCanonBodyFeatures (unsigned long long id); + void processCanonCameraInfo (unsigned long long id, uchar *CameraInfo, unsigned maxlen, unsigned type, unsigned dng_writer); + static float _CanonConvertAperture(ushort in); + void Canon_CameraSettings(unsigned len); + void Canon_WBpresets (int skip1, int skip2); + void Canon_WBCTpresets (short WBCTversion); + void parseCanonMakernotes (unsigned tag, unsigned type, unsigned len, unsigned dng_writer); + void processNikonLensData (uchar *LensData, unsigned len); + void Nikon_NRW_WBtag (int wb, int skip); + void parseNikonMakernote (int base, int uptag, unsigned dng_writer); + void parseEpsonMakernote (int base, int uptag, unsigned dng_writer); + void parseSigmaMakernote (int base, int uptag, unsigned dng_writer); + void setOlympusBodyFeatures (unsigned long long id); + void getOlympus_CameraType2 (); + void getOlympus_SensorTemperature (unsigned len); + void parseOlympus_Equipment (unsigned tag, unsigned type, unsigned len, unsigned dng_writer); + void parseOlympus_CameraSettings (int base, unsigned tag, unsigned type, unsigned len, unsigned dng_writer); + void parseOlympus_ImageProcessing (unsigned tag, unsigned type, unsigned len, unsigned dng_writer); + void parseOlympus_RawInfo (unsigned tag, unsigned type, unsigned len, unsigned dng_writer); + void parseOlympusMakernotes (int base, unsigned tag, unsigned type, unsigned len, unsigned dng_writer); + void setPhaseOneFeatures (unsigned long long id); + void setPentaxBodyFeatures (unsigned long long id); + void PentaxISO (ushort c); + void PentaxLensInfo (unsigned long long id, unsigned len); + void parsePentaxMakernotes(int base, unsigned tag, unsigned type, unsigned len, unsigned dng_writer); + void parseRicohMakernotes(int base, unsigned tag, unsigned type, unsigned len, unsigned dng_writer); + void parseSamsungMakernotes(int base, unsigned tag, unsigned type, unsigned len, unsigned dng_writer); + void setSonyBodyFeatures (unsigned long long id); + void parseSonyLensType2 (uchar a, uchar b); + void parseSonyLensFeatures (uchar a, uchar b); + void process_Sony_0x0116 (uchar * buf, ushort, unsigned long long id); + void process_Sony_0x2010 (uchar * buf, ushort); + void process_Sony_0x9050 (uchar * buf, ushort, unsigned long long id); + void process_Sony_0x9400 (uchar * buf, ushort, unsigned long long id); + void process_Sony_0x9402 (uchar * buf, ushort); + void process_Sony_0x9403 (uchar * buf, ushort); + void process_Sony_0x9406 (uchar * buf, ushort); + void process_Sony_0x940c (uchar * buf, ushort); + void process_Sony_0x940e (uchar * buf, ushort, unsigned long long id); + void parseSonyMakernotes (int base, unsigned tag, unsigned type, unsigned len, unsigned dng_writer, + uchar *&table_buf_0x0116, ushort &table_buf_0x0116_len, + uchar *&table_buf_0x2010, ushort &table_buf_0x2010_len, + uchar *&table_buf_0x9050, ushort &table_buf_0x9050_len, + uchar *&table_buf_0x9400, ushort &table_buf_0x9400_len, + uchar *&table_buf_0x9402, ushort &table_buf_0x9402_len, + uchar *&table_buf_0x9403, ushort &table_buf_0x9403_len, + uchar *&table_buf_0x9406, ushort &table_buf_0x9406_len, + uchar *&table_buf_0x940c, ushort &table_buf_0x940c_len, + uchar *&table_buf_0x940e, ushort &table_buf_0x940e_len); + void parseSonySR2 (uchar *cbuf_SR2, unsigned SR2SubIFDOffset, unsigned SR2SubIFDLength, unsigned dng_writer); + void parseSonySRF (unsigned len); + void parseFujiMakernotes (unsigned tag, unsigned type, unsigned len, unsigned dng_writer); + const char* HassyRawFormat_idx2HR(unsigned idx); + void process_Hassy_Lens (int LensMount); + void parseHassyModel (); + void parse_hasselblad_gain(); // RT + void hasselblad_correct(); // RT + + void setLeicaBodyFeatures(int LeicaMakernoteSignature); + void parseLeicaLensID(); + int parseLeicaLensName(unsigned len); + int parseLeicaInternalBodySerial(unsigned len); + void parseLeicaMakernote(int base, int uptag, unsigned MakernoteTagType); + void parseAdobePanoMakernote (); + void parseAdobeRAFMakernote (); + void GetNormalizedModel (); + void SetStandardIlluminants (unsigned, const char* ); + + ushort get2(); + unsigned sget4 (uchar *s); + unsigned getint(int type); + float int_to_float (int i); + double getreal (int type); + double sgetreal(int type, uchar *s); + void read_shorts (ushort *pixel, unsigned count); + +/* Canon P&S cameras */ + void canon_600_fixed_wb (int temp); + int canon_600_color (int ratio[2], int mar); + void canon_600_auto_wb(); + void canon_600_coeff(); + void canon_600_load_raw(); + void canon_600_correct(); + int canon_s2is(); + void parse_ciff (int offset, int length, int); + void ciff_block_1030(); + + +// LJPEG decoder + unsigned getbithuff (int nbits, ushort *huff); + ushort* make_decoder_ref (const uchar **source); + ushort* make_decoder (const uchar *source); + int ljpeg_start (struct jhead *jh, int info_only); + void ljpeg_end(struct jhead *jh); + int ljpeg_diff (ushort *huff); + ushort * ljpeg_row (int jrow, struct jhead *jh); + ushort * ljpeg_row_unrolled (int jrow, struct jhead *jh); + void ljpeg_idct (struct jhead *jh); + unsigned ph1_bithuff (int nbits, ushort *huff); + +// Canon DSLRs + void crw_init_tables (unsigned table, ushort *huff[2]); + int canon_has_lowbits(); + void canon_load_raw(); + void lossless_jpeg_load_raw(); + void canon_sraw_load_raw(); +// Adobe DNG + void adobe_copy_pixel (unsigned int row, unsigned int col, ushort **rp); + void lossless_dng_load_raw(); + void deflate_dng_load_raw(); + void packed_dng_load_raw(); + void packed_tiled_dng_load_raw(); + void uncompressed_fp_dng_load_raw(); + void lossy_dng_load_raw(); +//void adobe_dng_load_raw_nc(); + +// Pentax + void pentax_load_raw(); + void pentax_4shot_load_raw(); + + void pentax_tree(); + +// Nikon (and Minolta Z2) + void nikon_load_raw(); + void nikon_he_load_raw_placeholder(); + void nikon_read_curve(); + void nikon_load_striped_packed_raw(); + void nikon_load_padded_packed_raw(); + void nikon_load_sraw(); + void nikon_yuv_load_raw(); + void nikon_coolscan_load_raw(); + int nikon_e995(); + int nikon_e2100(); + void nikon_3700(); + int minolta_z2(); +// void nikon_e2100_load_raw(); + +// Fuji +// void fuji_load_raw(); + int guess_RAFDataGeneration (uchar *RAFData_start); + void parse_fuji (int offset); + void parse_fuji_thumbnail(int offset); + +// Rollei + void rollei_load_raw(); + void parse_rollei(); + +// Contax + void parse_kyocera (); + +// MF backs +//int bayer (unsigned row, unsigned col); + int p1raw(unsigned,unsigned); + void phase_one_flat_field (int is_float, int nc); + int p1rawc(unsigned row, unsigned col, unsigned& count); + void phase_one_fix_col_pixel_avg(unsigned row, unsigned col); + void phase_one_fix_pixel_grad(unsigned row, unsigned col); + void phase_one_load_raw(); + unsigned ph1_bits (int nbits); + void phase_one_load_raw_c(); + void phase_one_load_raw_s(); + void hasselblad_load_raw(); + void leaf_hdr_load_raw(); + void sinar_4shot_load_raw(); + void imacon_full_load_raw(); + void hasselblad_full_load_raw(); + void packed_load_raw(); + float find_green(int,int,int,int); + void unpacked_load_raw(); + void unpacked_load_raw_FujiDBP(); + void unpacked_load_raw_reversed(); + void unpacked_load_raw_fuji_f700s20(); + void parse_sinar_ia(); + void parse_phase_one (int base); + +// Misc P&S cameras + void parse_broadcom(); + void broadcom_load_raw(); + void nokia_load_raw(); + void android_loose_load_raw(); + void android_tight_load_raw(); + unsigned pana_data (int nb, unsigned *bytes); + void panasonic_load_raw(); +// void panasonic_16x10_load_raw(); + void olympus_load_raw(); +// void olympus_cseries_load_raw(); + void minolta_rd175_load_raw(); + void quicktake_100_load_raw(); + const int* make_decoder_int (const int *source, int level); + int radc_token (int tree); + void kodak_radc_load_raw(); + void kodak_jpeg_load_raw(); + void kodak_dc120_load_raw(); + void eight_bit_load_raw(); + void smal_decode_segment (unsigned seg[2][2], int holes); + void smal_v6_load_raw(); + int median4 (int *p); + void fill_holes (int holes); + void smal_v9_load_raw(); + void parse_riff(int maxdepth); + void parse_cine(); + void parse_smal (int offset, int fsize); + int parse_jpeg (int offset); + +// Kodak + void kodak_262_load_raw(); + int kodak_65000_decode (short *out, int bsize); + void kodak_65000_load_raw(); + void kodak_rgb_load_raw(); + void kodak_ycbcr_load_raw(); +// void kodak_yrgb_load_raw(); + void kodak_c330_load_raw(); + void kodak_c603_load_raw(); + void kodak_rgb_load_thumb(); + void kodak_ycbcr_load_thumb(); + void vc5_dng_load_raw_placeholder(); + void jxl_dng_load_raw_placeholder(); +// It's a Sony (and K&M) + void sony_decrypt (unsigned *data, int len, int start, int key); + void sony_load_raw(); + void sony_arw_load_raw(); + void sony_arw2_load_raw(); + void sony_arq_load_raw(); + void sony_ljpeg_load_raw(); + void sony_ycbcr_load_raw(); + void samsung_load_raw(); + void samsung2_load_raw(); + void samsung3_load_raw(); + void parse_minolta (int base); + +#ifdef USE_X3FTOOLS +// Foveon/Sigma +// We always have x3f code compiled in! + void parse_x3f(); + void x3f_load_raw(); + void x3f_dpq_interpolate_rg(); + void x3f_dpq_interpolate_af(int xstep, int ystep, int scale); // 1x1 af pixels + void x3f_dpq_interpolate_af_sd(int xstart,int ystart, int xend, int yend, int xstep, int ystep, int scale); // sd Quattro interpolation +#else + void parse_x3f() {} + void x3f_load_raw(){} +#endif +#ifdef USE_6BY9RPI + void rpi_load_raw8(); + void rpi_load_raw12(); + void rpi_load_raw14(); + void rpi_load_raw16(); + void parse_raspberrypi(); +#endif + + void kodak_thumb_loader(); + void dng_ycbcr_thumb_loader(); +#ifdef USE_X3FTOOLS + void x3f_thumb_loader(); + INT64 x3f_thumb_size(); +#endif + + +// CAM/RGB + void pseudoinverse (double (*in)[3], double (*out)[3], int size); + void simple_coeff (int index); + +// Openp + char** malloc_omp_buffers(int buffer_count, size_t buffer_size); + void free_omp_buffers(char** buffers, int buffer_count); + + +// Tiff/Exif parsers + void tiff_get (unsigned base,unsigned *tag, unsigned *type, unsigned *len, unsigned *save); + short tiff_sget(unsigned save, uchar *buf, unsigned buf_len, INT64 *tag_offset, + unsigned *tag_id, unsigned *tag_type, INT64 *tag_dataoffset, + unsigned *tag_datalen, int *tag_dataunit_len); + void parse_thumb_note (int base, unsigned toff, unsigned tlen); + void parse_makernote (int base, int uptag); + void parse_makernote_0xc634(int base, int uptag, unsigned dng_writer); + void parse_exif (int base); + void parse_exif_interop(int base); + void linear_table(unsigned len); + void Kodak_DCR_WBtags(int wb, unsigned type, int wbi); + void Kodak_KDC_WBtags(int wb, int wbi); + short KodakIllumMatrix (unsigned type, float *romm_camIllum); + void parse_kodak_ifd (int base); + int parse_tiff_ifd (int base); + int parse_tiff (int base); + void apply_tiff(void); + void parse_gps (int base); + void parse_gps_libraw(int base); + void aRGB_coeff(double aRGB_cam[3][3]); + void romm_coeff(float romm_cam[3][3]); + void parse_mos (INT64 offset); + void parse_qt (int end); + void get_timestamp (int reversed); + +// The identify + short guess_byte_order (int words); + void identify_process_dng_fields(); + void identify_finetune_pentax(); + void identify_finetune_by_filesize(int); + void identify_finetune_dcr(char head[64],int,int); +// Tiff writer + void tiff_set(struct tiff_hdr *th, ushort *ntag,ushort tag, ushort type, int count, int val); + void tiff_head (struct tiff_hdr *th, int full); + +// split AHD code + void ahd_interpolate_green_h_and_v(int top, int left, ushort (*out_rgb)[LIBRAW_AHD_TILE][LIBRAW_AHD_TILE][3]); + void ahd_interpolate_r_and_b_in_rgb_and_convert_to_cielab(int top, int left, ushort (*inout_rgb)[LIBRAW_AHD_TILE][3], short (*out_lab)[LIBRAW_AHD_TILE][3]); + void ahd_interpolate_r_and_b_and_convert_to_cielab(int top, int left, ushort (*inout_rgb)[LIBRAW_AHD_TILE][LIBRAW_AHD_TILE][3], short (*out_lab)[LIBRAW_AHD_TILE][LIBRAW_AHD_TILE][3]); + void ahd_interpolate_build_homogeneity_map(int top, int left, short (*lab)[LIBRAW_AHD_TILE][LIBRAW_AHD_TILE][3], char (*out_homogeneity_map)[LIBRAW_AHD_TILE][2]); + void ahd_interpolate_combine_homogeneous_pixels(int top, int left, ushort (*rgb)[LIBRAW_AHD_TILE][LIBRAW_AHD_TILE][3], char (*homogeneity_map)[LIBRAW_AHD_TILE][2]); + + void init_fuji_compr(struct fuji_compressed_params* info); + void init_fuji_block(struct fuji_compressed_block* info, const struct fuji_compressed_params *params, INT64 raw_offset, unsigned dsize); + void copy_line_to_xtrans(struct fuji_compressed_block* info, int cur_line, int cur_block, int cur_block_width); + void copy_line_to_bayer(struct fuji_compressed_block* info, int cur_line, int cur_block, int cur_block_width); + void xtrans_decode_block(struct fuji_compressed_block* info, const struct fuji_compressed_params *params, int cur_line); + void fuji_bayer_decode_block(struct fuji_compressed_block* info, const struct fuji_compressed_params *params, int cur_line); + void fuji_compressed_load_raw(); + void fuji_14bit_load_raw(); + void parse_fuji_compressed_header(); + void crxLoadRaw(); + int crxParseImageHeader(uchar *cmp1TagData, int nTrack, int size); + void panasonicC6_load_raw(); + void panasonicC7_load_raw(); + void panasonicC8_load_raw(); + + void nikon_14bit_load_raw(); + +// DCB + void dcb_pp(); + void dcb_copy_to_buffer(float (*image2)[3]); + void dcb_restore_from_buffer(float (*image2)[3]); + void dcb_color(); + void dcb_color_full(); + void dcb_map(); + void dcb_correction(); + void dcb_correction2(); + void dcb_refinement(); + void rgb_to_lch(double (*image3)[3]); + void lch_to_rgb(double (*image3)[3]); + void fbdd_correction(); + void fbdd_correction2(double (*image3)[3]); + void fbdd_green(); + void dcb_ver(float (*image3)[3]); + void dcb_hor(float (*image2)[3]); + void dcb_color2(float (*image2)[3]); + void dcb_color3(float (*image3)[3]); + void dcb_decide(float (*image2)[3], float (*image3)[3]); + void dcb_nyquist(); +#endif + +#endif diff --git a/rtengine/libraw/internal/losslessjpeg.h b/rtengine/libraw/internal/losslessjpeg.h new file mode 100644 index 000000000..382746be0 --- /dev/null +++ b/rtengine/libraw/internal/losslessjpeg.h @@ -0,0 +1,292 @@ +/* -*- C++ -*- + * File: huffmandec.h + * Copyright (C) 2023-2024 Alex Tutubalin, LibRaw LLC + * + Lossless JPEG decoder + + Code partially backported from DNGLab's rust code + DNGLab was originally created in 2021 by Daniel Vogelbacher. + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ +#pragma once +#include +#include + +struct BitPump // generic bit source +{ + virtual uint32_t peek(uint32_t num) = 0; + virtual void consume(uint32_t num) = 0; + + uint32_t get(uint32_t num) + { + if(num == 0) { return 0u; } + uint32_t val = peek(num); + consume(num); + return val; + } +}; + +struct ByteStreamBE // Jpeg is always big endian +{ + enum Exceptions + { + OK = 0, + EndOfBuffer = 1 + }; + + uint8_t *buffer; + unsigned size, pos; + ByteStreamBE(uint8_t *b, unsigned s) : buffer(b), size(s), pos(0) {} + ByteStreamBE() : buffer(0),size(0),pos(0){} + bool skip_to_marker(); + + uint8_t get_u8() + { + if (pos >= size) + throw EndOfBuffer; + uint8_t ret = buffer[pos]; + pos++; + return ret; + } + uint16_t get_u16() + { + if (pos + 2 > size) + throw EndOfBuffer; + uint8_t r1 = buffer[pos]; + uint8_t r2 = buffer[pos + 1]; + pos += 2; + return (r1 << 8) | r2; + } +}; + +struct BitPumpJpeg : public BitPump +{ + uint8_t *buffer; + unsigned size, pos; + uint64_t bits; + uint32_t nbits; + bool finished; + + void consume(uint32_t num) + { + if (num <= nbits) + { + nbits -= num; + bits &= (uint64_t(1) << nbits) - 1UL; + } + } + uint32_t peek(uint32_t num) + { + if (num > nbits && !finished) + { + if ((size >= 4) && pos < size && buffer[pos] != 0xff && buffer[pos + 1] != 0xff && buffer[pos + 2] != 0xff && + buffer[pos + 3] != 0xff) + { + uint64_t inbits = (uint32_t(buffer[pos]) << 24) | (uint32_t(buffer[pos + 1]) << 16) | + (uint32_t(buffer[pos + 2]) << 8) | (uint32_t(buffer[pos + 3])); + bits = (bits << 32) | inbits; + pos += 4; + nbits += 32; + } + else + { + int read_bytes = 0; + while (read_bytes < 4 && !finished) + { + uint8_t byte = 0; + if (pos >= size) + finished = true; + else + { + uint8_t nextbyte = buffer[pos]; + if (nextbyte != 0xff) + byte = nextbyte; + else if (buffer[pos + 1] == 0x00) + { + pos += 1; + byte = nextbyte; + } + else + finished = true; + }; + bits = (bits << 8) | uint64_t(byte); + pos += 1; + nbits += 8; + read_bytes += 1; + } + } + } + if(num > nbits && finished) + { + bits <<= 32; + nbits += 32; + } + return uint32_t(bits >> (nbits - num)); + } + + BitPumpJpeg(ByteStreamBE& s): buffer(s.buffer+s.pos),size(s.size-s.pos),pos(0),bits(0),nbits(0),finished(false){} +}; + + +const uint32_t LIBRAW_DECODE_CACHE_BITS = 13; +const uint64_t LIBRAW_CACHE_PRESENT_FLAG = 0x100000000L; + +struct HuffTable +{ + uint32_t bits[17]; + uint32_t huffval[256]; + uint32_t shiftval[256]; + bool dng_bug; + bool disable_cache; + uint32_t nbits; + std::vector hufftable; // len:8 << 16| huffval:8 << 8 | shift:8 + std::vector decodecache; + bool initialized; + HuffTable(); + void initval(uint32_t bits[17], uint32_t huffval[256], bool dng_bug); + + int32_t decode(BitPump& pump) + { + uint64_t cached = disable_cache ? 0 : decodecache[pump.peek(LIBRAW_DECODE_CACHE_BITS)]; + if (cached & LIBRAW_CACHE_PRESENT_FLAG) + { + uint32_t bits = (cached >> 16) & 0xff; + int16_t val = int16_t(cached & 0xffff); + if (val == -32768 && dng_bug) + { + if (bits > 16) + pump.consume(bits - 16); + } + else + pump.consume(bits); + return val; + } + else + return decode_slow1(pump); + } + + int32_t decode_slow1(BitPump &pump) + { + int32_t _diff = diff(pump, len(pump)); + return _diff; + } + + int32_t decode_slow2(BitPump & pump, uint32_t& outlen) // output: (len+shift):8, code:16 + { + uint32_t _len = len(pump); + int32_t _diff = diff(pump, _len); + uint8_t bits8 = (_len >> 16) & 0xff; + uint8_t len8 = (_len >> 8) & 0xff; + outlen = bits8 + len8; + return _diff; + } + + uint32_t len(BitPump & pump) //bits:8, len:8, shift:8 + { + uint32_t code = pump.peek(nbits); + uint32_t huffdata = hufftable[code]; + uint32_t bits = (huffdata >> 16) & 0xff; + pump.consume(bits); + return huffdata; + } + + int32_t diff(BitPump & pump, uint32_t hentry) // input: bits:8, len:8, shift:8; output: diff:i32 + { + uint32_t len = (hentry >> 8) & 0xff; + if (len == 0) + return 0; + if (len == 16) + { + if (dng_bug) + pump.get(16); + return -32768; + } + uint32_t shift = hentry & 0xff; + uint32_t fulllen = len + shift; + uint32_t bits = pump.get(len); + int32_t diff = ((bits << 1) + 1) << shift >> 1; + if ((diff & (1 << (fulllen - 1))) == 0) + { + diff -= int32_t((1 << fulllen) - ((shift == 0))); + } + return diff; + } +}; + +struct LibRaw_JpegComponentInfo +{ + unsigned id; + unsigned index; + unsigned dc_tbl; + unsigned subsample_h, subsample_v; + LibRaw_JpegComponentInfo() : id(0), index(0), dc_tbl(0), subsample_h(0), subsample_v(0) {}; + LibRaw_JpegComponentInfo(unsigned _id, unsigned _index, unsigned _dcn, unsigned _sh, unsigned _sv) + : id(_id), index(_index), dc_tbl(_dcn), subsample_h(_sh), subsample_v(_sv){}; + LibRaw_JpegComponentInfo(const LibRaw_JpegComponentInfo& q): id(q.id), index(q.index), dc_tbl(q.dc_tbl), + subsample_h(q.subsample_h),subsample_v(q.subsample_v){} +}; + +struct LibRaw_SOFInfo +{ + unsigned width, height; + unsigned cps, precision; + std::vector components; + bool csfix; + LibRaw_SOFInfo(): width(0),height(0),cps(0),precision(0),csfix(false){} + bool parse_sof(ByteStreamBE&); // true => OK, false => not OK + uint32_t parse_sos(ByteStreamBE&); // returns (predictor << 8 | point transform); if above 0xffff => error +}; + +struct LibRaw_LjpegDecompressor +{ + ByteStreamBE buffer; + LibRaw_SOFInfo sof; + uint32_t predictor, point_transform; + uint32_t datastart; + std::vector dhts; + LibRaw_LjpegDecompressor(uint8_t *b, unsigned s); + LibRaw_LjpegDecompressor(uint8_t *b, unsigned bs, bool dngbug, bool csfix); + void initialize(bool dngbug, bool csfix); + uint8_t next_marker(bool allowskip); + bool parse_dht(bool init[4], uint32_t dht_bits[4][17], uint32_t dht_huffval[4][256]); // return true on OK; + bool decode_ljpeg_422(std::vector &dest, int width, int height); + + struct State { + enum States + { + OK = 0, + NotInited = 1, + NoSOI = 2, + IncorrectPrecision = 3, + EOIReached = 4, + InvalidDHT = 5, + InvalidSOF = 6, + InvalidSOS = 7, + DQTPresent = 8 + }; + + }; + struct Marker { + enum Markers { + Stuff = 0x00, + SOF3 = 0xc3, // lossless + DHT = 0xc4, // huffman tables + SOI = 0xd8, // start of image + EOI = 0xd9, // end of image + SOS = 0xda, // start of scan + DQT = 0xdb, // quantization tables + Fill = 0xff, + }; + }; + enum State::States state; +}; + diff --git a/rtengine/libraw/internal/var_defines.h b/rtengine/libraw/internal/var_defines.h new file mode 100644 index 000000000..d6d5ea299 --- /dev/null +++ b/rtengine/libraw/internal/var_defines.h @@ -0,0 +1,216 @@ +/* -*- C++ -*- + * File: var_defines.h + * Copyright 2008-2024 LibRaw LLC (info@libraw.org) + * Created: Sat Mar 8, 2008 + * + * LibRaw redefinitions of dcraw internal variables + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#ifndef VAR_DEFINES_H +#define VAR_DEFINES_H + + +// imgdata.idata +#define make (imgdata.idata.make) +#define model (imgdata.idata.model) +#define software (imgdata.idata.software) +#define is_raw (imgdata.idata.raw_count) +#define dng_version (imgdata.idata.dng_version) +#define is_foveon (imgdata.idata.is_foveon) +#define colors (imgdata.idata.colors) +#define cdesc (imgdata.idata.cdesc) +#define filters (imgdata.idata.filters) +#define xtrans (imgdata.idata.xtrans) +#define xtrans_abs (imgdata.idata.xtrans_abs) +#define xmpdata (imgdata.idata.xmpdata) +#define xmplen (imgdata.idata.xmplen) +//imgdata image +#define image (imgdata.image) +#define raw_image (imgdata.rawdata.raw_image) +#define color_image (imgdata.rawdata.color_image) +#define normalized_make (imgdata.idata.normalized_make) +#define normalized_model (imgdata.idata.normalized_model) +#define maker_index (imgdata.idata.maker_index) + +// imgdata.sizes +#define raw_height (imgdata.sizes.raw_height) +#define raw_width (imgdata.sizes.raw_width) +#define raw_pitch (imgdata.sizes.raw_pitch) +#define height (imgdata.sizes.height) +#define width (imgdata.sizes.width) +#define top_margin (imgdata.sizes.top_margin) +#define left_margin (imgdata.sizes.left_margin) +#define bottom_margin (imgdata.sizes.bottom_margin) +#define right_margin (imgdata.sizes.right_margin) +#define iheight (imgdata.sizes.iheight) +#define iwidth (imgdata.sizes.iwidth) +#define pixel_aspect (imgdata.sizes.pixel_aspect) +#define flip (imgdata.sizes.flip) +#define mask (imgdata.sizes.mask) +#define raw_stride (libraw_internal_data.unpacker_data.raw_stride) + +//imgdata.color +#define white (imgdata.color.white) +#define cam_mul (imgdata.color.cam_mul) +#define pre_mul (imgdata.color.pre_mul) +#define cmatrix (imgdata.color.cmatrix) +#define rgb_cam (imgdata.color.rgb_cam) +#ifndef SRC_USES_CURVE +#define curve (imgdata.color.curve) +#endif +#ifndef SRC_USES_BLACK +#define black (imgdata.color.black) +#define cblack (imgdata.color.cblack) +#endif +#define maximum (imgdata.color.maximum) +#define channel_maximum (imgdata.color.channel_maximum) +#define profile_length (imgdata.color.profile_length) +#define color_flags (imgdata.color.color_flags) +#define ph1 (imgdata.color.phase_one_data) +#define flash_used (imgdata.color.flash_used) +#define canon_ev (imgdata.color.canon_ev) +#define model2 (imgdata.color.model2) + +//imgdata.thumbnail +#define thumb_width (imgdata.thumbnail.twidth) +#define thumb_height (imgdata.thumbnail.theight) +#define thumb_length (imgdata.thumbnail.tlength) + + +//imgdata.others +#define iso_speed (imgdata.other.iso_speed) +#define shutter (imgdata.other.shutter) +#define aperture (imgdata.other.aperture) +#define focal_len (imgdata.other.focal_len) +#define timestamp (imgdata.other.timestamp) +#define shot_order (imgdata.other.shot_order) +#define gpsdata (imgdata.other.gpsdata) +#define desc (imgdata.other.desc) +#define artist (imgdata.other.artist) + +#define FujiCropMode (imgdata.makernotes.fuji.CropMode) + +//imgdata.output +#define greybox (imgdata.params.greybox) +#define cropbox (imgdata.params.cropbox) +#define aber (imgdata.params.aber) +#define gamm (imgdata.params.gamm) +#define user_mul (imgdata.params.user_mul) +#define shot_select (imgdata.rawparams.shot_select) +#define bright (imgdata.params.bright) +#define threshold (imgdata.params.threshold) +#define half_size (imgdata.params.half_size) +#define four_color_rgb (imgdata.params.four_color_rgb) +#define highlight (imgdata.params.highlight) +#define use_auto_wb (imgdata.params.use_auto_wb) +#define use_camera_wb (imgdata.params.use_camera_wb) +#define use_camera_matrix (imgdata.params.use_camera_matrix) +#define output_color (imgdata.params.output_color) +#define output_bps (imgdata.params.output_bps) +#define gamma_16bit (imgdata.params.gamma_16bit) +#define output_tiff (imgdata.params.output_tiff) +#define med_passes (imgdata.params.med_passes) +#define no_auto_bright (imgdata.params.no_auto_bright) +#define auto_bright_thr (imgdata.params.auto_bright_thr) +#define use_fuji_rotate (imgdata.params.use_fuji_rotate) +#define filtering_mode (imgdata.params.filtering_mode) + +// DCB +#define dcb_iterations (imgdata.params.iterations) +#define dcb_enhance_fl (imgdata.params.dcb_enhance) +#define fbdd_noiserd (imgdata.params.fbdd_noiserd) + +//libraw_internal_data.internal_data +#define meta_data (libraw_internal_data.internal_data.meta_data) +#define ifp libraw_internal_data.internal_data.input +#define ifname ((char*)libraw_internal_data.internal_data.input->fname()) +#define ofp libraw_internal_data.internal_data.output +#define profile_offset (libraw_internal_data.internal_data.profile_offset) +#define thumb_offset (libraw_internal_data.internal_data.toffset) +#define pana_black (libraw_internal_data.internal_data.pana_black) + +//libraw_internal_data.internal_output_params +#define mix_green (libraw_internal_data.internal_output_params.mix_green) +#define raw_color (libraw_internal_data.internal_output_params.raw_color) +#define use_gamma (libraw_internal_data.internal_output_params.use_gamma) +#define zero_is_bad (libraw_internal_data.internal_output_params.zero_is_bad) +#ifndef SRC_USES_SHRINK +#define shrink (libraw_internal_data.internal_output_params.shrink) +#endif +#define fuji_width (libraw_internal_data.internal_output_params.fuji_width) +#define thumb_format (libraw_internal_data.unpacker_data.thumb_format) + +//libraw_internal_data.output_data +#define histogram (libraw_internal_data.output_data.histogram) +#define oprof (libraw_internal_data.output_data.oprof) + +//libraw_internal_data.identify_data +#define exif_cfa (libraw_internal_data.identify_data.olympus_exif_cfa) +#define unique_id (libraw_internal_data.identify_data.unique_id) +#define OlyID (libraw_internal_data.identify_data.OlyID) +#define tiff_nifds (libraw_internal_data.identify_data.tiff_nifds) +#define tiff_flip (libraw_internal_data.identify_data.tiff_flip) +#define metadata_blocks (libraw_internal_data.identify_data.metadata_blocks) + +//libraw_internal_data.unpacker_data +#define order (libraw_internal_data.unpacker_data.order) +#define data_error (libraw_internal_data.unpacker_data.data_error) +#define cr2_slice (libraw_internal_data.unpacker_data.cr2_slice) +#define sraw_mul (libraw_internal_data.unpacker_data.sraw_mul) +#define kodak_cbpp (libraw_internal_data.unpacker_data.kodak_cbpp) +#define strip_offset (libraw_internal_data.unpacker_data.strip_offset) +#define data_offset (libraw_internal_data.unpacker_data.data_offset) +#define data_size (libraw_internal_data.unpacker_data.data_size) +#define meta_offset (libraw_internal_data.unpacker_data.meta_offset) +#define meta_length (libraw_internal_data.unpacker_data.meta_length) +#define thumb_misc (libraw_internal_data.unpacker_data.thumb_misc) +#define fuji_layout (libraw_internal_data.unpacker_data.fuji_layout) +#define tiff_samples (libraw_internal_data.unpacker_data.tiff_samples) +#define tiff_bps (libraw_internal_data.unpacker_data.tiff_bps) +#define tiff_compress (libraw_internal_data.unpacker_data.tiff_compress) +#define tiff_sampleformat (libraw_internal_data.unpacker_data.tiff_sampleformat) +#define zero_after_ff (libraw_internal_data.unpacker_data.zero_after_ff) +#define tile_width (libraw_internal_data.unpacker_data.tile_width) +#define tile_length (libraw_internal_data.unpacker_data.tile_length) +#define load_flags (libraw_internal_data.unpacker_data.load_flags) +#define pana_encoding (libraw_internal_data.unpacker_data.pana_encoding) +#define pana8 (libraw_internal_data.unpacker_data.pana8) +#define pana_bpp (libraw_internal_data.unpacker_data.pana_bpp) +#define CM_found (libraw_internal_data.unpacker_data.CM_found) + +#define is_NikonTransfer (libraw_internal_data.unpacker_data.is_NikonTransfer) +#define is_Olympus (libraw_internal_data.unpacker_data.is_Olympus) +#define OlympusDNG_SubDirOffsetValid (libraw_internal_data.unpacker_data.OlympusDNG_SubDirOffsetValid) +#define is_Sony (libraw_internal_data.unpacker_data.is_Sony) +#define is_PentaxRicohMakernotes (libraw_internal_data.unpacker_data.is_PentaxRicohMakernotes) +#define is_pana_raw (libraw_internal_data.unpacker_data.is_pana_raw) + + +#ifdef LIBRAW_IO_REDEFINED +#define fread(ptr,size,n,stream) stream->read(ptr,size,n) +#define fseek(stream,o,w) stream->seek(o,w) +#define fseeko(stream,o,w) stream->seek(o,w) +#define ftell(stream) stream->tell() +#define ftello(stream) stream->tell() +#define feof(stream) stream->eof() +#ifdef getc +#undef getc +#endif +#define getc(stream) stream->get_char() +#define fgetc(stream) stream->get_char() +#define fgetcb(stream) stream->get_char_buf() +#define fgets(str,n,stream) stream->gets(str,n) +#define fscanf(stream,fmt,ptr) stream->scanf_one(fmt,ptr) +#endif + +#endif diff --git a/rtengine/libraw/internal/x3f_tools.h b/rtengine/libraw/internal/x3f_tools.h new file mode 100644 index 000000000..df2c6f796 --- /dev/null +++ b/rtengine/libraw/internal/x3f_tools.h @@ -0,0 +1,539 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + */ + +/* Library for accessing X3F Files +---------------------------------------------------------------- +BSD-style License +---------------------------------------------------------------- + +* Copyright (c) 2010, Roland Karlsson (roland@proxel.se) +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the organization nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY ROLAND KARLSSON ''AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL ROLAND KARLSSON BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef X3F_TOOLS_H +#define X3F_TOOLS_H + +#include +#include +#include +#include +#include +#include "../libraw/libraw_datastream.h" + +/* From X3F_IO.H */ + +#define SIZE_UNIQUE_IDENTIFIER 16 +#define SIZE_WHITE_BALANCE 32 +#define SIZE_COLOR_MODE 32 +#define NUM_EXT_DATA_2_1 32 +#define NUM_EXT_DATA_3_0 64 +#define NUM_EXT_DATA NUM_EXT_DATA_3_0 + +#define X3F_VERSION(MAJ, MIN) (uint32_t)(((MAJ) << 16) + MIN) +#define X3F_VERSION_2_0 X3F_VERSION(2, 0) +#define X3F_VERSION_2_1 X3F_VERSION(2, 1) +#define X3F_VERSION_2_2 X3F_VERSION(2, 2) +#define X3F_VERSION_2_3 X3F_VERSION(2, 3) +#define X3F_VERSION_3_0 X3F_VERSION(3, 0) +#define X3F_VERSION_4_0 X3F_VERSION(4, 0) + +/* Main file identifier */ +#define X3F_FOVb (uint32_t)(0x62564f46) +/* Directory identifier */ +#define X3F_SECd (uint32_t)(0x64434553) +/* Property section identifiers */ +#define X3F_PROP (uint32_t)(0x504f5250) +#define X3F_SECp (uint32_t)(0x70434553) +/* Image section identifiers */ +#define X3F_IMAG (uint32_t)(0x46414d49) +#define X3F_IMA2 (uint32_t)(0x32414d49) +#define X3F_SECi (uint32_t)(0x69434553) +/* CAMF section identifiers */ +#define X3F_CAMF (uint32_t)(0x464d4143) +#define X3F_SECc (uint32_t)(0x63434553) +/* CAMF entry identifiers */ +#define X3F_CMbP (uint32_t)(0x50624d43) +#define X3F_CMbT (uint32_t)(0x54624d43) +#define X3F_CMbM (uint32_t)(0x4d624d43) +#define X3F_CMb (uint32_t)(0x00624d43) +/* SDQ section identifiers ? - TODO */ +#define X3F_SPPA (uint32_t)(0x41505053) +#define X3F_SECs (uint32_t)(0x73434553) + +#define X3F_IMAGE_THUMB_PLAIN (uint32_t)(0x00020003) +#define X3F_IMAGE_THUMB_HUFFMAN (uint32_t)(0x0002000b) +#define X3F_IMAGE_THUMB_JPEG (uint32_t)(0x00020012) +#define X3F_IMAGE_THUMB_SDQ (uint32_t)(0x00020019) /* SDQ ? - TODO */ + +#define X3F_IMAGE_RAW_HUFFMAN_X530 (uint32_t)(0x00030005) +#define X3F_IMAGE_RAW_HUFFMAN_10BIT (uint32_t)(0x00030006) +#define X3F_IMAGE_RAW_TRUE (uint32_t)(0x0003001e) +#define X3F_IMAGE_RAW_MERRILL (uint32_t)(0x0001001e) +#define X3F_IMAGE_RAW_QUATTRO (uint32_t)(0x00010023) +#define X3F_IMAGE_RAW_SDQ (uint32_t)(0x00010025) +#define X3F_IMAGE_RAW_SDQH (uint32_t)(0x00010027) +#define X3F_IMAGE_RAW_SDQH2 (uint32_t)(0x00010029) + +#define X3F_IMAGE_HEADER_SIZE 28 +#define X3F_CAMF_HEADER_SIZE 28 +#define X3F_PROPERTY_LIST_HEADER_SIZE 24 + +typedef uint16_t utf16_t; + +typedef int bool_t; + +typedef enum x3f_extended_types_e +{ + X3F_EXT_TYPE_NONE = 0, + X3F_EXT_TYPE_EXPOSURE_ADJUST = 1, + X3F_EXT_TYPE_CONTRAST_ADJUST = 2, + X3F_EXT_TYPE_SHADOW_ADJUST = 3, + X3F_EXT_TYPE_HIGHLIGHT_ADJUST = 4, + X3F_EXT_TYPE_SATURATION_ADJUST = 5, + X3F_EXT_TYPE_SHARPNESS_ADJUST = 6, + X3F_EXT_TYPE_RED_ADJUST = 7, + X3F_EXT_TYPE_GREEN_ADJUST = 8, + X3F_EXT_TYPE_BLUE_ADJUST = 9, + X3F_EXT_TYPE_FILL_LIGHT_ADJUST = 10 +} x3f_extended_types_t; + +typedef struct x3f_property_s +{ + /* Read from file */ + uint32_t name_offset; + uint32_t value_offset; + + /* Computed */ + utf16_t *name; /* 0x0000 terminated UTF 16 */ + utf16_t *value; /* 0x0000 terminated UTF 16 */ +} x3f_property_t; + +typedef struct x3f_property_table_s +{ + uint32_t size; + x3f_property_t *element; +} x3f_property_table_t; + +typedef struct x3f_property_list_s +{ + /* 2.0 Fields */ + uint32_t num_properties; + uint32_t character_format; + uint32_t reserved; + uint32_t total_length; + + x3f_property_table_t property_table; + + void *data; + + uint32_t data_size; + +} x3f_property_list_t; + +typedef struct x3f_table8_s +{ + uint32_t size; + uint8_t *element; +} x3f_table8_t; + +typedef struct x3f_table16_s +{ + uint32_t size; + uint16_t *element; +} x3f_table16_t; + +typedef struct x3f_table32_s +{ + uint32_t size; + uint32_t *element; +} x3f_table32_t; + +typedef struct +{ + uint8_t *data; /* Pointer to actual image data */ + void *buf; /* Pointer to allocated buffer for free() */ + uint32_t rows; + uint32_t columns; + uint32_t channels; + uint32_t row_stride; +} x3f_area8_t; + +typedef struct +{ + uint16_t *data; /* Pointer to actual image data */ + void *buf; /* Pointer to allocated buffer for free() */ + uint32_t rows; + uint32_t columns; + uint32_t channels; + uint32_t row_stride; +} x3f_area16_t; + +#define UNDEFINED_LEAF 0xffffffff + +typedef struct x3f_huffnode_s +{ + struct x3f_huffnode_s *branch[2]; + uint32_t leaf; +} x3f_huffnode_t; + +typedef struct x3f_hufftree_s +{ + uint32_t free_node_index; /* Free node index in huffman tree array */ + uint32_t total_node_index; + x3f_huffnode_t *nodes; /* Coding tree */ +} x3f_hufftree_t; + +typedef struct x3f_true_huffman_element_s +{ + uint8_t code_size; + uint8_t code; +} x3f_true_huffman_element_t; + +typedef struct x3f_true_huffman_s +{ + uint32_t size; + x3f_true_huffman_element_t *element; +} x3f_true_huffman_t; + +/* 0=bottom, 1=middle, 2=top */ +#define TRUE_PLANES 3 + +typedef struct x3f_true_s +{ + uint16_t seed[TRUE_PLANES]; /* Always 512,512,512 */ + uint16_t unknown; /* Always 0 */ + x3f_true_huffman_t table; /* Huffman table - zero + terminated. size is the number of + leaves plus 1.*/ + + x3f_table32_t plane_size; /* Size of the 3 planes */ + uint8_t *plane_address[TRUE_PLANES]; /* computed offset to the planes */ + x3f_hufftree_t tree; /* Coding tree */ + x3f_area16_t x3rgb16; /* 3x16 bit X3-RGB data */ +} x3f_true_t; + +typedef struct x3f_quattro_s +{ + struct + { + uint16_t columns; + uint16_t rows; + } plane[TRUE_PLANES]; + uint32_t unknown; + + bool_t quattro_layout; + x3f_area16_t top16; /* Container for the bigger top layer */ +} x3f_quattro_t; + +typedef struct x3f_huffman_s +{ + x3f_table16_t mapping; /* Value Mapping = X3F lossy compression */ + x3f_table32_t table; /* Coding Table */ + x3f_hufftree_t tree; /* Coding tree */ + x3f_table32_t row_offsets; /* Row offsets */ + x3f_area8_t rgb8; /* 3x8 bit RGB data */ + x3f_area16_t x3rgb16; /* 3x16 bit X3-RGB data */ +} x3f_huffman_t; + +typedef struct x3f_image_data_s +{ + /* 2.0 Fields */ + /* ------------------------------------------------------------------ */ + /* Known combinations of type and format are: + 1-6, 2-3, 2-11, 2-18, 3-6 */ + uint32_t type; /* 1 = RAW X3 (SD1) + 2 = thumbnail or maybe just RGB + 3 = RAW X3 */ + uint32_t format; /* 3 = 3x8 bit pixmap + 6 = 3x10 bit huffman with map table + 11 = 3x8 bit huffman + 18 = JPEG */ + uint32_t type_format; /* type<<16 + format */ + /* ------------------------------------------------------------------ */ + + uint32_t columns; /* width / row size in pixels */ + uint32_t rows; /* height */ + uint32_t row_stride; /* row size in bytes */ + + /* NULL if not used */ + x3f_huffman_t *huffman; /* Huffman help data */ + x3f_true_t *tru; /* TRUE help data */ + x3f_quattro_t *quattro; /* Quattro help data */ + + void *data; /* Take from file if NULL. Otherwise, + this is the actual data bytes in + the file. */ + uint32_t data_size; + +} x3f_image_data_t; + +typedef struct camf_dim_entry_s +{ + uint32_t size; + uint32_t name_offset; + uint32_t n; /* 0,1,2,3... */ + char *name; +} camf_dim_entry_t; + +typedef enum +{ + M_FLOAT, + M_INT, + M_UINT +} matrix_type_t; + +typedef struct camf_entry_s +{ + /* pointer into decoded data */ + void *entry; + + /* entry header */ + uint32_t id; + uint32_t version; + uint32_t entry_size; + uint32_t name_offset; + uint32_t value_offset; + + /* computed values */ + char *name_address; + void *value_address; + uint32_t name_size; + uint32_t value_size; + + /* extracted values for explicit CAMF entry types*/ + uint32_t text_size; + char *text; + + uint32_t property_num; + char **property_name; + uint8_t **property_value; + + uint32_t matrix_dim; + camf_dim_entry_t *matrix_dim_entry; + + /* Offset, pointer and size and type of raw data */ + uint32_t matrix_type; + uint32_t matrix_data_off; + void *matrix_data; + uint32_t matrix_element_size; + + /* Pointer and type of copied data */ + matrix_type_t matrix_decoded_type; + void *matrix_decoded; + + /* Help data to try to estimate element size */ + uint32_t matrix_elements; + uint32_t matrix_used_space; + double matrix_estimated_element_size; + +} camf_entry_t; + +typedef struct camf_entry_table_s +{ + uint32_t size; + camf_entry_t *element; +} camf_entry_table_t; + +typedef struct x3f_camf_typeN_s +{ + uint32_t val0; + uint32_t val1; + uint32_t val2; + uint32_t val3; +} x3f_camf_typeN_t; + +typedef struct x3f_camf_type2_s +{ + uint32_t reserved; + uint32_t infotype; + uint32_t infotype_version; + uint32_t crypt_key; +} x3f_camf_type2_t; + +typedef struct x3f_camf_type4_s +{ + uint32_t decoded_data_size; + uint32_t decode_bias; + uint32_t block_size; + uint32_t block_count; +} x3f_camf_type4_t; + +typedef struct x3f_camf_type5_s +{ + uint32_t decoded_data_size; + uint32_t decode_bias; + uint32_t unknown2; + uint32_t unknown3; +} x3f_camf_type5_t; + +typedef struct x3f_camf_s +{ + + /* Header info */ + uint32_t type; + union { + x3f_camf_typeN_t tN; + x3f_camf_type2_t t2; + x3f_camf_type4_t t4; + x3f_camf_type5_t t5; + }; + + /* The encrypted raw data */ + void *data; + uint32_t data_size; + + /* Help data for type 4 Huffman compression */ + x3f_true_huffman_t table; + x3f_hufftree_t tree; + uint8_t *decoding_start; + uint32_t decoding_size; + + /* The decrypted data */ + void *decoded_data; + uint32_t decoded_data_size; + + /* Pointers into the decrypted data */ + camf_entry_table_t entry_table; +} x3f_camf_t; + +typedef struct x3f_directory_entry_header_s +{ + uint32_t identifier; /* Should be ´SECp´, "SECi", ... */ + uint32_t version; /* 0x00020001 is version 2.1 */ + union { + x3f_property_list_t property_list; + x3f_image_data_t image_data; + x3f_camf_t camf; + } data_subsection; +} x3f_directory_entry_header_t; + +typedef struct x3f_directory_entry_s +{ + struct + { + uint32_t offset; + uint32_t size; + } input, output; + + uint32_t type; + + x3f_directory_entry_header_t header; +} x3f_directory_entry_t; + +typedef struct x3f_directory_section_s +{ + uint32_t identifier; /* Should be ´SECd´ */ + uint32_t version; /* 0x00020001 is version 2.1 */ + + /* 2.0 Fields */ + uint32_t num_directory_entries; + x3f_directory_entry_t *directory_entry; +} x3f_directory_section_t; + +typedef struct x3f_header_s +{ + /* 2.0 Fields */ + uint32_t identifier; /* Should be ´FOVb´ */ + uint32_t version; /* 0x00020001 means 2.1 */ + uint8_t unique_identifier[SIZE_UNIQUE_IDENTIFIER]; + uint32_t mark_bits; + uint32_t columns; /* Columns and rows ... */ + uint32_t rows; /* ... before rotation */ + uint32_t rotation; /* 0, 90, 180, 270 */ + + char white_balance[SIZE_WHITE_BALANCE]; /* Introduced in 2.1 */ + char color_mode[SIZE_COLOR_MODE]; /* Introduced in 2.3 */ + + /* Introduced in 2.1 and extended from 32 to 64 in 3.0 */ + uint8_t extended_types[NUM_EXT_DATA]; /* x3f_extended_types_t */ + float extended_data[NUM_EXT_DATA]; /* 32 bits, but do type differ? */ +} x3f_header_t; + +typedef struct x3f_info_s +{ + char *error; + struct + { + LibRaw_abstract_datastream *file; /* Use if more data is needed */ + } input, output; +} x3f_info_t; + +typedef struct x3f_s +{ + x3f_info_t info; + x3f_header_t header; + x3f_directory_section_t directory_section; +} x3f_t; + +typedef enum x3f_return_e +{ + X3F_OK = 0, + X3F_ARGUMENT_ERROR = 1, + X3F_INFILE_ERROR = 2, + X3F_OUTFILE_ERROR = 3, + X3F_INTERNAL_ERROR = 4 +} x3f_return_t; + +x3f_return_t x3f_delete(x3f_t *x3f); + +/* Hacky external flags */ +/* --------------------------------------------------------------------- */ + +extern int legacy_offset; +extern bool_t auto_legacy_offset; + +/* --------------------------------------------------------------------- */ +/* Huffman Decode Macros */ +/* --------------------------------------------------------------------- */ + +#define HUF_TREE_MAX_LENGTH 27 +#define HUF_TREE_MAX_NODES(_leaves) ((HUF_TREE_MAX_LENGTH + 1) * (_leaves)) +#define HUF_TREE_GET_LENGTH(_v) (((_v) >> 27) & 0x1f) +#define HUF_TREE_GET_CODE(_v) ((_v)&0x07ffffff) + +x3f_t *x3f_new_from_file(LibRaw_abstract_datastream *infile); +x3f_return_t x3f_delete(x3f_t *x3f); +x3f_directory_entry_t *x3f_get_raw(x3f_t *x3f); +x3f_directory_entry_t *x3f_get_thumb_plain(x3f_t *x3f); +x3f_return_t x3f_load_data(x3f_t *x3f, x3f_directory_entry_t *DE); +x3f_directory_entry_t *x3f_get_thumb_huffman(x3f_t *x3f); +x3f_directory_entry_t *x3f_get_thumb_jpeg(x3f_t *x3f); +x3f_directory_entry_t *x3f_get_camf(x3f_t *x3f); +x3f_directory_entry_t *x3f_get_prop(x3f_t *x3f); +/* extern */ int64_t x3f_load_data_size(x3f_t *x3f, x3f_directory_entry_t *DE); + +#endif diff --git a/rtengine/libraw/lib/Makefile b/rtengine/libraw/lib/Makefile new file mode 100644 index 000000000..a49e51164 --- /dev/null +++ b/rtengine/libraw/lib/Makefile @@ -0,0 +1,3 @@ +all: + @(cd ..; make library) + @echo Done diff --git a/rtengine/libraw/libraw.pc.in b/rtengine/libraw/libraw.pc.in new file mode 100644 index 000000000..c95fbc488 --- /dev/null +++ b/rtengine/libraw/libraw.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libraw +Description: Raw image decoder library (non-thread-safe) +Requires: @PACKAGE_REQUIRES@ +Version: @PACKAGE_VERSION@ +Libs: -L${libdir} -lraw -lstdc++@PC_OPENMP@ +Libs.private: @PACKAGE_LIBS_PRIVATE@ +Cflags: -I${includedir}/libraw -I${includedir} diff --git a/rtengine/libraw/libraw/libraw.h b/rtengine/libraw/libraw/libraw.h new file mode 100644 index 000000000..897f63f1a --- /dev/null +++ b/rtengine/libraw/libraw/libraw.h @@ -0,0 +1,526 @@ +/* -*- C++ -*- + * File: libraw.h + * Copyright 2008-2024 LibRaw LLC (info@libraw.org) + * Created: Sat Mar 8, 2008 + * + * LibRaw C++ interface + * + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + +*/ + +#ifndef _LIBRAW_CLASS_H +#define _LIBRAW_CLASS_H + +#ifdef __linux__ +#define _FILE_OFFSET_BITS 64 +#endif + +#ifndef LIBRAW_USE_DEPRECATED_IOSTREAMS_DATASTREAM +#define LIBRAW_NO_IOSTREAMS_DATASTREAM +#endif + +#ifndef LIBRAW_NO_IOSTREAMS_DATASTREAM +/* maximum file size to use LibRaw_file_datastream (fully buffered) I/O */ +#define LIBRAW_USE_STREAMS_DATASTREAM_MAXSIZE (250 * 1024L * 1024L) +#endif + +#include +#include +#include +#include +#include + +/* better WIN32 defines */ + +/* better WIN32 defines */ + +#if defined(WIN32) || defined(_WIN32) + +/* Win32 API */ +# ifndef LIBRAW_WIN32_CALLS +# define LIBRAW_WIN32_CALLS +# endif + +/* DLLs: Microsoft or Intel compiler */ +# if defined(_MSC_VER) || defined(__INTEL_COMPILER) +# ifndef LIBRAW_WIN32_DLLDEFS +# define LIBRAW_WIN32_DLLDEFS +# endif +#endif + +/* wchar_t* API for std::filebuf */ +# if (defined(_MSC_VER) && (_MSC_VER > 1310)) || (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 910)) +# ifndef LIBRAW_WIN32_UNICODEPATHS +# define LIBRAW_WIN32_UNICODEPATHS +# endif +# elif _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T +# ifndef LIBRAW_WIN32_UNICODEPATHS +# define LIBRAW_WIN32_UNICODEPATHS +# endif +# elif defined(_LIBCPP_HAS_OPEN_WITH_WCHAR) +# ifndef LIBRAW_WIN32_UNICODEPATHS +# define LIBRAW_WIN32_UNICODEPATHS +# endif +# endif + +#endif + +#include "libraw_datastream.h" +#include "libraw_types.h" +#include "libraw_const.h" +#include "libraw_internal.h" +#include "libraw_alloc.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + DllDef const char *libraw_strerror(int errorcode); + DllDef const char *libraw_strprogress(enum LibRaw_progress); + /* LibRaw C API */ + DllDef libraw_data_t *libraw_init(unsigned int flags); + DllDef int libraw_open_file(libraw_data_t *, const char *); +#ifndef LIBRAW_NO_IOSTREAMS_DATASTREAM + DllDef int libraw_open_file_ex(libraw_data_t *, const char *, + INT64 max_buff_sz); +#endif +#if defined(_WIN32) || defined(WIN32) + DllDef int libraw_open_wfile(libraw_data_t *, const wchar_t *); +#ifndef LIBRAW_NO_IOSTREAMS_DATASTREAM + DllDef int libraw_open_wfile_ex(libraw_data_t *, const wchar_t *, + INT64 max_buff_sz); +#endif +#endif + + DllDef int libraw_open_buffer(libraw_data_t *, const void *buffer, size_t size); + DllDef int libraw_open_bayer(libraw_data_t *lr, unsigned char *data, + unsigned datalen, ushort _raw_width, + ushort _raw_height, ushort _left_margin, + ushort _top_margin, ushort _right_margin, + ushort _bottom_margin, unsigned char procflags, + unsigned char bayer_battern, + unsigned unused_bits, unsigned otherflags, + unsigned black_level); + DllDef int libraw_unpack(libraw_data_t *); + DllDef int libraw_unpack_thumb(libraw_data_t *); + DllDef int libraw_unpack_thumb_ex(libraw_data_t *,int); + DllDef void libraw_recycle_datastream(libraw_data_t *); + DllDef void libraw_recycle(libraw_data_t *); + DllDef void libraw_close(libraw_data_t *); + DllDef void libraw_subtract_black(libraw_data_t *); + DllDef int libraw_raw2image(libraw_data_t *); + DllDef void libraw_free_image(libraw_data_t *); + /* version helpers */ + DllDef const char *libraw_version(); + DllDef int libraw_versionNumber(); + /* Camera list */ + DllDef const char **libraw_cameraList(); + DllDef int libraw_cameraCount(); + + /* helpers */ + DllDef void libraw_set_exifparser_handler(libraw_data_t *, + exif_parser_callback cb, + void *datap); + DllDef void libraw_set_dataerror_handler(libraw_data_t *, data_callback func, + void *datap); + DllDef void libraw_set_progress_handler(libraw_data_t *, progress_callback cb, + void *datap); + DllDef const char *libraw_unpack_function_name(libraw_data_t *lr); + DllDef int libraw_get_decoder_info(libraw_data_t *lr, + libraw_decoder_info_t *d); + DllDef int libraw_COLOR(libraw_data_t *, int row, int col); + DllDef unsigned libraw_capabilities(); + + /* DCRAW compatibility */ + DllDef int libraw_adjust_sizes_info_only(libraw_data_t *); + DllDef int libraw_dcraw_ppm_tiff_writer(libraw_data_t *lr, + const char *filename); + DllDef int libraw_dcraw_thumb_writer(libraw_data_t *lr, const char *fname); + DllDef int libraw_dcraw_process(libraw_data_t *lr); + DllDef libraw_processed_image_t * + libraw_dcraw_make_mem_image(libraw_data_t *lr, int *errc); + DllDef libraw_processed_image_t * + libraw_dcraw_make_mem_thumb(libraw_data_t *lr, int *errc); + DllDef void libraw_dcraw_clear_mem(libraw_processed_image_t *); + /* getters/setters used by 3DLut Creator */ + DllDef void libraw_set_demosaic(libraw_data_t *lr, int value); + DllDef void libraw_set_output_color(libraw_data_t *lr, int value); + DllDef void libraw_set_adjust_maximum_thr(libraw_data_t *lr, float value); + DllDef void libraw_set_user_mul(libraw_data_t *lr, int index, float val); + DllDef void libraw_set_output_bps(libraw_data_t *lr, int value); + DllDef void libraw_set_gamma(libraw_data_t *lr, int index, float value); + DllDef void libraw_set_no_auto_bright(libraw_data_t *lr, int value); + DllDef void libraw_set_bright(libraw_data_t *lr, float value); + DllDef void libraw_set_highlight(libraw_data_t *lr, int value); + DllDef void libraw_set_fbdd_noiserd(libraw_data_t *lr, int value); + DllDef int libraw_get_raw_height(libraw_data_t *lr); + DllDef int libraw_get_raw_width(libraw_data_t *lr); + DllDef int libraw_get_iheight(libraw_data_t *lr); + DllDef int libraw_get_iwidth(libraw_data_t *lr); + DllDef float libraw_get_cam_mul(libraw_data_t *lr, int index); + DllDef float libraw_get_pre_mul(libraw_data_t *lr, int index); + DllDef float libraw_get_rgb_cam(libraw_data_t *lr, int index1, int index2); + DllDef int libraw_get_color_maximum(libraw_data_t *lr); + DllDef void libraw_set_output_tif(libraw_data_t *lr, int value); + DllDef libraw_iparams_t *libraw_get_iparams(libraw_data_t *lr); + DllDef libraw_lensinfo_t *libraw_get_lensinfo(libraw_data_t *lr); + DllDef libraw_imgother_t *libraw_get_imgother(libraw_data_t *lr); + +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus + +class DllDef LibRaw +{ +public: + libraw_data_t imgdata; + + LibRaw(unsigned int flags = LIBRAW_OPTIONS_NONE); + libraw_output_params_t *output_params_ptr() { return &imgdata.params; } +#ifndef LIBRAW_NO_IOSTREAMS_DATASTREAM + int open_file(const char *fname, + INT64 max_buffered_sz = LIBRAW_USE_STREAMS_DATASTREAM_MAXSIZE); +#if defined(_WIN32) || defined(WIN32) + int open_file(const wchar_t *fname, + INT64 max_buffered_sz = LIBRAW_USE_STREAMS_DATASTREAM_MAXSIZE); +#endif +#else + int open_file(const char *fname); +#if defined(_WIN32) || defined(WIN32) + int open_file(const wchar_t *fname); +#endif + +#endif + int open_buffer(const void *buffer, size_t size); + virtual int open_datastream(LibRaw_abstract_datastream *); + virtual int open_bayer(const unsigned char *data, unsigned datalen, + ushort _raw_width, ushort _raw_height, + ushort _left_margin, ushort _top_margin, + ushort _right_margin, ushort _bottom_margin, + unsigned char procflags, unsigned char bayer_pattern, + unsigned unused_bits, unsigned otherflags, + unsigned black_level); + int error_count() { return libraw_internal_data.unpacker_data.data_error; } + void recycle_datastream(); + int unpack(void); + int unpack_thumb(void); + int unpack_thumb_ex(int); + int thumbOK(INT64 maxsz = -1); + int adjust_sizes_info_only(void); + int subtract_black(); + int subtract_black_internal(); + int raw2image(); + int raw2image_ex(int do_subtract_black); + void raw2image_start(); + void free_image(); + int adjust_maximum(); + int adjust_to_raw_inset_crop(unsigned mask, float maxcrop = 0.55f); + void set_exifparser_handler(exif_parser_callback cb, void *data) + { + callbacks.exifparser_data = data; + callbacks.exif_cb = cb; + } + void set_dataerror_handler(data_callback func, void *data) + { + callbacks.datacb_data = data; + callbacks.data_cb = func; + } + void set_progress_handler(progress_callback pcb, void *data) + { + callbacks.progresscb_data = data; + callbacks.progress_cb = pcb; + } + + static const char* cameramakeridx2maker(unsigned maker); + int setMakeFromIndex(unsigned index); + + void convertFloatToInt(float dmin = 4096.f, float dmax = 32767.f, + float dtarget = 16383.f); + /* helpers */ + static unsigned capabilities(); + static const char *version(); + static int versionNumber(); + static const char **cameraList(); + static int cameraCount(); + static const char *strprogress(enum LibRaw_progress); + static const char *strerror(int p); + /* dcraw emulation */ + int dcraw_ppm_tiff_writer(const char *filename); + int dcraw_thumb_writer(const char *fname); + int dcraw_process(void); + /* information calls */ + int is_fuji_rotated() + { + return libraw_internal_data.internal_output_params.fuji_width; + } + int is_sraw(); + int sraw_midpoint(); + int is_nikon_sraw(); + int is_coolscan_nef(); + int is_jpeg_thumb(); + int is_floating_point(); + int have_fpdata(); + /* memory writers */ + virtual libraw_processed_image_t *dcraw_make_mem_image(int *errcode = NULL); + virtual libraw_processed_image_t *dcraw_make_mem_thumb(int *errcode = NULL); + static void dcraw_clear_mem(libraw_processed_image_t *); + + /* Additional calls for make_mem_image */ + void get_mem_image_format(int *width, int *height, int *colors, + int *bps) const; + int copy_mem_image(void *scan0, int stride, int bgr); + + /* free all internal data structures */ + void recycle(); + virtual ~LibRaw(void); + + int COLOR(int row, int col) + { + if (!imgdata.idata.filters) + return 6; /* Special value 0+1+2+3 */ + if (imgdata.idata.filters < 1000) + return fcol(row, col); + return libraw_internal_data.internal_output_params.fuji_width + ? FCF(row, col) + : FC(row, col); + } + + int FC(int row, int col) + { + return (imgdata.idata.filters >> (((row << 1 & 14) | (col & 1)) << 1) & 3); + } + int fcol(int row, int col); + + const char *unpack_function_name(); + virtual int get_decoder_info(libraw_decoder_info_t *d_info); + libraw_internal_data_t *get_internal_data_pointer() + { + return &libraw_internal_data; + } + + static float powf_lim(float a, float b, float limup) + { + return (b > limup || b < -limup) ? 0.f : powf(a, b); + } + static float libraw_powf64l(float a, float b) { return powf_lim(a, b, 64.f); } + + static unsigned sgetn(int n, uchar *s) + { + unsigned result = 0; + while (n-- > 0) + result = (result << 8) | (*s++); + return result; + } + + /* Phase one correction/subtractBL calls */ + /* Returns libraw error code */ + + int phase_one_subtract_black(ushort *src, ushort *dest); + int phase_one_correct(); + + int set_rawspeed_camerafile(char *filename); + virtual void setCancelFlag(); + virtual void clearCancelFlag(); + virtual int adobe_coeff(unsigned, const char *, int internal_only = 0); + + void set_dng_host(void *); + +protected: + static void *memmem(char *haystack, size_t haystacklen, char *needle, + size_t needlelen); + static char *strcasestr(char *h, const char *n); + static size_t strnlen(const char *s, size_t n); + +#ifdef LIBRAW_NO_IOSTREAMS_DATASTREAM + int libraw_openfile_tail(LibRaw_abstract_datastream *stream); +#endif + + int is_curve_linear(); + void checkCancel(); + void cam_xyz_coeff(float _rgb_cam[3][4], double cam_xyz[4][3]); + void phase_one_allocate_tempbuffer(); + void phase_one_free_tempbuffer(); + virtual int is_phaseone_compressed(); + virtual int is_canon_600(); + /* Hotspots */ + virtual void copy_fuji_uncropped(unsigned short cblack[4], + unsigned short *dmaxp); + virtual void copy_bayer(unsigned short cblack[4], unsigned short *dmaxp); + virtual void fuji_rotate(); + virtual void convert_to_rgb_loop(float out_cam[3][4]); + virtual void lin_interpolate_loop(int *code, int size); + virtual void scale_colors_loop(float scale_mul[4]); + + /* Fujifilm compressed decoder public interface (to make parallel decoder) */ + virtual void + fuji_decode_loop(struct fuji_compressed_params *common_info, int count, + INT64 *offsets, unsigned *sizes, uchar *q_bases); + void fuji_decode_strip(struct fuji_compressed_params *info_common, + int cur_block, INT64 raw_offset, unsigned size, uchar *q_bases); + /* CR3 decoder public interface to make parallel decoder */ + virtual void crxLoadDecodeLoop(void *, int); + int crxDecodePlane(void *, uint32_t planeNumber); + virtual void crxLoadFinalizeLoopE3(void *, int); + void crxConvertPlaneLineDf(void *, int); + /* Panasonic Compression 8 parallel decoder stubs*/ + virtual void pana8_decode_loop(void*); + int pana8_decode_strip(void*, int); // return: 0 if OK, non-zero on error + int FCF(int row, int col) + { + int rr, cc; + if (libraw_internal_data.unpacker_data.fuji_layout) + { + rr = libraw_internal_data.internal_output_params.fuji_width - 1 - col + + (row >> 1); + cc = col + ((row + 1) >> 1); + } + else + { + rr = libraw_internal_data.internal_output_params.fuji_width - 1 + row - + (col >> 1); + cc = row + ((col + 1) >> 1); + } + return FC(rr, cc); + } + + void adjust_bl(); + void *malloc(size_t t); + void *calloc(size_t n, size_t t); + void *realloc(void *p, size_t s); + void free(void *p); + void derror(); + + LibRaw_TLS *tls; + libraw_internal_data_t libraw_internal_data; + decode first_decode[2048], *second_decode, *free_decode; + tiff_ifd_t tiff_ifd[LIBRAW_IFD_MAXCOUNT]; + libraw_memmgr memmgr; + libraw_callbacks_t callbacks; + + //void (LibRaw::*write_thumb)(); + void (LibRaw::*write_fun)(); + void (LibRaw::*load_raw)(); + //void (LibRaw::*thumb_load_raw)(); + void (LibRaw::*pentax_component_load_raw)(); + + void write_thumb_ppm_tiff(FILE *); + + int own_filtering_supported() { return 0; } + void identify(); + void initdata(); + unsigned parse_custom_cameras(unsigned limit, libraw_custom_camera_t table[], + char **list); + void write_ppm_tiff(); + void convert_to_rgb(); + void remove_zeroes(); + void crop_masked_pixels(); +#ifndef NO_LCMS + void apply_profile(const char *, const char *); +#endif + void pre_interpolate(); + void border_interpolate(int border); + void lin_interpolate(); + void vng_interpolate(); + void ppg_interpolate(); + void cielab(ushort rgb[3], short lab[3]); + void xtrans_interpolate(int); + void ahd_interpolate(); + void dht_interpolate(); + void aahd_interpolate(); + + void dcb(int iterations, int dcb_enhance); + void fbdd(int noiserd); + void exp_bef(float expos, float preser); + + void bad_pixels(const char *); + void subtract(const char *); + void hat_transform(float *temp, float *base, int st, int size, int sc); + void wavelet_denoise(); + void scale_colors(); + void median_filter(); + void blend_highlights(); + void recover_highlights(); + void green_matching(); + + void stretch(); + + void jpeg_thumb_writer(FILE *tfp, char *thumb, int thumb_length); +#if 0 + void jpeg_thumb(); + void ppm_thumb(); + void ppm16_thumb(); + void layer_thumb(); + void rollei_thumb(); +#endif + void kodak_thumb_load_raw(); + + unsigned get4(); + + int flip_index(int row, int col); + void gamma_curve(double pwr, double ts, int mode, int imax); + void cubic_spline(const int *x_, const int *y_, const int len); + + /* RawSpeed data */ + void *_rawspeed_camerameta; + void *_rawspeed_decoder; + void *_rawspeed3_handle; + void fix_after_rawspeed(int bl); + int try_rawspeed(); /* returns LIBRAW_SUCCESS on success */ + /* Fast cancel flag */ + long _exitflag; + + /* DNG SDK data */ + void *dnghost; + void *dngnegative; + void *dngimage; + int valid_for_dngsdk(); + int try_dngsdk(); + /* X3F data */ + void *_x3f_data; /* keep it even if USE_X3FTOOLS is not defined to do not change sizeof(LibRaw)*/ + + int raw_was_read() + { + return imgdata.rawdata.raw_image || imgdata.rawdata.color4_image || + imgdata.rawdata.color3_image || imgdata.rawdata.float_image || + imgdata.rawdata.float3_image || imgdata.rawdata.float4_image; + } + +#ifdef LIBRAW_LIBRARY_BUILD +#include "internal/libraw_internal_funcs.h" +#endif +}; + +#ifdef LIBRAW_LIBRARY_BUILD +ushort libraw_sget2_static(short _order, uchar *s); +unsigned libraw_sget4_static(short _order, uchar *s); +int libraw_tagtype_dataunit_bytes(int tagtype); +double libraw_sgetreal_static(short _order, int type, uchar *s); +float libraw_int_to_float (int i); +#endif + + +#ifdef LIBRAW_LIBRARY_BUILD +#define RUN_CALLBACK(stage, iter, expect) \ + if (callbacks.progress_cb) \ + { \ + int rr = (*callbacks.progress_cb)(callbacks.progresscb_data, stage, iter, \ + expect); \ + if (rr != 0) \ + throw LIBRAW_EXCEPTION_CANCELLED_BY_CALLBACK; \ + } +#endif + +#endif /* __cplusplus */ + +#endif /* _LIBRAW_CLASS_H */ diff --git a/rtengine/libraw/libraw/libraw_alloc.h b/rtengine/libraw/libraw/libraw_alloc.h new file mode 100644 index 000000000..2a6461e42 --- /dev/null +++ b/rtengine/libraw/libraw/libraw_alloc.h @@ -0,0 +1,148 @@ +/* -*- C++ -*- + * File: libraw_alloc.h + * Copyright 2008-2024 LibRaw LLC (info@libraw.org) + * Created: Sat Mar 22, 2008 + * + * LibRaw C++ interface + * +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#ifndef __LIBRAW_ALLOC_H +#define __LIBRAW_ALLOC_H + +#include +#include +#include "libraw_const.h" + +#ifdef __cplusplus + +#define LIBRAW_MSIZE 512 + +class DllDef libraw_memmgr +{ +public: + libraw_memmgr(unsigned ee) : extra_bytes(ee) + { + size_t alloc_sz = LIBRAW_MSIZE * sizeof(void *); + mems = (void **)::malloc(alloc_sz); + memset(mems, 0, alloc_sz); + } + ~libraw_memmgr() + { + cleanup(); + ::free(mems); + } + void *malloc(size_t sz) + { +#ifdef LIBRAW_USE_CALLOC_INSTEAD_OF_MALLOC + void *ptr = ::calloc(sz + extra_bytes, 1); +#else + void *ptr = ::malloc(sz + extra_bytes); +#endif + mem_ptr(ptr); + return ptr; + } + void *calloc(size_t n, size_t sz) + { + void *ptr = ::calloc(n + (extra_bytes + sz - 1) / (sz ? sz : 1), sz); + mem_ptr(ptr); + return ptr; + } + void *realloc(void *ptr, size_t newsz) + { + void *ret = ::realloc(ptr, newsz + extra_bytes); + forget_ptr(ptr); + mem_ptr(ret); + return ret; + } + void free(void *ptr) + { + forget_ptr(ptr); + ::free(ptr); + } + void cleanup(void) + { + for (int i = 0; i < LIBRAW_MSIZE; i++) + if (mems[i]) + { + ::free(mems[i]); + mems[i] = NULL; + } + } + +private: + void **mems; + unsigned extra_bytes; + void mem_ptr(void *ptr) + { +#if defined(LIBRAW_USE_OPENMP) + bool ok = false; /* do not return from critical section */ +#endif + +#if defined(LIBRAW_USE_OPENMP) +#pragma omp critical + { +#endif + if (ptr) + { + for (int i = 0; i < LIBRAW_MSIZE - 1; i++) + if (!mems[i]) + { + mems[i] = ptr; +#if defined(LIBRAW_USE_OPENMP) + ok = true; + break; +#else + return; +#endif + } +#ifdef LIBRAW_MEMPOOL_CHECK +#if !defined(LIBRAW_USE_OPENMP) + /* remember ptr in last mems item to be free'ed at cleanup */ + if (!mems[LIBRAW_MSIZE - 1]) + mems[LIBRAW_MSIZE - 1] = ptr; + throw LIBRAW_EXCEPTION_MEMPOOL; +#endif +#endif + } +#if defined(LIBRAW_USE_OPENMP) + } + if(!ok) + { + if (!mems[LIBRAW_MSIZE - 1]) + mems[LIBRAW_MSIZE - 1] = ptr; + throw LIBRAW_EXCEPTION_MEMPOOL; + } +#endif + } + void forget_ptr(void *ptr) + { +#if defined(LIBRAW_USE_OPENMP) +#pragma omp critical + { +#endif + if (ptr) + for (int i = 0; i < LIBRAW_MSIZE; i++) + if (mems[i] == ptr) + { + mems[i] = NULL; + break; + } +#if defined(LIBRAW_USE_OPENMP) + } +#endif + } +}; + +#endif /* C++ */ + +#endif diff --git a/rtengine/libraw/libraw/libraw_const.h b/rtengine/libraw/libraw/libraw_const.h new file mode 100644 index 000000000..0d84029eb --- /dev/null +++ b/rtengine/libraw/libraw/libraw_const.h @@ -0,0 +1,819 @@ +/* -*- C++ -*- + * File: libraw_const.h + * Copyright 2008-2024 LibRaw LLC (info@libraw.org) + * Created: Sat Mar 8 , 2008 + * LibRaw error codes +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#ifndef _LIBRAW_ERRORS_H +#define _LIBRAW_ERRORS_H + +#define LIBRAW_DEFAULT_ADJUST_MAXIMUM_THRESHOLD 0.75f +#define LIBRAW_DEFAULT_AUTO_BRIGHTNESS_THRESHOLD 0.01f +/* limit allocation size, default is 2Gb */ +#ifndef LIBRAW_MAX_ALLOC_MB_DEFAULT +#define LIBRAW_MAX_ALLOC_MB_DEFAULT 2048L +#endif + +#ifndef LIBRAW_MAX_PROFILE_SIZE_MB +#define LIBRAW_MAX_PROFILE_SIZE_MB 256LL +#endif + +#ifndef LIBRAW_MAX_NONDNG_RAW_FILE_SIZE +#define LIBRAW_MAX_NONDNG_RAW_FILE_SIZE 2147483647ULL +#endif + +#ifndef LIBRAW_MAX_DNG_RAW_FILE_SIZE +#ifdef USE_DNGSDK +#define LIBRAW_MAX_DNG_RAW_FILE_SIZE 4294967295ULL +#else +#define LIBRAW_MAX_DNG_RAW_FILE_SIZE 2147483647ULL +#endif +#endif + + +/* limit thumbnail size, default is 512Mb*/ +#ifndef LIBRAW_MAX_THUMBNAIL_MB +#define LIBRAW_MAX_THUMBNAIL_MB 512L +#endif + +/* Check if enough file space exists before tag read */ +#ifndef LIBRAW_NO_IOSPACE_CHECK +#define LIBRAW_IOSPACE_CHECK +#endif +#ifndef LIBRAW_NO_CR3_MEMPOOL +#define LIBRAW_CR3_MEMPOOL +#endif + + + +/* LibRaw uses own memory pool management, with LIBRAW_MSIZE (512) +entries. It is enough for parsing/decoding non-damaged files, but +may overflow on specially crafted files (eg. with many string values +like XMP blocks. +LIBRAW_MEMPOOL_CHECK define will result in error on pool overflow */ +#ifndef LIBRAW_NO_MEMPOOL_CHECK +#define LIBRAW_MEMPOOL_CHECK +#endif + +#define LIBRAW_MAX_METADATA_BLOCKS 1024 +#define LIBRAW_CBLACK_SIZE 4104 +#define LIBRAW_IFD_MAXCOUNT 10 +#define LIBRAW_THUMBNAIL_MAXCOUNT 8 +#define LIBRAW_CRXTRACKS_MAXCOUNT 16 +#define LIBRAW_AFDATA_MAXCOUNT 4 + +#define LIBRAW_AHD_TILE 512 + +#ifndef LIBRAW_NO_IOSTREAMS_DATASTREAM + +enum LibRaw_open_flags +{ + LIBRAW_OPEN_BIGFILE=1, + LIBRAW_OPEN_FILE= 1<<1 +}; +#endif + +enum LibRaw_openbayer_patterns +{ + LIBRAW_OPENBAYER_RGGB = 0x94, + LIBRAW_OPENBAYER_BGGR = 0x16, + LIBRAW_OPENBAYER_GRBG = 0x61, + LIBRAW_OPENBAYER_GBRG = 0x49 +}; + +enum LibRaw_dngfields_marks +{ + LIBRAW_DNGFM_FORWARDMATRIX = 1, + LIBRAW_DNGFM_ILLUMINANT = 1 << 1, + LIBRAW_DNGFM_COLORMATRIX = 1 << 2, + LIBRAW_DNGFM_CALIBRATION = 1 << 3, + LIBRAW_DNGFM_ANALOGBALANCE = 1 << 4, + LIBRAW_DNGFM_BLACK = 1 << 5, + LIBRAW_DNGFM_WHITE = 1 << 6, + LIBRAW_DNGFM_OPCODE2 = 1 << 7, + LIBRAW_DNGFM_LINTABLE = 1 << 8, + LIBRAW_DNGFM_CROPORIGIN = 1 << 9, + LIBRAW_DNGFM_CROPSIZE = 1 << 10, + LIBRAW_DNGFM_PREVIEWCS = 1 << 11, + LIBRAW_DNGFM_ASSHOTNEUTRAL = 1 << 12, + LIBRAW_DNGFM_BASELINEEXPOSURE = 1 << 13, + LIBRAW_DNGFM_LINEARRESPONSELIMIT = 1 << 14, + LIBRAW_DNGFM_USERCROP = 1 << 15, + LIBRAW_DNGFM_OPCODE1 = 1 << 16, + LIBRAW_DNGFM_OPCODE3 = 1 << 17, +}; + +enum LibRaw_As_Shot_WB_Applied_codes +{ + LIBRAW_ASWB_APPLIED = 1, + LIBRAW_ASWB_CANON = 2, + LIBRAW_ASWB_NIKON = 4, + LIBRAW_ASWB_NIKON_SRAW = 8, + LIBRAW_ASWB_PENTAX = 16, + LIBRAW_ASWB_SONY = 32 +}; + +#define tagtypeIs(typex) (type == typex) +enum LibRaw_ExifTagTypes { + LIBRAW_EXIFTAG_TYPE_UNKNOWN = 0, + LIBRAW_EXIFTAG_TYPE_BYTE = 1, + LIBRAW_EXIFTAG_TYPE_ASCII = 2, + LIBRAW_EXIFTAG_TYPE_SHORT = 3, + LIBRAW_EXIFTAG_TYPE_LONG = 4, + LIBRAW_EXIFTAG_TYPE_RATIONAL = 5, + LIBRAW_EXIFTAG_TYPE_SBYTE = 6, + LIBRAW_EXIFTAG_TYPE_UNDEFINED = 7, + LIBRAW_EXIFTAG_TYPE_SSHORT = 8, + LIBRAW_EXIFTAG_TYPE_SLONG = 9, + LIBRAW_EXIFTAG_TYPE_SRATIONAL = 10, + LIBRAW_EXIFTAG_TYPE_FLOAT = 11, + LIBRAW_EXIFTAG_TYPE_DOUBLE = 12, + LIBRAW_EXIFTAG_TYPE_IFD = 13, + LIBRAW_EXIFTAG_TYPE_UNICODE = 14, + LIBRAW_EXIFTAG_TYPE_COMPLEX = 15, + LIBRAW_EXIFTAG_TYPE_LONG8 = 16, + LIBRAW_EXIFTAG_TYPE_SLONG8 = 17, + LIBRAW_EXIFTAG_TYPE_IFD8 = 18 +}; + +#define LIBRAW_EXIFTOOLTAGTYPE_int8u LIBRAW_EXIFTAG_TYPE_BYTE +#define LIBRAW_EXIFTOOLTAGTYPE_string LIBRAW_EXIFTAG_TYPE_ASCII +#define LIBRAW_EXIFTOOLTAGTYPE_int16u LIBRAW_EXIFTAG_TYPE_SHORT +#define LIBRAW_EXIFTOOLTAGTYPE_int32u LIBRAW_EXIFTAG_TYPE_LONG +#define LIBRAW_EXIFTOOLTAGTYPE_rational64u LIBRAW_EXIFTAG_TYPE_RATIONAL +#define LIBRAW_EXIFTOOLTAGTYPE_int8s LIBRAW_EXIFTAG_TYPE_SBYTE +#define LIBRAW_EXIFTOOLTAGTYPE_undef LIBRAW_EXIFTAG_TYPE_UNDEFINED +#define LIBRAW_EXIFTOOLTAGTYPE_binary LIBRAW_EXIFTAG_TYPE_UNDEFINED +#define LIBRAW_EXIFTOOLTAGTYPE_int16s LIBRAW_EXIFTAG_TYPE_SSHORT +#define LIBRAW_EXIFTOOLTAGTYPE_int32s LIBRAW_EXIFTAG_TYPE_SLONG +#define LIBRAW_EXIFTOOLTAGTYPE_rational64s LIBRAW_EXIFTAG_TYPE_SRATIONAL +#define LIBRAW_EXIFTOOLTAGTYPE_float LIBRAW_EXIFTAG_TYPE_FLOAT +#define LIBRAW_EXIFTOOLTAGTYPE_double LIBRAW_EXIFTAG_TYPE_DOUBLE +#define LIBRAW_EXIFTOOLTAGTYPE_ifd LIBRAW_EXIFTAG_TYPE_IFD +#define LIBRAW_EXIFTOOLTAGTYPE_unicode LIBRAW_EXIFTAG_TYPE_UNICODE +#define LIBRAW_EXIFTOOLTAGTYPE_complex LIBRAW_EXIFTAG_TYPE_COMPLEX +#define LIBRAW_EXIFTOOLTAGTYPE_int64u LIBRAW_EXIFTAG_TYPE_LONG8 +#define LIBRAW_EXIFTOOLTAGTYPE_int64s LIBRAW_EXIFTAG_TYPE_SLONG8 +#define LIBRAW_EXIFTOOLTAGTYPE_ifd64 LIBRAW_EXIFTAG_TYPE_IFD8 + +#define LIBRAW_LENS_NOT_SET 0xffffffffffffffffULL + +enum LibRaw_whitebalance_code +{ +// clang-format off + /* + EXIF light sources + 12 = FL-D; Daylight fluorescent (D 5700K – 7100K) (F1,F5) + 13 = FL-N; Day white fluorescent (N 4600K – 5400K) (F7,F8) + 14 = FL-W; Cool white fluorescent (W 3900K – 4500K) (F2,F6, office, store, warehouse) + 15 = FL-WW; White fluorescent (WW 3200K – 3700K) (F3, residential) + 16 = FL-L; Soft/Warm white fluorescent (L 2600K - 3250K) (F4, kitchen, bath) + */ +//clang-format on + LIBRAW_WBI_Unknown = 0, + LIBRAW_WBI_Daylight = 1, + LIBRAW_WBI_Fluorescent = 2, + LIBRAW_WBI_Tungsten = 3, + LIBRAW_WBI_Flash = 4, + LIBRAW_WBI_FineWeather = 9, + LIBRAW_WBI_Cloudy = 10, + LIBRAW_WBI_Shade = 11, + LIBRAW_WBI_FL_D = 12, + LIBRAW_WBI_FL_N = 13, + LIBRAW_WBI_FL_W = 14, + LIBRAW_WBI_FL_WW = 15, + LIBRAW_WBI_FL_L = 16, + LIBRAW_WBI_Ill_A = 17, + LIBRAW_WBI_Ill_B = 18, + LIBRAW_WBI_Ill_C = 19, + LIBRAW_WBI_D55 = 20, + LIBRAW_WBI_D65 = 21, + LIBRAW_WBI_D75 = 22, + LIBRAW_WBI_D50 = 23, + LIBRAW_WBI_StudioTungsten = 24, + LIBRAW_WBI_Sunset = 64, + LIBRAW_WBI_Underwater = 65, + LIBRAW_WBI_FluorescentHigh = 66, + LIBRAW_WBI_HT_Mercury = 67, + LIBRAW_WBI_AsShot = 81, + LIBRAW_WBI_Auto = 82, + LIBRAW_WBI_Custom = 83, + LIBRAW_WBI_Auto1 = 85, + LIBRAW_WBI_Auto2 = 86, + LIBRAW_WBI_Auto3 = 87, + LIBRAW_WBI_Auto4 = 88, + LIBRAW_WBI_Custom1 = 90, + LIBRAW_WBI_Custom2 = 91, + LIBRAW_WBI_Custom3 = 92, + LIBRAW_WBI_Custom4 = 93, + LIBRAW_WBI_Custom5 = 94, + LIBRAW_WBI_Custom6 = 95, + LIBRAW_WBI_PC_Set1 = 96, + LIBRAW_WBI_PC_Set2 = 97, + LIBRAW_WBI_PC_Set3 = 98, + LIBRAW_WBI_PC_Set4 = 99, + LIBRAW_WBI_PC_Set5 = 100, + LIBRAW_WBI_Measured = 110, + LIBRAW_WBI_BW = 120, + LIBRAW_WBI_Kelvin = 254, + LIBRAW_WBI_Other = 255, + LIBRAW_WBI_None = 0xffff +}; + +enum LibRaw_MultiExposure_related +{ + LIBRAW_ME_NONE = 0, + LIBRAW_ME_SIMPLE = 1, + LIBRAW_ME_OVERLAY = 2, + LIBRAW_ME_HDR = 3 +}; + +enum LibRaw_dng_processing +{ + LIBRAW_DNG_NONE = 0, + LIBRAW_DNG_FLOAT = 1, + LIBRAW_DNG_LINEAR = 2, + LIBRAW_DNG_DEFLATE = 4, + LIBRAW_DNG_XTRANS = 8, + LIBRAW_DNG_OTHER = 16, + LIBRAW_DNG_8BIT = 32, + /*LIBRAW_DNG_LARGERANGE=64,*/ /* more than 16 bit integer */ + LIBRAW_DNG_ALL = + LIBRAW_DNG_FLOAT | LIBRAW_DNG_LINEAR | LIBRAW_DNG_DEFLATE | LIBRAW_DNG_XTRANS | + LIBRAW_DNG_8BIT | LIBRAW_DNG_OTHER /* |LIBRAW_DNG_LARGERANGE */, + LIBRAW_DNG_DEFAULT = LIBRAW_DNG_FLOAT | LIBRAW_DNG_LINEAR | + LIBRAW_DNG_DEFLATE | LIBRAW_DNG_8BIT +}; + +enum LibRaw_output_flags +{ + LIBRAW_OUTPUT_FLAGS_NONE = 0, + LIBRAW_OUTPUT_FLAGS_PPMMETA = 1 +}; + +enum LibRaw_runtime_capabilities +{ + LIBRAW_CAPS_RAWSPEED = 1, + LIBRAW_CAPS_DNGSDK = 1<<1, + LIBRAW_CAPS_GPRSDK = 1<<2, + LIBRAW_CAPS_UNICODEPATHS = 1<<3, + LIBRAW_CAPS_X3FTOOLS = 1<<4, + LIBRAW_CAPS_RPI6BY9 = 1<<5, + LIBRAW_CAPS_ZLIB = 1<<6, + LIBRAW_CAPS_JPEG = 1<<7, + LIBRAW_CAPS_RAWSPEED3 = 1<<8, + LIBRAW_CAPS_RAWSPEED_BITS = 1<<9, +}; + +enum LibRaw_colorspace { + LIBRAW_COLORSPACE_NotFound = 0, + LIBRAW_COLORSPACE_sRGB, + LIBRAW_COLORSPACE_AdobeRGB, + LIBRAW_COLORSPACE_WideGamutRGB, + LIBRAW_COLORSPACE_ProPhotoRGB, + LIBRAW_COLORSPACE_ICC, + LIBRAW_COLORSPACE_Uncalibrated, // Tag 0x0001 InteropIndex containing "R03" + LIBRAW_COLORSPACE_Uncalibrated = Adobe RGB + LIBRAW_COLORSPACE_CameraLinearUniWB, + LIBRAW_COLORSPACE_CameraLinear, + LIBRAW_COLORSPACE_CameraGammaUniWB, + LIBRAW_COLORSPACE_CameraGamma, + LIBRAW_COLORSPACE_MonochromeLinear, + LIBRAW_COLORSPACE_MonochromeGamma, + LIBRAW_COLORSPACE_Rec2020, + LIBRAW_COLORSPACE_Unknown = 255 +}; + +enum LibRaw_cameramaker_index +{ + LIBRAW_CAMERAMAKER_Unknown = 0, + LIBRAW_CAMERAMAKER_Agfa, + LIBRAW_CAMERAMAKER_Alcatel, + LIBRAW_CAMERAMAKER_Apple, + LIBRAW_CAMERAMAKER_Aptina, + LIBRAW_CAMERAMAKER_AVT, + LIBRAW_CAMERAMAKER_Baumer, + LIBRAW_CAMERAMAKER_Broadcom, + LIBRAW_CAMERAMAKER_Canon, + LIBRAW_CAMERAMAKER_Casio, + LIBRAW_CAMERAMAKER_CINE, + LIBRAW_CAMERAMAKER_Clauss, + LIBRAW_CAMERAMAKER_Contax, + LIBRAW_CAMERAMAKER_Creative, + LIBRAW_CAMERAMAKER_DJI, + LIBRAW_CAMERAMAKER_DXO, + LIBRAW_CAMERAMAKER_Epson, + LIBRAW_CAMERAMAKER_Foculus, + LIBRAW_CAMERAMAKER_Fujifilm, + LIBRAW_CAMERAMAKER_Generic, + LIBRAW_CAMERAMAKER_Gione, + LIBRAW_CAMERAMAKER_GITUP, + LIBRAW_CAMERAMAKER_Google, + LIBRAW_CAMERAMAKER_GoPro, + LIBRAW_CAMERAMAKER_Hasselblad, + LIBRAW_CAMERAMAKER_HTC, + LIBRAW_CAMERAMAKER_I_Mobile, + LIBRAW_CAMERAMAKER_Imacon, + LIBRAW_CAMERAMAKER_JK_Imaging, + LIBRAW_CAMERAMAKER_Kodak, + LIBRAW_CAMERAMAKER_Konica, + LIBRAW_CAMERAMAKER_Leaf, + LIBRAW_CAMERAMAKER_Leica, + LIBRAW_CAMERAMAKER_Lenovo, + LIBRAW_CAMERAMAKER_LG, + LIBRAW_CAMERAMAKER_Logitech, + LIBRAW_CAMERAMAKER_Mamiya, + LIBRAW_CAMERAMAKER_Matrix, + LIBRAW_CAMERAMAKER_Meizu, + LIBRAW_CAMERAMAKER_Micron, + LIBRAW_CAMERAMAKER_Minolta, + LIBRAW_CAMERAMAKER_Motorola, + LIBRAW_CAMERAMAKER_NGM, + LIBRAW_CAMERAMAKER_Nikon, + LIBRAW_CAMERAMAKER_Nokia, + LIBRAW_CAMERAMAKER_Olympus, + LIBRAW_CAMERAMAKER_OmniVison, + LIBRAW_CAMERAMAKER_Panasonic, + LIBRAW_CAMERAMAKER_Parrot, + LIBRAW_CAMERAMAKER_Pentax, + LIBRAW_CAMERAMAKER_PhaseOne, + LIBRAW_CAMERAMAKER_PhotoControl, + LIBRAW_CAMERAMAKER_Photron, + LIBRAW_CAMERAMAKER_Pixelink, + LIBRAW_CAMERAMAKER_Polaroid, + LIBRAW_CAMERAMAKER_RED, + LIBRAW_CAMERAMAKER_Ricoh, + LIBRAW_CAMERAMAKER_Rollei, + LIBRAW_CAMERAMAKER_RoverShot, + LIBRAW_CAMERAMAKER_Samsung, + LIBRAW_CAMERAMAKER_Sigma, + LIBRAW_CAMERAMAKER_Sinar, + LIBRAW_CAMERAMAKER_SMaL, + LIBRAW_CAMERAMAKER_Sony, + LIBRAW_CAMERAMAKER_ST_Micro, + LIBRAW_CAMERAMAKER_THL, + LIBRAW_CAMERAMAKER_VLUU, + LIBRAW_CAMERAMAKER_Xiaomi, + LIBRAW_CAMERAMAKER_XIAOYI, + LIBRAW_CAMERAMAKER_YI, + LIBRAW_CAMERAMAKER_Yuneec, + LIBRAW_CAMERAMAKER_Zeiss, + LIBRAW_CAMERAMAKER_OnePlus, + LIBRAW_CAMERAMAKER_ISG, + LIBRAW_CAMERAMAKER_VIVO, + LIBRAW_CAMERAMAKER_HMD_Global, + LIBRAW_CAMERAMAKER_HUAWEI, + LIBRAW_CAMERAMAKER_RaspberryPi, + LIBRAW_CAMERAMAKER_OmDigital, + + // Insert additional indexes here + LIBRAW_CAMERAMAKER_TheLastOne +}; + +enum LibRaw_camera_mounts +{ + LIBRAW_MOUNT_Unknown = 0, + LIBRAW_MOUNT_Alpa, + LIBRAW_MOUNT_C, /* C-mount */ + LIBRAW_MOUNT_Canon_EF_M, + LIBRAW_MOUNT_Canon_EF_S, + LIBRAW_MOUNT_Canon_EF, + LIBRAW_MOUNT_Canon_RF, + LIBRAW_MOUNT_Contax_N, + LIBRAW_MOUNT_Contax645, + LIBRAW_MOUNT_FT, /* original 4/3 */ + LIBRAW_MOUNT_mFT, /* micro 4/3 */ + LIBRAW_MOUNT_Fuji_GF, /* Fujifilm GFX cameras, G mount */ + LIBRAW_MOUNT_Fuji_GX, /* Fujifilm GX680 */ + LIBRAW_MOUNT_Fuji_X, + LIBRAW_MOUNT_Hasselblad_H, /* Hasselblad Hn cameras, HC & HCD lenses */ + LIBRAW_MOUNT_Hasselblad_V, + LIBRAW_MOUNT_Hasselblad_XCD, /* Hasselblad Xn cameras, XCD lenses */ + LIBRAW_MOUNT_Leica_M, /* Leica rangefinder bayonet */ + LIBRAW_MOUNT_Leica_R, /* Leica SLRs, 'R' for reflex */ + LIBRAW_MOUNT_Leica_S, /* LIBRAW_FORMAT_LeicaS 'MF' */ + LIBRAW_MOUNT_Leica_SL, /* lens, mounts on 'L' throat, FF */ + LIBRAW_MOUNT_Leica_TL, /* lens, mounts on 'L' throat, APS-C */ + LIBRAW_MOUNT_LPS_L, /* Leica/Panasonic/Sigma camera mount, takes L, SL and TL lenses */ + LIBRAW_MOUNT_Mamiya67, /* Mamiya RB67, RZ67 */ + LIBRAW_MOUNT_Mamiya645, + LIBRAW_MOUNT_Minolta_A, + LIBRAW_MOUNT_Nikon_CX, /* used in 'Nikon 1' series */ + LIBRAW_MOUNT_Nikon_F, + LIBRAW_MOUNT_Nikon_Z, + LIBRAW_MOUNT_PhaseOne_iXM_MV, + LIBRAW_MOUNT_PhaseOne_iXM_RS, + LIBRAW_MOUNT_PhaseOne_iXM, + LIBRAW_MOUNT_Pentax_645, + LIBRAW_MOUNT_Pentax_K, + LIBRAW_MOUNT_Pentax_Q, + LIBRAW_MOUNT_RicohModule, + LIBRAW_MOUNT_Rollei_bayonet, /* Rollei Hy-6: Leaf AFi, Sinar Hy6- models */ + LIBRAW_MOUNT_Samsung_NX_M, + LIBRAW_MOUNT_Samsung_NX, + LIBRAW_MOUNT_Sigma_X3F, + LIBRAW_MOUNT_Sony_E, + LIBRAW_MOUNT_LF, + LIBRAW_MOUNT_DigitalBack, + LIBRAW_MOUNT_FixedLens, + LIBRAW_MOUNT_IL_UM, /* Interchangeable lens, mount unknown */ + LIBRAW_MOUNT_TheLastOne +}; + +enum LibRaw_camera_formats +{ + LIBRAW_FORMAT_Unknown = 0, + LIBRAW_FORMAT_APSC, + LIBRAW_FORMAT_FF, + LIBRAW_FORMAT_MF, + LIBRAW_FORMAT_APSH, + LIBRAW_FORMAT_1INCH, + LIBRAW_FORMAT_1div2p3INCH, /* 1/2.3" */ + LIBRAW_FORMAT_1div1p7INCH, /* 1/1.7" */ + LIBRAW_FORMAT_FT, /* sensor size in FT & mFT cameras */ + LIBRAW_FORMAT_CROP645, /* 44x33mm */ + LIBRAW_FORMAT_LeicaS, /* 'MF' Leicas */ + LIBRAW_FORMAT_645, + LIBRAW_FORMAT_66, + LIBRAW_FORMAT_69, + LIBRAW_FORMAT_LF, + LIBRAW_FORMAT_Leica_DMR, + LIBRAW_FORMAT_67, + LIBRAW_FORMAT_SigmaAPSC, /* DP1, DP2, SD15, SD14, SD10, SD9 */ + LIBRAW_FORMAT_SigmaMerrill, /* SD1, 'SD1 Merrill', 'DP1 Merrill', 'DP2 Merrill' */ + LIBRAW_FORMAT_SigmaAPSH, /* 'sd Quattro H' */ + LIBRAW_FORMAT_3648, /* DALSA FTF4052C (Mamiya ZD) */ + LIBRAW_FORMAT_68, /* Fujifilm GX680 */ + LIBRAW_FORMAT_TheLastOne +}; + +enum LibRawImageAspects +{ + LIBRAW_IMAGE_ASPECT_UNKNOWN = 0, + LIBRAW_IMAGE_ASPECT_OTHER = 1, + LIBRAW_IMAGE_ASPECT_MINIMAL_REAL_ASPECT_VALUE = 99, /* 1:10*/ + LIBRAW_IMAGE_ASPECT_MAXIMAL_REAL_ASPECT_VALUE = 10000, /* 10: 1*/ + // Value: width / height * 1000 + LIBRAW_IMAGE_ASPECT_3to2 = (1000 * 3)/2, + LIBRAW_IMAGE_ASPECT_1to1 = 1000, + LIBRAW_IMAGE_ASPECT_4to3 = (1000 * 4)/ 3, + LIBRAW_IMAGE_ASPECT_16to9 = (1000 * 16) / 9, + //LIBRAW_IMAGE_ASPECT_6to6, // what is the difference with 1:1 ? + LIBRAW_IMAGE_ASPECT_5to4 = (1000 * 5) / 4, + LIBRAW_IMAGE_ASPECT_7to6 = (1000 * 7) / 6, + LIBRAW_IMAGE_ASPECT_6to5 = (1000 * 6) / 5, + LIBRAW_IMAGE_ASPECT_7to5 = (1000 * 7) / 5 +}; + +enum LibRaw_lens_focal_types +{ + LIBRAW_FT_UNDEFINED = 0, + LIBRAW_FT_PRIME_LENS = 1, + LIBRAW_FT_ZOOM_LENS = 2, + LIBRAW_FT_ZOOM_LENS_CONSTANT_APERTURE = 3, + LIBRAW_FT_ZOOM_LENS_VARIABLE_APERTURE = 4 +}; + +enum LibRaw_Canon_RecordModes { + LIBRAW_Canon_RecordMode_UNDEFINED = 0, + LIBRAW_Canon_RecordMode_JPEG, + LIBRAW_Canon_RecordMode_CRW_THM, + LIBRAW_Canon_RecordMode_AVI_THM, + LIBRAW_Canon_RecordMode_TIF, + LIBRAW_Canon_RecordMode_TIF_JPEG, + LIBRAW_Canon_RecordMode_CR2, + LIBRAW_Canon_RecordMode_CR2_JPEG, + LIBRAW_Canon_RecordMode_UNKNOWN, + LIBRAW_Canon_RecordMode_MOV, + LIBRAW_Canon_RecordMode_MP4, + LIBRAW_Canon_RecordMode_CRM, + LIBRAW_Canon_RecordMode_CR3, + LIBRAW_Canon_RecordMode_CR3_JPEG, + LIBRAW_Canon_RecordMode_HEIF, + LIBRAW_Canon_RecordMode_CR3_HEIF, + LIBRAW_Canon_RecordMode_TheLastOne +}; + +enum LibRaw_minolta_storagemethods +{ + LIBRAW_MINOLTA_UNPACKED = 0x52, + LIBRAW_MINOLTA_PACKED = 0x59 +}; + +enum LibRaw_minolta_bayerpatterns +{ + LIBRAW_MINOLTA_RGGB = 0x01, + LIBRAW_MINOLTA_G2BRG1 = 0x04 +}; + +enum LibRaw_sony_cameratypes +{ + LIBRAW_SONY_DSC = 1, + LIBRAW_SONY_DSLR = 2, + LIBRAW_SONY_NEX = 3, + LIBRAW_SONY_SLT = 4, + LIBRAW_SONY_ILCE = 5, + LIBRAW_SONY_ILCA = 6, + LIBRAW_SONY_CameraType_UNKNOWN = 0xffff +}; + +enum LibRaw_Sony_0x2010_Type { + LIBRAW_SONY_Tag2010None = 0, + LIBRAW_SONY_Tag2010a, + LIBRAW_SONY_Tag2010b, + LIBRAW_SONY_Tag2010c, + LIBRAW_SONY_Tag2010d, + LIBRAW_SONY_Tag2010e, + LIBRAW_SONY_Tag2010f, + LIBRAW_SONY_Tag2010g, + LIBRAW_SONY_Tag2010h, + LIBRAW_SONY_Tag2010i +}; +enum LibRaw_Sony_0x9050_Type { + LIBRAW_SONY_Tag9050None = 0, + LIBRAW_SONY_Tag9050a, + LIBRAW_SONY_Tag9050b, + LIBRAW_SONY_Tag9050c, + LIBRAW_SONY_Tag9050d +}; + +enum LIBRAW_SONY_FOCUSMODEmodes +{ + LIBRAW_SONY_FOCUSMODE_MF = 0, + LIBRAW_SONY_FOCUSMODE_AF_S = 2, + LIBRAW_SONY_FOCUSMODE_AF_C = 3, + LIBRAW_SONY_FOCUSMODE_AF_A = 4, + LIBRAW_SONY_FOCUSMODE_DMF = 6, + LIBRAW_SONY_FOCUSMODE_AF_D = 7, + LIBRAW_SONY_FOCUSMODE_AF = 101, + LIBRAW_SONY_FOCUSMODE_PERMANENT_AF = 104, + LIBRAW_SONY_FOCUSMODE_SEMI_MF = 105, + LIBRAW_SONY_FOCUSMODE_UNKNOWN = -1 +}; + +enum LibRaw_KodakSensors +{ + LIBRAW_Kodak_UnknownSensor = 0, + LIBRAW_Kodak_M1 = 1, + LIBRAW_Kodak_M15 = 2, + LIBRAW_Kodak_M16 = 3, + LIBRAW_Kodak_M17 = 4, + LIBRAW_Kodak_M2 = 5, + LIBRAW_Kodak_M23 = 6, + LIBRAW_Kodak_M24 = 7, + LIBRAW_Kodak_M3 = 8, + LIBRAW_Kodak_M5 = 9, + LIBRAW_Kodak_M6 = 10, + LIBRAW_Kodak_C14 = 11, + LIBRAW_Kodak_X14 = 12, + LIBRAW_Kodak_M11 = 13 +}; + +enum LibRaw_HasselbladFormatCodes { + LIBRAW_HF_Unknown = 0, + LIBRAW_HF_3FR, + LIBRAW_HF_FFF, + LIBRAW_HF_Imacon, + LIBRAW_HF_HasselbladDNG, + LIBRAW_HF_AdobeDNG, + LIBRAW_HF_AdobeDNG_fromPhocusDNG +}; + +enum LibRaw_rawspecial_t +{ + LIBRAW_RAWSPECIAL_SONYARW2_NONE = 0, + LIBRAW_RAWSPECIAL_SONYARW2_BASEONLY = 1, + LIBRAW_RAWSPECIAL_SONYARW2_DELTAONLY = 1 << 1, + LIBRAW_RAWSPECIAL_SONYARW2_DELTAZEROBASE = 1 << 2, + LIBRAW_RAWSPECIAL_SONYARW2_DELTATOVALUE = 1 << 3, + LIBRAW_RAWSPECIAL_SONYARW2_ALLFLAGS = + LIBRAW_RAWSPECIAL_SONYARW2_BASEONLY + + LIBRAW_RAWSPECIAL_SONYARW2_DELTAONLY + + LIBRAW_RAWSPECIAL_SONYARW2_DELTAZEROBASE + + LIBRAW_RAWSPECIAL_SONYARW2_DELTATOVALUE, + LIBRAW_RAWSPECIAL_NODP2Q_INTERPOLATERG = 1<<4, + LIBRAW_RAWSPECIAL_NODP2Q_INTERPOLATEAF = 1 << 5, + LIBRAW_RAWSPECIAL_SRAW_NO_RGB = 1 << 6, + LIBRAW_RAWSPECIAL_SRAW_NO_INTERPOLATE = 1 << 7 +}; + +enum LibRaw_rawspeed_bits_t +{ + LIBRAW_RAWSPEEDV1_USE = 1, + LIBRAW_RAWSPEEDV1_FAILONUNKNOWN = 1 << 1, + LIBRAW_RAWSPEEDV1_IGNOREERRORS = 1 << 2, + /* bits 3-7 are reserved*/ + LIBRAW_RAWSPEEDV3_USE = 1 << 8, + LIBRAW_RAWSPEEDV3_FAILONUNKNOWN = 1 << 9, + LIBRAW_RAWSPEEDV3_IGNOREERRORS = 1 << 10, +}; + +enum LibRaw_processing_options +{ + LIBRAW_RAWOPTIONS_PENTAX_PS_ALLFRAMES = 1, + LIBRAW_RAWOPTIONS_CONVERTFLOAT_TO_INT = 1 << 1, + LIBRAW_RAWOPTIONS_ARQ_SKIP_CHANNEL_SWAP = 1 << 2, + LIBRAW_RAWOPTIONS_NO_ROTATE_FOR_KODAK_THUMBNAILS = 1 << 3, +// LIBRAW_RAWOPTIONS_USE_DNG_DEFAULT_CROP = 1 << 4, + LIBRAW_RAWOPTIONS_USE_PPM16_THUMBS = 1 << 5, + LIBRAW_RAWOPTIONS_DONT_CHECK_DNG_ILLUMINANT = 1 << 6, + LIBRAW_RAWOPTIONS_DNGSDK_ZEROCOPY = 1 << 7, + LIBRAW_RAWOPTIONS_ZEROFILTERS_FOR_MONOCHROMETIFFS = 1 << 8, + LIBRAW_RAWOPTIONS_DNG_ADD_ENHANCED = 1 << 9, + LIBRAW_RAWOPTIONS_DNG_ADD_PREVIEWS = 1 << 10, + LIBRAW_RAWOPTIONS_DNG_PREFER_LARGEST_IMAGE = 1 << 11, + LIBRAW_RAWOPTIONS_DNG_STAGE2 = 1 << 12, + LIBRAW_RAWOPTIONS_DNG_STAGE3 = 1 << 13, + LIBRAW_RAWOPTIONS_DNG_ALLOWSIZECHANGE = 1 << 14, + LIBRAW_RAWOPTIONS_DNG_DISABLEWBADJUST = 1 << 15, + LIBRAW_RAWOPTIONS_PROVIDE_NONSTANDARD_WB = 1 << 16, + LIBRAW_RAWOPTIONS_CAMERAWB_FALLBACK_TO_DAYLIGHT = 1 << 17, + LIBRAW_RAWOPTIONS_CHECK_THUMBNAILS_KNOWN_VENDORS = 1 << 18, + LIBRAW_RAWOPTIONS_CHECK_THUMBNAILS_ALL_VENDORS = 1 << 19, + LIBRAW_RAWOPTIONS_DNG_STAGE2_IFPRESENT = 1 << 20, + LIBRAW_RAWOPTIONS_DNG_STAGE3_IFPRESENT = 1 << 21, + LIBRAW_RAWOPTIONS_DNG_ADD_MASKS = 1 << 22, + LIBRAW_RAWOPTIONS_CANON_IGNORE_MAKERNOTES_ROTATION = 1 << 23, + LIBRAW_RAWOPTIONS_ALLOW_JPEGXL_PREVIEWS = 1 << 24 +}; + +enum LibRaw_decoder_flags +{ + LIBRAW_DECODER_HASCURVE = 1 << 4, + LIBRAW_DECODER_SONYARW2 = 1 << 5, + LIBRAW_DECODER_TRYRAWSPEED = 1 << 6, + LIBRAW_DECODER_OWNALLOC = 1 << 7, + LIBRAW_DECODER_FIXEDMAXC = 1 << 8, + LIBRAW_DECODER_ADOBECOPYPIXEL = 1 << 9, + LIBRAW_DECODER_LEGACY_WITH_MARGINS = 1 << 10, + LIBRAW_DECODER_3CHANNEL = 1 << 11, + LIBRAW_DECODER_SINAR4SHOT = 1 << 11, + LIBRAW_DECODER_FLATDATA = 1 << 12, + LIBRAW_DECODER_FLAT_BG2_SWAPPED = 1<<13, + LIBRAW_DECODER_UNSUPPORTED_FORMAT = 1 << 14, + LIBRAW_DECODER_NOTSET = 1 << 15, + LIBRAW_DECODER_TRYRAWSPEED3 = 1 << 16 +}; + +#define LIBRAW_XTRANS 9 + +enum LibRaw_constructor_flags +{ + LIBRAW_OPTIONS_NONE = 0, + LIBRAW_OPTIONS_NO_DATAERR_CALLBACK = 1 << 1, + /* Compatibility w/ years old typo */ + LIBRAW_OPIONS_NO_DATAERR_CALLBACK = LIBRAW_OPTIONS_NO_DATAERR_CALLBACK +}; + +enum LibRaw_warnings +{ + LIBRAW_WARN_NONE = 0, + LIBRAW_WARN_BAD_CAMERA_WB = 1 << 2, + LIBRAW_WARN_NO_METADATA = 1 << 3, + LIBRAW_WARN_NO_JPEGLIB = 1 << 4, + LIBRAW_WARN_NO_EMBEDDED_PROFILE = 1 << 5, + LIBRAW_WARN_NO_INPUT_PROFILE = 1 << 6, + LIBRAW_WARN_BAD_OUTPUT_PROFILE = 1 << 7, + LIBRAW_WARN_NO_BADPIXELMAP = 1 << 8, + LIBRAW_WARN_BAD_DARKFRAME_FILE = 1 << 9, + LIBRAW_WARN_BAD_DARKFRAME_DIM = 1 << 10, + LIBRAW_WARN_RAWSPEED_PROBLEM = 1 << 12, + LIBRAW_WARN_RAWSPEED_UNSUPPORTED = 1 << 13, + LIBRAW_WARN_RAWSPEED_PROCESSED = 1 << 14, + LIBRAW_WARN_FALLBACK_TO_AHD = 1 << 15, + LIBRAW_WARN_PARSEFUJI_PROCESSED = 1 << 16, + LIBRAW_WARN_DNGSDK_PROCESSED = 1 << 17, + LIBRAW_WARN_DNG_IMAGES_REORDERED = 1 << 18, + LIBRAW_WARN_DNG_STAGE2_APPLIED = 1 << 19, + LIBRAW_WARN_DNG_STAGE3_APPLIED = 1 << 20, + LIBRAW_WARN_RAWSPEED3_PROBLEM = 1 << 21, + LIBRAW_WARN_RAWSPEED3_UNSUPPORTED = 1 << 22, + LIBRAW_WARN_RAWSPEED3_PROCESSED = 1 << 23, + LIBRAW_WARN_RAWSPEED3_NOTLISTED = 1 << 24, + LIBRAW_WARN_VENDOR_CROP_SUGGESTED = 1 << 25 +}; + +enum LibRaw_exceptions +{ + LIBRAW_EXCEPTION_NONE = 0, + LIBRAW_EXCEPTION_ALLOC = 1, + LIBRAW_EXCEPTION_DECODE_RAW = 2, + LIBRAW_EXCEPTION_DECODE_JPEG = 3, + LIBRAW_EXCEPTION_IO_EOF = 4, + LIBRAW_EXCEPTION_IO_CORRUPT = 5, + LIBRAW_EXCEPTION_CANCELLED_BY_CALLBACK = 6, + LIBRAW_EXCEPTION_BAD_CROP = 7, + LIBRAW_EXCEPTION_IO_BADFILE = 8, + LIBRAW_EXCEPTION_DECODE_JPEG2000 = 9, + LIBRAW_EXCEPTION_TOOBIG = 10, + LIBRAW_EXCEPTION_MEMPOOL = 11, + LIBRAW_EXCEPTION_UNSUPPORTED_FORMAT = 12 +}; + +enum LibRaw_progress +{ + LIBRAW_PROGRESS_START = 0, + LIBRAW_PROGRESS_OPEN = 1, + LIBRAW_PROGRESS_IDENTIFY = 1 << 1, + LIBRAW_PROGRESS_SIZE_ADJUST = 1 << 2, + LIBRAW_PROGRESS_LOAD_RAW = 1 << 3, + LIBRAW_PROGRESS_RAW2_IMAGE = 1 << 4, + LIBRAW_PROGRESS_REMOVE_ZEROES = 1 << 5, + LIBRAW_PROGRESS_BAD_PIXELS = 1 << 6, + LIBRAW_PROGRESS_DARK_FRAME = 1 << 7, + LIBRAW_PROGRESS_FOVEON_INTERPOLATE = 1 << 8, + LIBRAW_PROGRESS_SCALE_COLORS = 1 << 9, + LIBRAW_PROGRESS_PRE_INTERPOLATE = 1 << 10, + LIBRAW_PROGRESS_INTERPOLATE = 1 << 11, + LIBRAW_PROGRESS_MIX_GREEN = 1 << 12, + LIBRAW_PROGRESS_MEDIAN_FILTER = 1 << 13, + LIBRAW_PROGRESS_HIGHLIGHTS = 1 << 14, + LIBRAW_PROGRESS_FUJI_ROTATE = 1 << 15, + LIBRAW_PROGRESS_FLIP = 1 << 16, + LIBRAW_PROGRESS_APPLY_PROFILE = 1 << 17, + LIBRAW_PROGRESS_CONVERT_RGB = 1 << 18, + LIBRAW_PROGRESS_STRETCH = 1 << 19, + /* reserved */ + LIBRAW_PROGRESS_STAGE20 = 1 << 20, + LIBRAW_PROGRESS_STAGE21 = 1 << 21, + LIBRAW_PROGRESS_STAGE22 = 1 << 22, + LIBRAW_PROGRESS_STAGE23 = 1 << 23, + LIBRAW_PROGRESS_STAGE24 = 1 << 24, + LIBRAW_PROGRESS_STAGE25 = 1 << 25, + LIBRAW_PROGRESS_STAGE26 = 1 << 26, + LIBRAW_PROGRESS_STAGE27 = 1 << 27, + + LIBRAW_PROGRESS_THUMB_LOAD = 1 << 28, + LIBRAW_PROGRESS_TRESERVED1 = 1 << 29, + LIBRAW_PROGRESS_TRESERVED2 = 1 << 30 +}; +#define LIBRAW_PROGRESS_THUMB_MASK 0x0fffffff + +enum LibRaw_errors +{ + LIBRAW_SUCCESS = 0, + LIBRAW_UNSPECIFIED_ERROR = -1, + LIBRAW_FILE_UNSUPPORTED = -2, + LIBRAW_REQUEST_FOR_NONEXISTENT_IMAGE = -3, + LIBRAW_OUT_OF_ORDER_CALL = -4, + LIBRAW_NO_THUMBNAIL = -5, + LIBRAW_UNSUPPORTED_THUMBNAIL = -6, + LIBRAW_INPUT_CLOSED = -7, + LIBRAW_NOT_IMPLEMENTED = -8, + LIBRAW_REQUEST_FOR_NONEXISTENT_THUMBNAIL = -9, + LIBRAW_UNSUFFICIENT_MEMORY = -100007, + LIBRAW_DATA_ERROR = -100008, + LIBRAW_IO_ERROR = -100009, + LIBRAW_CANCELLED_BY_CALLBACK = -100010, + LIBRAW_BAD_CROP = -100011, + LIBRAW_TOO_BIG = -100012, + LIBRAW_MEMPOOL_OVERFLOW = -100013 +}; + +#define LIBRAW_FATAL_ERROR(ec) ((ec) < -100000) + +enum LibRaw_internal_thumbnail_formats +{ + LIBRAW_INTERNAL_THUMBNAIL_UNKNOWN = 0, + LIBRAW_INTERNAL_THUMBNAIL_KODAK_THUMB = 1, + LIBRAW_INTERNAL_THUMBNAIL_KODAK_YCBCR = 2, + LIBRAW_INTERNAL_THUMBNAIL_KODAK_RGB = 3, + LIBRAW_INTERNAL_THUMBNAIL_JPEG = 4, + LIBRAW_INTERNAL_THUMBNAIL_LAYER, + LIBRAW_INTERNAL_THUMBNAIL_ROLLEI, + LIBRAW_INTERNAL_THUMBNAIL_PPM, + LIBRAW_INTERNAL_THUMBNAIL_PPM16, + LIBRAW_INTERNAL_THUMBNAIL_X3F, + LIBRAW_INTERNAL_THUMBNAIL_DNG_YCBCR, + LIBRAW_INTERNAL_THUMBNAIL_JPEGXL +}; + + +enum LibRaw_thumbnail_formats +{ + LIBRAW_THUMBNAIL_UNKNOWN = 0, + LIBRAW_THUMBNAIL_JPEG = 1, + LIBRAW_THUMBNAIL_BITMAP = 2, + LIBRAW_THUMBNAIL_BITMAP16 = 3, + LIBRAW_THUMBNAIL_LAYER = 4, + LIBRAW_THUMBNAIL_ROLLEI = 5, + LIBRAW_THUMBNAIL_H265 = 6, + LIBRAW_THUMBNAIL_JPEGXL = 7 +}; + +enum LibRaw_image_formats +{ + LIBRAW_IMAGE_JPEG = 1, + LIBRAW_IMAGE_BITMAP = 2 +}; + +#endif diff --git a/rtengine/libraw/libraw/libraw_datastream.h b/rtengine/libraw/libraw/libraw_datastream.h new file mode 100644 index 000000000..a978ae602 --- /dev/null +++ b/rtengine/libraw/libraw/libraw_datastream.h @@ -0,0 +1,393 @@ +/* -*- C -*- + * File: libraw_datastream.h + * Copyright 2008-2024 LibRaw LLC (info@libraw.org) + * Created: Sun Jan 18 13:07:35 2009 + * + * LibRaw Data stream interface + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#ifndef __LIBRAW_DATASTREAM_H +#define __LIBRAW_DATASTREAM_H + +#include +#include +#include +#include + +#ifndef __cplusplus + +#else /* __cplusplus */ +#if defined _WIN32 +#ifndef LIBRAW_NO_WINSOCK2 +#include +#endif +#endif +/* No unique_ptr on Apple ?? */ +#if __cplusplus >= 201103L || (defined(_CPPLIB_VER) && _CPPLIB_VER >= 520) || \ + (defined(_MSC_VER) && _MSVC_LANG >= 201103L) +/* OK - use unique_ptr unless LIBRAW_USE_AUTOPTR defined externally*/ +#else +/* Force to use auto_ptr */ +#ifndef LIBRAW_USE_AUTOPTR +#define LIBRAW_USE_AUTOPTR +#endif +#endif + +#include "libraw_const.h" +#include "libraw_types.h" +#include +#include +#include + +#if defined(_WIN32) && (_MSC_VER) >= 1500 +#define WIN32SECURECALLS +#endif + +#ifdef USE_DNGSDK + +#if defined LIBRAW_WIN32_CALLS +#define qWinOS 1 +#define qMacOS 0 +#elif defined(__APPLE__) +#define qWinOS 0 +#define qMacOS 1 +#else +/* define OS types for DNG here */ +#endif +#define qDNGXMPDocOps 0 +#define qDNGUseLibJPEG 1 +#define qDNGXMPFiles 0 +#define qDNGExperimental 1 +#define qDNGThreadSafe 1 +#include "dng_stream.h" +#endif /* DNGSDK */ + +#define IOERROR() \ + do \ + { \ + throw LIBRAW_EXCEPTION_IO_EOF; \ + } while (0) + +class LibRaw_buffer_datastream; +class LibRaw_bit_buffer; + +class DllDef LibRaw_abstract_datastream +{ +public: + LibRaw_abstract_datastream() { }; + virtual ~LibRaw_abstract_datastream(void) { } + virtual int valid() = 0; + virtual int read(void *, size_t, size_t) = 0; + virtual int seek(INT64, int) = 0; + virtual INT64 tell() = 0; + virtual INT64 size() = 0; + virtual int get_char() = 0; + virtual char *gets(char *, int) = 0; + virtual int scanf_one(const char *, void *) = 0; + virtual int eof() = 0; + virtual int jpeg_src(void *); + virtual void buffering_off() {} + /* reimplement in subclass to use parallel access in xtrans_load_raw() if + * OpenMP is not used */ + virtual int lock() { return 1; } /* success */ + virtual void unlock() {} + virtual const char *fname() { return NULL; }; +#ifdef LIBRAW_WIN32_UNICODEPATHS + virtual const wchar_t *wfname() { return NULL; }; +#endif +}; + +#ifndef LIBRAW_NO_IOSTREAMS_DATASTREAM + +#ifdef LIBRAW_WIN32_DLLDEFS +#ifdef LIBRAW_USE_AUTOPTR +template class DllDef std::auto_ptr; +#else +template class DllDef std::unique_ptr; +#endif +#endif + +class DllDef LibRaw_file_datastream : public LibRaw_abstract_datastream +{ +protected: +#ifdef LIBRAW_USE_AUTOPTR + std::auto_ptr f; /* will close() automatically through dtor */ +#else + std::unique_ptr f; +#endif + std::string filename; + INT64 _fsize; +#ifdef LIBRAW_WIN32_UNICODEPATHS + std::wstring wfilename; +#endif + +public: + virtual ~LibRaw_file_datastream(); + LibRaw_file_datastream(const char *fname); +#ifdef LIBRAW_WIN32_UNICODEPATHS + LibRaw_file_datastream(const wchar_t *fname); +#endif + virtual int valid(); + virtual int read(void *ptr, size_t size, size_t nmemb); + virtual int eof(); + virtual int seek(INT64 o, int whence); + virtual INT64 tell(); + virtual INT64 size() { return _fsize; } + virtual int get_char() {return f->sbumpc();} + virtual char *gets(char *str, int sz); + virtual int scanf_one(const char *fmt, void *val); + virtual const char *fname(); +#ifdef LIBRAW_WIN32_UNICODEPATHS + virtual const wchar_t *wfname(); +#endif +}; +#endif + +#if defined (LIBRAW_NO_IOSTREAMS_DATASTREAM) && defined (LIBRAW_WIN32_CALLS) + +struct DllDef LibRaw_bufio_params +{ + static int bufsize; + static void set_bufsize(int bs); +}; + +class buffer_t : public std::vector +{ +public: + INT64 _bstart, _bend; + buffer_t() : std::vector(LibRaw_bufio_params::bufsize), _bstart(0), _bend(0) {} + int charOReof(INT64 _fpos) + { + if (_bstart < 0LL || _bend < 0LL || _bend < _bstart || _fpos < 0LL) + return -1; + if ((_bend - _bstart) > (INT64)size()) + return -1; + if (_fpos >= _bstart && _fpos < _bend) + return data()[_fpos - _bstart]; + return -1; + } + bool contains(INT64 _fpos, INT64& contains) + { + if (_bstart < 0LL || _bend < 0LL || _bend < _bstart || _fpos < 0LL) + { + contains = 0; + return false; + } + if ((_bend - _bstart) > (INT64)size()) + { + contains = 0; + return false; + } + if (_fpos >= _bstart && _fpos < _bend) + { + contains = _bend - _fpos; + return true; + } + contains = 0; + return false; + } +}; + + +class DllDef LibRaw_bigfile_buffered_datastream : public LibRaw_abstract_datastream +{ +public: + LibRaw_bigfile_buffered_datastream(const char *fname); +#ifdef LIBRAW_WIN32_UNICODEPATHS + LibRaw_bigfile_buffered_datastream(const wchar_t *fname); +#endif + virtual ~LibRaw_bigfile_buffered_datastream(); + virtual int valid(); + virtual void buffering_off() { buffered = 0; } + virtual int read(void *ptr, size_t size, size_t nmemb); + virtual int eof(); + virtual int seek(INT64 o, int whence); + virtual INT64 tell(); + virtual INT64 size() { return _fsize; } + virtual char *gets(char *str, int sz); + virtual int scanf_one(const char *fmt, void *val); + virtual const char *fname(); +#ifdef LIBRAW_WIN32_UNICODEPATHS + virtual const wchar_t *wfname(); +#endif + virtual int get_char() + { + int r = iobuffers[0].charOReof(_fpos); + if (r >= 0) + { + _fpos++; + return r; + } + unsigned char c; + r = read(&c, 1, 1); + return r > 0 ? c : r; + } + +protected: + INT64 readAt(void *ptr, size_t size, INT64 off); + bool fillBufferAt(int buf, INT64 off); + int selectStringBuffer(INT64 len, INT64& contains); + HANDLE fhandle; + INT64 _fsize; + INT64 _fpos; /* current file position; current buffer start position */ +#ifdef LIBRAW_WIN32_UNICODEPATHS + std::wstring wfilename; +#endif + std::string filename; + buffer_t iobuffers[2]; + int buffered; +}; + +#endif + +class DllDef LibRaw_buffer_datastream : public LibRaw_abstract_datastream +{ +public: + LibRaw_buffer_datastream(const void *buffer, size_t bsize); + virtual ~LibRaw_buffer_datastream(); + virtual int valid(); + virtual int jpeg_src(void *jpegdata); + virtual int read(void *ptr, size_t sz, size_t nmemb); + virtual int eof(); + virtual int seek(INT64 o, int whence); + virtual INT64 tell(); + virtual INT64 size() { return streamsize; } + virtual char *gets(char *s, int sz); + virtual int scanf_one(const char *fmt, void *val); + virtual int get_char() + { + if (streampos >= streamsize) return -1; + return buf[streampos++]; + } + +private: + unsigned char *buf; + size_t streampos, streamsize; +}; + +class DllDef LibRaw_bigfile_datastream : public LibRaw_abstract_datastream +{ +public: + LibRaw_bigfile_datastream(const char *fname); +#ifdef LIBRAW_WIN32_UNICODEPATHS + LibRaw_bigfile_datastream(const wchar_t *fname); +#endif + virtual ~LibRaw_bigfile_datastream(); + virtual int valid(); + virtual int read(void *ptr, size_t size, size_t nmemb); + virtual int eof(); + virtual int seek(INT64 o, int whence); + virtual INT64 tell(); + virtual INT64 size() { return _fsize; } + virtual char *gets(char *str, int sz); + virtual int scanf_one(const char *fmt, void *val); + virtual const char *fname(); +#ifdef LIBRAW_WIN32_UNICODEPATHS + virtual const wchar_t *wfname(); +#endif + virtual int get_char() + { +#ifndef LIBRAW_WIN32_CALLS + return getc_unlocked(f); +#else + return fgetc(f); +#endif + } + +protected: + FILE *f; + std::string filename; + INT64 _fsize; +#ifdef LIBRAW_WIN32_UNICODEPATHS + std::wstring wfilename; +#endif +}; + +#ifdef LIBRAW_WIN32_CALLS +class DllDef LibRaw_windows_datastream : public LibRaw_buffer_datastream +{ +public: + /* ctor: high level constructor opens a file by name */ + LibRaw_windows_datastream(const TCHAR *sFile); + /* ctor: construct with a file handle - caller is responsible for closing the + * file handle */ + LibRaw_windows_datastream(HANDLE hFile); + /* dtor: unmap and close the mapping handle */ + virtual ~LibRaw_windows_datastream(); + virtual INT64 size() { return cbView_; } + +protected: + void Open(HANDLE hFile); + inline void reconstruct_base() + { + /* this subterfuge is to overcome the private-ness of + * LibRaw_buffer_datastream */ + (LibRaw_buffer_datastream &)*this = + LibRaw_buffer_datastream(pView_, (size_t)cbView_); + } + + HANDLE hMap_; /* handle of the file mapping */ + void *pView_; /* pointer to the mapped memory */ + __int64 cbView_; /* size of the mapping in bytes */ +}; + +#endif + +#ifdef USE_DNGSDK + +class libraw_dng_stream : public dng_stream +{ +public: + libraw_dng_stream(LibRaw_abstract_datastream *p) + : dng_stream((dng_abort_sniffer *)NULL, kBigBufferSize, 0), + parent_stream(p) + { + if (parent_stream) + { + parent_stream->buffering_off(); + off = parent_stream->tell(); + parent_stream->seek(0UL, SEEK_SET); /* seek to start */ + } + } + ~libraw_dng_stream() + { + if (parent_stream) + parent_stream->seek(off, SEEK_SET); + } + virtual uint64 DoGetLength() + { + if (parent_stream) + return parent_stream->size(); + return 0; + } + virtual void DoRead(void *data, uint32 count, uint64 offset) + { + if (parent_stream) + { + parent_stream->seek(offset, SEEK_SET); + parent_stream->read(data, 1, count); + } + } + +private: + libraw_dng_stream(const libraw_dng_stream &stream); + libraw_dng_stream &operator=(const libraw_dng_stream &stream); + LibRaw_abstract_datastream *parent_stream; + INT64 off; +}; + +#endif + +#endif /* cplusplus */ + +#endif diff --git a/rtengine/libraw/libraw/libraw_internal.h b/rtengine/libraw/libraw/libraw_internal.h new file mode 100644 index 000000000..5af31d3ab --- /dev/null +++ b/rtengine/libraw/libraw/libraw_internal.h @@ -0,0 +1,358 @@ +/* -*- C++ -*- + * File: libraw_internal.h + * Copyright 2008-2024 LibRaw LLC (info@libraw.org) + * Created: Sat Mar 8 , 2008 + * + * LibRaw internal data structures (not visible outside) + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#ifndef _LIBRAW_INTERNAL_TYPES_H +#define _LIBRAW_INTERNAL_TYPES_H + +#include + +#ifdef __cplusplus + +#include "libraw_datastream.h" +#include "libraw_types.h" + +class LibRaw_TLS +{ +public: + struct + { + unsigned bitbuf; + int vbits, reset; + } getbits; + struct + { + UINT64 bitbuf; + int vbits; + + } ph1_bits; + struct + { + unsigned pad[128], p; + } sony_decrypt; + struct + { + uchar buf[0x4002]; + int vpos, padding; + } pana_data; + uchar jpeg_buffer[4096]; + struct + { + float cbrt[0x10000], xyz_cam[3][4]; + } ahd_data; + void init() + { + getbits.bitbuf = 0; + getbits.vbits = getbits.reset = 0; + ph1_bits.bitbuf = 0; + ph1_bits.vbits = 0; + pana_data.vpos = 0; + ahd_data.cbrt[0] = -2.0f; + } +}; + +class LibRaw_constants +{ +public: + static const float d65_white[3]; + static const double xyz_rgb[3][3]; + static const double xyzd50_srgb[3][3]; + static const double rgb_rgb[3][3]; + static const double adobe_rgb[3][3]; + static const double wide_rgb[3][3]; + static const double prophoto_rgb[3][3]; + static const double aces_rgb[3][3]; + static const double dcip3d65_rgb[3][3]; + static const double rec2020_rgb[3][3]; +}; +#endif /* __cplusplus */ + +typedef struct +{ +#ifndef __cplusplus + struct +#endif + LibRaw_abstract_datastream *input; + FILE *output; + int input_internal; + char *meta_data; + INT64 profile_offset; + INT64 toffset; + unsigned pana_black[4]; + +} internal_data_t; + +#define LIBRAW_HISTOGRAM_SIZE 0x2000 +typedef struct +{ + int (*histogram)[LIBRAW_HISTOGRAM_SIZE]; + unsigned *oprof; +} output_data_t; + +typedef struct +{ + unsigned olympus_exif_cfa; + unsigned long long unique_id; + unsigned long long OlyID; + unsigned tiff_nifds; + int tiff_flip; + int metadata_blocks; +} identify_data_t; + +typedef struct +{ + uint32_t first; + uint32_t count; + uint32_t id; +} crx_sample_to_chunk_t; + +// contents of tag CMP1 for relevant track in CR3 file +typedef struct +{ + int32_t version; + int32_t f_width; + int32_t f_height; + int32_t tileWidth; + int32_t tileHeight; + int32_t nBits; + int32_t nPlanes; + int32_t cfaLayout; + int32_t encType; + int32_t imageLevels; + int32_t hasTileCols; + int32_t hasTileRows; + int32_t mdatHdrSize; + int32_t medianBits; + // Not from header, but from datastream + uint32_t MediaSize; + INT64 MediaOffset; + uint32_t MediaType; /* 1 -> /C/RAW, 2-> JPEG, 3-> CTMD metadata*/ + crx_sample_to_chunk_t * stsc_data; /* samples to chunk */ + uint32_t stsc_count; + uint32_t sample_count; + uint32_t sample_size; /* zero if not fixed sample size */ + int32_t *sample_sizes; + uint32_t chunk_count; + INT64 *chunk_offsets; +} crx_data_header_t; + +typedef struct +{ + uint32_t tag39[6]; + uint16_t tag3A[6]; + uint16_t tag3B; + uint16_t initial[4]; + uint16_t tag40a[17], tag40b[17], tag41[17]; + uint16_t stripe_count; // 0x42 + uint16_t tag43; + INT64 stripe_offsets[5]; //0x44 + uint16_t stripe_left[5]; // 0x45 + uint32_t stripe_compressed_size[5]; //0x46 + uint16_t stripe_width[5]; //0x47 + uint16_t stripe_height[5]; +} pana8_tags_t; + +typedef struct +{ + short order; + ushort sraw_mul[4], cr2_slice[3]; + unsigned kodak_cbpp; + INT64 strip_offset, data_offset; + INT64 meta_offset; + INT64 exif_offset, exif_subdir_offset, ifd0_offset; + unsigned data_size; + unsigned meta_length; + unsigned cr3_exif_length, cr3_ifd0_length; + unsigned thumb_misc; + enum LibRaw_internal_thumbnail_formats thumb_format; + unsigned fuji_layout; + unsigned tiff_samples; + unsigned tiff_bps; + unsigned tiff_compress; + unsigned tiff_sampleformat; + unsigned zero_after_ff; + unsigned tile_width, tile_length, load_flags; + unsigned data_error; + int hasselblad_parser_flag; + long long posRAFData; + unsigned lenRAFData; + int fuji_total_lines, fuji_total_blocks, fuji_block_width, fuji_bits, + fuji_raw_type, fuji_lossless; + int pana_encoding, pana_bpp; + pana8_tags_t pana8; + crx_data_header_t crx_header[LIBRAW_CRXTRACKS_MAXCOUNT]; + int crx_track_selected; + int crx_track_count; + short CR3_CTMDtag; + short CR3_Version; + int CM_found; + unsigned is_NikonTransfer; + unsigned is_Olympus; + int OlympusDNG_SubDirOffsetValid; + unsigned is_Sony; + unsigned is_pana_raw; + unsigned is_PentaxRicohMakernotes; /* =1 for Ricoh software by Pentax, Camera DNG */ + + unsigned dng_frames[LIBRAW_IFD_MAXCOUNT*2]; /* bits: 0-7: shot_select, 8-15: IFD#, 16-31: low 16 bit of newsubfile type */ + unsigned short raw_stride; +} unpacker_data_t; + +typedef struct +{ + internal_data_t internal_data; + libraw_internal_output_params_t internal_output_params; + output_data_t output_data; + identify_data_t identify_data; + unpacker_data_t unpacker_data; +} libraw_internal_data_t; + +struct decode +{ + struct decode *branch[2]; + int leaf; +}; + +struct tiff_ifd_t +{ + int t_width, t_height, bps, comp, phint, offset, t_flip, samples, bytes, extrasamples; + int t_tile_width, t_tile_length, sample_format, predictor; + int rows_per_strip; + int *strip_offsets, strip_offsets_count; + int *strip_byte_counts, strip_byte_counts_count; + unsigned t_filters; + int t_vwidth, t_vheight, t_lm,t_tm; + int t_fuji_width; + float t_shutter; + /* Per-IFD DNG fields */ + INT64 opcode2_offset; + INT64 lineartable_offset; + int lineartable_len; + libraw_dng_color_t dng_color[2]; + libraw_dng_levels_t dng_levels; + int newsubfiletype; +}; + +struct jhead +{ + int algo, bits, high, wide, clrs, sraw, psv, restart, vpred[6]; + ushort quant[64], idct[64], *huff[20], *free[20], *row; +}; + +struct libraw_tiff_tag +{ + ushort tag, type; + int count; + union { + char c[4]; + short s[2]; + int i; + } val; +}; + +struct tiff_hdr +{ + ushort t_order, magic; + int ifd; + ushort pad, ntag; + struct libraw_tiff_tag tag[23]; + int nextifd; + ushort pad2, nexif; + struct libraw_tiff_tag exif[4]; + ushort pad3, ngps; + struct libraw_tiff_tag gpst[10]; + short bps[4]; + int rat[10]; + unsigned gps[26]; + char t_desc[512], t_make[64], t_model[64], soft[32], date[20], t_artist[64]; +}; + +#ifdef DEBUG_STAGE_CHECKS +#define CHECK_ORDER_HIGH(expected_stage) \ + do \ + { \ + if ((imgdata.progress_flags & LIBRAW_PROGRESS_THUMB_MASK) >= \ + expected_stage) \ + { \ + fprintf(stderr, "CHECK_HIGH: check %d >= %d\n", \ + imgdata.progress_flags &LIBRAW_PROGRESS_THUMB_MASK, \ + expected_stage); \ + return LIBRAW_OUT_OF_ORDER_CALL; \ + } \ + } while (0) + +#define CHECK_ORDER_LOW(expected_stage) \ + do \ + { \ + printf("Checking LOW %d/%d : %d\n", imgdata.progress_flags, \ + expected_stage, imgdata.progress_flags < expected_stage); \ + if ((imgdata.progress_flags & LIBRAW_PROGRESS_THUMB_MASK) < \ + expected_stage) \ + { \ + printf("failed!\n"); \ + return LIBRAW_OUT_OF_ORDER_CALL; \ + } \ + } while (0) +#define CHECK_ORDER_BIT(expected_stage) \ + do \ + { \ + if (imgdata.progress_flags & expected_stage) \ + return LIBRAW_OUT_OF_ORDER_CALL; \ + } while (0) + +#define SET_PROC_FLAG(stage) \ + do \ + { \ + imgdata.progress_flags |= stage; \ + fprintf(stderr, "SET_FLAG: %d\n", stage); \ + } while (0) + +#else + +#define CHECK_ORDER_HIGH(expected_stage) \ + do \ + { \ + if ((imgdata.progress_flags & LIBRAW_PROGRESS_THUMB_MASK) >= \ + expected_stage) \ + { \ + return LIBRAW_OUT_OF_ORDER_CALL; \ + } \ + } while (0) + +#define CHECK_ORDER_LOW(expected_stage) \ + do \ + { \ + if ((imgdata.progress_flags & LIBRAW_PROGRESS_THUMB_MASK) < \ + expected_stage) \ + return LIBRAW_OUT_OF_ORDER_CALL; \ + } while (0) + +#define CHECK_ORDER_BIT(expected_stage) \ + do \ + { \ + if (imgdata.progress_flags & expected_stage) \ + return LIBRAW_OUT_OF_ORDER_CALL; \ + } while (0) + +#define SET_PROC_FLAG(stage) \ + do \ + { \ + imgdata.progress_flags |= stage; \ + } while (0) + +#endif + +#endif diff --git a/rtengine/libraw/libraw/libraw_types.h b/rtengine/libraw/libraw/libraw_types.h new file mode 100644 index 000000000..481ee720a --- /dev/null +++ b/rtengine/libraw/libraw/libraw_types.h @@ -0,0 +1,1190 @@ +/* -*- C++ -*- + * File: libraw_types.h + * Copyright 2008-2024 LibRaw LLC (info@libraw.org) + * Created: Sat Mar 8 , 2008 + * + * LibRaw C data structures + * + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#ifndef _LIBRAW_TYPES_H +#define _LIBRAW_TYPES_H + +#include +#ifndef _WIN32 +#include +#endif + +#include + +#if defined(_WIN32) +#if defined(_MSC_VER) && (_MSC_VER <= 1500) +typedef signed __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef signed __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef signed __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; +#else /* WIN32, but not old MSVC */ +#include +#endif /* _WIN32 */ +#include +#else +#include +#endif + +#if defined(_OPENMP) + +#if defined(LIBRAW_FORCE_OPENMP) +#define LIBRAW_USE_OPENMP +#else +#if defined(_WIN32) +#if defined(_MSC_VER) && \ + (_MSC_VER >= 1600 || (_MSC_VER == 1500 && _MSC_FULL_VER >= 150030729)) +/* VS2010+ : OpenMP works OK, VS2008: have tested by cgilles */ +#define LIBRAW_USE_OPENMP +#elif defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 910) +/* Have not tested on 9.x and 10.x, but Intel documentation claims OpenMP 2.5 + * support in 9.1 */ +#define LIBRAW_USE_OPENMP +#else +#undef LIBRAW_USE_OPENMP +#endif +/* Not Win32 */ +#elif (defined(__APPLE__) || defined(__MACOSX__)) && defined(_REENTRANT) +/* Latest XCode works with OpenMP, need to recheck here */ +#undef LIBRAW_USE_OPENMP +#else +#define LIBRAW_USE_OPENMP +#endif +#endif +#endif + +#ifdef LIBRAW_USE_OPENMP +#include +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if defined(USE_LCMS) +#include +#elif defined(USE_LCMS2) +#include +#else +#define NO_LCMS +#endif + +#include "libraw_const.h" +#include "libraw_version.h" + +#ifdef _WIN32 + typedef __int64 INT64; + typedef unsigned __int64 UINT64; +#else +typedef long long INT64; +typedef unsigned long long UINT64; +#endif + + typedef unsigned char uchar; + typedef unsigned short ushort; + +#ifdef LIBRAW_WIN32_DLLDEFS +#ifdef LIBRAW_NODLL +#define DllDef +#else +#ifdef LIBRAW_BUILDLIB +#define DllDef __declspec(dllexport) +#else +#define DllDef __declspec(dllimport) +#endif +#endif +#else +#define DllDef +#endif + + typedef struct + { + const char *decoder_name; + unsigned decoder_flags; + } libraw_decoder_info_t; + + typedef struct + { + unsigned mix_green; + unsigned raw_color; + unsigned zero_is_bad; + ushort shrink; + ushort fuji_width; + } libraw_internal_output_params_t; + + typedef void (*memory_callback)(void *data, const char *file, + const char *where); + typedef void (*exif_parser_callback)(void *context, int tag, int type, + int len, unsigned int ord, void *ifp, + INT64 base); + + typedef void (*data_callback)(void *data, const char *file, const int offset); + + DllDef void default_data_callback(void *data, const char *file, + const int offset); + + typedef int (*progress_callback)(void *data, enum LibRaw_progress stage, + int iteration, int expected); + typedef int (*pre_identify_callback)(void *ctx); + typedef void (*post_identify_callback)(void *ctx); + typedef void (*process_step_callback)(void *ctx); + + typedef struct + { + data_callback data_cb; + void *datacb_data; + + progress_callback progress_cb; + void *progresscb_data; + + exif_parser_callback exif_cb; + void *exifparser_data; + pre_identify_callback pre_identify_cb; + post_identify_callback post_identify_cb; + process_step_callback pre_subtractblack_cb, pre_scalecolors_cb, + pre_preinterpolate_cb, pre_interpolate_cb, interpolate_bayer_cb, + interpolate_xtrans_cb, post_interpolate_cb, pre_converttorgb_cb, + post_converttorgb_cb; + } libraw_callbacks_t; + + typedef struct + { + enum LibRaw_image_formats type; + ushort height, width, colors, bits; + unsigned int data_size; + unsigned char data[1]; + } libraw_processed_image_t; + + typedef struct + { + char guard[4]; + char make[64]; + char model[64]; + char software[64]; + char normalized_make[64]; + char normalized_model[64]; + unsigned maker_index; + unsigned raw_count; + unsigned dng_version; + unsigned is_foveon; + int colors; + unsigned filters; + char xtrans[6][6]; + char xtrans_abs[6][6]; + char cdesc[5]; + unsigned xmplen; + char *xmpdata; + + } libraw_iparams_t; + + typedef struct + { + ushort cleft, ctop, cwidth, cheight; + } libraw_raw_inset_crop_t; + + typedef struct + { + ushort raw_height, raw_width, height, width, top_margin, left_margin; + ushort iheight, iwidth; + unsigned raw_pitch; + double pixel_aspect; + int flip; + int mask[8][4]; + ushort raw_aspect; + libraw_raw_inset_crop_t raw_inset_crops[2]; + } libraw_image_sizes_t; + + typedef struct + { + short t,l,b,r; // top, left, bottom, right pixel coordinates, (0,0) is top left pixel; + } libraw_area_t; + + struct ph1_t + { + int format, key_off, tag_21a; + int t_black, split_col, black_col, split_row, black_row; + float tag_210; + }; + + typedef struct + { + unsigned parsedfields; + ushort illuminant; + float calibration[4][4]; + float colormatrix[4][3]; + float forwardmatrix[3][4]; + } libraw_dng_color_t; + + typedef struct + { + unsigned parsedfields; + unsigned dng_cblack[LIBRAW_CBLACK_SIZE]; + unsigned dng_black; + float dng_fcblack[LIBRAW_CBLACK_SIZE]; + float dng_fblack; + unsigned dng_whitelevel[4]; + ushort default_crop[4]; /* Origin and size */ + float user_crop[4]; // top-left-bottom-right relative to default_crop + unsigned preview_colorspace; + float analogbalance[4]; + float asshotneutral[4]; + float baseline_exposure; + float LinearResponseLimit; + } libraw_dng_levels_t; + + typedef struct + { + float romm_cam[9]; + } libraw_P1_color_t; + + typedef struct + { + int ColorDataVer; + int ColorDataSubVer; + int SpecularWhiteLevel; + int NormalWhiteLevel; + int ChannelBlackLevel[4]; + int AverageBlackLevel; + /* multishot */ + unsigned int multishot[4]; + /* metering */ + short MeteringMode; + short SpotMeteringMode; + uchar FlashMeteringMode; + short FlashExposureLock; + short ExposureMode; + short AESetting; + /* stabilization */ + short ImageStabilization; + /* flash */ + short FlashMode; + short FlashActivity; + short FlashBits; + short ManualFlashOutput; + short FlashOutput; + short FlashGuideNumber; + /* drive */ + short ContinuousDrive; + /* sensor */ + short SensorWidth; + short SensorHeight; + + int AFMicroAdjMode; + float AFMicroAdjValue; + short MakernotesFlip; + short RecordMode; + short SRAWQuality; + unsigned wbi; + short RF_lensID; + int AutoLightingOptimizer; + int HighlightTonePriority; + + /* -1 = n/a 1 = Economy + 2 = Normal 3 = Fine + 4 = RAW 5 = Superfine + 7 = CRAW 130 = Normal Movie, CRM LightRaw + 131 = CRM StandardRaw */ + short Quality; + /* data compression curve + 0 = OFF 1 = CLogV1 2 = CLogV2? 3 = CLogV3 */ + int CanonLog; + + libraw_area_t DefaultCropAbsolute; + libraw_area_t RecommendedImageArea; // contains the image in proper aspect ratio? + libraw_area_t LeftOpticalBlack; // use this, when present, to estimate black levels? + libraw_area_t UpperOpticalBlack; + libraw_area_t ActiveArea; + + short ISOgain[2]; // AutoISO & BaseISO per ExifTool + } libraw_canon_makernotes_t; + + typedef struct + { + int BaseISO; + double Gain; + char Sensor[8]; + char SensorUnit[64]; // SU + char HostBody[64]; // HB + int SensorCode; + int SensorSubCode; + int CoatingCode; + int uncropped; + +/* CaptureSequenceInitiator is based on the content of the 'model' tag + - values like 'Pinhole', 'Flash Sync', '500 Mech.' etc in .3FR 'model' tag + come from MAIN MENU > SETTINGS > Camera; + - otherwise 'model' contains: + 1. if CF/CFV/CFH, SU enclosure, can be with SU type if '-' is present + 2. else if '-' is present, HB + SU type; + 3. HB; +*/ + char CaptureSequenceInitiator[32]; + +/* SensorUnitConnector, makernotes 0x0015 tag: + - in .3FR - SU side + - in .FFF - HB side +*/ + char SensorUnitConnector[64]; + + int format; // 3FR, FFF, Imacon (H3D-39 and maybe others), Hasselblad/Phocus DNG, Adobe DNG + int nIFD_CM[2]; // number of IFD containing CM + int RecommendedCrop[2]; + +/* mnColorMatrix is in makernotes tag 0x002a; + not present in .3FR files and Imacon/H3D-39 .FFF files; + when present in .FFF and Phocus .DNG files, it is a copy of CM1 from .3FR; + available samples contain all '1's in the first 3 elements +*/ + double mnColorMatrix[4][3]; + + off_t levels; // RT + off_t unknown1; // RT + off_t flatfield; // RT + + } libraw_hasselblad_makernotes_t; + + typedef struct + { + float ExpoMidPointShift; + ushort DynamicRange; + ushort FilmMode; + ushort DynamicRangeSetting; + ushort DevelopmentDynamicRange; + ushort AutoDynamicRange; + ushort DRangePriority; + ushort DRangePriorityAuto; + ushort DRangePriorityFixed; + char FujiModel[32 + 1]; + char FujiModel2[32 + 1]; + + /* + tag 0x9200, converted to BrightnessCompensation + F700, S3Pro, S5Pro, S20Pro, S200EXR + E550, E900, F810, S5600, S6500fd, S9000, S9500, S100FS + */ + float BrightnessCompensation; /* in EV, if =4, raw data * 2^4 */ + + ushort FocusMode; + ushort AFMode; + ushort FocusPixel[2]; + ushort PrioritySettings; + unsigned FocusSettings; + unsigned AF_C_Settings; + ushort FocusWarning; + ushort ImageStabilization[3]; + ushort FlashMode; + ushort WB_Preset; + + /* ShutterType: + 0 - mechanical + 1 = electronic + 2 = electronic, long shutter speed + 3 = electronic, front curtain + */ + ushort ShutterType; + ushort ExrMode; + ushort Macro; + unsigned Rating; + + /* CropMode: + 1 - FF on GFX, + 2 - sports finder (mechanical shutter), + 4 - 1.25x crop (electronic shutter, continuous high) + */ + ushort CropMode; + char SerialSignature[0x0c + 1]; + char SensorID[4 + 1]; + char RAFVersion[4 + 1]; + int RAFDataGeneration; // 0 (none), 1..4, 4096 + ushort RAFDataVersion; + int isTSNERDTS; + + /* DriveMode: + 0 - single frame + 1 - continuous low + 2 - continuous high + */ + short DriveMode; + + /* + tag 0x4000 BlackLevel: + S9100, S9000, S7000, S6000fd, S5200, S5100, S5000, + S5Pro, S3Pro, S2Pro, S20Pro, + S200EXR, S100FS, + F810, F700, + E900, E550, + DBP, and aliases for all of the above + */ + ushort BlackLevel[9]; + unsigned RAFData_ImageSizeTable[32]; + int AutoBracketing; + int SequenceNumber; + int SeriesLength; + float PixelShiftOffset[2]; + int ImageCount; + } libraw_fuji_info_t; + + typedef struct + { + ushort cleft, ctop, cwidth, cheight; + } libraw_sensor_highspeed_crop_t; + + typedef struct + { + double ExposureBracketValue; + ushort ActiveDLighting; + ushort ShootingMode; + /* stabilization */ + uchar ImageStabilization[7]; + uchar VibrationReduction; + uchar VRMode; + /* flash */ + char FlashSetting[13]; + char FlashType[20]; + uchar FlashExposureCompensation[4]; + uchar ExternalFlashExposureComp[4]; + uchar FlashExposureBracketValue[4]; + uchar FlashMode; + signed char FlashExposureCompensation2; + signed char FlashExposureCompensation3; + signed char FlashExposureCompensation4; + uchar FlashSource; + uchar FlashFirmware[2]; + uchar ExternalFlashFlags; + uchar FlashControlCommanderMode; + uchar FlashOutputAndCompensation; + uchar FlashFocalLength; + uchar FlashGNDistance; + uchar FlashGroupControlMode[4]; + uchar FlashGroupOutputAndCompensation[4]; + uchar FlashColorFilter; + +/* NEF compression, comments follow those for ExifTool tag 0x0093: + 1: Lossy (type 1) + 2: Uncompressed + 3: Lossless + 4: Lossy (type 2) + 5: Striped packed 12-bit + 6: Uncompressed (14-bit reduced to 12-bit) + 7: Unpacked 12-bit + 8: Small raw + 9: Packed 12-bit + 10: Packed 14-bit + 13: High Efficiency (HE) + 14: High Efficiency* (HE*) +*/ + ushort NEFCompression; + + int ExposureMode; + int ExposureProgram; + int nMEshots; + int MEgainOn; + double ME_WB[4]; + uchar AFFineTune; + uchar AFFineTuneIndex; + int8_t AFFineTuneAdj; + unsigned LensDataVersion; + unsigned FlashInfoVersion; + unsigned ColorBalanceVersion; + uchar key; + ushort NEFBitDepth[4]; + ushort HighSpeedCropFormat; /* 1 -> 1.3x; 2 -> DX; 3 -> 5:4; 4 -> 3:2; 6 -> + 16:9; 11 -> FX uncropped; 12 -> DX uncropped; + 17 -> 1:1 */ + libraw_sensor_highspeed_crop_t SensorHighSpeedCrop; + ushort SensorWidth; + ushort SensorHeight; + ushort Active_D_Lighting; + unsigned PictureControlVersion; + char PictureControlName [20]; + char PictureControlBase [20]; + unsigned ShotInfoVersion; + short MakernotesFlip; + double RollAngle; // positive is clockwise, CW + double PitchAngle; // positive is upwords + double YawAngle; // positive is to the right + } libraw_nikon_makernotes_t; + + typedef struct + { + char CameraType2[6]; + ushort ValidBits; + int SensorCalibration[2]; + ushort DriveMode[5]; + ushort ColorSpace; + ushort FocusMode[2]; + ushort AutoFocus; + ushort AFPoint; + unsigned AFAreas[64]; + double AFPointSelected[5]; + ushort AFResult; + uchar AFFineTune; + short AFFineTuneAdj[3]; + unsigned SpecialMode[3]; + ushort ZoomStepCount; + ushort FocusStepCount; + ushort FocusStepInfinity; + ushort FocusStepNear; + double FocusDistance; + ushort AspectFrame[4]; // left, top, width, height + unsigned StackedImage[2]; + uchar isLiveND; + unsigned LiveNDfactor; + ushort Panorama_mode; + ushort Panorama_frameNum; + } libraw_olympus_makernotes_t; + + typedef struct + { + /* Compression: + 34826 (Panasonic RAW 2): LEICA DIGILUX 2; + 34828 (Panasonic RAW 3): LEICA D-LUX 3; LEICA V-LUX 1; Panasonic DMC-LX1; + Panasonic DMC-LX2; Panasonic DMC-FZ30; Panasonic DMC-FZ50; 34830 (not in + exiftool): LEICA DIGILUX 3; Panasonic DMC-L1; 34316 (Panasonic RAW 1): + others (LEICA, Panasonic, YUNEEC); + */ + ushort Compression; + ushort BlackLevelDim; + float BlackLevel[8]; + unsigned Multishot; /* 0 is Off, 65536 is Pixel Shift */ + float gamma; + int HighISOMultiplier[3]; /* 0->R, 1->G, 2->B */ + short FocusStepNear; + short FocusStepCount; + unsigned ZoomPosition; + unsigned LensManufacturer; + } libraw_panasonic_makernotes_t; + + typedef struct + { + uchar DriveMode[4]; + ushort FocusMode[2]; + ushort AFPointSelected[2]; + ushort AFPointSelected_Area; + int AFPointsInFocus_version; + unsigned AFPointsInFocus; + ushort FocusPosition; + short AFAdjustment; + uchar AFPointMode; + uchar MultiExposure; /* last bit is not "1" if ME is not used */ + ushort Quality; /* 4 is raw, 7 is raw w/ pixel shift, 8 is raw w/ dynamic + pixel shift */ + } libraw_pentax_makernotes_t; + + typedef struct + { + ushort AFStatus; + unsigned AFAreaXPosition[2]; + unsigned AFAreaYPosition[2]; + ushort AFAreaMode; + unsigned SensorWidth; + unsigned SensorHeight; + unsigned CroppedImageWidth; + unsigned CroppedImageHeight; + ushort WideAdapter; + ushort CropMode; + ushort NDFilter; + ushort AutoBracketing; + ushort MacroMode; + ushort FlashMode; + double FlashExposureComp; + double ManualFlashOutput; + } libraw_ricoh_makernotes_t; + + typedef struct + { + unsigned ImageSizeFull[4]; + unsigned ImageSizeCrop[4]; + int ColorSpace[2]; + unsigned key[11]; + double DigitalGain; /* PostAEGain, digital stretch */ + int DeviceType; + char LensFirmware[32]; + } libraw_samsung_makernotes_t; + + typedef struct + { + ushort BlackLevelTop; + ushort BlackLevelBottom; + short offset_left, offset_top; /* KDC files, negative values or zeros */ + ushort clipBlack, clipWhite; /* valid for P712, P850, P880 */ + float romm_camDaylight[3][3]; + float romm_camTungsten[3][3]; + float romm_camFluorescent[3][3]; + float romm_camFlash[3][3]; + float romm_camCustom[3][3]; + float romm_camAuto[3][3]; + ushort val018percent, val100percent, val170percent; + short MakerNoteKodak8a; + float ISOCalibrationGain; + float AnalogISO; + } libraw_kodak_makernotes_t; + + typedef struct { + char Software[64]; // tag 0x0203 + char SystemType[64]; // tag 0x0204 + char FirmwareString[256]; // tag 0x0301 + char SystemModel[64]; + } libraw_p1_makernotes_t; + + typedef struct + { +/* afdata: + 0x0010 CameraInfo + 0x2020 AFPointsUsed + 0x2022 FocalPlaneAFPointsUsed + 0x202a Tag202a + 0x940e AFInfo +*/ + ushort CameraType; // init in 0xffff + uchar Sony0x9400_version; /* 0 if not found/deciphered, + 0xa, 0xb, 0xc following exiftool convention */ + uchar Sony0x9400_ReleaseMode2; + unsigned Sony0x9400_SequenceImageNumber; + uchar Sony0x9400_SequenceLength1; + unsigned Sony0x9400_SequenceFileNumber; + uchar Sony0x9400_SequenceLength2; + uint8_t AFAreaModeSetting; // init in 0xff; + + uint16_t AFAreaMode; // init in 0xffff; + + ushort FlexibleSpotPosition[2]; // init in (0xffff, 0xffff) + uint8_t AFPointSelected; // init in 0xff + uint8_t AFPointSelected_0x201e; // init in 0xff + short nAFPointsUsed; + uint8_t AFPointsUsed[10]; + uint8_t AFTracking; // init in 0xff + uint8_t AFType; + ushort FocusLocation[4]; + ushort FocusPosition; // init in 0xffff + int8_t AFMicroAdjValue; // init in 0x7f + int8_t AFMicroAdjOn; // init in -1 + uchar AFMicroAdjRegisteredLenses; // init in 0xff + ushort VariableLowPassFilter; + unsigned LongExposureNoiseReduction; // init in 0xffffffff + ushort HighISONoiseReduction; // init in 0xffff + ushort HDR[2]; + ushort group2010; + ushort group9050; + + ushort len_group9050; // currently, for debugging only + + ushort real_iso_offset; // init in 0xffff + ushort MeteringMode_offset; + ushort ExposureProgram_offset; + ushort ReleaseMode2_offset; + unsigned MinoltaCamID; // init in 0xffffffff + float firmware; + ushort ImageCount3_offset; // init in 0xffff + unsigned ImageCount3; + unsigned ElectronicFrontCurtainShutter; // init in 0xffffffff + ushort MeteringMode2; + char SonyDateTime[20]; + unsigned ShotNumberSincePowerUp; + ushort PixelShiftGroupPrefix; + unsigned PixelShiftGroupID; + char nShotsInPixelShiftGroup; + char numInPixelShiftGroup; /* '0' if ARQ, first shot in the group has '1' + here */ + ushort prd_ImageHeight, prd_ImageWidth; + ushort prd_Total_bps; + ushort prd_Active_bps; + ushort prd_StorageMethod; /* 82 -> Padded; 89 -> Linear */ + ushort prd_BayerPattern; /* 0 -> not valid; 1 -> RGGB; 4 -> GBRG */ + + ushort SonyRawFileType; /* init in 0xffff + valid for ARW 2.0 and up (FileFormat >= 3000) + takes precedence over RAWFileType and Quality: + 0 for uncompressed 14-bit raw + 1 for uncompressed 12-bit raw + 2 for compressed raw (lossy) + 3 for lossless compressed raw + 4 for lossless compressed raw v.2 (ILCE-1) + */ + ushort RAWFileType; /* init in 0xffff + takes precedence over Quality + 0 for compressed raw, + 1 for uncompressed; + 2 lossless compressed raw v.2 + */ + ushort RawSizeType; /* init in 0xffff + 1 - large, + 2 - small, + 3 - medium + */ + unsigned Quality; /* init in 0xffffffff + 0 or 6 for raw, 7 or 8 for compressed raw */ + ushort FileFormat; /* 1000 SR2 + 2000 ARW 1.0 + 3000 ARW 2.0 + 3100 ARW 2.1 + 3200 ARW 2.2 + 3300 ARW 2.3 + 3310 ARW 2.3.1 + 3320 ARW 2.3.2 + 3330 ARW 2.3.3 + 3350 ARW 2.3.5 + 4000 ARW 4.0 + 4010 ARW 4.0.1 + */ + char MetaVersion [16]; + float AspectRatio; + } libraw_sony_info_t; + + typedef struct + { + ushort curve[0x10000]; + unsigned cblack[LIBRAW_CBLACK_SIZE]; + unsigned black; + unsigned data_maximum; + unsigned maximum; + +// Canon (SpecularWhiteLevel) +// Kodak (14N, 14nx, SLR/c/n, DCS720X, DCS760C, DCS760M, ProBack, ProBack645, P712, P880, P850) +// Olympus, except: +// C5050Z, C5060WZ, C7070WZ, C8080WZ +// SP350, SP500UZ, SP510UZ, SP565UZ +// E-10, E-20 +// E-300, E-330, E-400, E-410, E-420, E-450, E-500, E-510, E-520 +// E-1, E-3 +// XZ-1 +// Panasonic +// Pentax +// Sony +// and aliases of the above +// DNG + long linear_max[4]; + + float fmaximum; + float fnorm; + ushort white[8][8]; + float cam_mul[4]; + float pre_mul[4]; + float cmatrix[3][4]; + float ccm[3][4]; + float rgb_cam[3][4]; + float cam_xyz[4][3]; + struct ph1_t phase_one_data; + float flash_used; + float canon_ev; + char model2[64]; + char UniqueCameraModel[64]; + char LocalizedCameraModel[64]; + char ImageUniqueID[64]; + char RawDataUniqueID[17]; + char OriginalRawFileName[64]; + void *profile; + unsigned profile_length; + unsigned black_stat[8]; + libraw_dng_color_t dng_color[2]; + libraw_dng_levels_t dng_levels; + int WB_Coeffs[256][4]; /* R, G1, B, G2 coeffs */ + float WBCT_Coeffs[64][5]; /* CCT, than R, G1, B, G2 coeffs */ + int as_shot_wb_applied; + libraw_P1_color_t P1_color[2]; + unsigned raw_bps; /* for Phase One: raw format; For other cameras: bits per pixel (copy of tiff_bps in most cases) */ + /* Phase One raw format values, makernotes tag 0x010e: + 0 Name unknown + 1 "RAW 1" + 2 "RAW 2" + 3 "IIQ L" (IIQ L14) + 4 Never seen + 5 "IIQ S" + 6 "IIQ Sv2" (S14 / S14+) + 7 Never seen + 8 "IIQ L16" (IIQ L16EX / IIQ L16) + */ + int ExifColorSpace; + } libraw_colordata_t; + + typedef struct + { + enum LibRaw_thumbnail_formats tformat; + ushort twidth, theight; + unsigned tlength; + int tcolors; + char *thumb; + } libraw_thumbnail_t; + + typedef struct + { + enum LibRaw_internal_thumbnail_formats tformat; + ushort twidth, theight, tflip; + unsigned tlength; + unsigned tmisc; + INT64 toffset; + }libraw_thumbnail_item_t; + + typedef struct + { + int thumbcount; + libraw_thumbnail_item_t thumblist[LIBRAW_THUMBNAIL_MAXCOUNT]; + } libraw_thumbnail_list_t; + + typedef struct + { + float latitude[3]; /* Deg,min,sec */ + float longitude[3]; /* Deg,min,sec */ + float gpstimestamp[3]; /* Deg,min,sec */ + float altitude; + char altref, latref, longref, gpsstatus; + char gpsparsed; + } libraw_gps_info_t; + + typedef struct + { + float iso_speed; + float shutter; + float aperture; + float focal_len; + time_t timestamp; + unsigned shot_order; + unsigned gpsdata[32]; + libraw_gps_info_t parsed_gps; + char desc[512], artist[64]; + float analogbalance[4]; + } libraw_imgother_t; + + typedef struct + { + unsigned AFInfoData_tag; + short AFInfoData_order; + unsigned AFInfoData_version; + unsigned AFInfoData_length; + uchar *AFInfoData; + } libraw_afinfo_item_t; + + typedef struct { + float FlashEC; + float FlashGN; + float CameraTemperature; + float SensorTemperature; + float SensorTemperature2; + float LensTemperature; + float AmbientTemperature; + float BatteryTemperature; + float exifAmbientTemperature; + float exifHumidity; + float exifPressure; + float exifWaterDepth; + float exifAcceleration; + float exifCameraElevationAngle; + float real_ISO; + float exifExposureIndex; + ushort ColorSpace; + char firmware[128]; + float ExposureCalibrationShift; + libraw_afinfo_item_t afdata[LIBRAW_AFDATA_MAXCOUNT]; + int afcount; + } libraw_metadata_common_t; + + typedef struct + { + unsigned greybox[4]; /* -A x1 y1 x2 y2 */ + unsigned cropbox[4]; /* -B x1 y1 x2 y2 */ + double aber[4]; /* -C */ + double gamm[6]; /* -g */ + float user_mul[4]; /* -r mul0 mul1 mul2 mul3 */ + float bright; /* -b */ + float threshold; /* -n */ + int half_size; /* -h */ + int four_color_rgb; /* -f */ + int highlight; /* -H */ + int use_auto_wb; /* -a */ + int use_camera_wb; /* -w */ + int use_camera_matrix; /* +M/-M */ + int output_color; /* -o */ + char *output_profile; /* -o */ + char *camera_profile; /* -p */ + char *bad_pixels; /* -P */ + char *dark_frame; /* -K */ + int output_bps; /* -4 */ + int output_tiff; /* -T */ + int output_flags; + int user_flip; /* -t */ + int user_qual; /* -q */ + int user_black; /* -k */ + int user_cblack[4]; + int user_sat; /* -S */ + int med_passes; /* -m */ + float auto_bright_thr; + float adjust_maximum_thr; + int no_auto_bright; /* -W */ + int use_fuji_rotate; /* -j */ + int use_p1_correction; + int green_matching; + /* DCB parameters */ + int dcb_iterations; + int dcb_enhance_fl; + int fbdd_noiserd; + int exp_correc; + float exp_shift; + float exp_preser; + /* Disable Auto-scale */ + int no_auto_scale; + /* Disable intepolation */ + int no_interpolation; + } libraw_output_params_t; + + typedef struct + { + /* Raw speed */ + int use_rawspeed; + /* DNG SDK */ + int use_dngsdk; + unsigned options; + unsigned shot_select; /* -s */ + unsigned specials; + unsigned max_raw_memory_mb; + int sony_arw2_posterization_thr; + /* Nikon Coolscan */ + float coolscan_nef_gamma; + char p4shot_order[5]; + /* Custom camera list */ + char **custom_camera_strings; + }libraw_raw_unpack_params_t; + + typedef struct + { + /* really allocated bitmap */ + void *raw_alloc; + /* alias to single_channel variant */ + ushort *raw_image; + /* alias to 4-channel variant */ + ushort (*color4_image)[4]; + /* alias to 3-color variand decoded by RawSpeed */ + ushort (*color3_image)[3]; + /* float bayer */ + float *float_image; + /* float 3-component */ + float (*float3_image)[3]; + /* float 4-component */ + float (*float4_image)[4]; + + /* Phase One black level data; */ + short (*ph1_cblack)[2]; + short (*ph1_rblack)[2]; + /* save color and sizes here, too.... */ + libraw_iparams_t iparams; + libraw_image_sizes_t sizes; + libraw_internal_output_params_t ioparams; + libraw_colordata_t color; + } libraw_rawdata_t; + + typedef struct + { + unsigned long long LensID; + char Lens[128]; + ushort LensFormat; /* to characterize the image circle the lens covers */ + ushort LensMount; /* 'male', lens itself */ + unsigned long long CamID; + ushort CameraFormat; /* some of the sensor formats */ + ushort CameraMount; /* 'female', body throat */ + char body[64]; + short FocalType; /* -1/0 is unknown; 1 is fixed focal; 2 is zoom */ + char LensFeatures_pre[16], LensFeatures_suf[16]; + float MinFocal, MaxFocal; + float MaxAp4MinFocal, MaxAp4MaxFocal, MinAp4MinFocal, MinAp4MaxFocal; + float MaxAp, MinAp; + float CurFocal, CurAp; + float MaxAp4CurFocal, MinAp4CurFocal; + float MinFocusDistance; + float FocusRangeIndex; + float LensFStops; + unsigned long long TeleconverterID; + char Teleconverter[128]; + unsigned long long AdapterID; + char Adapter[128]; + unsigned long long AttachmentID; + char Attachment[128]; + ushort FocalUnits; + float FocalLengthIn35mmFormat; + } libraw_makernotes_lens_t; + + typedef struct + { + float EffectiveMaxAp; + uchar LensIDNumber, LensFStops, MCUVersion, LensType; + } libraw_nikonlens_t; + + typedef struct + { + float MinFocal, MaxFocal, MaxAp4MinFocal, MaxAp4MaxFocal; + } libraw_dnglens_t; + + typedef struct + { + float MinFocal, MaxFocal, MaxAp4MinFocal, MaxAp4MaxFocal, EXIF_MaxAp; + char LensMake[128], Lens[128], LensSerial[128], InternalLensSerial[128]; + ushort FocalLengthIn35mmFormat; + libraw_nikonlens_t nikon; + libraw_dnglens_t dng; + libraw_makernotes_lens_t makernotes; + } libraw_lensinfo_t; + + typedef struct + { + libraw_canon_makernotes_t canon; + libraw_nikon_makernotes_t nikon; + libraw_hasselblad_makernotes_t hasselblad; + libraw_fuji_info_t fuji; + libraw_olympus_makernotes_t olympus; + libraw_sony_info_t sony; + libraw_kodak_makernotes_t kodak; + libraw_panasonic_makernotes_t panasonic; + libraw_pentax_makernotes_t pentax; + libraw_p1_makernotes_t phaseone; + libraw_ricoh_makernotes_t ricoh; + libraw_samsung_makernotes_t samsung; + libraw_metadata_common_t common; + } libraw_makernotes_t; + + typedef struct + { + short DriveMode; + short FocusMode; + short MeteringMode; + short AFPoint; + short ExposureMode; + short ExposureProgram; + short ImageStabilization; + char BodySerial[64]; + char InternalBodySerial[64]; /* this may be PCB or sensor serial, depends on + make/model */ + } libraw_shootinginfo_t; + + typedef struct + { + unsigned fsize; + ushort rw, rh; + uchar lm, tm, rm, bm; + ushort lf; + uchar cf, max, flags; + char t_make[10], t_model[20]; + ushort offset; + } libraw_custom_camera_t; + + typedef struct + { + ushort (*image)[4]; + libraw_image_sizes_t sizes; + libraw_iparams_t idata; + libraw_lensinfo_t lens; + libraw_makernotes_t makernotes; + libraw_shootinginfo_t shootinginfo; + libraw_output_params_t params; + libraw_raw_unpack_params_t rawparams; + unsigned int progress_flags; + unsigned int process_warnings; + libraw_colordata_t color; + libraw_imgother_t other; + libraw_thumbnail_t thumbnail; + libraw_thumbnail_list_t thumbs_list; + libraw_rawdata_t rawdata; + void *parent_class; + } libraw_data_t; + + struct fuji_q_table + { + int8_t *q_table; /* quantization table */ + int raw_bits; + int total_values; + int max_grad; // sdp val + int q_grad_mult; // quant_gradient multiplier + int q_base; + }; + + struct fuji_compressed_params + { + struct fuji_q_table qt[4]; + void *buf; + int max_bits; + int min_value; + int max_value; // q_point[4] + ushort line_width; + }; + +#ifdef __cplusplus +} +#endif + +#if defined (LIBRAW_LIBRARY_BUILD) && defined(__cplusplus) + +class libraw_static_table_t +{ +public: + libraw_static_table_t(const int *a, const unsigned s): data(a),_size(s) {} + libraw_static_table_t(): data(0),_size(0){} + libraw_static_table_t(const libraw_static_table_t& s) : data(s.data), _size(s._size) {} + unsigned size() const { return _size; } + libraw_static_table_t& operator = (const libraw_static_table_t& s) + { + _size = s._size; + data = s.data; + return *this; + } + int operator [] (unsigned idx) const + { + if (idx < _size) return data[idx]; + if(_size>0 && data) return data[0]; + return 0; + } +private: + const int *data; + unsigned _size; +}; + +#endif + + +/* Byte order */ +#if defined(__POWERPC__) +#define LibRawBigEndian 1 + +#elif defined(__INTEL__) +#define LibRawBigEndian 0 + +#elif defined(_M_IX86) || defined(__i386__) +#define LibRawBigEndian 0 + +#elif defined(_M_X64) || defined(__amd64__) || defined(__x86_64__) +#define LibRawBigEndian 0 + +#elif defined(__LITTLE_ENDIAN__) +#define LibRawBigEndian 0 + +#elif defined(__BIG_ENDIAN__) +#define LibRawBigEndian 1 +#elif defined(_ARM_) +#define LibRawBigEndian 0 + +#elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +#define LibRawBigEndian 0 + +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +#define LibRawBigEndian 1 +#else +#ifndef qXCodeRez +#error Unable to figure out byte order. +#endif +#endif + +#endif diff --git a/rtengine/libraw/libraw/libraw_version.h b/rtengine/libraw/libraw/libraw_version.h new file mode 100644 index 000000000..143a769ad --- /dev/null +++ b/rtengine/libraw/libraw/libraw_version.h @@ -0,0 +1,63 @@ +/* -*- C++ -*- + * File: libraw_version.h + * Copyright 2008-2024 LibRaw LLC (info@libraw.org) + * Created: Mon Sept 8, 2008 + * + * LibRaw C++ interface + * + +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 the file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 +(See the file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#ifndef __VERSION_H +#define __VERSION_H + +#define LIBRAW_MAJOR_VERSION 0 +#define LIBRAW_MINOR_VERSION 21 +#define LIBRAW_PATCH_VERSION 0 +#define LIBRAW_VERSION_TAIL Beta1 + +#define LIBRAW_SHLIB_CURRENT 23 +#define LIBRAW_SHLIB_REVISION 0 +#define LIBRAW_SHLIB_AGE 0 + +#define _LIBRAW_VERSION_MAKE(a, b, c, d) #a "." #b "." #c "-" #d +#define LIBRAW_VERSION_MAKE(a, b, c, d) _LIBRAW_VERSION_MAKE(a, b, c, d) + +#define LIBRAW_VERSION_STR \ + LIBRAW_VERSION_MAKE(LIBRAW_MAJOR_VERSION, LIBRAW_MINOR_VERSION, \ + LIBRAW_PATCH_VERSION, LIBRAW_VERSION_TAIL) + +#define LIBRAW_MAKE_VERSION(major, minor, patch) \ + (((major) << 16) | ((minor) << 8) | (patch)) + +#define LIBRAW_VERSION \ + LIBRAW_MAKE_VERSION(LIBRAW_MAJOR_VERSION, LIBRAW_MINOR_VERSION, \ + LIBRAW_PATCH_VERSION) + +#define LIBRAW_CHECK_VERSION(major, minor, patch) \ + (LibRaw::versionNumber() >= LIBRAW_MAKE_VERSION(major, minor, patch)) + +#define LIBRAW_RUNTIME_CHECK_VERSION_EXACT() \ + ((LibRaw::versionNumber() & 0xffff00) == \ + LIBRAW_MAKE_VERSION(LIBRAW_MAJOR_VERSION, LIBRAW_MINOR_VERSION, 0)) + +#define LIBRAW_RUNTIME_CHECK_VERSION_NOTLESS() \ + ((LibRaw::versionNumber() & 0xffff00) >= \ + LIBRAW_MAKE_VERSION(LIBRAW_MAJOR_VERSION, LIBRAW_MINOR_VERSION, 0)) + +#define LIBRAW_COMPILE_CHECK_VERSION(major, minor) \ + (LIBRAW_MAKE_VERSION(major, minor, 0) == (LIBRAW_VERSION & 0xffff00)) + +#define LIBRAW_COMPILE_CHECK_VERSION_NOTLESS(major, minor) \ + (LIBRAW_MAKE_VERSION(major, minor, 0) <= (LIBRAW_VERSION & 0xffff00)) + +#endif diff --git a/rtengine/libraw/libraw_r.pc.in b/rtengine/libraw/libraw_r.pc.in new file mode 100644 index 000000000..92bbbffa1 --- /dev/null +++ b/rtengine/libraw/libraw_r.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libraw +Description: Raw image decoder library (thread-safe) +Requires: @PACKAGE_REQUIRES@ +Version: @PACKAGE_VERSION@ +Libs: -L${libdir} -lraw_r -lstdc++@PC_OPENMP@ +Libs.private: @PACKAGE_LIBS_PRIVATE@ +Cflags: -I${includedir}/libraw -I${includedir} diff --git a/rtengine/libraw/m4/ax_openmp.m4 b/rtengine/libraw/m4/ax_openmp.m4 new file mode 100644 index 000000000..7ea794be0 --- /dev/null +++ b/rtengine/libraw/m4/ax_openmp.m4 @@ -0,0 +1,99 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_openmp.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_OPENMP([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +# +# DESCRIPTION +# +# This macro tries to find out how to compile programs that use OpenMP a +# standard API and set of compiler directives for parallel programming +# (see http://www-unix.mcs/) +# +# On success, it sets the OPENMP_CFLAGS/OPENMP_CXXFLAGS/OPENMP_F77FLAGS +# output variable to the flag (e.g. -omp) used both to compile *and* link +# OpenMP programs in the current language. +# +# NOTE: You are assumed to not only compile your program with these flags, +# but also link it with them as well. +# +# If you want to compile everything with OpenMP, you should set: +# +# CFLAGS="$CFLAGS $OPENMP_CFLAGS" +# #OR# CXXFLAGS="$CXXFLAGS $OPENMP_CXXFLAGS" +# #OR# FFLAGS="$FFLAGS $OPENMP_FFLAGS" +# +# (depending on the selected language). +# +# The user can override the default choice by setting the corresponding +# environment variable (e.g. OPENMP_CFLAGS). +# +# ACTION-IF-FOUND is a list of shell commands to run if an OpenMP flag is +# found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it is +# not found. If ACTION-IF-FOUND is not specified, the default action will +# define HAVE_OPENMP. +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 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 . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 8 + +AC_DEFUN([AX_OPENMP], [ +AC_PREREQ(2.59) dnl for _AC_LANG_PREFIX + +AC_CACHE_CHECK([for OpenMP flag of _AC_LANG compiler], ax_cv_[]_AC_LANG_ABBREV[]_openmp, [save[]_AC_LANG_PREFIX[]FLAGS=$[]_AC_LANG_PREFIX[]FLAGS +ax_cv_[]_AC_LANG_ABBREV[]_openmp=unknown +# Flags to try: -fopenmp (gcc), -openmp (icc), -mp (SGI & PGI), +# -xopenmp (Sun), -omp (Tru64), -qsmp=omp (AIX), none +ax_openmp_flags="-fopenmp -openmp -mp -xopenmp -omp -qsmp=omp none" +if test "x$OPENMP_[]_AC_LANG_PREFIX[]FLAGS" != x; then + ax_openmp_flags="$OPENMP_[]_AC_LANG_PREFIX[]FLAGS $ax_openmp_flags" +fi +for ax_openmp_flag in $ax_openmp_flags; do + case $ax_openmp_flag in + none) []_AC_LANG_PREFIX[]FLAGS=$save[]_AC_LANG_PREFIX[] ;; + *) []_AC_LANG_PREFIX[]FLAGS="$save[]_AC_LANG_PREFIX[]FLAGS $ax_openmp_flag" ;; + esac + AC_TRY_LINK_FUNC(omp_set_num_threads, + [ax_cv_[]_AC_LANG_ABBREV[]_openmp=$ax_openmp_flag; break]) +done +[]_AC_LANG_PREFIX[]FLAGS=$save[]_AC_LANG_PREFIX[]FLAGS +]) +if test "x$ax_cv_[]_AC_LANG_ABBREV[]_openmp" = "xunknown"; then + m4_default([$2],:) +else + if test "x$ax_cv_[]_AC_LANG_ABBREV[]_openmp" != "xnone"; then + OPENMP_[]_AC_LANG_PREFIX[]FLAGS=$ax_cv_[]_AC_LANG_ABBREV[]_openmp + fi + m4_default([$1], [AC_DEFINE(HAVE_OPENMP,1,[Define if OpenMP is enabled])]) +fi +])dnl AX_OPENMP diff --git a/rtengine/libraw/mkdist.sh b/rtengine/libraw/mkdist.sh new file mode 100755 index 000000000..247ab16af --- /dev/null +++ b/rtengine/libraw/mkdist.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +if [ -d CVS ] ; then + echo 'Use mkdist script in cvs export-ed dirs' +else + if [ -f Makefile.devel ] ; then + autoreconf --install + mkdir dcraw + cd dcraw + wget https://www.dechifro.org/dcraw/dcraw.c + cd .. + rm -f clist2c.pl clist2html.pl + rm -f Makefile.devel + rm mkdist.sh export-dist.sh + else + echo 'Wrong directory or mkdist.sh already executed' + fi +fi diff --git a/rtengine/libraw/object/.keep_me b/rtengine/libraw/object/.keep_me new file mode 100644 index 000000000..e69de29bb diff --git a/rtengine/libraw/rsxml2c.sh b/rtengine/libraw/rsxml2c.sh new file mode 100755 index 000000000..0fea28ad9 --- /dev/null +++ b/rtengine/libraw/rsxml2c.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +echo "const char *_rawspeed_data_xml[]={" +cat $1 | tr -d '\015' | sed -e 's/\\/\\\\/g;s/"/\\"/g;s/ /\\t/g;s/^/"/;s/$/\\n",/' +echo "0" +echo "};" diff --git a/rtengine/libraw/samples/4channels.cpp b/rtengine/libraw/samples/4channels.cpp new file mode 100644 index 000000000..57293a2fe --- /dev/null +++ b/rtengine/libraw/samples/4channels.cpp @@ -0,0 +1,174 @@ +/* -*- C++ -*- + * File: 4channels.cpp + * Copyright 2008-2024 LibRaw LLC (info@libraw.org) + * Created: Mon Feb 09, 2009 + * + * LibRaw sample + * Generates 4 TIFF file from RAW data, one file per channel + * + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + + */ +#include +#include +#include +#include "libraw/libraw.h" + +#ifndef LIBRAW_WIN32_CALLS +#include +#else +#include +#endif + +#ifdef LIBRAW_WIN32_CALLS +#define snprintf _snprintf +#endif + +int main(int ac, char *av[]) +{ + int i, ret; + int autoscale = 0, black_subtraction = 1, use_gamma = 0; + char outfn[1024]; + + LibRaw RawProcessor; + if (ac < 2) + { + usage: + printf("4channels - LibRaw %s sample. %d cameras supported\n" + "Usage: %s [-s N] [-g] [-A] [-B] raw-files....\n" + "\t-s N - select Nth image in file (default=0)\n" + "\t-g - use gamma correction with gamma 2.2 (not precise,use for " + "visual inspection only)\n" + "\t-A - autoscaling (by integer factor)\n" + "\t-B - no black subtraction\n", + LibRaw::version(), LibRaw::cameraCount(), av[0]); + return 0; + } + +#define P1 RawProcessor.imgdata.idata +#define S RawProcessor.imgdata.sizes +#define C RawProcessor.imgdata.color +#define T RawProcessor.imgdata.thumbnail +#define P2 RawProcessor.imgdata.other +#define OUT RawProcessor.imgdata.params +#define OUTR RawProcessor.imgdata.rawparams + + OUT.output_bps = 16; + OUT.output_tiff = 1; + OUT.user_flip = 0; + OUT.no_auto_bright = 1; + OUT.half_size = 1; + + for (i = 1; i < ac; i++) + { + if (av[i][0] == '-') + { + if (av[i][1] == 's' && av[i][2] == 0) + { + i++; + OUTR.shot_select = av[i] ? atoi(av[i]) : 0; + } + else if (av[i][1] == 'g' && av[i][2] == 0) + use_gamma = 1; + else if (av[i][1] == 'A' && av[i][2] == 0) + autoscale = 1; + else if (av[i][1] == 'B' && av[i][2] == 0) + { + black_subtraction = 0; + } + else + goto usage; + continue; + } + if (!use_gamma) + OUT.gamm[0] = OUT.gamm[1] = 1; + + int c; + printf("Processing file %s\n", av[i]); + if ((ret = RawProcessor.open_file(av[i])) != LIBRAW_SUCCESS) + { + fprintf(stderr, "Cannot open %s: %s\n", av[i], libraw_strerror(ret)); + continue; // no recycle b/c open file will recycle itself + } + if (P1.is_foveon) + { + printf("Cannot process Foveon image %s\n", av[i]); + continue; + } + if ((ret = RawProcessor.unpack()) != LIBRAW_SUCCESS) + { + fprintf(stderr, "Cannot unpack %s: %s\n", av[i], libraw_strerror(ret)); + continue; + } + RawProcessor.raw2image(); + if (black_subtraction) + { + RawProcessor.subtract_black(); + } + + if (autoscale) + { + unsigned max = 0, scale = 1; + for (int j = 0; j < S.iheight * S.iwidth; j++) + for (int c = 0; c < 4; c++) + if (max < RawProcessor.imgdata.image[j][c]) + max = RawProcessor.imgdata.image[j][c]; + if (max > 0 && max < 1 << 15) + { + scale = (1 << 16) / max; + printf("Scaling with multiplier=%d (max=%d)\n", scale, max); + for (int j = 0; j < S.iheight * S.iwidth; j++) + for (c = 0; c < 4; c++) + RawProcessor.imgdata.image[j][c] *= scale; + } + printf("Black level (scaled)=%d\n", C.black * scale); + } + else + printf("Black level (unscaled)=%d\n", C.black); + + // hack to make dcraw tiff writer happy + int isrgb = (P1.colors == 4 ? 0 : 1); + P1.colors = 1; + S.width = S.iwidth; + S.height = S.iheight; + + for (int layer = 0; layer < 4; layer++) + { + if (layer > 0) + { + for (int rc = 0; rc < S.iheight * S.iwidth; rc++) + RawProcessor.imgdata.image[rc][0] = + RawProcessor.imgdata.image[rc][layer]; + } + char lname[8]; + if (isrgb) + { + snprintf(lname, 7, "%c", ((char *)("RGBG"))[layer]); + if (layer == 3) + strcat(lname, "2"); + } + else + snprintf(lname, 7, "%c", ((char *)("GCMY"))[layer]); + + if (OUTR.shot_select) + snprintf(outfn, sizeof(outfn), "%s-%d.%s.tiff", av[i], OUTR.shot_select, + lname); + else + snprintf(outfn, sizeof(outfn), "%s.%s.tiff", av[i], lname); + + printf("Writing file %s\n", outfn); + if (LIBRAW_SUCCESS != (ret = RawProcessor.dcraw_ppm_tiff_writer(outfn))) + fprintf(stderr, "Cannot write %s: %s\n", outfn, libraw_strerror(ret)); + } + } + return 0; +} diff --git a/rtengine/libraw/samples/Makefile b/rtengine/libraw/samples/Makefile new file mode 100644 index 000000000..be880e835 --- /dev/null +++ b/rtengine/libraw/samples/Makefile @@ -0,0 +1,2 @@ +all: + (cd ..; make all_samples) diff --git a/rtengine/libraw/samples/dcraw_emu.cpp b/rtengine/libraw/samples/dcraw_emu.cpp new file mode 100644 index 000000000..afa341558 --- /dev/null +++ b/rtengine/libraw/samples/dcraw_emu.cpp @@ -0,0 +1,670 @@ +/* -*- C++ -*- + * File: dcraw_emu.cpp + * Copyright 2008-2024 LibRaw LLC (info@libraw.org) + * Created: Sun Mar 23, 2008 + * + * LibRaw simple C++ API sample: almost complete dcraw emulator + * + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + + */ +#ifdef _MSC_VER +// suppress sprintf-related warning. sprintf() is permitted in sample code +#define _CRT_SECURE_NO_WARNINGS +#endif + +#include +#include +#include +#include +#include + +#include "libraw/libraw.h" + +#ifndef LIBRAW_WIN32_CALLS +#include +#include +#include +#else +#include +#endif +#include +#include + +#ifdef LIBRAW_WIN32_CALLS +#define snprintf _snprintf +#include +#else +#define O_BINARY 0 +#endif + +#ifdef USE_DNGSDK +#include "dng_host.h" +#include "dng_negative.h" +#include "dng_simple_image.h" +#include "dng_info.h" +#endif + +void usage(const char *prog) +{ + printf("dcraw_emu: almost complete dcraw emulator\n"); + printf("Usage: %s [OPTION]... [FILE]...\n", prog); + printf("-c float-num Set adjust maximum threshold (default 0.75)\n" + "-v Verbose: print progress messages (repeated -v will add " + "verbosity)\n" + "-w Use camera white balance, if possible\n" + "-a Average the whole image for white balance\n" + "-A Average a grey box for white balance\n" + "-r Set custom white balance\n" + "+M/-M Use/don't use an embedded color matrix\n" + "-C Correct chromatic aberration\n" + "-P Fix the dead pixels listed in this file\n" + "-K Subtract dark frame (16-bit raw PGM)\n" + "-k Set the darkness level\n" + "-S Set the saturation level\n" + "-R Set raw processing options to num\n" + "-n Set threshold for wavelet denoising\n" + "-H [0-9] Highlight mode (0=clip, 1=unclip, 2=blend, 3+=rebuild)\n" + "-t [0-7] Flip image (0=none, 3=180, 5=90CCW, 6=90CW)\n" + "-o [0-8] Output colorspace (raw,sRGB,Adobe,Wide,ProPhoto,XYZ,ACES,\n" + " DCI-P3,Rec2020)\n" +#ifndef NO_LCMS + "-o file Output ICC profile\n" + "-p file Camera input profile (use \'embed\' for embedded profile)\n" +#endif + "-j Don't stretch or rotate raw pixels\n" + "-W Don't automatically brighten the image\n" + "-b Adjust brightness (default = 1.0)\n" + "-q N Set the interpolation quality:\n" + " 0 - linear, 1 - VNG, 2 - PPG, 3 - AHD, 4 - DCB\n" + " 11 - DHT, 12 - AAHD\n" + "-h Half-size color image (twice as fast as \"-q 0\")\n" + "-f Interpolate RGGB as four colors\n" + "-m Apply a 3x3 median filter to R-G and B-G\n" + "-s [0..N-1] Select one raw image from input file\n" + "-4 Linear 16-bit, same as \"-6 -W -g 1 1\n" + "-6 Write 16-bit output\n" + "-g pow ts Set gamma curve to gamma pow and toe slope ts (default = " + "2.222 4.5)\n" + "-T Write TIFF instead of PPM\n" + "-G Use green_matching() filter\n" + "-B use cropbox\n" + "-F Use FILE I/O instead of streambuf API\n" + "-Z Output filename generation rules\n" + " .suf => append .suf to input name, keeping existing suffix " + "too\n" + " suf => replace input filename last extension\n" + " - => output to stdout\n" + " filename.suf => output to filename.suf\n" + "-timing Detailed timing report\n" + "-fbdd N 0 - disable FBDD noise reduction (default), 1 - light " + "FBDD, 2 - full\n" + "-dcbi N Number of extra DCD iterations (default - 0)\n" + "-dcbe DCB color enhance\n" + "-aexpo exposure correction\n" + "-apentax4shot enables merge of 4-shot pentax files\n" + "-apentax4shotorder 3102 sets pentax 4-shot alignment order\n" +#ifdef USE_RAWSPEED_BITS + "-arsbits V Set use_rawspeed to V\n" +#endif + "-mmap Use memory mmaped buffer instead of plain FILE I/O\n" + "-mem Use memory buffer instead of FILE I/O\n" + "-disars Do not use RawSpeed library\n" + "-disinterp Do not run interpolation step\n" + "-dsrawrgb1 Disable YCbCr to RGB conversion for sRAW (Cb/Cr " + "interpolation enabled)\n" + "-dsrawrgb2 Disable YCbCr to RGB conversion for sRAW (Cb/Cr " + "interpolation disabled)\n" +#ifdef USE_DNGSDK + "-dngsdk Use Adobe DNG SDK for DNG decode\n" + "-dngflags N set DNG decoding options to value N\n" +#endif + "-doutputflags N set params.output_flags to N\n" + ); + exit(1); +} + +static int verbosity = 0; +int cnt = 0; +int my_progress_callback(void *d, enum LibRaw_progress p, int iteration, + int expected) +{ + char *passed = (char *)(d ? d : "default string"); // data passed to callback + // at set_callback stage + + if (verbosity > 2) // verbosity set by repeat -v switches + { + printf("CB: %s pass %d of %d (data passed=%s)\n", libraw_strprogress(p), + iteration, expected, passed); + } + else if (iteration == 0) // 1st iteration of each step + printf("Starting %s (expecting %d iterations)\n", libraw_strprogress(p), + expected); + else if (iteration == expected - 1) + printf("%s finished\n", libraw_strprogress(p)); + + /// if(++cnt>10) return 1; // emulate user termination on 10-th callback + /// call + + return 0; // always return 0 to continue processing +} + +// timer +#ifndef LIBRAW_WIN32_CALLS +static struct timeval start, end; +void timerstart(void) { gettimeofday(&start, NULL); } +void timerprint(const char *msg, const char *filename) +{ + gettimeofday(&end, NULL); + float msec = (end.tv_sec - start.tv_sec) * 1000.0f + + (end.tv_usec - start.tv_usec) / 1000.0f; + printf("Timing: %s/%s: %6.3f msec\n", filename, msg, msec); +} +#else +LARGE_INTEGER start; +void timerstart(void) { QueryPerformanceCounter(&start); } +void timerprint(const char *msg, const char *filename) +{ + LARGE_INTEGER unit, end; + QueryPerformanceCounter(&end); + QueryPerformanceFrequency(&unit); + float msec = (float)(end.QuadPart - start.QuadPart); + msec /= (float)unit.QuadPart / 1000.0f; + printf("Timing: %s/%s: %6.3f msec\n", filename, msg, msec); +} + +#endif + +struct file_mapping +{ + void *map; + INT64 fsize; +#ifdef LIBRAW_WIN32_CALLS + HANDLE fd, fd_map; + file_mapping() : map(0), fsize(0), fd(INVALID_HANDLE_VALUE), fd_map(INVALID_HANDLE_VALUE){} +#else + int fd; + file_mapping() : map(0), fsize(0), fd(-1){} +#endif +}; + +void create_mapping(struct file_mapping& data, const std::string& fn) +{ +#ifdef LIBRAW_WIN32_CALLS + std::wstring fpath(fn.begin(), fn.end()); + if ((data.fd = CreateFileW(fpath.c_str(), GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)) == INVALID_HANDLE_VALUE) return; + LARGE_INTEGER fs; + if (!GetFileSizeEx(data.fd, &fs)) return; + data.fsize = fs.QuadPart; + if ((data.fd_map = ::CreateFileMapping(data.fd, 0, PAGE_READONLY, fs.HighPart, fs.LowPart, 0)) == INVALID_HANDLE_VALUE) return; + data.map = MapViewOfFile(data.fd_map, FILE_MAP_READ, 0, 0, data.fsize); +#else + struct stat stt; + if ((data.fd = open(fn.c_str(), O_RDONLY)) < 0) return; + if (fstat(data.fd, &stt) != 0) return; + data.fsize = stt.st_size; + data.map = mmap(0, data.fsize, PROT_READ | PROT_WRITE, MAP_PRIVATE, data.fd, 0); + return; +#endif +} + +void close_mapping(struct file_mapping& data) +{ +#ifdef LIBRAW_WIN32_CALLS + if (data.map) UnmapViewOfFile(data.map); + if (data.fd_map != INVALID_HANDLE_VALUE) CloseHandle(data.fd_map); + if (data.fd != INVALID_HANDLE_VALUE) CloseHandle(data.fd); + data.map = 0; + data.fsize = 0; + data.fd = data.fd_map = INVALID_HANDLE_VALUE; +#else + if (data.map) + munmap(data.map, data.fsize); + if (data.fd >= 0) + close(data.fd); + data.map = 0; + data.fsize = 0; + data.fd = -1; +#endif +} + + +int main(int argc, char *argv[]) +{ + if (argc == 1) + usage(argv[0]); + + LibRaw RawProcessor; + int i, arg, c, ret; + char opm, opt, *cp, *sp; + int use_timing = 0, use_mem = 0, use_mmap = 0; + char *outext = NULL; +#ifdef USE_DNGSDK + dng_host *dnghost = NULL; +#endif + struct file_mapping mapping; + void *iobuffer = 0; +#ifdef OUT +#undef OUT +#endif +#define OUT RawProcessor.imgdata.params +#define OUTR RawProcessor.imgdata.rawparams + + argv[argc] = (char *)""; + for (arg = 1; (((opm = argv[arg][0]) - 2) | 2) == '+';) + { + char *optstr = argv[arg]; + opt = argv[arg++][1]; + if ((cp = strchr(sp = (char *)"cnbrkStqmHABCgU", opt)) != 0) + for (i = 0; i < "111411111144221"[cp - sp] - '0'; i++) + if (!isdigit(argv[arg + i][0]) && !optstr[2]) + { + fprintf(stderr, "Non-numeric argument to \"-%c\"\n", opt); + return 1; + } + if (!strchr("ftdeam", opt) && argv[arg - 1][2]) { + fprintf(stderr, "Unknown option \"%s\".\n", argv[arg - 1]); + continue; + } + switch (opt) + { + case 'v': + verbosity++; + break; + case 'G': + OUT.green_matching = 1; + break; + case 'c': + OUT.adjust_maximum_thr = (float)atof(argv[arg++]); + break; + case 'U': + OUT.auto_bright_thr = (float)atof(argv[arg++]); + break; + case 'n': + OUT.threshold = (float)atof(argv[arg++]); + break; + case 'b': + OUT.bright = (float)atof(argv[arg++]); + break; + case 'P': + OUT.bad_pixels = argv[arg++]; + break; + case 'K': + OUT.dark_frame = argv[arg++]; + break; + case 'r': + for (c = 0; c < 4; c++) + OUT.user_mul[c] = (float)atof(argv[arg++]); + break; + case 'C': + OUT.aber[0] = 1 / atof(argv[arg++]); + OUT.aber[2] = 1 / atof(argv[arg++]); + break; + case 'g': + OUT.gamm[0] = 1 / atof(argv[arg++]); + OUT.gamm[1] = atof(argv[arg++]); + break; + case 'k': + OUT.user_black = atoi(argv[arg++]); + break; + case 'S': + OUT.user_sat = atoi(argv[arg++]); + break; + case 'R': + OUTR.options = atoi(argv[arg++]); + break; + case 't': + if (!strcmp(optstr, "-timing")) + use_timing = 1; + else if (!argv[arg - 1][2]) + OUT.user_flip = atoi(argv[arg++]); + else + fprintf(stderr, "Unknown option \"%s\".\n", argv[arg - 1]); + break; + case 'q': + OUT.user_qual = atoi(argv[arg++]); + break; + case 'm': + if (!strcmp(optstr, "-mmap")) + use_mmap = 1; + else + if (!strcmp(optstr, "-mem")) + use_mem = 1; + else + { + if (!argv[arg - 1][2]) + OUT.med_passes = atoi(argv[arg++]); + else + fprintf(stderr, "Unknown option \"%s\".\n", argv[arg - 1]); + } + break; + case 'H': + OUT.highlight = atoi(argv[arg++]); + break; + case 's': + OUTR.shot_select = abs(atoi(argv[arg++])); + break; + case 'o': + if (isdigit(argv[arg][0]) && !isdigit(argv[arg][1])) + OUT.output_color = atoi(argv[arg++]); +#ifndef NO_LCMS + else + OUT.output_profile = argv[arg++]; + break; + case 'p': + OUT.camera_profile = argv[arg++]; +#endif + break; + case 'h': + OUT.half_size = 1; + break; + case 'f': + if (!strcmp(optstr, "-fbdd")) + OUT.fbdd_noiserd = atoi(argv[arg++]); + else + { + if (!argv[arg - 1][2]) + OUT.four_color_rgb = 1; + else + fprintf(stderr, "Unknown option \"%s\".\n", argv[arg - 1]); + } + break; + case 'A': + for (c = 0; c < 4; c++) + OUT.greybox[c] = atoi(argv[arg++]); + break; + case 'B': + for (c = 0; c < 4; c++) + OUT.cropbox[c] = atoi(argv[arg++]); + break; + case 'a': + if (!strcmp(optstr, "-aexpo")) + { + OUT.exp_correc = 1; + OUT.exp_shift = (float)atof(argv[arg++]); + OUT.exp_preser = (float)atof(argv[arg++]); + } +#ifdef USE_RAWSPEED_BITS + else if (!strcmp(optstr, "-arsbits")) + { + OUTR.use_rawspeed = atoi(argv[arg++]); + } +#endif + else if (!strcmp(optstr, "-apentax4shot")) + { + OUTR.options |= LIBRAW_RAWOPTIONS_PENTAX_PS_ALLFRAMES; + } + else if (!strcmp(optstr, "-apentax4shotorder")) + { + strncpy(OUTR.p4shot_order, argv[arg++], 5); + } + else if (!argv[arg - 1][2]) + OUT.use_auto_wb = 1; + else + fprintf(stderr, "Unknown option \"%s\".\n", argv[arg - 1]); + break; + case 'w': + OUT.use_camera_wb = 1; + break; + case 'M': + OUT.use_camera_matrix = (opm == '+')?3:0; + break; + case 'j': + OUT.use_fuji_rotate = 0; + break; + case 'W': + OUT.no_auto_bright = 1; + break; + case 'T': + OUT.output_tiff = 1; + break; + case '4': + OUT.gamm[0] = OUT.gamm[1] = OUT.no_auto_bright = 1; /* no break here! */ + case '6': + OUT.output_bps = 16; + break; + case 'Z': + outext = strdup(argv[arg++]); + break; + case 'd': + if (!strcmp(optstr, "-dcbi")) + OUT.dcb_iterations = atoi(argv[arg++]); + else if (!strcmp(optstr, "-doutputflags")) + OUT.output_flags = atoi(argv[arg++]); + else if (!strcmp(optstr, "-disars")) + OUTR.use_rawspeed = 0; + else if (!strcmp(optstr, "-disinterp")) + OUT.no_interpolation = 1; + else if (!strcmp(optstr, "-dcbe")) + OUT.dcb_enhance_fl = 1; + else if (!strcmp(optstr, "-dsrawrgb1")) + { + OUTR.specials |= LIBRAW_RAWSPECIAL_SRAW_NO_RGB; + OUTR.specials &= ~LIBRAW_RAWSPECIAL_SRAW_NO_INTERPOLATE; + } + else if (!strcmp(optstr, "-dsrawrgb2")) + { + OUTR.specials &= ~LIBRAW_RAWSPECIAL_SRAW_NO_RGB; + OUTR.specials |= LIBRAW_RAWSPECIAL_SRAW_NO_INTERPOLATE; + } +#ifdef USE_DNGSDK + else if (!strcmp(optstr, "-dngsdk")) + { + dnghost = new dng_host; + RawProcessor.set_dng_host(dnghost); + } + else if (!strcmp(optstr, "-dngflags")) + { + OUTR.use_dngsdk = atoi(argv[arg++]); + } +#endif + else + fprintf(stderr, "Unknown option \"%s\".\n", argv[arg - 1]); + break; + default: + fprintf(stderr, "Unknown option \"-%c\".\n", opt); + break; + } + } +#ifndef LIBRAW_WIN32_CALLS + putenv((char *)"TZ=UTC"); // dcraw compatibility, affects TIFF datestamp field +#else + _putenv( + (char *)"TZ=UTC"); // dcraw compatibility, affects TIFF datestamp field +#endif +#define P1 RawProcessor.imgdata.idata +#define S RawProcessor.imgdata.sizes +#define C RawProcessor.imgdata.color +#define T RawProcessor.imgdata.thumbnail +#define P2 RawProcessor.imgdata.other + + if (outext && !strcmp(outext, "-")) + use_timing = verbosity = 0; + + if (verbosity > 1) + RawProcessor.set_progress_handler(my_progress_callback, + (void *)"Sample data passed"); +#ifdef LIBRAW_USE_OPENMP + if (verbosity) + printf("Using %d threads\n", omp_get_max_threads()); +#endif + + int done = 0; + int total = argc - arg; + for (; arg < argc; arg++) + { + char outfn[1024]; + + if (verbosity) + printf("Processing file %s\n", argv[arg]); + + timerstart(); + + if (use_mmap) + { + create_mapping(mapping, argv[arg]); + if (!mapping.map) + { + fprintf(stderr, "Cannot map %s\n", argv[arg]); + close_mapping(mapping); + continue; + } + if ((ret = RawProcessor.open_buffer(mapping.map,mapping.fsize) != + LIBRAW_SUCCESS)) + { + fprintf(stderr, "Cannot open_buffer %s: %s\n", argv[arg], libraw_strerror(ret)); + close_mapping(mapping); + continue; // no recycle b/c open file will recycle itself + } + } + else if (use_mem) + { + int file = open(argv[arg], O_RDONLY | O_BINARY); + struct stat st; + if (file < 0) + { + fprintf(stderr, "Cannot open %s: %s\n", argv[arg], strerror(errno)); + continue; + } + if (fstat(file, &st)) + { + fprintf(stderr, "Cannot stat %s: %s\n", argv[arg], strerror(errno)); + close(file); + continue; + } + if (!(iobuffer = malloc(st.st_size))) + { + fprintf(stderr, "Cannot allocate %d kbytes for memory buffer\n", + (int)(st.st_size / 1024)); + close(file); + continue; + } + int rd; + if (st.st_size != (rd = read(file, iobuffer, st.st_size))) + { + fprintf(stderr, + "Cannot read %d bytes instead of %d to memory buffer\n", + (int)rd, (int)st.st_size); + close(file); + free(iobuffer); + continue; + } + close(file); + if ((ret = RawProcessor.open_buffer(iobuffer, st.st_size)) != + LIBRAW_SUCCESS) + { + fprintf(stderr, "Cannot open_buffer %s: %s\n", argv[arg], + libraw_strerror(ret)); + free(iobuffer); + continue; // no recycle b/c open file will recycle itself + } + } + else + { + ret = RawProcessor.open_file(argv[arg]); + + if (ret != LIBRAW_SUCCESS) + { + fprintf(stderr, "Cannot open %s: %s\n", argv[arg], + libraw_strerror(ret)); + continue; // no recycle b/c open_file will recycle itself + } + } + + if (use_timing) + timerprint("LibRaw::open_file()", argv[arg]); + + timerstart(); + if ((ret = RawProcessor.unpack()) != LIBRAW_SUCCESS) + { + fprintf(stderr, "Cannot unpack %s: %s\n", argv[arg], + libraw_strerror(ret)); + continue; + } + + if (use_timing) + timerprint("LibRaw::unpack()", argv[arg]); + + timerstart(); + if (LIBRAW_SUCCESS != (ret = RawProcessor.dcraw_process())) + { + fprintf(stderr, "Cannot do postprocessing on %s: %s\n", argv[arg], + libraw_strerror(ret)); + if (LIBRAW_FATAL_ERROR(ret)) + continue; + } + if (use_timing) + timerprint("LibRaw::dcraw_process()", argv[arg]); + + if (!outext) + snprintf(outfn, sizeof(outfn), "%s.%s", argv[arg], + OUT.output_tiff ? "tiff" : (P1.colors > 1 ? "ppm" : "pgm")); + else if (!strcmp(outext, "-")) + snprintf(outfn, sizeof(outfn), "-"); + else + { + if (*outext == '.') // append + snprintf(outfn, sizeof(outfn), "%s%s", argv[arg], outext); + else if (strchr(outext, '.') && *outext != '.') // dot is not 1st char + strncpy(outfn, outext, sizeof(outfn)); + else + { + strncpy(outfn, argv[arg], sizeof(outfn)); + if (strlen(outfn) > 0) + { + char *lastchar = outfn + strlen(outfn); // points to term 0 + while (--lastchar > outfn) + { + if (*lastchar == '/' || *lastchar == '\\') + break; + if (*lastchar == '.') + { + *lastchar = 0; + break; + }; + } + } + strncat(outfn, ".", sizeof(outfn) - strlen(outfn) - 1); + strncat(outfn, outext, sizeof(outfn) - strlen(outfn) - 1); + } + } + + if (verbosity) + { + printf("Writing file %s\n", outfn); + } + + if (LIBRAW_SUCCESS != (ret = RawProcessor.dcraw_ppm_tiff_writer(outfn))) + fprintf(stderr, "Cannot write %s: %s\n", outfn, libraw_strerror(ret)); + else + done++; + + RawProcessor.recycle(); // just for show this call + + if (use_mmap && mapping.map) + close_mapping(mapping); + else if (use_mem && iobuffer) + { + free(iobuffer); + iobuffer = 0; + } + } +#ifdef USE_DNGSDK + if (dnghost) + delete dnghost; +#endif + if (total == 0) + return 1; + if (done < total) + return 2; + return 0; +} diff --git a/rtengine/libraw/samples/dcraw_half.c b/rtengine/libraw/samples/dcraw_half.c new file mode 100644 index 000000000..233cbe0c7 --- /dev/null +++ b/rtengine/libraw/samples/dcraw_half.c @@ -0,0 +1,78 @@ +/* -*- C++ -*- + * File: dcraw_half.c + * Copyright 2008-2024 LibRaw LLC (info@libraw.org) + * Created: Sat Mar 8 , 2008 + * + * LibRaw C API sample: emulates "dcraw -h" + * +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + + */ +#include +#include +#include +#include + +#include "libraw/libraw.h" + +#define HANDLE_FATAL_ERROR(ret) \ + if (ret) \ + { \ + fprintf(stderr, "%s: libraw %s\n", av[i], libraw_strerror(ret)); \ + if (LIBRAW_FATAL_ERROR(ret)) \ + exit(1); \ + } + +#define HANDLE_ALL_ERRORS(ret) \ + if (ret) \ + { \ + fprintf(stderr, "%s: libraw %s\n", av[i], libraw_strerror(ret)); \ + continue; \ + } + +int main(int ac, char *av[]) +{ + int i; + libraw_data_t *iprc = libraw_init(0); + + if (!iprc) + { + fprintf(stderr, "Cannot create libraw handle\n"); + exit(1); + } + + iprc->params.half_size = 1; /* dcraw -h */ + + for (i = 1; i < ac; i++) + { + char outfn[1024]; + int ret = libraw_open_file(iprc, av[i]); + HANDLE_ALL_ERRORS(ret); + + printf("Processing %s (%s %s)\n", av[i], iprc->idata.make, + iprc->idata.model); + + ret = libraw_unpack(iprc); + HANDLE_ALL_ERRORS(ret); + + ret = libraw_dcraw_process(iprc); + HANDLE_ALL_ERRORS(ret); + + strcpy(outfn, av[i]); + strcat(outfn, ".ppm"); + printf("Writing to %s\n", outfn); + + ret = libraw_dcraw_ppm_tiff_writer(iprc, outfn); + HANDLE_FATAL_ERROR(ret); + } + libraw_close(iprc); + return 0; +} diff --git a/rtengine/libraw/samples/half_mt.c b/rtengine/libraw/samples/half_mt.c new file mode 100644 index 000000000..c8cda4c7d --- /dev/null +++ b/rtengine/libraw/samples/half_mt.c @@ -0,0 +1,178 @@ +/* -*- C++ -*- + * File: halt_mt.c + * Copyright 2008-2024 LibRaw LLC (info@libraw.org) + * Created: Sat Mar 8, 2008 + * + * LibRaw C API mutithreaded sample: emulates call to "dcraw -h [-w] [-a] +[-v]" + * + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + + */ +#include +#include +#include +#include +#include + +#include "libraw/libraw.h" + +#define HANDLE_ERRORS(ret) \ + do \ + { \ + if (ret) \ + { \ + fprintf(stderr, "%s: %s\n", fn, libraw_strerror(ret)); \ + if (LIBRAW_FATAL_ERROR(ret)) \ + { \ + libraw_close(iprc); \ + return NULL; \ + } \ + } \ + } while (0) + +int verbose = 0, use_camera_wb = 0, use_auto_wb = 0, tiff_mode = 0; + +pthread_mutex_t qm; +char **queue = NULL; +size_t qsize = 0, qptr = 0; + +char *get_next_file() +{ + char *ret; + if (!queue) + return NULL; + if (qptr >= qsize) + return NULL; + pthread_mutex_lock(&qm); + ret = queue[qptr++]; + pthread_mutex_unlock(&qm); + return ret; +} + +void *process_files(void *q) +{ + int ret; + int count = 0; + char outfn[1024], *fn; + libraw_data_t *iprc = libraw_init(0); + + if (!iprc) + { + fprintf(stderr, "Cannot create libraw handle\n"); + return NULL; + } + + while ((fn = get_next_file())) + { + + iprc->params.half_size = 1; /* dcraw -h */ + iprc->params.use_camera_wb = use_camera_wb; + iprc->params.use_auto_wb = use_auto_wb; + iprc->params.output_tiff = tiff_mode; + + ret = libraw_open_file(iprc, fn); + if (verbose) + fprintf(stderr, "%s: %s/%s\n", fn, iprc->idata.make, iprc->idata.model); + HANDLE_ERRORS(ret); + + ret = libraw_unpack(iprc); + HANDLE_ERRORS(ret); + + ret = libraw_dcraw_process(iprc); + HANDLE_ERRORS(ret); + + snprintf(outfn, 1023, "%s.%s", fn, tiff_mode ? "tiff" : "ppm"); + + if (verbose) + fprintf(stderr, "Writing file %s\n", outfn); + ret = libraw_dcraw_ppm_tiff_writer(iprc, outfn); + HANDLE_ERRORS(ret); + count++; + } + libraw_close(iprc); + return NULL; +} + +void usage(const char *p) +{ + printf("%s: Multi-threaded LibRaw sample app. Emulates dcraw -h [-w] [-a]\n", + p); + printf("Options:\n" + "-J n - set parallel job count (default 2)\n" + "-v - verbose\n" + "-w - use camera white balance\n" + "-a - average image for white balance\n"); + exit(1); +} + +int show_files(void *q) +{ + char *p; + int cnt = 0; + while ((p = get_next_file())) + { + printf("%s\n", p); + cnt++; + } + return cnt; +} + +int main(int ac, char *av[]) +{ + int i, max_threads = 2; + pthread_t *threads; + if (ac < 2) + usage(av[0]); + + queue = calloc(ac - 1, sizeof(queue[0])); + + for (i = 1; i < ac; i++) + { + if (av[i][0] == '-') + { + if (av[i][1] == 'w') + use_camera_wb = 1; + if (av[i][1] == 'a') + use_auto_wb = 1; + if (av[i][1] == 'v') + verbose = 1; + if (av[i][1] == 'T') + tiff_mode = 1; + if (av[i][1] == 'J') + { + max_threads = atoi(av[++i]); + if (max_threads < 1) + { + fprintf(stderr, "Job count should be at least 1\n"); + exit(1); + } + } + } + else + queue[qsize++] = av[i]; + } + pthread_mutex_init(&qm, NULL); + threads = calloc(max_threads, sizeof(threads[0])); + for (i = 0; i < max_threads; i++) + pthread_create(&threads[i], NULL, process_files, NULL); + for (i = 0; i < max_threads; i++) + { + int *iptr; + if (threads[i]) + { + pthread_join(threads[i], (void *)&iptr); + } + } + + return 0; +} diff --git a/rtengine/libraw/samples/half_mt_win32.c b/rtengine/libraw/samples/half_mt_win32.c new file mode 100644 index 000000000..85713370b --- /dev/null +++ b/rtengine/libraw/samples/half_mt_win32.c @@ -0,0 +1,212 @@ +/* -*- C++ -*- + * File: halt_mt_win32.c + * Copyright 2008-2024 LibRaw LLC (info@libraw.org) + * Created: Sat Mar 8, 2008 + * + * LibRaw C API mutithreaded sample: emulates call to "dcraw -h [-w] [-a] +[-v]" + * Win32 version + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + + */ +#include +#include +#include +#include +#include +#include "libraw/libraw.h" + +#ifdef LIBRAW_WIN32_CALLS +#define snprintf _snprintf +#endif + +#define HANDLE_ERRORS(ret) \ + do \ + { \ + if (ret) \ + { \ + fprintf(stderr, "%s: %s\n", fn, libraw_strerror(ret)); \ + if (LIBRAW_FATAL_ERROR(ret)) \ + { \ + libraw_close(iprc); \ + return -1; \ + } \ + } \ + } while (0) + +// global settings +int verbose = 0, use_camera_wb = 0, use_auto_wb = 0, tiff_mode = 0; + +// global file queue +HANDLE qmutex; +char **queue = NULL; +size_t qsize = 0, qptr = 0; + +char *get_next_file() +{ + char *ret; + DWORD dwWaitResult; + if (!queue) + return NULL; + if (qptr >= qsize) + return NULL; + + dwWaitResult = WaitForSingleObject(qmutex, // handle to mutex + INFINITE); // no time-out interval + switch (dwWaitResult) + { + // The thread got ownership of the mutex + case WAIT_OBJECT_0: + ret = queue[qptr++]; + ReleaseMutex(qmutex); + break; + case WAIT_ABANDONED: + return NULL; // cannot obtain the lock + }; + return ret; +} + +// thread routine +int process_files(void *q) +{ + int ret; + int count = 0; + char outfn[1024], *fn; + libraw_data_t *iprc = libraw_init(0); + + if (!iprc) + { + fprintf(stderr, "Cannot create libraw handle\n"); + return -1; + } + + while ((fn = get_next_file())) + { + + iprc->params.half_size = 1; /* dcraw -h */ + iprc->params.use_camera_wb = use_camera_wb; + iprc->params.use_auto_wb = use_auto_wb; + iprc->params.output_tiff = tiff_mode; + + ret = libraw_open_file(iprc, fn); + if (verbose) + fprintf(stderr, "%s: %s/%s\n", fn, iprc->idata.make, iprc->idata.model); + HANDLE_ERRORS(ret); + + ret = libraw_unpack(iprc); + HANDLE_ERRORS(ret); + + ret = libraw_dcraw_process(iprc); + HANDLE_ERRORS(ret); + + snprintf(outfn, 1023, "%s.%s", fn, tiff_mode ? "tif" : "ppm"); + + if (verbose) + fprintf(stderr, "Writing file %s\n", outfn); + ret = libraw_dcraw_ppm_tiff_writer(iprc, outfn); + HANDLE_ERRORS(ret); + count++; + } + libraw_close(iprc); + printf("Processed %d files\n", count); + return 0; +} + +void usage(const char *p) +{ + printf("Options:\n" + "-J n - set parallel job count (default 2)\n" + "-v - verbose\n" + "-w - use camera white balance\n" + "-T - output TIFF instead of PPM\n" + "-a - average image for white balance\n"); + exit(1); +} + +int show_files(void *q) +{ + char *p; + int cnt = 0; + while (p = get_next_file()) + { + printf("%s\n", p); + cnt++; + } + return cnt; +} + +int main(int ac, char *av[]) +{ + int i, max_threads = 2; + HANDLE *threads; + DWORD ThreadID; + + if (ac < 2) + usage(av[0]); + + queue = calloc(ac - 1, sizeof(queue[0])); + + for (i = 1; i < ac; i++) + { + if (av[i][0] == '-') + { + if (av[i][1] == 'w') + use_camera_wb = 1; + if (av[i][1] == 'a') + use_auto_wb = 1; + if (av[i][1] == 'v') + verbose = 1; + if (av[i][1] == 'T') + tiff_mode = 1; + if (av[i][1] == 'J') + { + max_threads = atoi(av[++i]); + if (max_threads < 1) + { + fprintf(stderr, "Job count should be at least 1\n"); + exit(1); + } + } + } + else + queue[qsize++] = av[i]; + } + qmutex = CreateMutex(NULL, FALSE, NULL); + threads = calloc(max_threads, sizeof(threads[0])); + for (i = 0; i < max_threads; i++) + { + + if (NULL == + (threads[i] = CreateThread(NULL, // default security attributes + 0, // default stack size + (LPTHREAD_START_ROUTINE)process_files, + NULL, // no thread function arguments + 0, // default creation flags + &ThreadID) // receive thread identifier + )) + { + printf("CreateThread error: %d\n", GetLastError()); + return 1; + } + } + + WaitForMultipleObjects(max_threads, threads, TRUE, INFINITE); + + // Close thread and mutex handles + + for (i = 0; i < max_threads; i++) + CloseHandle(threads[i]); + + CloseHandle(qmutex); + + return 0; +} diff --git a/rtengine/libraw/samples/mem_image_sample.cpp b/rtengine/libraw/samples/mem_image_sample.cpp new file mode 100644 index 000000000..3ea315b2f --- /dev/null +++ b/rtengine/libraw/samples/mem_image_sample.cpp @@ -0,0 +1,282 @@ +/* -*- C++ -*- + * File: mem_image.cpp + * Copyright 2008-2024 LibRaw LLC (info@libraw.org) + * + * LibRaw mem_image/mem_thumb API test. Results should be same (bitwise) to +dcraw [-4] [-6] [-e] + * Testing note: for ppm-thumbnails you should use dcraw -w -e for thumbnail +extraction + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + + */ +#include +#include +#include + +#include "libraw/libraw.h" + +#ifdef USE_JPEG +#include "jpeglib.h" +#endif + +#ifdef LIBRAW_WIN32_CALLS +#define snprintf _snprintf +#include +#pragma comment(lib, "ws2_32.lib") +#else +#include +#endif + +#ifdef USE_JPEG +void write_jpeg(libraw_processed_image_t *img, const char *basename, int quality) +{ + char fn[1024]; + if(img->colors != 1 && img->colors != 3) + { + printf("Only BW and 3-color images supported for JPEG output\n"); + return; + } + snprintf(fn, 1024, "%s.jpg", basename); + FILE *f = fopen(fn, "wb"); + if (!f) + return; + struct jpeg_compress_struct cinfo; + struct jpeg_error_mgr jerr; + JSAMPROW row_pointer[1]; /* pointer to JSAMPLE row[s] */ + int row_stride; /* physical row width in image buffer */ + + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_compress(&cinfo); + jpeg_stdio_dest(&cinfo, f); + cinfo.image_width = img->width; /* image width and height, in pixels */ + cinfo.image_height = img->height; + cinfo.input_components = img->colors; /* # of color components per pixel */ + cinfo.in_color_space = img->colors==3?JCS_RGB:JCS_GRAYSCALE; /* colorspace of input image */ + jpeg_set_defaults(&cinfo); + jpeg_set_quality(&cinfo, quality, TRUE); + jpeg_start_compress(&cinfo, TRUE); + row_stride = img->width * img->colors; /* JSAMPLEs per row in image_buffer */ + while (cinfo.next_scanline < cinfo.image_height) { + row_pointer[0] = &img->data[cinfo.next_scanline * row_stride]; + (void)jpeg_write_scanlines(&cinfo, row_pointer, 1); + } + jpeg_finish_compress(&cinfo); + fclose(f); + jpeg_destroy_compress(&cinfo); +} + +#endif + +// no error reporting, only params check +void write_ppm(libraw_processed_image_t *img, const char *basename) +{ + if (!img) + return; + // type SHOULD be LIBRAW_IMAGE_BITMAP, but we'll check + if (img->type != LIBRAW_IMAGE_BITMAP) + return; + if (img->colors != 3 && img->colors != 1) + { + printf("Only monochrome and 3-color images supported for PPM output\n"); + return; + } + + char fn[1024]; + snprintf(fn, 1024, "%s.p%cm", basename, img->colors==1?'g':'p'); + FILE *f = fopen(fn, "wb"); + if (!f) + return; + fprintf(f, "P%d\n%d %d\n%d\n", img->colors/2 + 5, img->width, img->height, (1 << img->bits) - 1); +/* + NOTE: + data in img->data is not converted to network byte order. + So, we should swap values on some architectures for dcraw compatibility + (unfortunately, xv cannot display 16-bit PPMs with network byte order data +*/ +#define SWAP(a, b) \ + { \ + a ^= b; \ + a ^= (b ^= a); \ + } + if (img->bits == 16 && htons(0x55aa) != 0x55aa) + for (unsigned i = 0; i < img->data_size-1; i += 2) + SWAP(img->data[i], img->data[i + 1]); +#undef SWAP + + fwrite(img->data, img->data_size, 1, f); + fclose(f); +} + +void write_thumb(libraw_processed_image_t *img, const char *basename) +{ + if (!img) + return; + + if (img->type == LIBRAW_IMAGE_BITMAP) + { + char fnt[1024]; + snprintf(fnt, 1024, "%s.thumb", basename); + write_ppm(img, fnt); + } + else if (img->type == LIBRAW_IMAGE_JPEG) + { + char fn[1024]; + snprintf(fn, 1024, "%s.thumb.jpg", basename); + FILE *f = fopen(fn, "wb"); + if (!f) + return; + fwrite(img->data, img->data_size, 1, f); + fclose(f); + } +} + +int main(int ac, char *av[]) +{ + int i, ret, output_thumbs = 0; +#ifdef USE_JPEG + int output_jpeg = 0, jpgqual = 90; +#endif + // don't use fixed size buffers in real apps! + + LibRaw RawProcessor; + + if (ac < 2) + { + printf("mem_image - LibRaw sample, to illustrate work for memory buffers.\n" + "Emulates dcraw [-4] [-1] [-e] [-h]\n" +#ifdef USE_JPEG + "Usage: %s [-D] [-j[nn]] [-T] [-v] [-e] raw-files....\n" +#else + "Usage: %s [-D] [-T] [-v] [-e] raw-files....\n" +#endif + "\t-6 - output 16-bit PPM\n" + "\t-4 - linear 16-bit data\n" + "\t-e - extract thumbnails (same as dcraw -e in separate run)\n" +#ifdef USE_JPEG + "\t-j[qual] - output JPEG with qual quality (e.g. -j90)\n" +#endif + "\t-h - use half_size\n", av[0]); + return 0; + } + + putenv((char *)"TZ=UTC"); // dcraw compatibility, affects TIFF datestamp field + +#define P1 RawProcessor.imgdata.idata +#define S RawProcessor.imgdata.sizes +#define C RawProcessor.imgdata.color +#define T RawProcessor.imgdata.thumbnail +#define P2 RawProcessor.imgdata.other +#define OUT RawProcessor.imgdata.params + + for (i = 1; i < ac; i++) + { + if (av[i][0] == '-') + { + if (av[i][1] == '6' && av[i][2] == 0) + OUT.output_bps = 16; + if (av[i][1] == '4' && av[i][2] == 0) + { + OUT.output_bps = 16; + OUT.gamm[0] = OUT.gamm[1] = OUT.no_auto_bright = 1; + } + if (av[i][1] == 'e' && av[i][2] == 0) + output_thumbs++; + if (av[i][1] == 'h' && av[i][2] == 0) + OUT.half_size = 1; +#ifdef USE_JPEG + if (av[i][1] == 'j') + { + output_jpeg = 1; + if(av[i][2] != 0) + jpgqual = atoi(av[i]+2); + } +#endif + continue; + } +#ifdef USE_JPEG + if(output_jpeg && OUT.output_bps>8) + { + printf("JPEG is limited to 8 bit\n"); + OUT.output_bps = 8; + } +#endif + printf("Processing %s\n", av[i]); + if ((ret = RawProcessor.open_file(av[i])) != LIBRAW_SUCCESS) + { + fprintf(stderr, "Cannot open %s: %s\n", av[i], libraw_strerror(ret)); + continue; // no recycle b/c open file will recycle itself + } + + if ((ret = RawProcessor.unpack()) != LIBRAW_SUCCESS) + { + fprintf(stderr, "Cannot unpack %s: %s\n", av[i], libraw_strerror(ret)); + continue; + } + + // we should call dcraw_process before thumbnail extraction because for + // some cameras (i.e. Kodak ones) white balance for thumbnail should be set + // from main image settings + + ret = RawProcessor.dcraw_process(); + + if (LIBRAW_SUCCESS != ret) + { + fprintf(stderr, "Cannot do postprocessing on %s: %s\n", av[i], + libraw_strerror(ret)); + if (LIBRAW_FATAL_ERROR(ret)) + continue; + } + libraw_processed_image_t *image = RawProcessor.dcraw_make_mem_image(&ret); + if (image) + { +#ifdef USE_JPEG + if(output_jpeg) + write_jpeg(image, av[i], jpgqual); + else +#endif + write_ppm(image, av[i]); + LibRaw::dcraw_clear_mem(image); + } + else + fprintf(stderr, "Cannot unpack %s to memory buffer: %s\n", av[i], + libraw_strerror(ret)); + + if (output_thumbs) + { + + if ((ret = RawProcessor.unpack_thumb()) != LIBRAW_SUCCESS) + { + fprintf(stderr, "Cannot unpack_thumb %s: %s\n", av[i], + libraw_strerror(ret)); + if (LIBRAW_FATAL_ERROR(ret)) + continue; // skip to next file + } + else + { + libraw_processed_image_t *thumb = + RawProcessor.dcraw_make_mem_thumb(&ret); + if (thumb) + { + write_thumb(thumb, av[i]); + LibRaw::dcraw_clear_mem(thumb); + } + else + fprintf(stderr, + "Cannot unpack thumbnail of %s to memory buffer: %s\n", av[i], + libraw_strerror(ret)); + } + } + + RawProcessor.recycle(); // just for show this call + } + return 0; +} diff --git a/rtengine/libraw/samples/multirender_test.cpp b/rtengine/libraw/samples/multirender_test.cpp new file mode 100644 index 000000000..a77db76db --- /dev/null +++ b/rtengine/libraw/samples/multirender_test.cpp @@ -0,0 +1,107 @@ +/* -*- C++ -*- + * File: multirender_test.cpp + * Copyright 2008-2024 LibRaw LLC (info@libraw.org) + * Created: Jul 10, 2011 + * + * LibRaw simple C++ API: creates 8 different renderings from 1 source file. +The 1st and 4th one should be identical + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + + */ +#include +#include +#include +#include "libraw/libraw.h" + +#ifndef LIBRAW_WIN32_CALLS +#include +#include +#include +#include +#endif + +#ifdef LIBRAW_WIN32_CALLS +#define snprintf _snprintf +#endif + +int process_once(LibRaw &RawProcessor, int half_mode, int camera_wb, + int auto_wb, int suffix, int user_flip, char *fname) +{ + char outfn[1024]; + RawProcessor.imgdata.params.half_size = half_mode; + RawProcessor.imgdata.params.use_camera_wb = camera_wb; + RawProcessor.imgdata.params.use_auto_wb = auto_wb; + RawProcessor.imgdata.params.user_flip = user_flip; + + int ret = RawProcessor.dcraw_process(); + + if (LIBRAW_SUCCESS != ret) + { + fprintf(stderr, "Cannot do postprocessing on %s: %s\n", fname, + libraw_strerror(ret)); + return ret; + } + snprintf(outfn, sizeof(outfn), "%s.%d.%s", fname, suffix, + (RawProcessor.imgdata.idata.colors > 1 ? "ppm" : "pgm")); + + printf("Writing file %s\n", outfn); + + if (LIBRAW_SUCCESS != (ret = RawProcessor.dcraw_ppm_tiff_writer(outfn))) + fprintf(stderr, "Cannot write %s: %s\n", outfn, libraw_strerror(ret)); + return ret; +} + +int main(int ac, char *av[]) +{ + int i, ret; + + LibRaw RawProcessor; + if (ac < 2) + { + printf("multirender_test - LibRaw %s sample. Performs 4 different " + "renderings of one file\n" + " %d cameras supported\n" + "Usage: %s raw-files....\n", + LibRaw::version(), LibRaw::cameraCount(), av[0]); + return 0; + } + + for (i = 1; i < ac; i++) + { + + printf("Processing file %s\n", av[i]); + + if ((ret = RawProcessor.open_file(av[i])) != LIBRAW_SUCCESS) + { + fprintf(stderr, "Cannot open_file %s: %s\n", av[i], libraw_strerror(ret)); + continue; // no recycle b/c open file will recycle itself + } + + if ((ret = RawProcessor.unpack()) != LIBRAW_SUCCESS) + { + fprintf(stderr, "Cannot unpack %s: %s\n", av[i], libraw_strerror(ret)); + continue; + } + process_once(RawProcessor, 0, 0, 0, 1, -1, av[i]); // default flip + process_once(RawProcessor, 1, 0, 1, 2, -1, av[i]); + process_once(RawProcessor, 1, 1, 0, 3, -1, av[i]); // default flip + process_once(RawProcessor, 1, 1, 0, 4, 1, av[i]); // flip 1 + process_once(RawProcessor, 1, 1, 0, 5, 3, av[i]); // flip 3 + process_once(RawProcessor, 1, 1, 0, 6, 1, av[i]); // 1 again same as 4 + process_once(RawProcessor, 1, 1, 0, 7, -1, + av[i]); // default again, same as 3 + process_once(RawProcessor, 0, 0, 0, 8, -1, av[i]); // same as 1 + + RawProcessor.recycle(); // just for show this call + } + return 0; +} diff --git a/rtengine/libraw/samples/openbayer_sample.cpp b/rtengine/libraw/samples/openbayer_sample.cpp new file mode 100644 index 000000000..a700535e1 --- /dev/null +++ b/rtengine/libraw/samples/openbayer_sample.cpp @@ -0,0 +1,65 @@ +/* -*- C++ -*- + * File: openvayer_sample.cpp + * Copyright 2008-2024 LibRaw LLC (info@libraw.org) + * Created: Feb 11, 2020 + * + * LibRaw simple C++ API: opens bayer data (Kodak KAI-0340 sensor) from buffer, +dump as 8-bit tiff + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include +#include +#include + +#include "libraw/libraw.h" + +#ifndef LIBRAW_WIN32_CALLS +#include +#include +#include +#include +#endif + +int main(int ac, char *av[]) +{ + if (ac != 2) + return 1; + FILE *in = fopen(av[1], "rb"); + fseek(in, 0, SEEK_END); + unsigned fsz = ftell(in); + unsigned char *buffer = (unsigned char *)malloc(fsz); + if (!buffer) + return 2; + fseek(in, 0, SEEK_SET); + unsigned readb = fread(buffer, 1, fsz, in); + if (readb != fsz) + return 3; + LibRaw rp; + rp.imgdata.params.output_tiff = 1; + int ret = rp.open_bayer(buffer, fsz, 640, 480, 0, 0, 0, 0, 0, + LIBRAW_OPENBAYER_RGGB, 0, 0, 1400); + if (ret != LIBRAW_SUCCESS) + return 4; + if ((ret = rp.unpack()) != LIBRAW_SUCCESS) + printf("Unpack error: %d\n", ret); + + if ((ret = rp.dcraw_process()) != LIBRAW_SUCCESS) + printf("Processing error: %d\n", ret); + + char outfn[256]; + sprintf(outfn, "%s.tif", av[1]); + if (LIBRAW_SUCCESS != (ret = rp.dcraw_ppm_tiff_writer(outfn))) + printf("Cannot write %s: %s\n", outfn, libraw_strerror(ret)); + else + printf("Created %s\n", outfn); +} diff --git a/rtengine/libraw/samples/postprocessing_benchmark.cpp b/rtengine/libraw/samples/postprocessing_benchmark.cpp new file mode 100644 index 000000000..778c68a79 --- /dev/null +++ b/rtengine/libraw/samples/postprocessing_benchmark.cpp @@ -0,0 +1,223 @@ +/* -*- C++ -*- + * File: postprocessing_benchmark.cpp + * Copyright 2008-2024 LibRaw LLC (info@libraw.org) + * Created: Jul 13, 2011 + * + * LibRaw simple C++ API: creates 8 different renderings from 1 source file. +The 1st and 4th one should be identical + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ +#include +#include +#include + +#include "libraw/libraw.h" + +#ifndef LIBRAW_WIN32_CALLS +#include +#include +#include +#else +#include +#endif + +#include "libraw/libraw.h" + +void timerstart(void); +float timerend(void); + +int main(int argc, char *argv[]) +{ + int i, ret, rep = 1; + LibRaw RawProcessor; +#ifdef OUT +#undef OUT +#endif +#define OUT RawProcessor.imgdata.params +#define OUTR RawProcessor.imgdata.rawparams +#define S RawProcessor.imgdata.sizes + + if (argc < 2) + { + printf( + "postprocessing benchmark: LibRaw %s sample, %d cameras supported\n" + "Measures postprocessing speed with different options\n" + "Usage: %s [-a] [-H N] [-q N] [-h] [-m N] [-n N] [-s N] [-B x y w h] " + "[-R N]\n" + "-a average image for white balance\n" + "-H Highlight mode (0=clip, 1=unclip, 2=blend, " + "3+=rebuild)\n" + "-q Set the interpolation quality\n" + "-h Half-size color image\n" + "-m Apply a num-passes 3x3 median filter to R-G and B-G\n" + "-n Set threshold for wavelet denoising\n" + "-s Select one raw image from input file\n" + "-B Crop output image\n" + "-R Number of repetitions\n" + "-c Do not use rawspeed\n", + LibRaw::version(), LibRaw::cameraCount(), argv[0]); + return 0; + } + char opm, opt, *cp, *sp; + int arg, c; + int shrink = 0; + + argv[argc] = (char *)""; + for (arg = 1; (((opm = argv[arg][0]) - 2) | 2) == '+';) + { + char *optstr = argv[arg]; + opt = argv[arg++][1]; + if ((cp = strchr(sp = (char *)"HqmnsBR", opt)) != 0) + for (i = 0; i < "1111141"[cp - sp] - '0'; i++) + if (!isdigit(argv[arg + i][0]) && !optstr[2]) + { + fprintf(stderr, "Non-numeric argument to \"-%c\"\n", opt); + return 1; + } + switch (opt) + { + case 'a': + OUT.use_auto_wb = 1; + break; + case 'H': + OUT.highlight = atoi(argv[arg++]); + break; + case 'q': + OUT.user_qual = atoi(argv[arg++]); + break; + case 'h': + OUT.half_size = 1; + OUT.four_color_rgb = 1; + shrink = 1; + break; + case 'm': + OUT.med_passes = atoi(argv[arg++]); + break; + case 'n': + OUT.threshold = (float)atof(argv[arg++]); + break; + case 's': + OUTR.shot_select = abs(atoi(argv[arg++])); + break; + case 'B': + for (c = 0; c < 4; c++) + OUT.cropbox[c] = atoi(argv[arg++]); + break; + case 'R': + rep = abs(atoi(argv[arg++])); + if (rep < 1) + rep = 1; + break; + case 'c': + RawProcessor.imgdata.rawparams.use_rawspeed = 0; + break; + default: + fprintf(stderr, "Unknown option \"-%c\".\n", opt); + return 1; + } + } + for (; arg < argc; arg++) + { + printf("Processing file %s\n", argv[arg]); + timerstart(); + if ((ret = RawProcessor.open_file(argv[arg])) != LIBRAW_SUCCESS) + { + fprintf(stderr, "Cannot open_file %s: %s\n", argv[arg], + libraw_strerror(ret)); + continue; // no recycle b/c open file will recycle itself + } + + if ((ret = RawProcessor.unpack()) != LIBRAW_SUCCESS) + { + fprintf(stderr, "Cannot unpack %s: %s\n", argv[arg], + libraw_strerror(ret)); + continue; + } + float qsec = timerend(); + printf("\n%.1f msec for unpack\n", qsec); + float mpix, rmpix; + timerstart(); + for (c = 0; c < rep; c++) + { + if ((ret = RawProcessor.dcraw_process()) != LIBRAW_SUCCESS) + { + fprintf(stderr, "Cannot postprocess %s: %s\n", argv[arg], + libraw_strerror(ret)); + break; + } + libraw_processed_image_t *p = RawProcessor.dcraw_make_mem_image(); + if (p) + RawProcessor.dcraw_clear_mem(p); + RawProcessor.free_image(); + } + float msec = timerend() / (float)rep; + + if ((ret = RawProcessor.adjust_sizes_info_only()) != LIBRAW_SUCCESS) + { + fprintf(stderr, "Cannot adjust sizes for %s: %s\n", argv[arg], + libraw_strerror(ret)); + break; + } + rmpix = (S.iwidth * S.iheight) / 1000000.0f; + + if (c == rep) // no failure + { + unsigned int crop[4]; + for (int i = 0; i < 4; i++) + crop[i] = (OUT.cropbox[i]) >> shrink; + if (crop[0] + crop[2] > S.iwidth) + crop[2] = S.iwidth - crop[0]; + if (crop[1] + crop[3] > S.iheight) + crop[3] = S.iheight - crop[1]; + + mpix = float(crop[2] * crop[3]) / 1000000.0f; + float mpixsec = mpix * 1000.0f / msec; + + printf("Performance: %.2f Mpix/sec\n" + "File: %s, Frame: %d %.1f total Mpix, %.1f msec\n" + "Params: WB=%s Highlight=%d Qual=%d HalfSize=%s Median=%d " + "Wavelet=%.0f\n" + "Crop: %u-%u:%ux%u, active Mpix: %.2f, %.1f frames/sec\n", + mpixsec, argv[arg], OUTR.shot_select, rmpix, msec, + OUT.use_auto_wb ? "auto" : "default", OUT.highlight, OUT.user_qual, + OUT.half_size ? "YES" : "No", OUT.med_passes, OUT.threshold, + crop[0], crop[1], crop[2], crop[3], mpix, 1000.0f / msec); + } + } + + return 0; +} + +#ifndef LIBRAW_WIN32_CALLS +static struct timeval start, end; +void timerstart(void) { gettimeofday(&start, NULL); } +float timerend(void) +{ + gettimeofday(&end, NULL); + float msec = (end.tv_sec - start.tv_sec) * 1000.0f + + (end.tv_usec - start.tv_usec) / 1000.0f; + return msec; +} +#else +LARGE_INTEGER start; +void timerstart(void) { QueryPerformanceCounter(&start); } +float timerend() +{ + LARGE_INTEGER unit, end; + QueryPerformanceCounter(&end); + QueryPerformanceFrequency(&unit); + float msec = (float)(end.QuadPart - start.QuadPart); + msec /= (float)unit.QuadPart / 1000.0f; + return msec; +} + +#endif diff --git a/rtengine/libraw/samples/raw-identify.cpp b/rtengine/libraw/samples/raw-identify.cpp new file mode 100644 index 000000000..5c5b29a8c --- /dev/null +++ b/rtengine/libraw/samples/raw-identify.cpp @@ -0,0 +1,743 @@ +/* -*- C++ -*- + * File: identify.cpp + * Copyright 2008-2024 LibRaw LLC (info@libraw.org) + * Created: Sat Mar 8, 2008 + * + * LibRaw C++ demo: emulates dcraw -i [-v] + * + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + + */ + +#include +#include +#include +#include +#include +#include + +#include "libraw/libraw.h" + +#ifdef LIBRAW_WIN32_CALLS +#define snprintf _snprintf +#define strcasecmp stricmp +#define strncasecmp strnicmp +#endif + +#ifndef LIBRAW_WIN32_CALLS +#include +#include +#include +#include +#include +#ifndef MAX_PATH +#ifdef PATH_MAX +#define MAX_PATH PATH_MAX +#else +#define MAX_PATH 4096 +#endif +#endif +#endif + +#ifdef _MSC_VER +#if _MSC_VER < 1800 /* below MSVC 2013 */ +float roundf(float f) { return floorf(f + 0.5); } + +#endif +#endif + +#define P1 MyCoolRawProcessor.imgdata.idata +#define P2 MyCoolRawProcessor.imgdata.other +#define P3 MyCoolRawProcessor.imgdata.makernotes.common + +#define mnLens MyCoolRawProcessor.imgdata.lens.makernotes +#define exifLens MyCoolRawProcessor.imgdata.lens +#define ShootingInfo MyCoolRawProcessor.imgdata.shootinginfo + +#define S MyCoolRawProcessor.imgdata.sizes +#define O MyCoolRawProcessor.imgdata.params +#define C MyCoolRawProcessor.imgdata.color +#define T MyCoolRawProcessor.imgdata.thumbnail + +void print_verbose(FILE *, LibRaw &MyCoolRawProcessor, std::string &fn); +void print_wbfun(FILE *, LibRaw &MyCoolRawProcessor, std::string &fn); +void print_szfun(FILE *, LibRaw &MyCoolRawProcessor, std::string &fn); +void print_unpackfun(FILE *, LibRaw &MyCoolRawProcessor, int print_frame, std::string &fn); + +/* +table of fluorescents: +12 = FL-D; Daylight fluorescent (D 5700K – 7100K) (F1,F5) +13 = FL-N; Day white fluorescent (N 4600K – 5400K) (F7,F8) +14 = FL-W; Cool white fluorescent (W 3900K – 4500K) (F2,F6, office, +store,warehouse) 15 = FL-WW; White fluorescent (WW 3200K – 3700K) (F3, +residential) 16 = FL-L; Soft/Warm white fluorescent (L 2600K - 3250K) (F4, +kitchen, bath) +*/ + +static const struct +{ + const int NumId; + const char *StrId; + const char *hrStrId; // human-readable + const int aux_setting; +} WBToStr[] = { + {LIBRAW_WBI_Unknown, "WBI_Unknown", "Unknown", 0}, + {LIBRAW_WBI_Daylight, "WBI_Daylight", "Daylight", 0}, + {LIBRAW_WBI_Fluorescent, "WBI_Fluorescent", "Fluorescent", 0}, + {LIBRAW_WBI_Tungsten, "WBI_Tungsten", "Tungsten (Incandescent)", 0}, + {LIBRAW_WBI_Flash, "WBI_Flash", "Flash", 0}, + {LIBRAW_WBI_FineWeather, "WBI_FineWeather", "Fine Weather", 0}, + {LIBRAW_WBI_Cloudy, "WBI_Cloudy", "Cloudy", 0}, + {LIBRAW_WBI_Shade, "WBI_Shade", "Shade", 0}, + {LIBRAW_WBI_FL_D, "WBI_FL_D", "Daylight Fluorescent", 0}, + {LIBRAW_WBI_FL_N, "WBI_FL_N", "Day White Fluorescent", 0}, + {LIBRAW_WBI_FL_W, "WBI_FL_W", "Cool White Fluorescent", 0}, + {LIBRAW_WBI_FL_WW, "WBI_FL_WW", "White Fluorescent", 0}, + {LIBRAW_WBI_FL_L, "WBI_FL_L", "Warm White Fluorescent", 0}, + {LIBRAW_WBI_Ill_A, "WBI_Ill_A", "Illuminant A", 0}, + {LIBRAW_WBI_Ill_B, "WBI_Ill_B", "Illuminant B", 0}, + {LIBRAW_WBI_Ill_C, "WBI_Ill_C", "Illuminant C", 0}, + {LIBRAW_WBI_D55, "WBI_D55", "D55", 0}, + {LIBRAW_WBI_D65, "WBI_D65", "D65", 0}, + {LIBRAW_WBI_D75, "WBI_D75", "D75", 0}, + {LIBRAW_WBI_D50, "WBI_D50", "D50", 0}, + {LIBRAW_WBI_StudioTungsten, "WBI_StudioTungsten", "ISO Studio Tungsten", 0}, + {LIBRAW_WBI_BW, "WBI_BW", "BW", 0}, + {LIBRAW_WBI_Other, "WBI_Other", "Other", 0}, + {LIBRAW_WBI_Sunset, "WBI_Sunset", "Sunset", 1}, + {LIBRAW_WBI_Underwater, "WBI_Underwater", "Underwater", 1}, + {LIBRAW_WBI_FluorescentHigh, "WBI_FluorescentHigh", "Fluorescent High", 1}, + {LIBRAW_WBI_HT_Mercury, "WBI_HT_Mercury", "HT Mercury", 1}, + {LIBRAW_WBI_AsShot, "WBI_AsShot", "As Shot", 1}, + {LIBRAW_WBI_Measured, "WBI_Measured", "Camera Measured", 1}, + {LIBRAW_WBI_Auto, "WBI_Auto", "Camera Auto", 1}, + {LIBRAW_WBI_Auto1, "WBI_Auto1", "Camera Auto 1", 1}, + {LIBRAW_WBI_Auto2, "WBI_Auto2", "Camera Auto 2", 1}, + {LIBRAW_WBI_Auto3, "WBI_Auto3", "Camera Auto 3", 1}, + {LIBRAW_WBI_Auto4, "WBI_Auto4", "Camera Auto 4", 1}, + {LIBRAW_WBI_Custom, "WBI_Custom", "Custom", 1}, + {LIBRAW_WBI_Custom1, "WBI_Custom1", "Custom 1", 1}, + {LIBRAW_WBI_Custom2, "WBI_Custom2", "Custom 2", 1}, + {LIBRAW_WBI_Custom3, "WBI_Custom3", "Custom 3", 1}, + {LIBRAW_WBI_Custom4, "WBI_Custom4", "Custom 4", 1}, + {LIBRAW_WBI_Custom5, "WBI_Custom5", "Custom 5", 1}, + {LIBRAW_WBI_Custom6, "WBI_Custom6", "Custom 6", 1}, + {LIBRAW_WBI_PC_Set1, "WBI_PC_Set1", "PC Set 1", 1}, + {LIBRAW_WBI_PC_Set2, "WBI_PC_Set2", "PC Set 2", 1}, + {LIBRAW_WBI_PC_Set3, "WBI_PC_Set3", "PC Set 3", 1}, + {LIBRAW_WBI_PC_Set4, "WBI_PC_Set4", "PC Set 4", 1}, + {LIBRAW_WBI_PC_Set5, "WBI_PC_Set5", "PC Set 5", 1}, + {LIBRAW_WBI_Kelvin, "WBI_Kelvin", "Kelvin", 1}, +}; + +const char *WB_idx2str(unsigned WBi) +{ + for (int i = 0; i < int(sizeof WBToStr / sizeof *WBToStr); i++) + if (WBToStr[i].NumId == (int)WBi) + return WBToStr[i].StrId; + return 0; +} + +const char *WB_idx2hrstr(unsigned WBi) +{ + for (int i = 0; i < int(sizeof WBToStr / sizeof *WBToStr); i++) + if (WBToStr[i].NumId == (int)WBi) + return WBToStr[i].hrStrId; + return 0; +} + +double _log2(double a) +{ + if(a > 0.00000000001) return log(a)/log(2.0); + return -1000; +} + +void trimSpaces(char *s) +{ + char *p = s; + if (!strncasecmp(p, "NO=", 3)) + p = p + 3; /* fix for Nikon D70, D70s */ + int l = strlen(p); + if (!l) + return; + while (isspace(p[l - 1])) + p[--l] = 0; /* trim trailing spaces */ + while (*p && isspace(*p)) + ++p, --l; /* trim leading spaces */ + memmove(s, p, l + 1); +} + +void print_usage(const char *pname) +{ + printf("Usage: %s [options] inputfiles\n", pname); + printf("Options:\n" + "\t-v\tverbose output\n" + "\t-w\tprint white balance\n" + "\t-u\tprint unpack function\n" + "\t-f\tprint frame size (only w/ -u)\n" + "\t-s\tprint output image size\n" + "\t-h\tforce half-size mode (only for -s)\n" + "\t-M\tdisable use of raw-embedded color data\n" + "\t+M\tforce use of raw-embedded color data\n" + "\t-L filename\tread input files list from filename\n" + "\t-o filename\toutput to filename\n"); +} + +int main(int ac, char *av[]) +{ + int ret; + int verbose = 0, print_sz = 0, print_unpack = 0, print_frame = 0, print_wb = 0; + LibRaw MyCoolRawProcessor; + char *filelistfile = NULL; + char *outputfilename = NULL; + FILE *outfile = stdout; + std::vector filelist; + + filelist.reserve(ac - 1); + + for (int i = 1; i < ac; i++) + { + if (av[i][0] == '-') + { + if (!strcmp(av[i], "-v")) + verbose++; + if (!strcmp(av[i], "-w")) + print_wb++; + if (!strcmp(av[i], "-u")) + print_unpack++; + if (!strcmp(av[i], "-s")) + print_sz++; + if (!strcmp(av[i], "-h")) + O.half_size = 1; + if (!strcmp(av[i], "-f")) + print_frame++; + if (!strcmp(av[i], "-M")) + MyCoolRawProcessor.imgdata.params.use_camera_matrix = 0; + if (!strcmp(av[i], "-L") && i < ac - 1) + { + filelistfile = av[i + 1]; + i++; + } + if (!strcmp(av[i], "-o") && i < ac - 1) + { + outputfilename = av[i + 1]; + i++; + } + continue; + } + else if (!strcmp(av[i], "+M")) + { + MyCoolRawProcessor.imgdata.params.use_camera_matrix = 3; + continue; + } + filelist.push_back(av[i]); + } + if (filelistfile) + { + char *p; + char path[MAX_PATH + 1]; + FILE *f = fopen(filelistfile, "r"); + if (f) + { + while (fgets(path, MAX_PATH, f)) + { + if ((p = strchr(path, '\n'))) + *p = 0; + if ((p = strchr(path, '\r'))) + *p = 0; + filelist.push_back(path); + } + fclose(f); + } + } + if (filelist.size() < 1) + { + print_usage(av[0]); + return 1; + } + if (outputfilename) + outfile = fopen(outputfilename, "wt"); + + for (int i = 0; i < (int)filelist.size(); i++) + { + if ((ret = MyCoolRawProcessor.open_file(filelist[i].c_str())) != LIBRAW_SUCCESS) + { + fprintf(stderr, "Cannot decode %s: %s\n", filelist[i].c_str(), libraw_strerror(ret)); + continue; // no recycle, open_file will recycle + } + + if (print_sz) + print_szfun(outfile, MyCoolRawProcessor, filelist[i]); + else if (verbose) + print_verbose(outfile, MyCoolRawProcessor, filelist[i]); + else if (print_unpack) + print_unpackfun(outfile, MyCoolRawProcessor, print_frame, filelist[i]); + else if (print_wb) + print_wbfun(outfile, MyCoolRawProcessor, filelist[i]); + else + fprintf(outfile, "%s is a %s %s image.\n", filelist[i].c_str(), P1.make, P1.model); + + MyCoolRawProcessor.recycle(); + } // endfor + return 0; +} + +#define PRINTMATRIX3x4(of, mat, clrs) \ + do \ + { \ + for (int r = 0; r < 3; r++) \ + if (clrs == 4) \ + fprintf(of, "%6.4f\t%6.4f\t%6.4f\t%6.4f\n", mat[r][0], mat[r][1], mat[r][2], mat[r][3]); \ + else \ + fprintf(of, "%6.4f\t%6.4f\t%6.4f\n", mat[r][0], mat[r][1], mat[r][2]); \ + } while (0) + +#define PRINTMATRIX4x3(of, mat, clrs) \ + do \ + { \ + for (int r = 0; r < clrs && r < 4; r++) \ + fprintf(of, "%6.4f\t%6.4f\t%6.4f\n", mat[r][0], mat[r][1], mat[r][2]); \ + } while (0) + +void print_verbose(FILE *outfile, LibRaw &MyCoolRawProcessor, std::string &fn) +{ + int WBi; + float denom; + int ret; + + if ((ret = MyCoolRawProcessor.adjust_sizes_info_only())) + { + fprintf(outfile, "Cannot decode %s: %s\n", fn.c_str(), libraw_strerror(ret)); + return; // no recycle, open_file will recycle + } + + fprintf(outfile, "\nFilename: %s\n", fn.c_str()); + if (C.OriginalRawFileName[0]) + fprintf(outfile, "OriginalRawFileName: =%s=\n", C.OriginalRawFileName); + fprintf(outfile, "Timestamp: %s", ctime(&(P2.timestamp))); + fprintf(outfile, "Camera: %s %s ID: 0x%llx\n", P1.make, P1.model, mnLens.CamID); + fprintf(outfile, "Normalized Make/Model: =%s/%s= ", P1.normalized_make, P1.normalized_model); + fprintf(outfile, "CamMaker ID: %d\n", P1.maker_index); + + { + int i = 0; + char sep[] = ", "; + if (C.UniqueCameraModel[0]) + { + i++; + fprintf(outfile, "UniqueCameraModel: =%s=", C.UniqueCameraModel); + } + if (C.LocalizedCameraModel[0]) + { + if (i) + { + fprintf(outfile, "%s", sep); + i++; + } + fprintf(outfile, "LocalizedCameraModel: =%s=", C.LocalizedCameraModel); + } + if (i) + { + fprintf(outfile, "\n"); + i = 0; + } + if (C.ImageUniqueID[0]) + { + if (i) + fprintf(outfile, "%s", sep); + i++; + fprintf(outfile, "ImageUniqueID: =%s=", C.ImageUniqueID); + } + if (C.RawDataUniqueID[0]) + { + if (i) + fprintf(outfile, "%s", sep); + i++; + fprintf(outfile, "RawDataUniqueID: =%s=", C.RawDataUniqueID); + } + if (i) + fprintf(outfile, "\n"); + } + + if (ShootingInfo.BodySerial[0] && strcmp(ShootingInfo.BodySerial, "0")) + { + trimSpaces(ShootingInfo.BodySerial); + fprintf(outfile, "Body#: %s", ShootingInfo.BodySerial); + } + else if (C.model2[0] && (!strncasecmp(P1.normalized_make, "Kodak", 5))) + { + trimSpaces(C.model2); + fprintf(outfile, "Body#: %s", C.model2); + } + if (ShootingInfo.InternalBodySerial[0]) + { + trimSpaces(ShootingInfo.InternalBodySerial); + fprintf(outfile, " BodyAssy#: %s", ShootingInfo.InternalBodySerial); + } + if (exifLens.LensSerial[0]) + { + trimSpaces(exifLens.LensSerial); + fprintf(outfile, " Lens#: %s", exifLens.LensSerial); + } + if (exifLens.InternalLensSerial[0]) + { + trimSpaces(exifLens.InternalLensSerial); + fprintf(outfile, " LensAssy#: %s", exifLens.InternalLensSerial); + } + if (P2.artist[0]) + fprintf(outfile, " Owner: %s\n", P2.artist); + if (P1.dng_version) + { + fprintf(outfile, " DNG Version: "); + for (int i = 24; i >= 0; i -= 8) + fprintf(outfile, "%d%c", P1.dng_version >> i & 255, i ? '.' : '\n'); + } + fprintf(outfile, "\nEXIF:\n"); + fprintf(outfile, "\tMinFocal: %0.1f mm\n", exifLens.MinFocal); + fprintf(outfile, "\tMaxFocal: %0.1f mm\n", exifLens.MaxFocal); + fprintf(outfile, "\tMaxAp @MinFocal: f/%0.1f\n", exifLens.MaxAp4MinFocal); + fprintf(outfile, "\tMaxAp @MaxFocal: f/%0.1f\n", exifLens.MaxAp4MaxFocal); + fprintf(outfile, "\tCurFocal: %0.1f mm\n", P2.focal_len); + fprintf(outfile, "\tMaxAperture @CurFocal: f/%0.1f\n", exifLens.EXIF_MaxAp); + fprintf(outfile, "\tFocalLengthIn35mmFormat: %d mm\n", exifLens.FocalLengthIn35mmFormat); + fprintf(outfile, "\tLensMake: %s\n", exifLens.LensMake); + fprintf(outfile, "\tLens: %s\n", exifLens.Lens); + fprintf(outfile, "\n"); + + fprintf(outfile, "\nMakernotes:\n"); + fprintf(outfile, "\tDriveMode: %d\n", ShootingInfo.DriveMode); + fprintf(outfile, "\tFocusMode: %d\n", ShootingInfo.FocusMode); + fprintf(outfile, "\tMeteringMode: %d\n", ShootingInfo.MeteringMode); + fprintf(outfile, "\tAFPoint: %d\n", ShootingInfo.AFPoint); + fprintf(outfile, "\tExposureMode: %d\n", ShootingInfo.ExposureMode); + fprintf(outfile, "\tExposureProgram: %d\n", ShootingInfo.ExposureProgram); + fprintf(outfile, "\tImageStabilization: %d\n", ShootingInfo.ImageStabilization); + + fprintf(outfile, "\tLens: %s\n", mnLens.Lens); + fprintf(outfile, "\tLensFormat: %d, ", mnLens.LensFormat); + + fprintf(outfile, "\tLensMount: %d, ", mnLens.LensMount); + fprintf(outfile, "\tFocalType: %d, ", mnLens.FocalType); + switch (mnLens.FocalType) + { + case LIBRAW_FT_UNDEFINED: + fprintf(outfile, "Undefined\n"); + break; + case LIBRAW_FT_PRIME_LENS: + fprintf(outfile, "Prime lens\n"); + break; + case LIBRAW_FT_ZOOM_LENS: + fprintf(outfile, "Zoom lens\n"); + break; + default: + fprintf(outfile, "Unknown\n"); + break; + } + fprintf(outfile, "\tLensFeatures_pre: %s\n", mnLens.LensFeatures_pre); + fprintf(outfile, "\tLensFeatures_suf: %s\n", mnLens.LensFeatures_suf); + fprintf(outfile, "\tMinFocal: %0.1f mm\n", mnLens.MinFocal); + fprintf(outfile, "\tMaxFocal: %0.1f mm\n", mnLens.MaxFocal); + fprintf(outfile, "\tMaxAp @MinFocal: f/%0.1f\n", mnLens.MaxAp4MinFocal); + fprintf(outfile, "\tMaxAp @MaxFocal: f/%0.1f\n", mnLens.MaxAp4MaxFocal); + fprintf(outfile, "\tMinAp @MinFocal: f/%0.1f\n", mnLens.MinAp4MinFocal); + fprintf(outfile, "\tMinAp @MaxFocal: f/%0.1f\n", mnLens.MinAp4MaxFocal); + fprintf(outfile, "\tMaxAp: f/%0.1f\n", mnLens.MaxAp); + fprintf(outfile, "\tMinAp: f/%0.1f\n", mnLens.MinAp); + fprintf(outfile, "\tCurFocal: %0.1f mm\n", mnLens.CurFocal); + fprintf(outfile, "\tCurAp: f/%0.1f\n", mnLens.CurAp); + fprintf(outfile, "\tMaxAp @CurFocal: f/%0.1f\n", mnLens.MaxAp4CurFocal); + fprintf(outfile, "\tMinAp @CurFocal: f/%0.1f\n", mnLens.MinAp4CurFocal); + + if (exifLens.makernotes.FocalLengthIn35mmFormat > 1.0f) + fprintf(outfile, "\tFocalLengthIn35mmFormat: %0.1f mm\n", exifLens.makernotes.FocalLengthIn35mmFormat); + + if (exifLens.nikon.EffectiveMaxAp > 0.1f) + fprintf(outfile, "\tEffectiveMaxAp: f/%0.1f\n", exifLens.nikon.EffectiveMaxAp); + + if (exifLens.makernotes.LensFStops > 0.1f) + fprintf(outfile, "\tLensFStops @CurFocal: %0.2f\n", exifLens.makernotes.LensFStops); + + fprintf(outfile, "\tTeleconverterID: %lld\n", mnLens.TeleconverterID); + fprintf(outfile, "\tTeleconverter: %s\n", mnLens.Teleconverter); + fprintf(outfile, "\tAdapterID: %lld\n", mnLens.AdapterID); + fprintf(outfile, "\tAdapter: %s\n", mnLens.Adapter); + fprintf(outfile, "\tAttachmentID: %lld\n", mnLens.AttachmentID); + fprintf(outfile, "\tAttachment: %s\n", mnLens.Attachment); + fprintf(outfile, "\n"); + + fprintf(outfile, "ISO speed: %d\n", (int)P2.iso_speed); + if (P3.real_ISO > 0.1f) + fprintf(outfile, "real ISO speed: %d\n", (int)P3.real_ISO); + fprintf(outfile, "Shutter: "); + if (P2.shutter > 0 && P2.shutter < 1) + P2.shutter = fprintf(outfile, "1/%0.1f\n", 1.0f / P2.shutter); + else if (P2.shutter >= 1) + fprintf(outfile, "%0.1f sec\n", P2.shutter); + else /* negative*/ + fprintf(outfile, " negative value\n"); + fprintf(outfile, "Aperture: f/%0.1f\n", P2.aperture); + fprintf(outfile, "Focal length: %0.1f mm\n", P2.focal_len); + if (P3.exifAmbientTemperature > -273.15f) + fprintf(outfile, "Ambient temperature (exif data): %6.2f° C\n", P3.exifAmbientTemperature); + if (P3.CameraTemperature > -273.15f) + fprintf(outfile, "Camera temperature: %6.2f° C\n", P3.CameraTemperature); + if (P3.SensorTemperature > -273.15f) + fprintf(outfile, "Sensor temperature: %6.2f° C\n", P3.SensorTemperature); + if (P3.SensorTemperature2 > -273.15f) + fprintf(outfile, "Sensor temperature2: %6.2f° C\n", P3.SensorTemperature2); + if (P3.LensTemperature > -273.15f) + fprintf(outfile, "Lens temperature: %6.2f° C\n", P3.LensTemperature); + if (P3.AmbientTemperature > -273.15f) + fprintf(outfile, "Ambient temperature: %6.2f° C\n", P3.AmbientTemperature); + if (P3.BatteryTemperature > -273.15f) + fprintf(outfile, "Battery temperature: %6.2f° C\n", P3.BatteryTemperature); + if (P3.FlashGN > 1.0f) + fprintf(outfile, "Flash Guide Number: %6.2f\n", P3.FlashGN); + fprintf(outfile, "Flash exposure compensation: %0.2f EV\n", P3.FlashEC); + if (C.profile) + fprintf(outfile, "Embedded ICC profile: yes, %d bytes\n", C.profile_length); + else + fprintf(outfile, "Embedded ICC profile: no\n"); + + if (C.dng_levels.baseline_exposure > -999.f) + fprintf(outfile, "Baseline exposure: %04.3f\n", C.dng_levels.baseline_exposure); + + fprintf(outfile, "Number of raw images: %d\n", P1.raw_count); + + if (S.pixel_aspect != 1) + fprintf(outfile, "Pixel Aspect Ratio: %0.6f\n", S.pixel_aspect); + if (T.tlength) + fprintf(outfile, "Thumb size: %4d x %d\n", T.twidth, T.theight); + fprintf(outfile, "Full size: %4d x %d\n", S.raw_width, S.raw_height); + + if (S.raw_inset_crops[0].cwidth) + { + fprintf(outfile, "Raw inset, width x height: %4d x %d ", S.raw_inset_crops[0].cwidth, S.raw_inset_crops[0].cheight); + if (S.raw_inset_crops[0].cleft != 0xffff) + fprintf(outfile, "left: %d ", S.raw_inset_crops[0].cleft); + if (S.raw_inset_crops[0].ctop != 0xffff) + fprintf(outfile, "top: %d", S.raw_inset_crops[0].ctop); + fprintf(outfile, "\n"); + } + + fprintf(outfile, "Image size: %4d x %d\n", S.width, S.height); + fprintf(outfile, "Output size: %4d x %d\n", S.iwidth, S.iheight); + fprintf(outfile, "Image flip: %d\n", S.flip); + + fprintf(outfile, "Raw colors: %d", P1.colors); + if (P1.filters) + { + fprintf(outfile, "\nFilter pattern: "); + if (!P1.cdesc[3]) + P1.cdesc[3] = 'G'; + for (int i = 0; i < 16; i++) + putchar(P1.cdesc[MyCoolRawProcessor.fcol(i >> 1, i & 1)]); + } + + if (C.black) + { + fprintf(outfile, "\nblack: %d", C.black); + } + if (C.cblack[0] != 0) + { + fprintf(outfile, "\ncblack[0 .. 3]:"); + for (int c = 0; c < 4; c++) + fprintf(outfile, " %d", C.cblack[c]); + } + if ((C.cblack[4] * C.cblack[5]) > 0) + { + fprintf(outfile, "\nBlackLevelRepeatDim: %d x %d\n", C.cblack[4], C.cblack[5]); + int n = C.cblack[4] * C.cblack[5]; + fprintf(outfile, "cblack[6 .. %d]:", 6 + n - 1); + for (int c = 6; c < 6 + n; c++) + fprintf(outfile, " %d", C.cblack[c]); + } + + if (C.linear_max[0] != 0) + { + fprintf(outfile, "\nHighlight linearity limits:"); + for (int c = 0; c < 4; c++) + fprintf(outfile, " %ld", C.linear_max[c]); + } + + if (P1.colors > 1) + { + fprintf(outfile, "\nMakernotes WB data: coeffs EVs"); + if ((C.cam_mul[0] > 0) && (C.cam_mul[1] > 0)) + { + fprintf(outfile, "\n %-23s %g %g %g %g %5.2f %5.2f %5.2f %5.2f", "As shot", C.cam_mul[0], C.cam_mul[1], + C.cam_mul[2], C.cam_mul[3], roundf(_log2(C.cam_mul[0] / C.cam_mul[1]) * 100.0f) / 100.0f, 0.0f, + roundf(_log2(C.cam_mul[2] / C.cam_mul[1]) * 100.0f) / 100.0f, + C.cam_mul[3] ? roundf(_log2(C.cam_mul[3] / C.cam_mul[1]) * 100.0f) / 100.0f : 0.0f); + } + + for (int cnt = 0; cnt < int(sizeof WBToStr / sizeof *WBToStr); cnt++) + { + WBi = WBToStr[cnt].NumId; + if ((C.WB_Coeffs[WBi][0] > 0) && (C.WB_Coeffs[WBi][1] > 0)) + { + denom = (float)C.WB_Coeffs[WBi][1]; + fprintf(outfile, "\n %-23s %4d %4d %4d %4d %5.2f %5.2f %5.2f %5.2f", WBToStr[cnt].hrStrId, + C.WB_Coeffs[WBi][0], C.WB_Coeffs[WBi][1], C.WB_Coeffs[WBi][2], C.WB_Coeffs[WBi][3], + roundf(_log2((float)C.WB_Coeffs[WBi][0] / denom) * 100.0f) / 100.0f, 0.0f, + roundf(_log2((float)C.WB_Coeffs[WBi][2] / denom) * 100.0f) / 100.0f, + C.WB_Coeffs[3] ? roundf(_log2((float)C.WB_Coeffs[WBi][3] / denom) * 100.0f) / 100.0f : 0.0f); + } + } + + if (C.rgb_cam[0][0] > 0.0001) + { + fprintf(outfile, "\n\nCamera2RGB matrix (mode: %d):\n", MyCoolRawProcessor.imgdata.params.use_camera_matrix); + PRINTMATRIX3x4(outfile, C.rgb_cam, P1.colors); + } + + fprintf(outfile, "\nXYZ->CamRGB matrix:\n"); + PRINTMATRIX4x3(outfile, C.cam_xyz, P1.colors); + + for (int cnt = 0; cnt < 2; cnt++) + { + if (fabsf(C.P1_color[cnt].romm_cam[0]) > 0) + { + fprintf(outfile, "\nPhaseOne Matrix %d:\n", cnt + 1); + for (int i = 0; i < 3; i++) + fprintf(outfile, "%6.4f\t%6.4f\t%6.4f\n", C.P1_color[cnt].romm_cam[i * 3], + C.P1_color[cnt].romm_cam[i * 3 + 1], C.P1_color[cnt].romm_cam[i * 3 + 2]); + } + } + + if (fabsf(C.cmatrix[0][0]) > 0) + { + fprintf(outfile, "\ncamRGB -> sRGB Matrix:\n"); + PRINTMATRIX3x4(outfile, C.cmatrix, P1.colors); + } + + if (fabsf(C.ccm[0][0]) > 0) + { + fprintf(outfile, "\nColor Correction Matrix:\n"); + PRINTMATRIX3x4(outfile, C.ccm, P1.colors); + } + + for (int cnt = 0; cnt < 2; cnt++) + { + if (C.dng_color[cnt].illuminant != LIBRAW_WBI_None) + { + if (C.dng_color[cnt].illuminant <= LIBRAW_WBI_StudioTungsten) + { + fprintf(outfile, "\nDNG Illuminant %d: %s", cnt + 1, WB_idx2hrstr(C.dng_color[cnt].illuminant)); + } + else if (C.dng_color[cnt].illuminant == LIBRAW_WBI_Other) + { + fprintf(outfile, "\nDNG Illuminant %d: Other", cnt + 1); + } + else + { + fprintf(outfile, + "\nDNG Illuminant %d is out of EXIF LightSources range " + "[0:24, 255]: %d", + cnt + 1, C.dng_color[cnt].illuminant); + } + } + } + + for (int n = 0; n < 2; n++) + { + if (fabsf(C.dng_color[n].colormatrix[0][0]) > 0) + { + fprintf(outfile, "\nDNG color matrix %d:\n", n + 1); + PRINTMATRIX4x3(outfile, C.dng_color[n].colormatrix, P1.colors); + } + } + + for (int n = 0; n < 2; n++) + { + if (fabsf(C.dng_color[n].calibration[0][0]) > 0) + { + fprintf(outfile, "\nDNG calibration matrix %d:\n", n + 1); + for (int i = 0; i < P1.colors && i < 4; i++) + { + for (int j = 0; j < P1.colors && j < 4; j++) + fprintf(outfile, "%6.4f\t", C.dng_color[n].calibration[j][i]); + fprintf(outfile, "\n"); + } + } + } + + for (int n = 0; n < 2; n++) + { + if (fabsf(C.dng_color[n].forwardmatrix[0][0]) > 0) + { + fprintf(outfile, "\nDNG forward matrix %d:\n", n + 1); + PRINTMATRIX3x4(outfile, C.dng_color[n].forwardmatrix, P1.colors); + } + } + + fprintf(outfile, "\nDerived D65 multipliers:"); + for (int c = 0; c < P1.colors; c++) + fprintf(outfile, " %f", C.pre_mul[c]); + fprintf(outfile, "\n"); + } +} + +void print_wbfun(FILE *outfile, LibRaw &MyCoolRawProcessor, std::string &fn) +{ + int WBi; + float denom; + fprintf(outfile, "// %s %s\n", P1.make, P1.model); + for (int cnt = 0; cnt < int(sizeof WBToStr / sizeof *WBToStr); cnt++) + { + WBi = WBToStr[cnt].NumId; + if (C.WB_Coeffs[WBi][0] && C.WB_Coeffs[WBi][1] && !WBToStr[cnt].aux_setting) + { + denom = (float)C.WB_Coeffs[WBi][1]; + fprintf(outfile, "{\"%s\", \"%s\", %s, {%6.5ff, 1.0f, %6.5ff, ", P1.normalized_make, P1.normalized_model, + WBToStr[cnt].StrId, C.WB_Coeffs[WBi][0] / denom, C.WB_Coeffs[WBi][2] / denom); + if (C.WB_Coeffs[WBi][1] == C.WB_Coeffs[WBi][3]) + fprintf(outfile, "1.0f}},\n"); + else + fprintf(outfile, "%6.5ff}},\n", C.WB_Coeffs[WBi][3] / denom); + } + } + + for (int cnt = 0; cnt < 64; cnt++) + if (C.WBCT_Coeffs[cnt][0]) + { + fprintf(outfile, "{\"%s\", \"%s\", %d, {%6.5ff, 1.0f, %6.5ff, ", P1.normalized_make, P1.normalized_model, + (int)C.WBCT_Coeffs[cnt][0], C.WBCT_Coeffs[cnt][1] / C.WBCT_Coeffs[cnt][2], + C.WBCT_Coeffs[cnt][3] / C.WBCT_Coeffs[cnt][2]); + if (C.WBCT_Coeffs[cnt][2] == C.WBCT_Coeffs[cnt][4]) + fprintf(outfile, "1.0f}},\n"); + else + fprintf(outfile, "%6.5ff}},\n", C.WBCT_Coeffs[cnt][4] / C.WBCT_Coeffs[cnt][2]); + } + else + break; + fprintf(outfile, "\n"); +} + +void print_szfun(FILE *outfile, LibRaw &MyCoolRawProcessor, std::string &fn) +{ + fprintf(outfile, "%s\t%s\t%s\t%d\t%d\n", fn.c_str(), P1.make, P1.model, S.width, S.height); +} + +void print_unpackfun(FILE *outfile, LibRaw &MyCoolRawProcessor, int print_frame, std::string &fn) +{ + char frame[48] = ""; + if (print_frame) + { + ushort right_margin = S.raw_width - S.width - S.left_margin; + ushort bottom_margin = S.raw_height - S.height - S.top_margin; + snprintf(frame, 48, "F=%dx%dx%dx%d RS=%dx%d", S.left_margin, S.top_margin, right_margin, bottom_margin, S.raw_width, + S.raw_height); + } + fprintf(outfile, "%s\t%s\t%s\t%s/%s\n", fn.c_str(), MyCoolRawProcessor.unpack_function_name(), frame, P1.make, + P1.model); +} diff --git a/rtengine/libraw/samples/rawtextdump.cpp b/rtengine/libraw/samples/rawtextdump.cpp new file mode 100644 index 000000000..e72f59176 --- /dev/null +++ b/rtengine/libraw/samples/rawtextdump.cpp @@ -0,0 +1,144 @@ +/* -*- C++ -*- + * File: raw2text.cpp + * Copyright 2008-2024 LibRaw LLC (info@libraw.org) + * Created: Sun Sept 01, 2020 + * + * LibRaw sample + * Dumps (small) selection of RAW data to text file + * + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + + */ +#include +#include +#include +#ifndef WIN32 +#include +#else +#include +#endif + +#include "libraw/libraw.h" + +void usage(const char *av) +{ + printf( + "Dump (small) selection of RAW file as tab-separated text file\n" + "Usage: %s inputfile COL ROW [CHANNEL] [width] [height]\n" + " COL - start column\n" + " ROW - start row\n" + " CHANNEL - raw channel to dump, default is 0 (red for rggb)\n" + " width - area width to dump, default is 16\n" + " height - area height to dump, default is 4\n" + , av); +} + +unsigned subtract_bl(unsigned int val, int bl) +{ + return val > (unsigned)bl ? val - (unsigned)bl : 0; +} + +class LibRaw_bl : public LibRaw +{ + public: + void adjust_blacklevel() { LibRaw::adjust_bl(); } +}; + +int main(int ac, char *av[]) +{ + if (ac < 4) + { + usage(av[0]); + exit(1); + } + int colstart = atoi(av[2]); + int rowstart = atoi(av[3]); + int channel = 0; + if (ac > 4) channel = atoi(av[4]); + int width = 16; + if (ac > 5) width = atoi(av[5]); + int height = 4; + if (ac > 6) height = atoi(av[6]); + if (width <1 || height<1) + { + usage(av[0]); + exit(1); + } + + LibRaw_bl lr; + + if (lr.open_file(av[1]) != LIBRAW_SUCCESS) + { + fprintf(stderr, "Unable to open file %s\n", av[1]); + exit(1); + } + if ((lr.imgdata.idata.colors == 1 && channel>0) || (channel >3)) + { + fprintf(stderr, "Incorrect CHANNEL specified: %d\n", channel); + exit(1); + } + if (lr.unpack() != LIBRAW_SUCCESS) + { + fprintf(stderr, "Unable to unpack raw data from %s\n", av[1]); + exit(1); + } + lr.adjust_blacklevel(); + printf("%s\t%d-%d-%dx%d\tchannel: %d\n", av[1], colstart, rowstart, width, height, channel); + + printf("%6s", "R\\C"); + for (int col = colstart; col < colstart + width && col < lr.imgdata.sizes.raw_width; col++) + printf("%6u", col); + printf("\n"); + + if (lr.imgdata.rawdata.raw_image) + { + for (int row = rowstart; row < rowstart + height && row < lr.imgdata.sizes.raw_height; row++) + { + unsigned rcolors[48]; + if (lr.imgdata.idata.colors > 1) + for (int c = 0; c < 48; c++) + rcolors[c] = lr.COLOR(row, c); + else + memset(rcolors, 0, sizeof(rcolors)); + unsigned short *rowdata = &lr.imgdata.rawdata.raw_image[row * lr.imgdata.sizes.raw_pitch / 2]; + printf("%6u", row); + for (int col = colstart; col < colstart + width && col < lr.imgdata.sizes.raw_width; col++) + if (rcolors[col % 48] == (unsigned)channel) printf("%6u", subtract_bl(rowdata[col],lr.imgdata.color.cblack[channel])); + else printf(" -"); + printf("\n"); + } + } + else if (lr.imgdata.rawdata.color4_image && channel < 4) + { + for (int row = rowstart; row < rowstart + height && row < lr.imgdata.sizes.raw_height; row++) + { + unsigned short(*rowdata)[4] = &lr.imgdata.rawdata.color4_image[row * lr.imgdata.sizes.raw_pitch / 8]; + printf("%6u", row); + for (int col = colstart; col < colstart + width && col < lr.imgdata.sizes.raw_width; col++) + printf("%6u", subtract_bl(rowdata[col][channel],lr.imgdata.color.cblack[channel])); + printf("\n"); + } + } + else if (lr.imgdata.rawdata.color3_image && channel < 3) + { + for (int row = rowstart; row < rowstart + height && row < lr.imgdata.sizes.raw_height; row++) + { + unsigned short(*rowdata)[3] = &lr.imgdata.rawdata.color3_image[row * lr.imgdata.sizes.raw_pitch / 6]; + printf("%6u", row); + for (int col = colstart; col < colstart + width && col < lr.imgdata.sizes.raw_width; col++) + printf("%6u", subtract_bl(rowdata[col][channel],lr.imgdata.color.cblack[channel])); + printf("\n"); + } + } + else + printf("Unsupported file data (e.g. floating point format), or incorrect channel specified\n"); +} diff --git a/rtengine/libraw/samples/simple_dcraw.cpp b/rtengine/libraw/samples/simple_dcraw.cpp new file mode 100644 index 000000000..710252ecf --- /dev/null +++ b/rtengine/libraw/samples/simple_dcraw.cpp @@ -0,0 +1,217 @@ +/* -*- C++ -*- + * File: simple_dcraw.cpp + * Copyright 2008-2024 LibRaw LLC (info@libraw.org) + * Created: Sat Mar 8, 2008 + * + * LibRaw simple C++ API: emulates call to "dcraw [-D] [-T] [-v] [-e] [-4]" + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + + */ +#include +#include +#include + +#include "libraw/libraw.h" + +#ifndef LIBRAW_WIN32_CALLS +#include +#include +#include +#include +#endif + +#ifdef LIBRAW_WIN32_CALLS +#define snprintf _snprintf +#endif + +int my_progress_callback(void *unused_data, enum LibRaw_progress state, + int iter, int expected) +{ + if (iter == 0) + printf("CB: state=%x, expected %d iterations\n", state, expected); + return 0; +} + +char *customCameras[] = { + (char *)"43704960,4080,5356, 0, 0, 0, 0,0,148,0,0, Dalsa, FTF4052C Full,0", + (char *)"42837504,4008,5344, 0, 0, 0, 0,0,148,0,0,Dalsa, FTF4052C 3:4", + (char *)"32128128,4008,4008, 0, 0, 0, 0,0,148,0,0,Dalsa, FTF4052C 1:1", + (char *)"24096096,4008,3006, 0, 0, 0, 0,0,148,0,0,Dalsa, FTF4052C 4:3", + (char *)"18068064,4008,2254, 0, 0, 0, 0,0,148,0,0,Dalsa, FTF4052C 16:9", + (char *)"67686894,5049,6703, 0, 0, 0, 0,0,148,0,0,Dalsa, FTF5066C Full", + (char *)"66573312,4992,6668, 0, 0, 0, 0,0,148,0,0,Dalsa, FTF5066C 3:4", + (char *)"49840128,4992,4992, 0, 0, 0, 0,0,148,0,0,Dalsa, FTF5066C 1:1", + (char *)"37400064,4992,3746, 0, 0, 0, 0,0,148,0,0,Dalsa, FTF5066C 4:3", + (char *)"28035072,4992,2808, 0, 0, 0, 0,0,148,0,0,Dalsa, FTF5066C 16:9", + NULL}; + +int main(int ac, char *av[]) +{ + int i, ret, verbose = 0, output_thumbs = 0, output_all_thumbs = 0; + + // don't use fixed size buffers in real apps! + char outfn[1024], thumbfn[1024]; + + LibRaw* RawProcessor = new LibRaw; + RawProcessor->imgdata.rawparams.custom_camera_strings = customCameras; + if (ac < 2) + { + printf("simple_dcraw - LibRaw %s sample. Emulates dcraw [-D] [-T] [-v] " + "[-e] [-E]\n" + " %d cameras supported\n" + "Usage: %s [-D] [-T] [-v] [-e] raw-files....\n" + "\t-4 - 16-bit mode\n" + "\t-L - list supported cameras and exit\n" + "\t-v - verbose output\n" + "\t-T - output TIFF files instead of .pgm/ppm\n" + "\t-e - extract thumbnails (same as dcraw -e in separate run)\n" + "\t-E - extract all thumbnails\n", + LibRaw::version(), LibRaw::cameraCount(), av[0]); + delete RawProcessor; + return 0; + } + + putenv((char *)"TZ=UTC"); // dcraw compatibility, affects TIFF datestamp field + +#define P1 RawProcessor->imgdata.idata +#define S RawProcessor->imgdata.sizes +#define C RawProcessor->imgdata.color +#define T RawProcessor->imgdata.thumbnail +#define P2 RawProcessor->imgdata.other +#define OUT RawProcessor->imgdata.params + + for (i = 1; i < ac; i++) + { + if (av[i][0] == '-') + { + if (av[i][1] == 'T' && av[i][2] == 0) + OUT.output_tiff = 1; + if (av[i][1] == 'v' && av[i][2] == 0) + verbose++; + if (av[i][1] == 'e' && av[i][2] == 0) + output_thumbs++; + if (av[i][1] == 'E' && av[i][2] == 0) + { + output_thumbs++; + output_all_thumbs++; + } + if (av[i][1] == '4' && av[i][2] == 0) + OUT.output_bps = 16; + if (av[i][1] == 'C' && av[i][2] == 0) + RawProcessor->set_progress_handler(my_progress_callback, NULL); + if (av[i][1] == 'L' && av[i][2] == 0) + { + const char **clist = LibRaw::cameraList(); + const char **cc = clist; + while (*cc) + { + printf("%s\n", *cc); + cc++; + } + delete RawProcessor; + exit(0); + } + continue; + } + + if (verbose) + printf("Processing file %s\n", av[i]); + + if ((ret = RawProcessor->open_file(av[i])) != LIBRAW_SUCCESS) + { + fprintf(stderr, "Cannot open_file %s: %s\n", av[i], libraw_strerror(ret)); + continue; // no recycle b/c open file will recycle itself + } + + if (!output_thumbs) // No unpack for thumb extraction + if ((ret = RawProcessor->unpack()) != LIBRAW_SUCCESS) + { + fprintf(stderr, "Cannot unpack %s: %s\n", av[i], libraw_strerror(ret)); + continue; + } + + // thumbnail unpacking and output in the middle of main + // image processing - for test purposes! + if(output_all_thumbs) + { + if (verbose) + printf("Extracting %d thumbnails\n", RawProcessor->imgdata.thumbs_list.thumbcount); + for (int t = 0; t < RawProcessor->imgdata.thumbs_list.thumbcount; t++) + { + if ((ret = RawProcessor->unpack_thumb_ex(t)) != LIBRAW_SUCCESS) + fprintf(stderr, "Cannot unpack_thumb #%d from %s: %s\n", t, av[i], libraw_strerror(ret)); + if (LIBRAW_FATAL_ERROR(ret)) + break; // skip to next file + snprintf(thumbfn, sizeof(thumbfn), "%s.thumb.%d.%s", av[i], t, + T.tformat == LIBRAW_THUMBNAIL_JPEG ? "jpg" : "ppm"); + if (verbose) + printf("Writing thumbnail file %s\n", thumbfn); + if (LIBRAW_SUCCESS != (ret = RawProcessor->dcraw_thumb_writer(thumbfn))) + { + fprintf(stderr, "Cannot write %s: %s\n", thumbfn, libraw_strerror(ret)); + if (LIBRAW_FATAL_ERROR(ret)) + break; + } + } + continue; + } + else if (output_thumbs) + { + if ((ret = RawProcessor->unpack_thumb()) != LIBRAW_SUCCESS) + { + fprintf(stderr, "Cannot unpack_thumb %s: %s\n", av[i], + libraw_strerror(ret)); + if (LIBRAW_FATAL_ERROR(ret)) + continue; // skip to next file + } + else + { + snprintf(thumbfn, sizeof(thumbfn), "%s.%s", av[i], + T.tformat == LIBRAW_THUMBNAIL_JPEG ? "thumb.jpg" + : (T.tcolors == 1? "thumb.pgm" : "thumb.ppm")); + if (verbose) + printf("Writing thumbnail file %s\n", thumbfn); + if (LIBRAW_SUCCESS != (ret = RawProcessor->dcraw_thumb_writer(thumbfn))) + { + fprintf(stderr, "Cannot write %s: %s\n", thumbfn, + libraw_strerror(ret)); + if (LIBRAW_FATAL_ERROR(ret)) + continue; + } + } + continue; + } + + ret = RawProcessor->dcraw_process(); + + if (LIBRAW_SUCCESS != ret) + { + fprintf(stderr, "Cannot do postprocessing on %s: %s\n", av[i], + libraw_strerror(ret)); + if (LIBRAW_FATAL_ERROR(ret)) + continue; + } + snprintf(outfn, sizeof(outfn), "%s.%s", av[i], + OUT.output_tiff ? "tiff" : (P1.colors > 1 ? "ppm" : "pgm")); + + if (verbose) + printf("Writing file %s\n", outfn); + + if (LIBRAW_SUCCESS != (ret = RawProcessor->dcraw_ppm_tiff_writer(outfn))) + fprintf(stderr, "Cannot write %s: %s\n", outfn, libraw_strerror(ret)); + + RawProcessor->recycle(); // just for show this call + } + + delete RawProcessor; + return 0; +} diff --git a/rtengine/libraw/samples/unprocessed_raw.cpp b/rtengine/libraw/samples/unprocessed_raw.cpp new file mode 100644 index 000000000..3060d4d5f --- /dev/null +++ b/rtengine/libraw/samples/unprocessed_raw.cpp @@ -0,0 +1,319 @@ +/* -*- C++ -*- + * File: unprocessed_raw.cpp + * Copyright 2009-2024 LibRaw LLC (info@libraw.org) + * Created: Fri Jan 02, 2009 + * + * LibRaw sample + * Generates unprocessed raw image: with masked pixels and without black +subtraction + * + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ +#include +#include +#include +#include + +#include "libraw/libraw.h" + +#ifndef LIBRAW_WIN32_CALLS +#include +#else +#include +#include +#endif + +#ifdef LIBRAW_WIN32_CALLS +#define snprintf _snprintf +#endif + +#if !(LIBRAW_COMPILE_CHECK_VERSION_NOTLESS(0, 14)) +#error This code is for LibRaw 0.14+ only +#endif + +void gamma_curve(unsigned short curve[]); +void write_ppm(unsigned width, unsigned height, unsigned short *bitmap, + const char *basename); +void write_tiff(int width, int height, unsigned short *bitmap, + const char *basename); + +int main(int ac, char *av[]) +{ + int i, ret; + int verbose = 1, autoscale = 0, use_gamma = 0, out_tiff = 0; + char outfn[1024]; + + LibRaw RawProcessor; + if (ac < 2) + { + usage: + printf("unprocessed_raw - LibRaw %s sample. %d cameras supported\n" + "Usage: %s [-q] [-A] [-g] [-s N] raw-files....\n" + "\t-q - be quiet\n" + "\t-s N - select Nth image in file (default=0)\n" + "\t-g - use gamma correction with gamma 2.2 (not precise,use for " + "visual inspection only)\n" + "\t-A - autoscaling (by integer factor)\n" + "\t-T - write tiff instead of pgm\n", + LibRaw::version(), LibRaw::cameraCount(), av[0]); + return 0; + } + +#define S RawProcessor.imgdata.sizes +#define OUT RawProcessor.imgdata.params +#define OUTR RawProcessor.imgdata.rawparams + + for (i = 1; i < ac; i++) + { + if (av[i][0] == '-') + { + if (av[i][1] == 'q' && av[i][2] == 0) + verbose = 0; + else if (av[i][1] == 'A' && av[i][2] == 0) + autoscale = 1; + else if (av[i][1] == 'g' && av[i][2] == 0) + use_gamma = 1; + else if (av[i][1] == 'T' && av[i][2] == 0) + out_tiff = 1; + else if (av[i][1] == 's' && av[i][2] == 0) + { + i++; + OUTR.shot_select = av[i] ? atoi(av[i]) : 0; + } + else + goto usage; + continue; + } + + if (verbose) + printf("Processing file %s\n", av[i]); + if ((ret = RawProcessor.open_file(av[i])) != LIBRAW_SUCCESS) + { + fprintf(stderr, "Cannot open %s: %s\n", av[i], libraw_strerror(ret)); + continue; // no recycle b/c open file will recycle itself + } + if (verbose) + { + printf("Image size: %dx%d\nRaw size: %dx%d\n", S.width, S.height, + S.raw_width, S.raw_height); + printf("Margins: top=%d, left=%d\n", S.top_margin, S.left_margin); + } + + if ((ret = RawProcessor.unpack()) != LIBRAW_SUCCESS) + { + fprintf(stderr, "Cannot unpack %s: %s\n", av[i], libraw_strerror(ret)); + continue; + } + + if (verbose) + printf("Unpacked....\n"); + + if (!(RawProcessor.imgdata.idata.filters || + RawProcessor.imgdata.idata.colors == 1)) + { + printf("Only Bayer-pattern RAW files supported, sorry....\n"); + continue; + } + + if (autoscale) + { + unsigned max = 0, scale; + for (int j = 0; j < S.raw_height * S.raw_width; j++) + if (max < RawProcessor.imgdata.rawdata.raw_image[j]) + max = RawProcessor.imgdata.rawdata.raw_image[j]; + if (max > 0 && max < 1 << 15) + { + scale = (1 << 16) / max; + if (verbose) + printf("Scaling with multiplier=%d (max=%d)\n", scale, max); + + for (int j = 0; j < S.raw_height * S.raw_width; j++) + RawProcessor.imgdata.rawdata.raw_image[j] *= scale; + } + } + if (use_gamma) + { + unsigned short curve[0x10000]; + gamma_curve(curve); + for (int j = 0; j < S.raw_height * S.raw_width; j++) + RawProcessor.imgdata.rawdata.raw_image[j] = + curve[RawProcessor.imgdata.rawdata.raw_image[j]]; + if (verbose) + printf("Gamma-corrected....\n"); + } + + if (OUTR.shot_select) + snprintf(outfn, sizeof(outfn), "%s-%d.%s", av[i], OUTR.shot_select, + out_tiff ? "tiff" : "pgm"); + else + snprintf(outfn, sizeof(outfn), "%s.%s", av[i], out_tiff ? "tiff" : "pgm"); + + if (out_tiff) + write_tiff(S.raw_width, S.raw_height, + RawProcessor.imgdata.rawdata.raw_image, outfn); + else + write_ppm(S.raw_width, S.raw_height, + RawProcessor.imgdata.rawdata.raw_image, outfn); + + if (verbose) + printf("Stored to file %s\n", outfn); + } + return 0; +} + +void write_ppm(unsigned width, unsigned height, unsigned short *bitmap, + const char *fname) +{ + if (!bitmap) + return; + + FILE *f = fopen(fname, "wb"); + if (!f) + return; + int bits = 16; + fprintf(f, "P5\n%d %d\n%d\n", width, height, (1 << bits) - 1); + unsigned char *data = (unsigned char *)bitmap; + unsigned data_size = width * height * 2; +#define SWAP(a, b) \ + { \ + a ^= b; \ + a ^= (b ^= a); \ + } + for (unsigned i = 0; i < data_size; i += 2) + SWAP(data[i], data[i + 1]); +#undef SWAP + fwrite(data, data_size, 1, f); + fclose(f); +} + +/* == gamma curve and tiff writer - simplified cut'n'paste from dcraw.c */ + +#define SQR(x) ((x) * (x)) + +void gamma_curve(unsigned short *curve) +{ + + double pwr = 1.0 / 2.2; + double ts = 0.0; + int imax = 0xffff; + int mode = 2; + int i; + double g[6], bnd[2] = {0, 0}, r; + + g[0] = pwr; + g[1] = ts; + g[2] = g[3] = g[4] = 0; + bnd[g[1] >= 1] = 1; + if (g[1] && (g[1] - 1) * (g[0] - 1) <= 0) + { + for (i = 0; i < 48; i++) + { + g[2] = (bnd[0] + bnd[1]) / 2; + if (g[0]) + bnd[(pow(g[2] / g[1], -g[0]) - 1) / g[0] - 1 / g[2] > -1] = g[2]; + else + bnd[g[2] / exp(1 - 1 / g[2]) < g[1]] = g[2]; + } + g[3] = g[2] / g[1]; + if (g[0]) + g[4] = g[2] * (1 / g[0] - 1); + } + if (g[0]) + g[5] = 1 / (g[1] * SQR(g[3]) / 2 - g[4] * (1 - g[3]) + + (1 - pow(g[3], 1 + g[0])) * (1 + g[4]) / (1 + g[0])) - + 1; + else + g[5] = 1 / (g[1] * SQR(g[3]) / 2 + 1 - g[2] - g[3] - + g[2] * g[3] * (log(g[3]) - 1)) - + 1; + for (i = 0; i < 0x10000; i++) + { + curve[i] = 0xffff; + if ((r = (double)i / imax) < 1) + curve[i] = + 0x10000 * + (mode ? (r < g[3] ? r * g[1] + : (g[0] ? pow(r, g[0]) * (1 + g[4]) - g[4] + : log(r) * g[2] + 1)) + : (r < g[2] ? r / g[1] + : (g[0] ? pow((r + g[4]) / (1 + g[4]), 1 / g[0]) + : exp((r - 1) / g[2])))); + } +} + +void tiff_set(ushort *ntag, ushort tag, ushort type, int count, int val) +{ + struct libraw_tiff_tag *tt; + int c; + + tt = (struct libraw_tiff_tag *)(ntag + 1) + (*ntag)++; + tt->tag = tag; + tt->type = type; + tt->count = count; + if ((type < LIBRAW_EXIFTAG_TYPE_SHORT) && (count <= 4)) + for (c = 0; c < 4; c++) + tt->val.c[c] = val >> (c << 3); + else if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_SHORT) && (count <= 2)) + for (c = 0; c < 2; c++) + tt->val.s[c] = val >> (c << 4); + else + tt->val.i = val; +} +#define TOFF(ptr) ((char *)(&(ptr)) - (char *)th) + +void tiff_head(int width, int height, struct tiff_hdr *th) +{ + int c; + time_t timestamp = time(NULL); + struct tm *t; + + memset(th, 0, sizeof *th); + th->t_order = htonl(0x4d4d4949) >> 16; + th->magic = 42; + th->ifd = 10; + tiff_set(&th->ntag, 254, 4, 1, 0); + tiff_set(&th->ntag, 256, 4, 1, width); + tiff_set(&th->ntag, 257, 4, 1, height); + tiff_set(&th->ntag, 258, 3, 1, 16); + for (c = 0; c < 4; c++) + th->bps[c] = 16; + tiff_set(&th->ntag, 259, 3, 1, 1); + tiff_set(&th->ntag, 262, 3, 1, 1); + tiff_set(&th->ntag, 273, 4, 1, sizeof *th); + tiff_set(&th->ntag, 277, 3, 1, 1); + tiff_set(&th->ntag, 278, 4, 1, height); + tiff_set(&th->ntag, 279, 4, 1, height * width * 2); + tiff_set(&th->ntag, 282, 5, 1, TOFF(th->rat[0])); + tiff_set(&th->ntag, 283, 5, 1, TOFF(th->rat[2])); + tiff_set(&th->ntag, 284, 3, 1, 1); + tiff_set(&th->ntag, 296, 3, 1, 2); + tiff_set(&th->ntag, 306, 2, 20, TOFF(th->date)); + th->rat[0] = th->rat[2] = 300; + th->rat[1] = th->rat[3] = 1; + t = localtime(×tamp); + if (t) + sprintf(th->date, "%04d:%02d:%02d %02d:%02d:%02d", t->tm_year + 1900, + t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec); +} + +void write_tiff(int width, int height, unsigned short *bitmap, const char *fn) +{ + struct tiff_hdr th; + + FILE *ofp = fopen(fn, "wb"); + if (!ofp) + return; + tiff_head(width, height, &th); + fwrite(&th, sizeof th, 1, ofp); + fwrite(bitmap, 2, width * height, ofp); + fclose(ofp); +} diff --git a/rtengine/libraw/shlib-version.sh b/rtengine/libraw/shlib-version.sh new file mode 100755 index 000000000..89e284e05 --- /dev/null +++ b/rtengine/libraw/shlib-version.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +vfile=./libraw/libraw_version.h + +major=`grep LIBRAW_SHLIB_CURRENT $vfile |head -1 | awk '{print $3}'` +minor=`grep LIBRAW_SHLIB_REVISION $vfile | head -1 | awk '{print $3}'` +patch=`grep LIBRAW_SHLIB_AGE $vfile | head -1 | awk '{print $3}'` + +echo "$major:$minor:$patch" | awk '{printf $1}' + + diff --git a/rtengine/libraw/src/Makefile b/rtengine/libraw/src/Makefile new file mode 100644 index 000000000..a54d1a462 --- /dev/null +++ b/rtengine/libraw/src/Makefile @@ -0,0 +1,2 @@ +all: + (cd ..; make library) diff --git a/rtengine/libraw/src/decoders/canon_600.cpp b/rtengine/libraw/src/decoders/canon_600.cpp new file mode 100644 index 000000000..b6960393c --- /dev/null +++ b/rtengine/libraw/src/decoders/canon_600.cpp @@ -0,0 +1,225 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +void LibRaw::canon_600_fixed_wb(int temp) +{ + static const short mul[4][5] = {{667, 358, 397, 565, 452}, + {731, 390, 367, 499, 517}, + {1119, 396, 348, 448, 537}, + {1399, 485, 431, 508, 688}}; + int lo, hi, i; + float frac = 0; + + for (lo = 4; --lo;) + if (*mul[lo] <= temp) + break; + for (hi = 0; hi < 3; hi++) + if (*mul[hi] >= temp) + break; + if (lo != hi) + frac = (float)(temp - *mul[lo]) / (*mul[hi] - *mul[lo]); + for (i = 1; i < 5; i++) + pre_mul[i - 1] = 1 / (frac * mul[hi][i] + (1 - frac) * mul[lo][i]); +} + +/* Return values: 0 = white 1 = near white 2 = not white */ +int LibRaw::canon_600_color(int ratio[2], int mar) +{ + int clipped = 0, target, miss; + + if (flash_used) + { + if (ratio[1] < -104) + { + ratio[1] = -104; + clipped = 1; + } + if (ratio[1] > 12) + { + ratio[1] = 12; + clipped = 1; + } + } + else + { + if (ratio[1] < -264 || ratio[1] > 461) + return 2; + if (ratio[1] < -50) + { + ratio[1] = -50; + clipped = 1; + } + if (ratio[1] > 307) + { + ratio[1] = 307; + clipped = 1; + } + } + target = flash_used || ratio[1] < 197 ? -38 - (398 * ratio[1] >> 10) + : -123 + (48 * ratio[1] >> 10); + if (target - mar <= ratio[0] && target + 20 >= ratio[0] && !clipped) + return 0; + miss = target - ratio[0]; + if (abs(miss) >= mar * 4) + return 2; + if (miss < -20) + miss = -20; + if (miss > mar) + miss = mar; + ratio[0] = target - miss; + return 1; +} + +void LibRaw::canon_600_auto_wb() +{ + int mar, row, col, i, j, st, count[] = {0, 0}; + int test[8], total[2][8], ratio[2][2], stat[2]; + + memset(&total, 0, sizeof total); + i = int(canon_ev + 0.5); + if (i < 10) + mar = 150; + else if (i > 12) + mar = 20; + else + mar = 280 - 20 * i; + if (flash_used) + mar = 80; + for (row = 14; row < height - 14; row += 4) + for (col = 10; col < width; col += 2) + { + for (i = 0; i < 8; i++) + test[(i & 4) + FC(row + (i >> 1), col + (i & 1))] = + BAYER(row + (i >> 1), col + (i & 1)); + for (i = 0; i < 8; i++) + if (test[i] < 150 || test[i] > 1500) + goto next; + for (i = 0; i < 4; i++) + if (abs(test[i] - test[i + 4]) > 50) + goto next; + for (i = 0; i < 2; i++) + { + for (j = 0; j < 4; j += 2) + ratio[i][j >> 1] = + ((test[i * 4 + j + 1] - test[i * 4 + j]) << 10) / test[i * 4 + j]; + stat[i] = canon_600_color(ratio[i], mar); + } + if ((st = stat[0] | stat[1]) > 1) + goto next; + for (i = 0; i < 2; i++) + if (stat[i]) + for (j = 0; j < 2; j++) + test[i * 4 + j * 2 + 1] = + test[i * 4 + j * 2] * (0x400 + ratio[i][j]) >> 10; + for (i = 0; i < 8; i++) + total[st][i] += test[i]; + count[st]++; + next:; + } + if (count[0] | count[1]) + { + st = count[0] * 200 < count[1]; + for (i = 0; i < 4; i++) + if (total[st][i] + total[st][i + 4]) + pre_mul[i] = 1.0f / (total[st][i] + total[st][i + 4]); + } +} + +void LibRaw::canon_600_coeff() +{ + static const short table[6][12] = { + {-190, 702, -1878, 2390, 1861, -1349, 905, -393, -432, 944, 2617, -2105}, + {-1203, 1715, -1136, 1648, 1388, -876, 267, 245, -1641, 2153, 3921, + -3409}, + {-615, 1127, -1563, 2075, 1437, -925, 509, 3, -756, 1268, 2519, -2007}, + {-190, 702, -1886, 2398, 2153, -1641, 763, -251, -452, 964, 3040, -2528}, + {-190, 702, -1878, 2390, 1861, -1349, 905, -393, -432, 944, 2617, -2105}, + {-807, 1319, -1785, 2297, 1388, -876, 769, -257, -230, 742, 2067, -1555}}; + int t = 0, i, c; + float mc, yc; + + mc = pre_mul[1] / pre_mul[2]; + yc = pre_mul[3] / pre_mul[2]; + if (mc > 1 && mc <= 1.28 && yc < 0.8789) + t = 1; + if (mc > 1.28 && mc <= 2) + { + if (yc < 0.8789) + t = 3; + else if (yc <= 2) + t = 4; + } + if (flash_used) + t = 5; + for (raw_color = i = 0; i < 3; i++) + FORCC rgb_cam[i][c] = float(table[t][i * 4 + c]) / 1024.f; +} + +void LibRaw::canon_600_load_raw() +{ + uchar data[1120], *dp; + ushort *pix; + int irow, row; + + for (irow = row = 0; irow < height; irow++) + { + checkCancel(); + if (fread(data, 1, 1120, ifp) < 1120) + derror(); + pix = raw_image + row * raw_width; + for (dp = data; dp < data + 1120; dp += 10, pix += 8) + { + pix[0] = (dp[0] << 2) + (dp[1] >> 6); + pix[1] = (dp[2] << 2) + (dp[1] >> 4 & 3); + pix[2] = (dp[3] << 2) + (dp[1] >> 2 & 3); + pix[3] = (dp[4] << 2) + (dp[1] & 3); + pix[4] = (dp[5] << 2) + (dp[9] & 3); + pix[5] = (dp[6] << 2) + (dp[9] >> 2 & 3); + pix[6] = (dp[7] << 2) + (dp[9] >> 4 & 3); + pix[7] = (dp[8] << 2) + (dp[9] >> 6); + } + if ((row += 2) > height) + row = 1; + } +} + +void LibRaw::canon_600_correct() +{ + int row, col, val; + static const short mul[4][2] = { + {1141, 1145}, {1128, 1109}, {1178, 1149}, {1128, 1109}}; + + for (row = 0; row < height; row++) + { + checkCancel(); + for (col = 0; col < width; col++) + { + if ((val = BAYER(row, col) - black) < 0) + val = 0; + val = val * mul[row & 3][col & 1] >> 9; + BAYER(row, col) = val; + } + } + canon_600_fixed_wb(1311); + canon_600_auto_wb(); + canon_600_coeff(); + maximum = (0x3ff - black) * 1109 >> 9; + black = 0; +} diff --git a/rtengine/libraw/src/decoders/crx.cpp b/rtengine/libraw/src/decoders/crx.cpp new file mode 100644 index 000000000..495c2f4e4 --- /dev/null +++ b/rtengine/libraw/src/decoders/crx.cpp @@ -0,0 +1,2781 @@ +/* -*- C++ -*- + * File: libraw_crxdec.cpp + * Copyright (C) 2018-2019 Alexey Danilchenko + * Copyright (C) 2019 Alex Tutubalin, LibRaw LLC + * + 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). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/libraw_cxx_defs.h" + +#ifdef _abs +#undef _abs +#undef _min +#undef _constrain +#endif +#define _abs(x) (((x) ^ ((int32_t)(x) >> 31)) - ((int32_t)(x) >> 31)) +#define _min(a, b) ((a) < (b) ? (a) : (b)) +#define _constrain(x, l, u) ((x) < (l) ? (l) : ((x) > (u) ? (u) : (x))) + +#if defined(__clang__) || defined(__GNUG__) +#define libraw_inline inline __attribute__((always_inline)) +#elif defined(_MSC_VER) && _MSC_VER > 1400 +#define libraw_inline __forceinline +#else +#define libraw_inline inline +#endif + +// this should be divisible by 4 +#define CRX_BUF_SIZE 0x10000 +#if !defined(_WIN32) || (defined(__GNUC__) && !defined(__INTRINSIC_SPECIAL__BitScanReverse)) +/* __INTRINSIC_SPECIAL__BitScanReverse found in MinGW32-W64 v7.30 headers, may be there is a better solution? */ +typedef uint32_t DWORD; +libraw_inline void _BitScanReverse(DWORD *Index, unsigned long Mask) +{ + *Index = sizeof(unsigned long) * 8 - 1 - __builtin_clzl(Mask); +} +#if LibRawBigEndian +#define _byteswap_ulong(x) (x) +#else +#define _byteswap_ulong(x) __builtin_bswap32(x) +#endif +#endif + +struct CrxBitstream +{ + uint8_t mdatBuf[CRX_BUF_SIZE]; + uint64_t mdatSize; + uint64_t curBufOffset; + uint32_t curPos; + uint32_t curBufSize; + uint32_t bitData; + int32_t bitsLeft; + LibRaw_abstract_datastream *input; +}; + +struct CrxBandParam +{ + CrxBitstream bitStream; + int16_t subbandWidth; + int16_t subbandHeight; + int32_t roundedBitsMask; + int32_t roundedBits; + int16_t curLine; + int32_t *lineBuf0; + int32_t *lineBuf1; + int32_t *lineBuf2; + int32_t sParam; + int32_t kParam; + int32_t *paramData; + int32_t *nonProgrData; + bool supportsPartial; +}; + +struct CrxWaveletTransform +{ + int32_t *subband0Buf; + int32_t *subband1Buf; + int32_t *subband2Buf; + int32_t *subband3Buf; + int32_t *lineBuf[8]; + int16_t curLine; + int16_t curH; + int8_t fltTapH; + int16_t height; + int16_t width; +}; + +struct CrxSubband +{ + CrxBandParam *bandParam; + uint64_t mdatOffset; + uint8_t *bandBuf; + uint16_t width; + uint16_t height; + int32_t qParam; + int32_t kParam; + int32_t qStepBase; + uint32_t qStepMult; + bool supportsPartial; + int32_t bandSize; + uint64_t dataSize; + int64_t dataOffset; + short rowStartAddOn; + short rowEndAddOn; + short colStartAddOn; + short colEndAddOn; + short levelShift; +}; + +struct CrxPlaneComp +{ + uint8_t *compBuf; + CrxSubband *subBands; + CrxWaveletTransform *wvltTransform; + int8_t compNumber; + int64_t dataOffset; + int32_t compSize; + bool supportsPartial; + int32_t roundedBitsMask; + int8_t tileFlag; +}; + +struct CrxQStep +{ + uint32_t *qStepTbl; + int width; + int height; +}; + +struct CrxTile +{ + CrxPlaneComp *comps; + int8_t tileFlag; + int8_t tileNumber; + int64_t dataOffset; + int32_t tileSize; + uint16_t width; + uint16_t height; + bool hasQPData; + CrxQStep *qStep; + uint32_t mdatQPDataSize; + uint16_t mdatExtraSize; +}; + +struct CrxImage +{ + uint8_t nPlanes; + uint16_t planeWidth; + uint16_t planeHeight; + uint8_t samplePrecision; + uint8_t medianBits; + uint8_t subbandCount; + uint8_t levels; + uint8_t nBits; + uint8_t encType; + uint8_t tileCols; + uint8_t tileRows; + CrxTile *tiles; + uint64_t mdatOffset; + uint64_t mdatSize; + int16_t *outBufs[4]; // one per plane + int16_t *planeBuf; + LibRaw_abstract_datastream *input; +#ifdef LIBRAW_CR3_MEMPOOL + libraw_memmgr memmgr; + CrxImage() : memmgr(0) {} +#endif +}; + +enum TileFlags +{ + E_HAS_TILES_ON_THE_RIGHT = 1, + E_HAS_TILES_ON_THE_LEFT = 2, + E_HAS_TILES_ON_THE_BOTTOM = 4, + E_HAS_TILES_ON_THE_TOP = 8 +}; + +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}; + +int32_t q_step_tbl[8] = {0x28, 0x2D, 0x33, 0x39, 0x40, 0x48}; + +uint32_t JS[32] = {1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, + 4, 8, 8, 8, 8, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, + 0x80, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000}; + +uint32_t J[32] = {0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, + 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}; + +static inline void crxFillBuffer(CrxBitstream *bitStrm) +{ + if (bitStrm->curPos >= bitStrm->curBufSize && bitStrm->mdatSize) + { + bitStrm->curPos = 0; + bitStrm->curBufOffset += bitStrm->curBufSize; +#ifdef LIBRAW_USE_OPENMP +#pragma omp critical +#endif + { +#ifndef LIBRAW_USE_OPENMP + bitStrm->input->lock(); +#endif + bitStrm->input->seek(bitStrm->curBufOffset, SEEK_SET); + bitStrm->curBufSize = bitStrm->input->read(bitStrm->mdatBuf, 1, _min(bitStrm->mdatSize, CRX_BUF_SIZE)); +#ifndef LIBRAW_USE_OPENMP + bitStrm->input->unlock(); +#endif + } + if (bitStrm->curBufSize < 1) // nothing read + throw LIBRAW_EXCEPTION_IO_EOF; + bitStrm->mdatSize -= bitStrm->curBufSize; + } +} + +libraw_inline int crxBitstreamGetZeros(CrxBitstream *bitStrm) +{ + uint32_t nonZeroBit = 0; + uint64_t nextData = 0; + int32_t result = 0; + + if (bitStrm->bitData) + { + _BitScanReverse((DWORD *)&nonZeroBit, (DWORD)bitStrm->bitData); + result = 31 - nonZeroBit; + bitStrm->bitData <<= 32 - nonZeroBit; + bitStrm->bitsLeft -= 32 - nonZeroBit; + } + else + { + uint32_t bitsLeft = bitStrm->bitsLeft; + while (1) + { + while (bitStrm->curPos + 4 <= bitStrm->curBufSize) + { + nextData = _byteswap_ulong(*(uint32_t *)(bitStrm->mdatBuf + bitStrm->curPos)); + bitStrm->curPos += 4; + crxFillBuffer(bitStrm); + if (nextData) + { + _BitScanReverse((DWORD *)&nonZeroBit, (DWORD)nextData); + result = bitsLeft + 31 - nonZeroBit; + bitStrm->bitData = nextData << (32 - nonZeroBit); + bitStrm->bitsLeft = nonZeroBit; + return result; + } + bitsLeft += 32; + } + if (bitStrm->curBufSize < bitStrm->curPos + 1) + break; // error + nextData = bitStrm->mdatBuf[bitStrm->curPos++]; + crxFillBuffer(bitStrm); + if (nextData) + break; + bitsLeft += 8; + } + _BitScanReverse((DWORD *)&nonZeroBit, (DWORD)nextData); + result = (uint32_t)(bitsLeft + 7 - nonZeroBit); + bitStrm->bitData = nextData << (32 - nonZeroBit); + bitStrm->bitsLeft = nonZeroBit; + } + return result; +} + +libraw_inline uint32_t crxBitstreamGetBits(CrxBitstream *bitStrm, int bits) +{ + int bitsLeft = bitStrm->bitsLeft; + uint32_t bitData = bitStrm->bitData; + uint32_t nextWord; + uint8_t nextByte; + uint32_t result; + + if (bitsLeft < bits) + { + // get them from stream + if (bitStrm->curPos + 4 <= bitStrm->curBufSize) + { + nextWord = _byteswap_ulong(*(uint32_t *)(bitStrm->mdatBuf + bitStrm->curPos)); + bitStrm->curPos += 4; + crxFillBuffer(bitStrm); + bitStrm->bitsLeft = 32 - (bits - bitsLeft); + result = ((nextWord >> bitsLeft) | bitData) >> (32 - bits); + bitStrm->bitData = nextWord << (bits - bitsLeft); + return result; + } + // less than a word left - read byte at a time + do + { + if (bitStrm->curPos >= bitStrm->curBufSize) + break; // error + bitsLeft += 8; + nextByte = bitStrm->mdatBuf[bitStrm->curPos++]; + crxFillBuffer(bitStrm); + bitData |= nextByte << (32 - bitsLeft); + } while (bitsLeft < bits); + } + result = bitData >> (32 - bits); // 32-bits + bitStrm->bitData = bitData << bits; + bitStrm->bitsLeft = bitsLeft - bits; + return result; +} + +libraw_inline int32_t crxPrediction(int32_t left, int32_t top, int32_t deltaH, int32_t deltaV) +{ + int32_t symb[4] = {left + deltaH, left + deltaH, left, top}; + + return symb[(((deltaV < 0) ^ (deltaH < 0)) << 1) + ((left < top) ^ (deltaH < 0))]; +} + +libraw_inline int32_t crxPredictKParameter(int32_t prevK, int32_t bitCode, int32_t maxVal = 0) +{ + int32_t newKParam = prevK - (bitCode < (1 << prevK >> 1)) + ((bitCode >> prevK) > 2) + ((bitCode >> prevK) > 5); + + return !maxVal || newKParam < maxVal ? newKParam : maxVal; +} + +libraw_inline void crxDecodeSymbolL1(CrxBandParam *param, int32_t doMedianPrediction, int32_t notEOL = 0) +{ + if (doMedianPrediction) + { + int32_t symb[4]; + + int32_t delta = param->lineBuf0[1] - param->lineBuf0[0]; + symb[2] = param->lineBuf1[0]; + symb[0] = symb[1] = delta + symb[2]; + symb[3] = param->lineBuf0[1]; + + param->lineBuf1[1] = symb[(((param->lineBuf0[0] < param->lineBuf1[0]) ^ (delta < 0)) << 1) + + ((param->lineBuf1[0] < param->lineBuf0[1]) ^ (delta < 0))]; + } + else + param->lineBuf1[1] = param->lineBuf0[1]; + + // get next error symbol + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + if (bitCode >= 41) + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + else if (param->kParam) + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); + + // add converted (+/-) error code to predicted value + param->lineBuf1[1] += -(int32_t)(bitCode & 1) ^ (int32_t)(bitCode >> 1); + + // for not end of the line - use one symbol ahead to estimate next K + if (notEOL) + { + int32_t nextDelta = (param->lineBuf0[2] - param->lineBuf0[1]) << 1; + bitCode = (bitCode + _abs(nextDelta)) >> 1; + ++param->lineBuf0; + } + + // update K parameter + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + + ++param->lineBuf1; +} + +int crxDecodeLine(CrxBandParam *param) +{ + int length = param->subbandWidth; + + param->lineBuf1[0] = param->lineBuf0[1]; + for (; length > 1; --length) + { + if (param->lineBuf1[0] != param->lineBuf0[1] || param->lineBuf1[0] != param->lineBuf0[2]) + { + crxDecodeSymbolL1(param, 1, 1); + } + else + { + int nSyms = 0; + if (crxBitstreamGetBits(¶m->bitStream, 1)) + { + nSyms = 1; + while (crxBitstreamGetBits(¶m->bitStream, 1)) + { + nSyms += JS[param->sParam]; + if (nSyms > length) + { + nSyms = length; + break; + } + if (param->sParam < 31) + ++param->sParam; + if (nSyms == length) + break; + } + + if (nSyms < length) + { + if (J[param->sParam]) + nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); + if (param->sParam > 0) + --param->sParam; + if (nSyms > length) + return -1; + } + + length -= nSyms; + + // copy symbol nSyms times + param->lineBuf0 += nSyms; + + // copy symbol nSyms times + while (nSyms-- > 0) + { + param->lineBuf1[1] = param->lineBuf1[0]; + ++param->lineBuf1; + } + } + + if (length > 0) + crxDecodeSymbolL1(param, 0, (length > 1)); + } + } + + if (length == 1) + crxDecodeSymbolL1(param, 1, 0); + + param->lineBuf1[1] = param->lineBuf1[0] + 1; + + return 0; +} + +libraw_inline void crxDecodeSymbolL1Rounded(CrxBandParam *param, int32_t doSym = 1, int32_t doCode = 1) +{ + int32_t sym = param->lineBuf0[1]; + + if (doSym) + { + // calculate the next symbol gradient + int32_t symb[4]; + int32_t deltaH = param->lineBuf0[1] - param->lineBuf0[0]; + symb[2] = param->lineBuf1[0]; + symb[0] = symb[1] = deltaH + symb[2]; + symb[3] = param->lineBuf0[1]; + sym = symb[(((param->lineBuf0[0] < param->lineBuf1[0]) ^ (deltaH < 0)) << 1) + + ((param->lineBuf1[0] < param->lineBuf0[1]) ^ (deltaH < 0))]; + } + + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + if (bitCode >= 41) + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + else if (param->kParam) + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); + int32_t code = -(int32_t)(bitCode & 1) ^ (int32_t)(bitCode >> 1); + param->lineBuf1[1] = param->roundedBitsMask * 2 * code + (code >> 31) + sym; + + if (doCode) + { + if (param->lineBuf0[2] > param->lineBuf0[1]) + code = (param->lineBuf0[2] - param->lineBuf0[1] + param->roundedBitsMask - 1) >> param->roundedBits; + else + code = -((param->lineBuf0[1] - param->lineBuf0[2] + param->roundedBitsMask) >> param->roundedBits); + + param->kParam = crxPredictKParameter(param->kParam, (bitCode + 2 * _abs(code)) >> 1, 15); + } + else + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + + ++param->lineBuf1; +} + +int crxDecodeLineRounded(CrxBandParam *param) +{ + int32_t valueReached = 0; + + param->lineBuf0[0] = param->lineBuf0[1]; + param->lineBuf1[0] = param->lineBuf0[1]; + int32_t length = param->subbandWidth; + + for (; length > 1; --length) + { + if (_abs(param->lineBuf0[2] - param->lineBuf0[1]) > param->roundedBitsMask) + { + crxDecodeSymbolL1Rounded(param); + ++param->lineBuf0; + valueReached = 1; + } + else if (valueReached || _abs(param->lineBuf0[0] - param->lineBuf1[0]) > param->roundedBitsMask) + { + crxDecodeSymbolL1Rounded(param); + ++param->lineBuf0; + valueReached = 0; + } + else + { + int nSyms = 0; + if (crxBitstreamGetBits(¶m->bitStream, 1)) + { + nSyms = 1; + while (crxBitstreamGetBits(¶m->bitStream, 1)) + { + nSyms += JS[param->sParam]; + if (nSyms > length) + { + nSyms = length; + break; + } + if (param->sParam < 31) + ++param->sParam; + if (nSyms == length) + break; + } + if (nSyms < length) + { + if (J[param->sParam]) + nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); + if (param->sParam > 0) + --param->sParam; + } + if (nSyms > length) + return -1; + } + length -= nSyms; + + // copy symbol nSyms times + param->lineBuf0 += nSyms; + + // copy symbol nSyms times + while (nSyms-- > 0) + { + param->lineBuf1[1] = param->lineBuf1[0]; + ++param->lineBuf1; + } + + if (length > 1) + { + crxDecodeSymbolL1Rounded(param, 0); + ++param->lineBuf0; + valueReached = _abs(param->lineBuf0[1] - param->lineBuf0[0]) > param->roundedBitsMask; + } + else if (length == 1) + crxDecodeSymbolL1Rounded(param, 0, 0); + } + } + if (length == 1) + crxDecodeSymbolL1Rounded(param, 1, 0); + + param->lineBuf1[1] = param->lineBuf1[0] + 1; + + return 0; +} + +int crxDecodeLineNoRefPrevLine(CrxBandParam *param) +{ + int32_t i = 0; + + for (; i < param->subbandWidth - 1; i++) + { + if (param->lineBuf0[i + 2] | param->lineBuf0[i + 1] | param->lineBuf1[i]) + { + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + if (bitCode >= 41) + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + else if (param->kParam) + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); + param->lineBuf1[i + 1] = -(int32_t)(bitCode & 1) ^ (int32_t)(bitCode >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode); + if (param->lineBuf2[i + 1] - param->kParam <= 1) + { + if (param->kParam >= 15) + param->kParam = 15; + } + else + ++param->kParam; + } + else + { + int nSyms = 0; + if (crxBitstreamGetBits(¶m->bitStream, 1)) + { + nSyms = 1; + if (i != param->subbandWidth - 1) + { + while (crxBitstreamGetBits(¶m->bitStream, 1)) + { + nSyms += JS[param->sParam]; + if (i + nSyms > param->subbandWidth) + { + nSyms = param->subbandWidth - i; + break; + } + if (param->sParam < 31) + ++param->sParam; + if (i + nSyms == param->subbandWidth) + break; + } + if (i + nSyms < param->subbandWidth) + { + if (J[param->sParam]) + nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); + if (param->sParam > 0) + --param->sParam; + } + if (i + nSyms > param->subbandWidth) + return -1; + } + } + else if (i > param->subbandWidth) + return -1; + + if (nSyms > 0) + { + memset(param->lineBuf1 + i + 1, 0, nSyms * sizeof(int32_t)); + memset(param->lineBuf2 + i, 0, nSyms * sizeof(int32_t)); + i += nSyms; + } + + if (i >= param->subbandWidth - 1) + { + if (i == param->subbandWidth - 1) + { + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + if (bitCode >= 41) + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + else if (param->kParam) + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); + param->lineBuf1[i + 1] = -(int32_t)((bitCode + 1) & 1) ^ (int32_t)((bitCode + 1) >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + param->lineBuf2[i] = param->kParam; + } + continue; + } + else + { + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + if (bitCode >= 41) + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + else if (param->kParam) + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); + param->lineBuf1[i + 1] = -(int32_t)((bitCode + 1) & 1) ^ (int32_t)((bitCode + 1) >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode); + if (param->lineBuf2[i + 1] - param->kParam <= 1) + { + if (param->kParam >= 15) + param->kParam = 15; + } + else + ++param->kParam; + } + } + param->lineBuf2[i] = param->kParam; + } + if (i == param->subbandWidth - 1) + { + int32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + if (bitCode >= 41) + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + else if (param->kParam) + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); + param->lineBuf1[i + 1] = -(bitCode & 1) ^ (bitCode >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + param->lineBuf2[i] = param->kParam; + } + + return 0; +} + +int crxDecodeTopLine(CrxBandParam *param) +{ + param->lineBuf1[0] = 0; + + int32_t length = param->subbandWidth; + + // read the line from bitstream + for (; length > 1; --length) + { + if (param->lineBuf1[0]) + param->lineBuf1[1] = param->lineBuf1[0]; + else + { + int nSyms = 0; + if (crxBitstreamGetBits(¶m->bitStream, 1)) + { + nSyms = 1; + while (crxBitstreamGetBits(¶m->bitStream, 1)) + { + nSyms += JS[param->sParam]; + if (nSyms > length) + { + nSyms = length; + break; + } + if (param->sParam < 31) + ++param->sParam; + if (nSyms == length) + break; + } + if (nSyms < length) + { + if (J[param->sParam]) + nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); + if (param->sParam > 0) + --param->sParam; + if (nSyms > length) + return -1; + } + + length -= nSyms; + + // copy symbol nSyms times + while (nSyms-- > 0) + { + param->lineBuf1[1] = param->lineBuf1[0]; + ++param->lineBuf1; + } + + if (length <= 0) + break; + } + + param->lineBuf1[1] = 0; + } + + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + if (bitCode >= 41) + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + else if (param->kParam) + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); + param->lineBuf1[1] += -(int32_t)(bitCode & 1) ^ (int32_t)(bitCode >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + ++param->lineBuf1; + } + + if (length == 1) + { + param->lineBuf1[1] = param->lineBuf1[0]; + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + if (bitCode >= 41) + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + else if (param->kParam) + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); + param->lineBuf1[1] += -(int32_t)(bitCode & 1) ^ (int32_t)(bitCode >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + ++param->lineBuf1; + } + + param->lineBuf1[1] = param->lineBuf1[0] + 1; + + return 0; +} + +int crxDecodeTopLineRounded(CrxBandParam *param) +{ + param->lineBuf1[0] = 0; + + int32_t length = param->subbandWidth; + + // read the line from bitstream + for (; length > 1; --length) + { + if (_abs(param->lineBuf1[0]) > param->roundedBitsMask) + param->lineBuf1[1] = param->lineBuf1[0]; + else + { + int nSyms = 0; + if (crxBitstreamGetBits(¶m->bitStream, 1)) + { + nSyms = 1; + while (crxBitstreamGetBits(¶m->bitStream, 1)) + { + nSyms += JS[param->sParam]; + if (nSyms > length) + { + nSyms = length; + break; + } + if (param->sParam < 31) + ++param->sParam; + if (nSyms == length) + break; + } + if (nSyms < length) + { + if (J[param->sParam]) + nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); + if (param->sParam > 0) + --param->sParam; + if (nSyms > length) + return -1; + } + } + + length -= nSyms; + + // copy symbol nSyms times + while (nSyms-- > 0) + { + param->lineBuf1[1] = param->lineBuf1[0]; + ++param->lineBuf1; + } + + if (length <= 0) + break; + + param->lineBuf1[1] = 0; + } + + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + if (bitCode >= 41) + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + else if (param->kParam) + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); + + int32_t sVal = -(int32_t)(bitCode & 1) ^ (int32_t)(bitCode >> 1); + param->lineBuf1[1] += param->roundedBitsMask * 2 * sVal + (sVal >> 31); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + ++param->lineBuf1; + } + + if (length == 1) + { + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + if (bitCode >= 41) + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + else if (param->kParam) + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); + int32_t sVal = -(int32_t)(bitCode & 1) ^ (int32_t)(bitCode >> 1); + param->lineBuf1[1] += param->roundedBitsMask * 2 * sVal + (sVal >> 31); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + ++param->lineBuf1; + } + + param->lineBuf1[1] = param->lineBuf1[0] + 1; + + return 0; +} + +int crxDecodeTopLineNoRefPrevLine(CrxBandParam *param) +{ + param->lineBuf0[0] = 0; + param->lineBuf1[0] = 0; + int32_t length = param->subbandWidth; + for (; length > 1; --length) + { + if (param->lineBuf1[0]) + { + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + if (bitCode >= 41) + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + else if (param->kParam) + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); + param->lineBuf1[1] = -(int32_t)(bitCode & 1) ^ (int32_t)(bitCode >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + } + else + { + int nSyms = 0; + if (crxBitstreamGetBits(¶m->bitStream, 1)) + { + nSyms = 1; + while (crxBitstreamGetBits(¶m->bitStream, 1)) + { + nSyms += JS[param->sParam]; + if (nSyms > length) + { + nSyms = length; + break; + } + if (param->sParam < 31) + ++param->sParam; + if (nSyms == length) + break; + } + if (nSyms < length) + { + if (J[param->sParam]) + nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); + if (param->sParam > 0) + --param->sParam; + if (nSyms > length) + return -1; + } + } + + length -= nSyms; + + // copy symbol nSyms times + while (nSyms-- > 0) + { + param->lineBuf2[0] = 0; + param->lineBuf1[1] = 0; + ++param->lineBuf1; + ++param->lineBuf2; + } + + if (length <= 0) + break; + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + if (bitCode >= 41) + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + else if (param->kParam) + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); + param->lineBuf1[1] = -(int32_t)((bitCode + 1) & 1) ^ (int32_t)((bitCode + 1) >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + } + param->lineBuf2[0] = param->kParam; + ++param->lineBuf2; + ++param->lineBuf1; + } + + if (length == 1) + { + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + if (bitCode >= 41) + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + else if (param->kParam) + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); + param->lineBuf1[1] = -(int32_t)(bitCode & 1) ^ (int32_t)(bitCode >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + param->lineBuf2[0] = param->kParam; + ++param->lineBuf1; + } + + param->lineBuf1[1] = 0; + + return 0; +} + +int crxDecodeLine(CrxBandParam *param, uint8_t *bandBuf) +{ + if (!param || !bandBuf) + return -1; + if (param->curLine >= param->subbandHeight) + return -1; + + if (param->curLine == 0) + { + int32_t lineLength = param->subbandWidth + 2; + + param->sParam = 0; + param->kParam = 0; + if (param->supportsPartial) + { + if (param->roundedBitsMask <= 0) + { + param->lineBuf0 = (int32_t *)param->paramData; + param->lineBuf1 = param->lineBuf0 + lineLength; + int32_t *lineBuf = param->lineBuf1 + 1; + if (crxDecodeTopLine(param)) + return -1; + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + ++param->curLine; + } + else + { + param->roundedBits = 1; + if (param->roundedBitsMask & ~1) + { + while (param->roundedBitsMask >> param->roundedBits) + ++param->roundedBits; + } + param->lineBuf0 = (int32_t *)param->paramData; + param->lineBuf1 = param->lineBuf0 + lineLength; + int32_t *lineBuf = param->lineBuf1 + 1; + if (crxDecodeTopLineRounded(param)) + return -1; + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + ++param->curLine; + } + } + else + { + param->lineBuf2 = (int32_t *)param->nonProgrData; + param->lineBuf0 = (int32_t *)param->paramData; + param->lineBuf1 = param->lineBuf0 + lineLength; + int32_t *lineBuf = param->lineBuf1 + 1; + if (crxDecodeTopLineNoRefPrevLine(param)) + return -1; + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + ++param->curLine; + } + } + else if (!param->supportsPartial) + { + int32_t lineLength = param->subbandWidth + 2; + param->lineBuf2 = (int32_t *)param->nonProgrData; + if (param->curLine & 1) + { + param->lineBuf1 = (int32_t *)param->paramData; + param->lineBuf0 = param->lineBuf1 + lineLength; + } + else + { + param->lineBuf0 = (int32_t *)param->paramData; + param->lineBuf1 = param->lineBuf0 + lineLength; + } + int32_t *lineBuf = param->lineBuf1 + 1; + if (crxDecodeLineNoRefPrevLine(param)) + return -1; + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + ++param->curLine; + } + else if (param->roundedBitsMask <= 0) + { + int32_t lineLength = param->subbandWidth + 2; + if (param->curLine & 1) + { + param->lineBuf1 = (int32_t *)param->paramData; + param->lineBuf0 = param->lineBuf1 + lineLength; + } + else + { + param->lineBuf0 = (int32_t *)param->paramData; + param->lineBuf1 = param->lineBuf0 + lineLength; + } + int32_t *lineBuf = param->lineBuf1 + 1; + if (crxDecodeLine(param)) + return -1; + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + ++param->curLine; + } + else + { + int32_t lineLength = param->subbandWidth + 2; + if (param->curLine & 1) + { + param->lineBuf1 = (int32_t *)param->paramData; + param->lineBuf0 = param->lineBuf1 + lineLength; + } + else + { + param->lineBuf0 = (int32_t *)param->paramData; + param->lineBuf1 = param->lineBuf0 + lineLength; + } + int32_t *lineBuf = param->lineBuf1 + 1; + if (crxDecodeLineRounded(param)) + return -1; + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + ++param->curLine; + } + return 0; +} + +int crxUpdateQparam(CrxSubband *subband) +{ + uint32_t bitCode = crxBitstreamGetZeros(&subband->bandParam->bitStream); + if (bitCode >= 23) + bitCode = crxBitstreamGetBits(&subband->bandParam->bitStream, 8); + else if (subband->kParam) + bitCode = crxBitstreamGetBits(&subband->bandParam->bitStream, subband->kParam) | (bitCode << subband->kParam); + + subband->qParam += -(int32_t)(bitCode & 1) ^ (int32_t)(bitCode >> 1); // converting encoded to signed integer + subband->kParam = crxPredictKParameter(subband->kParam, bitCode); + if (subband->kParam > 7) + return -1; + return 0; +} + +libraw_inline int getSubbandRow(CrxSubband *band, int row) +{ + return row < band->rowStartAddOn + ? 0 + : (row < band->height - band->rowEndAddOn ? row - band->rowEndAddOn + : band->height - band->rowEndAddOn - band->rowStartAddOn - 1); +} +int crxDecodeLineWithIQuantization(CrxSubband *band, CrxQStep *qStep) +{ + if (!band->dataSize) + { + memset(band->bandBuf, 0, band->bandSize); + return 0; + } + + if (band->supportsPartial && !qStep && crxUpdateQparam(band)) + return -1; + if (crxDecodeLine(band->bandParam, band->bandBuf)) + return -1; + + if (band->width <= 0) + return 0; + + // update band buffers + int32_t *bandBuf = (int32_t *)band->bandBuf; + if (qStep) + { + // new version + uint32_t *qStepTblPtr = &qStep->qStepTbl[qStep->width * getSubbandRow(band, band->bandParam->curLine - 1)]; + + for (int i = 0; i < band->colStartAddOn; ++i) + { + int32_t quantVal = band->qStepBase + ((qStepTblPtr[0] * band->qStepMult) >> 3); + bandBuf[i] *= _constrain(quantVal, 1, 0x168000); + } + + for (int i = band->colStartAddOn; i < band->width - band->colEndAddOn; ++i) + { + int32_t quantVal = + band->qStepBase + ((qStepTblPtr[(i - band->colStartAddOn) >> band->levelShift] * band->qStepMult) >> 3); + bandBuf[i] *= _constrain(quantVal, 1, 0x168000); + } + int lastIdx = (band->width - band->colEndAddOn - band->colStartAddOn - 1) >> band->levelShift; + for (int i = band->width - band->colEndAddOn; i < band->width; ++i) + { + int32_t quantVal = band->qStepBase + ((qStepTblPtr[lastIdx] * band->qStepMult) >> 3); + bandBuf[i] *= _constrain(quantVal, 1, 0x168000); + } + } + else + { + // prev. version + int32_t qScale = q_step_tbl[band->qParam % 6] >> (6 - band->qParam / 6); + if (band->qParam / 6 >= 6) + qScale = q_step_tbl[band->qParam % 6] * (1 << (band->qParam / 6 + 26)); + + if (qScale != 1) + for (int32_t i = 0; i < band->width; ++i) + bandBuf[i] *= qScale; + } + + return 0; +} + +void crxHorizontal53(int32_t *lineBufLA, int32_t *lineBufLB, CrxWaveletTransform *wavelet, uint32_t tileFlag) +{ + int32_t *band0Buf = wavelet->subband0Buf; + int32_t *band1Buf = wavelet->subband1Buf; + int32_t *band2Buf = wavelet->subband2Buf; + int32_t *band3Buf = wavelet->subband3Buf; + + if (wavelet->width <= 1) + { + lineBufLA[0] = band0Buf[0]; + lineBufLB[0] = band2Buf[0]; + } + else + { + if (tileFlag & E_HAS_TILES_ON_THE_LEFT) + { + lineBufLA[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufLB[0] = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + ++band1Buf; + ++band3Buf; + } + else + { + lineBufLA[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + lineBufLB[0] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + } + ++band0Buf; + ++band2Buf; + + for (int i = 0; i < wavelet->width - 3; i += 2) + { + int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufLA[1] = band1Buf[0] + ((delta + lineBufLA[0]) >> 1); + lineBufLA[2] = delta; + + delta = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + lineBufLB[1] = band3Buf[0] + ((delta + lineBufLB[0]) >> 1); + lineBufLB[2] = delta; + + ++band0Buf; + ++band1Buf; + ++band2Buf; + ++band3Buf; + lineBufLA += 2; + lineBufLB += 2; + } + if (tileFlag & E_HAS_TILES_ON_THE_RIGHT) + { + int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufLA[1] = band1Buf[0] + ((deltaA + lineBufLA[0]) >> 1); + + int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + lineBufLB[1] = band3Buf[0] + ((deltaB + lineBufLB[0]) >> 1); + + if (wavelet->width & 1) + { + lineBufLA[2] = deltaA; + lineBufLB[2] = deltaB; + } + } + else if (wavelet->width & 1) + { + lineBufLA[1] = band1Buf[0] + ((lineBufLA[0] + band0Buf[0] - ((band1Buf[0] + 1) >> 1)) >> 1); + lineBufLA[2] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + + lineBufLB[1] = band3Buf[0] + ((lineBufLB[0] + band2Buf[0] - ((band3Buf[0] + 1) >> 1)) >> 1); + lineBufLB[2] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + } + else + { + lineBufLA[1] = lineBufLA[0] + band1Buf[0]; + lineBufLB[1] = lineBufLB[0] + band3Buf[0]; + } + } +} + +int32_t *crxIdwt53FilterGetLine(CrxPlaneComp *comp, int32_t level) +{ + int32_t *result = comp->wvltTransform[level] + .lineBuf[(comp->wvltTransform[level].fltTapH - comp->wvltTransform[level].curH + 5) % 5 + 3]; + comp->wvltTransform[level].curH--; + return result; +} + +int crxIdwt53FilterDecode(CrxPlaneComp *comp, int32_t level, CrxQStep *qStep) +{ + if (comp->wvltTransform[level].curH) + return 0; + + CrxSubband *sband = comp->subBands + 3 * level; + CrxQStep *qStepLevel = qStep ? qStep + level : 0; + + if (comp->wvltTransform[level].height - 3 <= comp->wvltTransform[level].curLine && + !(comp->tileFlag & E_HAS_TILES_ON_THE_BOTTOM)) + { + if (comp->wvltTransform[level].height & 1) + { + if (level) + { + if (crxIdwt53FilterDecode(comp, level - 1, qStep)) + return -1; + } + else if (crxDecodeLineWithIQuantization(sband, qStepLevel)) + return -1; + + if (crxDecodeLineWithIQuantization(sband + 1, qStepLevel)) + return -1; + } + } + else + { + if (level) + { + if (crxIdwt53FilterDecode(comp, level - 1, qStep)) + return -1; + } + else if (crxDecodeLineWithIQuantization(sband, qStepLevel)) // LL band + return -1; + + if (crxDecodeLineWithIQuantization(sband + 1, qStepLevel) || // HL band + crxDecodeLineWithIQuantization(sband + 2, qStepLevel) || // LH band + crxDecodeLineWithIQuantization(sband + 3, qStepLevel)) // HH band + return -1; + } + + return 0; +} + +int crxIdwt53FilterTransform(CrxPlaneComp *comp, uint32_t level) +{ + CrxWaveletTransform *wavelet = comp->wvltTransform + level; + + if (wavelet->curH) + return 0; + + if (wavelet->curLine >= wavelet->height - 3) + { + if (!(comp->tileFlag & E_HAS_TILES_ON_THE_BOTTOM)) + { + if (wavelet->height & 1) + { + if (level) + { + if (!wavelet[-1].curH) + if (crxIdwt53FilterTransform(comp, level - 1)) + return -1; + wavelet->subband0Buf = crxIdwt53FilterGetLine(comp, level - 1); + } + int32_t *band0Buf = wavelet->subband0Buf; + int32_t *band1Buf = wavelet->subband1Buf; + int32_t *lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + int32_t *lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; + int32_t *lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; + + int32_t *lineBufL0 = wavelet->lineBuf[0]; + int32_t *lineBufL1 = wavelet->lineBuf[1]; + wavelet->lineBuf[1] = wavelet->lineBuf[2]; + wavelet->lineBuf[2] = lineBufL1; + + // process L bands + if (wavelet->width <= 1) + { + lineBufL0[0] = band0Buf[0]; + } + else + { + if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) + { + lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + ++band1Buf; + } + else + { + lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + } + ++band0Buf; + for (int i = 0; i < wavelet->width - 3; i += 2) + { + int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); + lineBufL0[2] = delta; + ++band0Buf; + ++band1Buf; + lineBufL0 += 2; + } + if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) + { + int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); + if (wavelet->width & 1) + lineBufL0[2] = delta; + } + else if (wavelet->width & 1) + { + int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); + lineBufL0[2] = delta; + } + else + lineBufL0[1] = band1Buf[0] + lineBufL0[0]; + } + + // process H bands + lineBufL0 = wavelet->lineBuf[0]; + lineBufL1 = wavelet->lineBuf[1]; + for (int32_t i = 0; i < wavelet->width; i++) + { + int32_t delta = lineBufL0[i] - ((lineBufL1[i] + 1) >> 1); + lineBufH1[i] = lineBufL1[i] + ((delta + lineBufH0[i]) >> 1); + lineBufH2[i] = delta; + } + wavelet->curH += 3; + wavelet->curLine += 3; + wavelet->fltTapH = (wavelet->fltTapH + 3) % 5; + } + else + { + int32_t *lineBufL2 = wavelet->lineBuf[2]; + int32_t *lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + int32_t *lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; + wavelet->lineBuf[1] = lineBufL2; + wavelet->lineBuf[2] = wavelet->lineBuf[1]; + + for (int32_t i = 0; i < wavelet->width; i++) + lineBufH1[i] = lineBufH0[i] + lineBufL2[i]; + + wavelet->curH += 2; + wavelet->curLine += 2; + wavelet->fltTapH = (wavelet->fltTapH + 2) % 5; + } + } + } + else + { + if (level) + { + if (!wavelet[-1].curH && crxIdwt53FilterTransform(comp, level - 1)) + return -1; + wavelet->subband0Buf = crxIdwt53FilterGetLine(comp, level - 1); + } + + int32_t *band0Buf = wavelet->subband0Buf; + int32_t *band1Buf = wavelet->subband1Buf; + int32_t *band2Buf = wavelet->subband2Buf; + int32_t *band3Buf = wavelet->subband3Buf; + + int32_t *lineBufL0 = wavelet->lineBuf[0]; + int32_t *lineBufL1 = wavelet->lineBuf[1]; + int32_t *lineBufL2 = wavelet->lineBuf[2]; + int32_t *lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + int32_t *lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; + int32_t *lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; + + wavelet->lineBuf[1] = wavelet->lineBuf[2]; + wavelet->lineBuf[2] = lineBufL1; + + // process L bands + if (wavelet->width <= 1) + { + lineBufL0[0] = band0Buf[0]; + lineBufL1[0] = band2Buf[0]; + } + else + { + if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) + { + lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufL1[0] = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + ++band1Buf; + ++band3Buf; + } + else + { + lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + lineBufL1[0] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + } + ++band0Buf; + ++band2Buf; + for (int i = 0; i < wavelet->width - 3; i += 2) + { + int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufL0[1] = band1Buf[0] + ((delta + lineBufL0[0]) >> 1); + lineBufL0[2] = delta; + + delta = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + lineBufL1[1] = band3Buf[0] + ((delta + lineBufL1[0]) >> 1); + lineBufL1[2] = delta; + + ++band0Buf; + ++band1Buf; + ++band2Buf; + ++band3Buf; + lineBufL0 += 2; + lineBufL1 += 2; + } + if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) + { + int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufL0[1] = band1Buf[0] + ((deltaA + lineBufL0[0]) >> 1); + + int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + lineBufL1[1] = band3Buf[0] + ((deltaB + lineBufL1[0]) >> 1); + + if (wavelet->width & 1) + { + lineBufL0[2] = deltaA; + lineBufL1[2] = deltaB; + } + } + else if (wavelet->width & 1) + { + int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + lineBufL0[1] = band1Buf[0] + ((delta + lineBufL0[0]) >> 1); + lineBufL0[2] = delta; + + delta = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + lineBufL1[1] = band3Buf[0] + ((delta + lineBufL1[0]) >> 1); + lineBufL1[2] = delta; + } + else + { + lineBufL0[1] = lineBufL0[0] + band1Buf[0]; + lineBufL1[1] = lineBufL1[0] + band3Buf[0]; + } + } + + // process H bands + lineBufL0 = wavelet->lineBuf[0]; + lineBufL1 = wavelet->lineBuf[1]; + lineBufL2 = wavelet->lineBuf[2]; + for (int32_t i = 0; i < wavelet->width; i++) + { + int32_t delta = lineBufL0[i] - ((lineBufL2[i] + lineBufL1[i] + 2) >> 2); + lineBufH1[i] = lineBufL1[i] + ((delta + lineBufH0[i]) >> 1); + lineBufH2[i] = delta; + } + if (wavelet->curLine >= wavelet->height - 3 && wavelet->height & 1) + { + wavelet->curH += 3; + wavelet->curLine += 3; + wavelet->fltTapH = (wavelet->fltTapH + 3) % 5; + } + else + { + wavelet->curH += 2; + wavelet->curLine += 2; + wavelet->fltTapH = (wavelet->fltTapH + 2) % 5; + } + } + + return 0; +} + +int crxIdwt53FilterInitialize(CrxPlaneComp *comp, int32_t level, CrxQStep *qStep) +{ + if (level == 0) + return 0; + + for (int curLevel = 0, curBand = 0; curLevel < level; curLevel++, curBand += 3) + { + CrxQStep *qStepLevel = qStep ? qStep + curLevel : 0; + CrxWaveletTransform *wavelet = comp->wvltTransform + curLevel; + if (curLevel) + wavelet[0].subband0Buf = crxIdwt53FilterGetLine(comp, curLevel - 1); + else if (crxDecodeLineWithIQuantization(comp->subBands + curBand, qStepLevel)) + return -1; + + int32_t *lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + if (wavelet->height > 1) + { + if (crxDecodeLineWithIQuantization(comp->subBands + curBand + 1, qStepLevel) || + crxDecodeLineWithIQuantization(comp->subBands + curBand + 2, qStepLevel) || + crxDecodeLineWithIQuantization(comp->subBands + curBand + 3, qStepLevel)) + return -1; + + int32_t *lineBufL0 = wavelet->lineBuf[0]; + int32_t *lineBufL1 = wavelet->lineBuf[1]; + int32_t *lineBufL2 = wavelet->lineBuf[2]; + + if (comp->tileFlag & E_HAS_TILES_ON_THE_TOP) + { + crxHorizontal53(lineBufL0, wavelet->lineBuf[1], wavelet, comp->tileFlag); + if (crxDecodeLineWithIQuantization(comp->subBands + curBand + 3, qStepLevel) || + crxDecodeLineWithIQuantization(comp->subBands + curBand + 2, qStepLevel)) + return -1; + + int32_t *band2Buf = wavelet->subband2Buf; + int32_t *band3Buf = wavelet->subband3Buf; + + // process L band + if (wavelet->width <= 1) + lineBufL2[0] = band2Buf[0]; + else + { + if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) + { + lineBufL2[0] = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + ++band3Buf; + } + else + lineBufL2[0] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + + ++band2Buf; + + for (int i = 0; i < wavelet->width - 3; i += 2) + { + int32_t delta = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); + lineBufL2[2] = delta; + + ++band2Buf; + ++band3Buf; + lineBufL2 += 2; + } + if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) + { + int32_t delta = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); + if (wavelet->width & 1) + lineBufL2[2] = delta; + } + else if (wavelet->width & 1) + { + int32_t delta = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + + lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); + lineBufL2[2] = delta; + } + else + { + lineBufL2[1] = band3Buf[0] + lineBufL2[0]; + } + } + + // process H band + for (int32_t i = 0; i < wavelet->width; i++) + lineBufH0[i] = lineBufL0[i] - ((lineBufL1[i] + lineBufL2[i] + 2) >> 2); + } + else + { + crxHorizontal53(lineBufL0, wavelet->lineBuf[2], wavelet, comp->tileFlag); + for (int i = 0; i < wavelet->width; i++) + lineBufH0[i] = lineBufL0[i] - ((lineBufL2[i] + 1) >> 1); + } + + if (crxIdwt53FilterDecode(comp, curLevel, qStep) || crxIdwt53FilterTransform(comp, curLevel)) + return -1; + } + else + { + if (crxDecodeLineWithIQuantization(comp->subBands + curBand + 1, qStepLevel)) + return -1; + + int32_t *band0Buf = wavelet->subband0Buf; + int32_t *band1Buf = wavelet->subband1Buf; + + // process H band + if (wavelet->width <= 1) + lineBufH0[0] = band0Buf[0]; + else + { + if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) + { + lineBufH0[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + ++band1Buf; + } + else + lineBufH0[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + + ++band0Buf; + + for (int i = 0; i < wavelet->width - 3; i += 2) + { + int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); + lineBufH0[2] = delta; + + ++band0Buf; + ++band1Buf; + lineBufH0 += 2; + } + + if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) + { + int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); + lineBufH0[2] = delta; + } + else if (wavelet->width & 1) + { + int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); + lineBufH0[2] = delta; + } + else + { + lineBufH0[1] = band1Buf[0] + lineBufH0[0]; + } + } + ++wavelet->curLine; + ++wavelet->curH; + wavelet->fltTapH = (wavelet->fltTapH + 1) % 5; + } + } + + return 0; +} + +void crxFreeSubbandData(CrxImage *image, CrxPlaneComp *comp) +{ + if (comp->compBuf) + { + free(comp->compBuf); + comp->compBuf = 0; + } + + if (!comp->subBands) + return; + + for (int32_t i = 0; i < image->subbandCount; i++) + { + if (comp->subBands[i].bandParam) + { + free(comp->subBands[i].bandParam); + comp->subBands[i].bandParam = 0LL; + } + + comp->subBands[i].bandBuf = 0; + comp->subBands[i].bandSize = 0; + } +} + +void crxConvertPlaneLine(CrxImage *img, int imageRow, int imageCol = 0, int plane = 0, int32_t *lineData = 0, + int lineLength = 0) +{ + if (lineData) + { + uint64_t rawOffset = 4 * img->planeWidth * imageRow + 2 * imageCol; + if (img->encType == 1) + { + int32_t maxVal = 1 << (img->nBits - 1); + int32_t minVal = -maxVal; + --maxVal; + for (int i = 0; i < lineLength; i++) + img->outBufs[plane][rawOffset + 2 * i] = _constrain(lineData[i], minVal, maxVal); + } + else if (img->encType == 3) + { + // copy to intermediate planeBuf + rawOffset = plane * img->planeWidth * img->planeHeight + img->planeWidth * imageRow + imageCol; + for (int i = 0; i < lineLength; i++) + img->planeBuf[rawOffset + i] = lineData[i]; + } + else if (img->nPlanes == 4) + { + int32_t median = 1 << (img->nBits - 1); + int32_t maxVal = (1 << img->nBits) - 1; + for (int i = 0; i < lineLength; i++) + img->outBufs[plane][rawOffset + 2 * i] = _constrain(median + lineData[i], 0, maxVal); + } + else if (img->nPlanes == 1) + { + int32_t maxVal = (1 << img->nBits) - 1; + int32_t median = 1 << (img->nBits - 1); + rawOffset = img->planeWidth * imageRow + imageCol; + for (int i = 0; i < lineLength; i++) + img->outBufs[0][rawOffset + i] = _constrain(median + lineData[i], 0, maxVal); + } + } + else if (img->encType == 3 && img->planeBuf) + { + int32_t planeSize = img->planeWidth * img->planeHeight; + int16_t *plane0 = img->planeBuf + imageRow * img->planeWidth; + int16_t *plane1 = plane0 + planeSize; + int16_t *plane2 = plane1 + planeSize; + int16_t *plane3 = plane2 + planeSize; + + int32_t median = (1 << (img->medianBits - 1)) << 10; + int32_t maxVal = (1 << img->medianBits) - 1; + uint32_t rawLineOffset = 4 * img->planeWidth * imageRow; + + // for this stage - all except imageRow is ignored + for (int i = 0; i < img->planeWidth; i++) + { + int32_t gr = median + (plane0[i] << 10) - 168 * plane1[i] - 585 * plane3[i]; + int32_t val = 0; + if (gr < 0) + gr = -(((_abs(gr) + 512) >> 9) & ~1); + else + gr = ((_abs(gr) + 512) >> 9) & ~1; + + // Essentially R = round(median + P0 + 1.474*P3) + val = (median + (plane0[i] << 10) + 1510 * plane3[i] + 512) >> 10; + img->outBufs[0][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); + // Essentially G1 = round(median + P0 + P2 - 0.164*P1 - 0.571*P3) + val = (plane2[i] + gr + 1) >> 1; + img->outBufs[1][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); + // Essentially G2 = round(median + P0 - P2 - 0.164*P1 - 0.571*P3) + val = (gr - plane2[i] + 1) >> 1; + img->outBufs[2][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); + // Essentially B = round(median + P0 + 1.881*P1) + val = (median + (plane0[i] << 10) + 1927 * plane1[i] + 512) >> 10; + img->outBufs[3][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); + } + } +} + +int crxParamInit(CrxImage *img, CrxBandParam **param, uint64_t subbandMdatOffset, uint64_t subbandDataSize, + uint32_t subbandWidth, uint32_t subbandHeight, bool supportsPartial, uint32_t roundedBitsMask) +{ + int32_t progrDataSize = supportsPartial ? 0 : sizeof(int32_t) * subbandWidth; + int32_t paramLength = 2 * subbandWidth + 4; + uint8_t *paramBuf = 0; + paramBuf = (uint8_t *) +#ifdef LIBRAW_CR3_MEMPOOL + img->memmgr. +#endif + calloc(1, sizeof(CrxBandParam) + sizeof(int32_t) * paramLength + progrDataSize); + + if (!paramBuf) + return -1; + + *param = (CrxBandParam *)paramBuf; + + paramBuf += sizeof(CrxBandParam); + + (*param)->paramData = (int32_t *)paramBuf; + (*param)->nonProgrData = progrDataSize ? (*param)->paramData + paramLength : 0; + (*param)->subbandWidth = subbandWidth; + (*param)->subbandHeight = subbandHeight; + (*param)->roundedBits = 0; + (*param)->curLine = 0; + (*param)->roundedBitsMask = roundedBitsMask; + (*param)->supportsPartial = supportsPartial; + (*param)->bitStream.bitData = 0; + (*param)->bitStream.bitsLeft = 0; + (*param)->bitStream.mdatSize = subbandDataSize; + (*param)->bitStream.curPos = 0; + (*param)->bitStream.curBufSize = 0; + (*param)->bitStream.curBufOffset = subbandMdatOffset; + (*param)->bitStream.input = img->input; + + crxFillBuffer(&(*param)->bitStream); + + return 0; +} + +int crxSetupSubbandData(CrxImage *img, CrxPlaneComp *planeComp, const CrxTile *tile, uint32_t mdatOffset) +{ + long compDataSize = 0; + long waveletDataOffset = 0; + long compCoeffDataOffset = 0; + int32_t toSubbands = 3 * img->levels + 1; + int32_t transformWidth = 0; + + CrxSubband *subbands = planeComp->subBands; + + // calculate sizes + for (int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) + { + subbands[subbandNum].bandSize = subbands[subbandNum].width * sizeof(int32_t); // 4bytes + compDataSize += subbands[subbandNum].bandSize; + } + + if (img->levels) + { + int32_t encLevels = img->levels ? img->levels : 1; + waveletDataOffset = (compDataSize + 7) & ~7; + compDataSize = (sizeof(CrxWaveletTransform) * encLevels + waveletDataOffset + 7) & ~7; + compCoeffDataOffset = compDataSize; + + // calc wavelet line buffer sizes (always at one level up from current) + for (int level = 0; level < img->levels; ++level) + if (level < img->levels - 1) + compDataSize += 8 * sizeof(int32_t) * planeComp->subBands[3 * (level + 1) + 2].width; + else + compDataSize += 8 * sizeof(int32_t) * tile->width; + } + // buffer allocation + planeComp->compBuf = (uint8_t *) +#ifdef LIBRAW_CR3_MEMPOOL + img->memmgr. +#endif + malloc(compDataSize); + if (!planeComp->compBuf) + return -1; + + // subbands buffer and sizes initialisation + uint64_t subbandMdatOffset = img->mdatOffset + mdatOffset; + uint8_t *subbandBuf = planeComp->compBuf; + + for (int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) + { + subbands[subbandNum].bandBuf = subbandBuf; + subbandBuf += subbands[subbandNum].bandSize; + subbands[subbandNum].mdatOffset = subbandMdatOffset + subbands[subbandNum].dataOffset; + } + + // wavelet data initialisation + if (img->levels) + { + CrxWaveletTransform *waveletTransforms = (CrxWaveletTransform *)(planeComp->compBuf + waveletDataOffset); + int32_t *paramData = (int32_t *)(planeComp->compBuf + compCoeffDataOffset); + + planeComp->wvltTransform = waveletTransforms; + waveletTransforms[0].subband0Buf = (int32_t *)subbands->bandBuf; + + for (int level = 0; level < img->levels; ++level) + { + int32_t band = 3 * level + 1; + + if (level >= img->levels - 1) + { + waveletTransforms[level].height = tile->height; + transformWidth = tile->width; + } + else + { + waveletTransforms[level].height = subbands[band + 3].height; + transformWidth = subbands[band + 4].width; + } + waveletTransforms[level].width = transformWidth; + waveletTransforms[level].lineBuf[0] = paramData; + waveletTransforms[level].lineBuf[1] = waveletTransforms[level].lineBuf[0] + transformWidth; + waveletTransforms[level].lineBuf[2] = waveletTransforms[level].lineBuf[1] + transformWidth; + waveletTransforms[level].lineBuf[3] = waveletTransforms[level].lineBuf[2] + transformWidth; + waveletTransforms[level].lineBuf[4] = waveletTransforms[level].lineBuf[3] + transformWidth; + waveletTransforms[level].lineBuf[5] = waveletTransforms[level].lineBuf[4] + transformWidth; + waveletTransforms[level].lineBuf[6] = waveletTransforms[level].lineBuf[5] + transformWidth; + waveletTransforms[level].lineBuf[7] = waveletTransforms[level].lineBuf[6] + transformWidth; + waveletTransforms[level].curLine = 0; + waveletTransforms[level].curH = 0; + waveletTransforms[level].fltTapH = 0; + waveletTransforms[level].subband1Buf = (int32_t *)subbands[band].bandBuf; + waveletTransforms[level].subband2Buf = (int32_t *)subbands[band + 1].bandBuf; + waveletTransforms[level].subband3Buf = (int32_t *)subbands[band + 2].bandBuf; + + paramData = waveletTransforms[level].lineBuf[7] + transformWidth; + } + } + + // decoding params and bitstream initialisation + for (int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) + { + if (subbands[subbandNum].dataSize) + { + bool supportsPartial = false; + uint32_t roundedBitsMask = 0; + + if (planeComp->supportsPartial && subbandNum == 0) + { + roundedBitsMask = planeComp->roundedBitsMask; + supportsPartial = true; + } + if (crxParamInit(img, &subbands[subbandNum].bandParam, subbands[subbandNum].mdatOffset, + subbands[subbandNum].dataSize, subbands[subbandNum].width, subbands[subbandNum].height, + supportsPartial, roundedBitsMask)) + return -1; + } + } + + return 0; +} + +int LibRaw::crxDecodePlane(void *p, uint32_t planeNumber) +{ + CrxImage *img = (CrxImage *)p; + int imageRow = 0; + for (int tRow = 0; tRow < img->tileRows; tRow++) + { + int imageCol = 0; + for (int tCol = 0; tCol < img->tileCols; tCol++) + { + CrxTile *tile = img->tiles + tRow * img->tileCols + tCol; + CrxPlaneComp *planeComp = tile->comps + planeNumber; + uint64_t tileMdatOffset = tile->dataOffset + tile->mdatQPDataSize + tile->mdatExtraSize + planeComp->dataOffset; + + // decode single tile + if (crxSetupSubbandData(img, planeComp, tile, tileMdatOffset)) + return -1; + + if (img->levels) + { + if (crxIdwt53FilterInitialize(planeComp, img->levels, tile->qStep)) + return -1; + for (int i = 0; i < tile->height; ++i) + { + if (crxIdwt53FilterDecode(planeComp, img->levels - 1, tile->qStep) || + crxIdwt53FilterTransform(planeComp, img->levels - 1)) + return -1; + int32_t *lineData = crxIdwt53FilterGetLine(planeComp, img->levels - 1); + crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, lineData, tile->width); + } + } + else + { + // we have the only subband in this case + if (!planeComp->subBands->dataSize) + { + memset(planeComp->subBands->bandBuf, 0, planeComp->subBands->bandSize); + return 0; + } + + for (int i = 0; i < tile->height; ++i) + { + if (crxDecodeLine(planeComp->subBands->bandParam, planeComp->subBands->bandBuf)) + return -1; + int32_t *lineData = (int32_t *)planeComp->subBands->bandBuf; + crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, lineData, tile->width); + } + } + imageCol += tile->width; + } + imageRow += img->tiles[tRow * img->tileCols].height; + } + + return 0; +} + +uint32_t crxReadQP(CrxBitstream *bitStrm, int32_t kParam) +{ + 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, int32_t width, int32_t *lineBuf, int32_t *kParam) +{ + lineBuf[0] = 0; + while (width-- > 0) + { + lineBuf[1] = lineBuf[0]; + uint32_t qp = crxReadQP(bitStrm, *kParam); + lineBuf[1] += -(int32_t)(qp & 1) ^ (int32_t)(qp >> 1); + *kParam = crxPredictKParameter(*kParam, qp, 7); + ++lineBuf; + } + lineBuf[1] = lineBuf[0] + 1; +} + +void crxDecodeGolombNormal(CrxBitstream *bitStrm, int32_t width, int32_t *lineBuf0, int32_t *lineBuf1, int32_t *kParam) +{ + lineBuf1[0] = lineBuf0[1]; + int32_t deltaH = lineBuf0[1] - lineBuf0[0]; + while (width-- > 0) + { + lineBuf1[1] = crxPrediction(lineBuf1[0], lineBuf0[1], deltaH, lineBuf0[0] - lineBuf1[0]); + uint32_t qp = crxReadQP(bitStrm, *kParam); + lineBuf1[1] += -(int32_t)(qp & 1) ^ (int32_t)(qp >> 1); + if (width) + { + deltaH = lineBuf0[2] - lineBuf0[1]; + *kParam = crxPredictKParameter(*kParam, (qp + 2 * _abs(deltaH)) >> 1, 7); + ++lineBuf0; + } + else + *kParam = crxPredictKParameter(*kParam, qp, 7); + ++lineBuf1; + } + lineBuf1[1] = lineBuf1[0] + 1; +} + +int crxMakeQStep(CrxImage *img, CrxTile *tile, int32_t *qpTable, uint32_t /*totalQP*/) +{ + if (img->levels > 3 || img->levels < 1) + return -1; + 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); + uint32_t totalHeight = qpHeight; + if (img->levels > 1) + totalHeight += qpHeight4; + if (img->levels > 2) + totalHeight += qpHeight8; + tile->qStep = (CrxQStep *) +#ifdef LIBRAW_CR3_MEMPOOL + img->memmgr. +#endif + malloc(totalHeight * qpWidth * sizeof(uint32_t) + img->levels * sizeof(CrxQStep)); + + if (!tile->qStep) + return -1; + uint32_t *qStepTbl = (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 * _min(4 * qpRow, qpHeight - 1); + int row1Idx = qpWidth * _min(4 * qpRow + 1, qpHeight - 1); + int row2Idx = qpWidth * _min(4 * qpRow + 2, qpHeight - 1); + int row3Idx = qpWidth * _min(4 * qpRow + 3, qpHeight - 1); + + for (int qpCol = 0; qpCol < qpWidth; ++qpCol, ++qStepTbl) + { + 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 - 6 ) & 0x1f)); + 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 * _min(2 * qpRow, qpHeight - 1); + int row1Idx = qpWidth * _min(2 * qpRow + 1, qpHeight - 1); + + for (int qpCol = 0; qpCol < qpWidth; ++qpCol, ++qStepTbl) + { + int32_t quantVal = (qpTable[row0Idx++] + qpTable[row1Idx++]) / 2; + if (quantVal / 6 >= 6) + *qStepTbl = q_step_tbl[quantVal % 6] * (1 << ((quantVal / 6 - 6) & 0x1f)); + 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 - 6) & 0x1f)); + else + *qStepTbl = q_step_tbl[*qpTable % 6] >> (6 - *qpTable / 6); + + break; + } + return 0; +} + +libraw_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; + } +} + +int crxProcessSubbands(crx_data_header_t *hdr, CrxImage *img, CrxTile *tile, CrxPlaneComp *comp) +{ + CrxSubband *band = comp->subBands + img->subbandCount - 1; // set to last band + uint32_t bandHeight = tile->height; + uint32_t bandWidth = tile->width; + int32_t bandWidthExCoef = 0; + int32_t bandHeightExCoef = 0; + if (img->levels) + { + // Build up subband sequences to crxDecode to a level in a header + + // 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 + int32_t *rowExCoef = exCoefNumTbl + 0x30 * (img->levels - 1) + 6 * (tile->width & 7); + int32_t *colExCoef = exCoefNumTbl + 0x30 * (img->levels - 1) + 6 * (tile->height & 7); + for (int level = 0; level < img->levels; ++level) + { + int32_t widthOddPixel = bandWidth & 1; + int32_t heightOddPixel = bandHeight & 1; + bandWidth = (widthOddPixel + bandWidth) >> 1; + bandHeight = (heightOddPixel + bandHeight) >> 1; + + int32_t bandWidthExCoef0 = 0; + int32_t bandWidthExCoef1 = 0; + int32_t bandHeightExCoef0 = 0; + int32_t bandHeightExCoef1 = 0; + int32_t colStartIdx = 0; + int32_t rowStartIdx = 0; + if (tile->tileFlag & E_HAS_TILES_ON_THE_RIGHT) + { + 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[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); + + band -= 3; + } + bandWidthExCoef = bandHeightExCoef = 0; + if (tile->tileFlag & E_HAS_TILES_ON_THE_RIGHT) + bandWidthExCoef = rowExCoef[2 * img->levels - 1]; + if (tile->tileFlag & E_HAS_TILES_ON_THE_BOTTOM) + 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); + + return 0; +} + +int crxReadSubbandHeaders(crx_data_header_t * /*hdr*/, CrxImage *img, CrxTile * /*tile*/, CrxPlaneComp *comp, + uint8_t **subbandMdatPtr, int32_t *mdatSize) +{ + if (!img->subbandCount) + return 0; + int32_t subbandOffset = 0; + CrxSubband *band = comp->subBands; + for (int curSubband = 0; curSubband < img->subbandCount; curSubband++, band++) + { + if (*mdatSize < 4) + return -1; + + int hdrSign = LibRaw::sgetn(2, *subbandMdatPtr); + int hdrSize = LibRaw::sgetn(2, *subbandMdatPtr + 2); + if (*mdatSize < hdrSize + 4) + return -1; + if ((hdrSign != 0xFF03 || hdrSize != 8) && (hdrSign != 0xFF13 || hdrSize != 16)) + return -1; + + int32_t subbandSize = LibRaw::sgetn(4, *subbandMdatPtr + 4); + + if (curSubband != ((*subbandMdatPtr)[8] & 0xF0) >> 4) + { + band->dataSize = subbandSize; + return -1; + } + + band->dataOffset = subbandOffset; + band->kParam = 0; + band->bandParam = 0; + band->bandBuf = 0; + band->bandSize = 0; + + if (hdrSign == 0xFF03) + { + // old header + uint32_t bitData = LibRaw::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 (LibRaw::sgetn(2, *subbandMdatPtr + 8) & 0xFFF) + // partial and qParam are not supported + return -1; + if (LibRaw::sgetn(2, *subbandMdatPtr + 18)) + // new header terninated by 2 zero bytes + return -1; + band->supportsPartial = false; + band->qParam = 0; + band->dataSize = subbandSize - LibRaw::sgetn(2, *subbandMdatPtr + 16); + band->qStepBase = LibRaw::sgetn(4, *subbandMdatPtr + 12); + ; + band->qStepMult = LibRaw::sgetn(2, *subbandMdatPtr + 10); + ; + } + + subbandOffset += subbandSize; + + *subbandMdatPtr += hdrSize + 4; + *mdatSize -= hdrSize + 4; + } + + return 0; +} + +int crxReadImageHeaders(crx_data_header_t *hdr, CrxImage *img, uint8_t *mdatPtr, int32_t mdatHdrSize) +{ + int nTiles = img->tileRows * img->tileCols; + + if (!nTiles) + return -1; + + if (!img->tiles) + { + img->tiles = (CrxTile *) +#ifdef LIBRAW_CR3_MEMPOOL + img->memmgr. +#endif + calloc(sizeof(CrxTile) * nTiles + sizeof(CrxPlaneComp) * nTiles * img->nPlanes + + sizeof(CrxSubband) * nTiles * img->nPlanes * img->subbandCount, + 1); + if (!img->tiles) + return -1; + + // memory areas in allocated chunk + CrxTile *tile = img->tiles; + CrxPlaneComp *comps = (CrxPlaneComp *)(tile + nTiles); + CrxSubband *bands = (CrxSubband *)(comps + img->nPlanes * nTiles); + + for (int curTile = 0; curTile < nTiles; curTile++, tile++) + { + tile->tileFlag = 0; // tile neighbouring flags + tile->tileNumber = curTile; + tile->tileSize = 0; + tile->comps = comps + curTile * img->nPlanes; + + if ((curTile + 1) % img->tileCols) + { + // not the last tile in a tile row + tile->width = hdr->tileWidth; + if (img->tileCols > 1) + { + tile->tileFlag = E_HAS_TILES_ON_THE_RIGHT; + if (curTile % img->tileCols) + // not the first tile in tile row + tile->tileFlag |= E_HAS_TILES_ON_THE_LEFT; + } + } + else + { + // last tile in a tile row + tile->width = img->planeWidth - hdr->tileWidth * (img->tileCols - 1); + if (img->tileCols > 1) + tile->tileFlag = E_HAS_TILES_ON_THE_LEFT; + } + if (curTile < nTiles - img->tileCols) + { + // in first tile row + tile->height = hdr->tileHeight; + if (img->tileRows > 1) + { + tile->tileFlag |= E_HAS_TILES_ON_THE_BOTTOM; + if (curTile >= img->tileCols) + tile->tileFlag |= E_HAS_TILES_ON_THE_TOP; + } + } + else + { + // non first tile row + tile->height = img->planeHeight - hdr->tileHeight * (img->tileRows - 1); + if (img->tileRows > 1) + tile->tileFlag |= E_HAS_TILES_ON_THE_TOP; + } + if (img->nPlanes) + { + CrxPlaneComp *comp = tile->comps; + CrxSubband *band = bands + curTile * img->nPlanes * img->subbandCount; + + for (int curComp = 0; curComp < img->nPlanes; curComp++, comp++) + { + comp->compNumber = curComp; + comp->supportsPartial = true; + comp->tileFlag = tile->tileFlag; + comp->subBands = band; + comp->compBuf = 0; + comp->wvltTransform = 0; + if (img->subbandCount) + { + for (int curBand = 0; curBand < img->subbandCount; curBand++, band++) + { + band->supportsPartial = false; + band->qParam = 4; + band->bandParam = 0; + band->dataSize = 0; + } + } + } + } + } + } + + uint32_t tileOffset = 0; + int32_t dataSize = mdatHdrSize; + uint8_t *dataPtr = mdatPtr; + CrxTile *tile = img->tiles; + + for (int curTile = 0; curTile < nTiles; ++curTile, ++tile) + { + if (dataSize < 4) + return -1; + + int hdrSign = LibRaw::sgetn(2, dataPtr); + int hdrSize = LibRaw::sgetn(2, dataPtr + 2); + if ((hdrSign != 0xFF01 || hdrSize != 8) && (hdrSign != 0xFF11 || (hdrSize != 8 && hdrSize != 16))) + return -1; + if (dataSize < hdrSize + 4) + return -1; + int tailSign = LibRaw::sgetn(2, dataPtr + 10); + if ((hdrSize == 8 && tailSign) || (hdrSize == 16 && tailSign != 0x4000)) + return -1; + if (LibRaw::sgetn(2, dataPtr + 8) != (unsigned)curTile) + return -1; + + dataSize -= hdrSize + 4; + + tile->tileSize = LibRaw::sgetn(4, dataPtr + 4); + tile->dataOffset = tileOffset; + tile->qStep = 0; + if (hdrSize == 16) + { + // extended header data - terminated by 0 bytes + if (LibRaw::sgetn(2, dataPtr + 18) != 0) + return -1; + tile->hasQPData = true; + tile->mdatQPDataSize = LibRaw::sgetn(4, dataPtr + 12); + tile->mdatExtraSize = LibRaw::sgetn(2, dataPtr + 16); + } + else + { + tile->hasQPData = false; + tile->mdatQPDataSize = 0; + tile->mdatExtraSize = 0; + } + + dataPtr += hdrSize + 4; + tileOffset += tile->tileSize; + + uint32_t compOffset = 0; + CrxPlaneComp *comp = tile->comps; + + for (int compNum = 0; compNum < img->nPlanes; ++compNum, ++comp) + { + if (dataSize < 0xC) + return -1; + hdrSign = LibRaw::sgetn(2, dataPtr); + hdrSize = LibRaw::sgetn(2, dataPtr + 2); + if ((hdrSign != 0xFF02 && hdrSign != 0xFF12) || hdrSize != 8) + return -1; + if (compNum != dataPtr[8] >> 4) + return -1; + if (LibRaw::sgetn(3, dataPtr + 9) != 0) + return -1; + + comp->compSize = LibRaw::sgetn(4, dataPtr + 4); + + int32_t compHdrRoundedBits = (dataPtr[8] >> 1) & 3; + comp->supportsPartial = (dataPtr[8] & 8) != 0; + + comp->dataOffset = compOffset; + comp->tileFlag = tile->tileFlag; + + compOffset += comp->compSize; + dataSize -= 0xC; + dataPtr += 0xC; + + comp->roundedBitsMask = 0; + + if (compHdrRoundedBits) + { + if (img->levels || !comp->supportsPartial) + return -1; + + comp->roundedBitsMask = 1 << (compHdrRoundedBits - 1); + } + + if (crxReadSubbandHeaders(hdr, img, tile, comp, &dataPtr, &dataSize) || crxProcessSubbands(hdr, img, tile, comp)) + return -1; + } + } + + if (hdr->version != 0x200) + return 0; + + tile = img->tiles; + for (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 = qpHeight * qpWidth; + + try + { + std::vector qpTable(totalQP + 2 * (qpWidth + 2)); + int32_t *qpCurElem = qpTable.data(); + // 2 lines padded with extra pixels at the start and at the end + int32_t *qpLineBuf = qpTable.data() + totalQP; + int32_t kParam = 0; + for (unsigned qpRow = 0; qpRow < qpHeight; ++qpRow) + { + int32_t *qpLine0 = qpRow & 1 ? qpLineBuf + qpWidth + 2 : qpLineBuf; + 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 -1; + } + catch (...) + { + return -1; + } + } + } + + return 0; +} + +int crxSetupImageData(crx_data_header_t *hdr, CrxImage *img, int16_t *outBuf, uint64_t mdatOffset, uint32_t mdatSize, + uint8_t *mdatHdrPtr, int32_t mdatHdrSize) +{ + int IncrBitTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0}; + + img->planeWidth = hdr->f_width; + img->planeHeight = hdr->f_height; + + if (hdr->tileWidth < 0x16 || hdr->tileHeight < 0x16 || img->planeWidth > 0x7FFF || img->planeHeight > 0x7FFF) + return -1; + + img->tileCols = (img->planeWidth + hdr->tileWidth - 1) / hdr->tileWidth; + img->tileRows = (img->planeHeight + hdr->tileHeight - 1) / hdr->tileHeight; + + if (img->tileCols > 0xFF || img->tileRows > 0xFF || img->planeWidth - hdr->tileWidth * (img->tileCols - 1) < 0x16 || + img->planeHeight - hdr->tileHeight * (img->tileRows - 1) < 0x16) + return -1; + + img->tiles = 0; + img->levels = hdr->imageLevels; + img->subbandCount = 3 * img->levels + 1; // 3 bands per level + one last LL + img->nPlanes = hdr->nPlanes; + img->nBits = hdr->nBits; + img->encType = hdr->encType; + img->samplePrecision = hdr->nBits + IncrBitTable[4 * hdr->encType + 2] + 1; + img->mdatOffset = mdatOffset + hdr->mdatHdrSize; + img->mdatSize = mdatSize; + img->planeBuf = 0; + img->outBufs[0] = img->outBufs[1] = img->outBufs[2] = img->outBufs[3] = 0; + 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 + // It is a massive buffer so ideallly it will need a different approach: + // decode planes line by line and convert single line then without + // intermediate plane buffer. At the moment though it's too many changes so + // left as is. + if (img->encType == 3 && img->nPlanes == 4 && img->nBits > 8) + { + img->planeBuf = (int16_t *) +#ifdef LIBRAW_CR3_MEMPOOL + img->memmgr. +#endif + malloc(img->planeHeight * img->planeWidth * img->nPlanes * ((img->samplePrecision + 7) >> 3)); + if (!img->planeBuf) + return -1; + } + + int32_t rowSize = 2 * img->planeWidth; + + if (img->nPlanes == 1) + img->outBufs[0] = outBuf; + else + switch (hdr->cfaLayout) + { + case 0: + // R G + // G B + img->outBufs[0] = outBuf; + img->outBufs[1] = outBuf + 1; + img->outBufs[2] = outBuf + rowSize; + img->outBufs[3] = img->outBufs[2] + 1; + break; + case 1: + // G R + // B G + img->outBufs[1] = outBuf; + img->outBufs[0] = outBuf + 1; + img->outBufs[3] = outBuf + rowSize; + img->outBufs[2] = img->outBufs[3] + 1; + break; + case 2: + // G B + // R G + img->outBufs[2] = outBuf; + img->outBufs[3] = outBuf + 1; + img->outBufs[0] = outBuf + rowSize; + img->outBufs[1] = img->outBufs[0] + 1; + break; + case 3: + // B G + // G R + img->outBufs[3] = outBuf; + img->outBufs[2] = outBuf + 1; + img->outBufs[1] = outBuf + rowSize; + img->outBufs[0] = img->outBufs[1] + 1; + break; + } + + // read header + return crxReadImageHeaders(hdr, img, mdatHdrPtr, mdatHdrSize); +} + +int crxFreeImageData(CrxImage *img) +{ +#ifdef LIBRAW_CR3_MEMPOOL + img->memmgr.cleanup(); +#else + CrxTile *tile = img->tiles; + int nTiles = img->tileRows * img->tileCols; + + if (img->tiles) + { + for (int32_t curTile = 0; curTile < nTiles; curTile++) + { + if (tile[curTile].comps) + for (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); + img->tiles = 0; + } + + if (img->planeBuf) + { + free(img->planeBuf); + img->planeBuf = 0; + } +#endif + return 0; +} +void LibRaw::crxLoadDecodeLoop(void *img, int nPlanes) +{ +#ifdef LIBRAW_USE_OPENMP + int results[4] ={0,0,0,0}; // nPlanes is always <= 4 +#pragma omp parallel for + for (int32_t plane = 0; plane < nPlanes; ++plane) + try { + results[plane] = crxDecodePlane(img, plane); + } catch (...) { + results[plane] = 1; + } + + for (int32_t plane = 0; plane < nPlanes; ++plane) + if (results[plane]) + derror(); +#else + for (int32_t plane = 0; plane < nPlanes; ++plane) + if (crxDecodePlane(img, plane)) + derror(); +#endif +} + +void LibRaw::crxConvertPlaneLineDf(void *p, int imageRow) { crxConvertPlaneLine((CrxImage *)p, imageRow); } + +void LibRaw::crxLoadFinalizeLoopE3(void *p, int planeHeight) +{ +#ifdef LIBRAW_USE_OPENMP +#pragma omp parallel for +#endif + for (int i = 0; i < planeHeight; ++i) + crxConvertPlaneLineDf(p, i); +} + +void LibRaw::crxLoadRaw() +{ + CrxImage img; + if (libraw_internal_data.unpacker_data.crx_track_selected < 0 || + libraw_internal_data.unpacker_data.crx_track_selected >= LIBRAW_CRXTRACKS_MAXCOUNT) + derror(); + + crx_data_header_t hdr = + libraw_internal_data.unpacker_data.crx_header[libraw_internal_data.unpacker_data.crx_track_selected]; + + if (libraw_internal_data.unpacker_data.data_size < (unsigned)hdr.mdatHdrSize) + derror(); + + img.input = libraw_internal_data.internal_data.input; + + // update sizes for the planes + if (hdr.nPlanes == 4) + { + hdr.f_width >>= 1; + hdr.f_height >>= 1; + hdr.tileWidth >>= 1; + hdr.tileHeight >>= 1; + } + + imgdata.color.maximum = (1 << hdr.nBits) - 1; + + std::vector hdrBuf(hdr.mdatHdrSize); + + unsigned bytes = 0; + // read image header +#ifdef LIBRAW_USE_OPENMP +#pragma omp critical +#endif + { +#ifndef LIBRAW_USE_OPENMP + libraw_internal_data.internal_data.input->lock(); +#endif + libraw_internal_data.internal_data.input->seek(libraw_internal_data.unpacker_data.data_offset, SEEK_SET); + bytes = libraw_internal_data.internal_data.input->read(hdrBuf.data(), 1, hdr.mdatHdrSize); +#ifndef LIBRAW_USE_OPENMP + libraw_internal_data.internal_data.input->unlock(); +#endif + } + + if (bytes != hdr.mdatHdrSize) + throw LIBRAW_EXCEPTION_IO_EOF; + + // parse and setup the image data + if (crxSetupImageData(&hdr, &img, (int16_t *)imgdata.rawdata.raw_image, + libraw_internal_data.unpacker_data.data_offset, libraw_internal_data.unpacker_data.data_size, + hdrBuf.data(), hdr.mdatHdrSize)) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + crxLoadDecodeLoop(&img, hdr.nPlanes); + + if (img.encType == 3) + crxLoadFinalizeLoopE3(&img, img.planeHeight); + + crxFreeImageData(&img); +} + +int LibRaw::crxParseImageHeader(uchar *cmp1TagData, int nTrack, int size) +{ + if (nTrack < 0 || nTrack >= LIBRAW_CRXTRACKS_MAXCOUNT) + return -1; + if (!cmp1TagData) + return -1; + + crx_data_header_t *hdr = &libraw_internal_data.unpacker_data.crx_header[nTrack]; + + hdr->version = sgetn(2, cmp1TagData + 4); + hdr->f_width = sgetn(4, cmp1TagData + 8); + hdr->f_height = sgetn(4, cmp1TagData + 12); + hdr->tileWidth = sgetn(4, cmp1TagData + 16); + hdr->tileHeight = sgetn(4, cmp1TagData + 20); + hdr->nBits = cmp1TagData[24]; + hdr->nPlanes = cmp1TagData[25] >> 4; + hdr->cfaLayout = cmp1TagData[25] & 0xF; + hdr->encType = cmp1TagData[26] >> 4; + hdr->imageLevels = cmp1TagData[26] & 0xF; + 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->version != 0x200) || !hdr->mdatHdrSize) + return -1; + if (hdr->encType == 1) + { + if (hdr->nBits > 15) + return -1; + } + else + { + if (hdr->encType && hdr->encType != 3) + return -1; + if (hdr->nBits > 14) + return -1; + } + + if (hdr->nPlanes == 1) + { + if (hdr->cfaLayout || hdr->encType || hdr->nBits != 8) + return -1; + } + else if (hdr->nPlanes != 4 || hdr->f_width & 1 || hdr->f_height & 1 || hdr->tileWidth & 1 || hdr->tileHeight & 1 || + hdr->cfaLayout > 3 || hdr->nBits == 8) + return -1; + + if (hdr->tileWidth > hdr->f_width || hdr->tileHeight > hdr->f_height) + return -1; + + if (hdr->imageLevels > 3 || hdr->hasTileCols > 1 || hdr->hasTileRows > 1) + return -1; + return 0; +} + +#undef _abs +#undef _min +#undef _constrain +#undef libraw_inline diff --git a/rtengine/libraw/src/decoders/decoders_dcraw.cpp b/rtengine/libraw/src/decoders/decoders_dcraw.cpp new file mode 100644 index 000000000..bd70b2dbd --- /dev/null +++ b/rtengine/libraw/src/decoders/decoders_dcraw.cpp @@ -0,0 +1,1701 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" +#include "../../internal/libraw_cameraids.h" + +unsigned LibRaw::getbithuff(int nbits, ushort *huff) +{ +#ifdef LIBRAW_NOTHREADS + static unsigned bitbuf = 0; + static int vbits = 0, reset = 0; +#else +#define bitbuf tls->getbits.bitbuf +#define vbits tls->getbits.vbits +#define reset tls->getbits.reset +#endif + unsigned c; + + if (nbits > 25) + return 0; + if (nbits < 0) + return bitbuf = vbits = reset = 0; + if (nbits == 0 || vbits < 0) + return 0; + while (!reset && vbits < nbits && (c = fgetc(ifp)) != (unsigned)EOF && + !(reset = zero_after_ff && c == 0xff && fgetc(ifp))) + { + bitbuf = (bitbuf << 8) + (uchar)c; + vbits += 8; + } + c = vbits == 0 ? 0 : bitbuf << (32 - vbits) >> (32 - nbits); + if (huff) + { + vbits -= huff[c] >> 8; + c = (uchar)huff[c]; + } + else + vbits -= nbits; + if (vbits < 0) + derror(); + return c; +#ifndef LIBRAW_NOTHREADS +#undef bitbuf +#undef vbits +#undef reset +#endif +} + +/* + Construct a decode tree according the specification in *source. + The first 16 bytes specify how many codes should be 1-bit, 2-bit + 3-bit, etc. Bytes after that are the leaf values. + + For example, if the source is + + { 0,1,4,2,3,1,2,0,0,0,0,0,0,0,0,0, + 0x04,0x03,0x05,0x06,0x02,0x07,0x01,0x08,0x09,0x00,0x0a,0x0b,0xff }, + + then the code is + + 00 0x04 + 010 0x03 + 011 0x05 + 100 0x06 + 101 0x02 + 1100 0x07 + 1101 0x01 + 11100 0x08 + 11101 0x09 + 11110 0x00 + 111110 0x0a + 1111110 0x0b + 1111111 0xff + */ +ushort *LibRaw::make_decoder_ref(const uchar **source) +{ + int max, len, h, i, j; + const uchar *count; + ushort *huff; + + count = (*source += 16) - 17; + for (max = 16; max && !count[max]; max--) + ; + huff = (ushort *)calloc(1 + (1 << max), sizeof *huff); + huff[0] = max; + for (h = len = 1; len <= max; len++) + for (i = 0; i < count[len]; i++, ++*source) + for (j = 0; j < 1 << (max - len); j++) + if (h <= 1 << max) + huff[h++] = len << 8 | **source; + return huff; +} + +ushort *LibRaw::make_decoder(const uchar *source) +{ + return make_decoder_ref(&source); +} + +void LibRaw::crw_init_tables(unsigned table, ushort *huff[2]) +{ + static const uchar first_tree[3][29] = { + {0, 1, 4, 2, 3, 1, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0x04, 0x03, 0x05, 0x06, + 0x02, 0x07, 0x01, 0x08, 0x09, 0x00, 0x0a, 0x0b, 0xff}, + {0, 2, 2, 3, 1, 1, 1, 1, 2, 0, + 0, 0, 0, 0, 0, 0, 0x03, 0x02, 0x04, 0x01, + 0x05, 0x00, 0x06, 0x07, 0x09, 0x08, 0x0a, 0x0b, 0xff}, + {0, 0, 6, 3, 1, 1, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0x06, 0x05, 0x07, 0x04, + 0x08, 0x03, 0x09, 0x02, 0x00, 0x0a, 0x01, 0x0b, 0xff}, + }; + static const uchar second_tree[3][180] = { + {0, 2, 2, 2, 1, 4, 2, 1, 2, 5, 1, 1, + 0, 0, 0, 139, 0x03, 0x04, 0x02, 0x05, 0x01, 0x06, 0x07, 0x08, + 0x12, 0x13, 0x11, 0x14, 0x09, 0x15, 0x22, 0x00, 0x21, 0x16, 0x0a, 0xf0, + 0x23, 0x17, 0x24, 0x31, 0x32, 0x18, 0x19, 0x33, 0x25, 0x41, 0x34, 0x42, + 0x35, 0x51, 0x36, 0x37, 0x38, 0x29, 0x79, 0x26, 0x1a, 0x39, 0x56, 0x57, + 0x28, 0x27, 0x52, 0x55, 0x58, 0x43, 0x76, 0x59, 0x77, 0x54, 0x61, 0xf9, + 0x71, 0x78, 0x75, 0x96, 0x97, 0x49, 0xb7, 0x53, 0xd7, 0x74, 0xb6, 0x98, + 0x47, 0x48, 0x95, 0x69, 0x99, 0x91, 0xfa, 0xb8, 0x68, 0xb5, 0xb9, 0xd6, + 0xf7, 0xd8, 0x67, 0x46, 0x45, 0x94, 0x89, 0xf8, 0x81, 0xd5, 0xf6, 0xb4, + 0x88, 0xb1, 0x2a, 0x44, 0x72, 0xd9, 0x87, 0x66, 0xd4, 0xf5, 0x3a, 0xa7, + 0x73, 0xa9, 0xa8, 0x86, 0x62, 0xc7, 0x65, 0xc8, 0xc9, 0xa1, 0xf4, 0xd1, + 0xe9, 0x5a, 0x92, 0x85, 0xa6, 0xe7, 0x93, 0xe8, 0xc1, 0xc6, 0x7a, 0x64, + 0xe1, 0x4a, 0x6a, 0xe6, 0xb3, 0xf1, 0xd3, 0xa5, 0x8a, 0xb2, 0x9a, 0xba, + 0x84, 0xa4, 0x63, 0xe5, 0xc5, 0xf3, 0xd2, 0xc4, 0x82, 0xaa, 0xda, 0xe4, + 0xf2, 0xca, 0x83, 0xa3, 0xa2, 0xc3, 0xea, 0xc2, 0xe2, 0xe3, 0xff, 0xff}, + {0, 2, 2, 1, 4, 1, 4, 1, 3, 3, 1, 0, + 0, 0, 0, 140, 0x02, 0x03, 0x01, 0x04, 0x05, 0x12, 0x11, 0x06, + 0x13, 0x07, 0x08, 0x14, 0x22, 0x09, 0x21, 0x00, 0x23, 0x15, 0x31, 0x32, + 0x0a, 0x16, 0xf0, 0x24, 0x33, 0x41, 0x42, 0x19, 0x17, 0x25, 0x18, 0x51, + 0x34, 0x43, 0x52, 0x29, 0x35, 0x61, 0x39, 0x71, 0x62, 0x36, 0x53, 0x26, + 0x38, 0x1a, 0x37, 0x81, 0x27, 0x91, 0x79, 0x55, 0x45, 0x28, 0x72, 0x59, + 0xa1, 0xb1, 0x44, 0x69, 0x54, 0x58, 0xd1, 0xfa, 0x57, 0xe1, 0xf1, 0xb9, + 0x49, 0x47, 0x63, 0x6a, 0xf9, 0x56, 0x46, 0xa8, 0x2a, 0x4a, 0x78, 0x99, + 0x3a, 0x75, 0x74, 0x86, 0x65, 0xc1, 0x76, 0xb6, 0x96, 0xd6, 0x89, 0x85, + 0xc9, 0xf5, 0x95, 0xb4, 0xc7, 0xf7, 0x8a, 0x97, 0xb8, 0x73, 0xb7, 0xd8, + 0xd9, 0x87, 0xa7, 0x7a, 0x48, 0x82, 0x84, 0xea, 0xf4, 0xa6, 0xc5, 0x5a, + 0x94, 0xa4, 0xc6, 0x92, 0xc3, 0x68, 0xb5, 0xc8, 0xe4, 0xe5, 0xe6, 0xe9, + 0xa2, 0xa3, 0xe3, 0xc2, 0x66, 0x67, 0x93, 0xaa, 0xd4, 0xd5, 0xe7, 0xf8, + 0x88, 0x9a, 0xd7, 0x77, 0xc4, 0x64, 0xe2, 0x98, 0xa5, 0xca, 0xda, 0xe8, + 0xf3, 0xf6, 0xa9, 0xb2, 0xb3, 0xf2, 0xd2, 0x83, 0xba, 0xd3, 0xff, 0xff}, + {0, 0, 6, 2, 1, 3, 3, 2, 5, 1, 2, 2, + 8, 10, 0, 117, 0x04, 0x05, 0x03, 0x06, 0x02, 0x07, 0x01, 0x08, + 0x09, 0x12, 0x13, 0x14, 0x11, 0x15, 0x0a, 0x16, 0x17, 0xf0, 0x00, 0x22, + 0x21, 0x18, 0x23, 0x19, 0x24, 0x32, 0x31, 0x25, 0x33, 0x38, 0x37, 0x34, + 0x35, 0x36, 0x39, 0x79, 0x57, 0x58, 0x59, 0x28, 0x56, 0x78, 0x27, 0x41, + 0x29, 0x77, 0x26, 0x42, 0x76, 0x99, 0x1a, 0x55, 0x98, 0x97, 0xf9, 0x48, + 0x54, 0x96, 0x89, 0x47, 0xb7, 0x49, 0xfa, 0x75, 0x68, 0xb6, 0x67, 0x69, + 0xb9, 0xb8, 0xd8, 0x52, 0xd7, 0x88, 0xb5, 0x74, 0x51, 0x46, 0xd9, 0xf8, + 0x3a, 0xd6, 0x87, 0x45, 0x7a, 0x95, 0xd5, 0xf6, 0x86, 0xb4, 0xa9, 0x94, + 0x53, 0x2a, 0xa8, 0x43, 0xf5, 0xf7, 0xd4, 0x66, 0xa7, 0x5a, 0x44, 0x8a, + 0xc9, 0xe8, 0xc8, 0xe7, 0x9a, 0x6a, 0x73, 0x4a, 0x61, 0xc7, 0xf4, 0xc6, + 0x65, 0xe9, 0x72, 0xe6, 0x71, 0x91, 0x93, 0xa6, 0xda, 0x92, 0x85, 0x62, + 0xf3, 0xc5, 0xb2, 0xa4, 0x84, 0xba, 0x64, 0xa5, 0xb3, 0xd2, 0x81, 0xe5, + 0xd3, 0xaa, 0xc4, 0xca, 0xf2, 0xb1, 0xe4, 0xd1, 0x83, 0x63, 0xea, 0xc3, + 0xe2, 0x82, 0xf1, 0xa3, 0xc2, 0xa1, 0xc1, 0xe3, 0xa2, 0xe1, 0xff, 0xff}}; + if (table > 2) + table = 2; + huff[0] = make_decoder(first_tree[table]); + huff[1] = make_decoder(second_tree[table]); +} + +/* + Return 0 if the image starts with compressed data, + 1 if it starts with uncompressed low-order bits. + + In Canon compressed data, 0xff is always followed by 0x00. + */ +int LibRaw::canon_has_lowbits() +{ + uchar test[0x4000]; + int ret = 1, i; + + fseek(ifp, 0, SEEK_SET); + fread(test, 1, sizeof test, ifp); + for (i = 540; i < int(sizeof test - 1); i++) + if (test[i] == 0xff) + { + if (test[i + 1]) + return 1; + ret = 0; + } + return ret; +} + +void LibRaw::canon_load_raw() +{ + ushort *pixel, *prow, *huff[2]; + int nblocks, lowbits, i, c, row, r, val; + INT64 save; + int block, diffbuf[64], leaf, len, diff, carry = 0, pnum = 0, base[2]; + + crw_init_tables(tiff_compress, huff); + lowbits = canon_has_lowbits(); + if (!lowbits) + maximum = 0x3ff; + fseek(ifp, 540 + lowbits * raw_height * raw_width / 4, SEEK_SET); + zero_after_ff = 1; + getbits(-1); + try + { + for (row = 0; row < raw_height; row += 8) + { + checkCancel(); + pixel = raw_image + row * raw_width; + nblocks = MIN(8, raw_height - row) * raw_width >> 6; + for (block = 0; block < nblocks; block++) + { + memset(diffbuf, 0, sizeof diffbuf); + for (i = 0; i < 64; i++) + { + leaf = gethuff(huff[i > 0]); + if (leaf == 0 && i) + break; + if (leaf == 0xff) + continue; + i += leaf >> 4; + len = leaf & 15; + if (len == 0) + continue; + diff = getbits(len); + if ((diff & (1 << (len - 1))) == 0) + diff -= (1 << len) - 1; + if (i < 64) + diffbuf[i] = diff; + } + diffbuf[0] += carry; + carry = diffbuf[0]; + for (i = 0; i < 64; i++) + { + if (pnum++ % raw_width == 0) + base[0] = base[1] = 512; + if ((pixel[(block << 6) + i] = base[i & 1] += diffbuf[i]) >> 10) + derror(); + } + } + if (lowbits) + { + save = ftell(ifp); + fseek(ifp, 26 + row * raw_width / 4, SEEK_SET); + for (prow = pixel, i = 0; i < raw_width * 2; i++) + { + c = fgetc(ifp); + for (r = 0; r < 8; r += 2, prow++) + { + val = (*prow << 2) + ((c >> r) & 3); + if (raw_width == 2672 && val < 512) + val += 2; + *prow = val; + } + } + fseek(ifp, save, SEEK_SET); + } + } + } + catch (...) + { + FORC(2) free(huff[c]); + throw; + } + FORC(2) free(huff[c]); +} + +int LibRaw::ljpeg_start(struct jhead *jh, int info_only) +{ + ushort c, tag, len; + int cnt = 0; + std::vector data_buffer(0x10000); + uchar* data = &data_buffer[0]; + const uchar *dp; + + memset(jh, 0, sizeof *jh); + jh->restart = INT_MAX; + if (fread(data, 2, 1, ifp) != 1 || data[1] != 0xd8) + return 0; + do + { + if (feof(ifp)) + return 0; + if (cnt++ > 1024) + return 0; // 1024 tags limit + if (fread(data, 2, 2, ifp) != 2) + return 0; + tag = data[0] << 8 | data[1]; + len = (data[2] << 8 | data[3]) - 2; + if (tag <= 0xff00) + return 0; + if (fread(data, 1, len, ifp) != len) + return 0; + switch (tag) + { + case 0xffc3: // start of frame; lossless, Huffman + jh->sraw = ((data[7] >> 4) * (data[7] & 15) - 1) & 3; + case 0xffc1: + case 0xffc0: + jh->algo = tag & 0xff; + jh->bits = data[0]; + jh->high = data[1] << 8 | data[2]; + jh->wide = data[3] << 8 | data[4]; + jh->clrs = data[5] + jh->sraw; + if (len == 9 && !dng_version) + getc(ifp); + break; + case 0xffc4: // define Huffman tables + if (info_only) + break; + for (dp = data; dp < data + len && !((c = *dp++) & -20);) + jh->free[c] = jh->huff[c] = make_decoder_ref(&dp); + break; + case 0xffda: // start of scan + jh->psv = data[1 + data[0] * 2]; + jh->bits -= data[3 + data[0] * 2] & 15; + break; + case 0xffdb: + FORC(64) jh->quant[c] = data[c * 2 + 1] << 8 | data[c * 2 + 2]; + break; + case 0xffdd: + jh->restart = data[0] << 8 | data[1]; + } + } while (tag != 0xffda); + if (jh->bits > 16 || jh->clrs > 6 || !jh->bits || !jh->high || !jh->wide || + !jh->clrs) + return 0; + if (info_only) + return 1; + if (!jh->huff[0]) + return 0; + FORC(19) if (!jh->huff[c + 1]) jh->huff[c + 1] = jh->huff[c]; + if (jh->sraw) + { + FORC(4) jh->huff[2 + c] = jh->huff[1]; + { + int c; + FORC(jh->sraw) jh->huff[1 + c] = jh->huff[0]; + } + } + jh->row = (ushort *)calloc(jh->wide * jh->clrs, 16); + return zero_after_ff = 1; +} + +void LibRaw::ljpeg_end(struct jhead *jh) +{ + int c; + FORC4 if (jh->free[c]) free(jh->free[c]); + free(jh->row); +} + +int LibRaw::ljpeg_diff(ushort *huff) +{ + int len, diff; + if (!huff) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + len = gethuff(huff); + if (len == 16 && (!dng_version || dng_version >= 0x1010000)) + return -32768; + diff = getbits(len); + + + if ((diff & (1 << (len - 1))) == 0) + diff -= (1 << len) - 1; + return diff; +} + +ushort *LibRaw::ljpeg_row(int jrow, struct jhead *jh) +{ + int col, c, diff, pred, spred = 0; + ushort mark = 0, *row[3]; + + // Use the optimized, unrolled version if possible. + if (!jh->sraw) + return ljpeg_row_unrolled(jrow, jh); + + if (jh->restart != 0 && jrow * jh->wide % jh->restart == 0) + { + FORC(6) jh->vpred[c] = 1 << (jh->bits - 1); + if (jrow) + { + fseek(ifp, -2, SEEK_CUR); + do + mark = (mark << 8) + (c = fgetc(ifp)); + while (c != EOF && mark >> 4 != 0xffd); + } + getbits(-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]); + if (jh->sraw && c <= jh->sraw && (col | c)) + pred = spred; + else if (col) + pred = row[0][-jh->clrs]; + else + pred = (jh->vpred[c] += diff) - diff; + if (jrow && col) + switch (jh->psv) + { + case 1: + break; + case 2: + pred = row[1][0]; + break; + case 3: + pred = row[1][-jh->clrs]; + break; + case 4: + pred = pred + row[1][0] - row[1][-jh->clrs]; + break; + case 5: + pred = pred + ((row[1][0] - row[1][-jh->clrs]) >> 1); + break; + case 6: + pred = row[1][0] + ((pred - row[1][-jh->clrs]) >> 1); + break; + case 7: + pred = (pred + row[1][0]) >> 1; + break; + default: + pred = 0; + } + if ((**row = pred + diff) >> jh->bits) + if(!(load_flags & 512)) + derror(); + if (c <= jh->sraw) + spred = **row; + row[0]++; + row[1]++; + } + return row[2]; +} + +ushort *LibRaw::ljpeg_row_unrolled(int jrow, struct jhead *jh) +{ + int col, c, diff, pred; + ushort mark = 0, *row[3]; + + if (jh->restart != 0 && jrow * jh->wide % jh->restart == 0) + { + FORC(6) jh->vpred[c] = 1 << (jh->bits - 1); + if (jrow) + { + fseek(ifp, -2, SEEK_CUR); + do + mark = (mark << 8) + (c = fgetc(ifp)); + while (c != EOF && mark >> 4 != 0xffd); + } + getbits(-1); + } + FORC3 row[c] = jh->row + jh->wide * jh->clrs * ((jrow + c) & 1); + + // The first column uses one particular predictor. + FORC(jh->clrs) + { + diff = ljpeg_diff(jh->huff[c]); + pred = (jh->vpred[c] += diff) - diff; + if ((**row = pred + diff) >> jh->bits) + derror(); + row[0]++; + row[1]++; + } + + if (!jrow) + { + for (col = 1; col < jh->wide; col++) + FORC(jh->clrs) + { + diff = ljpeg_diff(jh->huff[c]); + pred = row[0][-jh->clrs]; + if ((**row = pred + diff) >> jh->bits) + derror(); + row[0]++; + row[1]++; + } + } + else if (jh->psv == 1) + { + for (col = 1; col < jh->wide; col++) + FORC(jh->clrs) + { + diff = ljpeg_diff(jh->huff[c]); + pred = row[0][-jh->clrs]; + if ((**row = pred + diff) >> jh->bits) + derror(); + row[0]++; + } + } + else + { + for (col = 1; col < jh->wide; col++) + FORC(jh->clrs) + { + diff = ljpeg_diff(jh->huff[c]); + pred = row[0][-jh->clrs]; + switch (jh->psv) + { + case 1: + break; + case 2: + pred = row[1][0]; + break; + case 3: + pred = row[1][-jh->clrs]; + break; + case 4: + pred = pred + row[1][0] - row[1][-jh->clrs]; + break; + case 5: + pred = pred + ((row[1][0] - row[1][-jh->clrs]) >> 1); + break; + case 6: + pred = row[1][0] + ((pred - row[1][-jh->clrs]) >> 1); + break; + case 7: + pred = (pred + row[1][0]) >> 1; + break; + default: + pred = 0; + } + if ((**row = pred + diff) >> jh->bits) + derror(); + row[0]++; + row[1]++; + } + } + return row[2]; +} + +void LibRaw::lossless_jpeg_load_raw() +{ + int jwide, jhigh, jrow, jcol, val, jidx, i, j, row = 0, col = 0; + struct jhead jh; + ushort *rp; + + if (!ljpeg_start(&jh, 0)) + return; + + if (jh.wide < 1 || jh.high < 1 || jh.clrs < 1 || jh.bits < 1) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + if(cr2_slice[0] && !cr2_slice[1]) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + jwide = jh.wide * jh.clrs; + jhigh = jh.high; + if (jh.clrs == 4 && jwide >= raw_width * 2) + jhigh *= 2; + + try + { + for (jrow = 0; jrow < jh.high; jrow++) + { + checkCancel(); + rp = ljpeg_row(jrow, &jh); + if (load_flags & 1) + row = jrow & 1 ? height - 1 - jrow / 2 : jrow / 2; + for (jcol = 0; jcol < jwide; jcol++) + { + val = curve[*rp++]; + if (cr2_slice[0]) + { + jidx = jrow * jwide + jcol; + i = jidx / (cr2_slice[1] * raw_height); + if ((j = i >= cr2_slice[0])) + i = cr2_slice[0]; + if(!cr2_slice[1+j]) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + jidx -= i * (cr2_slice[1] * raw_height); + row = jidx / cr2_slice[1 + j]; + col = jidx % cr2_slice[1 + j] + i * cr2_slice[1]; + } + if (raw_width == 3984 && (col -= 2) < 0) + col += (row--, raw_width); + if (row > raw_height) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + if ((unsigned)row < raw_height) + RAW(row, col) = val; + if (++col >= raw_width) + col = (row++, 0); + } + } + } + catch (...) + { + ljpeg_end(&jh); + throw; + } + ljpeg_end(&jh); +} + +void LibRaw::canon_sraw_load_raw() +{ + struct jhead jh; + short *rp = 0, (*ip)[4]; + int jwide, slice, scol, ecol, row, col, jrow = 0, jcol = 0, pix[3], c; + int v[3] = {0, 0, 0}, ver, hue; + int saved_w = width, saved_h = height; + char *cp; + + if(!image) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + if (!ljpeg_start(&jh, 0) || jh.clrs < 4) + return; + jwide = (jh.wide >>= 1) * jh.clrs; + + if (jwide < 32 || jwide > 65535) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + if (load_flags & 256) + { + width = raw_width; + height = raw_height; + } + + try + { + for (ecol = slice = 0; slice <= cr2_slice[0]; slice++) + { + scol = ecol; + ecol += cr2_slice[1] * 2 / jh.clrs; + if (!cr2_slice[0] || ecol > raw_width - 1) + ecol = raw_width & -2; + for (row = 0; row < height; row += (jh.clrs >> 1) - 1) + { + checkCancel(); + ip = (short(*)[4])image + row * width; + for (col = scol; col < ecol; col += 2, jcol += jh.clrs) + { + if ((jcol %= jwide) == 0) + rp = (short *)ljpeg_row(jrow++, &jh); + if (col >= width) + continue; + if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SRAW_NO_INTERPOLATE) + { + FORC(jh.clrs - 2) + { + ip[col + (c >> 1) * width + (c & 1)][0] = rp[jcol + c]; + ip[col + (c >> 1) * width + (c & 1)][1] = + ip[col + (c >> 1) * width + (c & 1)][2] = 8192; + } + ip[col][1] = rp[jcol + jh.clrs - 2] - 8192; + ip[col][2] = rp[jcol + jh.clrs - 1] - 8192; + } + else if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SRAW_NO_RGB) + { + FORC(jh.clrs - 2) + ip[col + (c >> 1) * width + (c & 1)][0] = rp[jcol + c]; + ip[col][1] = rp[jcol + jh.clrs - 2] - 8192; + ip[col][2] = rp[jcol + jh.clrs - 1] - 8192; + } + else + { + FORC(jh.clrs - 2) + ip[col + (c >> 1) * width + (c & 1)][0] = rp[jcol + c]; + ip[col][1] = rp[jcol + jh.clrs - 2] - 16384; + ip[col][2] = rp[jcol + jh.clrs - 1] - 16384; + } + } + } + } + } + catch (...) + { + ljpeg_end(&jh); + throw; + } + + if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SRAW_NO_INTERPOLATE) + { + ljpeg_end(&jh); + maximum = 0x3fff; + height = saved_h; + width = saved_w; + return; + } + + try + { + for (cp = model2; *cp && !isdigit(*cp); cp++) + ; + sscanf(cp, "%d.%d.%d", v, v + 1, v + 2); + ver = (v[0] * 1000 + v[1]) * 1000 + v[2]; + hue = (jh.sraw + 1) << 2; + if (unique_id >= 0x80000281ULL || + (unique_id == 0x80000218ULL && ver > 1000006)) + hue = jh.sraw << 1; + ip = (short(*)[4])image; + rp = ip[0]; + for (row = 0; row < height; row++, ip += width) + { + checkCancel(); + if (row & (jh.sraw >> 1)) + { + for (col = 0; col < width; col += 2) + for (c = 1; c < 3; c++) + if (row == height - 1) + { + ip[col][c] = ip[col - width][c]; + } + else + { + ip[col][c] = (ip[col - width][c] + ip[col + width][c] + 1) >> 1; + } + } + for (col = 1; col < width; col += 2) + for (c = 1; c < 3; c++) + if (col == width - 1) + ip[col][c] = ip[col - 1][c]; + else + ip[col][c] = (ip[col - 1][c] + ip[col + 1][c] + 1) >> 1; + } + if (!(imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SRAW_NO_RGB)) + for (; rp < ip[0]; rp += 4) + { + checkCancel(); + if ((unique_id == CanonID_EOS_5D_Mark_II) || + (unique_id == CanonID_EOS_7D) || + (unique_id == CanonID_EOS_50D) || + (unique_id == CanonID_EOS_1D_Mark_IV) || + (unique_id == CanonID_EOS_60D)) + { + rp[1] = (rp[1] << 2) + hue; + rp[2] = (rp[2] << 2) + hue; + pix[0] = rp[0] + ((50 * rp[1] + 22929 * rp[2]) >> 14); + pix[1] = rp[0] + ((-5640 * rp[1] - 11751 * rp[2]) >> 14); + pix[2] = rp[0] + ((29040 * rp[1] - 101 * rp[2]) >> 14); + } + else + { + if (unique_id < CanonID_EOS_5D_Mark_II) + rp[0] -= 512; + pix[0] = rp[0] + rp[2]; + pix[2] = rp[0] + rp[1]; + pix[1] = rp[0] + ((-778 * rp[1] - (rp[2] << 11)) >> 12); + } + FORC3 rp[c] = CLIP15(pix[c] * sraw_mul[c] >> 10); + } + } + catch (...) + { + ljpeg_end(&jh); + throw; + } + height = saved_h; + width = saved_w; + ljpeg_end(&jh); + maximum = 0x3fff; +} + +void LibRaw::ljpeg_idct(struct jhead *jh) +{ + int c, i, j, len, skip, coef; + float work[3][8][8]; + static float cs[106] = {0}; + static const uchar zigzag[80] = { + 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63}; + + if (!cs[0]) + FORC(106) cs[c] = cos((c & 31) * M_PI / 16) / 2; + memset(work, 0, sizeof work); + work[0][0][0] = jh->vpred[0] += ljpeg_diff(jh->huff[0]) * jh->quant[0]; + for (i = 1; i < 64; i++) + { + len = gethuff(jh->huff[16]); + i += skip = len >> 4; + if (!(len &= 15) && skip < 15) + break; + coef = getbits(len); + if ((coef & (1 << (len - 1))) == 0) + coef -= (1 << len) - 1; + ((float *)work)[zigzag[i]] = coef * jh->quant[i]; + } + FORC(8) work[0][0][c] *= float(M_SQRT1_2); + FORC(8) work[0][c][0] *= float(M_SQRT1_2); + for (i = 0; i < 8; i++) + for (j = 0; j < 8; j++) + FORC(8) work[1][i][j] += work[0][i][c] * cs[(j * 2 + 1) * c]; + for (i = 0; i < 8; i++) + for (j = 0; j < 8; j++) + FORC(8) work[2][i][j] += work[1][c][j] * cs[(i * 2 + 1) * c]; + + FORC(64) jh->idct[c] = CLIP(((float *)work[2])[c] + 0.5); +} + +void LibRaw::pentax_load_raw() +{ + ushort bit[2][15], huff[4097]; + int dep, row, col, diff, c, i; + ushort vpred[2][2] = {{0, 0}, {0, 0}}, hpred[2]; + + fseek(ifp, meta_offset, SEEK_SET); + dep = (get2() + 12) & 15; + fseek(ifp, 12, SEEK_CUR); + FORC(dep) bit[0][c] = get2(); + FORC(dep) bit[1][c] = fgetc(ifp); + FORC(dep) + for (i = bit[0][c]; i <= ((bit[0][c] + (4096 >> bit[1][c]) - 1) & 4095);) + huff[++i] = bit[1][c] << 8 | c; + huff[0] = 12; + fseek(ifp, data_offset, SEEK_SET); + getbits(-1); + for (row = 0; row < raw_height; row++) + { + checkCancel(); + for (col = 0; col < raw_width; col++) + { + diff = ljpeg_diff(huff); + if (col < 2) + hpred[col] = vpred[row & 1][col] += diff; + else + hpred[col & 1] += diff; + RAW(row, col) = hpred[col & 1]; + if (hpred[col & 1] >> tiff_bps) + derror(); + } + } +} +void LibRaw::nikon_read_curve() +{ + ushort ver0, ver1, vpred[2][2], csize; + int i, step, max; + + fseek(ifp, meta_offset, SEEK_SET); + ver0 = fgetc(ifp); + ver1 = fgetc(ifp); + if (ver0 == 0x49 || ver1 == 0x58) + fseek(ifp, 2110, SEEK_CUR); + read_shorts(vpred[0], 4); + step = max = 1 << tiff_bps & 0x7fff; + if ((csize = get2()) > 1) + step = max / (csize - 1); + if (ver0 == 0x44 && (ver1 == 0x20 || (ver1 == 0x40 && step > 3)) && step > 0) + { + if (ver1 == 0x40) + { + step /= 4; + max /= 4; + } + for (i = 0; i < csize; i++) + curve[i * step] = get2(); + for (i = 0; i < max; i++) + curve[i] = (curve[i - i % step] * (step - i % step) + + curve[i - i % step + step] * (i % step)) / + step; + } + else if (ver0 != 0x46 && csize <= 0x4001) + read_shorts(curve, max = csize); +} + +void LibRaw::nikon_load_raw() +{ + static const uchar nikon_tree[][32] = { + {0, 1, 5, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, /* 12-bit lossy */ + 5, 4, 3, 6, 2, 7, 1, 0, 8, 9, 11, 10, 12}, + {0, 1, 5, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, + 0, 0, /* 12-bit lossy after split */ + 0x39, 0x5a, 0x38, 0x27, 0x16, 5, 4, 3, 2, 1, 0, 11, 12, 12}, + + {0, 1, 4, 2, 3, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 12-bit lossless */ + 5, 4, 6, 3, 7, 2, 8, 1, 9, 0, 10, 11, 12}, + {0, 1, 4, 3, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, /* 14-bit lossy */ + 5, 6, 4, 7, 8, 3, 9, 2, 1, 0, 10, 11, 12, 13, 14}, + {0, 1, 5, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, + 0, /* 14-bit lossy after split */ + 8, 0x5c, 0x4b, 0x3a, 0x29, 7, 6, 5, 4, 3, 2, 1, 0, 13, 14}, + {0, 1, 4, 2, 2, 3, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, /* 14-bit lossless */ + 7, 6, 8, 5, 9, 4, 10, 3, 11, 12, 2, 0, 1, 13, 14}}; + ushort *huff, ver0, ver1, vpred[2][2], hpred[2]; + int i, min, max, tree = 0, split = 0, row, col, len, shl, diff; + + fseek(ifp, meta_offset, SEEK_SET); + ver0 = fgetc(ifp); + ver1 = fgetc(ifp); + if (ver0 == 0x49 || ver1 == 0x58) + fseek(ifp, 2110, SEEK_CUR); + if (ver0 == 0x46) + tree = 2; + if (tiff_bps == 14) + tree += 3; + read_shorts(vpred[0], 4); + max = 1 << tiff_bps & 0x7fff; + if (ver0 == 0x44 && (ver1 == 0x20 || ver1 == 0x40)) + { + if (ver1 == 0x40) + max /= 4; + fseek(ifp, meta_offset + 562, SEEK_SET); + split = get2(); + } + + while (max > 2 && (curve[max - 2] == curve[max - 1])) + max--; + huff = make_decoder(nikon_tree[tree]); + fseek(ifp, data_offset, SEEK_SET); + getbits(-1); + try + { + for (min = row = 0; row < height; row++) + { + checkCancel(); + if (split && row == split) + { + free(huff); + huff = make_decoder(nikon_tree[tree + 1]); + max += (min = 16) << 1; + } + for (col = 0; col < raw_width; col++) + { + i = gethuff(huff); + len = i & 15; + shl = i >> 4; + diff = ((getbits(len - shl) << 1) + 1) << shl >> 1; + if (len > 0 && (diff & (1 << (len - 1))) == 0) + diff -= (1 << len) - !shl; + if (col < 2) + hpred[col] = vpred[row & 1][col] += diff; + else + hpred[col & 1] += diff; + if ((ushort)(hpred[col & 1] + min) >= max) + derror(); + RAW(row, col) = curve[LIM((short)hpred[col & 1], 0, 0x3fff)]; + } + } + } + catch (...) + { + free(huff); + throw; + } + free(huff); +} + +void LibRaw::nikon_yuv_load_raw() +{ + if (!image) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + int row, col, yuv[4]={0,0,0,0}, rgb[3], b, c; + UINT64 bitbuf = 0; + float cmul[4]; + FORC4 { cmul[c] = cam_mul[c] > 0.001f ? cam_mul[c] : 1.f; } + for (row = 0; row < raw_height; row++) + { + checkCancel(); + + for (col = 0; col < raw_width; col++) + { + if (!(b = col & 1)) + { + bitbuf = 0; + FORC(6) bitbuf |= (UINT64)fgetc(ifp) << c * 8; + FORC(4) yuv[c] = (bitbuf >> c * 12 & 0xfff) - (c >> 1 << 11); + } + rgb[0] = yuv[b] + 1.370705 * yuv[3]; + rgb[1] = yuv[b] - 0.337633 * yuv[2] - 0.698001 * yuv[3]; + rgb[2] = yuv[b] + 1.732446 * yuv[2]; + FORC3 image[row * width + col][c] = + curve[LIM(rgb[c], 0, 0xfff)] / cmul[c]; + } + } +} + +void LibRaw::rollei_load_raw() +{ + uchar pixel[10]; + unsigned iten = 0, isix, i, buffer = 0, todo[16]; + if (raw_width > 32767 || raw_height > 32767) + throw LIBRAW_EXCEPTION_IO_BADFILE; + unsigned maxpixel = raw_width * (raw_height + 7); + + isix = raw_width * raw_height * 5 / 8; + while (fread(pixel, 1, 10, ifp) == 10) + { + checkCancel(); + for (i = 0; i < 10; i += 2) + { + todo[i] = iten++; + todo[i + 1] = pixel[i] << 8 | pixel[i + 1]; + buffer = pixel[i] >> 2 | buffer << 6; + } + for (; i < 16; i += 2) + { + todo[i] = isix++; + todo[i + 1] = buffer >> (14 - i) * 5; + } + for (i = 0; i < 16; i += 2) + if (todo[i] < maxpixel) + raw_image[todo[i]] = (todo[i + 1] & 0x3ff); + else + derror(); + } + maximum = 0x3ff; +} + +void LibRaw::nokia_load_raw() +{ + uchar *dp; + int rev, dwide, row, col, c; + double sum[] = {0, 0}; + + rev = 3 * (order == 0x4949); + dwide = (raw_width * 5 + 1) / 4; +#ifdef USE_6BY9RPI + if (raw_stride) + dwide = raw_stride; +#endif + std::vector data(dwide * 2 + 4); + for (row = 0; row < raw_height; row++) + { + checkCancel(); + if (fread(data.data() + dwide, 1, dwide, ifp) < dwide) + derror(); + FORC(dwide) data[c] = data[dwide + (c ^ rev)]; + for (dp = data.data(), col = 0; col < raw_width; dp += 5, col += 4) + FORC4 RAW(row, col + c) = (dp[c] << 2) | (dp[4] >> (c << 1) & 3); + } + maximum = 0x3ff; +#ifdef USE_6BY9RPI + if (!strcmp(make, "OmniVision") || + !strcmp(make, "Sony") || + !strcmp(make, "RaspberryPi")) return; +#else + if (strncmp(make, "OmniVision", 10)) + return; +#endif + row = raw_height / 2; + FORC(width - 1) + { + sum[c & 1] += SQR(RAW(row, c) - RAW(row + 1, c + 1)); + sum[~c & 1] += SQR(RAW(row + 1, c) - RAW(row, c + 1)); + } + if (sum[1] > sum[0]) + filters = 0x4b4b4b4b; +} + +unsigned LibRaw::pana_data(int nb, unsigned *bytes) +{ +#ifndef LIBRAW_NOTHREADS +#define vpos tls->pana_data.vpos +#define buf tls->pana_data.buf +#else + static uchar buf[0x4002]; + static int vpos; +#endif + int byte; + + if (!nb && !bytes) + return vpos = 0; + + if (!vpos) + { + fread(buf + load_flags, 1, 0x4000 - load_flags, ifp); + fread(buf, 1, load_flags, ifp); + } + + if (pana_encoding == 5) + { + for (byte = 0; byte < 16; byte++) + { + bytes[byte] = buf[vpos++]; + vpos &= 0x3FFF; + } + } + else + { + vpos = (vpos - nb) & 0x1ffff; + byte = vpos >> 3 ^ 0x3ff0; + return (buf[byte] | buf[byte + 1] << 8) >> (vpos & 7) & ~((~0u) << nb); + } + return 0; +#ifndef LIBRAW_NOTHREADS +#undef vpos +#undef buf +#endif +} + +void LibRaw::panasonic_load_raw() +{ + int row, col, i, j, sh = 0, pred[2], nonz[2]; + unsigned bytes[16]; + memset(bytes,0,sizeof(bytes)); // make gcc11 happy + ushort *raw_block_data; + + pana_data(0, 0); + + int enc_blck_size = pana_bpp == 12 ? 10 : 9; + if (pana_encoding == 5) + { + for (row = 0; row < raw_height; row++) + { + raw_block_data = raw_image + row * raw_width; + checkCancel(); + for (col = 0; col < raw_width; col += enc_blck_size) + { + pana_data(0, bytes); + + if (pana_bpp == 12) + { + raw_block_data[col] = ((bytes[1] & 0xF) << 8) + bytes[0]; + raw_block_data[col + 1] = 16 * bytes[2] + (bytes[1] >> 4); + raw_block_data[col + 2] = ((bytes[4] & 0xF) << 8) + bytes[3]; + raw_block_data[col + 3] = 16 * bytes[5] + (bytes[4] >> 4); + raw_block_data[col + 4] = ((bytes[7] & 0xF) << 8) + bytes[6]; + raw_block_data[col + 5] = 16 * bytes[8] + (bytes[7] >> 4); + raw_block_data[col + 6] = ((bytes[10] & 0xF) << 8) + bytes[9]; + raw_block_data[col + 7] = 16 * bytes[11] + (bytes[10] >> 4); + raw_block_data[col + 8] = ((bytes[13] & 0xF) << 8) + bytes[12]; + raw_block_data[col + 9] = 16 * bytes[14] + (bytes[13] >> 4); + } + else if (pana_bpp == 14) + { + raw_block_data[col] = bytes[0] + ((bytes[1] & 0x3F) << 8); + raw_block_data[col + 1] = + (bytes[1] >> 6) + 4 * (bytes[2]) + ((bytes[3] & 0xF) << 10); + raw_block_data[col + 2] = + (bytes[3] >> 4) + 16 * (bytes[4]) + ((bytes[5] & 3) << 12); + raw_block_data[col + 3] = ((bytes[5] & 0xFC) >> 2) + (bytes[6] << 6); + raw_block_data[col + 4] = bytes[7] + ((bytes[8] & 0x3F) << 8); + raw_block_data[col + 5] = + (bytes[8] >> 6) + 4 * bytes[9] + ((bytes[10] & 0xF) << 10); + raw_block_data[col + 6] = + (bytes[10] >> 4) + 16 * bytes[11] + ((bytes[12] & 3) << 12); + raw_block_data[col + 7] = + ((bytes[12] & 0xFC) >> 2) + (bytes[13] << 6); + raw_block_data[col + 8] = bytes[14] + ((bytes[15] & 0x3F) << 8); + } + } + } + } + else + { + if (load_flags >= 0x4000) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + for (row = 0; row < raw_height; row++) + { + checkCancel(); + for (col = 0; col < raw_width; col++) + { + if ((i = col % 14) == 0) + pred[0] = pred[1] = nonz[0] = nonz[1] = 0; + if (i % 3 == 2) + sh = 4 >> (3 - pana_data(2, 0)); + if (nonz[i & 1]) + { + if ((j = pana_data(8, 0))) + { + if ((pred[i & 1] -= 0x80 << sh) < 0 || sh == 4) + pred[i & 1] &= ~((~0u) << sh); + pred[i & 1] += j << sh; + } + } + else if ((nonz[i & 1] = pana_data(8, 0)) || i > 11) + pred[i & 1] = nonz[i & 1] << 4 | pana_data(4, 0); + if ((RAW(row, col) = pred[col & 1]) > 4098 && col < width && + row < height) + derror(); + } + } + } +} + +void LibRaw::olympus_load_raw() +{ + ushort huff[4096]; + int row, col, nbits, sign, low, high, i, c, w, n, nw; + int acarry[2][3], *carry, pred, diff; + + huff[n = 0] = 0xc0c; + for (i = 12; i--;) + FORC(2048 >> i) huff[++n] = (i + 1) << 8 | i; + fseek(ifp, 7, SEEK_CUR); + getbits(-1); + for (row = 0; row < height; row++) + { + checkCancel(); + memset(acarry, 0, sizeof acarry); + for (col = 0; col < raw_width; col++) + { + carry = acarry[col & 1]; + i = 2 * (carry[2] < 3); + for (nbits = 2 + i; (ushort)carry[0] >> (nbits + i); nbits++) + ; + low = (sign = getbits(3)) & 3; + sign = sign << 29 >> 31; + if ((high = getbithuff(12, huff)) == 12) + high = getbits(16 - nbits) >> 1; + carry[0] = (high << nbits) | getbits(nbits); + diff = (carry[0] ^ sign) + carry[1]; + carry[1] = (diff * 3 + carry[1]) >> 5; + carry[2] = carry[0] > 16 ? 0 : carry[2] + 1; + if (col >= width) + continue; + if (row < 2 && col < 2) + pred = 0; + else if (row < 2) + pred = RAW(row, col - 2); + else if (col < 2) + pred = RAW(row - 2, col); + else + { + w = RAW(row, col - 2); + n = RAW(row - 2, col); + nw = RAW(row - 2, col - 2); + if ((w < nw && nw < n) || (n < nw && nw < w)) + { + if (ABS(w - nw) > 32 || ABS(n - nw) > 32) + pred = w + n - nw; + else + pred = (w + n) >> 1; + } + else + pred = ABS(w - nw) > ABS(n - nw) ? w : n; + } + if ((RAW(row, col) = pred + ((diff << 2) | low)) >> 12) + derror(); + } + } +} + +void LibRaw::minolta_rd175_load_raw() +{ + uchar pixel[768]; + unsigned irow, box, row, col; + + for (irow = 0; irow < 1481; irow++) + { + checkCancel(); + if (fread(pixel, 1, 768, ifp) < 768) + derror(); + box = irow / 82; + row = irow % 82 * 12 + ((box < 12) ? box | 1 : (box - 12) * 2); + switch (irow) + { + case 1477: + case 1479: + continue; + case 1476: + row = 984; + break; + case 1480: + row = 985; + break; + case 1478: + row = 985; + box = 1; + } + if ((box < 12) && (box & 1)) + { + for (col = 0; col < 1533; col++, row ^= 1) + if (col != 1) + RAW(row, col) = (col + 1) & 2 + ? pixel[col / 2 - 1] + pixel[col / 2 + 1] + : pixel[col / 2] << 1; + RAW(row, 1) = pixel[1] << 1; + RAW(row, 1533) = pixel[765] << 1; + } + else + for (col = row & 1; col < 1534; col += 2) + RAW(row, col) = pixel[col / 2] << 1; + } + maximum = 0xff << 1; +} + +void LibRaw::quicktake_100_load_raw() +{ + std::vector pixel_buffer(484 * 644, 0x80); + uchar* pixel = &pixel_buffer[0]; + static const short gstep[16] = {-89, -60, -44, -32, -22, -15, -8, -2, + 2, 8, 15, 22, 32, 44, 60, 89}; + static const short rstep[6][4] = {{-3, -1, 1, 3}, {-5, -1, 1, 5}, + {-8, -2, 2, 8}, {-13, -3, 3, 13}, + {-19, -4, 4, 19}, {-28, -6, 6, 28}}; + static const short t_curve[256] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 86, 88, 90, + 92, 94, 97, 99, 101, 103, 105, 107, 110, 112, 114, 116, 118, 120, + 123, 125, 127, 129, 131, 134, 136, 138, 140, 142, 144, 147, 149, 151, + 153, 155, 158, 160, 162, 164, 166, 168, 171, 173, 175, 177, 179, 181, + 184, 186, 188, 190, 192, 195, 197, 199, 201, 203, 205, 208, 210, 212, + 214, 216, 218, 221, 223, 226, 230, 235, 239, 244, 248, 252, 257, 261, + 265, 270, 274, 278, 283, 287, 291, 296, 300, 305, 309, 313, 318, 322, + 326, 331, 335, 339, 344, 348, 352, 357, 361, 365, 370, 374, 379, 383, + 387, 392, 396, 400, 405, 409, 413, 418, 422, 426, 431, 435, 440, 444, + 448, 453, 457, 461, 466, 470, 474, 479, 483, 487, 492, 496, 500, 508, + 519, 531, 542, 553, 564, 575, 587, 598, 609, 620, 631, 643, 654, 665, + 676, 687, 698, 710, 721, 732, 743, 754, 766, 777, 788, 799, 810, 822, + 833, 844, 855, 866, 878, 889, 900, 911, 922, 933, 945, 956, 967, 978, + 989, 1001, 1012, 1023}; + int rb, row, col, sharp, val = 0; + + if (width > 640 || height > 480) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + getbits(-1); + for (row = 2; row < height + 2; row++) + { + checkCancel(); + for (col = 2 + (row & 1); col < width + 2; col += 2) + { + val = ((pixel[(row - 1) * 644 + col - 1] + 2 * pixel[(row - 1) * 644 + col + 1] + pixel[row * 644 + col - 2]) >> 2) + gstep[getbits(4)]; + pixel[row * 644 + col] = val = LIM(val, 0, 255); + if (col < 4) + pixel[row * 644 + col - 2] = pixel[(row + 1) * 644 + (~row & 1)] = val; + if (row == 2) + pixel[(row - 1) * 644 + col + 1] = pixel[(row - 1) * 644 + col + 3] = val; + } + pixel[row * 644 + col] = val; + } + for (rb = 0; rb < 2; rb++) + for (row = 2 + rb; row < height + 2; row += 2) + { + checkCancel(); + for (col = 3 - (row & 1); col < width + 2; col += 2) + { + if (row < 4 || col < 4) + sharp = 2; + else + { + val = ABS(pixel[(row - 2) * 644 + col] - pixel[row * 644 + col - 2]) + ABS(pixel[(row - 2) * 644 + col] - pixel[(row - 2) * 644 + col - 2]) + + ABS(pixel[row * 644 + col - 2] - pixel[(row - 2) * 644 + col - 2]); + sharp = val < 4 + ? 0 + : val < 8 + ? 1 + : val < 16 ? 2 : val < 32 ? 3 : val < 48 ? 4 : 5; + } + val = ((pixel[(row - 2) * 644 + col] + pixel[row * 644 + col - 2]) >> 1) + rstep[sharp][getbits(2)]; + pixel[row * 644 + col] = val = LIM(val, 0, 255); + if (row < 4) + pixel[(row - 2) * 644 + col + 2] = val; + if (col < 4) + pixel[(row + 2) * 644 + col - 2] = val; + } + } + for (row = 2; row < height + 2; row++) + { + checkCancel(); + for (col = 3 - (row & 1); col < width + 2; col += 2) + { + val = ((pixel[row * 644 + col - 1] + (pixel[row * 644 + col] << 2) + pixel[row * 644 + col + 1]) >> 1) - 0x100; + pixel[row * 644 + col] = LIM(val, 0, 255); + } + } + for (row = 0; row < height; row++) + { + checkCancel(); + for (col = 0; col < width; col++) + RAW(row, col) = t_curve[pixel[(row + 2) * 644 + col + 2]]; + } + maximum = 0x3ff; +} + +void LibRaw::sony_load_raw() +{ + uchar head[40]; + ushort *pixel; + unsigned i, key, row, col; + + fseek(ifp, 200896, SEEK_SET); + fseek(ifp, (unsigned)fgetc(ifp) * 4 - 1, SEEK_CUR); + order = 0x4d4d; + key = get4(); + + fseek(ifp, 164600, SEEK_SET); + fread(head, 1, 40, ifp); + sony_decrypt((unsigned *)head, 10, 1, key); + for (i = 26; i-- > 22;) + key = key << 8 | head[i]; + + fseek(ifp, data_offset, SEEK_SET); + for (row = 0; row < raw_height; row++) + { + checkCancel(); + pixel = raw_image + row * raw_width; + if (fread(pixel, 2, raw_width, ifp) < raw_width) + derror(); + sony_decrypt((unsigned *)pixel, raw_width / 2, !row, key); + for (col = 0; col < raw_width; col++) + if ((pixel[col] = ntohs(pixel[col])) >> 14) + derror(); + } + maximum = 0x3ff0; +} + +void LibRaw::sony_arw_load_raw() +{ + std::vector huff_buffer(32770); + ushort* huff = &huff_buffer[0]; + static const ushort tab[18] = {0xf11, 0xf10, 0xe0f, 0xd0e, 0xc0d, 0xb0c, + 0xa0b, 0x90a, 0x809, 0x708, 0x607, 0x506, + 0x405, 0x304, 0x303, 0x300, 0x202, 0x201}; + int i, c, n, col, row, sum = 0; + + huff[0] = 15; + for (n = i = 0; i < 18; i++) + FORC(32768 >> (tab[i] >> 8)) huff[++n] = tab[i]; + getbits(-1); + for (col = raw_width; col--;) + { + checkCancel(); + for (row = 0; row < raw_height + 1; row += 2) + { + if (row == raw_height) + row = 1; + if ((sum += ljpeg_diff(huff)) >> 12) + derror(); + if (row < height) + RAW(row, col) = sum; + } + } +} + +void LibRaw::sony_arw2_load_raw() +{ + uchar *data, *dp; + ushort pix[16]; + int row, col, val, max, min, imax, imin, sh, bit, i; + + data = (uchar *)malloc(raw_width + 1); + try + { + for (row = 0; row < height; row++) + { + checkCancel(); + fread(data, 1, raw_width, ifp); + for (dp = data, col = 0; col < raw_width - 30; dp += 16) + { + max = 0x7ff & (val = sget4(dp)); + min = 0x7ff & val >> 11; + imax = 0x0f & val >> 22; + imin = 0x0f & val >> 26; + for (sh = 0; sh < 4 && 0x80 << sh <= max - min; sh++) + ; + /* flag checks if outside of loop */ + if (!(imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SONYARW2_ALLFLAGS) // no flag set + || (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SONYARW2_DELTATOVALUE)) + { + for (bit = 30, i = 0; i < 16; i++) + if (i == imax) + pix[i] = max; + else if (i == imin) + pix[i] = min; + else + { + pix[i] = + ((sget2(dp + (bit >> 3)) >> (bit & 7) & 0x7f) << sh) + min; + if (pix[i] > 0x7ff) + pix[i] = 0x7ff; + bit += 7; + } + } + else if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SONYARW2_BASEONLY) + { + for (bit = 30, i = 0; i < 16; i++) + if (i == imax) + pix[i] = max; + else if (i == imin) + pix[i] = min; + else + pix[i] = 0; + } + else if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SONYARW2_DELTAONLY) + { + for (bit = 30, i = 0; i < 16; i++) + if (i == imax) + pix[i] = 0; + else if (i == imin) + pix[i] = 0; + else + { + pix[i] = + ((sget2(dp + (bit >> 3)) >> (bit & 7) & 0x7f) << sh) + min; + if (pix[i] > 0x7ff) + pix[i] = 0x7ff; + bit += 7; + } + } + else if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SONYARW2_DELTAZEROBASE) + { + for (bit = 30, i = 0; i < 16; i++) + if (i == imax) + pix[i] = 0; + else if (i == imin) + pix[i] = 0; + else + { + pix[i] = ((sget2(dp + (bit >> 3)) >> (bit & 7) & 0x7f) << sh); + if (pix[i] > 0x7ff) + pix[i] = 0x7ff; + bit += 7; + } + } + + if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SONYARW2_DELTATOVALUE) + { + for (i = 0; i < 16; i++, col += 2) + { + unsigned slope = + pix[i] < 1001 ? 2 + : curve[pix[i] << 1] - curve[(pix[i] << 1) - 2]; + unsigned step = 1 << sh; + RAW(row, col) = + curve[pix[i] << 1] > + black + imgdata.rawparams.sony_arw2_posterization_thr + ? LIM(((slope * step * 1000) / + (curve[pix[i] << 1] - black)), + 0, 10000) + : 0; + } + } + else + for (i = 0; i < 16; i++, col += 2) + RAW(row, col) = curve[pix[i] << 1]; + col -= col & 1 ? 1 : 31; + } + } + } + catch (...) + { + free(data); + throw; + } + if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SONYARW2_DELTATOVALUE) + maximum = 10000; + free(data); +} + +void LibRaw::samsung_load_raw() +{ + int row, col, c, i, dir, op[4], len[4]; + if (raw_width > 32768 || + raw_height > 32768) // definitely too much for old samsung + throw LIBRAW_EXCEPTION_IO_BADFILE; + unsigned maxpixels = raw_width * (raw_height + 7); + + order = 0x4949; + for (row = 0; row < raw_height; row++) + { + checkCancel(); + fseek(ifp, strip_offset + row * 4, SEEK_SET); + fseek(ifp, data_offset + get4(), SEEK_SET); + ph1_bits(-1); + FORC4 len[c] = row < 2 ? 7 : 4; + for (col = 0; col < raw_width; col += 16) + { + dir = ph1_bits(1); + FORC4 op[c] = ph1_bits(2); + FORC4 switch (op[c]) + { + case 3: + len[c] = ph1_bits(4); + break; + case 2: + len[c]--; + break; + case 1: + len[c]++; + } + for (c = 0; c < 16; c += 2) + { + i = len[((c & 1) << 1) | (c >> 3)]; + unsigned idest = RAWINDEX(row, col + c); + unsigned isrc = (dir ? RAWINDEX(row + (~c | -2), col + c) + : col ? RAWINDEX(row, col + (c | -2)) : 0); + if (idest < maxpixels && + isrc < + maxpixels) // less than zero is handled by unsigned conversion + RAW(row, col + c) = (i > 0 ? ((signed)ph1_bits(i) << (32 - i) >> (32 - i)) : 0) + + (dir ? RAW(row + (~c | -2), col + c) : col ? RAW(row, col + (c | -2)) : 128); + else + derror(); + if (c == 14) + c = -1; + } + } + } + for (row = 0; row < raw_height - 1; row += 2) + for (col = 0; col < raw_width - 1; col += 2) + SWAP(RAW(row, col + 1), RAW(row + 1, col)); +} + +void LibRaw::samsung2_load_raw() +{ + static const ushort tab[14] = {0x304, 0x307, 0x206, 0x205, 0x403, + 0x600, 0x709, 0x80a, 0x90b, 0xa0c, + 0xa0d, 0x501, 0x408, 0x402}; + ushort huff[1026], vpred[2][2] = {{0, 0}, {0, 0}}, hpred[2]; + int i, c, n, row, col, diff; + + huff[0] = 10; + for (n = i = 0; i < 14; i++) + FORC(1024 >> (tab[i] >> 8)) huff[++n] = tab[i]; + getbits(-1); + for (row = 0; row < raw_height; row++) + { + checkCancel(); + for (col = 0; col < raw_width; col++) + { + diff = ljpeg_diff(huff); + if (col < 2) + hpred[col] = vpred[row & 1][col] += diff; + else + hpred[col & 1] += diff; + RAW(row, col) = hpred[col & 1]; + if (hpred[col & 1] >> tiff_bps) + derror(); + } + } +} + +void LibRaw::samsung3_load_raw() +{ + int opt, init, mag, pmode, row, tab, col, pred, diff, i, c; + ushort lent[3][2], len[4], *prow[2]; + order = 0x4949; + fseek(ifp, 9, SEEK_CUR); + opt = fgetc(ifp); + init = (get2(), get2()); + for (row = 0; row < raw_height; row++) + { + checkCancel(); + fseek(ifp, (data_offset - ftell(ifp)) & 15, SEEK_CUR); + ph1_bits(-1); + mag = 0; + pmode = 7; + FORC(6)((ushort *)lent)[c] = row < 2 ? 7 : 4; + prow[row & 1] = &RAW(row - 1, 1 - ((row & 1) << 1)); // green + prow[~row & 1] = &RAW(row - 2, 0); // red and blue + for (tab = 0; tab + 15 < raw_width; tab += 16) + { + if (~opt & 4 && !(tab & 63)) + { + i = ph1_bits(2); + mag = i < 3 ? mag - '2' + "204"[i] : ph1_bits(12); + } + if (opt & 2) + pmode = 7 - 4 * ph1_bits(1); + else if (!ph1_bits(1)) + pmode = ph1_bits(3); + if (opt & 1 || !ph1_bits(1)) + { + FORC4 len[c] = ph1_bits(2); + FORC4 + { + i = ((row & 1) << 1 | (c & 1)) % 3; + if (i < 0) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + len[c] = len[c] < 3 ? lent[i][0] - '1' + "120"[len[c]] : ph1_bits(4); + lent[i][0] = lent[i][1]; + lent[i][1] = len[c]; + } + } + FORC(16) + { + col = tab + (((c & 7) << 1) ^ (c >> 3) ^ (row & 1)); + if (col < 0) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + if (pmode < 0) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + if (pmode != 7 && row >= 2 && (col - '4' + "0224468"[pmode]) < 0) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + pred = (pmode == 7 || row < 2) + ? (tab ? RAW(row, tab - 2 + (col & 1)) : init) + : (prow[col & 1][col - '4' + "0224468"[pmode]] + + prow[col & 1][col - '4' + "0244668"[pmode]] + 1) >> + 1; + diff = ph1_bits(i = len[c >> 2]); + if (i > 0 && diff >> (i - 1)) + diff -= 1 << i; + diff = diff * (mag * 2 + 1) + mag; + RAW(row, col) = pred + diff; + } + } + } +} + diff --git a/rtengine/libraw/src/decoders/decoders_libraw.cpp b/rtengine/libraw/src/decoders/decoders_libraw.cpp new file mode 100644 index 000000000..bc62a6c2d --- /dev/null +++ b/rtengine/libraw/src/decoders/decoders_libraw.cpp @@ -0,0 +1,864 @@ +/* -*- C++ -*- + * Copyright 2019-2022 LibRaw LLC (info@libraw.org) + * + * PhaseOne IIQ-Sv2 decoder is inspired by code provided by Daniel Vogelbacher + * + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/libraw_cxx_defs.h" +#include +#include // for std::sort + +void LibRaw::sony_arq_load_raw() +{ + int row, col; + if (imgdata.idata.filters || imgdata.idata.colors < 3) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + read_shorts(imgdata.rawdata.raw_image, + imgdata.sizes.raw_width * imgdata.sizes.raw_height * 4); + libraw_internal_data.internal_data.input->seek( + -2, SEEK_CUR); // avoid wrong eof error + + if(imgdata.rawparams.options & LIBRAW_RAWOPTIONS_ARQ_SKIP_CHANNEL_SWAP) + return; + + for (row = 0; row < imgdata.sizes.raw_height; row++) + { + unsigned short(*rowp)[4] = + (unsigned short(*)[4]) & + imgdata.rawdata.raw_image[row * imgdata.sizes.raw_width * 4]; + for (col = 0; col < imgdata.sizes.raw_width; col++) + { + unsigned short g2 = rowp[col][2]; + rowp[col][2] = rowp[col][3]; + rowp[col][3] = g2; + if (((unsigned)(row - imgdata.sizes.top_margin) < imgdata.sizes.height) && + ((unsigned)(col - imgdata.sizes.left_margin) < imgdata.sizes.width) && + (MAX(MAX(rowp[col][0], rowp[col][1]), + MAX(rowp[col][2], rowp[col][3])) > imgdata.color.maximum)) + derror(); + } + } +} + +void LibRaw::pentax_4shot_load_raw() +{ + ushort *plane = (ushort *)malloc(imgdata.sizes.raw_width * + imgdata.sizes.raw_height * sizeof(ushort)); + int alloc_sz = imgdata.sizes.raw_width * (imgdata.sizes.raw_height + 16) * 4 * + sizeof(ushort); + ushort(*result)[4] = (ushort(*)[4])malloc(alloc_sz); + struct movement_t + { + int row, col; + } _move[4] = { + {1, 1}, + {0, 1}, + {0, 0}, + {1, 0}, + }; + + int tidx = 0; + for (int i = 0; i < 4; i++) + { + int move_row, move_col; + if (imgdata.rawparams.p4shot_order[i] >= '0' && + imgdata.rawparams.p4shot_order[i] <= '3') + { + move_row = ((imgdata.rawparams.p4shot_order[i] - '0') & 2) ? 1 : 0; + move_col = ((imgdata.rawparams.p4shot_order[i] - '0') & 1) ? 1 : 0; + } + else + { + move_row = _move[i].row; + move_col = _move[i].col; + } + for (; tidx < 16; tidx++) + if (tiff_ifd[tidx].t_width == imgdata.sizes.raw_width && + tiff_ifd[tidx].t_height == imgdata.sizes.raw_height && + tiff_ifd[tidx].bps > 8 && tiff_ifd[tidx].samples == 1) + break; + if (tidx >= 16) + break; + imgdata.rawdata.raw_image = plane; + ID.input->seek(tiff_ifd[tidx].offset, SEEK_SET); + imgdata.idata.filters = 0xb4b4b4b4; + libraw_internal_data.unpacker_data.data_offset = tiff_ifd[tidx].offset; + (this->*pentax_component_load_raw)(); + for (int row = 0; row < imgdata.sizes.raw_height - move_row; row++) + { + int colors[2]; + for (int c = 0; c < 2; c++) + colors[c] = COLOR(row, c); + ushort *srcrow = &plane[imgdata.sizes.raw_width * row]; + ushort(*dstrow)[4] = + &result[(imgdata.sizes.raw_width) * (row + move_row) + move_col]; + for (int col = 0; col < imgdata.sizes.raw_width - move_col; col++) + dstrow[col][colors[col % 2]] = srcrow[col]; + } + tidx++; + } + + if (imgdata.color.cblack[4] == 2 && imgdata.color.cblack[5] == 2) + for (int c = 0; c < 4; c++) + imgdata.color.cblack[FC(c / 2, c % 2)] += + imgdata.color.cblack[6 + + c / 2 % imgdata.color.cblack[4] * + imgdata.color.cblack[5] + + c % 2 % imgdata.color.cblack[5]]; + imgdata.color.cblack[4] = imgdata.color.cblack[5] = 0; + + // assign things back: + imgdata.sizes.raw_pitch = imgdata.sizes.raw_width * 8; + imgdata.idata.filters = 0; + imgdata.rawdata.raw_alloc = imgdata.rawdata.color4_image = result; + free(plane); + imgdata.rawdata.raw_image = 0; +} + +void LibRaw::hasselblad_full_load_raw() +{ + int row, col; + + for (row = 0; row < S.height; row++) + for (col = 0; col < S.width; col++) + { + read_shorts(&imgdata.image[row * S.width + col][2], 1); // B + read_shorts(&imgdata.image[row * S.width + col][1], 1); // G + read_shorts(&imgdata.image[row * S.width + col][0], 1); // R + } +} + +static inline void unpack7bytesto4x16(unsigned char *src, unsigned short *dest) +{ + dest[0] = (src[0] << 6) | (src[1] >> 2); + dest[1] = ((src[1] & 0x3) << 12) | (src[2] << 4) | (src[3] >> 4); + dest[2] = (src[3] & 0xf) << 10 | (src[4] << 2) | (src[5] >> 6); + dest[3] = ((src[5] & 0x3f) << 8) | src[6]; +} + +static inline void unpack28bytesto16x16ns(unsigned char *src, + unsigned short *dest) +{ + dest[0] = (src[3] << 6) | (src[2] >> 2); + dest[1] = ((src[2] & 0x3) << 12) | (src[1] << 4) | (src[0] >> 4); + dest[2] = (src[0] & 0xf) << 10 | (src[7] << 2) | (src[6] >> 6); + dest[3] = ((src[6] & 0x3f) << 8) | src[5]; + dest[4] = (src[4] << 6) | (src[11] >> 2); + dest[5] = ((src[11] & 0x3) << 12) | (src[10] << 4) | (src[9] >> 4); + dest[6] = (src[9] & 0xf) << 10 | (src[8] << 2) | (src[15] >> 6); + dest[7] = ((src[15] & 0x3f) << 8) | src[14]; + dest[8] = (src[13] << 6) | (src[12] >> 2); + dest[9] = ((src[12] & 0x3) << 12) | (src[19] << 4) | (src[18] >> 4); + dest[10] = (src[18] & 0xf) << 10 | (src[17] << 2) | (src[16] >> 6); + dest[11] = ((src[16] & 0x3f) << 8) | src[23]; + dest[12] = (src[22] << 6) | (src[21] >> 2); + dest[13] = ((src[21] & 0x3) << 12) | (src[20] << 4) | (src[27] >> 4); + dest[14] = (src[27] & 0xf) << 10 | (src[26] << 2) | (src[25] >> 6); + dest[15] = ((src[25] & 0x3f) << 8) | src[24]; +} + +#define swab32(x) \ + ((unsigned int)((((unsigned int)(x) & (unsigned int)0x000000ffUL) << 24) | \ + (((unsigned int)(x) & (unsigned int)0x0000ff00UL) << 8) | \ + (((unsigned int)(x) & (unsigned int)0x00ff0000UL) >> 8) | \ + (((unsigned int)(x) & (unsigned int)0xff000000UL) >> 24))) + +static inline void swab32arr(unsigned *arr, unsigned len) +{ + for (unsigned i = 0; i < len; i++) + arr[i] = swab32(arr[i]); +} +#undef swab32 + +static inline void unpack7bytesto4x16_nikon(unsigned char *src, + unsigned short *dest) +{ + dest[3] = (src[6] << 6) | (src[5] >> 2); + dest[2] = ((src[5] & 0x3) << 12) | (src[4] << 4) | (src[3] >> 4); + dest[1] = (src[3] & 0xf) << 10 | (src[2] << 2) | (src[1] >> 6); + dest[0] = ((src[1] & 0x3f) << 8) | src[0]; +} + +void LibRaw::nikon_14bit_load_raw() +{ + const unsigned linelen = + (unsigned)(ceilf((float)(S.raw_width * 7 / 4) / 16.0)) * + 16; // 14512; // S.raw_width * 7 / 4; + const unsigned pitch = S.raw_pitch ? S.raw_pitch / 2 : S.raw_width; + unsigned char *buf = (unsigned char *)malloc(linelen); + for (int row = 0; row < S.raw_height; row++) + { + unsigned bytesread = + libraw_internal_data.internal_data.input->read(buf, 1, linelen); + unsigned short *dest = &imgdata.rawdata.raw_image[pitch * row]; + // swab32arr((unsigned *)buf, bytesread / 4); + for (unsigned int sp = 0, dp = 0; + dp < pitch - 3 && sp < linelen - 6 && sp < bytesread - 6; + sp += 7, dp += 4) + unpack7bytesto4x16_nikon(buf + sp, dest + dp); + } + free(buf); +} + +void LibRaw::fuji_14bit_load_raw() +{ + const unsigned linelen = S.raw_width * 7 / 4; + const unsigned pitch = S.raw_pitch ? S.raw_pitch / 2 : S.raw_width; + unsigned char *buf = (unsigned char *)malloc(linelen); + + for (int row = 0; row < S.raw_height; row++) + { + unsigned bytesread = + libraw_internal_data.internal_data.input->read(buf, 1, linelen); + unsigned short *dest = &imgdata.rawdata.raw_image[pitch * row]; + if (bytesread % 28) + { + swab32arr((unsigned *)buf, bytesread / 4); + for (unsigned int sp = 0, dp = 0; + dp < pitch - 3 && sp < linelen - 6 && sp < bytesread - 6; + sp += 7, dp += 4) + unpack7bytesto4x16(buf + sp, dest + dp); + } + else + for (unsigned int sp = 0, dp = 0; + dp < pitch - 15 && sp < linelen - 27 && sp < bytesread - 27; + sp += 28, dp += 16) + unpack28bytesto16x16ns(buf + sp, dest + dp); + } + free(buf); +} +void LibRaw::nikon_load_padded_packed_raw() // 12 bit per pixel, padded to 16 + // bytes +{ + // libraw_internal_data.unpacker_data.load_flags -> row byte count + if (libraw_internal_data.unpacker_data.load_flags < 2000 || + libraw_internal_data.unpacker_data.load_flags > 64000) + return; + unsigned char *buf = + (unsigned char *)malloc(libraw_internal_data.unpacker_data.load_flags); + for (int row = 0; row < S.raw_height; row++) + { + checkCancel(); + libraw_internal_data.internal_data.input->read( + buf, libraw_internal_data.unpacker_data.load_flags, 1); + for (int icol = 0; icol < S.raw_width / 2; icol++) + { + imgdata.rawdata.raw_image[(row)*S.raw_width + (icol * 2)] = + ((buf[icol * 3 + 1] & 0xf) << 8) | buf[icol * 3]; + imgdata.rawdata.raw_image[(row)*S.raw_width + (icol * 2 + 1)] = + buf[icol * 3 + 2] << 4 | ((buf[icol * 3 + 1] & 0xf0) >> 4); + } + } + free(buf); +} + +void LibRaw::nikon_load_striped_packed_raw() +{ + int vbits = 0, bwide, rbits, bite, row, col, i; + + UINT64 bitbuf = 0; + unsigned load_flags = 24; // libraw_internal_data.unpacker_data.load_flags; + unsigned tiff_bps = libraw_internal_data.unpacker_data.tiff_bps; + + struct tiff_ifd_t *ifd = &tiff_ifd[0]; + while (ifd < &tiff_ifd[libraw_internal_data.identify_data.tiff_nifds] && + ifd->offset != libraw_internal_data.unpacker_data.data_offset) + ++ifd; + if (ifd == &tiff_ifd[libraw_internal_data.identify_data.tiff_nifds]) + throw LIBRAW_EXCEPTION_DECODE_RAW; + + if (!ifd->rows_per_strip || !ifd->strip_offsets_count) + return; // not unpacked + int stripcnt = 0; + + bwide = S.raw_width * tiff_bps / 8; + bwide += bwide & load_flags >> 7; + rbits = bwide * 8 - S.raw_width * tiff_bps; + if (load_flags & 1) + bwide = bwide * 16 / 15; + bite = 8 + (load_flags & 24); + for (row = 0; row < S.raw_height; row++) + { + checkCancel(); + if (!(row % ifd->rows_per_strip)) + { + if (stripcnt >= ifd->strip_offsets_count) + return; // run out of data + libraw_internal_data.internal_data.input->seek( + ifd->strip_offsets[stripcnt], SEEK_SET); + stripcnt++; + } + for (col = 0; col < S.raw_width; col++) + { + for (vbits -= tiff_bps; vbits < 0; vbits += bite) + { + bitbuf <<= bite; + for (i = 0; i < bite; i += 8) + bitbuf |= + (unsigned)(libraw_internal_data.internal_data.input->get_char() + << i); + } + imgdata.rawdata.raw_image[(row)*S.raw_width + (col)] = + bitbuf << (64 - tiff_bps - vbits) >> (64 - tiff_bps); + } + vbits -= rbits; + } +} + +struct pana_cs6_page_decoder +{ + unsigned int pixelbuffer[18], lastoffset, maxoffset; + unsigned char current, *buffer; + pana_cs6_page_decoder(unsigned char *_buffer, unsigned int bsize) + : lastoffset(0), maxoffset(bsize), current(0), buffer(_buffer) + { + } + void read_page(); // will throw IO error if not enough space in buffer + void read_page12(); // 12-bit variant + unsigned int nextpixel() { return current < 14 ? pixelbuffer[current++] : 0; } + unsigned int nextpixel12() { return current < 18 ? pixelbuffer[current++] : 0; } +}; + +void pana_cs6_page_decoder::read_page() +{ + if (!buffer || (maxoffset - lastoffset < 16)) + throw LIBRAW_EXCEPTION_IO_EOF; +#define wbuffer(i) ((unsigned short)buffer[lastoffset + 15 - i]) + pixelbuffer[0] = (wbuffer(0) << 6) | (wbuffer(1) >> 2); // 14 bit + pixelbuffer[1] = (((wbuffer(1) & 0x3) << 12) | (wbuffer(2) << 4) | (wbuffer(3) >> 4)) & 0x3fff; // 14 bit + pixelbuffer[2] = (wbuffer(3) >> 2) & 0x3; // 2 + pixelbuffer[3] = ((wbuffer(3) & 0x3) << 8) | wbuffer(4); // 10 + pixelbuffer[4] = (wbuffer(5) << 2) | (wbuffer(6) >> 6); // 10 + pixelbuffer[5] = ((wbuffer(6) & 0x3f) << 4) | (wbuffer(7) >> 4); // 10 + pixelbuffer[6] = (wbuffer(7) >> 2) & 0x3; + pixelbuffer[7] = ((wbuffer(7) & 0x3) << 8) | wbuffer(8); + pixelbuffer[8] = ((wbuffer(9) << 2) & 0x3fc) | (wbuffer(10) >> 6); + pixelbuffer[9] = ((wbuffer(10) << 4) | (wbuffer(11) >> 4)) & 0x3ff; + pixelbuffer[10] = (wbuffer(11) >> 2) & 0x3; + pixelbuffer[11] = ((wbuffer(11) & 0x3) << 8) | wbuffer(12); + pixelbuffer[12] = (((wbuffer(13) << 2) & 0x3fc) | wbuffer(14) >> 6) & 0x3ff; + pixelbuffer[13] = ((wbuffer(14) << 4) | (wbuffer(15) >> 4)) & 0x3ff; +#undef wbuffer + current = 0; + lastoffset += 16; +} + +void pana_cs6_page_decoder::read_page12() +{ + if (!buffer || (maxoffset - lastoffset < 16)) + throw LIBRAW_EXCEPTION_IO_EOF; +#define wb(i) ((unsigned short)buffer[lastoffset + 15 - i]) + pixelbuffer[0] = (wb(0) << 4) | (wb(1) >> 4); // 12 bit: 8/0 + 4 upper bits of /1 + pixelbuffer[1] = (((wb(1) & 0xf) << 8) | (wb(2))) & 0xfff; // 12 bit: 4l/1 + 8/2 + + pixelbuffer[2] = (wb(3) >> 6) & 0x3; // 2; 2u/3, 6 low bits remains in wb(3) + pixelbuffer[3] = ((wb(3) & 0x3f) << 2) | (wb(4) >> 6); // 8; 6l/3 + 2u/4; 6 low bits remains in wb(4) + pixelbuffer[4] = ((wb(4) & 0x3f) << 2) | (wb(5) >> 6); // 8: 6l/4 + 2u/5; 6 low bits remains in wb(5) + pixelbuffer[5] = ((wb(5) & 0x3f) << 2) | (wb(6) >> 6); // 8: 6l/5 + 2u/6, 6 low bits remains in wb(6) + + pixelbuffer[6] = (wb(6) >> 4) & 0x3; // 2, 4 low bits remains in wb(6) + pixelbuffer[7] = ((wb(6) & 0xf) << 4) | (wb(7) >> 4); // 8: 4 low bits from wb(6), 4 upper bits from wb(7) + pixelbuffer[8] = ((wb(7) & 0xf) << 4) | (wb(8) >> 4); // 8: 4 low bits from wb7, 4 upper bits from wb8 + pixelbuffer[9] = ((wb(8) & 0xf) << 4) | (wb(9) >> 4); // 8: 4 low bits from wb8, 4 upper bits from wb9 + + pixelbuffer[10] = (wb(9) >> 2) & 0x3; // 2: bits 2-3 from wb9, two low bits remain in wb9 + pixelbuffer[11] = ((wb(9) & 0x3) << 6) | (wb(10) >> 2); // 8: 2 bits from wb9, 6 bits from wb10 + pixelbuffer[12] = ((wb(10) & 0x3) << 6) | (wb(11) >> 2); // 8: 2 bits from wb10, 6 bits from wb11 + pixelbuffer[13] = ((wb(11) & 0x3) << 6) | (wb(12) >> 2); // 8: 2 bits from wb11, 6 bits from wb12 + + pixelbuffer[14] = wb(12) & 0x3; // 2: low bits from wb12 + pixelbuffer[15] = wb(13); + pixelbuffer[16] = wb(14); + pixelbuffer[17] = wb(15); +#undef wb + current = 0; + lastoffset += 16; +} + +void LibRaw::panasonicC6_load_raw() +{ + const int rowstep = 16; + const bool _12bit = libraw_internal_data.unpacker_data.pana_bpp == 12; + const int pixperblock = _12bit ? 14 : 11; + const int blocksperrow = imgdata.sizes.raw_width / pixperblock; + const int rowbytes = blocksperrow * 16; + const unsigned pixelbase0 = _12bit ? 0x80 : 0x200; + const unsigned pixelbase_compare = _12bit ? 0x800 : 0x2000; + const unsigned spix_compare = _12bit ? 0x3fff : 0xffff; + const unsigned pixel_mask = _12bit ? 0xfff : 0x3fff; + std::vector iobuf; + try + { + iobuf.resize(rowbytes * rowstep); + } + catch (...) + { + throw LIBRAW_EXCEPTION_ALLOC; + } + + for (int row = 0; row < imgdata.sizes.raw_height - rowstep + 1; + row += rowstep) + { + int rowstoread = MIN(rowstep, imgdata.sizes.raw_height - row); + if (libraw_internal_data.internal_data.input->read( + iobuf.data(), rowbytes, rowstoread) != rowstoread) + throw LIBRAW_EXCEPTION_IO_EOF; + pana_cs6_page_decoder page(iobuf.data(), rowbytes * rowstoread); + for (int crow = 0, col = 0; crow < rowstoread; crow++, col = 0) + { + unsigned short *rowptr = + &imgdata.rawdata + .raw_image[(row + crow) * imgdata.sizes.raw_pitch / 2]; + for (int rblock = 0; rblock < blocksperrow; rblock++) + { + if (_12bit) + page.read_page12(); + else + page.read_page(); + unsigned oddeven[2] = {0, 0}, nonzero[2] = {0, 0}; + unsigned pmul = 0, pixel_base = 0; + for (int pix = 0; pix < pixperblock; pix++) + { + if (pix % 3 == 2) + { + unsigned base = _12bit ? page.nextpixel12(): page.nextpixel(); + if (base > 3) + throw LIBRAW_EXCEPTION_IO_CORRUPT; // not possible b/c of 2-bit + // field, but.... + if (base == 3) + base = 4; + pixel_base = pixelbase0 << base; + pmul = 1 << base; + } + unsigned epixel = _12bit ? page.nextpixel12() : page.nextpixel(); + if (oddeven[pix % 2]) + { + epixel *= pmul; + if (pixel_base < pixelbase_compare && nonzero[pix % 2] > pixel_base) + epixel += nonzero[pix % 2] - pixel_base; + nonzero[pix % 2] = epixel; + } + else + { + oddeven[pix % 2] = epixel; + if (epixel) + nonzero[pix % 2] = epixel; + else + epixel = nonzero[pix % 2]; + } + unsigned spix = epixel - 0xf; + if (spix <= spix_compare) + rowptr[col++] = spix & spix_compare; + else + { + epixel = (((signed int)(epixel + 0x7ffffff1)) >> 0x1f); + rowptr[col++] = epixel & pixel_mask; + } + } + } + } + } +} + + +void LibRaw::panasonicC7_load_raw() +{ + const int rowstep = 16; + int pixperblock = libraw_internal_data.unpacker_data.pana_bpp == 14 ? 9 : 10; + int rowbytes = imgdata.sizes.raw_width / pixperblock * 16; + unsigned char *iobuf = (unsigned char *)malloc(rowbytes * rowstep); + for (int row = 0; row < imgdata.sizes.raw_height - rowstep + 1; + row += rowstep) + { + int rowstoread = MIN(rowstep, imgdata.sizes.raw_height - row); + if (libraw_internal_data.internal_data.input->read( + iobuf, rowbytes, rowstoread) != rowstoread) + throw LIBRAW_EXCEPTION_IO_EOF; + unsigned char *bytes = iobuf; + for (int crow = 0; crow < rowstoread; crow++) + { + unsigned short *rowptr = + &imgdata.rawdata + .raw_image[(row + crow) * imgdata.sizes.raw_pitch / 2]; + for (int col = 0; col < imgdata.sizes.raw_width - pixperblock + 1; + col += pixperblock, bytes += 16) + { + if (libraw_internal_data.unpacker_data.pana_bpp == 14) + { + rowptr[col] = bytes[0] + ((bytes[1] & 0x3F) << 8); + rowptr[col + 1] = + (bytes[1] >> 6) + 4 * (bytes[2]) + ((bytes[3] & 0xF) << 10); + rowptr[col + 2] = + (bytes[3] >> 4) + 16 * (bytes[4]) + ((bytes[5] & 3) << 12); + rowptr[col + 3] = ((bytes[5] & 0xFC) >> 2) + (bytes[6] << 6); + rowptr[col + 4] = bytes[7] + ((bytes[8] & 0x3F) << 8); + rowptr[col + 5] = + (bytes[8] >> 6) + 4 * bytes[9] + ((bytes[10] & 0xF) << 10); + rowptr[col + 6] = + (bytes[10] >> 4) + 16 * bytes[11] + ((bytes[12] & 3) << 12); + rowptr[col + 7] = ((bytes[12] & 0xFC) >> 2) + (bytes[13] << 6); + rowptr[col + 8] = bytes[14] + ((bytes[15] & 0x3F) << 8); + } + else if (libraw_internal_data.unpacker_data.pana_bpp == + 12) // have not seen in the wild yet + { + rowptr[col] = ((bytes[1] & 0xF) << 8) + bytes[0]; + rowptr[col + 1] = 16 * bytes[2] + (bytes[1] >> 4); + rowptr[col + 2] = ((bytes[4] & 0xF) << 8) + bytes[3]; + rowptr[col + 3] = 16 * bytes[5] + (bytes[4] >> 4); + rowptr[col + 4] = ((bytes[7] & 0xF) << 8) + bytes[6]; + rowptr[col + 5] = 16 * bytes[8] + (bytes[7] >> 4); + rowptr[col + 6] = ((bytes[10] & 0xF) << 8) + bytes[9]; + rowptr[col + 7] = 16 * bytes[11] + (bytes[10] >> 4); + rowptr[col + 8] = ((bytes[13] & 0xF) << 8) + bytes[12]; + rowptr[col + 9] = 16 * bytes[14] + (bytes[13] >> 4); + } + } + } + } + free(iobuf); +} + +void LibRaw::unpacked_load_raw_fuji_f700s20() +{ + int base_offset = 0; + int row_size = imgdata.sizes.raw_width * 2; // in bytes + if (imgdata.idata.raw_count == 2 && imgdata.rawparams.shot_select) + { + libraw_internal_data.internal_data.input->seek(-row_size, SEEK_CUR); + base_offset = row_size; // in bytes + } + unsigned char *buffer = (unsigned char *)malloc(row_size * 2); + for (int row = 0; row < imgdata.sizes.raw_height; row++) + { + read_shorts((ushort *)buffer, imgdata.sizes.raw_width * 2); + memmove(&imgdata.rawdata.raw_image[row * imgdata.sizes.raw_pitch / 2], + buffer + base_offset, row_size); + } + free(buffer); +} + +void LibRaw::nikon_load_sraw() +{ + // We're already seeked to data! + unsigned char *rd = + (unsigned char *)malloc(3 * (imgdata.sizes.raw_width + 2)); + if (!rd) + throw LIBRAW_EXCEPTION_ALLOC; + try + { + int row, col; + for (row = 0; row < imgdata.sizes.raw_height; row++) + { + checkCancel(); + libraw_internal_data.internal_data.input->read(rd, 3, + imgdata.sizes.raw_width); + for (col = 0; col < imgdata.sizes.raw_width - 1; col += 2) + { + int bi = col * 3; + ushort bits1 = (rd[bi + 1] & 0xf) << 8 | rd[bi]; // 3,0,1 + ushort bits2 = rd[bi + 2] << 4 | ((rd[bi + 1] >> 4) & 0xf); // 452 + ushort bits3 = ((rd[bi + 4] & 0xf) << 8) | rd[bi + 3]; // 967 + ushort bits4 = rd[bi + 5] << 4 | ((rd[bi + 4] >> 4) & 0xf); // ab8 + imgdata.image[row * imgdata.sizes.raw_width + col][0] = bits1; + imgdata.image[row * imgdata.sizes.raw_width + col][1] = bits3; + imgdata.image[row * imgdata.sizes.raw_width + col][2] = bits4; + imgdata.image[row * imgdata.sizes.raw_width + col + 1][0] = bits2; + imgdata.image[row * imgdata.sizes.raw_width + col + 1][1] = 2048; + imgdata.image[row * imgdata.sizes.raw_width + col + 1][2] = 2048; + } + } + } + catch (...) + { + free(rd); + throw; + } + free(rd); + C.maximum = 0xfff; // 12 bit? + if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SRAW_NO_INTERPOLATE) + { + return; // no CbCr interpolation + } + // Interpolate CC channels + int row, col; + for (row = 0; row < imgdata.sizes.raw_height; row++) + { + checkCancel(); // will throw out + for (col = 0; col < imgdata.sizes.raw_width; col += 2) + { + int col2 = col < imgdata.sizes.raw_width - 2 ? col + 2 : col; + imgdata.image[row * imgdata.sizes.raw_width + col + 1][1] = + (unsigned short)(int(imgdata.image[row * imgdata.sizes.raw_width + + col][1] + + imgdata.image[row * imgdata.sizes.raw_width + + col2][1]) / + 2); + imgdata.image[row * imgdata.sizes.raw_width + col + 1][2] = + (unsigned short)(int(imgdata.image[row * imgdata.sizes.raw_width + + col][2] + + imgdata.image[row * imgdata.sizes.raw_width + + col2][2]) / + 2); + } + } + if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SRAW_NO_RGB) + return; + + for (row = 0; row < imgdata.sizes.raw_height; row++) + { + checkCancel(); // will throw out + for (col = 0; col < imgdata.sizes.raw_width; col++) + { + float Y = + float(imgdata.image[row * imgdata.sizes.raw_width + col][0]) / 2549.f; + float Ch2 = + float(imgdata.image[row * imgdata.sizes.raw_width + col][1] - 1280) / + 1536.f; + float Ch3 = + float(imgdata.image[row * imgdata.sizes.raw_width + col][2] - 1280) / + 1536.f; + if (Y > 1.f) + Y = 1.f; + if (Y > 0.803f) + Ch2 = Ch3 = 0.5f; + float r = Y + 1.40200f * (Ch3 - 0.5f); + if (r < 0.f) + r = 0.f; + if (r > 1.f) + r = 1.f; + float g = Y - 0.34414f * (Ch2 - 0.5f) - 0.71414 * (Ch3 - 0.5f); + if (g > 1.f) + g = 1.f; + if (g < 0.f) + g = 0.f; + float b = Y + 1.77200 * (Ch2 - 0.5f); + if (b > 1.f) + b = 1.f; + if (b < 0.f) + b = 0.f; + imgdata.image[row * imgdata.sizes.raw_width + col][0] = + imgdata.color.curve[int(r * 3072.f)]; + imgdata.image[row * imgdata.sizes.raw_width + col][1] = + imgdata.color.curve[int(g * 3072.f)]; + imgdata.image[row * imgdata.sizes.raw_width + col][2] = + imgdata.color.curve[int(b * 3072.f)]; + } + } + C.maximum = 16383; +} + +/* + Each row is decoded independently. Each row starts with a 16 bit prefix. + The hi byte is zero, the lo byte (first 3 bits) indicates a bit_base. + Other bits remain unused. + + |0000 0000|0000 0XXX| => XXX is bit_base + + After the prefix the pixel data starts. Pixels are grouped into clusters + forming 8 output pixel. Each cluster starts with a variable length of + bits, indicating decompression flags. + + +*/ + +#undef MIN +#undef MAX +#undef LIM + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#define LIM(x, min, max) MAX(min, MIN(x, max)) + +struct iiq_bitstream_t +{ + uint64_t curr; + uint32_t *input; + uint8_t used; + iiq_bitstream_t(uint32_t *img_input): curr(0),input(img_input),used(0){} + + void fill() + { + if (used <= 32) + { + uint64_t bitpump_next = *input++; + curr = (curr << 32) | bitpump_next; + used += 32; + } + } + uint64_t peek(uint8_t len) + { + if (len >= used) + fill(); + + uint64_t res = curr >> (used - len); + return res & ((1 << (uint8_t)len) - 1); + } + + void consume(uint8_t len) + { + peek(len); // fill buffer if needed + used -= len; + } + + uint64_t get(char len) + { + uint64_t val = peek(len); + consume(len); + return val; + } + +}; + +void decode_S_type(int32_t out_width, uint32_t *img_input, ushort *outbuf /*, int bit_depth*/) +{ +#if 0 + if (((bit_depth - 12) & 0xFFFFFFFD) != 0) + return 0; +#endif + iiq_bitstream_t stream(img_input); + + const int pix_corr_shift = 2; // 16 - bit_depth; + unsigned int bit_check[2] = { 0, 0 }; + + const uint8_t used_corr[8] = { + 3, 3, 3, 3, 1, 1, 1, 1, + }; + + const uint8_t extra_bits[8] = { + 1, 2, 3, 4, 0, 0, 0, 0, + }; + + const uint8_t bit_indicator[8 * 4] = { + 9, 8, 0, 7, 6, 6, 5, 5, 1, 1, 1, 1, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, + }; + + const uint8_t skip_bits[8 * 4] = {5, 5, 5, 5, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}; + + int block_count = ((out_width - 8) >> 3) + 1; + int block_total_bytes = 8 * block_count; + + int32_t prev_pix_value[2] = { 0, 0 }; + + uint8_t init_bits = stream.get(16) & 7; + + if (out_width - 7 > 0) + { + uint8_t pix_sub_init = 17 - init_bits; + + for (int blk_id = 0; blk_id < block_count; ++blk_id) + { + int8_t idx_even = stream.peek(7); + stream.consume(2); + + if ((unsigned int)idx_even >= 32) + bit_check[0] = ((unsigned int)idx_even >> 5) + bit_check[0] - 2; + else + { + bit_check[0] = bit_indicator[idx_even]; + stream.consume(skip_bits[idx_even]); + } + + int8_t idx_odd = stream.peek(7); + stream.consume(2); + + if ((unsigned int)idx_odd >= 32) + bit_check[1] = ((unsigned int)idx_odd >> 5) + bit_check[1] - 2; + else + { + bit_check[1] = bit_indicator[idx_odd]; + stream.consume(skip_bits[idx_odd]); + } + + uint8_t bidx = stream.peek(3); + stream.consume(used_corr[bidx]); + + uint8_t take_bits = init_bits + extra_bits[bidx]; // 11 or less + + uint32_t bp_shift[2] = {bit_check[0] - extra_bits[bidx], bit_check[1] - extra_bits[bidx]}; + + int pix_sub[2] = {0xFFFF >> (pix_sub_init - bit_check[0]), 0xFFFF >> (pix_sub_init - bit_check[1])}; + + for (int i = 0; i < 8; i++) // MAIN LOOP for pixel decoding + { + int32_t value = 0; + if (bit_check[i & 1] == 9) + value = stream.get(14); + else + value = prev_pix_value[i & 1] + ((uint32_t)stream.get(take_bits) << bp_shift[i & 1]) - pix_sub[i & 1]; + + outbuf[i] = LIM(value << pix_corr_shift, 0, 0xffff); + prev_pix_value[i & 1] = value; + } + outbuf += 8; // always produce 8 pixels from this cluster + } + } // if width > 7 // End main if + + // Final block + // maybe fill/unpack extra bytes if width % 8 <> 0? + if (block_total_bytes < out_width) + { + do + { + stream.fill(); + uint32_t pix_value = stream.get(14); + ++block_total_bytes; + *outbuf++ = pix_value << pix_corr_shift; + } while (block_total_bytes < out_width); + } +} + +struct p1_row_info_t +{ + unsigned row; + INT64 offset; + p1_row_info_t(): row(0),offset(0){} + p1_row_info_t(const p1_row_info_t& q): row(q.row),offset(q.offset){} + bool operator < (const p1_row_info_t & rhs) const { return offset < rhs.offset; } +}; + +void LibRaw::phase_one_load_raw_s() +{ + if(!libraw_internal_data.unpacker_data.strip_offset || !imgdata.rawdata.raw_image || !libraw_internal_data.unpacker_data.data_offset) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + std::vector stripes(imgdata.sizes.raw_height+1); + libraw_internal_data.internal_data.input->seek(libraw_internal_data.unpacker_data.strip_offset, SEEK_SET); + for (unsigned row = 0; row < imgdata.sizes.raw_height; row++) + { + stripes[row].row = row; + stripes[row].offset = INT64(get4()) + libraw_internal_data.unpacker_data.data_offset; + } + stripes[imgdata.sizes.raw_height].row = imgdata.sizes.raw_height; + stripes[imgdata.sizes.raw_height].offset = libraw_internal_data.unpacker_data.data_offset + INT64(libraw_internal_data.unpacker_data.data_size); + std::sort(stripes.begin(), stripes.end()); + INT64 maxsz = imgdata.sizes.raw_width * 3 + 2; // theor max: 17 bytes per 8 pix + row header + std::vector datavec(maxsz); + + for (unsigned row = 0; row < imgdata.sizes.raw_height; row++) + { + if (stripes[row].row >= imgdata.sizes.raw_height) continue; + ushort *datap = imgdata.rawdata.raw_image + stripes[row].row * imgdata.sizes.raw_width; + libraw_internal_data.internal_data.input->seek(stripes[row].offset, SEEK_SET); + INT64 readsz = stripes[row + 1].offset - stripes[row].offset; + if (readsz > maxsz) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + if(libraw_internal_data.internal_data.input->read(datavec.data(), 1, readsz) != readsz) + derror(); // TODO: check read state + + decode_S_type(imgdata.sizes.raw_width, (uint32_t *)datavec.data(), datap /*, 14 */); + } +} diff --git a/rtengine/libraw/src/decoders/decoders_libraw_dcrdefs.cpp b/rtengine/libraw/src/decoders/decoders_libraw_dcrdefs.cpp new file mode 100644 index 000000000..9ce9dd467 --- /dev/null +++ b/rtengine/libraw/src/decoders/decoders_libraw_dcrdefs.cpp @@ -0,0 +1,410 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +void LibRaw::packed_tiled_dng_load_raw() +{ + ushort *rp; + unsigned row, col; + + int ss = shot_select; + shot_select = libraw_internal_data.unpacker_data.dng_frames[LIM(ss, 0, (LIBRAW_IFD_MAXCOUNT * 2 - 1))] & 0xff; + std::vector pixel; + + try + { + int ntiles = 1 + (raw_width) / tile_width; + if ((unsigned)ntiles * tile_width > raw_width * 2u) throw LIBRAW_EXCEPTION_ALLOC; + pixel.resize(tile_width * ntiles * tiff_samples); + } + catch (...) + { + throw LIBRAW_EXCEPTION_ALLOC; // rethrow + } + try + { + unsigned trow = 0, tcol = 0; + INT64 save; + while (trow < raw_height) + { + checkCancel(); + save = ftell(ifp); + if (tile_length < INT_MAX) + fseek(ifp, get4(), SEEK_SET); + + for (row = 0; row < tile_length && (row + trow) < raw_height; row++) + { + if (tiff_bps == 16) + read_shorts(pixel.data(), tile_width * tiff_samples); + else + { + getbits(-1); + for (col = 0; col < tile_width * tiff_samples; col++) + pixel[col] = getbits(tiff_bps); + } + for (rp = pixel.data(), col = 0; col < tile_width; col++) + adobe_copy_pixel(trow+row, tcol+col, &rp); + } + fseek(ifp, save + 4, SEEK_SET); + if ((tcol += tile_width) >= raw_width) + trow += tile_length + (tcol = 0); + } + } + catch (...) + { + shot_select = ss; + throw; + } + shot_select = ss; +} + + +void LibRaw::sony_ljpeg_load_raw() +{ + unsigned trow = 0, tcol = 0, jrow, jcol, row, col; + INT64 save; + struct jhead jh; + + while (trow < raw_height) + { + checkCancel(); + save = ftell(ifp); // We're at + if (tile_length < INT_MAX) + fseek(ifp, get4(), SEEK_SET); + if (!ljpeg_start(&jh, 0)) + break; + try + { + for (row = jrow = 0; jrow < (unsigned)jh.high; jrow++, row += 2) + { + checkCancel(); + ushort(*rowp)[4] = (ushort(*)[4])ljpeg_row(jrow, &jh); + for (col = jcol = 0; jcol < (unsigned)jh.wide; jcol++, col += 2) + { + RAW(trow + row, tcol + col) = rowp[jcol][0]; + RAW(trow + row, tcol + col + 1) = rowp[jcol][1]; + RAW(trow + row + 1, tcol + col) = rowp[jcol][2]; + RAW(trow + row + 1, tcol + col + 1) = rowp[jcol][3]; + } + } + } + catch (...) + { + ljpeg_end(&jh); + throw; + } + fseek(ifp, save + 4, SEEK_SET); + if ((tcol += tile_width) >= raw_width) + trow += tile_length + (tcol = 0); + ljpeg_end(&jh); + } +} + +void LibRaw::nikon_he_load_raw_placeholder() +{ + throw LIBRAW_EXCEPTION_UNSUPPORTED_FORMAT; +} + +void LibRaw::nikon_coolscan_load_raw() +{ + int clrs = colors == 3 ? 3 : 1; + + if (clrs == 3 && !image) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + if(clrs == 1 && !raw_image) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + int bypp = tiff_bps <= 8 ? 1 : 2; + int bufsize = width * clrs * bypp; + unsigned char *buf = (unsigned char *)malloc(bufsize); + unsigned short *ubuf = (unsigned short *)buf; + + if (tiff_bps <= 8) + gamma_curve(1.0 / imgdata.rawparams.coolscan_nef_gamma, 0., 1, 255); + else + gamma_curve(1.0 / imgdata.rawparams.coolscan_nef_gamma, 0., 1, 65535); + fseek(ifp, data_offset, SEEK_SET); + for (int row = 0; row < raw_height; row++) + { + if(tiff_bps <=8) + fread(buf, 1, bufsize, ifp); + else + read_shorts(ubuf,width*clrs); + + unsigned short(*ip)[4] = (unsigned short(*)[4])image + row * width; + unsigned short *rp = raw_image + row * raw_width; + + if (is_NikonTransfer == 2) + { // it is also (tiff_bps == 8) + if (clrs == 3) + { + for (int col = 0; col < width; col++) + { + ip[col][0] = ((float)curve[buf[col * 3]]) / 255.0f; + ip[col][1] = ((float)curve[buf[col * 3 + 1]]) / 255.0f; + ip[col][2] = ((float)curve[buf[col * 3 + 2]]) / 255.0f; + ip[col][3] = 0; + } + } + else + { + for (int col = 0; col < width; col++) + rp[col] = ((float)curve[buf[col]]) / 255.0f; + } + } + else if (tiff_bps <= 8) + { + if (clrs == 3) + { + for (int col = 0; col < width; col++) + { + ip[col][0] = curve[buf[col * 3]]; + ip[col][1] = curve[buf[col * 3 + 1]]; + ip[col][2] = curve[buf[col * 3 + 2]]; + ip[col][3] = 0; + } + } + else + { + for (int col = 0; col < width; col++) + rp[col] = curve[buf[col]]; + } + } + else + { + if (clrs == 3) + { + for (int col = 0; col < width; col++) + { + ip[col][0] = curve[ubuf[col * 3]]; + ip[col][1] = curve[ubuf[col * 3 + 1]]; + ip[col][2] = curve[ubuf[col * 3 + 2]]; + ip[col][3] = 0; + } + } + else + { + for (int col = 0; col < width; col++) + rp[col] = curve[ubuf[col]]; + } + } + } + free(buf); +} + +void LibRaw::broadcom_load_raw() +{ + uchar *dp; + int rev, row, col, c; + rev = 3 * (order == 0x4949); + std::vector data(raw_stride * 2); + + for (row = 0; row < raw_height; row++) + { + if (fread(data.data() + raw_stride, 1, raw_stride, ifp) < raw_stride) + derror(); + FORC(raw_stride) data[c] = data[raw_stride + (c ^ rev)]; + for (dp = data.data(), col = 0; col < raw_width; dp += 5, col += 4) + FORC4 RAW(row, col + c) = (dp[c] << 2) | (dp[4] >> (c << 1) & 3); + } +} + +void LibRaw::android_tight_load_raw() +{ + uchar *data, *dp; + int bwide, row, col, c; + + bwide = -(-5 * raw_width >> 5) << 3; + data = (uchar *)malloc(bwide); + for (row = 0; row < raw_height; row++) + { + if (fread(data, 1, bwide, ifp) < bwide) + derror(); + for (dp = data, col = 0; col < raw_width; dp += 5, col += 4) + FORC4 RAW(row, col + c) = (dp[c] << 2) | (dp[4] >> (c << 1) & 3); + } + free(data); +} + +void LibRaw::android_loose_load_raw() +{ + uchar *data, *dp; + int bwide, row, col, c; + UINT64 bitbuf = 0; + + bwide = (raw_width + 5) / 6 << 3; + data = (uchar *)malloc(bwide); + for (row = 0; row < raw_height; row++) + { + if (fread(data, 1, bwide, ifp) < bwide) + derror(); + for (dp = data, col = 0; col < raw_width; dp += 8, col += 6) + { + FORC(8) bitbuf = (bitbuf << 8) | dp[c ^ 7]; + FORC(6) RAW(row, col + c) = (bitbuf >> c * 10) & 0x3ff; + } + } + free(data); +} + +void LibRaw::unpacked_load_raw_reversed() +{ + int row, col, bits = 0; + while (1 << ++bits < (int)maximum) + ; + for (row = raw_height - 1; row >= 0; row--) + { + checkCancel(); + read_shorts(&raw_image[row * raw_width], raw_width); + for (col = 0; col < raw_width; col++) + if ((RAW(row, col) >>= load_flags) >> bits && + (unsigned)(row - top_margin) < height && + (unsigned)(col - left_margin) < width) + derror(); + } +} + +#ifdef USE_6BY9RPI + +void LibRaw::rpi_load_raw8() +{ + uchar *data, *dp; + int rev, dwide, row, col, c; + double sum[] = { 0,0 }; + rev = 3 * (order == 0x4949); + if (raw_stride == 0) + dwide = raw_width; + else + dwide = raw_stride; + data = (uchar *)malloc(dwide * 2); + for (row = 0; row < raw_height; row++) { + if (fread(data + dwide, 1, dwide, ifp) < dwide) derror(); + FORC(dwide) data[c] = data[dwide + (c ^ rev)]; + for (dp = data, col = 0; col < raw_width; dp++, col++) + RAW(row, col + c) = dp[c]; + } + free(data); + maximum = 0xff; + if (!strcmp(make, "OmniVision") || + !strcmp(make, "Sony") || + !strcmp(make, "RaspberryPi")) return; + + row = raw_height / 2; + FORC(width - 1) { + sum[c & 1] += SQR(RAW(row, c) - RAW(row + 1, c + 1)); + sum[~c & 1] += SQR(RAW(row + 1, c) - RAW(row, c + 1)); + } + if (sum[1] > sum[0]) filters = 0x4b4b4b4b; +} + +void LibRaw::rpi_load_raw12() +{ + uchar *data, *dp; + int rev, dwide, row, col, c; + double sum[] = { 0,0 }; + rev = 3 * (order == 0x4949); + if (raw_stride == 0) + dwide = (raw_width * 3 + 1) / 2; + else + dwide = raw_stride; + data = (uchar *)malloc(dwide * 2); + for (row = 0; row < raw_height; row++) { + if (fread(data + dwide, 1, dwide, ifp) < dwide) derror(); + FORC(dwide) data[c] = data[dwide + (c ^ rev)]; + for (dp = data, col = 0; col < raw_width; dp += 3, col += 2) + FORC(2) RAW(row, col + c) = (dp[c] << 4) | (dp[2] >> (c << 2) & 0xF); + } + free(data); + maximum = 0xfff; + if (!strcmp(make, "OmniVision") || + !strcmp(make, "Sony") || + !strcmp(make, "RaspberryPi")) return; + + row = raw_height / 2; + FORC(width - 1) { + sum[c & 1] += SQR(RAW(row, c) - RAW(row + 1, c + 1)); + sum[~c & 1] += SQR(RAW(row + 1, c) - RAW(row, c + 1)); + } + if (sum[1] > sum[0]) filters = 0x4b4b4b4b; +} + +void LibRaw::rpi_load_raw14() +{ + uchar *data, *dp; + int rev, dwide, row, col, c; + double sum[] = { 0,0 }; + rev = 3 * (order == 0x4949); + if (raw_stride == 0) + dwide = ((raw_width * 7) + 3) >> 2; + else + dwide = raw_stride; + data = (uchar *)malloc(dwide * 2); + for (row = 0; row < raw_height; row++) { + if (fread(data + dwide, 1, dwide, ifp) < dwide) derror(); + FORC(dwide) data[c] = data[dwide + (c ^ rev)]; + for (dp = data, col = 0; col < raw_width; dp += 7, col += 4) { + RAW(row, col + 0) = (dp[0] << 6) | (dp[4] >> 2); + RAW(row, col + 1) = (dp[1] << 6) | ((dp[4] & 0x3) << 4) | ((dp[5] & 0xf0) >> 4); + RAW(row, col + 2) = (dp[2] << 6) | ((dp[5] & 0xf) << 2) | ((dp[6] & 0xc0) >> 6); + RAW(row, col + 3) = (dp[3] << 6) | ((dp[6] & 0x3f) << 2); + } + } + free(data); + maximum = 0x3fff; + if (!strcmp(make, "OmniVision") || + !strcmp(make, "Sony") || + !strcmp(make, "RaspberryPi")) return; + + row = raw_height / 2; + FORC(width - 1) { + sum[c & 1] += SQR(RAW(row, c) - RAW(row + 1, c + 1)); + sum[~c & 1] += SQR(RAW(row + 1, c) - RAW(row, c + 1)); + } + if (sum[1] > sum[0]) filters = 0x4b4b4b4b; +} + +void LibRaw::rpi_load_raw16() +{ + uchar *data, *dp; + int rev, dwide, row, col, c; + double sum[] = { 0,0 }; + rev = 3 * (order == 0x4949); + if (raw_stride == 0) + dwide = (raw_width * 2); + else + dwide = raw_stride; + data = (uchar *)malloc(dwide * 2); + for (row = 0; row < raw_height; row++) { + if (fread(data + dwide, 1, dwide, ifp) < dwide) derror(); + FORC(dwide) data[c] = data[dwide + (c ^ rev)]; + for (dp = data, col = 0; col < raw_width; dp += 2, col++) + RAW(row, col + c) = (dp[1] << 8) | dp[0]; + } + free(data); + maximum = 0xffff; + if (!strcmp(make, "OmniVision") || + !strcmp(make, "Sony") || + !strcmp(make, "RaspberryPi")) return; + + row = raw_height / 2; + FORC(width - 1) { + sum[c & 1] += SQR(RAW(row, c) - RAW(row + 1, c + 1)); + sum[~c & 1] += SQR(RAW(row + 1, c) - RAW(row, c + 1)); + } + if (sum[1] > sum[0]) filters = 0x4b4b4b4b; +} + +#endif diff --git a/rtengine/libraw/src/decoders/dng.cpp b/rtengine/libraw/src/decoders/dng.cpp new file mode 100644 index 000000000..4245e52f9 --- /dev/null +++ b/rtengine/libraw/src/decoders/dng.cpp @@ -0,0 +1,283 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +void LibRaw::vc5_dng_load_raw_placeholder() +{ + // placeholder only, real decoding implemented in GPR SDK + throw LIBRAW_EXCEPTION_DECODE_RAW; +} +void LibRaw::jxl_dng_load_raw_placeholder() +{ + // placeholder only, real decoding implemented in DNG SDK + throw LIBRAW_EXCEPTION_DECODE_RAW; +} + +void LibRaw::adobe_copy_pixel(unsigned row, unsigned col, ushort **rp) +{ + int c; + + if (tiff_samples == 2 && shot_select) + (*rp)++; + if (raw_image) + { + if (row < raw_height && col < raw_width) + RAW(row, col) = curve[**rp]; + *rp += tiff_samples; + } + else + { + if (row < raw_height && col < raw_width) + FORC(int(tiff_samples)) + image[row * raw_width + col][c] = curve[(*rp)[c]]; + *rp += tiff_samples; + } + if (tiff_samples == 2 && shot_select) + (*rp)--; +} +void LibRaw::lossless_dng_load_raw() +{ + unsigned trow = 0, tcol = 0, jwide, jrow, jcol, row, col, i, j; + INT64 save; + struct jhead jh; + ushort *rp; + + int ss = shot_select; + shot_select = libraw_internal_data.unpacker_data.dng_frames[LIM(ss,0,(LIBRAW_IFD_MAXCOUNT*2-1))] & 0xff; + + while (trow < raw_height) + { + checkCancel(); + save = ftell(ifp); + if (tile_length < INT_MAX) + fseek(ifp, get4(), SEEK_SET); + if (!ljpeg_start(&jh, 0)) + break; + jwide = jh.wide; + if (filters) + jwide *= jh.clrs; + + if(filters && (tiff_samples == 2)) // Fuji Super CCD + jwide /= 2; + try + { + switch (jh.algo) + { + case 0xc1: + jh.vpred[0] = 16384; + getbits(-1); + for (jrow = 0; jrow + 7 < (unsigned)jh.high; jrow += 8) + { + checkCancel(); + for (jcol = 0; jcol + 7 < (unsigned)jh.wide; jcol += 8) + { + ljpeg_idct(&jh); + rp = jh.idct; + row = trow + jcol / tile_width + jrow * 2; + col = tcol + jcol % tile_width; + for (i = 0; i < 16; i += 2) + for (j = 0; j < 8; j++) + adobe_copy_pixel(row + i, col + j, &rp); + } + } + break; + case 0xc3: + for (row = col = jrow = 0; jrow < (unsigned)jh.high; jrow++) + { + checkCancel(); + rp = ljpeg_row(jrow, &jh); + if (tiff_samples == 1 && jh.clrs > 1 && jh.clrs * jwide == raw_width) + for (jcol = 0; jcol < jwide * jh.clrs; jcol++) + { + adobe_copy_pixel(trow + row, tcol + col, &rp); + if (++col >= tile_width || col >= raw_width) + row += 1 + (col = 0); + } + else + for (jcol = 0; jcol < jwide; jcol++) + { + adobe_copy_pixel(trow + row, tcol + col, &rp); + if (++col >= tile_width || col >= raw_width) + row += 1 + (col = 0); + } + } + } + } + catch (...) + { + ljpeg_end(&jh); + shot_select = ss; + throw; + } + fseek(ifp, save + 4, SEEK_SET); + if ((tcol += tile_width) >= raw_width) + trow += tile_length + (tcol = 0); + ljpeg_end(&jh); + } + shot_select = ss; +} + +void LibRaw::packed_dng_load_raw() +{ + ushort *pixel, *rp; + unsigned row, col; + + if (tile_length < INT_MAX) + { + packed_tiled_dng_load_raw(); + return; + } + + int ss = shot_select; + shot_select = libraw_internal_data.unpacker_data.dng_frames[LIM(ss,0,(LIBRAW_IFD_MAXCOUNT*2-1))] & 0xff; + + pixel = (ushort *)calloc(raw_width, tiff_samples * sizeof *pixel); + try + { + for (row = 0; row < raw_height; row++) + { + checkCancel(); + if (tiff_bps == 16) + read_shorts(pixel, raw_width * tiff_samples); + else + { + getbits(-1); + for (col = 0; col < raw_width * tiff_samples; col++) + pixel[col] = getbits(tiff_bps); + } + for (rp = pixel, col = 0; col < raw_width; col++) + adobe_copy_pixel(row, col, &rp); + } + } + catch (...) + { + free(pixel); + shot_select = ss; + throw; + } + free(pixel); + shot_select = ss; +} +#ifdef NO_JPEG +void LibRaw::lossy_dng_load_raw() {} +#else + +static void jpegErrorExit_d(j_common_ptr /*cinfo*/) +{ + throw LIBRAW_EXCEPTION_DECODE_JPEG; +} + +void LibRaw::lossy_dng_load_raw() +{ + if (!image) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + struct jpeg_decompress_struct cinfo; + JSAMPARRAY buf; + JSAMPLE(*pixel)[3]; + unsigned sorder = order, ntags, opcode, deg, i, j, c; + unsigned trow = 0, tcol = 0, row, col; + INT64 save = data_offset - 4; + ushort cur[3][256]; + double coeff[9], tot; + + if (meta_offset) + { + fseek(ifp, meta_offset, SEEK_SET); + order = 0x4d4d; + ntags = get4(); + while (ntags--) + { + opcode = get4(); + get4(); + get4(); + if (opcode != 8) + { + fseek(ifp, get4(), SEEK_CUR); + continue; + } + fseek(ifp, 20, SEEK_CUR); + if ((c = get4()) > 2) + break; + fseek(ifp, 12, SEEK_CUR); + if ((deg = get4()) > 8) + break; + for (i = 0; i <= deg && i < 9; i++) + coeff[i] = getreal(LIBRAW_EXIFTAG_TYPE_DOUBLE); + for (i = 0; i < 256; i++) + { + for (tot = j = 0; j <= deg; j++) + tot += coeff[j] * pow(i / 255.0, (int)j); + cur[c][i] = (ushort)(tot * 0xffff); + } + } + order = sorder; + } + else + { + gamma_curve(1 / 2.4, 12.92, 1, 255); + FORC3 memcpy(cur[c], curve, sizeof cur[0]); + } + + struct jpeg_error_mgr pub; + cinfo.err = jpeg_std_error(&pub); + pub.error_exit = jpegErrorExit_d; + + jpeg_create_decompress(&cinfo); + + while (trow < raw_height) + { + fseek(ifp, save += 4, SEEK_SET); + if (tile_length < INT_MAX) + fseek(ifp, get4(), SEEK_SET); + if (libraw_internal_data.internal_data.input->jpeg_src(&cinfo) == -1) + { + jpeg_destroy_decompress(&cinfo); + throw LIBRAW_EXCEPTION_DECODE_JPEG; + } + jpeg_read_header(&cinfo, TRUE); + jpeg_start_decompress(&cinfo); + buf = (*cinfo.mem->alloc_sarray)((j_common_ptr)&cinfo, JPOOL_IMAGE, + cinfo.output_width * 3, 1); + try + { + while (cinfo.output_scanline < cinfo.output_height && + (row = trow + cinfo.output_scanline) < height) + { + checkCancel(); + jpeg_read_scanlines(&cinfo, buf, 1); + pixel = (JSAMPLE(*)[3])buf[0]; + for (col = 0; col < cinfo.output_width && tcol + col < width; col++) + { + FORC3 image[row * width + tcol + col][c] = cur[c][pixel[col][c]]; + } + } + } + catch (...) + { + jpeg_destroy_decompress(&cinfo); + throw; + } + jpeg_abort_decompress(&cinfo); + if ((tcol += tile_width) >= raw_width) + trow += tile_length + (tcol = 0); + } + jpeg_destroy_decompress(&cinfo); + maximum = 0xffff; +} +#endif diff --git a/rtengine/libraw/src/decoders/fp_dng.cpp b/rtengine/libraw/src/decoders/fp_dng.cpp new file mode 100644 index 000000000..f54a79ef3 --- /dev/null +++ b/rtengine/libraw/src/decoders/fp_dng.cpp @@ -0,0 +1,689 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/libraw_cxx_defs.h" + +inline unsigned int __DNG_HalfToFloat(ushort halfValue) +{ + int sign = (halfValue >> 15) & 0x00000001; + int exponent = (halfValue >> 10) & 0x0000001f; + int mantissa = halfValue & 0x000003ff; + if (exponent == 0) + { + if (mantissa == 0) + { + return (unsigned int)(sign << 31); + } + else + { + while (!(mantissa & 0x00000400)) + { + mantissa <<= 1; + exponent -= 1; + } + exponent += 1; + mantissa &= ~0x00000400; + } + } + else if (exponent == 31) + { + if (mantissa == 0) + { + return (unsigned int)((sign << 31) | ((0x1eL + 127 - 15) << 23) | + (0x3ffL << 13)); + } + else + { + return 0; + } + } + exponent += (127 - 15); + mantissa <<= 13; + return (unsigned int)((sign << 31) | (exponent << 23) | mantissa); +} + +inline unsigned int __DNG_FP24ToFloat(const unsigned char *input) +{ + int sign = (input[0] >> 7) & 0x01; + int exponent = (input[0]) & 0x7F; + int mantissa = (((int)input[1]) << 8) | input[2]; + if (exponent == 0) + { + if (mantissa == 0) + { + return (unsigned int)(sign << 31); + } + else + { + while (!(mantissa & 0x00010000)) + { + mantissa <<= 1; + exponent -= 1; + } + exponent += 1; + mantissa &= ~0x00010000; + } + } + else if (exponent == 127) + { + if (mantissa == 0) + { + return (unsigned int)((sign << 31) | ((0x7eL + 128 - 64) << 23) | + (0xffffL << 7)); + } + else + { + // Nan -- Just set to zero. + return 0; + } + } + exponent += (128 - 64); + mantissa <<= 7; + return (uint32_t)((sign << 31) | (exponent << 23) | mantissa); +} + +inline void DecodeDeltaBytes(unsigned char *bytePtr, int cols, int channels) +{ + if (channels == 1) + { + unsigned char b0 = bytePtr[0]; + bytePtr += 1; + for (int col = 1; col < cols; ++col) + { + b0 += bytePtr[0]; + bytePtr[0] = b0; + bytePtr += 1; + } + } + else if (channels == 3) + { + unsigned char b0 = bytePtr[0]; + unsigned char b1 = bytePtr[1]; + unsigned char b2 = bytePtr[2]; + bytePtr += 3; + for (int col = 1; col < cols; ++col) + { + b0 += bytePtr[0]; + b1 += bytePtr[1]; + b2 += bytePtr[2]; + bytePtr[0] = b0; + bytePtr[1] = b1; + bytePtr[2] = b2; + bytePtr += 3; + } + } + else if (channels == 4) + { + unsigned char b0 = bytePtr[0]; + unsigned char b1 = bytePtr[1]; + unsigned char b2 = bytePtr[2]; + unsigned char b3 = bytePtr[3]; + bytePtr += 4; + for (int col = 1; col < cols; ++col) + { + b0 += bytePtr[0]; + b1 += bytePtr[1]; + b2 += bytePtr[2]; + b3 += bytePtr[3]; + bytePtr[0] = b0; + bytePtr[1] = b1; + bytePtr[2] = b2; + bytePtr[3] = b3; + bytePtr += 4; + } + } + else + { + for (int col = 1; col < cols; ++col) + { + for (int chan = 0; chan < channels; ++chan) + { + bytePtr[chan + channels] += bytePtr[chan]; + } + bytePtr += channels; + } + } +} + +#ifdef USE_ZLIB +static void DecodeFPDelta(unsigned char *input, unsigned char *output, int cols, + int channels, int bytesPerSample) +{ + DecodeDeltaBytes(input, cols * bytesPerSample, channels); + int32_t rowIncrement = cols * channels; + + if (bytesPerSample == 2) + { + +#if LibRawBigEndian + const unsigned char *input0 = input; + const unsigned char *input1 = input + rowIncrement; +#else + const unsigned char *input1 = input; + const unsigned char *input0 = input + rowIncrement; +#endif + for (int col = 0; col < rowIncrement; ++col) + { + output[0] = input0[col]; + output[1] = input1[col]; + output += 2; + } + } + else if (bytesPerSample == 3) + { + const unsigned char *input0 = input; + const unsigned char *input1 = input + rowIncrement; + const unsigned char *input2 = input + rowIncrement * 2; + for (int col = 0; col < rowIncrement; ++col) + { + output[0] = input0[col]; + output[1] = input1[col]; + output[2] = input2[col]; + output += 3; + } + } + else + { +#if LibRawBigEndian + const unsigned char *input0 = input; + const unsigned char *input1 = input + rowIncrement; + const unsigned char *input2 = input + rowIncrement * 2; + const unsigned char *input3 = input + rowIncrement * 3; +#else + const unsigned char *input3 = input; + const unsigned char *input2 = input + rowIncrement; + const unsigned char *input1 = input + rowIncrement * 2; + const unsigned char *input0 = input + rowIncrement * 3; +#endif + for (int col = 0; col < rowIncrement; ++col) + { + output[0] = input0[col]; + output[1] = input1[col]; + output[2] = input2[col]; + output[3] = input3[col]; + output += 4; + } + } +} +#endif + +static float expandFloats(unsigned char *dst, int tileWidth, int bytesps) +{ + float max = 0.f; + if (bytesps == 2) + { + uint16_t *dst16 = (ushort *)dst; + uint32_t *dst32 = (unsigned int *)dst; + float *f32 = (float *)dst; + for (int index = tileWidth - 1; index >= 0; --index) + { + dst32[index] = __DNG_HalfToFloat(dst16[index]); + max = MAX(max, f32[index]); + } + } + else if (bytesps == 3) + { + uint8_t *dst8 = ((unsigned char *)dst) + (tileWidth - 1) * 3; + uint32_t *dst32 = (unsigned int *)dst; + float *f32 = (float *)dst; + for (int index = tileWidth - 1; index >= 0; --index, dst8 -= 3) + { + dst32[index] = __DNG_FP24ToFloat(dst8); + max = MAX(max, f32[index]); + } + } + else if (bytesps == 4) + { + float *f32 = (float *)dst; + for (int index = 0; index < tileWidth; index++) + max = MAX(max, f32[index]); + } + return max; +} + +struct tile_stripe_data_t +{ + bool tiled, striped; + int tileCnt; + unsigned tileWidth, tileHeight, tilesH, tilesV; + size_t maxBytesInTile; + std::vector tOffsets, tBytes; + tile_stripe_data_t() : tiled(false), striped(false),tileCnt(0), + tileWidth(0),tileHeight(0),tilesH(0),tilesV(0), + maxBytesInTile(0){} + void init(tiff_ifd_t *ifd, const libraw_image_sizes_t&, const unpacker_data_t&, + short _order, + LibRaw_abstract_datastream *stream); +}; + +static unsigned static_get4(LibRaw_abstract_datastream *stream, short _order) +{ + uchar str[4] = { 0xff, 0xff, 0xff, 0xff }; + stream->read(str, 1, 4); + return libraw_sget4_static(_order, str); +} + + +void tile_stripe_data_t::init(tiff_ifd_t *ifd, const libraw_image_sizes_t& sizes, + const unpacker_data_t& unpacker_data, short _order, LibRaw_abstract_datastream *stream) +{ + tiled = (unpacker_data.tile_width <= sizes.raw_width) && (unpacker_data.tile_length <= sizes.raw_height); + striped = (ifd->rows_per_strip > 0 && ifd->rows_per_strip < sizes.raw_height) && ifd->strip_byte_counts_count > 0; + + tileWidth = tiled ? unpacker_data.tile_width : sizes.raw_width; + tileHeight = tiled ? unpacker_data.tile_length :(striped ? ifd->rows_per_strip : sizes.raw_height); + tilesH = tiled ? (sizes.raw_width + tileWidth - 1) / tileWidth : 1; + tilesV = tiled ? (sizes.raw_height + tileHeight - 1) / tileHeight : + (striped ? ((sizes.raw_height + ifd->rows_per_strip - 1) / ifd->rows_per_strip) : 1); + tileCnt = tilesH * tilesV; + + if (tileCnt < 1 || tileCnt > 1000000) + throw LIBRAW_EXCEPTION_DECODE_RAW; + + tOffsets = std::vector(tileCnt); + tBytes = std::vector (tileCnt); + + if (tiled) + for (int t = 0; t < tileCnt; ++t) + tOffsets[t] = static_get4(stream, _order); + else if (striped) + for (int t = 0; t < tileCnt && t < ifd->strip_offsets_count; ++t) + tOffsets[t] = ifd->strip_offsets[t]; + else + tOffsets[0] = ifd->offset; + + maxBytesInTile = 0; + + if (tileCnt == 1 || (!tiled && !striped)) + tBytes[0] = maxBytesInTile = ifd->bytes; + else if (tiled) + { + // ifd->bytes points to tile size table if more than 1 tile exists + stream->seek(ifd->bytes, SEEK_SET); + for (int t = 0; t < tileCnt; ++t) + { + tBytes[t] = static_get4(stream, _order); ; + maxBytesInTile = MAX(maxBytesInTile, tBytes[t]); + } + } + else if (striped) + for (int t = 0; t < tileCnt && t < ifd->strip_byte_counts_count; ++t) + { + tBytes[t] = ifd->strip_byte_counts[t]; + maxBytesInTile = MAX(maxBytesInTile, tBytes[t]); + } +} + +#ifdef USE_ZLIB +void LibRaw::deflate_dng_load_raw() +{ + int iifd = find_ifd_by_offset(libraw_internal_data.unpacker_data.data_offset); + if(iifd < 0 || iifd > (int)libraw_internal_data.identify_data.tiff_nifds) + throw LIBRAW_EXCEPTION_DECODE_RAW; + struct tiff_ifd_t *ifd = &tiff_ifd[iifd]; + + float *float_raw_image = 0; + float max = 0.f; + + if (ifd->samples != 1 && ifd->samples != 3 && ifd->samples != 4) + throw LIBRAW_EXCEPTION_DECODE_RAW; + + if (libraw_internal_data.unpacker_data.tiff_samples != (unsigned)ifd->samples) + throw LIBRAW_EXCEPTION_DECODE_RAW; // Wrong IFD + + if (imgdata.idata.filters && ifd->samples > 1) + throw LIBRAW_EXCEPTION_DECODE_RAW; + + tile_stripe_data_t tiles; + tiles.init(ifd, imgdata.sizes, libraw_internal_data.unpacker_data, libraw_internal_data.unpacker_data.order, + libraw_internal_data.internal_data.input); + + if (ifd->sample_format == 3) + float_raw_image = (float *)calloc(tiles.tileCnt * tiles.tileWidth * tiles.tileHeight *ifd->samples, sizeof(float)); + else + throw LIBRAW_EXCEPTION_DECODE_RAW; // Only float deflated supported + + int xFactor; + switch (ifd->predictor) + { + case 3: + default: + xFactor = 1; + break; + case 34894: + xFactor = 2; + break; + case 34895: + xFactor = 4; + break; + } + + unsigned tilePixels = tiles.tileWidth * tiles.tileHeight; + unsigned pixelSize = sizeof(float) * ifd->samples; + unsigned tileBytes = tilePixels * pixelSize; + unsigned tileRowBytes = tiles.tileWidth * pixelSize; + + if(INT64(tiles.maxBytesInTile) > INT64(imgdata.rawparams.max_raw_memory_mb) * INT64(1024 * 1024) ) + throw LIBRAW_EXCEPTION_TOOBIG; + + std::vector cBuffer(tiles.maxBytesInTile); + std::vector uBuffer(tileBytes + tileRowBytes); // extra row for decoding + + for (size_t y = 0, t = 0; y < imgdata.sizes.raw_height; y += tiles.tileHeight) + { + for (size_t x = 0; x < imgdata.sizes.raw_width; x += tiles.tileWidth, ++t) + { + libraw_internal_data.internal_data.input->seek(tiles.tOffsets[t], SEEK_SET); + libraw_internal_data.internal_data.input->read(cBuffer.data(), 1, tiles.tBytes[t]); + unsigned long dstLen = tileBytes; + int err = + uncompress(uBuffer.data() + tileRowBytes, &dstLen, cBuffer.data(), (unsigned long)tiles.tBytes[t]); + if (err != Z_OK) + { + throw LIBRAW_EXCEPTION_DECODE_RAW; + return; + } + else + { + int bytesps = ifd->bps >> 3; + size_t rowsInTile = y + tiles.tileHeight > imgdata.sizes.raw_height ? imgdata.sizes.raw_height - y : tiles.tileHeight; + size_t colsInTile = x + tiles.tileWidth > imgdata.sizes.raw_width ? imgdata.sizes.raw_width - x : tiles.tileWidth; + + for (size_t row = 0; row < rowsInTile; ++row) // do not process full tile if not needed + { + unsigned char *dst = uBuffer.data() + row * tiles.tileWidth * bytesps * ifd->samples; + unsigned char *src = dst + tileRowBytes; + DecodeFPDelta(src, dst, tiles.tileWidth / xFactor, ifd->samples * xFactor, bytesps); + float lmax = expandFloats(dst, tiles.tileWidth * ifd->samples, bytesps); + max = MAX(max, lmax); + unsigned char *dst2 = (unsigned char *)&float_raw_image + [((y + row) * imgdata.sizes.raw_width + x) * ifd->samples]; + memmove(dst2, dst, colsInTile * ifd->samples * sizeof(float)); + } + } + } + } + + imgdata.color.fmaximum = max; + + // Set fields according to data format + + imgdata.rawdata.raw_alloc = float_raw_image; + if (ifd->samples == 1) + { + imgdata.rawdata.float_image = float_raw_image; + imgdata.rawdata.sizes.raw_pitch = imgdata.sizes.raw_pitch = + imgdata.sizes.raw_width * 4; + } + else if (ifd->samples == 3) + { + imgdata.rawdata.float3_image = (float(*)[3])float_raw_image; + imgdata.rawdata.sizes.raw_pitch = imgdata.sizes.raw_pitch = + imgdata.sizes.raw_width * 12; + } + else if (ifd->samples == 4) + { + imgdata.rawdata.float4_image = (float(*)[4])float_raw_image; + imgdata.rawdata.sizes.raw_pitch = imgdata.sizes.raw_pitch = + imgdata.sizes.raw_width * 16; + } + + if (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_CONVERTFLOAT_TO_INT) + convertFloatToInt(); // with default settings +} +#else +void LibRaw::deflate_dng_load_raw() { throw LIBRAW_EXCEPTION_DECODE_RAW; } +#endif + +int LibRaw::is_floating_point() +{ + struct tiff_ifd_t *ifd = &tiff_ifd[0]; + while (ifd < &tiff_ifd[libraw_internal_data.identify_data.tiff_nifds] && + ifd->offset != libraw_internal_data.unpacker_data.data_offset) + ++ifd; + if (ifd == &tiff_ifd[libraw_internal_data.identify_data.tiff_nifds]) + return 0; + + return ifd->sample_format == 3; +} + +int LibRaw::have_fpdata() +{ + return imgdata.rawdata.float_image || imgdata.rawdata.float3_image || + imgdata.rawdata.float4_image; +} + +void LibRaw::convertFloatToInt(float dmin /* =4096.f */, + float dmax /* =32767.f */, + float dtarget /*= 16383.f */) +{ + int samples = 0; + float *data = 0; + void *orawalloc = imgdata.rawdata.raw_alloc; + if (imgdata.rawdata.float_image) + { + samples = 1; + data = imgdata.rawdata.float_image; + } + else if (imgdata.rawdata.float3_image) + { + samples = 3; + data = (float *)imgdata.rawdata.float3_image; + } + else if (imgdata.rawdata.float4_image) + { + samples = 4; + data = (float *)imgdata.rawdata.float4_image; + } + else + return; + + ushort *raw_alloc = (ushort *)malloc( + imgdata.sizes.raw_height * imgdata.sizes.raw_width * + libraw_internal_data.unpacker_data.tiff_samples * sizeof(ushort)); + float tmax = MAX(imgdata.color.maximum, 1); + float datamax = imgdata.color.fmaximum; + + tmax = MAX(tmax, datamax); + tmax = MAX(tmax, 1.f); + + float multip = 1.f; + if (tmax < dmin || tmax > dmax) + { + imgdata.rawdata.color.fnorm = imgdata.color.fnorm = multip = dtarget / tmax; + imgdata.rawdata.color.maximum = imgdata.color.maximum = dtarget; + imgdata.rawdata.color.black = imgdata.color.black = + (float)imgdata.color.black * multip; + for (int i = 0; + i < int(sizeof(imgdata.color.cblack)/sizeof(imgdata.color.cblack[0])); + i++) + if (i != 4 && i != 5) + imgdata.rawdata.color.cblack[i] = imgdata.color.cblack[i] = + (float)imgdata.color.cblack[i] * multip; + } + else + imgdata.rawdata.color.fnorm = imgdata.color.fnorm = 0.f; + + for (size_t i = 0; i < imgdata.sizes.raw_height * imgdata.sizes.raw_width * + libraw_internal_data.unpacker_data.tiff_samples; + ++i) + { + float val = MAX(data[i], 0.f); + raw_alloc[i] = (ushort)(val * multip); + } + + if (samples == 1) + { + imgdata.rawdata.raw_alloc = imgdata.rawdata.raw_image = raw_alloc; + imgdata.rawdata.sizes.raw_pitch = imgdata.sizes.raw_pitch = + imgdata.sizes.raw_width * 2; + } + else if (samples == 3) + { + imgdata.rawdata.raw_alloc = imgdata.rawdata.color3_image = + (ushort(*)[3])raw_alloc; + imgdata.rawdata.sizes.raw_pitch = imgdata.sizes.raw_pitch = + imgdata.sizes.raw_width * 6; + } + else if (samples == 4) + { + imgdata.rawdata.raw_alloc = imgdata.rawdata.color4_image = + (ushort(*)[4])raw_alloc; + imgdata.rawdata.sizes.raw_pitch = imgdata.sizes.raw_pitch = + imgdata.sizes.raw_width * 8; + } + if(orawalloc) + free(orawalloc); // remove old allocation + imgdata.rawdata.float_image = 0; + imgdata.rawdata.float3_image = 0; + imgdata.rawdata.float4_image = 0; +} + +static +#if (defined(_MSC_VER) && !defined(__clang__)) +_forceinline +#else +inline +#endif +void libraw_swap24(uchar *data, int len) +{ + for (int i = 0; i < len - 2; i += 3) + { + uchar t = data[i]; + data[i] = data[i + 2]; + data[i + 2] = t; + } +} + +static +#if (defined(_MSC_VER) && !defined(__clang__)) +_forceinline +#else +inline +#endif +void libraw_swap32(uchar *data, int len) +{ + unsigned *d = (unsigned*)data; + for (int i = 0; i < len / 4; i++) + { + unsigned x = d[i]; + d[i] = (x << 24) + ((x << 8) & 0x00FF0000) + + ((x >> 8) & 0x0000FF00) + (x >> 24); + } +} + + +void LibRaw::uncompressed_fp_dng_load_raw() +{ + int iifd = find_ifd_by_offset(libraw_internal_data.unpacker_data.data_offset); + if (iifd < 0 || iifd > (int)libraw_internal_data.identify_data.tiff_nifds) + throw LIBRAW_EXCEPTION_DECODE_RAW; + struct tiff_ifd_t *ifd = &tiff_ifd[iifd]; + + float *float_raw_image = 0; + + if (ifd->samples != 1 && ifd->samples != 3 && ifd->samples != 4) + throw LIBRAW_EXCEPTION_DECODE_RAW; + + if(imgdata.idata.filters && ifd->samples > 1) + throw LIBRAW_EXCEPTION_DECODE_RAW; + + if ((int)libraw_internal_data.unpacker_data.tiff_samples != ifd->samples) + throw LIBRAW_EXCEPTION_DECODE_RAW; // Wrong IFD + + int bytesps = (ifd->bps + 7) >> 3; // round to upper value + + if(bytesps < 1 || bytesps > 4) + throw LIBRAW_EXCEPTION_DECODE_RAW; + + tile_stripe_data_t tiles; + tiles.init(ifd, imgdata.sizes, libraw_internal_data.unpacker_data, libraw_internal_data.unpacker_data.order, + libraw_internal_data.internal_data.input); + + INT64 allocsz = INT64(tiles.tileCnt) * INT64(tiles.tileWidth) * INT64(tiles.tileHeight) * INT64(ifd->samples) * INT64(sizeof(float)); + if (allocsz > INT64(imgdata.rawparams.max_raw_memory_mb) * INT64(1024 * 1024)) + throw LIBRAW_EXCEPTION_TOOBIG; + + if (ifd->sample_format == 3) + float_raw_image = (float *)calloc(tiles.tileCnt * tiles.tileWidth * tiles.tileHeight *ifd->samples, sizeof(float)); + else + throw LIBRAW_EXCEPTION_DECODE_RAW; // Only float supported + + bool difford = (libraw_internal_data.unpacker_data.order == 0x4949) == (ntohs(0x1234) == 0x1234); + float max = 0.f; + + std::vector rowbuf(tiles.tileWidth *sizeof(float) * ifd->samples); // line buffer for last tile in tile row + + for (size_t y = 0, t = 0; y < imgdata.sizes.raw_height; y += tiles.tileHeight) + { + for (unsigned x = 0; x < imgdata.sizes.raw_width && t < (unsigned)tiles.tileCnt; x += tiles.tileWidth, ++t) + { + libraw_internal_data.internal_data.input->seek(tiles.tOffsets[t], SEEK_SET); + size_t rowsInTile = y + tiles.tileHeight > imgdata.sizes.raw_height ? imgdata.sizes.raw_height - y : tiles.tileHeight; + size_t colsInTile = x + tiles.tileWidth > imgdata.sizes.raw_width ? imgdata.sizes.raw_width - x : tiles.tileWidth; + + size_t inrowbytes = colsInTile * bytesps * ifd->samples; + int fullrowbytes = tiles.tileWidth *bytesps * ifd->samples; + size_t outrowbytes = colsInTile * sizeof(float) * ifd->samples; + + for (size_t row = 0; row < rowsInTile; ++row) // do not process full tile if not needed + { + unsigned char *dst = fullrowbytes > inrowbytes ? rowbuf.data(): // last tile in row, use buffer + (unsigned char *)&float_raw_image + [((y + row) * imgdata.sizes.raw_width + x) * ifd->samples]; + libraw_internal_data.internal_data.input->read(dst, 1, fullrowbytes); + if (bytesps == 2 && difford) + libraw_swab(dst, fullrowbytes); + else if (bytesps == 3 && (libraw_internal_data.unpacker_data.order == 0x4949)) // II-16bit + libraw_swap24(dst, fullrowbytes); + if (bytesps == 4 && difford) + libraw_swap32(dst, fullrowbytes); + + float lmax = expandFloats( + dst, + tiles.tileWidth * ifd->samples, + bytesps); + if (fullrowbytes > inrowbytes) // last tile in row: copy buffer to destination + memmove(&float_raw_image[((y + row) * imgdata.sizes.raw_width + x) * ifd->samples], dst, outrowbytes); + max = MAX(max, lmax); + } + } + } + + imgdata.color.fmaximum = max; + + // setup outpuf fields + imgdata.rawdata.raw_alloc = float_raw_image; + if (ifd->samples == 1) + { + imgdata.rawdata.float_image = float_raw_image; + imgdata.rawdata.sizes.raw_pitch = imgdata.sizes.raw_pitch = + imgdata.sizes.raw_width * 4; + } + else if (ifd->samples == 3) + { + imgdata.rawdata.float3_image = (float(*)[3])float_raw_image; + imgdata.rawdata.sizes.raw_pitch = imgdata.sizes.raw_pitch = + imgdata.sizes.raw_width * 12; + } + else if (ifd->samples == 4) + { + imgdata.rawdata.float4_image = (float(*)[4])float_raw_image; + imgdata.rawdata.sizes.raw_pitch = imgdata.sizes.raw_pitch = + imgdata.sizes.raw_width * 16; + } + + if (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_CONVERTFLOAT_TO_INT) + convertFloatToInt(); +} diff --git a/rtengine/libraw/src/decoders/fuji_compressed.cpp b/rtengine/libraw/src/decoders/fuji_compressed.cpp new file mode 100644 index 000000000..9ca82f6e4 --- /dev/null +++ b/rtengine/libraw/src/decoders/fuji_compressed.cpp @@ -0,0 +1,1210 @@ +/* -*- C++ -*- + * File: libraw_fuji_compressed.cpp + * Copyright (C) 2016-2019 Alexey Danilchenko + * + * Adopted to LibRaw by Alex Tutubalin, lexa@lexa.ru + * LibRaw Fujifilm/compressed 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). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/libraw_cxx_defs.h" + +#ifdef _abs +#undef _abs +#undef _min +#undef _max +#endif +#define _abs(x) (((int)(x) ^ ((int)(x) >> 31)) - ((int)(x) >> 31)) +#define _min(a, b) ((a) < (b) ? (a) : (b)) +#define _max(a, b) ((a) > (b) ? (a) : (b)) + +struct int_pair +{ + int value1; + int value2; +}; + +enum _xt_lines +{ + _R0 = 0, + _R1, + _R2, + _R3, + _R4, + _G0, + _G1, + _G2, + _G3, + _G4, + _G5, + _G6, + _G7, + _B0, + _B1, + _B2, + _B3, + _B4, + _ltotal +}; + +// tables of gradients for single sample level +struct fuji_grads +{ + int_pair grads[41]; + int_pair lossy_grads[3][5]; +}; + +struct fuji_compressed_block +{ + int cur_bit; // current bit being read (from left to right) + int cur_pos; // current position in a buffer + INT64 cur_buf_offset; // offset of this buffer in a file + unsigned max_read_size; // Amount of data to be read + int cur_buf_size; // buffer size + uchar *cur_buf; // currently read block + int fillbytes; // Counter to add extra byte for block size N*16 + LibRaw_abstract_datastream *input; + fuji_grads even[3]; // tables of even gradients + fuji_grads odd[3]; // tables of odd gradients + ushort *linealloc; + ushort *linebuf[_ltotal]; +}; + +static inline int log2ceil(int val) +{ + int result = 0; + if (val--) + do + ++result; + while (val >>= 1); + + return result; +} + +void setup_qlut(int8_t *qt, int *q_point) +{ + for (int curVal = -q_point[4]; curVal <= q_point[4]; ++qt, ++curVal) + { + if (curVal <= -q_point[3]) + *qt = -4; + else if (curVal <= -q_point[2]) + *qt = -3; + else if (curVal <= -q_point[1]) + *qt = -2; + else if (curVal < -q_point[0]) + *qt = -1; + else if (curVal <= q_point[0]) + *qt = 0; + else if (curVal < q_point[1]) + *qt = 1; + else if (curVal < q_point[2]) + *qt = 2; + else if (curVal < q_point[3]) + *qt = 3; + else + *qt = 4; + } +} + +void init_main_qtable(fuji_compressed_params *params, uchar q_base) +{ + fuji_q_table *qt = params->qt; + int qp[5]; + int maxVal = params->max_value + 1; + qp[0] = q_base; + qp[1] = 3 * q_base + 0x12; + qp[2] = 5 * q_base + 0x43; + qp[3] = 7 * q_base + 0x114; + qp[4] = params->max_value; + if (qp[1] >= maxVal || qp[1] < q_base + 1) + qp[1] = q_base + 1; + if (qp[2] < qp[1] || qp[2] >= maxVal) + qp[2] = qp[1]; + if (qp[3] < qp[2] || qp[3] >= maxVal) + qp[3] = qp[2]; + setup_qlut(qt->q_table, qp); + qt->q_base = q_base; + qt->max_grad = 0; + qt->total_values = (qp[4] + 2 * q_base) / (2 * q_base + 1) + 1; + qt->raw_bits = log2ceil(qt->total_values); + qt->q_grad_mult = 9; + params->max_bits = 4 * log2ceil(qp[4] + 1); +} + +void LibRaw::init_fuji_compr(fuji_compressed_params *params) +{ + if ((libraw_internal_data.unpacker_data.fuji_block_width % 3 && + libraw_internal_data.unpacker_data.fuji_raw_type == 16) || + (libraw_internal_data.unpacker_data.fuji_block_width & 1 && + libraw_internal_data.unpacker_data.fuji_raw_type == 0)) + derror(); + + size_t q_table_size = 2 << libraw_internal_data.unpacker_data.fuji_bits; + if (libraw_internal_data.unpacker_data.fuji_lossless) + params->buf = malloc(q_table_size); + else + params->buf = malloc(3 * q_table_size); + + if (libraw_internal_data.unpacker_data.fuji_raw_type == 16) + params->line_width = (libraw_internal_data.unpacker_data.fuji_block_width * 2) / 3; + else + params->line_width = libraw_internal_data.unpacker_data.fuji_block_width >> 1; + + params->min_value = 0x40; + params->max_value = (1 << libraw_internal_data.unpacker_data.fuji_bits) - 1; + + // setup qtables + if (libraw_internal_data.unpacker_data.fuji_lossless) + { + // setup main qtable only, zero the rest + memset(params->qt + 1, 0, 3 * sizeof(fuji_q_table)); + params->qt[0].q_table = (int8_t *)params->buf; + params->qt[0].q_base = -1; + init_main_qtable(params, 0); + } + else + { + // setup 3 extra qtables - main one will be set for each block + memset(params->qt, 0, sizeof(fuji_q_table)); + int qp[5]; + + qp[0] = 0; + qp[4] = params->max_value; + + // table 0 + params->qt[1].q_table = (int8_t *)params->buf; + params->qt[1].q_base = 0; + params->qt[1].max_grad = 5; + params->qt[1].q_grad_mult = 3; + params->qt[1].total_values = qp[4] + 1; + params->qt[1].raw_bits = log2ceil(params->qt[1].total_values); + + qp[1] = qp[4] >= 0x12 ? 0x12 : qp[0] + 1; + qp[2] = qp[4] >= 0x43 ? 0x43 : qp[1]; + qp[3] = qp[4] >= 0x114 ? 0x114 : qp[2]; + setup_qlut(params->qt[1].q_table, qp); + + // table 1 + params->qt[2].q_table = params->qt[1].q_table + q_table_size; + params->qt[2].q_base = 1; + params->qt[2].max_grad = 6; + params->qt[2].q_grad_mult = 3; + params->qt[2].total_values = (qp[4] + 2) / 3 + 1; + params->qt[2].raw_bits = log2ceil(params->qt[2].total_values); + + qp[0] = params->qt[2].q_base; + qp[1] = qp[4] >= 0x15 ? 0x15 : qp[0] + 1; + qp[2] = qp[4] >= 0x48 ? 0x48 : qp[1]; + qp[3] = qp[4] >= 0x11B ? 0x11B : qp[2]; + setup_qlut(params->qt[2].q_table, qp); + + // table 2 + params->qt[3].q_table = params->qt[2].q_table + q_table_size; + params->qt[3].q_base = 2; + params->qt[3].max_grad = 7; + params->qt[3].q_grad_mult = 3; + params->qt[3].total_values = (qp[4] + 4) / 5 + 1; + params->qt[3].raw_bits = log2ceil(params->qt[3].total_values); + + qp[0] = params->qt[3].q_base; + qp[1] = qp[4] >= 0x18 ? 0x18 : qp[0] + 1; + qp[2] = qp[4] >= 0x4D ? 0x4D : qp[1]; + qp[3] = qp[4] >= 0x122 ? 0x122 : qp[2]; + setup_qlut(params->qt[3].q_table, qp); + } +} + +#define XTRANS_BUF_SIZE 0x10000 + +static inline void fuji_fill_buffer(fuji_compressed_block *info) +{ + if (info->cur_pos >= info->cur_buf_size) + { + info->cur_pos = 0; + info->cur_buf_offset += info->cur_buf_size; +#ifdef LIBRAW_USE_OPENMP +#pragma omp critical +#endif + { +#ifndef LIBRAW_USE_OPENMP + info->input->lock(); +#endif + info->input->seek(info->cur_buf_offset, SEEK_SET); + info->cur_buf_size = info->input->read(info->cur_buf, 1, _min(info->max_read_size, XTRANS_BUF_SIZE)); +#ifndef LIBRAW_USE_OPENMP + info->input->unlock(); +#endif + if (info->cur_buf_size < 1) // nothing read + { + if (info->fillbytes > 0) + { + int ls = _max(1, _min(info->fillbytes, XTRANS_BUF_SIZE)); + memset(info->cur_buf, 0, ls); + info->fillbytes -= ls; + } + else + throw LIBRAW_EXCEPTION_IO_EOF; + } + info->max_read_size -= info->cur_buf_size; + } + } +} + +void init_main_grads(const fuji_compressed_params *params, fuji_compressed_block *info) +{ + int max_diff = _max(2, (params->qt->total_values + 0x20) >> 6); + for (int j = 0; j < 3; j++) + for (int i = 0; i < 41; i++) + { + info->even[j].grads[i].value1 = max_diff; + info->even[j].grads[i].value2 = 1; + info->odd[j].grads[i].value1 = max_diff; + info->odd[j].grads[i].value2 = 1; + } +} + +void LibRaw::init_fuji_block(fuji_compressed_block *info, const fuji_compressed_params *params, INT64 raw_offset, + unsigned dsize) +{ + info->linealloc = (ushort *)calloc(sizeof(ushort), _ltotal * (params->line_width + 2)); + + INT64 fsize = libraw_internal_data.internal_data.input->size(); + info->max_read_size = _min(unsigned(fsize - raw_offset), dsize); // Data size may be incorrect? + info->fillbytes = 1; + + info->input = libraw_internal_data.internal_data.input; + info->linebuf[_R0] = info->linealloc; + for (int i = _R1; i <= _B4; i++) + info->linebuf[i] = info->linebuf[i - 1] + params->line_width + 2; + + // init buffer + info->cur_buf = (uchar *)malloc(XTRANS_BUF_SIZE); + info->cur_bit = 0; + info->cur_pos = 0; + info->cur_buf_offset = raw_offset; + info->cur_buf_size = 0; + fuji_fill_buffer(info); + + // init grads for lossy and lossless + if (libraw_internal_data.unpacker_data.fuji_lossless) + init_main_grads(params, info); + else + { + // init static grads for lossy only - main ones are done per line + for (int k = 0; k < 3; ++k) + { + int max_diff = _max(2, ((params->qt[k + 1].total_values + 0x20) >> 6)); + for (int j = 0; j < 3; ++j) + for (int i = 0; i < 5; ++i) + { + info->even[j].lossy_grads[k][i].value1 = max_diff; + info->even[j].lossy_grads[k][i].value2 = 1; + info->odd[j].lossy_grads[k][i].value1 = max_diff; + info->odd[j].lossy_grads[k][i].value2 = 1; + } + } + } +} + +void LibRaw::copy_line_to_xtrans(fuji_compressed_block *info, int cur_line, int cur_block, int cur_block_width) +{ + ushort *lineBufB[3]; + ushort *lineBufG[6]; + ushort *lineBufR[3]; + unsigned pixel_count; + ushort *line_buf; + int index; + + int offset = libraw_internal_data.unpacker_data.fuji_block_width * cur_block + 6 * imgdata.sizes.raw_width * cur_line; + ushort *raw_block_data = imgdata.rawdata.raw_image + offset; + int row_count = 0; + + for (int i = 0; i < 3; i++) + { + lineBufR[i] = info->linebuf[_R2 + i] + 1; + lineBufB[i] = info->linebuf[_B2 + i] + 1; + } + for (int i = 0; i < 6; i++) + lineBufG[i] = info->linebuf[_G2 + i] + 1; + + while (row_count < 6) + { + pixel_count = 0; + while (pixel_count < (unsigned)cur_block_width) + { + switch (imgdata.idata.xtrans_abs[row_count][(pixel_count % 6)]) + { + case 0: // red + line_buf = lineBufR[row_count >> 1]; + break; + case 1: // green + default: // to make static analyzer happy + line_buf = lineBufG[row_count]; + break; + case 2: // blue + line_buf = lineBufB[row_count >> 1]; + break; + } + + index = (((pixel_count * 2 / 3) & 0x7FFFFFFE) | ((pixel_count % 3) & 1)) + ((pixel_count % 3) >> 1); + raw_block_data[pixel_count] = line_buf[index]; + + ++pixel_count; + } + ++row_count; + raw_block_data += imgdata.sizes.raw_width; + } +} + +void LibRaw::copy_line_to_bayer(fuji_compressed_block *info, int cur_line, int cur_block, int cur_block_width) +{ + ushort *lineBufB[3]; + ushort *lineBufG[6]; + ushort *lineBufR[3]; + unsigned pixel_count; + ushort *line_buf; + + int fuji_bayer[2][2]; + for (int r = 0; r < 2; r++) + for (int c = 0; c < 2; c++) + fuji_bayer[r][c] = FC(r, c); // We'll downgrade G2 to G below + + int offset = libraw_internal_data.unpacker_data.fuji_block_width * cur_block + 6 * imgdata.sizes.raw_width * cur_line; + ushort *raw_block_data = imgdata.rawdata.raw_image + offset; + int row_count = 0; + + for (int i = 0; i < 3; i++) + { + lineBufR[i] = info->linebuf[_R2 + i] + 1; + lineBufB[i] = info->linebuf[_B2 + i] + 1; + } + for (int i = 0; i < 6; i++) + lineBufG[i] = info->linebuf[_G2 + i] + 1; + + while (row_count < 6) + { + pixel_count = 0; + while (pixel_count < (unsigned)cur_block_width) + { + switch (fuji_bayer[row_count & 1][pixel_count & 1]) + { + case 0: // red + line_buf = lineBufR[row_count >> 1]; + break; + case 1: // green + case 3: // second green + default: // to make static analyzer happy + line_buf = lineBufG[row_count]; + break; + case 2: // blue + line_buf = lineBufB[row_count >> 1]; + break; + } + + raw_block_data[pixel_count] = line_buf[pixel_count >> 1]; + ++pixel_count; + } + ++row_count; + raw_block_data += imgdata.sizes.raw_width; + } +} + +#define fuji_quant_gradient(max, q, v1, v2) (q->q_grad_mult * q->q_table[(max) + (v1)] + q->q_table[(max) + (v2)]) + +static inline void fuji_zerobits(fuji_compressed_block *info, int *count) +{ + uchar zero = 0; + *count = 0; + while (zero == 0) + { + zero = (info->cur_buf[info->cur_pos] >> (7 - info->cur_bit)) & 1; + info->cur_bit++; + info->cur_bit &= 7; + if (!info->cur_bit) + { + ++info->cur_pos; + fuji_fill_buffer(info); + } + if (zero) + break; + ++*count; + } +} + +static inline void fuji_read_code(fuji_compressed_block *info, int *data, int bits_to_read) +{ + uchar bits_left = bits_to_read; + uchar bits_left_in_byte = 8 - (info->cur_bit & 7); + *data = 0; + if (!bits_to_read) + return; + if (bits_to_read >= bits_left_in_byte) + { + do + { + *data <<= bits_left_in_byte; + bits_left -= bits_left_in_byte; + *data |= info->cur_buf[info->cur_pos] & ((1 << bits_left_in_byte) - 1); + ++info->cur_pos; + fuji_fill_buffer(info); + bits_left_in_byte = 8; + } while (bits_left >= 8); + } + if (!bits_left) + { + info->cur_bit = (8 - (bits_left_in_byte & 7)) & 7; + return; + } + *data <<= bits_left; + bits_left_in_byte -= bits_left; + *data |= ((1 << bits_left) - 1) & ((unsigned)info->cur_buf[info->cur_pos] >> bits_left_in_byte); + info->cur_bit = (8 - (bits_left_in_byte & 7)) & 7; +} + +static inline int bitDiff(int value1, int value2) +{ + int decBits = 0; + if (value2 < value1) + while (decBits <= 14 && (value2 << ++decBits) < value1) + ; + return decBits; +} + +static inline int fuji_decode_sample_even(fuji_compressed_block *info, const fuji_compressed_params *params, + ushort *line_buf, int pos, fuji_grads *grad_params) +{ + int interp_val = 0; + // ushort decBits; + int errcnt = 0; + + int sample = 0, code = 0; + ushort *line_buf_cur = line_buf + pos; + int Rb = line_buf_cur[-2 - params->line_width]; + int Rc = line_buf_cur[-3 - params->line_width]; + int Rd = line_buf_cur[-1 - params->line_width]; + int Rf = line_buf_cur[-4 - 2 * params->line_width]; + + int grad, gradient, diffRcRb, diffRfRb, diffRdRb; + + diffRcRb = _abs(Rc - Rb); + diffRfRb = _abs(Rf - Rb); + diffRdRb = _abs(Rd - Rb); + + const fuji_q_table *qt = params->qt; + int_pair *grads = grad_params->grads; + for (int i = 1; params->qt[0].q_base >= i && i < 4; ++i) + if (diffRfRb + diffRcRb <= params->qt[i].max_grad) + { + qt = params->qt + i; + grads = grad_params->lossy_grads[i - 1]; + break; + } + + grad = fuji_quant_gradient(params->max_value, qt, Rb - Rf, Rc - Rb); + gradient = _abs(grad); + + if (diffRcRb > diffRfRb && diffRcRb > diffRdRb) + interp_val = Rf + Rd + 2 * Rb; + else if (diffRdRb > diffRcRb && diffRdRb > diffRfRb) + interp_val = Rf + Rc + 2 * Rb; + else + interp_val = Rd + Rc + 2 * Rb; + + fuji_zerobits(info, &sample); + + if (sample < params->max_bits - qt->raw_bits - 1) + { + int decBits = bitDiff(grads[gradient].value1, grads[gradient].value2); + fuji_read_code(info, &code, decBits); + code += sample << decBits; + } + else + { + fuji_read_code(info, &code, qt->raw_bits); + ++code; + } + + if (code < 0 || code >= qt->total_values) + ++errcnt; + + if (code & 1) + code = -1 - code / 2; + else + code /= 2; + + grads[gradient].value1 += _abs(code); + if (grads[gradient].value2 == params->min_value) + { + grads[gradient].value1 >>= 1; + grads[gradient].value2 >>= 1; + } + ++grads[gradient].value2; + if (grad < 0) + interp_val = (interp_val >> 2) - code * (2 * qt->q_base + 1); + else + interp_val = (interp_val >> 2) + code * (2 * qt->q_base + 1); + if (interp_val < -qt->q_base) + interp_val += qt->total_values * (2 * qt->q_base + 1); + else if (interp_val > qt->q_base + params->max_value) + interp_val -= qt->total_values * (2 * qt->q_base + 1); + + if (interp_val >= 0) + line_buf_cur[0] = _min(interp_val, params->max_value); + else + line_buf_cur[0] = 0; + return errcnt; +} + +static inline int fuji_decode_sample_odd(fuji_compressed_block *info, const fuji_compressed_params *params, + ushort *line_buf, int pos, fuji_grads *grad_params) +{ + int interp_val = 0; + int errcnt = 0; + + int sample = 0, code = 0; + ushort *line_buf_cur = line_buf + pos; + int Ra = line_buf_cur[-1]; + int Rb = line_buf_cur[-2 - params->line_width]; + int Rc = line_buf_cur[-3 - params->line_width]; + int Rd = line_buf_cur[-1 - params->line_width]; + int Rg = line_buf_cur[1]; + + int grad, gradient; + + int diffRcRa = _abs(Rc - Ra); + int diffRbRc = _abs(Rb - Rc); + + const fuji_q_table *qt = params->qt; + int_pair *grads = grad_params->grads; + for (int i = 1; params->qt[0].q_base >= i && i < 4; ++i) + if (diffRbRc + diffRcRa <= params->qt[i].max_grad) + { + qt = params->qt + i; + grads = grad_params->lossy_grads[i - 1]; + break; + } + + grad = fuji_quant_gradient(params->max_value, qt, Rb - Rc, Rc - Ra); + gradient = _abs(grad); + + if ((Rb > Rc && Rb > Rd) || (Rb < Rc && Rb < Rd)) + interp_val = (Rg + Ra + 2 * Rb) >> 2; + else + interp_val = (Ra + Rg) >> 1; + + fuji_zerobits(info, &sample); + + if (sample < params->max_bits - qt->raw_bits - 1) + { + int decBits = bitDiff(grads[gradient].value1, grads[gradient].value2); + fuji_read_code(info, &code, decBits); + code += sample << decBits; + } + else + { + fuji_read_code(info, &code, qt->raw_bits); + ++code; + } + + if (code < 0 || code >= qt->total_values) + ++errcnt; + + if (code & 1) + code = -1 - code / 2; + else + code /= 2; + + grads[gradient].value1 += _abs(code); + if (grads[gradient].value2 == params->min_value) + { + grads[gradient].value1 >>= 1; + grads[gradient].value2 >>= 1; + } + ++grads[gradient].value2; + if (grad < 0) + interp_val -= code * (2 * qt->q_base + 1); + else + interp_val += code * (2 * qt->q_base + 1); + if (interp_val < -qt->q_base) + interp_val += qt->total_values * (2 * qt->q_base + 1); + else if (interp_val > qt->q_base + params->max_value) + interp_val -= qt->total_values * (2 * qt->q_base + 1); + + if (interp_val >= 0) + line_buf_cur[0] = _min(interp_val, params->max_value); + else + line_buf_cur[0] = 0; + return errcnt; +} + +static void fuji_decode_interpolation_even(int line_width, ushort *line_buf, int pos) +{ + ushort *line_buf_cur = line_buf + pos; + int Rb = line_buf_cur[-2 - line_width]; + int Rc = line_buf_cur[-3 - line_width]; + int Rd = line_buf_cur[-1 - line_width]; + int Rf = line_buf_cur[-4 - 2 * line_width]; + int diffRcRb = _abs(Rc - Rb); + int diffRfRb = _abs(Rf - Rb); + int diffRdRb = _abs(Rd - Rb); + if (diffRcRb > diffRfRb && diffRcRb > diffRdRb) + *line_buf_cur = (Rf + Rd + 2 * Rb) >> 2; + else if (diffRdRb > diffRcRb && diffRdRb > diffRfRb) + *line_buf_cur = (Rf + Rc + 2 * Rb) >> 2; + else + *line_buf_cur = (Rd + Rc + 2 * Rb) >> 2; +} + +static void fuji_extend_generic(ushort *linebuf[_ltotal], int line_width, int start, int end) +{ + for (int i = start; i <= end; i++) + { + linebuf[i][0] = linebuf[i - 1][1]; + linebuf[i][line_width + 1] = linebuf[i - 1][line_width]; + } +} + +static void fuji_extend_red(ushort *linebuf[_ltotal], int line_width) +{ + fuji_extend_generic(linebuf, line_width, _R2, _R4); +} + +static void fuji_extend_green(ushort *linebuf[_ltotal], int line_width) +{ + fuji_extend_generic(linebuf, line_width, _G2, _G7); +} + +static void fuji_extend_blue(ushort *linebuf[_ltotal], int line_width) +{ + fuji_extend_generic(linebuf, line_width, _B2, _B4); +} + +void LibRaw::xtrans_decode_block(fuji_compressed_block *info, const fuji_compressed_params *params, int /*cur_line*/) +{ + int r_even_pos = 0, r_odd_pos = 1; + int g_even_pos = 0, g_odd_pos = 1; + int b_even_pos = 0, b_odd_pos = 1; + + int errcnt = 0; + + const int line_width = params->line_width; + + while (g_even_pos < line_width || g_odd_pos < line_width) + { + if (g_even_pos < line_width) + { + fuji_decode_interpolation_even(line_width, info->linebuf[_R2] + 1, r_even_pos); + r_even_pos += 2; + errcnt += fuji_decode_sample_even(info, params, info->linebuf[_G2] + 1, g_even_pos, &info->even[0]); + g_even_pos += 2; + } + if (g_even_pos > 8) + { + errcnt += fuji_decode_sample_odd(info, params, info->linebuf[_R2] + 1, r_odd_pos, &info->odd[0]); + r_odd_pos += 2; + errcnt += fuji_decode_sample_odd(info, params, info->linebuf[_G2] + 1, g_odd_pos, &info->odd[0]); + g_odd_pos += 2; + } + } + + fuji_extend_red(info->linebuf, line_width); + fuji_extend_green(info->linebuf, line_width); + + g_even_pos = 0, g_odd_pos = 1; + + while (g_even_pos < line_width || g_odd_pos < line_width) + { + if (g_even_pos < line_width) + { + errcnt += fuji_decode_sample_even(info, params, info->linebuf[_G3] + 1, g_even_pos, &info->even[1]); + g_even_pos += 2; + fuji_decode_interpolation_even(line_width, info->linebuf[_B2] + 1, b_even_pos); + b_even_pos += 2; + } + if (g_even_pos > 8) + { + errcnt += fuji_decode_sample_odd(info, params, info->linebuf[_G3] + 1, g_odd_pos, &info->odd[1]); + g_odd_pos += 2; + errcnt += fuji_decode_sample_odd(info, params, info->linebuf[_B2] + 1, b_odd_pos, &info->odd[1]); + b_odd_pos += 2; + } + } + + fuji_extend_green(info->linebuf, line_width); + fuji_extend_blue(info->linebuf, line_width); + + r_even_pos = 0, r_odd_pos = 1; + g_even_pos = 0, g_odd_pos = 1; + + while (g_even_pos < line_width || g_odd_pos < line_width) + { + if (g_even_pos < line_width) + { + if (r_even_pos & 3) + errcnt += fuji_decode_sample_even(info, params, info->linebuf[_R3] + 1, r_even_pos, &info->even[2]); + else + fuji_decode_interpolation_even(line_width, info->linebuf[_R3] + 1, r_even_pos); + r_even_pos += 2; + fuji_decode_interpolation_even(line_width, info->linebuf[_G4] + 1, g_even_pos); + g_even_pos += 2; + } + if (g_even_pos > 8) + { + errcnt += fuji_decode_sample_odd(info, params, info->linebuf[_R3] + 1, r_odd_pos, &info->odd[2]); + r_odd_pos += 2; + errcnt += fuji_decode_sample_odd(info, params, info->linebuf[_G4] + 1, g_odd_pos, &info->odd[2]); + g_odd_pos += 2; + } + } + + fuji_extend_red(info->linebuf, line_width); + fuji_extend_green(info->linebuf, line_width); + + g_even_pos = 0, g_odd_pos = 1; + b_even_pos = 0, b_odd_pos = 1; + + while (g_even_pos < line_width || g_odd_pos < line_width) + { + if (g_even_pos < line_width) + { + errcnt += fuji_decode_sample_even(info, params, info->linebuf[_G5] + 1, g_even_pos, &info->even[0]); + g_even_pos += 2; + if ((b_even_pos & 3) == 2) + fuji_decode_interpolation_even(line_width, info->linebuf[_B3] + 1, b_even_pos); + else + errcnt += fuji_decode_sample_even(info, params, info->linebuf[_B3] + 1, b_even_pos, &info->even[0]); + b_even_pos += 2; + } + if (g_even_pos > 8) + { + errcnt += fuji_decode_sample_odd(info, params, info->linebuf[_G5] + 1, g_odd_pos, &info->odd[0]); + g_odd_pos += 2; + errcnt += fuji_decode_sample_odd(info, params, info->linebuf[_B3] + 1, b_odd_pos, &info->odd[0]); + b_odd_pos += 2; + } + } + + fuji_extend_green(info->linebuf, line_width); + fuji_extend_blue(info->linebuf, line_width); + + r_even_pos = 0, r_odd_pos = 1; + g_even_pos = 0, g_odd_pos = 1; + + while (g_even_pos < line_width || g_odd_pos < line_width) + { + if (g_even_pos < line_width) + { + if ((r_even_pos & 3) == 2) + fuji_decode_interpolation_even(line_width, info->linebuf[_R4] + 1, r_even_pos); + else + errcnt += fuji_decode_sample_even(info, params, info->linebuf[_R4] + 1, r_even_pos, &info->even[1]); + r_even_pos += 2; + errcnt += fuji_decode_sample_even(info, params, info->linebuf[_G6] + 1, g_even_pos, &info->even[1]); + g_even_pos += 2; + } + if (g_even_pos > 8) + { + errcnt += fuji_decode_sample_odd(info, params, info->linebuf[_R4] + 1, r_odd_pos, &info->odd[1]); + r_odd_pos += 2; + errcnt += fuji_decode_sample_odd(info, params, info->linebuf[_G6] + 1, g_odd_pos, &info->odd[1]); + g_odd_pos += 2; + } + } + + fuji_extend_red(info->linebuf, line_width); + fuji_extend_green(info->linebuf, line_width); + + g_even_pos = 0, g_odd_pos = 1; + b_even_pos = 0, b_odd_pos = 1; + + while (g_even_pos < line_width || g_odd_pos < line_width) + { + if (g_even_pos < line_width) + { + fuji_decode_interpolation_even(line_width, info->linebuf[_G7] + 1, g_even_pos); + g_even_pos += 2; + if (b_even_pos & 3) + errcnt += fuji_decode_sample_even(info, params, info->linebuf[_B4] + 1, b_even_pos, &info->even[2]); + else + fuji_decode_interpolation_even(line_width, info->linebuf[_B4] + 1, b_even_pos); + b_even_pos += 2; + } + if (g_even_pos > 8) + { + errcnt += fuji_decode_sample_odd(info, params, info->linebuf[_G7] + 1, g_odd_pos, &info->odd[2]); + g_odd_pos += 2; + errcnt += fuji_decode_sample_odd(info, params, info->linebuf[_B4] + 1, b_odd_pos, &info->odd[2]); + b_odd_pos += 2; + } + } + + fuji_extend_green(info->linebuf, line_width); + fuji_extend_blue(info->linebuf, line_width); + + if (errcnt) + derror(); +} + +void LibRaw::fuji_bayer_decode_block(fuji_compressed_block *info, const fuji_compressed_params *params, int /*cur_line*/) +{ + int r_even_pos = 0, r_odd_pos = 1; + int g_even_pos = 0, g_odd_pos = 1; + int b_even_pos = 0, b_odd_pos = 1; + + int errcnt = 0; + + const int line_width = params->line_width; + + while (g_even_pos < line_width || g_odd_pos < line_width) + { + if (g_even_pos < line_width) + { + errcnt += fuji_decode_sample_even(info, params, info->linebuf[_R2] + 1, r_even_pos, &info->even[0]); + r_even_pos += 2; + errcnt += fuji_decode_sample_even(info, params, info->linebuf[_G2] + 1, g_even_pos, &info->even[0]); + g_even_pos += 2; + } + if (g_even_pos > 8) + { + errcnt += fuji_decode_sample_odd(info, params, info->linebuf[_R2] + 1, r_odd_pos, &info->odd[0]); + r_odd_pos += 2; + errcnt += fuji_decode_sample_odd(info, params, info->linebuf[_G2] + 1, g_odd_pos, &info->odd[0]); + g_odd_pos += 2; + } + } + + fuji_extend_red(info->linebuf, line_width); + fuji_extend_green(info->linebuf, line_width); + + g_even_pos = 0, g_odd_pos = 1; + + while (g_even_pos < line_width || g_odd_pos < line_width) + { + if (g_even_pos < line_width) + { + errcnt += fuji_decode_sample_even(info, params, info->linebuf[_G3] + 1, g_even_pos, &info->even[1]); + g_even_pos += 2; + errcnt += fuji_decode_sample_even(info, params, info->linebuf[_B2] + 1, b_even_pos, &info->even[1]); + b_even_pos += 2; + } + if (g_even_pos > 8) + { + errcnt += fuji_decode_sample_odd(info, params, info->linebuf[_G3] + 1, g_odd_pos, &info->odd[1]); + g_odd_pos += 2; + errcnt += fuji_decode_sample_odd(info, params, info->linebuf[_B2] + 1, b_odd_pos, &info->odd[1]); + b_odd_pos += 2; + } + } + + fuji_extend_green(info->linebuf, line_width); + fuji_extend_blue(info->linebuf, line_width); + + r_even_pos = 0, r_odd_pos = 1; + g_even_pos = 0, g_odd_pos = 1; + + while (g_even_pos < line_width || g_odd_pos < line_width) + { + if (g_even_pos < line_width) + { + errcnt += fuji_decode_sample_even(info, params, info->linebuf[_R3] + 1, r_even_pos, &info->even[2]); + r_even_pos += 2; + errcnt += fuji_decode_sample_even(info, params, info->linebuf[_G4] + 1, g_even_pos, &info->even[2]); + g_even_pos += 2; + } + if (g_even_pos > 8) + { + errcnt += fuji_decode_sample_odd(info, params, info->linebuf[_R3] + 1, r_odd_pos, &info->odd[2]); + r_odd_pos += 2; + errcnt += fuji_decode_sample_odd(info, params, info->linebuf[_G4] + 1, g_odd_pos, &info->odd[2]); + g_odd_pos += 2; + } + } + + fuji_extend_red(info->linebuf, line_width); + fuji_extend_green(info->linebuf, line_width); + + g_even_pos = 0, g_odd_pos = 1; + b_even_pos = 0, b_odd_pos = 1; + + while (g_even_pos < line_width || g_odd_pos < line_width) + { + if (g_even_pos < line_width) + { + errcnt += fuji_decode_sample_even(info, params, info->linebuf[_G5] + 1, g_even_pos, &info->even[0]); + g_even_pos += 2; + errcnt += fuji_decode_sample_even(info, params, info->linebuf[_B3] + 1, b_even_pos, &info->even[0]); + b_even_pos += 2; + } + if (g_even_pos > 8) + { + errcnt += fuji_decode_sample_odd(info, params, info->linebuf[_G5] + 1, g_odd_pos, &info->odd[0]); + g_odd_pos += 2; + errcnt += fuji_decode_sample_odd(info, params, info->linebuf[_B3] + 1, b_odd_pos, &info->odd[0]); + b_odd_pos += 2; + } + } + + fuji_extend_green(info->linebuf, line_width); + fuji_extend_blue(info->linebuf, line_width); + + r_even_pos = 0, r_odd_pos = 1; + g_even_pos = 0, g_odd_pos = 1; + + while (g_even_pos < line_width || g_odd_pos < line_width) + { + if (g_even_pos < line_width) + { + errcnt += fuji_decode_sample_even(info, params, info->linebuf[_R4] + 1, r_even_pos, &info->even[1]); + r_even_pos += 2; + errcnt += fuji_decode_sample_even(info, params, info->linebuf[_G6] + 1, g_even_pos, &info->even[1]); + g_even_pos += 2; + } + if (g_even_pos > 8) + { + errcnt += fuji_decode_sample_odd(info, params, info->linebuf[_R4] + 1, r_odd_pos, &info->odd[1]); + r_odd_pos += 2; + errcnt += fuji_decode_sample_odd(info, params, info->linebuf[_G6] + 1, g_odd_pos, &info->odd[1]); + g_odd_pos += 2; + } + } + + fuji_extend_red(info->linebuf, line_width); + fuji_extend_green(info->linebuf, line_width); + + g_even_pos = 0, g_odd_pos = 1; + b_even_pos = 0, b_odd_pos = 1; + + while (g_even_pos < line_width || g_odd_pos < line_width) + { + if (g_even_pos < line_width) + { + errcnt += fuji_decode_sample_even(info, params, info->linebuf[_G7] + 1, g_even_pos, &info->even[2]); + g_even_pos += 2; + errcnt += fuji_decode_sample_even(info, params, info->linebuf[_B4] + 1, b_even_pos, &info->even[2]); + b_even_pos += 2; + } + if (g_even_pos > 8) + { + errcnt += fuji_decode_sample_odd(info, params, info->linebuf[_G7] + 1, g_odd_pos, &info->odd[2]); + g_odd_pos += 2; + errcnt += fuji_decode_sample_odd(info, params, info->linebuf[_B4] + 1, b_odd_pos, &info->odd[2]); + b_odd_pos += 2; + } + } + + fuji_extend_green(info->linebuf, line_width); + fuji_extend_blue(info->linebuf, line_width); + + if (errcnt) + derror(); +} + +void LibRaw::fuji_decode_strip(fuji_compressed_params *params, int cur_block, INT64 raw_offset, unsigned dsize, + uchar *q_bases) +{ + int cur_block_width, cur_line; + unsigned line_size; + fuji_compressed_block info; + fuji_compressed_params *info_common = params; + + if (!libraw_internal_data.unpacker_data.fuji_lossless) + { + int buf_size = sizeof(fuji_compressed_params) + (2 << libraw_internal_data.unpacker_data.fuji_bits); + + info_common = (fuji_compressed_params *)malloc(buf_size); + memcpy(info_common, params, sizeof(fuji_compressed_params)); + info_common->qt[0].q_table = (int8_t *)(info_common + 1); + info_common->qt[0].q_base = -1; + } + init_fuji_block(&info, info_common, raw_offset, dsize); + line_size = sizeof(ushort) * (info_common->line_width + 2); + + cur_block_width = libraw_internal_data.unpacker_data.fuji_block_width; + if (cur_block + 1 == libraw_internal_data.unpacker_data.fuji_total_blocks) + { + cur_block_width = imgdata.sizes.raw_width - (libraw_internal_data.unpacker_data.fuji_block_width * cur_block); + /* Old code, may get incorrect results on GFX50, but luckily large optical + black cur_block_width = imgdata.sizes.raw_width % + libraw_internal_data.unpacker_data.fuji_block_width; + */ + } + + struct i_pair + { + int a, b; + }; + const i_pair mtable[6] = {{_R0, _R3}, {_R1, _R4}, {_G0, _G6}, {_G1, _G7}, {_B0, _B3}, {_B1, _B4}}, + ztable[3] = {{_R2, 3}, {_G2, 6}, {_B2, 3}}; + for (cur_line = 0; cur_line < libraw_internal_data.unpacker_data.fuji_total_lines; cur_line++) + { + // init grads and main qtable + if (!libraw_internal_data.unpacker_data.fuji_lossless) + { + int q_base = q_bases ? q_bases[cur_line] : 0; + if (!cur_line || q_base != info_common->qt[0].q_base) + { + init_main_qtable(info_common, q_bases[cur_line]); + init_main_grads(info_common, &info); + } + } + + if (libraw_internal_data.unpacker_data.fuji_raw_type == 16) + xtrans_decode_block(&info, info_common, cur_line); + else + fuji_bayer_decode_block(&info, info_common, cur_line); + + // copy data from line buffers and advance + for (int i = 0; i < 6; i++) + memcpy(info.linebuf[mtable[i].a], info.linebuf[mtable[i].b], line_size); + + if (libraw_internal_data.unpacker_data.fuji_raw_type == 16) + copy_line_to_xtrans(&info, cur_line, cur_block, cur_block_width); + else + copy_line_to_bayer(&info, cur_line, cur_block, cur_block_width); + + for (int i = 0; i < 3; i++) + { + memset(info.linebuf[ztable[i].a], 0, ztable[i].b * line_size); + info.linebuf[ztable[i].a][0] = info.linebuf[ztable[i].a - 1][1]; + info.linebuf[ztable[i].a][info_common->line_width + 1] = info.linebuf[ztable[i].a - 1][info_common->line_width]; + } + } + + // release data + if (!libraw_internal_data.unpacker_data.fuji_lossless) + free(info_common); + free(info.linealloc); + free(info.cur_buf); +} + +void LibRaw::fuji_compressed_load_raw() +{ + fuji_compressed_params common_info; + int cur_block; + unsigned *block_sizes; + uchar *q_bases = 0; + INT64 raw_offset, *raw_block_offsets; + + init_fuji_compr(&common_info); + + // read block sizes + block_sizes = (unsigned *)malloc(sizeof(unsigned) * libraw_internal_data.unpacker_data.fuji_total_blocks); + raw_block_offsets = (INT64 *)malloc(sizeof(INT64) * libraw_internal_data.unpacker_data.fuji_total_blocks); + + libraw_internal_data.internal_data.input->seek(libraw_internal_data.unpacker_data.data_offset, SEEK_SET); + int sizesToRead = sizeof(unsigned) * libraw_internal_data.unpacker_data.fuji_total_blocks; + if (libraw_internal_data.internal_data.input->read(block_sizes, 1, sizesToRead) != sizesToRead) + { + free(block_sizes); + free(raw_block_offsets); + throw LIBRAW_EXCEPTION_IO_EOF; + } + + raw_offset = ((sizeof(unsigned) * libraw_internal_data.unpacker_data.fuji_total_blocks) + 0xF) & ~0xF; + + // read q bases for lossy + if (!libraw_internal_data.unpacker_data.fuji_lossless) + { + int total_q_bases = libraw_internal_data.unpacker_data.fuji_total_blocks * + ((libraw_internal_data.unpacker_data.fuji_total_lines + 0xF) & ~0xF); + q_bases = (uchar *)malloc(total_q_bases); + libraw_internal_data.internal_data.input->seek(raw_offset + libraw_internal_data.unpacker_data.data_offset, + SEEK_SET); + libraw_internal_data.internal_data.input->read(q_bases, 1, total_q_bases); + raw_offset += total_q_bases; + } + + raw_offset += libraw_internal_data.unpacker_data.data_offset; + + // calculating raw block offsets + raw_block_offsets[0] = raw_offset; + for (cur_block = 0; cur_block < libraw_internal_data.unpacker_data.fuji_total_blocks; cur_block++) + { + unsigned bsize = sgetn(4, (uchar *)(block_sizes + cur_block)); + block_sizes[cur_block] = bsize; + } + + for (cur_block = 1; cur_block < libraw_internal_data.unpacker_data.fuji_total_blocks; cur_block++) + raw_block_offsets[cur_block] = raw_block_offsets[cur_block - 1] + block_sizes[cur_block - 1]; + + fuji_decode_loop(&common_info, libraw_internal_data.unpacker_data.fuji_total_blocks, raw_block_offsets, block_sizes, + q_bases); + + free(q_bases); + free(block_sizes); + free(raw_block_offsets); + free(common_info.buf); +} + +void LibRaw::fuji_decode_loop(fuji_compressed_params *common_info, int count, INT64 *raw_block_offsets, + unsigned *block_sizes, uchar *q_bases) +{ + int cur_block; + const int lineStep = (libraw_internal_data.unpacker_data.fuji_total_lines + 0xF) & ~0xF; +#ifdef LIBRAW_USE_OPENMP +#pragma omp parallel for private(cur_block) +#endif + for (cur_block = 0; cur_block < count; cur_block++) + { + fuji_decode_strip(common_info, cur_block, raw_block_offsets[cur_block], block_sizes[cur_block], + q_bases ? q_bases + cur_block * lineStep : 0); + } +} + +void LibRaw::parse_fuji_compressed_header() +{ + unsigned signature, lossless, h_raw_type, h_raw_bits, h_raw_height, h_raw_rounded_width, h_raw_width, h_block_size, + h_blocks_in_row, h_total_lines; + + uchar header[16]; + + libraw_internal_data.internal_data.input->seek(libraw_internal_data.unpacker_data.data_offset, SEEK_SET); + if (libraw_internal_data.internal_data.input->read(header, 1, sizeof(header)) != sizeof(header)) + return; + + // read all header + signature = sgetn(2, header); + lossless = header[2]; + h_raw_type = header[3]; + h_raw_bits = header[4]; + h_raw_height = sgetn(2, header + 5); + h_raw_rounded_width = sgetn(2, header + 7); + h_raw_width = sgetn(2, header + 9); + h_block_size = sgetn(2, header + 11); + h_blocks_in_row = header[13]; + h_total_lines = sgetn(2, header + 14); + + // general validation + if (signature != 0x4953 || lossless > 1 || h_raw_height > 0x4002 || h_raw_height < 6 || h_raw_height % 6 || + h_block_size < 1 || h_raw_width > 0x4200 || h_raw_width < 0x300 || h_raw_width % 24 || + h_raw_rounded_width > 0x4200 || h_raw_rounded_width < h_block_size || h_raw_rounded_width % h_block_size || + h_raw_rounded_width - h_raw_width >= h_block_size || h_block_size != 0x300 || h_blocks_in_row > 0x10 || + h_blocks_in_row == 0 || h_blocks_in_row != h_raw_rounded_width / h_block_size || h_total_lines > 0xAAB || + h_total_lines == 0 || h_total_lines != h_raw_height / 6 || + (h_raw_bits != 12 && h_raw_bits != 14 && h_raw_bits != 16) || (h_raw_type != 16 && h_raw_type != 0)) + return; + + // modify data + libraw_internal_data.unpacker_data.fuji_total_lines = h_total_lines; + libraw_internal_data.unpacker_data.fuji_total_blocks = h_blocks_in_row; + libraw_internal_data.unpacker_data.fuji_block_width = h_block_size; + libraw_internal_data.unpacker_data.fuji_bits = h_raw_bits; + libraw_internal_data.unpacker_data.fuji_raw_type = h_raw_type; + libraw_internal_data.unpacker_data.fuji_lossless = lossless; + imgdata.sizes.raw_width = h_raw_width; + imgdata.sizes.raw_height = h_raw_height; + libraw_internal_data.unpacker_data.data_offset += 16; + load_raw = &LibRaw::fuji_compressed_load_raw; +} + +#undef _abs +#undef _min diff --git a/rtengine/libraw/src/decoders/generic.cpp b/rtengine/libraw/src/decoders/generic.cpp new file mode 100644 index 000000000..b286ed790 --- /dev/null +++ b/rtengine/libraw/src/decoders/generic.cpp @@ -0,0 +1,101 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +void LibRaw::unpacked_load_raw() +{ + int row, col, bits = 0; + while (1 << ++bits < (int)maximum) + ; + read_shorts(raw_image, raw_width * raw_height); + fseek(ifp, -2, SEEK_CUR); // avoid EOF error + if (maximum < 0xffff || load_flags) + for (row = 0; row < raw_height; row++) + { + checkCancel(); + for (col = 0; col < raw_width; col++) + if ((RAW(row, col) >>= load_flags) >> bits && + (unsigned)(row - top_margin) < height && + (unsigned)(col - left_margin) < width) + derror(); + } +} + +void LibRaw::packed_load_raw() +{ + int vbits = 0, bwide, rbits, bite, half, irow, row, col, val, i; + UINT64 bitbuf = 0; + + bwide = raw_width * tiff_bps / 8; + bwide += bwide & load_flags >> 7; + rbits = bwide * 8 - raw_width * tiff_bps; + if (load_flags & 1) + bwide = bwide * 16 / 15; + bite = 8 + (load_flags & 24); + half = (raw_height + 1) >> 1; + for (irow = 0; irow < raw_height; irow++) + { + checkCancel(); + row = irow; + if (load_flags & 2 && (row = irow % half * 2 + irow / half) == 1 && + load_flags & 4) + { + if (vbits = 0, tiff_compress) + fseek(ifp, data_offset - (-half * bwide & -2048), SEEK_SET); + else + { + fseek(ifp, 0, SEEK_END); + fseek(ifp, ftell(ifp) >> 3 << 2, SEEK_SET); + } + } + if (feof(ifp)) + throw LIBRAW_EXCEPTION_IO_EOF; + for (col = 0; col < raw_width; col++) + { + for (vbits -= tiff_bps; vbits < 0; vbits += bite) + { + bitbuf <<= bite; + for (i = 0; i < bite; i += 8) + bitbuf |= (unsigned(fgetc(ifp)) << i); + } + val = bitbuf << (64 - tiff_bps - vbits) >> (64 - tiff_bps); + RAW(row, col ^ (load_flags >> 6 & 1)) = val; + if (load_flags & 1 && (col % 10) == 9 && fgetc(ifp) && + row < height + top_margin && col < width + left_margin) + derror(); + } + vbits -= rbits; + } +} + +void LibRaw::eight_bit_load_raw() +{ + unsigned row, col; + + std::vector pixel(raw_width); + for (row = 0; row < raw_height; row++) + { + checkCancel(); + if (fread(pixel.data(), 1, raw_width, ifp) < raw_width) + derror(); + for (col = 0; col < raw_width; col++) + RAW(row, col) = curve[pixel[col]]; + } + maximum = curve[0xff]; +} diff --git a/rtengine/libraw/src/decoders/kodak_decoders.cpp b/rtengine/libraw/src/decoders/kodak_decoders.cpp new file mode 100644 index 000000000..0706e4911 --- /dev/null +++ b/rtengine/libraw/src/decoders/kodak_decoders.cpp @@ -0,0 +1,524 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +#define radc_token(tree) ((signed char)getbithuff(8, huff + (tree) * 256)) + +#define FORYX \ + for (y = 1; y < 3; y++) \ + for (x = col + 1; x >= col; x--) + +#define PREDICTOR \ + (c ? (buf[c][y - 1][x] + buf[c][y][x + 1]) / 2 \ + : (buf[c][y - 1][x + 1] + 2 * buf[c][y - 1][x] + buf[c][y][x + 1]) / 4) + +#ifdef __GNUC__ +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) +#pragma GCC optimize("no-aggressive-loop-optimizations") +#endif +#endif + +void LibRaw::kodak_radc_load_raw() +{ + // All kodak radc images are 768x512 + if (width > 768 || raw_width > 768 || height > 512 || raw_height > 512) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + static const signed char src[] = { + 1, 1, 2, 3, 3, 4, 4, 2, 5, 7, 6, 5, 7, 6, 7, 8, 1, 0, + 2, 1, 3, 3, 4, 4, 5, 2, 6, 7, 7, 6, 8, 5, 8, 8, 2, 1, + 2, 3, 3, 0, 3, 2, 3, 4, 4, 6, 5, 5, 6, 7, 6, 8, 2, 0, + 2, 1, 2, 3, 3, 2, 4, 4, 5, 6, 6, 7, 7, 5, 7, 8, 2, 1, + 2, 4, 3, 0, 3, 2, 3, 3, 4, 7, 5, 5, 6, 6, 6, 8, 2, 3, + 3, 1, 3, 2, 3, 4, 3, 5, 3, 6, 4, 7, 5, 0, 5, 8, 2, 3, + 2, 6, 3, 0, 3, 1, 4, 4, 4, 5, 4, 7, 5, 2, 5, 8, 2, 4, + 2, 7, 3, 3, 3, 6, 4, 1, 4, 2, 4, 5, 5, 0, 5, 8, 2, 6, + 3, 1, 3, 3, 3, 5, 3, 7, 3, 8, 4, 0, 5, 2, 5, 4, 2, 0, + 2, 1, 3, 2, 3, 3, 4, 4, 4, 5, 5, 6, 5, 7, 4, 8, 1, 0, + 2, 2, 2, -2, 1, -3, 1, 3, 2, -17, 2, -5, 2, 5, 2, 17, 2, -7, + 2, 2, 2, 9, 2, 18, 2, -18, 2, -9, 2, -2, 2, 7, 2, -28, 2, 28, + 3, -49, 3, -9, 3, 9, 4, 49, 5, -79, 5, 79, 2, -1, 2, 13, 2, 26, + 3, 39, 4, -16, 5, 55, 6, -37, 6, 76, 2, -26, 2, -13, 2, 1, 3, -39, + 4, 16, 5, -55, 6, -76, 6, 37}; + std::vector huff_buffer(19 * 256); + ushort* huff = &huff_buffer[0]; + int row, col, tree, nreps, rep, step, i, c, s, r, x, y, val; + short last[3] = {16, 16, 16}, mul[3], buf[3][3][386]; + static const ushort pt[] = {0, 0, 1280, 1344, 2320, 3616, + 3328, 8000, 4095, 16383, 65535, 16383}; + + for (i = 2; i < 12; i += 2) + for (c = pt[i - 2]; c <= pt[i]; c++) + curve[c] = (float)(c - pt[i - 2]) / (pt[i] - pt[i - 2]) * + (pt[i + 1] - pt[i - 1]) + + pt[i - 1] + 0.5; + for (s = i = 0; i < int(sizeof src); i += 2) + FORC(256 >> src[i]) + ((ushort *)huff)[s++] = src[i] << 8 | (uchar)src[i + 1]; + s = kodak_cbpp == 243 ? 2 : 3; + FORC(256) huff[18 * 256 + c] = (8 - s) << 8 | c >> s << s | 1 << (s - 1); + getbits(-1); + for (i = 0; i < int(sizeof(buf) / sizeof(short)); i++) + ((short *)buf)[i] = 2048; + for (row = 0; row < height; row += 4) + { + checkCancel(); + FORC3 mul[c] = getbits(6); + if (!mul[0] || !mul[1] || !mul[2]) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + FORC3 + { + val = ((0x1000000 / last[c] + 0x7ff) >> 12) * mul[c]; + s = val > 65564 ? 10 : 12; + x = ~((~0u) << (s - 1)); + val <<= 12 - s; + for (i = 0; i < int(sizeof(buf[0]) / sizeof(short)); i++) + ((short *)buf[c])[i] = MIN(0x7FFFFFFF, (((short *)buf[c])[i] * static_cast(val) + x)) >> s; + last[c] = mul[c]; + for (r = 0; r <= int(!c); r++) + { + buf[c][1][width / 2] = buf[c][2][width / 2] = mul[c] << 7; + for (tree = 1, col = width / 2; col > 0;) + { + if ((tree = radc_token(tree))) + { + col -= 2; + if (col >= 0) + { + if (tree == 8) + FORYX buf[c][y][x] = (uchar)radc_token(18) * mul[c]; + else + FORYX buf[c][y][x] = radc_token(tree + 10) * 16 + PREDICTOR; + } + } + else + do + { + nreps = (col > 2) ? radc_token(9) + 1 : 1; + for (rep = 0; rep < 8 && rep < nreps && col > 0; rep++) + { + col -= 2; + if (col >= 0) + FORYX buf[c][y][x] = PREDICTOR; + if (rep & 1) + { + step = radc_token(10) << 4; + FORYX buf[c][y][x] += step; + } + } + } while (nreps == 9); + } + for (y = 0; y < 2; y++) + for (x = 0; x < width / 2; x++) + { + val = (buf[c][y + 1][x] << 4) / mul[c]; + if (val < 0) + val = 0; + if (c) + RAW(row + y * 2 + c - 1, x * 2 + 2 - c) = val; + else + RAW(row + r * 2 + y, x * 2 + y) = val; + } + memcpy(buf[c][0] + !c, buf[c][2], sizeof buf[c][0] - 2 * !c); + } + } + for (y = row; y < row + 4; y++) + for (x = 0; x < width; x++) + if ((x + y) & 1) + { + r = x ? x - 1 : x + 1; + s = x + 1 < width ? x + 1 : x - 1; + val = (RAW(y, x) - 2048) * 2 + (RAW(y, r) + RAW(y, s)) / 2; + if (val < 0) + val = 0; + RAW(y, x) = val; + } + } + for (i = 0; i < height * width; i++) + raw_image[i] = curve[raw_image[i]]; + maximum = 0x3fff; +} + +#undef FORYX +#undef PREDICTOR + +#ifdef NO_JPEG +void LibRaw::kodak_jpeg_load_raw() {} +#else +static void jpegErrorExit_k(j_common_ptr /*cinfo*/) +{ + throw LIBRAW_EXCEPTION_DECODE_JPEG; +} + +// LibRaw's Kodak_jpeg_load_raw +void LibRaw::kodak_jpeg_load_raw() +{ + if (data_size < 1) + throw LIBRAW_EXCEPTION_DECODE_JPEG; + + int row, col; + struct jpeg_decompress_struct cinfo; + struct jpeg_error_mgr pub; + cinfo.err = jpeg_std_error(&pub); + pub.error_exit = jpegErrorExit_k; + + if (INT64(data_size) > + INT64(imgdata.rawparams.max_raw_memory_mb) * INT64(1024 * 1024)) + throw LIBRAW_EXCEPTION_TOOBIG; + + unsigned char *jpg_buf = (unsigned char *)malloc(data_size); + std::vector pixel_buf(width * 3); + jpeg_create_decompress(&cinfo); + + fread(jpg_buf, data_size, 1, ifp); + libraw_swab(jpg_buf, data_size); + try + { + jpeg_mem_src(&cinfo, jpg_buf, data_size); + int rc = jpeg_read_header(&cinfo, TRUE); + if (rc != 1) + throw LIBRAW_EXCEPTION_DECODE_JPEG; + + jpeg_start_decompress(&cinfo); + if ((cinfo.output_width != width) || (cinfo.output_height * 2 != height) || + (cinfo.output_components != 3)) + { + throw LIBRAW_EXCEPTION_DECODE_JPEG; + } + + unsigned char *buf[1]; + buf[0] = pixel_buf.data(); + + while (cinfo.output_scanline < cinfo.output_height) + { + checkCancel(); + row = cinfo.output_scanline * 2; + jpeg_read_scanlines(&cinfo, buf, 1); + unsigned char(*pixel)[3] = (unsigned char(*)[3])buf[0]; + for (col = 0; col < width; col += 2) + { + RAW(row + 0, col + 0) = pixel[col + 0][1] << 1; + RAW(row + 1, col + 1) = pixel[col + 1][1] << 1; + RAW(row + 0, col + 1) = pixel[col][0] + pixel[col + 1][0]; + RAW(row + 1, col + 0) = pixel[col][2] + pixel[col + 1][2]; + } + } + } + catch (...) + { + jpeg_finish_decompress(&cinfo); + jpeg_destroy_decompress(&cinfo); + free(jpg_buf); + throw; + } + jpeg_finish_decompress(&cinfo); + jpeg_destroy_decompress(&cinfo); + free(jpg_buf); + maximum = 0xff << 1; +} +#endif + +void LibRaw::kodak_dc120_load_raw() +{ + static const int mul[4] = {162, 192, 187, 92}; + static const int add[4] = {0, 636, 424, 212}; + uchar pixel[848]; + int row, shift, col; + + for (row = 0; row < height; row++) + { + checkCancel(); + if (fread(pixel, 1, 848, ifp) < 848) + derror(); + shift = row * mul[row & 3] + add[row & 3]; + for (col = 0; col < width; col++) + RAW(row, col) = (ushort)pixel[(col + shift) % 848]; + } + maximum = 0xff; +} +void LibRaw::kodak_c330_load_raw() +{ + if (!image) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + int row, col, y, cb, cr, rgb[3], c; + + std::vector pixel(raw_width*2 + 4); + + for (row = 0; row < height; row++) + { + checkCancel(); + if (fread(pixel.data(), raw_width, 2, ifp) < 2) + derror(); + if (load_flags && (row & 31) == 31) + fseek(ifp, raw_width * 32, SEEK_CUR); + for (col = 0; col < width; col++) + { + y = pixel[col * 2]; + cb = pixel[(col * 2 & -4) | 1] - 128; + cr = pixel[(col * 2 & -4) | 3] - 128; + rgb[1] = y - ((cb + cr + 2) >> 2); + rgb[2] = rgb[1] + cb; + rgb[0] = rgb[1] + cr; + FORC3 image[row * width + col][c] = curve[LIM(rgb[c], 0, 255)]; + } + } + maximum = curve[0xff]; +} + +void LibRaw::kodak_c603_load_raw() +{ + if (!image) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + int row, col, y, cb, cr, rgb[3], c; + + std::vector pixel(raw_width * 3); + for (row = 0; row < height; row++) + { + checkCancel(); + if (~row & 1) + if (fread(pixel.data(), raw_width, 3, ifp) < 3) + derror(); + for (col = 0; col < width; col++) + { + y = pixel[width * 2 * (row & 1) + col]; + cb = pixel[width + (col & -2)] - 128; + cr = pixel[width + (col & -2) + 1] - 128; + rgb[1] = y - ((cb + cr + 2) >> 2); + rgb[2] = rgb[1] + cb; + rgb[0] = rgb[1] + cr; + FORC3 image[row * width + col][c] = curve[LIM(rgb[c], 0, 255)]; + } + } + maximum = curve[0xff]; +} + +void LibRaw::kodak_262_load_raw() +{ + static const uchar kodak_tree[2][26] = { + {0, 1, 5, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, + {0, 3, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}; + ushort *huff[2]; + int *strip, ns, c, row, col, chess, pi = 0, pi1, pi2, pred, val; + + FORC(2) huff[c] = make_decoder(kodak_tree[c]); + ns = (raw_height + 63) >> 5; + std::vector pixel(raw_width * 32 + ns * 4); + strip = (int *)(pixel.data() + raw_width * 32); + order = 0x4d4d; + FORC(ns) strip[c] = get4(); + try + { + for (row = 0; row < raw_height; row++) + { + checkCancel(); + if ((row & 31) == 0) + { + fseek(ifp, strip[row >> 5], SEEK_SET); + getbits(-1); + pi = 0; + } + for (col = 0; col < raw_width; col++) + { + chess = (row + col) & 1; + pi1 = chess ? pi - 2 : pi - raw_width - 1; + pi2 = chess ? pi - 2 * raw_width : pi - raw_width + 1; + if (col <= chess) + pi1 = -1; + if (pi1 < 0) + pi1 = pi2; + if (pi2 < 0) + pi2 = pi1; + if (pi1 < 0 && col > 1) + pi1 = pi2 = pi - 2; + pred = (pi1 < 0) ? 0 : (pixel[pi1] + pixel[pi2]) >> 1; + pixel[pi] = val = pred + ljpeg_diff(huff[chess]); + if (val >> 8) + derror(); + val = curve[pixel[pi++]]; + RAW(row, col) = val; + } + } + } + catch (...) + { + FORC(2) free(huff[c]); + throw; + } + FORC(2) free(huff[c]); +} + +int LibRaw::kodak_65000_decode(short *out, int bsize) +{ + uchar c, blen[768]; + ushort raw[6]; + INT64 bitbuf = 0; + int save, bits = 0, i, j, len, diff; + + save = ftell(ifp); + bsize = (bsize + 3) & -4; + for (i = 0; i < bsize; i += 2) + { + c = fgetc(ifp); + if ((blen[i] = c & 15) > 12 || (blen[i + 1] = c >> 4) > 12) + { + fseek(ifp, save, SEEK_SET); + for (i = 0; i < bsize; i += 8) + { + read_shorts(raw, 6); + out[i] = raw[0] >> 12 << 8 | raw[2] >> 12 << 4 | raw[4] >> 12; + out[i + 1] = raw[1] >> 12 << 8 | raw[3] >> 12 << 4 | raw[5] >> 12; + for (j = 0; j < 6; j++) + out[i + 2 + j] = raw[j] & 0xfff; + } + return 1; + } + } + if ((bsize & 7) == 4) + { + bitbuf = fgetc(ifp) << 8; + bitbuf += fgetc(ifp); + bits = 16; + } + for (i = 0; i < bsize; i++) + { + len = blen[i]; + if (bits < len) + { + for (j = 0; j < 32; j += 8) + bitbuf += (INT64)fgetc(ifp) << (bits + (j ^ 8)); + bits += 32; + } + diff = bitbuf & (0xffff >> (16 - len)); + bitbuf >>= len; + bits -= len; + if (len > 0 && (diff & (1 << (len - 1))) == 0) + diff -= (1 << len) - 1; + out[i] = diff; + } + return 0; +} + +void LibRaw::kodak_65000_load_raw() +{ + short buf[272]; /* 264 looks enough */ + int row, col, len, pred[2], ret, i; + + for (row = 0; row < height; row++) + { + checkCancel(); + for (col = 0; col < width; col += 256) + { + pred[0] = pred[1] = 0; + len = MIN(256, width - col); + ret = kodak_65000_decode(buf, len); + for (i = 0; i < len; i++) + { + int idx = ret ? buf[i] : (pred[i & 1] += buf[i]); + if (idx >= 0 && idx < 0xffff) + { + if ((RAW(row, col + i) = curve[idx]) >> 12) + derror(); + } + else + derror(); + } + } + } +} + +void LibRaw::kodak_ycbcr_load_raw() +{ + if (!image) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + short buf[384], *bp; + int row, col, len, c, i, j, k, y[2][2], cb, cr, rgb[3]; + ushort *ip; + + unsigned int bits = + (load_flags && load_flags > 9 && load_flags < 17) ? load_flags : 10; + const int pixels = int(width)*int(height); + for (row = 0; row < height; row += 2) + { + checkCancel(); + for (col = 0; col < width; col += 128) + { + len = MIN(128, width - col); + kodak_65000_decode(buf, len * 3); + y[0][1] = y[1][1] = cb = cr = 0; + for (bp = buf, i = 0; i < len; i += 2, bp += 2) + { + cb += bp[4]; + cr += bp[5]; + rgb[1] = -((cb + cr + 2) >> 2); + rgb[2] = rgb[1] + cb; + rgb[0] = rgb[1] + cr; + for (j = 0; j < 2; j++) + for (k = 0; k < 2; k++) + { + if ((y[j][k] = y[j][k ^ 1] + *bp++) >> bits) + derror(); + int indx = (row + j) * width + col + i + k; + if(indx>=0 && indx < pixels) + { + ip = image[indx]; + FORC3 ip[c] = curve[LIM(y[j][k] + rgb[c], 0, 0xfff)]; + } + } + } + } + } +} + +void LibRaw::kodak_rgb_load_raw() +{ + if (!image) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + short buf[768], *bp; + int row, col, len, c, i, rgb[3], ret; + ushort *ip = image[0]; + + for (row = 0; row < height; row++) + { + checkCancel(); + for (col = 0; col < width; col += 256) + { + len = MIN(256, width - col); + ret = kodak_65000_decode(buf, len * 3); + memset(rgb, 0, sizeof rgb); + for (bp = buf, i = 0; i < len; i++, ip += 4) + if (load_flags == 12) + FORC3 ip[c] = ret ? (*bp++) : (rgb[c] += *bp++); + else + FORC3 if ((ip[c] = ret ? (*bp++) : (rgb[c] += *bp++)) >> 12) derror(); + } + } +} + +void LibRaw::kodak_thumb_load_raw() +{ + if (!image) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + int row, col; + colors = thumb_misc >> 5; + for (row = 0; row < height; row++) + for (col = 0; col < width; col++) + read_shorts(image[row * width + col], colors); + maximum = (1 << (thumb_misc & 31)) - 1; +} diff --git a/rtengine/libraw/src/decoders/load_mfbacks.cpp b/rtengine/libraw/src/decoders/load_mfbacks.cpp new file mode 100644 index 000000000..35da14da4 --- /dev/null +++ b/rtengine/libraw/src/decoders/load_mfbacks.cpp @@ -0,0 +1,1170 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +inline uint32_t abs32(int32_t x) +{ + // Branchless version. + uint32_t sm = x >> 31; + return (uint32_t) ((x + sm) ^ sm); +} + +inline uint32_t min32(uint32_t x, uint32_t y) +{ + return x < y ? x : y; +} + +inline uint32_t max32(uint32_t x, uint32_t y) +{ + return x > y ? x : y; +} + +inline uint32_t constain32(uint32_t x, uint32_t l, uint32_t u) +{ + return x < l ? l : (x > u ? u : x); +} + +int unsigned_cmp(const void *a, const void *b) +{ + if (!a || !b) + return 0; + + return *(unsigned *)a > *(unsigned *)b ? 1 : (*(unsigned *)a < *(unsigned *)b ? -1 : 0); +} + +int LibRaw::p1rawc(unsigned row, unsigned col, unsigned& count) +{ + return (row < raw_height && col < raw_width) ? (++count, RAW(row, col)) : 0; +} + +int LibRaw::p1raw(unsigned row, unsigned col) +{ + return (row < raw_height && col < raw_width) ? RAW(row, col) : 0; +} + + +// DNG SDK version of fixing pixels in bad column using averages sets +// corrected not to use pixels in the same column +void LibRaw::phase_one_fix_col_pixel_avg(unsigned row, unsigned col) +{ + static const int8_t dir[3][8][2] = { + { {-2,-2}, {-2, 2}, {2,-2}, {2, 2}, { 0, 0}, { 0, 0}, {0, 0}, {0, 0} }, + { {-2,-4}, {-4,-2}, {2,-4}, {4,-2}, {-2, 4}, {-4, 2}, {2, 4}, {4, 2} }, + { {-4,-4}, {-4, 4}, {4,-4}, {4, 4}, { 0, 0}, { 0, 0}, {0, 0}, {0, 0} } }; + + for (int set=0; set < 3; ++set) + { + uint32_t total = 0; + uint32_t count = 0; + for (int i = 0; i < 8; ++i) + { + if (!dir[set][i][0] && !dir[set][i][1]) + break; + + total += p1rawc(row+dir[set][i][0], col+dir[set][i][1], count); + } + + if (count) + { + RAW(row,col) = (uint16_t)((total + (count >> 1)) / count); + break; + } + } +} + +// DNG SDK version of fixing pixels in bad column using gradient prediction +void LibRaw::phase_one_fix_pixel_grad(unsigned row, unsigned col) +{ + static const int8_t grad_sets[7][12][2] = { + { {-4,-2}, { 4, 2}, {-3,-1}, { 1, 1}, {-1,-1}, { 3, 1}, + {-4,-1}, { 0, 1}, {-2,-1}, { 2, 1}, { 0,-1}, { 4, 1} }, + { {-2,-2}, { 2, 2}, {-3,-1}, {-1, 1}, {-1,-1}, { 1, 1}, + { 1,-1}, { 3, 1}, {-2,-1}, { 0, 1}, { 0,-1}, { 2, 1} }, + { {-2,-4}, { 2, 4}, {-1,-3}, { 1, 1}, {-1,-1}, { 1, 3}, + {-2,-1}, { 0, 3}, {-1,-2}, { 1, 2}, { 0,-3}, { 2, 1} }, + { { 0,-2}, { 0, 2}, {-1,-1}, {-1, 1}, { 1,-1}, { 1, 1}, + {-1,-2}, {-1, 2}, { 0,-1}, { 0,-1}, { 1,-2}, { 1, 2} }, + { {-2, 4}, { 2,-4}, {-1, 3}, { 1,-1}, {-1, 1}, { 1,-3}, + {-2, 1}, { 0,-3}, {-1, 2}, { 1,-2}, { 0, 3}, { 2,-1} }, + { {-2, 2}, { 2,-2}, {-3, 1}, {-1,-1}, {-1, 1}, { 1,-1}, + { 1, 1}, { 3,-1}, {-2, 1}, { 0,-1}, { 0, 1}, { 2,-1} }, + { {-4, 2}, { 4,-2}, {-3, 1}, { 1,-1}, {-1, 1}, { 3,-1}, + {-4, 1}, { 0,-1}, {-2, 1}, { 2,-1}, { 0, 1}, { 4,-1} } }; + + uint32_t est[7], grad[7]; + uint32_t lower = min32(p1raw(row,col-2), p1raw(row, col+2)); + uint32_t upper = max32(p1raw(row,col-2), p1raw(row, col+2)); + uint32_t minGrad = 0xFFFFFFFF; + for (int i = 0; i<7; ++i) + { + est[i] = p1raw(row+grad_sets[i][0][0], col+grad_sets[i][0][1]) + + p1raw(row+grad_sets[i][1][0], col+grad_sets[i][1][1]); + grad[i] = 0; + for (int j=0; j<12; j+=2) + grad[i] += abs32(p1raw(row+grad_sets[i][j][0], col+grad_sets[i][j][1]) - + p1raw(row+grad_sets[i][j+1][0], col+grad_sets[i][j+1][1])); + minGrad = min32(minGrad, grad[i]); + } + + uint32_t limit = (minGrad * 3) >> 1; + uint32_t total = 0; + uint32_t count = 0; + for (int i = 0; i<7; ++i) + if (grad[i] <= limit) + { + total += est[i]; + count += 2; + } + RAW(row, col) = constain32((total + (count >> 1)) / count, lower, upper); +} + +void LibRaw::phase_one_flat_field(int is_float, int nc) +{ + ushort head[8]; + unsigned wide, high, y, x, c, rend, cend, row, col; + float *mrow, num, mult[4]; + + read_shorts(head, 8); + if (head[2] == 0 || head[3] == 0 || head[4] == 0 || head[5] == 0) + return; + wide = head[2] / head[4] + (head[2] % head[4] != 0); + high = head[3] / head[5] + (head[3] % head[5] != 0); + mrow = (float *)calloc(nc * wide, sizeof *mrow); + for (y = 0; y < high; y++) + { + checkCancel(); + for (x = 0; x < wide; x++) + for (c = 0; c < (unsigned)nc; c += 2) + { + num = is_float ? getreal(LIBRAW_EXIFTAG_TYPE_FLOAT) : get2() / 32768.0; + if (y == 0) + mrow[c * wide + x] = num; + else + mrow[(c + 1) * wide + x] = (num - mrow[c * wide + x]) / head[5]; + } + if (y == 0) + continue; + rend = head[1] + y * head[5]; + for (row = rend - head[5]; + row < raw_height && row < rend && row < unsigned(head[1] + head[3] - head[5]); + row++) + { + for (x = 1; x < wide; x++) + { + for (c = 0; c < (unsigned)nc; c += 2) + { + mult[c] = mrow[c * wide + x - 1]; + mult[c + 1] = (mrow[c * wide + x] - mult[c]) / head[4]; + } + cend = head[0] + x * head[4]; + for (col = cend - head[4]; + col < raw_width && col < cend && col < unsigned(head[0] + head[2] - head[4]); + col++) + { + c = nc > 2 ? FC(row - top_margin, col - left_margin) : 0; + if (!(c & 1)) + { + c = RAW(row, col) * mult[c]; + RAW(row, col) = LIM(c, 0, 65535); + } + for (c = 0; c < (unsigned)nc; c += 2) + mult[c] += mult[c + 1]; + } + } + for (x = 0; x < wide; x++) + for (c = 0; c < (unsigned)nc; c += 2) + mrow[c * wide + x] += mrow[(c + 1) * wide + x]; + } + } + free(mrow); +} + +int LibRaw::phase_one_correct() +{ + unsigned entries, tag, data, save, col, row, type; + int len, i, j, k, cip, sum; +#if 0 + int val[4], dev[4], max; +#endif + int head[9], diff, mindiff = INT_MAX, off_412 = 0; + /* static */ const signed char dir[12][2] = { + {-1, -1}, {-1, 1}, {1, -1}, {1, 1}, {-2, 0}, {0, -2}, + {0, 2}, {2, 0}, {-2, -2}, {-2, 2}, {2, -2}, {2, 2}}; + float poly[8], num, cfrac, frac, mult[2], *yval[2] = {NULL, NULL}; + ushort *xval[2]; + int qmult_applied = 0, qlin_applied = 0; + std::vector badCols; + + if (!meta_length) + return 0; + fseek(ifp, meta_offset, SEEK_SET); + order = get2(); + fseek(ifp, 6, SEEK_CUR); + fseek(ifp, meta_offset + get4(), SEEK_SET); + entries = get4(); + get4(); + + try + { + while (entries--) + { + checkCancel(); + tag = get4(); + len = get4(); + data = get4(); + save = ftell(ifp); + fseek(ifp, meta_offset + data, SEEK_SET); +#if 1 + if (ifp->eof()) + { + // skip bad or unknown tag + fseek(ifp, save, SEEK_SET); + continue; + } +#endif + if (tag == 0x0400) + { /* Sensor defects */ + while ((len -= 8) >= 0) + { + col = get2(); + row = get2(); + type = get2(); + get2(); + if (col >= raw_width) + continue; + if (type == 131 || type == 137) /* Bad column */ +#if 0 + // Original code by Dave Coffin - it works better by + // not employing special logic for G1 channel below. + // Alternatively this column remap (including G1 channel + // logic) should be called prior to black subtraction + // unlike other corrections + for (row = 0; row < raw_height; row++) + { + if (FC(row - top_margin, col - left_margin)==1) + { + for (sum = i = 0; i < 4; i++) + sum += val[i] = p1raw(row + dir[i][0], col + dir[i][1]); + for (max = i = 0; i < 4; i++) + { + dev[i] = abs((val[i] << 2) - sum); + if (dev[max] < dev[i]) + max = i; + } + RAW(row, col) = (sum - val[max]) / 3.0 + 0.5; + } + else + { + for (sum = 0, i = 8; i < 12; i++) + sum += p1raw(row + dir[i][0], col + dir[i][1]); + RAW(row, col) = + 0.5 + sum * 0.0732233 + + (p1raw(row, col - 2) + p1raw(row, col + 2)) * 0.3535534; + } + } +#else + // accumulae bad columns to be sorted later + badCols.push_back(col); +#endif + else if (type == 129) + { /* Bad pixel */ + if (row >= raw_height) + continue; + j = (FC(row - top_margin, col - left_margin) != 1) * 4; + unsigned count = 0; + for (sum = 0, i = j; i < j + 8; i++) + sum += p1rawc(row + dir[i][0], col + dir[i][1], count); + if (count) + RAW(row, col) = (sum + (count >> 1)) / count; + } + } + } + else if (tag == 0x0419) + { /* Polynomial curve - output calibraion */ + for (get4(), i = 0; i < 8; i++) + poly[i] = getreal(LIBRAW_EXIFTAG_TYPE_FLOAT); + poly[3] += (ph1.tag_210 - poly[7]) * poly[6] + 1; + for (i = 0; i < 0x10000; i++) + { + num = (poly[5] * i + poly[3]) * i + poly[1]; + curve[i] = LIM(num, 0, 65535); + } + goto apply; /* apply to right half */ + } + else if (tag == 0x041a) + { /* Polynomial curve */ + for (i = 0; i < 4; i++) + poly[i] = getreal(LIBRAW_EXIFTAG_TYPE_FLOAT); + for (i = 0; i < 0x10000; i++) + { + for (num = 0, j = 4; j--;) + num = num * i + poly[j]; + curve[i] = LIM(num + i, 0, 65535); + } + apply: /* apply to whole image */ + for (row = 0; row < raw_height; row++) + { + checkCancel(); + for (col = (tag & 1) * ph1.split_col; col < raw_width; col++) + RAW(row, col) = curve[RAW(row, col)]; + } + } + else if (tag == 0x0401) + { /* All-color flat fields - luma calibration*/ + phase_one_flat_field(1, 2); + } + else if (tag == 0x0416 || tag == 0x0410) + { + // 0x410 - luma calibration + phase_one_flat_field(0, 2); + } + else if (tag == 0x040b) + { /* Red+blue flat field - croma calibration */ + phase_one_flat_field(0, 4); + } + else if (tag == 0x0412) + { + fseek(ifp, 36, SEEK_CUR); + diff = abs(get2() - ph1.tag_21a); + if (mindiff > diff) + { + mindiff = diff; + off_412 = ftell(ifp) - 38; + } + } + else if (tag == 0x041f && !qlin_applied) + { /* Quadrant linearization */ + ushort lc[2][2][16], ref[16]; + int qr, qc; + bool baddiv = false; + for (qr = 0; qr < 2; qr++) + for (qc = 0; qc < 2; qc++) + { + for (i = 0; i < 16; i++) + lc[qr][qc][i] = get4(); + if (lc[qr][qc][15] == 0) + baddiv = true; + } + if(baddiv) + continue; + for (i = 0; i < 16; i++) + { + int v = 0; + for (qr = 0; qr < 2; qr++) + for (qc = 0; qc < 2; qc++) + v += lc[qr][qc][i]; + ref[i] = (v + 2) >> 2; + } + for (qr = 0; qr < 2; qr++) + { + for (qc = 0; qc < 2; qc++) + { + int cx[19], cf[19]; + for (i = 0; i < 16; i++) + { + cx[1 + i] = lc[qr][qc][i]; + cf[1 + i] = ref[i]; + } + cx[0] = cf[0] = 0; + cx[17] = cf[17] = ((unsigned int)ref[15] * 65535) / lc[qr][qc][15]; + cf[18] = cx[18] = 65535; + cubic_spline(cx, cf, 19); + + for (row = (qr ? ph1.split_row : 0); + row < unsigned(qr ? raw_height : ph1.split_row); row++) + { + checkCancel(); + for (col = (qc ? ph1.split_col : 0); + col < unsigned(qc ? raw_width : ph1.split_col); col++) + RAW(row, col) = curve[RAW(row, col)]; + } + } + } + qlin_applied = 1; + } + else if (tag == 0x041e && !qmult_applied) + { /* Quadrant multipliers - output calibraion */ + float qmult[2][2] = {{1, 1}, {1, 1}}; + get4(); + get4(); + get4(); + get4(); + qmult[0][0] = 1.0 + getreal(LIBRAW_EXIFTAG_TYPE_FLOAT); + get4(); + get4(); + get4(); + get4(); + get4(); + qmult[0][1] = 1.0 + getreal(LIBRAW_EXIFTAG_TYPE_FLOAT); + get4(); + get4(); + get4(); + qmult[1][0] = 1.0 + getreal(LIBRAW_EXIFTAG_TYPE_FLOAT); + get4(); + get4(); + get4(); + qmult[1][1] = 1.0 + getreal(LIBRAW_EXIFTAG_TYPE_FLOAT); + for (row = 0; row < raw_height; row++) + { + checkCancel(); + for (col = 0; col < raw_width; col++) + { + i = qmult[row >= (unsigned)ph1.split_row][col >= (unsigned)ph1.split_col] * + RAW(row, col); + RAW(row, col) = LIM(i, 0, 65535); + } + } + qmult_applied = 1; + } + else if (tag == 0x0431 && !qmult_applied) + { /* Quadrant combined - four tile gain calibration */ + ushort lc[2][2][7], ref[7]; + int qr, qc; + for (i = 0; i < 7; i++) + ref[i] = get4(); + for (qr = 0; qr < 2; qr++) + for (qc = 0; qc < 2; qc++) + for (i = 0; i < 7; i++) + lc[qr][qc][i] = get4(); + for (qr = 0; qr < 2; qr++) + { + for (qc = 0; qc < 2; qc++) + { + int cx[9], cf[9]; + for (i = 0; i < 7; i++) + { + cx[1 + i] = ref[i]; + cf[1 + i] = ((unsigned)ref[i] * lc[qr][qc][i]) / 10000; + } + cx[0] = cf[0] = 0; + cx[8] = cf[8] = 65535; + cubic_spline(cx, cf, 9); + for (row = (qr ? ph1.split_row : 0); + row < unsigned(qr ? raw_height : ph1.split_row); row++) + { + checkCancel(); + for (col = (qc ? ph1.split_col : 0); + col < unsigned(qc ? raw_width : ph1.split_col); col++) + RAW(row, col) = curve[RAW(row, col)]; + } + } + } + qmult_applied = 1; + qlin_applied = 1; + } + fseek(ifp, save, SEEK_SET); + } + if (!badCols.empty()) + { + qsort(badCols.data(), badCols.size(), sizeof(unsigned), unsigned_cmp); + bool prevIsolated = true; + for (i = 0; i < (int)badCols.size(); ++i) + { + bool nextIsolated = i == ((int)(badCols.size()-1)) || badCols[i+1]>badCols[i]+4; + for (row = 0; row < raw_height; ++row) + if (prevIsolated && nextIsolated) + phase_one_fix_pixel_grad(row,badCols[i]); + else + phase_one_fix_col_pixel_avg(row,badCols[i]); + prevIsolated = nextIsolated; + } + } + if (off_412) + { + fseek(ifp, off_412, SEEK_SET); + for (i = 0; i < 9; i++) + head[i] = get4() & 0x7fff; + yval[0] = (float *)calloc(head[1] * head[3] + head[2] * head[4], 6); + yval[1] = (float *)(yval[0] + head[1] * head[3]); + xval[0] = (ushort *)(yval[1] + head[2] * head[4]); + xval[1] = (ushort *)(xval[0] + head[1] * head[3]); + get2(); + for (i = 0; i < 2; i++) + for (j = 0; j < head[i + 1] * head[i + 3]; j++) + yval[i][j] = getreal(LIBRAW_EXIFTAG_TYPE_FLOAT); + for (i = 0; i < 2; i++) + for (j = 0; j < head[i + 1] * head[i + 3]; j++) + xval[i][j] = get2(); + for (row = 0; row < raw_height; row++) + { + checkCancel(); + for (col = 0; col < raw_width; col++) + { + cfrac = (float)col * head[3] / raw_width; + cfrac -= cip = cfrac; + num = RAW(row, col) * 0.5; + for (i = cip; i < cip + 2; i++) + { + for (k = j = 0; j < head[1]; j++) + if (num < xval[0][k = head[1] * i + j]) + break; + frac = (j == 0 || j == head[1]) + ? 0 + : (xval[0][k] - num) / (xval[0][k] - xval[0][k - 1]); + mult[i - cip] = yval[0][k - 1] * frac + yval[0][k] * (1 - frac); + } + i = ((mult[0] * (1 - cfrac) + mult[1] * cfrac) * row + num) * 2; + RAW(row, col) = LIM(i, 0, 65535); + } + } + free(yval[0]); + } + } + catch (...) + { + if (yval[0]) + free(yval[0]); + return LIBRAW_CANCELLED_BY_CALLBACK; + } + return 0; +} + +void LibRaw::phase_one_load_raw() +{ + int a, b, i; + ushort akey, bkey, t_mask; + + fseek(ifp, ph1.key_off, SEEK_SET); + akey = get2(); + bkey = get2(); + t_mask = ph1.format == 1 ? 0x5555 : 0x1354; + if (ph1.black_col || ph1.black_row) + { + imgdata.rawdata.ph1_cblack = + (short(*)[2])calloc(raw_height * 2, sizeof(ushort)); + imgdata.rawdata.ph1_rblack = + (short(*)[2])calloc(raw_width * 2, sizeof(ushort)); + if (ph1.black_col) + { + fseek(ifp, ph1.black_col, SEEK_SET); + read_shorts((ushort *)imgdata.rawdata.ph1_cblack[0], raw_height * 2); + } + if (ph1.black_row) + { + fseek(ifp, ph1.black_row, SEEK_SET); + read_shorts((ushort *)imgdata.rawdata.ph1_rblack[0], raw_width * 2); + } + } + fseek(ifp, data_offset, SEEK_SET); + read_shorts(raw_image, raw_width * raw_height); + if (ph1.format) + for (i = 0; i < raw_width * raw_height; i += 2) + { + a = raw_image[i + 0] ^ akey; + b = raw_image[i + 1] ^ bkey; + raw_image[i + 0] = (a & t_mask) | (b & ~t_mask); + raw_image[i + 1] = (b & t_mask) | (a & ~t_mask); + } +} + +unsigned LibRaw::ph1_bithuff(int nbits, ushort *huff) +{ +#ifndef LIBRAW_NOTHREADS +#define bitbuf tls->ph1_bits.bitbuf +#define vbits tls->ph1_bits.vbits +#else + static UINT64 bitbuf = 0; + static int vbits = 0; +#endif + unsigned c; + + if (nbits == -1) + return bitbuf = vbits = 0; + if (nbits == 0) + return 0; + if (vbits < nbits) + { + bitbuf = bitbuf << 32 | get4(); + vbits += 32; + } + c = bitbuf << (64 - vbits) >> (64 - nbits); + if (huff) + { + vbits -= huff[c] >> 8; + return (uchar)huff[c]; + } + vbits -= nbits; + return c; +#ifndef LIBRAW_NOTHREADS +#undef bitbuf +#undef vbits +#endif +} + +void LibRaw::phase_one_load_raw_c() +{ + static const int length[] = {8, 7, 6, 9, 11, 10, 5, 12, 14, 13}; + int *offset, len[2], pred[2], row, col, i, j; + ushort *pixel; + short(*c_black)[2], (*r_black)[2]; + if (ph1.format == 6) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + pixel = (ushort *)calloc(raw_width * 3 + raw_height * 4, 2); + offset = (int *)(pixel + raw_width); + fseek(ifp, strip_offset, SEEK_SET); + for (row = 0; row < raw_height; row++) + offset[row] = get4(); + c_black = (short(*)[2])(offset + raw_height); + fseek(ifp, ph1.black_col, SEEK_SET); + if (ph1.black_col) + read_shorts((ushort *)c_black[0], raw_height * 2); + r_black = c_black + raw_height; + fseek(ifp, ph1.black_row, SEEK_SET); + if (ph1.black_row) + read_shorts((ushort *)r_black[0], raw_width * 2); + + // Copy data to internal copy (ever if not read) + if (ph1.black_col || ph1.black_row) + { + imgdata.rawdata.ph1_cblack = + (short(*)[2])calloc(raw_height * 2, sizeof(ushort)); + memmove(imgdata.rawdata.ph1_cblack, (ushort *)c_black[0], + raw_height * 2 * sizeof(ushort)); + imgdata.rawdata.ph1_rblack = + (short(*)[2])calloc(raw_width * 2, sizeof(ushort)); + memmove(imgdata.rawdata.ph1_rblack, (ushort *)r_black[0], + raw_width * 2 * sizeof(ushort)); + } + + for (i = 0; i < 256; i++) + curve[i] = i * i / 3.969 + 0.5; + try + { + for (row = 0; row < raw_height; row++) + { + checkCancel(); + fseek(ifp, data_offset + offset[row], SEEK_SET); + ph1_bits(-1); + pred[0] = pred[1] = 0; + for (col = 0; col < raw_width; col++) + { + if (col >= (raw_width & -8)) + len[0] = len[1] = 14; + else if ((col & 7) == 0) + for (i = 0; i < 2; i++) + { + for (j = 0; j < 5 && !ph1_bits(1); j++) + ; + if (j--) + len[i] = length[j * 2 + ph1_bits(1)]; + } + if ((i = len[col & 1]) == 14) + pixel[col] = pred[col & 1] = ph1_bits(16); + else + pixel[col] = pred[col & 1] += ph1_bits(i) + 1 - (1 << (i - 1)); + if (pred[col & 1] >> 16) + derror(); + if (ph1.format == 5 && pixel[col] < 256) + pixel[col] = curve[pixel[col]]; + } + if (ph1.format == 8) + memmove(&RAW(row, 0), &pixel[0], raw_width * 2); + else + for (col = 0; col < raw_width; col++) + RAW(row, col) = pixel[col] << 2; + } + } + catch (...) + { + free(pixel); + throw; + } + free(pixel); + maximum = 0xfffc - ph1.t_black; +} + +// RT: From dcraw.cc. +void LibRaw::hasselblad_correct() +{ + unsigned col, row; + + /* + + This function applies 3FR calibration data. At the time of writing it supports a + subset, so here's a todo list: + + TODO: + - Support all gain tag formats + - The 0x19 tag varies a bit between models. We don't have parsers for all models. + - The reference model used was during initial reverse-engineering was a H4D-50, + we probably support the Hasselblads with Kodak 31, 39, 40 and 50 megapixels + well, but more work is needed for Kodak 16 and 22, Dalsa 60 and Sony 50. + - Apply bad column(?) data (hbd.unknown1) + - It was left out in this initial release since the effect is very small. + - Apply black(?) data, tag 0x1a and 0x1b is not parsed, it has however marginal + effect (at least for shorter exposures) so it's not too important. + + While there are things to do, the current implementation supports the most + important aspects, the faltfield and levels calibrations applied can have strong + visible effects. + + */ + + const auto &hbd = imHassy; + + if (hbd.levels) { + int i; + fseek(ifp, hbd.levels, SEEK_SET); + /* skip the first set (not used as we don't apply on first/last row), we look at it though to see if + the levels format is one that we support (there are other formats on some models which is not + supported here) */ + short test[10]; + for (i = 0; i < 10; i++) test[i] = (short)get2(); + if (test[5] == 0 && test[6] == 0 && test[7] == 0 && test[8] == 0 && test[9] == 0) { + int corr[4]; + ushort *row_above = (ushort *)malloc(sizeof(ushort) * raw_width); // we need to cache row above as we write new values as we go + for (col = 0; col < raw_width; col++) row_above[col] = RAW(0,col); + for (row = 1; row < raw_height-1; row++) { + for (i = 0; i < 4; i++) corr[i] = (short)get2(); + fseek(ifp, 6 * 2, SEEK_CUR); + for (col = 0; col < raw_width; col++) { + unsigned v = RAW(row,col); + if (v >= 65534) { + v = 65535; + } else { + if (corr[((col & 1)<<1)+0] && row_above[col] > black) v += 2 * ((corr[((col & 1)<<1)+0] * (row_above[col]-(int)black)) / 32767) - 2; + if (corr[((col & 1)<<1)+1] && RAW(row+1,col) > black) v += 2 * ((corr[((col & 1)<<1)+1] * (RAW(row+1,col)-(int)black)) / 32767) - 2; + } + row_above[col] = RAW(row,col); + RAW(row,col) = CLIP(v); + } + } + free(row_above); + } + } + + if (hbd.flatfield) { + int bw, bh, ffrows, ffcols, i, c; + ushort ref[4], ref_max; + fseek(ifp, hbd.flatfield, SEEK_SET); + get2(); + bw = get2(); + bh = get2(); + ffcols = get2(); + ffrows = get2(); + fseek(ifp, hbd.flatfield + 16 * 2, SEEK_SET); + unsigned toRead = sizeof(ushort) * 4 * ffcols * ffrows; + if (toRead > ifp->size()) { // there must be something wrong, see Issue #4748 + return; + } + + ushort *ffmap = (ushort *)malloc(toRead); + for (i = 0; i < 4 * ffcols * ffrows; i++) ffmap[i] = get2(); + + /* Get reference values from center of field. This seems to be what Phocus does too, + but haven't cared to figure out exactly at which coordinate */ + i = 4 * (ffcols * ffrows / 2 + ffcols / 2); + ref[0] = ffmap[i+0]; + ref[1] = ffmap[i+1]; + ref[3] = ffmap[i+2]; // G2 = index 3 in dcraw, 2 in 3FR + ref[2] = ffmap[i+3]; + ref_max = 0; + FORC4 if (ref[c] > ref_max) ref_max = ref[c]; + if (ref_max == 0) ref[0] = ref[1] = ref[2] = ref[3] = ref_max = 10000; + + /* Convert measured flatfield values to actual multipliers. The measured flatfield + can have vignetting which should be normalized, only color cast should be corrected. */ + for (i = 0; i < 4 * ffcols * ffrows; i += 4) { + double base, min = 65535.0, max = 0; + double cur[4]; + cur[0] = (double)ffmap[i+0] / ref[0]; + cur[1] = (double)ffmap[i+1] / ref[1]; + cur[3] = (double)ffmap[i+2] / ref[3]; // G2 index differs in dcraw and 3FR + cur[2] = (double)ffmap[i+3] / ref[2]; + FORC4 { + if (cur[c] < min) min = cur[c]; + if (cur[c] > max) max = cur[c]; + } + if (max == 0) max = 1.0; + base = (cur[0]+cur[1]+cur[2]+cur[3])/(max*4); + FORC4 cur[c] = cur[c] == 0 ? 1.0 : (base * max) / cur[c]; + /* convert to integer multiplier and store back to ffmap, we limit + range to 4 (16384*4) which should be fine for flatfield */ + FORC4 { + cur[c] *= 16384.0; + if (cur[c] > 65535.0) cur[c] = 65535.0; + ffmap[i+c] = (ushort)cur[c]; + } + } + + // of the cameras we've tested we know the exact placement of the flatfield map + int row_offset, col_offset; + switch (raw_width) { + case 8282: // 50 megapixel Kodak + row_offset = 21; + col_offset = 71; + break; + default: + /* Default case for camera models we've not tested. We center the map, which may + not be exactly where it should be but close enough for the smooth flatfield */ + row_offset = (raw_height - bh * ffrows) / 2; + col_offset = (raw_width - bw * ffcols) / 2; + break; + } + + /* + Concerning smoothing between blocks in the map Phocus makes it only vertically, + probably because it's simpler and faster. Looking at actual flatfield data it seems + like it's better to smooth in both directions. Possibly flatfield could be used for + correcting tiling on Dalsa sensors (H4D-60) like partly done in Phase One IIQ format, + and then sharp edges may be beneficial at least at the tiling seams, but at the time + of writing I've had no H4D-60 3FR files to test with to verify that. + + Meanwhile we do both vertical and horizontal smoothing/blurring. + */ + + /* pre-calculate constants for blurring. We probably should make a more efficient + blur than this, but this does not need any buffer and makes nice-looking + radial gradients */ + ushort *corners_weight = (ushort *)malloc(bw*bh*9*sizeof(*corners_weight)); + const int corners_mix[9][4][2] = { { {0,0}, {0,1}, {1,0}, {1,1} }, + { {0,1}, {1,1}, {-1,-1}, {-1,-1} }, + { {0,1}, {0,2}, {1,1}, {1,2} }, + { {1,0}, {1,1}, {-1,-1}, {-1,-1} }, + { {1,1}, {-1,-1}, {-1,-1}, {-1,-1} }, + { {1,1}, {1,2}, {-1,-1}, {-1,-1} }, + { {1,0}, {1,1}, {2,0}, {2,1} }, + { {1,1}, {2,1}, {-1,-1}, {-1,-1} }, + { {1,1}, {1,2}, {2,1}, {2,2} } }; + const ushort corners_shift[9] = { 2, 1, 2, 1, 0, 1, 2, 1, 2 }; + for (row = 0; row < bh; row++) { + const ushort maxdist = bw < bh ? bw/2-1 : bh/2-1; + const unsigned bwu = (unsigned)bw; + const unsigned bhu = (unsigned)bh; + const unsigned corners[9][2] = {{0,0}, {0,bwu/2}, {0,bwu-1}, + {bhu/2,0},{bhu/2,bwu/2},{bhu/2,bwu-1}, + {bhu-1,0},{bhu-1,bwu/2},{bhu-1,bwu-1}}; + for (col = 0; col < bw; col++) { + for (i = 0; i < 9; i++) { + ushort dist = (ushort)sqrt(abs((int)(corners[i][0] - row)) * abs((int)(corners[i][0] - row)) + abs((int)(corners[i][1] - col)) * abs((int)(corners[i][1] - col))); + ushort weight = dist > maxdist ? 0 : maxdist - dist; + corners_weight[9*(row*bw+col)+i] = weight; + } + } + } + + // apply flatfield +#if defined(LIBRAW_USE_OPENMP) +#pragma omp parallel for +#endif + for (int row = 0; row < raw_height; row++) { + int ffs, cur_ffr, i, c; + if (row < row_offset) { + cur_ffr = row_offset; + ffs = 0; + } else if (row >= row_offset + ffrows * bh) { + cur_ffr = row_offset + (ffrows-1) * bh; + ffs = 4 * ffcols * (ffrows-1); + } else { + cur_ffr = row_offset + bh * ((row - row_offset) / bh); + ffs = 4 * ffcols * ((row - row_offset) / bh); + } + int next_ffc = 0, cur_ffc = col_offset; + int ffc = ffs; + ushort *cur[3][3]; // points to local ffmap entries with center at cur[1][1] + for (int col = 0; col < raw_width; col++) { + if (col == next_ffc) { + int rowsub = ffs == 0 ? 0 : ffcols*4; + int rowadd = ffs == 4 * ffcols * (ffrows-1) ? 0 : ffcols * 4; + int colsub = ffc == ffs ? 0 : 4; + int coladd = ffc == ffs + 4 * (ffcols-1) ? 0 : 4; + if (col != 0) cur_ffc = next_ffc; + else next_ffc += col_offset; + next_ffc += bw; + + cur[0][0] = &ffmap[ffc-rowsub-colsub]; + cur[0][1] = &ffmap[ffc-rowsub]; + cur[0][2] = &ffmap[ffc-rowsub+coladd]; + + cur[1][0] = &ffmap[ffc-colsub]; + cur[1][1] = &ffmap[ffc]; + cur[1][2] = &ffmap[ffc+coladd]; + + cur[2][0] = &ffmap[ffc+rowadd-colsub]; + cur[2][1] = &ffmap[ffc+rowadd]; + cur[2][2] = &ffmap[ffc+rowadd+coladd]; + + ffc += 4; + if (ffc == ffs + 4 * ffcols) next_ffc += raw_width; // last col in map, avoid stepping further + } + unsigned v = RAW(row,col); + if (v > black && v < 65535) { + c = FC(row - top_margin, col - left_margin); + unsigned x = col < cur_ffc ? 0 : col - cur_ffc; + unsigned y = row < cur_ffr ? 0 : row - cur_ffr; + if (x >= bw) x = bw-1; + if (y >= bh) y = bh-1; + unsigned wsum = 0; + unsigned mul = 0; + for (i = 0; i < 9; i++) { + ushort cw = corners_weight[9*(y*bw+x)+i]; + if (cw) { + unsigned m = 0; + int j; + for (j = 0; j < 1 << corners_shift[i]; j++) { + int cr = corners_mix[i][j][0], cc = corners_mix[i][j][1]; + m += cur[cr][cc][c]; + } + m >>= corners_shift[i]; + mul += m * cw; + wsum += cw; + } + } + mul /= wsum; + v = black + ((v-black) * mul) / 16384; + RAW(row,col) = v > 65535 ? 65535 : v; + } + } + } + free(ffmap); + free(corners_weight); + } +} + +void LibRaw::hasselblad_load_raw() +{ + struct jhead jh; + int shot, row, col, *back[5]={0,0,0,0,0}, + len[2], diff[12], pred, sh, f, c; + unsigned s; + unsigned upix, urow, ucol; + ushort *ip; + + if (!ljpeg_start(&jh, 0)) + return; + order = 0x4949; + ph1_bits(-1); + try + { + back[4] = (int *)calloc(raw_width, 3 * sizeof **back); + FORC3 back[c] = back[4] + c * raw_width; + cblack[6] >>= sh = tiff_samples > 1; + shot = LIM(shot_select, 1, tiff_samples) - 1; + for (row = 0; row < raw_height; row++) + { + checkCancel(); + FORC4 back[(c + 3) & 3] = back[c]; + for (col = 0; col < raw_width; col += 2) + { + for (s = 0; s < tiff_samples * 2; s += 2) + { + FORC(2) len[c] = ph1_huff(jh.huff[0]); + FORC(2) + { + diff[s + c] = ph1_bits(len[c]); + if (len[c] > 0 && (diff[s + c] & (1 << (len[c] - 1))) == 0) + diff[s + c] -= (1 << len[c]) - 1; + if (diff[s + c] == 65535) + diff[s + c] = -32768; + } + } + for (s = col; s < unsigned(col + 2); s++) + { + pred = 0x8000 + load_flags; + if (col) + pred = back[2][s - 2]; + if (col && row > 1) + switch (jh.psv) + { + case 11: + pred += back[0][s] / 2 - back[0][s - 2] / 2; + break; + } + f = (row & 1) * 3 ^ ((col + s) & 1); + FORC(int(tiff_samples)) + { + pred += diff[(s & 1) * tiff_samples + c]; + upix = pred >> sh & 0xffff; + if (raw_image && c == shot) + RAW(row, s) = upix; + if (image) + { + urow = row - top_margin + (c & 1); + ucol = col - left_margin - ((c >> 1) & 1); + ip = &image[urow * width + ucol][f]; + if (urow < height && ucol < width) + *ip = c < 4 ? upix : (*ip + upix) >> 1; + } + } + back[2][s] = pred; + } + } + } + } + catch (...) + { + if(back[4]) + free(back[4]); + ljpeg_end(&jh); + throw; + } + if(back[4]) + free(back[4]); + ljpeg_end(&jh); + if (image) + mix_green = 1; +} + +void LibRaw::leaf_hdr_load_raw() +{ + ushort *pixel = 0; + unsigned tile = 0, r, c, row, col; + + if (!filters || !raw_image) + { + if (!image) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + pixel = (ushort *)calloc(raw_width, sizeof *pixel); + } + try + { + FORC(tiff_samples) + for (r = 0; r < raw_height; r++) + { + checkCancel(); + if (r % tile_length == 0) + { + fseek(ifp, data_offset + 4 * tile++, SEEK_SET); + fseek(ifp, get4(), SEEK_SET); + } + if (filters && c != shot_select) + continue; + if (filters && raw_image) + pixel = raw_image + r * raw_width; + read_shorts(pixel, raw_width); + if (!filters && image && (row = r - top_margin) < height) + for (col = 0; col < width && col + left_margin < raw_width; col++) + image[row * width + col][c] = pixel[col + left_margin]; + } + } + catch (...) + { + if (!filters) + free(pixel); + throw; + } + if (!filters) + { + maximum = 0xffff; + raw_color = 1; + free(pixel); + } +} + +void LibRaw::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; + + 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 +} + +void LibRaw::sinar_4shot_load_raw() +{ + ushort *pixel; + unsigned shot, row, col, r, c; + + if (raw_image) + { + shot = LIM(shot_select, 1, 4) - 1; + fseek(ifp, data_offset + shot * 4, SEEK_SET); + fseek(ifp, get4(), SEEK_SET); + unpacked_load_raw(); + return; + } + if (!image) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + pixel = (ushort *)calloc(raw_width, sizeof *pixel); + try + { + for (shot = 0; shot < 4; shot++) + { + checkCancel(); + fseek(ifp, data_offset + shot * 4, SEEK_SET); + fseek(ifp, get4(), SEEK_SET); + for (row = 0; row < raw_height; row++) + { + read_shorts(pixel, raw_width); + if ((r = row - top_margin - (shot >> 1 & 1)) >= height) + continue; + for (col = 0; col < raw_width; col++) + { + if ((c = col - left_margin - (shot & 1)) >= width) + continue; + image[r * width + c][(row & 1) * 3 ^ (~col & 1)] = pixel[col]; + } + } + } + } + catch (...) + { + free(pixel); + throw; + } + free(pixel); + mix_green = 1; +} + +void LibRaw::imacon_full_load_raw() +{ + if (!image) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + int row, col; + + unsigned short *buf = + (unsigned short *)malloc(width * 3 * sizeof(unsigned short)); + + for (row = 0; row < height; row++) + { + checkCancel(); + read_shorts(buf, width * 3); + unsigned short(*rowp)[4] = &image[row * width]; + for (col = 0; col < width; col++) + { + rowp[col][0] = buf[col * 3]; + rowp[col][1] = buf[col * 3 + 1]; + rowp[col][2] = buf[col * 3 + 2]; + rowp[col][3] = 0; + } + } + free(buf); +} diff --git a/rtengine/libraw/src/decoders/pana8.cpp b/rtengine/libraw/src/decoders/pana8.cpp new file mode 100644 index 000000000..909c9bd8b --- /dev/null +++ b/rtengine/libraw/src/decoders/pana8.cpp @@ -0,0 +1,529 @@ +/* -*- C++ -*- + * File: pana8.cpp + * Copyright (C) 2022-2024 Alex Tutubalin, LibRaw LLC + * + Panasonic RawFormat=8 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). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/libraw_cxx_defs.h" +#include + + // in 8-byte words, 800kb +#define PANA8_BUFSIZE 102400 + +class pana8_bufio_t +{ +public: + pana8_bufio_t(LibRaw_abstract_datastream *stream, INT64 start, uint32_t len) + : data(PANA8_BUFSIZE), input(stream), baseoffset(start), begin(0), end(0), _size(len) + { + } + uint32_t size() { return ((_size+7)/8)*8; } + uint64_t getQWord(uint32_t offset) + { + if (offset >= begin && offset < end) + return data[offset - begin]; + if (!input) return 0; + refill(offset); + if (offset >= begin && offset < end) + return data[offset - begin]; + return 0; + } + void refill(uint32_t newoffset); + + std::vector data; + LibRaw_abstract_datastream *input; + INT64 baseoffset; + INT64 begin, end; + uint32_t _size; +}; + +struct pana8_param_t +{ + uint32_t range_shift, gamma_base; + uint32_t tag3A[6]; + uint32_t tag39[6]; + uint32_t tag3B; + uint32_t initial[4]; + uint32_t huff_coeff[17]; + uint32_t tag3B_2; + uint32_t noGammaFlag; + uint64_t hufftable1[17]; + uint64_t hufftable2[17]; + std::vector gammaTable; + std::vector extrahuff; + pana8_param_t(const pana8_tags_t& init); + int32_t gammaCurve(uint32_t i); + bool DecodeC8( + pana8_bufio_t& bufio, + unsigned int width, unsigned int height, + LibRaw *libraw, uint16_t left_margin); + uint32_t GetDBit(uint64_t a2); +}; + +void invertBits(void *buf, size_t size); + +void pana8_bufio_t::refill(uint32_t newoffset) +{ + if (newoffset >= begin && newoffset < end) + return; + uint32_t readwords, remainwords,toread; +#ifdef LIBRAW_USE_OPENMP +#pragma omp critical + { +#endif + input->lock(); + input->seek(baseoffset + newoffset*sizeof(int64_t), SEEK_SET); + remainwords = (_size - newoffset*sizeof(int64_t) + 7) >> 3; + toread = MIN(PANA8_BUFSIZE, remainwords); + uint32_t readbytes = input->read(data.data(), 1, toread*sizeof(uint64_t)); + readwords = (readbytes + 7) >> 3; + input->unlock(); +#ifdef LIBRAW_USE_OPENMP + } +#endif + + if (INT64(readwords) < INT64(toread) - 1LL) + throw LIBRAW_EXCEPTION_IO_EOF; + + if(readwords>0) + invertBits(data.data(), readwords * sizeof(uint64_t)); + begin = newoffset; + end = newoffset + readwords; +} + +void LibRaw::panasonicC8_load_raw() +{ + int errs = 0; + unsigned totalw = 0; + INT64 fsz = libraw_internal_data.internal_data.input->size(); + if (libraw_internal_data.unpacker_data.pana8.stripe_count > 5) errs++; + for (int i = 0; i < libraw_internal_data.unpacker_data.pana8.stripe_count && i < 5; i++) + { + if (libraw_internal_data.unpacker_data.pana8.stripe_height[i] != imgdata.sizes.raw_height) + errs++; + if (libraw_internal_data.unpacker_data.pana8.stripe_offsets[i] < 0 + || (libraw_internal_data.unpacker_data.pana8.stripe_offsets[i] + INT64((libraw_internal_data.unpacker_data.pana8.stripe_compressed_size[i] + 7u) / 8u)) > fsz) + errs++; + totalw += libraw_internal_data.unpacker_data.pana8.stripe_width[i]; + } + if (totalw != imgdata.sizes.raw_width) errs++; + if (errs) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + pana8_param_t pana8_param(libraw_internal_data.unpacker_data.pana8); + pana8_decode_loop(&pana8_param); +} + +void LibRaw::pana8_decode_loop(void *data) +{ +#ifdef LIBRAW_USE_OPENMP + int errs = 0, scount = MIN(5,libraw_internal_data.unpacker_data.pana8.stripe_count); +#pragma omp parallel for + for (int stream = 0; stream < scount; stream++) + { + if (pana8_decode_strip(data, stream)) + errs++; + } + if(errs) + throw LIBRAW_EXCEPTION_IO_CORRUPT; +#else + for (int stream = 0; stream < libraw_internal_data.unpacker_data.pana8.stripe_count && stream < 5; stream++) + if (pana8_decode_strip(data, stream)) + throw LIBRAW_EXCEPTION_IO_CORRUPT; +#endif +} + +int LibRaw::pana8_decode_strip(void* data, int stream) +{ + pana8_param_t *pana8_param = (pana8_param_t*)data; + if (!data || stream < 0 || stream > 4 || stream > libraw_internal_data.unpacker_data.pana8.stripe_count) return 1; // error + + unsigned exactbytes = (libraw_internal_data.unpacker_data.pana8.stripe_compressed_size[stream] + 7u) / 8u; + pana8_bufio_t bufio(libraw_internal_data.internal_data.input, + libraw_internal_data.unpacker_data.pana8.stripe_offsets[stream], exactbytes); + return !pana8_param->DecodeC8(bufio, libraw_internal_data.unpacker_data.pana8.stripe_width[stream], + libraw_internal_data.unpacker_data.pana8.stripe_height[stream], this, + libraw_internal_data.unpacker_data.pana8.stripe_left[stream]); +} + +struct pana8_base_t +{ + pana8_base_t() { coeff[0] = coeff[1] = coeff[2] = coeff[3] = 0; } + pana8_base_t(const pana8_base_t &s) { clone(s.coeff); } + void clone(const uint32_t *scoeff) + { // TODO: implement SSE load for SSE-enabled code + coeff[0] = scoeff[0]; + coeff[1] = scoeff[1]; + coeff[2] = scoeff[2]; + coeff[3] = scoeff[3]; + } + uint32_t coeff[4]; +}; + +bool pana8_param_t::DecodeC8(pana8_bufio_t &bufio, unsigned int width, unsigned int height, LibRaw *libraw, + uint16_t left_margin) +{ + unsigned halfwidth = width >> 1; + unsigned halfheight = height >> 1; + if (!halfwidth || !halfheight || bufio.size() < 9) + return false; // invalid input + + uint32_t datamax = tag3B_2 >> range_shift; + + pana8_base_t start_coeff; + for(int i = 0; i < 4; i++) + start_coeff.coeff[i] = initial[i] & 0xffffu; + + bool _extrahuff = (extrahuff.size() >= 0x10000); + + uint8_t *big_huff_table = 0; + if (_extrahuff) + big_huff_table = extrahuff.data(); + + uint16_t *gammatable = (gammaTable.size() >= 0x10000) && !noGammaFlag ? (uint16_t *)gammaTable.data() : 0; + +#ifdef PANA8_FULLY_BUFFERED + const uint8_t *inputbyteptr = source.data(); + uint32_t jobsz_in_qwords = source.size() >> 3; +#else + uint32_t jobsz_in_qwords = bufio.size() >> 3; +#endif + int32_t doublewidth = 4 * halfwidth; + std::vector outline(4 * doublewidth); + pana8_base_t line_base(start_coeff); + int64_t bittail = 0LL; + int32_t bitportion = 0; + uint32_t inqword = 0u; + + try + { + for (uint32_t current_row = 0; current_row < halfheight; current_row++) + { + uint8_t *outrowp = outline.data(); + pana8_base_t current_base(line_base); + + for (int32_t col = 0; col < doublewidth; col++) + { + uint64_t pixbits; + if (bitportion < 0) + { + uint32_t inqword_next = inqword + 1; + if ((int)inqword + 1 >= int(jobsz_in_qwords)) + return false; + bitportion += 64; + uint64_t inputqword = bufio.getQWord(inqword); + uint64_t inputqword_next = bufio.getQWord(inqword_next); + pixbits = (inputqword_next >> bitportion) | (inputqword << (64 - (uint8_t)(bitportion & 0xffu))); + if ((unsigned int)inqword < jobsz_in_qwords) + inqword = inqword_next; + } + else + { + if ((unsigned int)inqword >= jobsz_in_qwords) + return false; + uint64_t inputqword = bufio.getQWord(inqword); + pixbits = (inputqword >> bitportion) | bittail; + uint32_t step = (bitportion == 0); + if (!bitportion) + bitportion = 64; + inqword += step; + } + int huff_index = 0; + if (_extrahuff) + huff_index = *(uint8_t *)(big_huff_table + ((pixbits >> 48) & 0xffffu)); + else + { + huff_index = int(GetDBit(pixbits)); + datamax = tag3B_2; + } + int32_t v37 = (huff_coeff[huff_index] >> 24) & 0x1F; + uint32_t hc = huff_coeff[huff_index]; + int64_t v38 = pixbits << (((hc >> 16) & 0xffffu) & 0x1F); + uint64_t v90 = (uint32_t)(huff_index - v37); + int32_t v39 = (uint16_t)((uint64_t)v38 >> ((uint8_t)v37 - (uint8_t)huff_index)) << ((huff_coeff[huff_index] >> 24) & 0xffu); + + if (huff_index - v37 <= 0) + v39 &= 0xffff0000u; + + int32_t delta1; + if (v38 < 0) + delta1 = (uint16_t)v39; + else if (huff_index) + { + int32_t v40 = -1 << huff_index; + if ((uint8_t)v37) + delta1 = (uint16_t)v39 + v40; + else + delta1 = (uint16_t)v39 + v40 + 1; + } + else + delta1 = 0; + + uint32_t v42 = bitportion - ((huff_coeff[huff_index] >> 16) & 0x1F); + int32_t delta2 = uint8_t(v37) ? 1 << (v37 - 1) : 0; + uint32_t *destpixel = (uint32_t *)(outrowp + 16LL * (col >> 2)); + + int32_t delta = delta1 + delta2; + int32_t col_amp_3 = col & 3; +#define _LIM(a, _max_) (a < 0) ? 0 : ((a > _max_) ? _max_ : a) + if (col_amp_3 == 2) + { + int32_t val = current_base.coeff[1] + delta; + destpixel[1] = uint32_t(_LIM(val, int(datamax))); + } + else if (col_amp_3 == 1) + { + int32_t val = current_base.coeff[2] + delta; + destpixel[2] = uint32_t(_LIM(val, int(datamax))); + } + else if ((col & 3) != 0) // == 3 + { + int32_t val = current_base.coeff[3] + delta; + destpixel[3] = uint32_t(_LIM(val, int(datamax))); + } + else // 0 + { + int32_t val = current_base.coeff[0] + delta; + destpixel[0] = uint32_t(_LIM(val, int(datamax))); + } +#undef _LIM + if (huff_index <= v37) + v90 = 0LL; + bittail = v38 << v90; + bitportion = int32_t(v42 - v90); + + if (col_amp_3 == 3) + current_base.clone((uint32_t *)(outrowp + 16LL * (col >> 2))); + if (col == 3) + line_base.clone((uint32_t *)(outrowp)); + } + + int destrow = current_row * 2; + uint16_t *destrow0 = libraw->imgdata.rawdata.raw_image + (destrow * libraw->imgdata.sizes.raw_width) + left_margin; + uint16_t *destrow1 = + libraw->imgdata.rawdata.raw_image + (destrow + 1) * libraw->imgdata.sizes.raw_width + left_margin; + uint16_t *srcrow = (uint16_t *)(outrowp); + if (gammatable) + { + for (unsigned col = 0; col < width - 1; col += 2) + { + const int c6 = col * 4; + destrow0[col] = gammatable[srcrow[c6]]; + destrow0[col + 1] = gammatable[srcrow[c6 + 2]]; + destrow1[col] = gammatable[srcrow[c6 + 4]]; + destrow1[col + 1] = gammatable[srcrow[c6 + 6]]; + } + } + else + { + for (unsigned col = 0; col < width - 1; col += 2) + { + const int c6 = col * 4; + destrow0[col] = srcrow[c6]; + destrow0[col + 1] = srcrow[c6 + 2]; + destrow1[col] = srcrow[c6 + 4]; + destrow1[col + 1] = srcrow[c6 + 6]; + } + } + } + } + catch (...) // buffer read may throw an exception + { + return false; + } + return true; +} + + +uint32_t pana8_param_t::GetDBit(uint64_t a2) +{ + for (int i = 0; i < 16; i++) + { + if ((a2 & hufftable2[i]) == hufftable1[i]) + return i; + } + return uint32_t((hufftable2[16] & a2) == hufftable1[16]) ^ 0x11u; +} + +pana8_param_t::pana8_param_t(const pana8_tags_t &meta) : gammaTable(0) +{ + range_shift = gamma_base = tag3B = 0; +#ifndef ZERO +#define ZERO(a) memset(a, 0, sizeof(a)) +#endif + ZERO(tag3A); + ZERO(tag39); + ZERO(tag3A); + ZERO(initial); + ZERO(huff_coeff); + ZERO(hufftable1); + ZERO(hufftable2); +#undef ZERO + noGammaFlag = 1; + + for (int i = 0; i < 6; i++) + { + tag3A[i] = meta.tag3A[i]; + tag39[i] = meta.tag39[i]; + } + tag3B_2 = tag3B = meta.tag3B; + for(int i = 0; i < 4; i++) + initial[i] = meta.initial[i]; + + for (int i = 0; i < 17; i++) + huff_coeff[i] = (uint32_t(meta.tag41[i]) << 24) | (uint32_t(meta.tag40a[i]) << 16) | meta.tag40b[i]; + + std::vector tempGamma(0x10000); + for (unsigned i = 0; i < 0x10000; i++) + { + uint64_t val = gammaCurve(i); + tempGamma[i] = uint16_t(val & 0xffffu); + if (i != val) + noGammaFlag = 0; + } + if (!noGammaFlag) + gammaTable = tempGamma; + + int v7 = 0; + + for (unsigned hindex = 0; hindex < 17; hindex++) + { + uint32_t hc = huff_coeff[hindex]; + uint32_t hlow = (hc >> 16) & 0x1F; + int16_t v8 = 0; + if ((hc & 0x1F0000) != 0) + { + int h7 = ((hc >> 16) & 0xffffu) & 7; + if (hlow - 1 >= 7) + { + uint32_t hdiff = h7 - hlow; + v8 = 0; + do + { + v8 = (v8 << 8) | 0xFFu; + hdiff += 8; + } while (hdiff); + } + else + v8 = 0; + for (; h7; --h7) + v8 = 2 * v8 + 1; + } + + uint16_t v9 = hc & v8; + if (uint32_t(v7) < hlow) + v7 = ((huff_coeff[hindex] >> 16) & 0xFFFFu) & 0x1F; + hufftable2[hindex] = 0xFFFFULL << (64-hlow); + hufftable1[hindex] = (uint64_t)v9 << (64-hlow); + } + + if (v7 < 17) + { + if (extrahuff.size() < 0x10000) + extrahuff.resize(0x10000); + uint64_t v17 = 0LL; + + for (int j = 0LL; j != 0x10000; ++j) + { + extrahuff[j] = uint8_t(GetDBit(v17) & 0xffu); + v17 += 0x1000000000000ULL; + } + } +} + +int32_t pana8_param_t::gammaCurve(uint32_t idx) +{ + unsigned int v2 = idx | 0xFFFF0000; + if ((idx & 0x10000) == 0) + v2 = idx & 0x1FFFF; + + int v3 = gamma_base + v2; + unsigned int v4 = MIN(v3, 0xFFFF); + + int v5 = 0; + if ((v4 & 0x80000000) != 0) + v4 = 0; + + if (v4 >= (0xFFFF & tag3A[1])) + { + v5 = 1; + if (v4 >= (0xFFFF & tag3A[2])) + { + v5 = 2; + if (v4 >= (0xFFFF & tag3A[3])) + { + v5 = 3; + if (v4 >= (0xFFFF & tag3A[4])) + v5 = ((v4 | 0x500000000LL) - (uint64_t)(0xFFFF & tag3A[5])) >> 32; + } + } + } + unsigned int v6 = tag3A[v5]; + int v7 = tag39[v5]; + unsigned int v8 = v4 - (uint16_t)v6; + char v9 = v7 & 0x1F; + int64_t result = 0; + + if (v9 == 31) + { + result = v5 == 5 ? 0xFFFFLL : ((tag3A[v5 + 1] >> 16) & 0xFFFF); + return MIN( uint32_t(result), tag3B); + } + if ((v7 & 0x10) == 0) + { + if (v9 == 15) + { + result = ((v6 >> 16) & 0xFFFF); + return MIN( uint32_t(result), tag3B); + } + else if(v9!=0) + v8 = (v8 + (1 << (v9 - 1))) >> v9; + } + else + v8 <<= v7 & 0xF; + + result = v8 + ((v6 >> 16) & 0xFFFF); + return MIN( uint32_t(result), tag3B); +} + +const static uint8_t _bitRevTable[256] = { + 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, 0x08, 0x88, 0x48, + 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, + 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, + 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC, 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, + 0x32, 0xB2, 0x72, 0xF2, 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, + 0xFA, 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, 0x0E, 0x8E, + 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, 0x01, 0x81, 0x41, 0xC1, 0x21, + 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1, 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, + 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9, 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, + 0xD5, 0x35, 0xB5, 0x75, 0xF5, 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, + 0x7D, 0xFD, 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, 0x0B, + 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, 0x07, 0x87, 0x47, 0xC7, + 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, + 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF}; + +void invertBits(void *buf, size_t size) +{ + unsigned sz = unsigned(size / 8); + uint64_t *ptr = (uint64_t *)buf; + for (unsigned i = 0; i < sz; i++) + { + uint8_t *b = (uint8_t *)&ptr[i]; + uint64_t r = ((uint64_t)_bitRevTable[b[0]] << 56) | ((uint64_t)_bitRevTable[b[1]] << 48) | + ((uint64_t)_bitRevTable[b[2]] << 40) | ((uint64_t)_bitRevTable[b[3]] << 32) | + ((uint64_t)_bitRevTable[b[4]] << 24) | ((uint64_t)_bitRevTable[b[5]] << 16) | + ((uint64_t)_bitRevTable[b[6]] << 8) | _bitRevTable[b[7]]; + ptr[i] = r; + } +} diff --git a/rtengine/libraw/src/decoders/smal.cpp b/rtengine/libraw/src/decoders/smal.cpp new file mode 100644 index 000000000..eeab2f006 --- /dev/null +++ b/rtengine/libraw/src/decoders/smal.cpp @@ -0,0 +1,181 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +#define HOLE(row) ((holes >> (((row)-raw_height) & 7)) & 1) + +/* Kudos to Rich Taylor for figuring out SMaL's compression algorithm. */ +void LibRaw::smal_decode_segment(unsigned seg[2][2], int holes) +{ + uchar hist[3][13] = {{7, 7, 0, 0, 63, 55, 47, 39, 31, 23, 15, 7, 0}, + {7, 7, 0, 0, 63, 55, 47, 39, 31, 23, 15, 7, 0}, + {3, 3, 0, 0, 63, 47, 31, 15, 0}}; + int low, high = 0xff, carry = 0, nbits = 8; + int s, count, bin, next, i, sym[3]; + unsigned pix; + uchar diff, pred[] = {0, 0}; + ushort data = 0, range = 0; + + fseek(ifp, seg[0][1] + 1, SEEK_SET); + getbits(-1); + if (seg[1][0] > unsigned(raw_width * raw_height)) + seg[1][0] = raw_width * raw_height; + for (pix = seg[0][0]; pix < seg[1][0]; pix++) + { + for (s = 0; s < 3; s++) + { + data = data << nbits | getbits(nbits); + if (carry < 0) + carry = (nbits += carry + 1) < 1 ? nbits - 1 : 0; + while (--nbits >= 0) + if ((data >> nbits & 0xff) == 0xff) + break; + if (nbits > 0) + data = + ((data & ((1 << (nbits - 1)) - 1)) << 1) | + ((data + (((data & (1 << (nbits - 1)))) << 1)) & ((~0u) << nbits)); + if (nbits >= 0) + { + data += getbits(1); + carry = nbits - 8; + } + count = ((((data - range + 1) & 0xffff) << 2) - 1) / (high >> 4); + for (bin = 0; hist[s][bin + 5] > count; bin++) + ; + low = hist[s][bin + 5] * (high >> 4) >> 2; + if (bin) + high = hist[s][bin + 4] * (high >> 4) >> 2; + high -= low; + for (nbits = 0; high << nbits < 128; nbits++) + ; + range = (range + low) << nbits; + high <<= nbits; + next = hist[s][1]; + if (++hist[s][2] > hist[s][3]) + { + next = (next + 1) & hist[s][0]; + hist[s][3] = (hist[s][next + 4] - hist[s][next + 5]) >> 2; + hist[s][2] = 1; + } + if (hist[s][hist[s][1] + 4] - hist[s][hist[s][1] + 5] > 1) + { + if (bin < hist[s][1]) + for (i = bin; i < hist[s][1]; i++) + hist[s][i + 5]--; + else if (next <= bin) + for (i = hist[s][1]; i < bin; i++) + hist[s][i + 5]++; + } + hist[s][1] = next; + sym[s] = bin; + } + diff = sym[2] << 5 | sym[1] << 2 | (sym[0] & 3); + if (sym[0] & 4) + diff = diff ? -diff : 0x80; + if (ftell(ifp) + 12 >= seg[1][1]) + diff = 0; + if (pix >= unsigned(raw_width * raw_height)) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + raw_image[pix] = pred[pix & 1] += diff; + if (!(pix & 1) && HOLE(pix / raw_width)) + pix += 2; + } + maximum = 0xff; +} + +void LibRaw::smal_v6_load_raw() +{ + unsigned seg[2][2]; + + fseek(ifp, 16, SEEK_SET); + seg[0][0] = 0; + seg[0][1] = get2(); + seg[1][0] = raw_width * raw_height; + seg[1][1] = INT_MAX; + smal_decode_segment(seg, 0); +} + +int LibRaw::median4(int *p) +{ + int min, max, sum, i; + + min = max = sum = p[0]; + for (i = 1; i < 4; i++) + { + sum += p[i]; + if (min > p[i]) + min = p[i]; + if (max < p[i]) + max = p[i]; + } + return (sum - min - max) >> 1; +} + +void LibRaw::fill_holes(int holes) +{ + int row, col, val[4]; + + for (row = 2; row < height - 2; row++) + { + if (!HOLE(row)) + continue; + for (col = 1; col < width - 1; col += 4) + { + val[0] = RAW(row - 1, col - 1); + val[1] = RAW(row - 1, col + 1); + val[2] = RAW(row + 1, col - 1); + val[3] = RAW(row + 1, col + 1); + RAW(row, col) = median4(val); + } + for (col = 2; col < width - 2; col += 4) + if (HOLE(row - 2) || HOLE(row + 2)) + RAW(row, col) = (RAW(row, col - 2) + RAW(row, col + 2)) >> 1; + else + { + val[0] = RAW(row, col - 2); + val[1] = RAW(row, col + 2); + val[2] = RAW(row - 2, col); + val[3] = RAW(row + 2, col); + RAW(row, col) = median4(val); + } + } +} + +void LibRaw::smal_v9_load_raw() +{ + unsigned seg[256][2], offset, nseg, holes, i; + + fseek(ifp, 67, SEEK_SET); + offset = get4(); + nseg = (uchar)fgetc(ifp); + fseek(ifp, offset, SEEK_SET); + for (i = 0; i < nseg * 2; i++) + ((unsigned *)seg)[i] = get4() + data_offset * (i & 1); + fseek(ifp, 78, SEEK_SET); + holes = fgetc(ifp); + fseek(ifp, 88, SEEK_SET); + seg[nseg][0] = raw_height * raw_width; + seg[nseg][1] = get4() + data_offset; + for (i = 0; i < nseg; i++) + smal_decode_segment(seg + i, holes); + if (holes) + fill_holes(holes); +} + +#undef HOLE diff --git a/rtengine/libraw/src/decoders/sonycc.cpp b/rtengine/libraw/src/decoders/sonycc.cpp new file mode 100644 index 000000000..7d3cd4174 --- /dev/null +++ b/rtengine/libraw/src/decoders/sonycc.cpp @@ -0,0 +1,318 @@ +/* -*- C++ -*- + * File: sonycc.cpp + * Copyright (C) 2023-2024 Alex Tutubalin, LibRaw LLC + * + Sony YCC (small/medium lossy compressed) decoder + + Code partially backported from DNGLab's rust code + DNGLab was originally created in 2021 by Daniel Vogelbacher. + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/libraw_cxx_defs.h" +#include "../../internal/losslessjpeg.h" +#include +#include + +#define ifp libraw_internal_data.internal_data.input +#define UD libraw_internal_data.unpacker_data +#define S imgdata.sizes + +struct LibRaw_SonyYCC_Decompressor : public LibRaw_LjpegDecompressor +{ + LibRaw_SonyYCC_Decompressor(uint8_t *b, unsigned s): LibRaw_LjpegDecompressor(b,s){} + bool decode_sony(std::vector &dest, int width, int height); + bool decode_sony_ljpeg_420(std::vector &dest, int width, int height); + +}; + +static +#ifdef _MSC_VER + __forceinline +#else + inline +#endif +void copy_yuv_420(uint16_t *out, uint32_t row, uint32_t col, uint32_t width, + int32_t y1, int32_t y2, int32_t y3, int32_t y4, int32_t cb, int32_t cr) +{ + uint32_t pix1 = row * width + col; + uint32_t pix2 = pix1 + 3; + uint32_t pix3 = (row + 1) * width + col; + uint32_t pix4 = pix3 + 3; + + out[pix1 + 0] = uint16_t(y1); + out[pix1 + 1] = uint16_t(cb); + out[pix1 + 2] = uint16_t(cr); + out[pix2 + 0] = uint16_t(y2); + out[pix2 + 1] = uint16_t(cb); + out[pix2 + 2] = uint16_t(cr); + out[pix3 + 0] = uint16_t(y3); + out[pix3 + 1] = uint16_t(cb); + out[pix3 + 2] = uint16_t(cr); + out[pix4 + 0] = uint16_t(y4); + out[pix4 + 1] = uint16_t(cb); + out[pix4 + 2] = uint16_t(cr); +} + + +bool LibRaw_SonyYCC_Decompressor::decode_sony_ljpeg_420(std::vector &_dest, int width, int height) +{ + if (sof.width * 3 != width || sof.height != height) + return false; + if (width % 2 || width % 6 || height % 2) + return false; + if (_dest.size() < width*height) + return false; + + HuffTable &huff1 = dhts[sof.components[0].dc_tbl]; + HuffTable &huff2 = dhts[sof.components[1].dc_tbl]; + HuffTable &huff3 = dhts[sof.components[2].dc_tbl]; + + if (!huff1.initialized || !huff2.initialized || !huff3.initialized) + return false; + + BitPumpJpeg pump(buffer); + + int32_t base = 1 << (sof.precision - point_transform - 1); + int32_t y1 = base + huff1.decode(pump); + int32_t y2 = y1 + huff1.decode(pump); + int32_t y3 = y1 + huff1.decode(pump); + int32_t y4 = y3 + huff1.decode(pump); + + int32_t cb = base + huff2.decode(pump); + int32_t cr = base + huff3.decode(pump); + + uint16_t *dest = _dest.data(); + copy_yuv_420(dest, 0, 0, width, y1, y2, y3, y4, cb, cr); + + for (uint32_t row = 0; row < height; row += 2) + { + uint32_t startcol = row == 0 ? 6 : 0; + for (uint32_t col = startcol; col < width; col += 6) + { + int32_t py1, py3, pcb, pcr; + if (col == 0) + { + uint32_t pos = (row - 2) * width; + py1 = dest[pos]; + py3 = 0; + pcb = dest[pos + 1]; + pcr = dest[pos + 2]; + } + else + { + uint32_t pos1 = row * width + col - 3; + uint32_t pos3 = (row + 1) * width + col - 3; + py1 = dest[pos1]; + py3 = dest[pos3]; + pcb = dest[pos1 + 1]; + pcr = dest[pos1 + 2]; + }; + y1 = py1 + huff1.decode(pump); + y2 = y1 + huff1.decode(pump); + y3 = ((col == 0) ? y1 : py3) + huff1.decode(pump); + y4 = y3 + huff1.decode(pump); + cb = pcb + huff2.decode(pump); + cr = pcr + huff3.decode(pump); + copy_yuv_420(dest, row, col, width, y1, y2, y3, y4, cb, cr); + } + } + return true; +} + +bool LibRaw_SonyYCC_Decompressor::decode_sony(std::vector &dest, int width, int height) +{ + if (sof.components[0].subsample_h == 2 && sof.components[0].subsample_v == 2) + { + return decode_sony_ljpeg_420(dest, width, height); + } + else if (sof.components[0].subsample_h == 2 && sof.components[0].subsample_v == 1) + return decode_ljpeg_422(dest, width, height); + else + return false; +} + +static +#ifdef _MSC_VER + __forceinline +#else + inline +#endif +void copy_ycc(ushort dst[][4], int rawwidth, int rawheight, int destrow0, int destcol0, ushort *src, + int srcwidth, // full array width is 3x + int srcheight, int steph, int stepv) +{ + if (steph < 2 && stepv < 2) + { + for (int tilerow = 0; tilerow < srcheight && destrow0 + tilerow < rawheight; tilerow++) + { + ushort(*destrow)[4] = &dst[(destrow0 + tilerow) * rawwidth + destcol0]; + for (int tilecol = 0; tilecol < srcwidth && tilecol + destcol0 < rawwidth; tilecol++) + { + int pix = (tilerow * srcwidth + tilecol) * 3; + destrow[tilecol][0] = src[pix]; + destrow[tilecol][1] = src[pix + 1] > 8192 ? src[pix + 1] - 8192 : 0; + destrow[tilecol][2] = src[pix + 2] > 8192 ? src[pix + 2] - 8192 : 0; + } + } + } + else + { + for (int tilerow = 0; tilerow < srcheight && destrow0 + tilerow < rawheight; tilerow++) + { + int destrow = destrow0 + tilerow; + ushort(*dest)[4] = &dst[destrow * rawwidth + destcol0]; + for (int tilecol = 0; tilecol < srcwidth && tilecol + destcol0 < rawwidth; tilecol++) + { + int pix = (tilerow * srcwidth + tilecol) * 3; + int destcol = destcol0 + tilecol; + dest[tilecol][0] = src[pix]; + if((destrow%stepv) == 0 && (destcol%steph)==0) + { + dest[tilecol][1] = src[pix + 1] > 8192 ? src[pix + 1] - 8192 : 0; + dest[tilecol][2] = src[pix + 2] > 8192 ? src[pix + 2] - 8192 : 0; + } + } + } + + } +} + +static +#ifdef _MSC_VER + __forceinline +#else + inline +#endif +uint16_t _lim16bit(float q) +{ + if (q < 0.f) + q = 0.f; + else if (q > 65535.f) + q = 65535.f; + return uint16_t(uint32_t(q)); +} + +static +#ifdef _MSC_VER + __forceinline +#else + inline +#endif +void ycc2rgb(uint16_t dst[][4], int rawwidth, int rawheight, int destrow0, int destcol0, ushort *src, + int srcwidth, // full array width is 3x + int srcheight) +{ + const ushort cdelta = 16383; + for (int tilerow = 0; tilerow < srcheight && destrow0 + tilerow < rawheight; tilerow++) + { + ushort(*destrow)[4] = &dst[(destrow0 + tilerow) * rawwidth + destcol0]; + for (int tilecol = 0; tilecol < srcwidth && tilecol + destcol0 < rawwidth; tilecol++) + { + int pix = (tilerow * srcwidth + tilecol) * 3; + float Y = float(src[pix]); + float Cb = float(src[pix + 1] - cdelta); + float Cr = float(src[pix + 2] - cdelta); + float R = Y + 1.40200f * Cr; + float G = Y - 0.34414f * Cb - 0.71414f * Cr; + float B = Y + 1.77200f * Cb; + destrow[tilecol][0] = _lim16bit(R); + destrow[tilecol][1] = _lim16bit(G); + destrow[tilecol][2] = _lim16bit(B); + } + } +} + +void LibRaw::sony_ycbcr_load_raw() +{ + if (!imgdata.image) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + // Sony YCC RAWs are always tiled + if (UD.tile_width < 1 || UD.tile_width > S.raw_width) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + if (UD.tile_length < 1 || UD.tile_length > S.raw_height) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + // calculate tile count + int tile_w = (S.raw_width + UD.tile_width - 1) / UD.tile_width; + int tile_h = (S.raw_height + UD.tile_length - 1) / UD.tile_length; + int tiles = tile_w * tile_h; + if (tiles < 1 || tiles > 1024) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + INT64 fsize = ifp->size(); + std::vector toffsets(tiles); + ifp->seek(UD.data_offset, SEEK_SET); // We're already here, but to make sure + for (int i = 0; i < tiles; i++) + toffsets[i] = get4(); + + std::vector tlengths(tiles); + ifp->seek(UD.data_size, SEEK_SET); + for (int i = 0; i < tiles; i++) + { + tlengths[i] = get4(); + if(toffsets[i]+tlengths[i] > fsize) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + } + unsigned maxcomprlen = *std::max_element(tlengths.begin(), tlengths.end()); + + std::vector iobuffer(maxcomprlen+1); // Extra byte to ensure LJPEG byte stream marker search is ok + std::vector tilebuffer; + for (int tile = 0; tile < tiles; tile++) + { + ifp->seek(toffsets[tile],SEEK_SET); + int readed = ifp->read(iobuffer.data(), 1, tlengths[tile]); + if(readed != tlengths[tile]) + throw LIBRAW_EXCEPTION_IO_EOF; + LibRaw_SonyYCC_Decompressor dec(iobuffer.data(), readed); + if(dec.sof.cps != 3) // !YUV + throw LIBRAW_EXCEPTION_IO_CORRUPT; + if(dec.state != LibRaw_LjpegDecompressor::State::OK) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + unsigned tiledatatsize = UD.tile_width * UD.tile_length * 3; + if (tilebuffer.size() < tiledatatsize) + tilebuffer.resize(tiledatatsize); + + if(!dec.decode_sony(tilebuffer, UD.tile_width * 3, UD.tile_length)) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + int tilerow = tile / tile_w; + int tilecol = tile % tile_w; + if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SRAW_NO_RGB) + { + if(imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SRAW_NO_INTERPOLATE) + copy_ycc(imgdata.image, S.raw_width, S.raw_height, tilerow * UD.tile_length, tilecol * UD.tile_width, + tilebuffer.data(), UD.tile_width, UD.tile_length, dec.sof.components[0].subsample_h, dec.sof.components[0].subsample_v); + else + copy_ycc(imgdata.image, S.raw_width, S.raw_height, tilerow * UD.tile_length, tilecol * UD.tile_width, + tilebuffer.data(), UD.tile_width, UD.tile_length, 1, 1); + } + else + ycc2rgb(imgdata.image, S.raw_width, S.raw_height, tilerow * UD.tile_length, tilecol * UD.tile_width, + tilebuffer.data(), UD.tile_width, UD.tile_length); + } + + for (int i = 0; i < 6; i++) + imgdata.color.cblack[i] = 0; + + if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SRAW_NO_RGB) + { + imgdata.color.maximum = 18091; // estimated on over-exposed ISO100 frame + imgdata.color.black = 0; + } + else + { + imgdata.color.maximum = 17536; // estimated on over-exposed ISO100 frame + imgdata.color.black = 1024; + } +} diff --git a/rtengine/libraw/src/decoders/unpack.cpp b/rtengine/libraw/src/decoders/unpack.cpp new file mode 100644 index 000000000..c4f3359e7 --- /dev/null +++ b/rtengine/libraw/src/decoders/unpack.cpp @@ -0,0 +1,505 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ +#include "../../internal/libraw_cameraids.h" +#include "../../internal/libraw_cxx_defs.h" + +#ifdef USE_RAWSPEED3 +#include "rawspeed3_capi.h" +#include +#endif + +int LibRaw::unpack(void) +{ + CHECK_ORDER_HIGH(LIBRAW_PROGRESS_LOAD_RAW); + CHECK_ORDER_LOW(LIBRAW_PROGRESS_IDENTIFY); + try + { + + if (!libraw_internal_data.internal_data.input) + return LIBRAW_INPUT_CLOSED; + + RUN_CALLBACK(LIBRAW_PROGRESS_LOAD_RAW, 0, 2); + if (imgdata.rawparams.shot_select >= P1.raw_count) + return LIBRAW_REQUEST_FOR_NONEXISTENT_IMAGE; + + if (!load_raw) + return LIBRAW_UNSPECIFIED_ERROR; + + // already allocated ? + if (imgdata.image) + { + free(imgdata.image); + imgdata.image = 0; + } + if (imgdata.rawdata.raw_alloc) + { + free(imgdata.rawdata.raw_alloc); + imgdata.rawdata.raw_alloc = 0; + } + if (libraw_internal_data.unpacker_data.meta_length) + { + if (libraw_internal_data.unpacker_data.meta_length > + INT64(imgdata.rawparams.max_raw_memory_mb) * INT64(1024 * 1024)) + throw LIBRAW_EXCEPTION_TOOBIG; + + libraw_internal_data.internal_data.meta_data = + (char *)malloc(libraw_internal_data.unpacker_data.meta_length); + } + + libraw_decoder_info_t decoder_info; + get_decoder_info(&decoder_info); + + int save_iwidth = S.iwidth, save_iheight = S.iheight, + save_shrink = IO.shrink; + + int rwidth = S.raw_width, rheight = S.raw_height; + if (!IO.fuji_width) + { + // adjust non-Fuji allocation + if (rwidth < S.width + S.left_margin) + rwidth = S.width + S.left_margin; + if (rheight < S.height + S.top_margin) + rheight = S.height + S.top_margin; + } + if (rwidth > 65535 || + rheight > 65535) // No way to make image larger than 64k pix + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + imgdata.rawdata.raw_image = 0; + imgdata.rawdata.color4_image = 0; + imgdata.rawdata.color3_image = 0; + imgdata.rawdata.float_image = 0; + imgdata.rawdata.float3_image = 0; + +#ifdef USE_DNGSDK + if (imgdata.idata.dng_version && dnghost + && libraw_internal_data.unpacker_data.tiff_samples != 2 // Fuji SuperCCD; it is better to detect is more rigid way + && valid_for_dngsdk() && load_raw != &LibRaw::pentax_4shot_load_raw) + { + // Data size check + INT64 pixcount = + INT64(MAX(S.width, S.raw_width)) * INT64(MAX(S.height, S.raw_height)); + INT64 planecount = + (imgdata.idata.filters || P1.colors == 1) ? 1 : LIM(P1.colors, 3, 4); + INT64 samplesize = is_floating_point() ? 4 : 2; + INT64 bytes = pixcount * planecount * samplesize; + if (bytes + INT64(libraw_internal_data.unpacker_data.meta_length ) + > INT64(imgdata.rawparams.max_raw_memory_mb) * INT64(1024 * 1024)) + throw LIBRAW_EXCEPTION_TOOBIG; + + // find ifd to check sample + try_dngsdk(); + if (raw_was_read()) + imgdata.process_warnings |= LIBRAW_WARN_DNGSDK_PROCESSED; + } +#endif +#ifdef USE_RAWSPEED3 + if (!raw_was_read() + && (!IO.fuji_width) // Do not use for fuji rotated + && ((imgdata.idata.raw_count == 1) + // Canon dual pixel, 1st frame + || (makeIs(LIBRAW_CAMERAMAKER_Canon) && imgdata.idata.raw_count == 2 && imgdata.rawparams.shot_select==0) + ) +#ifdef USE_RAWSPEED_BITS + && (imgdata.rawparams.use_rawspeed & LIBRAW_RAWSPEEDV3_USE) +#else + && imgdata.rawparams.use_rawspeed +#endif + && (decoder_info.decoder_flags & LIBRAW_DECODER_TRYRAWSPEED3) + ) + { + INT64 pixcount = INT64(MAX(S.width, S.raw_width)) * INT64(MAX(S.height, S.raw_height)); + INT64 planecount = (imgdata.idata.filters || P1.colors == 1) ? 1 : LIM(P1.colors, 3, 4); + INT64 bytes = pixcount * planecount * 2; // sample size is always 2 for rawspeed + if (bytes + INT64(libraw_internal_data.unpacker_data.meta_length) + > INT64(imgdata.rawparams.max_raw_memory_mb) * INT64(1024 * 1024)) + throw LIBRAW_EXCEPTION_TOOBIG; + + if (!_rawspeed3_handle) + _rawspeed3_handle = rawspeed3_initdefault(); + + if (_rawspeed3_handle && ID.input->size() > 0) // large bound is checked at identify + { + void *_rawspeed_buffer = 0; + try { + ID.input->seek(0, SEEK_SET); + INT64 _rawspeed_buffer_sz = ID.input->size() + 32; + _rawspeed_buffer = malloc(_rawspeed_buffer_sz); + if (!_rawspeed_buffer) + throw LIBRAW_EXCEPTION_ALLOC; + ID.input->read(_rawspeed_buffer, ID.input->size(), 1); + + rawspeed3_ret_t rs3ret; + rawspeed3_clearresult(&rs3ret); + int status = rawspeed3_decodefile(_rawspeed3_handle, &rs3ret, _rawspeed_buffer, ID.input->size(), +#ifdef USE_RAWSPEED_BITS + !(imgdata.rawparams.use_rawspeed & LIBRAW_RAWSPEEDV3_FAILONUNKNOWN) +#else + false +#endif + ); + if (status != rawspeed3_ok) + imgdata.process_warnings |= LIBRAW_WARN_RAWSPEED_UNSUPPORTED; + + if (status == rawspeed3_not_supported) + imgdata.process_warnings |= LIBRAW_WARN_RAWSPEED3_NOTLISTED; + + if (status == rawspeed3_ok +#ifdef USE_RAWSPEED_BITS + || + (status == rawspeed3_ok_warnings && (imgdata.rawparams.use_rawspeed & LIBRAW_RAWSPEEDV3_IGNOREERRORS)) +#endif + ) + { + + if ((S.raw_width != rs3ret.width) || (S.raw_height != rs3ret.height)) + throw "Size mismatch"; + + // DECODED w/ success + if (rs3ret.filters > 1) // Fuji or bayer + { + imgdata.rawdata.raw_image = (ushort*)rs3ret.pixeldata; + } + else if (rs3ret.cpp == 4) + { + imgdata.rawdata.color4_image = (ushort(*)[4])rs3ret.pixeldata; + //if (r->whitePoint > 0 && r->whitePoint < 65536) + // C.maximum = r->whitePoint; + } + else if (rs3ret.cpp == 3) + { + imgdata.rawdata.color3_image = (ushort(*)[3])rs3ret.pixeldata; + //if (r->whitePoint > 0 && r->whitePoint < 65536) + // C.maximum = r->whitePoint; + } + + if (raw_was_read()) // buffers are assigned above + { + // set sizes + S.raw_pitch = rs3ret.pitch; + S.raw_width = rs3ret.width; + S.raw_height = rs3ret.height; + imgdata.process_warnings |= LIBRAW_WARN_RAWSPEED3_PROCESSED; + + if (imgdata.rawdata.raw_image && + load_raw == &LibRaw::phase_one_load_raw_c && imgdata.color.phase_one_data.format != 8) + { + // Scale data to match libraw own decoder + for (int row = 0; row < rs3ret.height; row++) + for (int col = 0; col < rs3ret.pitch / 2; col++) + imgdata.rawdata.raw_image[row * rs3ret.pitch / 2 + col] <<= 2; + } + + // if (r->whitePoint > 0 && r->whitePoint < 65536) + // C.maximum = r->whitePoint; + } + } + free(_rawspeed_buffer); + } + catch (...) + { + imgdata.process_warnings |= LIBRAW_WARN_RAWSPEED3_PROBLEM; + if (_rawspeed_buffer) + free(_rawspeed_buffer); + } + } + } +#endif +#ifdef USE_RAWSPEED + if (!raw_was_read()) + { + int rawspeed_enabled = 1; + + if (imgdata.idata.dng_version && (libraw_internal_data.unpacker_data.tiff_samples == 2 || imgdata.idata.raw_count > 1)) + rawspeed_enabled = 0; + + if (libraw_internal_data.unpacker_data.is_NikonTransfer) + rawspeed_enabled = 0; + + if (libraw_internal_data.unpacker_data.pana_encoding == 5) + rawspeed_enabled = 0; + + if (imgdata.idata.raw_count > 1) + rawspeed_enabled = 0; + if (!strncasecmp(imgdata.idata.software, "Magic", 5)) + rawspeed_enabled = 0; + // Disable rawspeed for double-sized Oly files + if (makeIs(LIBRAW_CAMERAMAKER_Olympus) && + ((imgdata.sizes.raw_width > 6000) || + !strncasecmp(imgdata.idata.model, "SH-", 3) || + !strncasecmp(imgdata.idata.model, "TG-", 3) )) + rawspeed_enabled = 0; + + if (makeIs(LIBRAW_CAMERAMAKER_Canon) && + (libraw_internal_data.identify_data.unique_id == CanonID_EOS_6D_Mark_II)) + rawspeed_enabled = 0; + + if (imgdata.idata.dng_version && imgdata.idata.filters == 0 && + libraw_internal_data.unpacker_data.tiff_bps == 8) // Disable for 8 bit + rawspeed_enabled = 0; + + if (load_raw == &LibRaw::packed_load_raw && + makeIs(LIBRAW_CAMERAMAKER_Nikon) && + (!strncasecmp(imgdata.idata.model, "E", 1) || + !strncasecmp(imgdata.idata.model, "COOLPIX B", 9) || + !strncasecmp(imgdata.idata.model, "COOLPIX P9", 10) || + !strncasecmp(imgdata.idata.model, "COOLPIX P1000", 13))) + rawspeed_enabled = 0; + + if (load_raw == &LibRaw::nikon_load_raw && makeIs(LIBRAW_CAMERAMAKER_Nikon) && + !strcasecmp(imgdata.idata.model, "D6")) + rawspeed_enabled = 0; + + if (load_raw == &LibRaw::lossless_jpeg_load_raw && + MN.canon.RecordMode && makeIs(LIBRAW_CAMERAMAKER_Kodak) && + /* Not normalized models here, it is intentional */ + (!strncasecmp(imgdata.idata.model, "EOS D2000", 9) || + !strncasecmp(imgdata.idata.model, "EOS D6000", 9))) + rawspeed_enabled = 0; + + if (load_raw == &LibRaw::nikon_load_raw && + makeIs(LIBRAW_CAMERAMAKER_Nikon) && + (!strncasecmp(imgdata.idata.model, "Z", 1) || !strncasecmp(imgdata.idata.model,"D780",4))) + rawspeed_enabled = 0; + + if (load_raw == &LibRaw::panasonic_load_raw && + libraw_internal_data.unpacker_data.pana_encoding > 4) + rawspeed_enabled = 0; + + // RawSpeed Supported, + if ( +#ifdef USE_RAWSPEED_BITS + (imgdata.rawparams.use_rawspeed & LIBRAW_RAWSPEEDV1_USE) +#else + imgdata.rawparams.use_rawspeed +#endif + && rawspeed_enabled && + !(is_sraw() && (imgdata.rawparams.specials & + (LIBRAW_RAWSPECIAL_SRAW_NO_RGB | + LIBRAW_RAWSPECIAL_SRAW_NO_INTERPOLATE))) && + (decoder_info.decoder_flags & LIBRAW_DECODER_TRYRAWSPEED) && + _rawspeed_camerameta) + { + INT64 pixcount = INT64(MAX(S.width, S.raw_width)) * + INT64(MAX(S.height, S.raw_height)); + INT64 planecount = (imgdata.idata.filters || P1.colors == 1) + ? 1 + : LIM(P1.colors, 3, 4); + INT64 bytes = + pixcount * planecount * 2; // sample size is always 2 for rawspeed + if (bytes + +INT64(libraw_internal_data.unpacker_data.meta_length) > + INT64(imgdata.rawparams.max_raw_memory_mb) * INT64(1024 * 1024)) + throw LIBRAW_EXCEPTION_TOOBIG; + + /*int rr = */ try_rawspeed(); + + } + } +#endif + if (!raw_was_read()) // RawSpeed failed or not run + { + // Not allocated on RawSpeed call, try call LibRaow + int zero_rawimage = 0; + if (decoder_info.decoder_flags & LIBRAW_DECODER_OWNALLOC) + { + // x3f foveon decoder and DNG float + // Do nothing! Decoder will allocate data internally + } + if (decoder_info.decoder_flags & LIBRAW_DECODER_SINAR4SHOT) + { + if (imgdata.rawparams.shot_select) // single image extract + { + if (INT64(rwidth) * INT64(rheight + 8) * + INT64(sizeof(imgdata.rawdata.raw_image[0])) + + +INT64(libraw_internal_data.unpacker_data.meta_length) > + INT64(imgdata.rawparams.max_raw_memory_mb) * INT64(1024 * 1024)) + throw LIBRAW_EXCEPTION_TOOBIG; + imgdata.rawdata.raw_alloc = malloc( + rwidth * (rheight + 8) * sizeof(imgdata.rawdata.raw_image[0])); + imgdata.rawdata.raw_image = (ushort *)imgdata.rawdata.raw_alloc; + if (!S.raw_pitch) + S.raw_pitch = S.raw_width * 2; // Bayer case, not set before + } + else // Full image extract + { + if (INT64(rwidth) * INT64(rheight + 8) * + INT64(sizeof(imgdata.rawdata.raw_image[0])) * 4 + +INT64(libraw_internal_data.unpacker_data.meta_length) > + INT64(imgdata.rawparams.max_raw_memory_mb) * INT64(1024 * 1024)) + throw LIBRAW_EXCEPTION_TOOBIG; + S.raw_pitch = S.raw_width * 8; + imgdata.rawdata.raw_alloc = 0; + imgdata.image = (ushort(*)[4])calloc( + unsigned(MAX(S.width, S.raw_width)) * + unsigned(MAX(S.height, S.raw_height) + 8), + sizeof(*imgdata.image)); + } + } + else if (decoder_info.decoder_flags & LIBRAW_DECODER_3CHANNEL) + { + if (INT64(rwidth) * INT64(rheight + 8) * + INT64(sizeof(imgdata.rawdata.raw_image[0])) * 3 + + INT64(libraw_internal_data.unpacker_data.meta_length) > + INT64(imgdata.rawparams.max_raw_memory_mb) * INT64(1024 * 1024)) + throw LIBRAW_EXCEPTION_TOOBIG; + + imgdata.rawdata.raw_alloc = malloc( + rwidth * (rheight + 8) * sizeof(imgdata.rawdata.raw_image[0]) * 3); + imgdata.rawdata.color3_image = (ushort(*)[3])imgdata.rawdata.raw_alloc; + if (!S.raw_pitch) + S.raw_pitch = S.raw_width * 6; + } + else if (imgdata.idata.filters || + P1.colors == + 1) // Bayer image or single color -> decode to raw_image + { + if (INT64(rwidth) * INT64(rheight + 8) * + INT64(sizeof(imgdata.rawdata.raw_image[0])) + + INT64(libraw_internal_data.unpacker_data.meta_length) > + INT64(imgdata.rawparams.max_raw_memory_mb) * INT64(1024 * 1024)) + throw LIBRAW_EXCEPTION_TOOBIG; + imgdata.rawdata.raw_alloc = malloc( + rwidth * (rheight + 8) * sizeof(imgdata.rawdata.raw_image[0])); + imgdata.rawdata.raw_image = (ushort *)imgdata.rawdata.raw_alloc; + if (!S.raw_pitch) + S.raw_pitch = S.raw_width * 2; // Bayer case, not set before + } + else // NO LEGACY FLAG if (decoder_info.decoder_flags & + // LIBRAW_DECODER_LEGACY) + { + if (decoder_info.decoder_flags & LIBRAW_DECODER_ADOBECOPYPIXEL) + { + S.raw_pitch = S.raw_width * 8; + } + else + { + S.iwidth = S.width; + S.iheight = S.height; + IO.shrink = 0; + if (!S.raw_pitch) + S.raw_pitch = (decoder_info.decoder_flags & + LIBRAW_DECODER_LEGACY_WITH_MARGINS) + ? S.raw_width * 8 + : S.width * 8; + } + // sRAW and old Foveon decoders only, so extra buffer size is just 1/4 + // allocate image as temporary buffer, size + if (INT64(MAX(S.width, S.raw_width)) * + INT64(MAX(S.height, S.raw_height) + 8) * + INT64(sizeof(*imgdata.image)) + + INT64(libraw_internal_data.unpacker_data.meta_length) > + INT64(imgdata.rawparams.max_raw_memory_mb) * INT64(1024 * 1024)) + throw LIBRAW_EXCEPTION_TOOBIG; + + imgdata.rawdata.raw_alloc = 0; + imgdata.image = + (ushort(*)[4])calloc(unsigned(MAX(S.width, S.raw_width)) * + unsigned(MAX(S.height, S.raw_height) + 8), + sizeof(*imgdata.image)); + if (!(decoder_info.decoder_flags & LIBRAW_DECODER_ADOBECOPYPIXEL)) + { + imgdata.rawdata.raw_image = (ushort *)imgdata.image; + zero_rawimage = 1; + } + } + ID.input->seek(libraw_internal_data.unpacker_data.data_offset, SEEK_SET); + + unsigned m_save = C.maximum; + if (load_raw == &LibRaw::unpacked_load_raw && + (!strcasecmp(imgdata.idata.make, "Nikon") || !strcasecmp(imgdata.idata.make, "Hasselblad")) + ) + C.maximum = 65535; + (this->*load_raw)(); + if (zero_rawimage) + imgdata.rawdata.raw_image = 0; + if (load_raw == &LibRaw::unpacked_load_raw && + (!strcasecmp(imgdata.idata.make, "Nikon") || !strcasecmp(imgdata.idata.make, "Hasselblad")) + ) + C.maximum = m_save; + if (decoder_info.decoder_flags & LIBRAW_DECODER_OWNALLOC) + { + // x3f foveon decoder only: do nothing + } + else if (decoder_info.decoder_flags & LIBRAW_DECODER_SINAR4SHOT && + imgdata.rawparams.shot_select == 0) + { + imgdata.rawdata.raw_alloc = imgdata.image; + imgdata.rawdata.color4_image = (ushort(*)[4])imgdata.rawdata.raw_alloc; + imgdata.image = 0; + } + else if (!(imgdata.idata.filters || + P1.colors == 1)) // legacy decoder, ownalloc handled above + { + // successfully decoded legacy image, attach image to raw_alloc + imgdata.rawdata.raw_alloc = imgdata.image; + imgdata.rawdata.color4_image = (ushort(*)[4])imgdata.rawdata.raw_alloc; + imgdata.image = 0; + // Restore saved values. Note: Foveon have masked frame + // Other 4-color legacy data: no borders + if (!(libraw_internal_data.unpacker_data.load_flags & 256) && + !(decoder_info.decoder_flags & LIBRAW_DECODER_ADOBECOPYPIXEL) && + !(decoder_info.decoder_flags & LIBRAW_DECODER_LEGACY_WITH_MARGINS)) + { + S.raw_width = S.width; + S.left_margin = 0; + S.raw_height = S.height; + S.top_margin = 0; + } + } + } + + if (imgdata.rawdata.raw_image) + crop_masked_pixels(); // calculate black levels + + // recover image sizes + S.iwidth = save_iwidth; + S.iheight = save_iheight; + IO.shrink = save_shrink; + + // adjust black to possible maximum + unsigned int i = C.cblack[3]; + unsigned int c; + for (c = 0; c < 3; c++) + if (i > C.cblack[c]) + i = C.cblack[c]; + for (c = 0; c < 4; c++) + C.cblack[c] -= i; + C.black += i; + + // Save color,sizes and internal data into raw_image fields + memmove(&imgdata.rawdata.color, &imgdata.color, sizeof(imgdata.color)); + memmove(&imgdata.rawdata.sizes, &imgdata.sizes, sizeof(imgdata.sizes)); + memmove(&imgdata.rawdata.iparams, &imgdata.idata, sizeof(imgdata.idata)); + memmove(&imgdata.rawdata.ioparams, + &libraw_internal_data.internal_output_params, + sizeof(libraw_internal_data.internal_output_params)); + + SET_PROC_FLAG(LIBRAW_PROGRESS_LOAD_RAW); + RUN_CALLBACK(LIBRAW_PROGRESS_LOAD_RAW, 1, 2); + + return 0; + } + catch (const std::bad_alloc&) + { + EXCEPTION_HANDLER(LIBRAW_EXCEPTION_ALLOC); + } + catch (const LibRaw_exceptions& err) + { + EXCEPTION_HANDLER(err); + } + catch (const std::exception& ) + { + EXCEPTION_HANDLER(LIBRAW_EXCEPTION_IO_CORRUPT); + } +} diff --git a/rtengine/libraw/src/decoders/unpack_thumb.cpp b/rtengine/libraw/src/decoders/unpack_thumb.cpp new file mode 100644 index 000000000..1082b9326 --- /dev/null +++ b/rtengine/libraw/src/decoders/unpack_thumb.cpp @@ -0,0 +1,451 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/libraw_cxx_defs.h" + +#ifndef NO_JPEG +struct jpegErrorManager +{ + struct jpeg_error_mgr pub; + jmp_buf setjmp_buffer; +}; + +static void jpegErrorExit(j_common_ptr cinfo) +{ + jpegErrorManager *myerr = (jpegErrorManager *)cinfo->err; + longjmp(myerr->setjmp_buffer, 1); +} +#endif + +int LibRaw::unpack_thumb_ex(int idx) +{ + if (idx < 0 || idx >= imgdata.thumbs_list.thumbcount || idx >= LIBRAW_THUMBNAIL_MAXCOUNT) + return LIBRAW_REQUEST_FOR_NONEXISTENT_THUMBNAIL; + + // Set from thumb-list + libraw_internal_data.internal_data.toffset = imgdata.thumbs_list.thumblist[idx].toffset; + imgdata.thumbnail.tlength = imgdata.thumbs_list.thumblist[idx].tlength; + libraw_internal_data.unpacker_data.thumb_format = imgdata.thumbs_list.thumblist[idx].tformat; + imgdata.thumbnail.twidth = imgdata.thumbs_list.thumblist[idx].twidth; + imgdata.thumbnail.theight = imgdata.thumbs_list.thumblist[idx].theight; + libraw_internal_data.unpacker_data.thumb_misc = imgdata.thumbs_list.thumblist[idx].tmisc; + int rc = unpack_thumb(); + imgdata.progress_flags &= ~LIBRAW_PROGRESS_THUMB_LOAD; + + return rc; +} + + +int LibRaw::unpack_thumb(void) +{ + CHECK_ORDER_LOW(LIBRAW_PROGRESS_IDENTIFY); + CHECK_ORDER_BIT(LIBRAW_PROGRESS_THUMB_LOAD); + +#define THUMB_SIZE_CHECKT(A) \ + do { \ + if (INT64(A) > 1024LL * 1024LL * LIBRAW_MAX_THUMBNAIL_MB) return LIBRAW_UNSUPPORTED_THUMBNAIL; \ + if (INT64(A) > 0 && INT64(A) < 64LL) return LIBRAW_NO_THUMBNAIL; \ + } while (0) + +#define THUMB_SIZE_CHECKTNZ(A) \ + do { \ + if (INT64(A) > 1024LL * 1024LL * LIBRAW_MAX_THUMBNAIL_MB) return LIBRAW_UNSUPPORTED_THUMBNAIL; \ + if (INT64(A) < 64LL) return LIBRAW_NO_THUMBNAIL; \ + } while (0) + + +#define THUMB_SIZE_CHECKWH(W,H) \ + do { \ + if (INT64(W)*INT64(H) > 1024ULL * 1024ULL * LIBRAW_MAX_THUMBNAIL_MB) return LIBRAW_UNSUPPORTED_THUMBNAIL; \ + if (INT64(W)*INT64(H) < 64ULL) return LIBRAW_NO_THUMBNAIL; \ + } while (0) + +#define Tformat libraw_internal_data.unpacker_data.thumb_format + + try + { + if (!libraw_internal_data.internal_data.input) + return LIBRAW_INPUT_CLOSED; + + int t_colors = libraw_internal_data.unpacker_data.thumb_misc >> 5 & 7; + int t_bytesps = (libraw_internal_data.unpacker_data.thumb_misc & 31) / 8; + + if (!ID.toffset && !(imgdata.thumbnail.tlength > 0 && + load_raw == &LibRaw::broadcom_load_raw) // RPi +#ifdef USE_6BY9RPI + && !(imgdata.thumbnail.tlength > 0 && libraw_internal_data.unpacker_data.load_flags & 0x4000 + && (load_raw == &LibRaw::rpi_load_raw8 || load_raw == &LibRaw::nokia_load_raw || + load_raw == &LibRaw::rpi_load_raw12 || load_raw == &LibRaw::rpi_load_raw14)) +#endif + ) + { + return LIBRAW_NO_THUMBNAIL; + } + else if (Tformat == LIBRAW_INTERNAL_THUMBNAIL_DNG_YCBCR) + { + try + { + dng_ycbcr_thumb_loader(); + T.tformat = LIBRAW_THUMBNAIL_BITMAP; + T.tcolors = 3; + SET_PROC_FLAG(LIBRAW_PROGRESS_THUMB_LOAD); + } + catch (...) + { + return LIBRAW_NO_THUMBNAIL; + } + return 0; + + } + else if ((Tformat >= LIBRAW_INTERNAL_THUMBNAIL_KODAK_THUMB) + && ((Tformat <= LIBRAW_INTERNAL_THUMBNAIL_KODAK_RGB))) + { + try { + kodak_thumb_loader(); + T.tformat = LIBRAW_THUMBNAIL_BITMAP; + SET_PROC_FLAG(LIBRAW_PROGRESS_THUMB_LOAD); + } + catch (...) + { + return LIBRAW_NO_THUMBNAIL; + } + return 0; + } + else + { +#ifdef USE_X3FTOOLS + if (Tformat == LIBRAW_INTERNAL_THUMBNAIL_X3F) + { + INT64 tsize = x3f_thumb_size(); + if (tsize < 2048 || INT64(ID.toffset) + tsize < 1) + return LIBRAW_NO_THUMBNAIL; + + if (INT64(ID.toffset) + tsize > ID.input->size() + THUMB_READ_BEYOND) + return LIBRAW_NO_THUMBNAIL; + + THUMB_SIZE_CHECKT(tsize); + } +#else + if (0) {} +#endif + else + { + if (INT64(ID.toffset) + INT64(T.tlength) < 1) + return LIBRAW_NO_THUMBNAIL; + + if (INT64(ID.toffset) + INT64(T.tlength) > + ID.input->size() + THUMB_READ_BEYOND) + return LIBRAW_NO_THUMBNAIL; + } + + ID.input->seek(ID.toffset, SEEK_SET); + if (Tformat == LIBRAW_INTERNAL_THUMBNAIL_JPEG || Tformat == LIBRAW_INTERNAL_THUMBNAIL_JPEGXL) + { + THUMB_SIZE_CHECKTNZ(T.tlength); + if (T.thumb) + free(T.thumb); + T.thumb = (char *)malloc(T.tlength); + if(!T.thumb) + return LIBRAW_NO_THUMBNAIL; + ID.input->read(T.thumb, 1, T.tlength); + unsigned char *tthumb = (unsigned char *)T.thumb; + if (Tformat == LIBRAW_INTERNAL_THUMBNAIL_JPEGXL) + { + T.tformat = LIBRAW_THUMBNAIL_JPEGXL; + SET_PROC_FLAG(LIBRAW_PROGRESS_THUMB_LOAD); + return 0; + } + if (load_raw == &LibRaw::crxLoadRaw && T.tlength > 0xE0) + { + // Check if it is canon H.265 preview: CISZ at bytes 4-6, CISZ prefix is 000n + if (tthumb[0] == 0 && tthumb[1] == 0 && tthumb[2] == 0 && !memcmp(tthumb + 4, "CISZ", 4)) + { + T.tformat = LIBRAW_THUMBNAIL_H265; + SET_PROC_FLAG(LIBRAW_PROGRESS_THUMB_LOAD); + return 0; + } + } + tthumb[0] = 0xff; + tthumb[1] = 0xd8; +#ifdef NO_JPEG + T.tcolors = 3; +#else + { + jpegErrorManager jerr; + struct jpeg_decompress_struct cinfo; + cinfo.err = jpeg_std_error(&jerr.pub); + jerr.pub.error_exit = jpegErrorExit; + if (setjmp(jerr.setjmp_buffer)) + { + err2: + // Error in original JPEG thumb, read it again because + // original bytes 0-1 was damaged above + jpeg_destroy_decompress(&cinfo); + T.tcolors = 3; + T.tformat = LIBRAW_THUMBNAIL_UNKNOWN; + ID.input->seek(ID.toffset, SEEK_SET); + ID.input->read(T.thumb, 1, T.tlength); + SET_PROC_FLAG(LIBRAW_PROGRESS_THUMB_LOAD); + return 0; + } + jpeg_create_decompress(&cinfo); + jpeg_mem_src(&cinfo, (unsigned char *)T.thumb, T.tlength); + int rc = jpeg_read_header(&cinfo, TRUE); + if (rc != 1) + goto err2; + T.tcolors = (cinfo.num_components > 0 && cinfo.num_components <= 3) + ? cinfo.num_components + : 3; + jpeg_destroy_decompress(&cinfo); + } +#endif + T.tformat = LIBRAW_THUMBNAIL_JPEG; + SET_PROC_FLAG(LIBRAW_PROGRESS_THUMB_LOAD); + return 0; + } + else if (Tformat == LIBRAW_INTERNAL_THUMBNAIL_LAYER) + { + int colors = libraw_internal_data.unpacker_data.thumb_misc >> 5 & 7; + if (colors != 1 && colors != 3) + return LIBRAW_UNSUPPORTED_THUMBNAIL; + + THUMB_SIZE_CHECKWH(T.twidth, T.theight); + + int tlength = T.twidth * T.theight; + if (T.thumb) + free(T.thumb); + T.thumb = (char *)calloc(colors, tlength); + if(!T.thumb) + return LIBRAW_NO_THUMBNAIL; + unsigned char *tbuf = (unsigned char *)calloc(colors, tlength); + if (!tbuf) + { + free(T.thumb); + T.thumb = 0; + return LIBRAW_NO_THUMBNAIL; + } + // Avoid OOB of tbuf, should use tlength + ID.input->read(tbuf, colors, tlength); + if (libraw_internal_data.unpacker_data.thumb_misc >> 8 && + colors == 3) // GRB order + for (int i = 0; i < tlength; i++) + { + T.thumb[i * 3] = tbuf[i + tlength]; + T.thumb[i * 3 + 1] = tbuf[i]; + T.thumb[i * 3 + 2] = tbuf[i + 2 * tlength]; + } + else if (colors == 3) // RGB or 1-channel + for (int i = 0; i < tlength; i++) + { + T.thumb[i * 3] = tbuf[i]; + T.thumb[i * 3 + 1] = tbuf[i + tlength]; + T.thumb[i * 3 + 2] = tbuf[i + 2 * tlength]; + } + else if (colors == 1) + { + free(T.thumb); + T.thumb = (char *)tbuf; + tbuf = 0; + } + if (tbuf) + free(tbuf); + T.tcolors = colors; + T.tlength = colors * tlength; + T.tformat = LIBRAW_THUMBNAIL_BITMAP; + SET_PROC_FLAG(LIBRAW_PROGRESS_THUMB_LOAD); + return 0; + } + else if (Tformat == LIBRAW_INTERNAL_THUMBNAIL_ROLLEI) + { + int i; + THUMB_SIZE_CHECKWH(T.twidth, T.theight); + int tlength = T.twidth * T.theight; + if (T.thumb) + free(T.thumb); + T.tcolors = 3; + T.thumb = (char *)calloc(T.tcolors, tlength); + if (!T.thumb) + return LIBRAW_NO_THUMBNAIL; + unsigned short *tbuf = (unsigned short *)calloc(2, tlength); + if (!tbuf) + { + free(T.thumb); + T.thumb = 0; + return LIBRAW_NO_THUMBNAIL; + } + try { + read_shorts(tbuf, tlength); + for (i = 0; i < tlength; i++) + { + T.thumb[i * 3] = (tbuf[i] << 3) & 0xff; + T.thumb[i * 3 + 1] = (tbuf[i] >> 5 << 2) & 0xff; + T.thumb[i * 3 + 2] = (tbuf[i] >> 11 << 3) & 0xff; + } + free(tbuf); + T.tlength = T.tcolors * tlength; + T.tformat = LIBRAW_THUMBNAIL_BITMAP; + SET_PROC_FLAG(LIBRAW_PROGRESS_THUMB_LOAD); + } + catch (...) + { + free(tbuf); + return LIBRAW_NO_THUMBNAIL; + } + return 0; + } + else if (Tformat == LIBRAW_INTERNAL_THUMBNAIL_PPM) + { + if (t_bytesps > 1) + return LIBRAW_NO_THUMBNAIL; // 8-bit thumb, but parsed for more + // bits + THUMB_SIZE_CHECKWH(T.twidth, T.theight); + int t_length = T.twidth * T.theight * t_colors; + + if (T.tlength && + (int)T.tlength < t_length) // try to find tiff ifd with needed offset + { + int pifd = find_ifd_by_offset(libraw_internal_data.internal_data.toffset); + if (pifd >= 0 && tiff_ifd[pifd].strip_offsets_count && + tiff_ifd[pifd].strip_byte_counts_count) + { + // We found it, calculate final size + INT64 total_size = 0; + for (int i = 0; i < tiff_ifd[pifd].strip_byte_counts_count + && i < tiff_ifd[pifd].strip_offsets_count; i++) + total_size += tiff_ifd[pifd].strip_byte_counts[i]; + if (total_size != (unsigned)t_length) // recalculate colors + { + if (total_size == T.twidth * T.tlength * 3) + T.tcolors = 3; + else if (total_size == T.twidth * T.tlength) + T.tcolors = 1; + } + T.tlength = total_size; + THUMB_SIZE_CHECKTNZ(T.tlength); + if (T.thumb) + free(T.thumb); + T.thumb = (char *)malloc(T.tlength); + if (!T.thumb) + return LIBRAW_NO_THUMBNAIL; + + char *dest = T.thumb; + INT64 pos = ID.input->tell(); + INT64 remain = T.tlength; + + for (int i = 0; i < tiff_ifd[pifd].strip_byte_counts_count && + i < tiff_ifd[pifd].strip_offsets_count; + i++) + { + int sz = tiff_ifd[pifd].strip_byte_counts[i]; + INT64 off = tiff_ifd[pifd].strip_offsets[i]; + if (off >= 0 && off + sz <= ID.input->size() && sz > 0 && INT64(sz) <= remain) + { + ID.input->seek(off, SEEK_SET); + ID.input->read(dest, sz, 1); + remain -= sz; + dest += sz; + } + } + ID.input->seek(pos, SEEK_SET); + T.tformat = LIBRAW_THUMBNAIL_BITMAP; + SET_PROC_FLAG(LIBRAW_PROGRESS_THUMB_LOAD); + return 0; + } + } + + if (!T.tlength) + T.tlength = t_length; + if (T.thumb) + free(T.thumb); + + THUMB_SIZE_CHECKTNZ(T.tlength); + + T.thumb = (char *)malloc(T.tlength); + if (!T.thumb) + return LIBRAW_NO_THUMBNAIL; + if (!T.tcolors) + T.tcolors = t_colors; + + ID.input->read(T.thumb, 1, T.tlength); + + T.tformat = LIBRAW_THUMBNAIL_BITMAP; + SET_PROC_FLAG(LIBRAW_PROGRESS_THUMB_LOAD); + return 0; + } + else if (Tformat == LIBRAW_INTERNAL_THUMBNAIL_PPM16) + { + if (t_bytesps > 2) + return LIBRAW_NO_THUMBNAIL; // 16-bit thumb, but parsed for + // more bits + int o_bps = (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_USE_PPM16_THUMBS) ? 2 : 1; + int o_length = T.twidth * T.theight * t_colors * o_bps; + int i_length = T.twidth * T.theight * t_colors * 2; + + THUMB_SIZE_CHECKTNZ(o_length); + THUMB_SIZE_CHECKTNZ(i_length); + + ushort *t_thumb = (ushort *)calloc(i_length, 1); + if (!t_thumb) + return LIBRAW_NO_THUMBNAIL;; + ID.input->read(t_thumb, 1, i_length); + if ((libraw_internal_data.unpacker_data.order == 0x4949) == + (ntohs(0x1234) == 0x1234)) + libraw_swab(t_thumb, i_length); + + if (T.thumb) + free(T.thumb); + if ((imgdata.rawparams.options & LIBRAW_RAWOPTIONS_USE_PPM16_THUMBS)) + { + T.thumb = (char *)t_thumb; + T.tformat = LIBRAW_THUMBNAIL_BITMAP16; + T.tlength = i_length; + } + else + { + T.thumb = (char *)malloc(o_length); + if (!T.thumb) + { + free(t_thumb); + return LIBRAW_NO_THUMBNAIL; + } + for (int i = 0; i < o_length; i++) + T.thumb[i] = t_thumb[i] >> 8; + free(t_thumb); + T.tformat = LIBRAW_THUMBNAIL_BITMAP; + T.tlength = o_length; + } + SET_PROC_FLAG(LIBRAW_PROGRESS_THUMB_LOAD); + return 0; + } +#ifdef USE_X3FTOOLS + else if (Tformat == LIBRAW_INTERNAL_THUMBNAIL_X3F) + { + x3f_thumb_loader(); // errors already catched in this call + SET_PROC_FLAG(LIBRAW_PROGRESS_THUMB_LOAD); + return 0; + } +#endif + else + { + return LIBRAW_UNSUPPORTED_THUMBNAIL; + } + } + // last resort + return LIBRAW_UNSUPPORTED_THUMBNAIL; /* warned as unreachable*/ + } + catch (const LibRaw_exceptions& err) + { + EXCEPTION_HANDLER(err); + } +} diff --git a/rtengine/libraw/src/decompressors/losslessjpeg.cpp b/rtengine/libraw/src/decompressors/losslessjpeg.cpp new file mode 100644 index 000000000..538c2cb23 --- /dev/null +++ b/rtengine/libraw/src/decompressors/losslessjpeg.cpp @@ -0,0 +1,391 @@ +/* -*- C++ -*- + * File: huffmandec.cpp + * Copyright (C) 2023-2024 Alex Tutubalin, LibRaw LLC + * + Lossless JPEG decoder + + Code partially backported from DNGLab's rust code + DNGLab was originally created in 2021 by Daniel Vogelbacher. + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/losslessjpeg.h" +#include + +#define ZERO(a) do { memset(a,0,sizeof(a));} while(0) + +bool ByteStreamBE::skip_to_marker() // true: success, false - no marker +{ + if (pos + 2 > size) return false; + while (!(buffer[pos] == 0xff && buffer[pos + 1] != 0 && buffer[pos + 1] != 0xff)) + { + pos++; + if (pos + 2 > size) + return false; + } + pos++; + return true; +} + +LibRaw_LjpegDecompressor::LibRaw_LjpegDecompressor(uint8_t *b, unsigned bs, bool dngbug, bool csfix): buffer(b,bs), + state(State::NotInited) +{ + initialize(dngbug,csfix); +} + +LibRaw_LjpegDecompressor::LibRaw_LjpegDecompressor(uint8_t *b, unsigned bs): buffer(b,bs), + state(State::NotInited) +{ + initialize(false,false); +} + + +void LibRaw_LjpegDecompressor::initialize(bool dngbug, bool csfix) +{ + sof.csfix = csfix; + bool dht_init[4] = { false,false,false,false }; + uint32_t dht_bits[4][17]; + uint32_t dht_huffval[4][256]; + ZERO(dht_bits); + ZERO(dht_huffval); + if (next_marker(false) != Marker::SOI) + { + state = State::NoSOI; + return; + } + while (1) + { + uint8_t marker = next_marker(true); + if (marker == Marker::SOF3) + { + if (!sof.parse_sof(buffer)) + { + state = State::InvalidSOF; + return; + } + if (sof.precision > 16 || sof.precision < 12) + { + state = State::IncorrectPrecision; + return; + } + } + else if (marker == Marker::DHT) + { + bool hres = parse_dht(dht_init, dht_bits, dht_huffval); + if(!hres) + { + state = State::InvalidDHT; + return; + } + } + else if ( marker == Marker::SOS) + { + uint32_t val = sof.parse_sos(buffer); + if (val < 0x10000) + { + predictor = (val >> 8) & 0xff; + point_transform = val & 0xff; + } + else + { + state = State::InvalidSOS; + return; + } + break; + } + else if (marker == Marker::EOI) + { + state = State::EOIReached; + return; + } + else if (marker == Marker::DQT) + { + state = State::DQTPresent; + return; + } + else if(marker == Marker::Fill) + { + state = State::EOIReached; + return; + } + } + + dhts.resize(4); + for (int i = 0; i < 4; i++) + if (dht_init[i]) + dhts[i].initval(dht_bits[i], dht_huffval[i], dngbug); + datastart = buffer.pos; + state = State::OK; +} + +uint8_t LibRaw_LjpegDecompressor::next_marker(bool allowskip) +{ + if (!allowskip) + { + if (buffer.get_u8() != 0xff) + return Marker::Fill; // Error; + uint8_t mark = buffer.get_u8(); + return mark; + } + if (buffer.skip_to_marker()) + return buffer.get_u8(); + else + return Marker::Fill; +} + +bool LibRaw_LjpegDecompressor::parse_dht(bool init[4], uint32_t bits[4][17], uint32_t huffval[4][256]) +{ + uint16_t length = buffer.get_u16() - 2u; + + while (length > 0) + { + uint8_t b = buffer.get_u8(); + uint8_t tc = b >> 4; + uint8_t th = b & 0xf; + + if (tc != 0) + return false; + + if (th > 3) + return false; + + uint32_t acc = 0; + for (int i = 0; i < 16; i++) + { + bits[th][i + 1] = buffer.get_u8(); + acc += bits[th][i + 1]; + } + bits[th][0] = 0; + + if (acc > 256) + return false; + + if (length < 1 + 16 + acc) + return 0xff; + for (int i = 0; i < acc; i++) + huffval[th][i] = buffer.get_u8(); + + init[th] = true; + length -= 1 + 16 + acc; + } + return true; +} + +static +#ifdef _MSC_VER +__forceinline +#else +inline +#endif +void copy_yuv_422(uint16_t *out, uint32_t row, uint32_t col, uint32_t width, int32_t y1, int32_t y2, + int32_t cb, int32_t cr) +{ + uint32_t pix1 = row * width + col; + uint32_t pix2 = pix1 + 3; + out[pix1 + 0] = uint16_t(y1); + out[pix1 + 1] = uint16_t(cb); + out[pix1 + 2] = uint16_t(cr); + out[pix2 + 0] = uint16_t(y2); + out[pix2 + 1] = uint16_t(cb); + out[pix2 + 2] = uint16_t(cr); +} + + +bool LibRaw_LjpegDecompressor::decode_ljpeg_422(std::vector &_dest, int width, int height) +{ + if (sof.width * 3 != width || sof.height != height) + return false; + if (width % 2 || width % 6 || height % 2) + return false; + + if (_dest.size() < width * height) + return false; + + uint16_t *dest = _dest.data(); + + HuffTable &h1 = dhts[sof.components[0].dc_tbl]; + HuffTable &h2 = dhts[sof.components[1].dc_tbl]; + HuffTable &h3 = dhts[sof.components[2].dc_tbl]; + + if (!h1.initialized || !h2.initialized || !h3.initialized) + return false; + + BitPumpJpeg pump(buffer); + + int32_t base = 1 << (sof.precision - point_transform - 1); + int32_t y1 = base + h1.decode(pump); + int32_t y2 = y1 + h1.decode(pump); + int32_t cb = base + h2.decode(pump); + int32_t cr = base + h3.decode(pump); + copy_yuv_422(dest, 0, 0, width, y1, y2, cb, cr); + + for (uint32_t row = 0; row < height; row++) + { + uint32_t startcol = row == 0 ? 6 : 0; + for (uint32_t col = startcol; col < width; col += 6) + { + uint32_t pos = (col == 0) ? (row - 1) * width : row * width + col - 3; + int32_t py = dest[pos], + pcb = dest[pos + 1], + pcr = dest[pos + 2]; + int32_t y1 = py + h1.decode(pump); + int32_t y2 = y1 + h1.decode(pump); + int32_t cb = pcb + h2.decode(pump); + int32_t cr = pcr + h3.decode(pump); + copy_yuv_422(dest, row, col, width, y1, y2, cb, cr); + } + } + return true; +} + +bool LibRaw_SOFInfo::parse_sof(ByteStreamBE& input) +{ + uint32_t header_length = input.get_u16(); + precision = input.get_u8(); + height = input.get_u16(); + width = input.get_u16(); + cps = input.get_u8(); + + if (precision > 16) + return false; + if (cps > 4 || cps < 1) + return false; + if (header_length != 8 + cps * 3) + return false; + + components.clear(); + for (int i = 0; i < cps; i++) + { + unsigned id = input.get_u8(); + unsigned subs = input.get_u8(); + components.push_back(LibRaw_JpegComponentInfo(id, i, 0, (subs >> 4), (subs & 0xf) )); + input.get_u8(); + } + return true; +} + +uint32_t LibRaw_SOFInfo::parse_sos(ByteStreamBE& input) +{ + if (width == 0) + return 0x10000; + + input.get_u16(); + + uint32_t soscps = input.get_u8(); + if (cps != soscps) + return 0x10000; + for (uint32_t csi = 0; csi < cps; csi++) + { + uint32_t readcs = input.get_u8(); + uint32_t cs = csfix ? csi : readcs; // csfix might be used in MOS decoder + int cid = -1; + for(int c = 0; c < components.size(); c++) + if (components[c].id == cs) + { + cid = c; + break; + } + if (cid < 0) + return 0x10000; + + uint8_t td = input.get_u8() >> 4; + if (td > 3) + return 0x10000; + components[cid].dc_tbl = td; + } + uint8_t pred = input.get_u8(); + input.get_u8(); + uint8_t pt = input.get_u8() & 0xf; + return (pred << 8 | pt); +} + +HuffTable::HuffTable() +{ + ZERO(bits); + ZERO(huffval); + ZERO(shiftval); + dng_bug = false; + disable_cache = false; + nbits = 0; + initialized = false; +} + +struct PseudoPump : public BitPump +{ + uint64_t bits; + int32_t nbits; + PseudoPump() : bits(0), nbits(0) {} + + void set(uint32_t _bits, uint32_t nb) + { + bits = uint64_t(_bits) << 32; + nbits = nb + 32; + } + int32_t valid() { return nbits - 32; } + + uint32_t peek(uint32_t num) + { + return uint32_t((bits >> (nbits - num)) & 0xffffffffUL); + } + + void consume(uint32_t num) + { + nbits -= num; + bits &= (uint64_t(1) << nbits) - 1UL; + } +}; + +void HuffTable::initval(uint32_t _bits[17], uint32_t _huffval[256], bool _dng_bug) +{ + memmove(bits, _bits, sizeof(bits)); + memmove(huffval, _huffval, sizeof(huffval)); + dng_bug = _dng_bug; + + nbits = 16; + for(int i = 0; i < 16; i++) + { + if(bits[16 - i] != 0) + break; + nbits--; + } + hufftable.resize(1 << nbits); + for (int i = 0; i < hufftable.size(); i++) hufftable[i] = 0; + + int h = 0; + int pos = 0; + for (uint8_t len = 0; len < nbits; len++) + { + for (int i = 0; i < bits[len + 1]; i++) + { + for (int j = 0; j < (1 << (nbits - len - 1)); j++) + { + hufftable[h] = ((len+1) << 16) | (uint8_t(huffval[pos] & 0xff) << 8) | uint8_t(shiftval[pos] & 0xff); + h++; + } + pos++; + } + } + if (!disable_cache) + { + PseudoPump pump; + decodecache = std::vector(1 << LIBRAW_DECODE_CACHE_BITS,0); + for(uint32_t i = 0; i < 1 << LIBRAW_DECODE_CACHE_BITS; i++) + { + pump.set(i, LIBRAW_DECODE_CACHE_BITS); + uint32_t len; + int16_t val16 = int16_t(decode_slow2(pump,len)); + if (pump.valid() >= 0) + decodecache[i] = LIBRAW_CACHE_PRESENT_FLAG | uint64_t(((len & 0xff) << 16) | uint16_t(val16)); + } + } + initialized = true; +} diff --git a/rtengine/libraw/src/demosaic/aahd_demosaic.cpp b/rtengine/libraw/src/demosaic/aahd_demosaic.cpp new file mode 100644 index 000000000..942176566 --- /dev/null +++ b/rtengine/libraw/src/demosaic/aahd_demosaic.cpp @@ -0,0 +1,781 @@ +/* -*- C++ -*- + * File: aahd_demosaic.cpp + * Copyright 2013 Anton Petrusevich + * Created: Wed May 15, 2013 + * + * This code is licensed under one of two licenses as you choose: + * + * 1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + * (See file LICENSE.LGPL provided in LibRaw distribution archive for + * details). + * + * 2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + * (See file LICENSE.CDDL provided in LibRaw distribution archive for + * details). + * + */ + +#include "../../internal/dmp_include.h" + +typedef ushort ushort3[3]; +typedef int int3[3]; + +#ifndef Pnw +#define Pnw (-1 - nr_width) +#define Pn (-nr_width) +#define Pne (+1 - nr_width) +#define Pe (+1) +#define Pse (+1 + nr_width) +#define Ps (+nr_width) +#define Psw (-1 + nr_width) +#define Pw (-1) +#endif + +struct AAHD +{ + int nr_height, nr_width; + static const int nr_margin = 4; + static const int Thot = 4; + static const int Tdead = 4; + static const int OverFraction = 8; + ushort3 *rgb_ahd[2]; + int3 *yuv[2]; + char *ndir, *homo[2]; + ushort channel_maximum[3], channels_max; + ushort channel_minimum[3]; + static const float yuv_coeff[3][3]; + static float gammaLUT[0x10000]; + float yuv_cam[3][3]; + LibRaw &libraw; + enum + { + HVSH = 1, + HOR = 2, + VER = 4, + HORSH = HOR | HVSH, + VERSH = VER | HVSH, + HOT = 8 + }; + + static inline float calc_dist(int c1, int c2) throw() + { + return c1 > c2 ? (float)c1 / c2 : (float)c2 / c1; + } + int inline Y(ushort3 &rgb) throw() + { + return yuv_cam[0][0] * rgb[0] + yuv_cam[0][1] * rgb[1] + + yuv_cam[0][2] * rgb[2]; + } + int inline U(ushort3 &rgb) throw() + { + return yuv_cam[1][0] * rgb[0] + yuv_cam[1][1] * rgb[1] + + yuv_cam[1][2] * rgb[2]; + } + int inline V(ushort3 &rgb) throw() + { + return yuv_cam[2][0] * rgb[0] + yuv_cam[2][1] * rgb[1] + + yuv_cam[2][2] * rgb[2]; + } + inline int nr_offset(int row, int col) throw() + { + return (row * nr_width + col); + } + ~AAHD(); + AAHD(LibRaw &_libraw); + void make_ahd_greens(); + void make_ahd_gline(int i); + void make_ahd_rb(); + void make_ahd_rb_hv(int i); + void make_ahd_rb_last(int i); + void evaluate_ahd(); + void combine_image(); + void hide_hots(); + void refine_hv_dirs(); + void refine_hv_dirs(int i, int js); + void refine_ihv_dirs(int i); + void illustrate_dirs(); + void illustrate_dline(int i); +}; + +const float AAHD::yuv_coeff[3][3] = { + // YPbPr + // { + // 0.299f, + // 0.587f, + // 0.114f }, + // { + // -0.168736, + // -0.331264f, + // 0.5f }, + // { + // 0.5f, + // -0.418688f, + // -0.081312f } + // + // Rec. 2020 + // Y'= 0,2627R' + 0,6780G' + 0,0593B' + // U = (B-Y)/1.8814 = (-0,2627R' - 0,6780G' + 0.9407B) / 1.8814 = + //-0.13963R - 0.36037G + 0.5B + // V = (R-Y)/1.4647 = (0.7373R - 0,6780G - 0,0593B) / 1.4647 = 0.5R - + //0.4629G - 0.04049B + {+0.2627f, +0.6780f, +0.0593f}, + {-0.13963f, -0.36037f, +0.5f}, + {+0.5034f, -0.4629f, -0.0405f} + +}; + +float AAHD::gammaLUT[0x10000] = {-1.f}; + +AAHD::AAHD(LibRaw &_libraw) : libraw(_libraw) +{ + nr_height = libraw.imgdata.sizes.iheight + nr_margin * 2; + nr_width = libraw.imgdata.sizes.iwidth + nr_margin * 2; + rgb_ahd[0] = (ushort3 *)calloc(nr_height * nr_width, + (sizeof(ushort3) * 2 + sizeof(int3) * 2 + 3)); + if (!rgb_ahd[0]) + throw LIBRAW_EXCEPTION_ALLOC; + + rgb_ahd[1] = rgb_ahd[0] + nr_height * nr_width; + yuv[0] = (int3 *)(rgb_ahd[1] + nr_height * nr_width); + yuv[1] = yuv[0] + nr_height * nr_width; + ndir = (char *)(yuv[1] + nr_height * nr_width); + homo[0] = ndir + nr_height * nr_width; + homo[1] = homo[0] + nr_height * nr_width; + channel_maximum[0] = channel_maximum[1] = channel_maximum[2] = 0; + channel_minimum[0] = libraw.imgdata.image[0][0]; + channel_minimum[1] = libraw.imgdata.image[0][1]; + channel_minimum[2] = libraw.imgdata.image[0][2]; + int iwidth = libraw.imgdata.sizes.iwidth; + for (int i = 0; i < 3; ++i) + for (int j = 0; j < 3; ++j) + { + yuv_cam[i][j] = 0; + for (int k = 0; k < 3; ++k) + yuv_cam[i][j] += yuv_coeff[i][k] * libraw.imgdata.color.rgb_cam[k][j]; + } + if (gammaLUT[0] < -0.1f) + { + float r; + for (int i = 0; i < 0x10000; i++) + { + r = (float)i / 0x10000; + gammaLUT[i] = + 0x10000 * (r < 0.0181 ? 4.5f * r : 1.0993f * pow(r, 0.45f) - .0993f); + } + } + for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) + { + int col_cache[48]; + for (int j = 0; j < 48; ++j) + { + int c = libraw.COLOR(i, j); + if (c == 3) + c = 1; + col_cache[j] = c; + } + int moff = nr_offset(i + nr_margin, nr_margin); + for (int j = 0; j < iwidth; ++j, ++moff) + { + int c = col_cache[j % 48]; + unsigned short d = libraw.imgdata.image[i * iwidth + j][c]; + if (d != 0) + { + if (channel_maximum[c] < d) + channel_maximum[c] = d; + if (channel_minimum[c] > d) + channel_minimum[c] = d; + rgb_ahd[1][moff][c] = rgb_ahd[0][moff][c] = d; + } + } + } + channels_max = + MAX(MAX(channel_maximum[0], channel_maximum[1]), channel_maximum[2]); +} + +void AAHD::hide_hots() +{ + int iwidth = libraw.imgdata.sizes.iwidth; + for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) + { + int js = libraw.COLOR(i, 0) & 1; + int kc = libraw.COLOR(i, js); + /* + * js -- начальная х-координата, которая попадает мимо известного зелёного + * kc -- известный цвет в точке интерполирования + */ + int moff = nr_offset(i + nr_margin, nr_margin + js); + for (int j = js; j < iwidth; j += 2, moff += 2) + { + ushort3 *rgb = &rgb_ahd[0][moff]; + int c = rgb[0][kc]; + if ((c > rgb[2 * Pe][kc] && c > rgb[2 * Pw][kc] && c > rgb[2 * Pn][kc] && + c > rgb[2 * Ps][kc] && c > rgb[Pe][1] && c > rgb[Pw][1] && + c > rgb[Pn][1] && c > rgb[Ps][1]) || + (c < rgb[2 * Pe][kc] && c < rgb[2 * Pw][kc] && c < rgb[2 * Pn][kc] && + c < rgb[2 * Ps][kc] && c < rgb[Pe][1] && c < rgb[Pw][1] && + c < rgb[Pn][1] && c < rgb[Ps][1])) + { + int chot = c >> Thot; + int cdead = c << Tdead; + int avg = 0; + for (int k = -2; k < 3; k += 2) + for (int m = -2; m < 3; m += 2) + if (m == 0 && k == 0) + continue; + else + avg += rgb[nr_offset(k, m)][kc]; + avg /= 8; + if (chot > avg || cdead < avg) + { + ndir[moff] |= HOT; + int dh = + ABS(rgb[2 * Pw][kc] - rgb[2 * Pe][kc]) + + ABS(rgb[Pw][1] - rgb[Pe][1]) + + ABS(rgb[Pw][1] - rgb[Pe][1] + rgb[2 * Pe][kc] - rgb[2 * Pw][kc]); + int dv = + ABS(rgb[2 * Pn][kc] - rgb[2 * Ps][kc]) + + ABS(rgb[Pn][1] - rgb[Ps][1]) + + ABS(rgb[Pn][1] - rgb[Ps][1] + rgb[2 * Ps][kc] - rgb[2 * Pn][kc]); + int d; + if (dv > dh) + d = Pw; + else + d = Pn; + rgb_ahd[1][moff][kc] = rgb[0][kc] = + (rgb[+2 * d][kc] + rgb[-2 * d][kc]) / 2; + } + } + } + js ^= 1; + moff = nr_offset(i + nr_margin, nr_margin + js); + for (int j = js; j < iwidth; j += 2, moff += 2) + { + ushort3 *rgb = &rgb_ahd[0][moff]; + int c = rgb[0][1]; + if ((c > rgb[2 * Pe][1] && c > rgb[2 * Pw][1] && c > rgb[2 * Pn][1] && + c > rgb[2 * Ps][1] && c > rgb[Pe][kc] && c > rgb[Pw][kc] && + c > rgb[Pn][kc ^ 2] && c > rgb[Ps][kc ^ 2]) || + (c < rgb[2 * Pe][1] && c < rgb[2 * Pw][1] && c < rgb[2 * Pn][1] && + c < rgb[2 * Ps][1] && c < rgb[Pe][kc] && c < rgb[Pw][kc] && + c < rgb[Pn][kc ^ 2] && c < rgb[Ps][kc ^ 2])) + { + int chot = c >> Thot; + int cdead = c << Tdead; + int avg = 0; + for (int k = -2; k < 3; k += 2) + for (int m = -2; m < 3; m += 2) + if (k == 0 && m == 0) + continue; + else + avg += rgb[nr_offset(k, m)][1]; + avg /= 8; + if (chot > avg || cdead < avg) + { + ndir[moff] |= HOT; + int dh = + ABS(rgb[2 * Pw][1] - rgb[2 * Pe][1]) + + ABS(rgb[Pw][kc] - rgb[Pe][kc]) + + ABS(rgb[Pw][kc] - rgb[Pe][kc] + rgb[2 * Pe][1] - rgb[2 * Pw][1]); + int dv = ABS(rgb[2 * Pn][1] - rgb[2 * Ps][1]) + + ABS(rgb[Pn][kc ^ 2] - rgb[Ps][kc ^ 2]) + + ABS(rgb[Pn][kc ^ 2] - rgb[Ps][kc ^ 2] + rgb[2 * Ps][1] - + rgb[2 * Pn][1]); + int d; + if (dv > dh) + d = Pw; + else + d = Pn; + rgb_ahd[1][moff][1] = rgb[0][1] = + (rgb[+2 * d][1] + rgb[-2 * d][1]) / 2; + } + } + } + } +} + +void AAHD::evaluate_ahd() +{ + int hvdir[4] = {Pw, Pe, Pn, Ps}; + /* + * YUV + * + */ + for (int d = 0; d < 2; ++d) + { + for (int i = 0; i < nr_width * nr_height; ++i) + { + ushort3 rgb; + for (int c = 0; c < 3; ++c) + { + rgb[c] = gammaLUT[rgb_ahd[d][i][c]]; + } + yuv[d][i][0] = Y(rgb); + yuv[d][i][1] = U(rgb); + yuv[d][i][2] = V(rgb); + } + } + /* */ + /* + * Lab + * + float r, cbrt[0x10000], xyz[3], xyz_cam[3][4]; + for (int i = 0; i < 0x10000; i++) { + r = i / 65535.0; + cbrt[i] = r > 0.008856 ? pow((double) r, (double) (1 / 3.0)) : 7.787 * r + 16 + / 116.0; + } + for (int i = 0; i < 3; i++) + for (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] * libraw.imgdata.color.rgb_cam[k][j] / + d65_white[i]; + } + for (int d = 0; d < 2; ++d) + for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) { + int moff = nr_offset(i + nr_margin, nr_margin); + for (int j = 0; j < libraw.imgdata.sizes.iwidth; j++, ++moff) { + xyz[0] = xyz[1] = xyz[2] = 0.5; + for (int c = 0; c < 3; c++) { + xyz[0] += xyz_cam[0][c] * rgb_ahd[d][moff][c]; + xyz[1] += xyz_cam[1][c] * rgb_ahd[d][moff][c]; + xyz[2] += xyz_cam[2][c] * rgb_ahd[d][moff][c]; + } + xyz[0] = cbrt[CLIP((int) xyz[0])]; + xyz[1] = cbrt[CLIP((int) xyz[1])]; + xyz[2] = cbrt[CLIP((int) xyz[2])]; + yuv[d][moff][0] = 64 * (116 * xyz[1] - 16); + yuv[d][moff][1] = 64 * 500 * (xyz[0] - xyz[1]); + yuv[d][moff][2] = 64 * 200 * (xyz[1] - xyz[2]); + } + } + * Lab */ + for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) + { + int moff = nr_offset(i + nr_margin, nr_margin); + for (int j = 0; j < libraw.imgdata.sizes.iwidth; j++, ++moff) + { + int3 *ynr; + float ydiff[2][4]; + int uvdiff[2][4]; + for (int d = 0; d < 2; ++d) + { + ynr = &yuv[d][moff]; + for (int k = 0; k < 4; k++) + { + ydiff[d][k] = ABS(ynr[0][0] - ynr[hvdir[k]][0]); + uvdiff[d][k] = SQR(ynr[0][1] - ynr[hvdir[k]][1]) + + SQR(ynr[0][2] - ynr[hvdir[k]][2]); + } + } + float yeps = + MIN(MAX(ydiff[0][0], ydiff[0][1]), MAX(ydiff[1][2], ydiff[1][3])); + int uveps = + MIN(MAX(uvdiff[0][0], uvdiff[0][1]), MAX(uvdiff[1][2], uvdiff[1][3])); + for (int d = 0; d < 2; d++) + { + ynr = &yuv[d][moff]; + for (int k = 0; k < 4; k++) + if (ydiff[d][k] <= yeps && uvdiff[d][k] <= uveps) + { + homo[d][moff + hvdir[k]]++; + if (k / 2 == d) + { + // если в сонаправленном направлении интеполяции следующие точки + // так же гомогенны, учтём их тоже + for (int m = 2; m < 4; ++m) + { + int hvd = m * hvdir[k]; + if (ABS(ynr[0][0] - ynr[hvd][0]) < yeps && + SQR(ynr[0][1] - ynr[hvd][1]) + + SQR(ynr[0][2] - ynr[hvd][2]) < + uveps) + { + homo[d][moff + hvd]++; + } + else + break; + } + } + } + } + } + } + for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) + { + int moff = nr_offset(i + nr_margin, nr_margin); + for (int j = 0; j < libraw.imgdata.sizes.iwidth; j++, ++moff) + { + char hm[2]; + for (int d = 0; d < 2; d++) + { + hm[d] = 0; + char *hh = &homo[d][moff]; + for (int hx = -1; hx < 2; hx++) + for (int hy = -1; hy < 2; hy++) + hm[d] += hh[nr_offset(hy, hx)]; + } + char d = 0; + if (hm[0] != hm[1]) + { + if (hm[1] > hm[0]) + { + d = VERSH; + } + else + { + d = HORSH; + } + } + else + { + int3 *ynr = &yuv[1][moff]; + int gv = SQR(2 * ynr[0][0] - ynr[Pn][0] - ynr[Ps][0]); + gv += SQR(2 * ynr[0][1] - ynr[Pn][1] - ynr[Ps][1]) + + SQR(2 * ynr[0][2] - ynr[Pn][2] - ynr[Ps][2]); + ynr = &yuv[1][moff + Pn]; + gv += (SQR(2 * ynr[0][0] - ynr[Pn][0] - ynr[Ps][0]) + + SQR(2 * ynr[0][1] - ynr[Pn][1] - ynr[Ps][1]) + + SQR(2 * ynr[0][2] - ynr[Pn][2] - ynr[Ps][2])) / + 2; + ynr = &yuv[1][moff + Ps]; + gv += (SQR(2 * ynr[0][0] - ynr[Pn][0] - ynr[Ps][0]) + + SQR(2 * ynr[0][1] - ynr[Pn][1] - ynr[Ps][1]) + + SQR(2 * ynr[0][2] - ynr[Pn][2] - ynr[Ps][2])) / + 2; + ynr = &yuv[0][moff]; + int gh = SQR(2 * ynr[0][0] - ynr[Pw][0] - ynr[Pe][0]); + gh += SQR(2 * ynr[0][1] - ynr[Pw][1] - ynr[Pe][1]) + + SQR(2 * ynr[0][2] - ynr[Pw][2] - ynr[Pe][2]); + ynr = &yuv[0][moff + Pw]; + gh += (SQR(2 * ynr[0][0] - ynr[Pw][0] - ynr[Pe][0]) + + SQR(2 * ynr[0][1] - ynr[Pw][1] - ynr[Pe][1]) + + SQR(2 * ynr[0][2] - ynr[Pw][2] - ynr[Pe][2])) / + 2; + ynr = &yuv[0][moff + Pe]; + gh += (SQR(2 * ynr[0][0] - ynr[Pw][0] - ynr[Pe][0]) + + SQR(2 * ynr[0][1] - ynr[Pw][1] - ynr[Pe][1]) + + SQR(2 * ynr[0][2] - ynr[Pw][2] - ynr[Pe][2])) / + 2; + if (gv > gh) + d = HOR; + else + d = VER; + } + ndir[moff] |= d; + } + } +} + +void AAHD::combine_image() +{ + for (int i = 0, i_out = 0; i < libraw.imgdata.sizes.iheight; ++i) + { + int moff = nr_offset(i + nr_margin, nr_margin); + for (int j = 0; j < libraw.imgdata.sizes.iwidth; j++, ++moff, ++i_out) + { + if (ndir[moff] & HOT) + { + int c = libraw.COLOR(i, j); + rgb_ahd[1][moff][c] = rgb_ahd[0][moff][c] = + libraw.imgdata.image[i_out][c]; + } + if (ndir[moff] & VER) + { + libraw.imgdata.image[i_out][0] = rgb_ahd[1][moff][0]; + libraw.imgdata.image[i_out][3] = libraw.imgdata.image[i_out][1] = + rgb_ahd[1][moff][1]; + libraw.imgdata.image[i_out][2] = rgb_ahd[1][moff][2]; + } + else + { + libraw.imgdata.image[i_out][0] = rgb_ahd[0][moff][0]; + libraw.imgdata.image[i_out][3] = libraw.imgdata.image[i_out][1] = + rgb_ahd[0][moff][1]; + libraw.imgdata.image[i_out][2] = rgb_ahd[0][moff][2]; + } + } + } +} + +void AAHD::refine_hv_dirs() +{ + for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) + { + refine_hv_dirs(i, i & 1); + } + for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) + { + refine_hv_dirs(i, (i & 1) ^ 1); + } + for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) + { + refine_ihv_dirs(i); + } +} + +void AAHD::refine_ihv_dirs(int i) +{ + int iwidth = libraw.imgdata.sizes.iwidth; + int moff = nr_offset(i + nr_margin, nr_margin); + for (int j = 0; j < iwidth; j++, ++moff) + { + if (ndir[moff] & HVSH) + continue; + int nv = (ndir[moff + Pn] & VER) + (ndir[moff + Ps] & VER) + + (ndir[moff + Pw] & VER) + (ndir[moff + Pe] & VER); + int nh = (ndir[moff + Pn] & HOR) + (ndir[moff + Ps] & HOR) + + (ndir[moff + Pw] & HOR) + (ndir[moff + Pe] & HOR); + nv /= VER; + nh /= HOR; + if ((ndir[moff] & VER) && nh > 3) + { + ndir[moff] &= ~VER; + ndir[moff] |= HOR; + } + if ((ndir[moff] & HOR) && nv > 3) + { + ndir[moff] &= ~HOR; + ndir[moff] |= VER; + } + } +} + +void AAHD::refine_hv_dirs(int i, int js) +{ + int iwidth = libraw.imgdata.sizes.iwidth; + int moff = nr_offset(i + nr_margin, nr_margin + js); + for (int j = js; j < iwidth; j += 2, moff += 2) + { + int nv = (ndir[moff + Pn] & VER) + (ndir[moff + Ps] & VER) + + (ndir[moff + Pw] & VER) + (ndir[moff + Pe] & VER); + int nh = (ndir[moff + Pn] & HOR) + (ndir[moff + Ps] & HOR) + + (ndir[moff + Pw] & HOR) + (ndir[moff + Pe] & HOR); + bool codir = (ndir[moff] & VER) + ? ((ndir[moff + Pn] & VER) || (ndir[moff + Ps] & VER)) + : ((ndir[moff + Pw] & HOR) || (ndir[moff + Pe] & HOR)); + nv /= VER; + nh /= HOR; + if ((ndir[moff] & VER) && (nh > 2 && !codir)) + { + ndir[moff] &= ~VER; + ndir[moff] |= HOR; + } + if ((ndir[moff] & HOR) && (nv > 2 && !codir)) + { + ndir[moff] &= ~HOR; + ndir[moff] |= VER; + } + } +} + +/* + * вычисление недостающих зелёных точек. + */ +void AAHD::make_ahd_greens() +{ + for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) + { + make_ahd_gline(i); + } +} + +void AAHD::make_ahd_gline(int i) +{ + int iwidth = libraw.imgdata.sizes.iwidth; + int js = libraw.COLOR(i, 0) & 1; + int kc = libraw.COLOR(i, js); + /* + * js -- начальная х-координата, которая попадает мимо известного зелёного + * kc -- известный цвет в точке интерполирования + */ + int hvdir[2] = {Pe, Ps}; + for (int d = 0; d < 2; ++d) + { + int moff = nr_offset(i + nr_margin, nr_margin + js); + for (int j = js; j < iwidth; j += 2, moff += 2) + { + ushort3 *cnr; + cnr = &rgb_ahd[d][moff]; + int h1 = 2 * cnr[-hvdir[d]][1] - int(cnr[-2 * hvdir[d]][kc] + cnr[0][kc]); + int h2 = 2 * cnr[+hvdir[d]][1] - int(cnr[+2 * hvdir[d]][kc] + cnr[0][kc]); + int h0 = (h1 + h2) / 4; + int eg = cnr[0][kc] + h0; + int min = MIN(cnr[-hvdir[d]][1], cnr[+hvdir[d]][1]); + int max = MAX(cnr[-hvdir[d]][1], cnr[+hvdir[d]][1]); + min -= min / OverFraction; + max += max / OverFraction; + if (eg < min) + eg = min - sqrt(float(min - eg)); + else if (eg > max) + eg = max + sqrt(float(eg - max)); + if (eg > channel_maximum[1]) + eg = channel_maximum[1]; + else if (eg < channel_minimum[1]) + eg = channel_minimum[1]; + cnr[0][1] = eg; + } + } +} + +/* + * отладочная функция + */ + +void AAHD::illustrate_dirs() +{ + for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) + { + illustrate_dline(i); + } +} + +void AAHD::illustrate_dline(int i) +{ + int iwidth = libraw.imgdata.sizes.iwidth; + for (int j = 0; j < iwidth; j++) + { + int x = j + nr_margin; + int y = i + nr_margin; + rgb_ahd[1][nr_offset(y, x)][0] = rgb_ahd[1][nr_offset(y, x)][1] = + rgb_ahd[1][nr_offset(y, x)][2] = rgb_ahd[0][nr_offset(y, x)][0] = + rgb_ahd[0][nr_offset(y, x)][1] = rgb_ahd[0][nr_offset(y, x)][2] = 0; + int l = ndir[nr_offset(y, x)] & HVSH; + l /= HVSH; + if (ndir[nr_offset(y, x)] & VER) + rgb_ahd[1][nr_offset(y, x)][0] = + l * channel_maximum[0] / 4 + channel_maximum[0] / 4; + else + rgb_ahd[0][nr_offset(y, x)][2] = + l * channel_maximum[2] / 4 + channel_maximum[2] / 4; + } +} + +void AAHD::make_ahd_rb_hv(int i) +{ + int iwidth = libraw.imgdata.sizes.iwidth; + int js = libraw.COLOR(i, 0) & 1; + int kc = libraw.COLOR(i, js); + js ^= 1; // начальная координата зелёного + int hvdir[2] = {Pe, Ps}; + // интерполяция вертикальных вертикально и горизонтальных горизонтально + for (int j = js; j < iwidth; j += 2) + { + int x = j + nr_margin; + int y = i + nr_margin; + int moff = nr_offset(y, x); + for (int d = 0; d < 2; ++d) + { + ushort3 *cnr; + cnr = &rgb_ahd[d][moff]; + int c = kc ^ (d << 1); // цвет соответсвенного направления, для + // горизонтального c = kc, для вертикального c=kc^2 + int h1 = cnr[-hvdir[d]][c] - cnr[-hvdir[d]][1]; + int h2 = cnr[+hvdir[d]][c] - cnr[+hvdir[d]][1]; + int h0 = (h1 + h2) / 2; + int eg = cnr[0][1] + h0; + // int min = MIN(cnr[-hvdir[d]][c], cnr[+hvdir[d]][c]); + // int max = MAX(cnr[-hvdir[d]][c], cnr[+hvdir[d]][c]); + // min -= min / OverFraction; + // max += max / OverFraction; + // if (eg < min) + // eg = min - sqrt(min - eg); + // else if (eg > max) + // eg = max + sqrt(eg - max); + if (eg > channel_maximum[c]) + eg = channel_maximum[c]; + else if (eg < channel_minimum[c]) + eg = channel_minimum[c]; + cnr[0][c] = eg; + } + } +} + +void AAHD::make_ahd_rb() +{ + for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) + { + make_ahd_rb_hv(i); + } + for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) + { + make_ahd_rb_last(i); + } +} + +void AAHD::make_ahd_rb_last(int i) +{ + int iwidth = libraw.imgdata.sizes.iwidth; + int js = libraw.COLOR(i, 0) & 1; + int kc = libraw.COLOR(i, js); + /* + * js -- начальная х-координата, которая попадает мимо известного зелёного + * kc -- известный цвет в точке интерполирования + */ + int dirs[2][3] = {{Pnw, Pn, Pne}, {Pnw, Pw, Psw}}; + int moff = nr_offset(i + nr_margin, nr_margin); + for (int j = 0; j < iwidth; j++) + { + for (int d = 0; d < 2; ++d) + { + ushort3 *cnr; + cnr = &rgb_ahd[d][moff + j]; + int c = kc ^ 2; + if ((j & 1) != js) + { + // точка зелёного, для вертикального направления нужен альтернативный + // строчному цвет + c ^= d << 1; + } + int bh = 0, bk = 0; + int bgd = 0; + for (int k = 0; k < 3; ++k) + for (int h = 0; h < 3; ++h) + { + // градиент зелёного плюс градиент {r,b} + int gd = + ABS(2 * cnr[0][1] - (cnr[+dirs[d][k]][1] + cnr[-dirs[d][h]][1])) + + ABS(cnr[+dirs[d][k]][c] - cnr[-dirs[d][h]][c]) / 4 + + ABS(cnr[+dirs[d][k]][c] - cnr[+dirs[d][k]][1] + + cnr[-dirs[d][h]][1] - cnr[-dirs[d][h]][c]) / + 4; + if (bgd == 0 || gd < bgd) + { + bgd = gd; + bh = h; + bk = k; + } + } + int h1 = cnr[+dirs[d][bk]][c] - cnr[+dirs[d][bk]][1]; + int h2 = cnr[-dirs[d][bh]][c] - cnr[-dirs[d][bh]][1]; + int eg = cnr[0][1] + (h1 + h2) / 2; + // int min = MIN(cnr[+dirs[d][bk]][c], cnr[-dirs[d][bh]][c]); + // int max = MAX(cnr[+dirs[d][bk]][c], cnr[-dirs[d][bh]][c]); + // min -= min / OverFraction; + // max += max / OverFraction; + // if (eg < min) + // eg = min - sqrt(min - eg); + // else if (eg > max) + // eg = max + sqrt(eg - max); + if (eg > channel_maximum[c]) + eg = channel_maximum[c]; + else if (eg < channel_minimum[c]) + eg = channel_minimum[c]; + cnr[0][c] = eg; + } + } +} + +AAHD::~AAHD() { free(rgb_ahd[0]); } + +void LibRaw::aahd_interpolate() +{ + AAHD aahd(*this); + aahd.hide_hots(); + aahd.make_ahd_greens(); + aahd.make_ahd_rb(); + aahd.evaluate_ahd(); + aahd.refine_hv_dirs(); + // aahd.illustrate_dirs(); + aahd.combine_image(); +} diff --git a/rtengine/libraw/src/demosaic/ahd_demosaic.cpp b/rtengine/libraw/src/demosaic/ahd_demosaic.cpp new file mode 100644 index 000000000..8d32d6cd1 --- /dev/null +++ b/rtengine/libraw/src/demosaic/ahd_demosaic.cpp @@ -0,0 +1,355 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +/* + Adaptive Homogeneity-Directed interpolation is based on + the work of Keigo Hirakawa, Thomas Parks, and Paul Lee. + */ + +void LibRaw::cielab(ushort rgb[3], short lab[3]) +{ + int c, i, j, k; + float r, xyz[3]; +#ifdef LIBRAW_NOTHREADS + static float cbrt[0x10000], xyz_cam[3][4]; +#else +#define cbrt tls->ahd_data.cbrt +#define xyz_cam tls->ahd_data.xyz_cam +#endif + + if (!rgb) + { +#ifndef LIBRAW_NOTHREADS + if (cbrt[0] < -1.0f) +#endif + for (i = 0; i < 0x10000; i++) + { + r = i / 65535.0; + cbrt[i] = + r > 0.008856 ? pow(r, 1.f / 3.0f) : 7.787f * r + 16.f / 116.0f; + } + for (i = 0; i < 3; i++) + for (j = 0; j < colors; j++) + for (xyz_cam[i][j] = k = 0; k < 3; k++) + xyz_cam[i][j] += LibRaw_constants::xyz_rgb[i][k] * rgb_cam[k][j] / + LibRaw_constants::d65_white[i]; + return; + } + xyz[0] = xyz[1] = xyz[2] = 0.5; + FORCC + { + xyz[0] += xyz_cam[0][c] * rgb[c]; + xyz[1] += xyz_cam[1][c] * rgb[c]; + xyz[2] += xyz_cam[2][c] * rgb[c]; + } + xyz[0] = cbrt[CLIP((int)xyz[0])]; + xyz[1] = cbrt[CLIP((int)xyz[1])]; + xyz[2] = cbrt[CLIP((int)xyz[2])]; + lab[0] = 64 * (116 * xyz[1] - 16); + lab[1] = 64 * 500 * (xyz[0] - xyz[1]); + lab[2] = 64 * 200 * (xyz[1] - xyz[2]); +#ifndef LIBRAW_NOTHREADS +#undef cbrt +#undef xyz_cam +#endif +} + +void LibRaw::ahd_interpolate_green_h_and_v( + int top, int left, ushort (*out_rgb)[LIBRAW_AHD_TILE][LIBRAW_AHD_TILE][3]) +{ + int row, col; + int c, val; + ushort(*pix)[4]; + const int rowlimit = MIN(top + LIBRAW_AHD_TILE, height - 2); + const int collimit = MIN(left + LIBRAW_AHD_TILE, width - 2); + + for (row = top; row < rowlimit; row++) + { + col = left + (FC(row, left) & 1); + for (c = FC(row, col); col < collimit; col += 2) + { + pix = image + row * width + col; + val = + ((pix[-1][1] + pix[0][c] + pix[1][1]) * 2 - pix[-2][c] - pix[2][c]) >> + 2; + out_rgb[0][row - top][col - left][1] = ULIM(val, pix[-1][1], pix[1][1]); + val = ((pix[-width][1] + pix[0][c] + pix[width][1]) * 2 - + pix[-2 * width][c] - pix[2 * width][c]) >> + 2; + out_rgb[1][row - top][col - left][1] = + ULIM(val, pix[-width][1], pix[width][1]); + } + } +} +void LibRaw::ahd_interpolate_r_and_b_in_rgb_and_convert_to_cielab( + int top, int left, ushort (*inout_rgb)[LIBRAW_AHD_TILE][3], + short (*out_lab)[LIBRAW_AHD_TILE][3]) +{ + unsigned row, col; + int c, val; + ushort(*pix)[4]; + ushort(*rix)[3]; + short(*lix)[3]; + const unsigned num_pix_per_row = 4 * width; + const unsigned rowlimit = MIN(top + LIBRAW_AHD_TILE - 1, height - 3); + const unsigned collimit = MIN(left + LIBRAW_AHD_TILE - 1, width - 3); + ushort *pix_above; + ushort *pix_below; + int t1, t2; + + for (row = top + 1; row < rowlimit; row++) + { + pix = image + row * width + left; + rix = &inout_rgb[row - top][0]; + lix = &out_lab[row - top][0]; + + for (col = left + 1; col < collimit; col++) + { + pix++; + pix_above = &pix[0][0] - num_pix_per_row; + pix_below = &pix[0][0] + num_pix_per_row; + rix++; + lix++; + + c = 2 - FC(row, col); + + if (c == 1) + { + c = FC(row + 1, col); + t1 = 2 - c; + val = pix[0][1] + + ((pix[-1][t1] + pix[1][t1] - rix[-1][1] - rix[1][1]) >> 1); + rix[0][t1] = CLIP(val); + val = + pix[0][1] + ((pix_above[c] + pix_below[c] - + rix[-LIBRAW_AHD_TILE][1] - rix[LIBRAW_AHD_TILE][1]) >> + 1); + } + else + { + t1 = -4 + c; /* -4+c: pixel of color c to the left */ + t2 = 4 + c; /* 4+c: pixel of color c to the right */ + val = rix[0][1] + + ((pix_above[t1] + pix_above[t2] + pix_below[t1] + pix_below[t2] - + rix[-LIBRAW_AHD_TILE - 1][1] - rix[-LIBRAW_AHD_TILE + 1][1] - + rix[+LIBRAW_AHD_TILE - 1][1] - rix[+LIBRAW_AHD_TILE + 1][1] + + 1) >> + 2); + } + rix[0][c] = CLIP(val); + c = FC(row, col); + rix[0][c] = pix[0][c]; + cielab(rix[0], lix[0]); + } + } +} +void LibRaw::ahd_interpolate_r_and_b_and_convert_to_cielab( + int top, int left, ushort (*inout_rgb)[LIBRAW_AHD_TILE][LIBRAW_AHD_TILE][3], + short (*out_lab)[LIBRAW_AHD_TILE][LIBRAW_AHD_TILE][3]) +{ + int direction; + for (direction = 0; direction < 2; direction++) + { + ahd_interpolate_r_and_b_in_rgb_and_convert_to_cielab( + top, left, inout_rgb[direction], out_lab[direction]); + } +} + +void LibRaw::ahd_interpolate_build_homogeneity_map( + int top, int left, short (*lab)[LIBRAW_AHD_TILE][LIBRAW_AHD_TILE][3], + char (*out_homogeneity_map)[LIBRAW_AHD_TILE][2]) +{ + int row, col; + int tr; + int direction; + int i; + short(*lix)[3]; + short(*lixs[2])[3]; + short *adjacent_lix; + unsigned ldiff[2][4], abdiff[2][4], leps, abeps; + static const int dir[4] = {-1, 1, -LIBRAW_AHD_TILE, LIBRAW_AHD_TILE}; + const int rowlimit = MIN(top + LIBRAW_AHD_TILE - 2, height - 4); + const int collimit = MIN(left + LIBRAW_AHD_TILE - 2, width - 4); + int homogeneity; + char(*homogeneity_map_p)[2]; + + memset(out_homogeneity_map, 0, 2 * LIBRAW_AHD_TILE * LIBRAW_AHD_TILE); + + for (row = top + 2; row < rowlimit; row++) + { + tr = row - top; + homogeneity_map_p = &out_homogeneity_map[tr][1]; + for (direction = 0; direction < 2; direction++) + { + lixs[direction] = &lab[direction][tr][1]; + } + + for (col = left + 2; col < collimit; col++) + { + homogeneity_map_p++; + + for (direction = 0; direction < 2; direction++) + { + lix = ++lixs[direction]; + for (i = 0; i < 4; i++) + { + adjacent_lix = lix[dir[i]]; + ldiff[direction][i] = ABS(lix[0][0] - adjacent_lix[0]); + abdiff[direction][i] = SQR(lix[0][1] - adjacent_lix[1]) + + SQR(lix[0][2] - adjacent_lix[2]); + } + } + leps = MIN(MAX(ldiff[0][0], ldiff[0][1]), MAX(ldiff[1][2], ldiff[1][3])); + abeps = + MIN(MAX(abdiff[0][0], abdiff[0][1]), MAX(abdiff[1][2], abdiff[1][3])); + for (direction = 0; direction < 2; direction++) + { + homogeneity = 0; + for (i = 0; i < 4; i++) + { + if (ldiff[direction][i] <= leps && abdiff[direction][i] <= abeps) + { + homogeneity++; + } + } + homogeneity_map_p[0][direction] = homogeneity; + } + } + } +} +void LibRaw::ahd_interpolate_combine_homogeneous_pixels( + int top, int left, ushort (*rgb)[LIBRAW_AHD_TILE][LIBRAW_AHD_TILE][3], + char (*homogeneity_map)[LIBRAW_AHD_TILE][2]) +{ + int row, col; + int tr, tc; + int i, j; + int direction; + int hm[2]; + int c; + const int rowlimit = MIN(top + LIBRAW_AHD_TILE - 3, height - 5); + const int collimit = MIN(left + LIBRAW_AHD_TILE - 3, width - 5); + + ushort(*pix)[4]; + ushort(*rix[2])[3]; + + for (row = top + 3; row < rowlimit; row++) + { + tr = row - top; + pix = &image[row * width + left + 2]; + for (direction = 0; direction < 2; direction++) + { + rix[direction] = &rgb[direction][tr][2]; + } + + for (col = left + 3; col < collimit; col++) + { + tc = col - left; + pix++; + for (direction = 0; direction < 2; direction++) + { + rix[direction]++; + } + + for (direction = 0; direction < 2; direction++) + { + hm[direction] = 0; + for (i = tr - 1; i <= tr + 1; i++) + { + for (j = tc - 1; j <= tc + 1; j++) + { + hm[direction] += homogeneity_map[i][j][direction]; + } + } + } + if (hm[0] != hm[1]) + { + memcpy(pix[0], rix[hm[1] > hm[0]][0], 3 * sizeof(ushort)); + } + else + { + FORC3 { pix[0][c] = (rix[0][0][c] + rix[1][0][c]) >> 1; } + } + } + } +} +void LibRaw::ahd_interpolate() +{ + int terminate_flag = 0; + cielab(0, 0); + border_interpolate(5); + +#ifdef LIBRAW_USE_OPENMP + int buffer_count = omp_get_max_threads(); +#else + int buffer_count = 1; +#endif + + size_t buffer_size = 26 * LIBRAW_AHD_TILE * LIBRAW_AHD_TILE; /* 1664 kB */ + char** buffers = malloc_omp_buffers(buffer_count, buffer_size); + +#ifdef LIBRAW_USE_OPENMP +#pragma omp parallel for schedule(dynamic) default(none) shared(terminate_flag) firstprivate(buffers) +#endif + for (int top = 2; top < height - 5; top += LIBRAW_AHD_TILE - 6) + { +#ifdef LIBRAW_USE_OPENMP + if (0 == omp_get_thread_num()) +#endif + if (callbacks.progress_cb) + { + int rr = (*callbacks.progress_cb)(callbacks.progresscb_data, + LIBRAW_PROGRESS_INTERPOLATE, + top - 2, height - 7); + if (rr) + terminate_flag = 1; + } + +#if defined(LIBRAW_USE_OPENMP) + char* buffer = buffers[omp_get_thread_num()]; +#else + char* buffer = buffers[0]; +#endif + + ushort(*rgb)[LIBRAW_AHD_TILE][LIBRAW_AHD_TILE][3]; + short(*lab)[LIBRAW_AHD_TILE][LIBRAW_AHD_TILE][3]; + char(*homo)[LIBRAW_AHD_TILE][2]; + + rgb = (ushort(*)[LIBRAW_AHD_TILE][LIBRAW_AHD_TILE][3])buffer; + lab = (short(*)[LIBRAW_AHD_TILE][LIBRAW_AHD_TILE][3])( + buffer + 12 * LIBRAW_AHD_TILE * LIBRAW_AHD_TILE); + homo = (char(*)[LIBRAW_AHD_TILE][2])(buffer + 24 * LIBRAW_AHD_TILE * + LIBRAW_AHD_TILE); + + for (int left = 2; !terminate_flag && (left < width - 5); + left += LIBRAW_AHD_TILE - 6) + { + ahd_interpolate_green_h_and_v(top, left, rgb); + ahd_interpolate_r_and_b_and_convert_to_cielab(top, left, rgb, lab); + ahd_interpolate_build_homogeneity_map(top, left, lab, homo); + ahd_interpolate_combine_homogeneous_pixels(top, left, rgb, homo); + } + } + + free_omp_buffers(buffers, buffer_count); + + if (terminate_flag) + throw LIBRAW_EXCEPTION_CANCELLED_BY_CALLBACK; +} diff --git a/rtengine/libraw/src/demosaic/dcb_demosaic.cpp b/rtengine/libraw/src/demosaic/dcb_demosaic.cpp new file mode 100644 index 000000000..f25292b9a --- /dev/null +++ b/rtengine/libraw/src/demosaic/dcb_demosaic.cpp @@ -0,0 +1,900 @@ +/* + * Copyright (C) 2010, Jacek Gozdz (cuniek@kft.umcs.lublin.pl) + * + * This code is licensed under a (3-clause) BSD license as follows : + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following + * conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the author nor the names of its + * contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + */ + +// DCB demosaicing by Jacek Gozdz (cuniek@kft.umcs.lublin.pl) + +// FBDD denoising by Jacek Gozdz (cuniek@kft.umcs.lublin.pl) and +// Luis Sanz Rodríguez (luis.sanz.rodriguez@gmail.com) + +// last modification: 11.07.2010 + +#include "../../internal/dcraw_defs.h" + +// interpolates green vertically and saves it to image3 +void LibRaw::dcb_ver(float (*image3)[3]) +{ + int row, col, u = width, indx; + + for (row = 2; row < height - 2; row++) + for (col = 2 + (FC(row, 2) & 1), indx = row * width + col; col < u - 2; + col += 2, indx += 2) + { + + image3[indx][1] = CLIP((image[indx + u][1] + image[indx - u][1]) / 2.0); + } +} + +// interpolates green horizontally and saves it to image2 +void LibRaw::dcb_hor(float (*image2)[3]) +{ + int row, col, u = width, indx; + + for (row = 2; row < height - 2; row++) + for (col = 2 + (FC(row, 2) & 1), indx = row * width + col; col < u - 2; + col += 2, indx += 2) + { + + image2[indx][1] = CLIP((image[indx + 1][1] + image[indx - 1][1]) / 2.0); + } +} + +// missing colors are interpolated +void LibRaw::dcb_color() +{ + int row, col, c, d, u = width, indx; + + for (row = 1; row < height - 1; row++) + for (col = 1 + (FC(row, 1) & 1), indx = row * width + col, + c = 2 - FC(row, col); + col < u - 1; col += 2, indx += 2) + { + + image[indx][c] = CLIP((4 * image[indx][1] - image[indx + u + 1][1] - + image[indx + u - 1][1] - image[indx - u + 1][1] - + image[indx - u - 1][1] + image[indx + u + 1][c] + + image[indx + u - 1][c] + image[indx - u + 1][c] + + image[indx - u - 1][c]) / + 4.0); + } + + for (row = 1; row < height - 1; row++) + for (col = 1 + (FC(row, 2) & 1), indx = row * width + col, + c = FC(row, col + 1), d = 2 - c; + col < width - 1; col += 2, indx += 2) + { + + image[indx][c] = + CLIP((2 * image[indx][1] - image[indx + 1][1] - image[indx - 1][1] + + image[indx + 1][c] + image[indx - 1][c]) / + 2.0); + image[indx][d] = + CLIP((2 * image[indx][1] - image[indx + u][1] - image[indx - u][1] + + image[indx + u][d] + image[indx - u][d]) / + 2.0); + } +} + +// missing R and B are interpolated horizontally and saved in image2 +void LibRaw::dcb_color2(float (*image2)[3]) +{ + int row, col, c, d, u = width, indx; + + for (row = 1; row < height - 1; row++) + for (col = 1 + (FC(row, 1) & 1), indx = row * width + col, + c = 2 - FC(row, col); + col < u - 1; col += 2, indx += 2) + { + + image2[indx][c] = + CLIP((4 * image2[indx][1] - image2[indx + u + 1][1] - + image2[indx + u - 1][1] - image2[indx - u + 1][1] - + image2[indx - u - 1][1] + image[indx + u + 1][c] + + image[indx + u - 1][c] + image[indx - u + 1][c] + + image[indx - u - 1][c]) / + 4.0); + } + + for (row = 1; row < height - 1; row++) + for (col = 1 + (FC(row, 2) & 1), indx = row * width + col, + c = FC(row, col + 1), d = 2 - c; + col < width - 1; col += 2, indx += 2) + { + + image2[indx][c] = CLIP((image[indx + 1][c] + image[indx - 1][c]) / 2.0); + image2[indx][d] = + CLIP((2 * image2[indx][1] - image2[indx + u][1] - + image2[indx - u][1] + image[indx + u][d] + image[indx - u][d]) / + 2.0); + } +} + +// missing R and B are interpolated vertically and saved in image3 +void LibRaw::dcb_color3(float (*image3)[3]) +{ + int row, col, c, d, u = width, indx; + + for (row = 1; row < height - 1; row++) + for (col = 1 + (FC(row, 1) & 1), indx = row * width + col, + c = 2 - FC(row, col); + col < u - 1; col += 2, indx += 2) + { + + image3[indx][c] = + CLIP((4 * image3[indx][1] - image3[indx + u + 1][1] - + image3[indx + u - 1][1] - image3[indx - u + 1][1] - + image3[indx - u - 1][1] + image[indx + u + 1][c] + + image[indx + u - 1][c] + image[indx - u + 1][c] + + image[indx - u - 1][c]) / + 4.0); + } + + for (row = 1; row < height - 1; row++) + for (col = 1 + (FC(row, 2) & 1), indx = row * width + col, + c = FC(row, col + 1), d = 2 - c; + col < width - 1; col += 2, indx += 2) + { + + image3[indx][c] = + CLIP((2 * image3[indx][1] - image3[indx + 1][1] - + image3[indx - 1][1] + image[indx + 1][c] + image[indx - 1][c]) / + 2.0); + image3[indx][d] = CLIP((image[indx + u][d] + image[indx - u][d]) / 2.0); + } +} + +// decides the primary green interpolation direction +void LibRaw::dcb_decide(float (*image2)[3], float (*image3)[3]) +{ + int row, col, c, d, u = width, v = 2 * u, indx; + float current, current2, current3; + + for (row = 2; row < height - 2; row++) + for (col = 2 + (FC(row, 2) & 1), indx = row * width + col, c = FC(row, col); + col < u - 2; col += 2, indx += 2) + { + + d = ABS(c - 2); + + current = MAX(image[indx + v][c], + MAX(image[indx - v][c], + MAX(image[indx - 2][c], image[indx + 2][c]))) - + MIN(image[indx + v][c], + MIN(image[indx - v][c], + MIN(image[indx - 2][c], image[indx + 2][c]))) + + MAX(image[indx + 1 + u][d], + MAX(image[indx + 1 - u][d], + MAX(image[indx - 1 + u][d], image[indx - 1 - u][d]))) - + MIN(image[indx + 1 + u][d], + MIN(image[indx + 1 - u][d], + MIN(image[indx - 1 + u][d], image[indx - 1 - u][d]))); + + current2 = + MAX(image2[indx + v][d], + MAX(image2[indx - v][d], + MAX(image2[indx - 2][d], image2[indx + 2][d]))) - + MIN(image2[indx + v][d], + MIN(image2[indx - v][d], + MIN(image2[indx - 2][d], image2[indx + 2][d]))) + + MAX(image2[indx + 1 + u][c], + MAX(image2[indx + 1 - u][c], + MAX(image2[indx - 1 + u][c], image2[indx - 1 - u][c]))) - + MIN(image2[indx + 1 + u][c], + MIN(image2[indx + 1 - u][c], + MIN(image2[indx - 1 + u][c], image2[indx - 1 - u][c]))); + + current3 = + MAX(image3[indx + v][d], + MAX(image3[indx - v][d], + MAX(image3[indx - 2][d], image3[indx + 2][d]))) - + MIN(image3[indx + v][d], + MIN(image3[indx - v][d], + MIN(image3[indx - 2][d], image3[indx + 2][d]))) + + MAX(image3[indx + 1 + u][c], + MAX(image3[indx + 1 - u][c], + MAX(image3[indx - 1 + u][c], image3[indx - 1 - u][c]))) - + MIN(image3[indx + 1 + u][c], + MIN(image3[indx + 1 - u][c], + MIN(image3[indx - 1 + u][c], image3[indx - 1 - u][c]))); + + if (ABS(current - current2) < ABS(current - current3)) + image[indx][1] = image2[indx][1]; + else + image[indx][1] = image3[indx][1]; + } +} + +// saves red and blue in image2 +void LibRaw::dcb_copy_to_buffer(float (*image2)[3]) +{ + int indx; + + for (indx = 0; indx < height * width; indx++) + { + image2[indx][0] = image[indx][0]; // R + image2[indx][2] = image[indx][2]; // B + } +} + +// restores red and blue from image2 +void LibRaw::dcb_restore_from_buffer(float (*image2)[3]) +{ + int indx; + + for (indx = 0; indx < height * width; indx++) + { + image[indx][0] = image2[indx][0]; // R + image[indx][2] = image2[indx][2]; // B + } +} + +// R and B smoothing using green contrast, all pixels except 2 pixel wide border +void LibRaw::dcb_pp() +{ + int g1, r1, b1, u = width, indx, row, col; + + for (row = 2; row < height - 2; row++) + for (col = 2, indx = row * u + col; col < width - 2; col++, indx++) + { + + r1 = (image[indx - 1][0] + image[indx + 1][0] + image[indx - u][0] + + image[indx + u][0] + image[indx - u - 1][0] + + image[indx + u + 1][0] + image[indx - u + 1][0] + + image[indx + u - 1][0]) / + 8.0; + g1 = (image[indx - 1][1] + image[indx + 1][1] + image[indx - u][1] + + image[indx + u][1] + image[indx - u - 1][1] + + image[indx + u + 1][1] + image[indx - u + 1][1] + + image[indx + u - 1][1]) / + 8.0; + b1 = (image[indx - 1][2] + image[indx + 1][2] + image[indx - u][2] + + image[indx + u][2] + image[indx - u - 1][2] + + image[indx + u + 1][2] + image[indx - u + 1][2] + + image[indx + u - 1][2]) / + 8.0; + + image[indx][0] = CLIP(r1 + (image[indx][1] - g1)); + image[indx][2] = CLIP(b1 + (image[indx][1] - g1)); + } +} + +// green blurring correction, helps to get the nyquist right +void LibRaw::dcb_nyquist() +{ + int row, col, c, u = width, v = 2 * u, indx; + + for (row = 2; row < height - 2; row++) + for (col = 2 + (FC(row, 2) & 1), indx = row * width + col, c = FC(row, col); + col < u - 2; col += 2, indx += 2) + { + + image[indx][1] = CLIP((image[indx + v][1] + image[indx - v][1] + + image[indx - 2][1] + image[indx + 2][1]) / + 4.0 + + image[indx][c] - + (image[indx + v][c] + image[indx - v][c] + + image[indx - 2][c] + image[indx + 2][c]) / + 4.0); + } +} + +// missing colors are interpolated using high quality algorithm by Luis Sanz +// Rodríguez +void LibRaw::dcb_color_full() +{ + int row, col, c, d, u = width, w = 3 * u, indx, g1, g2; + float f[4], g[4], (*chroma)[2]; + + chroma = (float(*)[2])calloc(width * height, sizeof *chroma); + + for (row = 1; row < height - 1; row++) + for (col = 1 + (FC(row, 1) & 1), indx = row * width + col, c = FC(row, col), + d = c / 2; + col < u - 1; col += 2, indx += 2) + chroma[indx][d] = image[indx][c] - image[indx][1]; + + for (row = 3; row < height - 3; row++) + for (col = 3 + (FC(row, 1) & 1), indx = row * width + col, + c = 1 - FC(row, col) / 2, d = 1 - c; + col < u - 3; col += 2, indx += 2) + { + f[0] = 1.0 / + (float)(1.0 + + fabs(chroma[indx - u - 1][c] - chroma[indx + u + 1][c]) + + fabs(chroma[indx - u - 1][c] - chroma[indx - w - 3][c]) + + fabs(chroma[indx + u + 1][c] - chroma[indx - w - 3][c])); + f[1] = 1.0 / + (float)(1.0 + + fabs(chroma[indx - u + 1][c] - chroma[indx + u - 1][c]) + + fabs(chroma[indx - u + 1][c] - chroma[indx - w + 3][c]) + + fabs(chroma[indx + u - 1][c] - chroma[indx - w + 3][c])); + f[2] = 1.0 / + (float)(1.0 + + fabs(chroma[indx + u - 1][c] - chroma[indx - u + 1][c]) + + fabs(chroma[indx + u - 1][c] - chroma[indx + w + 3][c]) + + fabs(chroma[indx - u + 1][c] - chroma[indx + w - 3][c])); + f[3] = 1.0 / + (float)(1.0 + + fabs(chroma[indx + u + 1][c] - chroma[indx - u - 1][c]) + + fabs(chroma[indx + u + 1][c] - chroma[indx + w - 3][c]) + + fabs(chroma[indx - u - 1][c] - chroma[indx + w + 3][c])); + g[0] = 1.325 * chroma[indx - u - 1][c] - 0.175 * chroma[indx - w - 3][c] - + 0.075 * chroma[indx - w - 1][c] - 0.075 * chroma[indx - u - 3][c]; + g[1] = 1.325 * chroma[indx - u + 1][c] - 0.175 * chroma[indx - w + 3][c] - + 0.075 * chroma[indx - w + 1][c] - 0.075 * chroma[indx - u + 3][c]; + g[2] = 1.325 * chroma[indx + u - 1][c] - 0.175 * chroma[indx + w - 3][c] - + 0.075 * chroma[indx + w - 1][c] - 0.075 * chroma[indx + u - 3][c]; + g[3] = 1.325 * chroma[indx + u + 1][c] - 0.175 * chroma[indx + w + 3][c] - + 0.075 * chroma[indx + w + 1][c] - 0.075 * chroma[indx + u + 3][c]; + chroma[indx][c] = + (f[0] * g[0] + f[1] * g[1] + f[2] * g[2] + f[3] * g[3]) / + (f[0] + f[1] + f[2] + f[3]); + } + for (row = 3; row < height - 3; row++) + for (col = 3 + (FC(row, 2) & 1), indx = row * width + col, + c = FC(row, col + 1) / 2; + col < u - 3; col += 2, indx += 2) + for (d = 0; d <= 1; c = 1 - c, d++) + { + f[0] = 1.0 / + (float)(1.0 + fabs(chroma[indx - u][c] - chroma[indx + u][c]) + + fabs(chroma[indx - u][c] - chroma[indx - w][c]) + + fabs(chroma[indx + u][c] - chroma[indx - w][c])); + f[1] = 1.0 / + (float)(1.0 + fabs(chroma[indx + 1][c] - chroma[indx - 1][c]) + + fabs(chroma[indx + 1][c] - chroma[indx + 3][c]) + + fabs(chroma[indx - 1][c] - chroma[indx + 3][c])); + f[2] = 1.0 / + (float)(1.0 + fabs(chroma[indx - 1][c] - chroma[indx + 1][c]) + + fabs(chroma[indx - 1][c] - chroma[indx - 3][c]) + + fabs(chroma[indx + 1][c] - chroma[indx - 3][c])); + f[3] = 1.0 / + (float)(1.0 + fabs(chroma[indx + u][c] - chroma[indx - u][c]) + + fabs(chroma[indx + u][c] - chroma[indx + w][c]) + + fabs(chroma[indx - u][c] - chroma[indx + w][c])); + + g[0] = 0.875 * chroma[indx - u][c] + 0.125 * chroma[indx - w][c]; + g[1] = 0.875 * chroma[indx + 1][c] + 0.125 * chroma[indx + 3][c]; + g[2] = 0.875 * chroma[indx - 1][c] + 0.125 * chroma[indx - 3][c]; + g[3] = 0.875 * chroma[indx + u][c] + 0.125 * chroma[indx + w][c]; + + chroma[indx][c] = + (f[0] * g[0] + f[1] * g[1] + f[2] * g[2] + f[3] * g[3]) / + (f[0] + f[1] + f[2] + f[3]); + } + + for (row = 6; row < height - 6; row++) + for (col = 6, indx = row * width + col; col < width - 6; col++, indx++) + { + image[indx][0] = CLIP(chroma[indx][0] + image[indx][1]); + image[indx][2] = CLIP(chroma[indx][1] + image[indx][1]); + + g1 = MIN( + image[indx + 1 + u][0], + MIN(image[indx + 1 - u][0], + MIN(image[indx - 1 + u][0], + MIN(image[indx - 1 - u][0], + MIN(image[indx - 1][0], + MIN(image[indx + 1][0], + MIN(image[indx - u][0], image[indx + u][0]))))))); + + g2 = MAX( + image[indx + 1 + u][0], + MAX(image[indx + 1 - u][0], + MAX(image[indx - 1 + u][0], + MAX(image[indx - 1 - u][0], + MAX(image[indx - 1][0], + MAX(image[indx + 1][0], + MAX(image[indx - u][0], image[indx + u][0]))))))); + + image[indx][0] = ULIM(image[indx][0], g2, g1); + + g1 = MIN( + image[indx + 1 + u][2], + MIN(image[indx + 1 - u][2], + MIN(image[indx - 1 + u][2], + MIN(image[indx - 1 - u][2], + MIN(image[indx - 1][2], + MIN(image[indx + 1][2], + MIN(image[indx - u][2], image[indx + u][2]))))))); + + g2 = MAX( + image[indx + 1 + u][2], + MAX(image[indx + 1 - u][2], + MAX(image[indx - 1 + u][2], + MAX(image[indx - 1 - u][2], + MAX(image[indx - 1][2], + MAX(image[indx + 1][2], + MAX(image[indx - u][2], image[indx + u][2]))))))); + + image[indx][2] = ULIM(image[indx][2], g2, g1); + } + + free(chroma); +} + +// green is used to create an interpolation direction map saved in image[][3] +// 1 = vertical +// 0 = horizontal +void LibRaw::dcb_map() +{ + int row, col, u = width, indx; + + for (row = 1; row < height - 1; row++) + { + for (col = 1, indx = row * width + col; col < width - 1; col++, indx++) + { + + if (image[indx][1] > (image[indx - 1][1] + image[indx + 1][1] + + image[indx - u][1] + image[indx + u][1]) / + 4.0) + image[indx][3] = ((MIN(image[indx - 1][1], image[indx + 1][1]) + + image[indx - 1][1] + image[indx + 1][1]) < + (MIN(image[indx - u][1], image[indx + u][1]) + + image[indx - u][1] + image[indx + u][1])); + else + image[indx][3] = ((MAX(image[indx - 1][1], image[indx + 1][1]) + + image[indx - 1][1] + image[indx + 1][1]) > + (MAX(image[indx - u][1], image[indx + u][1]) + + image[indx - u][1] + image[indx + u][1])); + } + } +} + +// interpolated green pixels are corrected using the map +void LibRaw::dcb_correction() +{ + int current, row, col, u = width, v = 2 * u, indx; + + for (row = 2; row < height - 2; row++) + for (col = 2 + (FC(row, 2) & 1), indx = row * width + col; col < u - 2; + col += 2, indx += 2) + { + + current = 4 * image[indx][3] + + 2 * (image[indx + u][3] + image[indx - u][3] + + image[indx + 1][3] + image[indx - 1][3]) + + image[indx + v][3] + image[indx - v][3] + image[indx + 2][3] + + image[indx - 2][3]; + + image[indx][1] = + ((16 - current) * (image[indx - 1][1] + image[indx + 1][1]) / 2.0 + + current * (image[indx - u][1] + image[indx + u][1]) / 2.0) / + 16.0; + } +} + +// interpolated green pixels are corrected using the map +// with contrast correction +void LibRaw::dcb_correction2() +{ + int current, row, col, c, u = width, v = 2 * u, indx; + + for (row = 4; row < height - 4; row++) + for (col = 4 + (FC(row, 2) & 1), indx = row * width + col, c = FC(row, col); + col < u - 4; col += 2, indx += 2) + { + + current = 4 * image[indx][3] + + 2 * (image[indx + u][3] + image[indx - u][3] + + image[indx + 1][3] + image[indx - 1][3]) + + image[indx + v][3] + image[indx - v][3] + image[indx + 2][3] + + image[indx - 2][3]; + + image[indx][1] = CLIP( + ((16 - current) * ((image[indx - 1][1] + image[indx + 1][1]) / 2.0 + + image[indx][c] - + (image[indx + 2][c] + image[indx - 2][c]) / 2.0) + + current * ((image[indx - u][1] + image[indx + u][1]) / 2.0 + + image[indx][c] - + (image[indx + v][c] + image[indx - v][c]) / 2.0)) / + 16.0); + } +} + +void LibRaw::dcb_refinement() +{ + int row, col, c, u = width, v = 2 * u, w = 3 * u, indx, current; + float f[5], g1, g2; + + for (row = 4; row < height - 4; row++) + for (col = 4 + (FC(row, 2) & 1), indx = row * width + col, c = FC(row, col); + col < u - 4; col += 2, indx += 2) + { + + current = 4 * image[indx][3] + + 2 * (image[indx + u][3] + image[indx - u][3] + + image[indx + 1][3] + image[indx - 1][3]) + + image[indx + v][3] + image[indx - v][3] + image[indx - 2][3] + + image[indx + 2][3]; + + if (image[indx][c] > 1) + { + + f[0] = (float)(image[indx - u][1] + image[indx + u][1]) / + (2 * image[indx][c]); + + if (image[indx - v][c] > 0) + f[1] = 2 * (float)image[indx - u][1] / + (image[indx - v][c] + image[indx][c]); + else + f[1] = f[0]; + + if (image[indx - v][c] > 0) + f[2] = (float)(image[indx - u][1] + image[indx - w][1]) / + (2 * image[indx - v][c]); + else + f[2] = f[0]; + + if (image[indx + v][c] > 0) + f[3] = 2 * (float)image[indx + u][1] / + (image[indx + v][c] + image[indx][c]); + else + f[3] = f[0]; + + if (image[indx + v][c] > 0) + f[4] = (float)(image[indx + u][1] + image[indx + w][1]) / + (2 * image[indx + v][c]); + else + f[4] = f[0]; + + g1 = (5 * f[0] + 3 * f[1] + f[2] + 3 * f[3] + f[4]) / 13.0; + + f[0] = (float)(image[indx - 1][1] + image[indx + 1][1]) / + (2 * image[indx][c]); + + if (image[indx - 2][c] > 0) + f[1] = 2 * (float)image[indx - 1][1] / + (image[indx - 2][c] + image[indx][c]); + else + f[1] = f[0]; + + if (image[indx - 2][c] > 0) + f[2] = (float)(image[indx - 1][1] + image[indx - 3][1]) / + (2 * image[indx - 2][c]); + else + f[2] = f[0]; + + if (image[indx + 2][c] > 0) + f[3] = 2 * (float)image[indx + 1][1] / + (image[indx + 2][c] + image[indx][c]); + else + f[3] = f[0]; + + if (image[indx + 2][c] > 0) + f[4] = (float)(image[indx + 1][1] + image[indx + 3][1]) / + (2 * image[indx + 2][c]); + else + f[4] = f[0]; + + g2 = (5 * f[0] + 3 * f[1] + f[2] + 3 * f[3] + f[4]) / 13.0; + + image[indx][1] = CLIP((image[indx][c]) * + (current * g1 + (16 - current) * g2) / 16.0); + } + else + image[indx][1] = image[indx][c]; + + // get rid of overshooted pixels + + g1 = MIN( + image[indx + 1 + u][1], + MIN(image[indx + 1 - u][1], + MIN(image[indx - 1 + u][1], + MIN(image[indx - 1 - u][1], + MIN(image[indx - 1][1], + MIN(image[indx + 1][1], + MIN(image[indx - u][1], image[indx + u][1]))))))); + + g2 = MAX( + image[indx + 1 + u][1], + MAX(image[indx + 1 - u][1], + MAX(image[indx - 1 + u][1], + MAX(image[indx - 1 - u][1], + MAX(image[indx - 1][1], + MAX(image[indx + 1][1], + MAX(image[indx - u][1], image[indx + u][1]))))))); + + image[indx][1] = ULIM(image[indx][1], g2, g1); + } +} + +// converts RGB to LCH colorspace and saves it to image3 +void LibRaw::rgb_to_lch(double (*image2)[3]) +{ + int indx; + for (indx = 0; indx < height * width; indx++) + { + + image2[indx][0] = image[indx][0] + image[indx][1] + image[indx][2]; // L + image2[indx][1] = 1.732050808 * (image[indx][0] - image[indx][1]); // C + image2[indx][2] = + 2.0 * image[indx][2] - image[indx][0] - image[indx][1]; // H + } +} + +// converts LCH to RGB colorspace and saves it back to image +void LibRaw::lch_to_rgb(double (*image2)[3]) +{ + int indx; + for (indx = 0; indx < height * width; indx++) + { + + image[indx][0] = CLIP(image2[indx][0] / 3.0 - image2[indx][2] / 6.0 + + image2[indx][1] / 3.464101615); + image[indx][1] = CLIP(image2[indx][0] / 3.0 - image2[indx][2] / 6.0 - + image2[indx][1] / 3.464101615); + image[indx][2] = CLIP(image2[indx][0] / 3.0 + image2[indx][2] / 3.0); + } +} + +// denoising using interpolated neighbours +void LibRaw::fbdd_correction() +{ + int row, col, c, u = width, indx; + + for (row = 2; row < height - 2; row++) + { + for (col = 2, indx = row * width + col; col < width - 2; col++, indx++) + { + + c = fcol(row, col); + + image[indx][c] = + ULIM(image[indx][c], + MAX(image[indx - 1][c], + MAX(image[indx + 1][c], + MAX(image[indx - u][c], image[indx + u][c]))), + MIN(image[indx - 1][c], + MIN(image[indx + 1][c], + MIN(image[indx - u][c], image[indx + u][c])))); + } + } +} + +// corrects chroma noise +void LibRaw::fbdd_correction2(double (*image2)[3]) +{ + int indx, v = 2 * width; + int col, row; + double Co, Ho, ratio; + + for (row = 6; row < height - 6; row++) + { + for (col = 6; col < width - 6; col++) + { + indx = row * width + col; + + if (image2[indx][1] * image2[indx][2] != 0) + { + Co = (image2[indx + v][1] + image2[indx - v][1] + image2[indx - 2][1] + + image2[indx + 2][1] - + MAX(image2[indx - 2][1], + MAX(image2[indx + 2][1], + MAX(image2[indx - v][1], image2[indx + v][1]))) - + MIN(image2[indx - 2][1], + MIN(image2[indx + 2][1], + MIN(image2[indx - v][1], image2[indx + v][1])))) / + 2.0; + Ho = (image2[indx + v][2] + image2[indx - v][2] + image2[indx - 2][2] + + image2[indx + 2][2] - + MAX(image2[indx - 2][2], + MAX(image2[indx + 2][2], + MAX(image2[indx - v][2], image2[indx + v][2]))) - + MIN(image2[indx - 2][2], + MIN(image2[indx + 2][2], + MIN(image2[indx - v][2], image2[indx + v][2])))) / + 2.0; + ratio = sqrt((Co * Co + Ho * Ho) / (image2[indx][1] * image2[indx][1] + + image2[indx][2] * image2[indx][2])); + + if (ratio < 0.85) + { + image2[indx][0] = + -(image2[indx][1] + image2[indx][2] - Co - Ho) + image2[indx][0]; + image2[indx][1] = Co; + image2[indx][2] = Ho; + } + } + } + } +} + +// Cubic Spline Interpolation by Li and Randhawa, modified by Jacek Gozdz and +// Luis Sanz Rodríguez +void LibRaw::fbdd_green() +{ + int row, col, c, u = width, v = 2 * u, w = 3 * u, x = 4 * u, y = 5 * u, indx, + min, max; + float f[4], g[4]; + + for (row = 5; row < height - 5; row++) + for (col = 5 + (FC(row, 1) & 1), indx = row * width + col, c = FC(row, col); + col < u - 5; col += 2, indx += 2) + { + + f[0] = 1.0 / (1.0 + abs(image[indx - u][1] - image[indx - w][1]) + + abs(image[indx - w][1] - image[indx + y][1])); + f[1] = 1.0 / (1.0 + abs(image[indx + 1][1] - image[indx + 3][1]) + + abs(image[indx + 3][1] - image[indx - 5][1])); + f[2] = 1.0 / (1.0 + abs(image[indx - 1][1] - image[indx - 3][1]) + + abs(image[indx - 3][1] - image[indx + 5][1])); + f[3] = 1.0 / (1.0 + abs(image[indx + u][1] - image[indx + w][1]) + + abs(image[indx + w][1] - image[indx - y][1])); + + g[0] = CLIP((23 * image[indx - u][1] + 23 * image[indx - w][1] + + 2 * image[indx - y][1] + + 8 * (image[indx - v][c] - image[indx - x][c]) + + 40 * (image[indx][c] - image[indx - v][c])) / + 48.0); + g[1] = CLIP((23 * image[indx + 1][1] + 23 * image[indx + 3][1] + + 2 * image[indx + 5][1] + + 8 * (image[indx + 2][c] - image[indx + 4][c]) + + 40 * (image[indx][c] - image[indx + 2][c])) / + 48.0); + g[2] = CLIP((23 * image[indx - 1][1] + 23 * image[indx - 3][1] + + 2 * image[indx - 5][1] + + 8 * (image[indx - 2][c] - image[indx - 4][c]) + + 40 * (image[indx][c] - image[indx - 2][c])) / + 48.0); + g[3] = CLIP((23 * image[indx + u][1] + 23 * image[indx + w][1] + + 2 * image[indx + y][1] + + 8 * (image[indx + v][c] - image[indx + x][c]) + + 40 * (image[indx][c] - image[indx + v][c])) / + 48.0); + + image[indx][1] = + CLIP((f[0] * g[0] + f[1] * g[1] + f[2] * g[2] + f[3] * g[3]) / + (f[0] + f[1] + f[2] + f[3])); + + min = MIN( + image[indx + 1 + u][1], + MIN(image[indx + 1 - u][1], + MIN(image[indx - 1 + u][1], + MIN(image[indx - 1 - u][1], + MIN(image[indx - 1][1], + MIN(image[indx + 1][1], + MIN(image[indx - u][1], image[indx + u][1]))))))); + + max = MAX( + image[indx + 1 + u][1], + MAX(image[indx + 1 - u][1], + MAX(image[indx - 1 + u][1], + MAX(image[indx - 1 - u][1], + MAX(image[indx - 1][1], + MAX(image[indx + 1][1], + MAX(image[indx - u][1], image[indx + u][1]))))))); + + image[indx][1] = ULIM(image[indx][1], max, min); + } +} + +// FBDD (Fake Before Demosaicing Denoising) +void LibRaw::fbdd(int noiserd) +{ + double(*image2)[3]; + // safety net: disable for 4-color bayer or full-color images + if (colors != 3 || !filters) + return; + image2 = (double(*)[3])calloc(width * height, sizeof *image2); + + border_interpolate(4); + + if (noiserd > 1) + { + fbdd_green(); + // dcb_color_full(image2); + dcb_color_full(); + fbdd_correction(); + + dcb_color(); + rgb_to_lch(image2); + fbdd_correction2(image2); + fbdd_correction2(image2); + lch_to_rgb(image2); + } + else + { + fbdd_green(); + // dcb_color_full(image2); + dcb_color_full(); + fbdd_correction(); + } + + free(image2); +} + +// DCB demosaicing main routine +void LibRaw::dcb(int iterations, int dcb_enhance) +{ + + int i = 1; + + float(*image2)[3]; + image2 = (float(*)[3])calloc(width * height, sizeof *image2); + + float(*image3)[3]; + image3 = (float(*)[3])calloc(width * height, sizeof *image3); + + border_interpolate(6); + + dcb_hor(image2); + dcb_color2(image2); + + dcb_ver(image3); + dcb_color3(image3); + + dcb_decide(image2, image3); + + free(image3); + + dcb_copy_to_buffer(image2); + + while (i <= iterations) + { + dcb_nyquist(); + dcb_nyquist(); + dcb_nyquist(); + dcb_map(); + dcb_correction(); + i++; + } + + dcb_color(); + dcb_pp(); + + dcb_map(); + dcb_correction2(); + + dcb_map(); + dcb_correction(); + + dcb_map(); + dcb_correction(); + + dcb_map(); + dcb_correction(); + + dcb_map(); + dcb_restore_from_buffer(image2); + dcb_color(); + + if (dcb_enhance) + { + dcb_refinement(); + // dcb_color_full(image2); + dcb_color_full(); + } + + free(image2); +} diff --git a/rtengine/libraw/src/demosaic/dht_demosaic.cpp b/rtengine/libraw/src/demosaic/dht_demosaic.cpp new file mode 100644 index 000000000..bff8f77b0 --- /dev/null +++ b/rtengine/libraw/src/demosaic/dht_demosaic.cpp @@ -0,0 +1,1033 @@ +/* -*- C++ -*- + * File: dht_demosaic.cpp + * Copyright 2013 Anton Petrusevich + * Created: Tue Apr 9, 2013 + * + * This code is licensed under one of two licenses as you choose: + * + * 1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + * (See file LICENSE.LGPL provided in LibRaw distribution archive for + * details). + * + * 2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + * (See file LICENSE.CDDL provided in LibRaw distribution archive for + * details). + * + */ + +/* + * функция вычисляет яркостную дистанцию. + * если две яркости отличаются в два раза, например 10 и 20, то они имеют такой + * же вес при принятии решения об интерполировании, как и 100 и 200 -- + * фотографическая яркость между ними 1 стоп. дистанция всегда >=1 + */ + +#include "../../internal/dmp_include.h" + +static inline float calc_dist(float c1, float c2) +{ + return c1 > c2 ? c1 / c2 : c2 / c1; +} + +struct DHT +{ + int nr_height, nr_width; + static const int nr_topmargin = 4, nr_leftmargin = 4; + float (*nraw)[3]; + ushort channel_maximum[3]; + float channel_minimum[3]; + LibRaw &libraw; + enum + { + HVSH = 1, + HOR = 2, + VER = 4, + HORSH = HOR | HVSH, + VERSH = VER | HVSH, + DIASH = 8, + LURD = 16, + RULD = 32, + LURDSH = LURD | DIASH, + RULDSH = RULD | DIASH, + HOT = 64 + }; + static inline float Thot(void) throw() { return 64.0f; } + static inline float Tg(void) throw() { return 256.0f; } + static inline float T(void) throw() { return 1.4f; } + char *ndir; + inline int nr_offset(int row, int col) throw() + { + return (row * nr_width + col); + } + int get_hv_grb(int x, int y, int kc) + { + float hv1 = 2 * nraw[nr_offset(y - 1, x)][1] / + (nraw[nr_offset(y - 2, x)][kc] + nraw[nr_offset(y, x)][kc]); + float hv2 = 2 * nraw[nr_offset(y + 1, x)][1] / + (nraw[nr_offset(y + 2, x)][kc] + nraw[nr_offset(y, x)][kc]); + float kv = calc_dist(hv1, hv2) * + calc_dist(nraw[nr_offset(y, x)][kc] * nraw[nr_offset(y, x)][kc], + (nraw[nr_offset(y - 2, x)][kc] * + nraw[nr_offset(y + 2, x)][kc])); + kv *= kv; + kv *= kv; + kv *= kv; + float dv = + kv * + calc_dist(nraw[nr_offset(y - 3, x)][1] * nraw[nr_offset(y + 3, x)][1], + nraw[nr_offset(y - 1, x)][1] * nraw[nr_offset(y + 1, x)][1]); + float hh1 = 2 * nraw[nr_offset(y, x - 1)][1] / + (nraw[nr_offset(y, x - 2)][kc] + nraw[nr_offset(y, x)][kc]); + float hh2 = 2 * nraw[nr_offset(y, x + 1)][1] / + (nraw[nr_offset(y, x + 2)][kc] + nraw[nr_offset(y, x)][kc]); + float kh = calc_dist(hh1, hh2) * + calc_dist(nraw[nr_offset(y, x)][kc] * nraw[nr_offset(y, x)][kc], + (nraw[nr_offset(y, x - 2)][kc] * + nraw[nr_offset(y, x + 2)][kc])); + kh *= kh; + kh *= kh; + kh *= kh; + float dh = + kh * + calc_dist(nraw[nr_offset(y, x - 3)][1] * nraw[nr_offset(y, x + 3)][1], + nraw[nr_offset(y, x - 1)][1] * nraw[nr_offset(y, x + 1)][1]); + float e = calc_dist(dh, dv); + char d = dh < dv ? (e > Tg() ? HORSH : HOR) : (e > Tg() ? VERSH : VER); + return d; + } + int get_hv_rbg(int x, int y, int hc) + { + float hv1 = 2 * nraw[nr_offset(y - 1, x)][hc ^ 2] / + (nraw[nr_offset(y - 2, x)][1] + nraw[nr_offset(y, x)][1]); + float hv2 = 2 * nraw[nr_offset(y + 1, x)][hc ^ 2] / + (nraw[nr_offset(y + 2, x)][1] + nraw[nr_offset(y, x)][1]); + float kv = calc_dist(hv1, hv2) * + calc_dist(nraw[nr_offset(y, x)][1] * nraw[nr_offset(y, x)][1], + (nraw[nr_offset(y - 2, x)][1] * + nraw[nr_offset(y + 2, x)][1])); + kv *= kv; + kv *= kv; + kv *= kv; + float dv = kv * calc_dist(nraw[nr_offset(y - 3, x)][hc ^ 2] * + nraw[nr_offset(y + 3, x)][hc ^ 2], + nraw[nr_offset(y - 1, x)][hc ^ 2] * + nraw[nr_offset(y + 1, x)][hc ^ 2]); + float hh1 = 2 * nraw[nr_offset(y, x - 1)][hc] / + (nraw[nr_offset(y, x - 2)][1] + nraw[nr_offset(y, x)][1]); + float hh2 = 2 * nraw[nr_offset(y, x + 1)][hc] / + (nraw[nr_offset(y, x + 2)][1] + nraw[nr_offset(y, x)][1]); + float kh = calc_dist(hh1, hh2) * + calc_dist(nraw[nr_offset(y, x)][1] * nraw[nr_offset(y, x)][1], + (nraw[nr_offset(y, x - 2)][1] * + nraw[nr_offset(y, x + 2)][1])); + kh *= kh; + kh *= kh; + kh *= kh; + float dh = + kh * calc_dist( + nraw[nr_offset(y, x - 3)][hc] * nraw[nr_offset(y, x + 3)][hc], + nraw[nr_offset(y, x - 1)][hc] * nraw[nr_offset(y, x + 1)][hc]); + float e = calc_dist(dh, dv); + char d = dh < dv ? (e > Tg() ? HORSH : HOR) : (e > Tg() ? VERSH : VER); + return d; + } + int get_diag_grb(int x, int y, int kc) + { + float hlu = + nraw[nr_offset(y - 1, x - 1)][1] / nraw[nr_offset(y - 1, x - 1)][kc]; + float hrd = + nraw[nr_offset(y + 1, x + 1)][1] / nraw[nr_offset(y + 1, x + 1)][kc]; + float dlurd = + calc_dist(hlu, hrd) * + calc_dist(nraw[nr_offset(y - 1, x - 1)][1] * + nraw[nr_offset(y + 1, x + 1)][1], + nraw[nr_offset(y, x)][1] * nraw[nr_offset(y, x)][1]); + float druld = + calc_dist(hlu, hrd) * + calc_dist(nraw[nr_offset(y - 1, x + 1)][1] * + nraw[nr_offset(y + 1, x - 1)][1], + nraw[nr_offset(y, x)][1] * nraw[nr_offset(y, x)][1]); + float e = calc_dist(dlurd, druld); + char d = + druld < dlurd ? (e > T() ? RULDSH : RULD) : (e > T() ? LURDSH : LURD); + return d; + } + int get_diag_rbg(int x, int y, int /* hc */) + { + float dlurd = calc_dist( + nraw[nr_offset(y - 1, x - 1)][1] * nraw[nr_offset(y + 1, x + 1)][1], + nraw[nr_offset(y, x)][1] * nraw[nr_offset(y, x)][1]); + float druld = calc_dist( + nraw[nr_offset(y - 1, x + 1)][1] * nraw[nr_offset(y + 1, x - 1)][1], + nraw[nr_offset(y, x)][1] * nraw[nr_offset(y, x)][1]); + float e = calc_dist(dlurd, druld); + char d = + druld < dlurd ? (e > T() ? RULDSH : RULD) : (e > T() ? LURDSH : LURD); + return d; + } + static inline float scale_over(float ec, float base) + { + float s = base * .4; + float o = ec - base; + return base + sqrt(s * (o + s)) - s; + } + static inline float scale_under(float ec, float base) + { + float s = base * .6; + float o = base - ec; + return base - sqrt(s * (o + s)) + s; + } + ~DHT(); + DHT(LibRaw &_libraw); + void copy_to_image(); + void make_greens(); + void make_diag_dirs(); + void make_hv_dirs(); + void refine_hv_dirs(int i, int js); + void refine_diag_dirs(int i, int js); + void refine_ihv_dirs(int i); + void refine_idiag_dirs(int i); + void illustrate_dirs(); + void illustrate_dline(int i); + void make_hv_dline(int i); + void make_diag_dline(int i); + void make_gline(int i); + void make_rbdiag(int i); + void make_rbhv(int i); + void make_rb(); + void hide_hots(); + void restore_hots(); +}; + +typedef float float3[3]; + +/* + * информация о цветах копируется во float в общем то с одной целью -- чтобы + * вместо 0 можно было писать 0.5, что больше подходит для вычисления яркостной + * разницы. причина: в целых числах разница в 1 стоп составляет ряд 8,4,2,1,0 -- + * последнее число должно быть 0.5, которое непредствамио в целых числах. так же + * это изменение позволяет не думать о специальных случаях деления на ноль. + * + * альтернативное решение: умножить все данные на 2 и в младший бит внести 1. + * правда, всё равно придётся следить, чтобы при интерпретации зелёного цвета не + * получился 0 при округлении, иначе проблема при интерпретации синих и красных. + * + */ +DHT::DHT(LibRaw &_libraw) : libraw(_libraw) +{ + nr_height = libraw.imgdata.sizes.iheight + nr_topmargin * 2; + nr_width = libraw.imgdata.sizes.iwidth + nr_leftmargin * 2; + nraw = (float3 *)malloc(nr_height * nr_width * sizeof(float3)); + int iwidth = libraw.imgdata.sizes.iwidth; + ndir = (char *)calloc(nr_height * nr_width, 1); + channel_maximum[0] = channel_maximum[1] = channel_maximum[2] = 0; + channel_minimum[0] = libraw.imgdata.image[0][0]; + channel_minimum[1] = libraw.imgdata.image[0][1]; + channel_minimum[2] = libraw.imgdata.image[0][2]; + for (int i = 0; i < nr_height * nr_width; ++i) + nraw[i][0] = nraw[i][1] = nraw[i][2] = 0.5; + for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) + { + int col_cache[48]; + for (int j = 0; j < 48; ++j) + { + int l = libraw.COLOR(i, j); + if (l == 3) + l = 1; + col_cache[j] = l; + } + for (int j = 0; j < iwidth; ++j) + { + int l = col_cache[j % 48]; + unsigned short c = libraw.imgdata.image[i * iwidth + j][l]; + if (c != 0) + { + if (channel_maximum[l] < c) + channel_maximum[l] = c; + if (channel_minimum[l] > c) + channel_minimum[l] = c; + nraw[nr_offset(i + nr_topmargin, j + nr_leftmargin)][l] = (float)c; + } + } + } + channel_minimum[0] += .5; + channel_minimum[1] += .5; + channel_minimum[2] += .5; +} + +void DHT::hide_hots() +{ + int iwidth = libraw.imgdata.sizes.iwidth; +#if defined(LIBRAW_USE_OPENMP) +#pragma omp parallel for schedule(guided) firstprivate(iwidth) +#endif + for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) + { + int js = libraw.COLOR(i, 0) & 1; + int kc = libraw.COLOR(i, js); + /* + * js -- начальная х-координата, которая попадает мимо известного зелёного + * kc -- известный цвет в точке интерполирования + */ + for (int j = js; j < iwidth; j += 2) + { + int x = j + nr_leftmargin; + int y = i + nr_topmargin; + float c = nraw[nr_offset(y, x)][kc]; + if ((c > nraw[nr_offset(y, x + 2)][kc] && + c > nraw[nr_offset(y, x - 2)][kc] && + c > nraw[nr_offset(y - 2, x)][kc] && + c > nraw[nr_offset(y + 2, x)][kc] && + c > nraw[nr_offset(y, x + 1)][1] && + c > nraw[nr_offset(y, x - 1)][1] && + c > nraw[nr_offset(y - 1, x)][1] && + c > nraw[nr_offset(y + 1, x)][1]) || + (c < nraw[nr_offset(y, x + 2)][kc] && + c < nraw[nr_offset(y, x - 2)][kc] && + c < nraw[nr_offset(y - 2, x)][kc] && + c < nraw[nr_offset(y + 2, x)][kc] && + c < nraw[nr_offset(y, x + 1)][1] && + c < nraw[nr_offset(y, x - 1)][1] && + c < nraw[nr_offset(y - 1, x)][1] && + c < nraw[nr_offset(y + 1, x)][1])) + { + float avg = 0; + for (int k = -2; k < 3; k += 2) + for (int m = -2; m < 3; m += 2) + if (m == 0 && k == 0) + continue; + else + avg += nraw[nr_offset(y + k, x + m)][kc]; + avg /= 8; + // float dev = 0; + // for (int k = -2; k < 3; k += 2) + // for (int l = -2; l < 3; l += 2) + // if (k == 0 && l == 0) + // continue; + // else { + // float t = nraw[nr_offset(y + k, x + l)][kc] - + //avg; dev += t * t; + // } + // dev /= 8; + // dev = sqrt(dev); + if (calc_dist(c, avg) > Thot()) + { + ndir[nr_offset(y, x)] |= HOT; + float dv = calc_dist( + nraw[nr_offset(y - 2, x)][kc] * nraw[nr_offset(y - 1, x)][1], + nraw[nr_offset(y + 2, x)][kc] * nraw[nr_offset(y + 1, x)][1]); + float dh = calc_dist( + nraw[nr_offset(y, x - 2)][kc] * nraw[nr_offset(y, x - 1)][1], + nraw[nr_offset(y, x + 2)][kc] * nraw[nr_offset(y, x + 1)][1]); + if (dv > dh) + nraw[nr_offset(y, x)][kc] = (nraw[nr_offset(y, x + 2)][kc] + + nraw[nr_offset(y, x - 2)][kc]) / + 2; + else + nraw[nr_offset(y, x)][kc] = (nraw[nr_offset(y - 2, x)][kc] + + nraw[nr_offset(y + 2, x)][kc]) / + 2; + } + } + } + for (int j = js ^ 1; j < iwidth; j += 2) + { + int x = j + nr_leftmargin; + int y = i + nr_topmargin; + float c = nraw[nr_offset(y, x)][1]; + if ((c > nraw[nr_offset(y, x + 2)][1] && + c > nraw[nr_offset(y, x - 2)][1] && + c > nraw[nr_offset(y - 2, x)][1] && + c > nraw[nr_offset(y + 2, x)][1] && + c > nraw[nr_offset(y, x + 1)][kc] && + c > nraw[nr_offset(y, x - 1)][kc] && + c > nraw[nr_offset(y - 1, x)][kc ^ 2] && + c > nraw[nr_offset(y + 1, x)][kc ^ 2]) || + (c < nraw[nr_offset(y, x + 2)][1] && + c < nraw[nr_offset(y, x - 2)][1] && + c < nraw[nr_offset(y - 2, x)][1] && + c < nraw[nr_offset(y + 2, x)][1] && + c < nraw[nr_offset(y, x + 1)][kc] && + c < nraw[nr_offset(y, x - 1)][kc] && + c < nraw[nr_offset(y - 1, x)][kc ^ 2] && + c < nraw[nr_offset(y + 1, x)][kc ^ 2])) + { + float avg = 0; + for (int k = -2; k < 3; k += 2) + for (int m = -2; m < 3; m += 2) + if (k == 0 && m == 0) + continue; + else + avg += nraw[nr_offset(y + k, x + m)][1]; + avg /= 8; + // float dev = 0; + // for (int k = -2; k < 3; k += 2) + // for (int l = -2; l < 3; l += 2) + // if (k == 0 && l == 0) + // continue; + // else { + // float t = nraw[nr_offset(y + k, x + l)][1] - + //avg; dev += t * t; + // } + // dev /= 8; + // dev = sqrt(dev); + if (calc_dist(c, avg) > Thot()) + { + ndir[nr_offset(y, x)] |= HOT; + float dv = calc_dist( + nraw[nr_offset(y - 2, x)][1] * nraw[nr_offset(y - 1, x)][kc ^ 2], + nraw[nr_offset(y + 2, x)][1] * nraw[nr_offset(y + 1, x)][kc ^ 2]); + float dh = calc_dist( + nraw[nr_offset(y, x - 2)][1] * nraw[nr_offset(y, x - 1)][kc], + nraw[nr_offset(y, x + 2)][1] * nraw[nr_offset(y, x + 1)][kc]); + if (dv > dh) + nraw[nr_offset(y, x)][1] = + (nraw[nr_offset(y, x + 2)][1] + nraw[nr_offset(y, x - 2)][1]) / + 2; + else + nraw[nr_offset(y, x)][1] = + (nraw[nr_offset(y - 2, x)][1] + nraw[nr_offset(y + 2, x)][1]) / + 2; + } + } + } + } +} + +void DHT::restore_hots() +{ + int iwidth = libraw.imgdata.sizes.iwidth; +#if defined(LIBRAW_USE_OPENMP) +#ifdef _MSC_VER +#pragma omp parallel for firstprivate(iwidth) +#else +#pragma omp parallel for schedule(guided) firstprivate(iwidth) collapse(2) +#endif +#endif + for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) + { + for (int j = 0; j < iwidth; ++j) + { + int x = j + nr_leftmargin; + int y = i + nr_topmargin; + if (ndir[nr_offset(y, x)] & HOT) + { + int l = libraw.COLOR(i, j); + nraw[nr_offset(i + nr_topmargin, j + nr_leftmargin)][l] = + libraw.imgdata.image[i * iwidth + j][l]; + } + } + } +} + +void DHT::make_diag_dirs() +{ +#if defined(LIBRAW_USE_OPENMP) +#pragma omp parallel for schedule(guided) +#endif + for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) + { + make_diag_dline(i); + } +//#if defined(LIBRAW_USE_OPENMP) +//#pragma omp parallel for schedule(guided) +//#endif +// for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) { +// refine_diag_dirs(i, i & 1); +// } +//#if defined(LIBRAW_USE_OPENMP) +//#pragma omp parallel for schedule(guided) +//#endif +// for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) { +// refine_diag_dirs(i, (i & 1) ^ 1); +// } +#if defined(LIBRAW_USE_OPENMP) +#pragma omp parallel for schedule(guided) +#endif + for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) + { + refine_idiag_dirs(i); + } +} + +void DHT::make_hv_dirs() +{ +#if defined(LIBRAW_USE_OPENMP) +#pragma omp parallel for schedule(guided) +#endif + for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) + { + make_hv_dline(i); + } +#if defined(LIBRAW_USE_OPENMP) +#pragma omp parallel for schedule(guided) +#endif + for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) + { + refine_hv_dirs(i, i & 1); + } +#if defined(LIBRAW_USE_OPENMP) +#pragma omp parallel for schedule(guided) +#endif + for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) + { + refine_hv_dirs(i, (i & 1) ^ 1); + } +#if defined(LIBRAW_USE_OPENMP) +#pragma omp parallel for schedule(guided) +#endif + for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) + { + refine_ihv_dirs(i); + } +} + +void DHT::refine_hv_dirs(int i, int js) +{ + int iwidth = libraw.imgdata.sizes.iwidth; + for (int j = js; j < iwidth; j += 2) + { + int x = j + nr_leftmargin; + int y = i + nr_topmargin; + if (ndir[nr_offset(y, x)] & HVSH) + continue; + int nv = + (ndir[nr_offset(y - 1, x)] & VER) + (ndir[nr_offset(y + 1, x)] & VER) + + (ndir[nr_offset(y, x - 1)] & VER) + (ndir[nr_offset(y, x + 1)] & VER); + int nh = + (ndir[nr_offset(y - 1, x)] & HOR) + (ndir[nr_offset(y + 1, x)] & HOR) + + (ndir[nr_offset(y, x - 1)] & HOR) + (ndir[nr_offset(y, x + 1)] & HOR); + bool codir = (ndir[nr_offset(y, x)] & VER) + ? ((ndir[nr_offset(y - 1, x)] & VER) || + (ndir[nr_offset(y + 1, x)] & VER)) + : ((ndir[nr_offset(y, x - 1)] & HOR) || + (ndir[nr_offset(y, x + 1)] & HOR)); + nv /= VER; + nh /= HOR; + if ((ndir[nr_offset(y, x)] & VER) && (nh > 2 && !codir)) + { + ndir[nr_offset(y, x)] &= ~VER; + ndir[nr_offset(y, x)] |= HOR; + } + if ((ndir[nr_offset(y, x)] & HOR) && (nv > 2 && !codir)) + { + ndir[nr_offset(y, x)] &= ~HOR; + ndir[nr_offset(y, x)] |= VER; + } + } +} + +void DHT::refine_ihv_dirs(int i) +{ + int iwidth = libraw.imgdata.sizes.iwidth; + for (int j = 0; j < iwidth; j++) + { + int x = j + nr_leftmargin; + int y = i + nr_topmargin; + if (ndir[nr_offset(y, x)] & HVSH) + continue; + int nv = + (ndir[nr_offset(y - 1, x)] & VER) + (ndir[nr_offset(y + 1, x)] & VER) + + (ndir[nr_offset(y, x - 1)] & VER) + (ndir[nr_offset(y, x + 1)] & VER); + int nh = + (ndir[nr_offset(y - 1, x)] & HOR) + (ndir[nr_offset(y + 1, x)] & HOR) + + (ndir[nr_offset(y, x - 1)] & HOR) + (ndir[nr_offset(y, x + 1)] & HOR); + nv /= VER; + nh /= HOR; + if ((ndir[nr_offset(y, x)] & VER) && nh > 3) + { + ndir[nr_offset(y, x)] &= ~VER; + ndir[nr_offset(y, x)] |= HOR; + } + if ((ndir[nr_offset(y, x)] & HOR) && nv > 3) + { + ndir[nr_offset(y, x)] &= ~HOR; + ndir[nr_offset(y, x)] |= VER; + } + } +} +void DHT::make_hv_dline(int i) +{ + int iwidth = libraw.imgdata.sizes.iwidth; + int js = libraw.COLOR(i, 0) & 1; + int kc = libraw.COLOR(i, js); + /* + * js -- начальная х-координата, которая попадает мимо известного зелёного + * kc -- известный цвет в точке интерполирования + */ + for (int j = 0; j < iwidth; j++) + { + int x = j + nr_leftmargin; + int y = i + nr_topmargin; + char d = 0; + if ((j & 1) == js) + { + d = get_hv_grb(x, y, kc); + } + else + { + d = get_hv_rbg(x, y, kc); + } + ndir[nr_offset(y, x)] |= d; + } +} + +void DHT::make_diag_dline(int i) +{ + int iwidth = libraw.imgdata.sizes.iwidth; + int js = libraw.COLOR(i, 0) & 1; + int kc = libraw.COLOR(i, js); + /* + * js -- начальная х-координата, которая попадает мимо известного зелёного + * kc -- известный цвет в точке интерполирования + */ + for (int j = 0; j < iwidth; j++) + { + int x = j + nr_leftmargin; + int y = i + nr_topmargin; + char d = 0; + if ((j & 1) == js) + { + d = get_diag_grb(x, y, kc); + } + else + { + d = get_diag_rbg(x, y, kc); + } + ndir[nr_offset(y, x)] |= d; + } +} + +void DHT::refine_diag_dirs(int i, int js) +{ + int iwidth = libraw.imgdata.sizes.iwidth; + for (int j = js; j < iwidth; j += 2) + { + int x = j + nr_leftmargin; + int y = i + nr_topmargin; + if (ndir[nr_offset(y, x)] & DIASH) + continue; + int nv = (ndir[nr_offset(y - 1, x)] & LURD) + + (ndir[nr_offset(y + 1, x)] & LURD) + + (ndir[nr_offset(y, x - 1)] & LURD) + + (ndir[nr_offset(y, x + 1)] & LURD) + + (ndir[nr_offset(y - 1, x - 1)] & LURD) + + (ndir[nr_offset(y - 1, x + 1)] & LURD) + + (ndir[nr_offset(y + 1, x - 1)] & LURD) + + (ndir[nr_offset(y + 1, x + 1)] & LURD); + int nh = (ndir[nr_offset(y - 1, x)] & RULD) + + (ndir[nr_offset(y + 1, x)] & RULD) + + (ndir[nr_offset(y, x - 1)] & RULD) + + (ndir[nr_offset(y, x + 1)] & RULD) + + (ndir[nr_offset(y - 1, x - 1)] & RULD) + + (ndir[nr_offset(y - 1, x + 1)] & RULD) + + (ndir[nr_offset(y + 1, x - 1)] & RULD) + + (ndir[nr_offset(y + 1, x + 1)] & RULD); + bool codir = (ndir[nr_offset(y, x)] & LURD) + ? ((ndir[nr_offset(y - 1, x - 1)] & LURD) || + (ndir[nr_offset(y + 1, x + 1)] & LURD)) + : ((ndir[nr_offset(y - 1, x + 1)] & RULD) || + (ndir[nr_offset(y + 1, x - 1)] & RULD)); + nv /= LURD; + nh /= RULD; + if ((ndir[nr_offset(y, x)] & LURD) && (nh > 4 && !codir)) + { + ndir[nr_offset(y, x)] &= ~LURD; + ndir[nr_offset(y, x)] |= RULD; + } + if ((ndir[nr_offset(y, x)] & RULD) && (nv > 4 && !codir)) + { + ndir[nr_offset(y, x)] &= ~RULD; + ndir[nr_offset(y, x)] |= LURD; + } + } +} + +void DHT::refine_idiag_dirs(int i) +{ + int iwidth = libraw.imgdata.sizes.iwidth; + for (int j = 0; j < iwidth; j++) + { + int x = j + nr_leftmargin; + int y = i + nr_topmargin; + if (ndir[nr_offset(y, x)] & DIASH) + continue; + int nv = (ndir[nr_offset(y - 1, x)] & LURD) + + (ndir[nr_offset(y + 1, x)] & LURD) + + (ndir[nr_offset(y, x - 1)] & LURD) + + (ndir[nr_offset(y, x + 1)] & LURD) + + (ndir[nr_offset(y - 1, x - 1)] & LURD) + + (ndir[nr_offset(y - 1, x + 1)] & LURD) + + (ndir[nr_offset(y + 1, x - 1)] & LURD) + + (ndir[nr_offset(y + 1, x + 1)] & LURD); + int nh = (ndir[nr_offset(y - 1, x)] & RULD) + + (ndir[nr_offset(y + 1, x)] & RULD) + + (ndir[nr_offset(y, x - 1)] & RULD) + + (ndir[nr_offset(y, x + 1)] & RULD) + + (ndir[nr_offset(y - 1, x - 1)] & RULD) + + (ndir[nr_offset(y - 1, x + 1)] & RULD) + + (ndir[nr_offset(y + 1, x - 1)] & RULD) + + (ndir[nr_offset(y + 1, x + 1)] & RULD); + nv /= LURD; + nh /= RULD; + if ((ndir[nr_offset(y, x)] & LURD) && nh > 7) + { + ndir[nr_offset(y, x)] &= ~LURD; + ndir[nr_offset(y, x)] |= RULD; + } + if ((ndir[nr_offset(y, x)] & RULD) && nv > 7) + { + ndir[nr_offset(y, x)] &= ~RULD; + ndir[nr_offset(y, x)] |= LURD; + } + } +} + +/* + * вычисление недостающих зелёных точек. + */ +void DHT::make_greens() +{ +#if defined(LIBRAW_USE_OPENMP) +#pragma omp parallel for schedule(guided) +#endif + for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) + { + make_gline(i); + } +} + +void DHT::make_gline(int i) +{ + int iwidth = libraw.imgdata.sizes.iwidth; + int js = libraw.COLOR(i, 0) & 1; + int kc = libraw.COLOR(i, js); + /* + * js -- начальная х-координата, которая попадает мимо известного зелёного + * kc -- известный цвет в точке интерполирования + */ + for (int j = js; j < iwidth; j += 2) + { + int x = j + nr_leftmargin; + int y = i + nr_topmargin; + int dx, dy, dx2, dy2; + float h1, h2; + if (ndir[nr_offset(y, x)] & VER) + { + dx = dx2 = 0; + dy = -1; + dy2 = 1; + h1 = 2 * nraw[nr_offset(y - 1, x)][1] / + (nraw[nr_offset(y - 2, x)][kc] + nraw[nr_offset(y, x)][kc]); + h2 = 2 * nraw[nr_offset(y + 1, x)][1] / + (nraw[nr_offset(y + 2, x)][kc] + nraw[nr_offset(y, x)][kc]); + } + else + { + dy = dy2 = 0; + dx = 1; + dx2 = -1; + h1 = 2 * nraw[nr_offset(y, x + 1)][1] / + (nraw[nr_offset(y, x + 2)][kc] + nraw[nr_offset(y, x)][kc]); + h2 = 2 * nraw[nr_offset(y, x - 1)][1] / + (nraw[nr_offset(y, x - 2)][kc] + nraw[nr_offset(y, x)][kc]); + } + float b1 = 1 / calc_dist(nraw[nr_offset(y, x)][kc], + nraw[nr_offset(y + dy * 2, x + dx * 2)][kc]); + float b2 = 1 / calc_dist(nraw[nr_offset(y, x)][kc], + nraw[nr_offset(y + dy2 * 2, x + dx2 * 2)][kc]); + b1 *= b1; + b2 *= b2; + float eg = nraw[nr_offset(y, x)][kc] * (b1 * h1 + b2 * h2) / (b1 + b2); + float min, max; + min = MIN(nraw[nr_offset(y + dy, x + dx)][1], + nraw[nr_offset(y + dy2, x + dx2)][1]); + max = MAX(nraw[nr_offset(y + dy, x + dx)][1], + nraw[nr_offset(y + dy2, x + dx2)][1]); + min /= 1.2f; + max *= 1.2f; + if (eg < min) + eg = scale_under(eg, min); + else if (eg > max) + eg = scale_over(eg, max); + if (eg > channel_maximum[1]) + eg = channel_maximum[1]; + else if (eg < channel_minimum[1]) + eg = channel_minimum[1]; + nraw[nr_offset(y, x)][1] = eg; + } +} + +/* + * отладочная функция + */ + +void DHT::illustrate_dirs() +{ +#if defined(LIBRAW_USE_OPENMP) +#pragma omp parallel for schedule(guided) +#endif + for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) + { + illustrate_dline(i); + } +} + +void DHT::illustrate_dline(int i) +{ + int iwidth = libraw.imgdata.sizes.iwidth; + for (int j = 0; j < iwidth; j++) + { + int x = j + nr_leftmargin; + int y = i + nr_topmargin; + nraw[nr_offset(y, x)][0] = nraw[nr_offset(y, x)][1] = + nraw[nr_offset(y, x)][2] = 0.5; + int l = ndir[nr_offset(y, x)] & 8; + // l >>= 3; // WTF? + l = 1; + if (ndir[nr_offset(y, x)] & HOT) + nraw[nr_offset(y, x)][0] = + l * channel_maximum[0] / 4 + channel_maximum[0] / 4; + else + nraw[nr_offset(y, x)][2] = + l * channel_maximum[2] / 4 + channel_maximum[2] / 4; + } +} + +/* + * интерполяция красных и синих. + * + * сначала интерполируются недостающие цвета, по диагональным направлениям от + * которых находятся известные, затем ситуация сводится к тому как + * интерполировались зелёные. + */ + +void DHT::make_rbdiag(int i) +{ + int iwidth = libraw.imgdata.sizes.iwidth; + int js = libraw.COLOR(i, 0) & 1; + int uc = libraw.COLOR(i, js); + int cl = uc ^ 2; + /* + * js -- начальная х-координата, которая попадает на уже интерполированный + * зелёный al -- известный цвет (кроме зелёного) в точке интерполирования cl + * -- неизвестный цвет + */ + for (int j = js; j < iwidth; j += 2) + { + int x = j + nr_leftmargin; + int y = i + nr_topmargin; + int dx, dy, dx2, dy2; + if (ndir[nr_offset(y, x)] & LURD) + { + dx = -1; + dx2 = 1; + dy = -1; + dy2 = 1; + } + else + { + dx = -1; + dx2 = 1; + dy = 1; + dy2 = -1; + } + float g1 = 1 / calc_dist(nraw[nr_offset(y, x)][1], + nraw[nr_offset(y + dy, x + dx)][1]); + float g2 = 1 / calc_dist(nraw[nr_offset(y, x)][1], + nraw[nr_offset(y + dy2, x + dx2)][1]); + g1 *= g1 * g1; + g2 *= g2 * g2; + + float eg; + eg = nraw[nr_offset(y, x)][1] * + (g1 * nraw[nr_offset(y + dy, x + dx)][cl] / + nraw[nr_offset(y + dy, x + dx)][1] + + g2 * nraw[nr_offset(y + dy2, x + dx2)][cl] / + nraw[nr_offset(y + dy2, x + dx2)][1]) / + (g1 + g2); + float min, max; + min = MIN(nraw[nr_offset(y + dy, x + dx)][cl], + nraw[nr_offset(y + dy2, x + dx2)][cl]); + max = MAX(nraw[nr_offset(y + dy, x + dx)][cl], + nraw[nr_offset(y + dy2, x + dx2)][cl]); + min /= 1.2f; + max *= 1.2f; + if (eg < min) + eg = scale_under(eg, min); + else if (eg > max) + eg = scale_over(eg, max); + if (eg > channel_maximum[cl]) + eg = channel_maximum[cl]; + else if (eg < channel_minimum[cl]) + eg = channel_minimum[cl]; + nraw[nr_offset(y, x)][cl] = eg; + } +} + +/* + * интерполяция красных и синих в точках где был известен только зелёный, + * направления горизонтальные или вертикальные + */ + +void DHT::make_rbhv(int i) +{ + int iwidth = libraw.imgdata.sizes.iwidth; + int js = (libraw.COLOR(i, 0) & 1) ^ 1; + for (int j = js; j < iwidth; j += 2) + { + int x = j + nr_leftmargin; + int y = i + nr_topmargin; + /* + * поскольку сверху-снизу и справа-слева уже есть все необходимые красные и + * синие, то можно выбрать наилучшее направление исходя из информации по + * обоим цветам. + */ + int dx, dy, dx2, dy2; + if (ndir[nr_offset(y, x)] & VER) + { + dx = dx2 = 0; + dy = -1; + dy2 = 1; + } + else + { + dy = dy2 = 0; + dx = 1; + dx2 = -1; + } + float g1 = 1 / calc_dist(nraw[nr_offset(y, x)][1], + nraw[nr_offset(y + dy, x + dx)][1]); + float g2 = 1 / calc_dist(nraw[nr_offset(y, x)][1], + nraw[nr_offset(y + dy2, x + dx2)][1]); + g1 *= g1; + g2 *= g2; + float eg_r, eg_b; + eg_r = nraw[nr_offset(y, x)][1] * + (g1 * nraw[nr_offset(y + dy, x + dx)][0] / + nraw[nr_offset(y + dy, x + dx)][1] + + g2 * nraw[nr_offset(y + dy2, x + dx2)][0] / + nraw[nr_offset(y + dy2, x + dx2)][1]) / + (g1 + g2); + eg_b = nraw[nr_offset(y, x)][1] * + (g1 * nraw[nr_offset(y + dy, x + dx)][2] / + nraw[nr_offset(y + dy, x + dx)][1] + + g2 * nraw[nr_offset(y + dy2, x + dx2)][2] / + nraw[nr_offset(y + dy2, x + dx2)][1]) / + (g1 + g2); + float min_r, max_r; + min_r = MIN(nraw[nr_offset(y + dy, x + dx)][0], + nraw[nr_offset(y + dy2, x + dx2)][0]); + max_r = MAX(nraw[nr_offset(y + dy, x + dx)][0], + nraw[nr_offset(y + dy2, x + dx2)][0]); + float min_b, max_b; + min_b = MIN(nraw[nr_offset(y + dy, x + dx)][2], + nraw[nr_offset(y + dy2, x + dx2)][2]); + max_b = MAX(nraw[nr_offset(y + dy, x + dx)][2], + nraw[nr_offset(y + dy2, x + dx2)][2]); + min_r /= 1.2f; + max_r *= 1.2f; + min_b /= 1.2f; + max_b *= 1.2f; + + if (eg_r < min_r) + eg_r = scale_under(eg_r, min_r); + else if (eg_r > max_r) + eg_r = scale_over(eg_r, max_r); + if (eg_b < min_b) + eg_b = scale_under(eg_b, min_b); + else if (eg_b > max_b) + eg_b = scale_over(eg_b, max_b); + + if (eg_r > channel_maximum[0]) + eg_r = channel_maximum[0]; + else if (eg_r < channel_minimum[0]) + eg_r = channel_minimum[0]; + if (eg_b > channel_maximum[2]) + eg_b = channel_maximum[2]; + else if (eg_b < channel_minimum[2]) + eg_b = channel_minimum[2]; + nraw[nr_offset(y, x)][0] = eg_r; + nraw[nr_offset(y, x)][2] = eg_b; + } +} + +void DHT::make_rb() +{ +#if defined(LIBRAW_USE_OPENMP) +#pragma omp barrier +#pragma omp parallel for schedule(guided) +#endif + for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) + { + make_rbdiag(i); + } +#if defined(LIBRAW_USE_OPENMP) +#pragma omp barrier +#pragma omp parallel for schedule(guided) +#endif + for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) + { + make_rbhv(i); + } +} + +/* + * перенос изображения в выходной массив + */ +void DHT::copy_to_image() +{ + int iwidth = libraw.imgdata.sizes.iwidth; +#if defined(LIBRAW_USE_OPENMP) +#ifdef _MSC_VER +#pragma omp parallel for +#else +#pragma omp parallel for schedule(guided) collapse(2) +#endif +#endif + for (int i = 0; i < libraw.imgdata.sizes.iheight; ++i) + { + for (int j = 0; j < iwidth; ++j) + { + libraw.imgdata.image[i * iwidth + j][0] = + (unsigned short)(nraw[nr_offset(i + nr_topmargin, j + nr_leftmargin)] + [0]); + libraw.imgdata.image[i * iwidth + j][2] = + (unsigned short)(nraw[nr_offset(i + nr_topmargin, j + nr_leftmargin)] + [2]); + libraw.imgdata.image[i * iwidth + j][1] = + libraw.imgdata.image[i * iwidth + j][3] = + (unsigned short)(nraw[nr_offset(i + nr_topmargin, + j + nr_leftmargin)][1]); + } + } +} + +DHT::~DHT() +{ + free(nraw); + free(ndir); +} + +void LibRaw::dht_interpolate() +{ + if (imgdata.idata.filters != 0x16161616 + && imgdata.idata.filters != 0x61616161 + && imgdata.idata.filters != 0x49494949 + && imgdata.idata.filters != 0x94949494 + ) + { + ahd_interpolate(); + return; + } + DHT dht(*this); + dht.hide_hots(); + dht.make_hv_dirs(); + // dht.illustrate_dirs(); + dht.make_greens(); + dht.make_diag_dirs(); + // dht.illustrate_dirs(); + dht.make_rb(); + dht.restore_hots(); + dht.copy_to_image(); +} diff --git a/rtengine/libraw/src/demosaic/misc_demosaic.cpp b/rtengine/libraw/src/demosaic/misc_demosaic.cpp new file mode 100644 index 000000000..76b837860 --- /dev/null +++ b/rtengine/libraw/src/demosaic/misc_demosaic.cpp @@ -0,0 +1,420 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +void LibRaw::pre_interpolate() +{ + ushort(*img)[4]; + int row, col, c; + RUN_CALLBACK(LIBRAW_PROGRESS_PRE_INTERPOLATE, 0, 2); + if (shrink) + { + if (half_size) + { + height = iheight; + width = iwidth; + if (filters == 9) + { + for (row = 0; row < 3; row++) + for (col = 1; col < 4; col++) + if (!(image[row * width + col][0] | image[row * width + col][2])) + goto break2; + break2: + for (; row < height; row += 3) + for (col = (col - 1) % 3 + 1; col < width - 1; col += 3) + { + img = image + row * width + col; + for (c = 0; c < 3; c += 2) + img[0][c] = (img[-1][c] + img[1][c]) >> 1; + } + } + } + else + { + img = (ushort(*)[4])calloc(height, width * sizeof *img); + for (row = 0; row < height; row++) + for (col = 0; col < width; col++) + { + c = fcol(row, col); + img[row * width + col][c] = + image[(row >> 1) * iwidth + (col >> 1)][c]; + } + free(image); + image = img; + shrink = 0; + } + } + if (filters > 1000 && colors == 3) + { + mix_green = four_color_rgb ^ half_size; + if (four_color_rgb | half_size) + colors++; + else + { + for (row = FC(1, 0) >> 1; row < height; row += 2) + for (col = FC(row, 1) & 1; col < width; col += 2) + image[row * width + col][1] = image[row * width + col][3]; + filters &= ~((filters & 0x55555555U) << 1); + } + } + if (half_size) + filters = 0; + RUN_CALLBACK(LIBRAW_PROGRESS_PRE_INTERPOLATE, 1, 2); +} + +void LibRaw::border_interpolate(int border) +{ + unsigned row, col, y, x, f, c, sum[8]; + + for (row = 0; row < height; row++) + for (col = 0; col < width; col++) + { + if (col == (unsigned)border && row >= (unsigned)border && row < (unsigned)(height - border)) + col = width - border; + memset(sum, 0, sizeof sum); + for (y = row - 1; y != row + 2; y++) + for (x = col - 1; x != col + 2; x++) + if (y < height && x < width) + { + f = fcol(y, x); + sum[f] += image[y * width + x][f]; + sum[f + 4]++; + } + f = fcol(row, col); + FORC(unsigned(colors)) if (c != f && sum[c + 4]) image[row * width + col][c] = + sum[c] / sum[c + 4]; + } +} + +void LibRaw::lin_interpolate_loop(int *code, int size) +{ + int row; + for (row = 1; row < height - 1; row++) + { + int col, *ip; + ushort *pix; + for (col = 1; col < width - 1; col++) + { + int i; + int sum[4]; + pix = image[row * width + col]; + ip = code + ((((row % size) * 16) + (col % size)) * 32); + memset(sum, 0, sizeof sum); + for (i = *ip++; i--; ip += 3) + sum[ip[2]] += pix[ip[0]] << ip[1]; + for (i = colors; --i; ip += 2) + pix[ip[0]] = sum[ip[0]] * ip[1] >> 8; + } + } +} + +void LibRaw::lin_interpolate() +{ + std::vector code_buffer(16 * 16 * 32); + int* code = &code_buffer[0], size = 16, *ip, sum[4]; + int f, c, x, y, row, col, shift, color; + + RUN_CALLBACK(LIBRAW_PROGRESS_INTERPOLATE, 0, 3); + + if (filters == 9) + size = 6; + border_interpolate(1); + for (row = 0; row < size; row++) + for (col = 0; col < size; col++) + { + ip = code + (((row * 16) + col) * 32) + 1; + f = fcol(row, col); + memset(sum, 0, sizeof sum); + for (y = -1; y <= 1; y++) + for (x = -1; x <= 1; x++) + { + shift = (y == 0) + (x == 0); + color = fcol(row + y + 48, col + x + 48); + if (color == f) + continue; + *ip++ = (width * y + x) * 4 + color; + *ip++ = shift; + *ip++ = color; + sum[color] += 1 << shift; + } + code[(row * 16 + col) * 32] = (ip - (code + ((row * 16) + col) * 32)) / 3; + FORCC + if (c != f) + { + *ip++ = c; + *ip++ = sum[c] > 0 ? 256 / sum[c] : 0; + } + } + RUN_CALLBACK(LIBRAW_PROGRESS_INTERPOLATE, 1, 3); + lin_interpolate_loop(code, size); + RUN_CALLBACK(LIBRAW_PROGRESS_INTERPOLATE, 2, 3); +} + +/* + This algorithm is officially called: + + "Interpolation using a Threshold-based variable number of gradients" + + described in + http://scien.stanford.edu/pages/labsite/1999/psych221/projects/99/tingchen/algodep/vargra.html + + I've extended the basic idea to work with non-Bayer filter arrays. + Gradients are numbered clockwise from NW=0 to W=7. + */ +void LibRaw::vng_interpolate() +{ + static const signed char *cp, + terms[] = + {-2, -2, +0, -1, 0, 0x01, -2, -2, +0, +0, 1, 0x01, -2, -1, -1, + +0, 0, 0x01, -2, -1, +0, -1, 0, 0x02, -2, -1, +0, +0, 0, 0x03, + -2, -1, +0, +1, 1, 0x01, -2, +0, +0, -1, 0, 0x06, -2, +0, +0, + +0, 1, 0x02, -2, +0, +0, +1, 0, 0x03, -2, +1, -1, +0, 0, 0x04, + -2, +1, +0, -1, 1, 0x04, -2, +1, +0, +0, 0, 0x06, -2, +1, +0, + +1, 0, 0x02, -2, +2, +0, +0, 1, 0x04, -2, +2, +0, +1, 0, 0x04, + -1, -2, -1, +0, 0, -128, -1, -2, +0, -1, 0, 0x01, -1, -2, +1, + -1, 0, 0x01, -1, -2, +1, +0, 1, 0x01, -1, -1, -1, +1, 0, -120, + -1, -1, +1, -2, 0, 0x40, -1, -1, +1, -1, 0, 0x22, -1, -1, +1, + +0, 0, 0x33, -1, -1, +1, +1, 1, 0x11, -1, +0, -1, +2, 0, 0x08, + -1, +0, +0, -1, 0, 0x44, -1, +0, +0, +1, 0, 0x11, -1, +0, +1, + -2, 1, 0x40, -1, +0, +1, -1, 0, 0x66, -1, +0, +1, +0, 1, 0x22, + -1, +0, +1, +1, 0, 0x33, -1, +0, +1, +2, 1, 0x10, -1, +1, +1, + -1, 1, 0x44, -1, +1, +1, +0, 0, 0x66, -1, +1, +1, +1, 0, 0x22, + -1, +1, +1, +2, 0, 0x10, -1, +2, +0, +1, 0, 0x04, -1, +2, +1, + +0, 1, 0x04, -1, +2, +1, +1, 0, 0x04, +0, -2, +0, +0, 1, -128, + +0, -1, +0, +1, 1, -120, +0, -1, +1, -2, 0, 0x40, +0, -1, +1, + +0, 0, 0x11, +0, -1, +2, -2, 0, 0x40, +0, -1, +2, -1, 0, 0x20, + +0, -1, +2, +0, 0, 0x30, +0, -1, +2, +1, 1, 0x10, +0, +0, +0, + +2, 1, 0x08, +0, +0, +2, -2, 1, 0x40, +0, +0, +2, -1, 0, 0x60, + +0, +0, +2, +0, 1, 0x20, +0, +0, +2, +1, 0, 0x30, +0, +0, +2, + +2, 1, 0x10, +0, +1, +1, +0, 0, 0x44, +0, +1, +1, +2, 0, 0x10, + +0, +1, +2, -1, 1, 0x40, +0, +1, +2, +0, 0, 0x60, +0, +1, +2, + +1, 0, 0x20, +0, +1, +2, +2, 0, 0x10, +1, -2, +1, +0, 0, -128, + +1, -1, +1, +1, 0, -120, +1, +0, +1, +2, 0, 0x08, +1, +0, +2, + -1, 0, 0x40, +1, +0, +2, +1, 0, 0x10}, + chood[] = {-1, -1, -1, 0, -1, +1, 0, +1, +1, +1, +1, 0, +1, -1, 0, -1}; + ushort(*brow[5])[4], *pix; + int prow = 8, pcol = 2, *ip, *code[16][16], gval[8], gmin, gmax, sum[4]; + int row, col, x, y, x1, x2, y1, y2, t, weight, grads, color, diag; + int g, diff, thold, num, c; + + lin_interpolate(); + + if (filters == 1) + prow = pcol = 16; + if (filters == 9) + prow = pcol = 6; + ip = (int *)calloc(prow * pcol, 1280); + for (row = 0; row < prow; row++) /* Precalculate for VNG */ + for (col = 0; col < pcol; col++) + { + code[row][col] = ip; + for (cp = terms, t = 0; t < 64; t++) + { + y1 = *cp++; + x1 = *cp++; + y2 = *cp++; + x2 = *cp++; + weight = *cp++; + grads = *cp++; + color = fcol(row + y1 + 144, col + x1 + 144); + if (fcol(row + y2 + 144, col + x2 + 144) != color) + continue; + diag = (fcol(row, col + 1) == color && fcol(row + 1, col) == color) ? 2 + : 1; + if (abs(y1 - y2) == diag && abs(x1 - x2) == diag) + continue; + *ip++ = (y1 * width + x1) * 4 + color; + *ip++ = (y2 * width + x2) * 4 + color; + *ip++ = weight; + for (g = 0; g < 8; g++) + if (grads & 1 << g) + *ip++ = g; + *ip++ = -1; + } + *ip++ = INT_MAX; + for (cp = chood, g = 0; g < 8; g++) + { + y = *cp++; + x = *cp++; + *ip++ = (y * width + x) * 4; + color = fcol(row, col); + if (fcol(row + y + 144, col + x + 144) != color && + fcol(row + y * 2 + 144, col + x * 2 + 144) == color) + *ip++ = (y * width + x) * 8 + color; + else + *ip++ = 0; + } + } + brow[4] = (ushort(*)[4])calloc(width * 3, sizeof **brow); + for (row = 0; row < 3; row++) + brow[row] = brow[4] + row * width; + for (row = 2; row < height - 2; row++) + { /* Do VNG interpolation */ + if (!((row - 2) % 256)) + RUN_CALLBACK(LIBRAW_PROGRESS_INTERPOLATE, (row - 2) / 256 + 1, + ((height - 3) / 256) + 1); + for (col = 2; col < width - 2; col++) + { + pix = image[row * width + col]; + ip = code[row % prow][col % pcol]; + memset(gval, 0, sizeof gval); + while ((g = ip[0]) != INT_MAX) + { /* Calculate gradients */ + diff = ABS(pix[g] - pix[ip[1]]) << ip[2]; + gval[ip[3]] += diff; + ip += 5; + if ((g = ip[-1]) == -1) + continue; + gval[g] += diff; + while ((g = *ip++) != -1) + gval[g] += diff; + } + ip++; + gmin = gmax = gval[0]; /* Choose a threshold */ + for (g = 1; g < 8; g++) + { + if (gmin > gval[g]) + gmin = gval[g]; + if (gmax < gval[g]) + gmax = gval[g]; + } + if (gmax == 0) + { + memcpy(brow[2][col], pix, sizeof *image); + continue; + } + thold = gmin + (gmax >> 1); + memset(sum, 0, sizeof sum); + color = fcol(row, col); + for (num = g = 0; g < 8; g++, ip += 2) + { /* Average the neighbors */ + if (gval[g] <= thold) + { + FORCC + if (c == color && ip[1]) + sum[c] += (pix[c] + pix[ip[1]]) >> 1; + else + sum[c] += pix[ip[0] + c]; + num++; + } + } + FORCC + { /* Save to buffer */ + t = pix[color]; + if (c != color) + t += (sum[c] - sum[color]) / num; + brow[2][col][c] = CLIP(t); + } + } + if (row > 3) /* Write buffer to image */ + memcpy(image[(row - 2) * width + 2], brow[0] + 2, + (width - 4) * sizeof *image); + for (g = 0; g < 4; g++) + brow[(g - 1) & 3] = brow[g]; + } + memcpy(image[(row - 2) * width + 2], brow[0] + 2, + (width - 4) * sizeof *image); + memcpy(image[(row - 1) * width + 2], brow[1] + 2, + (width - 4) * sizeof *image); + free(brow[4]); + free(code[0][0]); +} + +/* + Patterned Pixel Grouping Interpolation by Alain Desbiolles +*/ +void LibRaw::ppg_interpolate() +{ + int dir[5] = {1, width, -1, -width, 1}; + int row, col, diff[2], guess[2], c, d, i; + ushort(*pix)[4]; + + border_interpolate(3); + + /* Fill in the green layer with gradients and pattern recognition: */ + RUN_CALLBACK(LIBRAW_PROGRESS_INTERPOLATE, 0, 3); +#ifdef LIBRAW_USE_OPENMP +#pragma omp parallel for default(shared) private(guess, diff, row, col, d, c, \ + i, pix) schedule(static) +#endif + for (row = 3; row < height - 3; row++) + for (col = 3 + (FC(row, 3) & 1), c = FC(row, col); col < width - 3; + col += 2) + { + pix = image + row * width + col; + for (i = 0; i < 2; i++) + { + d = dir[i]; + guess[i] = (pix[-d][1] + pix[0][c] + pix[d][1]) * 2 - pix[-2 * d][c] - + pix[2 * d][c]; + diff[i] = + (ABS(pix[-2 * d][c] - pix[0][c]) + ABS(pix[2 * d][c] - pix[0][c]) + + ABS(pix[-d][1] - pix[d][1])) * + 3 + + (ABS(pix[3 * d][1] - pix[d][1]) + + ABS(pix[-3 * d][1] - pix[-d][1])) * + 2; + } + d = dir[i = diff[0] > diff[1]]; + pix[0][1] = ULIM(guess[i] >> 2, pix[d][1], pix[-d][1]); + } + /* Calculate red and blue for each green pixel: */ + RUN_CALLBACK(LIBRAW_PROGRESS_INTERPOLATE, 1, 3); +#ifdef LIBRAW_USE_OPENMP +#pragma omp parallel for default(shared) private(guess, diff, row, col, d, c, \ + i, pix) schedule(static) +#endif + for (row = 1; row < height - 1; row++) + for (col = 1 + (FC(row, 2) & 1), c = FC(row, col + 1); col < width - 1; + col += 2) + { + pix = image + row * width + col; + for (i = 0; i < 2; c = 2 - c, i++) + { + d = dir[i]; + pix[0][c] = CLIP( + (pix[-d][c] + pix[d][c] + 2 * pix[0][1] - pix[-d][1] - pix[d][1]) >> + 1); + } + } + /* Calculate blue for red pixels and vice versa: */ + RUN_CALLBACK(LIBRAW_PROGRESS_INTERPOLATE, 2, 3); +#ifdef LIBRAW_USE_OPENMP +#pragma omp parallel for default(shared) private(guess, diff, row, col, d, c, \ + i, pix) schedule(static) +#endif + for (row = 1; row < height - 1; row++) + for (col = 1 + (FC(row, 1) & 1), c = 2 - FC(row, col); col < width - 1; + col += 2) + { + pix = image + row * width + col; + for (i = 0; i < 2; i++) + { + d = dir[i] + dir[i+1]; + diff[i] = ABS(pix[-d][c] - pix[d][c]) + ABS(pix[-d][1] - pix[0][1]) + + ABS(pix[d][1] - pix[0][1]); + guess[i] = + pix[-d][c] + pix[d][c] + 2 * pix[0][1] - pix[-d][1] - pix[d][1]; + } + if (diff[0] != diff[1]) + pix[0][c] = CLIP(guess[diff[0] > diff[1]] >> 1); + else + pix[0][c] = CLIP((guess[0] + guess[1]) >> 2); + } +} diff --git a/rtengine/libraw/src/demosaic/xtrans_demosaic.cpp b/rtengine/libraw/src/demosaic/xtrans_demosaic.cpp new file mode 100644 index 000000000..8bd1842c4 --- /dev/null +++ b/rtengine/libraw/src/demosaic/xtrans_demosaic.cpp @@ -0,0 +1,434 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +#define fcol(row, col) xtrans[(row + 6) % 6][(col + 6) % 6] +/* + Frank Markesteijn's algorithm for Fuji X-Trans sensors + */ +void LibRaw::xtrans_interpolate(int passes) +{ + int cstat[4] = {0, 0, 0, 0}; + int ndir; + static const short orth[12] = {1, 0, 0, 1, -1, 0, 0, -1, 1, 0, 0, 1}, + patt[2][16] = {{0, 1, 0, -1, 2, 0, -1, 0, 1, 1, 1, -1, 0, + 0, 0, 0}, + {0, 1, 0, -2, 1, 0, -2, 0, 1, 1, -2, -2, 1, + -1, -1, 1}}, + dir[4] = {1, LIBRAW_AHD_TILE, LIBRAW_AHD_TILE + 1, + LIBRAW_AHD_TILE - 1}; + short allhex[3][3][2][8]; + ushort sgrow = 0, sgcol = 0; + + if (width < LIBRAW_AHD_TILE || height < LIBRAW_AHD_TILE) + throw LIBRAW_EXCEPTION_IO_CORRUPT; // too small image + /* Check against right pattern */ + for (int row = 0; row < 6; row++) + for (int col = 0; col < 6; col++) + cstat[(unsigned)fcol(row, col)]++; + + if (cstat[0] < 6 || cstat[0] > 10 || cstat[1] < 16 || cstat[1] > 24 || + cstat[2] < 6 || cstat[2] > 10 || cstat[3]) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + // Init allhex table to unreasonable values + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 2; k++) + for (int l = 0; l < 8; l++) + allhex[i][j][k][l] = 32700; + + cielab(0, 0); + ndir = 4 << int(passes > 1); + + int minv = 0, maxv = 0, minh = 0, maxh = 0; + /* Map a green hexagon around each non-green pixel and vice versa: */ + for (int row = 0; row < 3; row++) + for (int col = 0; col < 3; col++) + for (int ng = 0, d = 0; d < 10; d += 2) + { + int g = fcol(row, col) == 1; + if (fcol(row + orth[d], col + orth[d + 2]) == 1) + ng = 0; + else + ng++; + if (ng == 4) + { + sgrow = row; + sgcol = col; + } + if (ng == g + 1) + { + int c; + FORC(8) + { + int v = orth[d] * patt[g][c * 2] + orth[d + 1] * patt[g][c * 2 + 1]; + int h = orth[d + 2] * patt[g][c * 2] + orth[d + 3] * patt[g][c * 2 + 1]; + minv = MIN(v, minv); + maxv = MAX(v, maxv); + minh = MIN(v, minh); + maxh = MAX(v, maxh); + allhex[row][col][0][c ^ (g * 2 & d)] = h + v * width; + allhex[row][col][1][c ^ (g * 2 & d)] = h + v * LIBRAW_AHD_TILE; + } + } + } + + // Check allhex table initialization + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 2; k++) + for (int l = 0; l < 8; l++) + if (allhex[i][j][k][l] > maxh + maxv * width + 1 || + allhex[i][j][k][l] < minh + minv * width - 1) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + int retrycount = 0; + + /* Set green1 and green3 to the minimum and maximum allowed values: */ + for (int row = 2; row < height - 2; row++) + { + int col; + ushort min, max; + for (col = 2, max = 0u, min = 0xffffu; col < int(width) - 2; col++) + { + if (fcol(row, col) == 1 && (min = ~(max = 0))) + continue; + ushort(*pix)[4]; + pix = image + row * width + col; + short* hex = allhex[row % 3][col % 3][0]; + if (!max) + { + int c; + FORC(6) + { + int val = pix[hex[c]][1]; + if (min > val) + min = val; + if (max < val) + max = val; + } + } + pix[0][1] = min; + pix[0][3] = max; + switch ((row - sgrow) % 3) + { + case 1: + if (row < height - 3) + { + row++; + col--; + } + break; + case 2: + if ((min = ~(max = 0)) && (col += 2) < width - 3 && row > 2) + { + row--; + if (retrycount++ > width * height) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + } + } + } + } + + for (int row = 3; row < 9 && row < height - 3; row++) + for (int col = 3; col < 9 && col < width - 3; col++) + { + if ((fcol(row, col)) == 1) + continue; + short* hex = allhex[row % 3][col % 3][0]; + int c; + FORC(2) + { + int idx3 = 3 * hex[4 + c] + row * width + col; + int idx4 = -3 * hex[4 + c] + row * width + col; + int maxidx = width * height; + if (idx3 < 0 || idx3 >= maxidx) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + if (idx4 < 0 || idx4 >= maxidx) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + } + } + +#if defined(LIBRAW_USE_OPENMP) + int buffer_count = omp_get_max_threads(); +#else + int buffer_count = 1; +#endif + + size_t buffer_size = LIBRAW_AHD_TILE * LIBRAW_AHD_TILE * (ndir * 11 + 6); + char** buffers = malloc_omp_buffers(buffer_count, buffer_size); + +#if defined(LIBRAW_USE_OPENMP) +# pragma omp parallel for schedule(dynamic) default(none) firstprivate(buffers, allhex, passes, sgrow, sgcol, ndir) shared(dir) +#endif + for (int top = 3; top < height - 19; top += LIBRAW_AHD_TILE - 16) + { +#if defined(LIBRAW_USE_OPENMP) + char* buffer = buffers[omp_get_thread_num()]; +#else + char* buffer = buffers[0]; +#endif + + ushort(*rgb)[LIBRAW_AHD_TILE][LIBRAW_AHD_TILE][3], (*rix)[3]; + short(*lab)[LIBRAW_AHD_TILE][3], (*lix)[3]; + float(*drv)[LIBRAW_AHD_TILE][LIBRAW_AHD_TILE]; + char(*homo)[LIBRAW_AHD_TILE][LIBRAW_AHD_TILE]; + + rgb = (ushort(*)[LIBRAW_AHD_TILE][LIBRAW_AHD_TILE][3])buffer; + lab = (short(*)[LIBRAW_AHD_TILE][3])( + buffer + LIBRAW_AHD_TILE * LIBRAW_AHD_TILE * (ndir * 6)); + drv = (float(*)[LIBRAW_AHD_TILE][LIBRAW_AHD_TILE])( + buffer + LIBRAW_AHD_TILE * LIBRAW_AHD_TILE * (ndir * 6 + 6)); + homo = (char(*)[LIBRAW_AHD_TILE][LIBRAW_AHD_TILE])( + buffer + LIBRAW_AHD_TILE * LIBRAW_AHD_TILE * (ndir * 10 + 6)); + + for (int left = 3; left < width - 19; left += LIBRAW_AHD_TILE - 16) + { + int mrow = MIN(top + LIBRAW_AHD_TILE, height - 3); + int mcol = MIN(left + LIBRAW_AHD_TILE, width - 3); + for (int row = top; row < mrow; row++) + for (int col = left; col < mcol; col++) + memcpy(rgb[0][row - top][col - left], image[row * width + col], 6); + int c; + FORC3 memcpy(rgb[c + 1], rgb[0], sizeof * rgb); + + /* Interpolate green horizontally, vertically, and along both diagonals: + */ + int color[3][8]; + for (int row = top; row < mrow; row++) + for (int col = left; col < mcol; col++) + { + int f; + if ((f = fcol(row, col)) == 1) + continue; + ushort (*pix)[4] = image + row * width + col; + short* hex = allhex[row % 3][col % 3][0]; + color[1][0] = 174 * (pix[hex[1]][1] + pix[hex[0]][1]) - + 46 * (pix[2 * hex[1]][1] + pix[2 * hex[0]][1]); + color[1][1] = 223 * pix[hex[3]][1] + pix[hex[2]][1] * 33 + + 92 * (pix[0][f] - pix[-hex[2]][f]); + FORC(2) + color[1][2 + c] = 164 * pix[hex[4 + c]][1] + + 92 * pix[-2 * hex[4 + c]][1] + + 33 * (2 * pix[0][f] - pix[3 * hex[4 + c]][f] - + pix[-3 * hex[4 + c]][f]); + FORC4 rgb[c ^ !((row - sgrow) % 3)][row - top][col - left][1] = + LIM(color[1][c] >> 8, pix[0][1], pix[0][3]); + } + + for (int pass = 0; pass < passes; pass++) + { + if (pass == 1) + memcpy(rgb += 4, buffer, 4 * sizeof * rgb); + + /* Recalculate green from interpolated values of closer pixels: */ + if (pass) + { + for (int row = top + 2; row < mrow - 2; row++) + for (int col = left + 2; col < mcol - 2; col++) + { + int f; + if ((f = fcol(row, col)) == 1) + continue; + ushort(*pix)[4] = image + row * width + col; + short* hex = allhex[row % 3][col % 3][1]; + for (int d = 3; d < 6; d++) + { + rix = + &rgb[(d - 2) ^ !((row - sgrow) % 3)][row - top][col - left]; + int val = rix[-2 * hex[d]][1] + 2 * rix[hex[d]][1] - + rix[-2 * hex[d]][f] - 2 * rix[hex[d]][f] + 3 * rix[0][f]; + rix[0][1] = LIM(val / 3, pix[0][1], pix[0][3]); + } + } + } + + /* Interpolate red and blue values for solitary green pixels: */ + for (int row = (top - sgrow + 4) / 3 * 3 + sgrow; row < mrow - 2; row += 3) + for (int col = (left - sgcol + 4) / 3 * 3 + sgcol; col < mcol - 2; col += 3) + { + rix = &rgb[0][row - top][col - left]; + int h = fcol(row, col + 1); + + if (h == 1) // Incorrect pattern + break; + + float diff[6]; + memset(diff, 0, sizeof diff); + for (int i = 1, d = 0; d < 6; d++, i ^= LIBRAW_AHD_TILE ^ 1, h ^= 2) + { + for (c = 0; c < 2; c++, h ^= 2) + { + int g = 2 * rix[0][1] - rix[i << c][1] - rix[-i << c][1]; + color[h][d] = g + rix[i << c][h] + rix[-i << c][h]; + if (d > 1) + diff[d] += SQR((float)rix[i << c][1] - (float)rix[-i << c][1] - + (float)rix[i << c][h] + (float)rix[-i << c][h]) + SQR((float)g); + } + if (d > 1 && (d & 1)) + if (diff[d - 1] < diff[d]) + FORC(2) color[c * 2][d] = color[c * 2][d - 1]; + if (d < 2 || (d & 1)) + { + FORC(2) rix[0][c * 2] = CLIP(color[c * 2][d] / 2); + rix += LIBRAW_AHD_TILE * LIBRAW_AHD_TILE; + } + } + } + + /* Interpolate red for blue pixels and vice versa: */ + for (int row = top + 3; row < mrow - 3; row++) + for (int col = left + 3; col < mcol - 3; col++) + { + int f; + if ((f = 2 - fcol(row, col)) == 1) + continue; + rix = &rgb[0][row - top][col - left]; + c = (row - sgrow) % 3 ? LIBRAW_AHD_TILE : 1; + int h = 3 * (c ^ LIBRAW_AHD_TILE ^ 1); + for (int d = 0; d < 4; d++, rix += LIBRAW_AHD_TILE * LIBRAW_AHD_TILE) + { + int i = d > 1 || ((d ^ c) & 1) || + ((ABS(rix[0][1] - rix[c][1]) + + ABS(rix[0][1] - rix[-c][1])) < + 2 * (ABS(rix[0][1] - rix[h][1]) + + ABS(rix[0][1] - rix[-h][1]))) + ? c + : h; + rix[0][f] = CLIP((rix[i][f] + rix[-i][f] + 2 * rix[0][1] - + rix[i][1] - rix[-i][1]) / + 2); + } + } + + /* Fill in red and blue for 2x2 blocks of green: */ + for (int row = top + 2; row < mrow - 2; row++) + if ((row - sgrow) % 3) + for (int col = left + 2; col < mcol - 2; col++) + if ((col - sgcol) % 3) + { + rix = &rgb[0][row - top][col - left]; + short* hex = allhex[row % 3][col % 3][1]; + for (int d = 0; d < 8; + d += 2, rix += LIBRAW_AHD_TILE * LIBRAW_AHD_TILE) + if (hex[d] + hex[d + 1]) + { + int g = 3 * rix[0][1] - 2 * rix[hex[d]][1] - rix[hex[d + 1]][1]; + for (c = 0; c < 4; c += 2) + rix[0][c] = CLIP( + (g + 2 * rix[hex[d]][c] + rix[hex[d + 1]][c]) / 3); + } + else + { + int g = 2 * rix[0][1] - rix[hex[d]][1] - rix[hex[d + 1]][1]; + for (c = 0; c < 4; c += 2) + rix[0][c] = + CLIP((g + rix[hex[d]][c] + rix[hex[d + 1]][c]) / 2); + } + } + } + rgb = (ushort(*)[LIBRAW_AHD_TILE][LIBRAW_AHD_TILE][3])buffer; + mrow -= top; + mcol -= left; + + /* Convert to CIELab and differentiate in all directions: */ + // no effect + for (int d = 0; d < ndir; d++) + { + for (int row = 2; row < mrow - 2; row++) + for (int col = 2; col < mcol - 2; col++) + cielab(rgb[d][row][col], lab[row][col]); + for (int f = dir[d & 3], row = 3; row < mrow - 3; row++) + for (int col = 3; col < mcol - 3; col++) + { + lix = &lab[row][col]; + int g = 2 * lix[0][0] - lix[f][0] - lix[-f][0]; + drv[d][row][col] = + SQR(g) + + SQR((2 * lix[0][1] - lix[f][1] - lix[-f][1] + g * 500 / 232)) + + SQR((2 * lix[0][2] - lix[f][2] - lix[-f][2] - g * 500 / 580)); + } + } + + /* Build homogeneity maps from the derivatives: */ + memset(homo, 0, ndir * LIBRAW_AHD_TILE * LIBRAW_AHD_TILE); + for (int row = 4; row < mrow - 4; row++) + for (int col = 4; col < mcol - 4; col++) + { + int d; + float tr; + for (tr = FLT_MAX, d = 0; d < ndir; d++) + if (tr > drv[d][row][col]) + tr = drv[d][row][col]; + tr *= 8; + for (int dd = 0; dd < ndir; dd++) + for (int v = -1; v <= 1; v++) + for (int h = -1; h <= 1; h++) + if (drv[dd][row + v][col + h] <= tr) + homo[dd][row][col]++; + } + + /* Average the most homogeneous pixels for the final result: */ + if (height - top < LIBRAW_AHD_TILE + 4) + mrow = height - top + 2; + if (width - left < LIBRAW_AHD_TILE + 4) + mcol = width - left + 2; + for (int row = MIN(top, 8); row < mrow - 8; row++) + for (int col = MIN(left, 8); col < mcol - 8; col++) + { + int v; + int hm[8]; + for (int d = 0; d < ndir; d++) + for (v = -2, hm[d] = 0; v <= 2; v++) + for (int h = -2; h <= 2; h++) + hm[d] += homo[d][row + v][col + h]; + for (int d = 0; d < ndir - 4; d++) + if (hm[d] < hm[d + 4]) + hm[d] = 0; + else if (hm[d] > hm[d + 4]) + hm[d + 4] = 0; + ushort max; + int d; + for (d = 1, max = hm[0]; d < ndir; d++) + if (max < hm[d]) + max = hm[d]; + max -= max >> 3; + + int avg[4]; + memset(avg, 0, sizeof avg); + for (int dd = 0; dd < ndir; dd++) + if (hm[dd] >= max) + { + FORC3 avg[c] += rgb[dd][row][col][c]; + avg[3]++; + } + FORC3 image[(row + top) * width + col + left][c] = avg[c] / avg[3]; + } + } + } + +#ifdef LIBRAW_USE_OPENMP +#pragma omp barrier +#endif + + free_omp_buffers(buffers, buffer_count); + + border_interpolate(8); +} +#undef fcol diff --git a/rtengine/libraw/src/integration/dngsdk_glue.cpp b/rtengine/libraw/src/integration/dngsdk_glue.cpp new file mode 100644 index 000000000..0d0a9e8e3 --- /dev/null +++ b/rtengine/libraw/src/integration/dngsdk_glue.cpp @@ -0,0 +1,464 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#define LIBRAW_DNGSDK_CONFLICT 1 + +#include "../../internal/libraw_cxx_defs.h" + +#ifdef USE_DNGSDK +#include "dng_host.h" +#include "dng_negative.h" +#include "dng_simple_image.h" +#include "dng_info.h" +#endif + + +#if defined (USE_GPRSDK) && !defined(USE_DNGSDK) +#error GPR (GoPro) SDK should be used with Adobe DNG SDK +#endif +#ifdef USE_DNGSDK +#include "dng_read_image.h" +#endif +#ifdef USE_GPRSDK +#include "gpr_read_image.h" +#endif + +#ifdef USE_DNGSDK +static dng_ifd* search_single_ifd(const std::vector & v, uint64 offset, int& idx, dng_stream& stream) +{ + idx = -1; + for (int i = 0; i < v.size(); i++) + { + if (!v[i]) continue; + if (v[i]->fTileOffsetsOffset == offset) + { + idx = i; + return v[i]; + } + else if (v[i]->fTileOffsetsCount == 1 && v[i]->fTileOffset[0] == offset) + { + idx = i; + return v[i]; + } + else if (v[i]->fTileOffsetsCount > dng_ifd::kMaxTileInfo) + { + uint64 p = stream.Position(); + stream.SetReadPosition(v[i]->fTileOffsetsOffset); + int32 oo = stream.TagValue_uint32(v[i]->fTileOffsetsType); + stream.SetReadPosition(p); + if (oo == offset) + { + idx = i; + return v[i]; + } + } + } + return NULL; +} + +static dng_ifd* search_for_ifd(const dng_info& info, uint64 offset, ushort w, ushort h, int& ifdIndex, dng_stream& stream) +{ + dng_ifd *ret = 0; + ret = search_single_ifd(info.fIFD, offset, ifdIndex, stream); + int dummy; + if (!ret) ret = search_single_ifd(info.fChainedIFD, offset, dummy, stream); + if (!ret) + { + for (int c = 0; !ret && c < info.fChainedSubIFD.size(); c++) + ret = search_single_ifd(info.fChainedSubIFD[c], offset, dummy, stream); + } + if (ret && (ret->fImageLength == h) && ret->fImageWidth == w) + return ret; + ifdIndex = -1; + return 0; +} +#endif + +int LibRaw::valid_for_dngsdk() +{ +#ifndef USE_DNGSDK + return 0; +#else + if (!imgdata.idata.dng_version) + return 0; + +#ifdef qDNGSupportJXL + if (libraw_internal_data.unpacker_data.tiff_compress == 52546) // regardless of flags or use_dngsdk value! + { +#ifdef qDNGSupportJXL + if (dngVersion_Current >= dngVersion_1_7_0_0) + return 1; + else +#endif + return 0; // Old DNG SDK + } +#endif + + + // All DNG larger than 2GB - to DNG SDK + if (libraw_internal_data.internal_data.input->size() > 2147483647ULL) + return 1; + + if (!strcasecmp(imgdata.idata.make, "Blackmagic") + && (libraw_internal_data.unpacker_data.tiff_compress == 7) + && (libraw_internal_data.unpacker_data.tiff_bps > 8) + ) + return 0; + + if (libraw_internal_data.unpacker_data.tiff_compress == 34892 + && libraw_internal_data.unpacker_data.tiff_bps == 8 + && (libraw_internal_data.unpacker_data.tiff_samples == 3 || libraw_internal_data.unpacker_data.tiff_samples == 1) + && load_raw == &LibRaw::lossy_dng_load_raw + ) + { + if (!dnghost) + return 0; + dng_host *host = static_cast(dnghost); + libraw_dng_stream stream(libraw_internal_data.internal_data.input); + AutoPtr negative; + negative.Reset(host->Make_dng_negative()); + dng_info info; + info.Parse(*host, stream); + info.PostParse(*host); + if (!info.IsValidDNG()) + return 0; + negative->Parse(*host, stream, info); + negative->PostParse(*host, stream, info); + int ifdindex = -1; + dng_ifd *rawIFD = search_for_ifd(info, libraw_internal_data.unpacker_data.data_offset, imgdata.sizes.raw_width, imgdata.sizes.raw_height, ifdindex,stream); + if (rawIFD && ifdindex >= 0 && ifdindex == info.fMainIndex) + return 1; + if (rawIFD && ifdindex >= 0 && (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_DNG_ADD_PREVIEWS)) + return 1; + return 0; + } + +#ifdef USE_GPRSDK + if (libraw_internal_data.unpacker_data.tiff_compress == 9) // regardless of flags or use_dngsdk value! + return 1; +#endif + if (!imgdata.rawparams.use_dngsdk) + return 0; + if (load_raw == &LibRaw::lossy_dng_load_raw) // WHY?? + return 0; + if (is_floating_point() && (imgdata.rawparams.use_dngsdk & LIBRAW_DNG_FLOAT)) + return 1; + if (!imgdata.idata.filters && (imgdata.rawparams.use_dngsdk & LIBRAW_DNG_LINEAR)) + return 1; + if (libraw_internal_data.unpacker_data.tiff_bps == 8 && + (imgdata.rawparams.use_dngsdk & LIBRAW_DNG_8BIT)) + return 1; + if (libraw_internal_data.unpacker_data.tiff_compress == 8 && + (imgdata.rawparams.use_dngsdk & LIBRAW_DNG_DEFLATE)) + return 1; + if (libraw_internal_data.unpacker_data.tiff_samples == 2) + return 0; // Always deny 2-samples (old fuji superccd) + if (imgdata.idata.filters == 9 && + (imgdata.rawparams.use_dngsdk & LIBRAW_DNG_XTRANS)) + return 1; + if (is_fuji_rotated()) + return 0; // refuse + if (imgdata.rawparams.use_dngsdk & LIBRAW_DNG_OTHER) + return 1; + return 0; +#endif +} + + + + +int LibRaw::try_dngsdk() +{ +#ifdef USE_DNGSDK + if (!dnghost) + return LIBRAW_UNSPECIFIED_ERROR; + + dng_host *host = static_cast(dnghost); + + try + { + libraw_dng_stream stream(libraw_internal_data.internal_data.input); + + AutoPtr negative; + negative.Reset(host->Make_dng_negative()); + + dng_info info; + info.Parse(*host, stream); + info.PostParse(*host); + + if (!info.IsValidDNG()) + { + return LIBRAW_DATA_ERROR; + } + negative->Parse(*host, stream, info); + negative->PostParse(*host, stream, info); + int ifdindex; + dng_ifd *rawIFD = search_for_ifd(info,libraw_internal_data.unpacker_data.data_offset,imgdata.sizes.raw_width,imgdata.sizes.raw_height,ifdindex,stream); + if(!rawIFD) + return LIBRAW_DATA_ERROR; + + AutoPtr stage2; + unsigned stageBits = 0; // 1=> release Stage2, 2=> change Black/Max + bool zerocopy = false; + + if ( +#ifdef USE_GPRSDK + libraw_internal_data.unpacker_data.tiff_compress != 9 && +#endif + ( + ((libraw_internal_data.unpacker_data.tiff_compress == 34892 + && libraw_internal_data.unpacker_data.tiff_bps == 8 + && libraw_internal_data.unpacker_data.tiff_samples == 3 + && load_raw == &LibRaw::lossy_dng_load_raw) // JPEG DNG or JPEG DNG RAW Preview + || (imgdata.rawparams.options & (LIBRAW_RAWOPTIONS_DNG_STAGE2| LIBRAW_RAWOPTIONS_DNG_STAGE3)) + || ((tiff_ifd[ifdindex].dng_levels.parsedfields & (LIBRAW_DNGFM_OPCODE2| LIBRAW_DNGFM_OPCODE3)) + && (imgdata.rawparams.options & (LIBRAW_RAWOPTIONS_DNG_STAGE2_IFPRESENT | LIBRAW_RAWOPTIONS_DNG_STAGE3_IFPRESENT))) + ) + && ifdindex >= 0) + ) + { + if (info.fMainIndex != ifdindex) + info.fMainIndex = ifdindex; + + if (rawIFD->fNewSubFileType == 1) // Preview + { + dng_read_image reader; + AutoPtr copy2; + negative->ReadStage1Image(*host, stream, info); // Read image AND opcodes lists + copy2.Reset((dng_simple_image*) negative->Stage1Image()); + host->ApplyOpcodeList(negative->OpcodeList1(), *negative,copy2); + stageBits = 1; + if ((imgdata.rawparams.options & LIBRAW_RAWOPTIONS_DNG_STAGE2) + || ((tiff_ifd[ifdindex].dng_levels.parsedfields & LIBRAW_DNGFM_OPCODE2) && (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_DNG_STAGE2_IFPRESENT)) + ) + { + host->ApplyOpcodeList(negative->OpcodeList2(), *negative, copy2); + stageBits |= 2; + } + stage2.Reset((dng_simple_image *)copy2.Get()); + copy2.Release(); + } + else + { + negative->ReadStage1Image(*host, stream, info); + negative->BuildStage2Image(*host); + imgdata.process_warnings |= LIBRAW_WARN_DNG_STAGE2_APPLIED; + if ((imgdata.rawparams.options & LIBRAW_RAWOPTIONS_DNG_STAGE3) || + ((tiff_ifd[ifdindex].dng_levels.parsedfields & LIBRAW_DNGFM_OPCODE3) && + (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_DNG_STAGE3_IFPRESENT)) + ) + { + negative->BuildStage3Image(*host); + stage2.Reset((dng_simple_image*)negative->Stage3Image()); + imgdata.process_warnings |= LIBRAW_WARN_DNG_STAGE3_APPLIED; + } + else + stage2.Reset((dng_simple_image*)negative->Stage2Image()); + stageBits = 3; + } + } + else + { + stage2.Reset(new dng_simple_image(rawIFD->Bounds(), rawIFD->fSamplesPerPixel, rawIFD->PixelType(), host->Allocator())); +#ifdef USE_GPRSDK + if (libraw_internal_data.unpacker_data.tiff_compress == 9) + { + gpr_allocator allocator; + allocator.Alloc = ::malloc; + allocator.Free = ::free; + gpr_buffer_auto vc5_image_obj(allocator.Alloc, allocator.Free); + + gpr_read_image reader(&vc5_image_obj); + reader.Read(*host, *rawIFD, stream, *stage2.Get(), NULL, NULL); + } + else +#endif + { + dng_read_image reader; + reader.Read(*host, *rawIFD, stream, *stage2.Get(), NULL, NULL); + } + } + + if (stage2->Bounds().W() != S.raw_width || + stage2->Bounds().H() != S.raw_height) + { + if (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_DNG_ALLOWSIZECHANGE) + { + S.raw_width = S.width = stage2->Bounds().W(); + S.left_margin = 0; + S.raw_height = S.height = stage2->Bounds().H(); + S.top_margin = 0; + } + else + { + stage2.Release(); // It holds copy to internal dngnegative + return LIBRAW_DATA_ERROR; + } + } + if (stageBits & 2) + { + if (stage2->Planes() > 1) + { + imgdata.idata.filters = 0; + imgdata.idata.colors = stage2->Planes(); + } + // reset BL and whitepoint + imgdata.color.black = 0; + memset(imgdata.color.cblack, 0, sizeof(imgdata.color.cblack)); + imgdata.color.maximum = 0xffff; + } + + int pplanes = stage2->Planes(); + int ptype = stage2->PixelType(); + + dng_pixel_buffer buffer; + stage2->GetPixelBuffer(buffer); + + int pixels = stage2->Bounds().H() * stage2->Bounds().W() * pplanes; + + if (ptype == ttShort && !(stageBits & 1) && !is_curve_linear()) + { + imgdata.rawdata.raw_alloc = malloc(pixels * TagTypeSize(ptype)); + ushort *src = (ushort *)buffer.fData; + ushort *dst = (ushort *)imgdata.rawdata.raw_alloc; + for (int i = 0; i < pixels; i++) + dst[i] = imgdata.color.curve[src[i]]; + S.raw_pitch = S.raw_width * pplanes * TagTypeSize(ptype); + + } + else if (ptype == ttByte) + { + imgdata.rawdata.raw_alloc = malloc(pixels * TagTypeSize(ttShort)); + unsigned char *src = (unsigned char *)buffer.fData; + ushort *dst = (ushort *)imgdata.rawdata.raw_alloc; + if (is_curve_linear()) + { + for (int i = 0; i < pixels; i++) + dst[i] = src[i]; + } + else + { + for (int i = 0; i < pixels; i++) + dst[i] = imgdata.color.curve[src[i]]; + } + S.raw_pitch = S.raw_width * pplanes * TagTypeSize(ttShort); + } + else + { + // Alloc + if ((imgdata.rawparams.options & LIBRAW_RAWOPTIONS_DNGSDK_ZEROCOPY) && !(stageBits & 1)) + { + zerocopy = true; + } + else + { + imgdata.rawdata.raw_alloc = malloc(pixels * TagTypeSize(ptype)); + memmove(imgdata.rawdata.raw_alloc, buffer.fData, + pixels * TagTypeSize(ptype)); + } + S.raw_pitch = S.raw_width * pplanes * TagTypeSize(ptype); + } + + if (stageBits & 1) + stage2.Release(); + + if ((ptype == ttFloat) && (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_CONVERTFLOAT_TO_INT)) + zerocopy = true; + + if (zerocopy) + { + switch (ptype) + { + case ttFloat: + if (pplanes == 1) + imgdata.rawdata.float_image = (float *)buffer.fData; + else if (pplanes == 3) + imgdata.rawdata.float3_image = (float(*)[3])buffer.fData; + else if (pplanes == 4) + imgdata.rawdata.float4_image = (float(*)[4])buffer.fData; + break; + + case ttShort: + if (pplanes == 1) + imgdata.rawdata.raw_image = (ushort *)buffer.fData; + else if (pplanes == 3) + imgdata.rawdata.color3_image = (ushort(*)[3])buffer.fData; + else if (pplanes == 4) + imgdata.rawdata.color4_image = (ushort(*)[4])buffer.fData; + break; + default: + /* do nothing */ + break; + } + } + else + { + switch (ptype) + { + case ttFloat: + if (pplanes == 1) + imgdata.rawdata.float_image = (float *)imgdata.rawdata.raw_alloc; + else if (pplanes == 3) + imgdata.rawdata.float3_image = (float(*)[3])imgdata.rawdata.raw_alloc; + else if (pplanes == 4) + imgdata.rawdata.float4_image = (float(*)[4])imgdata.rawdata.raw_alloc; + break; + + case ttByte: + case ttShort: + if (pplanes == 1) + imgdata.rawdata.raw_image = (ushort *)imgdata.rawdata.raw_alloc; + else if (pplanes == 3) + imgdata.rawdata.color3_image = + (ushort(*)[3])imgdata.rawdata.raw_alloc; + else if (pplanes == 4) + imgdata.rawdata.color4_image = + (ushort(*)[4])imgdata.rawdata.raw_alloc; + break; + default: + /* do nothing */ + break; + } + } + + if ((ptype == ttFloat) && (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_CONVERTFLOAT_TO_INT)) + { + convertFloatToInt(); + zerocopy = false; + } + + if (zerocopy) + { + dng_negative *stolen = negative.Release(); + dngnegative = stolen; + dng_simple_image *simage = stage2.Release(); + dngimage = simage; + } + } + catch (...) + { + return LIBRAW_UNSPECIFIED_ERROR; + } + + return (dngnegative || imgdata.rawdata.raw_alloc) ? LIBRAW_SUCCESS : LIBRAW_UNSPECIFIED_ERROR; +#else + return LIBRAW_UNSPECIFIED_ERROR; +#endif +} +void LibRaw::set_dng_host(void *p) +{ +#ifdef USE_DNGSDK + dnghost = p; +#endif +} diff --git a/rtengine/libraw/src/integration/rawspeed_glue.cpp b/rtengine/libraw/src/integration/rawspeed_glue.cpp new file mode 100644 index 000000000..90d461190 --- /dev/null +++ b/rtengine/libraw/src/integration/rawspeed_glue.cpp @@ -0,0 +1,332 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#define LIBRAW_EXPAT_CONFLICT +#include "../../internal/libraw_cxx_defs.h" + + +#ifdef USE_RAWSPEED +#include +#include +#include +#include +#include +#include + +#include "../../RawSpeed/rawspeed_xmldata.cpp" +const int RAWSPEED_DATA_COUNT = (sizeof(_rawspeed_data_xml) / sizeof(_rawspeed_data_xml[0])); + + +class CameraMetaDataLR : public RawSpeed::CameraMetaData +{ +public: + CameraMetaDataLR() : CameraMetaData() {} + CameraMetaDataLR(char *filename) : RawSpeed::CameraMetaData(filename) {} + CameraMetaDataLR(char *data, int sz); +}; + + +#define P1 imgdata.idata +#define S imgdata.sizes +#define O imgdata.params +#define C imgdata.color +#define T imgdata.thumbnail +#define MN imgdata.makernotes +#define IO libraw_internal_data.internal_output_params +#define ID libraw_internal_data.internal_data + + +CameraMetaDataLR::CameraMetaDataLR(char *data, int sz) : RawSpeed::CameraMetaData() +{ + ctxt = xmlNewParserCtxt(); + if (ctxt == NULL) + { + RawSpeed::ThrowCME("CameraMetaData:Could not initialize context."); + } + + xmlResetLastError(); + doc = xmlCtxtReadMemory(ctxt, data, sz, "", NULL, XML_PARSE_DTDVALID); + + if (doc == NULL) + { + RawSpeed::ThrowCME("CameraMetaData: XML Document could not be parsed successfully. " + "Error was: %s", + ctxt->lastError.message); + } + + if (ctxt->valid == 0) + { + if (ctxt->lastError.code == 0x5e) + { + // ignore this error code + } + else + { + RawSpeed::ThrowCME("CameraMetaData: XML file does not validate. DTD Error was: %s", + ctxt->lastError.message); + } + } + + xmlNodePtr cur; + cur = xmlDocGetRootElement(doc); + if (xmlStrcmp(cur->name, (const xmlChar *)"Cameras")) + { + RawSpeed::ThrowCME("CameraMetaData: XML document of the wrong type, root node is not " + "cameras."); + return; + } + + cur = cur->xmlChildrenNode; + while (cur != NULL) + { + if ((!xmlStrcmp(cur->name, (const xmlChar *)"Camera"))) + { + RawSpeed::Camera *camera = new RawSpeed::Camera(doc, cur); + addCamera(camera); + + // Create cameras for aliases. + for (unsigned int i = 0; i < camera->aliases.size(); i++) + { + addCamera(new RawSpeed::Camera(camera, i)); + } + } + cur = cur->next; + } + if (doc) + xmlFreeDoc(doc); + doc = 0; + if (ctxt) + xmlFreeParserCtxt(ctxt); + ctxt = 0; +} + +void *make_camera_metadata() +{ + int len = 0, i; + for (i = 0; i < RAWSPEED_DATA_COUNT; i++) + if (_rawspeed_data_xml[i]) + { + len += int(strlen(_rawspeed_data_xml[i])); + } + char *rawspeed_xml = + (char *)calloc(len + 1, sizeof(_rawspeed_data_xml[0][0])); + if (!rawspeed_xml) + return NULL; + int offt = 0; + for (i = 0; i < RAWSPEED_DATA_COUNT; i++) + if (_rawspeed_data_xml[i]) + { + int ll = int(strlen(_rawspeed_data_xml[i])); + if (offt + ll > len) + break; + memmove(rawspeed_xml + offt, _rawspeed_data_xml[i], ll); + offt += ll; + } + rawspeed_xml[offt] = 0; + CameraMetaDataLR *ret = NULL; + try + { + ret = new CameraMetaDataLR(rawspeed_xml, offt); + } + catch (...) + { + // Mask all exceptions + } + free(rawspeed_xml); + return ret; +} + +void clear_rawspeed_decoder(void* _rawspeed_decoder) +{ + RawSpeed::RawDecoder *d = + static_cast(_rawspeed_decoder); + if(d) + delete d; +} + +void clear_camera_metadata(void* _rawspeed_camerameta) +{ + CameraMetaDataLR *cmeta = + static_cast(_rawspeed_camerameta); + if(cmeta) + delete cmeta; +} + + +int LibRaw::set_rawspeed_camerafile(char * filename) +{ +#ifdef USE_RAWSPEED + try + { + CameraMetaDataLR *camerameta = new CameraMetaDataLR(filename); + if (_rawspeed_camerameta) + { + CameraMetaDataLR *d = + static_cast(_rawspeed_camerameta); + delete d; + } + _rawspeed_camerameta = static_cast(camerameta); + } + catch (...) + { + // just return error code + return -1; + } +#else + (void)filename; +#endif + return 0; +} +#ifdef USE_RAWSPEED +void LibRaw::fix_after_rawspeed(int /*bl*/) +{ + if (load_raw == &LibRaw::lossy_dng_load_raw) + C.maximum = 0xffff; + else if (load_raw == &LibRaw::sony_load_raw) + C.maximum = 0x3ff0; +} +#else +void LibRaw::fix_after_rawspeed(int) {} +#endif + +int LibRaw::try_rawspeed() +{ +#ifdef USE_RAWSPEED + int ret = LIBRAW_SUCCESS; + +#ifdef USE_RAWSPEED_BITS + int rawspeed_ignore_errors = (imgdata.rawparams.use_rawspeed & LIBRAW_RAWSPEEDV1_IGNOREERRORS); +#else + int rawspeed_ignore_errors = 0; +#endif + if (imgdata.idata.dng_version && imgdata.idata.colors == 3 && + !strcasecmp(imgdata.idata.software, + "Adobe Photoshop Lightroom 6.1.1 (Windows)")) + rawspeed_ignore_errors = 1; + + // RawSpeed Supported, + INT64 spos = ID.input->tell(); + void *_rawspeed_buffer = 0; + try + { + ID.input->seek(0, SEEK_SET); + INT64 _rawspeed_buffer_sz = ID.input->size() + 32; + _rawspeed_buffer = malloc(_rawspeed_buffer_sz); + if (!_rawspeed_buffer) + throw LIBRAW_EXCEPTION_ALLOC; + ID.input->read(_rawspeed_buffer, _rawspeed_buffer_sz, 1); + RawSpeed::FileMap map((RawSpeed::uchar8 *)_rawspeed_buffer, _rawspeed_buffer_sz); + RawSpeed::RawParser t(&map); + RawSpeed::RawDecoder *d = 0; + CameraMetaDataLR *meta = + static_cast(_rawspeed_camerameta); + d = t.getDecoder(); + if (!d) + throw "Unable to find decoder"; + +#ifdef USE_RAWSPEED_BITS + if (imgdata.rawparams.use_rawspeed & LIBRAW_RAWSPEEDV1_FAILONUNKNOWN) + d->failOnUnknown = TRUE; + else + d->failOnUnknown = FALSE; +#endif + d->interpolateBadPixels = FALSE; + d->applyStage1DngOpcodes = FALSE; + + try + { + d->checkSupport(meta); + } + catch (const RawSpeed::RawDecoderException &e) + { + imgdata.process_warnings |= LIBRAW_WARN_RAWSPEED_UNSUPPORTED; + throw e; + } + _rawspeed_decoder = static_cast(d); + d->decodeRaw(); + d->decodeMetaData(meta); + RawSpeed::RawImage r = d->mRaw; + if (r->errors.size() > 0 && !rawspeed_ignore_errors) + { + delete d; + _rawspeed_decoder = 0; + throw 1; + } + if (r->isCFA) + { + imgdata.rawdata.raw_image = (ushort *)r->getDataUncropped(0, 0); + } + else if (r->getCpp() == 4) + { + imgdata.rawdata.color4_image = (ushort(*)[4])r->getDataUncropped(0, 0); + if (r->whitePoint > 0 && r->whitePoint < 65536) + C.maximum = r->whitePoint; + } + else if (r->getCpp() == 3) + { + imgdata.rawdata.color3_image = (ushort(*)[3])r->getDataUncropped(0, 0); + if (r->whitePoint > 0 && r->whitePoint < 65536) + C.maximum = r->whitePoint; + } + else + { + delete d; + _rawspeed_decoder = 0; + ret = LIBRAW_UNSPECIFIED_ERROR; + } + if (_rawspeed_decoder) + { + // set sizes + RawSpeed::iPoint2D rsdim = r->getUncroppedDim(); + S.raw_pitch = r->pitch; + S.raw_width = rsdim.x; + S.raw_height = rsdim.y; + // C.maximum = r->whitePoint; + fix_after_rawspeed(r->blackLevel); + } + free(_rawspeed_buffer); + _rawspeed_buffer = 0; + imgdata.process_warnings |= LIBRAW_WARN_RAWSPEED_PROCESSED; + } + catch (const RawSpeed::RawDecoderException &RDE) + { + imgdata.process_warnings |= LIBRAW_WARN_RAWSPEED_PROBLEM; + if (_rawspeed_buffer) + { + free(_rawspeed_buffer); + _rawspeed_buffer = 0; + } + if (!strncmp(RDE.what(), "Decoder canceled", strlen("Decoder canceled"))) + throw LIBRAW_EXCEPTION_CANCELLED_BY_CALLBACK; + ret = LIBRAW_UNSPECIFIED_ERROR; + } + catch (...) + { + // We may get here due to cancellation flag + imgdata.process_warnings |= LIBRAW_WARN_RAWSPEED_PROBLEM; + if (_rawspeed_buffer) + { + free(_rawspeed_buffer); + _rawspeed_buffer = 0; + } + ret = LIBRAW_UNSPECIFIED_ERROR; + } + ID.input->seek(spos, SEEK_SET); + + return ret; +#else + return LIBRAW_NOT_IMPLEMENTED; +#endif +} +#endif diff --git a/rtengine/libraw/src/libraw_c_api.cpp b/rtengine/libraw/src/libraw_c_api.cpp new file mode 100644 index 000000000..2609fef70 --- /dev/null +++ b/rtengine/libraw/src/libraw_c_api.cpp @@ -0,0 +1,457 @@ +/* -*- C++ -*- + * File: libraw_c_api.cpp + * Copyright 2008-2024 LibRaw LLC (info@libraw.org) + * Created: Sat Mar 8 , 2008 + * + * LibRaw C interface + + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include +#include +#include "libraw/libraw.h" + +#ifdef __cplusplus +#include +extern "C" +{ +#endif + + libraw_data_t *libraw_init(unsigned int flags) + { + LibRaw *ret; + try + { + ret = new LibRaw(flags); + } + catch (const std::bad_alloc& ) + { + return NULL; + } + return &(ret->imgdata); + } + + unsigned libraw_capabilities() { return LibRaw::capabilities(); } + const char *libraw_version() { return LibRaw::version(); } + const char *libraw_strprogress(enum LibRaw_progress p) + { + return LibRaw::strprogress(p); + } + int libraw_versionNumber() { return LibRaw::versionNumber(); } + const char **libraw_cameraList() { return LibRaw::cameraList(); } + int libraw_cameraCount() { return LibRaw::cameraCount(); } + const char *libraw_unpack_function_name(libraw_data_t *lr) + { + if (!lr) + return "NULL parameter passed"; + LibRaw *ip = (LibRaw *)lr->parent_class; + return ip->unpack_function_name(); + } + + void libraw_subtract_black(libraw_data_t *lr) + { + if (!lr) + return; + LibRaw *ip = (LibRaw *)lr->parent_class; + ip->subtract_black(); + } + + int libraw_open_file(libraw_data_t *lr, const char *file) + { + if (!lr) + return EINVAL; + LibRaw *ip = (LibRaw *)lr->parent_class; + return ip->open_file(file); + } + + libraw_iparams_t *libraw_get_iparams(libraw_data_t *lr) + { + if (!lr) + return NULL; + return &(lr->idata); + } + + libraw_lensinfo_t *libraw_get_lensinfo(libraw_data_t *lr) + { + if (!lr) + return NULL; + return &(lr->lens); + } + + libraw_imgother_t *libraw_get_imgother(libraw_data_t *lr) + { + if (!lr) + return NULL; + return &(lr->other); + } + +#ifndef LIBRAW_NO_IOSTREAMS_DATASTREAM + int libraw_open_file_ex(libraw_data_t *lr, const char *file, INT64 sz) + { + if (!lr) + return EINVAL; + LibRaw *ip = (LibRaw *)lr->parent_class; + return ip->open_file(file, sz); + } +#endif + +#ifdef LIBRAW_WIN32_UNICODEPATHS + int libraw_open_wfile(libraw_data_t *lr, const wchar_t *file) + { + if (!lr) + return EINVAL; + LibRaw *ip = (LibRaw *)lr->parent_class; + return ip->open_file(file); + } + +#ifndef LIBRAW_NO_IOSTREAMS_DATASTREAM + int libraw_open_wfile_ex(libraw_data_t *lr, const wchar_t *file, INT64 sz) + { + if (!lr) + return EINVAL; + LibRaw *ip = (LibRaw *)lr->parent_class; + return ip->open_file(file, sz); + } +#endif +#endif + int libraw_open_buffer(libraw_data_t *lr, const void *buffer, size_t size) + { + if (!lr) + return EINVAL; + LibRaw *ip = (LibRaw *)lr->parent_class; + return ip->open_buffer(buffer, size); + } + int libraw_open_bayer(libraw_data_t *lr, unsigned char *data, + unsigned datalen, ushort _raw_width, ushort _raw_height, + ushort _left_margin, ushort _top_margin, + ushort _right_margin, ushort _bottom_margin, + unsigned char procflags, unsigned char bayer_pattern, + unsigned unused_bits, unsigned otherflags, + unsigned black_level) + { + if (!lr) + return EINVAL; + LibRaw *ip = (LibRaw *)lr->parent_class; + return ip->open_bayer(data, datalen, _raw_width, _raw_height, _left_margin, + _top_margin, _right_margin, _bottom_margin, procflags, + bayer_pattern, unused_bits, otherflags, black_level); + } + int libraw_unpack(libraw_data_t *lr) + { + if (!lr) + return EINVAL; + LibRaw *ip = (LibRaw *)lr->parent_class; + return ip->unpack(); + } + int libraw_unpack_thumb(libraw_data_t *lr) + { + if (!lr) + return EINVAL; + LibRaw *ip = (LibRaw *)lr->parent_class; + return ip->unpack_thumb(); + } + int libraw_unpack_thumb_ex(libraw_data_t *lr, int i) + { + if (!lr) + return EINVAL; + LibRaw *ip = (LibRaw *)lr->parent_class; + return ip->unpack_thumb_ex(i); + } + void libraw_recycle_datastream(libraw_data_t *lr) + { + if (!lr) + return; + LibRaw *ip = (LibRaw *)lr->parent_class; + ip->recycle_datastream(); + } + void libraw_recycle(libraw_data_t *lr) + { + if (!lr) + return; + LibRaw *ip = (LibRaw *)lr->parent_class; + ip->recycle(); + } + void libraw_close(libraw_data_t *lr) + { + if (!lr) + return; + LibRaw *ip = (LibRaw *)lr->parent_class; + delete ip; + } + + void libraw_set_exifparser_handler(libraw_data_t *lr, exif_parser_callback cb, + void *data) + { + if (!lr) + return; + LibRaw *ip = (LibRaw *)lr->parent_class; + ip->set_exifparser_handler(cb, data); + } + + void libraw_set_dataerror_handler(libraw_data_t *lr, data_callback func, + void *data) + { + if (!lr) + return; + LibRaw *ip = (LibRaw *)lr->parent_class; + ip->set_dataerror_handler(func, data); + } + void libraw_set_progress_handler(libraw_data_t *lr, progress_callback cb, + void *data) + { + if (!lr) + return; + LibRaw *ip = (LibRaw *)lr->parent_class; + ip->set_progress_handler(cb, data); + } + + // DCRAW + int libraw_adjust_sizes_info_only(libraw_data_t *lr) + { + if (!lr) + return EINVAL; + LibRaw *ip = (LibRaw *)lr->parent_class; + return ip->adjust_sizes_info_only(); + } + int libraw_dcraw_ppm_tiff_writer(libraw_data_t *lr, const char *filename) + { + if (!lr) + return EINVAL; + LibRaw *ip = (LibRaw *)lr->parent_class; + return ip->dcraw_ppm_tiff_writer(filename); + } + int libraw_dcraw_thumb_writer(libraw_data_t *lr, const char *fname) + { + if (!lr) + return EINVAL; + LibRaw *ip = (LibRaw *)lr->parent_class; + return ip->dcraw_thumb_writer(fname); + } + int libraw_dcraw_process(libraw_data_t *lr) + { + if (!lr) + return EINVAL; + LibRaw *ip = (LibRaw *)lr->parent_class; + return ip->dcraw_process(); + } + libraw_processed_image_t *libraw_dcraw_make_mem_image(libraw_data_t *lr, + int *errc) + { + if (!lr) + { + if (errc) + *errc = EINVAL; + return NULL; + } + LibRaw *ip = (LibRaw *)lr->parent_class; + return ip->dcraw_make_mem_image(errc); + } + libraw_processed_image_t *libraw_dcraw_make_mem_thumb(libraw_data_t *lr, + int *errc) + { + if (!lr) + { + if (errc) + *errc = EINVAL; + return NULL; + } + LibRaw *ip = (LibRaw *)lr->parent_class; + return ip->dcraw_make_mem_thumb(errc); + } + + void libraw_dcraw_clear_mem(libraw_processed_image_t *p) + { + LibRaw::dcraw_clear_mem(p); + } + + int libraw_raw2image(libraw_data_t *lr) + { + if (!lr) + return EINVAL; + LibRaw *ip = (LibRaw *)lr->parent_class; + return ip->raw2image(); + } + void libraw_free_image(libraw_data_t *lr) + { + if (!lr) + return; + LibRaw *ip = (LibRaw *)lr->parent_class; + ip->free_image(); + } + int libraw_get_decoder_info(libraw_data_t *lr, libraw_decoder_info_t *d) + { + if (!lr || !d) + return EINVAL; + LibRaw *ip = (LibRaw *)lr->parent_class; + return ip->get_decoder_info(d); + } + int libraw_COLOR(libraw_data_t *lr, int row, int col) + { + if (!lr) + return EINVAL; + LibRaw *ip = (LibRaw *)lr->parent_class; + return ip->COLOR(row, col); + } + + /* getters/setters used by 3DLut Creator */ + DllDef void libraw_set_demosaic(libraw_data_t *lr, int value) + { + if (!lr) + return; + LibRaw *ip = (LibRaw *)lr->parent_class; + ip->imgdata.params.user_qual = value; + } + + DllDef void libraw_set_output_color(libraw_data_t *lr, int value) + { + if (!lr) + return; + LibRaw *ip = (LibRaw *)lr->parent_class; + ip->imgdata.params.output_color = value; + } + + DllDef void libraw_set_adjust_maximum_thr(libraw_data_t *lr, float value) + { + if (!lr) + return; + LibRaw *ip = (LibRaw *)lr->parent_class; + ip->imgdata.params.adjust_maximum_thr = value; + } + + DllDef void libraw_set_output_bps(libraw_data_t *lr, int value) + { + if (!lr) + return; + LibRaw *ip = (LibRaw *)lr->parent_class; + ip->imgdata.params.output_bps = value; + } + + DllDef void libraw_set_output_tif(libraw_data_t *lr, int value) + { + if (!lr) + return; + LibRaw *ip = (LibRaw *)lr->parent_class; + ip->imgdata.params.output_tiff = value; + } + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#define LIM(x, min, max) MAX(min, MIN(x, max)) + + DllDef void libraw_set_user_mul(libraw_data_t *lr, int index, float val) + { + if (!lr) + return; + LibRaw *ip = (LibRaw *)lr->parent_class; + ip->imgdata.params.user_mul[LIM(index, 0, 3)] = val; + } + + DllDef void libraw_set_gamma(libraw_data_t *lr, int index, float value) + { + if (!lr) + return; + LibRaw *ip = (LibRaw *)lr->parent_class; + ip->imgdata.params.gamm[LIM(index, 0, 5)] = value; + } + + DllDef void libraw_set_no_auto_bright(libraw_data_t *lr, int value) + { + if (!lr) + return; + LibRaw *ip = (LibRaw *)lr->parent_class; + ip->imgdata.params.no_auto_bright = value; + } + + DllDef void libraw_set_bright(libraw_data_t *lr, float value) + { + if (!lr) + return; + LibRaw *ip = (LibRaw *)lr->parent_class; + ip->imgdata.params.bright = value; + } + + DllDef void libraw_set_highlight(libraw_data_t *lr, int value) + { + if (!lr) + return; + LibRaw *ip = (LibRaw *)lr->parent_class; + ip->imgdata.params.highlight = value; + } + + DllDef void libraw_set_fbdd_noiserd(libraw_data_t *lr, int value) + { + if (!lr) + return; + LibRaw *ip = (LibRaw *)lr->parent_class; + ip->imgdata.params.fbdd_noiserd = value; + } + + DllDef int libraw_get_raw_height(libraw_data_t *lr) + { + if (!lr) + return EINVAL; + return lr->sizes.raw_height; + } + + DllDef int libraw_get_raw_width(libraw_data_t *lr) + { + if (!lr) + return EINVAL; + return lr->sizes.raw_width; + } + + DllDef int libraw_get_iheight(libraw_data_t *lr) + { + if (!lr) + return EINVAL; + return lr->sizes.iheight; + } + + DllDef int libraw_get_iwidth(libraw_data_t *lr) + { + if (!lr) + return EINVAL; + return lr->sizes.iwidth; + } + + DllDef float libraw_get_cam_mul(libraw_data_t *lr, int index) + { + if (!lr) + return EINVAL; + return lr->color.cam_mul[LIM(index, 0, 3)]; + } + + DllDef float libraw_get_pre_mul(libraw_data_t *lr, int index) + { + if (!lr) + return EINVAL; + return lr->color.pre_mul[LIM(index, 0, 3)]; + } + + DllDef float libraw_get_rgb_cam(libraw_data_t *lr, int index1, int index2) + { + if (!lr) + return EINVAL; + return lr->color.rgb_cam[LIM(index1, 0, 2)][LIM(index2, 0, 3)]; + } + + DllDef int libraw_get_color_maximum(libraw_data_t *lr) + { + if (!lr) + return EINVAL; + return lr->color.maximum; + } + +#ifdef __cplusplus +} +#endif diff --git a/rtengine/libraw/src/libraw_datastream.cpp b/rtengine/libraw/src/libraw_datastream.cpp new file mode 100644 index 000000000..33182253d --- /dev/null +++ b/rtengine/libraw/src/libraw_datastream.cpp @@ -0,0 +1,982 @@ +/* -*- C++ -*- + * File: libraw_datastream.cpp + * Copyright 2008-2024 LibRaw LLC (info@libraw.org) + * + * LibRaw C++ interface (implementation) + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + +*/ + +#ifdef _WIN32 +#ifdef __MINGW32__ +#define _WIN32_WINNT 0x0500 +#include +#endif +#endif + +#define LIBRAW_LIBRARY_BUILD +#include "libraw/libraw.h" +#include "libraw/libraw_types.h" +#include "libraw/libraw_datastream.h" +#include +#ifdef USE_JPEG +#include +#include +#else +#define NO_JPEG +#endif + +#ifdef USE_JPEG + +typedef struct +{ + struct jpeg_source_mgr pub; /* public fields */ + LibRaw_abstract_datastream *instream; /* source stream */ + JOCTET *buffer; /* start of buffer */ + boolean start_of_file; /* have we gotten any data yet? */ +} lr_jpg_source_mgr; + +typedef lr_jpg_source_mgr *lr_jpg_src_ptr; + +#define LR_JPEG_INPUT_BUF_SIZE 16384 + +static void f_init_source(j_decompress_ptr cinfo) +{ + lr_jpg_src_ptr src = (lr_jpg_src_ptr)cinfo->src; + src->start_of_file = TRUE; +} + +#ifdef ERREXIT +#undef ERREXIT +#endif + +#define ERREXIT(cinfo, code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->error_exit)((j_common_ptr)(cinfo))) + +static boolean lr_fill_input_buffer(j_decompress_ptr cinfo) +{ + lr_jpg_src_ptr src = (lr_jpg_src_ptr)cinfo->src; + size_t nbytes; + + nbytes = src->instream->read((void*)src->buffer, 1, LR_JPEG_INPUT_BUF_SIZE); + + if (nbytes <= 0) + { + if (src->start_of_file) /* Treat empty input file as fatal error */ + ERREXIT(cinfo, JERR_INPUT_EMPTY); + WARNMS(cinfo, JWRN_JPEG_EOF); + /* Insert a fake EOI marker */ + src->buffer[0] = (JOCTET)0xFF; + src->buffer[1] = (JOCTET)JPEG_EOI; + nbytes = 2; + } + + src->pub.next_input_byte = src->buffer; + src->pub.bytes_in_buffer = nbytes; + src->start_of_file = FALSE; + return TRUE; +} + +static void lr_skip_input_data(j_decompress_ptr cinfo, long num_bytes) +{ + struct jpeg_source_mgr *src = cinfo->src; + if (num_bytes > 0) + { + while (num_bytes > (long)src->bytes_in_buffer) + { + num_bytes -= (long)src->bytes_in_buffer; + (void)(*src->fill_input_buffer)(cinfo); + /* note we assume that fill_input_buffer will never return FALSE, + * so suspension need not be handled. + */ + } + src->next_input_byte += (size_t)num_bytes; + src->bytes_in_buffer -= (size_t)num_bytes; + } +} + +static void lr_term_source(j_decompress_ptr /*cinfo*/) {} + +static void lr_jpeg_src(j_decompress_ptr cinfo, LibRaw_abstract_datastream *inf) +{ + lr_jpg_src_ptr src; + if (cinfo->src == NULL) + { /* first time for this JPEG object? */ + cinfo->src = (struct jpeg_source_mgr *)(*cinfo->mem->alloc_small)( + (j_common_ptr)cinfo, JPOOL_PERMANENT, sizeof(lr_jpg_source_mgr)); + src = (lr_jpg_src_ptr)cinfo->src; + src->buffer = (JOCTET *)(*cinfo->mem->alloc_small)( + (j_common_ptr)cinfo, JPOOL_PERMANENT, + LR_JPEG_INPUT_BUF_SIZE * sizeof(JOCTET)); + } + else if (cinfo->src->init_source != f_init_source) + { + ERREXIT(cinfo, JERR_BUFFER_SIZE); + } + + src = (lr_jpg_src_ptr)cinfo->src; + src->pub.init_source = f_init_source; + src->pub.fill_input_buffer = lr_fill_input_buffer; + src->pub.skip_input_data = lr_skip_input_data; + src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */ + src->pub.term_source = lr_term_source; + src->instream = inf; + src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */ + src->pub.next_input_byte = NULL; /* until buffer loaded */ +} +#endif + +int LibRaw_abstract_datastream::jpeg_src(void *jpegdata) +{ +#ifdef NO_JPEG + return -1; +#else + j_decompress_ptr cinfo = (j_decompress_ptr)jpegdata; + buffering_off(); + lr_jpeg_src(cinfo, this); + return 0; // OK +#endif +} + + +#ifndef LIBRAW_NO_IOSTREAMS_DATASTREAM +// == LibRaw_file_datastream == + +LibRaw_file_datastream::LibRaw_file_datastream(const char *fname) + : filename(fname), _fsize(0) +#ifdef LIBRAW_WIN32_UNICODEPATHS + , + wfilename() +#endif +{ + if (filename.size() > 0) + { +#ifndef LIBRAW_WIN32_CALLS + struct stat st; + if (!stat(filename.c_str(), &st)) + _fsize = st.st_size; +#else + struct _stati64 st; + if (!_stati64(filename.c_str(), &st)) + _fsize = st.st_size; +#endif +#ifdef LIBRAW_USE_AUTOPTR + std::auto_ptr buf(new std::filebuf()); +#else + std::unique_ptr buf(new std::filebuf()); +#endif + buf->open(filename.c_str(), std::ios_base::in | std::ios_base::binary); + if (buf->is_open()) + { +#ifdef LIBRAW_USE_AUTOPTR + f = buf; +#else + f = std::move(buf); +#endif + } + } +} +#ifdef LIBRAW_WIN32_UNICODEPATHS +LibRaw_file_datastream::LibRaw_file_datastream(const wchar_t *fname) + : filename(), wfilename(fname), _fsize(0) +{ + if (wfilename.size() > 0) + { + struct _stati64 st; + if (!_wstati64(wfilename.c_str(), &st)) + _fsize = st.st_size; +#ifdef LIBRAW_USE_AUTOPTR + std::auto_ptr buf(new std::filebuf()); +#else + std::unique_ptr buf(new std::filebuf()); +#endif + buf->open(wfilename.c_str(), std::ios_base::in | std::ios_base::binary); + if (buf->is_open()) + { +#ifdef LIBRAW_USE_AUTOPTR + f = buf; +#else + f = std::move(buf); +#endif + } + } +} +const wchar_t *LibRaw_file_datastream::wfname() +{ + return wfilename.size() > 0 ? wfilename.c_str() : NULL; +} +#endif + +int LibRaw_file_datastream::valid() { return f.get() ? 1 : 0; } + +#define LR_STREAM_CHK() \ + do \ + { \ + if (!f.get()) \ + throw LIBRAW_EXCEPTION_IO_EOF; \ + } while (0) + +int LibRaw_file_datastream::read(void *ptr, size_t size, size_t nmemb) +{ +/* Visual Studio 2008 marks sgetn as insecure, but VS2010 does not. */ +#if defined(WIN32SECURECALLS) && (_MSC_VER < 1600) + LR_STREAM_CHK(); + return int(f->_Sgetn_s(static_cast(ptr), nmemb * size, nmemb * size) / + (size > 0 ? size : 1)); +#else + LR_STREAM_CHK(); + return int(f->sgetn(static_cast(ptr), std::streamsize(nmemb * size)) / + (size > 0 ? size : 1)); +#endif +} + +int LibRaw_file_datastream::eof() +{ + LR_STREAM_CHK(); + return f->sgetc() == EOF; +} + +int LibRaw_file_datastream::seek(INT64 o, int whence) +{ + LR_STREAM_CHK(); + std::ios_base::seekdir dir; + switch (whence) + { + case SEEK_SET: + dir = std::ios_base::beg; + break; + case SEEK_CUR: + dir = std::ios_base::cur; + break; + case SEEK_END: + dir = std::ios_base::end; + break; + default: + dir = std::ios_base::beg; + } + return f->pubseekoff((long)o, dir) < 0; +} + +INT64 LibRaw_file_datastream::tell() +{ + LR_STREAM_CHK(); + return f->pubseekoff(0, std::ios_base::cur); +} + +char *LibRaw_file_datastream::gets(char *str, int sz) +{ + if(sz<1) return NULL; + LR_STREAM_CHK(); + std::istream is(f.get()); + is.getline(str, sz); + if (is.fail()) + return 0; + return str; +} + +int LibRaw_file_datastream::scanf_one(const char *fmt, void *val) +{ + LR_STREAM_CHK(); + + std::istream is(f.get()); + + /* HUGE ASSUMPTION: *fmt is either "%d" or "%f" */ + if (strcmp(fmt, "%d") == 0) + { + int d; + is >> d; + if (is.fail()) + return EOF; + *(static_cast(val)) = d; + } + else + { + float f; + is >> f; + if (is.fail()) + return EOF; + *(static_cast(val)) = f; + } + + return 1; +} + +const char *LibRaw_file_datastream::fname() +{ + return filename.size() > 0 ? filename.c_str() : NULL; +} + +#undef LR_STREAM_CHK + +#endif + +// == LibRaw_buffer_datastream +LibRaw_buffer_datastream::LibRaw_buffer_datastream(const void *buffer, size_t bsize) +{ + buf = (unsigned char *)buffer; + streampos = 0; + streamsize = bsize; +} + +LibRaw_buffer_datastream::~LibRaw_buffer_datastream() {} + +int LibRaw_buffer_datastream::read(void *ptr, size_t sz, size_t nmemb) +{ + size_t to_read = sz * nmemb; + if (to_read > streamsize - streampos) + to_read = streamsize - streampos; + if (to_read < 1) + return 0; + memmove(ptr, buf + streampos, to_read); + streampos += to_read; + return int((to_read + sz - 1) / (sz > 0 ? sz : 1)); +} + +int LibRaw_buffer_datastream::seek(INT64 o, int whence) +{ + switch (whence) + { + case SEEK_SET: + if (o < 0) + streampos = 0; + else if (size_t(o) > streamsize) + streampos = streamsize; + else + streampos = size_t(o); + return 0; + case SEEK_CUR: + if (o < 0) + { + if (size_t(-o) >= streampos) + streampos = 0; + else + streampos += (size_t)o; + } + else if (o > 0) + { + if (o + streampos > streamsize) + streampos = streamsize; + else + streampos += (size_t)o; + } + return 0; + case SEEK_END: + if (o > 0) + streampos = streamsize; + else if (size_t(-o) > streamsize) + streampos = 0; + else + streampos = streamsize + (size_t)o; + return 0; + default: + return 0; + } +} + +INT64 LibRaw_buffer_datastream::tell() +{ + return INT64(streampos); +} + +char *LibRaw_buffer_datastream::gets(char *s, int sz) +{ + if(sz<1) return NULL; + unsigned char *psrc, *pdest, *str; + str = (unsigned char *)s; + psrc = buf + streampos; + pdest = str; + if(streampos >= streamsize) return NULL; + while ((size_t(psrc - buf) < streamsize) && ((pdest - str) < (sz-1))) + { + *pdest = *psrc; + if (*psrc == '\n') + break; + psrc++; + pdest++; + } + if (size_t(psrc - buf) < streamsize) + psrc++; + if ((pdest - str) < sz-1) + *(++pdest) = 0; + else + s[sz - 1] = 0; // ensure trailing zero + + streampos = psrc - buf; + return s; +} + +int LibRaw_buffer_datastream::scanf_one(const char *fmt, void *val) +{ + int scanf_res; + if (streampos > streamsize) + return 0; +#ifndef WIN32SECURECALLS + scanf_res = sscanf((char *)(buf + streampos), fmt, val); +#else + scanf_res = sscanf_s((char *)(buf + streampos), fmt, val); +#endif + if (scanf_res > 0) + { + int xcnt = 0; + while (streampos < streamsize-1) + { + streampos++; + xcnt++; + if (buf[streampos] == 0 || buf[streampos] == ' ' || + buf[streampos] == '\t' || buf[streampos] == '\n' || xcnt > 24) + break; + } + } + return scanf_res; +} + +int LibRaw_buffer_datastream::eof() +{ + return streampos >= streamsize; +} +int LibRaw_buffer_datastream::valid() { return buf ? 1 : 0; } + + +int LibRaw_buffer_datastream::jpeg_src(void *jpegdata) +{ +#if defined(NO_JPEG) || !defined(USE_JPEG) + return -1; +#else + j_decompress_ptr cinfo = (j_decompress_ptr)jpegdata; + jpeg_mem_src(cinfo, (unsigned char *)buf + streampos,(unsigned long)(streamsize - streampos)); + return 0; +#endif +} + +// int LibRaw_buffer_datastream + +// == LibRaw_bigfile_datastream +LibRaw_bigfile_datastream::LibRaw_bigfile_datastream(const char *fname) + : filename(fname) +#ifdef LIBRAW_WIN32_UNICODEPATHS + , + wfilename() +#endif +{ + if (filename.size() > 0) + { +#ifndef LIBRAW_WIN32_CALLS + struct stat st; + if (!stat(filename.c_str(), &st)) + _fsize = st.st_size; +#else + struct _stati64 st; + if (!_stati64(filename.c_str(), &st)) + _fsize = st.st_size; +#endif + +#ifndef WIN32SECURECALLS + f = fopen(fname, "rb"); +#else + if (fopen_s(&f, fname, "rb")) + f = 0; +#endif + } + else + { + filename = std::string(); + f = 0; + } +} + +#ifdef LIBRAW_WIN32_UNICODEPATHS +LibRaw_bigfile_datastream::LibRaw_bigfile_datastream(const wchar_t *fname) + : filename(), wfilename(fname) +{ + if (wfilename.size() > 0) + { + struct _stati64 st; + if (!_wstati64(wfilename.c_str(), &st)) + _fsize = st.st_size; +#ifndef WIN32SECURECALLS + f = _wfopen(wfilename.c_str(), L"rb"); +#else + if (_wfopen_s(&f, fname, L"rb")) + f = 0; +#endif + } + else + { + wfilename = std::wstring(); + f = 0; + } +} +const wchar_t *LibRaw_bigfile_datastream::wfname() +{ + return wfilename.size() > 0 ? wfilename.c_str() : NULL; +} +#endif + +LibRaw_bigfile_datastream::~LibRaw_bigfile_datastream() +{ + if (f) + fclose(f); +} +int LibRaw_bigfile_datastream::valid() { return f ? 1 : 0; } + +#define LR_BF_CHK() \ + do \ + { \ + if (!f) \ + throw LIBRAW_EXCEPTION_IO_EOF; \ + } while (0) + +int LibRaw_bigfile_datastream::read(void *ptr, size_t size, size_t nmemb) +{ + LR_BF_CHK(); + return int(fread(ptr, size, nmemb, f)); +} + +int LibRaw_bigfile_datastream::eof() +{ + LR_BF_CHK(); + return feof(f); +} + +int LibRaw_bigfile_datastream::seek(INT64 o, int whence) +{ + LR_BF_CHK(); +#if defined(_WIN32) +#ifdef WIN32SECURECALLS + return _fseeki64(f, o, whence); +#else + return fseek(f, (long)o, whence); +#endif +#else + return fseeko(f, o, whence); +#endif +} + +INT64 LibRaw_bigfile_datastream::tell() +{ + LR_BF_CHK(); +#if defined(_WIN32) +#ifdef WIN32SECURECALLS + return _ftelli64(f); +#else + return ftell(f); +#endif +#else + return ftello(f); +#endif +} + +char *LibRaw_bigfile_datastream::gets(char *str, int sz) +{ + if(sz<1) return NULL; + LR_BF_CHK(); + return fgets(str, sz, f); +} + +int LibRaw_bigfile_datastream::scanf_one(const char *fmt, void *val) +{ + LR_BF_CHK(); + return +#ifndef WIN32SECURECALLS + fscanf(f, fmt, val) +#else + fscanf_s(f, fmt, val) +#endif + ; +} + +const char *LibRaw_bigfile_datastream::fname() +{ + return filename.size() > 0 ? filename.c_str() : NULL; +} + +// == LibRaw_windows_datastream +#ifdef LIBRAW_WIN32_CALLS + +LibRaw_windows_datastream::LibRaw_windows_datastream(const TCHAR *sFile) + : LibRaw_buffer_datastream(NULL, 0), hMap_(0), pView_(NULL) +{ +#if defined(WINAPI_FAMILY) && defined(WINAPI_FAMILY_APP) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) + HANDLE hFile = CreateFile2(sFile, GENERIC_READ, 0, OPEN_EXISTING, 0); +#else + HANDLE hFile = CreateFile(sFile, GENERIC_READ, 0, 0, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, 0); +#endif + if (hFile == INVALID_HANDLE_VALUE) + throw std::runtime_error("failed to open the file"); + + try + { + Open(hFile); + } + catch (...) + { + CloseHandle(hFile); + throw; + } + + CloseHandle(hFile); // windows will defer the actual closing of this handle + // until the hMap_ is closed + reconstruct_base(); +} + +// ctor: construct with a file handle - caller is responsible for closing the +// file handle +LibRaw_windows_datastream::LibRaw_windows_datastream(HANDLE hFile) + : LibRaw_buffer_datastream(NULL, 0), hMap_(0), pView_(NULL) +{ + Open(hFile); + reconstruct_base(); +} + +// dtor: unmap and close the mapping handle +LibRaw_windows_datastream::~LibRaw_windows_datastream() +{ + if (pView_ != NULL) + ::UnmapViewOfFile(pView_); + + if (hMap_ != 0) + ::CloseHandle(hMap_); +} + +void LibRaw_windows_datastream::Open(HANDLE hFile) +{ + // create a file mapping handle on the file handle + hMap_ = ::CreateFileMapping(hFile, 0, PAGE_READONLY, 0, 0, 0); + if (hMap_ == NULL) + throw std::runtime_error("failed to create file mapping"); + + // now map the whole file base view + if (!::GetFileSizeEx(hFile, (PLARGE_INTEGER)&cbView_)) + throw std::runtime_error("failed to get the file size"); + + pView_ = ::MapViewOfFile(hMap_, FILE_MAP_READ, 0, 0, (size_t)cbView_); + if (pView_ == NULL) + throw std::runtime_error("failed to map the file"); +} + +#endif + +#if defined (LIBRAW_NO_IOSTREAMS_DATASTREAM) && defined (LIBRAW_WIN32_CALLS) + +/* LibRaw_bigfile_buffered_datastream: copypasted from LibRaw_bigfile_datastream + extra cache on read */ + +#undef LR_BF_CHK +#define LR_BF_CHK() \ + do \ + { \ + if (fhandle ==0 || fhandle == INVALID_HANDLE_VALUE) \ + throw LIBRAW_EXCEPTION_IO_EOF; \ + } while (0) + +#define LIBRAW_BUFFER_ALIGN 4096 + +int LibRaw_bufio_params::bufsize = 16384; + +void LibRaw_bufio_params::set_bufsize(int bs) +{ + if (bs > 0) + bufsize = bs; +} + + +LibRaw_bigfile_buffered_datastream::LibRaw_bigfile_buffered_datastream(const char *fname) + : filename(fname), _fsize(0), _fpos(0) +#ifdef LIBRAW_WIN32_UNICODEPATHS + , wfilename() +#endif + , iobuffers(), buffered(1) +{ + if (filename.size() > 0) + { + std::string fn(fname); + std::wstring fpath(fn.begin(), fn.end()); +#if defined(WINAPI_FAMILY) && defined(WINAPI_FAMILY_APP) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) + if ((fhandle = CreateFile2(fpath.c_str(), GENERIC_READ, 0, OPEN_EXISTING, 0)) != INVALID_HANDLE_VALUE) +#else + if ((fhandle = CreateFileW(fpath.c_str(), GENERIC_READ, FILE_SHARE_READ, 0, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)) != INVALID_HANDLE_VALUE) +#endif + { + LARGE_INTEGER fs; + if (GetFileSizeEx(fhandle, &fs)) + _fsize = fs.QuadPart; + } + } + else + { + filename = std::string(); + fhandle = INVALID_HANDLE_VALUE; + } +} + +#ifdef LIBRAW_WIN32_UNICODEPATHS +LibRaw_bigfile_buffered_datastream::LibRaw_bigfile_buffered_datastream(const wchar_t *fname) + : filename(), _fsize(0), _fpos(0), + wfilename(fname), iobuffers(), buffered(1) +{ + if (wfilename.size() > 0) + { +#if defined(WINAPI_FAMILY) && defined(WINAPI_FAMILY_APP) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) + if ((fhandle = CreateFile2(wfilename.c_str(), GENERIC_READ, 0, OPEN_EXISTING, 0)) != INVALID_HANDLE_VALUE) +#else + if ((fhandle = CreateFileW(wfilename.c_str(), GENERIC_READ, FILE_SHARE_READ, 0, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)) != INVALID_HANDLE_VALUE) +#endif + { + LARGE_INTEGER fs; + if (GetFileSizeEx(fhandle, &fs)) + _fsize = fs.QuadPart; + } + + } + else + { + wfilename = std::wstring(); + fhandle = INVALID_HANDLE_VALUE; + } +} + +const wchar_t *LibRaw_bigfile_buffered_datastream::wfname() +{ + return wfilename.size() > 0 ? wfilename.c_str() : NULL; +} +#endif + +LibRaw_bigfile_buffered_datastream::~LibRaw_bigfile_buffered_datastream() +{ + if (valid()) + CloseHandle(fhandle); +} +int LibRaw_bigfile_buffered_datastream::valid() { + return (fhandle != NULL) && (fhandle != INVALID_HANDLE_VALUE); +} + +const char *LibRaw_bigfile_buffered_datastream::fname() +{ + return filename.size() > 0 ? filename.c_str() : NULL; +} + + +INT64 LibRaw_bigfile_buffered_datastream::readAt(void *ptr, size_t size, INT64 off) +{ + LR_BF_CHK(); + DWORD NumberOfBytesRead; + DWORD nNumberOfBytesToRead = (DWORD)size; + struct _OVERLAPPED olap; + memset(&olap, 0, sizeof(olap)); + olap.Offset = off & 0xffffffff; + olap.OffsetHigh = off >> 32; + if (ReadFile(fhandle, ptr, nNumberOfBytesToRead, &NumberOfBytesRead, &olap)) + return NumberOfBytesRead; + else + return 0; +} + +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#define MIN(a, b) ((a) < (b) ? (a) : (b)) + +#ifdef _MSC_VER +#pragma intrinsic(memcpy) +#endif + +int LibRaw_bigfile_buffered_datastream::read(void *data, size_t size, size_t nmemb) +{ + if (size < 1 || nmemb < 1) + return 0; + LR_BF_CHK(); + INT64 count = size * nmemb; + INT64 partbytes = 0; + if (!buffered) + { + INT64 r = readAt(data, count, _fpos); + _fpos += r; + return int(r / size); + } + + unsigned char *fBuffer = (unsigned char*)iobuffers[0].data(); + while (count) + { + INT64 inbuffer = 0; + // See if the request is totally inside buffer. + if (iobuffers[0].contains(_fpos, inbuffer)) + { + if (inbuffer >= count) + { + memcpy(data, fBuffer + (unsigned)(_fpos - iobuffers[0]._bstart), count); + _fpos += count; + return int((count + partbytes) / size); + } + memcpy(data, fBuffer + (_fpos - iobuffers[0]._bstart), inbuffer); + partbytes += inbuffer; + count -= inbuffer; + data = (void *)(((char *)data) + inbuffer); + _fpos += inbuffer; + } + if (count > (INT64) iobuffers[0].size()) + { + fallback: + if (_fpos + count > _fsize) + count = MAX(0, _fsize - _fpos); + if (count > 0) + { + INT64 r = readAt(data, count, _fpos); + _fpos += r; + return int((r + partbytes) / size); + } + else + return 0; + } + + if (!fillBufferAt(0, _fpos)) + goto fallback; + } + return 0; +} + +bool LibRaw_bigfile_buffered_datastream::fillBufferAt(int bi, INT64 off) +{ + if (off < 0LL) return false; + iobuffers[bi]._bstart = off; + if (iobuffers[bi].size() >= LIBRAW_BUFFER_ALIGN * 2)// Align to a file block. + iobuffers[bi]._bstart &= (INT64)~((INT64)(LIBRAW_BUFFER_ALIGN - 1)); + + iobuffers[bi]._bend = MIN(iobuffers[bi]._bstart + (INT64)iobuffers[bi].size(), _fsize); + if (iobuffers[bi]._bend <= off) // Buffer alignment problem, fallback + return false; + INT64 rr = readAt(iobuffers[bi].data(), (uint32_t)(iobuffers[bi]._bend - iobuffers[bi]._bstart), iobuffers[bi]._bstart); + if (rr > 0) + { + iobuffers[bi]._bend = iobuffers[bi]._bstart + rr; + return true; + } + return false; +} + + +int LibRaw_bigfile_buffered_datastream::eof() +{ + LR_BF_CHK(); + return _fpos >= _fsize; +} + +int LibRaw_bigfile_buffered_datastream::seek(INT64 o, int whence) +{ + LR_BF_CHK(); + if (whence == SEEK_SET) _fpos = o; + else if (whence == SEEK_END) _fpos = o > 0 ? _fsize : _fsize + o; + else if (whence == SEEK_CUR) _fpos += o; + return 0; +} + +INT64 LibRaw_bigfile_buffered_datastream::tell() +{ + LR_BF_CHK(); + return _fpos; +} + +char *LibRaw_bigfile_buffered_datastream::gets(char *s, int sz) +{ + if (sz < 1) + return NULL; + else if (sz < 2) + { + s[0] = 0; + return s; + } + + LR_BF_CHK(); + INT64 contains; + int bufindex = selectStringBuffer(sz, contains); + if (bufindex < 0) return NULL; + if (contains >= sz) + { + unsigned char *buf = iobuffers[bufindex].data() + (_fpos - iobuffers[bufindex]._bstart); + int streampos = 0; + int streamsize = contains; + unsigned char *str = (unsigned char *)s; + unsigned char *psrc, *pdest; + psrc = buf + streampos; + pdest = str; + + while ((size_t(psrc - buf) < streamsize) && ((pdest - str) < sz-1)) // sz-1: to append \0 + { + *pdest = *psrc; + if (*psrc == '\n') + break; + psrc++; + pdest++; + } + if (size_t(psrc - buf) < streamsize) + psrc++; + if ((pdest - str) < sz - 1) + *(++pdest) = 0; + else + s[sz - 1] = 0; // ensure trailing zero + streampos = psrc - buf; + _fpos += streampos; + return s; + } + return NULL; +} + +int LibRaw_bigfile_buffered_datastream::selectStringBuffer(INT64 len, INT64& contains) +{ + if (iobuffers[0].contains(_fpos, contains) && contains >= len) + return 0; + + if (iobuffers[1].contains(_fpos, contains) && contains >= len) + return 1; + + fillBufferAt(1, _fpos); + if (iobuffers[1].contains(_fpos, contains) && contains >= len) + return 1; + return -1; +} + +int LibRaw_bigfile_buffered_datastream::scanf_one(const char *fmt, void *val) +{ + LR_BF_CHK(); + INT64 contains = 0; + int bufindex = selectStringBuffer(24, contains); + if (bufindex < 0) return -1; + if (contains >= 24) + { + unsigned char *bstart = iobuffers[bufindex].data() + (_fpos - iobuffers[bufindex]._bstart); + int streampos = 0; + int streamsize = contains; + int +#ifndef WIN32SECURECALLS + scanf_res = sscanf((char *)(bstart), fmt, val); +#else + scanf_res = sscanf_s((char *)(bstart), fmt, val); +#endif + if (scanf_res > 0) + { + int xcnt = 0; + while (streampos < streamsize) + { + streampos++; + xcnt++; + if (bstart[streampos] == 0 || bstart[streampos] == ' ' || + bstart[streampos] == '\t' || bstart[streampos] == '\n' || xcnt > 24) + break; + } + _fpos += streampos; + return scanf_res; + } + } + return -1; +} + +#endif + diff --git a/rtengine/libraw/src/metadata/adobepano.cpp b/rtengine/libraw/src/metadata/adobepano.cpp new file mode 100644 index 000000000..ee1d2c8a1 --- /dev/null +++ b/rtengine/libraw/src/metadata/adobepano.cpp @@ -0,0 +1,154 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +void LibRaw::parseAdobePanoMakernote() +{ + uchar *PrivateMknBuf; + unsigned posPrivateMknBuf; + unsigned PrivateMknLength; + unsigned PrivateOrder; + unsigned PrivateEntries, PrivateTagID, PrivateTagType, PrivateTagCount; + unsigned PrivateTagBytes; + int truncated; + +#define CHECKSPACE(s) \ + if (posPrivateMknBuf + (s) > PrivateMknLength) \ + { \ + free(PrivateMknBuf); \ + return; \ + } + + order = 0x4d4d; + truncated = 0; + PrivateMknLength = get4(); + + if ((PrivateMknLength > 4) && (PrivateMknLength < 10240000) && + (PrivateMknBuf = (uchar *)malloc(PrivateMknLength + 1024))) + { // 1024b for safety + fread(PrivateMknBuf, PrivateMknLength, 1, ifp); + PrivateOrder = sget2(PrivateMknBuf); + PrivateEntries = sget2(PrivateMknBuf + 2); + if ((PrivateEntries > 1000) || + ((PrivateOrder != 0x4d4d) && (PrivateOrder != 0x4949))) + { + free(PrivateMknBuf); + return; + } + posPrivateMknBuf = 4; + while (PrivateEntries--) + { + order = 0x4d4d; + CHECKSPACE(8); + PrivateTagID = sget2(PrivateMknBuf + posPrivateMknBuf); + PrivateTagType = sget2(PrivateMknBuf + posPrivateMknBuf + 2); + PrivateTagCount = sget4(PrivateMknBuf + posPrivateMknBuf + 4); + posPrivateMknBuf += 8; + order = PrivateOrder; + + if (truncated && !PrivateTagCount) + continue; + + PrivateTagBytes = PrivateTagCount * + tagtype_dataunit_bytes[(PrivateTagType <= LIBRAW_EXIFTAG_TYPE_IFD8) ? PrivateTagType : 0]; + if(PrivateTagBytes > 10240000u) + { + free(PrivateMknBuf); + return; + } + if (PrivateTagID == 0x0002) + { + posPrivateMknBuf += 2; + CHECKSPACE(2); + if (sget2(PrivateMknBuf + posPrivateMknBuf)) + { + truncated = 1; + } + else + { + posPrivateMknBuf += 2; + } + } + else if (PrivateTagID == 0x0013) + { + ushort nWB, cnt, tWB; + CHECKSPACE(2); + nWB = sget2(PrivateMknBuf + posPrivateMknBuf); + posPrivateMknBuf += 2; + if (nWB > 0x100) + break; + for (cnt = 0; cnt < nWB; cnt++) + { + CHECKSPACE(2); + tWB = sget2(PrivateMknBuf + posPrivateMknBuf); + if (tWB < 0x100) + { + CHECKSPACE(4); + icWBC[tWB][0] = sget2(PrivateMknBuf + posPrivateMknBuf + 2); + icWBC[tWB][2] = sget2(PrivateMknBuf + posPrivateMknBuf + 4); + icWBC[tWB][1] = icWBC[tWB][3] = 0x100; + } + posPrivateMknBuf += 6; + } + } + else if (PrivateTagID == 0x0027) + { + ushort nWB, cnt, tWB; + CHECKSPACE(2); + nWB = sget2(PrivateMknBuf + posPrivateMknBuf); + posPrivateMknBuf += 2; + if (nWB > 0x100) + break; + for (cnt = 0; cnt < nWB; cnt++) + { + CHECKSPACE(2); + tWB = sget2(PrivateMknBuf + posPrivateMknBuf); + if (tWB < 0x100) + { + CHECKSPACE(6); + icWBC[tWB][0] = sget2(PrivateMknBuf + posPrivateMknBuf + 2); + icWBC[tWB][1] = icWBC[tWB][3] = + sget2(PrivateMknBuf + posPrivateMknBuf + 4); + icWBC[tWB][2] = sget2(PrivateMknBuf + posPrivateMknBuf + 6); + } + posPrivateMknBuf += 8; + } + } + else if (PrivateTagID == 0x0121) + { + CHECKSPACE(4); + imPana.Multishot = sget4(PrivateMknBuf + posPrivateMknBuf); + posPrivateMknBuf += 4; + } + else + { + if (PrivateTagBytes > 4) + posPrivateMknBuf += PrivateTagBytes; + else if (!truncated) + posPrivateMknBuf += 4; + else + { + if (PrivateTagBytes <= 2) + posPrivateMknBuf += 2; + else + posPrivateMknBuf += 4; + } + } + } + free(PrivateMknBuf); + } +#undef CHECKSPACE +} diff --git a/rtengine/libraw/src/metadata/canon.cpp b/rtengine/libraw/src/metadata/canon.cpp new file mode 100644 index 000000000..eab35e0e8 --- /dev/null +++ b/rtengine/libraw/src/metadata/canon.cpp @@ -0,0 +1,1344 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ +#include "../../internal/dcraw_defs.h" +#include "../../internal/libraw_cameraids.h" + +libraw_area_t LibRaw::get_CanonArea() { + libraw_area_t la = {}; + la.l = get2(); + la.t = get2(); + la.r = get2(); + la.b = get2(); + return la; +} + +float LibRaw::_CanonConvertAperture(ushort in) +{ + if ((in == (ushort)0xffe0) || (in == (ushort)0x7fff)) + return 0.0f; + return LibRaw::libraw_powf64l(2.f, float(in) / 64.f); +} + +static float _CanonConvertEV(short in) +{ + short EV, Sign, Frac; + float Frac_f; + EV = in; + if (EV < 0) + { + EV = -EV; + Sign = -1; + } + else + { + Sign = 1; + } + Frac = EV & 0x1f; + EV -= Frac; // remove fraction + + if (Frac == 0x0c) + { // convert 1/3 and 2/3 codes + Frac_f = 32.0f / 3.0f; + } + else if (Frac == 0x14) + { + Frac_f = 64.0f / 3.0f; + } + else + Frac_f = (float)Frac; + + return ((float)Sign * ((float)EV + Frac_f)) / 32.0f; +} + +void LibRaw::setCanonBodyFeatures(unsigned long long id) +{ + + ilm.CamID = id; + if ((id == CanonID_EOS_1D) || + (id == CanonID_EOS_1D_Mark_II) || + (id == CanonID_EOS_1D_Mark_II_N) || + (id == CanonID_EOS_1D_Mark_III) || + (id == CanonID_EOS_1D_Mark_IV)) + { + ilm.CameraFormat = LIBRAW_FORMAT_APSH; + ilm.CameraMount = LIBRAW_MOUNT_Canon_EF; + } + else if ((id == CanonID_EOS_1Ds) || + (id == CanonID_EOS_1Ds_Mark_II) || + (id == CanonID_EOS_1Ds_Mark_III) || + (id == CanonID_EOS_1D_X) || + (id == CanonID_EOS_1D_X_Mark_II) || + (id == CanonID_EOS_1D_X_Mark_III) || + (id == CanonID_EOS_1D_C) || + (id == CanonID_EOS_5D) || + (id == CanonID_EOS_5D_Mark_II) || + (id == CanonID_EOS_5D_Mark_III) || + (id == CanonID_EOS_5D_Mark_IV) || + (id == CanonID_EOS_5DS) || + (id == CanonID_EOS_5DS_R) || + (id == CanonID_EOS_6D) || + (id == CanonID_EOS_6D_Mark_II)) + { + ilm.CameraFormat = LIBRAW_FORMAT_FF; + ilm.CameraMount = LIBRAW_MOUNT_Canon_EF; + } + else if ((id == CanonID_EOS_M) || + (id == CanonID_EOS_M2) || + (id == CanonID_EOS_M3) || + (id == CanonID_EOS_M5) || + (id == CanonID_EOS_M10) || + (id == CanonID_EOS_M50) || + (id == CanonID_EOS_M50_Mark_II) || + (id == CanonID_EOS_M6) || + (id == CanonID_EOS_M6_Mark_II) || + (id == CanonID_EOS_M100)) + { + ilm.CameraFormat = LIBRAW_FORMAT_APSC; + ilm.CameraMount = LIBRAW_MOUNT_Canon_EF_M; + } + else if ( + (id == CanonID_EOS_R) + || (id == CanonID_EOS_RP) + || (id == CanonID_EOS_R3) + || (id == CanonID_EOS_R5) + || (id == CanonID_EOS_R6) + || (id == CanonID_EOS_R6m2) + || (id == CanonID_EOS_R8) + ) + { + ilm.CameraFormat = LIBRAW_FORMAT_FF; + ilm.CameraMount = LIBRAW_MOUNT_Canon_RF; + ilm.LensFormat = LIBRAW_FORMAT_FF; + ilm.LensMount = LIBRAW_MOUNT_Canon_EF; + } + + else if ( + (id == CanonID_EOS_R7) + || (id == CanonID_EOS_R10) + || (id == CanonID_EOS_R50) + || (id == CanonID_EOS_R100) + ) + { + ilm.CameraFormat = LIBRAW_FORMAT_APSC; + ilm.CameraMount = LIBRAW_MOUNT_Canon_RF; + ilm.LensFormat = LIBRAW_FORMAT_APSC; + ilm.LensMount = LIBRAW_MOUNT_Canon_EF; + } + + else if ((id == CanonID_EOS_D30) || + (id == CanonID_EOS_D60) || + (id > 0x80000000ULL)) + { + ilm.CameraFormat = LIBRAW_FORMAT_APSC; + ilm.CameraMount = LIBRAW_MOUNT_Canon_EF; + } +} + +int CanonCameraInfo_checkFirmwareRecordLocation (uchar *offset) { +// firmware record location allows +// to determine the subversion of the CameraInfo table +// and to adjust offsets accordingly + if ( + isdigit(*offset) && + isdigit(*(offset+2)) && + isdigit(*(offset+4)) && + (*(offset+1) == '.') && + (*(offset+3) == '.') && + ((*(offset+5) == 0) || isspace(*(offset+5))) + ) return 1; + else return 0; // error +} + +void LibRaw::processCanonCameraInfo(unsigned long long id, uchar *CameraInfo, + unsigned maxlen, unsigned type, unsigned dng_writer) +{ + ushort iCanonLensID = 0, iCanonMaxFocal = 0, iCanonMinFocal = 0, + iCanonLens = 0, iCanonCurFocal = 0, iCanonFocalType = 0, + iMakernotesFlip = 0, + iHTP = 0, iALO = 0; + short SubVersion_offset = 0; + ushort SubVersion = 0, mgck = 0; + + if (maxlen < 16) + return; // too short + + mgck = sget2(CameraInfo); + CameraInfo[0] = 0; + CameraInfo[1] = 0; + if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_LONG)) { + if ((maxlen == 94) || (maxlen == 138) || (maxlen == 148) || + (maxlen == 156) || (maxlen == 162) || (maxlen == 167) || + (maxlen == 171) || (maxlen == 264) || (maxlen > 400)) + imCommon.CameraTemperature = float(sget4(CameraInfo + ((maxlen - 3) << 2))); + else if (maxlen == 72) + imCommon.CameraTemperature = float(sget4(CameraInfo + ((maxlen - 1) << 2))); + else if ((maxlen == 85) || (maxlen == 93)) + imCommon.CameraTemperature = float(sget4(CameraInfo + ((maxlen - 2) << 2))); + else if ((maxlen == 96) || (maxlen == 104)) + imCommon.CameraTemperature = float(sget4(CameraInfo + ((maxlen - 4) << 2))); + } + + switch (id) + { + case CanonID_EOS_1D: + case CanonID_EOS_1Ds: + iCanonCurFocal = 0x0a; + iCanonLensID = 0x0d; + iCanonMinFocal = 0x0e; + iCanonMaxFocal = 0x10; + if (!ilm.CurFocal) + ilm.CurFocal = sget2(CameraInfo + iCanonCurFocal); + if (!ilm.MinFocal) + ilm.MinFocal = sget2(CameraInfo + iCanonMinFocal); + if (!ilm.MaxFocal) + ilm.MaxFocal = sget2(CameraInfo + iCanonMaxFocal); + imCommon.CameraTemperature = 0.0f; + break; + + case CanonID_EOS_1D_Mark_II: + case CanonID_EOS_1Ds_Mark_II: + iCanonCurFocal = 0x09; + iCanonLensID = 0x0c; + iCanonMinFocal = 0x11; + iCanonMaxFocal = 0x13; + iCanonFocalType = 0x2d; + break; + + case CanonID_EOS_1D_Mark_II_N: + iCanonCurFocal = 0x09; + iCanonLensID = 0x0c; + iCanonMinFocal = 0x11; + iCanonMaxFocal = 0x13; + break; + + case CanonID_EOS_1D_Mark_III: + case CanonID_EOS_1Ds_Mark_III: + iCanonCurFocal = 0x1d; + iMakernotesFlip = 0x30; + iCanonLensID = 0x111; + iCanonMinFocal = 0x113; + iCanonMaxFocal = 0x115; + break; + + case CanonID_EOS_1D_Mark_IV: + if (CanonCameraInfo_checkFirmwareRecordLocation(CameraInfo + 0x1e8)) + SubVersion = 1; + else if (CanonCameraInfo_checkFirmwareRecordLocation(CameraInfo + 0x1ed)) + SubVersion = 2; +// printf ("==>> CanonID_EOS_1D_Mark_IV, SubVersion: %d\n", SubVersion); + iHTP = 0x07; + iCanonCurFocal = 0x1e; + iMakernotesFlip = 0x35; + + if (!SubVersion) + break; + else if (SubVersion < 2) + SubVersion_offset += -1; + + iCanonLensID = 0x14f+SubVersion_offset; + iCanonMinFocal = 0x151+SubVersion_offset; + iCanonMaxFocal = 0x153+SubVersion_offset; + break; + + case CanonID_EOS_1D_X: + if (CanonCameraInfo_checkFirmwareRecordLocation(CameraInfo + 0x271)) + SubVersion = 1; + else if (CanonCameraInfo_checkFirmwareRecordLocation(CameraInfo + 0x279)) + SubVersion = 2; + else if (CanonCameraInfo_checkFirmwareRecordLocation(CameraInfo + 0x280)) + SubVersion = 3; + else if (CanonCameraInfo_checkFirmwareRecordLocation(CameraInfo + 0x285)) + SubVersion = 4; +// printf ("==>> CanonID_EOS_1D_X, SubVersion: %d\n", SubVersion); + + if (SubVersion < 3) + SubVersion_offset += -3; + + iCanonCurFocal = 0x23+SubVersion_offset; + iMakernotesFlip = 0x7d+SubVersion_offset; + + if (SubVersion < 3) + SubVersion_offset += -4; + else if (SubVersion == 4) + SubVersion_offset += 5; + + iCanonLensID = 0x1a7+SubVersion_offset; + iCanonMinFocal = 0x1a9+SubVersion_offset; + iCanonMaxFocal = 0x1ab+SubVersion_offset; + break; + + case CanonID_EOS_5D: + iMakernotesFlip = 0x27; + iCanonCurFocal = 0x28; + iCanonLensID = 0x0c; + if (!sget2Rev(CameraInfo + iCanonLensID)) + iCanonLensID = 0x97; + iCanonMinFocal = 0x93; + iCanonMaxFocal = 0x95; + break; + + case CanonID_EOS_5D_Mark_II: + iHTP = 0x07; + iCanonCurFocal = 0x1e; + iMakernotesFlip = 0x31; + iALO = 0xbf; + iCanonLensID = 0xe6; + iCanonMinFocal = 0xe8; + iCanonMaxFocal = 0xea; + break; + + case CanonID_EOS_5D_Mark_III: + if (CanonCameraInfo_checkFirmwareRecordLocation(CameraInfo + 0x22c)) + SubVersion = 1; + else if (CanonCameraInfo_checkFirmwareRecordLocation(CameraInfo + 0x22d)) + SubVersion = 2; + else if (CanonCameraInfo_checkFirmwareRecordLocation(CameraInfo + 0x23c)) + SubVersion = 3; + else if (CanonCameraInfo_checkFirmwareRecordLocation(CameraInfo + 0x242)) + SubVersion = 4; + else if (CanonCameraInfo_checkFirmwareRecordLocation(CameraInfo + 0x247)) + SubVersion = 5; +// printf ("==>> CanonID_EOS_5D_Mark_III, SubVersion: %d\n", SubVersion); + + if (!SubVersion) + break; + else if (SubVersion < 3) + SubVersion_offset += -1; + + iCanonCurFocal = 0x23+SubVersion_offset; + + if (SubVersion == 1) + SubVersion_offset += -3; + else if (SubVersion == 2) + SubVersion_offset += -2; + else if (SubVersion >= 4) + SubVersion_offset += 6; + + iMakernotesFlip = 0x7d+SubVersion_offset; + + if (SubVersion < 3) + SubVersion_offset += -4; + else if (SubVersion > 4) + SubVersion_offset += 5; + + iCanonLensID = 0x153+SubVersion_offset; + iCanonMinFocal = 0x155+SubVersion_offset; + iCanonMaxFocal = 0x157+SubVersion_offset; + break; + + case CanonID_EOS_6D: + iCanonCurFocal = 0x23; + iMakernotesFlip = 0x83; + iCanonLensID = 0x161; + iCanonMinFocal = 0x163; + iCanonMaxFocal = 0x165; + break; + + case CanonID_EOS_7D: + if (CanonCameraInfo_checkFirmwareRecordLocation(CameraInfo + 0x1a8)) + SubVersion = 1; + else if (CanonCameraInfo_checkFirmwareRecordLocation(CameraInfo + 0x1ac)) + SubVersion = 2; +// printf ("==>> CanonID_EOS_7D, SubVersion: %d\n", SubVersion); + iHTP = 0x07; + iCanonCurFocal = 0x1e; + + if (!SubVersion) + break; + else if (SubVersion < 2) + SubVersion_offset += -4; + + iMakernotesFlip = 0x35+SubVersion_offset; + iCanonLensID = 0x112+SubVersion_offset; + iCanonMinFocal = 0x114+SubVersion_offset; + iCanonMaxFocal = 0x116+SubVersion_offset; + break; + + case CanonID_EOS_40D: + iCanonCurFocal = 0x1d; + iMakernotesFlip = 0x30; + iCanonLensID = 0xd6; + iCanonMinFocal = 0xd8; + iCanonMaxFocal = 0xda; + iCanonLens = 0x92b; + break; + + case CanonID_EOS_50D: + iHTP = 0x07; + iCanonCurFocal = 0x1e; + iMakernotesFlip = 0x31; + iALO = 0xbf; + iCanonLensID = 0xea; + iCanonMinFocal = 0xec; + iCanonMaxFocal = 0xee; + break; + + case CanonID_EOS_60D: + case CanonID_EOS_1200D: + iCanonCurFocal = 0x1e; + if (id == CanonID_EOS_60D) + iMakernotesFlip = 0x36; + else + iMakernotesFlip = 0x3a; + iCanonLensID = 0xe8; + iCanonMinFocal = 0xea; + iCanonMaxFocal = 0xec; + break; + + case CanonID_EOS_70D: + iCanonCurFocal = 0x23; + iMakernotesFlip = 0x84; + iCanonLensID = 0x166; + iCanonMinFocal = 0x168; + iCanonMaxFocal = 0x16a; + break; + + case CanonID_EOS_80D: + iCanonCurFocal = 0x23; + iMakernotesFlip = 0x96; + iCanonLensID = 0x189; + iCanonMinFocal = 0x18b; + iCanonMaxFocal = 0x18d; + break; + + case CanonID_EOS_450D: + iCanonCurFocal = 0x1d; + iMakernotesFlip = 0x30; + iCanonLensID = 0xde; + iCanonLens = 0x933; + break; + + case CanonID_EOS_500D: + iHTP = 0x07; + iCanonCurFocal = 0x1e; + iMakernotesFlip = 0x31; + iALO = 0xbe; + iCanonLensID = 0xf6; + iCanonMinFocal = 0xf8; + iCanonMaxFocal = 0xfa; + break; + + case CanonID_EOS_550D: + iHTP = 0x07; + iCanonCurFocal = 0x1e; + iMakernotesFlip = 0x35; + iCanonLensID = 0xff; + iCanonMinFocal = 0x101; + iCanonMaxFocal = 0x103; + break; + + case CanonID_EOS_600D: + case CanonID_EOS_1100D: + iHTP = 0x07; + iCanonCurFocal = 0x1e; + iMakernotesFlip = 0x38; + iCanonLensID = 0xea; + iCanonMinFocal = 0xec; + iCanonMaxFocal = 0xee; + break; + + case CanonID_EOS_650D: + case CanonID_EOS_700D: + iCanonCurFocal = 0x23; + iMakernotesFlip = 0x7d; + iCanonLensID = 0x127; + iCanonMinFocal = 0x129; + iCanonMaxFocal = 0x12b; + break; + + case CanonID_EOS_750D: + case CanonID_EOS_760D: + iCanonCurFocal = 0x23; + iMakernotesFlip = 0x96; + iCanonLensID = 0x184; + iCanonMinFocal = 0x186; + iCanonMaxFocal = 0x188; + break; + + case CanonID_EOS_1000D: + iCanonCurFocal = 0x1d; + iMakernotesFlip = 0x30; + iCanonLensID = 0xe2; + iCanonMinFocal = 0xe4; + iCanonMaxFocal = 0xe6; + iCanonLens = 0x937; + break; + } + + if (iMakernotesFlip && (CameraInfo[iMakernotesFlip] < 3)) { + imCanon.MakernotesFlip = "065"[CameraInfo[iMakernotesFlip]] - '0'; +// printf ("==>> iMakernotesFlip: 0x%x, flip: %d\n", iMakernotesFlip, imCanon.MakernotesFlip); + } else if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_UNDEFINED) && + (mgck == 0xaaaa) && (dng_writer == nonDNG)) { // CameraOrientation + int c, i; + for (i = 2; (sget2(CameraInfo+i) != 0xbbbb) && i < (int)maxlen; i++); + i+=2; + while (i < int(maxlen - 5)) + if ((sget4(CameraInfo+i) == 257) && ((c = CameraInfo[i+8]) < 3)) { + imCanon.MakernotesFlip = "065"[c] - '0'; +// printf ("==>> MakernotesFlip offset: 0x%x, flip: %d\n", i+8, imCanon.MakernotesFlip); + break; + } else i+=4; + } + + if (iHTP) + { + imCanon.HighlightTonePriority = CameraInfo[iHTP]; + if ((imCanon.HighlightTonePriority > 5) || + (imCanon.HighlightTonePriority < 0)) + imCanon.HighlightTonePriority = 0; + if (imCanon.HighlightTonePriority) { + imCommon.ExposureCalibrationShift -= float(imCanon.HighlightTonePriority); + } + } + if (iALO) + { + imCanon.AutoLightingOptimizer = CameraInfo[iALO]; + if ((imCanon.AutoLightingOptimizer > 3) || + (imCanon.AutoLightingOptimizer < 0)) + imCanon.AutoLightingOptimizer = 3; + } + if (iCanonFocalType) + { + if (iCanonFocalType >= maxlen) + return; // broken; + ilm.FocalType = CameraInfo[iCanonFocalType]; + if (!ilm.FocalType) // zero means 'prime' here, replacing with standard '1' + ilm.FocalType = LIBRAW_FT_PRIME_LENS; + } + if (!ilm.CurFocal && iCanonCurFocal) + { + if (iCanonCurFocal >= maxlen) + return; // broken; + ilm.CurFocal = sget2Rev(CameraInfo + iCanonCurFocal); + } + if (!ilm.LensID && iCanonLensID) + { + if (iCanonLensID >= maxlen) + return; // broken; + ilm.LensID = sget2Rev(CameraInfo + iCanonLensID); + } + if (!ilm.MinFocal && iCanonMinFocal) + { + if (iCanonMinFocal >= maxlen) + return; // broken; + ilm.MinFocal = sget2Rev(CameraInfo + iCanonMinFocal); + } + if (!ilm.MaxFocal && iCanonMaxFocal) + { + if (iCanonMaxFocal >= maxlen) + return; // broken; + ilm.MaxFocal = sget2Rev(CameraInfo + iCanonMaxFocal); + } + if (!ilm.Lens[0] && iCanonLens) + { + if (iCanonLens + 64 >= (int)maxlen) // broken; + return; + + char *pl = (char *)CameraInfo + iCanonLens; + if (!strncmp(pl, "EF-S", 4)) + { + memcpy(ilm.Lens, pl, 4); + ilm.Lens[4] = ' '; + memcpy(ilm.LensFeatures_pre, pl, 4); + ilm.LensMount = LIBRAW_MOUNT_Canon_EF_S; + ilm.LensFormat = LIBRAW_FORMAT_APSC; + memcpy(ilm.Lens + 5, pl + 4, 60); + } + else if (!strncmp(pl, "EF-M", 4)) + { + memcpy(ilm.Lens, pl, 4); + ilm.Lens[4] = ' '; + memcpy(ilm.LensFeatures_pre, pl, 4); + ilm.LensMount = LIBRAW_MOUNT_Canon_EF_M; + ilm.LensFormat = LIBRAW_FORMAT_APSC; + memcpy(ilm.Lens + 5, pl + 4, 60); + } + else if (!strncmp(pl, "EF", 2)) + { + memcpy(ilm.Lens, pl, 2); + ilm.Lens[2] = ' '; + memcpy(ilm.LensFeatures_pre, pl, 2); + ilm.LensMount = LIBRAW_MOUNT_Canon_EF; + ilm.LensFormat = LIBRAW_FORMAT_FF; + memcpy(ilm.Lens + 3, pl + 2, 62); + } + else if (!strncmp(ilm.Lens, "CN-E", 4)) + { + memmove(ilm.Lens + 5, ilm.Lens + 4, 60); + ilm.Lens[4] = ' '; + memcpy(ilm.LensFeatures_pre, ilm.Lens, 4); + ilm.LensMount = LIBRAW_MOUNT_Canon_EF; + ilm.LensFormat = LIBRAW_FORMAT_FF; + } + else if (!strncmp(pl, "TS-E", 4)) + { + memcpy(ilm.Lens, pl, 4); + ilm.Lens[4] = ' '; + memcpy(ilm.LensFeatures_pre, pl, 4); + ilm.LensMount = LIBRAW_MOUNT_Canon_EF; + ilm.LensFormat = LIBRAW_FORMAT_FF; + memcpy(ilm.Lens + 5, pl + 4, 60); + } + else if (!strncmp(pl, "MP-E", 4)) + { + memcpy(ilm.Lens, pl, 4); + ilm.Lens[4] = ' '; + memcpy(ilm.LensFeatures_pre, pl, 4); + ilm.LensMount = LIBRAW_MOUNT_Canon_EF; + ilm.LensFormat = LIBRAW_FORMAT_FF; + memcpy(ilm.Lens + 5, pl + 4, 60); + } + else // non-Canon lens + memcpy(ilm.Lens, pl, 64); + } + return; +} + +void LibRaw::Canon_CameraSettings(unsigned len) +{ + fseek(ifp, 6, SEEK_CUR); + imCanon.Quality = get2(); // 3 + get2(); + imgdata.shootinginfo.DriveMode = get2(); // 5 + get2(); + imgdata.shootinginfo.FocusMode = get2(); // 7 + imCanon.RecordMode = (get2(), get2()); // 9, format + fseek(ifp, 14, SEEK_CUR); + imgdata.shootinginfo.MeteringMode = get2(); // 17 + get2(); + imgdata.shootinginfo.AFPoint = get2(); // 19 + imgdata.shootinginfo.ExposureMode = get2(); // 20 + get2(); + ilm.LensID = get2(); // 22 + ilm.MaxFocal = get2(); // 23 + ilm.MinFocal = get2(); // 24 + ilm.FocalUnits = get2(); // 25 + if (ilm.FocalUnits > 1) + { + ilm.MaxFocal /= (float)ilm.FocalUnits; + ilm.MinFocal /= (float)ilm.FocalUnits; + } + ilm.MaxAp = _CanonConvertAperture(get2()); // 26 + ilm.MinAp = _CanonConvertAperture(get2()); // 27 + if (len >= 36) + { + fseek(ifp, 12, SEEK_CUR); + imgdata.shootinginfo.ImageStabilization = get2(); // 34 + } + else + return; + if (len >= 48) + { + fseek(ifp, 22, SEEK_CUR); + imCanon.SRAWQuality = get2(); // 46 + } +} + +void LibRaw::Canon_WBpresets(int skip1, int skip2) +{ + int c; + FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Daylight][RGGB_2_RGBG(c)] = get2(); + + if (skip1) + fseek(ifp, skip1, SEEK_CUR); + FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Shade][RGGB_2_RGBG(c)] = get2(); + + if (skip1) + fseek(ifp, skip1, SEEK_CUR); + FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Cloudy][RGGB_2_RGBG(c)] = get2(); + + if (skip1) + fseek(ifp, skip1, SEEK_CUR); + FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Tungsten][RGGB_2_RGBG(c)] = get2(); + + if (skip1) + fseek(ifp, skip1, SEEK_CUR); + FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_FL_W][RGGB_2_RGBG(c)] = get2(); + + if (skip2) + fseek(ifp, skip2, SEEK_CUR); + FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Flash][RGGB_2_RGBG(c)] = get2(); + + return; +} + +void LibRaw::Canon_WBCTpresets(short WBCTversion) +{ + + int i; + float norm; + + if (WBCTversion == 0) + { // tint, as shot R, as shot B, CСT + for (i = 0; i < 15; i++) + { + icWBCCTC[i][2] = icWBCCTC[i][4] = 1.0f; + fseek(ifp, 2, SEEK_CUR); + icWBCCTC[i][1] = 1024.0f / fMAX(get2(), 1.f); + icWBCCTC[i][3] = 1024.0f / fMAX(get2(), 1.f); + icWBCCTC[i][0] = get2(); + } + } + else if (WBCTversion == 1) + { // as shot R, as shot B, tint, CСT + for (i = 0; i < 15; i++) + { + icWBCCTC[i][2] = icWBCCTC[i][4] = 1.0f; + icWBCCTC[i][1] = 1024.0f / fMAX(get2(), 1.f); + icWBCCTC[i][3] = 1024.0f / fMAX(get2(), 1.f); + fseek(ifp, 2, SEEK_CUR); + icWBCCTC[i][0] = get2(); + } + } + else if (WBCTversion == 2) + { // tint, offset, as shot R, as shot B, CСT + if ((unique_id == CanonID_EOS_M3) || + (unique_id == CanonID_EOS_M10) || + (imCanon.ColorDataSubVer == 0xfffc)) + { + for (i = 0; i < 15; i++) + { + fseek(ifp, 4, SEEK_CUR); + icWBCCTC[i][2] = icWBCCTC[i][4] = + 1.0f; + icWBCCTC[i][1] = 1024.0f / fMAX(1.f, get2()); + icWBCCTC[i][3] = 1024.0f / fMAX(1.f, get2()); + icWBCCTC[i][0] = get2(); + } + } + else if (imCanon.ColorDataSubVer == 0xfffd) + { + for (i = 0; i < 15; i++) + { + fseek(ifp, 2, SEEK_CUR); + norm = (signed short)get2(); + norm = 512.0f + norm / 8.0f; + icWBCCTC[i][2] = icWBCCTC[i][4] = + 1.0f; + icWBCCTC[i][1] = (float)get2(); + if (norm > 0.001f) + icWBCCTC[i][1] /= norm; + icWBCCTC[i][3] = (float)get2(); + if (norm > 0.001f) + icWBCCTC[i][3] /= norm; + icWBCCTC[i][0] = get2(); + } + } + } + return; +} + +void LibRaw::parseCanonMakernotes(unsigned tag, unsigned /*type*/, unsigned len, unsigned dng_writer) +{ + +#define AsShot_Auto_MeasuredWB(offset) \ + imCanon.ColorDataSubVer = get2(); \ + fseek(ifp, save1 + (offset << 1), SEEK_SET); \ + FORC4 cam_mul[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(); + +#define sRAW_WB(offset) \ + fseek(ifp, save1 + (offset << 1), SEEK_SET); \ + FORC4 { \ + sraw_mul[RGGB_2_RGBG(c)] = get2(); \ + if ((float)sraw_mul[RGGB_2_RGBG(c)] > sraw_mul_max) { \ + sraw_mul_max = (float)sraw_mul[RGGB_2_RGBG(c)]; \ + } \ + } \ + sraw_mul_max /= 1024.f; \ + FORC4 sraw_mul[c] = (ushort)((float)sraw_mul[c] * sraw_mul_max); + +#define CR3_ColorData(offset) \ + fseek(ifp, save1 + ((offset+0x0041) << 1), SEEK_SET); \ + Canon_WBpresets(2, 12); \ + fseek(ifp, save1 + ((offset+0x00c3) << 1), SEEK_SET); \ + Canon_WBCTpresets(0); \ + offsetChannelBlackLevel2 = save1 + ((offset+0x0102) << 1); \ + offsetChannelBlackLevel = save1 + ((offset+0x02d1) << 1); \ + offsetWhiteLevels = save1 + ((offset+0x02d5) << 1); + + int c; + unsigned i; + + if (tag == 0x0001) { + Canon_CameraSettings(len); + + } else if (tag == 0x0002) { // focal length + ilm.FocalType = get2(); + ilm.CurFocal = get2(); + if (ilm.FocalUnits > 1) { + ilm.CurFocal /= (float)ilm.FocalUnits; + } + + } else if (tag == 0x0004) { // subdir, ShotInfo + short tempAp; + if (dng_writer == nonDNG) { + get2(); + imCanon.ISOgain[0] = get2(); + imCanon.ISOgain[1] = get2(); + if (imCanon.ISOgain[1] != 0x7fff) { + imCommon.real_ISO = floorf(100.f * libraw_powf64l(2.f, float(imCanon.ISOgain[0]+imCanon.ISOgain[1]) / 32.f - 5.f)); + if (!iso_speed || (iso_speed == 65535)) + iso_speed = imCommon.real_ISO; + } + get4(); + if (((i = get2()) != 0xffff) && !shutter) { + shutter = libraw_powf64l(2.f, float((short)i) / -32.0f); + } + imCanon.wbi = (get2(), get2()); + shot_order = (get2(), get2()); + fseek(ifp, 4, SEEK_CUR); + } else + fseek(ifp, 24, SEEK_CUR); + tempAp = get2(); + if (tempAp != 0) + imCommon.CameraTemperature = (float)(tempAp - 128); + tempAp = get2(); + if (tempAp != -1) + imCommon.FlashGN = ((float)tempAp) / 32; + get2(); + + imCommon.FlashEC = _CanonConvertEV((signed short)get2()); + fseek(ifp, 8 - 32, SEEK_CUR); + if ((tempAp = get2()) != 0x7fff) + ilm.CurAp = _CanonConvertAperture(tempAp); + if (ilm.CurAp < 0.7f) { + fseek(ifp, 32, SEEK_CUR); + ilm.CurAp = _CanonConvertAperture(get2()); + } + if (!aperture) + aperture = ilm.CurAp; + + } else if ((tag == 0x0007) && (dng_writer == nonDNG)) { + fgets(model2, 64, ifp); + + } else if ((tag == 0x0008) && (dng_writer == nonDNG)) { + shot_order = get4(); + + } else if ((tag == 0x0009) && (dng_writer == nonDNG)) { + fread(artist, 64, 1, ifp); + + } else if (tag == 0x000c) { + unsigned tS = get4(); + sprintf(imgdata.shootinginfo.BodySerial, "%d", tS); + + } else if ((tag == 0x0012) || + (tag == 0x0026) || + (tag == 0x003c)) { + if (!imCommon.afcount) { + imCommon.afdata[imCommon.afcount].AFInfoData_tag = tag; + imCommon.afdata[imCommon.afcount].AFInfoData_order = order; + imCommon.afdata[imCommon.afcount].AFInfoData_length = len; + imCommon.afdata[imCommon.afcount].AFInfoData = (uchar *)malloc(imCommon.afdata[imCommon.afcount].AFInfoData_length); + fread(imCommon.afdata[imCommon.afcount].AFInfoData, imCommon.afdata[imCommon.afcount].AFInfoData_length, 1, ifp); + imCommon.afcount = 1; + } + + } else if ((tag == 0x0029) && (dng_writer == nonDNG)) { // PowerShot G9 + int Got_AsShotWB = 0; + fseek(ifp, 8, SEEK_CUR); + for (unsigned linenum = 0; linenum < Canon_G9_linenums_2_StdWBi.size(); linenum++) { + if (Canon_G9_linenums_2_StdWBi[linenum] != LIBRAW_WBI_Unknown ) { + FORC4 icWBC[Canon_G9_linenums_2_StdWBi[linenum]][GRBG_2_RGBG(c)] = get4(); + if (Canon_wbi2std[imCanon.wbi] == Canon_G9_linenums_2_StdWBi[linenum]) { + FORC4 cam_mul[c] = float(icWBC[Canon_G9_linenums_2_StdWBi[linenum]][c]); + Got_AsShotWB = 1; + } + } + fseek(ifp, 16, SEEK_CUR); + } + if (!Got_AsShotWB) + FORC4 cam_mul[c] = float(icWBC[LIBRAW_WBI_Auto][c]); + + } else if ((tag == 0x0081) && (dng_writer == nonDNG)) { // -1D, -1Ds + data_offset = get4(); + fseek(ifp, data_offset + 41, SEEK_SET); + raw_height = get2() * 2; + raw_width = get2(); + filters = 0x61616161; + + } else if (tag == 0x0093) { + if (!imCanon.RF_lensID) { + fseek(ifp, 0x03d<<1, SEEK_CUR); + imCanon.RF_lensID = get2(); + } + + } else if (tag == 0x0095 && !ilm.Lens[0]) + { // lens model tag + fread(ilm.Lens, 64, 1, ifp); + if (!strncmp(ilm.Lens, "EF-S", 4)) + { + memmove(ilm.Lens + 5, ilm.Lens + 4, 60); + ilm.Lens[4] = ' '; + memcpy(ilm.LensFeatures_pre, ilm.Lens, 4); + ilm.LensMount = LIBRAW_MOUNT_Canon_EF_S; + ilm.LensFormat = LIBRAW_FORMAT_APSC; + } + else if (!strncmp(ilm.Lens, "EF-M", 4)) + { + memmove(ilm.Lens + 5, ilm.Lens + 4, 60); + ilm.Lens[4] = ' '; + memcpy(ilm.LensFeatures_pre, ilm.Lens, 4); + ilm.LensMount = LIBRAW_MOUNT_Canon_EF_M; + ilm.LensFormat = LIBRAW_FORMAT_APSC; + } + else if (!strncmp(ilm.Lens, "EF", 2)) + { + memmove(ilm.Lens + 3, ilm.Lens + 2, 62); + ilm.Lens[2] = ' '; + memcpy(ilm.LensFeatures_pre, ilm.Lens, 2); + ilm.LensMount = LIBRAW_MOUNT_Canon_EF; + ilm.LensFormat = LIBRAW_FORMAT_FF; + } + else if (!strncmp(ilm.Lens, "CN-E", 4)) + { + memmove(ilm.Lens + 5, ilm.Lens + 4, 60); + ilm.Lens[4] = ' '; + memcpy(ilm.LensFeatures_pre, ilm.Lens, 4); + ilm.LensMount = LIBRAW_MOUNT_Canon_EF; + ilm.LensFormat = LIBRAW_FORMAT_FF; + } + else if (!strncmp(ilm.Lens, "TS-E", 4)) + { + memmove(ilm.Lens + 5, ilm.Lens + 4, 60); + ilm.Lens[4] = ' '; + memcpy(ilm.LensFeatures_pre, ilm.Lens, 4); + ilm.LensMount = LIBRAW_MOUNT_Canon_EF; + ilm.LensFormat = LIBRAW_FORMAT_FF; + } + else if (!strncmp(ilm.Lens, "MP-E", 4)) + { + memmove(ilm.Lens + 5, ilm.Lens + 4, 60); + ilm.Lens[4] = ' '; + memcpy(ilm.LensFeatures_pre, ilm.Lens, 4); + ilm.LensMount = LIBRAW_MOUNT_Canon_EF; + ilm.LensFormat = LIBRAW_FORMAT_FF; + } + + else if (!strncmp(ilm.Lens, "RF-S", 4)) + { + memmove(ilm.Lens + 5, ilm.Lens + 4, 62); + ilm.Lens[4] = ' '; + memcpy(ilm.LensFeatures_pre, ilm.Lens, 4); + ilm.LensMount = LIBRAW_MOUNT_Canon_RF; + ilm.LensFormat = LIBRAW_FORMAT_APSC; + } + + else if (!strncmp(ilm.Lens, "RF", 2)) + { + memmove(ilm.Lens + 3, ilm.Lens + 2, 62); + ilm.Lens[2] = ' '; + memcpy(ilm.LensFeatures_pre, ilm.Lens, 2); + ilm.LensMount = LIBRAW_MOUNT_Canon_RF; + ilm.LensFormat = LIBRAW_FORMAT_FF; + } + } + else if (tag == 0x009a) + { // AspectInfo + i = get4(); + switch (i) + { + case 0: + case 12: /* APS-H crop */ + case 13: /* APS-C crop */ + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_3to2; + break; + case 1: + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_1to1; + break; + case 2: + case 0x102: + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_4to3; + break; + case 7: + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_16to9; + break; + case 8: + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_5to4; + break; + default: + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_OTHER; + break; + } + imgdata.sizes.raw_inset_crops[0].cwidth = get4(); + imgdata.sizes.raw_inset_crops[0].cheight = get4(); + imgdata.sizes.raw_inset_crops[0].cleft = get4(); + imgdata.sizes.raw_inset_crops[0].ctop = get4(); + + } else if ((tag == 0x00a4) && (dng_writer == nonDNG)) { // -1D, -1Ds + fseek(ifp, imCanon.wbi * 48, SEEK_CUR); + FORC3 cam_mul[c] = get2(); + + } else if (tag == 0x00a9) { + INT64 save1 = ftell(ifp); + fseek(ifp, (0x1 << 1), SEEK_CUR); + FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Auto][RGGB_2_RGBG(c)] = get2(); + Canon_WBpresets(0, 0); + fseek(ifp, save1, SEEK_SET); + } + else if (tag == 0x00b4) + { + switch (get2()) { + case 1: + imCommon.ColorSpace = LIBRAW_COLORSPACE_sRGB; + break; + case 2: + imCommon.ColorSpace = LIBRAW_COLORSPACE_AdobeRGB; + break; + default: + imCommon.ColorSpace = LIBRAW_COLORSPACE_Unknown; + break; + } + } + else if (tag == 0x00e0) // SensorInfo + { + imCanon.SensorWidth = (get2(), get2()); + imCanon.SensorHeight = get2(); + fseek(ifp, 4, SEEK_CUR); + imCanon.DefaultCropAbsolute = get_CanonArea(); + imCanon.LeftOpticalBlack = get_CanonArea(); + } + else if (tag == 0x4001 && len > 500) + { + float sraw_mul_max = 0.f; + int bls = 0; + INT64 offsetChannelBlackLevel = 0L; + INT64 offsetChannelBlackLevel2 = 0L; + INT64 offsetWhiteLevels = 0L; + INT64 save1 = ftell(ifp); + + switch (len) + { + + case 582: + imCanon.ColorDataVer = 1; // 20D, 350D + + fseek(ifp, save1 + (0x0019 << 1), SEEK_SET); + FORC4 cam_mul[RGGB_2_RGBG(c)] = (float)get2(); + fseek(ifp, save1 + (0x001e << 1), SEEK_SET); + FORC4 icWBC[LIBRAW_WBI_Auto][RGGB_2_RGBG(c)] = get2(); + fseek(ifp, save1 + (0x0041 << 1), SEEK_SET); + FORC4 icWBC[LIBRAW_WBI_Custom1][RGGB_2_RGBG(c)] = get2(); + fseek(ifp, save1 + (0x0046 << 1), SEEK_SET); + FORC4 icWBC[LIBRAW_WBI_Custom2][RGGB_2_RGBG(c)] = get2(); + + fseek(ifp, save1 + (0x0023 << 1), SEEK_SET); + Canon_WBpresets(2, 2); + fseek(ifp, save1 + (0x004b << 1), SEEK_SET); + Canon_WBCTpresets(1); // ABCT + offsetChannelBlackLevel = save1 + (0x00a6 << 1); + break; + + case 653: + imCanon.ColorDataVer = 2; // -1D Mark II, -1Ds Mark II + + fseek(ifp, save1 + (0x0018 << 1), SEEK_SET); + FORC4 icWBC[LIBRAW_WBI_Auto][RGGB_2_RGBG(c)] = get2(); + fseek(ifp, save1 + (0x0022 << 1), SEEK_SET); + FORC4 cam_mul[RGGB_2_RGBG(c)] = (float)get2(); + fseek(ifp, save1 + (0x0090 << 1), SEEK_SET); + FORC4 icWBC[LIBRAW_WBI_Custom1][RGGB_2_RGBG(c)] = get2(); + fseek(ifp, save1 + (0x0095 << 1), SEEK_SET); + FORC4 icWBC[LIBRAW_WBI_Custom2][RGGB_2_RGBG(c)] = get2(); + fseek(ifp, save1 + (0x009a << 1), SEEK_SET); + FORC4 icWBC[LIBRAW_WBI_Custom3][RGGB_2_RGBG(c)] = get2(); + + fseek(ifp, save1 + (0x0027 << 1), SEEK_SET); + Canon_WBpresets(2, 12); + fseek(ifp, save1 + (0x00a4 << 1), SEEK_SET); + Canon_WBCTpresets(1); // ABCT + offsetChannelBlackLevel = save1 + (0x011e << 1); + break; + + case 796: + imCanon.ColorDataVer = 3; // -1D Mark II N, 5D, 30D, 400D; ColorDataSubVer: 1 + AsShot_Auto_MeasuredWB(0x003f); + + fseek(ifp, save1 + (0x0071 << 1), SEEK_SET); + FORC4 icWBC[LIBRAW_WBI_Custom1][RGGB_2_RGBG(c)] = get2(); + fseek(ifp, save1 + (0x0076 << 1), SEEK_SET); + FORC4 icWBC[LIBRAW_WBI_Custom2][RGGB_2_RGBG(c)] = get2(); + fseek(ifp, save1 + (0x007b << 1), SEEK_SET); + FORC4 icWBC[LIBRAW_WBI_Custom3][RGGB_2_RGBG(c)] = get2(); + fseek(ifp, save1 + (0x0080 << 1), SEEK_SET); + FORC4 icWBC[LIBRAW_WBI_Custom][RGGB_2_RGBG(c)] = get2(); + + fseek(ifp, save1 + (0x004e << 1), SEEK_SET); + Canon_WBpresets(2, 12); + fseek(ifp, save1 + (0x0085 << 1), SEEK_SET); + Canon_WBCTpresets(0); // BCAT + offsetChannelBlackLevel = save1 + (0x00c4 << 1); + break; + + case 674: // -1D Mark III; ColorDataSubVer: 2 + case 692: // 40D; ColorDataSubVer: 3 + case 702: // -1Ds Mark III; ColorDataSubVer: 4 + case 1227: // 450D, 1000D; ColorDataSubVer: 5 + case 1250: // 5D Mark II, 50D; ColorDataSubVer: 6 + case 1251: // 500D; ColorDataSubVer: 7 + case 1337: // -1D Mark IV, 7D; ColorDataSubVer: 7 + case 1338: // 550D; ColorDataSubVer: 7 + case 1346: // 1100D, 60D; ColorDataSubVer: 9 + imCanon.ColorDataVer = 4; + AsShot_Auto_MeasuredWB(0x003f); + sRAW_WB(0x004e); + fseek(ifp, save1 + (0x0053 << 1), SEEK_SET); + Canon_WBpresets(2, 12); + fseek(ifp, save1 + (0x00a8 << 1), SEEK_SET); + Canon_WBCTpresets(0); // BCAT + + if ((imCanon.ColorDataSubVer == 4) || + (imCanon.ColorDataSubVer == 5)) + { + offsetChannelBlackLevel = save1 + (0x02b4 << 1); + offsetWhiteLevels = save1 + (0x02b8 << 1); + } + else if ((imCanon.ColorDataSubVer == 6) || + (imCanon.ColorDataSubVer == 7)) + { + offsetChannelBlackLevel = save1 + (0x02cb << 1); + offsetWhiteLevels = save1 + (0x02cf << 1); + } + else if (imCanon.ColorDataSubVer == 9) + { + offsetChannelBlackLevel = save1 + (0x02cf << 1); + offsetWhiteLevels = save1 + (0x02d3 << 1); + } + else + offsetChannelBlackLevel = save1 + (0x00e7 << 1); + break; + + case 5120: // G10, G11, G12, G15, G16 + // G1 X, G1 X Mark II, G1 X Mark III + // G3 X, G5 X + // G7 X, G7 X Mark II + // G9 X, G9 X Mark II + // S90, S95, S100, S100V, S110, S120 + // SX1 IS, SX50 HS, SX60 HS + // M3, M5, M6, M10, M100 + imCanon.ColorDataVer = 5; + imCanon.ColorDataSubVer = get2(); + + fseek(ifp, save1 + (0x0047 << 1), SEEK_SET); + FORC4 cam_mul[RGGB_2_RGBG(c)] = (float)get2(); + + if (imCanon.ColorDataSubVer == 0xfffc) // ColorDataSubVer: 65532 (-4) + // G7 X Mark II, G9 X Mark II, G1 X Mark III + // M5, M100, M6 + { + fseek(ifp, save1 + (0x004f << 1), SEEK_SET); + FORC4 icWBC[LIBRAW_WBI_Auto][RGGB_2_RGBG(c)] = get2(); + fseek(ifp, 8, SEEK_CUR); + FORC4 icWBC[LIBRAW_WBI_Measured][RGGB_2_RGBG(c)] = + get2(); + fseek(ifp, 8, SEEK_CUR); + FORC4 icWBC[LIBRAW_WBI_Other][RGGB_2_RGBG(c)] = get2(); + fseek(ifp, 8, SEEK_CUR); + Canon_WBpresets(8, 24); + fseek(ifp, 168, SEEK_CUR); + FORC4 icWBC[LIBRAW_WBI_FL_WW][RGGB_2_RGBG(c)] = get2(); + fseek(ifp, 24, SEEK_CUR); + Canon_WBCTpresets(2); // BCADT + offsetChannelBlackLevel = save1 + (0x014d << 1); + offsetWhiteLevels = save1 + (0x0569 << 1); + } + else if (imCanon.ColorDataSubVer == 0xfffd) // ColorDataSubVer: 65533 (-3) + // M10, M3 + // G1 X, G1 X Mark II + // G3 X, G5 X, G7 X, G9 X + // G10, G11, G12, G15, G16 + // S90, S95, S100, S100V, S110, S120 + // SX1 IS, SX50 HS, SX60 HS + { + fseek(ifp, save1 + (0x004c << 1), SEEK_SET); + FORC4 icWBC[LIBRAW_WBI_Auto][RGGB_2_RGBG(c)] = get2(); + get2(); + FORC4 icWBC[LIBRAW_WBI_Measured][RGGB_2_RGBG(c)] = + get2(); + get2(); + FORC4 icWBC[LIBRAW_WBI_Other][RGGB_2_RGBG(c)] = get2(); + get2(); + Canon_WBpresets(2, 12); + fseek(ifp, save1 + (0x00ba << 1), SEEK_SET); + Canon_WBCTpresets(2); // BCADT + offsetChannelBlackLevel = save1 + (0x0108 << 1); + } + break; + + case 1273: // 600D; ColorDataSubVer: 10 + case 1275: // 1200D; ColorDataSubVer: 10 + imCanon.ColorDataVer = 6; + AsShot_Auto_MeasuredWB(0x003f); + sRAW_WB(0x0062); + fseek(ifp, save1 + (0x0067 << 1), SEEK_SET); + Canon_WBpresets(2, 12); + fseek(ifp, save1 + (0x00bc << 1), SEEK_SET); + Canon_WBCTpresets(0); // BCAT + offsetChannelBlackLevel = save1 + (0x01df << 1); + offsetWhiteLevels = save1 + (0x01e3 << 1); + break; + + case 1312: // 5D Mark III, 650D, 700D, M; ColorDataSubVer: 10 + case 1313: // 100D, 6D, 70D, EOS M2; ColorDataSubVer: 10 + case 1316: // -1D C, -1D X; ColorDataSubVer: 10 + case 1506: // 750D, 760D, 7D Mark II; ColorDataSubVer: 11 + imCanon.ColorDataVer = 7; + AsShot_Auto_MeasuredWB(0x003f); + sRAW_WB(0x007b); + fseek(ifp, save1 + (0x0080 << 1), SEEK_SET); + Canon_WBpresets(2, 12); + fseek(ifp, save1 + (0x00d5 << 1), SEEK_SET); + Canon_WBCTpresets(0); // BCAT + + if (imCanon.ColorDataSubVer == 10) + { + offsetChannelBlackLevel = save1 + (0x01f8 << 1); + offsetWhiteLevels = save1 + (0x01fc << 1); + } + else if (imCanon.ColorDataSubVer == 11) + { + offsetChannelBlackLevel = save1 + (0x02d8 << 1); + offsetWhiteLevels = save1 + (0x02dc << 1); + } + break; + + case 1560: // 5DS, 5DS R; ColorDataSubVer: 12 + case 1592: // 5D Mark IV, 80D, -1D X Mark II; ColorDataSubVer: 13 + case 1353: // 1300D, 1500D, 3000D; ColorDataSubVer: 14 + case 1602: // 200D, 6D Mark II, 77D, 800D; ColorDataSubVer: 15 + imCanon.ColorDataVer = 8; + AsShot_Auto_MeasuredWB(0x003f); + sRAW_WB(0x0080); + fseek(ifp, save1 + (0x0085 << 1), SEEK_SET); + Canon_WBpresets(2, 12); + fseek(ifp, save1 + (0x0107 << 1), SEEK_SET); + Canon_WBCTpresets(0); // BCAT + + if (imCanon.ColorDataSubVer == 14) // 1300D, 1500D, 3000D + { + offsetChannelBlackLevel = save1 + (0x022c << 1); + offsetWhiteLevels = save1 + (0x0230 << 1); + } + else + { + offsetChannelBlackLevel = save1 + (0x030a << 1); + offsetWhiteLevels = save1 + (0x030e << 1); + } + break; + + case 1820: // M50; ColorDataSubVer: 16 + case 1824: // R, Ra; ColorDataSubVer: 17 + case 1816: // RP, 250D, SX70 HS; ColorDataSubVer: 18 + // R100, M6 Mark II, M200, 90D, G5 X Mark II, G7 X Mark III, 850D; ColorDataSubVer: 19 + imCanon.ColorDataVer = 9; + AsShot_Auto_MeasuredWB(0x0047); + CR3_ColorData(0x0047); + break; + + case 1770: // R5 CRM + case 2024: // -1D X Mark III; ColorDataSubVer: 32 + case 3656: // R5, R6; ColorDataSubVer: 33 + imCanon.ColorDataVer = 10; + AsShot_Auto_MeasuredWB(0x0055); + CR3_ColorData(0x0055); + break; + + case 3973: // R3; ColorDataSubVer: 34 + case 3778: // R6 Mark II, R7, R8, R10, R50; ColorDataSubVer: 48 + imCanon.ColorDataVer = 11; + AsShot_Auto_MeasuredWB(0x0069); + + fseek(ifp, save1 + ((0x0069+0x0064) << 1), SEEK_SET); + Canon_WBpresets(2, 12); + fseek(ifp, save1 + ((0x0069+0x00c3) << 1), SEEK_SET); + Canon_WBCTpresets(0); + offsetChannelBlackLevel2 = save1 + ((0x0069+0x0102) << 1); + offsetChannelBlackLevel = save1 + ((0x0069+0x0213) << 1); + offsetWhiteLevels = save1 + ((0x0069+0x0217) << 1); + break; + + default: + imCanon.ColorDataSubVer = get2(); + break; + } + + if (offsetChannelBlackLevel) + { + fseek(ifp, offsetChannelBlackLevel, SEEK_SET); + FORC4 + bls += (imCanon.ChannelBlackLevel[RGGB_2_RGBG(c)] = get2()); + imCanon.AverageBlackLevel = bls / 4; + } + if (offsetWhiteLevels) + { + if ((offsetWhiteLevels - offsetChannelBlackLevel) != 8L) + fseek(ifp, offsetWhiteLevels, SEEK_SET); + imCanon.NormalWhiteLevel = get2(); + imCanon.SpecularWhiteLevel = get2(); + FORC4 + imgdata.color.linear_max[c] = imCanon.SpecularWhiteLevel; + } + + if(!imCanon.AverageBlackLevel && offsetChannelBlackLevel2) + { + fseek(ifp, offsetChannelBlackLevel2, SEEK_SET); + FORC4 + bls += (imCanon.ChannelBlackLevel[RGGB_2_RGBG(c)] = get2()); + imCanon.AverageBlackLevel = bls / 4; + } + fseek(ifp, save1, SEEK_SET); + + } else if (tag == 0x4013) { + get4(); + imCanon.AFMicroAdjMode = get4(); + float a = float(get4()); + float b = float(get4()); + if (fabsf(b) > 0.001f) + imCanon.AFMicroAdjValue = a / b; + + } else if (tag == 0x4018) { + fseek(ifp, 8, SEEK_CUR); + imCanon.AutoLightingOptimizer = get4(); + if ((imCanon.AutoLightingOptimizer > 3) || + (imCanon.AutoLightingOptimizer < 0)) + imCanon.AutoLightingOptimizer = 3; + imCanon.HighlightTonePriority = get4(); + if ((imCanon.HighlightTonePriority > 5) || + (imCanon.HighlightTonePriority < 0)) + imCanon.HighlightTonePriority = 0; + if (imCanon.HighlightTonePriority) { + imCommon.ExposureCalibrationShift -= float(imCanon.HighlightTonePriority); + } + + } else if ((tag == 0x4021) && (dng_writer == nonDNG) && + (imCanon.multishot[0] = get4()) && + (imCanon.multishot[1] = get4())) { + if (len >= 4) { + imCanon.multishot[2] = get4(); + imCanon.multishot[3] = get4(); + } + FORC4 cam_mul[c] = 1024; + } else if (tag == 0x4026) { + fseek(ifp, 44, SEEK_CUR); + imCanon.CanonLog = get4(); + } +#undef CR3_ColorData +#undef sRAW_WB +#undef AsShot_Auto_MeasuredWB +} diff --git a/rtengine/libraw/src/metadata/ciff.cpp b/rtengine/libraw/src/metadata/ciff.cpp new file mode 100644 index 000000000..b3c43066d --- /dev/null +++ b/rtengine/libraw/src/metadata/ciff.cpp @@ -0,0 +1,411 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" +#ifdef _MSC_VER +#if _MSC_VER < 1800 /* below MSVC 2013 */ +float roundf(float f) +{ + return floorf(f + 0.5); +} + +#endif +#endif + +/* + CIFF block 0x1030 contains an 8x8 white sample. + Load this into white[][] for use in scale_colors(). + */ +void LibRaw::ciff_block_1030() +{ + static const ushort key[] = {0x410, 0x45f3}; + int i, bpp, row, col, vbits = 0; + unsigned long bitbuf = 0; + + if ((get2(), get4()) != 0x80008 || !get4()) + return; + bpp = get2(); + if (bpp != 10 && bpp != 12) + return; + for (i = row = 0; row < 8; row++) + for (col = 0; col < 8; col++) + { + if (vbits < bpp) + { + bitbuf = bitbuf << 16 | (get2() ^ key[i++ & 1]); + vbits += 16; + } + white[row][col] = bitbuf >> (vbits -= bpp) & ~(-1 << bpp); + } +} + +/* + Parse a CIFF file, better known as Canon CRW format. + */ +void LibRaw::parse_ciff(int offset, int length, int depth) +{ + int nrecs, c, type, len, wbi = -1; + INT64 save, tboff; + ushort key[] = {0x410, 0x45f3}; + ushort CanonColorInfo1_key; + ushort Appendix_A = 0; + INT64 WB_table_offset = 0; + int UseWBfromTable_as_AsShot = 1; + int Got_AsShotWB = 0; + INT64 fsize = ifp->size(); + if (metadata_blocks++ > LIBRAW_MAX_METADATA_BLOCKS) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + fseek(ifp, offset + length - 4, SEEK_SET); + tboff = INT64(get4()) + offset; + fseek(ifp, tboff, SEEK_SET); + nrecs = get2(); + if (nrecs < 1) + return; + if ((nrecs | depth) > 127) + return; + + if (nrecs * 10 + offset > fsize) + return; + + while (nrecs--) + { + type = get2(); + len = get4(); + INT64 see = offset + get4(); + save = ftell(ifp); + + /* the following tags are not sub-tables + * they contain the value in the "len" field + * for such tags skip the check against filesize + */ + if ((type != 0x2007) && (type != 0x580b) && (type != 0x501c) && + (type != 0x5029) && (type != 0x5813) && (type != 0x5814) && + (type != 0x5817) && (type != 0x5834) && (type != 0x580e)) + { + + if (see >= fsize) + { // At least one byte + fseek(ifp, save, SEEK_SET); + continue; + } + fseek(ifp, see, SEEK_SET); + if ((((type >> 8) + 8) | 8) == 0x38) + { + parse_ciff(ftell(ifp), len, depth + 1); /* Parse a sub-table */ + } + } + + if (type == 0x3004) + { + parse_ciff(ftell(ifp), len, depth + 1); + } + else if (type == 0x0810) + { + fread(artist, 64, 1, ifp); + } + else if (type == 0x080a) + { + fread(make, 64, 1, ifp); + fseek(ifp, strbuflen(make) - 63, SEEK_CUR); + fread(model, 64, 1, ifp); + + } else if (type == 0x080b) { + stmread(imCommon.firmware, (unsigned)len, ifp); + if (!strncasecmp(imCommon.firmware, "Firmware Version", 16)) + memmove(imCommon.firmware, imCommon.firmware + 16, strlen(imCommon.firmware) - 15); + trimSpaces(imCommon.firmware); + + } else if (type == 0x1810) + { + width = get4(); + height = get4(); + pixel_aspect = int_to_float(get4()); + flip = get4(); + } + else if (type == 0x1835) + { /* Get the decoder table */ + tiff_compress = get4(); + } + else if (type == 0x2007) + { + thumb_offset = see; + thumb_length = len; + } + else if (type == 0x1818) + { + shutter = libraw_powf64l(2.0f, -int_to_float((get4(), get4()))); + ilm.CurAp = aperture = libraw_powf64l(2.0f, int_to_float(get4()) / 2); + } + else if (type == 0x102a) // CanonShotInfo + { + // iso_speed = pow (2.0, (get4(),get2())/32.0 - 4) * 50; + get2(); // skip one + iso_speed = + libraw_powf64l(2.0f, (get2() + get2()) / 32.0f - 5.0f) * 100.0f; + ilm.CurAp = aperture = _CanonConvertAperture((get2(), get2())); + shutter = libraw_powf64l(2.0f, -float((short)get2()) / 32.f); + imCanon.wbi = wbi = (get2(), get2()); + if (wbi >= (int)Canon_wbi2std.size()) + wbi = 0; + fseek(ifp, 32, SEEK_CUR); + if (shutter > 1e6) + shutter = float(get2()) / 10.f; + } + else if (type == 0x102c) // CanonColorInfo2 / Appendix A: Pro90IS, G1, G2, S30, S40 + { + int CanonColorInfo2_type = get2(); // G1 1028, G2 272, Pro90 IS 769, S30 274, S40 273, EOS D30 276 + if (CanonColorInfo2_type > 512) { /* Pro90 IS, G1 */ + fseek(ifp, 118, SEEK_CUR); + FORC4 cam_mul[BG2RG1_2_RGBG(c)] = get2(); + } + else if (CanonColorInfo2_type != 276) { /* G2, S30, S40 */ + Appendix_A = 1; + WB_table_offset = -14; + fseek(ifp, 98, SEEK_CUR); + FORC4 cam_mul[GRBG_2_RGBG(c)] = get2(); + if (cam_mul[0] > 0.001f) Got_AsShotWB = 1; + } + } + else if (type == 0x10a9) // ColorBalance: Canon D60, 10D, 300D, and clones + { + int bls = 0; +/* + int table[] = { + LIBRAW_WBI_Auto, // 0 + LIBRAW_WBI_Daylight, // 1 + LIBRAW_WBI_Cloudy, // 2 + LIBRAW_WBI_Tungsten, // 3 + LIBRAW_WBI_FL_W, // 4 + LIBRAW_WBI_Flash, // 5 + LIBRAW_WBI_Custom, // 6, absent in Canon D60 + LIBRAW_WBI_Auto, // 7, use this if camera is set to b/w JPEG + LIBRAW_WBI_Shade, // 8 + LIBRAW_WBI_Kelvin // 9, absent in Canon D60 + }; +*/ + int nWB = + ((get2() - 2) / 8) - + 1; // 2 bytes this, N recs 4*2bytes each, last rec is black level + if (nWB) + FORC4 icWBC[LIBRAW_WBI_Auto][RGGB_2_RGBG(c)] = get2(); + if (nWB >= 7) + Canon_WBpresets(0, 0); + else + FORC4 cam_mul[c] = float(icWBC[LIBRAW_WBI_Auto][c]); + if (nWB == 7) // mostly Canon EOS D60 + some fw#s for 300D; + // check for 0x1668000 is unreliable + { + if ((wbi >= 0) && (wbi < 9) && (wbi != 6)) + { + FORC4 cam_mul[c] = float(icWBC[Canon_wbi2std[wbi]][c]); + } + else + { + FORC4 cam_mul[c] = float(icWBC[LIBRAW_WBI_Auto][c]); + } + } + else if (nWB == 9) // Canon 10D, 300D + { + FORC4 icWBC[LIBRAW_WBI_Custom][RGGB_2_RGBG(c)] = get2(); + FORC4 icWBC[LIBRAW_WBI_Kelvin][RGGB_2_RGBG(c)] = get2(); + if ((wbi >= 0) && (wbi < 10)) + { + FORC4 cam_mul[c] = float(icWBC[Canon_wbi2std[wbi]][c]); + } + else + { + FORC4 cam_mul[c] = float(icWBC[LIBRAW_WBI_Auto][c]); + } + } + FORC4 + bls += (imCanon.ChannelBlackLevel[RGGB_2_RGBG(c)] = get2()); + imCanon.AverageBlackLevel = bls / 4; + } + else if (type == 0x102d) + { + Canon_CameraSettings(len >> 1); + } + + else if (type == 0x10b4) { + switch (get2()) { + case 1: + imCommon.ColorSpace = LIBRAW_COLORSPACE_sRGB; + break; + case 2: + imCommon.ColorSpace = LIBRAW_COLORSPACE_AdobeRGB; + break; + default: + imCommon.ColorSpace = LIBRAW_COLORSPACE_Unknown; + break; + } + + } else if (type == 0x580b) + { + if (strcmp(model, "Canon EOS D30")) + sprintf(imgdata.shootinginfo.BodySerial, "%d", len); + else + sprintf(imgdata.shootinginfo.BodySerial, "%0x-%05d", len >> 16, + len & 0xffff); + } + else if (type == 0x0032) // CanonColorInfo1 + { + if (len == 768) { // EOS D30 + + ushort q; + fseek(ifp, 4, SEEK_CUR); + for (unsigned linenum = 0; linenum < Canon_D30_linenums_2_StdWBi.size(); linenum++) { + if (Canon_D30_linenums_2_StdWBi[linenum] != LIBRAW_WBI_Unknown) { + FORC4 { + q = get2(); + icWBC[Canon_D30_linenums_2_StdWBi[linenum]][RGGB_2_RGBG(c)] = + (int)(roundf(1024000.0f / (float)MAX(1, q))); + } +// if (Canon_wbi2std[imCanon.wbi] == *(Canon_D30_linenums_2_StdWBi + linenum)) { +// FORC4 cam_mul[c] = icWBC[*(Canon_D30_linenums_2_StdWBi + linenum)][c]; +// Got_AsShotWB = 1; +// } + } + } + fseek (ifp, 68-int(Canon_D30_linenums_2_StdWBi.size())*8, SEEK_CUR); + + FORC4 { + q = get2(); + cam_mul[RGGB_2_RGBG(c)] = 1024.f / float(MAX(1, q)); + } + if (!wbi) + cam_mul[0] = -1; // use my auto white balance + + } + else if ((cam_mul[0] <= 0.001f) || // Pro1, G3, G5, G6, S45, S50, S60, S70 + Appendix_A) // G2, S30, S40 + { + libraw_static_table_t linenums_2_StdWBi; + unsigned AsShotWB_linenum = Canon_wbi2std.size(); + + CanonColorInfo1_key = get2(); + if ((CanonColorInfo1_key == key[0]) && (len == 2048)) { // Pro1 + linenums_2_StdWBi = Canon_KeyIs0x0410_Len2048_linenums_2_StdWBi; + WB_table_offset = 8; + + } else if ((CanonColorInfo1_key == key[0]) && (len == 3072)) { // S60, S70, G6 + linenums_2_StdWBi = Canon_KeyIs0x0410_Len3072_linenums_2_StdWBi; + WB_table_offset = 16; + + } else if (!CanonColorInfo1_key && (len == 2048)) { // G2, S30, S40; S45, S50, G3, G5 + key[0] = key[1] = 0; + linenums_2_StdWBi = Canon_KeyIsZero_Len2048_linenums_2_StdWBi; + if (atof(imCommon.firmware) < 1.02f) + UseWBfromTable_as_AsShot = 0; + + } else goto next_tag; + + if ((Canon_wbi2std[wbi] == LIBRAW_WBI_Auto) || + (Canon_wbi2std[wbi] == LIBRAW_WBI_Unknown) || + Got_AsShotWB) + UseWBfromTable_as_AsShot = 0; + + if (UseWBfromTable_as_AsShot) { + int temp_wbi; + if (Canon_wbi2std[wbi] == LIBRAW_WBI_Custom) temp_wbi = LIBRAW_WBI_Daylight; + else temp_wbi = wbi; + for (AsShotWB_linenum = 0; AsShotWB_linenum < linenums_2_StdWBi.size(); AsShotWB_linenum++) { + if (Canon_wbi2std[temp_wbi] == linenums_2_StdWBi[AsShotWB_linenum]) { + break; + } + } + } + + fseek (ifp, 78LL+WB_table_offset, SEEK_CUR); + for (unsigned linenum = 0; linenum < linenums_2_StdWBi.size(); linenum++) { + if (linenums_2_StdWBi[linenum] != LIBRAW_WBI_Unknown) { + FORC4 icWBC[linenums_2_StdWBi[linenum]][GRBG_2_RGBG(c)] = get2() ^ key[c & 1]; + if (UseWBfromTable_as_AsShot && (AsShotWB_linenum == linenum)) { + FORC4 cam_mul[c] = float(icWBC[linenums_2_StdWBi[linenum]][c]); + Got_AsShotWB = 1; + } + } else { + fseek(ifp, 8, SEEK_CUR); + } + } + if (!Got_AsShotWB) + cam_mul[0] = -1; + } + } + else if (type == 0x1030 && wbi >= 0 && (0x18040 >> wbi & 1)) + { + ciff_block_1030(); // all that don't have 0x10a9 + } + else if (type == 0x1031) + { + raw_width = imCanon.SensorWidth = (get2(), get2()); + raw_height = imCanon.SensorHeight = get2(); + fseek(ifp, 4, SEEK_CUR); + imCanon.DefaultCropAbsolute = get_CanonArea(); + imCanon.LeftOpticalBlack = get_CanonArea(); + } + else if (type == 0x501c) + { + iso_speed = float(len & 0xffff); + } + else if (type == 0x5029) + { + ilm.CurFocal = float( len >> 16); + ilm.FocalType = len & 0xffff; + if (ilm.FocalType == LIBRAW_FT_ZOOM_LENS) + { + ilm.FocalUnits = 32; + if (ilm.FocalUnits > 1) + ilm.CurFocal /= (float)ilm.FocalUnits; + } + focal_len = ilm.CurFocal; + } + else if (type == 0x5813) + { + flash_used = int_to_float(len); + } + else if (type == 0x5814) + { + canon_ev = int_to_float(len); + } + else if (type == 0x5817) + { + shot_order = len; + } + else if (type == 0x5834) + { + unique_id = ((unsigned long long)len << 32) >> 32; + setCanonBodyFeatures(unique_id); + } + else if (type == 0x580e) + { + timestamp = len; + } + else if (type == 0x180e) + { + timestamp = get4(); + } + +next_tag:; +#ifdef LOCALTIME + if ((type | 0x4000) == 0x580e) + timestamp = mktime(gmtime(×tamp)); +#endif + fseek(ifp, save, SEEK_SET); + } +} diff --git a/rtengine/libraw/src/metadata/cr3_parser.cpp b/rtengine/libraw/src/metadata/cr3_parser.cpp new file mode 100644 index 000000000..4b0d1d195 --- /dev/null +++ b/rtengine/libraw/src/metadata/cr3_parser.cpp @@ -0,0 +1,916 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + + +static libraw_area_t sget_CanonArea(uchar *s) { + libraw_area_t la = {}; + la.l = s[0] << 8 | s[1]; + la.t = s[2] << 8 | s[3]; + la.r = s[4] << 8 | s[5]; + la.b = s[6] << 8 | s[7]; + return la; +} + +int LibRaw::selectCRXFrame(short trackNum, unsigned frameIndex) +{ + uint32_t sample_size; + uint32_t stsc_index = 0; + uint32_t current_sample = 0; + crx_data_header_t *hdr = &libraw_internal_data.unpacker_data.crx_header[trackNum]; + + if (frameIndex >= hdr->sample_count) + return -1; + + for (int i = 0; i < hdr->chunk_count; i++) + { + int64_t current_offset = hdr->chunk_offsets[i]; + + while((stsc_index < hdr->stsc_count) && (i+1 == hdr->stsc_data[stsc_index+1].first)) + stsc_index++; + + for (int j = 0; j < hdr->stsc_data[stsc_index].count; j++) + { + if (current_sample > hdr->sample_count) + return -1; + + sample_size = hdr->sample_size > 0 ? hdr->sample_size : hdr->sample_sizes[current_sample]; + if(current_sample == frameIndex) + { + hdr->MediaOffset = current_offset; + hdr->MediaSize = sample_size; + return 0; + } + current_offset += sample_size; + current_sample++; + } + } + return -1; +} + +void LibRaw::selectCRXTrack() +{ + short maxTrack = libraw_internal_data.unpacker_data.crx_track_count; + if (maxTrack < 0) + return; + + INT64 bitcounts[LIBRAW_CRXTRACKS_MAXCOUNT], maxbitcount = 0; + int framecounts[LIBRAW_CRXTRACKS_MAXCOUNT], maxframecount = 0; + uint32_t maxjpegbytes = 0; + int framecnt = 0; + int media_tracks = 0; + int track_select = 0; + int frame_select = 0; + int err; + memset(bitcounts, 0, sizeof(bitcounts)); + memset(framecounts, 0, sizeof(framecounts)); + + // Calc max frame bitcount for max-sized RAW track(s) selection + for (int i = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) + { + crx_data_header_t *d = &libraw_internal_data.unpacker_data.crx_header[i]; + if (d->MediaType == 1) // RAW + { + bitcounts[i] = INT64(d->nBits) * INT64(d->f_width) * INT64(d->f_height); + maxbitcount = MAX(bitcounts[i], maxbitcount); + if (d->sample_count > 1) + framecounts[i] = d->sample_count; + } + } + + if (maxbitcount < 8) // no raw tracks + return; + + // Calc RAW tracks and frames + for (int i = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) + { + if (bitcounts[i] == maxbitcount) + { + media_tracks++; + if (framecounts[i] > 1) + framecnt = MAX(framecnt, framecounts[i]); + } + } + + // If the file has only 1 media track shot_select represents frames select. + // If the file has multiple media tracks shot_select represents track select. + // If the file has multiple media tracks and multiple frames it is currently unsupported. + + if (framecnt && media_tracks > 1) + return; + else if (framecnt) + frame_select = shot_select; + else + track_select = shot_select; + + int tracki = -1; + for (int i = 0, trackcnt = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) + { + if (bitcounts[i] == maxbitcount) + { + if (trackcnt <= (int)track_select) + tracki = i; + trackcnt++; + } + } + + if (tracki >= 0 && tracki < LIBRAW_CRXTRACKS_MAXCOUNT /* && frame_select > 0 */) + { + framecnt = framecounts[tracki]; // Update to selected track + frame_select = LIM(frame_select, 0, framecnt); + if(frame_select > 0) + if (selectCRXFrame(tracki, frame_select)) + return; + } + else + return; // No RAW track index + + int ctmdcount = 0; + // Frame selected: parse CTMD metadata + for (int i = 0, trackcnt = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) + { + crx_data_header_t *d = &libraw_internal_data.unpacker_data.crx_header[i]; + int fsel = LIM(frame_select, 0, d->sample_count); + if (d->MediaType == 3) // CTMD metadata + { + /* ignore errors !*/ + if (fsel) + selectCRXFrame(i, fsel); + parseCR3_CTMD(i); + ctmdcount++; + } + else if (d->MediaType == 2) // JPEG + { + if (fsel) + selectCRXFrame(i, fsel); + if (d->MediaSize > maxjpegbytes) + { + maxjpegbytes = d->MediaSize; + thumb_offset = d->MediaOffset; + thumb_length = d->MediaSize; + if (imgdata.thumbs_list.thumbcount < LIBRAW_THUMBNAIL_MAXCOUNT) + { + bool do_add = true; + for (int idx = 0; idx < imgdata.thumbs_list.thumbcount; idx++) + if (imgdata.thumbs_list.thumblist[idx].toffset == thumb_offset) + { + do_add = false; + break; + } + if (do_add) + { + int idx = imgdata.thumbs_list.thumbcount; + imgdata.thumbs_list.thumblist[idx].tformat = LIBRAW_INTERNAL_THUMBNAIL_JPEG; + imgdata.thumbs_list.thumblist[idx].toffset = thumb_offset; + imgdata.thumbs_list.thumblist[idx].tlength = thumb_length; + imgdata.thumbs_list.thumblist[idx].tflip = 0xffff; + imgdata.thumbs_list.thumblist[idx].tmisc = (3 << 5) | 8; // 3 samples/8 bps + imgdata.thumbs_list.thumblist[idx].twidth = 0; + imgdata.thumbs_list.thumblist[idx].theight = 0; + imgdata.thumbs_list.thumbcount++; + } + } + } + } + } + + if (framecnt) + is_raw = framecnt; + else + is_raw = media_tracks; + + if (tracki >= 0 && tracki < LIBRAW_CRXTRACKS_MAXCOUNT) + { + crx_data_header_t *d = + &libraw_internal_data.unpacker_data.crx_header[tracki]; + data_offset = d->MediaOffset; + data_size = d->MediaSize; + raw_width = d->f_width; + raw_height = d->f_height; + load_raw = &LibRaw::crxLoadRaw; + tiff_bps = d->encType == 3? d->medianBits : d->nBits; + switch (d->cfaLayout) + { + case 0: + filters = 0x94949494; + break; + case 1: + filters = 0x61616161; + break; + case 2: + filters = 0x49494949; + break; + case 3: + filters = 0x16161616; + break; + } + + libraw_internal_data.unpacker_data.crx_track_selected = tracki; + + int tiff_idx = -1; + INT64 tpixels = 0; + for (unsigned i = 0; i < tiff_nifds && i < LIBRAW_IFD_MAXCOUNT; i++) + if (INT64(tiff_ifd[i].t_height) * INT64(tiff_ifd[i].t_height) > tpixels) + { + tpixels = INT64(tiff_ifd[i].t_height) * INT64(tiff_ifd[i].t_height); + tiff_idx = i; + } + if (tiff_idx >= 0) + flip = tiff_ifd[tiff_idx].t_flip; + + if (ctmdcount == 1 && imgdata.makernotes.canon.multishot[0] && imgdata.makernotes.canon.multishot[1]) + for (int c = 0; c < 4; c++) + cam_mul[c] = 1024; + } +} + +#define bad_hdr() \ + (((order != 0x4d4d) && (order != 0x4949)) || (get2() != 0x002a) || \ + (get4() != 0x00000008)) + +int LibRaw::parseCR3_CTMD(short trackNum) +{ + int err = 0; + short s_order = order; + order = 0x4949; + uint32_t relpos_inDir = 0; + uint32_t relpos_inBox = 0; + unsigned szItem, Tag, lTag; + ushort tItem; + +#define track libraw_internal_data.unpacker_data.crx_header[trackNum] + + if (track.MediaType != 3) + { + err = -10; + goto ctmd_fin; + } + + while (relpos_inDir + 6 < track.MediaSize) + { + if (track.MediaOffset + relpos_inDir > ifp->size() - 6) // need at least 6 bytes + { + err = -11; + goto ctmd_fin; + } + fseek(ifp, track.MediaOffset + relpos_inDir, SEEK_SET); + szItem = get4(); + tItem = get2(); + if (szItem < 1 || ( (relpos_inDir + szItem) > track.MediaSize)) + { + err = -11; + goto ctmd_fin; + } + if ((tItem == 7) || (tItem == 8) || (tItem == 9)) + { + relpos_inBox = relpos_inDir + 12L; + while (relpos_inBox + 8 < relpos_inDir + szItem) + { + if (track.MediaOffset + relpos_inBox > ifp->size() - 8) // need at least 8 bytes + { + err = -11; + goto ctmd_fin; + } + fseek(ifp, track.MediaOffset + relpos_inBox, SEEK_SET); + lTag = get4(); + Tag = get4(); + if (lTag < 8) + { + err = -12; + goto ctmd_fin; + } + else if ((relpos_inBox + lTag) > (relpos_inDir + szItem)) + { + err = -11; + goto ctmd_fin; + } + if ((Tag == 0x927c) && ((tItem == 7) || (tItem == 8))) + { + fseek(ifp, track.MediaOffset + relpos_inBox + 8L, + SEEK_SET); + short q_order = order; + order = get2(); + if (bad_hdr()) + { + err = -13; + goto ctmd_fin; + } + fseek(ifp, -8L, SEEK_CUR); + libraw_internal_data.unpacker_data.CR3_CTMDtag = 1; + parse_makernote(track.MediaOffset + relpos_inBox + 8, + 0); + libraw_internal_data.unpacker_data.CR3_CTMDtag = 0; + order = q_order; + } + relpos_inBox += lTag; + } + } + relpos_inDir += szItem; + } + +ctmd_fin: + order = s_order; + return err; +} +#undef track + +int LibRaw::parseCR3(INT64 oAtomList, + INT64 szAtomList, short &nesting, + char *AtomNameStack, short &nTrack, short &TrackType) +{ + /* + Atom starts with 4 bytes for Atom size and 4 bytes containing Atom name + Atom size includes the length of the header and the size of all "contained" + Atoms if Atom size == 1, Atom has the extended size stored in 8 bytes located + after the Atom name if Atom size == 0, it is the last top-level Atom extending + to the end of the file Atom name is often a 4 symbol mnemonic, but can be a + 4-byte integer + */ + const char UIID_Canon[17] = + "\x85\xc0\xb6\x87\x82\x0f\x11\xe0\x81\x11\xf4\xce\x46\x2b\x6a\x48"; + const unsigned char UIID_CanonPreview[17] = "\xea\xf4\x2b\x5e\x1c\x98\x4b\x88\xb9\xfb\xb7\xdc\x40\x6e\x4d\x16"; + const unsigned char UUID_XMP[17] = "\xbe\x7a\xcf\xcb\x97\xa9\x42\xe8\x9c\x71\x99\x94\x91\xe3\xaf\xac"; + + /* + AtomType = 0 - unknown: "unk." + AtomType = 1 - container atom: "cont" + AtomType = 2 - leaf atom: "leaf" + AtomType = 3 - can be container, can be leaf: "both" + */ + short AtomType; + static const struct + { + char AtomName[5]; + short AtomType; + } AtomNamesList[] = { + {"dinf", 1}, + {"edts", 1}, + {"fiin", 1}, + {"ipro", 1}, + {"iprp", 1}, + {"mdia", 1}, + {"meco", 1}, + {"mere", 1}, + {"mfra", 1}, + {"minf", 1}, + {"moof", 1}, + {"moov", 1}, + {"mvex", 1}, + {"paen", 1}, + {"schi", 1}, + {"sinf", 1}, + {"skip", 1}, + {"stbl", 1}, + {"stsd", 1}, + {"strk", 1}, + {"tapt", 1}, + {"traf", 1}, + {"trak", 1}, + + {"cdsc", 2}, + {"colr", 2}, + {"dimg", 2}, + // {"dref", 2}, + {"free", 2}, + {"frma", 2}, + {"ftyp", 2}, + {"hdlr", 2}, + {"hvcC", 2}, + {"iinf", 2}, + {"iloc", 2}, + {"infe", 2}, + {"ipco", 2}, + {"ipma", 2}, + {"iref", 2}, + {"irot", 2}, + {"ispe", 2}, + {"meta", 2}, + {"mvhd", 2}, + {"pitm", 2}, + {"pixi", 2}, + {"schm", 2}, + {"thmb", 2}, + {"tkhd", 2}, + {"url ", 2}, + {"urn ", 2}, + + {"CCTP", 1}, + {"CRAW", 1}, + + {"JPEG", 2}, + {"CDI1", 2}, + {"CMP1", 2}, + + {"CNCV", 2}, + {"CCDT", 2}, + {"CTBO", 2}, + {"CMT1", 2}, + {"CMT2", 2}, + {"CMT3", 2}, + {"CMT4", 2}, + {"CNOP", 2}, + {"THMB", 2}, + {"co64", 2}, + {"mdat", 2}, + {"mdhd", 2}, + {"nmhd", 2}, + {"stsc", 2}, + {"stsz", 2}, + {"stts", 2}, + {"vmhd", 2}, + + {"dref", 3}, + {"uuid", 3}, + }; + + const char sHandlerType[5][5] = {"unk.", "soun", "vide", "hint", "meta"}; + + int c, err=0; + + ushort tL; // Atom length represented in 4 or 8 bytes + char nmAtom[5]; // Atom name + INT64 oAtom, szAtom; // Atom offset and Atom size + INT64 oAtomContent, + szAtomContent; // offset and size of Atom content + INT64 lHdr; + + char UIID[16]; + uchar CMP1[85]; + uchar thdr[4]; + uchar CDI1[60]; + char HandlerType[5], MediaFormatID[5]; + uint32_t relpos_inDir, relpos_inBox; + unsigned szItem, Tag, lTag; + ushort tItem; + + nmAtom[0] = MediaFormatID[0] = nmAtom[4] = MediaFormatID[4] = '\0'; + strcpy(HandlerType, sHandlerType[0]); + oAtom = oAtomList; + nesting++; + if (nesting > 31) + return -14; // too deep nesting + short s_order = order; + + while ((oAtom + 8LL) <= (oAtomList + szAtomList)) + { + lHdr = 0ULL; + err = 0; + order = 0x4d4d; + fseek(ifp, oAtom, SEEK_SET); + if (nesting == 0) + { + fread(thdr, 1, 4, ifp); + fseek(ifp, oAtom, SEEK_SET); + } + szAtom = get4(); + FORC4 nmAtom[c] = AtomNameStack[nesting * 4 + c] = fgetc(ifp); + AtomNameStack[(nesting + 1) * 4] = '\0'; + tL = 4; + AtomType = 0; + + for (c = 0; c < int(sizeof AtomNamesList / sizeof *AtomNamesList); c++) + if (!strcmp(nmAtom, AtomNamesList[c].AtomName)) + { + AtomType = AtomNamesList[c].AtomType; + break; + } + + if (!AtomType) + { + if (nesting == 0) + { + if(!memcmp(thdr,"II*\0",4) || !memcmp(thdr,"MM*\0",4)) + { + err = 0; + goto fin; + } + } + err = 1; + } + + if (szAtom == 0ULL) + { + if (nesting != 0) + { + err = -2; + goto fin; + } + szAtom = szAtomList - oAtom; + oAtomContent = oAtom + 8ULL; + szAtomContent = szAtom - 8ULL; + } + else if (szAtom == 1LL) + { + if ((oAtom + 16LL) > (oAtomList + szAtomList)) + { + err = -3; + goto fin; + } + tL = 8; + szAtom = (((unsigned long long)get4()) << 32) | get4(); + oAtomContent = oAtom + 16ULL; + szAtomContent = szAtom - 16ULL; + } + else + { + oAtomContent = oAtom + 8ULL; + szAtomContent = szAtom - 8ULL; + } + + if (!strcmp(AtomNameStack, "uuid")) // Top level uuid + { + INT64 tt = ftell(ifp); + lHdr = 16ULL; + fread(UIID, 1, lHdr, ifp); + if (!memcmp(UIID, UUID_XMP, 16) && szAtom > 24LL && szAtom < 1024000LL) + { + xmpdata = (char *)malloc(xmplen = unsigned(szAtom - 23)); + fread(xmpdata, szAtom - 24, 1, ifp); + xmpdata[szAtom - 24] = 0; + } + else if (!memcmp(UIID, UIID_CanonPreview, 16) && szAtom > 48LL && szAtom < 100LL * 1024000LL) + { + // read next 48 bytes, check for 'PRVW' + unsigned char xdata[32]; + fread(xdata, 32, 1, ifp); + if (!memcmp(xdata + 12, "PRVW", 4)) + { + thumb_length = unsigned(szAtom - 56); + thumb_offset = ftell(ifp); + if (imgdata.thumbs_list.thumbcount < LIBRAW_THUMBNAIL_MAXCOUNT) + { + bool do_add = true; + for(int idx = 0; idx < imgdata.thumbs_list.thumbcount; idx++) + if (imgdata.thumbs_list.thumblist[idx].toffset == thumb_offset) + { + do_add = false; + break; + } + if (do_add) + { + int idx = imgdata.thumbs_list.thumbcount; + imgdata.thumbs_list.thumblist[idx].tformat = LIBRAW_INTERNAL_THUMBNAIL_JPEG; + imgdata.thumbs_list.thumblist[idx].toffset = thumb_offset; + imgdata.thumbs_list.thumblist[idx].tlength = thumb_length; + imgdata.thumbs_list.thumblist[idx].tflip = 0xffff; + imgdata.thumbs_list.thumblist[idx].tmisc = (3 << 5) | 8; // 3 samples/8 bps + imgdata.thumbs_list.thumblist[idx].twidth = (xdata[22] << 8) + xdata[23]; + imgdata.thumbs_list.thumblist[idx].theight = (xdata[24] << 8) + xdata[25]; + imgdata.thumbs_list.thumbcount++; + } + } + + } + } + fseek(ifp, tt, SEEK_SET); + } + + if (!strcmp(nmAtom, "trak")) + { + nTrack++; + TrackType = 0; + if (nTrack >= LIBRAW_CRXTRACKS_MAXCOUNT) + break; + } + if (!strcmp(AtomNameStack, "moovuuid")) + { + lHdr = 16ULL; + fread(UIID, 1, lHdr, ifp); + if (!strncmp(UIID, UIID_Canon, lHdr)) + { + AtomType = 1; + } + else + fseek(ifp, -lHdr, SEEK_CUR); + } + else if (!strcmp(AtomNameStack, "moovuuidCCTP")) + { + lHdr = 12ULL; + } + else if (!strcmp(AtomNameStack, "moovuuidCMT1")) + { + short q_order = order; + order = get2(); + if ((tL != 4) || bad_hdr()) + { + err = -4; + goto fin; + } + if (!libraw_internal_data.unpacker_data.cr3_ifd0_length) + libraw_internal_data.unpacker_data.cr3_ifd0_length = unsigned(szAtomContent); + parse_tiff_ifd(oAtomContent); + order = q_order; + } + else if (!strcmp(AtomNameStack, "moovuuidTHMB") && szAtom > 24) + { + unsigned char xdata[16]; + fread(xdata, 16, 1, ifp); + INT64 xoffset = ftell(ifp); + if (imgdata.thumbs_list.thumbcount < LIBRAW_THUMBNAIL_MAXCOUNT) + { + bool do_add = true; + for (int idx = 0; idx < imgdata.thumbs_list.thumbcount; idx++) + if (imgdata.thumbs_list.thumblist[idx].toffset == xoffset) + { + do_add = false; + break; + } + if (do_add) + { + int idx = imgdata.thumbs_list.thumbcount; + imgdata.thumbs_list.thumblist[idx].tformat = LIBRAW_INTERNAL_THUMBNAIL_JPEG; + imgdata.thumbs_list.thumblist[idx].toffset = xoffset; + imgdata.thumbs_list.thumblist[idx].tlength = szAtom-24; + imgdata.thumbs_list.thumblist[idx].tflip = 0xffff; + imgdata.thumbs_list.thumblist[idx].tmisc = (3 << 5) | 8; // 3 samples/8 bps + imgdata.thumbs_list.thumblist[idx].twidth = (xdata[4] << 8) + xdata[5]; + imgdata.thumbs_list.thumblist[idx].theight = (xdata[6] << 8) + xdata[7]; + imgdata.thumbs_list.thumbcount++; + } + } + } + else if (!strcmp(AtomNameStack, "moovuuidCMT2")) + { + short q_order = order; + order = get2(); + if ((tL != 4) || bad_hdr()) + { + err = -5; + goto fin; + } + if (!libraw_internal_data.unpacker_data.cr3_exif_length) + libraw_internal_data.unpacker_data.cr3_exif_length = unsigned(szAtomContent); + parse_exif(oAtomContent); + order = q_order; + } + else if (!strcmp(AtomNameStack, "moovuuidCMT3")) + { + short q_order = order; + order = get2(); + if ((tL != 4) || bad_hdr()) + { + err = -6; + goto fin; + } + fseek(ifp, -12L, SEEK_CUR); + parse_makernote(oAtomContent, 0); + order = q_order; + } + else if (!strcmp(AtomNameStack, "moovuuidCMT4")) + { + short q_order = order; + order = get2(); + if ((tL != 4) || bad_hdr()) + { + err = -6; + goto fin; + } + INT64 off = ftell(ifp); + parse_gps(oAtomContent); + fseek(ifp, off, SEEK_SET); + parse_gps_libraw(oAtomContent); + order = q_order; + } + else if (!strcmp(AtomNameStack, "moovtrakmdiahdlr")) + { + fseek(ifp, 8L, SEEK_CUR); + FORC4 HandlerType[c] = fgetc(ifp); + for (c = 1; c < int(sizeof sHandlerType / sizeof *sHandlerType); c++) + if (!strcmp(HandlerType, sHandlerType[c])) + { + TrackType = c; + break; + } + } + else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsd")) + { + if (szAtomContent >= 16) + { + fseek(ifp, 12L, SEEK_CUR); + lHdr = 8; + } + else + { + err = -7; + goto fin; + } + FORC4 MediaFormatID[c] = fgetc(ifp); + if ((TrackType == 2) && (!strcmp(MediaFormatID, "CRAW"))) + { + if (szAtomContent >= 44) + fseek(ifp, 24L, SEEK_CUR); + else + { + err = -8; + goto fin; + } + } + else + { + AtomType = 2; // only continue for CRAW + lHdr = 0; + } +#define current_track libraw_internal_data.unpacker_data.crx_header[nTrack] + + /*ImageWidth =*/ get2(); + /*ImageHeight =*/ get2(); + } + 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, read_size, ifp); + else + { + err = -7; + goto fin; + } + if (!crxParseImageHeader(CMP1, nTrack, read_size)) + current_track.MediaType = 1; + } + + else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWCDI1")) { + if (szAtomContent >= 60) { + fread(CDI1, 1, 60, ifp); + if (!strncmp((char *)CDI1+8, "IAD1", 4) && (sgetn(8, CDI1) == 0x38)) { + // sensor area at CDI1+12, 4 16-bit values + // Bayer pattern? - next 4 16-bit values + imCanon.RecommendedImageArea = sget_CanonArea(CDI1+12 + 2*4*2); + imCanon.LeftOpticalBlack = sget_CanonArea(CDI1+12 + 3*4*2); + imCanon.UpperOpticalBlack = sget_CanonArea(CDI1+12 + 4*4*2); + imCanon.ActiveArea = sget_CanonArea(CDI1+12 + 5*4*2); + } + } + } + + else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWJPEG")) + { + current_track.MediaType = 2; + } + else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsc")) + { + if (szAtomContent >= 12) { + fseek(ifp, 4L, SEEK_CUR); + int entries = get4(); + if (entries < 1 || entries > 1000000) + { + err = -9; + goto fin; + } + + current_track.stsc_data = (crx_sample_to_chunk_t*) malloc(entries * sizeof(crx_sample_to_chunk_t)); + if(!current_track.stsc_data) + { + err = -9; + goto fin; + } + current_track.stsc_count = entries; + for(int i = 0; i < entries; i++) + { + current_track.stsc_data[i].first = get4(); + current_track.stsc_data[i].count = get4(); + current_track.stsc_data[i].id = get4(); + } + } + } + else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsz")) + { + if (szAtomContent >= 12) + { + fseek(ifp, 4L, SEEK_CUR); + int sample_size = get4(); + int entries = get4(); + current_track.sample_count = entries; + + // if sample size is zero sample size is fixed + if (sample_size) + { + current_track.MediaSize = sample_size; + current_track.sample_size = sample_size; + } + else + { + current_track.sample_size = 0; + if (entries < 1 || entries > 1000000) { + err = -10; + goto fin; + } + current_track.sample_sizes = (int32_t*)malloc(entries * sizeof(int32_t)); + if (!current_track.sample_sizes) + { + err = -10; + goto fin; + } + for (int i = 0; i < entries; i++) + current_track.sample_sizes[i] = get4(); + + current_track.MediaSize = current_track.sample_sizes[0]; + } + } + } + else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblco64")) + { + if (szAtomContent >= 16) { + fseek(ifp, 4L, SEEK_CUR); + uint32_t entries = get4(); + int i; + if (entries < 1 || entries > 1000000) + { + err = -11; + goto fin; + } + current_track.chunk_offsets = (INT64*)malloc(entries * sizeof(int64_t)); + if(!current_track.chunk_offsets) + { + err = -11; + goto fin; + } + + current_track.chunk_count = entries; + for (i = 0; i < entries; i++) + current_track.chunk_offsets[i] = (((int64_t)get4()) << 32) | get4(); + + current_track.chunk_count = i; + current_track.MediaOffset = current_track.chunk_offsets[0]; + } + } + + if (nTrack >= 0 && nTrack < LIBRAW_CRXTRACKS_MAXCOUNT && + current_track.MediaSize && current_track.MediaOffset && + ((oAtom + szAtom) >= (oAtomList + szAtomList)) && + !strncmp(AtomNameStack, "moovtrakmdiaminfstbl", 20)) + { + if ((TrackType == 4) && (!strcmp(MediaFormatID, "CTMD"))) + { + current_track.MediaType = 3; + } + } +#undef current_track + if (AtomType == 1) + { + err = parseCR3(oAtomContent + lHdr, szAtomContent - lHdr, nesting, + AtomNameStack, nTrack, TrackType); + if (err) + goto fin; + } + oAtom += szAtom; + } + +fin: + nesting--; + if (nesting >= 0) + AtomNameStack[nesting * 4] = '\0'; + order = s_order; + return err; +} +#undef bad_hdr + +void LibRaw::parseCR3_Free() +{ + short maxTrack = libraw_internal_data.unpacker_data.crx_track_count; + if (maxTrack < 0) + return; + + for (int i = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) + { + crx_data_header_t *d = &libraw_internal_data.unpacker_data.crx_header[i]; + if (d->stsc_data) + { + free(d->stsc_data); + d->stsc_data = NULL; + } + if (d->chunk_offsets) + { + free(d->chunk_offsets); + d->chunk_offsets = NULL; + } + + if (d->sample_sizes) + { + free(d->sample_sizes); + d->sample_sizes = NULL; + } + d->stsc_count = 0; + d->sample_count = 0; + d->sample_size = 0; + d->chunk_count = 0; + } + libraw_internal_data.unpacker_data.crx_track_count = -1; +} diff --git a/rtengine/libraw/src/metadata/epson.cpp b/rtengine/libraw/src/metadata/epson.cpp new file mode 100644 index 000000000..5537c9752 --- /dev/null +++ b/rtengine/libraw/src/metadata/epson.cpp @@ -0,0 +1,96 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +void LibRaw::parseEpsonMakernote(int base, int uptag, unsigned dng_writer) +{ + +#define isRIC imgdata.sizes.raw_inset_crops[0] + + unsigned entries, tag, type, len, save; + short morder, sorder = order; + ushort c; + INT64 fsize = ifp->size(); + + fseek(ifp, -2, SEEK_CUR); + + entries = get2(); + if (entries > 1000) + return; + morder = order; + + while (entries--) + { + order = morder; + tiff_get(base, &tag, &type, &len, &save); + INT64 pos = ifp->tell(); + if (len > 8 && pos + len > 2 * fsize) + { + fseek(ifp, save, SEEK_SET); // Recover tiff-read position!! + continue; + } + + tag |= uptag << 16; + if (len > 100 * 1024 * 1024) + goto next; // 100Mb tag? No! + + if (tag == 0x020b) + { + if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_LONG)) + isRIC.cwidth = get4(); + else if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_SHORT)) + isRIC.cwidth = get2(); + } + else if (tag == 0x020c) + { + if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_LONG)) + isRIC.cheight = get4(); + else if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_SHORT)) + isRIC.cheight = get2(); + } + else if (tag == 0x0400) + { // sensor area + ushort sdims[4] = {0, 0, 0, 0}; // left margin, top margin, width, height + FORC4 sdims[c] = get2(); + isRIC.cleft = (sdims[2] - sdims[0] - isRIC.cwidth) / 2; + isRIC.ctop = (sdims[3] - sdims[1] - isRIC.cheight) / 2; + } + + if (dng_writer == nonDNG) + { + + if (tag == 0x0280) + { + thumb_offset = ftell(ifp); + thumb_length = len; + } + else if (tag == 0x0401) + { + FORC4 cblack[RGGB_2_RGBG(c)] = get4(); + } + else if (tag == 0x0e80) + { + fseek(ifp, 48, SEEK_CUR); + cam_mul[0] = get2() * 567.0 / 0x10000; + cam_mul[2] = get2() * 431.0 / 0x10000; + } + } + + next: + fseek(ifp, save, SEEK_SET); + } + order = sorder; +#undef isRIC +} diff --git a/rtengine/libraw/src/metadata/exif_gps.cpp b/rtengine/libraw/src/metadata/exif_gps.cpp new file mode 100644 index 000000000..bc59371e5 --- /dev/null +++ b/rtengine/libraw/src/metadata/exif_gps.cpp @@ -0,0 +1,430 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" +#include "../../internal/libraw_cameraids.h" + +void LibRaw::parse_exif_interop(int base) +{ + unsigned entries, tag, type, len, save; + char value[4] = { 0,0,0,0 }; + entries = get2(); + INT64 fsize = ifp->size(); + while (entries--) + { + tiff_get(base, &tag, &type, &len, &save); + + INT64 savepos = ftell(ifp); + if (len > 8 && savepos + len > fsize * 2) + { + fseek(ifp, save, SEEK_SET); // Recover tiff-read position!! + continue; + } + if (callbacks.exif_cb) + { + callbacks.exif_cb(callbacks.exifparser_data, tag | 0x40000, type, len, order, ifp, base); + fseek(ifp, savepos, SEEK_SET); + } + + switch (tag) + { + case 0x0001: // InteropIndex + fread(value, 1, MIN(4, len), ifp); + if (strncmp(value, "R98", 3) == 0 && + // Canon bug, when [Canon].ColorSpace = AdobeRGB, + // but [ExifIFD].ColorSpace = Uncalibrated and + // [InteropIFD].InteropIndex = "R98" + imgdata.color.ExifColorSpace == LIBRAW_COLORSPACE_Unknown) + imgdata.color.ExifColorSpace = LIBRAW_COLORSPACE_sRGB; + else if (strncmp(value, "R03", 3) == 0) + imgdata.color.ExifColorSpace = LIBRAW_COLORSPACE_AdobeRGB; + break; + } + fseek(ifp, save, SEEK_SET); + } +} + +void LibRaw::parse_exif(int base) +{ + unsigned entries, tag, type, len, save, c; + double expo, ape; + + unsigned kodak = !strncmp(make, "EASTMAN", 7) && tiff_nifds < 3; + + if (!libraw_internal_data.unpacker_data.exif_subdir_offset) + { + libraw_internal_data.unpacker_data.exif_offset = base; + libraw_internal_data.unpacker_data.exif_subdir_offset = ftell(ifp); + } + + entries = get2(); + if (!strncmp(make, "Hasselblad", 10) && (tiff_nifds > 3) && (entries > 512)) + return; + INT64 fsize = ifp->size(); + while (entries--) + { + tiff_get(base, &tag, &type, &len, &save); + + INT64 savepos = ftell(ifp); + if (len > 8 && savepos + len > fsize * 2) + { + fseek(ifp, save, SEEK_SET); // Recover tiff-read position!! + continue; + } + if (callbacks.exif_cb) + { + callbacks.exif_cb(callbacks.exifparser_data, tag, type, len, order, ifp, + base); + fseek(ifp, savepos, SEEK_SET); + } + + switch (tag) + { + case 0xA005: // Interoperability IFD + fseek(ifp, get4() + base, SEEK_SET); + parse_exif_interop(base); + break; + case 0xA001: // ExifIFD.ColorSpace + c = get2(); + if (c == 1 && imgdata.color.ExifColorSpace == LIBRAW_COLORSPACE_Unknown) + imgdata.color.ExifColorSpace = LIBRAW_COLORSPACE_sRGB; + else if (c == 2) + imgdata.color.ExifColorSpace = LIBRAW_COLORSPACE_AdobeRGB; + break; + case 0x9400: + imCommon.exifAmbientTemperature = getreal(type); + if ((imCommon.CameraTemperature > -273.15f) && + ((OlyID == OlyID_TG_5) || + (OlyID == OlyID_TG_6)) + ) + imCommon.CameraTemperature += imCommon.exifAmbientTemperature; + break; + case 0x9401: + imCommon.exifHumidity = getreal(type); + break; + case 0x9402: + imCommon.exifPressure = getreal(type); + break; + case 0x9403: + imCommon.exifWaterDepth = getreal(type); + break; + case 0x9404: + imCommon.exifAcceleration = getreal(type); + break; + case 0x9405: + imCommon.exifCameraElevationAngle = getreal(type); + break; + + case 0xa405: // FocalLengthIn35mmFormat + imgdata.lens.FocalLengthIn35mmFormat = get2(); + break; + case 0xa431: // BodySerialNumber + stmread(imgdata.shootinginfo.BodySerial, len, ifp); + break; + case 0xa432: // LensInfo, 42034dec, Lens Specification per EXIF standard + imgdata.lens.MinFocal = getreal(type); + imgdata.lens.MaxFocal = getreal(type); + imgdata.lens.MaxAp4MinFocal = getreal(type); + imgdata.lens.MaxAp4MaxFocal = getreal(type); + break; + case 0xa435: // LensSerialNumber + stmread(imgdata.lens.LensSerial, len, ifp); + if (!strncmp(imgdata.lens.LensSerial, "----", 4)) + imgdata.lens.LensSerial[0] = '\0'; + break; + case 0xa420: /* 42016, ImageUniqueID */ + stmread(imgdata.color.ImageUniqueID, len, ifp); + break; + case 0xc65d: /* 50781, RawDataUniqueID */ + imgdata.color.RawDataUniqueID[16] = 0; + fread(imgdata.color.RawDataUniqueID, 1, 16, ifp); + break; + case 0xc630: // DNG LensInfo, Lens Specification per EXIF standard + imgdata.lens.dng.MinFocal = getreal(type); + imgdata.lens.dng.MaxFocal = getreal(type); + imgdata.lens.dng.MaxAp4MinFocal = getreal(type); + imgdata.lens.dng.MaxAp4MaxFocal = getreal(type); + break; + case 0xc68b: /* 50827, OriginalRawFileName */ + stmread(imgdata.color.OriginalRawFileName, len, ifp); + break; + case 0xa433: // LensMake + stmread(imgdata.lens.LensMake, len, ifp); + break; + case 0xa434: // LensModel + stmread(imgdata.lens.Lens, len, ifp); + if (!strncmp(imgdata.lens.Lens, "----", 4)) + imgdata.lens.Lens[0] = '\0'; + break; + case 0x9205: + imgdata.lens.EXIF_MaxAp = libraw_powf64l(2.0f, (getreal(type) / 2.0f)); + break; + case 0x829a: // 33434 + shutter = getreal(type); + if (tiff_nifds > 0 && tiff_nifds <= LIBRAW_IFD_MAXCOUNT) + tiff_ifd[tiff_nifds - 1].t_shutter = shutter; + break; + case 0x829d: // 33437, FNumber + aperture = getreal(type); + break; + case 0x8827: // 34855 + iso_speed = get2(); + break; + case 0x8831: // 34865 + if (iso_speed == 0xffff && !strncasecmp(make, "FUJI", 4)) + iso_speed = getreal(type); + break; + case 0x8832: // 34866 + if (iso_speed == 0xffff && + (!strncasecmp(make, "SONY", 4) || !strncasecmp(make, "CANON", 5))) + iso_speed = getreal(type); + break; + case 0x9003: // 36867 + case 0x9004: // 36868 + get_timestamp(0); + break; + case 0x9201: // 37377 + if ((expo = -getreal(type)) < 128 && shutter == 0.) + { + shutter = libraw_powf64l(2.0, expo); + if (tiff_nifds > 0 && tiff_nifds <= LIBRAW_IFD_MAXCOUNT) + tiff_ifd[tiff_nifds - 1].t_shutter = shutter; + } + break; + case 0x9202: // 37378 ApertureValue + if ((fabs(ape = getreal(type)) < 256.0) && (!aperture)) + aperture = libraw_powf64l(2.0, ape / 2); + break; + case 0x9209: // 37385 + flash_used = getreal(type); + break; + case 0x920a: // 37386 + focal_len = getreal(type); + break; + case 0x927c: // 37500 +#ifndef USE_6BY9RPI + if (((make[0] == '\0') && !strncmp(model, "ov5647", 6)) || + (!strncmp(make, "RaspberryPi", 11) && + (!strncmp(model, "RP_OV5647", 9) || + !strncmp(model, "RP_imx219", 9)))) +#else + if (((make[0] == '\0') && !strncmp(model, "ov5647", 6)) || + (!strncmp(make, "RaspberryPi", 11) && + (!strncmp(model, "RP_", 3) || !strncmp(model,"imx477",6)))) +#endif + { + char mn_text[512]; + char *pos; + char ccms[512]; + ushort l; + float num; + + fgets(mn_text, MIN(len, 511), ifp); + mn_text[511] = 0; + + pos = strstr(mn_text, "ev="); + if (pos) + imCommon.ExposureCalibrationShift = atof(pos + 3); + + pos = strstr(mn_text, "gain_r="); + if (pos) + cam_mul[0] = atof(pos + 7); + pos = strstr(mn_text, "gain_b="); + if (pos) + cam_mul[2] = atof(pos + 7); + if ((cam_mul[0] > 0.001f) && (cam_mul[2] > 0.001f)) + cam_mul[1] = cam_mul[3] = 1.0f; + else + cam_mul[0] = cam_mul[2] = 0.0f; + + pos = strstr(mn_text, "ccm="); + if (pos) + { + pos += 4; + char *pos2 = strstr(pos, " "); + if (pos2) + { + l = pos2 - pos; + memcpy(ccms, pos, l); + ccms[l] = '\0'; +#ifdef LIBRAW_WIN32_CALLS + // Win32 strtok is already thread-safe + pos = strtok(ccms, ","); +#else + char *last = 0; + pos = strtok_r(ccms, ",", &last); +#endif + if (pos) + { + for (l = 0; l < 3; l++) // skip last row + { + num = 0.0; + for (c = 0; c < 3; c++) + { + cmatrix[l][c] = (float)atoi(pos); + num += cmatrix[c][l]; +#ifdef LIBRAW_WIN32_CALLS + pos = strtok(NULL, ","); +#else + pos = strtok_r(NULL, ",", &last); +#endif + if (!pos) + goto end; // broken + } + if (num > 0.01) + FORC3 cmatrix[l][c] = cmatrix[l][c] / num; + } + } + } + } + end:; + } + else if (!strncmp(make, "SONY", 4) && + (!strncmp(model, "DSC-V3", 6) || !strncmp(model, "DSC-F828", 8))) + { + parseSonySRF(len); + break; + } + else if ((len == 1) && !strncmp(make, "NIKON", 5)) + { + c = get4(); + if (c) + fseek(ifp, c, SEEK_SET); + is_NikonTransfer = 1; + } + parse_makernote(base, 0); + break; + case 0xa002: // 40962 + if (kodak) + raw_width = get4(); + break; + case 0xa003: // 40963 + if (kodak) + raw_height = get4(); + break; + case 0xa302: // 41730 + if (get4() == 0x20002) + for (exif_cfa = c = 0; c < 8; c += 2) + exif_cfa |= fgetc(ifp) * 0x01010101U << c; + } + fseek(ifp, save, SEEK_SET); + } +} + +void LibRaw::parse_gps_libraw(int base) +{ + unsigned entries, tag, type, len, save, c; + + entries = get2(); + if (entries > 40) + return; + if (entries > 0) + imgdata.other.parsed_gps.gpsparsed = 1; + INT64 fsize = ifp->size(); + while (entries--) + { + tiff_get(base, &tag, &type, &len, &save); + if (len > 1024) + { + fseek(ifp, save, SEEK_SET); // Recover tiff-read position!! + continue; // no GPS tags are 1k or larger + } + INT64 savepos = ftell(ifp); + if (len > 8 && savepos + len > fsize * 2) + { + fseek(ifp, save, SEEK_SET); // Recover tiff-read position!! + continue; + } + + if (callbacks.exif_cb) + { + callbacks.exif_cb(callbacks.exifparser_data, tag | 0x50000, type, len, order, ifp, base); + fseek(ifp, savepos, SEEK_SET); + } + + switch (tag) + { + case 0x0001: + imgdata.other.parsed_gps.latref = getc(ifp); + break; + case 0x0003: + imgdata.other.parsed_gps.longref = getc(ifp); + break; + case 0x0005: + imgdata.other.parsed_gps.altref = getc(ifp); + break; + case 0x0002: + if (len == 3) + FORC(3) imgdata.other.parsed_gps.latitude[c] = getreal(type); + break; + case 0x0004: + if (len == 3) + FORC(3) imgdata.other.parsed_gps.longitude[c] = getreal(type); + break; + case 0x0007: + if (len == 3) + FORC(3) imgdata.other.parsed_gps.gpstimestamp[c] = getreal(type); + break; + case 0x0006: + imgdata.other.parsed_gps.altitude = getreal(type); + break; + case 0x0009: + imgdata.other.parsed_gps.gpsstatus = getc(ifp); + break; + } + fseek(ifp, save, SEEK_SET); + } +} + +void LibRaw::parse_gps(int base) +{ + unsigned entries, tag, type, len, save, c; + + entries = get2(); + if (entries > 40) + return; + while (entries--) + { + tiff_get(base, &tag, &type, &len, &save); + if (len > 1024) + { + fseek(ifp, save, SEEK_SET); // Recover tiff-read position!! + continue; // no GPS tags are 1k or larger + } + switch (tag) + { + case 0x0001: + case 0x0003: + case 0x0005: + gpsdata[29 + tag / 2] = getc(ifp); + break; + case 0x0002: + case 0x0004: + case 0x0007: + FORC(6) gpsdata[tag / 3 * 6 + c] = get4(); + break; + case 0x0006: + FORC(2) gpsdata[18 + c] = get4(); + break; + case 0x0012: // 18 + case 0x001d: // 29 + fgets((char *)(gpsdata + 14 + tag / 3), MIN(len, 12), ifp); + } + fseek(ifp, save, SEEK_SET); + } +} diff --git a/rtengine/libraw/src/metadata/fuji.cpp b/rtengine/libraw/src/metadata/fuji.cpp new file mode 100644 index 000000000..30e64c2ea --- /dev/null +++ b/rtengine/libraw/src/metadata/fuji.cpp @@ -0,0 +1,1342 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" +#include "../../internal/libraw_checked_buffer.h" + + +int LibRaw::guess_RAFDataGeneration (uchar *RAFData_start) // returns offset to first valid width/height pair +{ + +/* RAFDataGeneration codes, values are 4 bytes, little endian + + RAFData gen. 0: no RAFData + DBP for GX680 / DX-2000 + E550, E900, (F500 / F505?) F550, F600 / F605, F700, F770 / F775, F800, F810, F900 + HS10 HS11, HS20 / HS22, HS30 / HS33 / HS35, HS50 + S1, SL1000, S100, S200 / S205, S20Pro, S2Pro, S3Pro, S5Pro + S5000, S5100 / S5500, S5200 / S5600, S6000 / S6500, S7000, S9000 / S9500, S9100 / S9600 + + RAFData gen. 1, offset to WH pair (offsetWH_inRAFData) = 0: + - number in bytes 0..1 is less than 10000 + - contains WH pair, recommended image size WH pair, 16 bytes unknown, 2*13 values (for crops, scales?) + X100, X-Pro1, X-S1, X10, XF1 + + RAFData gen. 2, offset to WH pair = 4: + - bytes 0..1 contain a number greater than 10000; bytes 2..3 contain zero; + version is in bytes 0..1, possibly big endian + - contains WH pair, recommended image size WH pair, 16 bytes unknown, 2*13 values + X-E1 + + RAFData gen. 3, offset to WH pair = 4: + - bytes 0..1 contain zero; bytes 2..3 contain version; + - contains a table of 3+2*13 values; first 3 values look like WHW + X-A1, X-A2, X-E2, X-M1 + X-T1, X-T10 + X100S, X100T + X20, X30, X70, XQ1, XQ2 + + RAFData gen. 4, offset to WH pair = 8: + - same conditions as for RAFData gen. 3, but also adds WRTS in bytes 4..7 + - contains a table of 3+2*13 values; first 3 values look like WHW + - H in WHW group has a different meaning if the shot is taken in crop 2 mode + GFX 100, GFX 100S, GFX 100 II + GFX 50R, GFX 50S, GFX 50S II + X-E2S, X-E3, X-H1, X-S10, X-H2 + X-T2, X-T3, X-T4, X-T20, X-T30 + X-Pro2, X-Pro3 + X100F, X100V + + RAFData gen. set to 4096: + - RAFData length is exactly 4096 + X-A3, X-A5, X-A7, X-A10, X-A20 + X-T100, X-T200, + XF10 +*/ + + int offsetWH_inRAFData=0; /* clang warns about not initialized value */ + ushort b01 = sget2(RAFData_start); // bytes 0..1 + ushort b23 = sget2(RAFData_start+2); // bytes 2..3 + int is_WRTS = (sget4(RAFData_start + 4) == 0x53545257); // STRW + if (b01 && !b23 && (b01<10000)) + { + imFuji.RAFDataGeneration = 1; + offsetWH_inRAFData = 0; + } + else if ((b01>10000) && !b23) + { + imFuji.RAFDataGeneration = 2; + imFuji.RAFDataVersion = b01; + offsetWH_inRAFData = 4; + } + else if (!b01) + { + if (!is_WRTS) + { + imFuji.RAFDataGeneration = 3; + offsetWH_inRAFData = 4; + } + else + { + imFuji.RAFDataGeneration = 4; + offsetWH_inRAFData = 8; + } + imFuji.RAFDataVersion = b23; + } + +//printf ("ID: 0x%llx, RAFDataVersion: 0x%04x, RAFDataGeneration: %d\n", +//ilm.CamID, imFuji.RAFDataVersion, imFuji.RAFDataGeneration); + + return offsetWH_inRAFData; +} + +class fuji_wb_checked_buffer_t : public checked_buffer_t +{ +public: + bool isWB(unsigned offset) + { + return sget2(offset) != 0 && sget2(offset + 2) != 0 && sget2(offset + 4) != 0 && sget2(offset + 6) != 0 && + sget2(offset + 8) != 0 && sget2(offset + 10) != 0 && sget2(offset) != 0xff && sget2(offset + 2) != 0xff && + sget2(offset + 4) != 0xff && sget2(offset + 6) != 0xff && sget2(offset + 8) != 0xff && + sget2(offset + 10) != 0xff && sget2(offset) == sget2(offset + 6) && sget2(offset) < sget2(offset + 2) && + sget2(offset) < sget2(offset + 4) && sget2(offset) < sget2(offset + 8) && sget2(offset) < sget2(offset + 10) + ; + } + fuji_wb_checked_buffer_t(short ord, int size) : checked_buffer_t(ord, size) {} + void set_order(short o) { _order = o; } +}; + +struct tag2wb_t +{ + unsigned tag; + int wb; +} tag2wbtable[] = +{ + {0x2000, LIBRAW_WBI_Auto }, + {0x2100, LIBRAW_WBI_FineWeather }, + {0x2200, LIBRAW_WBI_Shade}, + {0x2300, LIBRAW_WBI_FL_D }, + {0x2301, LIBRAW_WBI_FL_N}, + {0x2302, LIBRAW_WBI_FL_W }, + {0x2310, LIBRAW_WBI_FL_WW}, + {0x2311, LIBRAW_WBI_FL_L}, + {0x2400, LIBRAW_WBI_Tungsten}, + {0x2410, LIBRAW_WBI_Flash} +}; +const int tag2wbtable_size = sizeof(tag2wbtable) / sizeof(tag2wbtable[0]); + + +void LibRaw::parseAdobeRAFMakernote() +{ + + unsigned posPrivateMknBuf=0; /* clang warns about not inited value */ + unsigned PrivateMknLength; + unsigned PrivateOrder; + unsigned ifd_start, ifd_len; + unsigned PrivateEntries, PrivateTagID; + unsigned PrivateTagBytes; + int FujiShotSelect; + unsigned wb_section_offset = 0; + int posWB; + int c; + +#if 0 +#define isWB(posWB) \ + sget2(posWB) != 0 && sget2(posWB + 2) != 0 && sget2(posWB + 4) != 0 && \ + sget2(posWB + 6) != 0 && sget2(posWB + 8) != 0 && \ + sget2(posWB + 10) != 0 && sget2(posWB) != 0xff && \ + sget2(posWB + 2) != 0xff && sget2(posWB + 4) != 0xff && \ + sget2(posWB + 6) != 0xff && sget2(posWB + 8) != 0xff && \ + sget2(posWB + 10) != 0xff && sget2(posWB) == sget2(posWB + 6) && \ + sget2(posWB) < sget2(posWB + 2) && sget2(posWB) < sget2(posWB + 4) && \ + sget2(posWB) < sget2(posWB + 8) && sget2(posWB) < sget2(posWB + 10) +#endif + +#define get_average_WB(wb_index) \ + FORC4 icWBC[wb_index][GRGB_2_RGBG(c)] = \ + PrivateMknBuf.sget2(posPrivateMknBuf + (c << 1)); \ + if ((PrivateTagBytes == 16) && average_WBData) { \ + FORC4 icWBC[wb_index][GRGB_2_RGBG(c)] = \ + (icWBC[wb_index][GRGB_2_RGBG(c)] + \ + PrivateMknBuf.sget2(posPrivateMknBuf + (c << 1)+8)) /2; \ + } \ + if (use_WBcorr_coeffs) { \ + icWBC[wb_index][0] *= wbR_corr; \ + icWBC[wb_index][2] *= wbB_corr; \ + } + + ushort use_WBcorr_coeffs = 0; + double wbR_corr = 1.0; + double wbB_corr = 1.0; + + if (strstr(model, "S2Pro") + || strstr(model, "S20Pro") + || strstr(model, "F700") + || strstr(model, "S5000") + || strstr(model, "S7000") + ) { + use_WBcorr_coeffs = 1; + wbR_corr = 10.0 / 17.0 / 0.652941; + wbB_corr = 2.0 /3.0 / (3.0 / 4.0 + 1.0 / 300.0); + } else if (strstr(model, "DBP") || strstr(model, "DX-2000")) { + use_WBcorr_coeffs = 1; + wbR_corr = 0.7632653061; + wbB_corr = 0.8591549296; + } + + FujiShotSelect = LIM(shot_select, 0, 1); + int average_WBData = 1; + + order = 0x4d4d; + PrivateMknLength = get4(); + + // At least 0x36 bytes because of memcpy(imFuji.RAFVersion, PrivateMknBuf + 0x32, 4); + if ((PrivateMknLength >= 0x36) && (PrivateMknLength < 10240000)) // 1024b for safety + { + fuji_wb_checked_buffer_t PrivateMknBuf(order, PrivateMknLength+1024); + fread(PrivateMknBuf.data(), PrivateMknLength, 1, ifp); + memcpy(imFuji.SerialSignature, PrivateMknBuf.data() + 6, 0x0c); + imFuji.SerialSignature[0x0c] = 0; + memcpy(imFuji.SensorID, imFuji.SerialSignature + 0x06, 0x04); + imFuji.SensorID[0x04] = 0; + c = 11; + while (isdigit(imFuji.SerialSignature[c]) && (c>0)) + c--; + ilm.CamID = unique_id = (unsigned long long)atoi(imFuji.SerialSignature+c+1); + memcpy(model, PrivateMknBuf.data() + 0x12, 0x20); + model[0x20] = 0; + memcpy(imFuji.RAFVersion, PrivateMknBuf.data() + 0x32, 4); + imFuji.RAFVersion[4] = 0; + + PrivateOrder = PrivateMknBuf.sget2(0); + unsigned s, l; + s = ifd_start = PrivateMknBuf.sget4(2)+6; + l = ifd_len = PrivateMknBuf.sget4(ifd_start); + + if (!PrivateMknBuf.sget4(ifd_start+ifd_len+4)) + FujiShotSelect = 0; + + if ((FujiShotSelect == 1) && (PrivateMknLength > ifd_len*2)) { + ifd_start += (ifd_len+4); + ifd_len = PrivateMknBuf.sget4(ifd_start); + if ((ifd_start+ifd_len) > PrivateMknLength) { + ifd_start = s; + ifd_len = l; + FujiShotSelect = 0; + } + } else FujiShotSelect = 0; + + PrivateEntries = PrivateMknBuf.sget4(ifd_start + 4); + if ((PrivateEntries > 1000) || + ((PrivateOrder != 0x4d4d) && (PrivateOrder != 0x4949))) + { + return; + } + posPrivateMknBuf = (ifd_start+8); + + /* + * because Adobe DNG converter strips or misplaces 0xfnnn tags, + * for now, Auto WB is missing for the following cameras: + * - F550EXR / F600EXR / F770EXR / F800EXR / F900EXR + * - HS10 / HS11 / HS20EXR / HS30EXR / HS33EXR / HS35EXR / HS50EXR + * - S1 / SL1000 + **/ + while (PrivateEntries--) + { + PrivateMknBuf.set_order(0x4d4d); + order = 0x4d4d; + PrivateTagID = PrivateMknBuf.sget2(posPrivateMknBuf); + PrivateTagBytes = PrivateMknBuf.sget2(posPrivateMknBuf + 2); + posPrivateMknBuf += 4; + PrivateMknBuf.set_order(PrivateOrder); + order = PrivateOrder; + + if (PrivateTagID >= 0x2000 && PrivateTagID <= 0x2410) + { + for(int q = 0; q < tag2wbtable_size; q++) + if (tag2wbtable[q].tag == PrivateTagID) + { + get_average_WB(tag2wbtable[q].wb); + break; + } + } + else if (PrivateTagID == 0x2f00) + { + int nWBs = MIN(PrivateMknBuf.sget4(posPrivateMknBuf), 6); + posWB = posPrivateMknBuf + 4; + for (int wb_ind = LIBRAW_WBI_Custom1; wb_ind < LIBRAW_WBI_Custom1+nWBs; wb_ind++) { + FORC4 icWBC[wb_ind][GRGB_2_RGBG(c)] = + PrivateMknBuf.sget2(posWB + (c << 1)); + if ((PrivateTagBytes >= unsigned(4+16*nWBs)) && average_WBData) { + posWB += 8; + FORC4 icWBC[wb_ind][GRGB_2_RGBG(c)] = + (icWBC[wb_ind][GRGB_2_RGBG(c)] + + PrivateMknBuf.sget2(posWB + (c << 1))) /2; + } + if (use_WBcorr_coeffs) { + icWBC[wb_ind][0] *= wbR_corr; + icWBC[wb_ind][2] *= wbB_corr; + } + posWB += 8; + } + } + else if (PrivateTagID == 0x2ff0) + { + get_average_WB(LIBRAW_WBI_AsShot); + FORC4 cam_mul[c] = icWBC[LIBRAW_WBI_AsShot][c]; + } + else if ((PrivateTagID == 0x4000) && + ((PrivateTagBytes == 8) || (PrivateTagBytes == 16))) + { + imFuji.BlackLevel[0] = PrivateTagBytes / 2; + FORC4 imFuji.BlackLevel[GRGB_2_RGBG(c)+1] = + PrivateMknBuf.sget2(posPrivateMknBuf + (c << 1)); + if (imFuji.BlackLevel[0] == 8) { + FORC4 imFuji.BlackLevel[GRGB_2_RGBG(c) + 5] = + PrivateMknBuf.sget2(posPrivateMknBuf + (c << 1) + 8); + } + } + else if (PrivateTagID == 0x9650) + { + short a = (short)PrivateMknBuf.sget2(posPrivateMknBuf); + float b = fMAX(1.0f, PrivateMknBuf.sget2(posPrivateMknBuf + 2)); + imFuji.ExpoMidPointShift = a / b; + imCommon.ExposureCalibrationShift += imFuji.ExpoMidPointShift; + } + else if ((PrivateTagID == 0xc000) && (PrivateTagBytes > 3) && + (PrivateTagBytes < 10240000)) + { + PrivateMknBuf.set_order(0x4949); + order = 0x4949; + if (PrivateTagBytes != 4096) // not one of Fuji X-A3, X-A5, X-A7, X-A10, X-A20, X-T100, X-T200, XF10 + { + int is34 = 0; + PrivateMknBuf.checkoffset(posPrivateMknBuf + 8); // will raise exception if no space + guess_RAFDataGeneration (PrivateMknBuf.data() + posPrivateMknBuf); + +//printf ("ID: 0x%llx, RAFDataVersion: 0x%04x, RAFDataGeneration: %d\n", +//ilm.CamID, imFuji.RAFDataVersion, imFuji.RAFDataGeneration); + + for (posWB = 0; posWB < (int)PrivateTagBytes - 16; posWB++) + { + PrivateMknBuf.checkoffset(posWB + 12); // will raise exception if no space + if ((!memcmp(PrivateMknBuf.data() + posWB, "TSNERDTS", 8) && + (PrivateMknBuf.sget2( posWB + 10) > 125))) + { + posWB += 10; + icWBC[LIBRAW_WBI_Auto][1] = + icWBC[LIBRAW_WBI_Auto][3] = + PrivateMknBuf.sget2(posWB); + icWBC[LIBRAW_WBI_Auto][0] = + PrivateMknBuf.sget2(posWB + 2); + icWBC[LIBRAW_WBI_Auto][2] = + PrivateMknBuf.sget2(posWB + 4); + break; + } + } + + if ((imFuji.RAFDataVersion == 0x0260) || // X-Pro3, GFX 100S + (imFuji.RAFDataVersion == 0x0261) || // X100V, GFX 50S II + (imFuji.RAFDataVersion == 0x0262) || // X-T4 + (imFuji.RAFDataVersion == 0x0263) || // X-H2s + (imFuji.RAFDataVersion == 0x0264) || // X-S10, X-H2 + (imFuji.RAFDataVersion == 0x0265) || // X-E4, X-T5 + (imFuji.RAFDataVersion == 0x0266) || // X-T30 II + (imFuji.RAFDataVersion == 0x0267) || // GFX 100 II + !strcmp(model, "X-Pro3") || + !strcmp(model, "GFX 100 II") || !strcmp(model, "GFX100 II") || + !strcmp(model, "GFX 100S") || !strcmp(model, "GFX100S") || + !strcmp(model, "GFX 50S II") || !strcmp(model, "GFX50S II") || + !strcmp(model, "X100V") || + !strcmp(model, "X-H2") || + !strcmp(model, "X-H2S") || + !strcmp(model, "X-T4") || + !strcmp(model, "X-T5") || + !strcmp(model, "X-E4") || + !strcmp(model, "X-T30 II") || + !strcmp(model, "X-S10")) + is34 = 1; + + if (imFuji.RAFDataVersion == 0x4500) // X-E1, RAFData gen. 3 + { + wb_section_offset = 0x13ac; + } + else if (imFuji.RAFDataVersion == 0x0146 || // X20 + imFuji.RAFDataVersion == 0x0149 || // X100S + imFuji.RAFDataVersion == 0x0249) // X100S + { + wb_section_offset = 0x1410; + } + else if (imFuji.RAFDataVersion == 0x014d || // X-M1 + imFuji.RAFDataVersion == 0x014e) // X-A1, X-A2 + { + wb_section_offset = 0x1474; + } + else if (imFuji.RAFDataVersion == 0x014f || // X-E2 + imFuji.RAFDataVersion == 0x024f || // X-E2 + imFuji.RAFDataVersion == 0x025d || // X-H1 + imFuji.RAFDataVersion == 0x035d) // X-H1 + { + wb_section_offset = 0x1480; + } + else if (imFuji.RAFDataVersion == 0x0150) // XQ1, XQ2 + { + wb_section_offset = 0x1414; + } + else if (imFuji.RAFDataVersion == 0x0151 || // X-T1 w/diff. fws + imFuji.RAFDataVersion == 0x0251 || imFuji.RAFDataVersion == 0x0351 || + imFuji.RAFDataVersion == 0x0451 || imFuji.RAFDataVersion == 0x0551) + { + wb_section_offset = 0x14b0; + } + else if (imFuji.RAFDataVersion == 0x0152 || // X30 + imFuji.RAFDataVersion == 0x0153) // X100T + { + wb_section_offset = 0x1444; + } + else if (imFuji.RAFDataVersion == 0x0154) // X-T10 + { + wb_section_offset = 0x1824; + } + else if (imFuji.RAFDataVersion == 0x0155) // X70 + { + wb_section_offset = 0x17b4; + } + else if (imFuji.RAFDataVersion == 0x0255 || // X-Pro2 + imFuji.RAFDataVersion == 0x0455) + { + wb_section_offset = 0x135c; + } + else if (imFuji.RAFDataVersion == 0x0258 || // X-T2 + imFuji.RAFDataVersion == 0x025b) // X-T20 + { + wb_section_offset = 0x13dc; + } + else if (imFuji.RAFDataVersion == 0x0259) // X100F + { + wb_section_offset = 0x1370; + } + else if (imFuji.RAFDataVersion == 0x025a || // GFX 50S + imFuji.RAFDataVersion == 0x045a) + { + wb_section_offset = 0x1424; + } + else if (imFuji.RAFDataVersion == 0x025c) // X-E3 + { + wb_section_offset = 0x141c; + } + else if (imFuji.RAFDataVersion == 0x025e) // X-T3 + { + wb_section_offset = 0x2014; + } + else if (imFuji.RAFDataVersion == 0x025f) // X-T30, GFX 50R, GFX 100 (? RAFDataVersion 0x045f) + { + if (!strcmp(model, "X-T30")) { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x20b8)) + wb_section_offset = 0x20b8; + else if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x20c8)) + wb_section_offset = 0x20c8; + } + else if (!strcmp(model, "GFX 50R")) + wb_section_offset = 0x1424; + else if (!strcmp(model, "GFX 100")) + wb_section_offset = 0x20e4; + } + else if (imFuji.RAFDataVersion == 0x0260) // X-Pro3, GFX 100S + { + if (!strcmp(model, "X-Pro3")) + wb_section_offset = 0x20e8; + else if (!strcmp(model, "GFX 100S") || !strcmp(model, "GFX100S")) + wb_section_offset = 0x2108; + } + else if (imFuji.RAFDataVersion == 0x0261) // X100V, GFX 50S II + { + if (!strcmp(model, "X100V")) + wb_section_offset = 0x2078; + else if (!strcmp(model, "GFX 50S II") || !strcmp(model, "GFX50S II")) + wb_section_offset = 0x214c; + } + else if (imFuji.RAFDataVersion == 0x0262) // X-T4 + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x21c8)) + wb_section_offset = 0x21c8; + else if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x21cc)) + wb_section_offset = 0x21cc; + } + else if (imFuji.RAFDataVersion == 0x0263) // X-H2S + { + wb_section_offset = 0x0b40; + } + else if (imFuji.RAFDataVersion == 0x0264) // X-S10, X-H2 + { + if (!strcmp(model, "X-S10")) + wb_section_offset = 0x21de; + else if (!strcmp(model, "X-H2")) + wb_section_offset = 0x0b3e; + } + else if ((imFuji.RAFDataVersion == 0x0265) || // X-E4, X-T5 + (imFuji.RAFDataVersion == 0x0266)) // X-T30 II, X-S20 + { + if (!strcmp(model, "X-T5") || + !strcmp(model, "X-S20")) + wb_section_offset = 0x0c72; + else + wb_section_offset = 0x21cc; + } + else if (imFuji.RAFDataVersion == 0x0267) // GFX 100 II + { + wb_section_offset = 0x0cae; + } + else if (imFuji.RAFDataVersion == 0x0355) // X-E2S + { + wb_section_offset = 0x1840; + } + +/* try for unknown RAF Data versions */ + else if (!strcmp(model, "X-Pro2")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x135c)) + wb_section_offset = 0x135c; + } + else if (!strcmp(model, "X100F")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x1370)) + wb_section_offset = 0x1370; + } + else if (!strcmp(model, "X-E1")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x13ac)) + wb_section_offset = 0x13ac; + } + else if (!strcmp(model, "X-T2") || + !strcmp(model, "X-T20")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x13dc)) + wb_section_offset = 0x13dc; + } + else if (!strcmp(model, "X20") || + !strcmp(model, "X100S")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x1410)) + wb_section_offset = 0x1410; + } + else if (!strcmp(model, "XQ1") || + !strcmp(model, "XQ2")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x1414)) + wb_section_offset = 0x1414; + } + else if (!strcmp(model, "X-E3")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x141c)) + wb_section_offset = 0x141c; + } + else if (!strcmp(model, "GFX 50S") || + !strcmp(model, "GFX 50R")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x1424)) + wb_section_offset = 0x1424; + } + else if (!strcmp(model, "GFX 50S II") || + !strcmp(model, "GFX50S II")) { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x214c)) + wb_section_offset = 0x214c; + } + else if (!strcmp(model, "X30") || + !strcmp(model, "X100T")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x1444)) + wb_section_offset = 0x1444; + } + else if (!strcmp(model, "X-M1") || + !strcmp(model, "X-A1") || + !strcmp(model, "X-A2")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x1474)) + wb_section_offset = 0x1474; + } + else if (!strcmp(model, "X-E2") || + !strcmp(model, "X-H1")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x1480)) + wb_section_offset = 0x1480; + } + else if (!strcmp(model, "X-T1")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x14b0)) + wb_section_offset = 0x14b0; + } + else if (!strcmp(model, "X70")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x17b4)) + wb_section_offset = 0x17b4; + } + else if (!strcmp(model, "X-T10")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x1824)) + wb_section_offset = 0x1824; + } + else if (!strcmp(model, "X-E2S")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x1840)) + wb_section_offset = 0x1840; + } + else if (!strcmp(model, "X-T3")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x2014)) + wb_section_offset = 0x2014; + } + else if (!strcmp(model, "X100V")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x2078)) + wb_section_offset = 0x2078; + } + else if (!strcmp(model, "X-T30")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x20b8)) + wb_section_offset = 0x20b8; + else if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x20c8)) + wb_section_offset = 0x20c8; + } + else if (!strcmp(model, "GFX 100")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x20e4)) + wb_section_offset = 0x20e4; + } + else if (!strcmp(model, "X-Pro3")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x20e8)) + wb_section_offset = 0x20e8; + } + else if (!strcmp(model, "GFX100S") || + !strcmp(model, "GFX 100S")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x2108)) + wb_section_offset = 0x2108; + } + else if (!strcmp(model, "X-T4")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x21c8)) + wb_section_offset = 0x21c8; + else if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x21cc)) + wb_section_offset = 0x21cc; + } + else if ((!strcmp(model, "X-E4")) || + (!strcmp(model, "X-T30 II"))) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x21cc)) + wb_section_offset = 0x21cc; + } + else if (!strcmp(model, "X-S10")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x21de)) + wb_section_offset = 0x21de; + } + else if (!strcmp(model, "X-H2")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x0b3e)) + wb_section_offset = 0x0b3e; + } + else if (!strcmp(model, "X-H2S")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x0b40)) + wb_section_offset = 0x0b40; + } + else if (!strcmp(model, "X-T5") || + !strcmp(model, "X-S20")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x0c72)) + wb_section_offset = 0x0c72; + } + else if (!strcmp(model, "GFX 100 II") || + !strcmp(model, "GFX100 II")) + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x0cae)) + wb_section_offset = 0x0cae; + } + +/* no RAF Data version for the models below */ + else if (!strcmp(model, "FinePix X100")) // X100 0 0x19f0 0x19e8 + { + if (!strcmp(imFuji.RAFVersion, "0069")) + wb_section_offset = 0x19e8; + else if (!strcmp(imFuji.RAFVersion, "0100") || + !strcmp(imFuji.RAFVersion, "0110")) + wb_section_offset = 0x19f0; + else + { + if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x19e8)) + wb_section_offset = 0x19e8; + else if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x19f0)) + wb_section_offset = 0x19f0; + } + } + else if (!strcmp(model, "X-Pro1")) // X-Pro1 0 0x13a4 + { + if (!strcmp(imFuji.RAFVersion, "0100") || + !strcmp(imFuji.RAFVersion, "0101") || + !strcmp(imFuji.RAFVersion, "0204")) + wb_section_offset = 0x13a4; + else if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x13a4)) + wb_section_offset = 0x13a4; + } + else if (!strcmp(model, "XF1")) // XF1 0 0x138c + { + if (!strcmp(imFuji.RAFVersion, "0100")) + wb_section_offset = 0x138c; + else if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x138c)) + wb_section_offset = 0x138c; + } + else if (!strcmp(model, "X-S1")) // X-S1 0 0x1284 + { + if (!strcmp(imFuji.RAFVersion, "0100")) + wb_section_offset = 0x1284; + else if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x1284)) + wb_section_offset = 0x1284; + } + else if (!strcmp(model, "X10")) // X10 0 0x1280 0x12d4 + { + if (!strcmp(imFuji.RAFVersion, "0100") || + !strcmp(imFuji.RAFVersion, "0102")) + wb_section_offset = 0x1280; + else if (!strcmp(imFuji.RAFVersion, "0103")) + wb_section_offset = 0x12d4; + else if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x1280)) + wb_section_offset = 0x1280; + else if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x12d4)) + wb_section_offset = 0x12d4; + } + else if (!strcmp(model, "XF1")) // XF1 0 0x138c + { + if (!strcmp(imFuji.RAFVersion, "0100")) + wb_section_offset = 0x138c; + else if (PrivateMknBuf.isWB(posPrivateMknBuf + 0x138c)) + wb_section_offset = 0x138c; + } + + if (wb_section_offset && PrivateMknBuf.isWB(posPrivateMknBuf + wb_section_offset)) + { + + if (!imFuji.RAFDataVersion) + { + posWB = posPrivateMknBuf + wb_section_offset - 6; + icWBC[LIBRAW_WBI_Auto][1] = icWBC[LIBRAW_WBI_Auto][3] = PrivateMknBuf.sget2(posWB); + icWBC[LIBRAW_WBI_Auto][0] = PrivateMknBuf.sget2(posWB + 2); + icWBC[LIBRAW_WBI_Auto][2] = PrivateMknBuf.sget2(posWB + 4); + } + + posWB = posPrivateMknBuf + wb_section_offset; + for (int wb_ind = 0; wb_ind < (int)Fuji_wb_list1.size(); posWB += 6, wb_ind++) + { + icWBC[Fuji_wb_list1[wb_ind]][1] = icWBC[Fuji_wb_list1[wb_ind]][3] = PrivateMknBuf.sget2(posWB); + icWBC[Fuji_wb_list1[wb_ind]][0] = PrivateMknBuf.sget2(posWB + 2); + icWBC[Fuji_wb_list1[wb_ind]][2] = PrivateMknBuf.sget2(posWB + 4); + } + int found = 0; + if (is34) + posWB += 0x30; + posWB += 0xc0; + ushort Gval = PrivateMknBuf.sget2(posWB); + for (int posEndCCTsection = posWB; posEndCCTsection < (posWB + 30); + posEndCCTsection += 6) + { + if (PrivateMknBuf.sget2(posEndCCTsection) != Gval) + { + if (is34) + wb_section_offset = posEndCCTsection - 34*3*2; // 34 records, 3 2-byte values in a record + else + wb_section_offset = posEndCCTsection - 31*3*2; // 31 records, 3 2-byte values in a record + found = 1; + break; + } + } + + if (found) + { + for (int iCCT = 0; iCCT < 31; iCCT++) + { + icWBCCTC[iCCT][0] = FujiCCT_K[iCCT]; + icWBCCTC[iCCT][1] = PrivateMknBuf.sget2(wb_section_offset + iCCT * 6 + 2); + icWBCCTC[iCCT][2] = icWBCCTC[iCCT][4] = PrivateMknBuf.sget2(wb_section_offset + iCCT * 6); + icWBCCTC[iCCT][3] = PrivateMknBuf.sget2(wb_section_offset + iCCT * 6 + 4); + } + } + } + } + else // process 4K raf data + { + int wb[4]; + int nWB, tWB, pWB; + int iCCT = 0; + imFuji.RAFDataGeneration = 4096; // X-A3, X-A5, X-A7, X-A10, X-A20, X-T100, X-T200, XF10 + posWB = posPrivateMknBuf + 0x200; + for (int wb_ind = 0; wb_ind < 42; wb_ind++) + { + nWB = PrivateMknBuf.sget4(posWB); + posWB += 4; + tWB = PrivateMknBuf.sget4(posWB); + posWB += 4; + wb[0] = PrivateMknBuf.sget4(posWB) << 1; + posWB += 4; + wb[1] = PrivateMknBuf.sget4(posWB); + posWB += 4; + wb[3] = PrivateMknBuf.sget4(posWB); + posWB += 4; + wb[2] = PrivateMknBuf.sget4(posWB) << 1; + posWB += 4; + + if (tWB && (iCCT < 255)) + { + icWBCCTC[iCCT][0] = tWB; + FORC4 icWBCCTC[iCCT][c + 1] = wb[c]; + iCCT++; + } + if (nWB != 0x46) + { + for (pWB = 1; pWB < (int)Fuji_wb_list2.size(); pWB += 2) + { + if (Fuji_wb_list2[pWB] == nWB) + { + FORC4 icWBC[Fuji_wb_list2[pWB - 1]][c] = wb[c]; + break; + } + } + } + } + } + } + posPrivateMknBuf += PrivateTagBytes; + } + } +#undef get_average_WB +} + +void LibRaw::parseFujiMakernotes(unsigned tag, unsigned type, unsigned len, + unsigned /*dng_writer*/) +{ + if (tag == 0x0010) + { + char FujiSerial[sizeof(imgdata.shootinginfo.InternalBodySerial)]; + char *words[4] = { 0,0,0,0 }; + char yy[2], mm[3], dd[3], ystr[16], ynum[16]; + int year, nwords, ynum_len; + unsigned c; + memset(FujiSerial, 0, sizeof(imgdata.shootinginfo.InternalBodySerial)); + ifp->read(FujiSerial, MIN(len,sizeof(FujiSerial)), 1); + nwords = getwords(FujiSerial, words, 4, + sizeof(imgdata.shootinginfo.InternalBodySerial)); + for (int i = 0; i < nwords; i++) + { + if (!words[i]) break; // probably damaged input + mm[2] = dd[2] = 0; + if (strnlen(words[i], + sizeof(imgdata.shootinginfo.InternalBodySerial) - 1) < 18) + { + if (i == 0) + { + strncpy(imgdata.shootinginfo.InternalBodySerial, words[0], + sizeof(imgdata.shootinginfo.InternalBodySerial) - 1); + } + else + { + char tbuf[sizeof(imgdata.shootinginfo.InternalBodySerial)]; + snprintf(tbuf, sizeof(tbuf)-1, "%s %s", + imgdata.shootinginfo.InternalBodySerial, words[i]); + strncpy(imgdata.shootinginfo.InternalBodySerial, tbuf, + sizeof(imgdata.shootinginfo.InternalBodySerial) - 1); + } + } + else + { + strncpy( + dd, + words[i] + + strnlen(words[i], + sizeof(imgdata.shootinginfo.InternalBodySerial) - 1) - + 14, + 2); + strncpy( + mm, + words[i] + + strnlen(words[i], + sizeof(imgdata.shootinginfo.InternalBodySerial) - 1) - + 16, + 2); + strncpy( + yy, + words[i] + + strnlen(words[i], + sizeof(imgdata.shootinginfo.InternalBodySerial) - 1) - + 18, + 2); + year = (yy[0] - '0') * 10 + (yy[1] - '0'); + if (year < 70) + year += 2000; + else + year += 1900; + + ynum_len = MIN( + int(sizeof(ynum) - 1), + (int)strnlen(words[i], + sizeof(imgdata.shootinginfo.InternalBodySerial) - 1) - + 18); + strncpy(ynum, words[i], ynum_len); + ynum[ynum_len] = 0; + for (int j = 0; ynum[j] && ynum[j + 1] && sscanf(ynum + j, "%2x", &c); + j += 2) + ystr[j / 2] = c; + ynum_len /= 2; + ystr[ynum_len + 1] = 0; + strcpy(model2, ystr); + + if (i == 0) + { + char tbuf[sizeof(imgdata.shootinginfo.InternalBodySerial)]; + + if (nwords == 1) + { + snprintf( + tbuf, sizeof(tbuf), "%s %d:%s:%s %s", + ystr, year, mm, dd, + words[0] + + strnlen(words[0], sizeof(imgdata.shootinginfo.InternalBodySerial)-1)-12); + } + else + { + snprintf( + tbuf, sizeof(tbuf), "%s %d:%s:%s %s", ystr, year, mm, dd, + words[0] + + strnlen(words[0], + sizeof(imgdata.shootinginfo.InternalBodySerial) - + 1) - + 12); + } + strncpy(imgdata.shootinginfo.InternalBodySerial, tbuf, + sizeof(imgdata.shootinginfo.InternalBodySerial) - 1); + } + else + { + char tbuf[sizeof(imgdata.shootinginfo.InternalBodySerial)]; + snprintf( + tbuf, sizeof(tbuf), "%s %s %d:%s:%s %s", + imgdata.shootinginfo.InternalBodySerial, ystr, year, mm, dd, + words[i] + + strnlen(words[i], + sizeof(imgdata.shootinginfo.InternalBodySerial) - 1) - + 12); + strncpy(imgdata.shootinginfo.InternalBodySerial, tbuf, + sizeof(imgdata.shootinginfo.InternalBodySerial) - 1); + } + } + } + } + else + switch (tag) + { + case 0x1002: + imFuji.WB_Preset = get2(); + break; + case 0x1011: + imCommon.FlashEC = getreal(type); + break; + case 0x1020: + imFuji.Macro = get2(); + break; + case 0x1021: + imFuji.FocusMode = imgdata.shootinginfo.FocusMode = get2(); + break; + case 0x1022: + imFuji.AFMode = get2(); + break; + case 0x1023: + imFuji.FocusPixel[0] = get2(); + imFuji.FocusPixel[1] = get2(); + break; + case 0x102b: + imFuji.PrioritySettings = get2(); + break; + case 0x102d: + imFuji.FocusSettings = get4(); + break; + case 0x102e: + imFuji.AF_C_Settings = get4(); + break; + case 0x1034: + imFuji.ExrMode = get2(); + break; + case 0x104d: + FujiCropMode = get2(); // odd: one of raw dimensions here can be lost + break; + case 0x1050: + imFuji.ShutterType = get2(); + break; + case 0x1100: + imFuji.AutoBracketing = get2(); // AutoBracketing = 6 for pixel shift mode + break; + case 0x1101: + imFuji.SequenceNumber = get2(); + break; + case 0x1103: + imgdata.shootinginfo.DriveMode = get2(); + imFuji.DriveMode = imgdata.shootinginfo.DriveMode & 0xff; + break; + case 0x1105: + imFuji.SeriesLength = get2(); + break; + case 0x1106: + imFuji.PixelShiftOffset[0] = getreal(type); + imFuji.PixelShiftOffset[1] = getreal(type); + break; + case 0x1301: + imFuji.FocusWarning = get2(); + break; + case 0x1400: + imFuji.DynamicRange = get2(); + break; + case 0x1401: + imFuji.FilmMode = get2(); + break; + case 0x1402: + imFuji.DynamicRangeSetting = get2(); + break; + case 0x1403: + imFuji.DevelopmentDynamicRange = get2(); + break; + case 0x1404: + ilm.MinFocal = getreal(type); + break; + case 0x1405: + ilm.MaxFocal = getreal(type); + break; + case 0x1406: + ilm.MaxAp4MinFocal = getreal(type); + break; + case 0x1407: + ilm.MaxAp4MaxFocal = getreal(type); + break; + case 0x140b: + imFuji.AutoDynamicRange = get2(); + break; + case 0x1422: + imFuji.ImageStabilization[0] = get2(); + imFuji.ImageStabilization[1] = get2(); + imFuji.ImageStabilization[2] = get2(); + imgdata.shootinginfo.ImageStabilization = + (imFuji.ImageStabilization[0] << 9) + imFuji.ImageStabilization[1]; + break; + case 0x1438: + imFuji.ImageCount = get2(); + break; + case 0x1431: + imFuji.Rating = get4(); + break; + case 0x1443: + imFuji.DRangePriority = get2(); + break; + case 0x1444: + imFuji.DRangePriorityAuto = get2(); + break; + case 0x1445: + imFuji.DRangePriorityFixed = get2(); + break; + case 0x1447: + stmread(imFuji.FujiModel, len, ifp); + break; + case 0x1448: + stmread(imFuji.FujiModel2, len, ifp); + break; + } + return; +} + +void LibRaw::parse_fuji_thumbnail(int offset) +{ + uchar xmpmarker[] = "http://ns.adobe.com/xap/1.0/"; + uchar buf[sizeof(xmpmarker)+1]; + int xmpsz = sizeof(xmpmarker); // we do not + + INT64 pos = ftell(ifp); + fseek(ifp, offset, SEEK_SET); + ushort s_order = order; + order = 0x4a4a; // JPEG is always in MM order + + if (get2() == 0xFFD8) + { + while (1) + { + ushort tag = get2(); + if (tag != 0xFFE1 && tag != 0xFFE2) // allow APP1/APP2 only + break; + INT64 tpos = ftell(ifp); + int len = get2(); + if (len > xmpsz + 2) + { + if ((fread(buf, 1, xmpsz, ifp) == xmpsz) && !memcmp(buf, xmpmarker, xmpsz)) // got it + { + xmplen = len - xmpsz - 2; + xmpdata = (char*) malloc(xmplen+1); + fread(xmpdata, 1, xmplen, ifp); + xmpdata[xmplen] = 0; + break; + } + } + fseek(ifp, tpos + len, SEEK_SET); + } + } + + order = s_order; + fseek(ifp, pos, SEEK_SET); +} + +void LibRaw::parse_fuji(int offset) +{ + unsigned entries, tag, len, save, c; + +#define get_average_WB(wb_index) \ + FORC4 icWBC[wb_index][GRGB_2_RGBG(c)] = get2(); \ + if ((len == 16) && average_WBData) { \ + FORC4 icWBC[wb_index][GRGB_2_RGBG(c)] = \ + (icWBC[wb_index][GRGB_2_RGBG(c)] + get2())/2; \ + } \ + if (use_WBcorr_coeffs) { \ + icWBC[wb_index][0] *= wbR_corr; \ + icWBC[wb_index][2] *= wbB_corr; \ + } + + ushort raw_inset_present = 0; + ushort use_WBcorr_coeffs = 0; + double wbR_corr = 1.0; + double wbB_corr = 1.0; + ilm.CamID = unique_id; + int average_WBData = 1; + + fseek(ifp, offset, SEEK_SET); + entries = get4(); + if (entries > 255) + return; + imgdata.process_warnings |= LIBRAW_WARN_PARSEFUJI_PROCESSED; + + if (strstr(model, "S2Pro") + || strstr(model, "S20Pro") + || strstr(model, "F700") + || strstr(model, "S5000") + || strstr(model, "S7000") + ) { + use_WBcorr_coeffs = 1; + wbR_corr = 10.0 / 17.0 / 0.652941; + wbB_corr = 2.0 /3.0 / (3.0 / 4.0 + 1.0 / 300.0); + } else if (strstr(model, "DBP") || strstr(model, "DX-2000")) { + use_WBcorr_coeffs = 1; + wbR_corr = 0.7632653061; + wbB_corr = 0.8591549296; + } + + while (entries--) + { + tag = get2(); + len = get2(); + save = ftell(ifp); + if (tag == 0x0100) // RawImageFullSize + { + raw_height = get2(); + raw_width = get2(); + raw_inset_present = 1; + } + else if ((tag == 0x0110) && raw_inset_present) // RawImageCropTopLeft + { + imgdata.sizes.raw_inset_crops[0].ctop = get2(); + imgdata.sizes.raw_inset_crops[0].cleft = get2(); + } + else if ((tag == 0x0111) && raw_inset_present) // RawImageCroppedSize + { + imgdata.sizes.raw_inset_crops[0].cheight = get2(); + imgdata.sizes.raw_inset_crops[0].cwidth = get2(); + } + else if ((tag == 0x0115) && raw_inset_present) // RawImageAspectRatio + { + int a = get2(); + int b = get2(); + if (a * b == 6) + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_3to2; + else if (a * b == 12) + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_4to3; + else if (a * b == 144) + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_16to9; + else if (a * b == 1) + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_1to1; + } + else if (tag == 0x0121) // RawImageSize + { + height = get2(); + if ((width = get2()) == 4284) + width += 3; + } + else if (tag == 0x0130) // FujiLayout, + { + fuji_layout = fgetc(ifp) >> 7; + fuji_width = !(fgetc(ifp) & 8); + } + else if (tag == 0x0131) // XTransLayout + { + filters = 9; + char *xtrans_abs_alias = &xtrans_abs[0][0]; + FORC(36) + { + int q = fgetc(ifp); + xtrans_abs_alias[35 - c] = MAX(0, MIN(q, 2)); /* & 3;*/ + } + } + else if (tag == 0x2ff0) // WB_GRGBLevels + { + get_average_WB(LIBRAW_WBI_AsShot); + FORC4 cam_mul[c] = icWBC[LIBRAW_WBI_AsShot][c]; + } + else if ((tag == 0x4000) && + ((len == 8) || (len == 16))) + { + imFuji.BlackLevel[0] = len / 2; + FORC4 imFuji.BlackLevel[GRGB_2_RGBG(c)+1] = get2(); + if (imFuji.BlackLevel[0] == 8) + FORC4 imFuji.BlackLevel[GRGB_2_RGBG(c)+5] = get2(); + if (imFuji.BlackLevel[0] == 4) + FORC4 cblack[c] = imFuji.BlackLevel[c+1]; + else if (imFuji.BlackLevel[0] == 8) + FORC4 cblack[c] = (imFuji.BlackLevel[c+1]+imFuji.BlackLevel[c+5]) /2; + } + else if (tag == 0x9200) // RelativeExposure + { + int s1 = get2(); + int s2 = get2(); + if ((s1 == s2) || !s1) + imFuji.BrightnessCompensation = 0.0f; + else if ((s1*4) == s2) + imFuji.BrightnessCompensation = 2.0f; + else if ((s1*16) == s2) + imFuji.BrightnessCompensation = 4.0f; + else + imFuji.BrightnessCompensation = log(double(s2)/double(s1))/log(2.0); + } + else if (tag == 0x9650) // RawExposureBias + { + short a = (short)get2(); + float b = fMAX(1.0f, get2()); + imFuji.ExpoMidPointShift = a / b; + imCommon.ExposureCalibrationShift += imFuji.ExpoMidPointShift; + } + if (tag >= 0x2000 && tag <= 0x2410) + { + for (int q = 0; q < tag2wbtable_size; q++) + if (tag2wbtable[q].tag == tag) + { + get_average_WB(tag2wbtable[q].wb); + break; + } + } + else if (tag == 0x2f00) // WB_GRGBLevels + { + int nWBs = get4(); + nWBs = MIN(nWBs, 6); + for (int wb_ind = LIBRAW_WBI_Custom1; wb_ind < LIBRAW_WBI_Custom1+nWBs; wb_ind++) { + FORC4 icWBC[wb_ind][GRGB_2_RGBG(c)] = get2(); + if ((len >= unsigned(4+16*nWBs)) && average_WBData) { + FORC4 icWBC[wb_ind][GRGB_2_RGBG(c)] = + (icWBC[wb_ind][GRGB_2_RGBG(c)] +get2()) /2; + } + if (use_WBcorr_coeffs) { + icWBC[LIBRAW_WBI_Custom1 + wb_ind][0] *= wbR_corr; + icWBC[LIBRAW_WBI_Custom1 + wb_ind][2] *= wbB_corr; + } + } + } + + else if (tag == 0xc000) // RAFData + { + int offsetWH_inRAFData; + unsigned save_order = order; + order = 0x4949; + if (len > 20000) + { + uchar RAFDataHeader[16]; + libraw_internal_data.unpacker_data.posRAFData = save; + libraw_internal_data.unpacker_data.lenRAFData = (len >> 1); + fread(RAFDataHeader, sizeof RAFDataHeader, 1, ifp); + offsetWH_inRAFData = guess_RAFDataGeneration(RAFDataHeader); + fseek(ifp, offsetWH_inRAFData-int(sizeof RAFDataHeader), SEEK_CUR); + for (int i=0; + i< (int)((sizeof imFuji.RAFData_ImageSizeTable) / (sizeof imFuji.RAFData_ImageSizeTable[0])); + i++) { + imFuji.RAFData_ImageSizeTable[i] = get4(); + } + +// if ((width > raw_width) +// || (raw_inset_present && (width < imgdata.sizes.raw_inset_crops[0].cwidth)) +// ) +// width = raw_width; +// if ((height > raw_height) +// || (raw_inset_present && (height < imgdata.sizes.raw_inset_crops[0].cheight)) +// ) +// height = raw_height; +// + + } + else if (len == 4096) // X-A3, X-A5, X-A7, X-A10, X-A20, X-T100, X-T200, XF10 + { // Ill.A aligned to CCT 2850 + int wb[4]; + int nWB, tWB; + int iCCT = 0; + imFuji.RAFDataGeneration = 4096; + fseek(ifp, save + 0x200, SEEK_SET); + for (int wb_ind = 0; wb_ind < 42; wb_ind++) + { + nWB = get4(); + tWB = get4(); + wb[0] = get4() << 1; + wb[1] = get4(); + wb[3] = get4(); + wb[2] = get4() << 1; + if (tWB && (iCCT < 255)) + { + icWBCCTC[iCCT][0] = tWB; + FORC4 icWBCCTC[iCCT][c + 1] = wb[c]; + iCCT++; + } + if (nWB != 70) + { + for (int pWB = 1; pWB < (int)Fuji_wb_list2.size(); pWB += 2) + { + if (Fuji_wb_list2[pWB] == nWB) + { + FORC4 icWBC[Fuji_wb_list2[pWB - 1]][c] = wb[c]; + break; + } + } + } + } + } + order = save_order; + } + fseek(ifp, save + len, SEEK_SET); + } + + if (!imFuji.RAFDataGeneration) { + height <<= fuji_layout; + width >>= fuji_layout; + } +#undef get_average_WB +} + diff --git a/rtengine/libraw/src/metadata/hasselblad_model.cpp b/rtengine/libraw/src/metadata/hasselblad_model.cpp new file mode 100644 index 000000000..a8c919c70 --- /dev/null +++ b/rtengine/libraw/src/metadata/hasselblad_model.cpp @@ -0,0 +1,651 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" +#include "../../internal/libraw_cameraids.h" + + static const struct { + const int idx; + const char *FormatName; + } HassyRawFormat[] = { + { LIBRAW_HF_Unknown, "Unknown"}, + { LIBRAW_HF_3FR, "-3FR"}, + { LIBRAW_HF_FFF, "-FFF"}, + { LIBRAW_HF_Imacon, "Imacon"}, + { LIBRAW_HF_HasselbladDNG, "hDNG"}, + { LIBRAW_HF_AdobeDNG, "aDNG"}, + { LIBRAW_HF_AdobeDNG_fromPhocusDNG, "a(hDNG)"}, + }; + +const char* LibRaw::HassyRawFormat_idx2HR(unsigned idx) // HR means "human-readable" +{ + for (int i = 0; i < int(sizeof HassyRawFormat / sizeof *HassyRawFormat); i++) + if((unsigned)HassyRawFormat[i].idx == idx) + return HassyRawFormat[i].FormatName; + return 0; +} + +void LibRaw::process_Hassy_Lens (int LensMount) { +// long long unsigned id = +// mount*100000000ULL + series*10000000ULL + +// focal1*10000ULL + focal2*10 + version; + char *ps; + int c; + char *q = strchr(imgdata.lens.Lens, ' '); + if (!q) + return; + c = atoi(q +1); + if (!c) + return; + + if (LensMount == LIBRAW_MOUNT_Hasselblad_H) { + if (imgdata.lens.Lens[2] == ' ') // HC lens + ilm.LensID = LensMount*100000000ULL + 10000000ULL; + else // HCD lens + ilm.LensID = LensMount*100000000ULL + 20000000ULL; + ilm.LensFormat = LIBRAW_FORMAT_645; + } else if (LensMount == LIBRAW_MOUNT_Hasselblad_XCD) { + ilm.LensFormat = LIBRAW_FORMAT_CROP645; + ilm.LensID = LensMount*100000000ULL; + } else + return; + + ilm.LensMount = LensMount; + ilm.LensID += c*10000ULL; + if ((ps=strchr(imgdata.lens.Lens, '-'))) { + ilm.FocalType = LIBRAW_FT_ZOOM_LENS; + ilm.LensID += atoi(ps+1)*10ULL; + } else { + ilm.FocalType = LIBRAW_FT_PRIME_LENS; + ilm.LensID += c*10ULL; + } + if (strstr(imgdata.lens.Lens, "III")) + ilm.LensID += 3ULL; + else if (strstr(imgdata.lens.Lens, "II")) + ilm.LensID += 2ULL; +} + +void LibRaw::parseHassyModel() { + +static const char *Hasselblad_Ctrl[] = { // manually selectable options only + "ELD", "ELX", "Winder CW", "CW", "Pinhole", "Flash Sync", + "SWC", "200 (Mod)", "200", "500 Mech.", "500", "H Series", + "H-Series", "H1", "H2", "Black Box", "LENSCONTROL S", "LENSCTRL S", "Generic", +}; + +static const char *Hasselblad_SensorEnclosures[] = { + "CFH", "CFV", "CFV", "CFII", "CF", "Ixpress", +}; + + char tmp_model[64]; + const char *ps; + char *eos; + int c; + int nPix = raw_width*raw_height; + int add_MP_toName = 1; + int norm_model_isSet = 0; + + if (model[0] == ' ') + memmove(model, model+1, MIN(sizeof(model)-1,strlen(model))); + + imHassy.HostBody[0] = 0; + if ((ps = strrchr(model, '/'))) + strcpy(imHassy.HostBody, ps+1); + else if ((ps = strrchr(imgdata.color.LocalizedCameraModel, '/'))) + strcpy(imHassy.HostBody, ps+1); + else if ((ps = strrchr(imgdata.color.UniqueCameraModel, '/'))) + strcpy(imHassy.HostBody, ps+1); + else if ((ps = strrchr(imHassy.SensorUnitConnector, '/'))) + strcpy(imHassy.HostBody, ps+1); + if (imHassy.HostBody[0]) { + if ((eos = strrchr(imHassy.HostBody, '-'))) + *eos = 0; + } + + if (!imHassy.format) { + if (dng_version) { + if (!strncmp(software, "Adobe", 5)) { + if (!imgdata.color.OriginalRawFileName[0] || + !imgdata.color.LocalizedCameraModel[0] || + !strcasestr(imgdata.color.UniqueCameraModel, "coated")) + imHassy.format = LIBRAW_HF_AdobeDNG_fromPhocusDNG; + else + imHassy.format = LIBRAW_HF_AdobeDNG; + } else imHassy.format = LIBRAW_HF_HasselbladDNG; + } else if ((imHassy.nIFD_CM[0] != -1) && + (imHassy.nIFD_CM[1] == -1) && + !imHassy.mnColorMatrix[0][0]) { + imHassy.format = LIBRAW_HF_3FR; + } else imHassy.format = LIBRAW_HF_FFF; + } + + if (imHassy.SensorUnitConnector[0]) { + char buf[64]; + if (!strncmp(imHassy.SensorUnitConnector, "Hasselblad ", 11)) + memmove(imHassy.SensorUnitConnector, imHassy.SensorUnitConnector+11, 64-11); + strcpy(buf, imHassy.SensorUnitConnector); + if ((eos = strrchr(buf, '/'))) { + *eos = 0; + if ((eos = strrchr(buf, ' '))) { + *eos = 0; + strcpy (imHassy.SensorUnitConnector, buf); + } + } + } + + if (imHassy.format == LIBRAW_HF_AdobeDNG) { // Adobe DNG, use LocalizedCameraModel + imgdata.color.LocalizedCameraModel[63] = 0; // make sure it's 0-terminated + if ((ps = strrchr(imgdata.color.LocalizedCameraModel, '-'))) + c = ps-imgdata.color.LocalizedCameraModel; + else c = int(strlen(imgdata.color.LocalizedCameraModel)); + int cc = MIN(c, (int)sizeof(tmp_model)-1); + memcpy(tmp_model, imgdata.color.LocalizedCameraModel,cc); + tmp_model[cc] = 0; + if (strcasestr(imgdata.color.UniqueCameraModel, "coated")) { + strncpy(normalized_model, imgdata.color.UniqueCameraModel,sizeof(imgdata.color.UniqueCameraModel)-1); + normalized_model[sizeof(imgdata.color.UniqueCameraModel) - 1] = 0; + norm_model_isSet = 1; + } + if (!strncmp(normalized_model, "Hasselblad ", 11)) + memmove(normalized_model, normalized_model+11, 64-11); + } else { + if ((ps = strrchr(imgdata.color.UniqueCameraModel, '/'))) { + c = ps-imgdata.color.UniqueCameraModel; + } + else c = int(strlen(imgdata.color.UniqueCameraModel)); + int cc = MIN(c, (int)sizeof(tmp_model)-1); + memcpy(tmp_model, imgdata.color.UniqueCameraModel,cc); + tmp_model[cc] = 0; + } + if (!strncasecmp(tmp_model, "Hasselblad ", 11)) + memmove(tmp_model, tmp_model+11, 64-11); + + strncpy(imHassy.CaptureSequenceInitiator, model,31); + imHassy.CaptureSequenceInitiator[31] = 0; + if ((eos = strrchr(imHassy.CaptureSequenceInitiator, '/'))) { + *eos = 0; + } +// check if model tag contains manual CaptureSequenceInitiator info: + FORC(int(sizeof Hasselblad_Ctrl / sizeof *Hasselblad_Ctrl)) { + if (strcasestr(model, Hasselblad_Ctrl[c])) { +// yes, fill 'model' with sensor unit data + strncpy(model, tmp_model,63); + model[63] = 0; + break; + } + } + + if (!imHassy.HostBody[0]) { + ps = strchr(model, '-'); + if (ps) { // check if model contains both host body and sensor version, resolution, MS info + strncpy(imHassy.SensorUnit, model,63); + memcpy(imHassy.HostBody, model, ps-model); + imHassy.HostBody[ps-model] = 0; + if (!strncmp(ps-2, "II-", 3)) + ps -=2; + strncpy(imHassy.Sensor, ps,7); + imHassy.Sensor[7] = 0; + add_MP_toName = 0; + } else { // model contains host body only + strncpy(imHassy.HostBody, model,63); + imHassy.HostBody[63] = 0; + // fill 'model' with sensor unit data + strncpy(model, tmp_model,63); + model[63] = 0; + } + } + + if (strstr(model, "503CWD")) { + strncpy(imHassy.HostBody, model,63); + imHassy.HostBody[63] = 0; + ilm.CameraFormat = LIBRAW_FORMAT_66; + ilm.CameraMount = LIBRAW_MOUNT_Hasselblad_V; + if (model[6] == 'I' && model[7] == 'I') + strcpy(model, "CFVII"); + else strcpy(model, "CFV"); + } else if (strstr(model, "Hasselblad") && + (model[10] != ' ')) { + strcpy(model, "CFV"); + ilm.CameraMount = LIBRAW_MOUNT_DigitalBack; + } else { + FORC(int(sizeof Hasselblad_SensorEnclosures / sizeof *Hasselblad_SensorEnclosures)) { + if (strcasestr(model, Hasselblad_SensorEnclosures[c])) { + if (add_MP_toName) strcpy(model, Hasselblad_SensorEnclosures[c]); + ilm.CameraMount = LIBRAW_MOUNT_DigitalBack; + break; + } + } + } + +#define cpynorm(str) \ + if (!norm_model_isSet) { \ + strcpy(normalized_model, str); \ + norm_model_isSet = 1; \ + } + + if ((imHassy.SensorCode == 4) && + (imHassy.CoatingCode < 2)) { + strcpy(imHassy.Sensor, "-16"); + cpynorm("16-Uncoated"); + + } else if ((imHassy.SensorCode == 6) && + (imHassy.CoatingCode < 2)) { + strcpy(imHassy.Sensor, "-22"); + cpynorm("22-Uncoated"); + + } else if ((imHassy.SensorCode == 8) && + (imHassy.CoatingCode == 1)) { + strcpy(imHassy.Sensor, "-31"); + cpynorm("31-Uncoated"); + + } else if ((imHassy.SensorCode == 9) && + (imHassy.CoatingCode < 2)) { + strcpy(imHassy.Sensor, "-39"); + cpynorm("39-Uncoated"); + + } else if ((imHassy.SensorCode == 9) && + (imHassy.CoatingCode == 4)) { + strcpy(imHassy.Sensor, "-39"); + strcpy(model, "H3DII"); + add_MP_toName = 1; + cpynorm("39-Coated"); + + } else if ((imHassy.SensorCode == 13) && + (imHassy.CoatingCode == 4)) { + strcpy(imHassy.Sensor, "-40"); + cpynorm("40-Coated"); + + } else if ((imHassy.SensorCode == 13) && + (imHassy.CoatingCode == 5)) { + strcpy(imHassy.Sensor, "-40"); + cpynorm("40-Coated5"); + + } else if ((imHassy.SensorCode == 11) && + (imHassy.CoatingCode == 4)) { + if (!strncmp(model, "H3D", 3)) + strcpy(model, "H3DII-50"); + else strcpy(imHassy.Sensor, "-50"); + cpynorm("50-Coated"); + + } else if ((imHassy.SensorCode == 11) && + (imHassy.CoatingCode == 5)) { + strcpy(imHassy.Sensor, "-50"); + cpynorm("50-Coated5"); + + } else if ((imHassy.SensorCode == 15) && + (imHassy.CoatingCode == 5)) { + strcpy(imHassy.Sensor, "-50c"); + cpynorm("50-15-Coated5"); + if (!strncmp(imHassy.CaptureSequenceInitiator, "CFV II 50C", 10)) { + imHassy.SensorSubCode = 2; + add_MP_toName = 0; + strcat(imHassy.Sensor, " II"); + strcpy(model, "CFV II 50C"); + strcat(normalized_model, "-II"); + } else if (!strncmp(imHassy.CaptureSequenceInitiator, "X1D", 3)) { + imHassy.SensorSubCode = 2; + add_MP_toName = 0; + strcat(imHassy.Sensor, " II"); + if (!strncasecmp(imHassy.CaptureSequenceInitiator, "X1D II 50C", 10)) { + strcpy(model, "X1D II 50C"); + strcat(normalized_model, "-II"); + } else { + strcpy(model, "X1D-50c"); + } + } + + } else if ((imHassy.SensorCode == 12) && + (imHassy.CoatingCode == 4)) { + strcpy(imHassy.Sensor, "-60"); + cpynorm("60-Coated"); + + } else if ((imHassy.SensorCode == 17) && + (imHassy.CoatingCode == 5)) { + strcpy(imHassy.Sensor, "-100c"); + cpynorm("100-17-Coated5"); + + } else if ((imHassy.SensorCode == 20) && + (imHassy.CoatingCode == 6)) { + strcpy(imHassy.Sensor, "-100c"); + cpynorm("100-20-Coated6"); + + } else if ((raw_width == 4090) || // V96C + ((raw_width == 4096) && (raw_height == 4096)) || + ((raw_width == 4088) && (raw_height == 4088)) || // Adobe crop + ((raw_width == 4080) && (raw_height == 4080))) { // Phocus crop + strcpy(imHassy.Sensor, "-16"); + cpynorm("16-Uncoated"); + if (!imHassy.SensorCode) imHassy.SensorCode = 4; + + } else if ((raw_width == 5568) && (raw_height == 3648)) { + strcpy(imHassy.Sensor, "-20c"); + + } else if (((raw_width == 4096) && (raw_height == 5456)) || + ((raw_width == 4088) && (raw_height == 5448)) || // Adobe crop + ((raw_width == 4080) && (raw_height == 5440))) { // Phocus crop + strcpy(imHassy.Sensor, "-22"); + cpynorm("22-Uncoated"); + if (!imHassy.SensorCode) imHassy.SensorCode = 6; + + } else if (((raw_width == 6542) && (raw_height == 4916)) || + ((raw_width == 6504) && (raw_height == 4880)) || // Adobe crop + ((raw_width == 6496) && (raw_height == 4872))) { // Phocus crop + strcpy(imHassy.Sensor, "-31"); + cpynorm("31-Uncoated"); + if (!imHassy.SensorCode) imHassy.SensorCode = 8; + + } else if (((raw_width == 7262) && (raw_height == 5456)) || // + ((raw_width == 7224) && (raw_height == 5420)) || // Adobe crop + ((raw_width == 7216) && (raw_height == 5412)) || // Phocus crop + ((raw_width == 7212) && (raw_height == 5412)) || // CF-39, CFV-39, possibly v.II; Phocus crop +// uncropped, when the exact size is unknown, should be: +// - greater or equal to the smallest Phocus crop for the current size +// - smaller than the smallest Phocus crop for the next size + ((nPix >= 7212*5412) && (nPix < 7304*5478))) { + strcpy(imHassy.Sensor, "-39"); + if (!imHassy.SensorCode) imHassy.SensorCode = 9; + if (!strncmp(model, "H3D", 3)) { + if (((imHassy.format == LIBRAW_HF_Imacon) || + strstr(imgdata.color.UniqueCameraModel, "H3D-39") || + strstr(imgdata.color.LocalizedCameraModel, "H3D-39") || + strstr(model, "H3D-39")) && + !strstr(imgdata.color.UniqueCameraModel, "II") && + !strstr(imgdata.color.LocalizedCameraModel, "II") && + !strstr(model, "II")) { + strcpy(model, "H3D-39"); + add_MP_toName = 0; + cpynorm("39-Uncoated"); + + } else { + strcpy(model, "H3DII-39"); + add_MP_toName = 0; + cpynorm("39-Coated"); + if (!imHassy.CoatingCode) imHassy.CoatingCode = 4; + } + + } else + cpynorm("39-Uncoated"); + + } else if (((raw_width == 7410) && (raw_height == 5586)) || // (H4D-40, H5D-40) + ((raw_width == 7312) && (raw_height == 5486)) || // Adobe crop + ((raw_width == 7304) && (raw_height == 5478))) { // Phocus crop + strcpy(imHassy.Sensor, "-40"); + if (!strncmp(model, "H4D", 3)) { + cpynorm("40-Coated"); + if (!imHassy.SensorCode) imHassy.SensorCode = 13; + if (!imHassy.CoatingCode) imHassy.CoatingCode = 4; + } else { + cpynorm("40-Coated5"); + if (!imHassy.SensorCode) imHassy.SensorCode = 13; + if (!imHassy.CoatingCode) imHassy.CoatingCode = 5; + } + + } else if (((raw_width == 8282) && (raw_height == 6240)) || // (CFV-50, H3DII-50, H5D-50) + ((raw_width == 8184) && (raw_height == 6140)) || // Adobe crop + ((raw_width == 8176) && (raw_height == 6132))) { // Phocus crop + strcpy(imHassy.Sensor, "-50"); + if (!strncmp(model, "H5D", 3)) { + cpynorm("50-Coated5"); + if (!imHassy.SensorCode) imHassy.SensorCode = 11; + if (!imHassy.CoatingCode) imHassy.CoatingCode = 5; + } else { + cpynorm("50-Coated"); // CFV-50, H3DII-50, + if (!strncmp(model, "H3D", 3)) { + strcpy(model, "H3DII-50"); + if (!imHassy.SensorCode) imHassy.SensorCode = 11; + if (!imHassy.CoatingCode) imHassy.CoatingCode = 4; + add_MP_toName = 0; + } + } + + } else if (((raw_width == 8374) && (raw_height == 6304)) || // (H5D-50c) + ((raw_width == 8384) && (raw_height == 6304)) || // (X1D-50c, "X1D II 50C", "CFV II 50C") + ((raw_width == 8280) && (raw_height == 6208)) || // Adobe crop + ((raw_width == 8272) && (raw_height == 6200))) { // Phocus crop + cpynorm("50-15-Coated5"); + if (!imHassy.SensorCode) imHassy.SensorCode = 15; + if (!imHassy.CoatingCode) imHassy.CoatingCode = 5; + strcpy(imHassy.Sensor, "-50c"); + if ((raw_width == 8384) || + !strncmp(imHassy.CaptureSequenceInitiator, "X1D", 3) || + !strncmp(imHassy.CaptureSequenceInitiator, "CFV II", 6)) { + imHassy.SensorSubCode = 2; + add_MP_toName = 0; + strcat(imHassy.Sensor, " II"); + if (strstr(imHassy.CaptureSequenceInitiator, " II ")) { + strcat(normalized_model, "-II"); + if (!strncasecmp(imHassy.CaptureSequenceInitiator, "X1D II 50C", 10)) { + strcpy(model, "X1D II 50C"); + } else if (!strncasecmp(imHassy.CaptureSequenceInitiator, "CFV II 50C", 10)) { + strcpy(model, "CFV II 50C"); + } + } else { + strcpy(model, "X1D-50c"); + } + } + + } else if (((raw_width == 9044) && (raw_height == 6732)) || + ((raw_width == 8964) && (raw_height == 6716)) || // Adobe crop + ((raw_width == 8956) && (raw_height == 6708))) { // Phocus crop + strcpy(imHassy.Sensor, "-60"); + cpynorm("60-Coated"); + if (!imHassy.SensorCode) imHassy.SensorCode = 12; + if (!imHassy.CoatingCode) imHassy.CoatingCode = 4; + + + } else if (((raw_width == 10320) && (raw_height == 7752)) || // Phocus crop, A5D-80 + ((nPix >= 10320*7752) && (nPix < 10520*8000))) { + strcpy(imHassy.Sensor, "-80"); + cpynorm("80-Coated"); + + } else if (((raw_width == 12000) && (raw_height == 8816)) || + ((raw_width == 11608) && (raw_height == 8708)) || // Adobe crop + ((raw_width == 11600) && (raw_height == 8700))) { // Phocus crop + strcpy(imHassy.Sensor, "-100c"); + cpynorm("100-17-Coated5"); + if (!imHassy.SensorCode) imHassy.SensorCode = 17; + if (!imHassy.CoatingCode) imHassy.CoatingCode = 5; + + } else if (((raw_width == 11904) && (raw_height == 8842)) || // X2D 100C + ((raw_width == 11664) && (raw_height == 8750)) || // Adobe crop + ((raw_width == 11656) && (raw_height == 8742))) { // Phocus crop + strcpy(imHassy.Sensor, "-100c"); + cpynorm("100-20-Coated6"); + if (!imHassy.SensorCode) imHassy.SensorCode = 20; + if (!imHassy.CoatingCode) imHassy.CoatingCode = 6; + + } + + if (raw_width == 4090) + strcpy(model, "V96C"); + + if ( + (raw_width == 4090) || + ((raw_width == 4096) && (raw_height == 4096)) || + ((raw_width == 5568) && (raw_height == 3648)) || + ((raw_width == 4096) && (raw_height == 5456)) || + ((raw_width == 6542) && (raw_height == 4916)) || + ((raw_width == 7262) && (raw_height == 5456)) || + ((raw_width == 7410) && (raw_height == 5586)) || + ((raw_width == 8282) && (raw_height == 6240)) || + ((raw_width == 8374) && (raw_height == 6304)) || + ((raw_width == 8384) && (raw_height == 6304)) || + ((raw_width == 9044) && (raw_height == 6732)) || + ((raw_width == 10320) && (raw_height == 7752)) || + ((raw_width == 12000) && (raw_height == 8816)) || + ((raw_width == 11904) && (raw_height == 8842)) + ) + imHassy.uncropped = 1; + + + if (model[0] && add_MP_toName) + strcat(model, imHassy.Sensor); + if (imHassy.Sensor[0] == '-') + memmove(imHassy.Sensor, imHassy.Sensor+1, strlen(imHassy.Sensor)); + + if (dng_version && + (imHassy.SensorCode == 13) && + (imHassy.CoatingCode == 4)) { + c = LIBRAW_HF_AdobeDNG; + } else if ((imHassy.format == LIBRAW_HF_HasselbladDNG) || + (imHassy.format == LIBRAW_HF_AdobeDNG_fromPhocusDNG)) { + c = LIBRAW_HF_FFF; + } else if (imHassy.format == LIBRAW_HF_Imacon) { + c = LIBRAW_HF_3FR; + } else { + c = imHassy.format; + } + ps = HassyRawFormat_idx2HR(c); + if ((c == LIBRAW_HF_3FR) || + (c == LIBRAW_HF_FFF)) + strcat(normalized_model, ps); + + if (((imHassy.CaptureSequenceInitiator[0] == 'H') && + (imHassy.CaptureSequenceInitiator[1] != 'a')) || + ((imHassy.CaptureSequenceInitiator[0] == 'A') && + isdigit(imHassy.CaptureSequenceInitiator[1]))) { + ilm.CameraFormat = LIBRAW_FORMAT_645; + ilm.CameraMount = LIBRAW_MOUNT_Hasselblad_H; + if (imgdata.lens.Lens[0] == 'H') + process_Hassy_Lens(LIBRAW_MOUNT_Hasselblad_H); + } else if (((imHassy.CaptureSequenceInitiator[0] == 'X') && + isdigit(imHassy.CaptureSequenceInitiator[1])) || + !strncmp(imHassy.HostBody, "907", 3)) { + ilm.CameraFormat = LIBRAW_FORMAT_CROP645; + ilm.CameraMount = LIBRAW_MOUNT_Hasselblad_XCD; + if (imgdata.lens.Lens[0] == 'H') { + process_Hassy_Lens(LIBRAW_MOUNT_Hasselblad_H); + strcpy(ilm.Adapter, "XH"); + } else { + if (imgdata.lens.Lens[0] == 'X') { + process_Hassy_Lens(LIBRAW_MOUNT_Hasselblad_XCD); + } else if (!imgdata.lens.Lens[0] && + (aperture > 1.0f) && + (focal_len > 10.0f)) { + ilm.LensID = focal_len; + if (ilm.LensID == 35) { + ilm.FocalType = LIBRAW_FT_ZOOM_LENS; + ilm.LensID = LIBRAW_MOUNT_Hasselblad_XCD*100000000ULL + + 35*10000ULL + 75*10; + } + else { + ilm.FocalType = LIBRAW_FT_PRIME_LENS; + ilm.LensID = LIBRAW_MOUNT_Hasselblad_XCD*100000000ULL + + ilm.LensID*10000ULL + ilm.LensID*10; + } + } + } + } + +// printf (">> SensorCode: %d, CoatingCode: %d, Sensor: %s\n", imHassy.SensorCode, imHassy.CoatingCode, imHassy.Sensor); +// printf (">> raw_width: %d, raw_height: %d\n", raw_width, raw_height); + + if (normalized_model[0] && !CM_found) + CM_found = adobe_coeff(maker_index, normalized_model); +} + +// RT: From dcraw.cc. +void LibRaw::parse_hasselblad_gain() +{ + /* + Reverse-engineer's notes: + + The Hasselblad gain tag (0x19 in makernotes) is only available in the 3FR format and + is applied and removed when Hasselblad Phocus converts it to the FFF format. It's + always 0x300000 bytes large regardless of (tested) model, not all space in it is + used though. + + It contains individual calibration information from the factory to tune the sensor + performance. + + There is more calibration data in the tag than what is applied in conversion to FFF, + I've only cared to figure out the data which is actually used, but have some leads on + remaining info. + + The format is not equal between all models. Due to lack of 3FR files (harder to get + than FFF) only a subset of the models have been reverse-engineered. + + The header space is 512 bytes and is a mix of 16 and 32 bit values. Offset to blocks + are 32 bit values, but all information seems to be encoded in 16 bit values. Many + values in the header can be zeroed with no effect on FFF conversion, and their + meaning, if any, have not been further investigated. + + Formats: + hdr16[22] = raw width + hdr16[23] = raw height + hdr32[24] = offset to level corr block + Data block format. Seems to differ depending on sensor type. For tested H4D-50 + and H3D-31: 10 16 bit signed values per row + value 0: a correction factor (k) used on even columns, where the new pixel value is + calculated as follows: + new_value = old_value + (2 * ((k * (old_value_on_row_above-256)) / 32767) - 2) + note the connection to the value on the row above, seems to be some sort of signal + leakage correction. + value 1: same as value 0 but using old value on row below instead of above + value 2-3: same as value 0-1 but for odd columns + value 4-9: has some effect if non-zero (probably similar to the others) but not + investigated which, as it's seems to be always zero for the tested cameras. + + hdr32[25] = probably offset to "bad/unreliable pixels" info, always 512 as it starts + directly after the header. Not applied in FFF conversion (at least + typically). + Data block format guess: raw_height packets of + + + hdr32[27] = offset to unknown data (bad colulmns?), of the form: + <0> + packet: . + + hdr32[34] = curves offset, seems to be A/D curves (one per channel) on newer models + and some sort of a film curve on older. Not applied in FFF conversion. + + hdr32[36] = flatfield correction, not available in older models. Data format: + <1><11 * 2 pad> + packet: + + The header pad is not zeroed and might seem to contain some sort of + information, but it makes no difference if set to zero. See + hasselblad_correct() how the flatfield is applied. + + Applied in FFF conversion is levels, flatfield correction, and the bad columns(?) + data. A/D curves are surprisingly not applied, maybe pre-applied in hardware and + only available as information? Levels are applied before flatfield, further + ordering has not been investigated. + + Not all combinations/models have been tested so there may be gaps. + + Most clipped pixels in a 3FR is at 65535, but there's also some at 65534. Both + are set to 65535 when calibrated, while 65533 is treated as a normal value. In + the calibration process smaller values can be scaled to 65534 (which should + not be seen as clipped). + */ + + auto &hbd = imHassy; + int offset; + off_t base; + + base = ftell(ifp); + fseek(ifp, 2 * 23, SEEK_CUR); + get2(); + fseek(ifp, 48, SEEK_CUR); + offset = get4(); + hbd.levels = offset ? base + offset : 0; + fseek(ifp, 8, SEEK_CUR); + offset = get4(); + hbd.unknown1 = offset ? base + offset : 0; + fseek(ifp, 32, SEEK_CUR); + offset = get4(); + hbd.flatfield = (offset && (base + offset < ifp->size())) ? base + offset : 0; +} diff --git a/rtengine/libraw/src/metadata/identify.cpp b/rtengine/libraw/src/metadata/identify.cpp new file mode 100644 index 000000000..bb43081bc --- /dev/null +++ b/rtengine/libraw/src/metadata/identify.cpp @@ -0,0 +1,3225 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" +#include "../../internal/libraw_cameraids.h" + +// clang-format on +static const struct +{ + const int CorpId; + const char *CorpName; +} CorpTable[] = { + {LIBRAW_CAMERAMAKER_Agfa, "AgfaPhoto"}, + {LIBRAW_CAMERAMAKER_Apple, "Apple"}, + {LIBRAW_CAMERAMAKER_Broadcom, "Broadcom"}, + {LIBRAW_CAMERAMAKER_Canon, "Canon"}, + {LIBRAW_CAMERAMAKER_Casio, "Casio"}, + {LIBRAW_CAMERAMAKER_CINE, "CINE"}, + {LIBRAW_CAMERAMAKER_Epson, "Epson"}, + {LIBRAW_CAMERAMAKER_Fujifilm, "Fujifilm"}, + {LIBRAW_CAMERAMAKER_Mamiya, "Mamiya"}, + {LIBRAW_CAMERAMAKER_Motorola, "Motorola"}, + {LIBRAW_CAMERAMAKER_Kodak, "Kodak"}, + {LIBRAW_CAMERAMAKER_Konica, "Konica"}, + {LIBRAW_CAMERAMAKER_Minolta, "Minolta"}, + {LIBRAW_CAMERAMAKER_Leica, "Leica"}, + {LIBRAW_CAMERAMAKER_Nikon, "Nikon"}, + {LIBRAW_CAMERAMAKER_Nokia, "Nokia"}, + {LIBRAW_CAMERAMAKER_Olympus, "Olympus"}, + {LIBRAW_CAMERAMAKER_OmDigital, "OM Digital"}, + {LIBRAW_CAMERAMAKER_Ricoh, "Ricoh"}, + {LIBRAW_CAMERAMAKER_Pentax, "Pentax"}, + {LIBRAW_CAMERAMAKER_PhaseOne, "Phase One"}, + {LIBRAW_CAMERAMAKER_PhaseOne, "PhaseOne"}, + {LIBRAW_CAMERAMAKER_Samsung, "Samsung"}, + {LIBRAW_CAMERAMAKER_Sigma, "Sigma"}, + {LIBRAW_CAMERAMAKER_Sinar, "Sinar"}, + {LIBRAW_CAMERAMAKER_Sony, "Sony"}, + {LIBRAW_CAMERAMAKER_YI, "YI"}, + // add corp. names below + {LIBRAW_CAMERAMAKER_Alcatel, "Alcatel"}, + {LIBRAW_CAMERAMAKER_Aptina, "Aptina"}, + {LIBRAW_CAMERAMAKER_AVT, "AVT"}, + {LIBRAW_CAMERAMAKER_Baumer, "Baumer"}, + {LIBRAW_CAMERAMAKER_Clauss, "Clauss"}, + {LIBRAW_CAMERAMAKER_Contax, "Contax"}, + {LIBRAW_CAMERAMAKER_Creative, "Creative"}, + {LIBRAW_CAMERAMAKER_DJI, "DJI"}, + {LIBRAW_CAMERAMAKER_Foculus, "Foculus"}, + {LIBRAW_CAMERAMAKER_Generic, "Generic"}, + {LIBRAW_CAMERAMAKER_Gione, "Gione"}, + {LIBRAW_CAMERAMAKER_GITUP, "GITUP"}, + {LIBRAW_CAMERAMAKER_Hasselblad, "Hasselblad"}, + {LIBRAW_CAMERAMAKER_HTC, "HTC"}, + {LIBRAW_CAMERAMAKER_I_Mobile, "I_Mobile"}, + {LIBRAW_CAMERAMAKER_Imacon, "Imacon"}, + {LIBRAW_CAMERAMAKER_ISG, "ISG"}, + {LIBRAW_CAMERAMAKER_JK_Imaging, "JK Imaging"}, // Kodak + {LIBRAW_CAMERAMAKER_Leaf, "Leaf"}, + {LIBRAW_CAMERAMAKER_Lenovo, "Lenovo"}, + {LIBRAW_CAMERAMAKER_LG, "LG"}, + {LIBRAW_CAMERAMAKER_Logitech, "Logitech"}, + {LIBRAW_CAMERAMAKER_Matrix, "Matrix"}, + {LIBRAW_CAMERAMAKER_Meizu, "Meizu"}, + {LIBRAW_CAMERAMAKER_Micron, "Micron"}, + {LIBRAW_CAMERAMAKER_NGM, "NGM"}, + {LIBRAW_CAMERAMAKER_OmniVison, "OmniVison"}, + {LIBRAW_CAMERAMAKER_Panasonic, "Panasonic"}, + {LIBRAW_CAMERAMAKER_Photron, "Photron"}, + {LIBRAW_CAMERAMAKER_Pixelink, "Pixelink"}, + {LIBRAW_CAMERAMAKER_Polaroid, "Polaroid"}, + {LIBRAW_CAMERAMAKER_Rollei, "Rollei"}, + {LIBRAW_CAMERAMAKER_RoverShot, "RoverShot"}, + {LIBRAW_CAMERAMAKER_SMaL, "SMaL"}, + {LIBRAW_CAMERAMAKER_ST_Micro, "ST Micro"}, + {LIBRAW_CAMERAMAKER_THL, "THL"}, + {LIBRAW_CAMERAMAKER_Xiaomi, "Xiaomi"}, + {LIBRAW_CAMERAMAKER_XIAOYI, "Xiayi"}, + {LIBRAW_CAMERAMAKER_Yuneec, "Yuneec"}, + {LIBRAW_CAMERAMAKER_DXO, "DxO"}, + {LIBRAW_CAMERAMAKER_RED, "Red"}, + {LIBRAW_CAMERAMAKER_PhotoControl, "Photo Control"}, + {LIBRAW_CAMERAMAKER_Google, "Google"}, + {LIBRAW_CAMERAMAKER_GoPro, "GoPro"}, + {LIBRAW_CAMERAMAKER_Parrot, "Parrot"}, + {LIBRAW_CAMERAMAKER_Zeiss, "Zeiss"}, + {LIBRAW_CAMERAMAKER_OnePlus, "OnePlus"}, + {LIBRAW_CAMERAMAKER_VIVO, "Vivo"}, + {LIBRAW_CAMERAMAKER_HMD_Global, "HMD Global"}, + {LIBRAW_CAMERAMAKER_HUAWEI, "Huawei"}, + {LIBRAW_CAMERAMAKER_RaspberryPi, "RaspberryPi"}, +}; +// clang-format on + +int LibRaw::setMakeFromIndex(unsigned makei) +{ + if (makei <= LIBRAW_CAMERAMAKER_Unknown || makei >= LIBRAW_CAMERAMAKER_TheLastOne) return 0; + + for (int i = 0; i < int(sizeof CorpTable / sizeof *CorpTable); i++) + if ((unsigned)CorpTable[i].CorpId == makei) + { + strcpy(normalized_make, CorpTable[i].CorpName); + maker_index = makei; + return 1; + } + return 0; +} + +const char *LibRaw::cameramakeridx2maker(unsigned maker) +{ + for (int i = 0; i < int(sizeof CorpTable / sizeof *CorpTable); i++) + if((unsigned)CorpTable[i].CorpId == maker) + return CorpTable[i].CorpName; + return 0; +} + + +/* + Identify which camera created this file, and set global variables + accordingly. + */ +void LibRaw::identify() +{ + // clang-format off + static const ushort canon[][11] = { + // raw_width, raw_height, left_margin, top_margin, + // width_decrement, height_decrement, + // mask01, mask03, mask11, mask13, + // CFA_filters. + { 1944, 1416, 0, 0, 48, 0 }, // 00 "PowerShot Pro90 IS" + { 2144, 1560, 4, 8, 52, 2, 0, 0, 0, 25 }, // 01 "PowerShot S30", "PowerShot G1" + { 2224, 1456, 48, 6, 0, 2 }, // 02 "EOS D30" + { 2376, 1728, 12, 6, 52, 2 }, // 03 "PowerShot G2", "PowerShot S40", "PowerShot G3", "PowerShot S45" + { 2672, 1968, 12, 6, 44, 2 }, // 04 "PowerShot G5", "PowerShot S50", "PowerShot S60" + { 3152, 2068, 64, 12, 0, 0, 16 }, // 05 "EOS D60", "EOS 10D", "EOS 300D" + { 3160, 2344, 44, 12, 4, 4 }, // 06 "PowerShot G6", "PowerShot S70" + { 3344, 2484, 4, 6, 52, 6 }, // 07 "PowerShot Pro1" + { 3516, 2328, 42, 14, 0, 0 }, // 08 "EOS 350D" + { 3596, 2360, 74, 12, 0, 0 }, // 09 "EOS-1D Mark II", "EOS 20D", "EOS-1D Mark II N", "EOS 30D" + { 3744, 2784, 52, 12, 8, 12 }, // 10 "PowerShot G11", "PowerShot S90", "PowerShot G12", "PowerShot S95" + { 3944, 2622, 30, 18, 6, 2 }, // 11 "EOS 40D" + { 3948, 2622, 42, 18, 0, 2 }, // 12 "EOS 400D", "EOS 1000D" + { 3984, 2622, 76, 20, 0, 2, 14 }, // 13 "EOS-1D Mark III" + { 4032, 2656, 112, 44, 10, 0 }, // 14 APS-C crop mode: "EOS 6D Mark II"??, "EOS RP" + { 4104, 3048, 48, 12, 24, 12 }, // 15 "PowerShot G9" + { 4116, 2178, 4, 2, 0, 0 }, // 16 ?? + { 4152, 2772, 192, 12, 0, 0 }, // 17 "PowerShot SX1 IS" + { 4160, 3124, 104, 11, 8, 65 }, // 18 "PowerShot S100 (new)", "PowerShot S100V", "PowerShot G15", "PowerShot S110 (new)" + { 4176, 3062, 96, 17, 8, 0, 0, 16, 0, 7, 0x49 }, // 19 "PowerShot SX50 HS" + { 4192, 3062, 96, 17, 24, 0, 0, 16, 0, 0, 0x49 }, // 20 "PowerShot G16", "PowerShot S120" + { 4312, 2876, 22, 18, 0, 2 }, // 21 "EOS 450D" + { 4352, 2850, 144, 46, 0, 0 }, // 22 APS-C crop mode: "EOS R", "EOS Ra" + { 4352, 2874, 62, 18, 0, 0 }, // 23 "EOS 1100D" + { 4476, 2954, 90, 34, 0, 0 }, // 24 "EOS 5D" + { 4480, 3348, 12, 10, 36, 12, 0, 0, 0, 18, 0x49 }, // 25 "PowerShot G10" + { 4480, 3366, 80, 50, 0, 0 }, // 26 "PowerShot G1 X Mark II" + { 4496, 3366, 80, 50, 12, 0 }, // 27 "PowerShot G1 X" + { 4768, 3516, 96, 16, 0, 0, 0, 16 }, // 28 "PowerShot SX60 HS" + { 4832, 3204, 62, 26, 0, 0 }, // 29 "EOS 500D" + { 4832, 3228, 62, 51, 0, 0 }, // 30 "EOS 50D" + { 5108, 3349, 98, 13, 0, 0 }, // 31 "EOS-1Ds Mark II" + { 5120, 3318, 142, 45, 62, 0 }, // 32 "EOS-1D Mark IV" + { 5280, 3528, 72, 52, 0, 0 }, // 33 "EOS M10", "EOS 650D", "EOS 700D", "EOS M", "EOS 100D", "EOS M2" + { 5344, 3516, 142, 51, 0, 0 }, // 34 "EOS 550D", "EOS 600D", "EOS 60D", "EOS 1200D", "EOS 1300D", "EOS 3000D" + { 5344, 3584, 126, 100, 0, 2 }, // 35 "EOS-1D X", "EOS-1D C" + { 5344, 3950, 98, 18, 0, 0, 0, 24, 0, 0 }, // 36 "PowerShot SX70 HS" + { 5360, 3516, 158, 51, 0, 0 }, // 37 "EOS 7D" + { 5568, 3708, 72, 38, 0, 0 }, // 38; "EOS 7D Mark II", "EOS 6D", "EOS 70D", "EOS-1D X MARK II" + { 5632, 3710, 96, 17, 0, 0, 0, 16, 0, 0, 0x49 }, // 39 "PowerShot G7 X", "PowerShot G3 X", "PowerShot G9 X", "PowerShot G5 X", "PowerShot G7 X Mark II", "PowerShot G9 X Mark II" + { 5712, 3774, 62, 20, 10, 2 }, // 40 "EOS-1Ds Mark III" + { 5792, 3804, 158, 51, 0, 0 }, // 41 "EOS 5D Mark II" + { 5920, 3950, 122, 80, 2, 0 }, // 42 "EOS 5D Mark III" + { 6096, 4051, 76, 35, 0, 0 }, // 43 "EOS 1500D" + { 6096, 4056, 72, 34, 0, 0 }, // 44 "EOS M3", "EOS 760D", "EOS 750D" + { 6288, 4056, 264, 36, 0, 0 }, // 45 "EOS M5", "EOS M100", "EOS M6", "PowerShot G1 X Mark III", "EOS 80D", "EOS 800D", "EOS 77D", "EOS 200D", "EOS 250D", "EOS M50", "EOS R100" + { 6384, 4224, 120, 44, 0, 0 }, // 46 "EOS 6D Mark II", "EOS RP" + { 6880, 4544, 136, 42, 0, 0 }, // 47 "EOS 5D Mark IV" + { 6888, 4546, 146, 48, 0, 0 }, // 48 "EOS R", "EOS Ra" + { 7128, 4732, 144, 72, 0, 0 }, // 49 "EOS M6 II", "EOS 90D" + { 8896, 5920, 160, 64, 0, 0 }, // 50 "EOS 5DS", "EOS 5DS R" + { 6192, 4152, 160, 120, 0, 0}, // EOS R3 + { 6192, 4060, 168, 52, 24, 8, 16,48,32,0}, // EOS R10 + { 6188, 4120, 154, 96, 12, 0, 16, 48, 32, 0}, // EOS R6mk2 + }; + + static const libraw_custom_camera_t const_table[] = { + { 786432, 1024, 768, 0, 0, 0, 0, 0, 0x94, 0, 0, "AVT", "F-080C" }, + { 1447680, 1392, 1040, 0, 0, 0, 0, 0, 0x94, 0, 0, "AVT", "F-145C" }, + { 1920000, 1600, 1200, 0, 0, 0, 0, 0, 0x94, 0, 0, "AVT", "F-201C" }, + { 5067304, 2588, 1958, 0, 0, 0, 0, 0, 0x94, 0, 0, "AVT", "F-510C" }, + { 5067316, 2588, 1958, 0, 0, 0, 0, 0, 0x94, 0, 0, "AVT", "F-510C", 12 }, + { 10134608, 2588, 1958, 0, 0, 0, 0, 9, 0x94, 0, 0, "AVT", "F-510C" }, + { 10134620, 2588, 1958, 0, 0, 0, 0, 9, 0x94, 0, 0, "AVT", "F-510C", 12 }, + { 16157136, 3272, 2469, 0, 0, 0, 0, 9, 0x94, 0, 0, "AVT", "F-810C" }, + { 3995136, 1632, 1224, 0, 0, 0, 0, 8, 0x61, 0, 1, "AgfaPhoto", "DC-833m" }, + { 15980544, 3264, 2448, 0, 0, 0, 0, 8, 0x61, 0, 1, "AgfaPhoto", "DC-833m" }, + { 9631728, 2532, 1902, 0, 0, 0, 0, 96, 0x61, 0, 0, "Alcatel", "5035D" }, + { 31850496, 4608, 3456, 0, 0, 0, 0, 0, 0x94, 0, 0, "GITUP", "GIT2 4:3" }, + { 23887872, 4608, 2592, 0, 0, 0, 0, 0, 0x94, 0, 0, "GITUP", "GIT2 16:9" }, + { 32257024, 4624, 3488, 8, 2, 16, 2, 0, 0x94, 0, 0, "GITUP", "GIT2P 4:3" }, + { 24192768, 4624, 2616, 8, 2, 16, 2, 0, 0x94, 0, 0, "GITUP", "GIT2P 16:9" }, + { 18016000, 4000, 2252, 0, 0, 0, 0, 0, 0x94, 0, 0, "GITUP", "G3DUO 16:9" }, + // {24000000, 4000, 3000, 0, 0, 0, 0, 0, 0x94, 0, 0, "GITUP", + // "G3DUO 4:3"}, // Conflict w/ Samsung WB550 + + // Android Raw dumps id start + // File Size in bytes Horizontal Res Vertical Flag then bayer order eg + // 0x16 bbgr 0x94 rggb + { 1540857, 2688, 1520, 0, 0, 0, 0, 1, 0x61, 0, 0, "Samsung", "S3" }, + { 2658304, 1212, 1096, 0, 0, 0, 0, 1, 0x16, 0, 0, "LG", "G3FrontMipi" }, + { 2842624, 1296, 1096, 0, 0, 0, 0, 1, 0x16, 0, 0, "LG", "G3FrontQCOM" }, + { 2969600, 1976, 1200, 0, 0, 0, 0, 1, 0x16, 0, 0, "Xiaomi", "MI3wMipi" }, + { 3170304, 1976, 1200, 0, 0, 0, 0, 1, 0x16, 0, 0, "Xiaomi", "MI3wQCOM" }, + { 3763584, 1584, 1184, 0, 0, 0, 0, 96, 0x61, 0, 0, "I_Mobile", "I_StyleQ6" }, + { 5107712, 2688, 1520, 0, 0, 0, 0, 1, 0x61, 0, 0, "OmniVisi", "UltraPixel1" }, + { 5382640, 2688, 1520, 0, 0, 0, 0, 1, 0x61, 0, 0, "OmniVisi", "UltraPixel2" }, + { 5664912, 2688, 1520, 0, 0, 0, 0, 1, 0x61, 0, 0, "OmniVisi", "4688" }, + { 5664912, 2688, 1520, 0, 0, 0, 0, 1, 0x61, 0, 0, "OmniVisi", "4688" }, + { 5364240, 2688, 1520, 0, 0, 0, 0, 1, 0x61, 0, 0, "OmniVisi", "4688" }, + { 6299648, 2592, 1944, 0, 0, 0, 0, 1, 0x16, 0, 0, "OmniVisi", "OV5648" }, + { 6721536, 2592, 1944, 0, 0, 0, 0, 0, 0x16, 0, 0, "OmniVisi", "OV56482" }, + { 6746112, 2592, 1944, 0, 0, 0, 0, 0, 0x16, 0, 0, "HTC", "OneSV" }, + { 9631728, 2532, 1902, 0, 0, 0, 0, 96, 0x61, 0, 0, "Sony", "5mp" }, + { 9830400, 2560, 1920, 0, 0, 0, 0, 96, 0x61, 0, 0, "NGM", "ForwardArt" }, + { 10186752, 3264, 2448, 0, 0, 0, 0, 1, 0x94, 0, 0, "Sony", "IMX219-mipi 8mp" }, + { 10223360, 2608, 1944, 0, 0, 0, 0, 96, 0x16, 0, 0, "Sony", "IMX" }, + { 10782464, 3282, 2448, 0, 0, 0, 0, 0, 0x16, 0, 0, "HTC", "MyTouch4GSlide" }, + { 10788864, 3282, 2448, 0, 0, 0, 0, 0, 0x16, 0, 0, "Xperia", "L" }, + { 15967488, 3264, 2446, 0, 0, 0, 0, 96, 0x16, 0, 0, "OmniVison", "OV8850" }, + { 16224256, 4208, 3082, 0, 0, 0, 0, 1, 0x16, 0, 0, "LG", "G3MipiL" }, + { 16424960, 4208, 3120, 0, 0, 0, 0, 1, 0x16, 0, 0, "IMX135", "MipiL" }, + { 17326080, 4164, 3120, 0, 0, 0, 0, 1, 0x16, 0, 0, "LG", "G3LQCom" }, + { 17522688, 4212, 3120, 0, 0, 0, 0, 0, 0x16, 0, 0, "Sony", "IMX135-QCOM" }, + { 19906560, 4608, 3456, 0, 0, 0, 0, 1, 0x16, 0, 0, "Gione", "E7mipi" }, + { 19976192, 5312, 2988, 0, 0, 0, 0, 1, 0x16, 0, 0, "LG", "G4" }, + { 20389888, 4632, 3480, 0, 0, 0, 0, 1, 0x16, 0, 0, "Xiaomi", "RedmiNote3Pro" }, + { 20500480, 4656, 3496, 0, 0, 0, 0, 1, 0x94, 0, 0, "Sony", "IMX298-mipi 16mp" }, + { 21233664, 4608, 3456, 0, 0, 0, 0, 1, 0x16, 0, 0, "Gione", "E7qcom" }, + { 26023936, 4192, 3104, 0, 0, 0, 0, 96, 0x94, 0, 0, "THL", "5000" }, + { 26257920, 4208, 3120, 0, 0, 0, 0, 96, 0x94, 0, 0, "Sony", "IMX214" }, + { 26357760, 4224, 3120, 0, 0, 0, 0, 96, 0x61, 0, 0, "OV", "13860" }, + { 41312256, 5248, 3936, 0, 0, 0, 0, 96, 0x61, 0, 0, "Meizu", "MX4" }, + { 42923008, 5344, 4016, 0, 0, 0, 0, 96, 0x61, 0, 0, "Sony", "IMX230" }, + // Android Raw dumps id end + { 20137344, 3664, 2748, 0, 0, 0, 0, 64, 0x49, 0, 0, "Aptina", "MT9J003", 0xffff }, + { 2868726, 1384, 1036, 0, 0, 0, 0, 64, 0x49, 0, 8, "Baumer", "TXG14", 1078 }, + { 6553440, 2664, 1968, 4, 4, 44, 4, 40, 0x94, 0, 2, "Canon", "PowerShot A460" }, // chdk hack + { 9243240, 3152, 2346, 12, 7, 44, 13, 40, 0x49, 0, 2, "Canon", "PowerShot A470" }, // chdk hack + { 6653280, 2672, 1992, 10, 6, 42, 2, 40, 0x94, 0, 2, "Canon", "PowerShot A530" }, // chdk hack + { 6573120, 2672, 1968, 12, 8, 44, 0, 40, 0x94, 0, 2, "Canon", "PowerShot A610" }, // chdk hack + { 9219600, 3152, 2340, 36, 12, 4, 0, 40, 0x94, 0, 2, "Canon", "PowerShot A620" }, // chdk hack + { 10383120, 3344, 2484, 12, 6, 44, 6, 40, 0x94, 0, 2, "Canon", "PowerShot A630" }, // chdk hack + { 12945240, 3736, 2772, 12, 6, 52, 6, 40, 0x94, 0, 2, "Canon", "PowerShot A640" }, // chdk hack + { 15636240, 4104, 3048, 48, 12, 24, 12, 40, 0x94, 0, 2, "Canon", "PowerShot A650 IS" }, // chdk hack + { 10341600, 3336, 2480, 6, 5, 32, 3, 40, 0x94, 0, 2, "Canon", "PowerShot A720 IS" }, // chdk hack + { 24724224, 4704, 3504, 8, 16, 56, 8, 40, 0x49, 0, 2, "Canon", "PowerShot A3300 IS" }, // chdk hack + { 18763488, 4104, 3048, 10, 22, 82, 22, 8, 0x49, 0, 0, "Canon", "PowerShot D10" }, // ? chdk hack ? + { 19493760, 4160, 3124, 104, 12, 8, 66, 40, 0x49, 0, 2, "Canon", "PowerShot S100" }, // chdk hack CRW + { 7710960, 2888, 2136, 44, 8, 4, 0, 40, 0x94, 0, 2, "Canon", "PowerShot S3 IS" }, // chdk hack + { 5298000, 2400, 1766, 12, 12, 44, 2, 40, 0x94, 0, 2, "Canon", "PowerShot SD300" }, // chdk hack + { 18653760, 4080, 3048, 24, 12, 24, 12, 40, 0x94, 0, 2, "Canon", "PowerShot SX20 IS" }, // chdk hack + { 21936096, 4464, 3276, 25, 10, 73, 12, 40, 0x16, 0, 2, "Canon", "PowerShot SX30 IS" }, // chdk hack + { 19167840, 4176, 3060, 96, 16, 8, 0, 40, 0x94, 0, 2, "Canon", "PowerShot SX40 HS" }, // chdk hack CR2 + { 15467760, 3720, 2772, 6, 12, 30, 0, 40, 0x94, 0, 2, "Canon", "PowerShot SX110 IS" }, // chdk hack + { 15534576, 3728, 2778, 12, 9, 44, 9, 40, 0x94, 0, 2, "Canon", "PowerShot SX120 IS" }, // chdk hack + { 19131120, 4168, 3060, 92, 16, 4, 1, 40, 0x94, 0, 2, "Canon", "PowerShot SX220 HS" }, // chdk hack + { 31663200, 5344, 3950, 96, 18, 0, 0, 40, 0x94, 0, 2, "Canon", "PowerShot SX710 HS" }, // chdk hack + { 30858240, 5248, 3920, 8, 16, 56, 16, 40, 0x94, 0, 2, "Canon", "IXUS 160" }, // chdk hack + { 1976352, 1632, 1211, 0, 2, 0, 1, 0, 0x94, 0, 1, "Casio", "QV-2000UX" }, + { 3217760, 2080, 1547, 0, 0, 10, 1, 0, 0x94, 0, 1, "Casio", "QV-3*00EX" }, + { 6218368, 2585, 1924, 0, 0, 9, 0, 0, 0x94, 0, 1, "Casio", "QV-5700" }, + { 7816704, 2867, 2181, 0, 0, 34, 36, 0, 0x16, 0, 1, "Casio", "EX-Z60" }, + { 2937856, 1621, 1208, 0, 0, 1, 0, 0, 0x94, 7, 13, "Casio", "EX-S20" }, + { 4948608, 2090, 1578, 0, 0, 32, 34, 0, 0x94, 7, 1, "Casio", "EX-S100" }, + { 6054400, 2346, 1720, 2, 0, 32, 0, 0, 0x94, 7, 1, "Casio", "QV-R41" }, + { 7426656, 2568, 1928, 0, 0, 0, 0, 0, 0x94, 0, 1, "Casio", "EX-P505" }, + { 7530816, 2602, 1929, 0, 0, 22, 0, 0, 0x94, 7, 1, "Casio", "QV-R51" }, + { 7542528, 2602, 1932, 0, 0, 32, 0, 0, 0x94, 7, 1, "Casio", "EX-Z50" }, + { 7562048, 2602, 1937, 0, 0, 25, 0, 0, 0x16, 7, 1, "Casio", "EX-Z500" }, + { 7753344, 2602, 1986, 0, 0, 32, 26, 0, 0x94, 7, 1, "Casio", "EX-Z55" }, + { 9313536, 2858, 2172, 0, 0, 14, 30, 0, 0x94, 7, 1, "Casio", "EX-P600" }, + { 10834368, 3114, 2319, 0, 0, 27, 0, 0, 0x94, 0, 1, "Casio", "EX-Z750" }, + { 10843712, 3114, 2321, 0, 0, 25, 0, 0, 0x94, 0, 1, "Casio", "EX-Z75" }, + { 10979200, 3114, 2350, 0, 0, 32, 32, 0, 0x94, 7, 1, "Casio", "EX-P700" }, + { 12310144, 3285, 2498, 0, 0, 6, 30, 0, 0x94, 0, 1, "Casio", "EX-Z850" }, + { 12489984, 3328, 2502, 0, 0, 47, 35, 0, 0x94, 0, 1, "Casio", "EX-Z8" }, + { 15499264, 3754, 2752, 0, 0, 82, 0, 0, 0x94, 0, 1, "Casio", "EX-Z1050" }, + { 18702336, 4096, 3044, 0, 0, 24, 0, 80, 0x94, 7, 1, "Casio", "EX-ZR100" }, + { 7684000, 2260, 1700, 0, 0, 0, 0, 13, 0x94, 0, 1, "Casio", "QV-4000" }, + { 787456, 1024, 769, 0, 1, 0, 0, 0, 0x49, 0, 0, "Creative", "PC-CAM 600" }, + { 28829184, 4384, 3288, 0, 0, 0, 0, 36, 0x61, 0, 0, "DJI" }, + { 15151104, 4608, 3288, 0, 0, 0, 0, 0, 0x94, 0, 0, "Matrix" }, + { 3840000, 1600, 1200, 0, 0, 0, 0, 65, 0x49, 0, 0, "Foculus", "531C" }, + { 307200, 640, 480, 0, 0, 0, 0, 0, 0x94, 0, 0, "Generic" }, + { 62464, 256, 244, 1, 1, 6, 1, 0, 0x8d, 0, 0, "Kodak", "DC20" }, + { 124928, 512, 244, 1, 1, 10, 1, 0, 0x8d, 0, 0, "Kodak", "DC20" }, + { 1652736, 1536, 1076, 0, 52, 0, 0, 0, 0x61, 0, 0, "Kodak", "DCS200" }, + { 4159302, 2338, 1779, 1, 33, 1, 2, 0, 0x94, 0, 0, "Kodak", "C330" }, + { 4162462, 2338, 1779, 1, 33, 1, 2, 0, 0x94, 0, 0, "Kodak", "C330", 3160 }, + { 2247168, 1232, 912, 0, 0, 16, 0, 0, 0x00, 0, 0, "Kodak", "C330" }, + { 3370752, 1232, 912, 0, 0, 16, 0, 0, 0x00, 0, 0, "Kodak", "C330" }, + { 6163328, 2864, 2152, 0, 0, 0, 0, 0, 0x94, 0, 0, "Kodak", "C603" }, + { 6166488, 2864, 2152, 0, 0, 0, 0, 0, 0x94, 0, 0, "Kodak", "C603", 3160 }, + { 460800, 640, 480, 0, 0, 0, 0, 0, 0x00, 0, 0, "Kodak", "C603" }, + { 9116448, 2848, 2134, 0, 0, 0, 0, 0, 0x00, 0, 0, "Kodak", "C603" }, + { 12241200, 4040, 3030, 2, 0, 0, 13, 0, 0x49, 0, 0, "Kodak", "12MP" }, + { 12272756, 4040, 3030, 2, 0, 0, 13, 0, 0x49, 0, 0, "Kodak", "12MP", 31556 }, + { 18000000, 4000, 3000, 0, 0, 0, 0, 0, 0x00, 0, 0, "Kodak", "12MP" }, + { 614400, 640, 480, 0, 3, 0, 0, 64, 0x94, 0, 0, "Kodak", "KAI-0340" }, + { 15360000, 3200, 2400, 0, 0, 0, 0, 96, 0x16, 0, 0, "Lenovo", "A820" }, + { 3884928, 1608, 1207, 0, 0, 0, 0, 96, 0x16, 0, 0, "Micron", "2010", 3212 }, + { 1138688, 1534, 986, 0, 0, 0, 0, 0, 0x61, 0, 0, "Minolta", "RD175", 513 }, + { 1581060, 1305, 969, 0, 0, 18, 6, 6, 0x1e, 4, 1, "Nikon", "E900" }, // "diag raw" hack + { 2465792, 1638, 1204, 0, 0, 22, 1, 6, 0x4b, 5, 1, "Nikon", "E950" }, // "diag raw" hack; possibly also Nikon E700, E800, E775; + // Olympus C-2020Z + { 2940928, 1616, 1213, 0, 0, 0, 7, 30, 0x94, 0, 1, "Nikon", "E2100" }, // "diag raw" hack; also Nikon E2500 + { 4771840, 2064, 1541, 0, 0, 0, 1, 6, 0xe1, 0, 1, "Nikon", "E990" }, // "diag raw" hack; possibly also Nikon E880, E885, E995; + // Olympus C-3030Z + { 4775936, 2064, 1542, 0, 0, 0, 0, 30, 0x94, 0, 1, "Nikon", "E3700" }, // "diag raw" hack; Nikon E3100, E3200, E3500; + // Pentax "Optio 33WR"; possibly also Olympus C-740UZ + { 5865472, 2288, 1709, 0, 0, 0, 1, 6, 0xb4, 0, 1, "Nikon", "E4500" }, // "diag raw" hack; possibly also Olympus C-4040Z + { 5869568, 2288, 1710, 0, 0, 0, 0, 6, 0x16, 0, 1, "Nikon", "E4300" }, // "diag raw" hack; also Minolta "DiMAGE Z2" + { 7438336, 2576, 1925, 0, 0, 0, 1, 6, 0xb4, 0, 1, "Nikon", "E5000" }, // also Nikon E5700 + { 8998912, 2832, 2118, 0, 0, 0, 0, 30, 0x94, 7, 1, "Nikon", "COOLPIX S6" }, // "diag raw" hack + { 5939200, 2304, 1718, 0, 0, 0, 0, 30, 0x16, 0, 0, "Olympus", "C-770UZ" }, // possibly also Olympus C-4100Z, C-765UZ + { 3178560, 2064, 1540, 0, 0, 0, 0, 0, 0x94, 0, 1, "Pentax", "Optio S V1.01" }, + { 4841984, 2090, 1544, 0, 0, 22, 0, 0, 0x94, 7, 1, "Pentax", "Optio S" }, + { 6114240, 2346, 1737, 0, 0, 22, 0, 0, 0x94, 7, 1, "Pentax", "Optio S4" }, + { 10702848, 3072, 2322, 0, 0, 0, 21, 30, 0x94, 0, 1, "Pentax", "Optio 750Z" }, + { 4147200, 1920, 1080, 0, 0, 0, 0, 0, 0x49, 0, 0, "Photron", "BC2-HD" }, + { 4151666, 1920, 1080, 0, 0, 0, 0, 0, 0x49, 0, 0, "Photron", "BC2-HD", 8 }, + { 13248000, 2208, 3000, 0, 0, 0, 0, 13, 0x61, 0, 0, "Pixelink", "A782" }, + { 6291456, 2048, 1536, 0, 0, 0, 0, 96, 0x61, 0, 0, "RoverShot", "3320AF" }, + { 311696, 644, 484, 0, 0, 0, 0, 0, 0x16, 0, 8, "ST Micro", "STV680 VGA" }, + { 16098048, 3288, 2448, 0, 0, 24, 0, 9, 0x94, 0, 1, "Samsung", "S85" }, // hack + { 16215552, 3312, 2448, 0, 0, 48, 0, 9, 0x94, 0, 1, "Samsung", "S85" }, // hack + { 20487168, 3648, 2808, 0, 0, 0, 0, 13, 0x94, 5, 1, "Samsung", "WB550" }, + { 24000000, 4000, 3000, 0, 0, 0, 0, 13, 0x94, 5, 1, "Samsung", "WB550" }, + { 12582980, 3072, 2048, 0, 0, 0, 0, 33, 0x61, 0, 0, "Sinar", "", 68 }, // Sinarback 23; same res. as Leaf Volare & Cantare + { 33292868, 4080, 4080, 0, 0, 0, 0, 33, 0x61, 0, 0, "Sinar", "", 68 }, // Sinarback 44 + { 44390468, 4080, 5440, 0, 0, 0, 0, 33, 0x61, 0, 0, "Sinar", "", 68 }, // Sinarback 54 + { 1409024, 1376, 1024, 0, 0, 1, 0, 0, 0x49, 0, 0, "Sony", "XCD-SX910CR" }, + { 2818048, 1376, 1024, 0, 0, 1, 0, 97, 0x49, 0, 0, "Sony", "XCD-SX910CR" }, + }; + + libraw_custom_camera_t + table[64 + sizeof(const_table) / sizeof(const_table[0])]; + + + // clang-format on + + char head[64] = {0}, *cp; + int hlen, fsize, flen, zero_fsize = 1, i, c; + INT64 fsize64; + struct jhead jh; + + unsigned camera_count = + parse_custom_cameras(64, table, imgdata.rawparams.custom_camera_strings); + for (int q = 0; q < int(sizeof(const_table) / sizeof(const_table[0])); q++) + memmove(&table[q + camera_count], &const_table[q], sizeof(const_table[0])); + camera_count += sizeof(const_table) / sizeof(const_table[0]); + + tiff_flip = flip = filters = UINT_MAX; /* unknown */ + raw_height = raw_width = fuji_width = fuji_layout = cr2_slice[0] = 0; + maximum = height = width = top_margin = left_margin = 0; + cdesc[0] = desc[0] = artist[0] = make[0] = model[0] = model2[0] = 0; + iso_speed = shutter = aperture = focal_len = 0; + unique_id = 0ULL; + tiff_nifds = 0; + is_NikonTransfer = 0; + is_Olympus = 0; + OlympusDNG_SubDirOffsetValid = 0; + is_Sony = 0; + is_pana_raw = 0; + maker_index = LIBRAW_CAMERAMAKER_Unknown; + FujiCropMode = 0; + is_PentaxRicohMakernotes = 0; + normalized_model[0] = 0; + normalized_make[0] = 0; + CM_found = 0; + memset(tiff_ifd, 0, sizeof tiff_ifd); + libraw_internal_data.unpacker_data.crx_track_selected = -1; + libraw_internal_data.unpacker_data.crx_track_count = -1; + libraw_internal_data.unpacker_data.CR3_CTMDtag = 0; + imHassy.nIFD_CM[0] = imHassy.nIFD_CM[1] = -1; + imKodak.ISOCalibrationGain = 1.0f; + imCommon.CameraTemperature = imCommon.SensorTemperature = + imCommon.SensorTemperature2 = imCommon.LensTemperature = + imCommon.AmbientTemperature = imCommon.BatteryTemperature = + imCommon.exifAmbientTemperature = -1000.0f; + + libraw_internal_data.unpacker_data.ifd0_offset = -1LL; + + imgdata.color.ExifColorSpace = LIBRAW_COLORSPACE_Unknown; + for (i = 0; i < LIBRAW_IFD_MAXCOUNT; i++) + { + tiff_ifd[i].dng_color[0].illuminant = tiff_ifd[i].dng_color[1].illuminant = + 0xffff; + for (int q = 0; q < 4; q++) + tiff_ifd[i].dng_levels.analogbalance[q] = 1.0f; + } + + memset(gpsdata, 0, sizeof gpsdata); + memset(cblack, 0, sizeof cblack); + memset(white, 0, sizeof white); + memset(mask, 0, sizeof mask); + thumb_offset = thumb_length = thumb_width = thumb_height = 0; + load_raw = 0; + thumb_format = LIBRAW_INTERNAL_THUMBNAIL_JPEG; // default to JPEG + data_offset = meta_offset = meta_length = tiff_bps = tiff_compress = 0; + kodak_cbpp = zero_after_ff = dng_version = load_flags = 0; + timestamp = shot_order = tiff_samples = black = is_foveon = 0; + mix_green = profile_length = data_error = zero_is_bad = 0; + pixel_aspect = is_raw = raw_color = 1; + tile_width = tile_length = 0; + metadata_blocks = 0; + + for (i = 0; i < 4; i++) + { + cam_mul[i] = i == 1; + pre_mul[i] = i < 3; + FORC3 cmatrix[c][i] = 0; + FORC3 rgb_cam[c][i] = c == i; + } + colors = 3; + for (i = 0; i < 0x10000; i++) + curve[i] = i; + + order = get2(); + hlen = get4(); + fseek(ifp, 0, SEEK_SET); + + if (fread(head, 1, 64, ifp) < 64) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + libraw_internal_data.unpacker_data.lenRAFData = + libraw_internal_data.unpacker_data.posRAFData = 0; + + fseek(ifp, 0, SEEK_END); + fsize64 = ftell(ifp); + if(fsize64 > LIBRAW_MAX_NONDNG_RAW_FILE_SIZE && fsize64 > LIBRAW_MAX_DNG_RAW_FILE_SIZE) + throw LIBRAW_EXCEPTION_TOOBIG; + + flen = fsize = ftell(ifp); + if ((cp = (char *)memmem(head, 32, (char *)"MMMM", 4)) || + (cp = (char *)memmem(head, 32, (char *)"IIII", 4))) + { + parse_phase_one(cp - head); + if (cp - head && parse_tiff(0)) + apply_tiff(); + } + else if (order == 0x4949 || order == 0x4d4d) + { + if (!memcmp(head + 6, "HEAPCCDR", 8)) + { + data_offset = hlen; + parse_ciff(hlen, flen - hlen, 0); + load_raw = &LibRaw::canon_load_raw; + } + else if (parse_tiff(0)) + apply_tiff(); + } + else if (!memcmp(head, "\xff\xd8\xff\xe1", 4) && !memcmp(head + 6, "Exif", 4)) + { + fseek(ifp, 4, SEEK_SET); + data_offset = 4 + get2(); + fseek(ifp, data_offset, SEEK_SET); + if (fgetc(ifp) != 0xff) + parse_tiff(12); + thumb_offset = 0; + } + else if (!memcmp(head + 25, "ARECOYK", 7)) // 'KYOCERA' right-to-left + { + strcpy(make, "Contax"); + strcpy(model, "N Digital"); + parse_kyocera(); + } + else if (!strcmp(head, "PXN")) + { + strcpy(make, "Logitech"); + strcpy(model, "Fotoman Pixtura"); + } + else if (!strcmp(head, "qktk")) + { + strcpy(make, "Apple"); + strcpy(model, "QuickTake 100"); + load_raw = &LibRaw::quicktake_100_load_raw; + } + else if (!strcmp(head, "qktn")) + { + strcpy(make, "Apple"); + strcpy(model, "QuickTake 150"); + load_raw = &LibRaw::kodak_radc_load_raw; + } + else if (!memcmp(head, "FUJIFILM", 8)) + { + memcpy(imFuji.SerialSignature, head + 0x10, 0x0c); + imFuji.SerialSignature[0x0c] = 0; + memcpy(imFuji.SensorID, imFuji.SerialSignature + 0x06, 0x04); + imFuji.SensorID[0x04] = 0; + strncpy(model, head + 0x1c, 0x20); + model[0x20] = 0; + c = 11; + while (imFuji.SerialSignature[c] > 0 && isdigit(imFuji.SerialSignature[c]) && (c>0)) + c--; + if(c < 11) + unique_id = (unsigned long long)atoi(imFuji.SerialSignature+c+1); + memcpy(imFuji.RAFVersion, head + 0x3c, 4); + imFuji.RAFVersion[4] = 0; + fseek(ifp, 84, SEEK_SET); + thumb_offset = get4(); + thumb_length = get4(); + fseek(ifp, 92, SEEK_SET); + parse_fuji(get4()); + if (thumb_offset > 120) + { + fseek(ifp, 120, SEEK_SET); + is_raw += (i = get4()) ? 1 : 0; + if (is_raw == 2 && shot_select) + parse_fuji(i); + } + load_raw = &LibRaw::unpacked_load_raw; + fseek(ifp, 100 + 28 * (shot_select > 0), SEEK_SET); + parse_tiff(data_offset = get4()); + parse_tiff(thumb_offset + 12); + parse_fuji_thumbnail(thumb_offset); + apply_tiff(); + } + else if (!memcmp(head, "RIFF", 4)) + { + fseek(ifp, 0, SEEK_SET); + parse_riff(100); + } + else if (!memcmp(head + 4, "ftypqt ", 9)) + { + fseek(ifp, 0, SEEK_SET); + parse_qt(fsize); + is_raw = 0; + } + else if (!memcmp(head, "\0\001\0\001\0@", 6)) + { + fseek(ifp, 6, SEEK_SET); + fread(make, 1, 8, ifp); + fread(model, 1, 8, ifp); + fread(model2, 1, 16, ifp); + data_offset = get2(); + get2(); + raw_width = get2(); + raw_height = get2(); + load_raw = &LibRaw::nokia_load_raw; + filters = 0x61616161; + } + else if (!memcmp(head, "NOKIARAW", 8)) + { + strcpy(make, "NOKIA"); + order = 0x4949; + fseek(ifp, 300, SEEK_SET); + data_offset = get4(); + i = get4(); // bytes count + width = get2(); + height = get2(); + + // Data integrity check + if (width < 1 || width > 16000 || height < 1 || height > 16000 || + i < (width * height) || i > (2 * width * height)) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + switch (tiff_bps = i * 8 / (width * height)) + { + case 8: + load_raw = &LibRaw::eight_bit_load_raw; + break; + case 10: + load_raw = &LibRaw::nokia_load_raw; + break; + case 0: + throw LIBRAW_EXCEPTION_IO_CORRUPT; + break; + } + raw_height = height + (top_margin = i / (width * tiff_bps / 8) - height); + mask[0][3] = 1; + filters = 0x61616161; + } + else if (!memcmp(head, "DSC-Image", 9)) + parse_rollei(); + else if (!memcmp(head, "PWAD", 4)) + parse_sinar_ia(); + else if (!memcmp(head, "\0MRM", 4)) + parse_minolta(0); + else if (!memcmp(head, "FOVb", 4)) + { + parse_x3f(); /* Does nothing if USE_X3FTOOLS is not defined */ + } + else if (!memcmp(head, "CI", 2)) + parse_cine(); +#ifdef USE_6BY9RPI + else if (!memcmp(head, "BRCM", 4)) { + fseek(ifp, 0, SEEK_SET); + strcpy(make, "RaspberryPi"); + strcpy(model, "Pi"); + parse_raspberrypi(); + } +#endif + else if (!memcmp(head + 4, "ftypcrx ", 8)) + { + int err; + unsigned long long szAtomList; + short nesting = -1; + short nTrack = -1; + short TrackType; + char AtomNameStack[129]; + strcpy(make, "Canon"); + + szAtomList = ifp->size(); + err = parseCR3(0ULL, szAtomList, nesting, AtomNameStack, nTrack, TrackType); + libraw_internal_data.unpacker_data.crx_track_count = nTrack; + if ((err == 0 || err == -14) && + nTrack >= 0) // no error, or too deep nesting + selectCRXTrack(); + } + + if (dng_version) + { + if (fsize64 > LIBRAW_MAX_DNG_RAW_FILE_SIZE) + throw LIBRAW_EXCEPTION_TOOBIG; + } + else + { + if (fsize64 > LIBRAW_MAX_NONDNG_RAW_FILE_SIZE) + throw LIBRAW_EXCEPTION_TOOBIG; + } + + if (make[0] == 0) + for (zero_fsize = i = 0; i < (int)camera_count; i++) + if (fsize == (int)table[i].fsize) + { + strcpy(make, table[i].t_make); + strcpy(model, table[i].t_model); + flip = table[i].flags >> 2; + zero_is_bad = table[i].flags & 2; + data_offset = table[i].offset == 0xffff ? 0 : table[i].offset; + raw_width = table[i].rw; + raw_height = table[i].rh; + left_margin = table[i].lm; + top_margin = table[i].tm; + width = raw_width - left_margin - table[i].rm; + height = raw_height - top_margin - table[i].bm; + filters = 0x1010101U * table[i].cf; + colors = 4 - !((filters & filters >> 1) & 0x5555); + load_flags = table[i].lf & 0xff; + if (table[i].lf & 0x100) /* Monochrome sensor dump */ + { + colors = 1; + filters = 0; + } + switch (tiff_bps = (fsize - data_offset) * 8 / (raw_width * raw_height)) + { + case 6: + load_raw = &LibRaw::minolta_rd175_load_raw; + ilm.CameraMount = LIBRAW_MOUNT_Minolta_A; + break; + case 8: + load_raw = &LibRaw::eight_bit_load_raw; + break; + case 10: + if ((fsize - data_offset) / raw_height * 3 >= raw_width * 4) + { + load_raw = &LibRaw::android_loose_load_raw; + break; + } + else if (load_flags & 1) + { + load_raw = &LibRaw::android_tight_load_raw; + break; + } + case 12: + load_flags |= 128; + load_raw = &LibRaw::packed_load_raw; + break; + case 16: + order = 0x4949 | 0x404 * (load_flags & 1); + tiff_bps -= load_flags >> 4; + tiff_bps -= load_flags = load_flags >> 1 & 7; + load_raw = table[i].offset == 0xffff + ? &LibRaw::unpacked_load_raw_reversed + : &LibRaw::unpacked_load_raw; + } + maximum = (1 << tiff_bps) - (1 << table[i].max); + break; + } + if (zero_fsize) + fsize = 0; + if (make[0] == 0 && fsize64 < 25000000LL) + parse_smal(0, flen); + if (make[0] == 0) + { + parse_jpeg(0); +#ifdef USE_6BY9RPI + if (!(strncmp(model, "ov", 2) && strncmp(model, "RP_", 3) && strncmp(model, "imx477", 6))) { + //Assume that this isn't a raw unless the header can be found + is_raw = 0; + + if (!strncasecmp(model, "RP_testc",8) + || !strncasecmp(model, "imx477", 6) // from PyDNG + || !strncasecmp(model, "RP_imx477",9)) { + const long offsets[] = { + //IMX477 offsets + 3375104, //2028x1080 12bit + 4751360, //2028x1520 12bit + 18711040, //4056x3040 12bit + 1015808, //1012x760 10bit + -1 //Marker for end of table + }; + int offset_idx; + for (offset_idx=0; offsets[offset_idx]!=-1; offset_idx++) { + if(!fseek (ifp, -offsets[offset_idx], SEEK_END) && + fread (head, 1, 32, ifp) && !strncmp(head,"BRCM", 4)) { + fseek(ifp, -32, SEEK_CUR); + strcpy (make, "RaspberryPi"); + strcpy(model, "RP_imx477"); // Force single model + black = (offset_idx == 3) ? 64 : 256; + parse_raspberrypi(); + break; + } + } + } + else if (!strncasecmp(model, "RP_imx", 6)) { + const long offsets[] = { + //IMX219 offsets + 10270208, //8MPix 3280x2464 + 2678784, //1920x1080 + 2628608, //1640x1232 + 1963008, //1640x922 + 1233920, //1280x720 + 445440, //640x480 + -1 //Marker for end of table + }; + int offset_idx; + for (offset_idx = 0; offsets[offset_idx] != -1; offset_idx++) { + if (!fseek(ifp, -offsets[offset_idx], SEEK_END) && + fread(head, 1, 32, ifp) && !strncmp(head, "BRCM", 4)) { + + fseek(ifp, -32, SEEK_CUR); + strcpy(make, "RaspberryPi"); + black = 66; + parse_raspberrypi(); + break; + } + } + } + else if (!strncasecmp(model, "RP_OV", 5) || !strncasecmp(model, "ov5647", 6)) { + const long offsets[] = { + 6404096, //5MPix 2592x1944 + 2717696, //1920x1080 + 1625600, //1296x972 + 1233920, //1296x730 + 445440, //640x480 + -1 //Marker for end of table + }; + int offset_idx; + for (offset_idx = 0; offsets[offset_idx] != -1; offset_idx++) { + if (!fseek(ifp, -offsets[offset_idx], SEEK_END) && + fread(head, 1, 32, ifp) && !strncmp(head, "BRCM", 4)) { + fseek(ifp, -32, SEEK_CUR); + strcpy(make, "RaspberryPi"); + strcpy(model, "ov5647"); // Force single model + width = raw_width; + //Defaults + raw_width = 2611; + filters = 0x16161616; + black = 16; + parse_raspberrypi(); + break; + } + } + } + }// else is_raw = 0; +#else + fseek(ifp, 0, SEEK_END); + int sz = ftell(ifp); + if (!strncmp(model, "RP_imx219", 9) && sz >= 0x9cb600 && + !fseek(ifp, -0x9cb600, SEEK_END) && fread(head, 1, 0x20, ifp) && + !strncmp(head, "BRCM", 4)) + { + strcpy(make, "Broadcom"); + strcpy(model, "RPi IMX219"); + if (raw_height > raw_width) + flip = 5; + data_offset = ftell(ifp) + 0x8000 - 0x20; + parse_broadcom(); + black = 66; + maximum = 0x3ff; + load_raw = &LibRaw::broadcom_load_raw; + thumb_offset = 0; + thumb_length = sz - 0x9cb600 - 1; + } + else if (!(strncmp(model, "ov5647", 6) && strncmp(model, "RP_OV5647", 9)) && + sz >= 0x61b800 && !fseek(ifp, -0x61b800, SEEK_END) && + fread(head, 1, 0x20, ifp) && !strncmp(head, "BRCM", 4)) + { + strcpy(make, "Broadcom"); + if (!strncmp(model, "ov5647", 6)) + strcpy(model, "RPi OV5647 v.1"); + else + strcpy(model, "RPi OV5647 v.2"); + if (raw_height > raw_width) + flip = 5; + data_offset = ftell(ifp) + 0x8000 - 0x20; + parse_broadcom(); + black = 16; + maximum = 0x3ff; + load_raw = &LibRaw::broadcom_load_raw; + thumb_offset = 0; + thumb_length = sz - 0x61b800 - 1; + } + else + is_raw = 0; +#endif + } + + // make sure strings are terminated + desc[511] = artist[63] = make[63] = model[63] = model2[63] = 0; + + for (i = 0; i < int(sizeof CorpTable / sizeof *CorpTable); i++) + { + if (strcasestr(make, CorpTable[i].CorpName)) + { /* Simplify company names */ + maker_index = CorpTable[i].CorpId; + break; + } + } + + if (makeIs(LIBRAW_CAMERAMAKER_HMD_Global) && !strncasecmp(model, "Nokia", 5)) { + maker_index = LIBRAW_CAMERAMAKER_Nokia; + } else if (makeIs(LIBRAW_CAMERAMAKER_JK_Imaging) && !strncasecmp(model, "Kodak", 5)) { + maker_index = LIBRAW_CAMERAMAKER_Kodak; + } else if (makeIs(LIBRAW_CAMERAMAKER_Ricoh) && !strncasecmp(model, "PENTAX", 6)) { + maker_index = LIBRAW_CAMERAMAKER_Pentax; + } + + for (i = 0; i < int(sizeof CorpTable / sizeof *CorpTable); i++) { + if (maker_index == (unsigned)CorpTable[i].CorpId) { + strcpy(make, CorpTable[i].CorpName); + break; + } + } + + if ((makeIs(LIBRAW_CAMERAMAKER_Kodak) || makeIs(LIBRAW_CAMERAMAKER_Leica)) && + ((cp = strcasestr(model, " DIGITAL CAMERA")) || + (cp = strstr(model, "FILE VERSION")))) { + *cp = 0; + } + + remove_trailing_spaces(make, sizeof(make)); + remove_trailing_spaces(model, sizeof(model)); + + i = int(strbuflen(make)); /* Remove make from model */ + if (!strncasecmp(model, make, i) && model[i++] == ' ') + memmove(model, model + i, 64 - i); + + if (makeIs(LIBRAW_CAMERAMAKER_Fujifilm) && !strncmp(model, "FinePix", 7)) { + memmove(model, model + 7, strlen(model) - 6); + if (model[0] == ' ') { + memmove(model, model + 1, strlen(model)); + } + } else if ((makeIs(LIBRAW_CAMERAMAKER_Kodak) || makeIs(LIBRAW_CAMERAMAKER_Konica)) && + !strncmp(model, "Digital Camera ", 15)) { + memmove(model, model + 15, strlen(model) - 14); + } + + desc[511] = artist[63] = make[63] = model[63] = model2[63] = 0; + if (!is_raw) + goto notraw; + + if (!height) + height = raw_height; + if (!width) + width = raw_width; + + identify_finetune_pentax(); + + + if (dng_version) + { + if (filters == UINT_MAX) + filters = 0; + if (!filters) + colors = tiff_samples; + switch (tiff_compress) + { + case 0: // Compression not set, assuming uncompressed + case 1: + // Uncompressed float: decoder set in apply_tiff for valid files; not set for non-valid with sampleformat==3 + if ((load_raw != &LibRaw::uncompressed_fp_dng_load_raw) && (tiff_sampleformat != 3)) + load_raw = &LibRaw::packed_dng_load_raw; + break; + case 7: + load_raw = &LibRaw::lossless_dng_load_raw; + break; + case 8: + if (tiff_sampleformat == 3 && tiff_bps > 8 && (tiff_bps % 8 == 0) && tiff_bps <= 32) + load_raw = &LibRaw::deflate_dng_load_raw; + else if((tiff_sampleformat == 0 || tiff_sampleformat == 1) && tiff_bps>=8 && tiff_bps <=16) + load_raw = &LibRaw::deflate_dng_load_raw; + break; +#ifdef USE_GPRSDK + case 9: + load_raw = &LibRaw::vc5_dng_load_raw_placeholder; + break; +#endif +#ifdef USE_DNGSDK + case 52546: + load_raw = &LibRaw::jxl_dng_load_raw_placeholder; + break; +#endif + case 34892: + load_raw = &LibRaw::lossy_dng_load_raw; + break; + default: + load_raw = 0; + } + GetNormalizedModel(); + if (makeIs(LIBRAW_CAMERAMAKER_Leica)) { + if (!strcmp(model, "SL2")) + height -= 3; + if (!strncasecmp(model, "Q2 MONO",7)) + height -= 18; + } + + else if (makeIs(LIBRAW_CAMERAMAKER_Olympus) && + (OlyID == OlyID_STYLUS_1) && // don't use normalized_model below, it is 'Stylus 1' + (strchr(model+6, 's') || + strchr(model+6, 'S'))) + { + width -= 16; + } + goto dng_skip; + } + + if (makeIs(LIBRAW_CAMERAMAKER_Canon) && !fsize && tiff_bps != 15) + { + bool fromtable = false; + if (!load_raw) + load_raw = &LibRaw::lossless_jpeg_load_raw; + for (i = 0; i < int(sizeof canon / sizeof *canon); i++) + if (raw_width == canon[i][0] && raw_height == canon[i][1]) + { + width = raw_width - (left_margin = canon[i][2]); + height = raw_height - (top_margin = canon[i][3]); + width -= canon[i][4]; + height -= canon[i][5]; + mask[0][1] = canon[i][6]; + mask[0][3] = -canon[i][7]; + mask[1][1] = canon[i][8]; + mask[1][3] = -canon[i][9]; + if (canon[i][10]) + filters = canon[i][10] * 0x01010101U; + fromtable = true; + } + if ((unique_id | 0x20000ULL) == + 0x2720000ULL) // "PowerShot G11", "PowerShot S90": 0x2700000, 0x2720000 + // possibly "PowerShot SX120 IS" (if not chdk hack?): 0x2710000 + { + left_margin = 8; + top_margin = 16; + } + if(!fromtable && imCanon.AverageBlackLevel) // not known, but metadata known + { + FORC4 cblack[c] = imCanon.ChannelBlackLevel[c]; + black = cblack[4] = cblack[5] = 0; + // Prevent automatic BL calculation + mask[0][3] = 1; + mask[0][1] = 2; + + if ((imCanon.SensorWidth == raw_width) && + (imCanon.SensorHeight == raw_height)) + { + left_margin = (imCanon.DefaultCropAbsolute.l+1) & 0xfffe; // round to 2 + width = imCanon.DefaultCropAbsolute.r - left_margin; + top_margin = (imCanon.DefaultCropAbsolute.t +1) & 0xfffe; + height = imCanon.DefaultCropAbsolute.b - top_margin; + } + } + } + + identify_finetune_by_filesize(fsize); + + if (!strcmp(model, "KAI-0340") && find_green(16, 16, 3840, 5120) < 25) + { + height = 480; + top_margin = filters = 0; + strcpy(model, "C603"); + } + + GetNormalizedModel(); + + identify_finetune_dcr(head, fsize, flen); + + /* Early reject for damaged images */ + if (!load_raw || height < 22 || width < 22 || + (tiff_bps > 16 && + (load_raw != &LibRaw::deflate_dng_load_raw && + load_raw != &LibRaw::uncompressed_fp_dng_load_raw)) || + tiff_samples > 4 || colors > 4 || + colors < 1 + /* alloc in unpack() may be fooled by size adjust */ + || ((int)width + (int)left_margin > 65535) || + ((int)height + (int)top_margin > 65535)) + { + is_raw = 0; + RUN_CALLBACK(LIBRAW_PROGRESS_IDENTIFY, 1, 2); + return; + } + if (!model[0]) + { + sprintf(model, "%dx%d", width, height); + strcpy(normalized_model, model); + } + + if (!(imgdata.rawparams.options & LIBRAW_RAWOPTIONS_ZEROFILTERS_FOR_MONOCHROMETIFFS) && + (filters == UINT_MAX)) // Default dcraw behaviour + filters = 0x94949494; + else if (filters == UINT_MAX) + { + if (tiff_nifds > 0 && tiff_samples == 1) + { + colors = 1; + filters = 0; + } + else + filters = 0x94949494; + } + + if (thumb_offset && !thumb_height) + { + fseek(ifp, thumb_offset, SEEK_SET); + if (ljpeg_start(&jh, 1)) + { + thumb_width = jh.wide; + thumb_height = jh.high; + } + } + +dng_skip: + if (dng_version) + identify_process_dng_fields(); + + /* Early reject for damaged images again (after dng fields processing) */ + if (!load_raw || height < 22 || width < 22 || + (tiff_bps > 16 && + (load_raw != &LibRaw::deflate_dng_load_raw && + load_raw != &LibRaw::uncompressed_fp_dng_load_raw )) || + ((load_raw == &LibRaw::deflate_dng_load_raw || load_raw == &LibRaw::uncompressed_fp_dng_load_raw) + && (tiff_bps < 16 || tiff_bps > 32 || (tiff_bps % 8)) ) + ||tiff_samples > 4 || colors > 4 || colors < 1) + { + is_raw = 0; + RUN_CALLBACK(LIBRAW_PROGRESS_IDENTIFY, 1, 2); + return; + } + { + // Check cam_mul range + int cmul_ok = 1; + FORCC if (cam_mul[c] <= 0.001f) cmul_ok = 0; + ; + + if (cmul_ok) + { + double cmin = cam_mul[0], cmax; + double cnorm[4]; + FORCC cmin = MIN(cmin, cam_mul[c]); + FORCC cnorm[c] = cam_mul[c] / cmin; + cmax = cmin = cnorm[0]; + FORCC + { + cmin = MIN(cmin, cnorm[c]); + cmax = MIN(cmax, cnorm[c]); + } + if (cmin <= 0.01f || cmax > 100.f) + cmul_ok = false; + } + if (!cmul_ok) + { + if (cam_mul[0] > 0) + cam_mul[0] = 0; + cam_mul[3] = 0; + } + } + if ((use_camera_matrix & (((use_camera_wb || dng_version)?1:0) | 0x2)) && + cmatrix[0][0] > 0.125) + { + memcpy(rgb_cam, cmatrix, sizeof cmatrix); + raw_color = 0; + } + if (raw_color && !CM_found) + CM_found = adobe_coeff(maker_index, normalized_model); + else if ((imgdata.color.cam_xyz[0][0] < 0.01) && !CM_found) + CM_found = adobe_coeff(maker_index, normalized_model, 1); + + if (load_raw == &LibRaw::kodak_radc_load_raw) + if ((raw_color) && !CM_found) + CM_found = adobe_coeff(LIBRAW_CAMERAMAKER_Apple, "Quicktake"); + + if ((maker_index != LIBRAW_CAMERAMAKER_Unknown) && normalized_model[0]) + SetStandardIlluminants (maker_index, normalized_model); + + // Clear erroneous fuji_width if not set through parse_fuji or for DNG + if (fuji_width && !dng_version && + !(imgdata.process_warnings & LIBRAW_WARN_PARSEFUJI_PROCESSED)) + fuji_width = 0; + + if (fuji_width) + { + fuji_width = width >> int(!fuji_layout); + filters = fuji_width & 1 ? 0x94949494 : 0x49494949; + width = (height >> fuji_layout) + fuji_width; + height = width - 1; + pixel_aspect = 1; + // Prevent incorrect-sized fuji-rotated files + if (INT64(width)*INT64(height) > INT64(raw_width) * INT64(raw_height) * 8LL) + is_raw = 0; + } + else + { + if (raw_height < height) + raw_height = height; + if (raw_width < width) + raw_width = width; + } + if (!tiff_bps) + tiff_bps = 12; + if (!maximum) + { + maximum = (1 << tiff_bps) - 1; + if (maximum < 0x10000 && curve[maximum] > 0 && + load_raw == &LibRaw::sony_arw2_load_raw) + maximum = curve[maximum]; + } + if (maximum > 0xffff) + maximum = 0xffff; + if (!load_raw || height < 22 || width < 22 || + (tiff_bps > 16 && + (load_raw != &LibRaw::deflate_dng_load_raw && + load_raw != &LibRaw::uncompressed_fp_dng_load_raw)) || + tiff_samples > 6 || colors > 4) + is_raw = 0; + + if (raw_width < 22 || raw_width > 64000 || raw_height < 22 || + pixel_aspect < 0.1 || pixel_aspect > 10. || + raw_height > 64000) + is_raw = 0; + if(raw_width <= left_margin || raw_height <= top_margin) + is_raw = 0; + if (dng_version && (tiff_samples < 1 || tiff_samples > 4)) + is_raw = 0; // we do not handle DNGs with more than 4 values per pixel + +#ifdef NO_JPEG + if (load_raw == &LibRaw::kodak_jpeg_load_raw || + load_raw == &LibRaw::lossy_dng_load_raw) + { + is_raw = 0; + imgdata.process_warnings |= LIBRAW_WARN_NO_JPEGLIB; + } +#endif + if (!cdesc[0]) + strcpy(cdesc, colors == 3 ? "RGBG" : "GMCY"); + if (!raw_height) + raw_height = height; + if (!raw_width) + raw_width = width; + if (filters > 999 && colors == 3) + filters |= ((filters >> 2 & 0x22222222) | (filters << 2 & 0x88888888)) & + filters << 1; +notraw: + if (flip == (int)UINT_MAX) + flip = tiff_flip; + if (flip == (int)UINT_MAX) + flip = 0; + + // Convert from degrees to bit-field if needed + if (flip > 89 || flip < -89) + { + switch ((flip + 3600) % 360) + { + case 270: + flip = 5; + break; + case 180: + flip = 3; + break; + case 90: + flip = 6; + break; + } + } + + if (pana_bpp) + imgdata.color.raw_bps = pana_bpp; + else if ((load_raw == &LibRaw::phase_one_load_raw) || + (load_raw == &LibRaw::phase_one_load_raw_s) || + (load_raw == &LibRaw::phase_one_load_raw_c)) + imgdata.color.raw_bps = ph1.format; + else + imgdata.color.raw_bps = tiff_bps; + + RUN_CALLBACK(LIBRAW_PROGRESS_IDENTIFY, 1, 2); +} + +void LibRaw::identify_process_dng_fields() +{ + if (!dng_version) return; + + // Cleanup inset_crops if set by makernotes parser + imgdata.sizes.raw_inset_crops[0].cleft = imgdata.sizes.raw_inset_crops[0].ctop = + imgdata.sizes.raw_inset_crops[1].cleft = imgdata.sizes.raw_inset_crops[1].ctop = 0xffff; + imgdata.sizes.raw_inset_crops[0].cwidth = imgdata.sizes.raw_inset_crops[0].cheight = + imgdata.sizes.raw_inset_crops[1].cwidth = imgdata.sizes.raw_inset_crops[1].cheight = 0; + + + int c; + { + /* copy DNG data from per-IFD field to color.dng */ + int iifd = find_ifd_by_offset(data_offset); + int pifd = find_ifd_by_offset(thumb_offset); + + +#define IFDCOLORINDEX(ifd, subset, bit) \ + (tiff_ifd[ifd].dng_color[subset].parsedfields & bit) \ + ? ifd \ + : ((tiff_ifd[0].dng_color[subset].parsedfields & bit) ? 0 : -1) + +#define IFDLEVELINDEX(ifd, bit) \ + (tiff_ifd[ifd].dng_levels.parsedfields & bit) \ + ? ifd \ + : ((tiff_ifd[0].dng_levels.parsedfields & bit) ? 0 : -1) + +#define COPYARR(to, from) memmove(&to, &from, sizeof(from)) + + if (iifd < (int)tiff_nifds && iifd >= 0) + { + int sidx; + // Per field, not per structure + if (!(imgdata.rawparams.options & LIBRAW_RAWOPTIONS_DONT_CHECK_DNG_ILLUMINANT)) + { + int illidx[2], cmidx[2], calidx[2], abidx; + for (int i = 0; i < 2; i++) + { + illidx[i] = IFDCOLORINDEX(iifd, i, LIBRAW_DNGFM_ILLUMINANT); + cmidx[i] = IFDCOLORINDEX(iifd, i, LIBRAW_DNGFM_COLORMATRIX); + calidx[i] = IFDCOLORINDEX(iifd, i, LIBRAW_DNGFM_CALIBRATION); + } + abidx = IFDLEVELINDEX(iifd, LIBRAW_DNGFM_ANALOGBALANCE); + // Data found, all in same ifd, illuminants are inited + if (illidx[0] >= 0 && illidx[0] < (int)tiff_nifds && + illidx[0] == illidx[1] && illidx[0] == cmidx[0] && + illidx[0] == cmidx[1] && + tiff_ifd[illidx[0]].dng_color[0].illuminant > 0 && + tiff_ifd[illidx[0]].dng_color[1].illuminant > 0) + { + sidx = illidx[0]; // => selected IFD + double cc[4][4], cm[4][3], cam_xyz[4][3]; + // CM -> Color Matrix + // CC -> Camera calibration + for (int j = 0; j < 4; j++) + for (int i = 0; i < 4; i++) + cc[j][i] = i == j; + int colidx = -1; + + // IS D65 here? + for (int i = 0; i < 2; i++) + { + if (tiff_ifd[sidx].dng_color[i].illuminant == LIBRAW_WBI_D65) + { + colidx = i; + break; + } + } + + // Other daylight-type ill + if (colidx < 0) + for (int i = 0; i < 2; i++) + { + int ill = tiff_ifd[sidx].dng_color[i].illuminant; + if (ill == LIBRAW_WBI_Daylight || ill == LIBRAW_WBI_D55 || + ill == LIBRAW_WBI_D75 || ill == LIBRAW_WBI_D50 || + ill == LIBRAW_WBI_Flash) + { + colidx = i; + break; + } + } + if (colidx >= 0) // Selected + { + // Init camera matrix from DNG + FORCC for (int j = 0; j < 3; j++) cm[c][j] = + tiff_ifd[sidx].dng_color[colidx].colormatrix[c][j]; + + if (calidx[colidx] == sidx) + { + for (int i = 0; i < colors && i < 4; i++) + FORCC + cc[i][c] = tiff_ifd[sidx].dng_color[colidx].calibration[i][c]; + } + + if (abidx == sidx) + for (int i = 0; i < colors && i < 4; i++) + FORCC cc[i][c] *= tiff_ifd[sidx].dng_levels.analogbalance[i]; + int j; + FORCC for (int i = 0; i < 3; i++) + for (cam_xyz[c][i] = j = 0; j < colors && j < 4; j++) + cam_xyz[c][i] += + cc[c][j] * cm[j][i]; // add AsShotXY later * xyz[i]; + cam_xyz_coeff(cmatrix, cam_xyz); + } + } + } + + bool noFujiDNGCrop = makeIs(LIBRAW_CAMERAMAKER_Fujifilm) + && (!strcmp(normalized_model, "S3Pro") + || !strcmp(normalized_model, "S5Pro") + || !strcmp(normalized_model, "S2Pro")); + + if (!noFujiDNGCrop) // Promote DNG Crops to raw_inset_crops + { + sidx = IFDLEVELINDEX(iifd, LIBRAW_DNGFM_CROPORIGIN); + int sidx2 = IFDLEVELINDEX(iifd, LIBRAW_DNGFM_CROPSIZE); + if (sidx >= 0 && sidx == sidx2 && + tiff_ifd[sidx].dng_levels.default_crop[2] > 0 && + tiff_ifd[sidx].dng_levels.default_crop[3] > 0) + { + int lm = tiff_ifd[sidx].dng_levels.default_crop[0]; + int tm = tiff_ifd[sidx].dng_levels.default_crop[1]; + int ww = tiff_ifd[sidx].dng_levels.default_crop[2]; + int hh = tiff_ifd[sidx].dng_levels.default_crop[3]; + if ((lm + ww < int(raw_width) + int(left_margin)) + && (tm + hh < int(raw_height) + int(top_margin))) // Crop data is correct + { + imgdata.sizes.raw_inset_crops[0].cleft = left_margin + lm; + imgdata.sizes.raw_inset_crops[0].cwidth = ww; + imgdata.sizes.raw_inset_crops[0].ctop = top_margin + tm; + imgdata.sizes.raw_inset_crops[0].cheight = hh; + + int sidx3 = IFDLEVELINDEX(iifd, LIBRAW_DNGFM_USERCROP); + if (sidx3 >= 0 && sidx3 == sidx) // No need to check values range, it is checked at parse + { + int dt = int(imgdata.sizes.raw_inset_crops[0].cheight * tiff_ifd[sidx].dng_levels.user_crop[0]); + int dl = int(imgdata.sizes.raw_inset_crops[0].cwidth * tiff_ifd[sidx].dng_levels.user_crop[1]); + int db = int(imgdata.sizes.raw_inset_crops[0].cheight * tiff_ifd[sidx].dng_levels.user_crop[2]); + int dr = int(imgdata.sizes.raw_inset_crops[0].cwidth * tiff_ifd[sidx].dng_levels.user_crop[3]); + + int dh = db - dt; + int dw = dr - dl; + + if (dh > 0 && dw > 0 + && dh < imgdata.sizes.raw_inset_crops[0].cheight // No need to repeat crop for 0,0,1,1 + && dw < imgdata.sizes.raw_inset_crops[0].cwidth) + { + imgdata.sizes.raw_inset_crops[1].cleft = imgdata.sizes.raw_inset_crops[0].cleft + dl; + imgdata.sizes.raw_inset_crops[1].cwidth = dw; + imgdata.sizes.raw_inset_crops[1].ctop = imgdata.sizes.raw_inset_crops[0].ctop + dt; + imgdata.sizes.raw_inset_crops[1].cheight = dh; + } + } + + } + } + } + if (!(imgdata.color.dng_color[0].parsedfields & + LIBRAW_DNGFM_FORWARDMATRIX)) // Not set already (Leica makernotes) + { + sidx = IFDCOLORINDEX(iifd, 0, LIBRAW_DNGFM_FORWARDMATRIX); + if (sidx >= 0) + COPYARR(imgdata.color.dng_color[0].forwardmatrix, + tiff_ifd[sidx].dng_color[0].forwardmatrix); + } + if (!(imgdata.color.dng_color[1].parsedfields & + LIBRAW_DNGFM_FORWARDMATRIX)) // Not set already (Leica makernotes) + { + sidx = IFDCOLORINDEX(iifd, 1, LIBRAW_DNGFM_FORWARDMATRIX); + if (sidx >= 0) + COPYARR(imgdata.color.dng_color[1].forwardmatrix, + tiff_ifd[sidx].dng_color[1].forwardmatrix); + } + for (int ss = 0; ss < 2; ss++) + { + sidx = IFDCOLORINDEX(iifd, ss, LIBRAW_DNGFM_COLORMATRIX); + if (sidx >= 0) + COPYARR(imgdata.color.dng_color[ss].colormatrix, + tiff_ifd[sidx].dng_color[ss].colormatrix); + + sidx = IFDCOLORINDEX(iifd, ss, LIBRAW_DNGFM_CALIBRATION); + if (sidx >= 0) + COPYARR(imgdata.color.dng_color[ss].calibration, + tiff_ifd[sidx].dng_color[ss].calibration); + + sidx = IFDCOLORINDEX(iifd, ss, LIBRAW_DNGFM_ILLUMINANT); + if (sidx >= 0) + imgdata.color.dng_color[ss].illuminant = + tiff_ifd[sidx].dng_color[ss].illuminant; + } + // Levels + sidx = IFDLEVELINDEX(iifd, LIBRAW_DNGFM_ANALOGBALANCE); + if (sidx >= 0) + COPYARR(imgdata.color.dng_levels.analogbalance, + tiff_ifd[sidx].dng_levels.analogbalance); + + sidx = IFDLEVELINDEX(iifd, LIBRAW_DNGFM_BASELINEEXPOSURE); + if (sidx >= 0) + imgdata.color.dng_levels.baseline_exposure = + tiff_ifd[sidx].dng_levels.baseline_exposure; + + sidx = IFDLEVELINDEX(iifd, LIBRAW_DNGFM_WHITE); + if (sidx >= 0 && tiff_ifd[sidx].dng_levels.dng_whitelevel[0]) + COPYARR(imgdata.color.dng_levels.dng_whitelevel, + tiff_ifd[sidx].dng_levels.dng_whitelevel); + else if (tiff_ifd[iifd].sample_format <= 2 && tiff_ifd[iifd].bps > 0 && tiff_ifd[iifd].bps < 32) + FORC4 + imgdata.color.dng_levels.dng_whitelevel[c] = (1 << tiff_ifd[iifd].bps) - 1; + + + + sidx = IFDLEVELINDEX(iifd, LIBRAW_DNGFM_ASSHOTNEUTRAL); + if (sidx >= 0) + { + COPYARR(imgdata.color.dng_levels.asshotneutral, + tiff_ifd[sidx].dng_levels.asshotneutral); + if (imgdata.color.dng_levels.asshotneutral[0]) + { + cam_mul[3] = 0; + FORCC + if (fabs(imgdata.color.dng_levels.asshotneutral[c]) > 0.0001) + cam_mul[c] = 1 / imgdata.color.dng_levels.asshotneutral[c]; + } + } + sidx = IFDLEVELINDEX(iifd, LIBRAW_DNGFM_BLACK); + if (sidx >= 0) + { + imgdata.color.dng_levels.dng_fblack = + tiff_ifd[sidx].dng_levels.dng_fblack; + imgdata.color.dng_levels.dng_black = + tiff_ifd[sidx].dng_levels.dng_black; + COPYARR(imgdata.color.dng_levels.dng_cblack, + tiff_ifd[sidx].dng_levels.dng_cblack); + COPYARR(imgdata.color.dng_levels.dng_fcblack, + tiff_ifd[sidx].dng_levels.dng_fcblack); + } + + + if (pifd >= 0) + { + sidx = IFDLEVELINDEX(pifd, LIBRAW_DNGFM_PREVIEWCS); + if (sidx >= 0) + imgdata.color.dng_levels.preview_colorspace = + tiff_ifd[sidx].dng_levels.preview_colorspace; + } + sidx = IFDLEVELINDEX(iifd, LIBRAW_DNGFM_OPCODE2); + if (sidx >= 0) + meta_offset = tiff_ifd[sidx].opcode2_offset; + + sidx = IFDLEVELINDEX(iifd, LIBRAW_DNGFM_LINTABLE); + INT64 linoff = -1; + int linlen = 0; + if (sidx >= 0) + { + linoff = tiff_ifd[sidx].lineartable_offset; + linlen = tiff_ifd[sidx].lineartable_len; + } + + if (linoff >= 0 && linlen > 0) + { + INT64 pos = ftell(ifp); + fseek(ifp, linoff, SEEK_SET); + linear_table(linlen); + fseek(ifp, pos, SEEK_SET); + } + // Need to add curve too + } + /* Copy DNG black level to LibRaw's */ + if (load_raw == &LibRaw::lossy_dng_load_raw) + { + maximum = 0xffff; + FORC4 imgdata.color.linear_max[c] = imgdata.color.dng_levels.dng_whitelevel[c] = 0xffff; + } + else + { + maximum = imgdata.color.dng_levels.dng_whitelevel[0]; + } + black = imgdata.color.dng_levels.dng_black; + if (tiff_samples == 2 && + !imgdata.color.dng_levels.dng_cblack[2] && + !imgdata.color.dng_levels.dng_cblack[3] && + (imgdata.color.dng_levels.dng_cblack[4] == 1) && + (imgdata.color.dng_levels.dng_cblack[5] == 1) + && (imgdata.color.dng_levels.dng_cblack[LIBRAW_CBLACK_SIZE - 1] == tiff_samples) + ) { + black = imgdata.color.dng_levels.dng_cblack[shot_select]; + imgdata.color.dng_levels.dng_cblack[0] = imgdata.color.dng_levels.dng_cblack[1] = 0; + imgdata.color.dng_levels.dng_cblack[4] = imgdata.color.dng_levels.dng_cblack[5] = 0; + imgdata.color.dng_levels.dng_fcblack[0] = imgdata.color.dng_levels.dng_fcblack[1] = 0.0f; + imgdata.color.dng_levels.dng_fcblack[4] = imgdata.color.dng_levels.dng_fcblack[5] = 0.0f; + } + else if (tiff_samples == 2 && imgdata.color.dng_levels.dng_cblack[4] * imgdata.color.dng_levels.dng_cblack[5] * tiff_samples + == imgdata.color.dng_levels.dng_cblack[LIBRAW_CBLACK_SIZE - 1]) + { + unsigned ff = filters; + if (filters > 999 && colors == 3) + filters |= ((filters >> 2 & 0x22222222) | (filters << 2 & 0x88888888)) & + filters << 1; + + /* Special case, Fuji SuperCCD dng */ + int csum[4] = { 0,0,0,0 }, ccount[4] = { 0,0,0,0 }; + int i = 6 + shot_select; + for (unsigned row = 0; row < imgdata.color.dng_levels.dng_cblack[4]; row++) + for (unsigned col = 0; col < imgdata.color.dng_levels.dng_cblack[5]; col++) + { + csum[FC(row, col)] += imgdata.color.dng_levels.dng_cblack[i]; + ccount[FC(row, col)]++; + i += tiff_samples; + } + for (int q = 0; q < 4; q++) + if (ccount[q]) + imgdata.color.dng_levels.dng_cblack[q] += csum[q] / ccount[q]; + imgdata.color.dng_levels.dng_cblack[4] = imgdata.color.dng_levels.dng_cblack[5] = 0; + filters = ff; + } + else if (tiff_samples > 2 && tiff_samples <= 4 && imgdata.color.dng_levels.dng_cblack[4] * imgdata.color.dng_levels.dng_cblack[5] * tiff_samples + == imgdata.color.dng_levels.dng_cblack[LIBRAW_CBLACK_SIZE - 1]) + { + /* Special case, per_channel blacks in RepeatDim, average for per-channel */ + int csum[4] = { 0,0,0,0 }, ccount[4] = { 0,0,0,0 }; + int i = 6; + for (unsigned row = 0; row < imgdata.color.dng_levels.dng_cblack[4]; row++) + for (unsigned col = 0; col < imgdata.color.dng_levels.dng_cblack[5]; col++) + for (unsigned q = 0; q < tiff_samples && q < 4; q++) + { + csum[q] += imgdata.color.dng_levels.dng_cblack[i]; + ccount[q]++; + i++; + } + for (int q = 0; q < 4; q++) + if (ccount[q]) + imgdata.color.dng_levels.dng_cblack[q] += csum[q] / ccount[q]; + imgdata.color.dng_levels.dng_cblack[4] = imgdata.color.dng_levels.dng_cblack[5] = 0; + } + + memmove(cblack, imgdata.color.dng_levels.dng_cblack, sizeof(cblack)); + + if (iifd < (int)tiff_nifds && iifd >= 0) + { + int sidx = IFDLEVELINDEX(iifd, LIBRAW_DNGFM_LINEARRESPONSELIMIT); + if (sidx >= 0) + { + imgdata.color.dng_levels.LinearResponseLimit = + tiff_ifd[sidx].dng_levels.LinearResponseLimit; + if (imgdata.color.dng_levels.LinearResponseLimit > 0.1 && + imgdata.color.dng_levels.LinearResponseLimit <= 1.0) + { + // And approx promote it to linear_max: + int bl4 = 0, bl64 = 0; + for (int chan = 0; chan < colors && chan < 4; chan++) + bl4 += cblack[chan]; + bl4 /= LIM(colors, 1, 4); + + if (cblack[4] * cblack[5] > 0) + { + unsigned cnt = 0; + for (unsigned q = 0; q < 4096 && q < cblack[4] * cblack[5]; q++) + { + bl64 += cblack[q + 6]; + cnt++; + } + bl64 /= LIM(cnt, 1, 4096); + } + int rblack = black + bl4 + bl64; + for (int chan = 0; chan < colors && chan < 4; chan++) + imgdata.color.linear_max[chan] = + (maximum - rblack) * + imgdata.color.dng_levels.LinearResponseLimit + + rblack; + if (imgdata.color.linear_max[1] && !imgdata.color.linear_max[3]) + imgdata.color.linear_max[3] = imgdata.color.linear_max[1]; + } + } + } + } +} + +void LibRaw::identify_finetune_pentax() +{ + if (dng_version && data_offset) + { + for(int i = 0; i < (int)tiff_nifds; i++) + if (tiff_ifd[i].offset == data_offset) + { + if (tiff_ifd[i].phint == 34892) return; // Linear DNG made from Pentax source + break; + } + } + + if (makeIs(LIBRAW_CAMERAMAKER_Pentax) || + makeIs(LIBRAW_CAMERAMAKER_Samsung)) { + if (height == 2624 && + width == 3936) // Pentax K10D, Samsung GX10; + { + height = 2616; + width = 3896; + } + if (height == 3136 && + width == 4864) // Pentax K20D, Samsung GX20; + { + height = 3124; + width = 4688; + filters = 0x16161616; + } + } + + if (makeIs(LIBRAW_CAMERAMAKER_Pentax)) { + if ((width == 4352) && + ((unique_id == PentaxID_K_r) || + (unique_id == PentaxID_K_x))) + { + width = 4309; + filters = 0x16161616; + } + if ((width >= 4960) && + ((unique_id == PentaxID_K_5) || + (unique_id == PentaxID_K_5_II) || + (unique_id == PentaxID_K_5_II_s))) + { + left_margin = 10; + width = 4950; + filters = 0x16161616; + } + if ((width == 6080) && (unique_id == PentaxID_K_70)) + { + height = 4016; + top_margin = 32; + width = 6020; + left_margin = 60; + } + if ((width == 4736) && (unique_id == PentaxID_K_7)) + { + height = 3122; + width = 4684; + filters = 0x16161616; + top_margin = 2; + } + if ((width == 6080) && (unique_id == PentaxID_K_3_II)) + { + left_margin = 4; + width = 6040; + } + if ((width == 6304) && (unique_id == PentaxID_K_3_III)) // From DNG ActiveArea + { + left_margin = 26; + width = 6224; + top_margin = 34; + height = 4160; + } + if ((width == 6112) && (unique_id == PentaxID_KP)) + { + // From DNG, maybe too strict + left_margin = 54; + top_margin = 28; + width = 6028; + height = raw_height - top_margin; + } + if ((width == 6080) && (unique_id == PentaxID_K_3)) + { + left_margin = 4; + width = 6040; + } + if ((width == 7424) && (unique_id == PentaxID_645D)) + { + height = 5502; + width = 7328; + filters = 0x61616161; + top_margin = 29; + left_margin = 48; + } + } + else if (makeIs(LIBRAW_CAMERAMAKER_Ricoh) && + (height == 3014) && (width == 4096)) // Ricoh GX200 + width = 4014; +} + +void LibRaw::identify_finetune_by_filesize(int fsize) +{ + + if (fsize == 4771840) + { // hack Nikon 3mpix: E880, E885, E990, E995; + // Olympus C-3030Z + if (!timestamp && nikon_e995()) + strcpy(model, "E995"); + } + else if (fsize == 2940928) + { // hack Nikon 2mpix: E2100, E2500 + if (!timestamp && !nikon_e2100()) + strcpy(model, "E2500"); + } + else if (fsize == 4775936) + { // hack Nikon 3mpix: E3100, E3200, E3500, E3700; + // Pentax "Optio 33WR"; + // Olympus C-740UZ + if (!timestamp) + nikon_3700(); + } + else if (fsize == 5869568) + { // hack Nikon 4mpix: E4300; + // hack Minolta "DiMAGE Z2" + if (!timestamp && minolta_z2()) + { + maker_index = LIBRAW_CAMERAMAKER_Minolta; + strcpy(make, "Minolta"); + strcpy(model, "DiMAGE Z2"); + } + } +} + +void LibRaw::identify_finetune_dcr(char head[64], int fsize, int flen) +{ + static const short pana[][6] = { + // raw_width, raw_height, left_margin, top_margin, width_increment, + // height_increment + {3130, 1743, 4, 0, -6, 0}, /* 00 */ + {3130, 2055, 4, 0, -6, 0}, /* 01 */ + {3130, 2319, 4, 0, -6, 0}, /* 02 DMC-FZ8 */ + {3170, 2103, 18, 0, -42, 20}, /* 03 */ + {3170, 2367, 18, 13, -42, -21}, /* 04 */ + {3177, 2367, 0, 0, -1, 0}, /* 05 DMC-L1 */ + {3304, 2458, 0, 0, -1, 0}, /* 06 DMC-FZ30 */ + {3330, 2463, 9, 0, -5, 0}, /* 07 DMC-FZ18 */ + {3330, 2479, 9, 0, -17, 4}, /* 08 */ + {3370, 1899, 15, 0, -44, 20}, /* 09 */ + {3370, 2235, 15, 0, -44, 20}, /* 10 */ + {3370, 2511, 15, 10, -44, -21}, /* 11 */ + {3690, 2751, 3, 0, -8, -3}, /* 12 DMC-FZ50 */ + {3710, 2751, 0, 0, -3, 0}, /* 13 DMC-L10 */ + {3724, 2450, 0, 0, 0, -2}, /* 14 */ + {3770, 2487, 17, 0, -44, 19}, /* 15 */ + {3770, 2799, 17, 15, -44, -19}, /* 16 */ + {3880, 2170, 6, 0, -6, 0}, /* 17 DMC-LX1 */ + {4060, 3018, 0, 0, 0, -2}, /* 18 DMC-FZ35, DMC-FZ38 */ + {4290, 2391, 3, 0, -8, -1}, /* 19 DMC-LX2 */ + {4330, 2439, 17, 15, -44, -19}, /* 20 "D-LUX 3" */ + {4508, 2962, 0, 0, -3, -4}, /* 21 */ + {4508, 3330, 0, 0, -3, -6}, /* 22 */ + {10480, 7794, 0, 0, -2, 0}, /* 23: G9 in high-res */ + }; + int i,c; + struct jhead jh; + + if (makeIs(LIBRAW_CAMERAMAKER_Canon) + && ( !tiff_flip || unique_id == CanonID_EOS_40D) + && !(imgdata.rawparams.options & LIBRAW_RAWOPTIONS_CANON_IGNORE_MAKERNOTES_ROTATION) + && imCanon.MakernotesFlip) + { + tiff_flip = imCanon.MakernotesFlip; + } + + else if (makeIs(LIBRAW_CAMERAMAKER_Nikon)) + { + if (!load_raw) + load_raw = &LibRaw::packed_load_raw; + if (model[0] == 'E') // Nikon E8800, E8700, E8400, E5700, E5400, E5000, + // others are diag hacks? + load_flags |= !data_offset << 2 | 2; + } + /* Set parameters based on camera name (for non-DNG files). */ + + /* Always 512 for arw2_load_raw */ + else if (makeIs(LIBRAW_CAMERAMAKER_Sony) && + (raw_width > 3888) && !black && !cblack[0]) + { + black = (load_raw == &LibRaw::sony_arw2_load_raw) + ? 512 + : (128 << (tiff_bps - 12)); + } + + if (is_foveon) { + if (height * 2 < width) + pixel_aspect = 0.5; + if (height > width) + pixel_aspect = 2; + filters = 0; + + } + else if (makeIs(LIBRAW_CAMERAMAKER_Pentax)) { + if ((unique_id == PentaxID_K_1) || + (unique_id == PentaxID_K_1_Mark_II)) { + top_margin = 18; + height = raw_height - top_margin; + if (raw_width == 7392) { + left_margin = 6; + width = 7376; + } + + } + else if (unique_id == PentaxID_Optio_S_V101) { // (fsize == 3178560) + cam_mul[0] *= 4; + cam_mul[2] *= 4; + + } + else if (unique_id == PentaxID_Optio_33WR) { // (fsize == 4775936) + flip = 1; + filters = 0x16161616; + + } + else if (unique_id == PentaxID_staristD) { + load_raw = &LibRaw::unpacked_load_raw; + /* data_error = -1; */ /* No way to know why data_error was raised in dcraw.c, looks not needed esp. for unpacked_load_raw */ + } + else if (unique_id == PentaxID_staristDS) { + height -= 2; + } + + } + else if (makeIs(LIBRAW_CAMERAMAKER_Canon)) { + if (tiff_bps == 15) { // Canon sRAW + if (width == 3344) + width = 3272; + else if (width == 3872) + width = 3866; + + if (height > width) { + SWAP(height, width); + SWAP(raw_height, raw_width); + } + if (width == 7200 && + height == 3888) { // Canon EOS 5DS (R); + raw_width = width = 6480; + raw_height = height = 4320; + } + filters = 0; + tiff_samples = colors = 3; + load_raw = &LibRaw::canon_sraw_load_raw; + } + + if (!strcmp(normalized_model, "PowerShot 600")) { + height = 613; + width = 854; + raw_width = 896; + colors = 4; + filters = 0xe1e4e1e4; + load_raw = &LibRaw::canon_600_load_raw; + + } + else if (!strcmp(normalized_model, "PowerShot A5") || + !strcmp(normalized_model, "PowerShot A5 Zoom")) { + height = 773; + width = 960; + raw_width = 992; + pixel_aspect = 256 / 235.0; + filters = 0x1e4e1e4e; + goto canon_a5; + + } + else if (!strcmp(normalized_model, "PowerShot A50")) { + height = 968; + width = 1290; + raw_width = 1320; + filters = 0x1b4e4b1e; + goto canon_a5; + + } + else if (!strcmp(normalized_model, "PowerShot Pro70")) { + height = 1024; + width = 1552; + filters = 0x1e4b4e1b; + canon_a5: + colors = 4; + tiff_bps = 10; + load_raw = &LibRaw::packed_load_raw; + load_flags = 40; + + } + else if (!strcmp(normalized_model, "PowerShot Pro90 IS") || + !strcmp(normalized_model, "PowerShot G1")) { + colors = 4; + filters = 0xb4b4b4b4; + + } + else if (!strcmp(normalized_model, "PowerShot A610")) { // chdk hack + if (canon_s2is()) { + strcpy(model + 10, "S2 IS"); + strcpy(normalized_model + 10, "S2 IS"); + } + + } + else if (!strcmp(normalized_model, "PowerShot SX220 HS")) { // chdk hack + mask[1][3] = -4; + top_margin = 16; + left_margin = 92; + + } + else if (!strcmp(normalized_model, "PowerShot S120")) { // chdk hack + raw_width = 4192; + raw_height = 3062; + width = 4022; + height = 3016; + mask[0][0] = top_margin = 31; + mask[0][2] = top_margin + height; + left_margin = 120; + mask[0][1] = 23; + mask[0][3] = 72; + + } + else if (!strcmp(normalized_model, "PowerShot G16")) { + mask[0][0] = 0; + mask[0][2] = 80; + mask[0][1] = 0; + mask[0][3] = 16; + top_margin = 29; + left_margin = 120; + width = raw_width - left_margin - 48; + height = raw_height - top_margin - 14; + + } + else if (!strcmp(normalized_model, "PowerShot SX50 HS")) { + top_margin = 17; + } + + } + + else if (makeIs(LIBRAW_CAMERAMAKER_Nikon)) { + if (!strcmp(model, "D1")) + { + imgdata.other.analogbalance[0] = cam_mul[0]; + imgdata.other.analogbalance[2] = cam_mul[2]; + imgdata.other.analogbalance[1] = imgdata.other.analogbalance[3] = + cam_mul[1]; + cam_mul[0] = cam_mul[1] = cam_mul[2] = 1.0f; + } + + else if (!strcmp(model, "D1X")) + { + width -= 4; + pixel_aspect = 0.5; + } + else if (!strcmp(model, "D40X") || + !strcmp(model, "D60") || + !strcmp(model, "D80") || + !strcmp(model, "D3000")) + { + height -= 3; + width -= 4; + } + else if (!strcmp(model, "D3") || + !strcmp(model, "D3S") || + !strcmp(model, "D700")) + { + width -= 4; + left_margin = 2; + } + else if (!strcmp(model, "D3100")) + { + width -= 28; + left_margin = 6; + } + else if (!strcmp(model, "D5000") || + !strcmp(model, "D90")) + { + width -= 42; + } + else if (!strcmp(model, "D5100") || + !strcmp(model, "D7000") || + !strcmp(model, "COOLPIX A")) + { + width -= 44; + } + else if (!strcmp(model, "D3200") || + !strcmp(model, "D600") || + !strcmp(model, "D610") || + !strncmp(model, "D800", 4)) // Nikons: D800, D800E + { + width -= 46; + } + else if (!strcmp(model, "D4") || + !strcmp(model, "Df")) + { + width -= 52; + left_margin = 2; + } + else if (!strcmp(model, "D500")) + { + // Empty - to avoid width-1 below + } + else if (!strncmp(model, "D40", 3) || + !strncmp(model, "D50", 3) || + !strncmp(model, "D70", 3)) + { + width--; + } + else if (!strcmp(model, "D100")) + { + if (load_flags) // compressed NEF + raw_width = (width += 3) + 3; + } + else if (!strcmp(model, "D200")) + { + left_margin = 1; + width -= 4; + filters = 0x94949494; + } + else if (!strncmp(model, "D2H", 3)) // Nikons: D2H, D2Hs + { + left_margin = 6; + width -= 14; + } + else if (!strncmp(model, "D2X", 3)) // Nikons: D2X, D2Xs + { + if (width == 3264) // in-camera Hi-speed crop: On + width -= 32; + else + width -= 8; + } + else if (!strncmp(model, "D300", 4)) // Nikons: D300, D300s + { + width -= 32; + } + else if (raw_width == 4032) // Nikon "COOLPIX P7700", "COOLPIX P7800", + // "COOLPIX P330", "COOLPIX P340" + { + if (!strcmp(normalized_model, "COOLPIX P7700")) + { + maximum = 65504; + load_flags = 0; + } + else if (!strcmp(normalized_model, "COOLPIX P7800")) + { + maximum = 65504; + load_flags = 0; + } + else if (!strcmp(model, "COOLPIX P340")) + { + load_flags = 0; + } + } + else if (!strncmp(model, "COOLPIX P", 9) && + raw_width != 4032) // Nikon "COOLPIX P1000", "COOLPIX P6000", + // "COOLPIX P7000", "COOLPIX P7100" + { + load_flags = 24; + filters = 0x94949494; + /* the following 'if' is most probably obsolete, because we now read black + * level from metadata */ + if ((model[9] == '7') && /* P7000, P7100 */ + ((iso_speed >= 400) || (iso_speed == 0)) && + !strstr(software, "V1.2")) /* v. 1.2 seen for P7000 only */ + black = 255; + } + else if (!strncmp(model, "COOLPIX B700", 12)) + { + load_flags = 24; + } + else if (!strncmp(model, "1 ", + 2)) // Nikons: "1 AW1", "1 J1", "1 J2", "1 J3", "1 J4", + // "1 J5", "1 S1", "1 S2", "1 V1", "1 V2", "1 V3" + { + height -= 2; + } + else if (fsize == 1581060) // hack Nikon 1mpix: E900 + { + simple_coeff(3); + pre_mul[0] = 1.2085f; + pre_mul[1] = 1.0943f; + pre_mul[3] = 1.1103f; + } + else if ((fsize == 4771840) && // hack Nikon 3mpix: E880, E885, E990 + strcmp(model, "E995")) // but not E995 + { + filters = 0xb4b4b4b4; + simple_coeff(3); + pre_mul[0] = 1.196f; + pre_mul[1] = 1.246f; + pre_mul[2] = 1.018f; + } + else if ((fsize == 4775936) && // hack Nikon 3mpix: E3100, E3200, E3500 + (atoi(model + 1) < 3700)) // but not E3700; + { + filters = 0x49494949; + } + else if (fsize == 5869568) // hack Nikon 4mpix: E4300; + { + load_flags = 6; + } + else if (!strcmp(model, "E2500")) + { + height -= 2; + load_flags = 6; + colors = 4; + filters = 0x4b4b4b4b; + } + } + + else if (makeIs(LIBRAW_CAMERAMAKER_Olympus)) { + if (OlyID == OlyID_C_740UZ) { // (fsize == 4775936) + i = find_green(12, 32, 1188864, 3576832); + c = find_green(12, 32, 2383920, 2387016); + if (abs(i) < abs(c)) { + SWAP(i, c); + load_flags = 24; + } + if (i < 0) + filters = 0x61616161; + } + else if (OlyID == OlyID_C_770UZ) { + height = 1718; + width = 2304; + filters = 0x16161616; + load_raw = &LibRaw::packed_load_raw; + load_flags = 30; + } + else { + height += height & 1; + if (exif_cfa) + filters = exif_cfa; + + if (width == 4100) // Olympus E-PL2, E-PL1, E-P2, E-P1, E-620, E-600, E-5, E-30; + width -= 4; + + if (width == 4080) // Olympus E-PM1, E-PL3, E-P3; + width -= 24; + + if (width == 10400) // Olympus PEN-F, E-M1-II, E-M1-III, E-M1X, OM-1 + width -= 12; + + if (width == 8200) // E-M1-III in 50Mp mode, E-M1X + width -= 30; + + if (width == 8180) // OM-1 in 50Mp + width -= 10; + + if (width == 9280) { // Olympus E-M5 Mark II; + width -= 6; + height -= 6; + } + + if (load_raw == &LibRaw::unpacked_load_raw) { + load_flags = 4; + if (imOly.ValidBits == 10) load_flags += 2; + } + tiff_bps = imOly.ValidBits; + + if ((OlyID == OlyID_E_300) || + (OlyID == OlyID_E_500)) { + width -= 20; + if (load_raw == &LibRaw::unpacked_load_raw) { + maximum = 0xfc3; + memset(cblack, 0, sizeof cblack); + } + } + else if (OlyID == OlyID_STYLUS_1) { + width -= 16; + maximum = 0xfff; + + } + else if (OlyID == OlyID_E_330) { + width -= 30; + if (load_raw == &LibRaw::unpacked_load_raw) + maximum = 0xf79; + + } + else if (OlyID == OlyID_SP_550UZ) { + thumb_length = flen - (thumb_offset = 0xa39800); + thumb_height = 480; + thumb_width = 640; + + } + else if (OlyID == OlyID_TG_4) { + width -= 16; + + } + else if ((OlyID == OlyID_TG_5) || + (OlyID == OlyID_TG_6)) { + width -= 26; + } + } + + } + else if (makeIs(LIBRAW_CAMERAMAKER_RoverShot) && + (fsize == 6291456)) { // RoverShot 3320AF + fseek(ifp, 0x300000, SEEK_SET); + if ((order = guess_byte_order(0x10000)) == 0x4d4d) + { + height -= (top_margin = 16); + width -= (left_margin = 28); + maximum = 0xf5c0; + strcpy(make, "ISG"); + maker_index = LIBRAW_CAMERAMAKER_ISG; + model[0] = 0; + } + + } + else if (makeIs(LIBRAW_CAMERAMAKER_Fujifilm)) { + if (!imFuji.RAFDataGeneration && (raw_width == 2944)) // S2Pro + { + height = 2144; + width = 2880; + flip = 6; + } + else if (load_raw != &LibRaw::packed_load_raw && + strncmp(model, "X-", 2) && + filters >= 1000) // Bayer and not an X-model + maximum = (is_raw == 2 && shot_select) ? 0x2f00 : 0x3e00; + + if (!FujiCropMode && imFuji.RAFDataGeneration && (imFuji.RAFDataGeneration != 4096)) + { + width = imFuji.RAFData_ImageSizeTable[0]; + height = imFuji.RAFData_ImageSizeTable[1]; + } + else if (FujiCropMode == 1) // FF crop on GFX + { + width = raw_width; + height = raw_height; + } + // Do we need set height = raw_height for CropMode == 2 for all cameras?? + else if (FujiCropMode == 4) // electronic shutter, high speed mode (1.25x crop) + { + height = raw_height; + } + + top_margin = (raw_height >= height) ? (raw_height - height) >> 2 << 1 : 0; + left_margin = (raw_width >= width) ? (raw_width - width) >> 2 << 1 : 0; + + if (imFuji.RAFDataGeneration && (imFuji.RAFDataGeneration != 4096)) { + switch (raw_width) { + case 2944: // X-S1, X10, XF1 + filters = 0x16161616; + break; + case 4096: // X20, X30, XQ1, XQ2 + case 5120: // X-Pro1, X-E1, X-A1, X-A2, X-M1 + case 6048: // lossless compressed X100F, X-T2, X-T20, X-Pro2, X-H1, X-E3 + case 6160: // uncompressed (unpacked) X100F, X-T2, X-T20, X-Pro2, X-H1, X-E3 + left_margin = 0; + break; + case 4992: // X-E2S, X-E2, X-T10, X-T1, X100S, X100T, X70 + left_margin = 4; + break; + case 7872: // X-H2, full image + switch (FujiCropMode) + { + case 0: // no crop + top_margin = 6; + left_margin = 0; + width = 7752; + height = 5178; + break; + default: + /* try to guess from crop inset*/ + if (imgdata.sizes.raw_inset_crops[0].cwidth > 0 && imgdata.sizes.raw_inset_crops[0].cwidth <= raw_width && + imgdata.sizes.raw_inset_crops[0].cheight > 0 && imgdata.sizes.raw_inset_crops[0].cheight <= raw_height) + { + top_margin = imgdata.sizes.raw_inset_crops[0].ctop; + left_margin = imgdata.sizes.raw_inset_crops[0].cleft; + width = imgdata.sizes.raw_inset_crops[0].cwidth; + height = imgdata.sizes.raw_inset_crops[0].cheight; + } + break; + } + break; + case 6336: // X-H2S + switch (FujiCropMode) + { + case 0: // no crop + top_margin = 6; + left_margin = 0; + if(!strcasecmp(model,"X-S20")) + width = 6252; + else + width = 6264; + height = 4176; + break; + case 2: /* sports finder*/ + case 4: /* Electronic shutter crop */ + left_margin = 630; + top_margin = 0; + height = 3348; + width = 5004; + break; + default: + /* try to guess from crop inset*/ + if (imgdata.sizes.raw_inset_crops[0].cwidth > 0 && imgdata.sizes.raw_inset_crops[0].cwidth <= raw_width + && imgdata.sizes.raw_inset_crops[0].cheight > 0 && imgdata.sizes.raw_inset_crops[0].cheight <= raw_height) + { + top_margin = imgdata.sizes.raw_inset_crops[0].ctop; + left_margin = imgdata.sizes.raw_inset_crops[0].cleft; + width = imgdata.sizes.raw_inset_crops[0].cwidth; + height = imgdata.sizes.raw_inset_crops[0].cheight; + } + break; + } + break; + case 6384: // X-T3, X-T4, X100V, X-S10, X-T30, X-Pro3 + top_margin = 0; + switch (FujiCropMode) { + case 0: // no crop + left_margin = 0; + top_margin = 6; + width = 6246; + height = 4170; + break; + case 2: // sports finder mode + left_margin = 624; + width = 5004; + height = raw_height; + break; + case 4: // electronic shutter, high speed mode (1.25x crop) + left_margin = 624; + width = 5004; + break; + } + break; + case 6912: // GFX 50S, GFX 50R; FF crop + case 9216: // GFX 50S, GFX 50R; no crop + left_margin = 0; + top_margin = 0; + break; + case 8472: // GFX 50S II + left_margin = 0; + top_margin = 0; + width = raw_width - 192; + break; + case 9696: // GFX 100; FF crop + case 11808: // GFX 100; no crop + left_margin = 0; + width = raw_width - 146; + height = raw_height - 8; + top_margin = 2; + if (tiff_bps == 16) + maximum = 0xffff; + default: + /* insert model name-based width/height/margins/etc. assignments */ + break; + } + + } else if (!imFuji.RAFDataGeneration) { + switch (raw_width) { + case 2304: // S5100 + height -= (top_margin = 6); + break; + case 3328: // F550EXR, F600EXR, F770EXR, F800EXR, F900EXR, + // HS20EXR, HS30EXR, HS33EXR, HS50EXR + if ((width = raw_width - 66)) + left_margin = 34; + if (imgdata.sizes.raw_inset_crops[0].cleft == 8) // HS50EXR, F900EXR + { + left_margin = 0; + width += 2; + filters = 0x16161616; + } + break; + case 3664: // "HS10 HS11" + filters = 0x16161616; + break; + case 5504: // DBP for GX680 aka DX-2000 + +// 7712 2752 -> 5504 3856 +// width = 688; +// height = 30848; +// raw_width = 688; +// raw_height = 30848; + + left_margin = 32; // imgdata.sizes.raw_inset_crops[0].cleft + top_margin = 8; + width = raw_width - 2*left_margin; + height = raw_height - 2*top_margin; + + load_raw = &LibRaw::unpacked_load_raw_FujiDBP; + // maximum = 0x0fff; + filters = 0x16161616; + load_flags = 0; + flip = 6; + break; + default: + /* insert model name-based width/height/margins/etc. assignments */ + + /* raw_inset_crops default*/ + if (imgdata.sizes.raw_inset_crops[0].cwidth > 0 && imgdata.sizes.raw_inset_crops[0].cwidth <= raw_width && + imgdata.sizes.raw_inset_crops[0].cheight > 0 && imgdata.sizes.raw_inset_crops[0].cheight <= raw_height) + { + top_margin = imgdata.sizes.raw_inset_crops[0].ctop; + left_margin = imgdata.sizes.raw_inset_crops[0].cleft; + width = imgdata.sizes.raw_inset_crops[0].cwidth; + height = imgdata.sizes.raw_inset_crops[0].cheight; + } + break; + } + } + if (fuji_layout) + raw_width *= is_raw; + if (filters == 9) + FORC(36) + ((char *)xtrans)[c] = + xtrans_abs[(c / 6 + top_margin) % 6][(c + left_margin) % 6]; + } + + else if (makeIs(LIBRAW_CAMERAMAKER_Konica)) { + if (!strcmp(model, "KD-400Z")) { + height = 1711; // 1712 + width = 2312; + raw_width = 2336; + goto konica_400z; + } + else if (!strcmp(model, "KD-510Z")) { + goto konica_510z; + } + + } + else if (makeIs(LIBRAW_CAMERAMAKER_Minolta)) { + if (fsize == 5869568) { // hack "DiMAGE Z2" + load_flags = 30; + } + + if (imSony.prd_StorageMethod == LIBRAW_MINOLTA_UNPACKED) { + load_raw = &LibRaw::unpacked_load_raw; + } else if (imSony.prd_StorageMethod == LIBRAW_MINOLTA_PACKED) { + load_raw = &LibRaw::packed_load_raw; + } else if (!load_raw && (maximum = 0xfff)) { + load_raw = &LibRaw::unpacked_load_raw; + } + + if (imSony.prd_BayerPattern == LIBRAW_MINOLTA_G2BRG1) { + filters = 0x49494949; + } else if (imSony.prd_BayerPattern == LIBRAW_MINOLTA_RGGB) { + filters = 0x94949494; + } + + if (imSony.prd_Active_bps && imSony.prd_Total_bps) { + tiff_bps = imSony.prd_Active_bps; + } + + if (!strncmp(model, "DiMAGE G", 8)) // hack "DiMAGE G400", "DiMAGE G500", + // "DiMAGE G530", "DiMAGE G600" + { + if (model[8] == '4') // DiMAGE G400 + { + height = 1716; + width = 2304; + } + else if (model[8] == '5') // DiMAGE G500 / G530 + { + konica_510z: + height = 1956; + width = 2607; + raw_width = 2624; + } + else if (model[8] == '6') // DiMAGE G600 + { + height = 2136; + width = 2848; + } + data_offset += 14; + filters = 0x61616161; + konica_400z: + load_raw = &LibRaw::unpacked_load_raw; + maximum = 0x3df; + order = 0x4d4d; + } + + } + else if (makeIs(LIBRAW_CAMERAMAKER_Samsung)) { + if (raw_width == 4704) // Samsung NX100, NX10, NX11, + { + height -= top_margin = 8; + width -= 2 * (left_margin = 8); + load_flags = 32; + } + else if (!strcmp(model, "NX3000")) // Samsung NX3000; raw_width: 5600 + { + top_margin = 38; + left_margin = 92; + width = 5456; + height = 3634; + filters = 0x61616161; + colors = 3; + } + else if (raw_height == 3714) // Samsung NX2000, NX300M, NX300, NX30, + // "NX U" (aka: + // "EK-GN100", "EK-GN110", "EK-GN120", + // "EK-KN120", "Galaxy NX") + { + height -= top_margin = 18; + left_margin = raw_width - (width = 5536); + if (raw_width != 5600) + left_margin = top_margin = 0; + filters = 0x61616161; + colors = 3; + } + else if (raw_width == 5632) // Samsung NX1000, NX200, NX20, NX210 + { + order = 0x4949; + height = 3694; + top_margin = 2; + width = 5574 - (left_margin = 32 + tiff_bps); + if (tiff_bps == 12) + load_flags = 80; + } + else if (raw_width == 5664) // Samsung "NX mini" + { + height -= top_margin = 17; + left_margin = 96; + width = 5544; + filters = 0x49494949; + } + else if (raw_width == 6496) // Samsung NX1, NX500 + { + filters = 0x61616161; + if (!black && !cblack[0] && !cblack[1] && !cblack[2] && !cblack[3]) + black = 1 << (tiff_bps - 7); + } + else if (!strcmp(normalized_model, "EX1")) // Samsung EX1; raw_width: 3688 + { + order = 0x4949; + height -= 20; + top_margin = 2; + if ((width -= 6) > 3682) + { + height -= 10; + width -= 46; + top_margin = 8; + } + } + else if (!strcmp(normalized_model, "WB2000")) // Samsung WB2000; raw_width: 3728 + { + order = 0x4949; + height -= 3; + top_margin = 2; + if ((width -= 10) > 3718) + { + height -= 28; + width -= 56; + top_margin = 8; + } + } + else if (!strcmp(model, "WB550")) // Samsung WB550; raw_width: 4000 + { + order = 0x4949; + } + else if (!strcmp(model, "EX2F")) // Samsung EX2F; raw_width: 4176 + { + height = 3030; + width = 4040; + top_margin = 15; + left_margin = 24; + order = 0x4949; + filters = 0x49494949; + load_raw = &LibRaw::unpacked_load_raw; + } + } + + else if (makeIs(LIBRAW_CAMERAMAKER_ST_Micro) && !strcmp(model, "STV680 VGA")) + { + black = 16; + } + else if (!strcmp(model, "N95")) + { + height = raw_height - (top_margin = 2); + } + else if (!strcmp(model, "640x480")) + { + gamma_curve(0.45, 4.5, 1, 255); + } + else if (makeIs(LIBRAW_CAMERAMAKER_Hasselblad)) + { + if (load_raw == &LibRaw::lossless_jpeg_load_raw) + load_raw = &LibRaw::hasselblad_load_raw; + + if ((imHassy.SensorCode == 4) && !strncmp(model, "V96C", 4)) { // Hasselblad V96C + strcpy(model, "V96C"); + strcpy(normalized_model, model); + height -= (top_margin = 6); + width -= (left_margin = 3) + 7; + filters = 0x61616161; + + } + else if ((imHassy.SensorCode == 9) && imHassy.uncropped) { // various Hasselblad '-39' + height = 5444; + width = 7248; + top_margin = 4; + left_margin = 7; + filters = 0x61616161; + + } + else if ((imHassy.SensorCode == 13) && imHassy.uncropped) { // Hasselblad H4D-40, H5D-40 + height -= 84; + width -= 82; + top_margin = 4; + left_margin = 41; + filters = 0x61616161; + + } + else if ((imHassy.SensorCode == 11) && imHassy.uncropped) { // Hasselblad H5D-50 + height -= 84; + width -= 82; + top_margin = 4; + left_margin = 41; + filters = 0x61616161; + + } + else if ((imHassy.SensorCode == 15) && + !imHassy.SensorSubCode && // Hasselblad H5D-50c + imHassy.uncropped) { + left_margin = 52; + top_margin = 100; + width = 8272; + height = 6200; + black = 256; + + } + else if ((imHassy.SensorCode == 15) && + (imHassy.SensorSubCode == 2) && // various Hasselblad X1D cameras + imHassy.uncropped) { + top_margin = 96; + height -= 96; + left_margin = 48; + width -= 106; + maximum = 0xffff; + tiff_bps = 16; + + } + else if ((imHassy.SensorCode == 12) && imHassy.uncropped) { // Hasselblad H4D-60 + if (black > 500) { // (imHassy.format == LIBRAW_HF_FFF) + top_margin = 12; + left_margin = 44; + width = 8956; + height = 6708; + memset(cblack, 0, sizeof(cblack)); + black = 512; + } + else { // (imHassy.format == LIBRAW_HF_3FR) + top_margin = 8; + left_margin = 40; + width = 8964; + height = 6716; + black += load_flags = 256; + maximum = 0x8101; + } + + } + else if ((imHassy.SensorCode == 17) && imHassy.uncropped) { // Hasselblad H6D-100c, A6D-100c + left_margin = 64; + width = 11608; + top_margin = 108; + height = raw_height - top_margin; + } + else if ((imHassy.SensorCode == 20) && imHassy.uncropped) + { // Hasselblad X2D-100c + left_margin = 124; + width = 11664; + top_margin = 92; + height = raw_height - top_margin; + } + + if (tiff_samples > 1) + { + is_raw = tiff_samples + 1; + if (!shot_select && !half_size) + filters = 0; + } + } + else if (makeIs(LIBRAW_CAMERAMAKER_Sinar)) + { + if (!load_raw) + load_raw = &LibRaw::unpacked_load_raw; + if (is_raw > 1 && !shot_select) + filters = 0; + maximum = 0x3fff; + } + + if (load_raw == &LibRaw::sinar_4shot_load_raw) + { + if (is_raw > 1 && !shot_select) + filters = 0; + } + else if (makeIs(LIBRAW_CAMERAMAKER_Leaf)) + { + maximum = 0x3fff; + fseek(ifp, data_offset, SEEK_SET); + if (ljpeg_start(&jh, 1) && jh.bits == 15) + maximum = 0x1fff; + if (tiff_samples > 1) + filters = 0; + if (tiff_samples > 1 || tile_length < raw_height) + { + load_raw = &LibRaw::leaf_hdr_load_raw; + raw_width = tile_width; + } + if ((width | height) == 2048) + { + if (tiff_samples == 1) + { + filters = 1; + strcpy(cdesc, "RBTG"); + strcpy(model, "CatchLight"); + strcpy(normalized_model, model); + top_margin = 8; + left_margin = 18; + height = 2032; + width = 2016; + } + else + { + strcpy(model, "DCB2"); + strcpy(normalized_model, model); + top_margin = 10; + left_margin = 16; + height = 2028; + width = 2022; + } + } + else if (width + height == 3144 + 2060) + { + if (!model[0]) + { + strcpy(model, "Cantare"); + strcpy(normalized_model, model); + } + if (width > height) + { + top_margin = 6; + left_margin = 32; + height = 2048; + width = 3072; + filters = 0x61616161; + } + else + { + left_margin = 6; + top_margin = 32; + width = 2048; + height = 3072; + filters = 0x16161616; + } + if (!cam_mul[0] || model[0] == 'V') + filters = 0; + else + is_raw = tiff_samples; + } + else if (width == 2116) // Leaf "Valeo 6" + { + strcpy(model, "Valeo 6"); + strcpy(normalized_model, model); + height -= 2 * (top_margin = 30); + width -= 2 * (left_margin = 55); + filters = 0x49494949; + } + else if (width == 3171) // Leaf "Valeo 6" + { + strcpy(model, "Valeo 6"); + strcpy(normalized_model, model); + height -= 2 * (top_margin = 24); + width -= 2 * (left_margin = 24); + filters = 0x16161616; + } + } + else if (makeIs(LIBRAW_CAMERAMAKER_Panasonic)) + { + if (raw_width > 0 && + ((flen - data_offset) / (raw_width * 8 / 7) == raw_height)) + load_raw = &LibRaw::panasonic_load_raw; + if (!load_raw) + { + load_raw = &LibRaw::unpacked_load_raw; + load_flags = 4; + } + zero_is_bad = 1; + if ((height += 12) > raw_height) + height = raw_height; + for (i = 0; i < int(sizeof pana / sizeof *pana); i++) + if (raw_width == pana[i][0] && raw_height == pana[i][1]) + { + left_margin = pana[i][2]; + top_margin = pana[i][3]; + width += pana[i][4]; + height += pana[i][5]; + } + if (!tiff_bps && pana_bpp >= 12 && pana_bpp <= 14) + tiff_bps = pana_bpp; + + if (!strcmp(model, "DC-LX100M2") && raw_height == 3568 && raw_width == 4816 && filters == 3) + filters = 4; + + filters = 0x01010101U * + (uchar) "\x94\x61\x49\x16"[((filters - 1) ^ (left_margin & 1) ^ + (top_margin << 1)) & + 3]; + + } + else if (makeIs(LIBRAW_CAMERAMAKER_Contax) && + !strcmp(model, "N Digital")) { + height = 2047; + width = 3072; + filters = 0x61616161; + data_offset = 0x1a00; + load_raw = &LibRaw::packed_load_raw; + + } + else if (makeIs(LIBRAW_CAMERAMAKER_Sony)) { + if (!strcmp(model, "DSC-F828")) { // Sony DSC-F828 + width = 3288; + left_margin = 5; + mask[1][3] = -17; + data_offset = 862144; + load_raw = &LibRaw::sony_load_raw; + filters = 0x9c9c9c9c; + colors = 4; + strcpy(cdesc, "RGBE"); + + } + else if (!strcmp(model, "DSC-V3")) { // Sony DSC-V3 + width = 3109; + left_margin = 59; + mask[0][1] = 9; + data_offset = 787392; + load_raw = &LibRaw::sony_load_raw; + + } + else if ((unique_id == SonyID_ILCE_7RM5) || (unique_id == SonyID_ILCE_7CR)) + { + if (raw_width == 6304) + { + /* nothing: APS-C Uncompressed, handled in open_datastream*/ + } + else if (raw_width == 6656) /* 7RM5 Lossy compressed, medium */ + { + width = 6272; + height = 4180; + } + else if (raw_width == 9728) // FF, Lossless compresssed + { + width = 9566; + height = 6374; + } + else if (raw_width == 5120) // APS-C??/Lossy-Small? + { + width = 4776; + height = 3180; + } + else if (raw_width == 9600) + { + width = raw_width - 36; + } + else + { + width = raw_width - 32; // fallback + imgdata.process_warnings |= LIBRAW_WARN_VENDOR_CROP_SUGGESTED; + + } + } + else if (raw_width == 3984) + { // Sony DSC-R1; + width = 3925; + order = 0x4d4d; + + } + else if (raw_width == 4288) { // Sony ILCE-7S, ILCE-7SM2, ILCE-7SM3, DSLR-A700, DSLR-A500; + width -= 32; + } + else if (raw_width == 4600) { // Sony DSLR-A290, DSLR-A350, DSLR-A380; + if (!strcmp(model, "DSLR-A350")) + height -= 4; + black = 0; + + } + else if (raw_width == 4928) { + // Sony DSLR-A580, NEX-C3, SLT-A35, DSC-HX99, DSC-HX95, SLT-A55, + // NEX-5N, SLT-A37, SLT-A57, NEX-F3, NEX-6, NEX-5R, NEX-3N, NEX-5T; + if (height < 3280) + width -= 8; + + } + else if (raw_width == 5504) { + // Sony ILCE-3000, SLT-A58, DSC-RX100M3, ILCE-QX1, + // DSC-RX10M4, DSC-RX100M6, DSC-RX100, DSC-RX100M2, DSC-RX10, + // ILCE-5000, DSC-RX100M4, DSC-RX10M2, DSC-RX10M3, + // DSC-RX100M5, DSC-RX100M5A; + width -= height > 3664 ? 8 : 32; + + } + else if (raw_width == 6048) { + // Sony SLT-A65, DSC-RX1, SLT-A77, DSC-RX1, ILCA-77M2, + // ILCE-7M3, NEX-7, SLT-A99, ILCE-7, DSC-RX1R, ILCE-6000, + // ILCE-5100, ILCE-7M2, ILCA-68, ILCE-6300, ILCE-9, + // ILCE-6500, ILCE-6400; + width -= 24; + if (strstr(normalized_model, "RX1") || + strstr(normalized_model, "A99")) + width -= 6; + + } + else if (raw_width == 7392) { // Sony ILCE-7R; + width -= 30; + + } + else if (raw_width == 8000) { + // Sony ILCE-7RM2, ILCE-7RM2, ILCE-7RM3, DSC-RX1RM2, ILCA-99M2; + width -= 32; + + } + else if (raw_width == 9600) { // Sony ILCE-7RM4 && 7RM5 + width -= 32; + + } + else if (unique_id == SonyID_ZV_E1) + { + if (raw_width == 4608 && raw_height == 3072) // SonyID_ZV_E1 + { + width = 4256; + height = 2846; + } + } + else if(unique_id == SonyID_ILCE_1) + { + if (raw_width == 8704 && raw_height == 6144) // ILCE-1 FF@Compressed + { + width = 8660; + height = 5784; + } + else if (raw_width == 8672) // FF uncompressed/lossy + { + width -= 12; + } + else if (raw_width == 6144 && raw_height == 4096) // APSC/Lossless + { + width = 5636; + height = 3768; + } + else if (raw_width == 5664) // APS-C/Uncompressed or lossy + { + width -= 28; + } + else if (raw_width == 5632) // Lossy/Medium + { + width -= 4; + height = 3756; + } + else if (raw_width == 4608) // Lossy/small + { + width = 4332; + height = 2892; + } + else + imgdata.process_warnings |= LIBRAW_WARN_VENDOR_CROP_SUGGESTED; + + /* need samples for lossy small/medium w/ APC crop*/ + } + else if ((unique_id == SonyID_ILCE_7M4)|| (unique_id == SonyID_ILCE_7CM2)) + { + if (raw_width == 7168 && raw_height == 5120) + { + width = 7028; + height = 4688; + } + else if (raw_width == 5120) // Lossy/Medium + { + width = 4624; + height = 3080; + } + else if (raw_width == 3584) // Lossy/Small + { + width = 3516; + height = 2344; + } + else if (raw_width == 7040) // FF uncompressed/lossy + { + width -= 12; + } + else + imgdata.process_warnings |= LIBRAW_WARN_VENDOR_CROP_SUGGESTED; + /* FIXME: need APS-C samples, both losslesscompressed and uncompressed or lossy */ + } + else if (unique_id == SonyID_ILCE_6700) + { + if (raw_width == 6656) + { + width = 6272; + height = 4168; + } + else if (raw_width == 6272) // APS-C uncompressed + { + width = raw_width - 32; + } + else // fallback + { + width = raw_width - 32; + } + } + + else if (!strcmp(model, "DSLR-A100")) { + if (width == 3880) { + height--; + width = ++raw_width; + } + else { + height -= 4; + width -= 4; + order = 0x4d4d; + load_flags = 2; + } + filters = 0x61616161; + } + } + + else if (!strcmp(model, "PIXL")) { + height -= top_margin = 4; + width -= left_margin = 32; + gamma_curve(0, 7, 1, 255); + + } + else if (makeIs(LIBRAW_CAMERAMAKER_Kodak)) { + + if (!strncasecmp(model, "EasyShare", 9)) { + data_offset = data_offset < 0x15000 ? 0x15000 : 0x17000; + load_raw = &LibRaw::packed_load_raw; + + } + else if (!strcmp(model, "C603") || + !strcmp(model, "C330") || + !strcmp(model, "12MP")) { + order = 0x4949; + if (filters && data_offset) { + fseek(ifp, data_offset < 4096 ? 168 : 5252, SEEK_SET); + read_shorts(curve, 256); + } + else + gamma_curve(0, 3.875, 1, 255); + + load_raw = filters ? &LibRaw::eight_bit_load_raw + : strcmp(model, "C330") ? &LibRaw::kodak_c603_load_raw + : &LibRaw::kodak_c330_load_raw; + load_flags = tiff_bps > 16; + tiff_bps = 8; + + } + else { + if (!strncmp(model, "NC2000", 6) || + !strncmp(model, "EOSDCS", 6) || + !strncmp(model, "DCS4", 4)) { + width -= 4; + left_margin = 2; + + } + else if (!strcmp(model, "DCS660M")) { + black = 214; + + } + else if (!strcmp(model, "EOS D2000C")) { + filters = 0x61616161; + if (!black) black = curve[200]; + } + + if (filters == UINT_MAX) filters = 0x61616161; + + if (!strcmp(model + 4, "20X")) + strcpy(cdesc, "MYCY"); + if (!strcmp(model, "DC25")) { + data_offset = 15424; + } + + if (!strncmp(model, "DC2", 3)) { + raw_height = 2 + (height = 242); + if (!strncmp(model, "DC290", 5)) + iso_speed = 100; + if (!strncmp(model, "DC280", 5)) + iso_speed = 70; + if (flen < 100000) { + raw_width = 256; + width = 249; + pixel_aspect = (4.0 * height) / (3.0 * width); + } + else { + raw_width = 512; + width = 501; + pixel_aspect = (493.0 * height) / (373.0 * width); + } + top_margin = left_margin = 1; + colors = 4; + filters = 0x8d8d8d8d; + simple_coeff(1); + pre_mul[1] = 1.179f; + pre_mul[2] = 1.209f; + pre_mul[3] = 1.036f; + load_raw = &LibRaw::eight_bit_load_raw; + } + else if (!strcmp(model, "DC40")) { + height = 512; + width = 768; + data_offset = 1152; + load_raw = &LibRaw::kodak_radc_load_raw; + tiff_bps = 12; + FORC4 cam_mul[c] = 1.0f; + + } + else if (!strcmp(model, "DC50")) { + height = 512; + width = 768; + iso_speed = 84; + data_offset = 19712; + load_raw = &LibRaw::kodak_radc_load_raw; + FORC4 cam_mul[c] = 1.0f; + + } + else if (!strcmp(model, "DC120")) { + raw_height = height = 976; + raw_width = width = 848; + iso_speed = 160; + pixel_aspect = height / 0.75 / width; + load_raw = tiff_compress == 7 ? &LibRaw::kodak_jpeg_load_raw + : &LibRaw::kodak_dc120_load_raw; + + } + else if (!strcmp(model, "DCS200")) { + thumb_height = 128; + thumb_width = 192; + thumb_offset = 6144; + thumb_misc = 360; + iso_speed = 140; + thumb_format = LIBRAW_INTERNAL_THUMBNAIL_LAYER; + black = 17; + } + } + + } + else if (makeIs(LIBRAW_CAMERAMAKER_Logitech) && + !strcmp(model, "Fotoman Pixtura")) { + height = 512; + width = 768; + data_offset = 3632; + load_raw = &LibRaw::kodak_radc_load_raw; + filters = 0x61616161; + simple_coeff(2); + + } + else if (makeIs(LIBRAW_CAMERAMAKER_Apple) && + !strncmp(model, "QuickTake", 9)) { + if (head[5]) { + strcpy(model + 10, "200"); + strcpy(normalized_model, model); + } + fseek(ifp, 544, SEEK_SET); + height = get2(); + width = get2(); + data_offset = (get4(), get2()) == 30 ? 738 : 736; + if (height > width) { + SWAP(height, width); + fseek(ifp, data_offset - 6, SEEK_SET); + flip = ~get2() & 3 ? 5 : 6; + } + filters = 0x61616161; + + } + else if (makeIs(LIBRAW_CAMERAMAKER_Rollei) && + !load_raw) { + switch (raw_width) { + case 1316: // Rollei d530flex + height = 1030; + width = 1300; + top_margin = 1; + left_margin = 6; + break; + case 2568: + height = 1960; + width = 2560; + top_margin = 2; + left_margin = 8; + } + filters = 0x16161616; + load_raw = &LibRaw::rollei_load_raw; + + } + else if (!strcmp(model, "GRAS-50S5C")) { + height = 2048; + width = 2440; + load_raw = &LibRaw::unpacked_load_raw; + data_offset = 0; + filters = 0x49494949; + order = 0x4949; + maximum = 0xfffC; + + } + else if (!strcmp(model, "BB-500CL")) { + height = 2058; + width = 2448; + load_raw = &LibRaw::unpacked_load_raw; + data_offset = 0; + filters = 0x94949494; + order = 0x4949; + maximum = 0x3fff; + + } + else if (!strcmp(model, "BB-500GE")) { + height = 2058; + width = 2456; + load_raw = &LibRaw::unpacked_load_raw; + data_offset = 0; + filters = 0x94949494; + order = 0x4949; + maximum = 0x3fff; + + } + else if (!strcmp(model, "SVS625CL")) { + height = 2050; + width = 2448; + load_raw = &LibRaw::unpacked_load_raw; + data_offset = 0; + filters = 0x94949494; + order = 0x4949; + maximum = 0x0fff; + } +} diff --git a/rtengine/libraw/src/metadata/identify_tools.cpp b/rtengine/libraw/src/metadata/identify_tools.cpp new file mode 100644 index 000000000..caf1cddf0 --- /dev/null +++ b/rtengine/libraw/src/metadata/identify_tools.cpp @@ -0,0 +1,140 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +short LibRaw::guess_byte_order(int words) +{ + uchar test[4][2]; + int t = 2, msb; + double diff, sum[2] = {0, 0}; + + fread(test[0], 2, 2, ifp); + for (words -= 2; words--;) + { + fread(test[t], 2, 1, ifp); + for (msb = 0; msb < 2; msb++) + { + diff = (test[t ^ 2][msb] << 8 | test[t ^ 2][!msb]) - + (test[t][msb] << 8 | test[t][!msb]); + sum[msb] += diff * diff; + } + t = (t + 1) & 3; + } + return sum[0] < sum[1] ? 0x4d4d : 0x4949; +} + +float LibRaw::find_green(int bps, int bite, int off0, int off1) +{ + UINT64 bitbuf = 0; + int vbits, col, i, c; + ushort img[2][2064]; + double sum[] = {0, 0}; + if (width > 2064) + return 0.f; // too wide + + FORC(2) + { + fseek(ifp, c ? off1 : off0, SEEK_SET); + for (vbits = col = 0; col < width; col++) + { + for (vbits -= bps; vbits < 0; vbits += bite) + { + bitbuf <<= bite; + for (i = 0; i < bite; i += 8) + bitbuf |= (unsigned)(fgetc(ifp) << i); + } + img[c][col] = bitbuf << (64 - bps - vbits) >> (64 - bps); + } + } + FORC(width - 1) + { + sum[c & 1] += ABS(img[0][c] - img[1][c + 1]); + sum[~c & 1] += ABS(img[1][c] - img[0][c + 1]); + } + if (sum[0] >= 1.0 && sum[1] >= 1.0) + return 100 * log(sum[0] / sum[1]); + else + return 0.f; +} + +void LibRaw::trimSpaces(char *s) +{ + char *p = s; + int l = int(strlen(p)); + if (!l) + return; + while (isspace(p[l - 1])) + p[--l] = 0; /* trim trailing spaces */ + while (*p && isspace(*p)) + ++p, --l; /* trim leading spaces */ + memmove(s, p, l + 1); +} + +void LibRaw::remove_trailing_spaces(char *string, size_t len) +{ + if (len < 1) + return; // not needed, b/c sizeof of make/model is 64 + string[len - 1] = 0; + if (len < 3) + return; // also not needed + len = strnlen(string, len - 1); + for (size_t i = len - 1; i >= 0; i--) + { + if (isspace((unsigned char)string[i])) + string[i] = 0; + else + break; + } +} + +void LibRaw::remove_caseSubstr(char *string, char *subStr) // replace a substring with an equal length of spaces +{ + char *found; + while ((found = strcasestr(string,subStr))) { + if (!found) return; + int fill_len = int(strlen(subStr)); + int p = found - string; + for (int i=p; i 0x1fff) && (romm_camScale[1] > 0x1fff) && + (romm_camScale[2] > 0x1fff)) + { + FORC3 for (j = 0; j < 3; j++)((float *)romm_camIllum)[c * 3 + j] = + ((float)romm_camTemp[c * 3 + j]) / ((float)romm_camScale[c]); + return 1; + } + } + return 0; +} + +/* Thanks to Alexey Danilchenko for wb as-shot parsing code */ +void LibRaw::parse_kodak_ifd(int base) +{ + unsigned entries, tag, type, len, save; + int c, wbi = -1; + + static const int wbtag_kdc[] = { + LIBRAW_WBI_Auto, // 64037 / 0xfa25 + LIBRAW_WBI_Fluorescent, // 64040 / 0xfa28 + LIBRAW_WBI_Tungsten, // 64039 / 0xfa27 + LIBRAW_WBI_Daylight, // 64041 / 0xfa29 + -1, + -1, + LIBRAW_WBI_Shade // 64042 / 0xfa2a + }; + + static const int wbtag_dcr[] = { + LIBRAW_WBI_Daylight, // 2120 / 0x0848 + LIBRAW_WBI_Tungsten, // 2121 / 0x0849 + LIBRAW_WBI_Fluorescent, // 2122 / 0x084a + LIBRAW_WBI_Flash, // 2123 / 0x084b + LIBRAW_WBI_Custom, // 2124 / 0x084c + LIBRAW_WBI_Auto // 2125 / 0x084d + }; + + // int a_blck = 0; + + entries = get2(); + if (entries > 1024) + return; + INT64 fsize = ifp->size(); + while (entries--) + { + tiff_get(base, &tag, &type, &len, &save); + INT64 savepos = ftell(ifp); + if (len > 8 && len + savepos > 2 * fsize) + { + fseek(ifp, save, SEEK_SET); // Recover tiff-read position!! + continue; + } + if (callbacks.exif_cb) + { + callbacks.exif_cb(callbacks.exifparser_data, tag | 0x20000, type, len, + order, ifp, base); + fseek(ifp, savepos, SEEK_SET); + } + if (tag == 0x03eb) // 1003 + imgdata.sizes.raw_inset_crops[0].cleft = get2(); + else if (tag == 0x03ec) // 1004 + imgdata.sizes.raw_inset_crops[0].ctop = get2(); + else if (tag == 0x03ed) // 1005 + imgdata.sizes.raw_inset_crops[0].cwidth = get2(); + else if (tag == 0x03ee) // 1006 + imgdata.sizes.raw_inset_crops[0].cheight = get2(); + else if (tag == 0x03ef) // 1007 + { + if (!strcmp(model, "EOS D2000C")) + black = get2(); + else + imKodak.BlackLevelTop = get2(); + } + else if (tag == 0x03f0) // 1008 + { + if (!strcmp(model, "EOS D2000C")) + { + if (black) // already set by tag 1007 (0x03ef) + black = (black + get2()) / 2; + else + black = get2(); + } + else + imKodak.BlackLevelBottom = get2(); + } + + else if (tag == 0x03f1) + { // 1009 Kodak TextualInfo + if (len > 0) + { + char kti[1024]; + char *pkti; + int nsym = MIN(len, 1023); + fread(kti, 1, nsym, ifp); + kti[nsym] = 0; +#ifdef LIBRAW_WIN32_CALLS + pkti = strtok(kti, "\x0a"); +#else + char *last = 0; + pkti = strtok_r(kti, "\x0a", &last); +#endif + while (pkti != NULL) + { + c = 12; + if (((int)strlen(pkti) > c) && (!strncasecmp(pkti, "Camera body:", c))) + { + while ((pkti[c] == ' ') && (c < (int)strlen(pkti))) + { + c++; + } + strcpy(ilm.body, pkti + c); + } + c = 5; + if (((int)strlen(pkti) > c) && (!strncasecmp(pkti, "Lens:", c))) + { + ilm.CurFocal = atoi(pkti + c); + } + c = 9; + if (((int)strlen(pkti) > c) && (!strncasecmp(pkti, "Aperture:", c))) + { + while (((pkti[c] == ' ') || (pkti[c] == 'f')) && (c < (int)strlen(pkti))) + { + c++; + } + ilm.CurAp = atof(pkti + c); + } + c = 10; + if (((int)strlen(pkti) > c) && (!strncasecmp(pkti, "ISO Speed:", c))) + { + iso_speed = atoi(pkti + c); + } + c = 13; + if (((int)strlen(pkti) > c) && (!strncasecmp(pkti, "Focal Length:", c))) + { + ilm.CurFocal = atoi(pkti + c); + } + c = 13; + if (((int)strlen(pkti) > c) && (!strncasecmp(pkti, "Max Aperture:", c))) + { + while (((pkti[c] == ' ') || (pkti[c] == 'f')) && (c < (int)strlen(pkti))) + { + c++; + } + ilm.MaxAp4CurFocal = atof(pkti + c); + } + c = 13; + if (((int)strlen(pkti) > c) && (!strncasecmp(pkti, "Min Aperture:", c))) + { + while (((pkti[c] == ' ') || (pkti[c] == 'f')) && (c < (int)strlen(pkti))) + { + c++; + } + ilm.MinAp4CurFocal = atof(pkti + c); + } +#ifdef LIBRAW_WIN32_CALLS + pkti = strtok(NULL, "\x0a"); +#else + pkti = strtok_r(NULL, "\x0a", &last); +#endif + } + } + } + + else if (tag == 0x03f3) // 1011 + imCommon.FlashEC = getreal(type); + + else if (tag == 0x03fc) // 1020 + { + wbi = getint(type); + if ((wbi >= 0) && (wbi < 6) && (wbi != -2)) + wbi = wbtag_dcr[wbi]; + } + else if (tag == 0x03fd && len == 72) // 1021 + { /* WB set in software */ + fseek(ifp, 40, SEEK_CUR); + FORC3 cam_mul[c] = 2048.0 / fMAX(1.0f, get2()); + wbi = -2; + } + + else if ((tag == 0x0406) && (len == 1)) // 1030 + imCommon.CameraTemperature = getreal(type); + else if ((tag == 0x0413) && (len == 1)) // 1043 + imCommon.SensorTemperature = getreal(type); + else if (tag == 0x0848) // 2120 + Kodak_DCR_WBtags(LIBRAW_WBI_Daylight, type, wbi); + else if (tag == 0x0849) // 2121 + Kodak_DCR_WBtags(LIBRAW_WBI_Tungsten, type, wbi); + else if (tag == 0x084a) // 2122 + Kodak_DCR_WBtags(LIBRAW_WBI_Fluorescent, type, wbi); + else if (tag == 0x084b) // 2123 + Kodak_DCR_WBtags(LIBRAW_WBI_Flash, type, wbi); + else if (tag == 0x084c) // 2124 + Kodak_DCR_WBtags(LIBRAW_WBI_Custom, type, wbi); + else if (tag == 0x084d) // 2125 + { + if (wbi == -1) + wbi = LIBRAW_WBI_Auto; + Kodak_DCR_WBtags(LIBRAW_WBI_Auto, type, wbi); + } + else if (tag == 0x089f) // 2207 + imKodak.ISOCalibrationGain = getreal(type); + else if (tag == 0x0903) // 2307 + imKodak.AnalogISO = iso_speed = getreal(type); + else if (tag == 0x090d) // 2317 + linear_table(len); + else if (tag == 0x09ce) // 2510 + stmread(imgdata.shootinginfo.InternalBodySerial, len, ifp); + else if (tag == 0x0e92) // 3730 + { + imKodak.val018percent = get2(); + imgdata.color.linear_max[0] = imgdata.color.linear_max[1] = + imgdata.color.linear_max[2] = imgdata.color.linear_max[3] = + (int)(((float)imKodak.val018percent) / 18.0f * 170.0f); + } + else if (tag == 0x0e93) // 3731 + imgdata.color.linear_max[0] = imgdata.color.linear_max[1] = + imgdata.color.linear_max[2] = imgdata.color.linear_max[3] = + imKodak.val170percent = get2(); + else if (tag == 0x0e94) // 3732 + imKodak.val100percent = get2(); + /* + else if (tag == 0x1784) // 6020 + iso_speed = getint(type); + */ + else if (tag == 0xfa00) // 64000 + stmread(imgdata.shootinginfo.BodySerial, len, ifp); + else if (tag == 0xfa0d) // 64013 + { + wbi = fgetc(ifp); + if ((wbi >= 0) && (wbi < 7)) + wbi = wbtag_kdc[wbi]; + } + else if (tag == 0xfa13) // 64019 + width = getint(type); + else if (tag == 0xfa14) // 64020 + height = (getint(type) + 1) & -2; + /* + height = getint(type); + + else if (tag == 0xfa16) // 64022 + raw_width = get2(); + else if (tag == 0xfa17) // 64023 + raw_height = get2(); + */ + else if (tag == 0xfa18) // 64024 + { + imKodak.offset_left = getint(LIBRAW_EXIFTAG_TYPE_SSHORT); + if (type != LIBRAW_EXIFTAG_TYPE_SSHORT) + imKodak.offset_left += 1; + } + else if (tag == 0xfa19) // 64025 + { + imKodak.offset_top = getint(LIBRAW_EXIFTAG_TYPE_SSHORT); + if (type != LIBRAW_EXIFTAG_TYPE_SSHORT) + imKodak.offset_top += 1; + } + + else if (tag == 0xfa25) // 64037 + Kodak_KDC_WBtags(LIBRAW_WBI_Auto, wbi); + else if (tag == 0xfa27) // 64039 + Kodak_KDC_WBtags(LIBRAW_WBI_Tungsten, wbi); + else if (tag == 0xfa28) // 64040 + Kodak_KDC_WBtags(LIBRAW_WBI_Fluorescent, wbi); + else if (tag == 0xfa29) // 64041 + Kodak_KDC_WBtags(LIBRAW_WBI_Daylight, wbi); + else if (tag == 0xfa2a) // 64042 + Kodak_KDC_WBtags(LIBRAW_WBI_Shade, wbi); + + else if (tag == 0xfa31) // 64049 + imgdata.sizes.raw_inset_crops[0].cwidth = get2(); + else if (tag == 0xfa32) // 64050 + imgdata.sizes.raw_inset_crops[0].cheight = get2(); + else if (tag == 0xfa3e) // 64062 + imgdata.sizes.raw_inset_crops[0].cleft = get2(); + else if (tag == 0xfa3f) // 64063 + imgdata.sizes.raw_inset_crops[0].ctop = get2(); + + else if (((tag == 0x07e4) || (tag == 0xfb01)) && + (len == 9)) // 2020 or 64257 + { + if (KodakIllumMatrix(type, (float *)imKodak.romm_camDaylight)) + { + romm_coeff(imKodak.romm_camDaylight); + } + } + else if (((tag == 0x07e5) || (tag == 0xfb02)) && + (len == 9)) // 2021 or 64258 + KodakIllumMatrix(type, (float *)imKodak.romm_camTungsten); + else if (((tag == 0x07e6) || (tag == 0xfb03)) && + (len == 9)) // 2022 or 64259 + KodakIllumMatrix(type, (float *)imKodak.romm_camFluorescent); + else if (((tag == 0x07e7) || (tag == 0xfb04)) && + (len == 9)) // 2023 or 64260 + KodakIllumMatrix(type, (float *)imKodak.romm_camFlash); + else if (((tag == 0x07e8) || (tag == 0xfb05)) && + (len == 9)) // 2024 or 64261 + KodakIllumMatrix(type, (float *)imKodak.romm_camCustom); + else if (((tag == 0x07e9) || (tag == 0xfb06)) && + (len == 9)) // 2025 or 64262 + KodakIllumMatrix(type, (float *)imKodak.romm_camAuto); + + fseek(ifp, save, SEEK_SET); + } +} diff --git a/rtengine/libraw/src/metadata/leica.cpp b/rtengine/libraw/src/metadata/leica.cpp new file mode 100644 index 000000000..182537485 --- /dev/null +++ b/rtengine/libraw/src/metadata/leica.cpp @@ -0,0 +1,380 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +void LibRaw::setLeicaBodyFeatures(int LeicaMakernoteSignature) +{ + if (LeicaMakernoteSignature == -3) // M8 + { + ilm.CameraFormat = LIBRAW_FORMAT_APSH; + ilm.CameraMount = LIBRAW_MOUNT_Leica_M; + } + else if (LeicaMakernoteSignature == -2) // DMR + { + ilm.CameraFormat = LIBRAW_FORMAT_Leica_DMR; + if ((model[0] == 'R') || (model[6] == 'R')) + ilm.CameraMount = LIBRAW_MOUNT_Leica_R; + } + else if (LeicaMakernoteSignature == 0) // "DIGILUX 2" + { + ilm.CameraMount = ilm.LensMount = LIBRAW_MOUNT_FixedLens; + ilm.FocalType = LIBRAW_FT_ZOOM_LENS; + } + else if ((LeicaMakernoteSignature == 0x0100) || // X1 + (LeicaMakernoteSignature == 0x0500) || // X2, "X-E (Typ 102)" + (LeicaMakernoteSignature == 0x0700) || // "X (Typ 113)" + (LeicaMakernoteSignature == 0x1000)) // "X-U (Typ 113)" + { + ilm.CameraFormat = ilm.LensFormat = LIBRAW_FORMAT_APSC; + ilm.CameraMount = ilm.LensMount = LIBRAW_MOUNT_FixedLens; + ilm.FocalType = LIBRAW_FT_PRIME_LENS; + } + else if (LeicaMakernoteSignature == 0x0400) // "X VARIO (Typ 107)" + { + ilm.CameraFormat = ilm.LensFormat = LIBRAW_FORMAT_APSC; + ilm.CameraMount = ilm.LensMount = LIBRAW_MOUNT_FixedLens; + ilm.FocalType = LIBRAW_FT_ZOOM_LENS; + } + else if ((LeicaMakernoteSignature == + 0x0200) || // M10, M10-D, M10-R, "S (Typ 007)", M11, "M11 Monochrom" + (LeicaMakernoteSignature == + 0x02ff) || // "M (Typ 240)", "M (Typ 262)", "M-D (Typ 262)", + // "M Monochrom (Typ 246)", "S (Typ 006)", "S-E (Typ 006)", S2, S3 + (LeicaMakernoteSignature == + 0x0300)) // M9, "M9 Monochrom", "M Monochrom", M-E + { + if ((model[0] == 'M') || (model[6] == 'M')) + { + ilm.CameraFormat = LIBRAW_FORMAT_FF; + ilm.CameraMount = LIBRAW_MOUNT_Leica_M; + } + else if ((model[0] == 'S') || (model[6] == 'S')) + { + ilm.CameraFormat = LIBRAW_FORMAT_LeicaS; + ilm.CameraMount = LIBRAW_MOUNT_Leica_S; + } + } + else if ((LeicaMakernoteSignature == 0x0600) || // "T (Typ 701)", TL + (LeicaMakernoteSignature == 0x0900) || // SL2, "SL2-S", "SL (Typ 601)", CL, Q2, "Q2 MONO" + (LeicaMakernoteSignature == 0x0a00) || // Q3 + (LeicaMakernoteSignature == 0x1a00)) // TL2 + { + if ((model[0] == 'S') || (model[6] == 'S')) + { + ilm.CameraFormat = LIBRAW_FORMAT_FF; + ilm.CameraMount = LIBRAW_MOUNT_LPS_L; + } + else if ((model[0] == 'T') || (model[6] == 'T') || + (model[0] == 'C') || (model[6] == 'C')) + { + ilm.CameraFormat = LIBRAW_FORMAT_APSC; + ilm.CameraMount = LIBRAW_MOUNT_LPS_L; + } + else if (((model[0] == 'Q') || (model[6] == 'Q')) && + (((model[1] == '2') || (model[7] == '2')) || + ((model[1] == '3') || (model[7] == '3')))) + { + ilm.CameraFormat = ilm.LensFormat = LIBRAW_FORMAT_FF; + ilm.CameraMount = ilm.LensMount = LIBRAW_MOUNT_FixedLens; + ilm.FocalType = LIBRAW_FT_PRIME_LENS; + } + } + else if (LeicaMakernoteSignature == 0x0800) // "Q (Typ 116)" + { + ilm.CameraFormat = ilm.LensFormat = LIBRAW_FORMAT_FF; + ilm.CameraMount = ilm.LensMount = LIBRAW_MOUNT_FixedLens; + ilm.FocalType = LIBRAW_FT_PRIME_LENS; + } +} + +void LibRaw::parseLeicaLensID() +{ + ilm.LensID = get4(); + if (ilm.LensID) + { + ilm.LensID = ((ilm.LensID >> 2) << 8) | (ilm.LensID & 0x3); + if ((ilm.LensID > 0x00ff) && (ilm.LensID < 0x3b00)) + { + ilm.LensMount = ilm.CameraMount; + ilm.LensFormat = LIBRAW_FORMAT_FF; + } + } +} + +int LibRaw::parseLeicaLensName(unsigned len) +{ +#define plln ilm.Lens + if (!len) + { + strcpy(plln, "N/A"); + return 0; + } + stmread(plln, len, ifp); + if ((plln[0] == ' ') || !strncasecmp(plln, "not ", 4) || + !strncmp(plln, "---", 3) || !strncmp(plln, "***", 3)) + { + strcpy(plln, "N/A"); + return 0; + } + else + return 1; +#undef plln +} + +int LibRaw::parseLeicaInternalBodySerial(unsigned len) +{ +#define plibs imgdata.shootinginfo.InternalBodySerial + if (!len) + { + strcpy(plibs, "N/A"); + return 0; + } + stmread(plibs, len, ifp); + if (!strncmp(plibs, "000000000000", 12)) + { + plibs[0] = '0'; + plibs[1] = '\0'; + return 1; + } + + if (strnlen(plibs, len) == 13) + { + for (int i = 3; i < 13; i++) + { + if (!isdigit(plibs[i])) + goto non_std; + } + memcpy(plibs + 15, plibs + 9, 4); + memcpy(plibs + 12, plibs + 7, 2); + memcpy(plibs + 9, plibs + 5, 2); + memcpy(plibs + 6, plibs + 3, 2); + plibs[3] = plibs[14] = ' '; + plibs[8] = plibs[11] = '/'; + if (((short)(plibs[3] - '0') * 10 + (short)(plibs[4] - '0')) < 70) + { + memcpy(plibs + 4, "20", 2); + } + else + { + memcpy(plibs + 4, "19", 2); + } + return 2; + } +non_std: +#undef plibs + return 1; +} + +void LibRaw::parseLeicaMakernote(int base, int uptag, unsigned MakernoteTagType) +{ + int c; + uchar ci, cj; + unsigned entries, tag, type, len, save; + short morder, sorder = order; + char buf[10]; + int LeicaMakernoteSignature = -1; + INT64 fsize = ifp->size(); + + fread(buf, 1, 10, ifp); + if (strncmp(buf, "LEICA", 5)) + { + fseek(ifp, -10, SEEK_CUR); + if (uptag == 0x3400) + LeicaMakernoteSignature = 0x3400; + else + LeicaMakernoteSignature = -2; // DMR + } + else + { + fseek(ifp, -2, SEEK_CUR); + LeicaMakernoteSignature = ((uchar)buf[6] << 8) | (uchar)buf[7]; + // printf ("LeicaMakernoteSignature 0x%04x\n", LeicaMakernoteSignature); + if (!LeicaMakernoteSignature && + (!strncmp(model, "M8", 2) || !strncmp(model + 6, "M8", 2))) + LeicaMakernoteSignature = -3; + if ((LeicaMakernoteSignature != 0x0000) && + (LeicaMakernoteSignature != 0x0200) && + (LeicaMakernoteSignature != 0x0800) && + (LeicaMakernoteSignature != 0x0900) && + (LeicaMakernoteSignature != 0x0a00) && + (LeicaMakernoteSignature != 0x02ff)) + base = ftell(ifp) - 8; + } + setLeicaBodyFeatures(LeicaMakernoteSignature); + + entries = get2(); + if (entries > 1000) + return; + morder = order; + + while (entries--) + { + order = morder; + tiff_get(base, &tag, &type, &len, &save); + + INT64 pos = ifp->tell(); + if (len > 8 && pos + len > 2 * fsize) + { + fseek(ifp, save, SEEK_SET); // Recover tiff-read position!! + continue; + } + tag |= uptag << 16; + if (len > 100 * 1024 * 1024) + goto next; // 100Mb tag? No! + + if (LeicaMakernoteSignature == -3) // M8 + { + if (tag == 0x0310) + { + parseLeicaLensID(); + } + else if ((tag == 0x0313) && (fabs(ilm.CurAp) < 0.17f)) + { + ilm.CurAp = getreal(type); + if (ilm.CurAp > 126.3) + { + ilm.CurAp = 0.0f; + } else if (fabs(aperture) < 0.17f) + aperture = ilm.CurAp; + } + else if (tag == 0x0320) + { + imCommon.CameraTemperature = getreal(type); + } + } + else if (LeicaMakernoteSignature == -2) // DMR + { + if (tag == 0x000d) + { + FORC3 cam_mul[c] = get2(); + cam_mul[3] = cam_mul[1]; + } + } + else if (LeicaMakernoteSignature == 0) // "DIGILUX 2" + { + if (tag == 0x0007) + { + imgdata.shootinginfo.FocusMode = get2(); + } + else if (tag == 0x001a) + { + imgdata.shootinginfo.ImageStabilization = get2(); + } + } + else if ((LeicaMakernoteSignature == 0x0100) || // X1 + (LeicaMakernoteSignature == 0x0400) || // "X VARIO" + (LeicaMakernoteSignature == 0x0500) || // X2, "X-E (Typ 102)" + (LeicaMakernoteSignature == 0x0700) || // "X (Typ 113)" + (LeicaMakernoteSignature == 0x1000)) // "X-U (Typ 113)" + { + if (tag == 0x040d) + { + ci = fgetc(ifp); + cj = fgetc(ifp); + imgdata.shootinginfo.ExposureMode = ((ushort)ci << 8) | cj; + } + } + else if ((LeicaMakernoteSignature == 0x0600) || // TL, "T (Typ 701)" + (LeicaMakernoteSignature == 0x1a00)) // TL2 + { + if (tag == 0x040d) + { + ci = fgetc(ifp); + cj = fgetc(ifp); + imgdata.shootinginfo.ExposureMode = ((ushort)ci << 8) | cj; + } + else if (tag == 0x0303) + { + parseLeicaLensName(len); + } + } + else if (LeicaMakernoteSignature == 0x0200) // M10, M10-D, M10-R, "S (Typ 007)", M11, "M11 Monochrom" + { + if ((tag == 0x035a) && (fabs(ilm.CurAp) < 0.17f)) + { + ilm.CurAp = get4() / 1000.0f; + if (ilm.CurAp > 126.3) + { + ilm.CurAp = 0.0f; + } else if (fabs(aperture) < 0.17f) + aperture = ilm.CurAp; + } + } + else if (LeicaMakernoteSignature == 0x02ff) + // "M (Typ 240)", "M (Typ 262)", "M-D (Typ 262)" + // "M Monochrom (Typ 246)" + // "S (Typ 006)", "S-E (Typ 006)", S2, S3 + { + if (tag == 0x0303) + { + if (parseLeicaLensName(len)) + { + ilm.LensMount = ilm.CameraMount; + ilm.LensFormat = ilm.CameraFormat; + } + } + } + else if (LeicaMakernoteSignature == 0x0300) // M9, "M9 Monochrom", "M Monochrom", M-E + { + if (tag == 0x3400) + { + parseLeicaMakernote(base, 0x3400, MakernoteTagType); + } + } + else if ((LeicaMakernoteSignature == 0x0800) || // "Q (Typ 116)" + (LeicaMakernoteSignature == 0x0900) || // SL2, "SL2-S", "SL (Typ 601)", + // CL, Q2, "Q2 MONO" + (LeicaMakernoteSignature == 0x0a00) // Q3 + ) + { + if ((tag == 0x0304) && (len == 1) && ((c = fgetc(ifp)) != 0) && + (ilm.CameraMount == LIBRAW_MOUNT_LPS_L)) + { + strcpy(ilm.Adapter, "M-Adapter L"); + ilm.LensMount = LIBRAW_MOUNT_Leica_M; + ilm.LensFormat = LIBRAW_FORMAT_FF; + if (c != 0xff) ilm.LensID = c * 256; + } + else if (tag == 0x0500) + { + parseLeicaInternalBodySerial(len); + } + } + else if (LeicaMakernoteSignature == 0x3400) // tag 0x3400 in M9, "M9 Monochrom", "M Monochrom" + { + if (tag == 0x34003402) + { + imCommon.CameraTemperature = getreal(type); + } + else if (tag == 0x34003405) + { + parseLeicaLensID(); + } + else if ((tag == 0x34003406) && (fabs(ilm.CurAp) < 0.17f)) + { + ilm.CurAp = getreal(type); + if (ilm.CurAp > 126.3) + { + ilm.CurAp = 0.0f; + } else if (fabs(aperture) < 0.17f) + aperture = ilm.CurAp; + } + } + + next: + fseek(ifp, save, SEEK_SET); + } + order = sorder; +} diff --git a/rtengine/libraw/src/metadata/makernotes.cpp b/rtengine/libraw/src/metadata/makernotes.cpp new file mode 100644 index 000000000..20b90397f --- /dev/null +++ b/rtengine/libraw/src/metadata/makernotes.cpp @@ -0,0 +1,789 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +void LibRaw::parseSigmaMakernote (int base, int /*uptag*/, unsigned /*dng_writer*/) { +unsigned wb_table1 [] = { + LIBRAW_WBI_Auto, LIBRAW_WBI_Daylight, LIBRAW_WBI_Shade, LIBRAW_WBI_Cloudy, + LIBRAW_WBI_Tungsten, LIBRAW_WBI_Fluorescent, LIBRAW_WBI_Flash, + LIBRAW_WBI_Custom, LIBRAW_WBI_Custom1, LIBRAW_WBI_Custom2 +}; + + unsigned entries, tag, type, len, save; + unsigned i; + + entries = get2(); + if (entries > 1000) + return; + while (entries--) { + tiff_get(base, &tag, &type, &len, &save); + if (tag == 0x0027) { + ilm.LensID = get2(); + } else if (tag == 0x002a) { + ilm.MinFocal = getreal(type); + ilm.MaxFocal = getreal(type); + } else if (tag == 0x002b) { + ilm.MaxAp4MinFocal = getreal(type); + ilm.MaxAp4MaxFocal = getreal(type); + } else if (tag == 0x0120) { + const unsigned tblsz = (sizeof wb_table1 / sizeof wb_table1[0]); + if ((len >= tblsz) && (len%3 == 0) && len/3 <= tblsz) { + for (i=0; i<(len/3); i++) { + icWBC[wb_table1[i]][0] = (int)(getreal(type)*10000.0); + icWBC[wb_table1[i]][1] = icWBC[wb_table1[i]][3] = (int)(getreal(type)*10000.0); + icWBC[wb_table1[i]][2] = (int)(getreal(type)*10000.0); + } + } + } + fseek(ifp, save, SEEK_SET); + } + + return; +} + +void LibRaw::parse_makernote_0xc634(int base, int uptag, unsigned dng_writer) +{ + + if (metadata_blocks++ > LIBRAW_MAX_METADATA_BLOCKS) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + if (!strncmp(make, "NIKON", 5)) + { + parseNikonMakernote(base, uptag, AdobeDNG); + return; + } + else if (!strncasecmp(make, "LEICA", 5)) + { + parseLeicaMakernote(base, uptag, is_0xc634); + return; + } + + short morder, sorder = order; + char buf[10]; + INT64 fsize = ifp->size(); + + fread(buf, 1, 10, ifp); + + if (!strcmp(buf, "EPSON")) + { + parseEpsonMakernote(base, uptag, AdobeDNG); + return; + } + else if (!strcmp(buf, "SIGMA")) + { + parseSigmaMakernote(base, uptag, AdobeDNG); + return; + } + + unsigned entries, tag, type, len, save, c; + + uchar *CanonCameraInfo = NULL; + unsigned lenCanonCameraInfo = 0; + unsigned typeCanonCameraInfo = 0; + + uchar *table_buf_0x0116; + ushort table_buf_0x0116_len = 0; + uchar *table_buf_0x2010; + ushort table_buf_0x2010_len = 0; + uchar *table_buf_0x9050; + ushort table_buf_0x9050_len = 0; + uchar *table_buf_0x9400; + ushort table_buf_0x9400_len = 0; + uchar *table_buf_0x9402; + ushort table_buf_0x9402_len = 0; + uchar *table_buf_0x9403; + ushort table_buf_0x9403_len = 0; + uchar *table_buf_0x9406; + ushort table_buf_0x9406_len = 0; + uchar *table_buf_0x940c; + ushort table_buf_0x940c_len = 0; + uchar *table_buf_0x940e; + ushort table_buf_0x940e_len = 0; + + if (!strcmp(buf, "OLYMPUS") || !strcmp(buf, "PENTAX ") || !strncmp(buf,"OM SYS",6)|| + (!strncmp(make, "SAMSUNG", 7) && (dng_writer == CameraDNG))) + { + base = ftell(ifp) - 10; + fseek(ifp, -2, SEEK_CUR); + order = get2(); + if (buf[0] == 'O') + get2(); + else if (buf[0] == 'P') + is_PentaxRicohMakernotes = 1; + } + else if (is_PentaxRicohMakernotes && (dng_writer == CameraDNG)) + { + base = ftell(ifp) - 10; + fseek(ifp, -4, SEEK_CUR); + order = get2(); + } + else if (!strncmp(buf, "SONY", 4) || + !strcmp(buf, "Panasonic")) + { + order = 0x4949; + fseek(ifp, 2, SEEK_CUR); + } + else if (!strncmp(buf, "FUJIFILM", 8)) + { + base = ftell(ifp) - 10; + order = 0x4949; + fseek(ifp, 2, SEEK_CUR); + } + else if (!strcmp(buf, "OLYMP") || + !strcmp(buf, "Ricoh")) + { + fseek(ifp, -2, SEEK_CUR); + } + else if (!strcmp(buf, "AOC") || !strcmp(buf, "QVC")) + { + fseek(ifp, -4, SEEK_CUR); + } + else + { + fseek(ifp, -10, SEEK_CUR); + if ((!strncmp(make, "SAMSUNG", 7) && (dng_writer == AdobeDNG))) + base = ftell(ifp); + } + + entries = get2(); + if (entries > 1000) + return; + + if (!strncasecmp(make, "SONY", 4) || + !strncasecmp(make, "Konica", 6) || + !strncasecmp(make, "Minolta", 7) || + (!strncasecmp(make, "Hasselblad", 10) && + (!strncasecmp(model, "Stellar", 7) || + !strncasecmp(model, "Lunar", 5) || + !strncasecmp(model, "Lusso", 5) || + !strncasecmp(model, "HV", 2)))) + is_Sony = 1; + + if (!is_Olympus && + (!strncmp(make, "OLYMPUS", 7) || !strncmp(make, "OM Digi", 7) || + (!strncasecmp(make, "CLAUSS", 6) && !strncasecmp(model, "piX 5oo", 7)))) { + is_Olympus = 1; + OlympusDNG_SubDirOffsetValid = + strncmp(model, "E-300", 5) && strncmp(model, "E-330", 5) && + strncmp(model, "E-400", 5) && strncmp(model, "E-500", 5) && + strncmp(model, "E-1", 3); + } + + morder = order; + while (entries--) + { + order = morder; + + tiff_get(base, &tag, &type, &len, &save); + + INT64 pos = ifp->tell(); + if (len > 8 && pos + len > 2 * fsize) + { + fseek(ifp, save, SEEK_SET); // Recover tiff-read position!! + continue; + } + tag |= uptag << 16; + if (len > 100 * 1024 * 1024) + goto next; // 100Mb tag? No! + + if (!strncmp(make, "Canon", 5)) + { + if (tag == 0x000d && len < 256000) + { // camera info + if (!tagtypeIs(LIBRAW_EXIFTAG_TYPE_LONG)) + { + CanonCameraInfo = (uchar *)malloc(MAX(16, len)); + fread(CanonCameraInfo, len, 1, ifp); + } + else + { + CanonCameraInfo = (uchar *)malloc(MAX(16, len * 4)); + fread(CanonCameraInfo, len, 4, ifp); + } + lenCanonCameraInfo = len; + typeCanonCameraInfo = type; + } + + else if (tag == 0x0010) // Canon ModelID + { + unique_id = get4(); + setCanonBodyFeatures(unique_id); + if (lenCanonCameraInfo) + { + processCanonCameraInfo(unique_id, CanonCameraInfo, lenCanonCameraInfo, + typeCanonCameraInfo, AdobeDNG); + free(CanonCameraInfo); + CanonCameraInfo = 0; + lenCanonCameraInfo = 0; + } + } + + else + parseCanonMakernotes(tag, type, len, AdobeDNG); + } + + else if (!strncmp(make, "FUJI", 4)) { + parseFujiMakernotes(tag, type, len, AdobeDNG); + + } else if (!strncasecmp(make, "Hasselblad", 10) && !is_Sony) { + if (tag == 0x0011) { + imHassy.SensorCode = getint(type); + } else if ((tag == 0x0015) && tagtypeIs(LIBRAW_EXIFTAG_TYPE_ASCII)) { + stmread (imHassy.SensorUnitConnector, len, ifp); + for (int i=0; i<(int)len; i++) { + if(!isalnum(imHassy.SensorUnitConnector[i]) && + (imHassy.SensorUnitConnector[i]!=' ') && + (imHassy.SensorUnitConnector[i]!='/') && + (imHassy.SensorUnitConnector[i]!='-')) { + imHassy.SensorUnitConnector[0] = 0; + break; + } + } + } else if (tag == 0x0016) { + imHassy.CoatingCode = getint(type); + } else if ((tag == 0x002a) && + tagtypeIs(LIBRAW_EXIFTAG_TYPE_SRATIONAL) && + (len == 12) && + imHassy.SensorUnitConnector[0]) { + FORC4 for (int i = 0; i < 3; i++) + imHassy.mnColorMatrix[c][i] = getreal(type); + + } else if ((tag == 0x0031) && + imHassy.SensorUnitConnector[0]) { + imHassy.RecommendedCrop[0] = getint(type); + imHassy.RecommendedCrop[1] = getint(type); + } + + } else if (is_Olympus) { + + if ((tag == 0x2010) || (tag == 0x2020) || (tag == 0x2030) || + (tag == 0x2031) || (tag == 0x2040) || (tag == 0x2050) || + (tag == 0x3000)) + { + fseek(ifp, save - 4, SEEK_SET); + fseek(ifp, base + get4(), SEEK_SET); + parse_makernote_0xc634(base, tag, dng_writer); + } + + if (!OlympusDNG_SubDirOffsetValid && + ((len > 4) || + ((tagtypeIs(LIBRAW_EXIFTAG_TYPE_SHORT) || + tagtypeIs(LIBRAW_EXIFTAG_TYPE_SSHORT)) && (len > 2)) || + ((tagtypeIs(LIBRAW_EXIFTAG_TYPE_LONG) || + tagtypeIs(LIBRAW_EXIFTAG_TYPE_SLONG)) && (len > 1)) || + tagtypeIs(LIBRAW_EXIFTAG_TYPE_RATIONAL) || + (type > LIBRAW_EXIFTAG_TYPE_SLONG))) { + goto skip_Oly_broken_tags; + } + else { + parseOlympusMakernotes(base, tag, type, len, AdobeDNG); + } + skip_Oly_broken_tags:; + } + + else if (!strncmp(make, "PENTAX", 6) || + !strncmp(model, "PENTAX", 6) || + is_PentaxRicohMakernotes) + { + parsePentaxMakernotes(base, tag, type, len, dng_writer); + } + else if (!strncmp(make, "SAMSUNG", 7)) + { + if (dng_writer == AdobeDNG) + parseSamsungMakernotes(base, tag, type, len, dng_writer); + else + parsePentaxMakernotes(base, tag, type, len, dng_writer); + } + else if (is_Sony) + { + parseSonyMakernotes( + base, tag, type, len, AdobeDNG, + table_buf_0x0116, table_buf_0x0116_len, + table_buf_0x2010, table_buf_0x2010_len, + table_buf_0x9050, table_buf_0x9050_len, + table_buf_0x9400, table_buf_0x9400_len, + table_buf_0x9402, table_buf_0x9402_len, + table_buf_0x9403, table_buf_0x9403_len, + table_buf_0x9406, table_buf_0x9406_len, + table_buf_0x940c, table_buf_0x940c_len, + table_buf_0x940e, table_buf_0x940e_len); + } + next: + fseek(ifp, save, SEEK_SET); + } + + order = sorder; +} + +void LibRaw::parse_makernote(int base, int uptag) +{ + + if (metadata_blocks++ > LIBRAW_MAX_METADATA_BLOCKS) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + if (!strncmp(make, "NIKON", 5)) + { + parseNikonMakernote(base, uptag, nonDNG); + return; + } + else if (!strncasecmp(make, "LEICA", 5)) + { + parseLeicaMakernote(base, uptag, is_0x927c); + return; + } + + if (!strncmp(make, "Nokia", 5)) + return; + + char buf[10]; + char another_buf[128]; + + fseek(ifp, -12, SEEK_CUR); + fread (another_buf, 1, 12, ifp); + if (!strncmp(another_buf, "SONY", 4) || + !strncmp(another_buf, "VHAB", 4)) { // Sony branded as Hasselblad + is_Sony = 1; + } + + fread(buf, 1, 10, ifp); + + if (!strncmp(buf, "KDK", 3) || /* these aren't TIFF tables */ + !strncmp(buf, "VER", 3) || + !strncmp(buf, "IIII", 4) || + !strncmp(buf, "MMMM", 4)) + return; + + if (!strcmp(buf, "EPSON")) + { + parseEpsonMakernote(base, uptag, nonDNG); + return; + } + else if (!strcmp(buf, "SIGMA")) + { + parseSigmaMakernote(base, uptag, CameraDNG); + return; + } + + + unsigned entries, tag, type, len, save, c; + unsigned i, wb[4] = {0, 0, 0, 0}; + short morder, sorder = order; + + uchar *CanonCameraInfo = 0;; + unsigned lenCanonCameraInfo = 0; + unsigned typeCanonCameraInfo = 0; + imCanon.wbi = 0; + + uchar *table_buf_0x0116; + ushort table_buf_0x0116_len = 0; + uchar *table_buf_0x2010; + ushort table_buf_0x2010_len = 0; + uchar *table_buf_0x9050; + ushort table_buf_0x9050_len = 0; + uchar *table_buf_0x9400; + ushort table_buf_0x9400_len = 0; + uchar *table_buf_0x9402; + ushort table_buf_0x9402_len = 0; + uchar *table_buf_0x9403; + ushort table_buf_0x9403_len = 0; + uchar *table_buf_0x9406; + ushort table_buf_0x9406_len = 0; + uchar *table_buf_0x940c; + ushort table_buf_0x940c_len = 0; + uchar *table_buf_0x940e; + ushort table_buf_0x940e_len = 0; + + INT64 fsize = ifp->size(); + + /* + The MakerNote might have its own TIFF header (possibly with + its own byte-order!), or it might just be a table. + */ + + if (!strncmp(buf, "KC", 2) || /* Konica KD-400Z, KD-510Z */ + !strncmp(buf, "MLY", 3)) /* Minolta DiMAGE G series */ + { + order = 0x4d4d; + while ((i = ftell(ifp)) < data_offset && i < 16384) + { + wb[0] = wb[2]; + wb[2] = wb[1]; + wb[1] = wb[3]; + if (feof(ifp)) + break; + wb[3] = get2(); + if (wb[1] == 256 && wb[3] == 256 && wb[0] > 256 && wb[0] < 640 && + wb[2] > 256 && wb[2] < 640) + FORC4 cam_mul[c] = wb[c]; + } + goto quit; + } + + if (!strcmp(buf, "OLYMPUS") || !strncmp(buf, "OM SYS",6) || + !strcmp(buf, "PENTAX ")) + { + base = ftell(ifp) - 10; + fseek(ifp, -2, SEEK_CUR); + if (buf[1] == 'M') + get4(); + order = get2(); + if (buf[0] == 'O') + get2(); + } + else if (!strncmp(buf, "SONY", 4) || // DSLR-A100 + !strcmp(buf, "Panasonic")) { + if (buf[0] == 'S') + is_Sony = 1; + goto nf; + } + else if (!strncmp(buf, "FUJIFILM", 8)) + { + base = ftell(ifp) - 10; + nf: + order = 0x4949; + fseek(ifp, 2, SEEK_CUR); + } + else if (!strcmp (buf, "OLYMP") || + !strncmp(buf, "LEICA", 5) || + !strcmp (buf, "Ricoh")) + { + fseek(ifp, -2, SEEK_CUR); + } + else if (!strcmp(buf, "AOC") || // Pentax, tribute to Asahi Optical Co. + !strcmp(buf, "QVC")) // Casio, from "QV-Camera" + { + fseek(ifp, -4, SEEK_CUR); + } + else if (!strncmp(buf, "CMT3", 4)) + { + order = sget2((uchar *)(buf + 4)); + fseek(ifp, 2L, SEEK_CUR); + } + else if (libraw_internal_data.unpacker_data.CR3_CTMDtag) + { + order = sget2((uchar *)buf); + fseek(ifp, -2L, SEEK_CUR); + } + else + { + fseek(ifp, -10, SEEK_CUR); + if (!strncmp(make, "SAMSUNG", 7)) + base = ftell(ifp); + } + + if (!is_Olympus && + (!strncasecmp(make, "Olympus", 7) || !strncmp(make, "OM Digi", 7) || + (!strncasecmp(make, "CLAUSS", 6) && !strncasecmp(model, "piX 5oo", 7)))) { + is_Olympus = 1; + } + + if (!is_Sony && + (!strncasecmp(make, "SONY", 4) || + !strncasecmp(make, "Konica", 6) || + !strncasecmp(make, "Minolta", 7) || + (!strncasecmp(make, "Hasselblad", 10) && + (!strncasecmp(model, "Stellar", 7) || + !strncasecmp(model, "Lunar", 5) || + !strncasecmp(model, "Lusso", 5) || + !strncasecmp(model, "HV", 2))))) { + is_Sony = 1; + } + + if (strcasestr(make, "Kodak") && + (sget2((uchar *)buf) > 1) && // check number of entries + (sget2((uchar *)buf) < 128) && + (sget2((uchar *)(buf + 4)) > 0) && // check type + (sget2((uchar *)(buf + 4)) < 13) && + (sget4((uchar *)(buf + 6)) < 256) // check count + ) + imKodak.MakerNoteKodak8a = 1; // Kodak P712 / P850 / P880 + + entries = get2(); + if (entries > 1000) + return; + + morder = order; + while (entries--) + { + order = morder; + tiff_get(base, &tag, &type, &len, &save); + tag |= uptag << 16; + + INT64 _pos = ftell(ifp); + if (len > 100 * 1024 * 1024) + goto next; // 100Mb tag? No! + if (len > 8 && _pos + len > 2 * fsize) + { + fseek(ifp, save, SEEK_SET); // Recover tiff-read position!! + continue; + } + if (imKodak.MakerNoteKodak8a) + { + if ((tag == 0xff00) && tagtypeIs(LIBRAW_EXIFTAG_TYPE_LONG) && (len == 1)) + { + INT64 _pos1 = get4(); + if ((_pos1 < fsize) && (_pos1 > 0)) + { + fseek(ifp, _pos1, SEEK_SET); + parse_makernote(base, tag); + } + } + else if (tag == 0xff00f90b) + { + imKodak.clipBlack = get2(); + } + else if (tag == 0xff00f90c) + { + imKodak.clipWhite = imgdata.color.linear_max[0] = + imgdata.color.linear_max[1] = imgdata.color.linear_max[2] = + imgdata.color.linear_max[3] = get2(); + } + } + else if (!strncmp(make, "Canon", 5)) + { + if (tag == 0x000d && len < 256000) // camera info + { + if (!tagtypeIs(LIBRAW_EXIFTAG_TYPE_LONG)) + { + CanonCameraInfo = (uchar *)malloc(MAX(16, len)); + fread(CanonCameraInfo, len, 1, ifp); + } + else + { + CanonCameraInfo = (uchar *)malloc(MAX(16, len * 4)); + fread(CanonCameraInfo, len, 4, ifp); + } + lenCanonCameraInfo = len; + typeCanonCameraInfo = type; + } + + else if (tag == 0x0010) // Canon ModelID + { + unique_id = get4(); + setCanonBodyFeatures(unique_id); + if (lenCanonCameraInfo) + { + processCanonCameraInfo(unique_id, CanonCameraInfo, lenCanonCameraInfo, + typeCanonCameraInfo, nonDNG); + if(CanonCameraInfo) + free(CanonCameraInfo); + CanonCameraInfo = 0; + lenCanonCameraInfo = 0; + } + } + + else + parseCanonMakernotes(tag, type, len, nonDNG); + } + + else if (!strncmp(make, "FUJI", 4)) + parseFujiMakernotes(tag, type, len, nonDNG); + + else if (!strncasecmp(model, "Hasselblad X1D", 14) || + !strncasecmp(model, "Hasselblad H6D", 14) || + !strncasecmp(model, "Hasselblad A6D", 14)) + { + if (tag == 0x0045) + { + imHassy.BaseISO = get4(); + } + else if (tag == 0x0046) + { + imHassy.Gain = getreal(type); + } + } + + else if (!strncmp(make, "PENTAX", 6) || + !strncmp(make, "RICOH", 5) || + !strncmp(model, "PENTAX", 6)) + { + if (!strncmp(model, "GR", 2) || + !strncmp(model, "GXR", 3)) + { + parseRicohMakernotes(base, tag, type, len, CameraDNG); + } + else + { + parsePentaxMakernotes(base, tag, type, len, nonDNG); + } + } + + else if (!strncmp(make, "SAMSUNG", 7)) + { + if (!dng_version) + parseSamsungMakernotes(base, tag, type, len, nonDNG); + else + parsePentaxMakernotes(base, tag, type, len, CameraDNG); + } + + else if (is_Sony) + { + if ((tag == 0xb028) && (len == 1) && tagtypeIs(LIBRAW_EXIFTAG_TYPE_LONG)) // DSLR-A100 + { + if ((c = get4())) + { + fseek(ifp, c, SEEK_SET); + parse_makernote(base, tag); + } + } + else + { + parseSonyMakernotes( + base, tag, type, len, nonDNG, + table_buf_0x0116, table_buf_0x0116_len, + table_buf_0x2010, table_buf_0x2010_len, + table_buf_0x9050, table_buf_0x9050_len, + table_buf_0x9400, table_buf_0x9400_len, + table_buf_0x9402, table_buf_0x9402_len, + table_buf_0x9403, table_buf_0x9403_len, + table_buf_0x9406, table_buf_0x9406_len, + table_buf_0x940c, table_buf_0x940c_len, + table_buf_0x940e, table_buf_0x940e_len); + } + } + fseek(ifp, _pos, SEEK_SET); + + if (!strncasecmp(make, "Hasselblad", 10) && !is_Sony) { + if (tag == 0x0011) + imHassy.SensorCode = getint(type); + else if (tag == 0x0016) + imHassy.CoatingCode = getint(type); + else if (tag == 0x0019 && len == 0x300000) { // RT + parse_hasselblad_gain(); // RT + } + else if ((tag == 0x002a) && + tagtypeIs(LIBRAW_EXIFTAG_TYPE_SRATIONAL) && + (len == 12)) { + FORC4 for (int ii = 0; ii < 3; ii++) + imHassy.mnColorMatrix[c][ii] = getreal(type); + + } else if (tag == 0x0031) { + imHassy.RecommendedCrop[0] = getint(type); + imHassy.RecommendedCrop[1] = getint(type); + } + } + + if ((tag == 0x0004 || tag == 0x0114) && !strncmp(make, "KONICA", 6)) + { + fseek(ifp, tag == 0x0004 ? 140 : 160, SEEK_CUR); + switch (get2()) + { + case 72: + flip = 0; + break; + case 76: + flip = 6; + break; + case 82: + flip = 5; + break; + } + } + + if (is_Olympus) { + INT64 _pos2 = ftell(ifp); + if ((tag == 0x2010) || (tag == 0x2020) || (tag == 0x2030) || + (tag == 0x2031) || (tag == 0x2040) || (tag == 0x2050) || + (tag == 0x3000)) + { + if (tagtypeIs(LIBRAW_EXIFTOOLTAGTYPE_binary)) { + parse_makernote(base, tag); + + } else if (tagtypeIs(LIBRAW_EXIFTOOLTAGTYPE_ifd) || + tagtypeIs(LIBRAW_EXIFTOOLTAGTYPE_int32u)) { + fseek(ifp, base + get4(), SEEK_SET); + parse_makernote(base, tag); + } + + } else { + parseOlympusMakernotes(base, tag, type, len, nonDNG); + } + fseek(ifp, _pos2, SEEK_SET); + } + + if ((tag == 0x0015) && + tagtypeIs(LIBRAW_EXIFTAG_TYPE_ASCII) && + is_raw) + { // Hasselblad + stmread (imHassy.SensorUnitConnector, len, ifp); + } + + if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_UNDEFINED) && + ((tag == 0x0081) || // Minolta + (tag == 0x0100))) // Olympus + { + thumb_offset = ftell(ifp); + thumb_length = len; + } + if ((tag == 0x0088) && // Minolta, possibly Olympus too + tagtypeIs(LIBRAW_EXIFTAG_TYPE_LONG) && + (thumb_offset = get4())) + thumb_offset += base; + + if ((tag == 0x0089) && // Minolta, possibly Olympus too + tagtypeIs(LIBRAW_EXIFTAG_TYPE_LONG)) + thumb_length = get4(); + + if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_UNDEFINED) && // Nikon + ((tag == 0x008c) || + (tag == 0x0096))) { + meta_offset = ftell(ifp); + } + + if ((tag == 0x00a1) && + tagtypeIs(LIBRAW_EXIFTAG_TYPE_UNDEFINED) && + strncasecmp(make, "Samsung", 7)) + { + order = 0x4949; + fseek(ifp, 140, SEEK_CUR); + FORC3 cam_mul[c] = get4(); + } + + if (tag == 0xb001 && tagtypeIs(LIBRAW_EXIFTAG_TYPE_SHORT)) // Sony ModelID + { + unique_id = get2(); + } + if (tag == 0x0200 && len == 3) // Olympus + shot_order = (get4(), get4()); + + if (tag == 0x0f00 && tagtypeIs(LIBRAW_EXIFTAG_TYPE_UNDEFINED)) + { + if (len == 614) + fseek(ifp, 176, SEEK_CUR); + else if (len == 734 || len == 1502) // Kodak, Minolta, Olympus + fseek(ifp, 148, SEEK_CUR); + else + goto next; + goto get2_256; + } + + if (tag == 0x2011 && len == 2) // Casio + { + get2_256: + order = 0x4d4d; + cam_mul[0] = get2() / 256.0; + cam_mul[2] = get2() / 256.0; + } + + next: + fseek(ifp, save, SEEK_SET); + } +quit: + order = sorder; +} diff --git a/rtengine/libraw/src/metadata/mediumformat.cpp b/rtengine/libraw/src/metadata/mediumformat.cpp new file mode 100644 index 000000000..c3d3dbeca --- /dev/null +++ b/rtengine/libraw/src/metadata/mediumformat.cpp @@ -0,0 +1,521 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +void LibRaw::parse_phase_one(int base) +{ + unsigned entries, tag, type, len, data, i, c; + INT64 save; + float romm_cam[3][3]; + char *cp; + + memset(&ph1, 0, sizeof ph1); + fseek(ifp, base, SEEK_SET); + order = get4() & 0xffff; + if (get4() >> 8 != 0x526177) + return; /* "Raw" */ + unsigned offset = get4(); + if (offset == 0xbad0bad) + return; + fseek(ifp, offset + base, SEEK_SET); + entries = get4(); + if (entries > 8192) + return; // too much?? + get4(); + while (entries--) + { + tag = get4(); + type = get4(); + len = get4(); + if (feof(ifp)) + break; + data = get4(); + save = ftell(ifp); + bool do_seek = (tag < 0x0108 || tag > 0x0110); // to make it single rule, not copy-paste + if(do_seek) + fseek(ifp, base + data, SEEK_SET); + switch (tag) + { + + case 0x0100: + flip = "0653"[data & 3] - '0'; + break; + case 0x0102: + stmread(imgdata.shootinginfo.BodySerial, len, ifp); + if ((imgdata.shootinginfo.BodySerial[0] == 0x4c) && (imgdata.shootinginfo.BodySerial[1] == 0x49)) + { + unique_id = + (((imgdata.shootinginfo.BodySerial[0] & 0x3f) << 5) | (imgdata.shootinginfo.BodySerial[2] & 0x3f)) - 0x41; + } + else + { + unique_id = + (((imgdata.shootinginfo.BodySerial[0] & 0x3f) << 5) | (imgdata.shootinginfo.BodySerial[1] & 0x3f)) - 0x41; + } + setPhaseOneFeatures(unique_id); + break; + case 0x0106: + for (i = 0; i < 9; i++) + imgdata.color.P1_color[0].romm_cam[i] = ((float *)romm_cam)[i] = + (float)getreal(LIBRAW_EXIFTAG_TYPE_FLOAT); + romm_coeff(romm_cam); + break; + case 0x0107: + FORC3 cam_mul[c] = (float)getreal(LIBRAW_EXIFTAG_TYPE_FLOAT); + break; + case 0x0108: + raw_width = data; + break; + case 0x0109: + raw_height = data; + break; + case 0x010a: + left_margin = data; + break; + case 0x010b: + top_margin = data; + break; + case 0x010c: + width = data; + break; + case 0x010d: + height = data; + break; + case 0x010e: + ph1.format = data; + break; + case 0x010f: + data_offset = data + base; + data_size = len; + break; + case 0x0110: + meta_offset = data + base; + meta_length = len; + break; + case 0x0112: + ph1.key_off = int(save - 4); + break; + case 0x0203: + stmread(imPhaseOne.Software, len, ifp); + case 0x0204: + stmread(imPhaseOne.SystemType, len, ifp); + case 0x0210: + ph1.tag_210 = int_to_float(data); + imCommon.SensorTemperature = ph1.tag_210; + break; + case 0x0211: + imCommon.SensorTemperature2 = int_to_float(data); + break; + case 0x021a: + ph1.tag_21a = data; + break; + case 0x021c: + strip_offset = data + base; + break; + case 0x021d: + ph1.t_black = data; + break; + case 0x0222: + ph1.split_col = data; + break; + case 0x0223: + ph1.black_col = data + base; + break; + case 0x0224: + ph1.split_row = data; + break; + case 0x0225: + ph1.black_row = data + base; + break; + case 0x0226: + for (i = 0; i < 9; i++) + imgdata.color.P1_color[1].romm_cam[i] = (float)getreal(LIBRAW_EXIFTAG_TYPE_FLOAT); + break; + case 0x0301: + model[63] = 0; + fread(imPhaseOne.FirmwareString, 1, 255, ifp); + imPhaseOne.FirmwareString[255] = 0; + memcpy(model, imPhaseOne.FirmwareString, 63); + model[63] = 0; + if ((cp = strstr(model, " camera"))) + *cp = 0; + else if ((cp = strchr(model, ','))) + *cp = 0; + /* minus and the letter after it are not always present + if present, last letter means: + C : Contax 645AF + H : Hasselblad H1 / H2 + M : Mamiya + V : Hasselblad 555ELD / 553ELX / 503CW / 501CM; not included below + because of adapter conflicts (Mamiya RZ body) if not present, Phase One + 645 AF, Mamiya 645AFD Series, or anything + */ + strcpy(imPhaseOne.SystemModel, model); + if ((cp = strchr(model, '-'))) + { + if (cp[1] == 'C') + { + strcpy(ilm.body, "Contax 645AF"); + ilm.CameraMount = LIBRAW_MOUNT_Contax645; + ilm.CameraFormat = LIBRAW_FORMAT_645; + } + else if (cp[1] == 'M') + { + strcpy(ilm.body, "Mamiya 645"); + ilm.CameraMount = LIBRAW_MOUNT_Mamiya645; + ilm.CameraFormat = LIBRAW_FORMAT_645; + } + else if (cp[1] == 'H') + { + strcpy(ilm.body, "Hasselblad H1/H2"); + ilm.CameraMount = LIBRAW_MOUNT_Hasselblad_H; + ilm.CameraFormat = LIBRAW_FORMAT_645; + } + *cp = 0; + } + case 0x0401: + if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_LONG)) + ilm.CurAp = libraw_powf64l(2.0f, (int_to_float(data) / 2.0f)); + else + ilm.CurAp = libraw_powf64l(2.0f, float(getreal(type) / 2.0f)); + break; + case 0x0403: + if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_LONG)) + ilm.CurFocal = int_to_float(data); + else + ilm.CurFocal = (float)getreal(type); + break; + case 0x0410: + stmread(ilm.body, len, ifp); + if (((unsigned char)ilm.body[0]) == 0xff) + ilm.body[0] = 0; + break; + case 0x0412: + stmread(ilm.Lens, len, ifp); + if (((unsigned char)ilm.Lens[0]) == 0xff) + ilm.Lens[0] = 0; + break; + case 0x0414: + if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_LONG)) + { + ilm.MaxAp4CurFocal = libraw_powf64l(2.0f, (int_to_float(data) / 2.0f)); + } + else + { + ilm.MaxAp4CurFocal = libraw_powf64l(2.0f, float(getreal(type) / 2.0f)); + } + break; + case 0x0415: + if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_LONG)) + { + ilm.MinAp4CurFocal = libraw_powf64l(2.0f, (int_to_float(data) / 2.0f)); + } + else + { + ilm.MinAp4CurFocal = libraw_powf64l(2.0f, float(getreal(type) / 2.0f)); + } + break; + case 0x0416: + if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_LONG)) + { + ilm.MinFocal = int_to_float(data); + } + else + { + ilm.MinFocal = (float)getreal(type); + } + if (ilm.MinFocal > 1000.0f) + { + ilm.MinFocal = 0.0f; + } + break; + case 0x0417: + if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_LONG)) + { + ilm.MaxFocal = int_to_float(data); + } + else + { + ilm.MaxFocal = (float)getreal(type); + } + break; + } + if (do_seek) + fseek(ifp, save, SEEK_SET); + } + + if (!ilm.body[0] && !imgdata.shootinginfo.BodySerial[0]) + { + fseek(ifp, meta_offset, SEEK_SET); + order = get2(); + fseek(ifp, 6, SEEK_CUR); + fseek(ifp, meta_offset + get4(), SEEK_SET); + entries = get4(); + if (entries > 8192) + return; // too much?? + get4(); + while (entries--) + { + tag = get4(); + len = get4(); + if (feof(ifp)) + break; + data = get4(); + save = ftell(ifp); + fseek(ifp, meta_offset + data, SEEK_SET); + if (tag == 0x0407) + { + stmread(imgdata.shootinginfo.BodySerial, len, ifp); + if ((imgdata.shootinginfo.BodySerial[0] == 0x4c) && + (imgdata.shootinginfo.BodySerial[1] == 0x49)) + { + unique_id = (((imgdata.shootinginfo.BodySerial[0] & 0x3f) << 5) | + (imgdata.shootinginfo.BodySerial[2] & 0x3f)) - + 0x41; + } + else + { + unique_id = (((imgdata.shootinginfo.BodySerial[0] & 0x3f) << 5) | + (imgdata.shootinginfo.BodySerial[1] & 0x3f)) - + 0x41; + } + setPhaseOneFeatures(unique_id); + } + fseek(ifp, save, SEEK_SET); + } + } + + if ((ilm.MaxAp4CurFocal > 0.7f) && + (ilm.MinAp4CurFocal > 0.7f)) { + float MinAp4CurFocal = MAX(ilm.MaxAp4CurFocal,ilm.MinAp4CurFocal); + ilm.MaxAp4CurFocal = MIN(ilm.MaxAp4CurFocal,ilm.MinAp4CurFocal); + ilm.MinAp4CurFocal = MinAp4CurFocal; + } + + if (ph1.format == 6) + load_raw = &LibRaw::phase_one_load_raw_s; + else + load_raw = ph1.format < 3 ? &LibRaw::phase_one_load_raw : &LibRaw::phase_one_load_raw_c; + maximum = 0xffff; // Always scaled to 16bit? + strcpy(make, "Phase One"); + if (model[0]) + return; + switch (raw_height) + { + case 2060: + strcpy(model, "LightPhase"); + break; + case 2682: + strcpy(model, "H 10"); + break; + case 4128: + strcpy(model, "H 20"); + break; + case 5488: + strcpy(model, "H 25"); + break; + } +} + +void LibRaw::parse_mos(INT64 offset) +{ + char data[40]; + int i, c, neut[4], planes = 0, frot = 0; + INT64 from; + unsigned skip; + static const char *mod[] = { + /* DM22, DM28, DM40, DM56 are somewhere here too */ + "", // 0 + "DCB2", // 1 + "Volare", // 2 + "Cantare", // 3 + "CMost", // 4 + "Valeo 6", // 5 + "Valeo 11", // 6 + "Valeo 22", // 7 + "Valeo 11p", // 8 + "Valeo 17", // 9 + "", // 10 + "Aptus 17", // 11 + "Aptus 22", // 12 + "Aptus 75", // 13 + "Aptus 65", // 14 + "Aptus 54S", // 15 + "Aptus 65S", // 16 + "Aptus 75S", // 17 + "AFi 5", // 18 + "AFi 6", // 19 + "AFi 7", // 20 + "AFi-II 7", // 21 + "Aptus-II 7", // 22 (same CMs as Mamiya DM33) + "", // 23 + "Aptus-II 6", // 24 (same CMs as Mamiya DM28) + "AFi-II 10", // 25 + "", // 26 + "Aptus-II 10", // 27 (same CMs as Mamiya DM56) + "Aptus-II 5", // 28 (same CMs as Mamiya DM22) + "", // 29 + "DM33", // 30, make is Mamiya + "", // 31 + "", // 32 + "Aptus-II 10R", // 33 + "Aptus-II 8", // 34 (same CMs as Mamiya DM40) + "", // 35 + "Aptus-II 12", // 36 + "", // 37 + "AFi-II 12" // 38 + }; + float romm_cam[3][3]; + + fseek(ifp, offset, SEEK_SET); + while (!feof(ifp)) + { + if (get4() != 0x504b5453) + break; + get4(); + fread(data, 1, 40, ifp); + skip = get4(); + from = ftell(ifp); + + if (!strcmp(data, "CameraObj_camera_type")) + { + stmread(ilm.body, (unsigned)skip, ifp); + if (ilm.body[0]) + { + if (!strncmp(ilm.body, "Mamiya R", 8)) + { + ilm.CameraMount = LIBRAW_MOUNT_Mamiya67; + ilm.CameraFormat = LIBRAW_FORMAT_67; + } + else if (!strncmp(ilm.body, "Hasselblad 5", 12)) + { + ilm.CameraFormat = LIBRAW_FORMAT_66; + ilm.CameraMount = LIBRAW_MOUNT_Hasselblad_V; + } + else if (!strncmp(ilm.body, "Hasselblad H", 12)) + { + ilm.CameraMount = LIBRAW_MOUNT_Hasselblad_H; + ilm.CameraFormat = LIBRAW_FORMAT_645; + } + else if (!strncmp(ilm.body, "Mamiya 6", 8) || + !strncmp(ilm.body, "Phase One 6", 11)) + { + ilm.CameraMount = LIBRAW_MOUNT_Mamiya645; + ilm.CameraFormat = LIBRAW_FORMAT_645; + } + else if (!strncmp(ilm.body, "Large F", 7)) + { + ilm.CameraMount = LIBRAW_MOUNT_LF; + ilm.CameraFormat = LIBRAW_FORMAT_LF; + } + else if (!strncmp(model, "Leaf AFi", 8)) + { + ilm.CameraMount = LIBRAW_MOUNT_Rollei_bayonet; + ilm.CameraFormat = LIBRAW_FORMAT_66; + } + } + } + if (!strcmp(data, "back_serial_number")) + { + char buffer[sizeof(imgdata.shootinginfo.BodySerial)]; + char *words[4] = {0, 0, 0, 0}; + stmread(buffer, (unsigned)skip, ifp); + /*nwords = */ + getwords(buffer, words, 4, sizeof(imgdata.shootinginfo.BodySerial)); + if(words[0]) + strcpy(imgdata.shootinginfo.BodySerial, words[0]); + } + if (!strcmp(data, "CaptProf_serial_number")) + { + char buffer[sizeof(imgdata.shootinginfo.InternalBodySerial)]; + char *words[4] = {0, 0, 0, 0}; + stmread(buffer, (unsigned)skip, ifp); + getwords(buffer, words, 4, sizeof(imgdata.shootinginfo.InternalBodySerial)); + if(words[0]) + strcpy(imgdata.shootinginfo.InternalBodySerial, words[0]); + } + + if (!strcmp(data, "JPEG_preview_data")) + { + thumb_offset = from; + thumb_length = skip; + } + if (!strcmp(data, "icc_camera_profile")) + { + profile_offset = from; + profile_length = skip; + } + if (!strcmp(data, "ShootObj_back_type")) + { + fscanf(ifp, "%d", &i); + if ((unsigned)i < sizeof mod / sizeof(*mod)) + { + strcpy(model, mod[i]); + if (!strncmp(model, "AFi", 3)) + { + ilm.CameraMount = LIBRAW_MOUNT_Rollei_bayonet; + ilm.CameraFormat = LIBRAW_FORMAT_66; + } + ilm.CamID = i; + } + } + if (!strcmp(data, "icc_camera_to_tone_matrix")) + { + for (i = 0; i < 9; i++) + ((float *)romm_cam)[i] = int_to_float(get4()); + romm_coeff(romm_cam); + } + if (!strcmp(data, "CaptProf_color_matrix")) + { + for (i = 0; i < 9; i++) + fscanf(ifp, "%f", (float *)romm_cam + i); + romm_coeff(romm_cam); + } + if (!strcmp(data, "CaptProf_number_of_planes")) + fscanf(ifp, "%d", &planes); + if (!strcmp(data, "CaptProf_raw_data_rotation")) + fscanf(ifp, "%d", &flip); + if (!strcmp(data, "CaptProf_mosaic_pattern")) + FORC4 + { + fscanf(ifp, "%d", &i); + if (i == 1) + frot = c ^ (c >> 1); // 0123 -> 0132 + } + if (!strcmp(data, "ImgProf_rotation_angle")) + { + fscanf(ifp, "%d", &i); + flip = i - flip; + } + if (!strcmp(data, "NeutObj_neutrals") && !cam_mul[0]) + { + FORC4 fscanf(ifp, "%d", neut + c); + FORC3 + if (neut[c + 1]) + cam_mul[c] = (float)neut[0] / neut[c + 1]; + } + if (!strcmp(data, "Rows_data")) + load_flags = get4(); + parse_mos(from); + fseek(ifp, skip + from, SEEK_SET); + } + if (planes) + filters = (planes == 1) * 0x01010101U * + (uchar) "\x94\x61\x16\x49"[(flip / 90 + frot) & 3]; +} diff --git a/rtengine/libraw/src/metadata/minolta.cpp b/rtengine/libraw/src/metadata/minolta.cpp new file mode 100644 index 000000000..aa40a9b03 --- /dev/null +++ b/rtengine/libraw/src/metadata/minolta.cpp @@ -0,0 +1,110 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +void LibRaw::parse_minolta(int base) +{ + int tag, len, offset, high = 0, wide = 0, i, c; + short sorder = order; + INT64 save; + + fseek(ifp, base, SEEK_SET); + if (fgetc(ifp) || fgetc(ifp) - 'M' || fgetc(ifp) - 'R') + return; + order = fgetc(ifp) * 0x101; + offset = base + get4() + 8; + INT64 fsize = ifp->size(); + if (offset > fsize - 8) // At least 8 bytes for tag/len + offset = fsize - 8; + + while ((save = ftell(ifp)) < offset) + { + for (tag = i = 0; i < 4; i++) + tag = tag << 8 | fgetc(ifp); + len = get4(); + if (len < 0) + return; // just ignore wrong len?? or raise bad file exception? + if ((INT64)len + save + 8LL > fsize) + return; // just ignore out of file metadata, stop parse + switch (tag) + { + case 0x505244: /* PRD */ + fseek(ifp, 8, SEEK_CUR); + high = get2(); + wide = get2(); + imSony.prd_ImageHeight = get2(); + imSony.prd_ImageWidth = get2(); + imSony.prd_Total_bps = (ushort)fgetc(ifp); + imSony.prd_Active_bps = (ushort)fgetc(ifp); + imSony.prd_StorageMethod = (ushort)fgetc(ifp); + fseek(ifp, 4L, SEEK_CUR); + imSony.prd_BayerPattern = (ushort)fgetc(ifp); + break; + case 0x524946: /* RIF */ + fseek(ifp, 8, SEEK_CUR); + icWBC[LIBRAW_WBI_Tungsten][0] = get2(); + icWBC[LIBRAW_WBI_Tungsten][2] = get2(); + icWBC[LIBRAW_WBI_Daylight][0] = get2(); + icWBC[LIBRAW_WBI_Daylight][2] = get2(); + icWBC[LIBRAW_WBI_Cloudy][0] = get2(); + icWBC[LIBRAW_WBI_Cloudy][2] = get2(); + icWBC[LIBRAW_WBI_FL_W][0] = get2(); + icWBC[LIBRAW_WBI_FL_W][2] = get2(); + icWBC[LIBRAW_WBI_Flash][0] = get2(); + icWBC[LIBRAW_WBI_Flash][2] = get2(); + icWBC[LIBRAW_WBI_Custom][0] = get2(); + icWBC[LIBRAW_WBI_Custom][2] = get2(); + icWBC[LIBRAW_WBI_Tungsten][1] = icWBC[LIBRAW_WBI_Tungsten][3] = + icWBC[LIBRAW_WBI_Daylight][1] = icWBC[LIBRAW_WBI_Daylight][3] = + icWBC[LIBRAW_WBI_Cloudy][1] = icWBC[LIBRAW_WBI_Cloudy][3] = + icWBC[LIBRAW_WBI_FL_W][1] = icWBC[LIBRAW_WBI_FL_W][3] = + icWBC[LIBRAW_WBI_Flash][1] = icWBC[LIBRAW_WBI_Flash][3] = + icWBC[LIBRAW_WBI_Custom][1] = icWBC[LIBRAW_WBI_Custom][3] = 0x100; + if (!strncasecmp(model, "DSLR-A100", 9)) { + icWBC[LIBRAW_WBI_Shade][0] = get2(); + icWBC[LIBRAW_WBI_Shade][2] = get2(); + icWBC[LIBRAW_WBI_FL_D][0] = get2(); + icWBC[LIBRAW_WBI_FL_D][2] = get2(); + icWBC[LIBRAW_WBI_FL_N][0] = get2(); + icWBC[LIBRAW_WBI_FL_N][2] = get2(); + icWBC[LIBRAW_WBI_FL_WW][0] = get2(); + icWBC[LIBRAW_WBI_FL_WW][2] = get2(); + icWBC[LIBRAW_WBI_Shade][1] = icWBC[LIBRAW_WBI_Shade][3] = + icWBC[LIBRAW_WBI_FL_D][1] = icWBC[LIBRAW_WBI_FL_D][3] = + icWBC[LIBRAW_WBI_FL_N][1] = icWBC[LIBRAW_WBI_FL_N][3] = + icWBC[LIBRAW_WBI_FL_WW][1] = icWBC[LIBRAW_WBI_FL_WW][3] = 0x0100; + } + break; + case 0x574247: /* WBG */ + get4(); + if (imSony.prd_BayerPattern == LIBRAW_MINOLTA_G2BRG1) + FORC4 cam_mul[G2BRG1_2_RGBG(c)] = get2(); + else + FORC4 cam_mul[RGGB_2_RGBG(c)] = get2(); + break; + case 0x545457: /* TTW */ + parse_tiff(ftell(ifp)); + data_offset = offset; + } + fseek(ifp, save + len + 8, SEEK_SET); + } + raw_height = high; + raw_width = wide; + order = sorder; +} diff --git a/rtengine/libraw/src/metadata/misc_parsers.cpp b/rtengine/libraw/src/metadata/misc_parsers.cpp new file mode 100644 index 000000000..1aea57e6f --- /dev/null +++ b/rtengine/libraw/src/metadata/misc_parsers.cpp @@ -0,0 +1,660 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +/* + Returns 1 for a Coolpix 2100, 0 for anything else. + */ +int LibRaw::nikon_e2100() +{ + uchar t[12]; + int i; + + fseek(ifp, 0, SEEK_SET); + for (i = 0; i < 1024; i++) + { + fread(t, 1, 12, ifp); + if (((t[2] & t[4] & t[7] & t[9]) >> 4 & t[1] & t[6] & t[8] & t[11] & 3) != + 3) + return 0; + } + return 1; +} + +void LibRaw::nikon_3700() +{ + int bits, i; + uchar dp[24]; + static const struct + { + int bits; + char t_make[12], t_model[15]; + int t_maker_idx; + } table[] = {{0x00, "Pentax", "Optio 33WR", LIBRAW_CAMERAMAKER_Pentax}, + {0x03, "Nikon", "E3200", LIBRAW_CAMERAMAKER_Nikon}, + {0x32, "Nikon", "E3700", LIBRAW_CAMERAMAKER_Nikon}, + {0x33, "Olympus", "C-740UZ", LIBRAW_CAMERAMAKER_Olympus}}; + + fseek(ifp, 3072, SEEK_SET); + fread(dp, 1, 24, ifp); + bits = (dp[8] & 3) << 4 | (dp[20] & 3); + for (i = 0; i < int(sizeof table / sizeof *table); i++) + if (bits == table[i].bits) + { + strcpy(make, table[i].t_make); + maker_index = table[i].t_maker_idx; + strcpy(model, table[i].t_model); + } +} + +/* + Separates a Minolta DiMAGE Z2 from a Nikon E4300. + */ +int LibRaw::minolta_z2() +{ + int i, nz; + char tail[424]; + + fseek(ifp, -int(sizeof tail), SEEK_END); + fread(tail, 1, sizeof tail, ifp); + for (nz = i = 0; i < int(sizeof tail); i++) + if (tail[i]) + nz++; + return nz > 20; +} + +int LibRaw::canon_s2is() +{ + unsigned row; + + for (row = 0; row < 100; row++) + { + fseek(ifp, row * 3340 + 3284, SEEK_SET); + if (getc(ifp) > 15) + return 1; + } + return 0; +} + +void LibRaw::parse_cine() +{ + unsigned off_head, off_setup, off_image, i, temp; + + order = 0x4949; + fseek(ifp, 4, SEEK_SET); + is_raw = get2() == 2; + fseek(ifp, 14, SEEK_CUR); + is_raw *= get4(); + off_head = get4(); + off_setup = get4(); + off_image = get4(); + timestamp = get4(); + if ((i = get4())) + timestamp = i; + fseek(ifp, off_head + 4, SEEK_SET); + raw_width = get4(); + raw_height = get4(); + switch (get2(), get2()) + { + case 8: + load_raw = &LibRaw::eight_bit_load_raw; + break; + case 16: + load_raw = &LibRaw::unpacked_load_raw; + } + fseek(ifp, off_setup + 792, SEEK_SET); + strcpy(make, "CINE"); + sprintf(model, "%d", get4()); + fseek(ifp, 12, SEEK_CUR); + switch ((i = get4()) & 0xffffff) + { + case 3: + filters = 0x94949494; + break; + case 4: + filters = 0x49494949; + break; + default: + is_raw = 0; + } + fseek(ifp, 72, SEEK_CUR); + switch ((get4() + 3600) % 360) + { + case 270: + flip = 4; + break; + case 180: + flip = 1; + break; + case 90: + flip = 7; + break; + case 0: + flip = 2; + } + cam_mul[0] = getreal(LIBRAW_EXIFTAG_TYPE_FLOAT); + cam_mul[2] = getreal(LIBRAW_EXIFTAG_TYPE_FLOAT); + temp = get4(); + maximum = ~((~0u) << LIM(temp, 1, 31)); + fseek(ifp, 668, SEEK_CUR); + shutter = get4() / 1000000000.0; + fseek(ifp, off_image, SEEK_SET); + if (shot_select < is_raw) + fseek(ifp, shot_select * 8, SEEK_CUR); + data_offset = (INT64)get4() + 8; + data_offset += (INT64)get4() << 32; +} + +void LibRaw::parse_qt(int end) +{ + unsigned save, size; + char tag[4]; + + order = 0x4d4d; + while (ftell(ifp) + 7 < end) + { + save = ftell(ifp); + if ((size = get4()) < 8) + return; + if ((int)size < 0) + return; // 2+GB is too much + if (save + size < save) + return; // 32bit overflow + fread(tag, 4, 1, ifp); + if (!memcmp(tag, "moov", 4) || !memcmp(tag, "udta", 4) || + !memcmp(tag, "CNTH", 4)) + parse_qt(save + size); + if (!memcmp(tag, "CNDA", 4)) + parse_jpeg(ftell(ifp)); + fseek(ifp, save + size, SEEK_SET); + } +} + +void LibRaw::parse_smal(int offset, int fsize) +{ + int ver; + + fseek(ifp, offset + 2, SEEK_SET); + order = 0x4949; + ver = fgetc(ifp); + if (ver == 6) + fseek(ifp, 5, SEEK_CUR); + if (get4() != (unsigned)fsize) + return; + if (ver > 6) + data_offset = get4(); + raw_height = height = get2(); + raw_width = width = get2(); + strcpy(make, "SMaL"); + sprintf(model, "v%d %dx%d", ver, width, height); + if (ver == 6) + load_raw = &LibRaw::smal_v6_load_raw; + if (ver == 9) + load_raw = &LibRaw::smal_v9_load_raw; +} + +void LibRaw::parse_riff(int maxdepth) +{ + unsigned i, size, end; + char tag[4], date[64], month[64]; + static const char mon[12][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; + struct tm t; + if (maxdepth < 1) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + order = 0x4949; + fread(tag, 4, 1, ifp); + size = get4(); + end = ftell(ifp) + size; + if (!memcmp(tag, "RIFF", 4) || !memcmp(tag, "LIST", 4)) + { + int maxloop = 1000; + get4(); + while (ftell(ifp) + 7 < end && !feof(ifp) && maxloop--) + parse_riff(maxdepth-1); + } + else if (!memcmp(tag, "nctg", 4)) + { + while (ftell(ifp) + 7 < end) + { + if (feof(ifp)) + break; + i = get2(); + size = get2(); + if ((i + 1) >> 1 == 10 && size == 20) + get_timestamp(0); + else + fseek(ifp, size, SEEK_CUR); + } + } + else if (!memcmp(tag, "IDIT", 4) && size < 64) + { + fread(date, 64, 1, ifp); + date[size] = 0; + memset(&t, 0, sizeof t); + if (sscanf(date, "%*s %s %d %d:%d:%d %d", month, &t.tm_mday, &t.tm_hour, + &t.tm_min, &t.tm_sec, &t.tm_year) == 6) + { + for (i = 0; i < 12 && strcasecmp(mon[i], month); i++) + ; + t.tm_mon = i; + t.tm_year -= 1900; + if (mktime(&t) > 0) + timestamp = mktime(&t); + } + } + else + fseek(ifp, size, SEEK_CUR); +} + +void LibRaw::parse_rollei() +{ + char line[128], *val; + struct tm t; + + fseek(ifp, 0, SEEK_SET); + memset(&t, 0, sizeof t); + do + { + line[0] = 0; + if (!fgets(line, 128, ifp)) + break; + line[127] = 0; + if(!line[0]) break; // zero-length + if ((val = strchr(line, '='))) + *val++ = 0; + else + val = line + strbuflen(line); + if (!strcmp(line, "DAT")) + sscanf(val, "%d.%d.%d", &t.tm_mday, &t.tm_mon, &t.tm_year); + if (!strcmp(line, "TIM")) + sscanf(val, "%d:%d:%d", &t.tm_hour, &t.tm_min, &t.tm_sec); + if (!strcmp(line, "HDR")) + thumb_offset = atoi(val); + if (!strcmp(line, "X ")) + raw_width = atoi(val); + if (!strcmp(line, "Y ")) + raw_height = atoi(val); + if (!strcmp(line, "TX ")) + thumb_width = atoi(val); + if (!strcmp(line, "TY ")) + thumb_height = atoi(val); + if (!strcmp(line, "APT")) + aperture = atof(val); + if (!strcmp(line, "SPE")) + shutter = atof(val); + if (!strcmp(line, "FOCLEN")) + focal_len = atof(val); + if (!strcmp(line, "BLKOFS")) + black = atoi(val) +1; + if (!strcmp(line, "ORI")) + switch (atoi(val)) { + case 1: + flip = 6; + break; + case 2: + flip = 3; + break; + case 3: + flip = 5; + break; + } + if (!strcmp(line, "CUTRECT")) { + sscanf(val, "%hu %hu %hu %hu", + &imgdata.sizes.raw_inset_crops[0].cleft, + &imgdata.sizes.raw_inset_crops[0].ctop, + &imgdata.sizes.raw_inset_crops[0].cwidth, + &imgdata.sizes.raw_inset_crops[0].cheight); + } + } while (strncmp(line, "EOHD", 4)); + data_offset = thumb_offset + thumb_width * thumb_height * 2; + t.tm_year -= 1900; + t.tm_mon -= 1; + if (mktime(&t) > 0) + timestamp = mktime(&t); + strcpy(make, "Rollei"); + strcpy(model, "d530flex"); + thumb_format = LIBRAW_INTERNAL_THUMBNAIL_ROLLEI; +} + +void LibRaw::parse_sinar_ia() +{ + int entries, off; + char str[8], *cp; + + order = 0x4949; + fseek(ifp, 4, SEEK_SET); + entries = get4(); + if (entries < 1 || entries > 8192) + return; + fseek(ifp, get4(), SEEK_SET); + while (entries--) + { + off = get4(); + get4(); + fread(str, 8, 1, ifp); + str[7] = 0; // Ensure end of string + if (!strcmp(str, "META")) + meta_offset = off; + if (!strcmp(str, "THUMB")) + thumb_offset = off; + if (!strcmp(str, "RAW0")) + data_offset = off; + } + fseek(ifp, meta_offset + 20, SEEK_SET); + fread(make, 64, 1, ifp); + make[63] = 0; + if ((cp = strchr(make, ' '))) + { + strcpy(model, cp + 1); + *cp = 0; + } + raw_width = get2(); + raw_height = get2(); + load_raw = &LibRaw::unpacked_load_raw; + thumb_width = (get4(), get2()); + thumb_height = get2(); + thumb_format = LIBRAW_INTERNAL_THUMBNAIL_PPM; + maximum = 0x3fff; +} + +void LibRaw::parse_kyocera() +{ + + int c; + static const ushort table[13] = {25, 32, 40, 50, 64, 80, 100, + 125, 160, 200, 250, 320, 400}; + + fseek(ifp, 33, SEEK_SET); + get_timestamp(1); + fseek(ifp, 52, SEEK_SET); + c = get4(); + if ((c > 6) && (c < 20)) + iso_speed = table[c - 7]; + shutter = libraw_powf64l(2.0f, (((float)get4()) / 8.0f)) / 16000.0f; + FORC4 cam_mul[RGGB_2_RGBG(c)] = get4(); + fseek(ifp, 88, SEEK_SET); + aperture = libraw_powf64l(2.0f, ((float)get4()) / 16.0f); + fseek(ifp, 112, SEEK_SET); + focal_len = get4(); + + fseek(ifp, 104, SEEK_SET); + ilm.MaxAp4CurFocal = libraw_powf64l(2.0f, ((float)get4()) / 16.0f); + fseek(ifp, 124, SEEK_SET); + stmread(ilm.Lens, 32, ifp); + ilm.CameraMount = LIBRAW_MOUNT_Contax_N; + ilm.CameraFormat = LIBRAW_FORMAT_FF; + if (ilm.Lens[0]) + { + ilm.LensMount = LIBRAW_MOUNT_Contax_N; + ilm.LensFormat = LIBRAW_FORMAT_FF; + } +} + +int LibRaw::parse_jpeg(int offset) +{ + int len, save, hlen, mark; + fseek(ifp, offset, SEEK_SET); + if (fgetc(ifp) != 0xff || fgetc(ifp) != 0xd8) + return 0; + + while (fgetc(ifp) == 0xff && (mark = fgetc(ifp)) != 0xda) + { + order = 0x4d4d; + len = get2() - 2; + save = ftell(ifp); + if (mark == 0xc0 || mark == 0xc3 || mark == 0xc9) + { + fgetc(ifp); + raw_height = get2(); + raw_width = get2(); + } + order = get2(); + hlen = get4(); + if (get4() == 0x48454150 && (save + hlen) >= 0 && + (save + hlen) <= ifp->size()) /* "HEAP" */ + { + parse_ciff(save + hlen, len - hlen, 0); + } + if (parse_tiff(save + 6)) + apply_tiff(); + fseek(ifp, save + len, SEEK_SET); + } + return 1; +} + +void LibRaw::parse_thumb_note(int base, unsigned toff, unsigned tlen) +{ + unsigned entries, tag, type, len, save; + + entries = get2(); + while (entries--) + { + tiff_get(base, &tag, &type, &len, &save); + if (tag == toff) + thumb_offset = get4() + base; + if (tag == tlen) + thumb_length = get4(); + fseek(ifp, save, SEEK_SET); + } +} + +void LibRaw::parse_broadcom() +{ + + /* This structure is at offset 0xb0 from the 'BRCM' ident. */ + struct + { + uint8_t umode[32]; + uint16_t uwidth; + uint16_t uheight; + uint16_t padding_right; + uint16_t padding_down; + uint32_t unknown_block[6]; + uint16_t transform; + uint16_t format; + uint8_t bayer_order; + uint8_t bayer_format; + } header; + + header.bayer_order = 0; + fseek(ifp, 0xb0 - 0x20, SEEK_CUR); + fread(&header, 1, sizeof(header), ifp); + raw_stride = + ((((((header.uwidth + header.padding_right) * 5) + 3) >> 2) + 0x1f) & + (~0x1f)); + raw_width = width = header.uwidth; + raw_height = height = header.uheight; + filters = 0x16161616; /* default Bayer order is 2, BGGR */ + + switch (header.bayer_order) + { + case 0: /* RGGB */ + filters = 0x94949494; + break; + case 1: /* GBRG */ + filters = 0x49494949; + break; + case 3: /* GRBG */ + filters = 0x61616161; + break; + } +} + +/* + Returns 1 for a Coolpix 995, 0 for anything else. + */ +int LibRaw::nikon_e995() +{ + int i, histo[256]; + const uchar often[] = {0x00, 0x55, 0xaa, 0xff}; + + memset(histo, 0, sizeof histo); + fseek(ifp, -2000, SEEK_END); + for (i = 0; i < 2000; i++) + histo[fgetc(ifp)]++; + for (i = 0; i < 4; i++) + if (histo[often[i]] < 200) + return 0; + return 1; +} + +/* + Since the TIFF DateTime string has no timezone information, + assume that the camera's clock was set to Universal Time. + */ +void LibRaw::get_timestamp(int reversed) +{ + struct tm t; + char str[20]; + int i; + + str[19] = 0; + if (reversed) + for (i = 19; i--;) + str[i] = fgetc(ifp); + else + fread(str, 19, 1, ifp); + memset(&t, 0, sizeof t); + if (sscanf(str, "%d:%d:%d %d:%d:%d", &t.tm_year, &t.tm_mon, &t.tm_mday, + &t.tm_hour, &t.tm_min, &t.tm_sec) != 6) + return; + t.tm_year -= 1900; + t.tm_mon -= 1; + t.tm_isdst = -1; + if (mktime(&t) > 0) + timestamp = mktime(&t); +} + +#ifdef USE_6BY9RPI +void LibRaw::parse_raspberrypi() +{ + //This structure is at offset 0xB0 from the 'BRCM' ident. + struct brcm_raw_header { + uint8_t name[32]; + uint16_t h_width; + uint16_t h_height; + uint16_t padding_right; + uint16_t padding_down; + uint32_t dummy[6]; + uint16_t transform; + uint16_t format; + uint8_t bayer_order; + uint8_t bayer_format; + }; + //Values taken from https://github.com/raspberrypi/userland/blob/master/interface/vctypes/vc_image_types.h +#define BRCM_FORMAT_BAYER 33 +#define BRCM_BAYER_RAW8 2 +#define BRCM_BAYER_RAW10 3 +#define BRCM_BAYER_RAW12 4 +#define BRCM_BAYER_RAW14 5 +#define BRCM_BAYER_RAW16 6 + + struct brcm_raw_header header; + uint8_t brcm_tag[4]; + + if (ftell(ifp) > 22LL) // 22 bytes is minimum jpeg size + { + thumb_length = ftell(ifp); + thumb_offset = 0; + thumb_width = thumb_height = 0; + load_flags |= 0x4000; // flag: we have JPEG from beginning to meta_offset + } + + // Sanity check that the caller has found a BRCM header + if (!fread(brcm_tag, 1, sizeof(brcm_tag), ifp) || + memcmp(brcm_tag, "BRCM", sizeof(brcm_tag))) + return; + + width = raw_width; + data_offset = ftell(ifp) + 0x8000 - sizeof(brcm_tag); + + if (!fseek(ifp, 0xB0 - int(sizeof(brcm_tag)), SEEK_CUR) && + fread(&header, 1, sizeof(header), ifp)) { + switch (header.bayer_order) { + case 0: //RGGB + filters = 0x94949494; + break; + case 1: //GBRG + filters = 0x49494949; + break; + default: + case 2: //BGGR + filters = 0x16161616; + break; + case 3: //GRBG + filters = 0x61616161; + break; + } + + if (header.format == BRCM_FORMAT_BAYER) { + switch (header.bayer_format) { + case BRCM_BAYER_RAW8: + load_raw = &LibRaw::rpi_load_raw8; + //1 pixel per byte + raw_stride = ((header.h_width + header.padding_right) + 31)&(~31); + width = header.h_width; + raw_height = height = header.h_height; + is_raw = 1; + order = 0x4d4d; + break; + case BRCM_BAYER_RAW10: + load_raw = &LibRaw::nokia_load_raw; + //4 pixels per 5 bytes + raw_stride = (((((header.h_width + header.padding_right) * 5) + 3) >> 2) + 31)&(~31); + width = header.h_width; + raw_height = height = header.h_height; + is_raw = 1; + order = 0x4d4d; + break; + case BRCM_BAYER_RAW12: + load_raw = &LibRaw::rpi_load_raw12; + //2 pixels per 3 bytes + raw_stride = (((((header.h_width + header.padding_right) * 3) + 1) >> 1) + 31)&(~31); + width = header.h_width; + raw_height = height = header.h_height; + is_raw = 1; + order = 0x4d4d; + break; + case BRCM_BAYER_RAW14: + load_raw = &LibRaw::rpi_load_raw14; + //4 pixels per 7 bytes + raw_stride = (((((header.h_width + header.padding_right) * 7) + 3) >> 2) + 31)&(~31); + width = header.h_width; + raw_height = height = header.h_height; + is_raw = 1; + order = 0x4d4d; + break; + case BRCM_BAYER_RAW16: + load_raw = &LibRaw::rpi_load_raw16; + //1 pixel per 2 bytes + raw_stride = (((header.h_width + header.padding_right) << 1) + 31)&(~31); + width = header.h_width; + raw_height = height = header.h_height; + is_raw = 1; + order = 0x4d4d; + break; + default: + break; + } + } + } +} +#endif diff --git a/rtengine/libraw/src/metadata/nikon.cpp b/rtengine/libraw/src/metadata/nikon.cpp new file mode 100644 index 000000000..f0fb655d9 --- /dev/null +++ b/rtengine/libraw/src/metadata/nikon.cpp @@ -0,0 +1,1074 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +// void hexDump(char *title, void *addr, int len); + +unsigned sget4_order (short _order, uchar *s); +double sget_fixed32u (short _order, uchar *s); +double AngleConversion_a (short _order, uchar *s); +double AngleConversion (short _order, uchar *s); + +static const uchar xlat[2][256] = { + {0xc1, 0xbf, 0x6d, 0x0d, 0x59, 0xc5, 0x13, 0x9d, 0x83, 0x61, 0x6b, 0x4f, + 0xc7, 0x7f, 0x3d, 0x3d, 0x53, 0x59, 0xe3, 0xc7, 0xe9, 0x2f, 0x95, 0xa7, + 0x95, 0x1f, 0xdf, 0x7f, 0x2b, 0x29, 0xc7, 0x0d, 0xdf, 0x07, 0xef, 0x71, + 0x89, 0x3d, 0x13, 0x3d, 0x3b, 0x13, 0xfb, 0x0d, 0x89, 0xc1, 0x65, 0x1f, + 0xb3, 0x0d, 0x6b, 0x29, 0xe3, 0xfb, 0xef, 0xa3, 0x6b, 0x47, 0x7f, 0x95, + 0x35, 0xa7, 0x47, 0x4f, 0xc7, 0xf1, 0x59, 0x95, 0x35, 0x11, 0x29, 0x61, + 0xf1, 0x3d, 0xb3, 0x2b, 0x0d, 0x43, 0x89, 0xc1, 0x9d, 0x9d, 0x89, 0x65, + 0xf1, 0xe9, 0xdf, 0xbf, 0x3d, 0x7f, 0x53, 0x97, 0xe5, 0xe9, 0x95, 0x17, + 0x1d, 0x3d, 0x8b, 0xfb, 0xc7, 0xe3, 0x67, 0xa7, 0x07, 0xf1, 0x71, 0xa7, + 0x53, 0xb5, 0x29, 0x89, 0xe5, 0x2b, 0xa7, 0x17, 0x29, 0xe9, 0x4f, 0xc5, + 0x65, 0x6d, 0x6b, 0xef, 0x0d, 0x89, 0x49, 0x2f, 0xb3, 0x43, 0x53, 0x65, + 0x1d, 0x49, 0xa3, 0x13, 0x89, 0x59, 0xef, 0x6b, 0xef, 0x65, 0x1d, 0x0b, + 0x59, 0x13, 0xe3, 0x4f, 0x9d, 0xb3, 0x29, 0x43, 0x2b, 0x07, 0x1d, 0x95, + 0x59, 0x59, 0x47, 0xfb, 0xe5, 0xe9, 0x61, 0x47, 0x2f, 0x35, 0x7f, 0x17, + 0x7f, 0xef, 0x7f, 0x95, 0x95, 0x71, 0xd3, 0xa3, 0x0b, 0x71, 0xa3, 0xad, + 0x0b, 0x3b, 0xb5, 0xfb, 0xa3, 0xbf, 0x4f, 0x83, 0x1d, 0xad, 0xe9, 0x2f, + 0x71, 0x65, 0xa3, 0xe5, 0x07, 0x35, 0x3d, 0x0d, 0xb5, 0xe9, 0xe5, 0x47, + 0x3b, 0x9d, 0xef, 0x35, 0xa3, 0xbf, 0xb3, 0xdf, 0x53, 0xd3, 0x97, 0x53, + 0x49, 0x71, 0x07, 0x35, 0x61, 0x71, 0x2f, 0x43, 0x2f, 0x11, 0xdf, 0x17, + 0x97, 0xfb, 0x95, 0x3b, 0x7f, 0x6b, 0xd3, 0x25, 0xbf, 0xad, 0xc7, 0xc5, + 0xc5, 0xb5, 0x8b, 0xef, 0x2f, 0xd3, 0x07, 0x6b, 0x25, 0x49, 0x95, 0x25, + 0x49, 0x6d, 0x71, 0xc7}, + {0xa7, 0xbc, 0xc9, 0xad, 0x91, 0xdf, 0x85, 0xe5, 0xd4, 0x78, 0xd5, 0x17, + 0x46, 0x7c, 0x29, 0x4c, 0x4d, 0x03, 0xe9, 0x25, 0x68, 0x11, 0x86, 0xb3, + 0xbd, 0xf7, 0x6f, 0x61, 0x22, 0xa2, 0x26, 0x34, 0x2a, 0xbe, 0x1e, 0x46, + 0x14, 0x68, 0x9d, 0x44, 0x18, 0xc2, 0x40, 0xf4, 0x7e, 0x5f, 0x1b, 0xad, + 0x0b, 0x94, 0xb6, 0x67, 0xb4, 0x0b, 0xe1, 0xea, 0x95, 0x9c, 0x66, 0xdc, + 0xe7, 0x5d, 0x6c, 0x05, 0xda, 0xd5, 0xdf, 0x7a, 0xef, 0xf6, 0xdb, 0x1f, + 0x82, 0x4c, 0xc0, 0x68, 0x47, 0xa1, 0xbd, 0xee, 0x39, 0x50, 0x56, 0x4a, + 0xdd, 0xdf, 0xa5, 0xf8, 0xc6, 0xda, 0xca, 0x90, 0xca, 0x01, 0x42, 0x9d, + 0x8b, 0x0c, 0x73, 0x43, 0x75, 0x05, 0x94, 0xde, 0x24, 0xb3, 0x80, 0x34, + 0xe5, 0x2c, 0xdc, 0x9b, 0x3f, 0xca, 0x33, 0x45, 0xd0, 0xdb, 0x5f, 0xf5, + 0x52, 0xc3, 0x21, 0xda, 0xe2, 0x22, 0x72, 0x6b, 0x3e, 0xd0, 0x5b, 0xa8, + 0x87, 0x8c, 0x06, 0x5d, 0x0f, 0xdd, 0x09, 0x19, 0x93, 0xd0, 0xb9, 0xfc, + 0x8b, 0x0f, 0x84, 0x60, 0x33, 0x1c, 0x9b, 0x45, 0xf1, 0xf0, 0xa3, 0x94, + 0x3a, 0x12, 0x77, 0x33, 0x4d, 0x44, 0x78, 0x28, 0x3c, 0x9e, 0xfd, 0x65, + 0x57, 0x16, 0x94, 0x6b, 0xfb, 0x59, 0xd0, 0xc8, 0x22, 0x36, 0xdb, 0xd2, + 0x63, 0x98, 0x43, 0xa1, 0x04, 0x87, 0x86, 0xf7, 0xa6, 0x26, 0xbb, 0xd6, + 0x59, 0x4d, 0xbf, 0x6a, 0x2e, 0xaa, 0x2b, 0xef, 0xe6, 0x78, 0xb6, 0x4e, + 0xe0, 0x2f, 0xdc, 0x7c, 0xbe, 0x57, 0x19, 0x32, 0x7e, 0x2a, 0xd0, 0xb8, + 0xba, 0x29, 0x00, 0x3c, 0x52, 0x7d, 0xa8, 0x49, 0x3b, 0x2d, 0xeb, 0x25, + 0x49, 0xfa, 0xa3, 0xaa, 0x39, 0xa7, 0xc5, 0xa7, 0x50, 0x11, 0x36, 0xfb, + 0xc6, 0x67, 0x4a, 0xf5, 0xa5, 0x12, 0x65, 0x7e, 0xb0, 0xdf, 0xaf, 0x4e, + 0xb3, 0x61, 0x7f, 0x2f} }; + +void LibRaw::processNikonLensData(uchar *LensData, unsigned len) +{ + + ushort i=0; + if (imgdata.lens.nikon.LensType & 0x80) { + strcpy (ilm.LensFeatures_pre, "AF-P"); + } else if (!(imgdata.lens.nikon.LensType & 0x01)) { + ilm.LensFeatures_pre[0] = 'A'; + ilm.LensFeatures_pre[1] = 'F'; + } else { + ilm.LensFeatures_pre[0] = 'M'; + ilm.LensFeatures_pre[1] = 'F'; + } + + if (imgdata.lens.nikon.LensType & 0x40) { + ilm.LensFeatures_suf[0] = 'E'; + } else if (imgdata.lens.nikon.LensType & 0x04) { + ilm.LensFeatures_suf[0] = 'G'; + } else if (imgdata.lens.nikon.LensType & 0x02) { + ilm.LensFeatures_suf[0] = 'D'; + } + + if (imgdata.lens.nikon.LensType & 0x08) + { + ilm.LensFeatures_suf[1] = ' '; + ilm.LensFeatures_suf[2] = 'V'; + ilm.LensFeatures_suf[3] = 'R'; + } + + if (imgdata.lens.nikon.LensType & 0x10) + { + ilm.LensMount = ilm.CameraMount = LIBRAW_MOUNT_Nikon_CX; + ilm.CameraFormat = ilm.LensFormat = LIBRAW_FORMAT_1INCH; + } + else + ilm.LensMount = ilm.CameraMount = LIBRAW_MOUNT_Nikon_F; + + if (imgdata.lens.nikon.LensType & 0x20) + { + strcpy(ilm.Adapter, "FT-1"); + ilm.LensMount = LIBRAW_MOUNT_Nikon_F; + ilm.CameraMount = LIBRAW_MOUNT_Nikon_CX; + ilm.CameraFormat = LIBRAW_FORMAT_1INCH; + } + + imgdata.lens.nikon.LensType = imgdata.lens.nikon.LensType & 0xdf; + + if ((len < 20) || (len == 58) || (len == 108)) + { + switch (len) + { + case 9: + i = 2; + break; + case 15: + i = 7; + break; + case 16: + i = 8; + break; + case 58: // "Z 6", "Z 6 II", "Z 7", "Z 7 II", "Z 50", D780, "Z 5", "Z fc" + case 108: // "Z 9", "Z 30", "Z 8" + if (model[6] == 'Z') + ilm.CameraMount = LIBRAW_MOUNT_Nikon_Z; + if (imNikon.HighSpeedCropFormat != 12) + ilm.CameraFormat = LIBRAW_FORMAT_FF; + i = 1; + while ((LensData[i] == LensData[0]) && (i < 17)) + i++; + if (i == 17) + { + ilm.LensMount = LIBRAW_MOUNT_Nikon_Z; + ilm.LensID = sget2(LensData + 0x2c); + if ( + (ilm.LensID == 11) + || (ilm.LensID == 12) + || (ilm.LensID == 26) + || (ilm.LensID == 41) + || (ilm.LensID == 43) + ) ilm.LensFormat = LIBRAW_FORMAT_APSC; + else ilm.LensFormat = LIBRAW_FORMAT_FF; + if (ilm.MaxAp4CurFocal < 0.7f) + ilm.MaxAp4CurFocal = libraw_powf64l( + 2.0f, (float)sget2(LensData + 0x32) / 384.0f - 1.0f); + if (ilm.CurAp < 0.7f) + ilm.CurAp = libraw_powf64l( + 2.0f, (float)sget2(LensData + 0x34) / 384.0f - 1.0f); + if (fabsf(ilm.CurFocal) < 1.1f) + ilm.CurFocal = sget2(LensData + 0x38); + return; + } + i = 9; + ilm.LensMount = LIBRAW_MOUNT_Nikon_F; + if (ilm.CameraMount == LIBRAW_MOUNT_Nikon_Z) + strcpy(ilm.Adapter, "FTZ"); + break; + } + imgdata.lens.nikon.LensIDNumber = LensData[i]; + imgdata.lens.nikon.LensFStops = LensData[i + 1]; + ilm.LensFStops = (float)imgdata.lens.nikon.LensFStops / 12.0f; + if (fabsf(ilm.MinFocal) < 1.1f) + { + if ((imgdata.lens.nikon.LensType ^ (uchar)0x01) || LensData[i + 2]) + ilm.MinFocal = + 5.0f * libraw_powf64l(2.0f, (float)LensData[i + 2] / 24.0f); + if ((imgdata.lens.nikon.LensType ^ (uchar)0x01) || LensData[i + 3]) + ilm.MaxFocal = + 5.0f * libraw_powf64l(2.0f, (float)LensData[i + 3] / 24.0f); + if ((imgdata.lens.nikon.LensType ^ (uchar)0x01) || LensData[i + 4]) + ilm.MaxAp4MinFocal = + libraw_powf64l(2.0f, (float)LensData[i + 4] / 24.0f); + if ((imgdata.lens.nikon.LensType ^ (uchar)0x01) || LensData[i + 5]) + ilm.MaxAp4MaxFocal = + libraw_powf64l(2.0f, (float)LensData[i + 5] / 24.0f); + } + imgdata.lens.nikon.MCUVersion = LensData[i + 6]; + if (i != 2) + { + if ((LensData[i - 1]) && (fabsf(ilm.CurFocal) < 1.1f)) + ilm.CurFocal = + 5.0f * libraw_powf64l(2.0f, (float)LensData[i - 1] / 24.0f); + if (LensData[i + 7]) + imgdata.lens.nikon.EffectiveMaxAp = + libraw_powf64l(2.0f, (float)LensData[i + 7] / 24.0f); + } + ilm.LensID = (unsigned long long)LensData[i] << 56 | + (unsigned long long)LensData[i + 1] << 48 | + (unsigned long long)LensData[i + 2] << 40 | + (unsigned long long)LensData[i + 3] << 32 | + (unsigned long long)LensData[i + 4] << 24 | + (unsigned long long)LensData[i + 5] << 16 | + (unsigned long long)LensData[i + 6] << 8 | + (unsigned long long)imgdata.lens.nikon.LensType; + } + else if ((len == 459) || (len == 590)) + { + memcpy(ilm.Lens, LensData + 390, 64); + } + else if (len == 509) + { + memcpy(ilm.Lens, LensData + 391, 64); + } + else if (len == 879) + { + memcpy(ilm.Lens, LensData + 680, 64); + } + + return; +} + +void LibRaw::Nikon_NRW_WBtag(int wb, int skip) +{ + + int r, g0, g1, b; + if (skip) + get4(); // skip wb "CCT", it is not unique + r = get4(); + g0 = get4(); + g1 = get4(); + b = get4(); + if (r && g0 && g1 && b) + { + icWBC[wb][0] = r << 1; + icWBC[wb][1] = g0; + icWBC[wb][2] = b << 1; + icWBC[wb][3] = g1; + } + return; +} + +void LibRaw::parseNikonMakernote(int base, int uptag, unsigned /*dng_writer */) +{ + + unsigned offset = 0, entries, tag, type, len, save; + + unsigned c, i; + unsigned LensData_len = 0; + uchar *LensData_buf=0; + uchar ColorBalanceData_buf[324]; + int ColorBalanceData_ready = 0; + uchar ci, cj, ck; + unsigned serial = 0; + unsigned custom_serial = 0; + + unsigned ShotInfo_len = 0; + uchar *ShotInfo_buf=0; + +/* for dump: +uchar *cj_block, *ck_block; +*/ + + short morder, sorder = order; + char buf[10]; + INT64 fsize = ifp->size(); + + fread(buf, 1, 10, ifp); + + if (!strcmp(buf, "Nikon")) + { + if (buf[6] != '\2') + return; + base = ftell(ifp); + order = get2(); + if (get2() != 42) + goto quit; + offset = get4(); + fseek(ifp, INT64(offset) - 8LL, SEEK_CUR); + } + else + { + fseek(ifp, -10, SEEK_CUR); + } + + entries = get2(); + if (entries > 1000) + return; + morder = order; + + while (entries--) + { + order = morder; + tiff_get(base, &tag, &type, &len, &save); + + INT64 pos = ifp->tell(); + if (len > 8 && pos + len > 2 * fsize) + { + fseek(ifp, save, SEEK_SET); // Recover tiff-read position!! + continue; + } + tag |= uptag << 16; + if (len > 100 * 1024 * 1024) + goto next; // 100Mb tag? No! + + if (tag == 0x0002) + { + if (!iso_speed) + iso_speed = (get2(), get2()); + } + else if (tag == 0x000a) + { + ilm.LensMount = ilm.CameraMount = LIBRAW_MOUNT_FixedLens; + ilm.FocalType = LIBRAW_FT_ZOOM_LENS; + } + else if ((tag == 0x000c) && (len == 4) && tagtypeIs(LIBRAW_EXIFTAG_TYPE_RATIONAL)) + { + cam_mul[0] = getreal(type); + cam_mul[2] = getreal(type); + cam_mul[1] = getreal(type); + cam_mul[3] = getreal(type); + } + else if (tag == 0x0011) + { + if (is_raw) + { + fseek(ifp, get4() + base, SEEK_SET); + parse_tiff_ifd(base); + } + } + else if (tag == 0x0012) + { + uchar uc1 = fgetc(ifp); + uchar uc2 = fgetc(ifp); + uchar uc3 = fgetc(ifp); + if (uc3) + imCommon.FlashEC = (float)(uc1 * uc2) / (float)uc3; + } + else if (tag == 0x0014) + { + if (tagtypeIs(LIBRAW_EXIFTOOLTAGTYPE_binary)) + { + if (len == 2560) + { // E5400, E8400, E8700, E8800 + fseek(ifp, 0x4e0L, SEEK_CUR); + order = 0x4d4d; + cam_mul[0] = get2() / 256.0; + cam_mul[2] = get2() / 256.0; + cam_mul[1] = cam_mul[3] = 1.0; + icWBC[LIBRAW_WBI_Auto][0] = get2(); + icWBC[LIBRAW_WBI_Auto][2] = get2(); + icWBC[LIBRAW_WBI_Daylight][0] = get2(); + icWBC[LIBRAW_WBI_Daylight][2] = get2(); + fseek(ifp, 0x18L, SEEK_CUR); + icWBC[LIBRAW_WBI_Tungsten][0] = get2(); + icWBC[LIBRAW_WBI_Tungsten][2] = get2(); + fseek(ifp, 0x18L, SEEK_CUR); + icWBC[LIBRAW_WBI_FL_W][0] = get2(); + icWBC[LIBRAW_WBI_FL_W][2] = get2(); + icWBC[LIBRAW_WBI_FL_N][0] = get2(); + icWBC[LIBRAW_WBI_FL_N][2] = get2(); + icWBC[LIBRAW_WBI_FL_D][0] = get2(); + icWBC[LIBRAW_WBI_FL_D][2] = get2(); + icWBC[LIBRAW_WBI_Cloudy][0] = get2(); + icWBC[LIBRAW_WBI_Cloudy][2] = get2(); + fseek(ifp, 0x18L, SEEK_CUR); + icWBC[LIBRAW_WBI_Flash][0] = get2(); + icWBC[LIBRAW_WBI_Flash][2] = get2(); + + icWBC[LIBRAW_WBI_Auto][1] = icWBC[LIBRAW_WBI_Auto][3] = + icWBC[LIBRAW_WBI_Daylight][1] = icWBC[LIBRAW_WBI_Daylight][3] = + icWBC[LIBRAW_WBI_Tungsten][1] = icWBC[LIBRAW_WBI_Tungsten][3] = + icWBC[LIBRAW_WBI_FL_W][1] = icWBC[LIBRAW_WBI_FL_W][3] = + icWBC[LIBRAW_WBI_FL_N][1] = icWBC[LIBRAW_WBI_FL_N][3] = + icWBC[LIBRAW_WBI_FL_D][1] = icWBC[LIBRAW_WBI_FL_D][3] = + icWBC[LIBRAW_WBI_Cloudy][1] = icWBC[LIBRAW_WBI_Cloudy][3] = + icWBC[LIBRAW_WBI_Flash][1] = icWBC[LIBRAW_WBI_Flash][3] = 256; + + if (strncmp(model, "E8700", 5)) + { + fseek(ifp, 0x18L, SEEK_CUR); + icWBC[LIBRAW_WBI_Shade][0] = get2(); + icWBC[LIBRAW_WBI_Shade][2] = get2(); + icWBC[LIBRAW_WBI_Shade][1] = icWBC[LIBRAW_WBI_Shade][3] = 256; + } + } + else if (len == 1280) + { // E5000, E5700 + cam_mul[0] = cam_mul[1] = cam_mul[2] = cam_mul[3] = 1.0; + } + else + { + fread(buf, 1, 10, ifp); + if (!strncmp(buf, "NRW ", 4)) + { // P6000, P7000, P7100, B700, P1000 + if (!strcmp(buf + 4, "0100")) + { // P6000 + fseek(ifp, 0x13deL, SEEK_CUR); + cam_mul[0] = get4() << 1; + cam_mul[1] = get4(); + cam_mul[3] = get4(); + cam_mul[2] = get4() << 1; + Nikon_NRW_WBtag(LIBRAW_WBI_Daylight, 0); + Nikon_NRW_WBtag(LIBRAW_WBI_Cloudy, 0); + fseek(ifp, 0x10L, SEEK_CUR); + Nikon_NRW_WBtag(LIBRAW_WBI_Tungsten, 0); + Nikon_NRW_WBtag(LIBRAW_WBI_FL_W, 0); + Nikon_NRW_WBtag(LIBRAW_WBI_Flash, 0); + fseek(ifp, 0x10L, SEEK_CUR); + Nikon_NRW_WBtag(LIBRAW_WBI_Custom, 0); + Nikon_NRW_WBtag(LIBRAW_WBI_Auto, 0); + } + else + { // P7000, P7100, B700, P1000 + fseek(ifp, 0x16L, SEEK_CUR); + black = get2(); + if (cam_mul[0] < 0.1f) + { + fseek(ifp, 0x16L, SEEK_CUR); + cam_mul[0] = get4() << 1; + cam_mul[1] = get4(); + cam_mul[3] = get4(); + cam_mul[2] = get4() << 1; + } + else + { + fseek(ifp, 0x26L, SEEK_CUR); + } + if (len != 332) + { // not A1000 + Nikon_NRW_WBtag(LIBRAW_WBI_Daylight, 1); + Nikon_NRW_WBtag(LIBRAW_WBI_Cloudy, 1); + Nikon_NRW_WBtag(LIBRAW_WBI_Shade, 1); + Nikon_NRW_WBtag(LIBRAW_WBI_Tungsten, 1); + Nikon_NRW_WBtag(LIBRAW_WBI_FL_W, 1); + Nikon_NRW_WBtag(LIBRAW_WBI_FL_N, 1); + Nikon_NRW_WBtag(LIBRAW_WBI_FL_D, 1); + Nikon_NRW_WBtag(LIBRAW_WBI_HT_Mercury, 1); + fseek(ifp, 0x14L, SEEK_CUR); + Nikon_NRW_WBtag(LIBRAW_WBI_Custom, 1); + Nikon_NRW_WBtag(LIBRAW_WBI_Auto, 1); + } + else + { + fseek(ifp, 0xc8L, SEEK_CUR); + Nikon_NRW_WBtag(LIBRAW_WBI_Auto, 1); + } + } + } + } + } + } + else if (tag == 0x001b) + { + imNikon.HighSpeedCropFormat = get2(); + imNikon.SensorHighSpeedCrop.cwidth = get2(); + imNikon.SensorHighSpeedCrop.cheight = get2(); + imNikon.SensorWidth = get2(); + imNikon.SensorHeight = get2(); + imNikon.SensorHighSpeedCrop.cleft = get2(); + imNikon.SensorHighSpeedCrop.ctop = get2(); + switch (imNikon.HighSpeedCropFormat) + { + case 0: + case 1: + case 2: + case 4: + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_3to2; + break; + case 11: + ilm.CameraFormat = LIBRAW_FORMAT_FF; + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_3to2; + break; + case 12: + ilm.CameraFormat = LIBRAW_FORMAT_APSC; + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_3to2; + break; + case 3: + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_5to4; + break; + case 6: + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_16to9; + break; + case 17: + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_1to1; + break; + default: + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_OTHER; + break; + } + } + else if (tag == 0x001d) + { // serial number + if (len > 0) + { + int model_len = (int)strbuflen(model); + while ((c = fgetc(ifp)) && (len-- > 0) && (c != (unsigned)EOF)) + { + if ((!custom_serial) && (!isdigit(c))) + { + if (((model_len == 3) && !strcmp(model, "D50")) || + ((model_len >= 4) && !isalnum(model[model_len - 4]) && + !strncmp(&model[model_len - 3], "D50", 3))) + { + custom_serial = 34; + } + else + { + custom_serial = 96; + } + break; + } + serial = serial * 10 + (isdigit(c) ? c - '0' : c % 10); + } + if (!imgdata.shootinginfo.BodySerial[0]) + sprintf(imgdata.shootinginfo.BodySerial, "%d", serial); + } + } + else if (tag == 0x001e) { + switch (get2()) { + case 1: + imCommon.ColorSpace = LIBRAW_COLORSPACE_sRGB; + break; + case 2: + imCommon.ColorSpace = LIBRAW_COLORSPACE_AdobeRGB; + break; + case 4: + imCommon.ColorSpace = LIBRAW_COLORSPACE_Rec2020; + break; + default: + imCommon.ColorSpace = LIBRAW_COLORSPACE_Unknown; + break; + } + } else if (tag == 0x0025) + { + imCommon.real_ISO = int(100.0 * libraw_powf64l(2.0, double((uchar)fgetc(ifp)) / 12.0 - 5.0)); + if (!iso_speed || (iso_speed == 65535)) + { + iso_speed = imCommon.real_ISO; + } + } + else if (tag == 0x0022) + { + imNikon.Active_D_Lighting = get2(); + } + else if (tag == 0x0023) + { + FORC4 imNikon.PictureControlVersion = + imNikon.PictureControlVersion * 10 + fgetc(ifp) - '0'; + if ((imNikon.PictureControlVersion >= 300) && + (imNikon.PictureControlVersion <= 399)) + { + fseek(ifp, 4, SEEK_CUR); + } + stmread (imNikon.PictureControlName, 20, ifp); + stmread (imNikon.PictureControlBase, 20, ifp); + if (!strncmp(imNikon.PictureControlBase, "STANDARD(HLG)", 13)) + { + imCommon.ExposureCalibrationShift -= 2; + } + } + else if (tag == 0x003b) + { // WB for multi-exposure (ME); all 1s for regular exposures + imNikon.ME_WB[0] = getreal(type); + imNikon.ME_WB[2] = getreal(type); + imNikon.ME_WB[1] = getreal(type); + imNikon.ME_WB[3] = getreal(type); + } + else if (tag == 0x003d) + { // not corrected for file bitcount, to be patched in open_datastream + FORC4 cblack[RGGB_2_RGBG(c)] = get2(); + i = cblack[3]; + FORC3 if (i > cblack[c]) i = cblack[c]; + FORC4 cblack[c] -= i; + black += i; + } + else if (tag == 0x0045) + { /* upper left pixel (x,y), size (width,height) */ + imgdata.sizes.raw_inset_crops[0].cleft = get2(); + imgdata.sizes.raw_inset_crops[0].ctop = get2(); + imgdata.sizes.raw_inset_crops[0].cwidth = get2(); + imgdata.sizes.raw_inset_crops[0].cheight = get2(); + } + else if (tag == 0x0051) + { + fseek(ifp, 10LL, SEEK_CUR); + imNikon.NEFCompression = get2(); + } + else if (tag == 0x0082) + { // lens attachment + stmread(ilm.Attachment, len, ifp); + } + else if (tag == 0x0083) + { // lens type + imgdata.lens.nikon.LensType = fgetc(ifp); + } + else if (tag == 0x0084) + { // lens + ilm.MinFocal = getreal(type); + ilm.MaxFocal = getreal(type); + ilm.MaxAp4MinFocal = getreal(type); + ilm.MaxAp4MaxFocal = getreal(type); + } + else if (tag == 0x0088) // AFInfo + { + if (!imCommon.afcount) + { + imCommon.afdata[imCommon.afcount].AFInfoData_tag = tag; + imCommon.afdata[imCommon.afcount].AFInfoData_order = order; + imCommon.afdata[imCommon.afcount].AFInfoData_length = len; + imCommon.afdata[imCommon.afcount].AFInfoData = (uchar *)malloc(imCommon.afdata[imCommon.afcount].AFInfoData_length); + fread(imCommon.afdata[imCommon.afcount].AFInfoData, imCommon.afdata[imCommon.afcount].AFInfoData_length, 1, ifp); + imCommon.afcount = 1; + } + } + else if (tag == 0x008b) // lens f-stops + { + uchar uc1 = fgetc(ifp); + uchar uc2 = fgetc(ifp); + uchar uc3 = fgetc(ifp); + if (uc3) + { + imgdata.lens.nikon.LensFStops = uc1 * uc2 * (12 / uc3); + ilm.LensFStops = (float)imgdata.lens.nikon.LensFStops / 12.0f; + } + } + else if ((tag == 0x008c) || (tag == 0x0096)) + { + meta_offset = ftell(ifp); + } + else if ((tag == 0x0091) && (len > 4)) + { + ShotInfo_len = len; + ShotInfo_buf = (uchar *)malloc(ShotInfo_len); + +/* for dump: +cj_block = (uchar *)malloc(ShotInfo_len); +ck_block = (uchar *)malloc(ShotInfo_len); +*/ + + fread(ShotInfo_buf, ShotInfo_len, 1, ifp); + FORC4 imNikon.ShotInfoVersion = + imNikon.ShotInfoVersion * 10 + ShotInfo_buf[c] - '0'; + } + else if (tag == 0x0093) + { + imNikon.NEFCompression = i = get2(); + if ((i == 7) || (i == 9)) + { + ilm.LensMount = LIBRAW_MOUNT_FixedLens; + ilm.CameraMount = LIBRAW_MOUNT_FixedLens; + } + } + else if (tag == 0x0097) + { // ver97 + FORC4 imNikon.ColorBalanceVersion = + imNikon.ColorBalanceVersion * 10 + fgetc(ifp) - '0'; + switch (imNikon.ColorBalanceVersion) + { + case 100: // NIKON D100 + fseek(ifp, 0x44L, SEEK_CUR); + FORC4 cam_mul[RBGG_2_RGBG(c)] = get2(); + break; + case 102: // NIKON D2H + fseek(ifp, 0x6L, SEEK_CUR); + FORC4 cam_mul[RGGB_2_RGBG(c)] = get2(); + break; + case 103: // NIKON D70, D70s + fseek(ifp, 0x10L, SEEK_CUR); + FORC4 cam_mul[c] = get2(); + } + if (imNikon.ColorBalanceVersion >= 200) + { + /* + 204: NIKON D2X, D2Xs + 205: NIKON D50 + 206: NIKON D2Hs + 207: NIKON D200 + 208: NIKON D40, D40X, D80 + 209: NIKON D3, D3X, D300, D700 + 210: NIKON D60 + 211: NIKON D90, D5000 + 212: NIKON D300S + 213: NIKON D3000 + 214: NIKON D3S + 215: NIKON D3100 + 216: NIKON D5100, D7000 + 217: NIKON D4, D600, D800, D800E, D3200 + -= unknown =- + 218: NIKON D5200, D7100 + 219: NIKON D5300 + 220: NIKON D610, Df + 221: NIKON D3300 + 222: NIKON D4S + 223: NIKON D750, D810 + 224: NIKON D3400, D3500, D5500, D5600, D7200 + 225: NIKON D5, D500 + 226: NIKON D7500 + 227: NIKON D850 + */ + if (imNikon.ColorBalanceVersion != 205) + { + fseek(ifp, 0x118L, SEEK_CUR); + } + ColorBalanceData_ready = + (fread(ColorBalanceData_buf, 324, 1, ifp) == 1); + } + if ((imNikon.ColorBalanceVersion >= 400) && + (imNikon.ColorBalanceVersion <= 405)) + { // 1 J1, 1 V1, 1 J2, 1 V2, 1 J3, 1 S1, 1 AW1, 1 S2, 1 J4, 1 V3, 1 J5 + ilm.CameraFormat = LIBRAW_FORMAT_1INCH; + ilm.CameraMount = LIBRAW_MOUNT_Nikon_CX; + } + else if ((imNikon.ColorBalanceVersion >= 500) && + (imNikon.ColorBalanceVersion <= 502)) + { // P7700, P7800, P330, P340 + ilm.CameraMount = ilm.LensMount = LIBRAW_MOUNT_FixedLens; + ilm.FocalType = LIBRAW_FT_ZOOM_LENS; + } + else if (imNikon.ColorBalanceVersion == 601) + { // Coolpix A + ilm.CameraFormat = ilm.LensFormat = LIBRAW_FORMAT_APSC; + ilm.CameraMount = ilm.LensMount = LIBRAW_MOUNT_FixedLens; + ilm.FocalType = LIBRAW_FT_PRIME_LENS; + } + } + else if (tag == 0x0098) // contains lens data + { + FORC4 imNikon.LensDataVersion = + imNikon.LensDataVersion * 10 + fgetc(ifp) - '0'; + switch (imNikon.LensDataVersion) + { + case 100: + LensData_len = 9; + break; + case 101: + case 201: // encrypted, starting from v.201 + case 202: + case 203: + LensData_len = 15; + break; + case 204: + LensData_len = 16; + break; + case 400: + LensData_len = 459; + break; + case 401: + LensData_len = 590; + break; + case 402: + LensData_len = 509; + break; + case 403: + LensData_len = 879; + break; + case 800: + case 801: + LensData_len = 58; + break; + case 802: + LensData_len = 108; + break; + } + if (LensData_len) + { + LensData_buf = (uchar *)malloc(LensData_len); + fread(LensData_buf, LensData_len, 1, ifp); + } + } + else if (tag == 0x00a0) + { + stmread(imgdata.shootinginfo.BodySerial, len, ifp); + } + else if (tag == 0x00a7) // shutter count + { + imNikon.key = fgetc(ifp) ^ fgetc(ifp) ^ fgetc(ifp) ^ fgetc(ifp); + if (custom_serial) + { + ci = xlat[0][custom_serial]; + } + else + { + ci = xlat[0][serial & 0xff]; + } + cj = xlat[1][imNikon.key]; + ck = 0x60; + if (((unsigned)(imNikon.ColorBalanceVersion - 200) < 18) && + ColorBalanceData_ready) + { + for (i = 0; i < 324; i++) + ColorBalanceData_buf[i] ^= (cj += ci * ck++); + i = "66666>666;6A;:;555"[imNikon.ColorBalanceVersion - 200] - '0'; + FORC4 cam_mul[c ^ (c >> 1) ^ (i & 1)] = + sget2(ColorBalanceData_buf + (i & -2) + c * 2); + } + + if (LensData_len) + { + if (imNikon.LensDataVersion > 200) + { + cj = xlat[1][imNikon.key]; + ck = 0x60; + for (i = 0; i < LensData_len; i++) + { + LensData_buf[i] ^= (cj += ci * ck++); + } + } + processNikonLensData(LensData_buf, LensData_len); + LensData_len = 0; + free(LensData_buf); + } + if (ShotInfo_len && (imNikon.ShotInfoVersion >= 208)) { + unsigned RotationOffset = 0, + OrientationOffset = 0; + + cj = xlat[1][imNikon.key]; + ck = 0x60; + for (i = 4; i < ShotInfo_len; i++) { + ShotInfo_buf[i] ^= (cj += ci * ck++); + +/* for dump: +cj_block[i-4] = cj; +ck_block[i-4] = ck-1; +*/ + } +/* for dump: +printf ("==>> ci: 0x%02x, cj at start: 0x%02x\n", +ci, xlat[1][imNikon.key]); +hexDump("ck array:", ck_block, ShotInfo_len-4); +hexDump("cj array:", cj_block, ShotInfo_len-4); +free(cj_block); +free(ck_block); +*/ + + switch (imNikon.ShotInfoVersion) { + case 208: // ShotInfoD80, Rotation + RotationOffset = 590; + if (RotationOffset>4) & 0x03; + } + break; + + case 233: // ShotInfoD810, Roll/Pitch/Yaw + OrientationOffset = sget4_order(morder, ShotInfo_buf+0x84); + break; + + case 238: // D5, ShotInfoD500, Rotation, Roll/Pitch/Yaw + case 239: // D500, ShotInfoD500, Rotation, Roll/Pitch/Yaw + RotationOffset = sget4_order(morder, ShotInfo_buf+0x10) + 0xca; + if (RotationOffset > 0xca) { + RotationOffset -= 0xb0; + } + if (RotationOffset= 0)) + imNikon.MakernotesFlip = "0863"[imNikon.MakernotesFlip] - '0'; + ShotInfo_len = 0; + free(ShotInfo_buf); + } + } + else if (tag == 0x00a8) + { // contains flash data + FORC4 imNikon.FlashInfoVersion = + imNikon.FlashInfoVersion * 10 + fgetc(ifp) - '0'; + } + else if (tag == 0x00b0) + { + get4(); // ME (multi-exposure) tag version, 4 symbols + imNikon.ExposureMode = get4(); + imNikon.nMEshots = get4(); + imNikon.MEgainOn = get4(); + } + else if (tag == 0x00b7) // AFInfo2 + { + if (!imCommon.afcount && len > 4) + { + imCommon.afdata[imCommon.afcount].AFInfoData_tag = tag; + imCommon.afdata[imCommon.afcount].AFInfoData_order = order; + int ver = 0; + FORC4 ver = ver * 10 + (fgetc(ifp) - '0'); + imCommon.afdata[imCommon.afcount].AFInfoData_version = ver; + imCommon.afdata[imCommon.afcount].AFInfoData_length = len-4; + imCommon.afdata[imCommon.afcount].AFInfoData = (uchar *)malloc(imCommon.afdata[imCommon.afcount].AFInfoData_length); + fread(imCommon.afdata[imCommon.afcount].AFInfoData, imCommon.afdata[imCommon.afcount].AFInfoData_length, 1, ifp); + imCommon.afcount = 1; + } + } + else if (tag == 0x00b9) + { + imNikon.AFFineTune = fgetc(ifp); + imNikon.AFFineTuneIndex = fgetc(ifp); + imNikon.AFFineTuneAdj = (int8_t)fgetc(ifp); + } + else if ((tag == 0x0100) && tagtypeIs(LIBRAW_EXIFTAG_TYPE_UNDEFINED)) + { + thumb_offset = ftell(ifp); + thumb_length = len; + } + else if (tag == 0x0e01) + { /* Nikon Software / in-camera edit Note */ + int loopc = 0; + int WhiteBalanceAdj_active = 0; + order = 0x4949; + fseek(ifp, 22, SEEK_CUR); + for (offset = 22; offset + 22 < len; offset += 22 + i) + { + if (loopc++ > 1024) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + tag = get4(); + fseek(ifp, 14, SEEK_CUR); + i = get4() - 4; + + if (tag == 0x76a43204) + { + WhiteBalanceAdj_active = fgetc(ifp); + } + else if (tag == 0xbf3c6c20) + { + if (WhiteBalanceAdj_active) + { + union { + double dbl; + unsigned long long lng; + } un; + un.dbl = getreal(LIBRAW_EXIFTAG_TYPE_DOUBLE); + if ((un.lng != 0x3FF0000000000000ULL) && + (un.lng != 0x000000000000F03FULL)) + { + cam_mul[0] = un.dbl; + cam_mul[2] = getreal(LIBRAW_EXIFTAG_TYPE_DOUBLE); + cam_mul[1] = cam_mul[3] = 1.0; + i -= 16; + } + else + i -= 8; + } + fseek(ifp, i, SEEK_CUR); + } + else if (tag == 0x76a43207) + { + flip = get2(); + } + else + { + fseek(ifp, i, SEEK_CUR); + } + } + } + else if (tag == 0x0e22) + { + FORC4 imNikon.NEFBitDepth[c] = get2(); + } + next: + fseek(ifp, save, SEEK_SET); + } +quit: + order = sorder; +} + +unsigned sget4_order (short _order, uchar *s) { + unsigned v; + if (_order == 0x4949) + v= s[0] | s[1] << 8 | s[2] << 16 | s[3] << 24; + else + v= s[0] << 24 | s[1] << 16 | s[2] << 8 | s[3]; + return v; +} + +double sget_fixed32u (short _order, uchar *s) { + unsigned v = sget4_order (_order, s); + return ((double)v / 6.5536 + 0.5) / 10000.0; +} + +double AngleConversion_a (short _order, uchar *s) { + double v = sget_fixed32u(_order, s); + if (v < 180.0) return -v; + return 360.0-v; +} + +double AngleConversion (short _order, uchar *s) { + double v = sget_fixed32u(_order, s); + if (v <= 180.0) return v; + return v-360.0; +} + +/* ========= */ +/* +void hexDump(char *title, void *addr, int len) +{ + int i; + unsigned char buff[17]; + unsigned char *pc = (unsigned char*)addr; + + // Output description if given. + if (title != NULL) + printf ("%s:\n", title); + + // Process every byte in the data. + for (i = 0; i < len; i++) { + // Multiple of 16 means new line (with line offset). + + if ((i % 16) == 0) { + // Just don't print ASCII for the zeroth line. + if (i != 0) + printf(" %s\n", buff); + + // Output the offset. + printf(" %04x ", i); + } + + // Now the hex code for the specific character. + printf(" %02x", pc[i]); + + // And store a printable ASCII character for later. + if ((pc[i] < 0x20) || (pc[i] > 0x7e)) { + buff[i % 16] = '.'; + } else { + buff[i % 16] = pc[i]; + } + + buff[(i % 16) + 1] = '\0'; + } + + // Pad out last line if not exactly 16 characters. + while ((i % 16) != 0) { + printf(" "); + i++; + } + + // And print the final ASCII bit. + printf(" %s\n", buff); +} +*/ diff --git a/rtengine/libraw/src/metadata/normalize_model.cpp b/rtengine/libraw/src/metadata/normalize_model.cpp new file mode 100644 index 000000000..da5ca2c02 --- /dev/null +++ b/rtengine/libraw/src/metadata/normalize_model.cpp @@ -0,0 +1,1509 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" +#include "../../internal/libraw_cameraids.h" + +void LibRaw::GetNormalizedModel() +{ + + int i, j; + char *ps; + int try_xml = 0; + + static const struct + { + unsigned long long id; + char t_model[20]; + } unique[] = +// clang-format off + { + { CanonID_EOS_M50, "EOS M50"}, // Kiss M + { CanonID_EOS_M6_Mark_II, "EOS M6 Mark II"}, + { CanonID_EOS_M200, "EOS M200"}, + { CanonID_EOS_D30, "EOS D30"}, + { CanonID_EOS_D60, "EOS D60"}, + { CanonID_EOS_M3, "EOS M3"}, + { CanonID_EOS_M10, "EOS M10"}, + { CanonID_EOS_M5, "EOS M5"}, + { CanonID_EOS_M100, "EOS M100"}, + { CanonID_EOS_M6, "EOS M6"}, + { CanonID_EOS_1D, "EOS-1D"}, + { CanonID_EOS_1Ds, "EOS-1Ds"}, + { CanonID_EOS_10D, "EOS 10D"}, + { CanonID_EOS_1D_Mark_III, "EOS-1D Mark III"}, + { CanonID_EOS_300D, "EOS 300D"}, // Digital Rebel / Kiss Digital + { CanonID_EOS_1D_Mark_II, "EOS-1D Mark II"}, + { CanonID_EOS_20D, "EOS 20D"}, + { CanonID_EOS_450D, "EOS 450D"}, // Digital Rebel XSi / Kiss X2 + { CanonID_EOS_1Ds_Mark_II, "EOS-1Ds Mark II"}, + { CanonID_EOS_350D, "EOS 350D"}, // Digital Rebel XT / Kiss Digital N + { CanonID_EOS_40D, "EOS 40D"}, + { CanonID_EOS_5D, "EOS 5D"}, + { CanonID_EOS_1Ds_Mark_III, "EOS-1Ds Mark III"}, + { CanonID_EOS_5D_Mark_II, "EOS 5D Mark II"}, + { CanonID_EOS_1D_Mark_II_N, "EOS-1D Mark II N"}, + { CanonID_EOS_30D, "EOS 30D"}, + { CanonID_EOS_400D, "EOS 400D"}, // Digital Rebel XTi / Kiss Digital X + { CanonID_EOS_7D, "EOS 7D"}, + { CanonID_EOS_500D, "EOS 500D"}, // Rebel T1i / Kiss X3 + { CanonID_EOS_1000D, "EOS 1000D"}, // Digital Rebel XS / Kiss F + { CanonID_EOS_50D, "EOS 50D"}, + { CanonID_EOS_1D_X, "EOS-1D X"}, + { CanonID_EOS_550D, "EOS 550D"}, // Rebel T2i / Kiss X4 + { CanonID_EOS_1D_Mark_IV, "EOS-1D Mark IV"}, + { CanonID_EOS_5D_Mark_III, "EOS 5D Mark III"}, + { CanonID_EOS_600D, "EOS 600D"}, // Rebel T3i / Kiss X5 + { CanonID_EOS_60D, "EOS 60D"}, + { CanonID_EOS_1100D, "EOS 1100D"}, // Rebel T3 / Kiss X50 + { CanonID_EOS_7D_Mark_II, "EOS 7D Mark II"}, + { CanonID_EOS_650D, "EOS 650D"}, // Rebel T4i / Kiss X6i + { CanonID_EOS_6D, "EOS 6D"}, + { CanonID_EOS_1D_C, "EOS-1D C"}, + { CanonID_EOS_70D, "EOS 70D"}, + { CanonID_EOS_700D, "EOS 700D"}, // Rebel T5i / Kiss X7i + { CanonID_EOS_1200D, "EOS 1200D"}, // Rebel T5 / Kiss X70 / Hi + { CanonID_EOS_1D_X_Mark_II, "EOS-1D X Mark II"}, + { CanonID_EOS_M, "EOS M"}, + { CanonID_EOS_100D, "EOS 100D"}, // Rebel SL1 / Kiss X7 + { CanonID_EOS_760D, "EOS 760D"}, // Rebel T6s / 8000D + { CanonID_EOS_5D_Mark_IV, "EOS 5D Mark IV"}, + { CanonID_EOS_80D, "EOS 80D"}, + { CanonID_EOS_M2, "EOS M2"}, + { CanonID_EOS_5DS, "EOS 5DS"}, + { CanonID_EOS_750D, "EOS 750D"}, // Rebel T6i / Kiss X8i + { CanonID_EOS_5DS_R, "EOS 5DS R"}, + { CanonID_EOS_1300D, "EOS 1300D"}, // Rebel T6 / Kiss X80 + { CanonID_EOS_800D, "EOS 800D"}, // Rebel T7i / Kiss X9i + { CanonID_EOS_6D_Mark_II, "EOS 6D Mark II"}, + { CanonID_EOS_77D, "EOS 77D"}, // 9000D + { CanonID_EOS_200D, "EOS 200D"}, // Rebel SL2 / Kiss X9 + { CanonID_EOS_R5, "EOS R5"}, + { CanonID_EOS_3000D, "EOS 3000D"}, // Rebel T100 / 4000D + { CanonID_EOS_R, "EOS R"}, + { CanonID_EOS_1D_X_Mark_III, "EOS-1D X Mark III"}, + { CanonID_EOS_1500D, "EOS 1500D"}, // Rebel T7 / 2000D / Kiss X90 + { CanonID_EOS_RP, "EOS RP"}, + { CanonID_EOS_850D, "EOS 850D"}, // EOS Rebel T8i / X10i + { CanonID_EOS_250D, "EOS 250D"}, // Rebel SL3 / 200D II / Kiss X10 + { CanonID_EOS_90D, "EOS 90D"}, + { CanonID_EOS_R3, "EOS R3"}, + { CanonID_EOS_R6, "EOS R6"}, + { CanonID_EOS_R7, "EOS R7"}, + { CanonID_EOS_R10, "EOS R10"}, + { CanonID_EOS_M50_Mark_II, "EOS M50 Mark II"}, // M50m2, Kiss M2 + { CanonID_EOS_R50, "EOS R50"}, + { CanonID_EOS_R6m2, "EOS R6 Mark II"}, + { CanonID_EOS_R8, "EOS R8"}, + { CanonID_EOS_R100, "EOS R100"} + }, +#if 0 + olyque[] = { + { OlyID_E_20, "E-20"}, + { OlyID_E_20, "E-20,E-20N,E-20P"}, + { OlyID_E_1, "E-1"}, + { OlyID_E_300, "E-300"}, + { OlyID_SP_550UZ, "SP-550UZ"}, + { OlyID_SP_550UZ, "SP550UZ"}, + { OlyID_SP_510UZ, "SP-510UZ"}, + { OlyID_SP_510UZ, "SP510UZ"}, + { OlyID_SP_560UZ, "SP-560UZ"}, + { OlyID_SP_560UZ, "SP560UZ"}, + { OlyID_SP_570UZ, "SP-570UZ"}, + { OlyID_SP_570UZ, "SP570UZ"}, + { OlyID_SP_565UZ, "SP-565UZ"}, + { OlyID_SP_565UZ, "SP565UZ"}, + { OlyID_XZ_1, "XZ-1"}, + { OlyID_XZ_2, "XZ-2"}, + { OlyID_XZ_10, "XZ-10"}, + { OlyID_STYLUS_1, "Stylus 1"}, + { OlyID_STYLUS_1, "STYLUS1"}, + { OlyID_STYLUS_1, "STYLUS1,1s"}, + { OlyID_SH_2, "SH-2"}, + { OlyID_TG_4, "TG-4"}, + { OlyID_TG_5, "TG-5"}, + { OlyID_TG_6, "TG-6"}, + { OlyID_E_10, "E-10"}, + { OlyID_AIR_A01, "AIR A01"}, + { OlyID_AIR_A01, "AIR-A01"}, + { OlyID_E_330, "E-330"}, + { OlyID_E_500, "E-500"}, + { OlyID_E_400, "E-400"}, + { OlyID_E_510, "E-510"}, + { OlyID_E_3, "E-3"}, + { OlyID_E_410, "E-410"}, + { OlyID_E_420, "E-420"}, + { OlyID_E_30, "E-30"}, + { OlyID_E_520, "E-520"}, + { OlyID_E_P1, "E-P1"}, + { OlyID_E_620, "E-620"}, + { OlyID_E_P2, "E-P2"}, + { OlyID_E_PL1, "E-PL1"}, + { OlyID_E_450, "E-450"}, + { OlyID_E_600, "E-600"}, + { OlyID_E_P3, "E-P3"}, + { OlyID_E_5, "E-5"}, + { OlyID_E_PL2, "E-PL2"}, + { OlyID_E_M5, "E-M5"}, + { OlyID_E_PL3, "E-PL3"}, + { OlyID_E_PM1, "E-PM1"}, + { OlyID_E_PL1s, "E-PL1s"}, + { OlyID_E_PL5, "E-PL5"}, + { OlyID_E_PM2, "E-PM2"}, + { OlyID_E_P5, "E-P5"}, + { OlyID_E_PL6, "E-PL6"}, + { OlyID_E_PL7, "E-PL7"}, + { OlyID_E_M1, "E-M1"}, + { OlyID_E_M10, "E-M10"}, + { OlyID_E_M5_Mark_II, "E-M5 Mark II"}, + { OlyID_E_M5_Mark_II, "E-M5MarkII"}, + { OlyID_E_M5_Mark_II, "E-M5_M2"}, + { OlyID_E_M10_Mark_II, "E-M10 Mark II"}, // Clauss piX 5oo + { OlyID_E_M10_Mark_II, "E-M10MarkII"}, + { OlyID_E_M10_Mark_II, "E-M10_M2"}, + { OlyID_PEN_F, "PEN-F"}, + { OlyID_E_PL8, "E-PL8"}, + { OlyID_E_M1_Mark_II, "E-M1 Mark II"}, + { OlyID_E_M1_Mark_II, "E-M1MarkII"}, + { OlyID_E_M1_Mark_II, "E-M1_M2"}, + { OlyID_E_M10_Mark_III, "E-M10 Mark III"}, + { OlyID_E_M10_Mark_III, "E-M10_M3"}, + { OlyID_E_PL9, "E-PL9"}, + { OlyID_E_M1X, "E-M1X"}, + { OlyID_E_PL10, "E-PL10"}, + { OlyID_E_M10_Mark_IV, "E-M10 Mark IV"}, + { OlyID_E_M10_Mark_IV, "E-M10MarkIV"}, + { OlyID_E_M10_Mark_IV, "E-M10_M4"}, + { OlyID_E_M5_Mark_III, "E-M5 Mark III"}, + { OlyID_E_M5_Mark_III, "E-M5MarkIII"}, + { OlyID_E_M5_Mark_III, "E-M5_M3"}, + { OlyID_E_M1_Mark_III, "E-M1 Mark III"}, + { OlyID_E_M1_Mark_III, "E-M1MarkIII"}, + { OlyID_E_M1_Mark_III, "E-M1_M3"}, + { OlyID_E_P7 "E-P7"}, + { OlyID_C_3030Z, "C-3030Z"}, + { OlyID_C_3030Z, "C3030Z"}, + { OlyID_C_5050Z, "C-5050Z"}, + { OlyID_C_5050Z, "C5050Z"}, + { OlyID_C_350Z, "C-350Z"}, + { OlyID_C_350Z, "X200,D560Z,C350Z"}, + { OlyID_C_740UZ, "C-740UZ"}, + { OlyID_C_740UZ, "C740UZ"}, + { OlyID_C_5060WZ, "C-5060WZ"}, + { OlyID_C_5060WZ, "C5060WZ"}, + { OlyID_C_8080WZ, "C-8080WZ"}, + { OlyID_C_8080WZ, "C8080WZ"}, + { OlyID_C_770UZ, "C-770UZ"}, + { OlyID_C_770UZ, "C770UZ"}, + { OlyID_C_7070WZ, "C-7070WZ"}, + { OlyID_C_7070WZ, "C7070WZ"}, + { OlyID_C_7000Z, "C-7000Z"}, + { OlyID_C_7000Z, "C70Z,C7000Z"}, + { OlyID_SP_500UZ, "SP-500UZ"}, + { OlyID_SP_500UZ, "SP500UZ"}, + { OlyID_SP_310, "SP-310"}, + { OlyID_SP_310, "SP310"}, + { OlyID_SP_350, "SP-350"}, + { OlyID_SP_350, "SP350"}, + { OlyID_SP_320, "SP-320"}, + { OlyID_SP_320, "SP320"}, + }, + + penique[] = { + { PentaxID_Optio_S, "Optio S"}, + { PentaxID_Optio_S_V101, "Optio S V1.01"}, + { PentaxID_staristD, "*istD"}, + { PentaxID_staristD, "*ist D"}, + { PentaxID_Optio_33WR, "Optio 33WR"}, + { PentaxID_Optio_S4, "Optio S4"}, + { PentaxID_Optio_750Z, "Optio 750Z"}, + { PentaxID_staristDS, "*istDS"}, + { PentaxID_staristDS, "*ist DS"}, + { PentaxID_staristDL, "*istDL"}, + { PentaxID_staristDL, "*ist DL"}, + { PentaxID_staristDS2, "*istDS2"}, + { PentaxID_staristDS2, "*ist DS2"}, + { PentaxID_GX_1S, "GX-1S"}, // Samsung + { PentaxID_staristDL2, "*istDL2"}, + { PentaxID_staristDL2, "*ist DL2"}, + { PentaxID_GX_1L, "GX-1L"}, // Samsung + { PentaxID_K100D, "K100D"}, + { PentaxID_K110D, "K110D"}, + { PentaxID_K100D_Super, "K100D Super"}, + { PentaxID_K10D, "K10D"}, + { PentaxID_GX10, "GX10"}, // Samsung + { PentaxID_GX10, "GX-10"}, // Samsung + { PentaxID_K20D, "K20D"}, + { PentaxID_GX20, "GX20"}, // Samsung + { PentaxID_GX20, "GX-20"}, // Samsung + { PentaxID_K200D, "K200D"}, + { PentaxID_K2000, "K2000"}, + { PentaxID_K_m, "K-m"}, + { PentaxID_K_7, "K-7"}, + { PentaxID_K_x, "K-x"}, + { PentaxID_645D, "645D"}, + { PentaxID_K_r, "K-r"}, + { PentaxID_K_5, "K-5"}, + { PentaxID_Q, "Q"}, + { PentaxID_K_01, "K-01"}, + { PentaxID_K_30, "K-30"}, + { PentaxID_Q10, "Q10"}, + { PentaxID_K_5_II, "K-5 II"}, + { PentaxID_K_5_II_s, "K-5 II s"}, + { PentaxID_Q7, "Q7"}, + { PentaxID_MX_1, "MX-1"}, + { PentaxID_K_50, "K-50"}, + { PentaxID_K_3, "K-3"}, + { PentaxID_K_500, "K-500"}, + { PentaxID_645Z, "645Z"}, + { PentaxID_K_S1, "K-S1"}, + { PentaxID_K_S2, "K-S2"}, // Ricoh + { PentaxID_Q_S1, "Q-S1"}, + { PentaxID_K_1, "K-1"}, // Ricoh + { PentaxID_K_3_II, "K-3 II"}, // Ricoh + { PentaxID_GR_III, "GR III"}, // Ricoh + { PentaxID_K_70, "K-70"}, // Ricoh + { PentaxID_KP, "KP"}, // Ricoh + { PentaxID_K_1_Mark_II, "K-1 Mark II"}, // Ricoh + { PentaxID_K_3_III, "K-3 Mark III"}, // Ricoh + { PentaxID_GR_IIIx, "GR IIIx"}, + }, +#endif + sonique[] = { + { SonyID_DSC_R1, "DSC-R1"}, + { SonyID_DSLR_A100, "DSLR-A100"}, + { SonyID_DSLR_A900, "DSLR-A900"}, + { SonyID_DSLR_A700, "DSLR-A700"}, + { SonyID_DSLR_A200, "DSLR-A200"}, + { SonyID_DSLR_A350, "DSLR-A350"}, + { SonyID_DSLR_A300, "DSLR-A300"}, + { SonyID_DSLR_A900_APSC, "DSLR-A900"}, + { SonyID_DSLR_A380, "DSLR-A380"}, // DSLR-A390 + { SonyID_DSLR_A330, "DSLR-A330"}, + { SonyID_DSLR_A230, "DSLR-A230"}, + { SonyID_DSLR_A290, "DSLR-A290"}, + { SonyID_DSLR_A850, "DSLR-A850"}, + { SonyID_DSLR_A850_APSC, "DSLR-A850"}, + { SonyID_DSLR_A550, "DSLR-A550"}, + { SonyID_DSLR_A500, "DSLR-A500"}, + { SonyID_DSLR_A450, "DSLR-A450"}, + { SonyID_NEX_5, "NEX-5"}, + { SonyID_NEX_3, "NEX-3"}, + { SonyID_SLT_A33, "SLT-A33"}, + { SonyID_SLT_A55, "SLT-A55"}, // SLT-A55V + { SonyID_DSLR_A560, "DSLR-A560"}, + { SonyID_DSLR_A580, "DSLR-A580"}, + { SonyID_NEX_C3, "NEX-C3"}, + { SonyID_SLT_A35, "SLT-A35"}, + { SonyID_SLT_A65, "SLT-A65"}, // SLT-A65V + { SonyID_SLT_A77, "SLT-A77"}, // SLT-A77V + { SonyID_NEX_5N, "NEX-5N"}, + { SonyID_NEX_7, "NEX-7"}, // Hasselblad Lunar + { SonyID_NEX_VG20, "NEX-VG20"}, + { SonyID_SLT_A37, "SLT-A37"}, + { SonyID_SLT_A57, "SLT-A57"}, + { SonyID_NEX_F3, "NEX-F3"}, + { SonyID_SLT_A99, "SLT-A99"}, // SLT-A99V / Hasselblad HV + { SonyID_NEX_6, "NEX-6"}, + { SonyID_NEX_5R, "NEX-5R"}, + { SonyID_DSC_RX100, "DSC-RX100"}, // Hasselblad Stellar + { SonyID_DSC_RX1, "DSC-RX1"}, + { SonyID_NEX_VG900, "NEX-VG900"}, + { SonyID_NEX_VG30, "NEX-VG30"}, + { SonyID_ILCE_3000, "ILCE-3000"}, // ILCE-3500 + { SonyID_SLT_A58, "SLT-A58"}, + { SonyID_NEX_3N, "NEX-3N"}, + { SonyID_ILCE_7, "ILCE-7"}, + { SonyID_NEX_5T, "NEX-5T"}, + { SonyID_DSC_RX100M2, "DSC-RX100M2"}, // Hasselblad Stellar II + { SonyID_DSC_RX10, "DSC-RX10"}, + { SonyID_DSC_RX1R, "DSC-RX1R"}, + { SonyID_ILCE_7R, "ILCE-7R"}, // Hasselblad Lusso + { SonyID_ILCE_6000, "ILCE-6000"}, + { SonyID_ILCE_5000, "ILCE-5000"}, + { SonyID_DSC_RX100M3, "DSC-RX100M3"}, + { SonyID_ILCE_7S, "ILCE-7S"}, + { SonyID_ILCA_77M2, "ILCA-77M2"}, + { SonyID_ILCE_5100, "ILCE-5100"}, + { SonyID_ILCE_7M2, "ILCE-7M2"}, + { SonyID_DSC_RX100M4, "DSC-RX100M4"}, + { SonyID_DSC_RX10M2, "DSC-RX10M2"}, + { SonyID_DSC_RX1RM2, "DSC-RX1RM2"}, + { SonyID_ILCE_QX1, "ILCE-QX1"}, + { SonyID_ILCE_7RM2, "ILCE-7RM2"}, + { SonyID_ILCE_7SM2, "ILCE-7SM2"}, + { SonyID_ILCA_68, "ILCA-68"}, + { SonyID_ILCA_99M2, "ILCA-99M2"}, + { SonyID_DSC_RX10M3, "DSC-RX10M3"}, + { SonyID_DSC_RX100M5, "DSC-RX100M5"}, + { SonyID_ILCE_6300, "ILCE-6300"}, + { SonyID_ILCE_9, "ILCE-9"}, + { SonyID_ILCE_6500, "ILCE-6500"}, + { SonyID_ILCE_7RM3, "ILCE-7RM3"}, + { SonyID_ILCE_7M3, "ILCE-7M3"}, + { SonyID_DSC_RX0, "DSC-RX0"}, + { SonyID_DSC_RX10M4, "DSC-RX10M4"}, + { SonyID_DSC_RX100M6, "DSC-RX100M6"}, + { SonyID_DSC_HX99, "DSC-HX99"}, + { SonyID_DSC_RX100M5A, "DSC-RX100M5A"}, + { SonyID_ILCE_6400, "ILCE-6400"}, + { SonyID_DSC_RX0M2, "DSC-RX0M2"}, + { SonyID_DSC_HX95, "DSC-HX95"}, + { SonyID_DSC_RX100M7, "DSC-RX100M7"}, + { SonyID_ILCE_7RM4, "ILCE-7RM4"}, + { SonyID_ILCE_9M2, "ILCE-9M2"}, + { SonyID_ILCE_6600, "ILCE-6600"}, + { SonyID_ILCE_6100, "ILCE-6100"}, + { SonyID_ZV_1, "ZV-1"}, + { SonyID_ILCE_7C, "ILCE-7C"}, + { SonyID_ZV_E10, "ZV-E10"}, + { SonyID_ILCE_7SM3, "ILCE-7SM3"}, + { SonyID_ILCE_1, "ILCE-1"}, + { SonyID_ILME_FX3, "ILME-FX3"}, + { SonyID_ILCE_7RM3A, "ILCE-7RM3A"}, + { SonyID_ILCE_7RM4A, "ILCE-7RM4A"}, + { SonyID_ILCE_7M4, "ILCE-7M4"}, + +// Sony ZV-1F doesn't save raw +// { SonyID_ZV_1F, "ZV-1F"}, + + { SonyID_ILCE_7RM5, "ILCE-7RM5"}, + { SonyID_ILME_FX30, "ILME-FX30"}, + { SonyID_ZV_E1, "ZV-E1"}, + { SonyID_ILCE_6700, "ILCE-6700"}, + { SonyID_ZV_1M2, "ZV-1M2"}, + { SonyID_ILCE_7CR, "ILCE-7CR"}, + { SonyID_ILCE_7CM2, "ILCE-7CM2"}, + }; + + static const char *orig; + + static const char fujialias[][16] = { + "@DBP for GX680", "DX-2000", + "@F500EXR", "F505EXR", + "@F600EXR", "F605EXR", + "@F770EXR", "F775EXR", + "@HS10", "HS10 HS11", + "@HS20EXR", "HS22EXR", + "@HS30EXR", "HS33EXR", "HS35EXR", + "@S5100", "S5500", + "@S5200", "S5600", + "@S6000fd", "S6500fd", + "@S9000", "S9500", + "@S9100", "S9600", + "@S200EXR", "S205EXR", + "@X-T1 IR", "X-T1IR", + "@GFX 100 II", "GFX100 II", + "@GFX 100S", "GFX100S", + "@GFX 50S II", "GFX50S II" + }; + + static const char kodakalias[][16] = { + "@DCS Pro 14N", "Camerz ZDS 14", // Camerz rebadge make: "Photo Control" + "@DCS720X", "SCS2000", + "@DCS520C", "EOS D2000C", "EOS D2000", // EOS rebadge make: Canon + "@DCS560C", "EOS D6000C", "EOS D6000", // EOS rebadge make: Canon + "@DCS460M", "DCS460A", // 'A' was supposed to stand for 'achromatic', marketing changed it to 'M' + "@DCS460", "DCS460C", "DCS460D", + "@DCS465", "DCS465C", "DCS465D", + "@EOSDCS1", "EOSDCS1B", "EOSDCS1C", + "@EOSDCS3", "EOSDCS3B", "EOSDCS3C", + }; + + static const struct + { + const char *Kmodel; + ushort mount; + } Kodak_mounts[] = { + {"DCS465", LIBRAW_MOUNT_DigitalBack}, + {"DCS5", LIBRAW_MOUNT_Canon_EF}, + {"DCS Pro SLR/c", LIBRAW_MOUNT_Canon_EF}, + {"DCS", LIBRAW_MOUNT_Nikon_F}, + {"EOS", LIBRAW_MOUNT_Canon_EF}, + {"NC2000", LIBRAW_MOUNT_Nikon_F}, // AP "News Camera" + {"Pixpro S-1", LIBRAW_MOUNT_mFT}, + {"ProBack", LIBRAW_MOUNT_DigitalBack}, + {"SCS1000", LIBRAW_MOUNT_Canon_EF}, + }; + + static const char *KodakMonochrome[] = { + "DCS420M", "DCS420A", "DCS420I", + "DCS460M", "DCS460A", "DCS460I", + "DCS465M", "DCS465A", "DCS465I", + "DCS560M", "DCS660M", "DCS760M", "EOS D2000M", "EOS D6000M", + "EOSDCS1M", "EOSDCS1I", + "EOSDCS3M", "EOSDCS3I", + "EOSDCS5M", "EOSDCS5I", + "NC2000M", "NC2000A", "NC2000I", + }; + + static const char leafalias[][16] = { + // Leaf re-badged to Mamiya + "@Aptus-II 5", "DM22", + "@Aptus-II 6", "DM28", + "@Aptus-II 7", "DM33", + "@Aptus-II 8", "DM40", + "@Aptus-II 10", "DM56", + }; + + static const char KonicaMinolta_aliases[][24] = { + "@DG-5D", "DYNAX 5D", "MAXXUM 5D", "ALPHA-5 DIGITAL", "ALPHA SWEET DIGITAL", + "@DG-7D", "DYNAX 7D", "MAXXUM 7D", "ALPHA-7 DIGITAL", + }; + + static const char nikonalias[][16] = { + "@COOLPIX 2100", "E2100", "@COOLPIX 2500", "E2500", + "@COOLPIX 3200", "E3200", "@COOLPIX 3700", "E3700", + "@COOLPIX 4300", "E4300", "@COOLPIX 4500", "E4500", + "@COOLPIX 5000", "E5000", "@COOLPIX 5400", "E5400", + "@COOLPIX 5700", "E5700", "@COOLPIX 8400", "E8400", + "@COOLPIX 8700", "E8700", "@COOLPIX 8800", "E8800", + "@COOLPIX 700", "E700", "@COOLPIX 800", "E800", + "@COOLPIX 880", "E880", "@COOLPIX 900", "E900", + "@COOLPIX 950", "E950", "@COOLPIX 990", "E990", + "@COOLPIX 995", "E995", "@COOLPIX P7700", "COOLPIX Deneb", + "@COOLPIX P7800", "COOLPIX Kalon", + }; + + static const char olyalias[][32] = { // Olympus + "@AIR A01", "AIR-A01", + "@C-3030Z", "C3030Z", + "@C-5050Z", "C5050Z", + "@C-5060WZ", "C5060WZ", + "@C-7000Z", "C7000Z", "C70Z,C7000Z", "C70Z", + "@C-7070WZ", "C7070WZ", + "@C-8080WZ", "C8080WZ", + "@C-350Z", "C350Z", "X200,D560Z,C350Z", "X200", "D560Z", + "@C-740UZ", "C740UZ", + "@C-770UZ", "C770UZ", + "@E-20", "E-20,E-20N,E-20P", "E-20N", "E-20P", + "@E-M10 Mark II", "E-M10MarkII", "E-M10_M2", "piX 5oo", + "@E-M10 Mark III", "E-M10MarkIII", "E-M10_M3", + "@E-M10 Mark IV", "E-M10MarkIV", "E-M10_M4", + "@E-M1 Mark II", "E-M1MarkII", "E-M1_M2", + "@E-M1 Mark III", "E-M1MarkIII", "E-M1_M3", + "@E-M5 Mark II", "E-M5MarkII", "E-M5_M2", + "@E-M5 Mark III", "E-M5MarkIII", "E-M5_M3", + "@SH-2", "SH-3", + "@SP-310", "SP310", + "@SP-320", "SP320", + "@SP-350", "SP350", + "@SP-500UZ", "SP500UZ", + "@SP-510UZ", "SP510UZ", + "@SP-550UZ", "SP550UZ", + "@SP-560UZ", "SP560UZ", + "@SP-565UZ", "SP565UZ", + "@SP-570UZ", "SP570UZ", + "@Stylus 1", "STYLUS1", "STYLUS1s", "STYLUS1,1s", + }; + + static const char panalias[][16] = { // Panasonic, PanaLeica +// fixed lens + "@DMC-FX150", "DMC-FX180", + "@DC-FZ1000M2", "DC-FZ10002", "V-Lux 5", + "@DMC-FZ1000", "V-LUX (Typ 114)", + "@DMC-FZ2500", "DMC-FZ2000", "DMC-FZH1", + "@DMC-FZ100", "V-LUX 2", + "@DMC-FZ150", "V-LUX 3", + "@DMC-FZ200", "V-LUX 4", + "@DMC-FZ300", "DMC-FZ330", + "@DMC-FZ35", "DMC-FZ38", + "@DMC-FZ40", "DMC-FZ42", "DMC-FZ45", "DC-FZ40", "DC-FZ42", "DC-FZ45", + "@DMC-FZ50", "V-LUX 1", "V-LUX1", + "@DMC-FZ70", "DMC-FZ72", + "@DC-FZ80", "DC-FZ81", "DC-FZ82", "DC-FZ83", "DC-FZ85", + "@DMC-LC1", "DIGILUX 2", "Digilux 2", "DIGILUX2", + "@DMC-LF1", "C (Typ 112)", + "@DC-LX100M2", "D-Lux 7", + "@DMC-LX100", "D-LUX (Typ 109)", "D-Lux (Typ 109)", + "@DMC-LX1", "D-Lux2", "D-LUX2", "D-LUX 2", + "@DMC-LX2", "D-LUX 3", "D-LUX3", + "@DMC-LX3", "D-LUX 4", + "@DMC-LX5", "D-LUX 5", + "@DMC-LX7", "D-LUX 6", + "@DMC-LX9", "DMC-LX10", "DMC-LX15", + "@DMC-ZS100", "DMC-ZS110", "DMC-TZ100", "DMC-TZ101", "DMC-TZ110", "DMC-TX1", + "@DC-ZS200", "DC-ZS220", "DC-TZ200", "DC-TZ202", "DC-TZ220", "DC-TZ200D", "DC-TZ202D", "DC-TZ220D", "DC-ZS200D", "DC-ZS220D" "DC-TX2", "C-Lux", "CAM-DC25", + "@DMC-ZS40", "DMC-TZ60", "DMC-TZ61", + "@DMC-ZS50", "DMC-TZ70", "DMC-TZ71", + "@DMC-ZS60", "DMC-TZ80", "DMC-TZ81", "DMC-TZ82", "DMC-TZ85", + "@DC-ZS70", "DC-TZ90", "DC-TZ91", "DC-TZ92", "DC-TZ93", + "@DC-ZS80", "DC-TZ95", "DC-TZ96", "DC-TZ97", + +// interchangeable lens + "@DC-G100", "DC-G110", + "@DC-G99", "DC-G90", "DC-G91", "DC-G95", + "@DMC-G7", "DMC-G70", + "@DMC-G8", "DMC-G80", "DMC-G81", "DMC-G85", + "@DMC-GH4", "AG-GH4", "CGO4", + "@DC-GF10", "DC-GF90", "DC-GX880", + "@DC-GF9", "DC-GX850", "DC-GX800", + "@DMC-GM1", "DMC-GM1S", + "@DMC-GX85", "DMC-GX80", "DMC-GX7MK2", + "@DC-GX9", "DC-GX7MK3", + "@DMC-L1", "DIGILUX 3", "DIGILUX3", // full 4/3 mount, not m43 + }; + + static const char phase1alias[][16] = { + "@H20", "H 20", + "@H25", "H 25", + "@P20+", "P 20+", + "@P20", "P 20", + "@P21+", "P 21+", "M18", // "Mamiya M18" + "@P21", "P 21", + "@P25+", "P 25+", "M22", // "Mamiya M22" + "@P25", "P 25", + "@P30+", "P 30+", "M31", // "Mamiya M31" + "@P30", "P 30", + "@P40+", "P 40+", + "@P40", "P 40", + "@P45+", "P 45+", + "@P45", "P 45", + "@P65+", "P 65+", + "@P65", "P 65", + }; + + static const char SamsungPentax_aliases[][16] = { + "@*istDL2", "*ist DL2", "GX-1L", + "@*istDS2", "*ist DS2", "GX-1S", + "@*istDL", "*ist DL", + "@*istDS", "*ist DS", + "@*istD", "*ist D", + "@K10D", "GX10", "GX-10", + "@K20D", "GX20", "GX-20", + "@K-m", "K2000", + }; + + static const char samsungalias[][64] = { + "@EX1", "TL500", + "@NX U", "EK-GN100", "EK-GN110", "EK-GN120", "EK-KN120", "Galaxy NX", + "@NX mini", "NXF1", + "@WB2000", "TL350", + // "@WB5000", "WB5000/HZ25W", // no spaces around the slash separating names + // "@WB5500", "WB5500 / VLUU WB5500 / SAMSUNG HZ50W", + // "@WB500", "WB510 / VLUU WB500 / SAMSUNG HZ10W", + // "@WB550", "WB560 / VLUU WB550 / SAMSUNG HZ15W", + // "@WB650", "SAMSUNG WB650 / VLUU WB650 / SAMSUNG WB660" aka HZ35W + }; + +//clang-format on + if (makeIs(LIBRAW_CAMERAMAKER_VLUU)) { + setMakeFromIndex(LIBRAW_CAMERAMAKER_Samsung); + } + + if (makeIs(LIBRAW_CAMERAMAKER_Samsung) && + (ilm.CameraMount == LIBRAW_MOUNT_Pentax_K)) { + setMakeFromIndex(LIBRAW_CAMERAMAKER_Pentax); + + } else if (makeIs(LIBRAW_CAMERAMAKER_Unknown)) { + if (strcasestr(model, "Google")) { + setMakeFromIndex(LIBRAW_CAMERAMAKER_Google); + } +#ifdef USE_6BY9RPI + else if(strcasestr(make,"RaspberryPi")) + setMakeFromIndex(LIBRAW_CAMERAMAKER_RaspberryPi); +#endif + } + else if (makeIs(LIBRAW_CAMERAMAKER_Hasselblad) && is_Sony) + { + setMakeFromIndex(LIBRAW_CAMERAMAKER_Sony); + } + else if (makeIs(LIBRAW_CAMERAMAKER_OmDigital)) + { + setMakeFromIndex(LIBRAW_CAMERAMAKER_Olympus); + } + else if (makeIs(LIBRAW_CAMERAMAKER_Clauss) && (OlyID == OlyID_E_M10_Mark_II)) + { + setMakeFromIndex(LIBRAW_CAMERAMAKER_Olympus); + } else if (makeIs(LIBRAW_CAMERAMAKER_Canon) && + (!strncmp(model, "EOS D2000", 9) || // don't use unique_id here + !strncmp(model, "EOS D6000", 9) || // because ids for Monochrome models are unknown + !strncmp(model, "EOSDCS", 6))) { + setMakeFromIndex(LIBRAW_CAMERAMAKER_Kodak); +// if (unique_id == CanonID_EOS_D2000C) { +// +// } else if (unique_id == CanonID_EOS_D6000C) { +/// +// } + + } else if (makeIs(LIBRAW_CAMERAMAKER_PhotoControl) && + !strncasecmp(model, "Camerz ZDS 14", 13)) { + setMakeFromIndex(LIBRAW_CAMERAMAKER_Kodak); + + } else { + strcpy(normalized_make, make); + } + + if (makeIs(LIBRAW_CAMERAMAKER_Apple)) { + if ((imgdata.color.UniqueCameraModel[0]) && + (!strncmp(model, "iPad", 4) || !strncmp(model, "iPhone", 6))) + strcpy(model, imgdata.color.UniqueCameraModel); + + } else if (makeIs(LIBRAW_CAMERAMAKER_Kodak)) { + if ((model[6] == ' ') && + (!strncmp(model, "DCS4", 4) || + !strncmp(model, "NC2000", 6))) + { + model[6] = 0; + } + if ((model[6] != 'A') && + (model[6] != 'I') && + (model[6] != 'M') && + !strncmp(model, "NC2000", 6)) + { + model[6] = 0; + } + } + + else if (makeIs(LIBRAW_CAMERAMAKER_Ricoh) && + !strncmp(model, "GXR", 3)) { + strcpy(ilm.body, "Ricoh GXR"); + if (!imgdata.lens.Lens[0] && imgdata.color.UniqueCameraModel[0]) { + strcpy (imgdata.lens.Lens, imgdata.color.UniqueCameraModel); + remove_caseSubstr (imgdata.lens.Lens, (char *)"Ricoh"); + remove_caseSubstr (imgdata.lens.Lens, (char *)"Lens"); + removeExcessiveSpaces (imgdata.lens.Lens); + } + if (ilm.LensID == LIBRAW_LENS_NOT_SET) { + if (strstr(imgdata.lens.Lens, "50mm")) + ilm.LensID = 1; + else if (strstr(imgdata.lens.Lens, "S10")) + ilm.LensID = 2; + else if (strstr(imgdata.lens.Lens, "P10")) + ilm.LensID = 3; + else if (strstr(imgdata.lens.Lens, "28mm")) + ilm.LensID = 5; + else if (strstr(imgdata.lens.Lens, "A16")) + ilm.LensID = 6; + } + switch (ilm.LensID) { + case 1: // GR Lens A12 50mm F2.5 Macro + strcpy(model, "GXR A12 50mm"); + ilm.CameraFormat = ilm.LensFormat = LIBRAW_FORMAT_APSC; + ilm.CameraMount = LIBRAW_MOUNT_RicohModule; + ilm.LensMount = LIBRAW_MOUNT_FixedLens; + ilm.FocalType = LIBRAW_FT_PRIME_LENS; + break; + case 2: + strcpy(model, "GXR S10"); + ilm.CameraFormat = ilm.LensFormat = LIBRAW_FORMAT_1div1p7INCH; + ilm.CameraMount = LIBRAW_MOUNT_RicohModule; + ilm.LensMount = LIBRAW_MOUNT_FixedLens; + ilm.FocalType = LIBRAW_FT_ZOOM_LENS; + break; + case 3: // Ricoh Lens P10 28-300mm F3.5-5.6 VC + strcpy(model, "GXR P10"); + ilm.CameraFormat = ilm.LensFormat = LIBRAW_FORMAT_1div2p3INCH; + ilm.CameraMount = LIBRAW_MOUNT_RicohModule; + ilm.LensMount = LIBRAW_MOUNT_FixedLens; + ilm.FocalType = LIBRAW_FT_ZOOM_LENS; + break; + case 5: // GR Lens A12 28mm F2.5 + strcpy(model, "GXR A12 28mm"); + ilm.CameraFormat = ilm.LensFormat = LIBRAW_FORMAT_APSC; + ilm.CameraMount = LIBRAW_MOUNT_RicohModule; + ilm.LensMount = LIBRAW_MOUNT_FixedLens; + ilm.FocalType = LIBRAW_FT_PRIME_LENS; + break; + case 6: // Ricoh Lens A16 24-85mm F3.5-5.5 + strcpy(model, "GXR A16"); + ilm.CameraFormat = ilm.LensFormat = LIBRAW_FORMAT_APSC; + ilm.CameraMount = LIBRAW_MOUNT_RicohModule; + ilm.LensMount = LIBRAW_MOUNT_FixedLens; + ilm.FocalType = LIBRAW_FT_ZOOM_LENS; + break; + case 8: // Ricoh Mount A12 (Leica M lenses) + strcpy(model, "GXR Mount A12"); + ilm.CameraFormat = LIBRAW_FORMAT_APSC; + ilm.CameraMount = LIBRAW_MOUNT_Leica_M; + ilm.LensID = LIBRAW_LENS_NOT_SET; + break; + } + } + + strcpy(normalized_model, model); + + if (makeIs(LIBRAW_CAMERAMAKER_Canon)) + { + if (unique_id) + { + if ((unique_id != CanonID_EOS_D2000C) && + (unique_id != CanonID_EOS_D6000C)) + { + for (i = 0; i < int(sizeof unique / sizeof *unique); i++) + { + if (unique_id == unique[i].id) + { + if (!strcmp(model, "EOS Ra")) { + strcpy(normalized_model, model); + } else { + strcpy(model, unique[i].t_model); + strcpy(normalized_model, unique[i].t_model); + } + break; + } + } + } + } + else + { + if ((dng_version) && + (strlen(imgdata.color.UniqueCameraModel) > 6) && + strncmp(imgdata.color.UniqueCameraModel+6, "PowerShot", 9)) + { + if (!strcmp(model, "EOS Ra")) { + ilm.CamID = unique_id = CanonID_EOS_R; + strcpy(normalized_model, model); + // try_xml = 1; // ?? + } else { + for (i = 0; i < int(sizeof unique / sizeof *unique); i++) + { + if (!strcmp(unique[i].t_model, imgdata.color.UniqueCameraModel+6)) + { + ilm.CamID = unique_id = unique[i].id; + strcpy(normalized_model, unique[i].t_model); + try_xml = 1; + break; + } + } + } + } + } + } + else if (makeIs(LIBRAW_CAMERAMAKER_Fujifilm)) + { + for (i = 0; i < int(sizeof fujialias / sizeof *fujialias); i++) + { + if (fujialias[i][0] == '@') + { + orig = fujialias[i] + 1; + if (!strcmp(model, orig)) break; + } + else if (!strcmp(model, fujialias[i])) + { + strcpy(normalized_model, orig); + break; + } + } + + } else if (makeIs(LIBRAW_CAMERAMAKER_Hasselblad)) { + parseHassyModel(); + } + else if (makeIs(LIBRAW_CAMERAMAKER_Mamiya)) + { + for (i = 0; i < int(sizeof phase1alias / sizeof *phase1alias); i++) + { // re-badged Phase One backs + if (phase1alias[i][0] == '@') orig = phase1alias[i] + 1; + else if (!strcmp(model, phase1alias[i])) + { + setMakeFromIndex(LIBRAW_CAMERAMAKER_PhaseOne); + strcpy(normalized_model, orig); + break; + } + } + for (i = 0; i < int(sizeof leafalias / sizeof *leafalias); i++) + { // re-badged Leaf backs + if (leafalias[i][0] == '@') orig = leafalias[i] + 1; + else if (!strcmp(model, leafalias[i])) + { + setMakeFromIndex(LIBRAW_CAMERAMAKER_Leaf); + strcpy(normalized_model, orig); + break; + } + } + + /* repeating, because make for some Mamiya re-badged Leaf backs is set to + * Leaf */ + } + else if (makeIs(LIBRAW_CAMERAMAKER_Leaf)) + { + for (i = 0; i < int(sizeof leafalias / sizeof *leafalias); i++) + { // re-badged Leaf backs + if (leafalias[i][0] == '@') + { + orig = leafalias[i] + 1; + if (!strcmp(model, orig)) break; + } + else if (!strcmp(model, leafalias[i])) + { // maybe to change regular "make" to "Mamiya" too + strcpy(normalized_model, orig); + break; + } + } + if ((ps = strchr(normalized_model, '('))) + *ps = 0; + } + else if (makeIs(LIBRAW_CAMERAMAKER_Minolta) || + makeIs(LIBRAW_CAMERAMAKER_Konica)) + { + if (makeIs(LIBRAW_CAMERAMAKER_Konica) && !strncasecmp(model, "DiMAGE", 6)) + { + setMakeFromIndex(LIBRAW_CAMERAMAKER_Minolta); + strcpy(make, "Minolta"); + } + else + { + for (i = 0; + i 9)) + { + if (makeIs(LIBRAW_CAMERAMAKER_Canon) && + try_xml && + (ps = strstr(xmpdata, "LensID=\""))) + { + ilm.LensID = atoi(ps + 8); + if (ilm.LensID == 61182) + { + ilm.LensMount = ilm.CameraMount = LIBRAW_MOUNT_Canon_RF; + } + } + else if (makeIs(LIBRAW_CAMERAMAKER_Samsung)) + { + if ((ilm.LensMount == LIBRAW_MOUNT_Samsung_NX) && + (ps = strstr(xmpdata, "LensID=\"("))) + { + ilm.LensID = atoi(ps + 9); + } + } + } + + if (ilm.CameraMount == LIBRAW_MOUNT_FixedLens) + { + if (ilm.CameraFormat) + ilm.LensFormat = ilm.CameraFormat; + if (ilm.LensMount == LIBRAW_MOUNT_Unknown) + ilm.LensMount = LIBRAW_MOUNT_FixedLens; + } + + if ((ilm.CameraMount != LIBRAW_MOUNT_Unknown) && + (ilm.CameraMount != LIBRAW_MOUNT_FixedLens) && + (ilm.LensMount == LIBRAW_MOUNT_Unknown)) { + if (ilm.LensID == LIBRAW_LENS_NOT_SET) ilm.LensMount = LIBRAW_MOUNT_IL_UM; + else ilm.LensMount = ilm.CameraMount; + } +} + +void LibRaw::SetStandardIlluminants (unsigned makerIdx, const char* /*normModel*/) { + int i = -1; + int c; + if (!icWBC[LIBRAW_WBI_Ill_A][0] && + !icWBC[LIBRAW_WBI_D65][0]) { + if (makerIdx == LIBRAW_CAMERAMAKER_Olympus ) { + while (++i, icWBCCTC[i][0]) { + if (icWBCCTC[i][0] == 3000) + FORC4 icWBC[LIBRAW_WBI_Ill_A][c] = icWBCCTC[i][c+1]; + else if (icWBCCTC[i][0] == 6600) + FORC4 icWBC[LIBRAW_WBI_D65][c] = icWBCCTC[i][c+1]; + } + } + } + + if (!icWBC[LIBRAW_WBI_Ill_A][0] && icWBC[LIBRAW_WBI_Tungsten][0]) + FORC4 icWBC[LIBRAW_WBI_Ill_A][c] = icWBC[LIBRAW_WBI_Tungsten][c]; + + if (!icWBC[LIBRAW_WBI_D65][0] && icWBC[LIBRAW_WBI_FL_N][0]) + FORC4 icWBC[LIBRAW_WBI_D65][c] = icWBC[LIBRAW_WBI_FL_N][c]; + + return; +} diff --git a/rtengine/libraw/src/metadata/olympus.cpp b/rtengine/libraw/src/metadata/olympus.cpp new file mode 100644 index 000000000..1a49a66d1 --- /dev/null +++ b/rtengine/libraw/src/metadata/olympus.cpp @@ -0,0 +1,686 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" +#include "../../internal/libraw_cameraids.h" + +void LibRaw::setOlympusBodyFeatures(unsigned long long id) +{ + ilm.CamID = id; + + if ((id == OlyID_E_1) || + (id == OlyID_E_300) || + (id == OlyID_AIR_A01) || + ((id & 0xffff000000ULL) == 0x5330000000ULL)) + { + ilm.CameraFormat = LIBRAW_FORMAT_FT; + + if ((id == OlyID_E_1) || + (id == OlyID_E_300) || + ((id >= OlyID_E_330) && (id <= OlyID_E_520)) || + (id == OlyID_E_620) || + (id == OlyID_E_450) || + (id == OlyID_E_600) || + (id == OlyID_E_5)) + { + ilm.CameraMount = LIBRAW_MOUNT_FT; + } + else + { + ilm.CameraMount = LIBRAW_MOUNT_mFT; + } + } + else + { + ilm.LensMount = ilm.CameraMount = LIBRAW_MOUNT_FixedLens; + } + return; +} + +void LibRaw::getOlympus_CameraType2() +{ + + if (OlyID != 0x0ULL) + return; + + int i = 0; + fread(imOly.CameraType2, 6, 1, ifp); + imOly.CameraType2[5] = 0; + while ((i < 6) && imOly.CameraType2[i]) + { + OlyID = OlyID << 8 | imOly.CameraType2[i]; + if (i < 5 && isspace(imOly.CameraType2[i + 1])) { + imOly.CameraType2[i + 1] = '\0'; + break; + } + i++; + } + if (OlyID == OlyID_NORMA) { + if (strcmp(model, "SP510UZ")) OlyID = OlyID_SP_510UZ; + else OlyID = 0x0ULL; + } + unique_id = OlyID; + setOlympusBodyFeatures(OlyID); + return; +} + +void LibRaw::getOlympus_SensorTemperature(unsigned len) +{ + if (OlyID != 0x0ULL) + { + short temp = get2(); + if ((OlyID == OlyID_E_1) || + (OlyID == OlyID_E_M5) || + (len != 1)) + imCommon.SensorTemperature = (float)temp; + else if ((temp != -32768) && (temp != 0)) + { + if (temp > 199) + imCommon.SensorTemperature = 86.474958f - 0.120228f * (float)temp; + else + imCommon.SensorTemperature = (float)temp; + } + } + return; +} + +void LibRaw::parseOlympus_Equipment(unsigned tag, unsigned /*type */, unsigned len, + unsigned dng_writer) +{ + // uptag 2010 + + switch (tag) + { + case 0x0100: + getOlympus_CameraType2(); + break; + case 0x0101: + if ((!imgdata.shootinginfo.BodySerial[0]) && (dng_writer == nonDNG)) + stmread(imgdata.shootinginfo.BodySerial, len, ifp); + break; + case 0x0102: + stmread(imgdata.shootinginfo.InternalBodySerial, len, ifp); + break; + case 0x0201: + { + unsigned char bits[4]; + fread(bits, 1, 4, ifp); + ilm.LensID = (unsigned long long)bits[0] << 16 | + (unsigned long long)bits[2] << 8 | (unsigned long long)bits[3]; + ilm.LensMount = LIBRAW_MOUNT_FT; + ilm.LensFormat = LIBRAW_FORMAT_FT; + if (((ilm.LensID < 0x20000) || (ilm.LensID > 0x4ffff)) && + (ilm.LensID & 0x10)) + ilm.LensMount = LIBRAW_MOUNT_mFT; + } + break; + case 0x0202: + if ((!imgdata.lens.LensSerial[0])) + stmread(imgdata.lens.LensSerial, len, ifp); + break; + case 0x0203: + stmread(ilm.Lens, len, ifp); + break; + case 0x0205: + ilm.MaxAp4MinFocal = libraw_powf64l(sqrt(2.0f), get2() / 256.0f); + break; + case 0x0206: + ilm.MaxAp4MaxFocal = libraw_powf64l(sqrt(2.0f), get2() / 256.0f); + break; + case 0x0207: + ilm.MinFocal = (float)get2(); + break; + case 0x0208: + ilm.MaxFocal = (float)get2(); + if (ilm.MaxFocal > 1000.0f) + ilm.MaxFocal = ilm.MinFocal; + break; + case 0x020a: + ilm.MaxAp4CurFocal = libraw_powf64l(sqrt(2.0f), get2() / 256.0f); + break; + case 0x0301: + ilm.TeleconverterID = fgetc(ifp) << 8; + fgetc(ifp); + ilm.TeleconverterID = ilm.TeleconverterID | fgetc(ifp); + break; + case 0x0303: + stmread(ilm.Teleconverter, len, ifp); + if (!strlen(ilm.Teleconverter) && strchr(ilm.Lens, '+')) { + if (strstr(ilm.Lens, "MC-20")) + strcpy(ilm.Teleconverter, "MC-20"); + else if (strstr(ilm.Lens, "MC-14")) + strcpy(ilm.Teleconverter, "MC-14"); + else if (strstr(ilm.Lens, "EC-20")) + strcpy(ilm.Teleconverter, "EC-20"); + else if (strstr(ilm.Lens, "EC-14")) + strcpy(ilm.Teleconverter, "EC-14"); } + break; + case 0x0403: + stmread(ilm.Attachment, len, ifp); + break; + } + + return; +} +void LibRaw::parseOlympus_CameraSettings(int base, unsigned tag, unsigned type, + unsigned len, unsigned dng_writer) +{ + // uptag 0x2020 + + int c; + switch (tag) + { + case 0x0101: + if (dng_writer == nonDNG) + { + thumb_offset = get4() + base; + } + break; + case 0x0102: + if (dng_writer == nonDNG) + { + thumb_length = get4(); + } + break; + case 0x0200: + imgdata.shootinginfo.ExposureMode = get2(); + break; + case 0x0202: + imgdata.shootinginfo.MeteringMode = get2(); + break; + case 0x0301: + imgdata.shootinginfo.FocusMode = imOly.FocusMode[0] = get2(); + if (len == 2) + { + imOly.FocusMode[1] = get2(); + } + break; + case 0x0304: + for (c = 0; c < 64; c++) + { + imOly.AFAreas[c] = get4(); + } + break; + case 0x0305: + for (c = 0; c < 5; c++) + { + imOly.AFPointSelected[c] = getreal(type); + } + break; + case 0x0306: + imOly.AFFineTune = fgetc(ifp); + break; + case 0x0307: + FORC3 imOly.AFFineTuneAdj[c] = get2(); + break; + case 0x0401: + imCommon.FlashEC = getreal(type); + break; + case 0x0507: + imOly.ColorSpace = get2(); + switch (imOly.ColorSpace) { + case 0: + imCommon.ColorSpace = LIBRAW_COLORSPACE_sRGB; + break; + case 1: + imCommon.ColorSpace = LIBRAW_COLORSPACE_AdobeRGB; + break; + case 2: + imCommon.ColorSpace = LIBRAW_COLORSPACE_ProPhotoRGB; + break; + default: + imCommon.ColorSpace = LIBRAW_COLORSPACE_Unknown; + break; + } + break; + case 0x0600: + imgdata.shootinginfo.DriveMode = imOly.DriveMode[0] = get2(); + for (c = 1; c < (int)len && c < 5; c++) + { + imOly.DriveMode[c] = get2(); + } + break; + case 0x0601: + imOly.Panorama_mode = get2(); + imOly.Panorama_frameNum = get2(); + break; + case 0x0604: + imgdata.shootinginfo.ImageStabilization = get4(); + break; + case 0x0804: + imOly.StackedImage[0] = get4(); + imOly.StackedImage[1] = get4(); + if (imOly.StackedImage[0] == 3) { + imOly.isLiveND = 1; + imOly.LiveNDfactor = imOly.StackedImage[1]; + } else { + imOly.isLiveND = 0; + } + break; + } + + return; +} + +void LibRaw::parseOlympus_ImageProcessing(unsigned tag, unsigned type, + unsigned len, unsigned dng_writer) +{ + // uptag 0x2040 + + int i, c, wb[4], nWB, tWB, wbG; + ushort CT; + short sorder; + + if ((tag == 0x0100) && (dng_writer == nonDNG)) + { + cam_mul[0] = get2() / 256.0; + cam_mul[2] = get2() / 256.0; + } + else if ((tag == 0x0101) && (len == 2) && + ((OlyID == OlyID_E_410) || (OlyID == OlyID_E_510))) + { + for (i = 0; i < 64; i++) + { + icWBCCTC[i][2] = icWBCCTC[i][4] = icWBC[i][1] = icWBC[i][3] = 0x100; + } + for (i = 64; i < 256; i++) + { + icWBC[i][1] = icWBC[i][3] = 0x100; + } + } + else if ((tag > 0x0101) && (tag <= 0x0111)) + { + nWB = tag - 0x0101; + tWB = Oly_wb_list2[nWB << 1]; + CT = Oly_wb_list2[(nWB << 1) | 1]; + wb[0] = get2(); + wb[2] = get2(); + if (tWB != 0x100) + { + icWBC[tWB][0] = wb[0]; + icWBC[tWB][2] = wb[2]; + } + if (CT) + { + icWBCCTC[nWB - 1][0] = CT; + icWBCCTC[nWB - 1][1] = wb[0]; + icWBCCTC[nWB - 1][3] = wb[2]; + } + if (len == 4) + { + wb[1] = get2(); + wb[3] = get2(); + if (tWB != 0x100) + { + icWBC[tWB][1] = wb[1]; + icWBC[tWB][3] = wb[3]; + } + if (CT) + { + icWBCCTC[nWB - 1][2] = wb[1]; + icWBCCTC[nWB - 1][4] = wb[3]; + } + } + } + else if ((tag >= 0x0112) && (tag <= 0x011e)) + { + nWB = tag - 0x0112; + wbG = get2(); + tWB = Oly_wb_list2[nWB << 1]; + if (nWB) + icWBCCTC[nWB - 1][2] = icWBCCTC[nWB - 1][4] = wbG; + if (tWB != 0x100) + icWBC[tWB][1] = icWBC[tWB][3] = wbG; + } + else if (tag == 0x011f) + { + wbG = get2(); + if (icWBC[LIBRAW_WBI_Flash][0]) + icWBC[LIBRAW_WBI_Flash][1] = + icWBC[LIBRAW_WBI_Flash][3] = wbG; + FORC4 if (icWBC[LIBRAW_WBI_Custom1 + c][0]) + icWBC[LIBRAW_WBI_Custom1 + c][1] = + icWBC[LIBRAW_WBI_Custom1 + c][3] = wbG; + } + else if (tag == 0x0121) + { + icWBC[LIBRAW_WBI_Flash][0] = get2(); + icWBC[LIBRAW_WBI_Flash][2] = get2(); + if (len == 4) + { + icWBC[LIBRAW_WBI_Flash][1] = get2(); + icWBC[LIBRAW_WBI_Flash][3] = get2(); + } + } + else if ((tag == 0x0200) && (dng_writer == nonDNG) && + strcmp(software, "v757-71")) + { + for (i = 0; i < 3; i++) + { + if (!imOly.ColorSpace) + { + FORC3 cmatrix[i][c] = ((short)get2()) / 256.0; + } + else + { + FORC3 imgdata.color.ccm[i][c] = ((short)get2()) / 256.0; + } + } + } + else if ((tag == 0x0600) && (dng_writer == nonDNG)) + { + FORC4 cblack[RGGB_2_RGBG(c)] = get2(); + } + else if ((tag == 0x0611) && (dng_writer == nonDNG)) + { + imOly.ValidBits = get2(); + } + else if ((tag == 0x0612) && (dng_writer == nonDNG)) + { + imgdata.sizes.raw_inset_crops[0].cleft = get2(); + } + else if ((tag == 0x0613) && (dng_writer == nonDNG)) + { + imgdata.sizes.raw_inset_crops[0].ctop = get2(); + } + else if ((tag == 0x0614) && (dng_writer == nonDNG)) + { + imgdata.sizes.raw_inset_crops[0].cwidth = get2(); + } + else if ((tag == 0x0615) && (dng_writer == nonDNG)) + { + imgdata.sizes.raw_inset_crops[0].cheight = get2(); + } + else if ((tag == 0x0805) && (len == 2)) + { + imOly.SensorCalibration[0] = getreal(type); + imOly.SensorCalibration[1] = getreal(type); + if ((dng_writer == nonDNG) && (OlyID != OlyID_XZ_1)) + FORC4 imgdata.color.linear_max[c] = imOly.SensorCalibration[0]; + } + else if (tag == 0x1112) + { + sorder = order; + order = 0x4d4d; + c = get2(); + order = sorder; + switch (c) { + case 0x0101: + case 0x0901: + case 0x0909: + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_4to3; + break; + case 0x0104: + case 0x0401: + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_1to1; + break; + case 0x0201: + case 0x0202: + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_3to2; + break; + case 0x0301: + case 0x0303: + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_16to9; + break; + case 0x0404: +// imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_6to6; + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_1to1; + break; + case 0x0505: + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_5to4; + break; + case 0x0606: + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_7to6; + break; + case 0x0707: + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_6to5; + break; + case 0x0808: + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_7to5; + break; + default: + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_OTHER; + break; + } + } + else if (tag == 0x1113) + { + imOly.AspectFrame[0] = get2(); + imOly.AspectFrame[1] = get2(); + imOly.AspectFrame[2] = get2(); + imOly.AspectFrame[3] = get2(); + } + else if (tag == 0x1306) + { + c = get2(); + if ((c != 0) && (c != 100)) + { + if (c < 61) + imCommon.CameraTemperature = (float)c; + else + imCommon.CameraTemperature = (float)(c - 32) / 1.8f; + if ((imCommon.exifAmbientTemperature > -273.15f) && + ((OlyID == OlyID_TG_5) || + (OlyID == OlyID_TG_6)) + ) + imCommon.CameraTemperature += imCommon.exifAmbientTemperature; + } + } + + return; +} + +void LibRaw::parseOlympus_RawInfo(unsigned tag, unsigned /*type */, unsigned len, + unsigned dng_writer) +{ + // uptag 0x3000 + + int wb_ind, c, i; + + if ((tag == 0x0110) && strcmp(software, "v757-71")) + { + icWBC[LIBRAW_WBI_Auto][0] = get2(); + icWBC[LIBRAW_WBI_Auto][2] = get2(); + if (len == 2) + { + for (i = 0; i < 256; i++) + icWBC[i][1] = icWBC[i][3] = 0x100; + } + } + else if ((((tag >= 0x0120) && (tag <= 0x0124)) || + ((tag >= 0x0130) && (tag <= 0x0133))) && + strcmp(software, "v757-71")) + { + if (tag <= 0x0124) + wb_ind = tag - 0x0120; + else + wb_ind = tag - 0x0130 + 5; + + icWBC[Oly_wb_list1[wb_ind]][0] = get2(); + icWBC[Oly_wb_list1[wb_ind]][2] = get2(); + } + else if ((tag == 0x0200) && (dng_writer == nonDNG)) + { + for (i = 0; i < 3; i++) + { + if (!imOly.ColorSpace) + { + FORC3 cmatrix[i][c] = ((short)get2()) / 256.0; + } + else + { + FORC3 imgdata.color.ccm[i][c] = ((short)get2()) / 256.0; + } + } + } + else if ((tag == 0x0600) && (dng_writer == nonDNG)) + { + FORC4 cblack[RGGB_2_RGBG(c)] = get2(); + } + else if ((tag == 0x0612) && (dng_writer == nonDNG)) + { + imgdata.sizes.raw_inset_crops[0].cleft = get2(); + } + else if ((tag == 0x0613) && (dng_writer == nonDNG)) + { + imgdata.sizes.raw_inset_crops[0].ctop = get2(); + } + else if ((tag == 0x0614) && (dng_writer == nonDNG)) + { + imgdata.sizes.raw_inset_crops[0].cwidth = get2(); + } + else if ((tag == 0x0615) && (dng_writer == nonDNG)) + { + imgdata.sizes.raw_inset_crops[0].cheight = get2(); + } + return; +} + + +void LibRaw::parseOlympusMakernotes (int base, unsigned tag, unsigned type, unsigned len, unsigned dng_writer) { + + int c; + unsigned a; + if ((tag >= 0x20100000) && (tag <= 0x2010ffff)) { + parseOlympus_Equipment((tag & 0x0000ffff), type, len, dng_writer); + + } else if ((tag >= 0x20200000) && (tag <= 0x2020ffff)) { + parseOlympus_CameraSettings(base, (tag & 0x0000ffff), type, len, dng_writer); + + } else if ((tag >= 0x20400000) && (tag <= 0x2040ffff)) { + parseOlympus_ImageProcessing((tag & 0x0000ffff), type, len, dng_writer); + + } else if ((tag >= 0x30000000) && (tag <= 0x3000ffff)) { + parseOlympus_RawInfo((tag & 0x0000ffff), type, len, dng_writer); + + } else { + switch (tag) { + case 0x0200: + FORC3 if ((imOly.SpecialMode[c] = get4()) >= 0xff) imOly.SpecialMode[c] = 0xffffffff; + break; + case 0x0207: + getOlympus_CameraType2(); + break; + case 0x0404: + case 0x101a: + if (!imgdata.shootinginfo.BodySerial[0] && (dng_writer == nonDNG)) + stmread(imgdata.shootinginfo.BodySerial, len, ifp); + break; + case 0x1002: + ilm.CurAp = libraw_powf64l(2.0f, getreal(type) / 2); + break; + case 0x1007: + imCommon.SensorTemperature = (float)get2(); + break; + case 0x1008: + imCommon.LensTemperature = (float)get2(); + break; + case 0x100b: + if (imOly.FocusMode[0] == 0xffff) { + imgdata.shootinginfo.FocusMode = imOly.FocusMode[0] = get2(); + if (imgdata.shootinginfo.FocusMode == 1) + imgdata.shootinginfo.FocusMode = imOly.FocusMode[0] = 10; + } + break; + case 0x100d: + if (imOly.ZoomStepCount == 0xffff) imOly.ZoomStepCount = get2(); + break; + case 0x100e: + if (imOly.FocusStepCount == 0xffff) imOly.FocusStepCount = get2(); + break; + case 0x1011: + if (strcmp(software, "v757-71") && (dng_writer == nonDNG)) { + for (int i = 0; i < 3; i++) { + if (!imOly.ColorSpace) { + FORC3 cmatrix[i][c] = ((short)get2()) / 256.0; + } else { + FORC3 imgdata.color.ccm[i][c] = ((short)get2()) / 256.0; + } + } + } + break; + case 0x1012: + if (dng_writer == nonDNG) + FORC4 cblack[RGGB_2_RGBG(c)] = get2(); + break; + case 0x1017: + if (dng_writer == nonDNG) + cam_mul[0] = get2() / 256.0; + break; + case 0x1018: + if (dng_writer == nonDNG) + cam_mul[2] = get2() / 256.0; + break; + case 0x102c: + if (dng_writer == nonDNG) + imOly.ValidBits = get2(); + break; + case 0x1038: + imOly.AFResult = get2(); + break; + case 0x103b: + if (imOly.FocusStepInfinity == 0xffff) imOly.FocusStepInfinity = get2(); + break; + case 0x103c: + if (imOly.FocusStepNear == 0xffff) imOly.FocusStepNear = get2(); + break; + case 0x20300108: + case 0x20310109: + if (dng_writer == nonDNG) { + imOly.ColorSpace = get2(); + switch (imOly.ColorSpace) { + case 0: + imCommon.ColorSpace = LIBRAW_COLORSPACE_sRGB; + break; + case 1: + imCommon.ColorSpace = LIBRAW_COLORSPACE_AdobeRGB; + break; + case 2: + imCommon.ColorSpace = LIBRAW_COLORSPACE_ProPhotoRGB; + break; + default: + imCommon.ColorSpace = LIBRAW_COLORSPACE_Unknown; + break; + } + } + case 0x20500209: + imOly.AutoFocus = get2(); + break; + case 0x20500300: + imOly.ZoomStepCount = get2(); + break; + case 0x20500301: + imOly.FocusStepCount = get2(); + break; + case 0x20500303: + imOly.FocusStepInfinity = get2(); + break; + case 0x20500304: + imOly.FocusStepNear = get2(); + break; + case 0x20500305: + a = get4(); + /*b = */ get4(); // b is not used, so removed + if (a >= 0x7f000000) imOly.FocusDistance = -1.0; // infinity + else imOly.FocusDistance = (double) a / 1000.0; // convert to meters + break; + case 0x20500308: + imOly.AFPoint = get2(); + break; + case 0x20501500: + getOlympus_SensorTemperature(len); + break; + } + } +} diff --git a/rtengine/libraw/src/metadata/p1.cpp b/rtengine/libraw/src/metadata/p1.cpp new file mode 100644 index 000000000..7382e108d --- /dev/null +++ b/rtengine/libraw/src/metadata/p1.cpp @@ -0,0 +1,192 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +void LibRaw::setPhaseOneFeatures(unsigned long long id) +{ + + ushort i; + static const struct + { + unsigned long long id; + char t_model[32]; + int CamMnt; + int CamFmt; + } p1_unique[] = { + // Phase One section: + {0x001ULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x00aULL, "PhaseOne/Mamiya", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x00cULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x010ULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x011ULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x012ULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x013ULL, "PhaseOne/Mamiya", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x014ULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x015ULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x016ULL, "PhaseOne/Mamiya", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x017ULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x018ULL, "Hasselblad H", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x019ULL, "PhaseOne/Mamiya", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x020ULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x022ULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x023ULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x024ULL, "Hasselblad H", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x025ULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x026ULL, "PhaseOne/Mamiya", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x027ULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x028ULL, "Hasselblad H", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x029ULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x02aULL, "PhaseOne/Mamiya", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x02cULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x02dULL, "Hasselblad H", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x02eULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x02fULL, "PhaseOne/Mamiya", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x030ULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x031ULL, "Hasselblad H", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x032ULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x033ULL, "PhaseOne/Mamiya", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x034ULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x035ULL, "Hasselblad H", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x036ULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x037ULL, "PhaseOne/Mamiya", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x043ULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x044ULL, "Hasselblad H", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x045ULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x046ULL, "PhaseOne/Mamiya", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x047ULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x048ULL, "Hasselblad H", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x049ULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x04aULL, "PhaseOne/Mamiya", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x04cULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x04dULL, "Hasselblad H", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x04eULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x04fULL, "PhaseOne/Mamiya", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x050ULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x051ULL, "Hasselblad H", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x052ULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x053ULL, "PhaseOne/Mamiya", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x054ULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x055ULL, "Hasselblad H", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x056ULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x057ULL, "PhaseOne/Mamiya", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x063ULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x064ULL, "Hasselblad H", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x065ULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x066ULL, "PhaseOne/Mamiya", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x067ULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x068ULL, "Hasselblad H", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x069ULL, "PhaseOne/Mamiya", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x06aULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x070ULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x071ULL, "Hasselblad H", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x072ULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x073ULL, "PhaseOne/Mamiya", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x083ULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x084ULL, "Hasselblad H", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x085ULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x086ULL, "PhaseOne/Mamiya", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x087ULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x088ULL, "Hasselblad H", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x089ULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x08aULL, "PhaseOne/Mamiya", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x08cULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x08dULL, "Hasselblad H", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x08eULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x08fULL, "PhaseOne/Mamiya", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x094ULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x095ULL, "Hasselblad H", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x096ULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x097ULL, "PhaseOne/Mamiya", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x0a0ULL, "A-250", LIBRAW_MOUNT_Alpa, LIBRAW_FORMAT_69}, + {0x0a1ULL, "A-260", LIBRAW_MOUNT_Alpa, LIBRAW_FORMAT_69}, + {0x0a2ULL, "A-280", LIBRAW_MOUNT_Alpa, LIBRAW_FORMAT_69}, + {0x0a7ULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x0a8ULL, "Hasselblad H", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x0a9ULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x0aaULL, "PhaseOne/Mamiya", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x0acULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x0adULL, "Hasselblad H", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x0aeULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x0afULL, "PhaseOne/Mamiya", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x0b0ULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x0b1ULL, "Hasselblad H", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x0b2ULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x0b3ULL, "PhaseOne/Mamiya", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x0b4ULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x0b5ULL, "Hasselblad H", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x0b6ULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x0b7ULL, "PhaseOne/Mamiya", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x0d0ULL, "Hasselblad V", LIBRAW_MOUNT_Hasselblad_V, LIBRAW_FORMAT_66}, + {0x0d3ULL, "PhaseOne/Mamiya", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x1c0ULL, "Phase One 645AF", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x1c9ULL, "Phase One 645DF", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x1d7ULL, "Phase One 645DF+", LIBRAW_MOUNT_Mamiya645, LIBRAW_FORMAT_645}, + {0x2c0ULL, "Phase One iXA", LIBRAW_MOUNT_Unknown, LIBRAW_FORMAT_Unknown}, + {0x2c1ULL, "Phase One iXA - R", LIBRAW_MOUNT_Unknown, LIBRAW_FORMAT_Unknown}, + {0x2c2ULL, "Phase One iXU 150", LIBRAW_MOUNT_Unknown, LIBRAW_FORMAT_Unknown}, + {0x2c3ULL, "Phase One iXU 150 - NIR", LIBRAW_MOUNT_Unknown,LIBRAW_FORMAT_Unknown}, + {0x2c4ULL, "Phase One iXU 180", LIBRAW_MOUNT_Unknown,LIBRAW_FORMAT_Unknown}, + {0x2d1ULL, "Phase One iXR", LIBRAW_MOUNT_Unknown, LIBRAW_FORMAT_Unknown}, + // Leaf section: + {0x140ULL, "Universal", LIBRAW_MOUNT_Unknown, LIBRAW_FORMAT_Unknown}, + {0x141ULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x142ULL, "Hasselblad H1/H2", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x143ULL, "Mamiya", LIBRAW_MOUNT_Unknown, LIBRAW_FORMAT_Unknown}, + {0x144ULL, "Universal", LIBRAW_MOUNT_Unknown, LIBRAW_FORMAT_Unknown}, + {0x145ULL, "Hasselblad H1/H2", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x146ULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x147ULL, "Mamiya", LIBRAW_MOUNT_Unknown, LIBRAW_FORMAT_Unknown}, + {0x149ULL, "Universal", LIBRAW_MOUNT_Unknown, LIBRAW_FORMAT_Unknown}, + {0x14aULL, "Hasselblad H1/H2", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x14cULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x14dULL, "Mamiya", LIBRAW_MOUNT_Unknown, LIBRAW_FORMAT_Unknown}, + {0x14eULL, "AFi", LIBRAW_MOUNT_Rollei_bayonet, LIBRAW_FORMAT_66}, + {0x14fULL, "AFi", LIBRAW_MOUNT_Rollei_bayonet, LIBRAW_FORMAT_66}, + {0x150ULL, "AFi", LIBRAW_MOUNT_Rollei_bayonet, LIBRAW_FORMAT_66}, + {0x151ULL, "Universal", LIBRAW_MOUNT_Unknown, LIBRAW_FORMAT_Unknown}, + {0x152ULL, "Hasselblad H1/H2", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x153ULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x154ULL, "Mamiya", LIBRAW_MOUNT_Unknown, LIBRAW_FORMAT_Unknown}, + + {0x16cULL, "Phase One iXM-RS150F", LIBRAW_MOUNT_PhaseOne_iXM_RS, LIBRAW_FORMAT_645}, + + {0x171ULL, "Universal", LIBRAW_MOUNT_Unknown, LIBRAW_FORMAT_Unknown}, + {0x172ULL, "Mamiya", LIBRAW_MOUNT_Unknown, LIBRAW_FORMAT_Unknown}, + {0x173ULL, "Hasselblad H1/H2", LIBRAW_MOUNT_Hasselblad_H, LIBRAW_FORMAT_645}, + {0x174ULL, "Contax 645", LIBRAW_MOUNT_Contax645, LIBRAW_FORMAT_645}, + {0x175ULL, "AFi", LIBRAW_MOUNT_Rollei_bayonet, LIBRAW_FORMAT_66}, + }; + ilm.CamID = id; + if (id && !ilm.body[0]) + { + for (i = 0; i < sizeof p1_unique / sizeof *p1_unique; i++) + if (id == p1_unique[i].id) + { + strcpy(ilm.body, p1_unique[i].t_model); + ilm.CameraFormat = p1_unique[i].CamFmt; + ilm.CameraMount = p1_unique[i].CamMnt; + if ((ilm.CameraMount == LIBRAW_MOUNT_PhaseOne_iXM_RS) || + (ilm.CameraMount == LIBRAW_MOUNT_PhaseOne_iXM)) { + ilm.FocalType = LIBRAW_FT_PRIME_LENS; + ilm.LensMount = ilm.CameraMount; + } else if (ilm.CameraMount == LIBRAW_MOUNT_PhaseOne_iXM_MV) { + ilm.LensMount = ilm.CameraMount; + } + break; + } + } + return; +} diff --git a/rtengine/libraw/src/metadata/pentax.cpp b/rtengine/libraw/src/metadata/pentax.cpp new file mode 100644 index 000000000..ae238d0aa --- /dev/null +++ b/rtengine/libraw/src/metadata/pentax.cpp @@ -0,0 +1,675 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" +#include "../../internal/libraw_cameraids.h" + +void LibRaw::setPentaxBodyFeatures(unsigned long long id) +{ + + ilm.CamID = id; + + switch (id) { + case PentaxID_staristD: + case PentaxID_staristDS: + case PentaxID_staristDL: + case PentaxID_staristDS2: + case PentaxID_GX_1S: + case PentaxID_staristDL2: + case PentaxID_GX_1L: + case PentaxID_K100D: + case PentaxID_K110D: + case PentaxID_K100D_Super: + case PentaxID_K10D: + case PentaxID_GX10: + case PentaxID_K20D: + case PentaxID_GX20: + case PentaxID_K200D: + case PentaxID_K2000: + case PentaxID_K_m: + case PentaxID_K_7: + case PentaxID_K_x: + case PentaxID_K_r: + case PentaxID_K_5: + case PentaxID_K_01: + case PentaxID_K_30: + case PentaxID_K_5_II: + case PentaxID_K_5_II_s: + case PentaxID_K_50: + case PentaxID_K_3: + case PentaxID_K_500: + case PentaxID_K_S1: + case PentaxID_K_S2: + case PentaxID_K_3_II: + case PentaxID_K_3_III: + case PentaxID_K_70: + case PentaxID_KP: + ilm.CameraMount = LIBRAW_MOUNT_Pentax_K; + ilm.CameraFormat = LIBRAW_FORMAT_APSC; + break; + case PentaxID_K_1: + case PentaxID_K_1_Mark_II: + ilm.CameraMount = LIBRAW_MOUNT_Pentax_K; + ilm.CameraFormat = LIBRAW_FORMAT_FF; + break; + case PentaxID_645D: + case PentaxID_645Z: + ilm.CameraMount = LIBRAW_MOUNT_Pentax_645; + ilm.CameraFormat = LIBRAW_FORMAT_CROP645; + break; + case PentaxID_Q: + case PentaxID_Q10: + ilm.CameraMount = LIBRAW_MOUNT_Pentax_Q; + ilm.CameraFormat = LIBRAW_FORMAT_1div2p3INCH; + break; + case PentaxID_Q7: + case PentaxID_Q_S1: + ilm.CameraMount = LIBRAW_MOUNT_Pentax_Q; + ilm.CameraFormat = LIBRAW_FORMAT_1div1p7INCH; + break; + case PentaxID_MX_1: + ilm.LensMount = LIBRAW_MOUNT_FixedLens; + ilm.CameraMount = LIBRAW_MOUNT_FixedLens; + ilm.CameraFormat = LIBRAW_FORMAT_1div1p7INCH; + ilm.FocalType = LIBRAW_FT_ZOOM_LENS; + break; + case PentaxID_GR_III: + case PentaxID_GR_IIIx: + ilm.CameraMount = LIBRAW_MOUNT_FixedLens; + ilm.LensMount = LIBRAW_MOUNT_FixedLens; + ilm.CameraFormat = LIBRAW_FORMAT_APSC; + ilm.LensFormat = LIBRAW_FORMAT_APSC; + ilm.FocalType = LIBRAW_FT_PRIME_LENS; + break; + default: + ilm.LensMount = LIBRAW_MOUNT_FixedLens; + ilm.CameraMount = LIBRAW_MOUNT_FixedLens; + } + return; +} + +void LibRaw::PentaxISO(ushort c) +{ + int code[] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 50, 100, 200, 400, 800, + 1600, 3200, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278}; + double value[] = { + 50, 64, 80, 100, 125, 160, 200, 250, 320, + 400, 500, 640, 800, 1000, 1250, 1600, 2000, 2500, + 3200, 4000, 5000, 6400, 8000, 10000, 12800, 16000, 20000, + 25600, 32000, 40000, 51200, 64000, 80000, 102400, 128000, 160000, + 204800, 258000, 325000, 409600, 516000, 650000, 819200, 50, 100, + 200, 400, 800, 1600, 3200, 50, 70, 100, 140, + 200, 280, 400, 560, 800, 1100, 1600, 2200, 3200, + 4500, 6400, 9000, 12800, 18000, 25600, 36000, 51200}; +#define numel (sizeof(code) / sizeof(code[0])) + int i; + for (i = 0; i < (int)numel; i++) + { + if (code[i] == c) + { + iso_speed = value[i]; + return; + } + } + if (i == numel) + iso_speed = 65535.0f; +} +#undef numel + +void LibRaw::PentaxLensInfo(unsigned long long id, unsigned len) // tag 0x0207 +{ + ushort iLensData = 0; + uchar *table_buf; + table_buf = (uchar *)malloc(MAX(len, 128)); + fread(table_buf, len, 1, ifp); + if ((id < PentaxID_K100D) || + (((id == PentaxID_K100D) || + (id == PentaxID_K110D) || + (id == PentaxID_K100D_Super)) && + ((!table_buf[20] || + (table_buf[20] == 0xff))))) + { + iLensData = 3; + if (ilm.LensID == LIBRAW_LENS_NOT_SET) + ilm.LensID = (((unsigned)table_buf[0]) << 8) + table_buf[1]; + } + else + switch (len) + { + case 90: // LensInfo3 + iLensData = 13; + if (ilm.LensID == LIBRAW_LENS_NOT_SET) + ilm.LensID = ((unsigned)((table_buf[1] & 0x0f) + table_buf[3]) << 8) + + table_buf[4]; + break; + case 91: // LensInfo4 + iLensData = 12; + if (ilm.LensID == LIBRAW_LENS_NOT_SET) + ilm.LensID = ((unsigned)((table_buf[1] & 0x0f) + table_buf[3]) << 8) + + table_buf[4]; + break; + case 80: // LensInfo5 + case 128: + iLensData = 15; + if (ilm.LensID == LIBRAW_LENS_NOT_SET) + ilm.LensID = ((unsigned)((table_buf[1] & 0x0f) + table_buf[4]) << 8) + + table_buf[5]; + break; + case 168: // Ricoh GR III, id 0x1320e + break; + default: + if (id >= 0x12b9cULL) // LensInfo2 + { + iLensData = 4; + if (ilm.LensID == LIBRAW_LENS_NOT_SET) + ilm.LensID = ((unsigned)((table_buf[0] & 0x0f) + table_buf[2]) << 8) + + table_buf[3]; + } + } + if (iLensData) + { + if (table_buf[iLensData + 9] && (fabs(ilm.CurFocal) < 0.1f)) + ilm.CurFocal = 10 * (table_buf[iLensData + 9] >> 2) * + libraw_powf64l(4, (table_buf[iLensData + 9] & 0x03) - 2); + if (table_buf[iLensData + 10] & 0xf0) + ilm.MaxAp4CurFocal = libraw_powf64l( + 2.0f, (float)((table_buf[iLensData + 10] & 0xf0) >> 4) / 4.0f); + if (table_buf[iLensData + 10] & 0x0f) + ilm.MinAp4CurFocal = libraw_powf64l( + 2.0f, (float)((table_buf[iLensData + 10] & 0x0f) + 10) / 4.0f); + + if (iLensData != 12) + { + switch (table_buf[iLensData] & 0x06) + { + case 0: + ilm.MinAp4MinFocal = 22.0f; + break; + case 2: + ilm.MinAp4MinFocal = 32.0f; + break; + case 4: + ilm.MinAp4MinFocal = 45.0f; + break; + case 6: + ilm.MinAp4MinFocal = 16.0f; + break; + } + if (table_buf[iLensData] & 0x70) + ilm.LensFStops = + ((float)(((table_buf[iLensData] & 0x70) >> 4) ^ 0x07)) / 2.0f + + 5.0f; + + ilm.MinFocusDistance = (float)(table_buf[iLensData + 3] & 0xf8); + ilm.FocusRangeIndex = (float)(table_buf[iLensData + 3] & 0x07); + + if ((table_buf[iLensData + 14] > 1) && (fabs(ilm.MaxAp4CurFocal) < 0.7f)) + ilm.MaxAp4CurFocal = libraw_powf64l( + 2.0f, (float)((table_buf[iLensData + 14] & 0x7f) - 1) / 32.0f); + } + else if ((id != 0x12e76ULL) && // K-5 + (table_buf[iLensData + 15] > 1) && + (fabs(ilm.MaxAp4CurFocal) < 0.7f)) + { + ilm.MaxAp4CurFocal = libraw_powf64l( + 2.0f, (float)((table_buf[iLensData + 15] & 0x7f) - 1) / 32.0f); + } + } + free(table_buf); + return; +} + +void LibRaw::parsePentaxMakernotes(int /*base*/, unsigned tag, unsigned type, + unsigned len, unsigned dng_writer) +{ + + int c; +// printf ("==>> =%s= tag:0x%x, type: %d, len:%d\n", model, tag, type, len); + + if (tag == 0x0005) + { + unique_id = get4(); + setPentaxBodyFeatures(unique_id); + } + else if (tag == 0x0008) + { /* 4 is raw, 7 is raw w/ pixel shift, 8 is raw w/ dynamic pixel shift */ + imPentax.Quality = get2(); + } + else if (tag == 0x000d) + { + imgdata.shootinginfo.FocusMode = imPentax.FocusMode[0] = get2(); + } + else if (tag == 0x000e) + { + imgdata.shootinginfo.AFPoint = imPentax.AFPointSelected[0] = get2(); + if (len == 2) + imPentax.AFPointSelected_Area = get2(); + } + else if (tag == 0x000f) + { + if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_LONG)) + { + imPentax.AFPointsInFocus = get4(); + if (!imPentax.AFPointsInFocus) imPentax.AFPointsInFocus = 0xffffffff; + else imPentax.AFPointsInFocus_version = 3; + } + else if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_SHORT)) + { + imPentax.AFPointsInFocus = (unsigned) get2(); + if (imPentax.AFPointsInFocus == 0x0000ffff) + imPentax.AFPointsInFocus = 0xffffffff; + else imPentax.AFPointsInFocus_version = 2; + } + } + else if (tag == 0x0010) + { + imPentax.FocusPosition = get2(); + } + else if (tag == 0x0013) + { + ilm.CurAp = (float)get2() / 10.0f; + } + else if (tag == 0x0014) + { + PentaxISO(get2()); + } + else if (tag == 0x0017) + { + imgdata.shootinginfo.MeteringMode = get2(); + } + else if (tag == 0x001b) { + cam_mul[2] = get2() / 256.0; + } + else if (tag == 0x001c) { + cam_mul[0] = get2() / 256.0; + } + else if (tag == 0x001d) + { + ilm.CurFocal = (float)get4() / 100.0f; + } + else if (tag == 0x0034) + { + uchar uc; + FORC4 + { + fread(&uc, 1, 1, ifp); + imPentax.DriveMode[c] = uc; + } + imgdata.shootinginfo.DriveMode = imPentax.DriveMode[0]; + } + else if (tag == 0x0037) { + switch (get2()) { + case 0: + imCommon.ColorSpace = LIBRAW_COLORSPACE_sRGB; + break; + case 1: + imCommon.ColorSpace = LIBRAW_COLORSPACE_AdobeRGB; + break; + default: + imCommon.ColorSpace = LIBRAW_COLORSPACE_Unknown; + break; + } + } + else if (tag == 0x0038) + { + imgdata.sizes.raw_inset_crops[0].cleft = get2(); + imgdata.sizes.raw_inset_crops[0].ctop = get2(); + } + else if (tag == 0x0039) + { + imgdata.sizes.raw_inset_crops[0].cwidth = get2(); + imgdata.sizes.raw_inset_crops[0].cheight = get2(); + } + else if (tag == 0x003c) + { + if ((len == 4) && tagtypeIs(LIBRAW_EXIFTAG_TYPE_UNDEFINED)) { + imPentax.AFPointsInFocus = get4() & 0x7ff; + if (!imPentax.AFPointsInFocus) { + imPentax.AFPointsInFocus = 0xffffffff; + } + else { + imPentax.AFPointsInFocus_version = 1; + } + } + } + else if (tag == 0x003f) + { + unsigned a = unsigned(fgetc(ifp)) << 8; + ilm.LensID = a | fgetc(ifp); + } + else if (tag == 0x0047) + { + imCommon.CameraTemperature = (float)fgetc(ifp); + } + else if (tag == 0x004d) + { + if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_SLONG)) + imCommon.FlashEC = getreal(type) / 256.0f; + else + imCommon.FlashEC = (float)((signed short)fgetc(ifp)) / 6.0f; + } + else if (tag == 0x005c) + { + fgetc(ifp); + imgdata.shootinginfo.ImageStabilization = (short)fgetc(ifp); + } + else if (tag == 0x0072) + { + imPentax.AFAdjustment = get2(); + } + else if ((tag == 0x007e) && (dng_writer == nonDNG)) + { + imgdata.color.linear_max[0] = imgdata.color.linear_max[1] = + imgdata.color.linear_max[2] = imgdata.color.linear_max[3] = + get4(); + } + else if (tag == 0x0080) + { + short a = (short)fgetc(ifp); + switch (a) + { + case 0: + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_4to3; + break; + case 1: + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_3to2; + break; + case 2: + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_16to9; + break; + case 3: + imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_1to1; + break; + } + } + + else if ((tag == 0x0200) && (dng_writer == nonDNG)) { // Pentax black level + FORC4 cblack[RGGB_2_RGBG(c)] = get2(); + } + + else if ((tag == 0x0201) && (dng_writer == nonDNG)) { // Pentax As Shot WB + FORC4 cam_mul[RGGB_2_RGBG(c)] = get2(); + } + + else if ((tag == 0x0203) && (dng_writer == nonDNG)) + { + for (int i = 0; i < 3; i++) + FORC3 cmatrix[i][c] = ((short)get2()) / 8192.0; + } + else if (tag == 0x0205) + { + if (imCommon.afcount < LIBRAW_AFDATA_MAXCOUNT) + { + imCommon.afdata[imCommon.afcount].AFInfoData_tag = tag; + imCommon.afdata[imCommon.afcount].AFInfoData_order = order; + imCommon.afdata[imCommon.afcount].AFInfoData_length = len; + imCommon.afdata[imCommon.afcount].AFInfoData = (uchar *)malloc(imCommon.afdata[imCommon.afcount].AFInfoData_length); + fread(imCommon.afdata[imCommon.afcount].AFInfoData, imCommon.afdata[imCommon.afcount].AFInfoData_length, 1, ifp); + if ((len < 25) && (len >= 11)) + { + imPentax.AFPointMode = (imCommon.afdata[imCommon.afcount].AFInfoData[3] >>4) & 0x0f; + imPentax.FocusMode[1] = imCommon.afdata[imCommon.afcount].AFInfoData[3] & 0x0f; + imPentax.AFPointSelected[1] = sget2(imCommon.afdata[imCommon.afcount].AFInfoData+4); +// Pentax K-m has multiexposure set to 8 when no multi-exposure is in effect + imPentax.MultiExposure = imCommon.afdata[imCommon.afcount].AFInfoData[10] & 0x0f; + } + imCommon.afcount++; + } + } + else if (tag == 0x0207) + { + if (len < 65535) // Safety belt + PentaxLensInfo(ilm.CamID, len); + } + else if ((tag >= 0x020d) && (tag <= 0x0214)) + { + FORC4 icWBC[Pentax_wb_list1[tag - 0x020d]][RGGB_2_RGBG(c)] = get2(); + } + else if ((tag == 0x021d) && (len == 18) && + tagtypeIs(LIBRAW_EXIFTAG_TYPE_UNDEFINED) && (dng_writer == nonDNG)) + { + for (int i = 0; i < 3; i++) + FORC3 cmatrix[i][c] = ((short)get2()) / 8192.0; + } + else if (tag == 0x021f) + { + if ((unique_id != PentaxID_K_1) && + (unique_id != PentaxID_K_3) && + (unique_id != PentaxID_K_3_II) && + (unique_id != PentaxID_K_1_Mark_II)) + { + fseek (ifp, 0x0b, SEEK_CUR); + imPentax.AFPointsInFocus = (unsigned) fgetc(ifp); + if (!imPentax.AFPointsInFocus) imPentax.AFPointsInFocus = 0xffffffff; + else imPentax.AFPointsInFocus_version = 4; + } + } + else if ((tag == 0x0220) && (dng_writer == nonDNG)) { + meta_offset = ftell(ifp); + } + else if (tag == 0x0221) + { + int nWB = get2(); + if (nWB <= int(sizeof(icWBCCTC) / sizeof(icWBCCTC[0]))) + FORC(nWB) + { + icWBCCTC[c][0] = (unsigned)0xcfc6 - get2(); + fseek(ifp, 2, SEEK_CUR); + icWBCCTC[c][1] = get2(); + icWBCCTC[c][2] = icWBCCTC[c][4] = 0x2000; + icWBCCTC[c][3] = get2(); + } + } + else if (tag == 0x0215) + { + fseek(ifp, 16, SEEK_CUR); + sprintf(imgdata.shootinginfo.InternalBodySerial, "%d", get4()); + } + else if (tag == 0x0229) + { + stmread(imgdata.shootinginfo.BodySerial, len, ifp); + } + else if (tag == 0x022d) + { + int wb_ind; + getc(ifp); + for (int wb_cnt = 0; wb_cnt < (int)Pentax_wb_list2.size(); wb_cnt++) + { + wb_ind = getc(ifp); + if (wb_ind >= 0 && wb_ind < (int)Pentax_wb_list2.size() ) + FORC4 icWBC[Pentax_wb_list2[wb_ind]][RGGB_2_RGBG(c)] = get2(); + } + } + else if (tag == 0x0239) // Q-series lens info (LensInfoQ) + { + char LensInfo[20]; + fseek(ifp, 12, SEEK_CUR); + stread(ilm.Lens, 30, ifp); + strcat(ilm.Lens, " "); + stread(LensInfo, 20, ifp); + strcat(ilm.Lens, LensInfo); + } + else if (tag == 0x0245) + { + if (imCommon.afcount < LIBRAW_AFDATA_MAXCOUNT) { + imCommon.afdata[imCommon.afcount].AFInfoData_tag = tag; + imCommon.afdata[imCommon.afcount].AFInfoData_order = order; + imCommon.afdata[imCommon.afcount].AFInfoData_length = len; + imCommon.afdata[imCommon.afcount].AFInfoData = (uchar *)malloc(imCommon.afdata[imCommon.afcount].AFInfoData_length); + fread(imCommon.afdata[imCommon.afcount].AFInfoData, imCommon.afdata[imCommon.afcount].AFInfoData_length, 1, ifp); + imCommon.afcount++; + } + } +} + +void LibRaw::parseRicohMakernotes(int /*base*/, unsigned tag, unsigned type, + unsigned /*len*/, unsigned /*dng_writer */) +{ + char buffer[17]; + if (tag == 0x0005) + { + int c; + int count = 0; + fread(buffer, 16, 1, ifp); + buffer[16] = 0; + FORC(16) + { + if ((isspace(buffer[c])) || (buffer[c] == 0x2D) || (isalnum(buffer[c]))) + count++; + else + break; + } + if (count == 16) + { + if (strncmp(model, "GXR", 3)) + { + sprintf(imgdata.shootinginfo.BodySerial, "%8s", buffer + 8); + } + buffer[8] = 0; + sprintf(imgdata.shootinginfo.InternalBodySerial, "%8s", buffer); + } + else + { + sprintf(imgdata.shootinginfo.BodySerial, "%02x%02x%02x%02x", buffer[4], + buffer[5], buffer[6], buffer[7]); + sprintf(imgdata.shootinginfo.InternalBodySerial, "%02x%02x%02x%02x", + buffer[8], buffer[9], buffer[10], buffer[11]); + } + } + else if ((tag == 0x1001) && tagtypeIs(LIBRAW_EXIFTAG_TYPE_SHORT)) + { + ilm.CameraMount = LIBRAW_MOUNT_FixedLens; + ilm.LensMount = LIBRAW_MOUNT_FixedLens; + ilm.CameraFormat = LIBRAW_FORMAT_APSC; + ilm.LensID = LIBRAW_LENS_NOT_SET; + ilm.FocalType = LIBRAW_FT_PRIME_LENS; + imgdata.shootinginfo.ExposureProgram = get2(); + } + else if ((tag == 0x1002) && tagtypeIs(LIBRAW_EXIFTAG_TYPE_SHORT)) + { + imgdata.shootinginfo.DriveMode = get2(); + } + else if (tag == 0x1006) + { + imgdata.shootinginfo.FocusMode = get2(); + } + else if (tag == 0x1007) + { + imRicoh.AutoBracketing = get2(); + } + else if (tag == 0x1009) + { + imRicoh.MacroMode = get2(); + } + else if (tag == 0x100a) + { + imRicoh.FlashMode = get2(); + } + else if (tag == 0x100b) + { + imRicoh.FlashExposureComp = getreal(type); + } + else if (tag == 0x100c) + { + imRicoh.ManualFlashOutput = getreal(type); + } + else if ((tag == 0x100b) && tagtypeIs(LIBRAW_EXIFTAG_TYPE_SRATIONAL)) + { + imCommon.FlashEC = getreal(type); + } + else if ((tag == 0x1017) && ((imRicoh.WideAdapter = get2()) == 2)) + { + strcpy(ilm.Attachment, "Wide-Angle Adapter"); + } + else if (tag == 0x1018) + { + imRicoh.CropMode = get2(); + } + else if (tag == 0x1019) + { + imRicoh.NDFilter = get2(); + } + else if (tag == 0x1200) + { + imRicoh.AFStatus = get2(); + } + else if (tag == 0x1201) + { + imRicoh.AFAreaXPosition[1] = get4(); + } + else if (tag == 0x1202) + { + imRicoh.AFAreaYPosition[1] = get4(); + } + else if (tag == 0x1203) + { + imRicoh.AFAreaXPosition[0] = get4(); + } + else if (tag == 0x1204) + { + imRicoh.AFAreaYPosition[0] = get4(); + } + else if (tag == 0x1205) + { + imRicoh.AFAreaMode = get2(); + } + else if (tag == 0x1500) + { + ilm.CurFocal = getreal(type); + } + else if (tag == 0x1601) + { + imRicoh.SensorWidth = get4(); + } + else if (tag == 0x1602) + { + imRicoh.SensorHeight = get4(); + } + else if (tag == 0x1603) + { + imRicoh.CroppedImageWidth = get4(); + } + else if (tag == 0x1604) + { + imRicoh.CroppedImageHeight= get4(); + } + else if ((tag == 0x2001) && !strncmp(model, "GXR", 3)) + { + short cur_tag; + fseek(ifp, 20, SEEK_CUR); + /*ntags =*/ get2(); + cur_tag = get2(); + while (cur_tag != 0x002c) + { + fseek(ifp, 10, SEEK_CUR); + cur_tag = get2(); + } + fseek(ifp, 6, SEEK_CUR); + fseek(ifp, get4(), SEEK_SET); + for (int i=0; i<4; i++) { + stread(buffer, 16, ifp); + if ((buffer[0] == 'S') && (buffer[1] == 'I') && (buffer[2] == 'D')) + memcpy(imgdata.shootinginfo.BodySerial, buffer+4, 12); + else if ((buffer[0] == 'R') && (buffer[1] == 'L')) + ilm.LensID = buffer[2] - '0'; + else if ((buffer[0] == 'L') && (buffer[1] == 'I') && (buffer[2] == 'D')) + memcpy(imgdata.lens.LensSerial, buffer+4, 12); + } + } +} diff --git a/rtengine/libraw/src/metadata/samsung.cpp b/rtengine/libraw/src/metadata/samsung.cpp new file mode 100644 index 000000000..26fd58f4d --- /dev/null +++ b/rtengine/libraw/src/metadata/samsung.cpp @@ -0,0 +1,182 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +void LibRaw::parseSamsungMakernotes(int /*base*/, unsigned tag, unsigned type, + unsigned len, unsigned dng_writer) +{ + int i, c; + if (tag == 0x0002) + { + imSamsung.DeviceType = get4(); + if (imSamsung.DeviceType == 0x2000) + { + ilm.CameraMount = LIBRAW_MOUNT_Samsung_NX; + ilm.CameraFormat = LIBRAW_FORMAT_APSC; + } + else if (!strncmp(model, "NX mini", 7)) + { // device type 0x1000: 'NX mini', EX2F, EX1, WB2000 + ilm.CameraMount = LIBRAW_MOUNT_Samsung_NX_M; + ilm.CameraFormat = LIBRAW_FORMAT_1INCH; + } + else + { + ilm.CameraMount = LIBRAW_MOUNT_FixedLens; + ilm.LensMount = LIBRAW_MOUNT_FixedLens; + } + } + else if (tag == 0x0003) + { + ilm.CamID = unique_id = get4(); + } + else if (tag == 0x0043) + { + if ((i = get4())) + { + imCommon.CameraTemperature = (float)i; + if (get4() == 10) + imCommon.CameraTemperature /= 10.0f; + } + } + else if ((tag == 0xa002) && (dng_writer != AdobeDNG)) + { + stmread(imgdata.shootinginfo.BodySerial, len, ifp); + } + else if (tag == 0xa003) + { + ilm.LensID = get2(); + if (ilm.LensID) + ilm.LensMount = LIBRAW_MOUNT_Samsung_NX; + } + else if (tag == 0xa004) + { // LensFirmware + stmread(imSamsung.LensFirmware, len, ifp); + } + else if (tag == 0xa005) + { + stmread(imgdata.lens.InternalLensSerial, len, ifp); + } + else if (tag == 0xa010) + { + FORC4 imSamsung.ImageSizeFull[c] = get4(); + FORC4 imSamsung.ImageSizeCrop[c] = get4(); + } + else if ((tag == 0xa011) && ((len == 1) || (len == 2)) && tagtypeIs(LIBRAW_EXIFTAG_TYPE_SHORT)) + { + imSamsung.ColorSpace[0] = (int)get2(); + switch (imSamsung.ColorSpace[0]) { + case 0: + imCommon.ColorSpace = LIBRAW_COLORSPACE_sRGB; + break; + case 1: + imCommon.ColorSpace = LIBRAW_COLORSPACE_AdobeRGB; + break; + default: + imCommon.ColorSpace = LIBRAW_COLORSPACE_Unknown; + break; + } + if (len == 2) + imSamsung.ColorSpace[1] = (int)get2(); + } + else if (tag == 0xa019) + { + ilm.CurAp = getreal(type); + } + else if ((tag == 0xa01a) && (unique_id != 0x5000000) && + (!imgdata.lens.FocalLengthIn35mmFormat)) + { + ilm.FocalLengthIn35mmFormat = get4(); + if (ilm.FocalLengthIn35mmFormat >= 160) + ilm.FocalLengthIn35mmFormat /= 10.0f; + if ((ilm.CameraMount == LIBRAW_MOUNT_Samsung_NX_M) && + (imSamsung.LensFirmware[10] < '6')) + ilm.FocalLengthIn35mmFormat *= 1.6f; + } + else if (tag == 0xa020) + { + FORC(11) imSamsung.key[c] = get4(); + } + else if ((tag == 0xa021) && (dng_writer == nonDNG)) + { + FORC4 cam_mul[RGGB_2_RGBG(c)] = get4() - imSamsung.key[c]; + } + else if (tag == 0xa022) + { + FORC4 icWBC[LIBRAW_WBI_Auto][RGGB_2_RGBG(c)] = + get4() - imSamsung.key[c + 4]; + if (icWBC[LIBRAW_WBI_Auto][0] < + (icWBC[LIBRAW_WBI_Auto][1] >> 1)) + { + icWBC[LIBRAW_WBI_Auto][1] = + icWBC[LIBRAW_WBI_Auto][1] >> 4; + icWBC[LIBRAW_WBI_Auto][3] = + icWBC[LIBRAW_WBI_Auto][3] >> 4; + } + } + else if (tag == 0xa023) + { + ushort ki[4] = {8, 9, 10, 0}; + FORC4 icWBC[LIBRAW_WBI_Ill_A][RGGB_2_RGBG(c)] = + get4() - imSamsung.key[ki[c]]; + if (icWBC[LIBRAW_WBI_Ill_A][0] < + (icWBC[LIBRAW_WBI_Ill_A][1] >> 1)) + { + icWBC[LIBRAW_WBI_Ill_A][1] = + icWBC[LIBRAW_WBI_Ill_A][1] >> 4; + icWBC[LIBRAW_WBI_Ill_A][3] = + icWBC[LIBRAW_WBI_Ill_A][3] >> 4; + } + } + else if (tag == 0xa024) + { + FORC4 icWBC[LIBRAW_WBI_D65][RGGB_2_RGBG(c)] = + get4() - imSamsung.key[c + 1]; + if (icWBC[LIBRAW_WBI_D65][0] < + (icWBC[LIBRAW_WBI_D65][1] >> 1)) + { + icWBC[LIBRAW_WBI_D65][1] = + icWBC[LIBRAW_WBI_D65][1] >> 4; + icWBC[LIBRAW_WBI_D65][3] = + icWBC[LIBRAW_WBI_D65][3] >> 4; + } + } + else if (tag == 0xa025) + { + unsigned t = get4() + imSamsung.key[0]; + if (t == 4096) + imSamsung.DigitalGain = 1.0; + else + imSamsung.DigitalGain = ((double)t) / 4096.0; + } + else if ((tag == 0xa028) && (dng_writer == nonDNG)) + { + FORC4 cblack[RGGB_2_RGBG(c)] = get4() - imSamsung.key[c]; + } + else if ((tag == 0xa030) && (len == 9)) + { + for (i = 0; i < 3; i++) + FORC3 imgdata.color.ccm[i][c] = + (float)((short)((get4() + imSamsung.key[i * 3 + c]))) / 256.0; + } + else if ((tag == 0xa032) && (len == 9) && (dng_writer == nonDNG)) + { + double aRGB_cam[3][3]; + FORC(9) + ((double *)aRGB_cam)[c] = + ((double)((short)((get4() + imSamsung.key[c])))) / 256.0; + aRGB_coeff(aRGB_cam); + } +} diff --git a/rtengine/libraw/src/metadata/sony.cpp b/rtengine/libraw/src/metadata/sony.cpp new file mode 100644 index 000000000..b63d0495d --- /dev/null +++ b/rtengine/libraw/src/metadata/sony.cpp @@ -0,0 +1,2389 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" +#include "../../internal/libraw_cameraids.h" +#include "../../internal/libraw_checked_buffer.h" + +static ushort saneSonyCameraInfo(uchar a, uchar b, uchar c, uchar d, uchar e, + uchar f) +{ + if ((a >> 4) > 9) + return 0; + else if ((a & 0x0f) > 9) + return 0; + else if ((b >> 4) > 9) + return 0; + else if ((b & 0x0f) > 9) + return 0; + else if ((c >> 4) > 9) + return 0; + else if ((c & 0x0f) > 9) + return 0; + else if ((d >> 4) > 9) + return 0; + else if ((d & 0x0f) > 9) + return 0; + else if ((e >> 4) > 9) + return 0; + else if ((e & 0x0f) > 9) + return 0; + else if ((f >> 4) > 9) + return 0; + else if ((f & 0x0f) > 9) + return 0; + return 1; +} +static float my_roundf(float x) +{ + float t; + if (x >= 0.0) + { + t = ceilf(x); + if (t - x > 0.5) + t -= 1.0; + return t; + } + else + { + t = ceilf(-x); + if (t + x > 0.5) + t -= 1.0; + return -t; + } +} + +static ushort bcd2dec(uchar data) +{ + if ((data >> 4) > 9) + return 0; + else if ((data & 0x0f) > 9) + return 0; + else + return (data >> 4) * 10 + (data & 0x0f); +} + +static uchar SonySubstitution[257] = + "\x00\x01\x32\xb1\x0a\x0e\x87\x28\x02\xcc\xca\xad\x1b\xdc\x08\xed\x64\x86" + "\xf0\x4f\x8c\x6c\xb8\xcb\x69\xc4\x2c\x03" + "\x97\xb6\x93\x7c\x14\xf3\xe2\x3e\x30\x8e\xd7\x60\x1c\xa1\xab\x37\xec\x75" + "\xbe\x23\x15\x6a\x59\x3f\xd0\xb9\x96\xb5" + "\x50\x27\x88\xe3\x81\x94\xe0\xc0\x04\x5c\xc6\xe8\x5f\x4b\x70\x38\x9f\x82" + "\x80\x51\x2b\xc5\x45\x49\x9b\x21\x52\x53" + "\x54\x85\x0b\x5d\x61\xda\x7b\x55\x26\x24\x07\x6e\x36\x5b\x47\xb7\xd9\x4a" + "\xa2\xdf\xbf\x12\x25\xbc\x1e\x7f\x56\xea" + "\x10\xe6\xcf\x67\x4d\x3c\x91\x83\xe1\x31\xb3\x6f\xf4\x05\x8a\x46\xc8\x18" + "\x76\x68\xbd\xac\x92\x2a\x13\xe9\x0f\xa3" + "\x7a\xdb\x3d\xd4\xe7\x3a\x1a\x57\xaf\x20\x42\xb2\x9e\xc3\x8b\xf2\xd5\xd3" + "\xa4\x7e\x1f\x98\x9c\xee\x74\xa5\xa6\xa7" + "\xd8\x5e\xb0\xb4\x34\xce\xa8\x79\x77\x5a\xc1\x89\xae\x9a\x11\x33\x9d\xf5" + "\x39\x19\x65\x78\x16\x71\xd2\xa9\x44\x63" + "\x40\x29\xba\xa0\x8f\xe4\xd6\x3b\x84\x0d\xc2\x4e\x58\xdd\x99\x22\x6b\xc9" + "\xbb\x17\x06\xe5\x7d\x66\x43\x62\xf6\xcd" + "\x35\x90\x2e\x41\x8d\x6d\xaa\x09\x73\x95\x0c\xf1\x1d\xde\x4c\x2f\x2d\xf7" + "\xd1\x72\xeb\xef\x48\xc7\xf8\xf9\xfa\xfb" + "\xfc\xfd\xfe\xff"; + +void LibRaw::sony_decrypt(unsigned *data, int len, int start, int key) +{ +#ifndef LIBRAW_NOTHREADS +#define pad tls->sony_decrypt.pad +#define p tls->sony_decrypt.p +#else + static unsigned pad[128], p; +#endif + if (start) + { + for (p = 0; p < 4; p++) + pad[p] = key = key * 48828125ULL + 1; + pad[3] = pad[3] << 1 | (pad[0] ^ pad[2]) >> 31; + for (p = 4; p < 127; p++) + pad[p] = (pad[p - 4] ^ pad[p - 2]) << 1 | (pad[p - 3] ^ pad[p - 1]) >> 31; + for (p = 0; p < 127; p++) + pad[p] = htonl(pad[p]); + } + while (len--) + { + *data++ ^= pad[p & 127] = pad[(p + 1) & 127] ^ pad[(p + 65) & 127]; + p++; + } +#ifndef LIBRAW_NOTHREADS +#undef pad +#undef p +#endif +} +void LibRaw::setSonyBodyFeatures(unsigned long long id) +{ + static const struct + { + ushort scf[11]; + /* + scf[0] camera id + scf[1] camera format + scf[2] camera mount: Minolta A, Sony E, fixed, + scf[3] camera type: DSLR, NEX, SLT, ILCE, ILCA, DSC + scf[4] lens mount, LIBRAW_MOUNT_FixedLens or LIBRAW_MOUNT_Unknown + scf[5] tag 0x2010 group (0 if not used) + scf[6] offset of Sony ISO in 0x2010 table, 0xffff if not valid + scf[7] offset of ShutterCount3 in 0x9050 table, 0xffff if not valid + scf[8] offset of MeteringMode in 0x2010 table, 0xffff if not valid + scf[9] offset of ExposureProgram in 0x2010 table, 0xffff if not valid + scf[10] offset of ReleaseMode2 in 0x2010 table, 0xffff if not valid + */ + } SonyCamFeatures[] = { + {SonyID_DSLR_A100, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_DSLR, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_DSLR_A900, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_DSLR, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_DSLR_A700, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_DSLR, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_DSLR_A200, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_DSLR, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_DSLR_A350, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_DSLR, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_DSLR_A300, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_DSLR, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_DSLR_A900, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_DSLR, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_DSLR_A380, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_DSLR, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_DSLR_A330, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_DSLR, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_DSLR_A230, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_DSLR, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_DSLR_A290, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_DSLR, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_DSLR_A850, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_DSLR, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_DSLR_A850, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_DSLR, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_DSLR_A550, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_DSLR, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_DSLR_A500, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_DSLR, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_DSLR_A450, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_DSLR, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_NEX_5, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_NEX, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_NEX_3, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_NEX, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_SLT_A33, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_SLT, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_SLT_A55, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_SLT, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_DSLR_A560, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_DSLR, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_DSLR_A580, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_DSLR, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_NEX_C3, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_NEX, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_SLT_A35, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_SLT, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_SLT_A65, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_SLT, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010b, 0x1218, 0x01bd, 0x1178, 0x1179, 0x112c}, + {SonyID_SLT_A77, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_SLT, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010b, 0x1218, 0x01bd, 0x1178, 0x1179, 0x112c}, + {SonyID_NEX_5N, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_NEX, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010a, 0x113e, 0x01bd, 0x1174, 0x1175, 0x112c}, + {SonyID_NEX_7, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_NEX, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010b, 0x1218, 0x01bd, 0x1178, 0x1179, 0x112c}, + {SonyID_NEX_VG20, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_NEX, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010b, 0x1218, 0x01bd, 0x1178, 0x1179, 0x112c}, + {SonyID_SLT_A37, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_SLT, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010c, 0x11f4, 0x01bd, 0x1154, 0x1155, 0x1108}, + {SonyID_SLT_A57, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_SLT, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010c, 0x11f4, 0x01bd, 0x1154, 0x1155, 0x1108}, + {SonyID_NEX_F3, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_NEX, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010c, 0x11f4, 0x01bd, 0x1154, 0x1155, 0x1108}, + {SonyID_SLT_A99, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_SLT, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010e, 0x1254, 0x01aa, 0x11ac, 0x11ad, 0x1160}, + {SonyID_NEX_6, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_NEX, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010e, 0x1254, 0x01aa, 0x11ac, 0x11ad, 0x1160}, + {SonyID_NEX_5R, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_NEX, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010e, 0x1254, 0x01aa, 0x11ac, 0x11ad, 0x1160}, + {SonyID_DSC_RX100, LIBRAW_FORMAT_1INCH, LIBRAW_MOUNT_FixedLens, LIBRAW_SONY_DSC, LIBRAW_MOUNT_FixedLens, + LIBRAW_SONY_Tag2010e, 0x1254, 0xffff, 0x11ac, 0x11ad, 0x1160}, + {SonyID_DSC_RX1, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_FixedLens, LIBRAW_SONY_DSC, LIBRAW_MOUNT_FixedLens, + LIBRAW_SONY_Tag2010e, 0x1258, 0xffff, 0x11ac, 0x11ad, 0x1160}, + {SonyID_NEX_VG900, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_NEX, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010e, 0x1254, 0x01aa, 0x11ac, 0x11ad, 0x1160}, + {SonyID_NEX_VG30, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_NEX, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010e, 0x1254, 0x01aa, 0x11ac, 0x11ad, 0x1160}, + {SonyID_ILCE_3000, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010e, 0x1280, 0x01aa, 0x11ac, 0x11ad, 0x1160}, + {SonyID_SLT_A58, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_SLT, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010e, 0x1280, 0x01aa, 0x11ac, 0x11ad, 0x1160}, + {SonyID_NEX_3N, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_NEX, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010e, 0x1280, 0x01aa, 0x11ac, 0x11ad, 0x1160}, + {SonyID_ILCE_7, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010g, 0x0344, 0xffff, 0x025c, 0x025d, 0x0210}, + {SonyID_NEX_5T, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_NEX, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010e, 0x1254, 0x01aa, 0x11ac, 0x11ad, 0x1160}, + {SonyID_DSC_RX100M2, LIBRAW_FORMAT_1INCH, LIBRAW_MOUNT_FixedLens, LIBRAW_SONY_DSC, LIBRAW_MOUNT_FixedLens, + LIBRAW_SONY_Tag2010f, 0x113c, 0xffff, 0x1064, 0x1065, 0x1018}, + {SonyID_DSC_RX10, LIBRAW_FORMAT_1INCH, LIBRAW_MOUNT_FixedLens, LIBRAW_SONY_DSC, LIBRAW_MOUNT_FixedLens, + LIBRAW_SONY_Tag2010g, 0x0344, 0xffff, 0x025c, 0x025d, 0x0210}, + {SonyID_DSC_RX1R, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_FixedLens, LIBRAW_SONY_DSC, LIBRAW_MOUNT_FixedLens, + LIBRAW_SONY_Tag2010e, 0x1258, 0xffff, 0x11ac, 0x11ad, 0x1160}, + {SonyID_ILCE_7R, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010g, 0x0344, 0xffff, 0x025c, 0x025d, 0x0210}, + {SonyID_ILCE_6000, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010g, 0x0344, 0xffff, 0x025c, 0x025d, 0x0210}, + {SonyID_ILCE_5000, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010g, 0x0344, 0x01aa, 0x025c, 0x025d, 0x0210}, + {SonyID_DSC_RX100M3, LIBRAW_FORMAT_1INCH, LIBRAW_MOUNT_FixedLens, LIBRAW_SONY_DSC, LIBRAW_MOUNT_FixedLens, + LIBRAW_SONY_Tag2010g, 0x0344, 0xffff, 0x025c, 0x025d, 0x0210}, + {SonyID_ILCE_7S, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010g, 0x0344, 0xffff, 0x025c, 0x025d, 0x0210}, + {SonyID_ILCA_77M2, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_ILCA, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010g, 0x0344, 0x01a0, 0x025c, 0x025d, 0x0210}, + {SonyID_ILCE_5100, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010g, 0x0344, 0x01a0, 0x025c, 0x025d, 0x0210}, + {SonyID_ILCE_7M2, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010g, 0x0344, 0xffff, 0x025c, 0x025d, 0x0210}, + {SonyID_DSC_RX100M4, LIBRAW_FORMAT_1INCH, LIBRAW_MOUNT_FixedLens, LIBRAW_SONY_DSC, LIBRAW_MOUNT_FixedLens, + LIBRAW_SONY_Tag2010h, 0x0346, 0xffff, 0x025c, 0x025d, 0x0210}, + {SonyID_DSC_RX10M2, LIBRAW_FORMAT_1INCH, LIBRAW_MOUNT_FixedLens, LIBRAW_SONY_DSC, LIBRAW_MOUNT_FixedLens, + LIBRAW_SONY_Tag2010h, 0x0346, 0xffff, 0x025c, 0x025d, 0x0210}, + {SonyID_DSC_RX1RM2, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_FixedLens, LIBRAW_SONY_DSC, LIBRAW_MOUNT_FixedLens, + LIBRAW_SONY_Tag2010h, 0x0346, 0xffff, 0x025c, 0x025d, 0x0210}, + {SonyID_ILCE_QX1, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010g, 0x0344, 0x01a0, 0x025c, 0x025d, 0x0210}, + {SonyID_ILCE_7RM2, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010h, 0x0346, 0x01cb, 0x025c, 0x025d, 0x0210}, + {SonyID_ILCE_7SM2, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010h, 0x0346, 0x01cb, 0x025c, 0x025d, 0x0210}, + {SonyID_ILCA_68, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_ILCA, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010g, 0x0344, 0x01a0, 0x025c, 0x025d, 0x0210}, + {SonyID_ILCA_99M2, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Minolta_A, LIBRAW_SONY_ILCA, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010h, 0x0346, 0x01cd, 0x025c, 0x025d, 0x0210}, + {SonyID_DSC_RX10M3, LIBRAW_FORMAT_1INCH, LIBRAW_MOUNT_FixedLens, LIBRAW_SONY_DSC, LIBRAW_MOUNT_FixedLens, + LIBRAW_SONY_Tag2010h, 0x0346, 0xffff, 0x025c, 0x025d, 0x0210}, + {SonyID_DSC_RX100M5, LIBRAW_FORMAT_1INCH, LIBRAW_MOUNT_FixedLens, LIBRAW_SONY_DSC, LIBRAW_MOUNT_FixedLens, + LIBRAW_SONY_Tag2010h, 0x0346, 0xffff, 0x025c, 0x025d, 0x0210}, + {SonyID_ILCE_6300, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010h, 0x0346, 0x01cd, 0x025c, 0x025d, 0x0210}, + {SonyID_ILCE_9, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010i, 0x0320, 0x019f, 0x024b, 0x024c, 0x0208}, + {SonyID_ILCE_6500, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010h, 0x0346, 0x01cd, 0x025c, 0x025d, 0x0210}, + {SonyID_ILCE_7RM3, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010i, 0x0320, 0x019f, 0x024b, 0x024c, 0x0208}, + {SonyID_ILCE_7M3, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010i, 0x0320, 0x019f, 0x024b, 0x024c, 0x0208}, + {SonyID_DSC_RX0, LIBRAW_FORMAT_1INCH, LIBRAW_MOUNT_FixedLens, LIBRAW_SONY_DSC, LIBRAW_MOUNT_FixedLens, + LIBRAW_SONY_Tag2010h, 0x0346, 0xffff, 0x025c, 0x025d, 0x0210}, + {SonyID_DSC_RX10M4, LIBRAW_FORMAT_1INCH, LIBRAW_MOUNT_FixedLens, LIBRAW_SONY_DSC, LIBRAW_MOUNT_FixedLens, + LIBRAW_SONY_Tag2010i, 0x0320, 0xffff, 0x024b, 0x024c, 0x0208}, + {SonyID_DSC_RX100M6, LIBRAW_FORMAT_1INCH, LIBRAW_MOUNT_FixedLens, LIBRAW_SONY_DSC, LIBRAW_MOUNT_FixedLens, + LIBRAW_SONY_Tag2010i, 0x0320, 0xffff, 0x024b, 0x024c, 0x0208}, + {SonyID_DSC_HX99, LIBRAW_FORMAT_1div2p3INCH, LIBRAW_MOUNT_FixedLens, LIBRAW_SONY_DSC, LIBRAW_MOUNT_FixedLens, + LIBRAW_SONY_Tag2010i, 0x0320, 0xffff, 0x024b, 0x024c, 0x0208}, + {SonyID_DSC_RX100M5A, LIBRAW_FORMAT_1INCH, LIBRAW_MOUNT_FixedLens, LIBRAW_SONY_DSC, LIBRAW_MOUNT_FixedLens, + LIBRAW_SONY_Tag2010i, 0x0320, 0xffff, 0x024b, 0x024c, 0x0208}, + {SonyID_ILCE_6400, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010i, 0x0320, 0x019f, 0x024b, 0x024c, 0x0208}, + {SonyID_DSC_RX0M2, LIBRAW_FORMAT_1INCH, LIBRAW_MOUNT_FixedLens, LIBRAW_SONY_DSC, LIBRAW_MOUNT_FixedLens, + LIBRAW_SONY_Tag2010i, 0x0320, 0xffff, 0x024b, 0x024c, 0x0208}, + {SonyID_DSC_HX95, LIBRAW_FORMAT_1div2p3INCH, LIBRAW_MOUNT_FixedLens, LIBRAW_SONY_DSC, LIBRAW_MOUNT_FixedLens, + LIBRAW_SONY_Tag2010i, 0x0320, 0xffff, 0x024b, 0x024c, 0x0208}, + {SonyID_DSC_RX100M7, LIBRAW_FORMAT_1INCH, LIBRAW_MOUNT_FixedLens, LIBRAW_SONY_DSC, LIBRAW_MOUNT_FixedLens, + LIBRAW_SONY_Tag2010i, 0x0320, 0xffff, 0x024b, 0x024c, 0x0208}, + {SonyID_ILCE_7RM4, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010i, 0x0320, 0x019f, 0x024b, 0x024c, 0x0208}, + {SonyID_ILCE_9M2, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010i, 0x0320, 0x019f, 0x024b, 0x024c, 0x0208}, + {SonyID_ILCE_6600, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010i, 0x0320, 0x019f, 0x024b, 0x024c, 0x0208}, + {SonyID_ILCE_6100, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010i, 0x0320, 0x019f, 0x024b, 0x024c, 0x0208}, + {SonyID_ZV_1, LIBRAW_FORMAT_1INCH, LIBRAW_MOUNT_FixedLens, LIBRAW_SONY_DSC, LIBRAW_MOUNT_FixedLens, + LIBRAW_SONY_Tag2010i, 0x0320, 0xffff, 0x024b, 0x024c, 0x0208}, + {SonyID_ILCE_7C, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010i, 0x0320, 0x019f, 0x024b, 0x024c, 0x0208}, + +// a la SonyID_ILCE_6100 + {SonyID_ZV_E10, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010i, 0x0320, 0x019f, 0x024b, 0x024c, 0x0208}, + + {SonyID_ILCE_7SM3, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_ILCE_1, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_ILME_FX3, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_ILCE_7RM3A, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010i, 0x0320, 0x019f, 0x024b, 0x024c, 0x0208}, + {SonyID_ILCE_7RM4A, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010i, 0x0320, 0x019f, 0x024b, 0x024c, 0x0208}, + {SonyID_ILCE_7M4, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_ILCE_7RM5, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_ILME_FX30, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_ZV_E1, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_ILCE_6700, LIBRAW_FORMAT_APSC, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_ZV_1M2, LIBRAW_FORMAT_1INCH, LIBRAW_MOUNT_FixedLens, LIBRAW_SONY_DSC, LIBRAW_MOUNT_FixedLens, + LIBRAW_SONY_Tag2010i, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + + {SonyID_ILCE_7CR, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + {SonyID_ILCE_7CM2, LIBRAW_FORMAT_FF, LIBRAW_MOUNT_Sony_E, LIBRAW_SONY_ILCE, LIBRAW_MOUNT_Unknown, + LIBRAW_SONY_Tag2010None, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + }; + ilm.CamID = id; + int isPreProductionFW = 0; + if (!strcmp(model, "MODEL-NAME")) isPreProductionFW = 1; + + if (id == SonyID_DSC_R1) + { + ilm.CameraMount = ilm.LensMount = LIBRAW_MOUNT_FixedLens; + imSony.CameraType = LIBRAW_SONY_DSC; + imSony.group2010 = LIBRAW_SONY_Tag2010None; + imSony.group9050 = LIBRAW_SONY_Tag9050None; + return; + } + + for (unsigned i = 0; i < (sizeof SonyCamFeatures / sizeof *SonyCamFeatures); i++) { + if (SonyCamFeatures[i].scf[0] == id) { + ilm.CameraFormat = SonyCamFeatures[i].scf[1]; + ilm.CameraMount = SonyCamFeatures[i].scf[2]; + imSony.CameraType = SonyCamFeatures[i].scf[3]; + if (SonyCamFeatures[i].scf[4]) + ilm.LensMount = SonyCamFeatures[i].scf[4]; + imSony.group2010 = SonyCamFeatures[i].scf[5]; + imSony.real_iso_offset = SonyCamFeatures[i].scf[6]; + imSony.ImageCount3_offset = SonyCamFeatures[i].scf[7]; + imSony.MeteringMode_offset = SonyCamFeatures[i].scf[8]; + imSony.ExposureProgram_offset = SonyCamFeatures[i].scf[9]; + imSony.ReleaseMode2_offset = SonyCamFeatures[i].scf[10]; + break; + } + } + + switch (id) { + case SonyID_ILCE_6100: + case SonyID_ILCE_6300: + case SonyID_ILCE_6400: + case SonyID_ILCE_6500: + case SonyID_ILCE_6600: + case SonyID_ILCE_7C: + case SonyID_ILCE_7M3: + case SonyID_ILCE_7RM2: + case SonyID_ILCE_7RM3: + case SonyID_ILCE_7RM3A: + case SonyID_ILCE_7RM4: + case SonyID_ILCE_7RM4A: + case SonyID_ILCE_7SM2: + case SonyID_ILCE_9: + case SonyID_ILCE_9M2: + case SonyID_ILCA_99M2: + case SonyID_ZV_E10: + if (!isPreProductionFW) + { + imSony.group9050 = LIBRAW_SONY_Tag9050b; // length: 944 bytes + } + else + { + imSony.group9050 = LIBRAW_SONY_Tag9050a; + imSony.ImageCount3_offset = 0xffff; // not valid + } + break; + case SonyID_ILCE_1: + case SonyID_ILCE_7M4: + case SonyID_ILCE_7RM5: + case SonyID_ILCE_7SM3: + case SonyID_ILME_FX3: + if (!isPreProductionFW) + { + imSony.group9050 = LIBRAW_SONY_Tag9050c; // length: 256 bytes + } + else + { + imSony.group9050 = LIBRAW_SONY_Tag9050a; + imSony.ImageCount3_offset = 0xffff; // not valid + } + break; + case SonyID_ZV_E1: + case SonyID_ILCE_6700: + case SonyID_ILCE_7CR: + case SonyID_ILCE_7CM2: + imSony.group9050 = LIBRAW_SONY_Tag9050d; + break; + default: // see also process_Sony_0x9050 + if ( + (imSony.CameraType != LIBRAW_SONY_DSC) && + (imSony.CameraType != LIBRAW_SONY_DSLR) + ) + imSony.group9050 = LIBRAW_SONY_Tag9050a; // length: 3072 or 944 bytes + else + imSony.group9050 = LIBRAW_SONY_Tag9050None; + break; + } + + if (isPreProductionFW) return; + + char *sbstr = strstr(software, " v"); + if (sbstr != NULL) + { + sbstr += 2; + strcpy(imCommon.firmware, sbstr); + imSony.firmware = atof(sbstr); + + if ((id == SonyID_ILCE_7) || + (id == SonyID_ILCE_7R)) + { + if (imSony.firmware < 1.2f) + imSony.ImageCount3_offset = 0x01aa; + else + imSony.ImageCount3_offset = 0x01c0; + } + else if (id == SonyID_ILCE_6000) + { + if (imSony.firmware < 2.0f) + imSony.ImageCount3_offset = 0x01aa; + else + imSony.ImageCount3_offset = 0x01c0; + } + else if ((id == SonyID_ILCE_7S) || + (id == SonyID_ILCE_7M2)) + { + if (imSony.firmware < 1.2f) + imSony.ImageCount3_offset = 0x01a0; + else + imSony.ImageCount3_offset = 0x01b6; + } + } +} + +void LibRaw::parseSonyLensType2(uchar a, uchar b) +{ + ushort lid2; + lid2 = (((ushort)a) << 8) | ((ushort)b); + if (!lid2) + return; + if (lid2 < 0x100) + { + if ((ilm.AdapterID != 0x4900) && (ilm.AdapterID != 0xef00)) + { + ilm.AdapterID = lid2; + switch (lid2) + { + case 1: // Sony LA-EA1 or Sigma MC-11 Adapter + case 2: // Sony LA-EA2 + case 3: // Sony LA-EA3 + case 6: // Sony LA-EA4 + case 7: // Sony LA-EA5 + case 24593: // LA-EA4r MonsterAdapter, id = 0x6011 + ilm.LensMount = LIBRAW_MOUNT_Minolta_A; + break; + case 44: // Metabones Canon EF Smart Adapter + case 78: // Metabones Canon EF Smart Adapter Mark III or Other Adapter + case 184: // Metabones Canon EF Speed Booster Ultra + case 234: // Metabones Canon EF Smart Adapter Mark IV + case 239: // Metabones Canon EF Speed Booster + ilm.LensMount = LIBRAW_MOUNT_Canon_EF; + break; + } + } + } + else + ilm.LensID = lid2; + + if ((lid2 >= 50481) && + (lid2 < 50500)) { + strcpy(ilm.Adapter, "MC-11"); + ilm.AdapterID = 0x4900; + } else if ((lid2 > 0xef00) && + (lid2 < 0xffff) && + (lid2 != 0xff00)) { + ilm.AdapterID = 0xef00; + ilm.LensID -= ilm.AdapterID; + ilm.LensMount = LIBRAW_MOUNT_Canon_EF; + } + + return; +} + +void LibRaw::parseSonyLensFeatures(uchar a, uchar b) +{ + + ushort features; + features = (((ushort)a) << 8) | ((ushort)b); + + if ((ilm.LensMount == LIBRAW_MOUNT_Canon_EF) || + (ilm.LensMount != LIBRAW_MOUNT_Sigma_X3F) || !features) + return; + + ilm.LensFeatures_pre[0] = 0; + ilm.LensFeatures_suf[0] = 0; + if ((features & 0x0200) && (features & 0x0100)) + strcpy(ilm.LensFeatures_pre, "E"); + else if (features & 0x0200) + strcpy(ilm.LensFeatures_pre, "FE"); + else if (features & 0x0100) + strcpy(ilm.LensFeatures_pre, "DT"); + + if (!ilm.LensFormat && !ilm.LensMount) + { + ilm.LensFormat = LIBRAW_FORMAT_FF; + ilm.LensMount = LIBRAW_MOUNT_Minolta_A; + + if ((features & 0x0200) && (features & 0x0100)) + { + ilm.LensFormat = LIBRAW_FORMAT_APSC; + ilm.LensMount = LIBRAW_MOUNT_Sony_E; + } + else if (features & 0x0200) + { + ilm.LensMount = LIBRAW_MOUNT_Sony_E; + } + else if (features & 0x0100) + { + ilm.LensFormat = LIBRAW_FORMAT_APSC; + } + } + + if (features & 0x4000) + strnXcat(ilm.LensFeatures_pre, " PZ"); + + if (features & 0x0008) + strnXcat(ilm.LensFeatures_suf, " G"); + else if (features & 0x0004) + strnXcat(ilm.LensFeatures_suf, " ZA"); + + if ((features & 0x0020) && (features & 0x0040)) + strnXcat(ilm.LensFeatures_suf, " Macro"); + else if (features & 0x0020) + strnXcat(ilm.LensFeatures_suf, " STF"); + else if (features & 0x0040) + strnXcat(ilm.LensFeatures_suf, " Reflex"); + else if (features & 0x0080) + strnXcat(ilm.LensFeatures_suf, " Fisheye"); + + if (features & 0x0001) + strnXcat(ilm.LensFeatures_suf, " SSM"); + else if (features & 0x0002) + strnXcat(ilm.LensFeatures_suf, " SAM"); + + if (features & 0x8000) + strnXcat(ilm.LensFeatures_suf, " OSS"); + + if (features & 0x2000) + strnXcat(ilm.LensFeatures_suf, " LE"); + + if (features & 0x0800) + strnXcat(ilm.LensFeatures_suf, " II"); + + if (ilm.LensFeatures_suf[0] == ' ') + memmove(ilm.LensFeatures_suf, ilm.LensFeatures_suf + 1, + strbuflen(ilm.LensFeatures_suf) - 1); + + return; +} + +void LibRaw::process_Sony_0x0116(uchar *buf, ushort len, unsigned long long id) +{ + int i = 0; + + if (((id == SonyID_DSLR_A900) || + (id == SonyID_DSLR_A900_APSC) || + (id == SonyID_DSLR_A850) || + (id == SonyID_DSLR_A850_APSC)) && + (len >= 2)) + i = 1; + else if ((id >= SonyID_DSLR_A550) && (len >= 3)) + i = 2; + else + return; + + imCommon.BatteryTemperature = (float)(buf[i] - 32) / 1.8f; +} + +void LibRaw::process_Sony_0x2010(uchar *buf, ushort len) +{ + if (imSony.group2010 == LIBRAW_SONY_Tag2010None) return; + + ushort ar_offset = 0; + if (imSony.group2010 == LIBRAW_SONY_Tag2010e) { + if (ilm.CamID == SonyID_DSC_RX100) { + ar_offset = 0x1a88; + } else { + ar_offset = 0x192c; + } + } else if (imSony.group2010 == LIBRAW_SONY_Tag2010f) { + ar_offset = 0x192c; + } else if (imSony.group2010 == LIBRAW_SONY_Tag2010g) { + ar_offset = 0x1958; + } else if (imSony.group2010 == LIBRAW_SONY_Tag2010h) { + ar_offset = 0x192c; + } else if (imSony.group2010 == LIBRAW_SONY_Tag2010i) { + ar_offset = 0x188c; + } + if (ar_offset != 0) { + int s = (int)SonySubstitution[buf[ar_offset]]; + if (s == 0) { + imSony.AspectRatio = LIBRAW_IMAGE_ASPECT_16to9; + } else if (s == 1) { + imSony.AspectRatio = LIBRAW_IMAGE_ASPECT_4to3; + } else if (s == 2) { + imSony.AspectRatio = LIBRAW_IMAGE_ASPECT_3to2; + } else if (s == 3) { + imSony.AspectRatio = LIBRAW_IMAGE_ASPECT_1to1; + } else { + imSony.AspectRatio = (float)s; + } + } + + if ((imSony.real_iso_offset != 0xffff) && + (len >= (imSony.real_iso_offset + 2)) && (imCommon.real_ISO < 0.1f)) + { + uchar s[2]; + s[0] = SonySubstitution[buf[imSony.real_iso_offset]]; + s[1] = SonySubstitution[buf[imSony.real_iso_offset + 1]]; + imCommon.real_ISO = + 100.0f * libraw_powf64l(2.0f, (16 - ((float)sget2(s)) / 256.0f)); + } + + if ((imSony.MeteringMode_offset != 0xffff) && + (imSony.ExposureProgram_offset != 0xffff) && + (len >= (imSony.MeteringMode_offset + 2))) + { + imgdata.shootinginfo.MeteringMode = + SonySubstitution[buf[imSony.MeteringMode_offset]]; + imgdata.shootinginfo.ExposureProgram = + SonySubstitution[buf[imSony.ExposureProgram_offset]]; + } + + if ((imSony.ReleaseMode2_offset != 0xffff) && + (len >= (imSony.ReleaseMode2_offset + 2))) + { + imgdata.shootinginfo.DriveMode = + SonySubstitution[buf[imSony.ReleaseMode2_offset]]; + } +} + +void LibRaw::process_Sony_0x9050(uchar *buf, ushort len, unsigned long long id) +{ + ushort lid; + uchar s[4]; + int c; + + + if ( + (imSony.group9050 == LIBRAW_SONY_Tag9050None) && + (imSony.CameraType != LIBRAW_SONY_DSC) && + (imSony.CameraType != LIBRAW_SONY_DSLR) + ) { + imSony.group9050 = LIBRAW_SONY_Tag9050a; + } + +/* +printf ("==>> Tag9050, len: 0x%04x, type: %s\n", len, + imSony.group9050==LIBRAW_SONY_Tag9050None?"None": + imSony.group9050==LIBRAW_SONY_Tag9050a?"9050a": + imSony.group9050==LIBRAW_SONY_Tag9050b?"9050b": + imSony.group9050==LIBRAW_SONY_Tag9050c?"9050c": + imSony.group9050==LIBRAW_SONY_Tag9050d?"9050d":"---"); +*/ + + if (imSony.group9050 == LIBRAW_SONY_Tag9050None) return; + + if ((ilm.CameraMount != LIBRAW_MOUNT_Sony_E) && + (imSony.CameraType != LIBRAW_SONY_DSC)) + { + if (len < 2) + return; + if (buf[0]) + ilm.MaxAp4CurFocal = + my_roundf( + libraw_powf64l(2.0f, ((float)SonySubstitution[buf[0]] / 8.0 - 1.06f) / 2.0f) * + 10.0f) / 10.0f; + + if (buf[1]) + ilm.MinAp4CurFocal = + my_roundf( + libraw_powf64l(2.0f, ((float)SonySubstitution[buf[1]] / 8.0 - 1.06f) / 2.0f) * + 10.0f) / 10.0f; + } + + if ((imSony.group9050 == LIBRAW_SONY_Tag9050b) || + (imSony.group9050 == LIBRAW_SONY_Tag9050c)) { + unsigned start_InternalBodySerial = 0x88; + if (id == SonyID_ILCE_1) start_InternalBodySerial += 2; + if (len <= start_InternalBodySerial+5) return; + unsigned long long b88 = SonySubstitution[buf[start_InternalBodySerial]]; + unsigned long long b89 = SonySubstitution[buf[start_InternalBodySerial+1]]; + unsigned long long b8a = SonySubstitution[buf[start_InternalBodySerial+2]]; + unsigned long long b8b = SonySubstitution[buf[start_InternalBodySerial+3]]; + unsigned long long b8c = SonySubstitution[buf[start_InternalBodySerial+4]]; + unsigned long long b8d = SonySubstitution[buf[start_InternalBodySerial+5]]; + sprintf(imgdata.shootinginfo.InternalBodySerial, "%06llx", + (b88 << 40) + (b89 << 32) + (b8a << 24) + (b8b << 16) + (b8c << 8) + b8d); + + } else if (imSony.group9050 == LIBRAW_SONY_Tag9050d) { + unsigned start_InternalBodySerial = 0x38; + if (len <= start_InternalBodySerial+5) return; + unsigned long long b38 = SonySubstitution[buf[start_InternalBodySerial]]; + unsigned long long b39 = SonySubstitution[buf[start_InternalBodySerial+1]]; + unsigned long long b4a = SonySubstitution[buf[start_InternalBodySerial+2]]; + unsigned long long b4b = SonySubstitution[buf[start_InternalBodySerial+3]]; + unsigned long long b4c = SonySubstitution[buf[start_InternalBodySerial+4]]; + unsigned long long b4d = SonySubstitution[buf[start_InternalBodySerial+5]]; + sprintf(imgdata.shootinginfo.InternalBodySerial, "%06llx", + (b38 << 40) + (b39 << 32) + (b4a << 24) + (b4b << 16) + (b4c << 8) + b4d); + + } else if (imSony.group9050 == LIBRAW_SONY_Tag9050a) { + if ((ilm.CameraMount == LIBRAW_MOUNT_Sony_E) && + (id != SonyID_NEX_5N) && + (id != SonyID_NEX_7) && + (id != SonyID_NEX_VG20)) { + if (len <= 0x7f) return; + unsigned b7c = SonySubstitution[buf[0x7c]]; + unsigned b7d = SonySubstitution[buf[0x7d]]; + unsigned b7e = SonySubstitution[buf[0x7e]]; + unsigned b7f = SonySubstitution[buf[0x7f]]; + sprintf(imgdata.shootinginfo.InternalBodySerial, "%04x", + (b7c << 24) + (b7d << 16) + (b7e << 8) + b7f); + + } else if (ilm.CameraMount == LIBRAW_MOUNT_Minolta_A) { + if (len <= 0xf4) return; + unsigned long long bf0 = SonySubstitution[buf[0xf0]]; + unsigned long long bf1 = SonySubstitution[buf[0xf1]]; + unsigned long long bf2 = SonySubstitution[buf[0xf2]]; + unsigned long long bf3 = SonySubstitution[buf[0xf3]]; + unsigned long long bf4 = SonySubstitution[buf[0xf4]]; + sprintf(imgdata.shootinginfo.InternalBodySerial, "%05llx", + (bf0 << 32) + (bf1 << 24) + (bf2 << 16) + (bf3 << 8) + bf4); + } + } + + if (imSony.CameraType != LIBRAW_SONY_DSC) + { + if (len <= 0x106) + return; + if (buf[0x3d] | buf[0x3c]) + { + lid = SonySubstitution[buf[0x3d]] << 8 | SonySubstitution[buf[0x3c]]; + ilm.CurAp = libraw_powf64l(2.0f, ((float)lid / 256.0f - 16.0f) / 2.0f); + } + if (buf[0x105] && + (ilm.LensMount != LIBRAW_MOUNT_Canon_EF) && + (ilm.LensMount != LIBRAW_MOUNT_Sigma_X3F)) { + switch (SonySubstitution[buf[0x105]]) { + case 1: + ilm.LensMount = LIBRAW_MOUNT_Minolta_A; + break; + case 2: + ilm.LensMount = LIBRAW_MOUNT_Sony_E; + break; + } + } + if (buf[0x106]) { + switch (SonySubstitution[buf[0x106]]) { + case 1: + ilm.LensFormat = LIBRAW_FORMAT_APSC; + break; + case 2: + ilm.LensFormat = LIBRAW_FORMAT_FF; + break; + } + } + } + + if (ilm.CameraMount == LIBRAW_MOUNT_Sony_E) + { + if (len <= 0x108) + return; + parseSonyLensType2( + SonySubstitution[buf[0x0108]], // LensType2 - Sony lens ids + SonySubstitution[buf[0x0107]]); + } + + if (len <= 0x10a) + return; + if ((ilm.LensID == LIBRAW_LENS_NOT_SET) && + (ilm.CameraMount == LIBRAW_MOUNT_Minolta_A) && + (buf[0x010a] | buf[0x0109])) + { + ilm.LensID = // LensType - Minolta/Sony lens ids + SonySubstitution[buf[0x010a]] << 8 | SonySubstitution[buf[0x0109]]; + + if ((ilm.LensID > 0x4900) && (ilm.LensID <= 0x5900)) + { + ilm.AdapterID = 0x4900; + ilm.LensID -= ilm.AdapterID; + ilm.LensMount = LIBRAW_MOUNT_Sigma_X3F; + strcpy(ilm.Adapter, "MC-11"); + } + + else if ((ilm.LensID > 0xef00) && (ilm.LensID < 0xffff) && + (ilm.LensID != 0xff00)) + { + ilm.AdapterID = 0xef00; + ilm.LensID -= ilm.AdapterID; + ilm.LensMount = LIBRAW_MOUNT_Canon_EF; + } + } + + if ((id >= SonyID_SLT_A65) && (id <= SonyID_NEX_F3)) + { + if (len <= 0x116) + return; + // "SLT-A65", "SLT-A77", "NEX-7", "NEX-VG20", + // "SLT-A37", "SLT-A57", "NEX-F3", "Lunar" + parseSonyLensFeatures(SonySubstitution[buf[0x115]], + SonySubstitution[buf[0x116]]); + } + else if (ilm.CameraMount != LIBRAW_MOUNT_FixedLens) + { + if (len <= 0x117) + return; + parseSonyLensFeatures(SonySubstitution[buf[0x116]], + SonySubstitution[buf[0x117]]); + } + + if ((imSony.ImageCount3_offset != 0xffff) && + (len >= (imSony.ImageCount3_offset + 4))) + { + FORC4 s[c] = SonySubstitution[buf[imSony.ImageCount3_offset + c]]; + imSony.ImageCount3 = sget4(s); + } + + return; +} + +void LibRaw::process_Sony_0x9400(uchar *buf, ushort len, unsigned long long /*id*/) +{ + + uchar s[4]; + int c; + uchar bufx = buf[0]; + + if (((bufx == 0x23) || + (bufx == 0x24) || + (bufx == 0x26) || + (bufx == 0x28) || + (bufx == 0x31) || + (bufx == 0x32) || + (bufx == 0x33)) + && + (len >= 0x1f)) // 0x9400 'c' version + { + imSony.Sony0x9400_version = 0xc; + imSony.Sony0x9400_ReleaseMode2 = SonySubstitution[buf[0x09]]; + + if ((imSony.group2010 == LIBRAW_SONY_Tag2010g) || + (imSony.group2010 == LIBRAW_SONY_Tag2010h)) { + FORC4 s[c] = SonySubstitution[buf[0x0a + c]]; + imSony.ShotNumberSincePowerUp = sget4(s); + } else { + imSony.ShotNumberSincePowerUp = SonySubstitution[buf[0x0a]]; + } + + FORC4 s[c] = SonySubstitution[buf[0x12 + c]]; + imSony.Sony0x9400_SequenceImageNumber = sget4(s); + + imSony.Sony0x9400_SequenceLength1 = SonySubstitution[buf[0x16]]; // shots + + FORC4 s[c] = SonySubstitution[buf[0x1a + c]]; + imSony.Sony0x9400_SequenceFileNumber = sget4(s); + + imSony.Sony0x9400_SequenceLength2 = SonySubstitution[buf[0x1e]]; // files + } + + else if ((bufx == 0x0c) && (len >= 0x1f)) // 0x9400 'b' version + { + imSony.Sony0x9400_version = 0xb; + + FORC4 s[c] = SonySubstitution[buf[0x08 + c]]; + imSony.Sony0x9400_SequenceImageNumber = sget4(s); + + FORC4 s[c] = SonySubstitution[buf[0x0c + c]]; + imSony.Sony0x9400_SequenceFileNumber = sget4(s); + + imSony.Sony0x9400_ReleaseMode2 = SonySubstitution[buf[0x10]]; + + imSony.Sony0x9400_SequenceLength1 = SonySubstitution[buf[0x1e]]; + } + + else if ((bufx == 0x0a) && (len >= 0x23)) // 0x9400 'a' version + { + imSony.Sony0x9400_version = 0xa; + + FORC4 s[c] = SonySubstitution[buf[0x08 + c]]; + imSony.Sony0x9400_SequenceImageNumber = sget4(s); + + FORC4 s[c] = SonySubstitution[buf[0x0c + c]]; + imSony.Sony0x9400_SequenceFileNumber = sget4(s); + + imSony.Sony0x9400_ReleaseMode2 = SonySubstitution[buf[0x10]]; + + imSony.Sony0x9400_SequenceLength1 = SonySubstitution[buf[0x22]]; + } + + else + return; +} + +void LibRaw::process_Sony_0x9402(uchar *buf, ushort len) +{ + + if (len < 0x17) + return; + + if ((imSony.CameraType == LIBRAW_SONY_SLT) || + (imSony.CameraType == LIBRAW_SONY_ILCA) || + (buf[0x00] == 0x05) || + (buf[0x00] == 0xff)) + return; + + if (buf[0x02] == 0xff) + { + imCommon.AmbientTemperature = + (float)((short)SonySubstitution[buf[0x04]]); + } + + if (imgdata.shootinginfo.FocusMode == LIBRAW_SONY_FOCUSMODE_UNKNOWN) + { + imgdata.shootinginfo.FocusMode = SonySubstitution[buf[0x16]]&0x7f; + } + if (len >= 0x18) + imSony.AFAreaMode = (uint16_t)SonySubstitution[buf[0x17]]; + + if ((len >= 0x2e) && + (imSony.CameraType != LIBRAW_SONY_DSC)) + { + imSony.FocusPosition = (ushort)SonySubstitution[buf[0x2d]]; // FocusPosition2 + } + return; +} + +void LibRaw::process_Sony_0x9403(uchar *buf, ushort len) +{ + if ((len < 6) || (unique_id == SonyID_ILCE_7C)) + return; + uchar bufx = SonySubstitution[buf[4]]; + if ((bufx == 0x00) || (bufx == 0x94)) + return; + + imCommon.SensorTemperature = (float)((short)SonySubstitution[buf[5]]); + + return; +} + +void LibRaw::process_Sony_0x9406(uchar *buf, ushort len) +{ + if (len < 6) + return; + uchar bufx = buf[0]; + if ((bufx != 0x01) && (bufx != 0x08) && (bufx != 0x1b)) + return; + bufx = buf[2]; + if ((bufx != 0x08) && (bufx != 0x1b)) + return; + + imCommon.BatteryTemperature = + (float)(SonySubstitution[buf[5]] - 32) / 1.8f; + + return; +} + +void LibRaw::process_Sony_0x940c(uchar *buf, ushort len) +{ + if ((imSony.CameraType != LIBRAW_SONY_ILCE) && + (imSony.CameraType != LIBRAW_SONY_NEX)) + return; + if (len <= 0x000a) + return; + ushort lid2; + if ((ilm.LensMount != LIBRAW_MOUNT_Canon_EF) && + (ilm.LensMount != LIBRAW_MOUNT_Sigma_X3F)) + { + switch (SonySubstitution[buf[0x0008]]) + { + case 1: + case 5: + ilm.LensMount = LIBRAW_MOUNT_Minolta_A; + break; + case 4: + ilm.LensMount = LIBRAW_MOUNT_Sony_E; + break; + } + } + if (ilm.LensMount != LIBRAW_MOUNT_Unknown) { + lid2 = (((ushort)SonySubstitution[buf[0x000a]]) << 8) | + ((ushort)SonySubstitution[buf[0x0009]]); + if ((lid2 > 0) && + ((lid2 < 32784) || (ilm.LensID == 0x1999) || (ilm.LensID == 0xffff))) + parseSonyLensType2( + SonySubstitution[buf[0x000a]], // LensType2 - Sony lens ids + SonySubstitution[buf[0x0009]]); + if ((lid2 == 44) || (lid2 == 78) || (lid2 == 184) || (lid2 == 234) || + (lid2 == 239)) + ilm.AdapterID = lid2; + } + return; +} + +void LibRaw::process_Sony_0x940e(uchar *buf, ushort len, unsigned long long id) +{ + if (len < 3) + return; + + if (((imSony.CameraType != LIBRAW_SONY_SLT) && + (imSony.CameraType != LIBRAW_SONY_ILCA)) || + (id == SonyID_SLT_A33) || + (id == SonyID_SLT_A35) || + (id == SonyID_SLT_A55)) + return; + + int c; + imSony.AFType = SonySubstitution[buf[0x02]]; + + if (imCommon.afcount < LIBRAW_AFDATA_MAXCOUNT) + { + unsigned tag = 0x940e; + imCommon.afdata[imCommon.afcount].AFInfoData_tag = tag; + imCommon.afdata[imCommon.afcount].AFInfoData_order = order; + imCommon.afdata[imCommon.afcount].AFInfoData_length = len; + imCommon.afdata[imCommon.afcount].AFInfoData = (uchar *)malloc(imCommon.afdata[imCommon.afcount].AFInfoData_length); + FORC((int)imCommon.afdata[imCommon.afcount].AFInfoData_length) + imCommon.afdata[imCommon.afcount].AFInfoData[c] = SonySubstitution[buf[c]]; + imCommon.afcount++; + } + + if (imSony.CameraType == LIBRAW_SONY_ILCA) + { + if (len >= 0x0051) + { + imgdata.shootinginfo.FocusMode = SonySubstitution[buf[0x05]]; + imSony.nAFPointsUsed = + MIN(10, sizeof imSony.AFPointsUsed); + FORC(imSony.nAFPointsUsed) imSony.AFPointsUsed[c] = SonySubstitution[buf[0x10 +c]]; + imSony.AFAreaMode = (uint16_t)SonySubstitution[buf[0x3a]]; + imSony.AFMicroAdjValue = SonySubstitution[buf[0x0050]]; + if (!imSony.AFMicroAdjValue) imSony.AFMicroAdjValue = 0x7f; + else imSony.AFMicroAdjOn = 1; + } + } + else + { + if (len >= 0x017e) + { + imSony.AFAreaMode = (uint16_t)SonySubstitution[buf[0x0a]]; + imgdata.shootinginfo.FocusMode = SonySubstitution[buf[0x0b]]; + imSony.nAFPointsUsed = + MIN(4, sizeof imSony.AFPointsUsed); + FORC(imSony.nAFPointsUsed) imSony.AFPointsUsed[c] = SonySubstitution[buf[0x016e +c]]; + imSony.AFMicroAdjValue = SonySubstitution[buf[0x017d]]; + if (!imSony.AFMicroAdjValue) imSony.AFMicroAdjValue = 0x7f; + else imSony.AFMicroAdjOn = 1; + } + } + +} + +void LibRaw::parseSonyMakernotes( + int base, unsigned tag, unsigned type, unsigned len, unsigned dng_writer, + uchar *&table_buf_0x0116, ushort &table_buf_0x0116_len, + uchar *&table_buf_0x2010, ushort &table_buf_0x2010_len, + uchar *&table_buf_0x9050, ushort &table_buf_0x9050_len, + uchar *&table_buf_0x9400, ushort &table_buf_0x9400_len, + uchar *&table_buf_0x9402, ushort &table_buf_0x9402_len, + uchar *&table_buf_0x9403, ushort &table_buf_0x9403_len, + uchar *&table_buf_0x9406, ushort &table_buf_0x9406_len, + uchar *&table_buf_0x940c, ushort &table_buf_0x940c_len, + uchar *&table_buf_0x940e, ushort &table_buf_0x940e_len) +{ + ushort lid, a, c, d; + uchar *table_buf; + uchar uc; + uchar s[2]; + int LensDataValid = 0; + unsigned uitemp; + ushort u16temp; + +// printf ("==>> tag 0x%x, len %d, type %d, model =%s=, cam.id 0x%llx, cam.type %d, =%s=\n", +// tag, len, type, model, ilm.CamID, imSony.CameraType, imSony.MetaVersion); + + if (tag == 0xb001) // Sony ModelID + { + unique_id = get2(); + setSonyBodyFeatures(unique_id); + + if (table_buf_0x0116_len) + { + process_Sony_0x0116(table_buf_0x0116, table_buf_0x0116_len, unique_id); + free(table_buf_0x0116); + table_buf_0x0116_len = 0; + } + + if (table_buf_0x2010_len) + { + process_Sony_0x2010(table_buf_0x2010, table_buf_0x2010_len); + free(table_buf_0x2010); + table_buf_0x2010_len = 0; + } + + if (table_buf_0x9050_len) + { + imSony.len_group9050 = table_buf_0x9050_len; + process_Sony_0x9050(table_buf_0x9050, table_buf_0x9050_len, unique_id); + free(table_buf_0x9050); + table_buf_0x9050_len = 0; + } + + if (table_buf_0x9400_len) + { + process_Sony_0x9400(table_buf_0x9400, table_buf_0x9400_len, unique_id); + free(table_buf_0x9400); + table_buf_0x9400_len = 0; + } + + if (table_buf_0x9402_len) + { + process_Sony_0x9402(table_buf_0x9402, table_buf_0x9402_len); + free(table_buf_0x9402); + table_buf_0x9402_len = 0; + } + + if (table_buf_0x9403_len) + { + process_Sony_0x9403(table_buf_0x9403, table_buf_0x9403_len); + free(table_buf_0x9403); + table_buf_0x9403_len = 0; + } + + if (table_buf_0x9406_len) + { + process_Sony_0x9406(table_buf_0x9406, table_buf_0x9406_len); + free(table_buf_0x9406); + table_buf_0x9406_len = 0; + } + + if (table_buf_0x940c_len) + { + process_Sony_0x940c(table_buf_0x940c, table_buf_0x940c_len); + free(table_buf_0x940c); + table_buf_0x940c_len = 0; + } + + if (table_buf_0x940e_len) + { + process_Sony_0x940e(table_buf_0x940e, table_buf_0x940e_len, unique_id); + free(table_buf_0x940e); + table_buf_0x940e_len = 0; + } + } + else if (tag == 0xb000) + { + FORC4 imSony.FileFormat = imSony.FileFormat * 10 + fgetc(ifp); + } + else if (tag == 0xb026) + { + uitemp = get4(); + if (uitemp != 0xffffffff) + imgdata.shootinginfo.ImageStabilization = uitemp; + } + else if (((tag == 0x0001) || // Minolta CameraSettings, big endian + (tag == 0x0003)) && + (len >= 196)) + { + table_buf = (uchar *)malloc(len); + fread(table_buf, len, 1, ifp); + + lid = 0x01 << 2; + imgdata.shootinginfo.ExposureMode = + (unsigned)table_buf[lid] << 24 | (unsigned)table_buf[lid + 1] << 16 | + (unsigned)table_buf[lid + 2] << 8 | (unsigned)table_buf[lid + 3]; + + lid = 0x06 << 2; + imgdata.shootinginfo.DriveMode = + (unsigned)table_buf[lid] << 24 | (unsigned)table_buf[lid + 1] << 16 | + (unsigned)table_buf[lid + 2] << 8 | (unsigned)table_buf[lid + 3]; + + lid = 0x07 << 2; + imgdata.shootinginfo.MeteringMode = + (unsigned)table_buf[lid] << 24 | (unsigned)table_buf[lid + 1] << 16 | + (unsigned)table_buf[lid + 2] << 8 | (unsigned)table_buf[lid + 3]; + + lid = 0x25 << 2; + imSony.MinoltaCamID = + (unsigned)table_buf[lid] << 24 | (unsigned)table_buf[lid + 1] << 16 | + (unsigned)table_buf[lid + 2] << 8 | (unsigned)table_buf[lid + 3]; + if (imSony.MinoltaCamID != 0xffffffff) + ilm.CamID = imSony.MinoltaCamID; + + lid = 0x30 << 2; + imgdata.shootinginfo.FocusMode = + table_buf[lid + 3]?LIBRAW_SONY_FOCUSMODE_MF:LIBRAW_SONY_FOCUSMODE_AF; + free(table_buf); + } + else if ((tag == 0x0004) && // Minolta CameraSettings7D, big endian + (len >= 227)) + { + table_buf = (uchar *)malloc(len); + fread(table_buf, len, 1, ifp); + + lid = 0x0; + imgdata.shootinginfo.ExposureMode = + (ushort)table_buf[lid] << 8 | (ushort)table_buf[lid + 1]; + + lid = 0x0e << 1; + imgdata.shootinginfo.FocusMode = (short)table_buf[lid + 1]; + switch (imgdata.shootinginfo.FocusMode) { + case 0: case 1: imgdata.shootinginfo.FocusMode += 2; break; + case 3: imgdata.shootinginfo.FocusMode = LIBRAW_SONY_FOCUSMODE_MF; break; + } + lid = 0x10 << 1; + imgdata.shootinginfo.AFPoint = + (ushort)table_buf[lid] << 8 | (ushort)table_buf[lid + 1]; + + lid = 0x25 << 1; + switch ((ushort)table_buf[lid] << 8 | (ushort)table_buf[lid + 1]) { + case 0: + case 1: + imCommon.ColorSpace = LIBRAW_COLORSPACE_sRGB; + break; + case 4: + imCommon.ColorSpace = LIBRAW_COLORSPACE_AdobeRGB; + break; + default: + imCommon.ColorSpace = LIBRAW_COLORSPACE_Unknown; + break; + } + + lid = 0x71 << 1; + imgdata.shootinginfo.ImageStabilization = + (ushort)table_buf[lid] << 8 | (ushort)table_buf[lid + 1]; + + free(table_buf); + } + else if ((tag == 0x0010) && // CameraInfo + strncasecmp(model, "DSLR-A100", 9) && + !strncasecmp(make, "SONY", 4) && + ((len == 368) || // a700 : CameraInfo + (len == 5478) || // a850, a900 : CameraInfo + (len == 5506) || // a200, a300, a350 : CameraInfo2 + (len == 6118) || // a230, a290, a330, a380, a390 : CameraInfo2 + (len == 15360)) // a450, a500, a550, a560, a580 : CameraInfo3 + // a33, a35, a55 + // NEX-3, NEX-5, NEX-5C, NEX-C3, NEX-VG10E + + ) + { + table_buf = (uchar *)malloc(len); + fread(table_buf, len, 1, ifp); + if (imCommon.afcount < LIBRAW_AFDATA_MAXCOUNT) + { + imCommon.afdata[imCommon.afcount].AFInfoData_tag = tag; + imCommon.afdata[imCommon.afcount].AFInfoData_order = order; + imCommon.afdata[imCommon.afcount].AFInfoData_length = len; + imCommon.afdata[imCommon.afcount].AFInfoData = (uchar *)malloc(imCommon.afdata[imCommon.afcount].AFInfoData_length); + memcpy(imCommon.afdata[imCommon.afcount].AFInfoData, table_buf, imCommon.afdata[imCommon.afcount].AFInfoData_length); + imCommon.afcount++; + } + if (memcmp(table_buf, "\xff\xff\xff\xff\xff\xff\xff\xff", 8) && + memcmp(table_buf, "\x00\x00\x00\x00\x00\x00\x00\x00", 8)) + { + LensDataValid = 1; + } + switch (len) + { + case 368: // a700: CameraInfo + case 5478: // a850, a900: CameraInfo + if ((!dng_writer) || + (saneSonyCameraInfo(table_buf[0], table_buf[3], table_buf[2], + table_buf[5], table_buf[4], table_buf[7]))) + { + if (LensDataValid) + { + if (table_buf[0] | table_buf[3]) + ilm.MinFocal = bcd2dec(table_buf[0]) * 100 + bcd2dec(table_buf[3]); + if (table_buf[2] | table_buf[5]) + ilm.MaxFocal = bcd2dec(table_buf[2]) * 100 + bcd2dec(table_buf[5]); + if (table_buf[4]) + ilm.MaxAp4MinFocal = bcd2dec(table_buf[4]) / 10.0f; + if (table_buf[4]) + ilm.MaxAp4MaxFocal = bcd2dec(table_buf[7]) / 10.0f; + parseSonyLensFeatures(table_buf[1], table_buf[6]); + } + + imSony.AFPointSelected = table_buf[21]; + imgdata.shootinginfo.AFPoint = (ushort)table_buf[25]; + + if (len == 5478) + { + imSony.AFMicroAdjValue = table_buf[0x130] - 20; + imSony.AFMicroAdjOn = (((table_buf[0x131] & 0x80) == 0x80) ? 1 : 0); + imSony.AFMicroAdjRegisteredLenses = table_buf[0x131] & 0x7f; + } + } + break; + default: + // CameraInfo2 & 3 + if ((!dng_writer) || + (saneSonyCameraInfo(table_buf[1], table_buf[2], table_buf[3], + table_buf[4], table_buf[5], table_buf[6]))) + { + if ((LensDataValid) && strncasecmp(model, "NEX-5C", 6)) + { + if (table_buf[1] | table_buf[2]) + ilm.MinFocal = bcd2dec(table_buf[1]) * 100 + bcd2dec(table_buf[2]); + if (table_buf[3] | table_buf[4]) + ilm.MaxFocal = bcd2dec(table_buf[3]) * 100 + bcd2dec(table_buf[4]); + if (table_buf[5]) + ilm.MaxAp4MinFocal = bcd2dec(table_buf[5]) / 10.0f; + if (table_buf[6]) + ilm.MaxAp4MaxFocal = bcd2dec(table_buf[6]) / 10.0f; + parseSonyLensFeatures(table_buf[0], table_buf[7]); + } + + if ( // CameraInfo2 + (len == 5506) || // a200, a300, a350 + (len == 6118)) // a230, a290, a330, a380, a390 + { + imSony.AFPointSelected = table_buf[0x14]; + } + else if (!strncasecmp(model, "DSLR-A450", 9) || + !strncasecmp(model, "DSLR-A500", 9) || + !strncasecmp(model, "DSLR-A550", 9)) + { + imSony.AFPointSelected = table_buf[0x14]; + if (table_buf[0x15]) /* focus mode values translated to values in tag 0x201b */ + imgdata.shootinginfo.FocusMode = table_buf[0x15]+1; + else imgdata.shootinginfo.FocusMode = LIBRAW_SONY_FOCUSMODE_MF; + imgdata.shootinginfo.AFPoint = (ushort)table_buf[0x18]; + } + else if (!strncasecmp(model, "SLT-", 4) || + !strncasecmp(model, "DSLR-A560", 9) || + !strncasecmp(model, "DSLR-A580", 9)) + { + imSony.AFPointSelected = table_buf[0x1c]; + if (table_buf[0x1d]) + imgdata.shootinginfo.FocusMode = table_buf[0x1d]+1; + else imgdata.shootinginfo.FocusMode = LIBRAW_SONY_FOCUSMODE_MF; + imgdata.shootinginfo.AFPoint = (ushort)table_buf[0x20]; + } + } + } + free(table_buf); + } + else if ((!dng_writer) && + ((tag == 0x0020) || (tag == 0xb0280020))) + { + if (!strncasecmp(model, "DSLR-A100", 9)) // WBInfoA100 + { + fseek(ifp, 0x49dc, SEEK_CUR); + stmread(imgdata.shootinginfo.InternalBodySerial, 13, ifp); + } + else if ((len == 19154) || // a200 a230 a290 a300 a330 a350 a380 a390 : FocusInfo + (len == 19148)) // a700 a850 a900 : FocusInfo + { + table_buf = (uchar *)malloc(0x0080); + fread(table_buf, 0x0080, 1, ifp); + imgdata.shootinginfo.DriveMode = table_buf[14]; + imgdata.shootinginfo.ExposureProgram = table_buf[63]; + free(table_buf); + fseek (ifp, 0x09bb - 0x0080, SEEK_CUR); // offset 2491 from the start of tag 0x0020 + imSony.FocusPosition = (ushort)fgetc(ifp); + } + else if (len == 20480) // a450 a500 a550 a560 a580 a33 a35 a55 : MoreInfo + // NEX-3 NEX-5 NEX-C3 NEX-VG10E : MoreInfo + { + a = get2(); + /*b =*/ get2(); + c = get2(); + d = get2(); + if ((a) && (c == 1)) + { + fseek(ifp, INT64(d) - 8LL, SEEK_CUR); + table_buf = (uchar *)malloc(256); + fread(table_buf, 256, 1, ifp); + imgdata.shootinginfo.DriveMode = table_buf[1]; + imgdata.shootinginfo.ExposureProgram = table_buf[2]; + imgdata.shootinginfo.MeteringMode = table_buf[3]; + switch (table_buf[6]) { + case 1: + imCommon.ColorSpace = LIBRAW_COLORSPACE_sRGB; + break; + case 2: + imCommon.ColorSpace = LIBRAW_COLORSPACE_AdobeRGB; + break; + default: + imCommon.ColorSpace = LIBRAW_COLORSPACE_Unknown; + break; + } + if (strncasecmp(model, "DSLR-A450", 9) && + strncasecmp(model, "DSLR-A500", 9) && + strncasecmp(model, "DSLR-A550", 9)) + { // NEX-3, NEX-5, NEX-5C??, NEX-C3, NEX-VG10(E), a560, a580, a33, a35, a55 + imgdata.shootinginfo.FocusMode = table_buf[0x13]; + switch (table_buf[0x13]) { + case 17: imgdata.shootinginfo.FocusMode = LIBRAW_SONY_FOCUSMODE_AF_S; break; + case 18: imgdata.shootinginfo.FocusMode = LIBRAW_SONY_FOCUSMODE_AF_C; break; + case 19: imgdata.shootinginfo.FocusMode = LIBRAW_SONY_FOCUSMODE_AF_A; break; + case 32: imgdata.shootinginfo.FocusMode = LIBRAW_SONY_FOCUSMODE_MF; break; + case 48: imgdata.shootinginfo.FocusMode = LIBRAW_SONY_FOCUSMODE_DMF; break; + default: imgdata.shootinginfo.FocusMode = table_buf[0x13]; break; + } + if (!strncasecmp(model, "DSLR-A560", 9) || + !strncasecmp(model, "DSLR-A580", 9) || + !strncasecmp(model, "SLT-A33", 7) || + !strncasecmp(model, "SLT-A35", 7) || + !strncasecmp(model, "SLT-A55", 7) || + !strncasecmp(model, "NEX-VG10", 8) || + !strncasecmp(model, "NEX-C3", 6)) + imSony.FocusPosition = (ushort)table_buf[0x2f]; // FocusPosition2 + else // NEX-3, NEX-5, NEX-5C + imSony.FocusPosition = (ushort)table_buf[0x2b]; // FocusPosition2 + } + else // a450 a500 a550 + { + imSony.FocusPosition = (ushort)table_buf[0x29]; // FocusPosition2 + } + free(table_buf); + } + } + } + else if (tag == 0x0102) + { + imSony.Quality = get4(); + } + else if (tag == 0x0104) + { + imCommon.FlashEC = getreal(type); + } + else if (tag == 0x0105) // Teleconverter + { + ilm.TeleconverterID = get4(); + } + else if (tag == 0x0107) + { + uitemp = get4(); + if (uitemp == 1) + imgdata.shootinginfo.ImageStabilization = 0; + else if (uitemp == 5) + imgdata.shootinginfo.ImageStabilization = 1; + else + imgdata.shootinginfo.ImageStabilization = uitemp; + } + else if ((tag == 0xb0280088) && (dng_writer == nonDNG)) + { + thumb_offset = get4() + base; + } + else if ((tag == 0xb0280089) && (dng_writer == nonDNG)) + { + thumb_length = get4(); + } + else if (((tag == 0x0114) || // CameraSettings + (tag == 0xb0280114)) && + (len < 256000)) + { + table_buf = (uchar *)malloc(len); + fread(table_buf, len, 1, ifp); + switch (len) + { + case 260: // Sony a100, big endian + imgdata.shootinginfo.ExposureMode = + ((ushort)table_buf[0]) << 8 | ((ushort)table_buf[1]); + lid = 0x0a << 1; + imgdata.shootinginfo.DriveMode = + ((ushort)table_buf[lid]) << 8 | ((ushort)table_buf[lid + 1]); + lid = 0x0c << 1; + imgdata.shootinginfo.FocusMode = + ((ushort)table_buf[lid]) << 8 | ((ushort)table_buf[lid + 1]); + switch (imgdata.shootinginfo.FocusMode) { + case 0: imgdata.shootinginfo.FocusMode = LIBRAW_SONY_FOCUSMODE_AF_S; break; + case 1: imgdata.shootinginfo.FocusMode = LIBRAW_SONY_FOCUSMODE_AF_C; break; + case 5: imgdata.shootinginfo.FocusMode = LIBRAW_SONY_FOCUSMODE_MF; break; + } + lid = 0x0d << 1; + imSony.AFPointSelected = table_buf[lid + 1]; + lid = 0x0e << 1; + imSony.AFAreaMode = (uint16_t)table_buf[lid + 1]; + lid = 0x12 << 1; + imgdata.shootinginfo.MeteringMode = + ((ushort)table_buf[lid]) << 8 | ((ushort)table_buf[lid + 1]); + + lid = 0x17 << 1; + switch ((ushort)table_buf[lid] << 8 | (ushort)table_buf[lid + 1]) { + case 0: + imCommon.ColorSpace = LIBRAW_COLORSPACE_sRGB; + break; + case 2: + imCommon.ColorSpace = LIBRAW_COLORSPACE_MonochromeGamma; + break; + case 5: + imCommon.ColorSpace = LIBRAW_COLORSPACE_AdobeRGB; + break; + default: + imCommon.ColorSpace = LIBRAW_COLORSPACE_Unknown; + break; + } + + break; + case 448: // Minolta "DYNAX 5D" and its aliases, big endian + lid = 0x0a << 1; + imgdata.shootinginfo.ExposureMode = + ((ushort)table_buf[lid]) << 8 | ((ushort)table_buf[lid + 1]); + lid = 0x25 << 1; + imgdata.shootinginfo.MeteringMode = + ((ushort)table_buf[lid]) << 8 | ((ushort)table_buf[lid + 1]); + + lid = 0x2f << 1; + switch ((ushort)table_buf[lid] << 8 | (ushort)table_buf[lid + 1]) { + case 0: + case 1: + imCommon.ColorSpace = LIBRAW_COLORSPACE_sRGB; + break; + case 2: + imCommon.ColorSpace = LIBRAW_COLORSPACE_MonochromeGamma; + break; + case 4: + case 5: + imCommon.ColorSpace = LIBRAW_COLORSPACE_AdobeRGB; + break; + default: + imCommon.ColorSpace = LIBRAW_COLORSPACE_Unknown; + break; + } + + lid = 0xbd << 1; + imgdata.shootinginfo.ImageStabilization = + ((ushort)table_buf[lid]) << 8 | ((ushort)table_buf[lid + 1]); + break; + case 280: // a200 a300 a350 a700 + case 364: // a850 a900 + // CameraSettings and CameraSettings2 are big endian + if (table_buf[2] | table_buf[3]) + { + lid = (((ushort)table_buf[2]) << 8) | ((ushort)table_buf[3]); + ilm.CurAp = libraw_powf64l(2.0f, ((float)lid / 8.0f - 1.0f) / 2.0f); + } + lid = 0x04 << 1; + imgdata.shootinginfo.DriveMode = table_buf[lid + 1]; + lid = 0x11 << 1; + imSony.AFAreaMode = (uint16_t)table_buf[lid + 1]; + lid = 0x1b << 1; + switch (((ushort)table_buf[lid]) << 8 | ((ushort)table_buf[lid + 1])) { + case 0: + imCommon.ColorSpace = LIBRAW_COLORSPACE_sRGB; + break; + case 1: + case 5: + imCommon.ColorSpace = LIBRAW_COLORSPACE_AdobeRGB; + break; + default: + imCommon.ColorSpace = LIBRAW_COLORSPACE_Unknown; + break; + } + lid = 0x4d << 1; + imgdata.shootinginfo.FocusMode = + ((ushort)table_buf[lid]) << 8 | ((ushort)table_buf[lid + 1]); + switch (imgdata.shootinginfo.FocusMode) { + case 1: case 2: case 3: imgdata.shootinginfo.FocusMode++; break; + case 4: imgdata.shootinginfo.FocusMode +=2; break; + } + lid = 0x55 << 1; + u16temp = ((ushort)table_buf[lid]) << 8 | ((ushort)table_buf[lid + 1]); + switch (u16temp) { + case 1: + imSony.AspectRatio = LIBRAW_IMAGE_ASPECT_3to2; + break; + case 2: + imSony.AspectRatio = LIBRAW_IMAGE_ASPECT_16to9; + break; + default: + imSony.AspectRatio = (float)u16temp; + break; + } + if (!imCommon.ColorSpace || + (imCommon.ColorSpace == LIBRAW_COLORSPACE_Unknown)) { + lid = 0x83 << 1; + switch (((ushort)table_buf[lid]) << 8 | ((ushort)table_buf[lid + 1])) { + case 6: + imCommon.ColorSpace = LIBRAW_COLORSPACE_sRGB; + break; + case 5: + imCommon.ColorSpace = LIBRAW_COLORSPACE_AdobeRGB; + break; + default: + imCommon.ColorSpace = LIBRAW_COLORSPACE_Unknown; + break; + } + } + break; + case 332: // a230 a290 a330 a380 a390 + // CameraSettings and CameraSettings2 are big endian + if (table_buf[2] | table_buf[3]) + { + lid = (((ushort)table_buf[2]) << 8) | ((ushort)table_buf[3]); + ilm.CurAp = libraw_powf64l(2.0f, ((float)lid / 8.0f - 1.0f) / 2.0f); + } + lid = 0x10 << 1; + imSony.AFAreaMode = (uint16_t)table_buf[lid + 1]; + lid = 0x4d << 1; + imgdata.shootinginfo.FocusMode = + ((ushort)table_buf[lid]) << 8 | ((ushort)table_buf[lid + 1]); + switch (imgdata.shootinginfo.FocusMode) { + case 1: case 2: case 3: imgdata.shootinginfo.FocusMode++; break; + case 4: imgdata.shootinginfo.FocusMode +=2; break; + } + lid = 0x55 << 1; + u16temp = ((ushort)table_buf[lid]) << 8 | ((ushort)table_buf[lid + 1]); + switch (u16temp) { + case 1: + imSony.AspectRatio = LIBRAW_IMAGE_ASPECT_3to2; + break; + case 2: + imSony.AspectRatio = LIBRAW_IMAGE_ASPECT_16to9; + break; + default: + imSony.AspectRatio = (float)u16temp; + break; + } + lid = 0x7e << 1; + imgdata.shootinginfo.DriveMode = table_buf[lid + 1]; + break; + case 1536: // a560 a580 a33 a35 a55 NEX-3 NEX-5 NEX-5C NEX-C3 NEX-VG10E + case 2048: // a450 a500 a550 + // CameraSettings3 are little endian + switch (table_buf[0x0a]) { + case 4: + imSony.AspectRatio = LIBRAW_IMAGE_ASPECT_3to2; + break; + case 8: + imSony.AspectRatio = LIBRAW_IMAGE_ASPECT_16to9; + break; + default: + imSony.AspectRatio = (float)table_buf[0x0a]; + break; + } + switch (table_buf[0x0e]) { + case 1: + imCommon.ColorSpace = LIBRAW_COLORSPACE_sRGB; + break; + case 2: + imCommon.ColorSpace = LIBRAW_COLORSPACE_AdobeRGB; + break; + default: + imCommon.ColorSpace = LIBRAW_COLORSPACE_Unknown; + break; + } + imSony.AFAreaMode = (uint16_t)table_buf[0x24]; + imgdata.shootinginfo.DriveMode = table_buf[0x34]; + parseSonyLensType2(table_buf[1016], table_buf[1015]); + if (ilm.LensMount != LIBRAW_MOUNT_Canon_EF) + { + switch (table_buf[153]) + { + case 16: + ilm.LensMount = LIBRAW_MOUNT_Minolta_A; + break; + case 17: + ilm.LensMount = LIBRAW_MOUNT_Sony_E; + break; + } + } + break; + } + free(table_buf); + } + else if ((tag == 0x3000) && (len < 256000)) + { + table_buf = (uchar *)malloc(len); + fread(table_buf, len, 1, ifp); + if (len >= 0x19) + { + for (int i = 0; i < 20; i++) + imSony.SonyDateTime[i] = table_buf[6 + i]; + } + if (len >= 0x43) // MetaVersion: (unique_id >= 286) + { + memcpy (imSony.MetaVersion, table_buf+0x34, 15); + imSony.MetaVersion[15] = 0; + } + free(table_buf); + } + else if (tag == 0x0116 && len < 256000) + { + table_buf_0x0116 = (uchar *)malloc(len); + table_buf_0x0116_len = len; + fread(table_buf_0x0116, len, 1, ifp); + if (ilm.CamID) + { + process_Sony_0x0116(table_buf_0x0116, table_buf_0x0116_len, ilm.CamID); + free(table_buf_0x0116); + table_buf_0x0116_len = 0; + } + } + else if (tag == 0x2008) + { + imSony.LongExposureNoiseReduction = get4(); + } + else if (tag == 0x2009) + { + imSony.HighISONoiseReduction = get2(); + } + else if (tag == 0x200a) + { + imSony.HDR[0] = get2(); + imSony.HDR[1] = get2(); + } + else if (tag == 0x2010 && len < 256000) + { + table_buf_0x2010 = (uchar *)malloc(len); + table_buf_0x2010_len = len; + fread(table_buf_0x2010, len, 1, ifp); + if (ilm.CamID) + { + process_Sony_0x2010(table_buf_0x2010, table_buf_0x2010_len); + free(table_buf_0x2010); + table_buf_0x2010_len = 0; + } + } + else if (tag == 0x201a) + { + imSony.ElectronicFrontCurtainShutter = get4(); + } + else if (tag == 0x201b) + { + if ((imSony.CameraType != LIBRAW_SONY_DSC) || + (imSony.group2010 == LIBRAW_SONY_Tag2010i)) + { + short t = (short)fgetc(ifp); + if (imgdata.shootinginfo.FocusMode != t) + { + imgdata.shootinginfo.FocusMode = t; + } + } + } + else if ((tag == 0x201c) && + (len == 1) && + tagtypeIs(LIBRAW_EXIFTAG_TYPE_BYTE)) + { + imSony.AFAreaModeSetting = (uint8_t)fgetc(ifp); + } + else if ((tag == 0x201d) && + (len == 2) && + tagtypeIs(LIBRAW_EXIFTAG_TYPE_SHORT)) + { + imSony.FlexibleSpotPosition[0] = get2(); + imSony.FlexibleSpotPosition[1] = get2(); + } + else if (tag == 0x201e) + { + if (imSony.CameraType != LIBRAW_SONY_DSC) + { + imSony.AFPointSelected = imSony.AFPointSelected_0x201e = fgetc(ifp); + } + } + else if (tag == 0x2020) // AFPointsUsed + { + if (imSony.CameraType != LIBRAW_SONY_DSC) + { + if (imCommon.afcount < LIBRAW_AFDATA_MAXCOUNT) + { + imCommon.afdata[imCommon.afcount].AFInfoData_tag = tag; + imCommon.afdata[imCommon.afcount].AFInfoData_order = order; + imCommon.afdata[imCommon.afcount].AFInfoData_length = len; + imCommon.afdata[imCommon.afcount].AFInfoData = (uchar *)malloc(imCommon.afdata[imCommon.afcount].AFInfoData_length); + fread(imCommon.afdata[imCommon.afcount].AFInfoData, imCommon.afdata[imCommon.afcount].AFInfoData_length, 1, ifp); + imSony.nAFPointsUsed = + short(MIN(imCommon.afdata[imCommon.afcount].AFInfoData_length, sizeof imSony.AFPointsUsed)); + memcpy(imSony.AFPointsUsed, imCommon.afdata[imCommon.afcount].AFInfoData, imSony.nAFPointsUsed); + imCommon.afcount++; + } + } + } + else if (tag == 0x2021) // AFTracking + { + if ((imSony.CameraType != LIBRAW_SONY_DSC) || + (imSony.group2010 == LIBRAW_SONY_Tag2010i)) + { + imSony.AFTracking = fgetc(ifp); + } + } + else if (tag == 0x2022) // FocalPlaneAFPointsUsed + { + if (imCommon.afcount < LIBRAW_AFDATA_MAXCOUNT) + { + imCommon.afdata[imCommon.afcount].AFInfoData_tag = tag; + imCommon.afdata[imCommon.afcount].AFInfoData_order = order; + imCommon.afdata[imCommon.afcount].AFInfoData_length = len; + imCommon.afdata[imCommon.afcount].AFInfoData = (uchar *)malloc(imCommon.afdata[imCommon.afcount].AFInfoData_length); + fread(imCommon.afdata[imCommon.afcount].AFInfoData, imCommon.afdata[imCommon.afcount].AFInfoData_length, 1, ifp); + imCommon.afcount++; + } + } + else if (tag == 0x2027) + { + FORC4 imSony.FocusLocation[c] = get2(); + } + else if (tag == 0x2028) + { + if (get2()) + { + imSony.VariableLowPassFilter = get2(); + } + } + else if (tag == 0x2029) + { + imSony.RAWFileType = get2(); + } + else if (tag == 0x202c) + { + imSony.MeteringMode2 = get2(); + } + + else if (tag == 0x202a) // FocalPlaneAFPointsUsed, newer?? + { + if (imCommon.afcount < LIBRAW_AFDATA_MAXCOUNT) + { + imCommon.afdata[imCommon.afcount].AFInfoData_tag = tag; + imCommon.afdata[imCommon.afcount].AFInfoData_order = order; + imCommon.afdata[imCommon.afcount].AFInfoData_length = len; + imCommon.afdata[imCommon.afcount].AFInfoData = (uchar *)malloc(imCommon.afdata[imCommon.afcount].AFInfoData_length); + fread(imCommon.afdata[imCommon.afcount].AFInfoData, imCommon.afdata[imCommon.afcount].AFInfoData_length, 1, ifp); + imCommon.afcount++; + } + } + else if (tag == 0x202e) + { + imSony.RawSizeType = get2(); + } + else if (tag == 0x202f) + { + imSony.PixelShiftGroupID = get4(); + imSony.PixelShiftGroupPrefix = imSony.PixelShiftGroupID >> 22; + imSony.PixelShiftGroupID = + ((imSony.PixelShiftGroupID >> 17) & (unsigned)0x1f) * + (unsigned)1000000 + + ((imSony.PixelShiftGroupID >> 12) & (unsigned)0x1f) * (unsigned)10000 + + ((imSony.PixelShiftGroupID >> 6) & (unsigned)0x3f) * (unsigned)100 + + (imSony.PixelShiftGroupID & (unsigned)0x3f); + + imSony.numInPixelShiftGroup = fgetc(ifp); + imSony.nShotsInPixelShiftGroup = fgetc(ifp); + } + else if (tag == 0x9050 && len < 256000) // little endian + { + table_buf_0x9050 = (uchar *)malloc(len); + table_buf_0x9050_len = len; + fread(table_buf_0x9050, len, 1, ifp); + + if (ilm.CamID) + { + imSony.len_group9050 = table_buf_0x9050_len; + process_Sony_0x9050(table_buf_0x9050, table_buf_0x9050_len, ilm.CamID); + free(table_buf_0x9050); + table_buf_0x9050_len = 0; + } + } + else if (tag == 0x9400 && len < 256000) + { + table_buf_0x9400 = (uchar *)malloc(len); + table_buf_0x9400_len = len; + fread(table_buf_0x9400, len, 1, ifp); + if (ilm.CamID) + { + process_Sony_0x9400(table_buf_0x9400, table_buf_0x9400_len, unique_id); + free(table_buf_0x9400); + table_buf_0x9400_len = 0; + } + } + else if (tag == 0x9402 && len < 256000) + { + table_buf_0x9402 = (uchar *)malloc(len); + table_buf_0x9402_len = len; + fread(table_buf_0x9402, len, 1, ifp); + if (ilm.CamID) + { + process_Sony_0x9402(table_buf_0x9402, table_buf_0x9402_len); + free(table_buf_0x9402); + table_buf_0x9402_len = 0; + } + } + else if (tag == 0x9403 && len < 256000) + { + table_buf_0x9403 = (uchar *)malloc(len); + table_buf_0x9403_len = len; + fread(table_buf_0x9403, len, 1, ifp); + if (ilm.CamID) + { + process_Sony_0x9403(table_buf_0x9403, table_buf_0x9403_len); + free(table_buf_0x9403); + table_buf_0x9403_len = 0; + } + } + else if ((tag == 0x9405) && (len < 256000) && (len > 0x64)) + { + table_buf = (uchar *)malloc(len); + fread(table_buf, len, 1, ifp); + uc = table_buf[0x0]; + if (imCommon.real_ISO < 0.1f) + { + if ((uc == 0x25) || (uc == 0x3a) || (uc == 0x76) || (uc == 0x7e) || + (uc == 0x8b) || (uc == 0x9a) || (uc == 0xb3) || (uc == 0xe1)) + { + s[0] = SonySubstitution[table_buf[0x04]]; + s[1] = SonySubstitution[table_buf[0x05]]; + imCommon.real_ISO = + 100.0f * libraw_powf64l(2.0f, (16 - ((float)sget2(s)) / 256.0f)); + } + } + free(table_buf); + } + else if ((tag == 0x9404) && (len < 256000) && (len > 0x21)) + { + table_buf = (uchar *)malloc(len); + fread(table_buf, len, 1, ifp); + uc = table_buf[0x00]; + if (((uc == 0x70) || + (uc == 0x8a) || + (uc == 0xcd) || + (uc == 0xe7) || + (uc == 0xea)) && + (table_buf[0x03] == 0x08)) + { + if ((imSony.CameraType == LIBRAW_SONY_ILCA) || + (imSony.CameraType == LIBRAW_SONY_SLT)) + { + imSony.FocusPosition = (ushort)SonySubstitution[table_buf[0x20]]; // FocusPosition2 + } + } + free(table_buf); + } + else if (tag == 0x9406 && len < 256000) + { + table_buf_0x9406 = (uchar *)malloc(len); + table_buf_0x9406_len = len; + fread(table_buf_0x9406, len, 1, ifp); + if (ilm.CamID) + { + process_Sony_0x9406(table_buf_0x9406, table_buf_0x9406_len); + free(table_buf_0x9406); + table_buf_0x9406_len = 0; + } + } + else if (tag == 0x940c && len < 256000) + { + table_buf_0x940c = (uchar *)malloc(len); + table_buf_0x940c_len = len; + fread(table_buf_0x940c, len, 1, ifp); + if (ilm.CamID) + { + process_Sony_0x940c(table_buf_0x940c, table_buf_0x940c_len); + free(table_buf_0x940c); + table_buf_0x940c_len = 0; + } + } + else if (tag == 0x940e && len < 256000) + { + table_buf_0x940e = (uchar *)malloc(len); + table_buf_0x940e_len = len; + fread(table_buf_0x940e, len, 1, ifp); + if (ilm.CamID) + { + process_Sony_0x940e(table_buf_0x940e, table_buf_0x940e_len, ilm.CamID); + free(table_buf_0x940e); + table_buf_0x940e_len = 0; + } + } + else if ((tag == 0x9416) && (len < 256000) && (len > 0x0076)) { + table_buf = (uchar *)malloc(len); + fread(table_buf, len, 1, ifp); + if (imCommon.real_ISO < 0.1f) { + s[0] = SonySubstitution[table_buf[0x04]]; + s[1] = SonySubstitution[table_buf[0x05]]; + imCommon.real_ISO = + 100.0f * libraw_powf64l(2.0f, (16 - ((float)sget2(s)) / 256.0f)); + } + imgdata.shootinginfo.ExposureProgram = SonySubstitution[table_buf[0x35]]; + if ((ilm.LensMount != LIBRAW_MOUNT_Canon_EF) && + (ilm.LensMount != LIBRAW_MOUNT_Sigma_X3F)) { + switch (SonySubstitution[table_buf[0x0048]]) { + case 1: + case 3: + ilm.LensMount = LIBRAW_MOUNT_Minolta_A; + break; + case 2: + ilm.LensMount = LIBRAW_MOUNT_Sony_E; + break; + } + } + switch (SonySubstitution[table_buf[0x0049]]) { + case 1: + ilm.LensFormat = LIBRAW_FORMAT_APSC; + break; + case 2: + ilm.LensFormat = LIBRAW_FORMAT_FF; + break; + } + if (ilm.LensMount == LIBRAW_MOUNT_Sony_E) + parseSonyLensType2(SonySubstitution[table_buf[0x4c]], SonySubstitution[table_buf[0x4b]]); + free(table_buf); + } + else if (((tag == 0xb027) || + (tag == 0x010c)) && + (ilm.LensID == LIBRAW_LENS_NOT_SET)) + { + ilm.LensID = get4(); + if ((ilm.LensID > 0x4900) && (ilm.LensID <= 0x5900)) + { + ilm.AdapterID = 0x4900; + ilm.LensID -= ilm.AdapterID; + ilm.LensMount = LIBRAW_MOUNT_Sigma_X3F; + strcpy(ilm.Adapter, "MC-11"); + } + + else if ((ilm.LensID > 0xef00) && + (ilm.LensID < 0xffff) && + (ilm.LensID != 0xff00)) + { + ilm.AdapterID = 0xef00; + ilm.LensID -= ilm.AdapterID; + ilm.LensMount = LIBRAW_MOUNT_Canon_EF; + } + + else if (((ilm.LensID != LIBRAW_LENS_NOT_SET) && (ilm.LensID < 0xef00)) || + (ilm.LensID == 0xff00)) + ilm.LensMount = LIBRAW_MOUNT_Minolta_A; + /* + if (tag == 0x010c) + ilm.CameraMount = LIBRAW_MOUNT_Minolta_A; + */ + } + else if (tag == 0xb02a && len < 256000) // Sony LensSpec + { + table_buf = (uchar *)malloc(len); + fread(table_buf, len, 1, ifp); + if ((!dng_writer) || + (saneSonyCameraInfo(table_buf[1], table_buf[2], table_buf[3], + table_buf[4], table_buf[5], table_buf[6]))) + { + if (table_buf[1] | table_buf[2]) + ilm.MinFocal = bcd2dec(table_buf[1]) * 100 + bcd2dec(table_buf[2]); + if (table_buf[3] | table_buf[4]) + ilm.MaxFocal = bcd2dec(table_buf[3]) * 100 + bcd2dec(table_buf[4]); + if (table_buf[5]) + ilm.MaxAp4MinFocal = bcd2dec(table_buf[5]) / 10.0f; + if (table_buf[6]) + ilm.MaxAp4MaxFocal = bcd2dec(table_buf[6]) / 10.0f; + parseSonyLensFeatures(table_buf[0], table_buf[7]); + } + free(table_buf); + } + else if ((tag == 0xb02b) && !imgdata.sizes.raw_inset_crops[0].cwidth && + (len == 2)) + { + imgdata.sizes.raw_inset_crops[0].cheight = get4(); + imgdata.sizes.raw_inset_crops[0].cwidth = get4(); + } + else if (tag == 0xb041) + { + imgdata.shootinginfo.ExposureMode = get2(); + } + else if ((tag == 0xb043) && + (len == 1) && + tagtypeIs(LIBRAW_EXIFTAG_TYPE_SHORT)) + { + imSony.AFAreaMode = get2(); + } +} + + +void LibRaw::parseSonySR2(uchar *_cbuf_SR2, unsigned SR2SubIFDOffset, + unsigned SR2SubIFDLength, unsigned dng_writer) +{ + unsigned c; + unsigned entries, tag_id, tag_type, tag_datalen; + INT64 tag_offset, tag_dataoffset; + int TagProcessed; + int tag_dataunitlen; + float num; + int i; + int WBCTC_count; + try + { + checked_buffer_t cbuf_SR2(order, _cbuf_SR2, SR2SubIFDLength); + entries = cbuf_SR2.sget2(0); + if (entries > 1000) + return; + tag_offset = 2; + WBCTC_count = 0; + while (entries--) { + if (cbuf_SR2.tiff_sget(SR2SubIFDOffset, + &tag_offset, &tag_id, &tag_type, &tag_dataoffset, + &tag_datalen, &tag_dataunitlen) == 0) { + TagProcessed = 0; + if (dng_writer == nonDNG) { + switch (tag_id) { + case 0x7300: + FORC4 cblack[c] = cbuf_SR2.sget2(tag_dataoffset + tag_dataunitlen * c); + TagProcessed = 1; + break; + case 0x7303: + FORC4 cam_mul[GRBG_2_RGBG(c)] = cbuf_SR2.sget2(tag_dataoffset + tag_dataunitlen * c); + TagProcessed = 1; + break; + case 0x7310: + FORC4 cblack[RGGB_2_RGBG(c)] = cbuf_SR2.sget2(tag_dataoffset + tag_dataunitlen * c); + i = cblack[3]; + FORC3 if (i > (int)cblack[c]) i = cblack[c]; + FORC4 cblack[c] -= i; + black = i; + TagProcessed = 1; + break; + case 0x7313: + FORC4 cam_mul[RGGB_2_RGBG(c)] = cbuf_SR2.sget2(tag_dataoffset + tag_dataunitlen * c); + TagProcessed = 1; + break; + case 0x74a0: + ilm.MaxAp4MaxFocal = cbuf_SR2.sgetreal(tag_type, tag_dataoffset); + TagProcessed = 1; + break; + case 0x74a1: + ilm.MaxAp4MinFocal = cbuf_SR2.sgetreal(tag_type, tag_dataoffset); + TagProcessed = 1; + break; + case 0x74a2: + ilm.MaxFocal = cbuf_SR2.sgetreal(tag_type, tag_dataoffset); + TagProcessed = 1; + break; + case 0x74a3: + ilm.MinFocal = cbuf_SR2.sgetreal(tag_type, tag_dataoffset); + TagProcessed = 1; + break; + case 0x7800: + for (i = 0; i < 3; i++) + { + num = 0.0; + for (c = 0; c < 3; c++) + { + imgdata.color.ccm[i][c] = + (float)((short)cbuf_SR2.sget2(tag_dataoffset + tag_dataunitlen * (i * 3 + c))); + num += imgdata.color.ccm[i][c]; + } + if (num > 0.01) + FORC3 imgdata.color.ccm[i][c] = imgdata.color.ccm[i][c] / num; + } + TagProcessed = 1; + break; + case 0x787f: + if (tag_datalen == 3) + { + FORC3 imgdata.color.linear_max[c] = cbuf_SR2.sget2(tag_dataoffset + tag_dataunitlen * c); + imgdata.color.linear_max[3] = imgdata.color.linear_max[1]; + } + else if (tag_datalen == 1) + { + imgdata.color.linear_max[0] = imgdata.color.linear_max[1] = + imgdata.color.linear_max[2] = imgdata.color.linear_max[3] = + cbuf_SR2.sget2(tag_dataoffset); + } + TagProcessed = 1; + break; + } + } + + if (!TagProcessed) { + if ((tag_id >= 0x7480) && (tag_id <= 0x7486)) { + i = tag_id - 0x7480; + if (Sony_SR2_wb_list[i] > 255) { + icWBCCTC[WBCTC_count][0] = Sony_SR2_wb_list[i]; + FORC3 icWBCCTC[WBCTC_count][c + 1] = cbuf_SR2.sget2(tag_dataoffset + tag_dataunitlen * c); + icWBCCTC[WBCTC_count][4] = icWBCCTC[WBCTC_count][2]; + WBCTC_count++; + } + else { + FORC3 icWBC[Sony_SR2_wb_list[i]][c] = cbuf_SR2.sget2(tag_dataoffset + tag_dataunitlen * c); + icWBC[Sony_SR2_wb_list[i]][3] = icWBC[Sony_SR2_wb_list[i]][1]; + } + } + else if ((tag_id >= 0x7820) && (tag_id <= 0x782d)) { + i = tag_id - 0x7820; + if (Sony_SR2_wb_list1[i] > 255) { + icWBCCTC[WBCTC_count][0] = Sony_SR2_wb_list1[i]; + FORC3 icWBCCTC[WBCTC_count][c + 1] = cbuf_SR2.sget2(tag_dataoffset + tag_dataunitlen * c); + icWBCCTC[WBCTC_count][4] = icWBCCTC[WBCTC_count][2]; + if (Sony_SR2_wb_list1[i] == 3200) { + FORC3 icWBC[LIBRAW_WBI_StudioTungsten][c] = icWBCCTC[WBCTC_count][c + 1]; + icWBC[LIBRAW_WBI_StudioTungsten][3] = icWBC[LIBRAW_WBI_StudioTungsten][1]; + } + WBCTC_count++; + } + else { + FORC3 icWBC[Sony_SR2_wb_list1[i]][c] = cbuf_SR2.sget2(tag_dataoffset + tag_dataunitlen * c); + icWBC[Sony_SR2_wb_list1[i]][3] = icWBC[Sony_SR2_wb_list1[i]][1]; + } + } + else if (tag_id == 0x7302) { + FORC4 icWBC[LIBRAW_WBI_Auto][GRBG_2_RGBG(c)] = cbuf_SR2.sget2(tag_dataoffset + tag_dataunitlen * c); + } + else if (tag_id == 0x7312) { + FORC4 icWBC[LIBRAW_WBI_Auto][RGGB_2_RGBG(c)] = cbuf_SR2.sget2(tag_dataoffset + tag_dataunitlen * c); + } + } + } + } + } + catch (...) + { + return; + } +} + +void LibRaw::parseSonySRF(unsigned len) +{ + + if ((len > 0xfffff) || (len == 0)) + return; + + INT64 save = ftell(ifp); + INT64 offset = 0x0310c0 - save; /* for non-DNG this value normally is 0x8ddc */ + if (len < offset || offset < 0) + return; + try { + + INT64 decrypt_len = offset >> 2; /* master key offset value is the next + un-encrypted metadata field after SRF0 */ + + unsigned i, nWB; + unsigned MasterKey, SRF2Key=0; + INT64 srf_offset, tag_offset, tag_dataoffset; + int tag_dataunitlen; + //uchar *srf_buf; + ushort entries; + unsigned tag_id, tag_type, tag_datalen; + + //srf_buf = (uchar *)malloc(len+64); + checked_buffer_t srf_buf(order, len); + fread(srf_buf.data(), len, 1, ifp); + + offset += srf_buf[offset] << 2; + + /* master key is stored in big endian */ + MasterKey = ((unsigned)srf_buf[offset] << 24) | + ((unsigned)srf_buf[offset + 1] << 16) | + ((unsigned)srf_buf[offset + 2] << 8) | + (unsigned)srf_buf[offset + 3]; + + /* skip SRF0 */ + srf_offset = 0; + entries = srf_buf.sget2(srf_offset); + if (entries > 1000) + goto restore_after_parseSonySRF; + offset = srf_offset + 2; + srf_offset = srf_buf.sget4(offset + 12 * entries) - save; /* SRF0 ends with SRF1 abs. position */ + + /* get SRF1, it has fixed 40 bytes length and contains keys to decode metadata + * and raw data */ + if (srf_offset < 0 || decrypt_len < srf_offset / 4) + goto restore_after_parseSonySRF; + sony_decrypt((unsigned *)(srf_buf.data() + srf_offset), decrypt_len - srf_offset / 4, + 1, MasterKey); + entries = srf_buf.sget2(srf_offset); + if (entries > 1000) + goto restore_after_parseSonySRF; + offset = srf_offset + 2; + tag_offset = offset; + + while (entries--) { + if (tiff_sget(save, srf_buf.data(), len, + &tag_offset, &tag_id, &tag_type, &tag_dataoffset, + &tag_datalen, &tag_dataunitlen) == 0) { + if (tag_id == 0x0000) { + SRF2Key = srf_buf.sget4(tag_dataoffset); + } + else if (tag_id == 0x0001) { + /*RawDataKey =*/ srf_buf.sget4(tag_dataoffset); + } + } + else goto restore_after_parseSonySRF; + } + offset = tag_offset; + + /* get SRF2 */ + srf_offset = srf_buf.sget4(offset) - save; /* SRFn ends with SRFn+1 position */ + if (srf_offset < 0 || decrypt_len < srf_offset / 4) + goto restore_after_parseSonySRF; + sony_decrypt((unsigned *)(srf_buf.data() + srf_offset), decrypt_len - srf_offset / 4, + 1, SRF2Key); + + entries = srf_buf.sget2(srf_offset); + if (entries > 1000) + goto restore_after_parseSonySRF; + offset = srf_offset + 2; + tag_offset = offset; + + while (entries--) { + if (srf_buf.tiff_sget(save, + &tag_offset, &tag_id, &tag_type, &tag_dataoffset, + &tag_datalen, &tag_dataunitlen) == 0) { + if ((tag_id >= 0x00c0) && (tag_id <= 0x00ce)) { + i = (tag_id - 0x00c0) % 3; + nWB = (tag_id - 0x00c0) / 3; + icWBC[Sony_SRF_wb_list[nWB]][i] = srf_buf.sget4(tag_dataoffset); + if (i == 1) { + icWBC[Sony_SRF_wb_list[nWB]][3] = + icWBC[Sony_SRF_wb_list[nWB]][i]; + } + } + else if ((tag_id >= 0x00d0) && (tag_id <= 0x00d2)) { + i = (tag_id - 0x00d0) % 3; + cam_mul[i] = srf_buf.sget4(tag_dataoffset); + if (i == 1) { + cam_mul[3] = cam_mul[i]; + } + } + else switch (tag_id) { + /* + 0x0002 SRF6Offset + 0x0003 SRFDataOffset (?) + 0x0004 RawDataOffset + 0x0005 RawDataLength + */ + case 0x0043: + ilm.MaxAp4MaxFocal = srf_buf.sgetreal(tag_type, tag_dataoffset); + break; + case 0x0044: + ilm.MaxAp4MinFocal = srf_buf.sgetreal(tag_type, tag_dataoffset); + break; + case 0x0045: + ilm.MinFocal = srf_buf.sgetreal(tag_type, tag_dataoffset); + break; + case 0x0046: + ilm.MaxFocal = srf_buf.sgetreal(tag_type, tag_dataoffset); + break; + } + } + else goto restore_after_parseSonySRF; + } + offset = tag_offset; + + restore_after_parseSonySRF:; + } + catch (...) // srf_buf can raise IO_EOF exception, catch it and return usual way + { + fseek(ifp, save, SEEK_SET); + return; + } + fseek(ifp, save, SEEK_SET); +} diff --git a/rtengine/libraw/src/metadata/tiff.cpp b/rtengine/libraw/src/metadata/tiff.cpp new file mode 100644 index 000000000..9c1650c1a --- /dev/null +++ b/rtengine/libraw/src/metadata/tiff.cpp @@ -0,0 +1,2369 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" +#include "../../internal/libraw_cameraids.h" + +int LibRaw::parse_tiff_ifd(int base) +{ + unsigned entries, tag, type, len, plen = 16, save, utmp; + int ifd, use_cm = 0, cfa, i, j, c, ima_len = 0; + char *cbuf, *cp; + uchar cfa_pat[16], cfa_pc[] = {0, 1, 2, 3}, tab[256]; + double fm[3][4], cc[4][4], cm[4][3], cam_xyz[4][3], num; + double ab[] = {1, 1, 1, 1}, asn[] = {0, 0, 0, 0}, xyz[] = {1, 1, 1}; + unsigned sony_curve[] = {0, 0, 0, 0, 0, 4095}; + unsigned *buf, sony_offset = 0, sony_length = 0, sony_key = 0; + struct jhead jh; + + ushort *rafdata; + + if (tiff_nifds >= sizeof tiff_ifd / sizeof tiff_ifd[0]) + return 1; + ifd = tiff_nifds++; + for (j = 0; j < 4; j++) + for (i = 0; i < 4; i++) + cc[j][i] = i == j; + + if (libraw_internal_data.unpacker_data.ifd0_offset == -1LL) + libraw_internal_data.unpacker_data.ifd0_offset = base; + + entries = get2(); + if (entries > 512) + return 1; + + INT64 fsize = ifp->size(); + + while (entries--) + { + tiff_get(base, &tag, &type, &len, &save); + INT64 savepos = ftell(ifp); + if (len > 8 && savepos + len > 2 * fsize) + { + fseek(ifp, save, SEEK_SET); // Recover tiff-read position!! + continue; + } + if (callbacks.exif_cb) + { + callbacks.exif_cb(callbacks.exifparser_data, + tag | (is_pana_raw ? 0x30000 : ((ifd + 1) << 20)), type, + len, order, ifp, base); + fseek(ifp, savepos, SEEK_SET); + } + if (!is_pana_raw) + { /* processing of EXIF tags that collide w/ PanasonicRaw tags */ + switch (tag) + { + case 0x0001: + if (len == 4) + is_pana_raw = get4(); + break; + case 0x000b: /* 11, Std. EXIF Software tag */ + fgets(software, 64, ifp); + if (!strncmp(software, "Adobe", 5) || !strncmp(software, "dcraw", 5) || + !strncmp(software, "UFRaw", 5) || !strncmp(software, "Bibble", 6) || + !strcmp(software, "Digital Photo Professional")) + is_raw = 0; + break; + case 0x001c: /* 28, safeguard, probably not needed */ + case 0x001d: /* 29, safeguard, probably not needed */ + case 0x001e: /* 30, safeguard, probably not needed */ + cblack[tag - 0x001c] = get2(); + cblack[3] = cblack[1]; + break; + + case 0x0111: /* 273, StripOffset */ + if (len > 1 && len < 16384) + { + off_t sav = ftell(ifp); + tiff_ifd[ifd].strip_offsets = (int *)calloc(len, sizeof(int)); + tiff_ifd[ifd].strip_offsets_count = len; + for (int ii = 0; ii < (int)len; ii++) + tiff_ifd[ifd].strip_offsets[ii] = get4() + base; + fseek(ifp, sav, SEEK_SET); // restore position + } + /* fallback */ + case 0x0201: /* 513, JpegIFOffset */ + case 0xf007: // 61447 + tiff_ifd[ifd].offset = get4() + base; + if (!tiff_ifd[ifd].bps && tiff_ifd[ifd].offset > 0) + { + fseek(ifp, tiff_ifd[ifd].offset, SEEK_SET); + if (ljpeg_start(&jh, 1)) + { + if (!dng_version && !strcasecmp(make, "SONY") && tiff_ifd[ifd].phint == 32803 && + tiff_ifd[ifd].comp == 7) // Sony/lossless compressed IFD + { + tiff_ifd[ifd].comp = 6; + tiff_ifd[ifd].bps = jh.bits; + tiff_ifd[ifd].samples = 1; + } + else if (!dng_version && !strcasecmp(make, "SONY") && tiff_ifd[ifd].phint == 6 && + tiff_ifd[ifd].comp == 7 && tiff_ifd[ifd].samples == 3) // Sony/lossless YCbCr + { + tiff_ifd[ifd].comp = 6; + tiff_ifd[ifd].bps = jh.bits; + // tiff_ifd[ifd].samples = 3; // no change + } + else + { + tiff_ifd[ifd].comp = 6; + tiff_ifd[ifd].bps = jh.bits; + tiff_ifd[ifd].t_width = jh.wide; + tiff_ifd[ifd].t_height = jh.high; + tiff_ifd[ifd].samples = jh.clrs; + if (!(jh.sraw || (jh.clrs & 1))) + tiff_ifd[ifd].t_width *= jh.clrs; + if ((tiff_ifd[ifd].t_width > 4 * tiff_ifd[ifd].t_height) & ~jh.clrs) + { + tiff_ifd[ifd].t_width /= 2; + tiff_ifd[ifd].t_height *= 2; + } + i = order; + parse_tiff(tiff_ifd[ifd].offset + 12); + order = i; + } + } + } + break; + } + } + else + { /* processing Panasonic-specific "PanasonicRaw" tags */ + switch (tag) + { + case 0x0004: /* 4, SensorTopBorder */ + imgdata.sizes.raw_inset_crops[0].ctop = get2(); + break; + case 0x000a: /* 10, BitsPerSample */ + pana_bpp = get2(); + pana_bpp = LIM(pana_bpp, 8, 16); + break; + case 0x000b: /* 11, Compression */ + imPana.Compression = get2(); + break; + case 0x000e: /* 14, LinearityLimitRed */ + case 0x000f: /* 15, LinearityLimitGreen */ + case 0x0010: /* 16, LinearityLimitBlue */ + imgdata.color.linear_max[tag - 14] = get2(); + if (imgdata.color.linear_max[tag - 14] == 16383) + imgdata.color.linear_max[tag - 14] -= 64; + if (imgdata.color.linear_max[tag - 14] == 4095) + imgdata.color.linear_max[tag - 14] -= 16; + if (tag == 0x000f) // 15, LinearityLimitGreen + imgdata.color.linear_max[3] = imgdata.color.linear_max[1]; + break; + case 0x0013: /* 19, WBInfo */ + if ((i = get2()) > 0x100) + break; + for (c = 0; c < i; c++) + { + if ((j = get2()) < 0x100) + { + icWBC[j][0] = get2(); + icWBC[j][2] = get2(); + icWBC[j][1] = icWBC[j][3] = + 0x100; + } + else // light source out of EXIF numbers range + get4(); + } + break; + case 0x0018: /* 24, HighISOMultiplierRed */ + case 0x0019: /* 25, HighISOMultiplierGreen */ + case 0x001a: /* 26, HighISOMultiplierBlue */ + imPana.HighISOMultiplier[tag - 0x0018] = get2(); + break; + case 0x001c: /* 28, BlackLevelRed */ + case 0x001d: /* 29, BlackLevelGreen */ + case 0x001e: /* 30, BlackLevelBlue */ + pana_black[tag - 0x001c] = get2(); + break; + case 0x002d: /* 45, RawFormat */ + /* pana_encoding: tag 0x002d (45dec) not used - DMC-LX1/FZ30/FZ50/L1/LX1/LX2 + 2 - RAW DMC-FZ8/FZ18 + 3 - RAW DMC-L10 + 4 - RW2 for most other models, including G9 in "pixel shift off" mode and YUNEEC CGO4 + (must add 15 to black levels for RawFormat == 4) + 5 - RW2 DC-GH5s; G9 in "pixel shift on" mode + 6 - RW2 DC-S1, DC-S1R in "pixel shift off" mode + 7 - RW2 DC-S1R (probably DC-S1 too) in "pixel shift on" mode + 8 - RW2 DC-GH6, DC-S5M2 + */ + pana_encoding = get2(); + break; + case 0x002f: /* 47, CropTop */ + imgdata.sizes.raw_inset_crops[0].ctop = get2(); + break; + case 0x0030: /* 48, CropLeft */ + imgdata.sizes.raw_inset_crops[0].cleft = get2(); + break; + case 0x0031: /* 49, CropBottom */ + imgdata.sizes.raw_inset_crops[0].cheight = + get2() - imgdata.sizes.raw_inset_crops[0].ctop; + break; + case 0x0032: /* 50, CropRight */ + imgdata.sizes.raw_inset_crops[0].cwidth = + get2() - imgdata.sizes.raw_inset_crops[0].cleft; + break; + case 0x0037: /* 55, ISO if ISO in 0x8827 & ISO in 0x0017 == 65535 */ + if (iso_speed == 65535) + iso_speed = get4(); + break; + case 0x0039: + if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 26) + { + ushort cnt = get2(); + if (cnt > 6) + cnt = 6; + for (i = 0; i < cnt; i++) + pana8.tag39[i] = get4(); + } + break; + case 0x003A: + if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 26) + { + ushort cnt = get2(); + if (cnt > 6) + cnt = 6; + for (i = 0; i < cnt; i++) + { + get2(); + pana8.tag3A[i] = get2(); + } + } + break; + case 0x003B: + if (type == LIBRAW_EXIFTAG_TYPE_SHORT && len == 1) + pana8.tag3B = get2(); + break; + case 0x003C: + case 0x003D: + case 0x003E: + case 0x003F: + if (type == LIBRAW_EXIFTAG_TYPE_SHORT && len == 1) + pana8.initial[tag - 0x3c] = get2(); + break; + case 0x0040: + if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 70) + { + ushort count = get2(); + if (count > 17) count = 17; + for (i = 0; i < count; i++) + { + ushort v1 = get2(); + if (v1 > 16u) v1 = 16u; + pana8.tag40a[i] = v1; + ushort v2 = get2(); + if (v2 > 0xfffu) + v2 = 0xfffu; + pana8.tag40b[i] = v2; + } + } + break; + case 0x0041: + if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 36) + { + ushort count = get2(); + if (count > 17) + count = 17; + for (i = 0; i < count; i++) + { + ushort v1 = get2(); + if (v1 > 0x40u) v1 = 64; + pana8.tag41[i] = v1; + } + } + break; + case 0x0042: + if (type == LIBRAW_EXIFTAG_TYPE_SHORT && len == 1) + { + ushort val = get2(); + if (val > 5) + val = 5; + pana8.stripe_count = val; + } + break; + case 0x0043: + if (type == LIBRAW_EXIFTAG_TYPE_SHORT && len == 1) + { + ushort val = get2(); + if (val > 5) + val = 5; + pana8.tag43 = val; + } + break; + case 0x0044: + if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 50) + { + ushort count = get2(); + if (count > 5) + count = 5; + for (i = 0; i < count; i++) + pana8.stripe_offsets[i] = get4(); + } + break; + case 0x0045: + if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 50) + { + ushort count = get2(); + if (count > 5) + count = 5; + for (i = 0; i < count; i++) + pana8.stripe_left[i] = get4(); + } + break; + case 0x0046: + if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 50) + { + ushort count = get2(); + if (count > 5) + count = 5; + for (i = 0; i < count; i++) + pana8.stripe_compressed_size[i] = get4(); + } + break; + case 0x0047: + if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 26) + { + ushort count = get2(); + if (count > 5) + count = 5; + for (i = 0; i < count; i++) + pana8.stripe_width[i] = get2(); + } + break; + case 0x0048: + if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 26) + { + ushort count = get2(); + if (count > 5) + count = 5; + for (i = 0; i < count; i++) + pana8.stripe_height[i] = get2(); + } + break; + case 0x011c: /* 284, Gamma */ + { + int n = get2(); + if (n >= 1024) + imPana.gamma = (float)n / 1024.0f; + else if (n >= 256) + imPana.gamma = (float)n / 256.0f; + else + imPana.gamma = (float)n / 100.0f; + } + break; + case 0x0120: /* 288, CameraIFD, contains tags 0x1xxx, 0x2xxx, 0x3xxx */ + { + unsigned sorder = order; + unsigned long sbase = base; + base = ftell(ifp); + order = get2(); + fseek(ifp, 2, SEEK_CUR); + fseek(ifp, INT64(get4()) - 8LL, SEEK_CUR); + parse_tiff_ifd(base); + base = sbase; + order = sorder; + } + break; + case 0x0121: /* 289, Multishot, 0 is Off, 65536 is Pixel Shift */ + imPana.Multishot = get4(); + break; + case 0x1001: + if (imPana.Multishot == 0) { + imPana.Multishot = get4(); + if (imPana.Multishot) + imPana.Multishot += 65535; + } + break; + case 0x1100: + imPana.FocusStepNear = get2(); + break; + case 0x1101: + imPana.FocusStepCount = get2(); + break; + case 0x1105: + imPana.ZoomPosition = get4(); + break; + case 0x1201: + if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_SHORT)) { + imPana.LensManufacturer = fgetc(ifp); + } else if (type == 258) { + imPana.LensManufacturer = get4(); + if (imPana.LensManufacturer >= 257) { + ilm.LensMount = LIBRAW_MOUNT_LPS_L; + ilm.LensFormat = LIBRAW_FORMAT_FF; + } + } + break; + case 0x1202: + if (ilm.LensMount == LIBRAW_MOUNT_LPS_L) { + if ((utmp = get2())) ilm.LensID = utmp; + } else if ((imPana.LensManufacturer != 0xff) && + (imPana.LensManufacturer != 0xffffffff)) { + if ((utmp = (fgetc(ifp) << 8) | fgetc(ifp))) + ilm.LensID = (imPana.LensManufacturer << 16) + utmp; + } + break; + case 0x1203: /* 4611, FocalLengthIn35mmFormat, contained in 0x0120 + CameraIFD */ + if (imgdata.lens.FocalLengthIn35mmFormat < 0.65f) + imgdata.lens.FocalLengthIn35mmFormat = get2(); + break; + case 0x2009: /* 8201, contained in 0x0120 CameraIFD */ + if ((pana_encoding == 4) || (pana_encoding == 5)) + { + i = MIN(8, len); + int permut[8] = {3, 2, 1, 0, 3 + 4, 2 + 4, 1 + 4, 0 + 4}; + imPana.BlackLevelDim = len; + for (j = 0; j < i; j++) + { + imPana.BlackLevel[permut[j]] = + (float)(get2()) / (float)(powf(2.f, 14.f - pana_bpp)); + } + } + break; + case 0x3420: /* 13344, WB_RedLevelAuto, contained in 0x0120 CameraIFD */ + icWBC[LIBRAW_WBI_Auto][0] = get2(); + icWBC[LIBRAW_WBI_Auto][1] = icWBC[LIBRAW_WBI_Auto][3] = 1024.0f; + break; + case 0x3421: /* 13345, WB_BlueLevelAuto, contained in 0x0120 CameraIFD */ + icWBC[LIBRAW_WBI_Auto][2] = get2(); + break; + case 0x0002: /* 2, ImageWidth */ + tiff_ifd[ifd].t_width = getint(type); + break; + case 0x0003: /* 3, ImageHeight */ + tiff_ifd[ifd].t_height = getint(type); + break; + case 0x0005: /* 5, SensorLeftBorder */ + width = get2(); + imgdata.sizes.raw_inset_crops[0].cleft = width; + break; + case 0x0006: /* 6, SensorBottomBorder */ + height = get2(); + imgdata.sizes.raw_inset_crops[0].cheight = + height - imgdata.sizes.raw_inset_crops[0].ctop; + break; + case 0x0007: /* 7, SensorRightBorder */ + i = get2(); + width += i; + imgdata.sizes.raw_inset_crops[0].cwidth = + i - imgdata.sizes.raw_inset_crops[0].cleft; + break; + case 0x0009: /* 9, CFAPattern */ + if ((i = get2())) + filters = i; + break; + case 0x0011: /* 17, RedBalance */ + case 0x0012: /* 18, BlueBalance */ + if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_SHORT) && len == 1) + cam_mul[(tag - 0x0011) * 2] = get2() / 256.0; + break; + case 0x0017: /* 23, ISO */ + if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_SHORT)) + iso_speed = get2(); + break; + case 0x0024: /* 36, WBRedLevel */ + case 0x0025: /* 37, WBGreenLevel */ + case 0x0026: /* 38, WBBlueLevel */ + cam_mul[tag - 0x0024] = get2(); + break; + case 0x0027: /* 39, WBInfo2 */ + if ((i = get2()) > 0x100) + break; + for (c = 0; c < i; c++) + { + if ((j = get2()) < 0x100) + { + icWBC[j][0] = get2(); + icWBC[j][1] = icWBC[j][3] = get2(); + icWBC[j][2] = get2(); + if (c == 1 && i > 6 && cam_mul[0] <= 0.001f) + for (int q = 0; q < 4; q++) + cam_mul[q] = icWBC[j][q]; + } + else + fseek(ifp, 6, SEEK_CUR); + } + break; + case 0x002e: /* 46, JpgFromRaw */ + if ((type != LIBRAW_EXIFTAG_TYPE_UNDEFINED) || (fgetc(ifp) != 0xff) || (fgetc(ifp) != 0xd8)) + break; + thumb_offset = ftell(ifp) - 2; + thumb_length = len; + break; + + case 0x0118: /* 280, Panasonic RW2 offset */ + if (type != LIBRAW_EXIFTAG_TYPE_LONG) + break; + load_raw = &LibRaw::panasonic_load_raw; + load_flags = 0x2008; + case 0x0111: /* 273, StripOffset */ + if (len > 1 && len < 16384) + { + off_t sav = ftell(ifp); + tiff_ifd[ifd].strip_offsets = (int *)calloc(len, sizeof(int)); + tiff_ifd[ifd].strip_offsets_count = len; + for (int ii = 0; ii < (int)len; ii++) + tiff_ifd[ifd].strip_offsets[ii] = get4() + base; + fseek(ifp, sav, SEEK_SET); // restore position + } + /* fallthrough */ + tiff_ifd[ifd].offset = get4() + base; + if (!tiff_ifd[ifd].bps && tiff_ifd[ifd].offset > 0) + { + fseek(ifp, tiff_ifd[ifd].offset, SEEK_SET); + if (ljpeg_start(&jh, 1)) + { + tiff_ifd[ifd].comp = 6; + tiff_ifd[ifd].t_width = jh.wide; + tiff_ifd[ifd].t_height = jh.high; + tiff_ifd[ifd].bps = jh.bits; + tiff_ifd[ifd].samples = jh.clrs; + if (!(jh.sraw || (jh.clrs & 1))) + tiff_ifd[ifd].t_width *= jh.clrs; + if ((tiff_ifd[ifd].t_width > 4 * tiff_ifd[ifd].t_height) & ~jh.clrs) + { + tiff_ifd[ifd].t_width /= 2; + tiff_ifd[ifd].t_height *= 2; + } + i = order; + parse_tiff(tiff_ifd[ifd].offset + 12); + order = i; + } + } + break; + } + + } /* processing of Panasonic-specific tags finished */ + + switch (tag) + { /* processing of general EXIF tags */ + case 0xf000: /* 61440, Fuji HS10 table */ + fseek(ifp, get4() + base, SEEK_SET); + parse_tiff_ifd(base); + break; + case 0x00fe: /* NewSubfileType */ + tiff_ifd[ifd].newsubfiletype = getreal(type); + break; + case 0x0100: /* 256, ImageWidth */ + case 0xf001: /* 61441, Fuji RAF RawImageFullWidth */ + tiff_ifd[ifd].t_width = getint(type); + break; + case 0x0101: /* 257, ImageHeight */ + case 0xf002: /* 61442, Fuji RAF RawImageFullHeight */ + tiff_ifd[ifd].t_height = getint(type); + break; + case 0x0102: /* 258, BitsPerSample */ + case 0xf003: /* 61443, Fuji RAF 0xf003 */ + if(!tiff_ifd[ifd].samples || tag != 0x0102) // ??? already set by tag 0x115 + tiff_ifd[ifd].samples = len & 7; + tiff_ifd[ifd].bps = getint(type); + if (tiff_bps < (unsigned)tiff_ifd[ifd].bps) + tiff_bps = tiff_ifd[ifd].bps; + break; + case 0xf006: /* 61446, Fuji RAF 0xf006 */ + raw_height = 0; + if (tiff_ifd[ifd].bps > 12) + break; + load_raw = &LibRaw::packed_load_raw; + load_flags = get4() ? 24 : 80; + break; + case 0x0103: /* 259, Compression */ + /* + 262 = Kodak 262 + 32767 = Sony ARW Compressed + 32769 = Packed RAW + 32770 = Samsung SRW Compressed + 32772 = Samsung SRW Compressed 2 + 32867 = Kodak KDC Compressed + 34713 = Nikon NEF Compressed + 65000 = Kodak DCR Compressed + 65535 = Pentax PEF Compressed + */ + tiff_ifd[ifd].comp = getint(type); + break; + case 0x0106: /* 262, PhotometricInterpretation */ + tiff_ifd[ifd].phint = get2(); + break; + case 0x010e: /* 270, ImageDescription */ + fread(desc, 512, 1, ifp); + break; + case 0x010f: /* 271, Make */ + fgets(make, 64, ifp); + break; + case 0x0110: /* 272, Model */ + if (!strncmp(make, "Hasselblad", 10) && model[0] && + (imHassy.format != LIBRAW_HF_Imacon)) + break; + fgets(model, 64, ifp); + break; + case 0x0116: // 278 + tiff_ifd[ifd].rows_per_strip = getint(type); + break; + case 0x0112: /* 274, Orientation */ + tiff_ifd[ifd].t_flip = "50132467"[get2() & 7] - '0'; + break; + case 0x0115: /* 277, SamplesPerPixel */ + tiff_ifd[ifd].samples = getint(type) & 7; + break; + case 0x0152: /* Extrasamples */ + tiff_ifd[ifd].extrasamples = (getint(type) & 0xff) + 1024; + break; + case 0x0117: /* 279, StripByteCounts */ + if (len > 1 && len < 16384) + { + off_t sav = ftell(ifp); + tiff_ifd[ifd].strip_byte_counts = (int *)calloc(len, sizeof(int)); + tiff_ifd[ifd].strip_byte_counts_count = len; + for (int ii = 0; ii < (int)len; ii++) + tiff_ifd[ifd].strip_byte_counts[ii] = get4(); + fseek(ifp, sav, SEEK_SET); // restore position + } + /* fallback */ + case 0x0202: // 514 + case 0xf008: // 61448 + tiff_ifd[ifd].bytes = get4(); + break; + case 0xf00e: // 61454, FujiFilm "As Shot" + FORC3 cam_mul[GRBG_2_RGBG(c)] = getint(type); + break; + case 0x0131: /* 305, Software */ + fgets(software, 64, ifp); + if (!strncmp(software, "Adobe", 5) || !strncmp(software, "dcraw", 5) || + !strncmp(software, "UFRaw", 5) || !strncmp(software, "Bibble", 6) || + !strcmp(software, "Digital Photo Professional")) + is_raw = 0; + break; + case 0x0132: /* 306, DateTime */ + get_timestamp(0); + break; + case 0x013b: /* 315, Artist */ + fread(artist, 64, 1, ifp); + break; + case 0x013d: // 317 + tiff_ifd[ifd].predictor = getint(type); + break; + case 0x0142: /* 322, TileWidth */ + tiff_ifd[ifd].t_tile_width = getint(type); + break; + case 0x0143: /* 323, TileLength */ + tiff_ifd[ifd].t_tile_length = getint(type); + break; + case 0x0144: /* 324, TileOffsets */ + tiff_ifd[ifd].offset = len > 1 ? ftell(ifp) : get4(); + if (len == 1) + tiff_ifd[ifd].t_tile_width = tiff_ifd[ifd].t_tile_length = 0; + if (len == 4) + { + load_raw = &LibRaw::sinar_4shot_load_raw; + is_raw = 5; + } + break; + case 0x0145: // 325 + tiff_ifd[ifd].bytes = len > 1 ? ftell(ifp) : get4(); + break; + case 0x014a: /* 330, SubIFDs */ + if (!strcmp(model, "DSLR-A100") && tiff_ifd[ifd].t_width == 3872) + { + load_raw = &LibRaw::sony_arw_load_raw; + data_offset = get4() + base; + ifd++; + if (ifd >= int(sizeof tiff_ifd / sizeof tiff_ifd[0])) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + break; + } + if (!strncmp(make, "Hasselblad", 10) && + libraw_internal_data.unpacker_data.hasselblad_parser_flag) + { + fseek(ifp, ftell(ifp) + 4, SEEK_SET); + fseek(ifp, get4() + base, SEEK_SET); + parse_tiff_ifd(base); + break; + } + if (len > 1000) + len = 1000; /* 1000 SubIFDs is enough */ + while (len--) + { + i = ftell(ifp); + fseek(ifp, get4() + base, SEEK_SET); + if (parse_tiff_ifd(base)) + break; + fseek(ifp, i + 4, SEEK_SET); + } + break; + case 0x0153: // 339 + tiff_ifd[ifd].sample_format = getint(type); + break; + case 0x0190: // 400 + strcpy(make, "Sarnoff"); + maximum = 0xfff; + break; + case 0x02bc: // 700 + if ((tagtypeIs(LIBRAW_EXIFTAG_TYPE_BYTE) || + tagtypeIs(LIBRAW_EXIFTAG_TYPE_ASCII) || + tagtypeIs(LIBRAW_EXIFTAG_TYPE_SBYTE) || + tagtypeIs(LIBRAW_EXIFTOOLTAGTYPE_binary)) && + (len > 1) && (len < 5100000)) + { + xmpdata = (char *)malloc(xmplen = len + 1); + fread(xmpdata, len, 1, ifp); + xmpdata[len] = 0; + } + break; + case 0x7000: + imSony.SonyRawFileType = get2(); + break; + case 0x7010: // 28688 + FORC4 sony_curve[c + 1] = get2() >> 2 & 0xfff; + for (i = 0; i < 5; i++) + for (j = sony_curve[i] + 1; j <= (int)sony_curve[i + 1]; j++) + curve[j] = curve[j - 1] + (1 << i); + break; + case 0x7200: // 29184, Sony SR2Private + sony_offset = get4(); + break; + case 0x7201: // 29185, Sony SR2Private + sony_length = get4(); + break; + case 0x7221: // 29217, Sony SR2Private + sony_key = get4(); + break; + case 0x7250: // 29264, Sony SR2Private + parse_minolta(ftell(ifp)); + raw_width = 0; + break; + case 0x7303: // 29443, Sony SR2SubIFD + FORC4 cam_mul[GRBG_2_RGBG(c)] = get2(); + break; + case 0x7313: // 29459, Sony SR2SubIFD + FORC4 cam_mul[RGGB_2_RGBG(c)] = get2(); + break; + case 0x7310: // 29456, Sony SR2SubIFD + FORC4 cblack[RGGB_2_RGBG(c)] = get2(); + i = cblack[3]; + FORC3 if (i > (int)cblack[c]) i = cblack[c]; + FORC4 cblack[c] -= i; + black = i; + break; + case 0x827d: /* 33405, Model2 */ + /* + for Kodak ProBack 645 PB645x-yyyy 'x' is: + 'M' for Mamiya 645 + 'C' for Contax 645 + 'H' for Hasselblad H-series + */ + fgets(model2, 64, ifp); + break; + case 0x828d: /* 33421, CFARepeatPatternDim */ + if (get2() == 6 && get2() == 6) + tiff_ifd[ifd].t_filters = filters = 9; + break; + case 0x828e: /* 33422, CFAPattern */ + if (filters == 9) + { + FORC(36)((char *)xtrans)[c] = fgetc(ifp) & 3; + break; + } + case 0xfd09: /* 64777, Kodak P-series */ + if (len == 36) + { + tiff_ifd[ifd].t_filters = filters = 9; + colors = 3; + FORC(36)((char *)xtrans)[c] = fgetc(ifp) & 3; + } + else if (len > 0) + { + if ((plen = len) > 16) + plen = 16; + fread(cfa_pat, 1, plen, ifp); + for (colors = cfa = i = 0; i < (int)plen && colors < 4; i++) + { + if (cfa_pat[i] > 31) + continue; // Skip wrong data + colors += !(cfa & (1 << cfa_pat[i])); + cfa |= 1 << cfa_pat[i]; + } + if (cfa == 070) + memcpy(cfa_pc, "\003\004\005", 3); /* CMY */ + if (cfa == 072) + memcpy(cfa_pc, "\005\003\004\001", 4); /* GMCY */ + goto guess_cfa_pc; + } + break; + case 0x8290: // 33424 + case 0xfe00: // 65024 + fseek(ifp, get4() + base, SEEK_SET); + parse_kodak_ifd(base); + break; + case 0x829a: /* 33434, ExposureTime */ + tiff_ifd[ifd].t_shutter = shutter = getreal(type); + break; + case 0x829d: /* 33437, FNumber */ + aperture = getreal(type); + break; + case 0x9400: + imCommon.exifAmbientTemperature = getreal(type); + if ((imCommon.CameraTemperature > -273.15f) && + ((OlyID == OlyID_TG_5) || (OlyID == OlyID_TG_6))) + imCommon.CameraTemperature += + imCommon.exifAmbientTemperature; + break; + case 0x9401: + imCommon.exifHumidity = getreal(type); + break; + case 0x9402: + imCommon.exifPressure = getreal(type); + break; + case 0x9403: + imCommon.exifWaterDepth = getreal(type); + break; + case 0x9404: + imCommon.exifAcceleration = getreal(type); + break; + case 0x9405: + imCommon.exifCameraElevationAngle = getreal(type); + break; + case 0xa405: // FocalLengthIn35mmFormat + imgdata.lens.FocalLengthIn35mmFormat = get2(); + break; + case 0xa431: // BodySerialNumber + case 0xc62f: + stmread(imgdata.shootinginfo.BodySerial, len, ifp); + break; + case 0xa432: // LensInfo, 42034dec, Lens Specification per EXIF standard + imgdata.lens.MinFocal = getreal(type); + imgdata.lens.MaxFocal = getreal(type); + imgdata.lens.MaxAp4MinFocal = getreal(type); + imgdata.lens.MaxAp4MaxFocal = getreal(type); + break; + case 0xa435: // LensSerialNumber + stmread(imgdata.lens.LensSerial, len, ifp); + break; + case 0xc630: // DNG LensInfo, Lens Specification per EXIF standard + imgdata.lens.MinFocal = getreal(type); + imgdata.lens.MaxFocal = getreal(type); + imgdata.lens.MaxAp4MinFocal = getreal(type); + imgdata.lens.MaxAp4MaxFocal = getreal(type); + break; + case 0xa420: /* 42016, ImageUniqueID */ + stmread(imgdata.color.ImageUniqueID, len, ifp); + break; + case 0xc65d: /* 50781, RawDataUniqueID */ + imgdata.color.RawDataUniqueID[16] = 0; + fread(imgdata.color.RawDataUniqueID, 1, 16, ifp); + break; + case 0xa433: // LensMake + stmread(imgdata.lens.LensMake, len, ifp); + break; + case 0xa434: // LensModel + stmread(imgdata.lens.Lens, len, ifp); + if (!strncmp(imgdata.lens.Lens, "----", 4)) + imgdata.lens.Lens[0] = 0; + break; + case 0x9205: + imgdata.lens.EXIF_MaxAp = libraw_powf64l(2.0f, (getreal(type) / 2.0f)); + break; + case 0x8602: /* 34306, Leaf white balance */ + FORC4 + { + int q = get2(); + if (q) + cam_mul[GRGB_2_RGBG(c)] = 4096.0 / q; + } + break; + case 0x8603: /* 34307, Leaf CatchLight color matrix */ + fread(software, 1, 7, ifp); + if (strncmp(software, "MATRIX", 6)) + break; + colors = 4; + for (raw_color = i = 0; i < 3; i++) + { + FORC4 fscanf(ifp, "%f", &rgb_cam[i][GRGB_2_RGBG(c)]); + if (!use_camera_wb) + continue; + num = 0; + FORC4 num += rgb_cam[i][c]; + FORC4 rgb_cam[i][c] /= MAX(1, num); + } + break; + case 0x8606: /* 34310, Leaf metadata */ + parse_mos(ftell(ifp)); + case 0x85ff: // 34303 + strcpy(make, "Leaf"); + break; + case 0x8769: /* 34665, EXIF tag */ + fseek(ifp, get4() + base, SEEK_SET); + parse_exif(base); + break; + case 0x8825: /* 34853, GPSInfo tag */ + { + unsigned pos; + fseek(ifp, pos = (get4() + base), SEEK_SET); + parse_gps(base); + fseek(ifp, pos, SEEK_SET); + parse_gps_libraw(base); + } + break; + case 0x8773: /* 34675, InterColorProfile */ + case 0xc68f: /* 50831, AsShotICCProfile */ + profile_offset = ftell(ifp); + profile_length = len; + break; + case 0x9102: /* 37122, CompressedBitsPerPixel */ + kodak_cbpp = get4(); + break; + case 0x920a: /* 37386, FocalLength */ + focal_len = getreal(type); + break; + case 0x9211: /* 37393, ImageNumber */ + shot_order = getint(type); + break; + case 0x9215: /* 37397, ExposureIndex */ + imCommon.exifExposureIndex = getreal(type); + break; + case 0x9218: /* 37400, old Kodak KDC tag */ + for (raw_color = i = 0; i < 3; i++) + { + getreal(type); + FORC3 rgb_cam[i][c] = getreal(type); + } + break; + case 0xa010: // 40976 + strip_offset = get4(); + switch (tiff_ifd[ifd].comp) + { + case 0x8002: // 32770 + load_raw = &LibRaw::samsung_load_raw; + break; + case 0x8004: // 32772 + load_raw = &LibRaw::samsung2_load_raw; + break; + case 0x8005: // 32773 + load_raw = &LibRaw::samsung3_load_raw; + break; + } + break; + case 0xb4c3: /* 46275, Imacon tags */ + imHassy.format = LIBRAW_HF_Imacon; + strcpy(make, "Imacon"); + data_offset = ftell(ifp); + ima_len = len; + break; + case 0xb4c7: // 46279 + if (!ima_len) + break; + fseek(ifp, 38, SEEK_CUR); + case 0xb4c2: // 46274 + fseek(ifp, 40, SEEK_CUR); + raw_width = get4(); + raw_height = get4(); + left_margin = get4() & 7; + width = raw_width - left_margin - (get4() & 7); + top_margin = get4() & 7; + height = raw_height - top_margin - (get4() & 7); + if (raw_width == 7262 && ima_len == 234317952) + { + height = 5412; + width = 7216; + left_margin = 7; + filters = 0; + } + else if (raw_width == 7262) + { + height = 5444; + width = 7244; + left_margin = 7; + } + fseek(ifp, 52, SEEK_CUR); + FORC3 cam_mul[c] = getreal(LIBRAW_EXIFTAG_TYPE_FLOAT); + fseek(ifp, 114, SEEK_CUR); + flip = (get2() >> 7) * 90; + if (width * (height * 6l) == ima_len) + { + if (flip % 180 == 90) + SWAP(width, height); + raw_width = width; + raw_height = height; + left_margin = top_margin = filters = flip = 0; + } + c = unsigned(height) * unsigned(width) / 1000000; + if (c == 32) + c--; + sprintf(model, "Ixpress %d-Mp", c); + load_raw = &LibRaw::imacon_full_load_raw; + if (filters) + { + if (left_margin & 1) + filters = 0x61616161; + load_raw = &LibRaw::unpacked_load_raw; + } + maximum = 0xffff; + break; + case 0xc516: /* 50454, Sinar tag */ + case 0xc517: // 50455 + if (len < 1 || len > 2560000 || !(cbuf = (char *)malloc(len))) + break; + if (fread(cbuf, 1, len, ifp) != (int)len) + throw LIBRAW_EXCEPTION_IO_CORRUPT; // cbuf to be free'ed in recycle + cbuf[len - 1] = 0; + for (cp = cbuf - 1; cp && cp < cbuf + len; cp = strchr(cp, '\n')) + if (!strncmp(++cp, "Neutral ", 8)) + sscanf(cp + 8, "%f %f %f", cam_mul, cam_mul + 1, cam_mul + 2); + free(cbuf); + break; + case 0xc51a: // 50458 + if (!make[0]) + strcpy(make, "Hasselblad"); + break; + case 0xc51b: /* 50459, Hasselblad tag */ + if (!libraw_internal_data.unpacker_data.hasselblad_parser_flag) + { + libraw_internal_data.unpacker_data.hasselblad_parser_flag = 1; + i = order; + j = ftell(ifp); + c = tiff_nifds; + order = get2(); + fseek(ifp, j + (get2(), get4()), SEEK_SET); + parse_tiff_ifd(j); + maximum = 0xffff; + tiff_nifds = c; + order = i; + break; + } + case 0xc612: /* 50706, DNGVersion */ + FORC4 dng_version = (dng_version << 8) + fgetc(ifp); + if (!make[0]) + strcpy(make, "DNG"); + is_raw = 1; + break; + case 0xc614: /* 50708, UniqueCameraModel */ + stmread(imgdata.color.UniqueCameraModel, len, ifp); + if (model[0]) + break; + strncpy(make, imgdata.color.UniqueCameraModel, + MIN(len, sizeof(imgdata.color.UniqueCameraModel))); + if ((cp = strchr(make, ' '))) + { + strcpy(model, cp + 1); + *cp = 0; + } + break; + case 0xc616: /* 50710, CFAPlaneColor */ + if (filters == 9) + break; + if (len > 4) + len = 4; + colors = len; + fread(cfa_pc, 1, colors, ifp); + guess_cfa_pc: + FORCC tab[cfa_pc[c]] = c; + cdesc[c] = 0; + for (i = 16; i--;) + filters = filters << 2 | tab[cfa_pat[i % plen]]; + filters -= !filters; + tiff_ifd[ifd].t_filters = filters; + break; + case 0xc617: /* 50711, CFALayout */ + if (get2() == 2) + tiff_ifd[ifd].t_fuji_width = fuji_width = 1; + break; + case 0x0123: // 291 + case 0xc618: /* 50712, LinearizationTable */ + tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_LINTABLE; + tiff_ifd[ifd].lineartable_offset = ftell(ifp); + tiff_ifd[ifd].lineartable_len = len; + linear_table(len); + break; + case 0xc619: /* 50713, BlackLevelRepeatDim */ + tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_BLACK; + tiff_ifd[ifd].dng_levels.dng_fcblack[4] = + tiff_ifd[ifd].dng_levels.dng_cblack[4] = cblack[4] = get2(); + tiff_ifd[ifd].dng_levels.dng_fcblack[5] = + tiff_ifd[ifd].dng_levels.dng_cblack[5] = cblack[5] = get2(); + if (cblack[4] * cblack[5] > + (LIBRAW_CBLACK_SIZE - + 7)) // Use last cblack item as DNG black level count + tiff_ifd[ifd].dng_levels.dng_fcblack[4] = + tiff_ifd[ifd].dng_levels.dng_fcblack[5] = + tiff_ifd[ifd].dng_levels.dng_cblack[4] = + tiff_ifd[ifd].dng_levels.dng_cblack[5] = cblack[4] = + cblack[5] = 1; + break; + + case 0xf00c: + if (imFuji.RAFDataGeneration != 4096) + { + unsigned fwb[4]; + FORC4 fwb[c] = get4(); + if (fwb[3] < 0x100) + { + FORC3 icWBC[fwb[3]][GRBG_2_RGBG(c)] = fwb[c]; + icWBC[fwb[3]][3] = icWBC[fwb[3]][1]; + if ((fwb[3] == 17) && // Tungsten WB + (libraw_internal_data.unpacker_data.lenRAFData > 3) && + (libraw_internal_data.unpacker_data.lenRAFData < 10240000)) + { + INT64 f_save = ftell(ifp); + rafdata = (ushort *)malloc( + sizeof(ushort) * libraw_internal_data.unpacker_data.lenRAFData); + fseek(ifp, libraw_internal_data.unpacker_data.posRAFData, SEEK_SET); + fread(rafdata, sizeof(ushort), + libraw_internal_data.unpacker_data.lenRAFData, ifp); + fseek(ifp, f_save, SEEK_SET); + + uchar *PrivateMknBuf = (uchar *)rafdata; + int PrivateMknLength = libraw_internal_data.unpacker_data.lenRAFData + << 1; + for (int pos = 0; pos < PrivateMknLength - 16; pos++) + { + if (!memcmp(PrivateMknBuf + pos, "TSNERDTS", 8)) // STDRENST + { + imFuji.isTSNERDTS = 1; + break; + } + } + int fj; // 31? (fj<<1)-0x3c : 34? (fj<<1)-0x4e : undef + int is34 = 0; + if ((imFuji.RAFDataVersion == 0x0260) || // X-Pro3, GFX 100S + (imFuji.RAFDataVersion == 0x0261) || // X100V, GFX 50S II + (imFuji.RAFDataVersion == 0x0262) || // X-T4 + (imFuji.RAFDataVersion == 0x0263) || // X-H2S + (imFuji.RAFDataVersion == 0x0264) || // X-S10, X-H2 + (imFuji.RAFDataVersion == 0x0265) || // X-E4, X-T5 + (imFuji.RAFDataVersion == 0x0266) || // X-T30 II, X-S20 + (imFuji.RAFDataVersion == 0x0267) || // GFX 100 II + !strcmp(model, "X-Pro3") || + !strcmp(model, "GFX100 II") || !strcmp(model, "GFX 100 II") || + !strcmp(model, "GFX100S") || !strcmp(model, "GFX 100S") || + !strcmp(model, "GFX50S II") || !strcmp(model, "GFX 50S II") || + !strcmp(model, "X100V") || + !strcmp(model, "X-T4") || + !strcmp(model, "X-H2S") || + !strcmp(model, "X-H2") || + !strcmp(model, "X-E4") || + !strcmp(model, "X-T5") || + !strcmp(model, "X-T30 II") || + !strcmp(model, "X-S10") || + !strcmp(model, "X-S20")) +// is34 cameras have 34 CCT values instead of 31, manual still claims 2500 to 10000 K +// aligned 3000 K to Incandescent, as it is usual w/ other Fujifilm cameras + is34 = 1; + + for (int fi = 0; + fi < int(libraw_internal_data.unpacker_data.lenRAFData - 3); fi++) // looking for Tungsten WB + { + if ((fwb[0] == rafdata[fi]) && (fwb[1] == rafdata[fi + 1]) && + (fwb[2] == rafdata[fi + 2])) // found Tungsten WB + { + if (rafdata[fi - 15] != + fwb[0]) // 15 is offset of Tungsten WB from the first + // preset, Fine Weather WB + continue; + for (int wb_ind = 0, ofst = fi - 15; wb_ind < (int)Fuji_wb_list1.size(); + wb_ind++, ofst += 3) + { + icWBC[Fuji_wb_list1[wb_ind]][1] = + icWBC[Fuji_wb_list1[wb_ind]][3] = rafdata[ofst]; + icWBC[Fuji_wb_list1[wb_ind]][0] = rafdata[ofst + 1]; + icWBC[Fuji_wb_list1[wb_ind]][2] = rafdata[ofst + 2]; + } + + if (is34) + fi += 24; + fi += 96; + for (fj = fi; fj < (fi + 15); fj += 3) // looking for the end of the WB table + { + if (rafdata[fj] != rafdata[fi]) + { + fj -= 93; + if (is34) + fj -= 9; +//printf ("wb start in DNG: 0x%04x\n", fj*2-0x4e); + for (int iCCT = 0, ofst = fj; iCCT < 31; + iCCT++, ofst += 3) + { + icWBCCTC[iCCT][0] = FujiCCT_K[iCCT]; + icWBCCTC[iCCT][1] = rafdata[ofst + 1]; + icWBCCTC[iCCT][2] = icWBCCTC[iCCT][4] = rafdata[ofst]; + icWBCCTC[iCCT][3] = rafdata[ofst + 2]; + } + break; + } + } + free(rafdata); + break; + } + } + } + } + FORC4 fwb[c] = get4(); + if (fwb[3] < 0x100) { + FORC3 icWBC[fwb[3]][GRBG_2_RGBG(c)] = fwb[c]; + icWBC[fwb[3]][3] = icWBC[fwb[3]][1]; + } + } + break; + case 0xf00d: + if (imFuji.RAFDataGeneration != 4096) + { + FORC3 icWBC[LIBRAW_WBI_Auto][GRBG_2_RGBG(c)] = getint(type); + icWBC[LIBRAW_WBI_Auto][3] = icWBC[LIBRAW_WBI_Auto][1]; + } + break; + case 0xc615: /* 50709, LocalizedCameraModel */ + stmread(imgdata.color.LocalizedCameraModel, len, ifp); + break; + case 0xf00a: // 61450 + cblack[4] = cblack[5] = MIN(sqrt((double)len), 64); + case 0xc61a: /* 50714, BlackLevel */ + if (tiff_ifd[ifd].samples > 1 && + tiff_ifd[ifd].samples == (int)len) // LinearDNG, per-channel black + { + tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_BLACK; + for (i = 0; i < 4 && i < (int)len; i++) + { + tiff_ifd[ifd].dng_levels.dng_fcblack[i] = getreal(type); + tiff_ifd[ifd].dng_levels.dng_cblack[i] = cblack[i] = + tiff_ifd[ifd].dng_levels.dng_fcblack[i] + 0.5; + } + // Record len in last cblack field + tiff_ifd[ifd].dng_levels.dng_cblack[LIBRAW_CBLACK_SIZE - 1] = len; + + tiff_ifd[ifd].dng_levels.dng_fblack = + tiff_ifd[ifd].dng_levels.dng_black = black = 0; + } + else if (tiff_ifd[ifd].samples > 1 // Linear DNG w repeat dim + && (tiff_ifd[ifd].samples * cblack[4] * cblack[5] == len)) + { + tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_BLACK; + tiff_ifd[ifd].dng_levels.dng_cblack[LIBRAW_CBLACK_SIZE - 1] = + cblack[LIBRAW_CBLACK_SIZE - 1] = len; + for (i = 0; i < (int)len && i < LIBRAW_CBLACK_SIZE - 7; i++) + { + tiff_ifd[ifd].dng_levels.dng_fcblack[i + 6] = getreal(type); + tiff_ifd[ifd].dng_levels.dng_cblack[i + 6] = cblack[i + 6] = + tiff_ifd[ifd].dng_levels.dng_fcblack[i + 6] + 0.5; + } + } + else if ((cblack[4] * cblack[5] < 2) && len == 1) + { + tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_BLACK; + tiff_ifd[ifd].dng_levels.dng_fblack = getreal(type); + black = tiff_ifd[ifd].dng_levels.dng_black = + tiff_ifd[ifd].dng_levels.dng_fblack; + } + else if (cblack[4] * cblack[5] <= len) + { + FORC(int(cblack[4] * cblack[5])) + { + tiff_ifd[ifd].dng_levels.dng_fcblack[6 + c] = getreal(type); + cblack[6 + c] = tiff_ifd[ifd].dng_levels.dng_fcblack[6 + c]; + } + black = 0; + FORC4 + cblack[c] = 0; + + if (tag == 0xc61a) + { + tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_BLACK; + FORC(int(cblack[4] * cblack[5])) + tiff_ifd[ifd].dng_levels.dng_cblack[6 + c] = cblack[6 + c]; + tiff_ifd[ifd].dng_levels.dng_fblack = 0; + tiff_ifd[ifd].dng_levels.dng_black = 0; + FORC4 + tiff_ifd[ifd].dng_levels.dng_fcblack[c] = + tiff_ifd[ifd].dng_levels.dng_cblack[c] = 0; + } + } + break; + case 0xc61b: /* 50715, BlackLevelDeltaH */ + case 0xc61c: /* 50716, BlackLevelDeltaV */ + for (num = i = 0; i < (int)len && i < 65536; i++) + num += getreal(type); + if (len > 0) + { + black += num / len + 0.5; + tiff_ifd[ifd].dng_levels.dng_fblack += num / float(len); + tiff_ifd[ifd].dng_levels.dng_black += num / len + 0.5; + tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_BLACK; + } + break; + case 0xc61d: /* 50717, WhiteLevel */ + tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_WHITE; + tiff_ifd[ifd].dng_levels.dng_whitelevel[0] = maximum = getint(type); + if (tiff_ifd[ifd].samples > 1) // Linear DNG case + for (i = 1; i < 4 && i < (int)len; i++) + tiff_ifd[ifd].dng_levels.dng_whitelevel[i] = getint(type); + break; + case 0xc61e: /* DefaultScale */ + { + float q1 = getreal(type); + float q2 = getreal(type); + if (q1 > 0.00001f && q2 > 0.00001f) + { + pixel_aspect = q1 / q2; + if (pixel_aspect > 0.995 && pixel_aspect < 1.005) + pixel_aspect = 1.0; + } + } + break; + case 0xc61f: /* 50719, DefaultCropOrigin */ + if (len == 2) + { + tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_CROPORIGIN; + tiff_ifd[ifd].dng_levels.default_crop[0] = getreal(type); + tiff_ifd[ifd].dng_levels.default_crop[1] = getreal(type); + if (!strncasecmp(make, "SONY", 4)) + { + imgdata.sizes.raw_inset_crops[0].cleft = + tiff_ifd[ifd].dng_levels.default_crop[0]; + imgdata.sizes.raw_inset_crops[0].ctop = + tiff_ifd[ifd].dng_levels.default_crop[1]; + } + } + break; + + case 0xc620: /* 50720, DefaultCropSize */ + if (len == 2) + { + tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_CROPSIZE; + tiff_ifd[ifd].dng_levels.default_crop[2] = getreal(type); + tiff_ifd[ifd].dng_levels.default_crop[3] = getreal(type); + if (!strncasecmp(make, "SONY", 4)) + { + imgdata.sizes.raw_inset_crops[0].cwidth = + tiff_ifd[ifd].dng_levels.default_crop[2]; + imgdata.sizes.raw_inset_crops[0].cheight = + tiff_ifd[ifd].dng_levels.default_crop[3]; + } + } + break; + + case 0xc7b5: /* 51125 DefaultUserCrop */ + if (len == 4) + { + int cnt = 0; + FORC4 + { + float v = getreal(type); + if (v >= 0.f && v <= 1.f) + { + tiff_ifd[ifd].dng_levels.user_crop[c] = v; + cnt++; + } + } + if(cnt == 4 // valid values + && tiff_ifd[ifd].dng_levels.user_crop[0] < tiff_ifd[ifd].dng_levels.user_crop[2] // top < bottom + && tiff_ifd[ifd].dng_levels.user_crop[1] < tiff_ifd[ifd].dng_levels.user_crop[3] // left < right + ) + tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_USERCROP; + } + break; + case 0x74c7: + if ((len == 2) && !strncasecmp(make, "SONY", 4)) + { + imgdata.sizes.raw_inset_crops[0].cleft = get4(); + imgdata.sizes.raw_inset_crops[0].ctop = get4(); + } + break; + + case 0x74c8: + if ((len == 2) && !strncasecmp(make, "SONY", 4)) + { + imgdata.sizes.raw_inset_crops[0].cwidth = get4(); + imgdata.sizes.raw_inset_crops[0].cheight = get4(); + } + break; + + case 0xc65a: // 50778 + tiff_ifd[ifd].dng_color[0].illuminant = get2(); + tiff_ifd[ifd].dng_color[0].parsedfields |= LIBRAW_DNGFM_ILLUMINANT; + break; + case 0xc65b: // 50779 + tiff_ifd[ifd].dng_color[1].illuminant = get2(); + tiff_ifd[ifd].dng_color[1].parsedfields |= LIBRAW_DNGFM_ILLUMINANT; + break; + + case 0xc621: /* 50721, ColorMatrix1 */ + case 0xc622: /* 50722, ColorMatrix2 */ + { + int chan = (len == 9) ? 3 : (len == 12 ? 4 : 0); + i = tag == 0xc621 ? 0 : 1; + if (chan) + { + tiff_ifd[ifd].dng_color[i].parsedfields |= LIBRAW_DNGFM_COLORMATRIX; + imHassy.nIFD_CM[i] = ifd; + } + FORC(chan) for (j = 0; j < 3; j++) + { + tiff_ifd[ifd].dng_color[i].colormatrix[c][j] = cm[c][j] = getreal(type); + } + use_cm = 1; + } + break; + + case 0xc714: /* ForwardMatrix1 */ + case 0xc715: /* ForwardMatrix2 */ + { + int chan = (len == 9) ? 3 : (len == 12 ? 4 : 0); + i = tag == 0xc714 ? 0 : 1; + if (chan) + tiff_ifd[ifd].dng_color[i].parsedfields |= LIBRAW_DNGFM_FORWARDMATRIX; + for (j = 0; j < 3; j++) + FORC(chan) + { + tiff_ifd[ifd].dng_color[i].forwardmatrix[j][c] = fm[j][c] = + getreal(type); + } + } + break; + + case 0xc623: /* 50723, CameraCalibration1 */ + case 0xc624: /* 50724, CameraCalibration2 */ + { + int chan = (len == 9) ? 3 : (len == 16 ? 4 : 0); + j = tag == 0xc623 ? 0 : 1; + if (chan) + tiff_ifd[ifd].dng_color[j].parsedfields |= LIBRAW_DNGFM_CALIBRATION; + for (i = 0; i < chan; i++) + FORC(chan) + { + tiff_ifd[ifd].dng_color[j].calibration[i][c] = cc[i][c] = + getreal(type); + } + } + break; + case 0xc627: /* 50727, AnalogBalance */ + if (len >= 3) + tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_ANALOGBALANCE; + for (c = 0; c < (int)len && c < 4; c++) + { + tiff_ifd[ifd].dng_levels.analogbalance[c] = ab[c] = getreal(type); + } + break; + case 0xc628: /* 50728, AsShotNeutral */ + if (len >= 3) + tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_ASSHOTNEUTRAL; + for (c = 0; c < (int)len && c < 4; c++) + tiff_ifd[ifd].dng_levels.asshotneutral[c] = asn[c] = getreal(type); + break; + case 0xc629: /* 50729, AsShotWhiteXY */ + xyz[0] = getreal(type); + xyz[1] = getreal(type); + xyz[2] = 1 - xyz[0] - xyz[1]; + FORC3 xyz[c] /= LibRaw_constants::d65_white[c]; + break; + case 0xc62a: /* DNG: 50730 BaselineExposure */ + tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_BASELINEEXPOSURE; + tiff_ifd[ifd].dng_levels.baseline_exposure = getreal(type); + break; + case 0xc62e: /* DNG: 50734 LinearResponseLimit */ + tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_LINEARRESPONSELIMIT; + tiff_ifd[ifd].dng_levels.LinearResponseLimit = getreal(type); + break; + + case 0xc634: /* 50740 : DNG Adobe, DNG Pentax, Sony SR2, DNG Private */ + { + char mbuf[64]; + INT64 curr_pos, start_pos = ftell(ifp); + unsigned MakN_order, m_sorder = order; + unsigned MakN_length; + unsigned pos_in_original_raw; + fread(mbuf, 1, 6, ifp); + + if (!strcmp(mbuf, "Adobe")) + { + order = 0x4d4d; // Adobe header is always in "MM" / big endian + curr_pos = start_pos + 6; + while (curr_pos + 8 - start_pos <= len) + { + fread(mbuf, 1, 4, ifp); + curr_pos += 8; + + if (!strncmp(mbuf, "Pano", 4)) + { // PanasonicRaw, yes, they use "Pano" as signature + parseAdobePanoMakernote(); + } + + if (!strncmp(mbuf, "MakN", 4)) + { + MakN_length = get4(); + MakN_order = get2(); + pos_in_original_raw = get4(); + order = MakN_order; + + INT64 save_pos = ifp->tell(); + parse_makernote_0xc634(curr_pos + 6 - pos_in_original_raw, 0, + AdobeDNG); + + curr_pos = save_pos + MakN_length - 6; + fseek(ifp, curr_pos, SEEK_SET); + + fread(mbuf, 1, 4, ifp); + curr_pos += 8; + + if (!strncmp(mbuf, "Pano ", 4)) + { + parseAdobePanoMakernote(); + } + + if (!strncmp(mbuf, "RAF ", 4)) + { // Fujifilm Raw, AdobeRAF + try { + parseAdobeRAFMakernote(); // May raise exception for out-of buffer reads + } + catch (...) + { + // just ignore it + } + } + + if (!strncmp(mbuf, "SR2 ", 4)) + { + order = 0x4d4d; + MakN_length = get4(); + MakN_order = get2(); + pos_in_original_raw = get4(); + order = MakN_order; + + unsigned *buf_SR2; + unsigned SR2SubIFDOffset = 0; + unsigned SR2SubIFDLength = 0; + unsigned SR2SubIFDKey = 0; + { + int _base = curr_pos + 6 - pos_in_original_raw; + unsigned _entries, _tag, _type, _len, _save; + _entries = get2(); + while (_entries--) + { + tiff_get(_base, &_tag, &_type, &_len, &_save); + + if (_tag == 0x7200) + { + SR2SubIFDOffset = get4(); + } + else if (_tag == 0x7201) + { + SR2SubIFDLength = get4(); + } + else if (_tag == 0x7221) + { + SR2SubIFDKey = get4(); + } + fseek(ifp, _save, SEEK_SET); + } + } + + if (SR2SubIFDLength && (SR2SubIFDLength < 10240000) && + (buf_SR2 = (unsigned *)malloc(SR2SubIFDLength + 1024))) + { // 1024b for safety + fseek(ifp, SR2SubIFDOffset + base, SEEK_SET); + fread(buf_SR2, SR2SubIFDLength, 1, ifp); + sony_decrypt(buf_SR2, SR2SubIFDLength / 4, 1, SR2SubIFDKey); + parseSonySR2((uchar *)buf_SR2, SR2SubIFDOffset, + SR2SubIFDLength, AdobeDNG); + + free(buf_SR2); + } + + } /* SR2 processed */ + break; + } + } + } + else + { + fread(mbuf + 6, 1, 2, ifp); + if (!strcmp(mbuf, "RICOH") && ((sget2((uchar *)mbuf + 6) == 0x4949) || + (sget2((uchar *)mbuf + 6) == 0x4d4d))) + { + is_PentaxRicohMakernotes = 1; + } + if (!strcmp(mbuf, "PENTAX ") || !strcmp(mbuf, "SAMSUNG") || + is_PentaxRicohMakernotes) + { + fseek(ifp, start_pos, SEEK_SET); + parse_makernote_0xc634(base, 0, CameraDNG); + } + } + fseek(ifp, start_pos, SEEK_SET); + order = m_sorder; + } + if (dng_version) + { + break; + } + parse_minolta(j = get4() + base); + fseek(ifp, j, SEEK_SET); + parse_tiff_ifd(base); + break; + case 0xc640: // 50752 + read_shorts(cr2_slice, 3); + break; + case 0xc68b: /* 50827, OriginalRawFileName */ + stmread(imgdata.color.OriginalRawFileName, len, ifp); + break; + case 0xc68d: /* 50829 ActiveArea */ + tiff_ifd[ifd].t_tm = top_margin = getint(type); + tiff_ifd[ifd].t_lm = left_margin = getint(type); + tiff_ifd[ifd].t_vheight = height = getint(type) - top_margin; + tiff_ifd[ifd].t_vwidth = width = getint(type) - left_margin; + break; + case 0xc68e: /* 50830 MaskedAreas */ + for (i = 0; i < (int)len && i < 32; i++) + ((int *)mask)[i] = getint(type); + black = 0; + break; + case 0xc71a: /* 50970, PreviewColorSpace */ + tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_PREVIEWCS; + tiff_ifd[ifd].dng_levels.preview_colorspace = getint(type); + break; + case 0xc740: /* 51008, OpcodeList1 */ + tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_OPCODE1; + break; + case 0xc741: /* 51009, OpcodeList2 */ + tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_OPCODE2; + tiff_ifd[ifd].opcode2_offset = meta_offset = ftell(ifp); + break; + case 0xc74e: /* 51022, OpcodeList3 */ + tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_OPCODE3; + break; + case 0xfd04: /* 64772, Kodak P-series */ + if (len < 13) + break; + fseek(ifp, 16, SEEK_CUR); + data_offset = get4(); + fseek(ifp, 28, SEEK_CUR); + data_offset += get4(); + load_raw = &LibRaw::packed_load_raw; + break; + case 0xfe02: // 65026 + if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_ASCII)) + fgets(model2, 64, ifp); + } + fseek(ifp, save, SEEK_SET); + } + if (sony_length && sony_length < 10240000 && + (buf = (unsigned *)malloc(sony_length))) + { + fseek(ifp, sony_offset, SEEK_SET); + fread(buf, sony_length, 1, ifp); + sony_decrypt(buf, sony_length / 4, 1, sony_key); + parseSonySR2((uchar *)buf, sony_offset, sony_length, nonDNG); + free(buf); + } + for (i = 0; i < colors && i < 4; i++) + FORCC cc[i][c] *= ab[i]; + if (use_cm) + { + FORCC for (i = 0; i < 3; i++) for (cam_xyz[c][i] = j = 0; j < colors; j++) + cam_xyz[c][i] += cc[c][j] * cm[j][i] * xyz[i]; + cam_xyz_coeff(cmatrix, cam_xyz); + } + if (asn[0]) + { + cam_mul[3] = 0; + FORCC + if (fabs(asn[c]) > 0.0001) + cam_mul[c] = 1 / asn[c]; + } + if (!use_cm) + FORCC if (fabs(cc[c][c]) > 0.0001) pre_mul[c] /= cc[c][c]; + return 0; +} + +int LibRaw::parse_tiff(int _base) +{ + INT64 base = _base; + int doff; + fseek(ifp, base, SEEK_SET); + order = get2(); + if (order != 0x4949 && order != 0x4d4d) + return 0; + get2(); + while ((doff = get4())) + { + INT64 doff64 = doff; + if (doff64 + base > ifp->size()) break; + fseek(ifp, doff64 + base, SEEK_SET); + if (parse_tiff_ifd(_base)) + break; + } + return 1; +} + +struct ifd_size_t +{ + int ifdi; + INT64 databits; +}; + +int ifd_size_t_cmp(const void *a, const void *b) +{ + if (!a || !b) + return 0; + const ifd_size_t *ai = (ifd_size_t *)a; + const ifd_size_t *bi = (ifd_size_t *)b; + return bi->databits > ai->databits ? 1 + : (bi->databits < ai->databits ? -1 : 0); +} + +static LibRaw_internal_thumbnail_formats tiff2thumbformat(int _comp, int _phint, int _bps, const char *_make, bool isDNG); + +void LibRaw::apply_tiff() +{ + int max_samp = 0, ties = 0, raw = -1, thm = -1, i; + unsigned long long ns, os; + struct jhead jh; + + thumb_misc = 16; + if (thumb_offset) + { + fseek(ifp, thumb_offset, SEEK_SET); + if (ljpeg_start(&jh, 1)) + { + if ((unsigned)jh.bits < 17 && (unsigned)jh.wide < 0x10000 && + (unsigned)jh.high < 0x10000) + { + thumb_misc = jh.bits; + thumb_width = jh.wide; + thumb_height = jh.high; + } + } + } + for (i = tiff_nifds; i--;) + { + if (tiff_ifd[i].t_shutter) + shutter = tiff_ifd[i].t_shutter; + tiff_ifd[i].t_shutter = shutter; + } + + if (dng_version) + { + int ifdc = 0; + for (i = 0; i < (int)tiff_nifds; i++) + { + if (tiff_ifd[i].t_width < 1 || tiff_ifd[i].t_width > 65535 || + tiff_ifd[i].t_height < 1 || tiff_ifd[i].t_height > 65535) + continue; /* wrong image dimensions */ + + int samp = tiff_ifd[i].samples; + if (samp == 2) + samp = 1; // Fuji 2-frame + max_samp = LIM(MAX(max_samp, samp), 1, + 3); // max_samp is needed for thumbnail selection below + + if ( // Check phint only for RAW subfiletype + (tiff_ifd[i].newsubfiletype == 16 + || tiff_ifd[i].newsubfiletype == 0 + || (tiff_ifd[i].newsubfiletype & 0xffff) == 1) + && + (tiff_ifd[i].phint != 32803 && tiff_ifd[i].phint != 34892) + ) + continue; + + if ((tiff_ifd[i].newsubfiletype == 0) // main image + // Enhanced demosaiced: + || (tiff_ifd[i].newsubfiletype == 16 && + (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_DNG_ADD_ENHANCED)) + // Preview: 0x1 or 0x10001 + || ((tiff_ifd[i].newsubfiletype & 0xffff) == 1 && + (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_DNG_ADD_PREVIEWS)) + // Transparency mask: 0x4 + || ((tiff_ifd[i].newsubfiletype & 0xffff) == 4 && + (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_DNG_ADD_MASKS))) + { + // Add this IFD to dng_frames + libraw_internal_data.unpacker_data.dng_frames[ifdc] = + ((tiff_ifd[i].newsubfiletype & 0xffff) << 16) | ((i << 8) & 0xff00); + ifdc++; + // Fuji SuperCCD: second frame: + if ((tiff_ifd[i].newsubfiletype == 0) && tiff_ifd[i].samples == 2) + { + libraw_internal_data.unpacker_data.dng_frames[ifdc] = + ((tiff_ifd[i].newsubfiletype & 0xffff) << 16) | + ((i << 8) & 0xff00) | 1; + ifdc++; + } + } + } + if (ifdc) + { + if (ifdc > 1 && (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_DNG_PREFER_LARGEST_IMAGE)) + { + ifd_size_t arr[LIBRAW_IFD_MAXCOUNT * 2]; + memset(arr, 0, sizeof(arr)); + for (int q = 0; q < ifdc && q < LIBRAW_IFD_MAXCOUNT * 2; q++) + { + int ifdidx = + (libraw_internal_data.unpacker_data.dng_frames[q] >> 8) & 0xff; + arr[q].ifdi = libraw_internal_data.unpacker_data.dng_frames[q]; + arr[q].databits = + tiff_ifd[ifdidx].t_width * tiff_ifd[ifdidx].t_height * + tiff_ifd[ifdidx].samples * tiff_ifd[ifdidx].bps + + (0x100 - + (arr[q].ifdi & 0xff)); // add inverted frame # to ensure same + // sort order for similar sized frames. + if (tiff_ifd[ifdidx].phint == 4) + arr[q].databits /= 4; // Force lower bit count for Transp. mask images + } + qsort(arr, MIN(ifdc, LIBRAW_IFD_MAXCOUNT * 2), sizeof(arr[0]), + ifd_size_t_cmp); + for (int q = 0; q < ifdc && q < LIBRAW_IFD_MAXCOUNT * 2; q++) + libraw_internal_data.unpacker_data.dng_frames[q] = arr[q].ifdi; + } + + int idx = LIM((int)shot_select, 0, ifdc - 1); + i = (libraw_internal_data.unpacker_data.dng_frames[idx] >> 8) & + 0xff; // extract frame# back + + raw_width = tiff_ifd[i].t_width; + raw_height = tiff_ifd[i].t_height; + tiff_bps = tiff_ifd[i].bps; + tiff_compress = tiff_ifd[i].comp; + tiff_sampleformat = tiff_ifd[i].sample_format; + data_offset = tiff_ifd[i].offset; + data_size = tiff_ifd[i].bytes; + tiff_flip = tiff_ifd[i].t_flip; + tiff_samples = tiff_ifd[i].samples; + tile_width = tiff_ifd[i].t_tile_width; + tile_length = tiff_ifd[i].t_tile_length; + fuji_width = tiff_ifd[i].t_fuji_width; + if (tiff_samples != 2) /* special case: Fuji SuperCCD */ + { + if (tiff_ifd[i].phint == 34892) + filters = 0; + else if (i > 0 && tiff_ifd[i].phint == 32803 && + tiff_ifd[0].phint == 32803 && !tiff_ifd[i].t_filters && + tiff_ifd[0].t_filters) + filters = tiff_ifd[0].t_filters; + else + filters = tiff_ifd[i].t_filters; + width = tiff_ifd[i].t_vwidth; + height = tiff_ifd[i].t_vheight; + top_margin = tiff_ifd[i].t_tm; + left_margin = tiff_ifd[i].t_lm; + shutter = tiff_ifd[i].t_shutter; + if (tiff_ifd[i].dng_levels.dng_whitelevel[0]) + maximum = tiff_ifd[i].dng_levels.dng_whitelevel[0]; + else if (tiff_ifd[i].sample_format <= 2 && tiff_bps > 0 && + tiff_bps < 32) // SampleFormat: 0-default(1), 1 - Uint, 2 - Int + maximum = (1 << tiff_bps) - 1; + else if (tiff_ifd[i].sample_format == 3) + maximum = 1; // Defaults for FP + } + raw = i; + is_raw = ifdc; + } + else + is_raw = 0; + } + else + { + // Fix for broken Sony bps tag + if (!strncasecmp(make, "Sony", 4)) + { + for (i = 0; i < (int)tiff_nifds; i++) + { + if (tiff_ifd[i].bps > 33 && tiff_ifd[i].samples == 1) + { + int bps = 14; // default + if (tiff_ifd[i].dng_levels.dng_whitelevel[0] > 0) + { + for(int c = 0,j=1; c < 16; c++, j<<=1) + if (j > (int)tiff_ifd[i].dng_levels.dng_whitelevel[0]) + { + bps = c; break; + } + } + tiff_ifd[i].bps = bps; + } + } + } + + for (i = 0; i < (int)tiff_nifds; i++) + { + if (tiff_ifd[i].t_width < 1 || tiff_ifd[i].t_width > 65535 || + tiff_ifd[i].t_height < 1 || tiff_ifd[i].t_height > 65535) + continue; /* wrong image dimensions */ + if (max_samp < tiff_ifd[i].samples) + max_samp = tiff_ifd[i].samples; + if (max_samp > 3) + max_samp = 3; + + os = unsigned(raw_width) * unsigned(raw_height); + ns = unsigned(tiff_ifd[i].t_width) * unsigned(tiff_ifd[i].t_height); + if (tiff_bps) + { + os *= tiff_bps; + ns *= tiff_ifd[i].bps; + } + /* too complex if below, so separate if to skip RGB+Alpha TIFFs*/ + if (tiff_ifd[i].phint == 2 && tiff_ifd[i].extrasamples > 0 && tiff_ifd[i].samples > 3) + continue; // SKIP RGB+Alpha IFDs + + if (!strncasecmp(make, "Sony", 4) && tiff_ifd[i].bps == 8 && tiff_ifd[i].phint == 6 && tiff_ifd[i].comp == 7 && + tiff_ifd[i].samples == 3 && tiff_ifd[i].newsubfiletype == 1) + continue; // Sony RGB preview + + if ((tiff_ifd[i].comp != 6 || tiff_ifd[i].samples != 3 || + (tiff_ifd[i].comp == 6 && tiff_ifd[i].samples == 3 && !strncasecmp(make, "Sony", 4) && tiff_ifd[i].bps >=12) + ) && + unsigned(tiff_ifd[i].t_width | tiff_ifd[i].t_height) < 0x10000 && + (unsigned)tiff_ifd[i].bps < 33 && + (unsigned)tiff_ifd[i].samples < 13 && ns && + ((ns > os && (ties = 1)) || (ns == os && (int)shot_select == ties++))) + { + raw_width = tiff_ifd[i].t_width; + raw_height = tiff_ifd[i].t_height; + tiff_bps = tiff_ifd[i].bps; + tiff_compress = tiff_ifd[i].comp; + tiff_sampleformat = tiff_ifd[i].sample_format; + data_offset = tiff_ifd[i].offset; + data_size = tiff_ifd[i].bytes; + tiff_flip = tiff_ifd[i].t_flip; + tiff_samples = tiff_ifd[i].samples; + tile_width = tiff_ifd[i].t_tile_width; + tile_length = tiff_ifd[i].t_tile_length; + shutter = tiff_ifd[i].t_shutter; + raw = i; + } + } + if (is_raw == 1 && ties) + is_raw = ties; + } + if (is_NikonTransfer && raw >= 0) + { + if (tiff_ifd[raw].bps == 16) + { + if (tiff_compress == 1) + { + if ((raw_width * raw_height * 3) == (tiff_ifd[raw].bytes << 1)) + { + tiff_bps = tiff_ifd[raw].bps = 12; + } + else + { + tiff_bps = tiff_ifd[raw].bps = 14; + } + } + } + else if (tiff_ifd[raw].bps == 8) + { + if (tiff_compress == 1) + { + is_NikonTransfer = 2; // 8-bit debayered TIFF, like CoolScan NEFs + imgdata.rawparams.coolscan_nef_gamma = 2.2f; + } + } + } + + if (!tile_width) + tile_width = INT_MAX; + if (!tile_length) + tile_length = INT_MAX; + for (i = tiff_nifds; i--;) + if (tiff_ifd[i].t_flip) + tiff_flip = tiff_ifd[i].t_flip; + +#if 0 + if (raw < 0 && is_raw) + is_raw = 0; +#endif + + if (raw >= 0 && !load_raw) + switch (tiff_compress) + { + case 32767: + if (!dng_version && + INT64(tiff_ifd[raw].bytes) == INT64(raw_width) * INT64(raw_height)) + { + tiff_bps = 14; + load_raw = &LibRaw::sony_arw2_load_raw; + break; + } + if (!dng_version && !strncasecmp(make, "Sony", 4) && + INT64(tiff_ifd[raw].bytes) == + INT64(raw_width) * INT64(raw_height) * 2LL) + { + tiff_bps = 14; + load_raw = &LibRaw::unpacked_load_raw; + break; + } + if (INT64(tiff_ifd[raw].bytes) * 8LL != + INT64(raw_width) * INT64(raw_height) * INT64(tiff_bps)) + { + raw_height += 8; + load_raw = &LibRaw::sony_arw_load_raw; + break; + } + load_flags = 79; + case 32769: + load_flags++; + case 32770: + case 32773: + goto slr; + case 0: + case 1: + if (dng_version && tiff_sampleformat == 3 && + (tiff_bps > 8 && (tiff_bps % 8 == 0) && (tiff_bps <= 32))) // only 16,24, and 32 are allowed + { + load_raw = &LibRaw::uncompressed_fp_dng_load_raw; + break; + } + // Sony 14-bit uncompressed + if (!dng_version && !strncasecmp(make, "Sony", 4) && + INT64(tiff_ifd[raw].bytes) == + INT64(raw_width) * INT64(raw_height) * 2LL) + { + tiff_bps = 14; + load_raw = &LibRaw::unpacked_load_raw; + break; + } + if (!dng_version && !strncasecmp(make, "Sony", 4) && + tiff_ifd[raw].samples == 4 && + INT64(tiff_ifd[raw].bytes) == + INT64(raw_width) * INT64(raw_height) * 8LL) // Sony ARQ + { + // maybe to detect ARQ with the following: + // if (tiff_ifd[raw].phint == 32892) + tiff_bps = 14; + tiff_samples = 4; + load_raw = &LibRaw::sony_arq_load_raw; + filters = 0; + strcpy(cdesc, "RGBG"); + break; + } + if (!strncasecmp(make, "Nikon", 5) && + (!strncmp(software, "Nikon Scan", 10) || (is_NikonTransfer == 2) || + strcasestr(model, "COOLSCAN"))) + { + load_raw = &LibRaw::nikon_coolscan_load_raw; + raw_color = 1; + colors = (tiff_samples == 3) ? 3 : 1; + filters = 0; + break; + } + if ((!strncmp(make, "OLYMPUS", 7) || !strncmp(make, "OM Digi", 7) || + (!strncasecmp(make, "CLAUSS", 6) && + !strncasecmp(model, "piX 5oo", 7))) && // 0x5330303539 works here + (INT64(tiff_ifd[raw].bytes) * 2ULL == + INT64(raw_width) * INT64(raw_height) * 3ULL)) + load_flags = 24; + if (!dng_version && INT64(tiff_ifd[raw].bytes) * 5ULL == + INT64(raw_width) * INT64(raw_height) * 8ULL) + { + load_flags = 81; + tiff_bps = 12; + } + slr: + switch (tiff_bps) + { + case 8: + load_raw = &LibRaw::eight_bit_load_raw; + break; + case 12: + if (tiff_ifd[raw].phint == 2) + load_flags = 6; + if (!strncasecmp(make, "NIKON", 5) && + !strncasecmp(model, "COOLPIX A1000", 13) && + data_size == raw_width * raw_height * 2u) + load_raw = &LibRaw::unpacked_load_raw; + else + load_raw = &LibRaw::packed_load_raw; + break; + case 14: + load_flags = 0; + case 16: + load_raw = &LibRaw::unpacked_load_raw; + if ((!strncmp(make, "OLYMPUS", 7) || !strncmp(make, "OM Digi", 7) || + (!strncasecmp(make, "CLAUSS", 6) && + !strncasecmp(model, "piX 5oo", 7))) && // 0x5330303539 works here + (INT64(tiff_ifd[raw].bytes) * 7LL > + INT64(raw_width) * INT64(raw_height))) + load_raw = &LibRaw::olympus_load_raw; + } + break; + case 6: + case 7: + case 99: + if (!dng_version && tiff_compress == 6 && !strcasecmp(make, "SONY")) + { + if (tiff_ifd[raw].phint == 6 && tiff_ifd[raw].bps >= 12 && tiff_ifd[raw].samples == 3) + { + load_raw = &LibRaw::sony_ycbcr_load_raw; + filters = 0; + colors = 3; + } + else + load_raw = &LibRaw::sony_ljpeg_load_raw; + } + // Allow A1/Compression=7 + else if(!dng_version && tiff_compress == 7 && !strcasecmp(make, "SONY") && + (!strcasecmp(model,"ILCE-1") || !strncasecmp(model, "ILCE-7",6) + || !strncasecmp(model, "ILCE-9", 6) // Most likely ILCE-9 will use tiff_compr=7 this w/ updated FW + ) && + tiff_bps == 14 && tiff_samples == 1) + load_raw = &LibRaw::sony_ljpeg_load_raw; + else + load_raw = &LibRaw::lossless_jpeg_load_raw; + break; + case 262: + load_raw = &LibRaw::kodak_262_load_raw; + break; + case 34713: + if ((INT64(raw_width) + 9LL) / 10LL * 16LL * INT64(raw_height) == + INT64(tiff_ifd[raw].bytes)) + { + load_raw = &LibRaw::packed_load_raw; + load_flags = 1; + } + else if (INT64(raw_width) * INT64(raw_height) * 3LL == + INT64(tiff_ifd[raw].bytes) * 2LL) + { + load_raw = &LibRaw::packed_load_raw; + if (model[0] == 'N') + load_flags = 80; + } + else if (INT64(raw_width) * INT64(raw_height) * 3LL == + INT64(tiff_ifd[raw].bytes)) + { + load_raw = &LibRaw::nikon_yuv_load_raw; + gamma_curve(1 / 2.4, 12.92, 1, 4095); + memset(cblack, 0, sizeof cblack); + filters = 0; + } + else if (INT64(raw_width) * INT64(raw_height) * 2LL == + INT64(tiff_ifd[raw].bytes)) + { + load_raw = &LibRaw::unpacked_load_raw; + load_flags = 4; + order = 0x4d4d; + } +#if 0 /* Never used because of same condition above, but need to recheck */ + else if (INT64(raw_width) * INT64(raw_height) * 3LL == + INT64(tiff_ifd[raw].bytes) * 2LL) + { + load_raw = &LibRaw::packed_load_raw; + load_flags = 80; + } +#endif + else if (tiff_ifd[raw].rows_per_strip && + tiff_ifd[raw].strip_offsets_count && + tiff_ifd[raw].strip_offsets_count == + tiff_ifd[raw].strip_byte_counts_count) + { + int fit = 1; + for (int q = 0; q < tiff_ifd[raw].strip_byte_counts_count - 1; + q++) // all but last + if (INT64(tiff_ifd[raw].strip_byte_counts[q]) * 2LL != + INT64(tiff_ifd[raw].rows_per_strip) * INT64(raw_width) * 3LL) + { + fit = 0; + break; + } + if (fit) + load_raw = &LibRaw::nikon_load_striped_packed_raw; + else + load_raw = &LibRaw::nikon_load_raw; // fallback + } + else if ((((INT64(raw_width) * 3LL / 2LL) + 15LL) / 16LL) * 16LL * + INT64(raw_height) == + INT64(tiff_ifd[raw].bytes)) + { + load_raw = &LibRaw::nikon_load_padded_packed_raw; + load_flags = (((INT64(raw_width) * 3ULL / 2ULL) + 15ULL) / 16ULL) * + 16ULL; // bytes per row + } + else if ((!strncmp(model, "NIKON Z 9", 9) || !strncmp(model, "NIKON Z 8", 9)) && tiff_ifd[raw].offset) + { + INT64 pos = ftell(ifp); + unsigned char cmp[] = "CONTACT_INTOPIX"; // 15 + unsigned char buf[16]; + fseek(ifp, INT64(tiff_ifd[raw].offset) + 6LL, SEEK_SET); + fread(buf, 1, 16, ifp); + fseek(ifp, pos, SEEK_SET); + if(!memcmp(buf,cmp,15)) + load_raw = &LibRaw::nikon_he_load_raw_placeholder; + else + load_raw = &LibRaw::nikon_load_raw; + } + else + load_raw = &LibRaw::nikon_load_raw; + break; + case 65535: + load_raw = &LibRaw::pentax_load_raw; + break; + case 65000: + switch (tiff_ifd[raw].phint) + { + case 2: + load_raw = &LibRaw::kodak_rgb_load_raw; + filters = 0; + break; + case 6: + load_raw = &LibRaw::kodak_ycbcr_load_raw; + filters = 0; + break; + case 32803: + load_raw = &LibRaw::kodak_65000_load_raw; + } + case 32867: + case 34892: + break; + case 8: + break; +#ifdef USE_DNGSDK + case 52546: + if (dng_version) + break; /* Compression=9 supported for dng if we compiled with GPR SDK */ + /* Else: fallthrough */ +#endif +#ifdef USE_GPRSDK + case 9: + if (dng_version) + break; /* Compression=9 supported for dng if we compiled with GPR SDK */ + /* Else: fallthrough */ +#endif + default: + is_raw = 0; + } + if (!dng_version) + { + if (((tiff_samples == 3 && tiff_ifd[raw].bytes && + !(tiff_bps == 16 && + !strncmp(make, "Leaf", 4)) && // Allow Leaf/16bit/3color files + !(tiff_ifd[raw].comp == 6 && tiff_ifd[raw].phint == 6 && tiff_bps >= 12 && !strncasecmp(make,"Sony",4)) && // Sony YCbCr + tiff_bps != 14 && + (tiff_compress & -16) != 32768) || + (tiff_bps == 8 && strncmp(make, "Phase", 5) && + strncmp(make, "Leaf", 4) && !strcasestr(make, "Kodak") && + !strstr(model2, "DEBUG RAW"))) && + !strcasestr(model, "COOLSCAN") && strncmp(software, "Nikon Scan", 10) && + is_NikonTransfer != 2) + is_raw = 0; + + if (is_raw && raw >= 0 && tiff_ifd[raw].phint == 2 && tiff_ifd[raw].extrasamples > 0 && tiff_ifd[raw].samples > 3) + is_raw = 0; // SKIP RGB+Alpha IFDs + } + + INT64 fsizecheck = 0ULL; + + if (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_CHECK_THUMBNAILS_ALL_VENDORS) + fsizecheck = ifp->size(); + else if ((imgdata.rawparams.options & LIBRAW_RAWOPTIONS_CHECK_THUMBNAILS_KNOWN_VENDORS) && + (!strncasecmp(make, "Ricoh", 5) || (dng_version && !strncasecmp(make, "Samsung", 7)))) + fsizecheck = ifp->size(); + + for (i = 0; i < (int)tiff_nifds; i++) + if (i != raw && + (tiff_ifd[i].samples == max_samp || + (tiff_ifd[i].comp == 7 && + tiff_ifd[i].samples == 1)) /* Allow 1-bps JPEGs */ + && tiff_ifd[i].bps > 0 && tiff_ifd[i].bps < 33 && + tiff_ifd[i].phint != 32803 && tiff_ifd[i].phint != 34892 && + (tiff_ifd[i].comp != 52546 || (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_ALLOW_JPEGXL_PREVIEWS)) && + unsigned(tiff_ifd[i].t_width | tiff_ifd[i].t_height) < 0x10000 && + tiff_ifd[i].comp != 34892) + { + if (fsizecheck > 0LL) + { + bool ok = true; + if (tiff_ifd[i].strip_byte_counts_count && tiff_ifd[i].strip_offsets_count) + for (int s = 0; s < MIN(tiff_ifd[i].strip_byte_counts_count, tiff_ifd[i].strip_offsets_count); s++) + { + if (tiff_ifd[i].strip_offsets[s] + tiff_ifd[i].strip_byte_counts[s] > fsizecheck) + { + ok = false; + break; + } + } + else if (tiff_ifd[i].bytes > 0) + if (tiff_ifd[i].offset + tiff_ifd[i].bytes > fsizecheck) + ok = false; + + if(!ok) + continue; + } + if ( (INT64(tiff_ifd[i].t_width) * INT64(tiff_ifd[i].t_height) / INT64(SQR(tiff_ifd[i].bps) + 1)) > + (INT64(thumb_width) * INT64(thumb_height) / INT64(SQR(thumb_misc) + 1)) ) + { + + thumb_width = tiff_ifd[i].t_width; + thumb_height = tiff_ifd[i].t_height; + thumb_offset = tiff_ifd[i].offset; + thumb_length = tiff_ifd[i].bytes; + thumb_misc = tiff_ifd[i].bps; + thm = i; + } + if (imgdata.thumbs_list.thumbcount < LIBRAW_THUMBNAIL_MAXCOUNT && tiff_ifd[i].bytes > 0) + { + bool already = false; + for(int idx = 0; idx < imgdata.thumbs_list.thumbcount ; idx++) + if (imgdata.thumbs_list.thumblist[idx].toffset == tiff_ifd[i].offset) + { + already = true; + break; + } + if (!already) + { + int idx = imgdata.thumbs_list.thumbcount; + imgdata.thumbs_list.thumblist[idx].tformat = tiff2thumbformat(tiff_ifd[i].comp, tiff_ifd[i].phint, + tiff_ifd[i].bps, make, dng_version); + imgdata.thumbs_list.thumblist[idx].twidth = tiff_ifd[i].t_width; + imgdata.thumbs_list.thumblist[idx].theight = tiff_ifd[i].t_height; + imgdata.thumbs_list.thumblist[idx].tflip = tiff_ifd[i].t_flip; + imgdata.thumbs_list.thumblist[idx].tlength = tiff_ifd[i].bytes; + imgdata.thumbs_list.thumblist[idx].tmisc = tiff_ifd[i].bps | (tiff_ifd[i].samples << 5); + imgdata.thumbs_list.thumblist[idx].toffset = tiff_ifd[i].offset; + imgdata.thumbs_list.thumbcount++; + } + } + } + if (thm >= 0) + { + thumb_misc |= tiff_ifd[thm].samples << 5; + thumb_format = tiff2thumbformat(tiff_ifd[thm].comp, tiff_ifd[thm].phint, tiff_ifd[thm].bps, make, dng_version); + } +} + +static LibRaw_internal_thumbnail_formats tiff2thumbformat(int _comp, int _phint, int _bps, const char *_make, bool isDNG) +{ + switch (_comp) + { + case 0: + return LIBRAW_INTERNAL_THUMBNAIL_LAYER; + case 1: + if (_bps <= 8) + return LIBRAW_INTERNAL_THUMBNAIL_PPM; + else if (!strncmp(_make, "Imacon", 6)) + return LIBRAW_INTERNAL_THUMBNAIL_PPM16; + else if (isDNG && _phint == 6 && _bps == 12) + return LIBRAW_INTERNAL_THUMBNAIL_DNG_YCBCR; + else + return LIBRAW_INTERNAL_THUMBNAIL_KODAK_THUMB; + case 52546: + return LIBRAW_INTERNAL_THUMBNAIL_JPEGXL; + case 65000: + return _phint == 6 ? LIBRAW_INTERNAL_THUMBNAIL_KODAK_YCBCR : LIBRAW_INTERNAL_THUMBNAIL_KODAK_RGB; + } + return LIBRAW_INTERNAL_THUMBNAIL_JPEG; // default +} diff --git a/rtengine/libraw/src/postprocessing/aspect_ratio.cpp b/rtengine/libraw/src/postprocessing/aspect_ratio.cpp new file mode 100644 index 000000000..e5165e9bf --- /dev/null +++ b/rtengine/libraw/src/postprocessing/aspect_ratio.cpp @@ -0,0 +1,113 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +void LibRaw::fuji_rotate() +{ + int i, row, col; + double step; + float r, c, fr, fc; + unsigned ur, uc; + ushort wide, high, (*img)[4], (*pix)[4]; + + if (!fuji_width) + return; + fuji_width = (fuji_width - 1 + shrink) >> shrink; + step = sqrt(0.5); + wide = fuji_width / step; + high = (height - fuji_width) / step; + + // All real fuji/rotated images are small, so check against max_raw_memory_mb here is safe + if (INT64(wide) * INT64(high) * INT64(sizeof(*img)) > + INT64(imgdata.rawparams.max_raw_memory_mb) * INT64(1024 * 1024)) + throw LIBRAW_EXCEPTION_TOOBIG; + + img = (ushort(*)[4])calloc(high, wide * sizeof *img); + + RUN_CALLBACK(LIBRAW_PROGRESS_FUJI_ROTATE, 0, 2); + + for (row = 0; row < high; row++) + for (col = 0; col < wide; col++) + { + ur = r = fuji_width + (row - col) * step; + uc = c = (row + col) * step; + if (ur > (unsigned)height - 2 || uc > (unsigned)width - 2) + continue; + fr = r - ur; + fc = c - uc; + pix = image + ur * width + uc; + for (i = 0; i < colors; i++) + img[row * wide + col][i] = + (pix[0][i] * (1 - fc) + pix[1][i] * fc) * (1 - fr) + + (pix[width][i] * (1 - fc) + pix[width + 1][i] * fc) * fr; + } + + free(image); + width = wide; + height = high; + image = img; + fuji_width = 0; + RUN_CALLBACK(LIBRAW_PROGRESS_FUJI_ROTATE, 1, 2); +} + +void LibRaw::stretch() +{ + ushort newdim, (*img)[4], *pix0, *pix1; + int row, col, c; + double rc, frac; + + if (pixel_aspect == 1) + return; + RUN_CALLBACK(LIBRAW_PROGRESS_STRETCH, 0, 2); + if (pixel_aspect < 1) + { + newdim = height / pixel_aspect + 0.5; + img = (ushort(*)[4])calloc(width, newdim * sizeof *img); + for (rc = row = 0; row < newdim; row++, rc += pixel_aspect) + { + frac = rc - (c = rc); + pix0 = pix1 = image[c * width]; + if (c + 1 < height) + pix1 += width * 4; + for (col = 0; col < width; col++, pix0 += 4, pix1 += 4) + FORCC img[row * width + col][c] = + pix0[c] * (1 - frac) + pix1[c] * frac + 0.5; + } + height = newdim; + } + else + { + newdim = width * pixel_aspect + 0.5; + img = (ushort(*)[4])calloc(height, newdim * sizeof *img); + for (rc = col = 0; col < newdim; col++, rc += 1 / pixel_aspect) + { + frac = rc - (c = rc); + pix0 = pix1 = image[c]; + if (c + 1 < width) + pix1 += 4; + for (row = 0; row < height; row++, pix0 += width * 4, pix1 += width * 4) + FORCC img[row * newdim + col][c] = + pix0[c] * (1 - frac) + pix1[c] * frac + 0.5; + } + width = newdim; + } + free(image); + image = img; + RUN_CALLBACK(LIBRAW_PROGRESS_STRETCH, 1, 2); +} diff --git a/rtengine/libraw/src/postprocessing/dcraw_process.cpp b/rtengine/libraw/src/postprocessing/dcraw_process.cpp new file mode 100644 index 000000000..8b3d77cf6 --- /dev/null +++ b/rtengine/libraw/src/postprocessing/dcraw_process.cpp @@ -0,0 +1,259 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/libraw_cxx_defs.h" + +int LibRaw::dcraw_process(void) +{ + int quality, i; + + int iterations = -1, dcb_enhance = 1, noiserd = 0; + float preser = 0; + float expos = 1.0; + + CHECK_ORDER_LOW(LIBRAW_PROGRESS_LOAD_RAW); + // CHECK_ORDER_HIGH(LIBRAW_PROGRESS_PRE_INTERPOLATE); + + try + { + + int no_crop = 1; + + if (~O.cropbox[2] && ~O.cropbox[3]) + no_crop = 0; + + libraw_decoder_info_t di; + get_decoder_info(&di); + + bool is_bayer = (imgdata.idata.filters || P1.colors == 1); + int subtract_inline = + !O.bad_pixels && !O.dark_frame && is_bayer && !IO.zero_is_bad; + + int rc = raw2image_ex(subtract_inline); // allocate imgdata.image and copy data! + if (rc != LIBRAW_SUCCESS) + return rc; + + // Adjust sizes + + int save_4color = O.four_color_rgb; + + if (IO.zero_is_bad) + { + remove_zeroes(); + SET_PROC_FLAG(LIBRAW_PROGRESS_REMOVE_ZEROES); + } + + if (O.bad_pixels && no_crop) + { + bad_pixels(O.bad_pixels); + SET_PROC_FLAG(LIBRAW_PROGRESS_BAD_PIXELS); + } + + if (O.dark_frame && no_crop) + { + subtract(O.dark_frame); + SET_PROC_FLAG(LIBRAW_PROGRESS_DARK_FRAME); + } + /* pre subtract black callback: check for it above to disable subtract + * inline */ + + if (callbacks.pre_subtractblack_cb) + (callbacks.pre_subtractblack_cb)(this); + + quality = 2 + !IO.fuji_width; + + if (O.user_qual >= 0) + quality = O.user_qual; + + if (!subtract_inline || !C.data_maximum) + { + adjust_bl(); + subtract_black_internal(); + } + + if (!(di.decoder_flags & LIBRAW_DECODER_FIXEDMAXC)) + adjust_maximum(); + + if (O.user_sat > 0) + C.maximum = O.user_sat; + + if (P1.is_foveon) + { + if (load_raw == &LibRaw::x3f_load_raw) + { + // Filter out zeroes + for (int q = 0; q < S.height * S.width; q++) + { + for (int c = 0; c < 4; c++) + if ((short)imgdata.image[q][c] < 0) + imgdata.image[q][c] = 0; + } + } + SET_PROC_FLAG(LIBRAW_PROGRESS_FOVEON_INTERPOLATE); + } + + if (O.green_matching && !O.half_size) + { + green_matching(); + } + + if (callbacks.pre_scalecolors_cb) + (callbacks.pre_scalecolors_cb)(this); + + if (!O.no_auto_scale) + { + scale_colors(); + SET_PROC_FLAG(LIBRAW_PROGRESS_SCALE_COLORS); + } + + if (callbacks.pre_preinterpolate_cb) + (callbacks.pre_preinterpolate_cb)(this); + + pre_interpolate(); + + SET_PROC_FLAG(LIBRAW_PROGRESS_PRE_INTERPOLATE); + + if (O.dcb_iterations >= 0) + iterations = O.dcb_iterations; + if (O.dcb_enhance_fl >= 0) + dcb_enhance = O.dcb_enhance_fl; + if (O.fbdd_noiserd >= 0) + noiserd = O.fbdd_noiserd; + + /* pre-exposure correction callback */ + + if (O.exp_correc > 0) + { + expos = O.exp_shift; + preser = O.exp_preser; + exp_bef(expos, preser); + } + + if (callbacks.pre_interpolate_cb) + (callbacks.pre_interpolate_cb)(this); + + /* post-exposure correction fallback */ + if (P1.filters && !O.no_interpolation) + { + if (noiserd > 0 && P1.colors == 3 && P1.filters > 1000) + fbdd(noiserd); + + if (P1.filters > 1000 && callbacks.interpolate_bayer_cb) + (callbacks.interpolate_bayer_cb)(this); + else if (P1.filters == 9 && callbacks.interpolate_xtrans_cb) + (callbacks.interpolate_xtrans_cb)(this); + else if (quality == 0) + lin_interpolate(); + else if (quality == 1 || P1.colors > 3) + vng_interpolate(); + else if (quality == 2 && P1.filters > 1000) + ppg_interpolate(); + else if (P1.filters == LIBRAW_XTRANS) + { + // Fuji X-Trans + xtrans_interpolate(quality > 2 ? 3 : 1); + } + else if (quality == 3) + ahd_interpolate(); // really don't need it here due to fallback op + else if (quality == 4) + dcb(iterations, dcb_enhance); + + else if (quality == 11) + dht_interpolate(); + else if (quality == 12) + aahd_interpolate(); + // fallback to AHD + else + { + ahd_interpolate(); + imgdata.process_warnings |= LIBRAW_WARN_FALLBACK_TO_AHD; + } + + SET_PROC_FLAG(LIBRAW_PROGRESS_INTERPOLATE); + } + if (IO.mix_green) + { + for (P1.colors = 3, i = 0; i < S.height * S.width; i++) + imgdata.image[i][1] = (imgdata.image[i][1] + imgdata.image[i][3]) >> 1; + SET_PROC_FLAG(LIBRAW_PROGRESS_MIX_GREEN); + } + + if (callbacks.post_interpolate_cb) + (callbacks.post_interpolate_cb)(this); + else if (!P1.is_foveon && P1.colors == 3 && O.med_passes > 0) + { + median_filter(); + SET_PROC_FLAG(LIBRAW_PROGRESS_MEDIAN_FILTER); + } + + if (O.highlight == 2) + { + blend_highlights(); + SET_PROC_FLAG(LIBRAW_PROGRESS_HIGHLIGHTS); + } + + if (O.highlight > 2) + { + recover_highlights(); + SET_PROC_FLAG(LIBRAW_PROGRESS_HIGHLIGHTS); + } + + if (O.use_fuji_rotate) + { + fuji_rotate(); + SET_PROC_FLAG(LIBRAW_PROGRESS_FUJI_ROTATE); + } + + if (!libraw_internal_data.output_data.histogram) + { + libraw_internal_data.output_data.histogram = + (int(*)[LIBRAW_HISTOGRAM_SIZE])malloc( + sizeof(*libraw_internal_data.output_data.histogram) * 4); + } +#ifndef NO_LCMS + if (O.camera_profile) + { + apply_profile(O.camera_profile, O.output_profile); + SET_PROC_FLAG(LIBRAW_PROGRESS_APPLY_PROFILE); + } +#endif + + if (callbacks.pre_converttorgb_cb) + (callbacks.pre_converttorgb_cb)(this); + + convert_to_rgb(); + SET_PROC_FLAG(LIBRAW_PROGRESS_CONVERT_RGB); + + if (callbacks.post_converttorgb_cb) + (callbacks.post_converttorgb_cb)(this); + + if (O.use_fuji_rotate) + { + stretch(); + SET_PROC_FLAG(LIBRAW_PROGRESS_STRETCH); + } + O.four_color_rgb = save_4color; // also, restore + + return 0; + } + catch (const std::bad_alloc&) + { + recycle(); + return LIBRAW_UNSUFFICIENT_MEMORY; + } + catch (const LibRaw_exceptions& err) + { + EXCEPTION_HANDLER(err); + } +} diff --git a/rtengine/libraw/src/postprocessing/mem_image.cpp b/rtengine/libraw/src/postprocessing/mem_image.cpp new file mode 100644 index 000000000..4c17994df --- /dev/null +++ b/rtengine/libraw/src/postprocessing/mem_image.cpp @@ -0,0 +1,292 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/libraw_cxx_defs.h" + +libraw_processed_image_t *LibRaw::dcraw_make_mem_thumb(int *errcode) +{ + if (!T.thumb) + { + if (!ID.toffset && !(imgdata.thumbnail.tlength > 0 && + load_raw == &LibRaw::broadcom_load_raw) // RPi + ) + { + if (errcode) + *errcode = LIBRAW_NO_THUMBNAIL; + } + else + { + if (errcode) + *errcode = LIBRAW_OUT_OF_ORDER_CALL; + } + return NULL; + } + + if (T.tlength < 64u) + { + if (errcode) + *errcode = EINVAL; + return NULL; + } + + if (INT64(T.tlength) > 1024ULL * 1024ULL * LIBRAW_MAX_THUMBNAIL_MB) + { + if (errcode) + *errcode = LIBRAW_TOO_BIG; + return NULL; + } + + if (T.tformat == LIBRAW_THUMBNAIL_BITMAP) + { + libraw_processed_image_t *ret = (libraw_processed_image_t *)::malloc( + sizeof(libraw_processed_image_t) + T.tlength); + + if (!ret) + { + if (errcode) + *errcode = ENOMEM; + return NULL; + } + + memset(ret, 0, sizeof(libraw_processed_image_t)); + ret->type = LIBRAW_IMAGE_BITMAP; + ret->height = T.theight; + ret->width = T.twidth; + if (T.tcolors > 0 && T.tcolors < 4) + ret->colors = T.tcolors; + else + ret->colors = 3; // defaults + ret->bits = 8; + ret->data_size = T.tlength; + memmove(ret->data, T.thumb, T.tlength); + if (errcode) + *errcode = 0; + return ret; + } + else if (T.tformat == LIBRAW_THUMBNAIL_JPEG) + { + ushort exif[5]; + int mk_exif = 0; + if (strcmp(T.thumb + 6, "Exif")) + mk_exif = 1; + + int dsize = T.tlength + mk_exif * (sizeof(exif) + sizeof(tiff_hdr)); + + libraw_processed_image_t *ret = (libraw_processed_image_t *)::malloc( + sizeof(libraw_processed_image_t) + dsize); + + if (!ret) + { + if (errcode) + *errcode = ENOMEM; + return NULL; + } + + memset(ret, 0, sizeof(libraw_processed_image_t)); + + ret->type = LIBRAW_IMAGE_JPEG; + ret->data_size = dsize; + + ret->data[0] = 0xff; + ret->data[1] = 0xd8; + if (mk_exif) + { + struct tiff_hdr th; + memcpy(exif, "\xff\xe1 Exif\0\0", 10); + exif[1] = htons(8 + sizeof th); + memmove(ret->data + 2, exif, sizeof(exif)); + tiff_head(&th, 0); + memmove(ret->data + (2 + sizeof(exif)), &th, sizeof(th)); + memmove(ret->data + (2 + sizeof(exif) + sizeof(th)), T.thumb + 2, + T.tlength - 2); + } + else + { + memmove(ret->data + 2, T.thumb + 2, T.tlength - 2); + } + if (errcode) + *errcode = 0; + return ret; + } + else + { + if (errcode) + *errcode = LIBRAW_UNSUPPORTED_THUMBNAIL; + return NULL; + } +} + +// jlb +// macros for copying pixels to either BGR or RGB formats +#define FORBGR for (c = P1.colors - 1; c >= 0; c--) +#define FORRGB for (c = 0; c < P1.colors; c++) + +void LibRaw::get_mem_image_format(int *width, int *height, int *colors, + int *bps) const + +{ + *width = S.width; + *height = S.height; + if (imgdata.progress_flags < LIBRAW_PROGRESS_FUJI_ROTATE) + { + if (O.use_fuji_rotate) + { + if (IO.fuji_width) + { + int fuji_width = (IO.fuji_width - 1 + IO.shrink) >> IO.shrink; + *width = (ushort)(fuji_width / sqrt(0.5)); + *height = (ushort)((*height - fuji_width) / sqrt(0.5)); + } + else + { + if (S.pixel_aspect < 0.995) + *height = (ushort)(*height / S.pixel_aspect + 0.5); + if (S.pixel_aspect > 1.005) + *width = (ushort)(*width * S.pixel_aspect + 0.5); + } + } + } + if (S.flip & 4) + { + std::swap(*width, *height); + } + *colors = P1.colors; + *bps = O.output_bps; +} + +int LibRaw::copy_mem_image(void *scan0, int stride, int bgr) + +{ + // the image memory pointed to by scan0 is assumed to be in the format + // returned by get_mem_image_format + if ((imgdata.progress_flags & LIBRAW_PROGRESS_THUMB_MASK) < + LIBRAW_PROGRESS_PRE_INTERPOLATE) + return LIBRAW_OUT_OF_ORDER_CALL; + + if (libraw_internal_data.output_data.histogram) + { + int perc, val, total, t_white = 0x2000, c; + perc = S.width * S.height * O.auto_bright_thr; + if (IO.fuji_width) + perc /= 2; + if (!((O.highlight & ~2) || O.no_auto_bright)) + for (t_white = c = 0; c < P1.colors; c++) + { + for (val = 0x2000, total = 0; --val > 32;) + if ((total += libraw_internal_data.output_data.histogram[c][val]) > + perc) + break; + if (t_white < val) + t_white = val; + } + gamma_curve(O.gamm[0], O.gamm[1], 2, (t_white << 3) / O.bright); + } + + int s_iheight = S.iheight; + int s_iwidth = S.iwidth; + int s_width = S.width; + int s_hwight = S.height; + + S.iheight = S.height; + S.iwidth = S.width; + + if (S.flip & 4) + SWAP(S.height, S.width); + uchar *ppm; + ushort *ppm2; + int c, row, col, soff, rstep, cstep; + + soff = flip_index(0, 0); + cstep = flip_index(0, 1) - soff; + rstep = flip_index(1, 0) - flip_index(0, S.width); + + for (row = 0; row < S.height; row++, soff += rstep) + { + uchar *bufp = ((uchar *)scan0) + row * stride; + ppm2 = (ushort *)(ppm = bufp); + // keep trivial decisions in the outer loop for speed + if (bgr) + { + if (O.output_bps == 8) + { + for (col = 0; col < S.width; col++, soff += cstep) + FORBGR *ppm++ = imgdata.color.curve[imgdata.image[soff][c]] >> 8; + } + else + { + for (col = 0; col < S.width; col++, soff += cstep) + FORBGR *ppm2++ = imgdata.color.curve[imgdata.image[soff][c]]; + } + } + else + { + if (O.output_bps == 8) + { + for (col = 0; col < S.width; col++, soff += cstep) + FORRGB *ppm++ = imgdata.color.curve[imgdata.image[soff][c]] >> 8; + } + else + { + for (col = 0; col < S.width; col++, soff += cstep) + FORRGB *ppm2++ = imgdata.color.curve[imgdata.image[soff][c]]; + } + } + + // bufp += stride; // go to the next line + } + + S.iheight = s_iheight; + S.iwidth = s_iwidth; + S.width = s_width; + S.height = s_hwight; + + return 0; +} +#undef FORBGR +#undef FORRGB + +libraw_processed_image_t *LibRaw::dcraw_make_mem_image(int *errcode) + +{ + int width, height, colors, bps; + get_mem_image_format(&width, &height, &colors, &bps); + int stride = width * (bps / 8) * colors; + unsigned ds = height * stride; + libraw_processed_image_t *ret = (libraw_processed_image_t *)::malloc( + sizeof(libraw_processed_image_t) + ds); + if (!ret) + { + if (errcode) + *errcode = ENOMEM; + return NULL; + } + memset(ret, 0, sizeof(libraw_processed_image_t)); + + // metadata init + ret->type = LIBRAW_IMAGE_BITMAP; + ret->height = height; + ret->width = width; + ret->colors = colors; + ret->bits = bps; + ret->data_size = ds; + copy_mem_image(ret->data, stride, 0); + + return ret; +} + +void LibRaw::dcraw_clear_mem(libraw_processed_image_t *p) +{ + if (p) + ::free(p); +} diff --git a/rtengine/libraw/src/postprocessing/postprocessing_aux.cpp b/rtengine/libraw/src/postprocessing/postprocessing_aux.cpp new file mode 100644 index 000000000..e0fd33521 --- /dev/null +++ b/rtengine/libraw/src/postprocessing/postprocessing_aux.cpp @@ -0,0 +1,413 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +void LibRaw::hat_transform(float *temp, float *base, int st, int size, int sc) +{ + int i; + for (i = 0; i < sc; i++) + temp[i] = 2 * base[st * i] + base[st * (sc - i)] + base[st * (i + sc)]; + for (; i + sc < size; i++) + temp[i] = 2 * base[st * i] + base[st * (i - sc)] + base[st * (i + sc)]; + for (; i < size; i++) + temp[i] = 2 * base[st * i] + base[st * (i - sc)] + + base[st * (2 * size - 2 - (i + sc))]; +} + +#if !defined(LIBRAW_USE_OPENMP) +void LibRaw::wavelet_denoise() +{ + float *fimg = 0, *temp, thold, mul[2], avg, diff; + int scale = 1, size, lev, hpass, lpass, row, col, nc, c, i, wlast, blk[2]; + ushort *window[4]; + static const float noise[] = {0.8002f, 0.2735f, 0.1202f, 0.0585f, + 0.0291f, 0.0152f, 0.0080f, 0.0044f}; + + if (iwidth < 65 || iheight < 65) return; + + while (maximum << scale < 0x10000) + scale++; + maximum <<= --scale; + black <<= scale; + FORC4 cblack[c] <<= scale; + if ((size = iheight * iwidth) < 0x15550000) + fimg = (float *)malloc((size * 3 + iheight + iwidth + 128) * sizeof *fimg); + temp = fimg + size * 3; + if ((nc = colors) == 3 && filters) + nc++; + FORC(nc) + { /* denoise R,G1,B,G3 individually */ + for (i = 0; i < size; i++) + fimg[i] = 256 * sqrt((double)(image[i][c] << scale)); + for (hpass = lev = 0; lev < 5; lev++) + { + lpass = size * ((lev & 1) + 1); + for (row = 0; row < iheight; row++) + { + hat_transform(temp, fimg + hpass + row * iwidth, 1, iwidth, 1 << lev); + for (col = 0; col < iwidth; col++) + fimg[lpass + row * iwidth + col] = temp[col] * 0.25; + } + for (col = 0; col < iwidth; col++) + { + hat_transform(temp, fimg + lpass + col, iwidth, iheight, 1 << lev); + for (row = 0; row < iheight; row++) + fimg[lpass + row * iwidth + col] = temp[row] * 0.25; + } + thold = threshold * noise[lev]; + for (i = 0; i < size; i++) + { + fimg[hpass + i] -= fimg[lpass + i]; + if (fimg[hpass + i] < -thold) + fimg[hpass + i] += thold; + else if (fimg[hpass + i] > thold) + fimg[hpass + i] -= thold; + else + fimg[hpass + i] = 0; + if (hpass) + fimg[i] += fimg[hpass + i]; + } + hpass = lpass; + } + for (i = 0; i < size; i++) + image[i][c] = CLIP(SQR(fimg[i] + fimg[lpass + i]) / 0x10000); + } + if (filters && colors == 3) + { /* pull G1 and G3 closer together */ + for (row = 0; row < 2; row++) + { + mul[row] = 0.125 * pre_mul[FC(row + 1, 0) | 1] / pre_mul[FC(row, 0) | 1]; + blk[row] = cblack[FC(row, 0) | 1]; + } + for (i = 0; i < 4; i++) + window[i] = (ushort *)fimg + width * i; + for (wlast = -1, row = 1; row < height - 1; row++) + { + while (wlast < row + 1) + { + for (wlast++, i = 0; i < 4; i++) + window[(i + 3) & 3] = window[i]; + for (col = FC(wlast, 1) & 1; col < width; col += 2) + window[2][col] = BAYER(wlast, col); + } + thold = threshold / 512; + for (col = (FC(row, 0) & 1) + 1; col < width - 1; col += 2) + { + avg = (window[0][col - 1] + window[0][col + 1] + window[2][col - 1] + + window[2][col + 1] - blk[~row & 1] * 4) * + mul[row & 1] + + (window[1][col] + blk[row & 1]) * 0.5; + avg = avg < 0 ? 0 : sqrt(avg); + diff = sqrt((double)BAYER(row, col)) - avg; + if (diff < -thold) + diff += thold; + else if (diff > thold) + diff -= thold; + else + diff = 0; + BAYER(row, col) = CLIP(SQR(avg + diff) + 0.5); + } + } + } + free(fimg); +} +#else /* LIBRAW_USE_OPENMP */ +void LibRaw::wavelet_denoise() +{ + float *fimg = 0, *temp, thold, mul[2], avg, diff; + int scale = 1, size, lev, hpass, lpass, row, col, nc, c, i, wlast, blk[2]; + ushort *window[4]; + static const float noise[] = {0.8002, 0.2735, 0.1202, 0.0585, + 0.0291, 0.0152, 0.0080, 0.0044}; + + if (iwidth < 65 || iheight < 65) + return; + + while (maximum << scale < 0x10000) + scale++; + maximum <<= --scale; + black <<= scale; + FORC4 cblack[c] <<= scale; + if ((size = iheight * iwidth) < 0x15550000) + fimg = (float *)malloc((size * 3 + iheight + iwidth) * sizeof *fimg); + temp = fimg + size * 3; + if ((nc = colors) == 3 && filters) + nc++; +#pragma omp parallel default(shared) private( \ + i, col, row, thold, lev, lpass, hpass, temp, c) firstprivate(scale, size) + { + temp = (float *)malloc((iheight + iwidth) * sizeof *fimg); + FORC(nc) + { /* denoise R,G1,B,G3 individually */ +#pragma omp for + for (i = 0; i < size; i++) + fimg[i] = 256 * sqrt((double)(image[i][c] << scale)); + for (hpass = lev = 0; lev < 5; lev++) + { + lpass = size * ((lev & 1) + 1); +#pragma omp for + for (row = 0; row < iheight; row++) + { + hat_transform(temp, fimg + hpass + row * iwidth, 1, iwidth, 1 << lev); + for (col = 0; col < iwidth; col++) + fimg[lpass + row * iwidth + col] = temp[col] * 0.25; + } +#pragma omp for + for (col = 0; col < iwidth; col++) + { + hat_transform(temp, fimg + lpass + col, iwidth, iheight, 1 << lev); + for (row = 0; row < iheight; row++) + fimg[lpass + row * iwidth + col] = temp[row] * 0.25; + } + thold = threshold * noise[lev]; +#pragma omp for + for (i = 0; i < size; i++) + { + fimg[hpass + i] -= fimg[lpass + i]; + if (fimg[hpass + i] < -thold) + fimg[hpass + i] += thold; + else if (fimg[hpass + i] > thold) + fimg[hpass + i] -= thold; + else + fimg[hpass + i] = 0; + if (hpass) + fimg[i] += fimg[hpass + i]; + } + hpass = lpass; + } +#pragma omp for + for (i = 0; i < size; i++) + image[i][c] = CLIP(SQR(fimg[i] + fimg[lpass + i]) / 0x10000); + } + free(temp); + } /* end omp parallel */ + /* the following loops are hard to parallelize, no idea yes, + * problem is wlast which is carrying dependency + * second part should be easier, but did not yet get it right. + */ + if (filters && colors == 3) + { /* pull G1 and G3 closer together */ + for (row = 0; row < 2; row++) + { + mul[row] = 0.125 * pre_mul[FC(row + 1, 0) | 1] / pre_mul[FC(row, 0) | 1]; + blk[row] = cblack[FC(row, 0) | 1]; + } + for (i = 0; i < 4; i++) + window[i] = (ushort *)fimg + width * i; + for (wlast = -1, row = 1; row < height - 1; row++) + { + while (wlast < row + 1) + { + for (wlast++, i = 0; i < 4; i++) + window[(i + 3) & 3] = window[i]; + for (col = FC(wlast, 1) & 1; col < width; col += 2) + window[2][col] = BAYER(wlast, col); + } + thold = threshold / 512; + for (col = (FC(row, 0) & 1) + 1; col < width - 1; col += 2) + { + avg = (window[0][col - 1] + window[0][col + 1] + window[2][col - 1] + + window[2][col + 1] - blk[~row & 1] * 4) * + mul[row & 1] + + (window[1][col] + blk[row & 1]) * 0.5; + avg = avg < 0 ? 0 : sqrt(avg); + diff = sqrt((double)BAYER(row, col)) - avg; + if (diff < -thold) + diff += thold; + else if (diff > thold) + diff -= thold; + else + diff = 0; + BAYER(row, col) = CLIP(SQR(avg + diff) + 0.5); + } + } + } + free(fimg); +} + +#endif +void LibRaw::median_filter() +{ + ushort(*pix)[4]; + int pass, c, i, j, k, med[9]; + static const uchar opt[] = /* Optimal 9-element median search */ + {1, 2, 4, 5, 7, 8, 0, 1, 3, 4, 6, 7, 1, 2, 4, 5, 7, 8, 0, + 3, 5, 8, 4, 7, 3, 6, 1, 4, 2, 5, 4, 7, 4, 2, 6, 4, 4, 2}; + + for (pass = 1; pass <= med_passes; pass++) + { + RUN_CALLBACK(LIBRAW_PROGRESS_MEDIAN_FILTER, pass - 1, med_passes); + for (c = 0; c < 3; c += 2) + { + for (pix = image; pix < image + width * height; pix++) + pix[0][3] = pix[0][c]; + for (pix = image + width; pix < image + width * (height - 1); pix++) + { + if ((pix - image + 1) % width < 2) + continue; + for (k = 0, i = -width; i <= width; i += width) + for (j = i - 1; j <= i + 1; j++) + med[k++] = pix[j][3] - pix[j][1]; + for (i = 0; i < int(sizeof opt); i += 2) + if (med[opt[i]] > med[opt[i + 1]]) + SWAP(med[opt[i]], med[opt[i + 1]]); + pix[0][c] = CLIP(med[4] + pix[0][1]); + } + } + } +} + +void LibRaw::blend_highlights() +{ + int clip = INT_MAX, row, col, c, i, j; + static const float trans[2][4][4] = { + {{1, 1, 1}, {1.7320508f, -1.7320508f, 0}, {-1, -1, 2}}, + {{1, 1, 1, 1}, {1, -1, 1, -1}, {1, 1, -1, -1}, {1, -1, -1, 1}}}; + static const float itrans[2][4][4] = { + {{1, 0.8660254f, -0.5}, {1, -0.8660254f, -0.5}, {1, 0, 1}}, + {{1, 1, 1, 1}, {1, -1, 1, -1}, {1, 1, -1, -1}, {1, -1, -1, 1}}}; + float cam[2][4], lab[2][4], sum[2], chratio; + + if ((unsigned)(colors - 3) > 1) + return; + RUN_CALLBACK(LIBRAW_PROGRESS_HIGHLIGHTS, 0, 2); + FORCC if (clip > (i = 65535 * pre_mul[c])) clip = i; + for (row = 0; row < height; row++) + for (col = 0; col < width; col++) + { + FORCC if (image[row * width + col][c] > clip) break; + if (c == colors) + continue; + FORCC + { + cam[0][c] = image[row * width + col][c]; + cam[1][c] = MIN(cam[0][c], clip); + } + for (i = 0; i < 2; i++) + { + FORCC for (lab[i][c] = j = 0; j < colors; j++) lab[i][c] += + trans[colors - 3][c][j] * cam[i][j]; + for (sum[i] = 0, c = 1; c < colors; c++) + sum[i] += SQR(lab[i][c]); + } + chratio = sqrt(sum[1] / sum[0]); + for (c = 1; c < colors; c++) + lab[0][c] *= chratio; + FORCC for (cam[0][c] = j = 0; j < colors; j++) cam[0][c] += + itrans[colors - 3][c][j] * lab[0][j]; + FORCC image[row * width + col][c] = cam[0][c] / colors; + } + RUN_CALLBACK(LIBRAW_PROGRESS_HIGHLIGHTS, 1, 2); +} + +#define SCALE (4 >> shrink) +void LibRaw::recover_highlights() +{ + float *map, sum, wgt, grow; + int hsat[4], count, spread, change, val, i; + unsigned high, wide, mrow, mcol, row, col, kc, c, d, y, x; + ushort *pixel; + static const signed char dir[8][2] = {{-1, -1}, {-1, 0}, {-1, 1}, {0, 1}, + {1, 1}, {1, 0}, {1, -1}, {0, -1}}; + + grow = pow(2.0, 4 - highlight); + FORC(unsigned(colors)) hsat[c] = 32000 * pre_mul[c]; + FORC(unsigned(colors)) + if(hsat[c]<1) + return; + for (kc = 0, c = 1; c < (unsigned)colors; c++) + if (pre_mul[kc] < pre_mul[c]) + kc = c; + high = height / SCALE; + wide = width / SCALE; + map = (float *)calloc(high, wide * sizeof *map); + FORC(unsigned(colors)) if (c != kc) + { + RUN_CALLBACK(LIBRAW_PROGRESS_HIGHLIGHTS, c - 1, colors - 1); + memset(map, 0, high * wide * sizeof *map); + for (mrow = 0; mrow < high; mrow++) + for (mcol = 0; mcol < wide; mcol++) + { + sum = wgt = count = 0; + for (row = mrow * SCALE; row < (mrow + 1) * SCALE; row++) + for (col = mcol * SCALE; col < (mcol + 1) * SCALE; col++) + { + pixel = image[row * width + col]; + if (pixel[c] / hsat[c] == 1 && pixel[kc] > 24000) + { + sum += pixel[c]; + wgt += pixel[kc]; + count++; + } + } + if (count == SCALE * SCALE) + map[mrow * wide + mcol] = sum / wgt; + } + for (spread = 32 / grow; spread--;) + { + for (mrow = 0; mrow < high; mrow++) + for (mcol = 0; mcol < wide; mcol++) + { + if (map[mrow * wide + mcol]) + continue; + sum = count = 0; + for (d = 0; d < 8; d++) + { + y = mrow + dir[d][0]; + x = mcol + dir[d][1]; + if (y < high && x < wide && map[y * wide + x] > 0) + { + sum += (1 + (d & 1)) * map[y * wide + x]; + count += 1 + (d & 1); + } + } + if (count > 3) + map[mrow * wide + mcol] = -(sum + grow) / (count + grow); + } + for (change = i = 0; i < int(high * wide); i++) + if (map[i] < 0) + { + map[i] = -map[i]; + change = 1; + } + if (!change) + break; + } + for (i = 0; i < int(high * wide); i++) + if (map[i] == 0) + map[i] = 1; + for (mrow = 0; mrow < high; mrow++) + for (mcol = 0; mcol < wide; mcol++) + { + for (row = mrow * SCALE; row < (mrow + 1) * SCALE; row++) + for (col = mcol * SCALE; col < (mcol + 1) * SCALE; col++) + { + pixel = image[row * width + col]; + if (pixel[c] / hsat[c] > 1) + { + val = pixel[kc] * map[mrow * wide + mcol]; + if (pixel[c] < val) + pixel[c] = CLIP(val); + } + } + } + } + free(map); +} +#undef SCALE diff --git a/rtengine/libraw/src/postprocessing/postprocessing_ph.cpp b/rtengine/libraw/src/postprocessing/postprocessing_ph.cpp new file mode 100644 index 000000000..4e2947402 --- /dev/null +++ b/rtengine/libraw/src/postprocessing/postprocessing_ph.cpp @@ -0,0 +1,31 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + Placeholder functions to build LibRaw w/o postprocessing tools + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/libraw_cxx_defs.h" + +int LibRaw::dcraw_process(void) +{ + return LIBRAW_NOT_IMPLEMENTED; +} + +void LibRaw::fuji_rotate() {} +void LibRaw::convert_to_rgb_loop(float /*out_cam*/ [3][4]) {} +libraw_processed_image_t *LibRaw::dcraw_make_mem_image(int *) { + return NULL; +} +libraw_processed_image_t *LibRaw::dcraw_make_mem_thumb(int *){ return NULL;} +void LibRaw::lin_interpolate_loop(int * /*code*/, int /*size*/) {} +void LibRaw::scale_colors_loop(float /*scale_mul*/[4]) {} diff --git a/rtengine/libraw/src/postprocessing/postprocessing_utils.cpp b/rtengine/libraw/src/postprocessing/postprocessing_utils.cpp new file mode 100644 index 000000000..f944adb4c --- /dev/null +++ b/rtengine/libraw/src/postprocessing/postprocessing_utils.cpp @@ -0,0 +1,190 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/libraw_cxx_defs.h" + +#define TBLN 65535 + +void LibRaw::exp_bef(float shift, float smooth) +{ + // params limits + if (shift > 8) + shift = 8; + if (shift < 0.25) + shift = 0.25; + if (smooth < 0.0) + smooth = 0.0; + if (smooth > 1.0) + smooth = 1.0; + + unsigned short *lut = (ushort *)malloc((TBLN + 1) * sizeof(unsigned short)); + + if (shift <= 1.0) + { + for (int i = 0; i <= TBLN; i++) + lut[i] = (unsigned short)((float)i * shift); + } + else + { + float x1, x2, y1, y2; + + float cstops = log(shift) / log(2.0f); + float room = cstops * 2; + float roomlin = powf(2.0f, room); + x2 = (float)TBLN; + x1 = (x2 + 1) / roomlin - 1; + y1 = x1 * shift; + y2 = x2 * (1 + (1 - smooth) * (shift - 1)); + float sq3x = powf(x1 * x1 * x2, 1.0f / 3.0f); + float B = (y2 - y1 + shift * (3 * x1 - 3.0f * sq3x)) / + (x2 + 2.0f * x1 - 3.0f * sq3x); + float A = (shift - B) * 3.0f * powf(x1 * x1, 1.0f / 3.0f); + float CC = y2 - A * powf(x2, 1.0f / 3.0f) - B * x2; + for (int i = 0; i <= TBLN; i++) + { + float X = (float)i; + float Y = A * powf(X, 1.0f / 3.0f) + B * X + CC; + if (i < x1) + lut[i] = (unsigned short)((float)i * shift); + else + lut[i] = Y < 0 ? 0 : (Y > TBLN ? TBLN : (unsigned short)(Y)); + } + } + for (int i = 0; i < S.height * S.width; i++) + { + imgdata.image[i][0] = lut[imgdata.image[i][0]]; + imgdata.image[i][1] = lut[imgdata.image[i][1]]; + imgdata.image[i][2] = lut[imgdata.image[i][2]]; + imgdata.image[i][3] = lut[imgdata.image[i][3]]; + } + + if (C.data_maximum <= TBLN) + C.data_maximum = lut[C.data_maximum]; + if (C.maximum <= TBLN) + C.maximum = lut[C.maximum]; + free(lut); +} + +void LibRaw::convert_to_rgb_loop(float out_cam[3][4]) +{ + int row, col, c; + float out[3]; + ushort *img; + memset(libraw_internal_data.output_data.histogram, 0, + sizeof(int) * LIBRAW_HISTOGRAM_SIZE * 4); + if (libraw_internal_data.internal_output_params.raw_color) + { + for (img = imgdata.image[0], row = 0; row < S.height; row++) + { + for (col = 0; col < S.width; col++, img += 4) + { + for (c = 0; c < imgdata.idata.colors; c++) + { + libraw_internal_data.output_data.histogram[c][img[c] >> 3]++; + } + } + } + } + else if (imgdata.idata.colors == 3) + { + for (img = imgdata.image[0], row = 0; row < S.height; row++) + { + for (col = 0; col < S.width; col++, img += 4) + { + out[0] = out_cam[0][0] * img[0] + out_cam[0][1] * img[1] + + out_cam[0][2] * img[2]; + out[1] = out_cam[1][0] * img[0] + out_cam[1][1] * img[1] + + out_cam[1][2] * img[2]; + out[2] = out_cam[2][0] * img[0] + out_cam[2][1] * img[1] + + out_cam[2][2] * img[2]; + img[0] = CLIP((int)out[0]); + img[1] = CLIP((int)out[1]); + img[2] = CLIP((int)out[2]); + libraw_internal_data.output_data.histogram[0][img[0] >> 3]++; + libraw_internal_data.output_data.histogram[1][img[1] >> 3]++; + libraw_internal_data.output_data.histogram[2][img[2] >> 3]++; + } + } + } + else if (imgdata.idata.colors == 4) + { + for (img = imgdata.image[0], row = 0; row < S.height; row++) + { + for (col = 0; col < S.width; col++, img += 4) + { + out[0] = out_cam[0][0] * img[0] + out_cam[0][1] * img[1] + + out_cam[0][2] * img[2] + out_cam[0][3] * img[3]; + out[1] = out_cam[1][0] * img[0] + out_cam[1][1] * img[1] + + out_cam[1][2] * img[2] + out_cam[1][3] * img[3]; + out[2] = out_cam[2][0] * img[0] + out_cam[2][1] * img[1] + + out_cam[2][2] * img[2] + out_cam[2][3] * img[3]; + img[0] = CLIP((int)out[0]); + img[1] = CLIP((int)out[1]); + img[2] = CLIP((int)out[2]); + libraw_internal_data.output_data.histogram[0][img[0] >> 3]++; + libraw_internal_data.output_data.histogram[1][img[1] >> 3]++; + libraw_internal_data.output_data.histogram[2][img[2] >> 3]++; + libraw_internal_data.output_data.histogram[3][img[3] >> 3]++; + } + } + } +} + +void LibRaw::scale_colors_loop(float scale_mul[4]) +{ + unsigned size = S.iheight * S.iwidth; + + if (C.cblack[4] && C.cblack[5]) + { + int val; + for (unsigned i = 0; i < size; i++) + { + for (unsigned c = 0; c < 4; c++) + { + if (!(val = imgdata.image[i][c])) continue; + val -= C.cblack[6 + i / S.iwidth % C.cblack[4] * C.cblack[5] + + i % S.iwidth % C.cblack[5]]; + val -= C.cblack[c]; + val *= scale_mul[c]; + imgdata.image[i][c] = CLIP(val); + } + } + } + else if (C.cblack[0] || C.cblack[1] || C.cblack[2] || C.cblack[3]) + { + for (unsigned i = 0; i < size; i++) + { + for (unsigned c = 0; c < 4; c++) + { + int val = imgdata.image[i][c]; + if (!val) continue; + val -= C.cblack[c]; + val *= scale_mul[c]; + imgdata.image[i][c] = CLIP(val); + } + } + } + else // BL is zero + { + for (unsigned i = 0; i < size; i++) + { + for (unsigned c = 0; c < 4; c++) + { + int val = imgdata.image[i][c]; + val *= scale_mul[c]; + imgdata.image[i][c] = CLIP(val); + } + } + } +} diff --git a/rtengine/libraw/src/postprocessing/postprocessing_utils_dcrdefs.cpp b/rtengine/libraw/src/postprocessing/postprocessing_utils_dcrdefs.cpp new file mode 100644 index 000000000..cddc292ab --- /dev/null +++ b/rtengine/libraw/src/postprocessing/postprocessing_utils_dcrdefs.cpp @@ -0,0 +1,308 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +void LibRaw::convert_to_rgb() +{ + float out_cam[3][4]; + double num, inverse[3][3]; + static const double(*out_rgb[])[3] = { + LibRaw_constants::rgb_rgb, LibRaw_constants::adobe_rgb, + LibRaw_constants::wide_rgb, LibRaw_constants::prophoto_rgb, + LibRaw_constants::xyz_rgb, LibRaw_constants::aces_rgb, + LibRaw_constants::dcip3d65_rgb, LibRaw_constants::rec2020_rgb}; + static const char *name[] = {"sRGB", "Adobe RGB (1998)", + "WideGamut D65", "ProPhoto D65", + "XYZ", "ACES", + "DCI-P3 D65", "Rec. 2020"}; + static const unsigned phead[] = { + 1024, 0, 0x2100000, 0x6d6e7472, 0x52474220, 0x58595a20, 0, + 0, 0, 0x61637370, 0, 0, 0x6e6f6e65, 0, + 0, 0, 0, 0xf6d6, 0x10000, 0xd32d}; + unsigned pbody[] = {10, 0x63707274, 0, 36, /* cprt */ + 0x64657363, 0, 60, /* desc, len is strlen(longest_string) + 12 */ + 0x77747074, 0, 20, /* wtpt */ + 0x626b7074, 0, 20, /* bkpt */ + 0x72545243, 0, 14, /* rTRC */ + 0x67545243, 0, 14, /* gTRC */ + 0x62545243, 0, 14, /* bTRC */ + 0x7258595a, 0, 20, /* rXYZ */ + 0x6758595a, 0, 20, /* gXYZ */ + 0x6258595a, 0, 20}; /* bXYZ */ + static const unsigned pwhite[] = {0xf351, 0x10000, 0x116cc}; + unsigned pcurve[] = {0x63757276, 0, 1, 0x1000000}; + + RUN_CALLBACK(LIBRAW_PROGRESS_CONVERT_RGB, 0, 2); + + gamma_curve(gamm[0], gamm[1], 0, 0); + memcpy(out_cam, rgb_cam, sizeof out_cam); + raw_color |= colors == 1 || output_color < 1 || output_color > 8; + if (!raw_color) + { + size_t prof_desc_len; + std::vector prof_desc; + int i, j, k; + prof_desc_len = snprintf(NULL, 0, "%s gamma %g toe slope %g", name[output_color - 1], + floorf(1000.f / gamm[0] + .5f) / 1000.f, floorf(gamm[1] * 1000.0f + .5f) / 1000.f) + + 1; + prof_desc.resize(prof_desc_len); + sprintf(prof_desc.data(), "%s gamma %g toe slope %g", name[output_color - 1], floorf(1000.f / gamm[0] + .5f) / 1000.f, + floorf(gamm[1] * 1000.0f + .5f) / 1000.f); + + oprof = (unsigned *)calloc(phead[0], 1); + memcpy(oprof, phead, sizeof phead); + if (output_color == 5) + oprof[4] = oprof[5]; + oprof[0] = 132 + 12 * pbody[0]; + for (i = 0; i < (int)pbody[0]; i++) + { + oprof[oprof[0] / 4] = i ? (i > 1 ? 0x58595a20 : 0x64657363) : 0x74657874; + pbody[i * 3 + 2] = oprof[0]; + oprof[0] += (pbody[i * 3 + 3] + 3) & -4; + } + memcpy(oprof + 32, pbody, sizeof pbody); + oprof[pbody[5] / 4 + 2] = unsigned(prof_desc_len + 1); + memcpy((char *)oprof + pbody[8] + 8, pwhite, sizeof pwhite); + pcurve[3] = (short)(256 / gamm[5] + 0.5) << 16; + for (i = 4; i < 7; i++) + memcpy((char *)oprof + pbody[i * 3 + 2], pcurve, sizeof pcurve); + pseudoinverse((double(*)[3])out_rgb[output_color - 1], inverse, 3); + for (i = 0; i < 3; i++) + for (j = 0; j < 3; j++) + { + for (num = k = 0; k < 3; k++) + num += LibRaw_constants::xyzd50_srgb[i][k] * inverse[j][k]; + oprof[pbody[j * 3 + 23] / 4 + i + 2] = num * 0x10000 + 0.5; + } + for (i = 0; i < (int)phead[0] / 4; i++) + oprof[i] = htonl(oprof[i]); + strcpy((char *)oprof + pbody[2] + 8, "auto-generated by dcraw"); + if (pbody[5] + 12 + prof_desc.size() < phead[0]) + strcpy((char *)oprof + pbody[5] + 12, prof_desc.data()); + for (i = 0; i < 3; i++) + for (j = 0; j < colors; j++) + for (out_cam[i][j] = k = 0; k < 3; k++) + out_cam[i][j] += out_rgb[output_color - 1][i][k] * rgb_cam[k][j]; + } + convert_to_rgb_loop(out_cam); + + if (colors == 4 && output_color) + colors = 3; + + RUN_CALLBACK(LIBRAW_PROGRESS_CONVERT_RGB, 1, 2); +} + +void LibRaw::scale_colors() +{ + unsigned bottom, right, size, row, col, ur, uc, i, x, y, c, sum[8]; + int val; + double dsum[8], dmin, dmax; + float scale_mul[4], fr, fc; + ushort *img = 0, *pix; + + RUN_CALLBACK(LIBRAW_PROGRESS_SCALE_COLORS, 0, 2); + + if (user_mul[0]) + memcpy(pre_mul, user_mul, sizeof pre_mul); + if (use_auto_wb || (use_camera_wb && + (cam_mul[0] < -0.5 // LibRaw 0.19 and older: fallback to auto only if cam_mul[0] is set to -1 + || (cam_mul[0] <= 0.00001f // New default: fallback to auto if no cam_mul parsed from metadata + && !(imgdata.rawparams.options & LIBRAW_RAWOPTIONS_CAMERAWB_FALLBACK_TO_DAYLIGHT)) + ))) + { + memset(dsum, 0, sizeof dsum); + bottom = MIN(greybox[1] + greybox[3], height); + right = MIN(greybox[0] + greybox[2], width); + for (row = greybox[1]; row < bottom; row += 8) + for (col = greybox[0]; col < right; col += 8) + { + memset(sum, 0, sizeof sum); + for (y = row; y < row + 8 && y < bottom; y++) + for (x = col; x < col + 8 && x < right; x++) + FORC4 + { + if (filters) + { + c = fcol(y, x); + val = BAYER2(y, x); + } + else + val = image[y * width + x][c]; + if (val > (int)maximum - 25) + goto skip_block; + if ((val -= cblack[c]) < 0) + val = 0; + sum[c] += val; + sum[c + 4]++; + if (filters) + break; + } + FORC(8) dsum[c] += sum[c]; + skip_block:; + } + FORC4 if (dsum[c]) pre_mul[c] = dsum[c + 4] / dsum[c]; + } + if (use_camera_wb && cam_mul[0] > 0.00001f) + { + memset(sum, 0, sizeof sum); + for (row = 0; row < 8; row++) + for (col = 0; col < 8; col++) + { + c = FC(row, col); + if ((val = white[row][col] - cblack[c]) > 0) + sum[c] += val; + sum[c + 4]++; + } + if (imgdata.color.as_shot_wb_applied) + { + // Nikon sRAW: camera WB already applied: + pre_mul[0] = pre_mul[1] = pre_mul[2] = pre_mul[3] = 1.0; + } + else if (sum[0] && sum[1] && sum[2] && sum[3]) + FORC4 pre_mul[c] = (float)sum[c + 4] / sum[c]; + else if (cam_mul[0] > 0.00001f && cam_mul[2] > 0.00001f) + memcpy(pre_mul, cam_mul, sizeof pre_mul); + else + { + imgdata.process_warnings |= LIBRAW_WARN_BAD_CAMERA_WB; + } + } + // Nikon sRAW, daylight + if (imgdata.color.as_shot_wb_applied && !use_camera_wb && !use_auto_wb && + cam_mul[0] > 0.00001f && cam_mul[1] > 0.00001f && cam_mul[2] > 0.00001f) + { + for (c = 0; c < 3; c++) + pre_mul[c] /= cam_mul[c]; + } + if (pre_mul[1] == 0) + pre_mul[1] = 1; + if (pre_mul[3] == 0) + pre_mul[3] = colors < 4 ? pre_mul[1] : 1; + if (threshold) + wavelet_denoise(); + maximum -= black; + 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]; + } + if (!highlight) + dmax = dmin; + if (dmax > 0.00001 && maximum > 0) + FORC4 scale_mul[c] = (pre_mul[c] /= dmax) * 65535.0 / maximum; + else + FORC4 scale_mul[c] = 1.0; + + if (filters > 1000 && (cblack[4] + 1) / 2 == 1 && (cblack[5] + 1) / 2 == 1) + { + FORC4 cblack[FC(c / 2, c % 2)] += + cblack[6 + c / 2 % cblack[4] * cblack[5] + c % 2 % cblack[5]]; + cblack[4] = cblack[5] = 0; + } + size = iheight * iwidth; + scale_colors_loop(scale_mul); + if ((aber[0] != 1 || aber[2] != 1) && colors == 3) + { + for (c = 0; c < 4; c += 2) + { + if (aber[c] == 1) + continue; + img = (ushort *)malloc(size * sizeof *img); + for (i = 0; i < size; i++) + img[i] = image[i][c]; + for (row = 0; row < iheight; row++) + { + ur = fr = (row - iheight * 0.5) * aber[c] + iheight * 0.5; + if (ur > (unsigned)iheight - 2) + continue; + fr -= ur; + for (col = 0; col < iwidth; col++) + { + uc = fc = (col - iwidth * 0.5) * aber[c] + iwidth * 0.5; + if (uc > (unsigned)iwidth - 2) + continue; + fc -= uc; + pix = img + ur * iwidth + uc; + image[row * iwidth + col][c] = + (pix[0] * (1 - fc) + pix[1] * fc) * (1 - fr) + + (pix[iwidth] * (1 - fc) + pix[iwidth + 1] * fc) * fr; + } + } + free(img); + } + } + RUN_CALLBACK(LIBRAW_PROGRESS_SCALE_COLORS, 1, 2); +} + +// green equilibration +void LibRaw::green_matching() +{ + int i, j; + double m1, m2, c1, c2; + int o1_1, o1_2, o1_3, o1_4; + int o2_1, o2_2, o2_3, o2_4; + ushort(*img)[4]; + const int margin = 3; + int oj = 2, oi = 2; + float f; + const float thr = 0.01f; + if (half_size || shrink) + return; + if (FC(oj, oi) != 3) + oj++; + if (FC(oj, oi) != 3) + oi++; + if (FC(oj, oi) != 3) + oj--; + + img = (ushort(*)[4])calloc(height * width, sizeof *image); + memcpy(img, image, height * width * sizeof *image); + + for (j = oj; j < height - margin; j += 2) + for (i = oi; i < width - margin; i += 2) + { + o1_1 = img[(j - 1) * width + i - 1][1]; + o1_2 = img[(j - 1) * width + i + 1][1]; + o1_3 = img[(j + 1) * width + i - 1][1]; + o1_4 = img[(j + 1) * width + i + 1][1]; + o2_1 = img[(j - 2) * width + i][3]; + o2_2 = img[(j + 2) * width + i][3]; + o2_3 = img[j * width + i - 2][3]; + o2_4 = img[j * width + i + 2][3]; + + m1 = (o1_1 + o1_2 + o1_3 + o1_4) / 4.0; + m2 = (o2_1 + o2_2 + o2_3 + o2_4) / 4.0; + + c1 = (abs(o1_1 - o1_2) + abs(o1_1 - o1_3) + abs(o1_1 - o1_4) + + abs(o1_2 - o1_3) + abs(o1_3 - o1_4) + abs(o1_2 - o1_4)) / + 6.0; + c2 = (abs(o2_1 - o2_2) + abs(o2_1 - o2_3) + abs(o2_1 - o2_4) + + abs(o2_2 - o2_3) + abs(o2_3 - o2_4) + abs(o2_2 - o2_4)) / + 6.0; + if ((img[j * width + i][3] < maximum * 0.95) && (c1 < maximum * thr) && + (c2 < maximum * thr)) + { + f = image[j * width + i][3] * m1 / m2; + image[j * width + i][3] = f > 0xffff ? 0xffff : f; + } + } + free(img); +} diff --git a/rtengine/libraw/src/preprocessing/ext_preprocess.cpp b/rtengine/libraw/src/preprocessing/ext_preprocess.cpp new file mode 100644 index 000000000..e9020751c --- /dev/null +++ b/rtengine/libraw/src/preprocessing/ext_preprocess.cpp @@ -0,0 +1,127 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_fileio_defs.h" + +/* + Search from the current directory up to the root looking for + a ".badpixels" file, and fix those pixels now. + */ +void LibRaw::bad_pixels(const char *cfname) +{ + FILE *fp = NULL; + char *cp, line[128]; + int time, row, col, r, c, rad, tot, n; + + if (!filters) + return; + RUN_CALLBACK(LIBRAW_PROGRESS_BAD_PIXELS, 0, 2); + if (cfname) + fp = fopen(cfname, "r"); + if (!fp) + { + imgdata.process_warnings |= LIBRAW_WARN_NO_BADPIXELMAP; + return; + } + while (fgets(line, 128, fp)) + { + cp = strchr(line, '#'); + if (cp) + *cp = 0; + if (sscanf(line, "%d %d %d", &col, &row, &time) != 3) + continue; + if ((unsigned)col >= width || (unsigned)row >= height) + continue; + if (time > timestamp) + continue; + for (tot = n = 0, rad = 1; rad < 3 && n == 0; rad++) + for (r = row - rad; r <= row + rad; r++) + for (c = col - rad; c <= col + rad; c++) + if ((unsigned)r < height && (unsigned)c < width && + (r != row || c != col) && fcol(r, c) == fcol(row, col)) + { + tot += BAYER2(r, c); + n++; + } + if (n > 0) + BAYER2(row, col) = tot / n; + } + fclose(fp); + RUN_CALLBACK(LIBRAW_PROGRESS_BAD_PIXELS, 1, 2); +} + +void LibRaw::subtract(const char *fname) +{ + FILE *fp; + int dim[3] = {0, 0, 0}, comment = 0, number = 0, error = 0, nd = 0, c, row, + col; + RUN_CALLBACK(LIBRAW_PROGRESS_DARK_FRAME, 0, 2); + + if (!(fp = fopen(fname, "rb"))) + { + imgdata.process_warnings |= LIBRAW_WARN_BAD_DARKFRAME_FILE; + return; + } + if (fgetc(fp) != 'P' || fgetc(fp) != '5') + error = 1; + while (!error && nd < 3 && (c = fgetc(fp)) != EOF) + { + if (c == '#') + comment = 1; + if (c == '\n') + comment = 0; + if (comment) + continue; + if (isdigit(c)) + number = 1; + if (number) + { + if (isdigit(c)) + dim[nd] = dim[nd] * 10 + c - '0'; + else if (isspace(c)) + { + number = 0; + nd++; + } + else + error = 1; + } + } + if (error || nd < 3) + { + fclose(fp); + return; + } + else if (dim[0] != width || dim[1] != height || dim[2] != 65535) + { + imgdata.process_warnings |= LIBRAW_WARN_BAD_DARKFRAME_DIM; + fclose(fp); + return; + } + std::vector pixel(width, 0); + for (row = 0; row < height; row++) + { + fread(pixel.data(), 2, width, fp); + for (col = 0; col < width; col++) + BAYER(row, col) = MAX(BAYER(row, col) - ntohs(pixel[col]), 0); + } + fclose(fp); + memset(cblack, 0, sizeof cblack); + black = 0; + RUN_CALLBACK(LIBRAW_PROGRESS_DARK_FRAME, 1, 2); +} diff --git a/rtengine/libraw/src/preprocessing/preprocessing_ph.cpp b/rtengine/libraw/src/preprocessing/preprocessing_ph.cpp new file mode 100644 index 000000000..f296feecb --- /dev/null +++ b/rtengine/libraw/src/preprocessing/preprocessing_ph.cpp @@ -0,0 +1,24 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + Placeholder functions to build LibRaw w/o postprocessing + and preprocessing calls + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/libraw_cxx_defs.h" + +void LibRaw::copy_fuji_uncropped(unsigned short /*cblack*/[4], + unsigned short * /*dmaxp*/) {} +void LibRaw::copy_bayer(unsigned short /*cblack*/[4], unsigned short * /*dmaxp*/){} +void LibRaw::raw2image_start(){} + diff --git a/rtengine/libraw/src/preprocessing/raw2image.cpp b/rtengine/libraw/src/preprocessing/raw2image.cpp new file mode 100644 index 000000000..df5ad020d --- /dev/null +++ b/rtengine/libraw/src/preprocessing/raw2image.cpp @@ -0,0 +1,568 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/libraw_cxx_defs.h" + +void LibRaw::raw2image_start() +{ + // restore color,sizes and internal data into raw_image fields + memmove(&imgdata.color, &imgdata.rawdata.color, sizeof(imgdata.color)); + memmove(&imgdata.sizes, &imgdata.rawdata.sizes, sizeof(imgdata.sizes)); + memmove(&imgdata.idata, &imgdata.rawdata.iparams, sizeof(imgdata.idata)); + memmove(&libraw_internal_data.internal_output_params, + &imgdata.rawdata.ioparams, + sizeof(libraw_internal_data.internal_output_params)); + + if (O.user_flip >= 0) + S.flip = O.user_flip; + + switch ((S.flip + 3600) % 360) + { + case 270: + S.flip = 5; + break; + case 180: + S.flip = 3; + break; + case 90: + S.flip = 6; + break; + } + + // adjust for half mode! + IO.shrink = + !imgdata.rawdata.color4_image && !imgdata.rawdata.color3_image && + !imgdata.rawdata.float4_image && !imgdata.rawdata.float3_image && + P1.filters && + (O.half_size || ((O.threshold || O.aber[0] != 1 || O.aber[2] != 1))); + + S.iheight = (S.height + IO.shrink) >> IO.shrink; + S.iwidth = (S.width + IO.shrink) >> IO.shrink; +} + +int LibRaw::raw2image(void) +{ + + CHECK_ORDER_LOW(LIBRAW_PROGRESS_LOAD_RAW); + + try + { + raw2image_start(); + + bool free_p1_buffer = false; + if (is_phaseone_compressed() && (imgdata.rawdata.raw_alloc || (imgdata.process_warnings & LIBRAW_WARN_RAWSPEED3_PROCESSED))) + { + phase_one_allocate_tempbuffer(); + free_p1_buffer = true; + int rc = phase_one_subtract_black((ushort *)imgdata.rawdata.raw_alloc, + imgdata.rawdata.raw_image); + if (rc == 0 && imgdata.params.use_p1_correction) + rc = phase_one_correct(); + if (rc != 0) + { + phase_one_free_tempbuffer(); + return rc; + } + } + + if (load_raw == &LibRaw::hasselblad_load_raw) { // RT + hasselblad_correct(); // RT + } + + // free and re-allocate image bitmap + if (imgdata.image) + { + imgdata.image = (ushort(*)[4])realloc( + imgdata.image, S.iheight * S.iwidth * sizeof(*imgdata.image)); + memset(imgdata.image, 0, S.iheight * S.iwidth * sizeof(*imgdata.image)); + } + else + imgdata.image = + (ushort(*)[4])calloc(S.iheight * S.iwidth, sizeof(*imgdata.image)); + + + libraw_decoder_info_t decoder_info; + get_decoder_info(&decoder_info); + + // Copy area size + int copyheight = MAX(0, MIN(int(S.height), int(S.raw_height) - int(S.top_margin))); + int copywidth = MAX(0, MIN(int(S.width), int(S.raw_width) - int(S.left_margin))); + + // Move saved bitmap to imgdata.image + if ((imgdata.idata.filters || P1.colors == 1) && imgdata.rawdata.raw_image) + { + if (IO.fuji_width) + { + unsigned r, c; + int row, col; + for (row = 0; row < S.raw_height - S.top_margin * 2; row++) + { + for (col = 0; + col < IO.fuji_width + << int(!libraw_internal_data.unpacker_data.fuji_layout); + col++) + { + if (libraw_internal_data.unpacker_data.fuji_layout) + { + r = IO.fuji_width - 1 - col + (row >> 1); + c = col + ((row + 1) >> 1); + } + else + { + r = IO.fuji_width - 1 + row - (col >> 1); + c = row + ((col + 1) >> 1); + } + if (r < S.height && c < S.width && col + int(S.left_margin) < int(S.raw_width)) + imgdata.image[((r) >> IO.shrink) * S.iwidth + ((c) >> IO.shrink)] + [FC(r, c)] = + imgdata.rawdata + .raw_image[(row + S.top_margin) * S.raw_pitch / 2 + + (col + S.left_margin)]; + } + } + } + else + { + int row, col; + for (row = 0; row < copyheight; row++) + for (col = 0; col < copywidth; col++) + imgdata.image[((row) >> IO.shrink) * S.iwidth + + ((col) >> IO.shrink)][fcol(row, col)] = + imgdata.rawdata + .raw_image[(row + S.top_margin) * S.raw_pitch / 2 + + (col + S.left_margin)]; + } + } + else // if(decoder_info.decoder_flags & LIBRAW_DECODER_LEGACY) + { + if (imgdata.rawdata.color4_image) + { + if (S.width * 8u == S.raw_pitch && S.height == S.raw_height) + memmove(imgdata.image, imgdata.rawdata.color4_image, + S.width * S.height * sizeof(*imgdata.image)); + else + { + for (int row = 0; row < copyheight; row++) + memmove(&imgdata.image[row * S.width], + &imgdata.rawdata + .color4_image[(row + S.top_margin) * S.raw_pitch / 8 + + S.left_margin], + copywidth * sizeof(*imgdata.image)); + } + } + else if (imgdata.rawdata.color3_image) + { + unsigned char *c3image = (unsigned char *)imgdata.rawdata.color3_image; + for (int row = 0; row < copyheight; row++) + { + ushort(*srcrow)[3] = + (ushort(*)[3]) & c3image[(row + S.top_margin) * S.raw_pitch]; + ushort(*dstrow)[4] = (ushort(*)[4]) & imgdata.image[row * S.width]; + for (int col = 0; col < copywidth; col++) + { + for (int c = 0; c < 3; c++) + dstrow[col][c] = srcrow[S.left_margin + col][c]; + dstrow[col][3] = 0; + } + } + } + else + { + // legacy decoder, but no data? + throw LIBRAW_EXCEPTION_DECODE_RAW; + } + } + + // Free PhaseOne separate copy allocated at function start + if (free_p1_buffer) + { + phase_one_free_tempbuffer(); + } + // hack - clear later flags! + + if (load_raw == &LibRaw::canon_600_load_raw && S.width < S.raw_width) + { + canon_600_correct(); + } + + imgdata.progress_flags = + LIBRAW_PROGRESS_START | LIBRAW_PROGRESS_OPEN | + LIBRAW_PROGRESS_RAW2_IMAGE | LIBRAW_PROGRESS_IDENTIFY | + LIBRAW_PROGRESS_SIZE_ADJUST | LIBRAW_PROGRESS_LOAD_RAW; + return 0; + } + catch (const std::bad_alloc&) + { + EXCEPTION_HANDLER(LIBRAW_EXCEPTION_ALLOC); + } + catch (const LibRaw_exceptions& err) + { + EXCEPTION_HANDLER(err); + } +} + +void LibRaw::copy_fuji_uncropped(unsigned short cblack[4], + unsigned short *dmaxp) +{ +#if defined(LIBRAW_USE_OPENMP) +#pragma omp parallel for schedule(dynamic) default(none) firstprivate(cblack) shared(dmaxp) +#endif + for (int row = 0; row < int(S.raw_height) - int(S.top_margin) * 2; row++) + { + int col; + unsigned short ldmax = 0; + for (col = 0; + col < IO.fuji_width << int(!libraw_internal_data.unpacker_data.fuji_layout) + && col + int(S.left_margin) < int(S.raw_width); + col++) + { + unsigned r, c; + if (libraw_internal_data.unpacker_data.fuji_layout) + { + r = IO.fuji_width - 1 - col + (row >> 1); + c = col + ((row + 1) >> 1); + } + else + { + r = IO.fuji_width - 1 + row - (col >> 1); + c = row + ((col + 1) >> 1); + } + if (r < S.height && c < S.width) + { + unsigned short val = + imgdata.rawdata.raw_image[(row + S.top_margin) * S.raw_pitch / 2 + + (col + S.left_margin)]; + int cc = FC(r, c); + if (val > cblack[cc]) + { + val -= cblack[cc]; + if (val > ldmax) + ldmax = val; + } + else + val = 0; + imgdata.image[((r) >> IO.shrink) * S.iwidth + ((c) >> IO.shrink)][cc] = + val; + } + } +#if defined(LIBRAW_USE_OPENMP) +#pragma omp critical(dataupdate) +#endif + { + if (*dmaxp < ldmax) + *dmaxp = ldmax; + } + } +} + +void LibRaw::copy_bayer(unsigned short cblack[4], unsigned short *dmaxp) +{ + // Both cropped and uncropped + int maxHeight = MIN(int(S.height),int(S.raw_height)-int(S.top_margin)); +#if defined(LIBRAW_USE_OPENMP) +#pragma omp parallel for schedule(dynamic) default(none) shared(dmaxp) firstprivate(cblack, maxHeight) +#endif + for (int row = 0; row < maxHeight ; row++) + { + int col; + unsigned short ldmax = 0; + for (col = 0; col < S.width && col + S.left_margin < S.raw_width; col++) + { + unsigned short val = + imgdata.rawdata.raw_image[(row + S.top_margin) * S.raw_pitch / 2 + + (col + S.left_margin)]; + int cc = fcol(row, col); + if (val > cblack[cc]) + { + val -= cblack[cc]; + if (val > ldmax) + ldmax = val; + } + else + val = 0; + imgdata.image[((row) >> IO.shrink) * S.iwidth + ((col) >> IO.shrink)][cc] = val; + } +#if defined(LIBRAW_USE_OPENMP) +#pragma omp critical(dataupdate) +#endif + { + if (*dmaxp < ldmax) + *dmaxp = ldmax; + } + } +} + +int LibRaw::raw2image_ex(int do_subtract_black) +{ + + CHECK_ORDER_LOW(LIBRAW_PROGRESS_LOAD_RAW); + + try + { + raw2image_start(); + bool free_p1_buffer = false; + + // Compressed P1 files with bl data! + if (is_phaseone_compressed() && (imgdata.rawdata.raw_alloc || (imgdata.process_warnings & LIBRAW_WARN_RAWSPEED3_PROCESSED))) + { + phase_one_allocate_tempbuffer(); + free_p1_buffer = true; + int rc = phase_one_subtract_black((ushort *)imgdata.rawdata.raw_alloc, + imgdata.rawdata.raw_image); + if (rc == 0 && imgdata.params.use_p1_correction) + rc = phase_one_correct(); + if (rc != 0) + { + phase_one_free_tempbuffer(); + return rc; + } + } + + // process cropping + int do_crop = 0; + if (~O.cropbox[2] && ~O.cropbox[3]) + { + int crop[4], c, filt; + for (int q = 0; q < 4; q++) + { + crop[q] = O.cropbox[q]; + if (crop[q] < 0) + crop[q] = 0; + } + + if (IO.fuji_width && imgdata.idata.filters >= 1000) + { + crop[0] = (crop[0] / 4) * 4; + crop[1] = (crop[1] / 4) * 4; + if (!libraw_internal_data.unpacker_data.fuji_layout) + { + crop[2] *= sqrt(2.0); + crop[3] /= sqrt(2.0); + } + crop[2] = (crop[2] / 4 + 1) * 4; + crop[3] = (crop[3] / 4 + 1) * 4; + } + else if (imgdata.idata.filters == 1) + { + crop[0] = (crop[0] / 16) * 16; + crop[1] = (crop[1] / 16) * 16; + } + else if (imgdata.idata.filters == LIBRAW_XTRANS) + { + crop[0] = (crop[0] / 6) * 6; + crop[1] = (crop[1] / 6) * 6; + } + do_crop = 1; + + crop[2] = MIN(crop[2], (signed)S.width - crop[0]); + crop[3] = MIN(crop[3], (signed)S.height - crop[1]); + if (crop[2] <= 0 || crop[3] <= 0) + throw LIBRAW_EXCEPTION_BAD_CROP; + + // adjust sizes! + S.left_margin += crop[0]; + S.top_margin += crop[1]; + S.width = crop[2]; + S.height = crop[3]; + + S.iheight = (S.height + IO.shrink) >> IO.shrink; + S.iwidth = (S.width + IO.shrink) >> IO.shrink; + if (!IO.fuji_width && imgdata.idata.filters && + imgdata.idata.filters >= 1000) + { + for (filt = c = 0; c < 16; c++) + filt |= FC((c >> 1) + (crop[1]), (c & 1) + (crop[0])) << c * 2; + imgdata.idata.filters = filt; + } + } + + int alloc_width = S.iwidth; + int alloc_height = S.iheight; + + if (IO.fuji_width && do_crop) + { + int IO_fw = S.width >> int(!libraw_internal_data.unpacker_data.fuji_layout); + int t_alloc_width = + (S.height >> libraw_internal_data.unpacker_data.fuji_layout) + IO_fw; + int t_alloc_height = t_alloc_width - 1; + alloc_height = (t_alloc_height + IO.shrink) >> IO.shrink; + alloc_width = (t_alloc_width + IO.shrink) >> IO.shrink; + } + int alloc_sz = alloc_width * alloc_height; + + if (imgdata.image) + { + imgdata.image = (ushort(*)[4])realloc(imgdata.image, + alloc_sz * sizeof(*imgdata.image)); + memset(imgdata.image, 0, alloc_sz * sizeof(*imgdata.image)); + } + else + imgdata.image = (ushort(*)[4])calloc(alloc_sz, sizeof(*imgdata.image)); + + libraw_decoder_info_t decoder_info; + get_decoder_info(&decoder_info); + + // Adjust black levels + unsigned short cblack[4] = {0, 0, 0, 0}; + unsigned short dmax = 0; + if (do_subtract_black) + { + adjust_bl(); + for (int i = 0; i < 4; i++) + cblack[i] = (unsigned short)C.cblack[i]; + } + + // Max area size to definitely not overrun in/out buffers + int copyheight = MAX(0, MIN(int(S.height), int(S.raw_height) - int(S.top_margin))); + int copywidth = MAX(0, MIN(int(S.width), int(S.raw_width) - int(S.left_margin))); + + // Move saved bitmap to imgdata.image + if ((imgdata.idata.filters || P1.colors == 1) && imgdata.rawdata.raw_image) + { + if (IO.fuji_width) + { + if (do_crop) + { + IO.fuji_width = + S.width >> int(!libraw_internal_data.unpacker_data.fuji_layout); + int IO_fwidth = + (S.height >> int(libraw_internal_data.unpacker_data.fuji_layout)) + + IO.fuji_width; + int IO_fheight = IO_fwidth - 1; + + int row, col; + for (row = 0; row < S.height; row++) + { + for (col = 0; col < S.width; col++) + { + int r, c; + if (libraw_internal_data.unpacker_data.fuji_layout) + { + r = IO.fuji_width - 1 - col + (row >> 1); + c = col + ((row + 1) >> 1); + } + else + { + r = IO.fuji_width - 1 + row - (col >> 1); + c = row + ((col + 1) >> 1); + } + + unsigned short val = + imgdata.rawdata + .raw_image[(row + S.top_margin) * S.raw_pitch / 2 + + (col + S.left_margin)]; + int cc = FCF(row, col); + if (val > cblack[cc]) + { + val -= cblack[cc]; + if (dmax < val) + dmax = val; + } + else + val = 0; + imgdata.image[((r) >> IO.shrink) * alloc_width + + ((c) >> IO.shrink)][cc] = val; + } + } + S.height = IO_fheight; + S.width = IO_fwidth; + S.iheight = (S.height + IO.shrink) >> IO.shrink; + S.iwidth = (S.width + IO.shrink) >> IO.shrink; + S.raw_height -= 2 * S.top_margin; + } + else + { + copy_fuji_uncropped(cblack, &dmax); + } + } // end Fuji + else + { + copy_bayer(cblack, &dmax); + } + } + else // if(decoder_info.decoder_flags & LIBRAW_DECODER_LEGACY) + { + if (imgdata.rawdata.color4_image) + { + if (S.raw_pitch != S.width * 8u || S.height != S.raw_height) + { + for (int row = 0; row < copyheight; row++) + memmove(&imgdata.image[row * S.width], + &imgdata.rawdata + .color4_image[(row + S.top_margin) * S.raw_pitch / 8 + + S.left_margin], + copywidth * sizeof(*imgdata.image)); + } + else + { + // legacy is always 4channel and not shrinked! + memmove(imgdata.image, imgdata.rawdata.color4_image, + S.width*copyheight * sizeof(*imgdata.image)); + } + } + else if (imgdata.rawdata.color3_image) + { + unsigned char *c3image = (unsigned char *)imgdata.rawdata.color3_image; + for (int row = 0; row < copyheight; row++) + { + ushort(*srcrow)[3] = + (ushort(*)[3]) & c3image[(row + S.top_margin) * S.raw_pitch]; + ushort(*dstrow)[4] = (ushort(*)[4]) & imgdata.image[row * S.width]; + for (int col = 0; col < copywidth; col++) + { + for (int c = 0; c < 3; c++) + dstrow[col][c] = srcrow[S.left_margin + col][c]; + dstrow[col][3] = 0; + } + } + } + else + { + // legacy decoder, but no data? + throw LIBRAW_EXCEPTION_DECODE_RAW; + } + } + + // Free PhaseOne separate copy allocated at function start + if (free_p1_buffer) + { + phase_one_free_tempbuffer(); + } + if (load_raw == &LibRaw::canon_600_load_raw && S.width < S.raw_width) + { + canon_600_correct(); + } + + if (do_subtract_black) + { + C.data_maximum = (int)dmax; + C.maximum -= C.black; + // ZERO(C.cblack); + C.cblack[0] = C.cblack[1] = C.cblack[2] = C.cblack[3] = 0; + C.black = 0; + } + + // hack - clear later flags! + imgdata.progress_flags = + LIBRAW_PROGRESS_START | LIBRAW_PROGRESS_OPEN | + LIBRAW_PROGRESS_RAW2_IMAGE | LIBRAW_PROGRESS_IDENTIFY | + LIBRAW_PROGRESS_SIZE_ADJUST | LIBRAW_PROGRESS_LOAD_RAW; + return 0; + } + catch (const LibRaw_exceptions& err) + { + EXCEPTION_HANDLER(err); + } +} diff --git a/rtengine/libraw/src/preprocessing/subtract_black.cpp b/rtengine/libraw/src/preprocessing/subtract_black.cpp new file mode 100644 index 000000000..5539d9643 --- /dev/null +++ b/rtengine/libraw/src/preprocessing/subtract_black.cpp @@ -0,0 +1,91 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/libraw_cxx_defs.h" + +int LibRaw::subtract_black() +{ + adjust_bl(); + return subtract_black_internal(); +} + +int LibRaw::subtract_black_internal() +{ + CHECK_ORDER_LOW(LIBRAW_PROGRESS_RAW2_IMAGE); + + try + { + if (!is_phaseone_compressed() && + (C.cblack[0] || C.cblack[1] || C.cblack[2] || C.cblack[3] || + (C.cblack[4] && C.cblack[5]))) + { + int cblk[4], i; + for (i = 0; i < 4; i++) + cblk[i] = C.cblack[i]; + + int size = S.iheight * S.iwidth; + int dmax = 0; + if (C.cblack[4] && C.cblack[5]) + { + for (unsigned q = 0; q < (unsigned)size; q++) + { + for (unsigned c = 0; c < 4; c++) + { + int val = imgdata.image[q][c]; + val -= C.cblack[6 + q / S.iwidth % C.cblack[4] * C.cblack[5] + + q % S.iwidth % C.cblack[5]]; + val -= cblk[c]; + imgdata.image[q][c] = CLIP(val); + if (dmax < val) dmax = val; + } + } + } + else + { + for (unsigned q = 0; q < (unsigned)size; q++) + { + for (unsigned c = 0; c < 4; c++) + { + int val = imgdata.image[q][c]; + val -= cblk[c]; + imgdata.image[q][c] = CLIP(val); + if (dmax < val) dmax = val; + } + } + } + C.data_maximum = dmax & 0xffff; + C.maximum -= C.black; + ZERO(C.cblack); // Yeah, we used cblack[6+] values too! + C.black = 0; + } + else + { + // Nothing to Do, maximum is already calculated, black level is 0, so no + // change only calculate channel maximum; + int idx; + ushort *p = (ushort *)imgdata.image; + int dmax = 0; + for (idx = 0; idx < S.iheight * S.iwidth * 4; idx++) + if (dmax < p[idx]) + dmax = p[idx]; + C.data_maximum = dmax; + } + return 0; + } + catch (const LibRaw_exceptions& err) + { + EXCEPTION_HANDLER(err); + } +} diff --git a/rtengine/libraw/src/tables/cameralist.cpp b/rtengine/libraw/src/tables/cameralist.cpp new file mode 100644 index 000000000..86c88894a --- /dev/null +++ b/rtengine/libraw/src/tables/cameralist.cpp @@ -0,0 +1,1291 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/libraw_cxx_defs.h" +// clang-format off +// Supported cameras: +static const char *static_camera_list[] = { + "Adobe Digital Negative (DNG)", + "AgfaPhoto DC-833m", + "Alcatel 5035D", + "Apple iPad Pro", + "Apple iPhone SE", + "Apple iPhone 6s", + "Apple iPhone 6 plus", + "Apple iPhone 7", + "Apple iPhone 7 plus", + "Apple iPhone 8", + "Apple iPhone 8 plus", + "Apple iPhone X", + "Apple iPhone 12 Pro", + "Apple iPhone 12 Pro Max", + "Apple iPhone 13", + "Apple iPhone 14", + "Apple QuickTake 100", + "Apple QuickTake 150", + "Apple QuickTake 200", + "ASUS ZenPhone4", + "ASUS ZenPhone6", + "AutelRobotics XB015", + "AutelRobotics XT705 (EVO II)", + "AutelRobotics XL720 (EVO Lite+)", + "AVT F-080C", + "AVT F-145C", + "AVT F-201C", + "AVT F-510C", + "AVT F-810C", + "Baumer TXG14", + "BlackMagic Cinema Camera", + "BlackMagic Micro Cinema Camera", + "BlackMagic Pocket Cinema Camera", + "BlackMagic Production Camera 4k", + "BlackMagic URSA", + "BlackMagic URSA Mini 4k", + "BlackMagic URSA Mini 4.6k", + "BlackMagic URSA Mini Pro 4.6k", + "BQ Aquarius U", + "Canon PowerShot 600", + "Canon PowerShot A5", + "Canon PowerShot A5 Zoom", + "Canon PowerShot A50", + "Canon PowerShot A410 (CHDK hack)", + "Canon PowerShot A460 (CHDK hack)", + "Canon PowerShot A470 (CHDK hack)", + "Canon PowerShot A480 (CHDK hack)", + "Canon PowerShot A530 (CHDK hack)", + "Canon PowerShot A540 (CHDK hack)", + "Canon PowerShot A550 (CHDK hack)", + "Canon PowerShot A560 (CHDK hack)", + "Canon PowerShot A570 IS (CHDK hack)", + "Canon PowerShot A590 IS (CHDK hack)", + "Canon PowerShot A610 (CHDK hack)", + "Canon PowerShot A620 (CHDK hack)", + "Canon PowerShot A630 (CHDK hack)", + "Canon PowerShot A640 (CHDK hack)", + "Canon PowerShot A650 IS (CHDK hack)", + "Canon PowerShot A710 IS (CHDK hack)", + "Canon PowerShot A720 IS (CHDK hack)", + "Canon PowerShot A3300 IS (CHDK hack)", + "Canon PowerShot D10 (CHDK hack)", + "Canon PowerShot ELPH 130 IS / IXUS 140 / IXY 110F (CHDK hack)", + "Canon PowerShot ELPH 160 / IXUS 160 (CHDK hack)", + "Canon PowerShot Pro70", + "Canon PowerShot Pro90 IS", + "Canon PowerShot Pro1", + "Canon PowerShot G1", + "Canon PowerShot G1 X", + "Canon PowerShot G1 X Mark II", + "Canon PowerShot G1 X Mark III", + "Canon PowerShot G2", + "Canon PowerShot G3", + "Canon PowerShot G3 X", + "Canon PowerShot G5", + "Canon PowerShot G5 X", + "Canon PowerShot G5 X Mark II", + "Canon PowerShot G6", + "Canon PowerShot G7 (CHDK hack)", + "Canon PowerShot G7 X", + "Canon PowerShot G7 X Mark II", + "Canon PowerShot G7 X Mark III", + "Canon PowerShot G9", + "Canon PowerShot G9 X", + "Canon PowerShot G9 X Mark II", + "Canon PowerShot G10", + "Canon PowerShot G11", + "Canon PowerShot G12", + "Canon PowerShot G15", + "Canon PowerShot G16", + "Canon PowerShot S2 IS (CHDK hack)", + "Canon PowerShot S3 IS (CHDK hack)", + "Canon PowerShot S5 IS (CHDK hack)", + "Canon PowerShot SD300 / IXUS 40 / IXY Digital 50 (CHDK hack)", + "Canon PowerShot SD750 / IXUS 75 / IXY Digital 90 (CHDK hack)", + "Canon PowerShot SD900 / Digital IXUS 900 Ti / IXY Digital 1000 (CHDK hack)", + "Canon PowerShot SD950 IS / Digital IXUS 960 IS / IXY Digital 2000 IS (CHDK hack)", + "Canon PowerShot SD1200 IS / Digital IXUS 95 IS / IXY Digital 110 IS (CHDK hack)", + "Canon PowerShot S30", + "Canon PowerShot S40", + "Canon PowerShot S45", + "Canon PowerShot S50", + "Canon PowerShot S60", + "Canon PowerShot S70", + "Canon PowerShot S90", + "Canon PowerShot S95", + "Canon PowerShot S100", + "Canon PowerShot S110", + "Canon PowerShot S120", + "Canon PowerShot SX1 IS", + "Canon PowerShot SX40 HS (CHDK hack, CR2)", + "Canon PowerShot SX50 HS", + "Canon PowerShot SX60 HS", + "Canon PowerShot SX70 HS", + "Canon PowerShot SX100 IS (CHDK hack)", + "Canon PowerShot SX110 IS (CHDK hack)", + "Canon PowerShot SX120 IS (CHDK hack)", + "Canon PowerShot SX130 IS (CHDK hack)", + "Canon PowerShot SX160 IS (CHDK hack)", + "Canon PowerShot SX220 HS (CHDK hack)", + "Canon PowerShot SX510 HS (CHDK hack)", + "Canon PowerShot SX710 HS (CHDK hack)", + "Canon PowerShot SX10 IS (CHDK hack)", + "Canon PowerShot SX20 IS (CHDK hack)", + "Canon PowerShot SX30 IS (CHDK hack)", + "Canon EOS R", + "Canon EOS Ra", + "Canon EOS RP", + "Canon EOS R3", + "Canon EOS R5", + "Canon EOS R6", + "Canon EOS R6 Mark II", + "Canon EOS R7", + "Canon EOS R8", + "Canon EOS R10", + "Canon EOS R50", + "Canon EOS R100", + "Canon EOS D30", + "Canon EOS D60", + "Canon EOS 5DS", + "Canon EOS 5DS R", + "Canon EOS 5D", + "Canon EOS 5D Mark II", + "Canon EOS 5D Mark III", + "Canon EOS 5D Mark IV", + "Canon EOS 6D", + "Canon EOS 6D Mark II", + "Canon EOS 7D", + "Canon EOS 7D Mark II", + "Canon EOS 10D", + "Canon EOS 20D", + "Canon EOS 20Da", + "Canon EOS 30D", + "Canon EOS 40D", + "Canon EOS 50D", + "Canon EOS 60D", + "Canon EOS 60Da", + "Canon EOS 70D", + "Canon EOS 77D / 9000D", + "Canon EOS 80D", + "Canon EOS 90D", + "Canon EOS 100D / Rebel SL1 / Kiss X7", + "Canon EOS 200D / Rebel SL2 / Kiss X9", + "Canon EOS 250D / 200D II / Rebel SL3 / Kiss X10", + "Canon EOS 300D / Digital Rebel / Kiss Digital", + "Canon EOS 350D / Digital Rebel XT / Kiss Digital N", + "Canon EOS 400D / Digital Rebel XTi / Kiss Digital X", + "Canon EOS 450D / Digital Rebel XSi / Kiss X2", + "Canon EOS 500D / Rebel T1i / Kiss X3", + "Canon EOS 550D / Rebel T2i / Kiss X4", + "Canon EOS 600D / Rebel T3i / Kiss X5", + "Canon EOS 650D / Rebel T4i / Kiss X6i", + "Canon EOS 700D / Rebel T5i / Kiss X7i", + "Canon EOS 750D / Rebel T6i / Kiss X8i", + "Canon EOS 760D / Rebel T6S / 8000D", + "Canon EOS 800D / Rebel T7i / Kiss X9i", + "Canon EOS 850D / Rebel T8i / Kiss X10i", + "Canon EOS 1000D / Digital Rebel XS / Kiss F", + "Canon EOS 1100D / Rebel T3 / Kiss X50", + "Canon EOS 1200D / Kiss X70 / REBEL T5 / Hi", + "Canon EOS 1300D / Rebel T6 / Kiss X80", + "Canon EOS 1500D / 2000D / Rebel T7 / Kiss X90", + "Canon EOS 3000D / 4000D / Rebel T100", + "Canon EOS D2000", + "Canon EOS M", + "Canon EOS M2", + "Canon EOS M3", + "Canon EOS M5", + "Canon EOS M6", + "Canon EOS M6 Mark II", + "Canon EOS M10", + "Canon EOS M50 / Kiss M", + "Canon EOS M50 Mark II", + "Canon EOS M100", + "Canon EOS M200", + "Canon EOS-1D C", + "Canon EOS-1D X", + "Canon EOS-1D X Mark II", + "Canon EOS-1D X Mark III", + "Canon EOS-1D", + "Canon EOS-1D Mark II", + "Canon EOS-1D Mark II N", + "Canon EOS-1D Mark III", + "Canon EOS-1D Mark IV", + "Canon EOS-1Ds", + "Canon EOS-1Ds Mark II", + "Canon EOS-1Ds Mark III", + "Casio QV-2000UX (secret menu hack)", + "Casio QV-3000EX (secret menu hack)", + "Casio QV-3500EX (secret menu hack)", + "Casio QV-4000 (secret menu hack)", + "Casio QV-5700 (secret menu hack)", + "Casio QV-R41", + "Casio QV-R51", + "Casio QV-R61", + "Casio EX-F1", + "Casio EX-FC300S", + "Casio EX-FC400S", + "Casio EX-FH20", + "Casio EX-FH25", + "Casio EX-FH100", + "Casio EX-S20 / M20", + "Casio EX-S100", + "Casio EX-Z4", + "Casio EX-Z50", + "Casio EX-Z500", + "Casio EX-Z55", + "Casio EX-Z60", + "Casio EX-Z75", + "Casio EX-Z750", + "Casio EX-Z8", + "Casio EX-Z850", + "Casio EX-Z1050", + "Casio EX-ZR100", + "Casio EX-Z1080", + "Casio EX-ZR700", + "Casio EX-ZR710", + "Casio EX-ZR750", + "Casio EX-ZR800", + "Casio EX-ZR850", + "Casio EX-ZR1000", + "Casio EX-ZR1100", + "Casio EX-ZR1200", + "Casio EX-ZR1300", + "Casio EX-ZR1500", + "Casio EX-ZR3000", + "Casio EX-ZR3100", + "Casio EX-ZR3200", + "Casio EX-ZR3500", + "Casio EX-ZR3600", + "Casio EX-ZR3700", + "Casio EX-ZR4000 / 5000", + "Casio EX-ZR4100 / 5100", + "Casio EX-100", + "Casio EX-100F", + "Casio EX-100PRO", + "Casio EX-10", + "Casio EX-P505 (secret menu hack)", + "Casio EX-P600 (secret menu hack)", + "Casio EX-P700 (secret menu hack)", + "CLAUSS pix500", + "Contax N Digital", + "Creative PC-CAM 600", + "Digital Bolex D16", + "Digital Bolex D16M", + "DJI 4384x3288", + "DJI Inspire 3", + "DJI Mavic Air", + "DJI Mavic Air 2", + "DJI Mavic Air 2S", + "DJI Mavic Air 3", + "DJI Mavic Mini 2", + "DJI Mavic Mini 3", + "DJI Mavic Mini 3 Pro", + "DJI Mavic 2 Pro", + "DJI Mavic 3", + "DJI Mavic 3 Classic", + "DJI Mavic 3 Pro", + "DJI Osmo Action", + "DJI Pocket", + "DJI Phantom4 Pro/Pro+", + "DJI Zenmuse X5", + "DJI Zenmuse X5R", + "DXO One", + "Epson R-D1", + "Epson R-D1s", + "Epson R-D1x", + "Eyedeas E1", + "Foculus 531C", + "FujiFilm DBP for GX680 / DX-2000", + "FujiFilm E550", + "FujiFilm E900", + "FujiFilm F500EXR / F505EXR", + "FujiFilm F550EXR", + "FujiFilm F600EXR / F605EXR", + "FujiFilm F700", + "FujiFilm F710", + "FujiFilm F770EXR / F775EXR", + "FujiFilm F800EXR", + "FujiFilm F810", + "FujiFilm F900EXR", + "FujiFilm S2Pro", + "FujiFilm S3Pro", + "FujiFilm S5Pro", + "FujiFilm S20Pro", + "FujiFilm S1", + "FujiFilm S100FS", + "FujiFilm S5000", + "FujiFilm S5100 / S5500", + "FujiFilm S5200 / S5600", + "FujiFilm S6000fd / S6500fd", + "FujiFilm S7000", + "FujiFilm S9000 / S9500", + "FujiFilm S9100 / S9600", + "FujiFilm S200EXR / S205EXR", + "FujiFilm SL1000", + "FujiFilm HS10/HS11", + "FujiFilm HS20EXR / HS22EXR", + "FujiFilm HS30EXR / HS33EXR / HS35EXR", + "FujiFilm HS50EXR", + "FujiFilm GFX 50S", + "FujiFilm GFX 50S II", + "FujiFilm GFX 50R", + "FujiFilm GFX 100", + "FujiFilm GFX 100 II", + "FujiFilm GFX 100S", + "FujiFilm X-Pro1", + "FujiFilm X-Pro2", + "FujiFilm X-Pro3", + "FujiFilm X-S1", + "FujiFilm X-S20", + "FujiFilm XQ1", + "FujiFilm XQ2", + "FujiFilm X100", + "FujiFilm X100F", + "FujiFilm X100S", + "FujiFilm X100T", + "FujiFilm X100V", + "FujiFilm X10", + "FujiFilm X20", + "FujiFilm X30", + "FujiFilm X70", + "FujiFilm X-A1", + "FujiFilm X-A2", + "FujiFilm X-A3", + "FujiFilm X-A5", + "FujiFilm X-A7", + "FujiFilm X-A10", + "FujiFilm X-A20", + "FujiFilm X-E1", + "FujiFilm X-E2", + "FujiFilm X-E2S", + "FujiFilm X-E3", + "FujiFilm X-E4", + "FujiFilm X-M1", + "FujiFilm XF1", + "FujiFilm XF10", + "FujiFilm X-H1", + "FujiFilm X-H2", + "FujiFilm X-H2S", + "FujiFilm X-T1", + "FujiFilm X-S10", + "FujiFilm X-T1 Graphite Silver", + "FujiFilm X-T2", + "FujiFilm X-T3", + "FujiFilm X-T4", + "FujiFilm X-T5", + "FujiFilm X-T10", + "FujiFilm X-T20", + "FujiFilm X-T30", + "FujiFilm X-T30 II", + "FujiFilm X-T100", + "FujiFilm X-T200", + "FujiFilm IS-1", + "Gione E7", + "GITUP GIT2", + "GITUP GIT2P", + "GITUP G3 DUO (16:9 mode only)", + "Google Pixel", + "Google Pixel XL", + "Google Pixel 3a", + "Google Pixel 4 XL", + "Google Pixel 4a (5G)", + "Google Pixel 5", + "Google Pixel 7a", +#ifdef USE_GPRSDK + "GoPro Fusion", + "GoPro HERO5", + "GoPro HERO6", + "GoPro HERO7", + "GoPro HERO8", + "GoPro HERO9", + "GoPro HERO10", + "GoPro HERO11", + "GoPro HERO12", +#endif + "Hasselblad H2D-22", + "Hasselblad H2D-39", + "Hasselblad H3DII-22", + "Hasselblad H3DII-31", + "Hasselblad H3DII-39", + "Hasselblad H3DII-50", + "Hasselblad H3D-22", + "Hasselblad H3D-31", + "Hasselblad H3D-39", + "Hasselblad H4D-60", + "Hasselblad H4D-50", + "Hasselblad H4D-40", + "Hasselblad H4D-31", + "Hasselblad H5D-60", + "Hasselblad H5D-50", + "Hasselblad H5D-50c", + "Hasselblad H5D-40", + "Hasselblad H6D-100c", + "Hasselblad A6D-100c", // Aerial camera + "Hasselblad CFV", + "Hasselblad CFV-50", + "Hasselblad CFV II 50C", + "Hasselblad CFH", + "Hasselblad CF-22", + "Hasselblad CF-31", + "Hasselblad CF-39", + "Hasselblad V96C", + "Hasselblad L1D-20c (DJI Mavic 2 Pro)", + "Hasselblad Lusso", + "Hasselblad Lunar", + "Hasselblad True Zoom", + "Hasselblad Stellar", + "Hasselblad Stellar II", + "Hasselblad HV", + "Hasselblad X1D", + "Hasselblad X1D II 50C", + "Hasselblad X2D 100C", + "HTC UltraPixel", + "HTC MyTouch 4G", + "HTC One (A9)", + "HTC One (M9)", + "HTC 10", + "HTC U12", + "Huawei P8 Lite (PRA-LX1)", + "Huawei P9 (EVA-L09/AL00)", + "Huawei P10 (VTR-L09)", + "Huawei P10+ (VKY-L09)", + "Huawei P10 Lite (WAS-LX1A)", + "Huawei P20 (EML-L09)", + "Huawei P20 Lite (ANE-LX1)", + "Huawei P20 Pro (CLT-L29/L09)", + "Huawei P30 Pro (VOG-L29)", + "Huawei Honor6a", + "Huawei Honor7a pro", + "Huawei Honor8 (FRD-L09)", + "Huawei Honor9", + "Huawei Honor10", + "Huawei Honor20", + "Huawei Honor View 10 (BKL-L09)", + "Huawei Honor View 20 (PCT-L29)", + "Huawei Honor 20 Pro (YAL-L41)", + "Huawei Mate8 (NXT-L29)", + "Huawei Mate10 (BLA-L29)", + "Huawei Mate20 Pro (LYA-L29)", + "Huawei Mate20 Lite (SNE-LX1)", + "Imacon Ixpress 96, 96C", + "Imacon Ixpress 384, 384C (single shot only)", + "Imacon Ixpress 132C", + "Imacon Ixpress 528C (single shot only)", + "ISG 2020x1520", + "Ikonoskop A-Cam dII Panchromatic", + "Ikonoskop A-Cam dII", + "Kandao QooCam 8K", + "Kinefinity KineMINI", + "Kinefinity KineRAW Mini", + "Kinefinity KineRAW S35", + "Kodak DC20", + "Kodak DC25", + "Kodak DC40", + "Kodak DC50", + "Kodak DC120", + "Kodak DCS200", + "Kodak DCS315C", + "Kodak DCS330C", + "Kodak DCS420", + "Kodak DCS460", + "Kodak DCS460M", + "Kodak DCS460", + "Kodak DCS520C", + "Kodak DCS560C", + "Kodak DCS620C", + "Kodak DCS620X", + "Kodak DCS660C", + "Kodak DCS660M", + "Kodak DCS720X", + "Kodak DCS760C", + "Kodak DCS760M", + "Kodak EOSDCS1", + "Kodak EOSDCS3", + "Kodak NC2000", + "Kodak ProBack", + "Kodak PB645C", + "Kodak PB645H", + "Kodak PB645M", + "Kodak DCS Pro 14n", + "Kodak DCS Pro 14nx", + "Kodak DCS Pro SLR/c", + "Kodak DCS Pro SLR/n", + "Kodak C330", + "Kodak C603", + "Kodak P850", + "Kodak P880", + "Kodak PIXPRO AZ901", + "Kodak PIXPRO S-1", + "Kodak Z980", + "Kodak Z981", + "Kodak Z990", + "Kodak Z1015", + "Kodak KAI-0340", + "Konica KD-400Z", + "Konica KD-510Z", + "Leaf AFi 5", + "Leaf AFi 6", + "Leaf AFi 7", + "Leaf AFi-II 6", + "Leaf AFi-II 7", + "Leaf AFi-II 10", + "Leaf AFi-II 10R", + "Leaf Aptus-II 5", + "Leaf Aptus-II 6", + "Leaf Aptus-II 7", + "Leaf Aptus-II 8", + "Leaf Aptus-II 10", + "Leaf Aptus-II 12", + "Leaf Aptus-II 12R", + "Leaf Aptus 17", + "Leaf Aptus 22", + "Leaf Aptus 54S", + "Leaf Aptus 65", + "Leaf Aptus 65S", + "Leaf Aptus 75", + "Leaf Aptus 75S", + "Leaf Cantare", + "Leaf Cantare XY", + "Leaf CatchLight", + "Leaf CMost", + "Leaf Credo 40", + "Leaf Credo 50", + "Leaf Credo 60", + "Leaf Credo 80", + "Leaf DCB-II", + "Leaf Valeo 6", + "Leaf Valeo 11", + "Leaf Valeo 17", + "Leaf Valeo 17wi", + "Leaf Valeo 22", + "Leaf Valeo 22wi", + "Leaf Volare", + "Lenovo a820", + "Leica C (Typ 112)", + "Leica CL", + "Leica C-Lux / CAM-DC25", + "Leica Digilux 2", + "Leica Digilux 3", + "Leica Digital-Modul-R", + "Leica D-LUX2", + "Leica D-LUX3", + "Leica D-LUX4", + "Leica D-LUX5", + "Leica D-LUX6", + "Leica D-LUX7", + "Leica D-Lux (Typ 109)", + "Leica M8", + "Leica M8.2", + "Leica M9", + "Leica M10", + "Leica M10-D", + "Leica M10-P", + "Leica M10-R", + "Leica M10 Monochrom", + "Leica M11", + "Leica M11 Monochrom", + "Leica M (Typ 240)", + "Leica M (Typ 262)", + "Leica Monochrom (Typ 240)", + "Leica Monochrom (Typ 246)", + "Leica M-D (Typ 262)", + "Leica M-E", + "Leica M-P", + "Leica R8", + "Leica Q (Typ 116)", + "Leica Q-P", + "Leica Q2", + "Leica Q2 Monochrom", + "Leica Q3", + "Leica S", + "Leica S2", + "Leica S3", + "Leica S (Typ 007)", + "Leica SL (Typ 601)", + "Leica SL2", + "Leica SL2-S", + "Leica T (Typ 701)", + "Leica TL", + "Leica TL2", + "Leica X1", + "Leica X (Typ 113)", + "Leica X2", + "Leica X-E (Typ 102)", + "Leica X-U (Typ 113)", + "Leica V-LUX1", + "Leica V-LUX2", + "Leica V-LUX3", + "Leica V-LUX4", + "Leica V-LUX5", + "Leica V-Lux (Typ 114)", + "Leica X VARIO (Typ 107)", + "LG G3", + "LG G4", + "LG G5 (H850)", + "LG G6", + "LG V20 (F800K)", + "LG V20 (H910)", + "LG VS995", + "Logitech Fotoman Pixtura", + "Mamiya ZD", + "Matrix 4608x3288", + "Meizy MX4", + "Micron 2010", + "Minolta RD175 / Agfa ActionCam", + "Minolta DiMAGE 5", + "Minolta DiMAGE 7", + "Minolta DiMAGE 7i", + "Minolta DiMAGE 7Hi", + "Minolta DiMAGE A1", + "Minolta DiMAGE A2", + "Minolta DiMAGE A200", + "Minolta DiMAGE G400", + "Minolta DiMAGE G500", + "Minolta DiMAGE G530", + "Minolta DiMAGE G600", + "Minolta DiMAGE Z2", + "Minolta Alpha/Dynax/Maxxum 5D", + "Minolta Alpha/Dynax/Maxxum 7D", + "Motorola PIXL", + "Motorola Moto G (5S)", + "Motorola Moto G7 Play", + "Nikon D1", + "Nikon D1H", + "Nikon D1X", + "Nikon D2H", + "Nikon D2Hs", + "Nikon D2X", + "Nikon D2Xs", + "Nikon D3", + "Nikon D3s", + "Nikon D3X", + "Nikon D4", + "Nikon D4s", + "Nikon D40", + "Nikon D40X", + "Nikon D5", + "Nikon D50", + "Nikon D6", + "Nikon D60", + "Nikon D70", + "Nikon D70s", + "Nikon D80", + "Nikon D90", + "Nikon D100", + "Nikon D200", + "Nikon D300", + "Nikon D300s", + "Nikon D500", + "Nikon D600", + "Nikon D610", + "Nikon D700", + "Nikon D750", + "Nikon D780", + "Nikon D800", + "Nikon D800E", + "Nikon D810", + "Nikon D810A", + "Nikon D850", + "Nikon D3000", + "Nikon D3100", + "Nikon D3200", + "Nikon D3300", + "Nikon D3400", + "Nikon D3500", + "Nikon D5000", + "Nikon D5100", + "Nikon D5200", + "Nikon D5300", + "Nikon D5500", + "Nikon D5600", + "Nikon D7000", + "Nikon D7100", + "Nikon D7200", + "Nikon D7500", + "Nikon Df", + "Nikon Z 5", + "Nikon Z 6", + "Nikon Z 6 II", + "Nikon Z 7", + "Nikon Z 7 II", + "Nikon Z 8 (HE/HE* formats are not supported yet)", + "Nikon Z 9 (HE/HE* formats are not supported yet)", + "Nikon Z 30", + "Nikon Z 50", + "Nikon Z fc", + "Nikon 1 AW1", + "Nikon 1 J1", + "Nikon 1 J2", + "Nikon 1 J3", + "Nikon 1 J4", + "Nikon 1 J5", + "Nikon 1 S1", + "Nikon 1 S2", + "Nikon 1 V1", + "Nikon 1 V2", + "Nikon 1 V3", + "Nikon Coolpix 700 (\"DIAG RAW\" hack)", + "Nikon Coolpix 800 (\"DIAG RAW\" hack)", + "Nikon Coolpix 880 (\"DIAG RAW\" hack)", + "Nikon Coolpix 900 (\"DIAG RAW\" hack)", + "Nikon Coolpix 950 (\"DIAG RAW\" hack)", + "Nikon Coolpix 990 (\"DIAG RAW\" hack)", + "Nikon Coolpix 995 (\"DIAG RAW\" hack)", + "Nikon Coolpix 2100 (\"DIAG RAW\" hack)", + "Nikon Coolpix 2500 (\"DIAG RAW\" hack)", + "Nikon Coolpix 3200 (\"DIAG RAW\" hack)", + "Nikon Coolpix 3700 (\"DIAG RAW\" hack)", + "Nikon Coolpix 4300 (\"DIAG RAW\" hack)", + "Nikon Coolpix 4500 (\"DIAG RAW\" hack)", + "Nikon Coolpix 5000", + "Nikon Coolpix 5400", + "Nikon Coolpix 5700", + "Nikon Coolpix 8400", + "Nikon Coolpix 8700", + "Nikon Coolpix 8800", + "Nikon Coolpix A", + "Nikon Coolpix A1000", + "Nikon Coolpix B700", + "Nikon Coolpix P330", + "Nikon Coolpix P340", + "Nikon Coolpix P950", + "Nikon Coolpix P6000", + "Nikon Coolpix P1000", + "Nikon Coolpix P7000", + "Nikon Coolpix P7100", + "Nikon Coolpix P7700", + "Nikon Coolpix P7800", + "Nikon Coolpix S6 (\"DIAG RAW\" hack)", + "Nikon Coolscan NEF", + "Nokia 7 Plus", + "Nokia 8.3 5G", + "Nokia 9", + "Nokia N95", + "Nokia X2", + "Nokia 1200x1600", + "Nokia Lumia 930", + "Nokia Lumia 950 XL", + "Nokia Lumia 1020", + "Nokia Lumia 1520", + "Olympus AIR A01", + "Olympus C-3030Z", + "Olympus C-5050Z", + "Olympus C-5060WZ", + "Olympus C-7070WZ", + "Olympus C-70Z / C-7000Z", + "Olympus C-740UZ", + "Olympus C-770UZ", + "Olympus C-8080WZ", + "Olympus X200 / D-560Z / C-350Z", + "Olympus E-1", + "Olympus E-3", + "Olympus E-5", + "Olympus E-10", + "Olympus E-20 / E-20N / E-20P", + "Olympus E-30", + "Olympus E-300", + "Olympus E-330", + "Olympus E-400", + "Olympus E-410", + "Olympus E-420", + "Olympus E-450", + "Olympus E-500", + "Olympus E-510", + "Olympus E-520", + "Olympus E-600", + "Olympus E-620", + "Olympus E-P1", + "Olympus E-P2", + "Olympus E-P3", + "Olympus E-P5", + "Olympus E-P7", + "Olympus E-PL1", + "Olympus E-PL1s", + "Olympus E-PL2", + "Olympus E-PL3", + "Olympus E-PL5", + "Olympus E-PL6", + "Olympus E-PL7", + "Olympus E-PL8", + "Olympus E-PL9", + "Olympus E-PL10", + "Olympus E-PM1", + "Olympus E-PM2", + "Olympus E-M1", + "Olympus E-M1 Mark II", + "Olympus E-M1 Mark III", + "Olympus E-M1X", + "Olympus E-M10", + "Olympus E-M10 Mark II", + "Olympus E-M10 Mark III", + "Olympus E-M10 Mark IV", + "Olympus E-M5", + "Olympus E-M5 Mark II", + "Olympus E-M5 Mark III", + "Olympus Pen-F", + "Olympus SP-310", + "Olympus SP-320", + "Olympus SP-350", + "Olympus SP-500UZ", + "Olympus SP-510UZ", + "Olympus SP-550UZ", + "Olympus SP-560UZ", + "Olympus SP-565UZ", + "Olympus SP-570UZ", + "Olympus Stylus 1", + "Olympus Stylus 1s", + "Olympus SH-2", + "Olympus SH-3", + "Olympus TG-4", + "Olympus TG-5", + "Olympus TG-6", + "Olympus XZ-1", + "Olympus XZ-2", + "Olympus XZ-10", + "OM Digital Solutions OM-1", + "OM Digital Solutions OM-5", + "OmniVision 4688", + "OmniVision OV5647", + "OmniVision OV5648", + "OmniVision OV8850", + "OmniVision 13860", + "OnePlus 6 (A6003)", + "OnePlus 6T", + "OnePlus 7 Pro (GM1913)", + "OnePlus 8 Pro (IN2023)", + "OnePlus One", + "OnePlus A3303", + "OnePlus A5000", + "Panasonic DMC-CM1", + "Panasonic DMC-FZ8", + "Panasonic DMC-FZ18", + "Panasonic DMC-FZ28", + "Panasonic DMC-FZ30", + "Panasonic DMC-FZ35 / FZ38", + "Panasonic DMC-FZ40 / FZ42 / FZ45", + "Panasonic DMC-FZ50", + "Panasonic DMC-FZ70 / FZ72", + "Panasonic DC-FZ80 / FZ81 / FZ82 / FZ83 / FZ85", + "Panasonic DMC-FZ100", + "Panasonic DMC-FZ150", + "Panasonic DMC-FZ200", + "Panasonic DMC-FZ300 / FZ330", + "Panasonic DMC-FZ1000", + "Panasonic DC-FZ1000 II / FZ1000M2 / DC-FZ10002", + "Panasonic DMC-FZ2000 / FZ2500 / FZH1", + "Panasonic DMC-FX150 / FX180", + "Panasonic DMC-G1", + "Panasonic DMC-G10", + "Panasonic DMC-G2", + "Panasonic DMC-G3", + "Panasonic DMC-G5", + "Panasonic DMC-G6", + "Panasonic DMC-G7 / G70", + "Panasonic DMC-G8 / G80 / G81 / G85", + "Panasonic DC-G9", + "Panasonic DC-G9 Mark II", + "Panasonic DC-G90 / G95 / G91 / G99", + "Panasonic DC-G100 / G110", + "Panasonic DMC-GF1", + "Panasonic DMC-GF2", + "Panasonic DMC-GF3", + "Panasonic DMC-GF5", + "Panasonic DMC-GF6", + "Panasonic DMC-GF7", + "Panasonic DC-GF10 / GF90", + "Panasonic DMC-GH1", + "Panasonic DMC-GH2", + "Panasonic DMC-GH3", + "Panasonic DMC-GH4", + "Panasonic AG-GH4", + "Panasonic DC-GH5", + "Panasonic DC-GH5S", + "Panasonic DC-GH5 Mark II", + "Panasonic DC-GH6", + "Panasonic DMC-GM1", + "Panasonic DMC-GM1s", + "Panasonic DMC-GM5", + "Panasonic DMC-GX1", + "Panasonic DMC-GX7", + "Panasonic DMC-GX8", + "Panasonic DC-GX9 / GX7mkIII", + "Panasonic DMC-GX80 / GX85, DMC-GX7mkII", + "Panasonic DC-GX800 / GX850, DC-GF9", + "Panasonic DMC-L1", + "Panasonic DMC-L10", + "Panasonic DMC-LC1", + "Panasonic DMC-LF1", + "Panasonic DMC-LX1", + "Panasonic DMC-LX2", + "Panasonic DMC-LX3", + "Panasonic DMC-LX5", + "Panasonic DMC-LX7", + "Panasonic DMC-LX9 / LX10 / LX15", + "Panasonic DMC-LX100", + "Panasonic DC-LX100M2", + "Panasonic DC-S1", + "Panasonic DC-S1H", + "Panasonic DC-S1R", + "Panasonic DC-S5", + "Panasonic DC-S5 MkII", + "Panasonic DMC-ZS40, DMC-TZ60 / TZ61", + "Panasonic DMC-ZS50, DMC-TZ70 / TZ71", + "Panasonic DMC-ZS60, DMC-TZ80 / TZ81 / TZ82 / TZ85", + "Panasonic DC-ZS70, DC-TZ90 / TZ91 / TZ92 / TZ93", + "Panasonic DC-ZS80, DC-TZ95 / TZ96 / TZ97", + "Panasonic DMC-ZS100 / ZS110, DMC-TZ100 / TZ101 / TZ110, DMC-TX1", + "Panasonic DC-ZS200 / ZS220, DC-TZ200 / TZ202 / TZ220, DC-TX2", + "Panasonic DC-ZS200D / ZS220D, DC-TZ200D / TZ202D / TZ220D", + "PARROT Anafi", + "PARROT Bebop 2", + "PARROT Bebop Drone", + "Pentax *ist D", + "Pentax *ist DL", + "Pentax *ist DL2", + "Pentax *ist DS", + "Pentax *ist DS2", + "Pentax K10D", + "Pentax K20D", + "Pentax K100D", + "Pentax K100D Super", + "Pentax K110D", + "Pentax K200D", + "Pentax K2000/K-m", + "Pentax KP", + "Pentax K-x", + "Pentax K-r", + "Pentax K-01", + "Pentax K-1", + "Pentax K-1 Mark II", + "Pentax K-3", + "Pentax K-3 Mark II", + "Pentax K-3 Mark III", +// "Pentax K-3 Mark III Monochrome", + "Pentax K-30", + "Pentax K-5", + "Pentax K-5 II", + "Pentax K-5 IIs", + "Pentax K-50", + "Pentax K-500", + "Pentax K-7", + "Pentax K-70", + "Pentax K-S1", + "Pentax K-S2", + "Pentax MX-1", + "Pentax Q", + "Pentax Q7", + "Pentax Q10", + "Pentax QS-1", + "Pentax Optio S (secret menu or hack)", + "Pentax Optio S4 (secret menu or hack)", + "Pentax Optio 33WR (secret menu or hack)", + "Pentax Optio 750Z (secret menu or hack)", + "Pentax 645D", + "Pentax 645Z", + "PhaseOne IQ140", + "PhaseOne IQ150", + "PhaseOne IQ160", + "PhaseOne IQ180", + "PhaseOne IQ180 IR", + "PhaseOne IQ250", + "PhaseOne IQ260", + "PhaseOne IQ260 Achromatic", + "PhaseOne IQ280", + "PhaseOne IQ3 50MP", + "PhaseOne IQ3 60MP", + "PhaseOne IQ3 80MP", + "PhaseOne IQ3 100MP", + "PhaseOne IQ3 100MP Trichromatic", + "PhaseOne IQ4 150MP", + "PhaseOne LightPhase", + "PhaseOne Achromatic+", + "PhaseOne H 10", + "PhaseOne H 20", + "PhaseOne H 25", + "PhaseOne P 20", + "PhaseOne P 20+", + "PhaseOne P 21", + "PhaseOne P 25", + "PhaseOne P 25+", + "PhaseOne P 30", + "PhaseOne P 30+", + "PhaseOne P 40+", + "PhaseOne P 45", + "PhaseOne P 45+", + "PhaseOne P 65", + "PhaseOne P 65+", + "Photron BC2-HD", + "Pixelink A782", +#ifdef USE_X3FTOOLS + "Polaroid x530", +#endif + "RaspberryPi Camera", + "RaspberryPi Camera V2", +#ifdef USE_6BY9RPI + "RaspberryPi HQ Camera", +#endif + "Ricoh GR", + "Realme 3 Pro", + "Ricoh GR II", + "Ricoh GR III", + "Ricoh GR IIIx", + "Ricoh GR Digital", + "Ricoh GR Digital II", + "Ricoh GR Digital III", + "Ricoh GR Digital IV", + "Ricoh Caplio GX100", + "Ricoh Caplio GX200", + "Ricoh GXR Mount A12", + "Ricoh GXR GR Lens A12 50mm F2.5 Macro", + "Ricoh GXR GR Lens A12 28mm F2.5", + "Ricoh GXR Ricoh Lens A16 24-85mm F3.5-5.5", + "Ricoh GXR Ricoh Lens S10 24-72mm F2.5-4.4 VC", + "Ricoh GXR Ricoh Lens P10 28-300 mm F3.5-5.6 VC", + "Rollei d530flex", + "RoverShot 3320af", + "Samsung EX1 / TL500", + "Samsung EX2F", + "Samsung GX-1L", + "Samsung GX-1S", + "Samsung GX10", + "Samsung GX20", + "Samsung Galaxy Nexus", + "Samsung Galaxy Note 9", + "Samsung Galaxy NX (EK-GN120)", + "Samsung Galaxy S3", + "Samsung Galaxy S6 (SM-G920F)", + "Samsung Galaxy S7", + "Samsung Galaxy S7 Edge", + "Samsung Galaxy S8 (SM-G950U)", + "Samsung Galaxy S9 (SM-G960F)", + "Samsung Galaxy S9+ (SM-G965U / 965F)", + "Samsung Galaxy S10 (SM-G973F)", + "Samsung Galaxy S10+ (SM-G975U)", + "Samsung Galaxy S22 Ultra (SM-S908B)", + "Samsung NX1", + "Samsung NX5", + "Samsung NX10", + "Samsung NX11", + "Samsung NX100", + "Samsung NX1000", + "Samsung NX1100", + "Samsung NX20", + "Samsung NX200", + "Samsung NX210", + "Samsung NX2000", + "Samsung NX30", + "Samsung NX300", + "Samsung NX300M", + "Samsung NX3000", + "Samsung NX500", + "Samsung NX mini / NXF1", + "Samsung Pro815", + "Samsung WB550 / WB560 / HZ15W", + "Samsung WB2000 / TL350", + "Samsung WB5000 / HZ25W", + "Samsung S85 (hacked)", + "Samsung S850 (hacked)", + "Sarnoff 4096x5440", + "Seitz 6x17", + "Seitz Roundshot D3", + "Seitz Roundshot D2X", + "Seitz Roundshot D2Xs", + "Skydio 2+", + "Sigma fp", +#ifdef USE_X3FTOOLS + "Sigma SD9 (raw decode only)", + "Sigma SD10 (raw decode only)", + "Sigma SD14 (raw decode only)", + "Sigma SD15 (raw decode only)", + "Sigma SD1", + "Sigma SD1 Merrill", + "Sigma DP1", + "Sigma DP1 Merrill", + "Sigma DP1S", + "Sigma DP1X", + "Sigma DP2", + "Sigma DP2 Merrill", + "Sigma DP2S", + "Sigma DP2X", + "Sigma DP3 Merrill", + "Sigma dp0 Quattro", + "Sigma dp1 Quattro", + "Sigma dp2 Quattro", + "Sigma dp3 Quattro", + "Sigma sd Quattro", + "Sigma sd Quattro H", +#else + "Sigma dp0 Quattro (DNG only)", + "Sigma dp1 Quattro (DNG only)", + "Sigma dp2 Quattro (DNG only)", + "Sigma dp3 Quattro (DNG only)", + "Sigma sd Quattro (DNG only)", + "Sigma sd Quattro H (DNG only)", +#endif + "Sinar eMotion 22", + "Sinar eMotion 54", + "Sinar eSpirit 65", + "Sinar eMotion 75", + "Sinar eVolution 75", + "Sinar 3072x2048 (Sinarback 23)", + "Sinar 4080x4080 (Sinarback 44)", + "Sinar 4080x5440", + "Sinar STI format", + "Sinar Sinarback 54", + "SMaL Ultra-Pocket 3", + "SMaL Ultra-Pocket 4", + "SMaL Ultra-Pocket 5", + "Sony ILCE-1 (A1)", + "Sony ILCE-7 (A7)", + "Sony ILCE-7M2 (A7 II)", + "Sony ILCE-7M3 (A7 III)", + "Sony ILCE-7M4 (A7 IV)", + "Sony ILCE-7C (A7C)", + "Sony ILCE-7CR (A7CR)", + "Sony ILCE-7CM2 (A7C II)", + "Sony ILCE-7R (A7R)", + "Sony ILCE-7RM2 (A7R II)", + "Sony ILCE-7RM3 (A7R III)", + "Sony ILCE-7RM3A (A7R IIIA)", + "Sony ILCE-7RM4 (A7R IV)", + "Sony ILCE-7RM4A (A7R IVA)", + "Sony ILCE-7RM5 (A7R V)", + "Sony ILCE-7S (A7S)", + "Sony ILCE-7SM2 (A7S II)", + "Sony ILCE-7SM3 (A7S III)", + "Sony ILCE-9 (A9)", + "Sony ILCE-9M2 (A9 II)", + "Sony ILCA-68 (A68)", + "Sony ILCA-77M2 (A77-II)", + "Sony ILCA-99M2 (A99-II)", + "Sony ILCE-3000 / 3500", + "Sony ILCE-5000", + "Sony ILCE-5100", + "Sony ILCE-6000", + "Sony ILCE-6100", + "Sony ILCE-6300", + "Sony ILCE-6400", + "Sony ILCE-6500", + "Sony ILCE-6600", + "Sony ILCE-6700", + "Sony ILCE-QX1", + "Sony DSC-F828", + "Sony DSC-HX95", + "Sony DSC-HX99", + "Sony DSC-R1", + "Sony DSC-RX0", + "Sony DSC-RX0 II", + "Sony DSC-RX1", + "Sony DSC-RX1R", + "Sony DSC-RX1R II", + "Sony DSC-RX10", + "Sony DSC-RX10 II", + "Sony DSC-RX10 III", + "Sony DSC-RX10 IV", + "Sony DSC-RX100", + "Sony DSC-RX100 II", + "Sony DSC-RX100 III", + "Sony DSC-RX100 IV", + "Sony DSC-RX100 V", + "Sony DSC-RX100 VA", + "Sony DSC-RX100 VI", + "Sony DSC-RX100 VII", + "Sony DSC-V3", + "Sony DSLR-A100", + "Sony DSLR-A200", + "Sony DSLR-A230", + "Sony DSLR-A290", + "Sony DSLR-A300", + "Sony DSLR-A330", + "Sony DSLR-A350", + "Sony DSLR-A380 / A390", + "Sony DSLR-A450", + "Sony DSLR-A500", + "Sony DSLR-A550", + "Sony DSLR-A560", + "Sony DSLR-A580", + "Sony DSLR-A700", + "Sony DSLR-A850", + "Sony DSLR-A900", + "Sony NEX-3", + "Sony NEX-3N", + "Sony NEX-5", + "Sony NEX-5N", + "Sony NEX-5R", + "Sony NEX-5T", + "Sony NEX-6", + "Sony NEX-7", + "Sony NEX-C3", + "Sony NEX-F3", + "Sony NEX-VG20", + "Sony NEX-VG30", + "Sony NEX-VG900", + "Sony SLT-A33", + "Sony SLT-A35", + "Sony SLT-A37", + "Sony SLT-A55(V)", + "Sony SLT-A57", + "Sony SLT-A58", + "Sony SLT-A65(V)", + "Sony SLT-A77(V)", + "Sony SLT-A99(V)", + "Sony XCD-SX910CR", + "Sony IMX135-mipi 13mp", + "Sony IMX135-QCOM", + "Sony IMX072-mipi", + "Sony IMX214", + "Sony IMX219", + "Sony IMX230", + "Sony IMX298-mipi 16mp", + "Sony IMX219-mipi 8mp", + "Sony Xperia 5 II (XQ-AS52)", + "Sony Xperia L", + "Sony Xperia 1 III", + "Sony Xperia 1 IV (XQ-CT54)", + "Sony ZV-1 (DCZV1/B)", + "Sony ZV-1M2", + "Sony ZV-E1", + "Sony ZV-E10", + "STV680 VGA", + "PtGrey GRAS-50S5C", + "JaiPulnix BB-500CL", + "JaiPulnix BB-500GE", + "SVS SVS625CL", + "Vivo X51 5G (V2006)", + "Yi M1", + "YUNEEC CGO3", + "YUNEEC CGO3P", + "YUNEEC CGO4", + "Xiaomi 12S Ultra (2203121C)", + "Xiaomi 13 Pro (2210132G)", + "Xiaomi MI3", + "Xiaomi MI 8", + "Xiaomi MI 9 Lite", + "Xiaomi MI MAX", + "Xiaomi POCO M3", + "Xiaomi RedMi Note3 Pro", + "Xiaomi RedMi Note7", + "Xiaomi RedMi Note 8T", + "Xiaomi FIMI X8SE", + "Xiaoyi YIAC3 (YI 4k)", + "Zeiss ZX1", + "Zenit M", + NULL +}; +// clang-format on + +const char **LibRaw::cameraList() { return static_camera_list; } +int LibRaw::cameraCount() +{ + return (sizeof(static_camera_list) / sizeof(static_camera_list[0])) - 1; +} diff --git a/rtengine/libraw/src/tables/colorconst.cpp b/rtengine/libraw/src/tables/colorconst.cpp new file mode 100644 index 000000000..5e178e2d6 --- /dev/null +++ b/rtengine/libraw/src/tables/colorconst.cpp @@ -0,0 +1,57 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/libraw_cxx_defs.h" + +const double LibRaw_constants::xyz_rgb[3][3] = { + {0.4124564, 0.3575761, 0.1804375}, + {0.2126729, 0.7151522, 0.0721750}, + {0.0193339, 0.1191920, 0.9503041}}; + +const float LibRaw_constants::d65_white[3] = {0.95047f, 1.0f, 1.08883f}; + +const double LibRaw_constants::xyzd50_srgb[3][3] = { + {0.436083, 0.385083, 0.143055}, + {0.222507, 0.716888, 0.060608}, + {0.013930, 0.097097, 0.714022}}; +const double LibRaw_constants::rgb_rgb[3][3] = { + {1, 0, 0}, {0, 1, 0}, {0, 0, 1}}; +const double LibRaw_constants::adobe_rgb[3][3] = { + {0.715146, 0.284856, 0.000000}, + {0.000000, 1.000000, 0.000000}, + {0.000000, 0.041166, 0.958839}}; +const double LibRaw_constants::wide_rgb[3][3] = { + {0.593087, 0.404710, 0.002206}, + {0.095413, 0.843149, 0.061439}, + {0.011621, 0.069091, 0.919288}}; +const double LibRaw_constants::prophoto_rgb[3][3] = { + {0.529317, 0.330092, 0.140588}, + {0.098368, 0.873465, 0.028169}, + {0.016879, 0.117663, 0.865457}}; +const double LibRaw_constants::aces_rgb[3][3] = { +// Coffin's values (commented out) are not adapted from ACES "D60-like" WP to D65 +// {0.432996, 0.375380, 0.189317}, +// {0.089427, 0.816523, 0.102989}, +// {0.019165, 0.118150, 0.941914}}; + {0.43968015, 0.38295299, 0.17736686}, + {0.08978964, 0.81343316, 0.09677734}, + {0.01754827, 0.11156156, 0.87089017}}; +const double LibRaw_constants::dcip3d65_rgb[3][3] = { + {0.822488, 0.177511, 0.000000}, + {0.033200, 0.966800, 0.000000}, + {0.017089, 0.072411, 0.910499}}; +const double LibRaw_constants::rec2020_rgb[3][3] = { + {0.627452, 0.329249, 0.043299}, + {0.069109, 0.919531, 0.011360}, + {0.016398, 0.088030, 0.895572}}; diff --git a/rtengine/libraw/src/tables/colordata.cpp b/rtengine/libraw/src/tables/colordata.cpp new file mode 100644 index 000000000..08bc5314b --- /dev/null +++ b/rtengine/libraw/src/tables/colordata.cpp @@ -0,0 +1,1895 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +/* + All matrices are from Adobe DNG Converter unless otherwise noted. + */ +int LibRaw::adobe_coeff(unsigned make_idx, const char *t_model, + int internal_only) +{ + // clang-format off + static const struct + { + unsigned m_idx; + const char *prefix; + int t_black, t_maximum, trans[12]; + } table[] = { + { LIBRAW_CAMERAMAKER_Agfa, "DC-833m", 0, 0, + { 11438,-3762,-1115,-2409,9914,2497,-1227,2295,5300 } }, /* DJC */ + + { LIBRAW_CAMERAMAKER_Apple, "QuickTake", 0, 0, + { 21392,-5653,-3353,2406,8010,-415,7166,1427,2078 } }, /* DJC */ + + { LIBRAW_CAMERAMAKER_Broadcom, "RPi IMX219", 66, 0x3ff, + { 5302,1083,-728,-5320,14112,1699,-863,2371,5136 } }, /* LibRaw */ + { LIBRAW_CAMERAMAKER_Broadcom, "RPi OV5647", 16, 0x3ff, + { 12782,-4059,-379,-478,9066,1413,1340,1513,5176 } }, /* DJC */ + { LIBRAW_CAMERAMAKER_Broadcom, "Pi", 16, 0x3ff, + { 12782,-4059,-379,-478,9066,1413,1340,1513,5176 } }, /* DJC */ + +#ifdef USE_6BY9RPI // this code normalizes model to LIBRAW_CAMERAMAKER_RaspberryPi + { LIBRAW_CAMERAMAKER_RaspberryPi, "RP_imx477", 0, 0, // Do not set black, it is set at parser to 256 or 64 + { 5603, -1351, -600, -2872, 11180, 2132, 600, 453, 5821 } }, /* PyDNG */ + { LIBRAW_CAMERAMAKER_RaspberryPi, "RP_imx", 66, 0x3ff, + { 5302,1083,-728,-5320,14112,1699,-863,2371,5136 } }, /* LibRaw */ + { LIBRAW_CAMERAMAKER_RaspberryPi, "ov5647", 16, 0x3ff, + { 12782,-4059,-379,-478,9066,1413,1340,1513,5176 } }, /* DJC */ +#endif + { LIBRAW_CAMERAMAKER_Canon, "EOS D30", 0, 0, + { 9900,-2771,-1324,-7072,14229,3140,-2790,3344,8861 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS D60", 0, 0xfa0, + { 6211,-1358,-896,-8557,15766,3012,-3001,3507,8567 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 5DS", 0, 0x3c96, // same CMs: 5DS, "5DS R" */ + { 6250,-711,-808,-5153,12794,2636,-1249,2198,5610 } }, // v.2 + { LIBRAW_CAMERAMAKER_Canon, "EOS 5D Mark IV", 0, 0, + { 6446,-366,-864,-4436,12204,2513,-952,2496,6348 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 5D Mark III", 0, 0x3c80, + { 6722,-635,-963,-4287,12460,2028,-908,2162,5668 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 5D Mark II", 0, 0x3cf0, + { 4716,603,-830,-7798,15474,2480,-1496,1937,6651 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 5D", 0, 0xe6c, + { 6347,-479,-972,-8297,15954,2480,-1968,2131,7649 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 6D Mark II", 0, 0x38de, + { 6875,-970,-932,-4691,12459,2501,-874,1953,5809 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 6D", 0, 0x3c82, + { 7034,-804,-1014,-4420,12564,2058,-851,1994,5758 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 77D", 0, 0, + { 7377,-742,-998,-4235,11981,2549,-673,1918,5538 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 7D Mark II", 0, 0x3510, + { 7268,-1082,-969,-4186,11839,2663,-825,2029,5839 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 7D", 0, 0x3510, + { 6844,-996,-856,-3876,11761,2396,-593,1772,6198 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 850D", 0, 0, + { 9079,-1923,-1236,-4677,12454,2492,-922,2319,5565}}, + { LIBRAW_CAMERAMAKER_Canon, "EOS 800D", 0, 0, + { 6970,-512,-968,-4425,12161,2553,-739,1982,5601 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 80D", 0, 0, + { 7457,-671,-937,-4849,12495,2643,-1213,2354,5492 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 10D", 0, 0xfa0, + { 8250,-2044,-1127,-8092,15606,2664,-2893,3453,8348 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 250D", 0, 0, + { 9079,-1923,-1236,-4677,12454,2492,-922,2319,5565 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 200D", 0, 0, + { 7377,-742,-998,-4235,11981,2549,-673,1918,5538 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 20Da", 0, 0, + { 14155,-5065,-1382,-6550,14633,2039,-1623,1824,6561 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 20D", 0, 0xfff, + { 6599,-537,-891,-8071,15783,2424,-1983,2234,7462 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 30D", 0, 0, + { 6257,-303,-1000,-7880,15621,2396,-1714,1904,7046 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 40D", 0, 0x3f60, + { 6071,-747,-856,-7653,15365,2441,-2025,2553,7315 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 50D", 0, 0x3d93, + { 4920,616,-593,-6493,13964,2784,-1774,3178,7005 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 60Da", 0, 0x2ff7, + { 17492,-7240,-2023,-1791,10323,1701,-186,1329,5406 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 60D", 0, 0x2ff7, + { 6719,-994,-925,-4408,12426,2211,-887,2129,6051 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 70D", 0, 0x3bc7, + { 7034,-804,-1014,-4420,12564,2058,-851,1994,5758 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 100D", 0, 0x350f, + { 6602,-841,-939,-4472,12458,2247,-975,2039,6148 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 300D", 0, 0xfa0, + { 8250,-2044,-1127,-8092,15606,2664,-2893,3453,8348 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 350D", 0, 0xfff, + { 6018,-617,-965,-8645,15881,2975,-1530,1719,7642 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 3000D", 0, 0, + { 6939,-1016,-866,-4428,12473,2177,-1175,2178,6162 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 400D", 0, 0xe8e, + { 7054,-1501,-990,-8156,15544,2812,-1278,1414,7796 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 450D", 0, 0x390d, + { 5784,-262,-821,-7539,15064,2672,-1982,2681,7427 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 500D", 0, 0x3479, + { 4763,712,-646,-6821,14399,2640,-1921,3276,6561 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 550D", 0, 0x3dd7, + { 6941,-1164,-857,-3825,11597,2534,-416,1540,6039 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 600D", 0, 0x3510, + { 6461,-907,-882,-4300,12184,2378,-819,1944,5931 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 650D", 0, 0x354d, + { 6602,-841,-939,-4472,12458,2247,-975,2039,6148 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 750D", 0, 0x3c00, + { 6362,-823,-847,-4426,12109,2616,-743,1857,5635 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 760D", 0, 0x3c00, + { 6362,-823,-847,-4426,12109,2616,-743,1857,5635 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 700D", 0, 0x3c00, + { 6602,-841,-939,-4472,12458,2247,-975,2039,6148 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 90D", 0, 0, + { 11498, -3759, -1516, -5073, 12954, 2349, -892, 1867, 6118}}, + { LIBRAW_CAMERAMAKER_Canon, "EOS 1000D", 0, 0xe43, + { 6771,-1139,-977,-7818,15123,2928,-1244,1437,7533 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 1100D", 0, 0x3510, + { 6444,-904,-893,-4563,12308,2535,-903,2016,6728 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 1200D", 0, 0x37c2, + { 6461,-907,-882,-4300,12184,2378,-819,1944,5931 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 1300D", 0, 0x37c2, + { 6939,-1016,-866,-4428,12473,2177,-1175,2178,6162 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS 1500D", 0, 0, + { 8300,-2110,-1120,-4917,12694,2482,-938,2141,5666 } }, // v.2 + + { LIBRAW_CAMERAMAKER_Canon, "EOS RP", 0, 0, + { 8608,-2097,-1178,-5425,13265,2383,-1149,2238,5680 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS R3", 0, 0, + { 9423,-2839,-1195,-4532,12377,2415,-483,1374,5276 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS R50", 0, 0, + { 9269, -2012, -1107, -3990, 11762, 2527, -569, 2093, 4913 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS R100", 0, 0, + { 8230, -1515, -1032, -4179, 12005, 2454, -649, 2076, 4711 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS R5", 0, 0, + { 9766,-2953,-1254,-4276,12116,2433,-437,1336,5131 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS R6 Mark II", 0, 0, + { 9539, -2795, -1224, -4175, 11998, 2458, -465, 1755,6048 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS R6", 0, 0, + { 8293,-1611,-1132,-4759,12711,2275,-1013,2415,5509 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS R7", 0, 0, + { 10424, -3138, -1300, -4221, 11938, 2584, -547, 1658, 6183 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS R8", 0, 0, + { 9539, -2795, -1224, -4175, 11998, 2458, -465, 1755, 6048 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS R10", 0, 0, + { 9269, -2012, -1107, -3990, 11762, 2527, -569, 2093, 4913 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS Ra", 0, 0, + { 22880,-11531,-2223,-2034,10469,1809, 316,1401,5769 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS R", 0, 0, + { 8293,-1789,-1094,-5025,12925,2327,-1199,2769,6108 } }, // v.2 + + { LIBRAW_CAMERAMAKER_Canon, "EOS M6 Mark II", 0, 0, + { 11498,-3759,-1516,-5073,12954,2349,-892,1867,6118 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS M6", 0, 0, + { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS M50 Mark II", 0, 0, + { 10463,-2173,-1437,-4856,12635,2482,-1216,2915,7237 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS M50", 0, 0, + { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS M5", 0, 0, + { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS M3", 0, 0, + { 6362,-823,-847,-4426,12109,2616,-743,1857,5635 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS M200", 0, 0, + { 10463,-2173,-1437,-4856,12635,2482,-1216,2915,7237 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS M2", 0, 0, + { 6400,-480,-888,-5294,13416,2047,-1296,2203,6137 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS M100", 0, 0, + { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS M10", 0, 0, + { 6400,-480,-888,-5294,13416,2047,-1296,2203,6137 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS M", 0, 0, + { 6602,-841,-939,-4472,12458,2247,-975,2039,6148 } }, + + { LIBRAW_CAMERAMAKER_Canon, "EOS-1Ds Mark III", 0, 0x3bb0, + { 5859,-211,-930,-8255,16017,2353,-1732,1887,7448 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS-1Ds Mark II", 0, 0xe80, + { 6517,-602,-867,-8180,15926,2378,-1618,1771,7633 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS-1D Mark IV", 0, 0x3bb0, + { 6014,-220,-795,-4109,12014,2361,-561,1824,5787 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS-1D Mark III", 0, 0x3bb0, + { 6291,-540,-976,-8350,16145,2311,-1714,1858,7326 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS-1D Mark II N", 0, 0xe80, + { 6240,-466,-822,-8180,15825,2500,-1801,1938,8042 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS-1D Mark II", 0, 0xe80, + { 6264,-582,-724,-8312,15948,2504,-1744,1919,8664 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS-1Ds", 0, 0xe20, + { 3925,4060,-1739,-8973,16552,2545,-3287,3945,8243 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS-1D C", 0, 0x3c4e, + { 6847,-614,-1014,-4669,12737,2139,-1197,2488,6846 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS-1D X Mark III", 0, 0, + { 8971, -2022, -1242, -5405, 13249, 2380, -1280, 2483, 6072}}, + { LIBRAW_CAMERAMAKER_Canon, "EOS-1D X Mark II", 0, 0x3c4e, + { 7596,-978,-967,-4808,12571,2503,-1398,2567,5752 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS-1D X", 0, 0x3c4e, + { 6847,-614,-1014,-4669,12737,2139,-1197,2488,6846 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS-1D", 0, 0xe20, + { 6806,-179,-1020,-8097,16415,1687,-3267,4236,7690 } }, + { LIBRAW_CAMERAMAKER_Canon, "EOS C500", 853, 0, + { 17851,-10604,922,-7425,16662,763,-3660,3636,22278 } }, /* DJC */ + + { LIBRAW_CAMERAMAKER_Canon, "IXUS 160", 0, 0, + { 11657,-3781,-1136,-3544,11262,2283,-160,1219,4700 } }, /* DJC */ + {LIBRAW_CAMERAMAKER_Canon, "PowerShot 600", 0, 0, + { -3822,10019,1311,4085,-157,3386,-5341,10829,4812,-1969,10969,1126 } }, + + { LIBRAW_CAMERAMAKER_Canon, "PowerShot A3300 IS", 0, 0, + { 10826,-3654,-1023,-3215,11310,1906,0,999,4960 } }, /* DJC */ + { LIBRAW_CAMERAMAKER_Canon, "PowerShot A460", 0, 0, + { 6493,-2338,-885,-1589,5934,697,-445,1368,2543 } }, // CHDK + { LIBRAW_CAMERAMAKER_Canon, "PowerShot A470", 0, 0, + { 12513,-4407,-1242,-2680,10276,2405,-878,2215,4734 } }, /* DJC */ + { LIBRAW_CAMERAMAKER_Canon, "PowerShot A530", 0, 0, + { 7252,-2405,-1223,-2102,6560,523,-112,704,3007 } }, // CHDK + { LIBRAW_CAMERAMAKER_Canon, "PowerShot A50", 0, 0, + { -6233,10706,1825,3260,821,3980,-6512,10745,6287,-2539,12232,262 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot A5", 0, 0, + { -5707,10308,2002,2662,1829,4139,-6265,11063,6033,-2659,11911,593 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot A610", 0, 0, + { 15591,-6402,-1592,-5365,13198,2168,-1300,1824,5075 } }, /* DJC */ + { LIBRAW_CAMERAMAKER_Canon, "PowerShot A620", 0, 0, + { 15265,-6193,-1558,-4125,12116,2010,-888,1639,5220 } }, /* DJC */ + { LIBRAW_CAMERAMAKER_Canon, "PowerShot A630", 0, 0, + { 14201,-5308,-1757,-6087,14472,1617,-2191,3105,5348 } }, /* DJC */ + { LIBRAW_CAMERAMAKER_Canon, "PowerShot A640", 0, 0, + { 13124,-5329,-1390,-3602,11658,1944,-1612,2863,4885 } }, /* DJC */ + { LIBRAW_CAMERAMAKER_Canon, "PowerShot A650 IS", 0, 0, + { 9427,-3036,-959,-2581,10671,1911,-1039,1982,4430 } }, /* DJC */ + { LIBRAW_CAMERAMAKER_Canon, "PowerShot A720 IS", 0, 0, + { 14573,-5482,-1546,-1266,9799,1468,-1040,1912,3810 } }, /* DJC */ + + { LIBRAW_CAMERAMAKER_Canon, "PowerShot D10", 127, 0, + { 14052,-5229,-1156,-1325,9420,2252,-498,1957,4116 } }, /* DJC */ + + { LIBRAW_CAMERAMAKER_Canon, "PowerShot G10", 0, 0, + { 11093,-3906,-1028,-5047,12492,2879,-1003,1750,5561 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot G11", 0, 0, + { 12177,-4817,-1069,-1612,9864,2049,-98,850,4471 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot G12", 0, 0, + { 13244,-5501,-1248,-1508,9858,1935,-270,1083,4366 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot G15", 0, 0, + { 7474,-2301,-567,-4056,11456,2975,-222,716,4181 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot G16", 0, 0, + { 8020,-2687,-682,-3704,11879,2052,-965,1921,5556 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot G1 X Mark III", 0, 0, + { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot G1 X Mark II", 0, 0, + { 7378,-1255,-1043,-4088,12251,2048,-876,1946,5805 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot G1 X", 0, 0, + { 7378,-1255,-1043,-4088,12251,2048,-876,1946,5805 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot G1", 0, 0, + { -5686,10300,2223,4725,-1157,4383,-6128,10783,6163,-2688,12093,604 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot G2", 0, 0, + { 9194,-2787,-1059,-8098,15657,2608,-2610,3064,7867 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot G3 X", 0, 0, + { 9701,-3857,-921,-3149,11537,1817,-786,1817,5147 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot G3", 0, 0, + { 9326,-2882,-1084,-7940,15447,2677,-2620,3090,7740 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot G5 X Mark II",0, 0, + { 11629, -5713, -914, -2706, 11090, 1842, -206, 1225, 5515 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot G5 X",0, 0, + { 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot G5", 0, 0, + { 9869,-2972,-942,-7314,15098,2369,-1898,2536,7282 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot G6", 0, 0, + { 9876,-3774,-871,-7613,14807,3071,-1448,1305,7485 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot G7 X Mark III", 0, 0, + { 11629, -5713, -914, -2706, 11090, 1842, -206, 1225, 5515 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot G7 X Mark II", 0, 0, + { 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot G7 X", 0, 0, + { 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot G9 X Mark II", 0, 0, + { 10056,-4131,-944,-2576,11143,1625,-238,1294,5179 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot G9 X",0, 0, + { 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot G9", 0, 0, + { 7368,-2141,-598,-5621,13254,2625,-1418,1696,5743 } }, + + { LIBRAW_CAMERAMAKER_Canon, "PowerShot S2 IS", 0, 0, + { 5477,-1435,-992,-1868,6639,510,-58,792,2670 } }, // CHDK + { LIBRAW_CAMERAMAKER_Canon, "PowerShot S3 IS", 0, 0, + { 14062,-5199,-1446,-4712,12470,2243,-1286,2028,4836 } }, /* DJC */ + { LIBRAW_CAMERAMAKER_Canon, "PowerShot S30", 0, 0, + { 10744,-3813,-1142,-7962,15966,2075,-2492,2805,7744 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot S40", 0, 0, + { 8606,-2573,-949,-8237,15489,2974,-2649,3076,9100 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot S45", 0, 0, // + + { 8251,-2410,-964,-8047,15430,2823,-2380,2824,8119 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot S50", 0, 0, + { 8979,-2658,-871,-7721,15500,2357,-1773,2366,6634 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot S60", 0, 0, + { 8794,-2482,-797,-7804,15403,2572,-1422,1996,7083 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot S70", 0, 0, + { 9976,-3810,-832,-7115,14463,2906,-901,989,7889 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot S90", 0, 0, + { 12374,-5016,-1049,-1677,9902,2078,-83,852,4683 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot S95", 0, 0, + { 13440,-5896,-1279,-1236,9598,1931,-180,1001,4651 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot S120", 0, 0, + { 6961,-1685,-695,-4625,12945,1836,-1114,2152,5518 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot S110", 0, 0, + { 8039,-2643,-654,-3783,11230,2930,-206,690,4194 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot S100", 0, 0, + { 7968,-2565,-636,-2873,10697,2513,180,667,4211 } }, + + { LIBRAW_CAMERAMAKER_Canon, "PowerShot SD300", 0, 0, + { 6526,-1720,-1075,-1390,5945,602,-90,820,2380 } }, // CHDK + + { LIBRAW_CAMERAMAKER_Canon, "PowerShot SX1 IS", 0, 0, + { 6578,-259,-502,-5974,13030,3309,-308,1058,4970 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot SX20 IS", 0, 0, + { 8275,-2904,-1260,-128,5305,505,51,481,2450 } }, // CHDK + { LIBRAW_CAMERAMAKER_Canon, "PowerShot SX30 IS", 0, 0, + { 13014,-4698,-1026,-2001,9615,2386,-164,1423,3759 } }, // CHDK + { LIBRAW_CAMERAMAKER_Canon, "PowerShot SX40 HS", 0, 0, + { 54480,-17404,-8039,-7505,44044,1136,-580,7158,11891 } }, // CHDK + { LIBRAW_CAMERAMAKER_Canon, "PowerShot SX50 HS", 0, 0, + { 12432,-4753,-1247,-2110,10691,1629,-412,1623,4926 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot SX60 HS", 0, 0, + { 13161,-5451,-1344,-1989,10654,1531,-47,1271,4955 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot SX70 HS", 0, 0, + { 18285,-8907,-1951,-1845,10688,1323,364,1101,5139 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot SX110 IS", 0, 0, + { 14134,-5576,-1527,-1991,10719,1273,-1158,1929,3581 } }, /* DJC */ + { LIBRAW_CAMERAMAKER_Canon, "PowerShot SX120 IS", 0, 0, + { 7286,-2242,-1047,41,4401,457,269,684,1864 } }, // CHDK + { LIBRAW_CAMERAMAKER_Canon, "PowerShot SX220 HS", 0, 0, + { 13898,-5076,-1447,-1405,10109,1297,-244,1860,3687 } }, /* DJC */ + { LIBRAW_CAMERAMAKER_Canon, "PowerShot SX710 HS", 0, 0, + { 13161,-5451,-1344,-1989,10654,1531,-47,1271,4955 } }, + + { LIBRAW_CAMERAMAKER_Canon, "PowerShot Pro1", 0, 0, + { 10062,-3522,-1000,-7643,15117,2730,-765,817,7322 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot Pro70", 34, 0, + { -5106,10695,1576,3820,53,4566,-6497,10736,6701,-3336,11887,1394 } }, + { LIBRAW_CAMERAMAKER_Canon, "PowerShot Pro90", 0, 0, + { -5912,10768,2288,4612,-989,4333,-6153,10897,5944,-2907,12288,624 } }, + + { LIBRAW_CAMERAMAKER_Casio, "EX-F1", 0, 0, + { 9084,-2016,-848,-6711,14351,2570,-1059,1725,6135 } }, + { LIBRAW_CAMERAMAKER_Casio, "EX-FH100", 0, 0, + { 12771,-4179,-1558,-2149,10938,1375,-453,1751,4494 } }, + { LIBRAW_CAMERAMAKER_Casio, "EX-S20", 0, 0, + { 11634,-3924,-1128,-4968,12954,2015,-1588,2648,7206 } }, /* DJC */ + { LIBRAW_CAMERAMAKER_Casio, "EX-Z750", 0, 0, + { 10819,-3873,-1099,-4903,13730,1175,-1755,3751,4632 } }, /* DJC */ + { LIBRAW_CAMERAMAKER_Casio, "EX-Z10", 128, 0xfff, + { 9790,-3338,-603,-2321,10222,2099,-344,1273,4799 } }, /* DJC */ + + { LIBRAW_CAMERAMAKER_CINE, "650", 0, 0, + { 3390,480,-500,-800,3610,340,-550,2336,1192 } }, + { LIBRAW_CAMERAMAKER_CINE, "660", 0, 0, + { 3390,480,-500,-800,3610,340,-550,2336,1192 } }, + { LIBRAW_CAMERAMAKER_CINE, "", 0, 0, /* empty camera name*/ + { 20183,-4295,-423,-3940,15330,3985,-280,4870,9800 } }, + + { LIBRAW_CAMERAMAKER_Contax, "N Digital", 0, 0xf1e, + { 7777,1285,-1053,-9280,16543,2916,-3677,5679,7060 } }, + + { LIBRAW_CAMERAMAKER_DXO, "ONE", 0, 0, + { 6596,-2079,-562,-4782,13016,1933,-970,1581,5181 } }, + + { LIBRAW_CAMERAMAKER_Epson, "R-D1", 0, 0, // same CMs: R-D1, R-D1s, R-D1x + { 6827,-1878,-732,-8429,16012,2564,-704,592,7145 } }, + + { LIBRAW_CAMERAMAKER_Fujifilm, "DBP for GX680", -128, 0x0fff, + { 12741,-4916,-1420,-8510,16791,1715,-1767,2302,7771 } }, /* temp, copy from S2Pro */ + + { LIBRAW_CAMERAMAKER_Fujifilm, "E550", 0, 0, + { 11044,-3888,-1120,-7248,15167,2208,-1531,2276,8069 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "E900", 0, 0, + { 9183,-2526,-1078,-7461,15071,2574,-2022,2440,8639 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "F5", 0, 0, // F500EXR/F505EXR; F550EXR + { 13690,-5358,-1474,-3369,11600,1998,-132,1554,4395 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "F6", 0, 0, // F600EXR/F605EXR; F660EXR + { 13690,-5358,-1474,-3369,11600,1998,-132,1554,4395 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "F77", 0, 0xfe9, // F770EXR/F775EXR + { 13690,-5358,-1474,-3369,11600,1998,-132,1554,4395 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "F7", 0, 0, // same CMs: F700, F710EXR + { 10004,-3219,-1201,-7036,15047,2107,-1863,2565,7736 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "F810", 0, 0, + { 11044,-3888,-1120,-7248,15167,2208,-1531,2276,8069 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "F8", 0, 0, // F800EXR + { 13690,-5358,-1474,-3369,11600,1998,-132,1554,4395 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "F900EXR", 0, 0, + { 12085,-4727,-953,-3257,11489,2002,-511,2046,4592 } }, + + { LIBRAW_CAMERAMAKER_Fujifilm, "GFX 100 II", 0, 0, + { 12806,-5779,-1110,-3546,11507,2318,-177,996,5715 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "GFX 100", 0, 0, // same CMs: "GFX 100", "GFX 100S"/"GFX100S", "GFX 100 IR" + { 16212,-8423,-1583,-4336,12583,1937,-195,726,6199 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "GFX 50", 0, 0, // same CMs: "GFX 50S", "GFX 50R", "GFX 50S II" + { 11756,-4754,-874,-3056,11045,2305,-381,1457,6006 } }, + + { LIBRAW_CAMERAMAKER_Fujifilm, "HS10", 0, 0xf68, + { 12440,-3954,-1183,-1123,9674,1708,-83,1614,4086 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "HS2", 0, 0xfef, // HS20EXR/HS22EXR + { 13690,-5358,-1474,-3369,11600,1998,-132,1554,4395 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "HS3", 0, 0, // HS30EXR/HS33EXR/HS35EXR + { 13690,-5358,-1474,-3369,11600,1998,-132,1554,4395 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "HS50EXR", 0, 0, + { 12085,-4727,-953,-3257,11489,2002,-511,2046,4592 } }, + + { LIBRAW_CAMERAMAKER_Fujifilm, "IS-1", 0, 0, + { 21461,-10807,-1441,-2332,10599,1999,289,875,7703 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "IS Pro", 0, 0, + { 12300,-5110,-1304,-9117,17143,1998,-1947,2448,8100 } }, + + { LIBRAW_CAMERAMAKER_Fujifilm, "S5000", 0, 0, + { 8754,-2732,-1019,-7204,15069,2276,-1702,2334,6982 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "S5100", 0, 0, + { 11940,-4431,-1255,-6766,14428,2542,-993,1165,7421 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "S5200", 0, 0, // S5200/S5600 + { 9636,-2804,-988,-7442,15040,2589,-1803,2311,8621 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "S6", 0, 0, // S6000fd/S6500fd + { 12628,-4887,-1401,-6861,14996,1962,-2198,2782,7091 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "S7000", 0, 0, + { 10190,-3506,-1312,-7153,15051,2238,-2003,2399,7505 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "S9000", 0, 0, // S9000/S9500 + { 10491,-3423,-1145,-7385,15027,2538,-1809,2275,8692 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "S9100", 0, 0, // S9100/S9600 + { 12343,-4515,-1285,-7165,14899,2435,-1895,2496,8800 } }, + + { LIBRAW_CAMERAMAKER_Fujifilm, "S100FS", -514, 0, + { 11521,-4355,-1065,-6524,13767,3058,-1466,1984,6045 } }, + + { LIBRAW_CAMERAMAKER_Fujifilm, "S20Pro", 0, 0, + { 10004,-3219,-1201,-7036,15047,2107,-1863,2565,7736 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "S20", -512, 0x3fff, // S200EXR/S205EXR + { 11401,-4498,-1312,-5088,12751,2613,-838,1568,5941 } }, + + { LIBRAW_CAMERAMAKER_Fujifilm, "SL1000", 0, 0, + { 11705,-4262,-1107,-2282,10791,1709,-555,1713,4945 } }, + + { LIBRAW_CAMERAMAKER_Fujifilm, "S1", 0, 0, + { 12297,-4882,-1202,-2106,10691,1623,-88,1312,4790 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "S2Pro", -128, 0, + { 12741,-4916,-1420,-8510,16791,1715,-1767,2302,7771 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "S3Pro", 0, 0, + { 11807,-4612,-1294,-8927,16968,1988,-2120,2741,8006 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "S5Pro", 0, 0, + { 12300,-5110,-1304,-9117,17143,1998,-1947,2448,8100 } }, + + { LIBRAW_CAMERAMAKER_Fujifilm, "X100F", 0, 0, + { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X100S", 0, 0, + { 10592,-4262,-1008,-3514,11355,2465,-870,2025,6386 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X100T", 0, 0, + { 10592,-4262,-1008,-3514,11355,2465,-870,2025,6386 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X100V", 0, 0, + { 13426,-6334,-1177,-4244,12136,2371,580,1303,5980 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X100", 0, 0, + { 12161,-4457,-1069,-5034,12874,2400,-795,1724,6904 } }, + + { LIBRAW_CAMERAMAKER_Fujifilm, "X10", 0, 0, + { 13509,-6199,-1254,-4430,12733,1865,-331,1441,5022 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X20", 0, 0, + { 11768,-4971,-1133,-4904,12927,2183,-480,1723,4605 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X30", 0, 0, + { 12328,-5256,-1144,-4469,12927,1675,-87,1291,4351 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X70", 0, 0, + { 10450,-4329,-878,-3217,11105,2421,-752,1758,6519 } }, + + { LIBRAW_CAMERAMAKER_Fujifilm, "XF10", 0, 0, + { 11673,-4760,-1041,-3988,12058,2166,-771,1417,5569 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "XF1", 0, 0, + { 13509,-6199,-1254,-4430,12733,1865,-331,1441,5022 } }, + + { LIBRAW_CAMERAMAKER_Fujifilm, "XQ", 0, 0, // same CMs: XQ1, XQ2 + { 9252,-2704,-1064,-5893,14265,1717,-1101,2341,4349 } }, + + { LIBRAW_CAMERAMAKER_Fujifilm, "X-Pro1", 0, 0, + { 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X-Pro2", 0, 0, + { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X-Pro3", 0, 0, + { 13426,-6334,-1177,-4244,12136,2371,580,1303,5980 } }, + + { LIBRAW_CAMERAMAKER_Fujifilm, "X-A10", 0, 0, + { 11540,-4999,-991,-2949,10963,2278,-382,1049,5605} }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X-A20", 0, 0, + { 11540,-4999,-991,-2949,10963,2278,-382,1049,5605} }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X-A1", 0, 0, + { 11086,-4555,-839,-3512,11310,2517,-815,1341,5940 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X-A2", 0, 0, + { 10763,-4560,-917,-3346,11311,2322,-475,1135,5843 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X-A3", 0, 0, + { 12407,-5222,-1086,-2971,11116,2120,-294,1029,5284 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X-A5", 0, 0, + { 11673,-4760,-1041,-3988,12058,2166,-771,1417,5569 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X-A7", 0, 0, + { 15055,-7391,-1274,-4062,12071,2238,-610,1217,6147 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X-E1", 0, 0, + { 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X-E2S", 0, 0, + { 11562,-5118,-961,-3022,11007,2311,-525,1569,6097 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X-E2", 0, 0, + { 8458,-2451,-855,-4597,12447,2407,-1475,2482,6526 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X-E3", 0, 0, + { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X-E4", 0, 0, + { 13426, -6334, -1177, -4244, 12136, 2371, -580, 1303, 5980 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X-H1", 0, 0, + { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X-H2S", 0, 0, + { 12836, -5909, -1032, -3087, 11132, 2236, -35, 872, 5330 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X-H2", 0, 0, + { 11809, -5358, -1141, -4248, 12164, 2343, -514, 1097, 5848 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X-M1", 0, 0, + { 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X-S20", 0, 0, + { 12836, -5909, -1032, -3087, 11132, 2236, -35, 872, 5330 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X-S10", 0, 0, + { 13426,-6334,-1177,-4244,12136,2371,-580,1303,5980 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X-S1", 0, 0, + { 13509,-6199,-1254,-4430,12733,1865,-331,1441,5022 } }, + + { LIBRAW_CAMERAMAKER_Fujifilm, "X-T100", 0, 0, + { 11673,-4760,-1041,-3988,12058,2166,-771,1417,5569 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X-T1", 0, 0, /* same CMs: X-T1, "X-T1IR", "X-T1 IR", X-T10 */ + { 8458,-2451,-855,-4597,12447,2407,-1475,2482,6526 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X-T200", 0, 0, + { 15055,-7391,-1274,-4062,12071,2238,-610,1217,6147 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X-T2", 0, 0, // same CMs: X-T2, X-T20 + { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X-T3", 0, 0, // same CMs: X-T3, X-T30, "X-T30 II" + { 13426,-6334,-1177,-4244,12136,2371,580,1303,5980 } }, // v.2 + { LIBRAW_CAMERAMAKER_Fujifilm, "X-T4", 0, 0, + { 13426,-6334,-1177,-4244,12136,2371,580,1303,5980 } }, + { LIBRAW_CAMERAMAKER_Fujifilm, "X-T5", 0, 0, + { 11809, -5358, -1141, -4248, 12164, 2343, -514, 1097, 5848 } }, + + { LIBRAW_CAMERAMAKER_GITUP, "G3DUO", 130, 62000, + { 8489,-2583,-1036,-8051,15583,2643,-1307,1407,7354 } }, + + { LIBRAW_CAMERAMAKER_GITUP, "GIT2P", 4160, 0, + { 8489,-2583,-1036,-8051,15583,2643,-1307,1407,7354 } }, + { LIBRAW_CAMERAMAKER_GITUP, "GIT2", 3200, 0, + { 8489,-2583,-1036,-8051,15583,2643,-1307,1407,7354 } }, + + { LIBRAW_CAMERAMAKER_GoPro, "HERO5 Black", 0, 0, + { 10344,-4210,-620,-2315,10625,1948,93,1058,5541 } }, + + {LIBRAW_CAMERAMAKER_Hasselblad, "L1D-20c", 0, 0, + { 7310, -2746, -646, -2991, 10847, 2469, 163, 585, 6324}}, + + { LIBRAW_CAMERAMAKER_Hasselblad, "16-Uncoated-3FR", 0, 0, + { 8519, -3260, -280, -5081, 13459, 1738, -1449, 2960, 7809}}, + { LIBRAW_CAMERAMAKER_Hasselblad, "16-Uncoated-FFF", 0, 0, + { 8068, -2959, -108, -5788, 13608, 2389, -1002, 2237, 8162}}, + { LIBRAW_CAMERAMAKER_Hasselblad, "16-Uncoated", 0, 0, + { 8519, -3260, -280, -5081, 13459, 1738, -1449, 2960, 7809}}, + + { LIBRAW_CAMERAMAKER_Hasselblad, "22-Uncoated-3FR", 0, 0, + { 8523, -3257, -280, -5078, 13458, 1743, -1449, 2961, 7809}}, + { LIBRAW_CAMERAMAKER_Hasselblad, "22-Uncoated-FFF", 0, 0, + { 8068, -2959, -108, -5788, 13608, 2389, -1002, 2237, 8162}}, + { LIBRAW_CAMERAMAKER_Hasselblad, "22-Uncoated", 0, 0, + { 8519, -3260, -280, -5081, 13459, 1738, -1449, 2960, 7809}}, + + {LIBRAW_CAMERAMAKER_Hasselblad, "31-Uncoated-FFF", 0, 0, + { 5155, -1201, 200, -5841, 13197, 2950, -1101, 2317, 6988}}, + {LIBRAW_CAMERAMAKER_Hasselblad, "31-Uncoated", 0, 0, + { 5458, -1448, 145, -4479, 12338, 2401, -1659, 3086, 6710}}, + + {LIBRAW_CAMERAMAKER_Hasselblad, "39-Uncoated-3FR", 0, 0, + { 3904, -100, 262, -4318, 12407, 2128, -1598, 3594, 6233}}, + {LIBRAW_CAMERAMAKER_Hasselblad, "39-Uncoated-FFF", 0, 0, + { 4739, -932, 295, -4829, 12220, 2952, -1027, 2341, 7083}}, + {LIBRAW_CAMERAMAKER_Hasselblad, "39-Uncoated", 0, 0, + { 3894, -110, 287, -4672, 12610, 2295, -2092, 4100, 6196}}, + + { LIBRAW_CAMERAMAKER_Hasselblad, "39-Coated-3FR", 0, 0, + { 5427, -1147, 173, -3834, 12073, 1969, -1444, 3320, 5621}}, + { LIBRAW_CAMERAMAKER_Hasselblad, "39-Coated-FFF", 0, 0, + { 5323, -1233, 399, -4926, 12362, 2894, -856, 2471, 5961}}, + { LIBRAW_CAMERAMAKER_Hasselblad, "39-Coated", 0, 0, + { 3857, 452, -46, -6008, 14477, 1596, -2627, 4481, 5718}}, + + {LIBRAW_CAMERAMAKER_Hasselblad, "40-Coated5-3FR", 0, 0, + { 7014, -2067, -540, -4821, 13016, 1980, -1663, 3089, 6940}}, + {LIBRAW_CAMERAMAKER_Hasselblad, "40-Coated5-FFF", 0, 0, + { 5963, -1357, -172, -5439, 12762, 3007, -964, 2222, 7172}}, + {LIBRAW_CAMERAMAKER_Hasselblad, "40-Coated5", 0, 0, + { 6159, -1402, -177, -5439, 12762, 3007, -955, 2200, 7104}}, + + { LIBRAW_CAMERAMAKER_Hasselblad, "40-Coated-3FR", 0, 0, + { 6550, -1681, -399, -4626, 12598, 2257, -1807, 3354, 6486}}, + { LIBRAW_CAMERAMAKER_Hasselblad, "40-Coated-FFF", 0, 0, + { 6041, -1375, -174, -5439, 10000, 3007, -930, 2145, 6923}}, + { LIBRAW_CAMERAMAKER_Hasselblad, "40-Coated", 0, 0, + { 6159, -1402, -177, -5439, 12762, 3007, -955, 2200, 7104}}, + + { LIBRAW_CAMERAMAKER_Hasselblad, "50-Coated5-3FR", 0, 0, + { 5707, -693, -382, -4285, 12669, 1773, -1615, 3519, 5410}}, + { LIBRAW_CAMERAMAKER_Hasselblad, "50-Coated5-FFF", 0, 0, + { 5263, -612, 39, -4950, 12426, 2843, -935, 2423, 5941}}, + { LIBRAW_CAMERAMAKER_Hasselblad, "50-Coated5", 0, 0, + { 5656, -659, -346, -3923, 12306, 1791, -1602, 3509, 5442}}, + + { LIBRAW_CAMERAMAKER_Hasselblad, "50-Coated-3FR", 0, 0, + { 5656, -659, -346, -3923, 12305, 1790, -1602, 3509, 5442}}, + { LIBRAW_CAMERAMAKER_Hasselblad, "50-Coated-FFF", 0, 0, + { 5280, -614, 39, -4950, 12426, 2843, -939, 2434, 5968}}, + { LIBRAW_CAMERAMAKER_Hasselblad, "50-Coated", 0, 0, + { 5656, -659, -346, -3923, 12306, 1791, -1602, 3509, 5442}}, + + { LIBRAW_CAMERAMAKER_Hasselblad, "50-15-Coated5-II-3FR", 0, 0, + { 10887, -6152, 1034, -3564, 12412, 4224, 63, 626, 10123}}, + { LIBRAW_CAMERAMAKER_Hasselblad, "50-15-Coated5-II-FFF", 0, 0, + { 4932, -835, 141, -4878, 11868, 3437, -1138, 1961, 7067}}, + { LIBRAW_CAMERAMAKER_Hasselblad, "50-15-Coated5-II", 0, 0, + { 8737, -4937, 830, -2860, 9961, 3390, 51, 502, 8124}}, + + { LIBRAW_CAMERAMAKER_Hasselblad, "50-15-Coated5", 0, 0, + { 4932,-835,141,-4878,11868,3437,-1138,1961,7067 } }, + + { LIBRAW_CAMERAMAKER_Hasselblad, "60-Coated-3FR", 0, 0, + { 9296, 336, -1088, -6442, 14323, 2289, -1433, 2942, 5756}}, + { LIBRAW_CAMERAMAKER_Hasselblad, "60-Coated", 0, 0, + { 9662, -684, -279, -4903, 12293, 2950, -344, 1669, 6024}}, + + { LIBRAW_CAMERAMAKER_Hasselblad, "100-17-Coated5", 0, 0, + { 5110, -1357, -308, -5573, 12835, 3077, -1279, 2025, 7010}}, + + { LIBRAW_CAMERAMAKER_Hasselblad, "100-20-Coated6", 0, 0, + { 6468,-1899,-545,-4526,12267,2542,-388,1276,6096 } }, + + { LIBRAW_CAMERAMAKER_HTC, "One A9", 64, 1023, + { 101,-20,-2,-11,145,41,-24,1,56 } }, /* this is FM1 transposed */ + + { LIBRAW_CAMERAMAKER_Imacon, "Ixpress", 0, 0, + { 7025,-1415,-704,-5188,13765,1424,-1248,2742,6038 } }, /* DJC */ + + { LIBRAW_CAMERAMAKER_Kodak, "NC2000", 0, 0, // AP Nikon + { 13891,-6055,-803,-465,9919,642,2121,82,1291 } }, + { LIBRAW_CAMERAMAKER_Kodak, "DCS315C", -8, 0, + { 17523,-4827,-2510,756,8546,-137,6113,1649,2250 } }, + { LIBRAW_CAMERAMAKER_Kodak, "DCS330C", -8, 0, + { 20620,-7572,-2801,-103,10073,-396,3551,-233,2220 } }, + { LIBRAW_CAMERAMAKER_Kodak, "DCS420", 0, 0, + { 10868,-1852,-644,-1537,11083,484,2343,628,2216 } }, + { LIBRAW_CAMERAMAKER_Kodak, "DCS46", 0, 0, // same CM as EOSDCS1 and DCS465 DB + { 10592,-2206,-967,-1944,11685,230,2206,670,1273 } }, + { LIBRAW_CAMERAMAKER_Kodak, "DCS520C", -178, 0, // same CamID: DCS520C, "EOS D2000C" + { 24542,-10860,-3401,-1490,11370,-297,2858,-605,3225 } }, + { LIBRAW_CAMERAMAKER_Kodak, "DCS560C", -177, 0, // same CamID: DCS560C, "EOS D6000C" + { 20482,-7172,-3125,-1033,10410,-285,2542,226,3136 } }, + { LIBRAW_CAMERAMAKER_Kodak, "DCS620C", -177, 0, + { 23617,-10175,-3149,-2054,11749,-272,2586,-489,3453 } }, + { LIBRAW_CAMERAMAKER_Kodak, "DCS620X", -176, 0, + { 13095,-6231,154,12221,-21,-2137,895,4602,2258 } }, + { LIBRAW_CAMERAMAKER_Kodak, "DCS660C", -173, 0, + { 18244,-6351,-2739,-791,11193,-521,3711,-129,2802 } }, + { LIBRAW_CAMERAMAKER_Kodak, "DCS720X", 0, 0, + { 11775,-5884,950,9556,1846,-1286,-1019,6221,2728 } }, + { LIBRAW_CAMERAMAKER_Kodak, "DCS760C", 0, 0, + { 16623,-6309,-1411,-4344,13923,323,2285,274,2926 } }, + { LIBRAW_CAMERAMAKER_Kodak, "DCS Pro SLR", 0, 0, + { 5494,2393,-232,-6427,13850,2846,-1876,3997,5445 } }, + { LIBRAW_CAMERAMAKER_Kodak, "DCS Pro 14nx", 0, 0, + { 5494,2393,-232,-6427,13850,2846,-1876,3997,5445 } }, + { LIBRAW_CAMERAMAKER_Kodak, "DCS Pro 14", 0, 0, // same CamID: "DCS Pro 14N", "Photo Control Camerz ZDS 14" + { 7791,3128,-776,-8588,16458,2039,-2455,4006,6198 } }, + { LIBRAW_CAMERAMAKER_Kodak, "EOSDCS1", 0, 0, + { 10592,-2206,-967,-1944,11685,230,2206,670,1273 } }, + { LIBRAW_CAMERAMAKER_Kodak, "EOSDCS3", 0, 0, + { 9898,-2700,-940,-2478,12219,206,1985,634,1031 } }, + { LIBRAW_CAMERAMAKER_Kodak, "ProBack645", 0, 0, + { 16414,-6060,-1470,-3555,13037,473,2545,122,4948 } }, + { LIBRAW_CAMERAMAKER_Kodak, "ProBack", 0, 0, + { 21179,-8316,-2918,-915,11019,-165,3477,-180,4210 } }, + + {LIBRAW_CAMERAMAKER_Kodak, "PIXPRO AZ901", 0, 0, // dng + { 21875, -8006, -2558, 634, 8194, 1104, 1535, 951, 6969}}, + { LIBRAW_CAMERAMAKER_Kodak, "P712", 0, 3963, + { 9658,-3314,-823,-5163,12695,2768,-1342,1843,6044 } }, + { LIBRAW_CAMERAMAKER_Kodak, "P850", 0, 3964, + { 10511,-3836,-1102,-6946,14587,2558,-1481,1792,6246 } }, + { LIBRAW_CAMERAMAKER_Kodak, "P880", 0, 3963, + { 12805,-4662,-1376,-7480,15267,2360,-1626,2194,7904 } }, + { LIBRAW_CAMERAMAKER_Kodak, "Z980", 0, 0, + { 11313,-3559,-1101,-3893,11891,2257,-1214,2398,4908 } }, + { LIBRAW_CAMERAMAKER_Kodak, "Z981", 0, 0, + { 12729,-4717,-1188,-1367,9187,2582,274,860,4411 } }, + { LIBRAW_CAMERAMAKER_Kodak, "Z990", 0, 0xfed, + { 11749,-4048,-1309,-1867,10572,1489,-138,1449,4522 } }, + { LIBRAW_CAMERAMAKER_Kodak, "Z1015", 0, 0xef1, + { 11265,-4286,-992,-4694,12343,2647,-1090,1523,5447 } }, + + {LIBRAW_CAMERAMAKER_Leaf, "AFi 54S", 0, 0, + { 8236, 1746, -1313, -8251, 15953, 2428, -3672, 5786, 5771}}, + {LIBRAW_CAMERAMAKER_Leaf, "AFi 65S", 0, 0, + { 7914, 1414, -1190, -8776, 16582, 2280, -2811, 4605, 5562}}, + {LIBRAW_CAMERAMAKER_Leaf, "AFi 75S", 0, 0, + { 7914, 1414, -1190, -8776, 16582, 2280, -2811, 4605, 5562}}, + {LIBRAW_CAMERAMAKER_Leaf, "Aptus 17", 0, 0, + { 8236, 1746, -1313, -8251, 15953, 2428, -3672, 5786, 5771}}, + {LIBRAW_CAMERAMAKER_Leaf, "Aptus 22", 0, 0, + { 8236, 1746, -1313, -8251, 15953, 2428, -3672, 5786, 5771}}, + {LIBRAW_CAMERAMAKER_Leaf, "Aptus 54S", 0, 0, + { 8236, 1746, -1313, -8251, 15953, 2428, -3672, 5786, 5771}}, + {LIBRAW_CAMERAMAKER_Leaf, "Aptus 65S", 0, 0, + { 7914, 1414, -1190, -8776, 16582, 2280, -2811, 4605, 5562}}, + {LIBRAW_CAMERAMAKER_Leaf, "Aptus 65", 0, 0, + { 7914, 1414, -1190, -8776, 16582, 2280, -2811, 4605, 5562}}, + {LIBRAW_CAMERAMAKER_Leaf, "Aptus 75S", 0, 0, + { 7914, 1414, -1190, -8776, 16582, 2280, -2811, 4605, 5562}}, + {LIBRAW_CAMERAMAKER_Leaf, "Aptus 75", 0, 0, + { 7914, 1414, -1190, -8776, 16582, 2280, -2811, 4605, 5562}}, + {LIBRAW_CAMERAMAKER_Leaf, "C-Most", 0, 0, + { 3952, 2188, 449, -6701, 14584, 2275, -4536, 7349, 6535}}, + {LIBRAW_CAMERAMAKER_Leaf, "Credo 40", 0, 0, + { 8035, 435, -962, -6001, 13872, 2320, -1159, 3065, 5434}}, + {LIBRAW_CAMERAMAKER_Leaf, "Credo 50", 0, 0, // emb + { 10325, 845, -604, -4113, 13385, 481, -1791, 4163, 6924}}, + {LIBRAW_CAMERAMAKER_Leaf, "Credo 60", 0, 0, + { 8035, 435, -962, -6001, 13872, 2320, -1159, 3065, 5434}}, + {LIBRAW_CAMERAMAKER_Leaf, "Credo 80", 0, 0, + { 6294, 686, -712, -5435, 13417, 2211, -1006, 2435, 5042}}, + {LIBRAW_CAMERAMAKER_Leaf, "Valeo 11", 0, 0, + { 8236, 1746, -1313, -8251, 15953, 2428, -3672, 5786, 5771}}, + {LIBRAW_CAMERAMAKER_Leaf, "Valeo 17", 0, 0, + { 8236, 1746, -1313, -8251, 15953, 2428, -3672, 5786, 5771}}, + {LIBRAW_CAMERAMAKER_Leaf, "Valeo 22", 0, 0, + { 8236, 1746, -1313, -8251, 15953, 2428, -3672, 5786, 5771}}, + {LIBRAW_CAMERAMAKER_Leaf, "Valeo 6", 0, 0, + { 3952, 2188, 449, -6701, 14584, 2275, -4536, 7349, 6535}}, + +// { LIBRAW_CAMERAMAKER_Leaf, "AFi-II 6", 0, 0, + { LIBRAW_CAMERAMAKER_Leaf, "AFi-II 7", 0, 0, + { 7691,-108,-339,-6185,13627,2833,-2046,3899,5952 } }, + { LIBRAW_CAMERAMAKER_Leaf, "AFi-II 10", 0, 0, + { 6719,1147,-148,-6929,14061,3176,-1781,3343,5424 } }, + + { LIBRAW_CAMERAMAKER_Leaf, "Aptus-II 5", 0, 0, + { 7914,1414,-1190,-8777,16582,2280,-2811,4605,5562 } }, + { LIBRAW_CAMERAMAKER_Leaf, "Aptus-II 6", 0, 0, + { 7989,-113,-352,-6185,13627,2833,-2028,3866,5901 } }, + { LIBRAW_CAMERAMAKER_Leaf, "Aptus-II 7", 0, 0, + { 8209,-116,-362,-6185,13627,2833,-1962,3740,5709 } }, + { LIBRAW_CAMERAMAKER_Leaf, "Aptus-II 8", 0, 0, + { 7361,1257,-163,-6929,14061,3176,-1839,3454,5603 } }, + { LIBRAW_CAMERAMAKER_Leaf, "Aptus-II 10R", 0, 0, + { 7167,1224,-158,-6929,14061,3176,-1826,3429,5562 } }, + { LIBRAW_CAMERAMAKER_Leaf, "Aptus-II 10", 0, 0, + { 7527,1285,-166,-6929,14061,3176,-1995,3747,6077 } }, +// { LIBRAW_CAMERAMAKER_Leaf, "Aptus-II 12R", 0, 0, + { LIBRAW_CAMERAMAKER_Leaf, "Aptus-II 12", 0, 0, + { 7361,1257,-163,-6929,14061,3176,-1695,3182,5162 } }, + + { LIBRAW_CAMERAMAKER_Leica, "CL", 0, 0, + { 7743,-2896,-921,-4211,12271,2169,-697,1562,5491 } }, + + { LIBRAW_CAMERAMAKER_Leica, "M8", 0, 0, + { 7675,-2196,-305,-5860,14119,1856,-2425,4006,6578 } }, + { LIBRAW_CAMERAMAKER_Leica, "M9", 0, 0, + { 6687,-1751,-291,-3556,11373,2492,-548,2204,7146 } }, + { LIBRAW_CAMERAMAKER_Leica, "M10", 0, 0, // same CMs: M10, M10-D, M10-P + { 9090,-3342,-740,-4006,13456,493,-569,2266,6871 } }, + { LIBRAW_CAMERAMAKER_Leica, "M (Typ 2", 0, 0, // same CMs: "M (Typ 240)", "M (Typ 262)", "M-D (Typ 262)" + { 7199,-2140,-712,-4005,13327,649,-810,2521,6673 } }, + + { LIBRAW_CAMERAMAKER_Leica, "Q (Typ 116)", 0, 0, + { 10068,-4043,-1068,-5319,14268,1044,-765,1701,6522 } }, + { LIBRAW_CAMERAMAKER_Leica, "Q2", 0, 0, + { 12312,-5440,-1307,-6408,15499,824,-1075,1677,7220 } }, + + { LIBRAW_CAMERAMAKER_Leica, "SL (Typ 601)", 0, 0, + { 11865,-4523,-1441,-5423,14458,935,-1587,2687,4830 } }, + { LIBRAW_CAMERAMAKER_Leica, "S (Typ 007)", 0, 0, + { 6063,-2234,-231,-5210,13787,1500,-1043,2866,6997 } }, + { LIBRAW_CAMERAMAKER_Leica, "S2", 0, 0, + { 5627,-721,-447,-4423,12456,2192,-1048,2948,7379 } }, + { LIBRAW_CAMERAMAKER_Leica, "S3", 0, 0, +// { 5147,-1464,-318,-5374,13263,2325,-1425,2918,6450 } }, + { 5092,-1630,-470,-6313,14297,2170,-1603,3135,5982 } }, + {LIBRAW_CAMERAMAKER_Leica, "S", 0, 0, // same CMs: "S-E (Typ 006)", "S (Typ 006)" + { 5749,-1072,-382,-4274,12432,2048,-1166,3104,7105 } }, + + { LIBRAW_CAMERAMAKER_Leica, "TL2", 0, 0, + { 6375,-2062,-732,-4878,12838,2262,-877,1705,6204 } }, + { LIBRAW_CAMERAMAKER_Leica, "T", 0, 0, // same CMs: TL, "T (Typ 701)" + { 6295,-1679,-475,-5586,13046,2837,-1410,1889,7075 } }, + + { LIBRAW_CAMERAMAKER_Leica, "X2", 0, 0, + { 8336,-2853,-699,-4425,11989,2760,-954,1625,6396 } }, + { LIBRAW_CAMERAMAKER_Leica, "X1", 0, 0, + { 9055,-2611,-666,-4906,12652,2519,-555,1384,7417 } }, + { LIBRAW_CAMERAMAKER_Leica, "X", 0, 0, /* same CMs: "X (Typ 113)", "X-U (Typ 113)", XV, "X Vario (Typ 107)" */ + { 9062,-3198,-828,-4065,11772,2603,-761,1468,6458 } }, + + { LIBRAW_CAMERAMAKER_Mamiya,"ZD", 0, 0, + { 7645,2579,-1363,-8689,16717,2015,-3712,5941,5961 } }, + + { LIBRAW_CAMERAMAKER_Micron, "2010", 110, 0, + { 16695,-3761,-2151,155,9682,163,3433,951,4904 } }, /* DJC */ + + { LIBRAW_CAMERAMAKER_Minolta, "DiMAGE 5", 0, 0xf7d, + { 9117,-3063,-973,-7949,15763,2306,-2752,3136,8093 } }, + { LIBRAW_CAMERAMAKER_Minolta, "DiMAGE 7Hi", 0, 0xf7d, + { 11555,-4064,-1256,-7903,15633,2409,-2811,3320,7358 } }, + { LIBRAW_CAMERAMAKER_Minolta, "DiMAGE 7i", 0, 0xf7d, + { 11050,-3791,-1199,-7875,15585,2434,-2797,3359,7560 } }, + { LIBRAW_CAMERAMAKER_Minolta, "DiMAGE 7", 0, 0xf7d, + { 9258,-2879,-1008,-8076,15847,2351,-2806,3280,7821 } }, + { LIBRAW_CAMERAMAKER_Minolta, "DiMAGE A1", 0, 0xf8b, + { 9274,-2548,-1167,-8220,16324,1943,-2273,2721,8340 } }, + { LIBRAW_CAMERAMAKER_Minolta, "DiMAGE A200", 0, 0, + { 8560,-2487,-986,-8112,15535,2771,-1209,1324,7743 } }, + { LIBRAW_CAMERAMAKER_Minolta, "DiMAGE A2", 0, 0xf8f, + { 9097,-2726,-1053,-8073,15506,2762,-966,981,7763 } }, + { LIBRAW_CAMERAMAKER_Minolta, "DiMAGE Z2", 0, 0, + { 11280,-3564,-1370,-4655,12374,2282,-1423,2168,5396 } }, /* DJC */ + { LIBRAW_CAMERAMAKER_Minolta, "DG-5D", 0, 0xffb, // same CamID: "ALPHA 5D", "DYNAX 5D", "MAXXUM 5D", "Alpha Sweet Digital" + { 10284,-3283,-1086,-7957,15762,2316,-829,882,6644 } }, + { LIBRAW_CAMERAMAKER_Minolta, "DG-7D", 0, 0xffb, // same CamID: "ALPHA 7D", "DYNAX 7D", "MAXXUM 7D" + { 10239,-3104,-1099,-8037,15727,2451,-927,925,6871 } }, + + { LIBRAW_CAMERAMAKER_Motorola, "PIXL", 0, 0, + { 8898,-989,-1033,-3292,11619,1674,-661,3178,5216 } }, /* DJC */ + + { LIBRAW_CAMERAMAKER_Nikon, "1 AW1", 0, 0, + { 6588,-1305,-693,-3277,10987,2634,-355,2016,5106 } }, + { LIBRAW_CAMERAMAKER_Nikon, "1 J3", 0, 0, + { 6588,-1305,-693,-3277,10987,2634,-355,2016,5106 } }, + { LIBRAW_CAMERAMAKER_Nikon, "1 J4", 0, 0, + { 5958,-1559,-571,-4021,11453,2939,-634,1548,5087 } }, + { LIBRAW_CAMERAMAKER_Nikon, "1 J5", 0, 0, + { 7520,-2518,-645,-3844,12102,1945,-913,2249,6835 } }, + { LIBRAW_CAMERAMAKER_Nikon, "1 S2", -200, 0, + { 6612,-1342,-618,-3338,11055,2623,-174,1792,5075 } }, + { LIBRAW_CAMERAMAKER_Nikon, "1 V2", 0, 0, + { 6588,-1305,-693,-3277,10987,2634,-355,2016,5106 } }, + { LIBRAW_CAMERAMAKER_Nikon, "1 V3", -200, 0, + { 5958,-1559,-571,-4021,11453,2939,-634,1548,5087 } }, + { LIBRAW_CAMERAMAKER_Nikon, "1 ", 0, 0, /* same CMs: "1 J1", "1 J2", "1 S1", "1 V1" */ + { 8994,-2667,-865,-4594,12324,2552,-699,1786,6260 } }, + + { LIBRAW_CAMERAMAKER_Nikon, "COOLPIX 2100", 0, 0, // a.k.a. E2100 + { 13142,-4152,-1596,-4655,12374,2282,-1769,2696,6711 } }, /* DJC, copied from Z2, new white balance */ + { LIBRAW_CAMERAMAKER_Nikon, "COOLPIX 2500", 0, 0, // a.k.a. E2500, possibly same CM as for E5000 + { -5547,11762,2189,5814,-558,3342,-4924,9840,5949,688,9083,96 } }, + { LIBRAW_CAMERAMAKER_Nikon, "COOLPIX 3200", 0, 0, // a.k.a. E3200 + { 9846,-2085,-1019,-3278,11109,2170,-774,2134,5745 } }, /* DJC */ + { LIBRAW_CAMERAMAKER_Nikon, "COOLPIX 4300", 0, 0, // a.k.a. E4300 + { 11280,-3564,-1370,-4655,12374,2282,-1423,2168,5396 } }, /* DJC, copied from Minolta DiMAGE Z2 */ + { LIBRAW_CAMERAMAKER_Nikon, "COOLPIX 4500", 0, 0, // a.k.a. E4500, possibly same CM as for E5000 + { -5547,11762,2189,5814,-558,3342,-4924,9840,5949,688,9083,96 } }, + { LIBRAW_CAMERAMAKER_Nikon, "COOLPIX 5000", 0, 0, // a.k.a. E5000 + { -6678,12805,2248,5725,-499,3375,-5903,10713,6034,-270,9976,134 } }, + { LIBRAW_CAMERAMAKER_Nikon, "COOLPIX 5400", 0, 0, // a.k.a. E5400 + { 9349,-2988,-1001,-7918,15766,2266,-2097,2680,6839 } }, + { LIBRAW_CAMERAMAKER_Nikon, "COOLPIX 5700", 0, 0, // a.k.a. E5700 + { -6475,12496,2428,5409,-16,3180,-5965,10912,5866,-177,9918,248 } }, + { LIBRAW_CAMERAMAKER_Nikon, "COOLPIX 8400", 0, 0, // a.k.a. E8400 + { 7842,-2320,-992,-8154,15718,2599,-1098,1342,7560 } }, + { LIBRAW_CAMERAMAKER_Nikon, "COOLPIX 8700", 0, 0, // a.k.a. E8700 + { 8489,-2583,-1036,-8051,15583,2643,-1307,1407,7354 } }, + { LIBRAW_CAMERAMAKER_Nikon, "COOLPIX 8800", 0, 0, // a.k.a. E8800 + { 7971,-2314,-913,-8451,15762,2894,-1442,1520,7610 } }, + + { LIBRAW_CAMERAMAKER_Nikon, "COOLPIX 700", 0, 0x3dd, // a.k.a. E700 + { -3746,10611,1665,9621,-1734,2114,-2389,7082,3064,3406,6116,-244 } }, /* DJC */ + { LIBRAW_CAMERAMAKER_Nikon, "COOLPIX 800", 0, 0x3dd, // a.k.a. E800 + { -3746,10611,1665,9621,-1734,2114,-2389,7082,3064,3406,6116,-244 } }, /* DJC */ + { LIBRAW_CAMERAMAKER_Nikon, "COOLPIX 950", 0, 0x3dd, // a.k.a. E950 + { -3746,10611,1665,9621,-1734,2114,-2389,7082,3064,3406,6116,-244 } }, /* DJC */ + { LIBRAW_CAMERAMAKER_Nikon, "COOLPIX 995", 0, 0, // a.k.a. E995 + { -5547,11762,2189,5814,-558,3342,-4924,9840,5949,688,9083,96 } }, /* DJC, copied from E5000 */ + + { LIBRAW_CAMERAMAKER_Nikon, "COOLPIX A1000", 0, 0, + { 10601,-3487,-1127,-2931,11443,1676,-587,1740,5278 } }, + { LIBRAW_CAMERAMAKER_Nikon, "COOLPIX B700", 0, 0, + { 14387,-6014,-1299,-1357,9975,1616,467,1047,4744 } }, + { LIBRAW_CAMERAMAKER_Nikon, "COOLPIX A", 0, 0, + { 8198,-2239,-724,-4871,12389,2798,-1043,2050,7181 } }, + { LIBRAW_CAMERAMAKER_Nikon, "COOLPIX P1000", 0, 0, + { 14294,-6116,-1333,-1628,10219,1637,-14,1158,5022 } }, + { LIBRAW_CAMERAMAKER_Nikon, "COOLPIX P6000", 0, 0, + { 9698,-3367,-914,-4706,12584,2368,-837,968,5801 } }, + { LIBRAW_CAMERAMAKER_Nikon, "COOLPIX P7000", 0, 0, + { 11432,-3679,-1111,-3169,11239,2202,-791,1380,4455 } }, + { LIBRAW_CAMERAMAKER_Nikon, "COOLPIX P7100", 0, 0, + { 11053,-4269,-1024,-1976,10182,2088,-526,1263,4469 } }, + { LIBRAW_CAMERAMAKER_Nikon, "COOLPIX P7700", -3200, 0, // same CamID: "COOLPIX P7700", "COOLPIX Deneb" + { 10321,-3920,-931,-2750,11146,1824,-442,1545,5539 } }, + { LIBRAW_CAMERAMAKER_Nikon, "COOLPIX P7800", -3200, 0, // same CamID: "COOLPIX P7800", "COOLPIX Kalon" + { 10321,-3920,-931,-2750,11146,1824,-442,1545,5539 } }, + { LIBRAW_CAMERAMAKER_Nikon, "COOLPIX P330", -200, 0, + { 10321,-3920,-931,-2750,11146,1824,-442,1545,5539 } }, + { LIBRAW_CAMERAMAKER_Nikon, "COOLPIX P340", -200, 0, + { 10321,-3920,-931,-2750,11146,1824,-442,1545,5539 } }, + { LIBRAW_CAMERAMAKER_Nikon, "Coolpix P950", 0, 0, + { 13307, -5641, -1290, -2048, 10581, 1689, -64, 1222, 5176}}, + + { LIBRAW_CAMERAMAKER_Nikon, "D3000", 0, 0, + { 8736,-2458,-935,-9075,16894,2251,-1354,1242,8263 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D3100", 0, 0, + { 7911,-2167,-813,-5327,13150,2408,-1288,2483,7968 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D3200", 0, 0xfb9, + { 7013,-1408,-635,-5268,12902,2640,-1470,2801,7379 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D3300", 0, 0, + { 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D3400", 0, 0, + { 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D3500", 0, 0, + { 8821,-2938,-785,-4178,12142,2287,-824,1651,6860 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D5000", 0, 0xf00, + { 7309,-1403,-519,-8474,16008,2622,-2433,2826,8064 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D5100", 0, 0x3de6, + { 8198,-2239,-724,-4871,12389,2798,-1043,2050,7181 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D5200", 0, 0, + { 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D5300", 0, 0, + { 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D5500", 0, 0, + { 8821,-2938,-785,-4178,12142,2287,-824,1651,6860 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D5600", 0, 0, + { 8821,-2938,-785,-4178,12142,2287,-824,1651,6860 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D7000", 0, 0, + { 8198,-2239,-724,-4871,12389,2798,-1043,2050,7181 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D7100", 0, 0, + { 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D7200", 0, 0, + { 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D7500", 0, 0, + { 8813,-3210,-1036,-4703,12868,2021,-1054,1940,6129 } }, + + { LIBRAW_CAMERAMAKER_Nikon, "D100", 0, 0, + { 5902,-933,-782,-8983,16719,2354,-1402,1455,6464 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D200", 0, 0xfbc, + { 8367,-2248,-763,-8758,16447,2422,-1527,1550,8053 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D300", 0, 0, // same CMs: D300, D300s + { 9030,-1992,-715,-8465,16302,2255,-2689,3217,8069 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D500", 0, 0, + { 8813,-3210,-1036,-4703,12868,2021,-1054,1940,6129 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D600", 0, 0x3e07, + { 8178,-2245,-609,-4857,12394,2776,-1207,2086,7298 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D610",0, 0, + { 8178,-2245,-609,-4857,12394,2776,-1207,2086,7298 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D700", 0, 0, + { 8139,-2171,-663,-8747,16541,2295,-1925,2008,8093 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D750", -600, 0, + { 9020,-2890,-715,-4535,12436,2348,-934,1919,7086 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D780", -600, 0, + { 9943,-3269,-839,-5323,13269,2259,-1198,2083,7557 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D800", 0, 0, // same CMs: D800, D800E + { 7866,-2108,-555,-4869,12483,2681,-1176,2069,7501 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D810A", 0, 0, + { 11973,-5685,-888,-1965,10326,1901,-115,1123,7169 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D810", 0, 0, + { 9369,-3195,-791,-4488,12430,2301,-893,1796,6872 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D850", 0, 0, + { 10405,-3755,-1270,-5461,13787,1793,-1040,2015,6785 } }, + + { LIBRAW_CAMERAMAKER_Nikon, "D40X", 0, 0, + { 8819,-2543,-911,-9025,16928,2151,-1329,1213,8449 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D40", 0, 0, + { 6992,-1668,-806,-8138,15748,2543,-874,850,7897 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D50", 0, 0, + { 7732,-2422,-789,-8238,15884,2498,-859,783,7330 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D60", 0, 0, + { 8736,-2458,-935,-9075,16894,2251,-1354,1242,8263 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D70", 0, 0, // same CMs: D70, D70s + { 7732,-2422,-789,-8238,15884,2498,-859,783,7330 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D80", 0, 0, + { 8629,-2410,-883,-9055,16940,2171,-1490,1363,8520 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D90", 0, 0xf00, + { 7309,-1403,-519,-8474,16008,2622,-2434,2826,8064 } }, + + { LIBRAW_CAMERAMAKER_Nikon, "D1H", 0, 0, + { 7659,-2238,-935,-8942,16969,2004,-2701,3051,8690 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D1X", 0, 0, + { 7702,-2245,-975,-9114,17242,1875,-2679,3055,8521 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D1", 0, 0, +// { 16772,-4726,-2141,-7611,15713,1972,-2846,3494,9521 } }, /* multiplied by 2.218750, 1.0, 1.148438 */ + { 7637,-2199,-974,-9109,17099,2043,-2822,3306,8372 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D2H", 0, 0, // same CMs: D2H, D2Hs + { 5733,-911,-629,-7967,15987,2055,-3050,4013,7048 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D2X", 0, 0, // same CMs: D2X, D2Xs + { 10231,-2768,-1254,-8302,15900,2551,-797,681,7148 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D3S", 0, 0, + { 8828,-2406,-694,-4874,12603,2541,-660,1509,7587 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D3X", 0, 0, + { 7171,-1986,-648,-8085,15555,2718,-2170,2512,7457 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D3", 0, 0, + { 8139,-2171,-663,-8747,16541,2295,-1925,2008,8093 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D4", 0, 0, // same CMs: D4, D4S (and Df) + { 8598,-2848,-857,-5618,13606,2195,-1002,1773,7137 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D5", 0, 0, + { 9200,-3522,-992,-5755,13803,2117,-753,1486,6338 } }, + { LIBRAW_CAMERAMAKER_Nikon, "D6", 0, 0, + { 9028,-3423,-1035,-6321,14265,2217,-1013,1683,6928 } }, + { LIBRAW_CAMERAMAKER_Nikon, "Df", 0, 0, + { 8598,-2848,-857,-5618,13606,2195,-1002,1773,7137 } }, + + { LIBRAW_CAMERAMAKER_Nikon, "Z 30", 0, 0, + { 10339,-3822,-890,-4183,12023,2436,-671,1638,7049 } }, + { LIBRAW_CAMERAMAKER_Nikon, "Z 50", 0, 0, + { 11640,-4829,-1079,-5107,13006,2325,-972,1711,7380 } }, + { LIBRAW_CAMERAMAKER_Nikon, "Z 5", 0, 0, + { 8695,-2558,-648,-5015,12711,2575,-1279,2215,7514 } }, + { LIBRAW_CAMERAMAKER_Nikon, "Z 6", 0, 0, + { 9943,-3269,-839,-5323,13269,2259,-1198,2083,7557 } }, // 'Z 6'(v.2), 'Z 6_2' + { LIBRAW_CAMERAMAKER_Nikon, "Z 7", 0, 0, + { 13705,-6004,-1400,-5464,13568,2062,-940,1706,7618 } }, // 'Z 7'(v.2), 'Z 7_2' + { LIBRAW_CAMERAMAKER_Nikon, "Z 8", 0, 0, + {11423,-4564,-1123,-4816,12895,2119,-210,1061,7282 } }, + { LIBRAW_CAMERAMAKER_Nikon, "Z 9", 0, 0, + { 13389,-6049,-1441,-4544,12757,1969,229,498,7390 } }, + { LIBRAW_CAMERAMAKER_Nikon, "Z fc", 0, 0, + { 11640,-4829,-1079,-5107,13006,2325,-972,1711,7380 } }, + + { LIBRAW_CAMERAMAKER_Olympus, "AIR A01", 0, 0xfe1, + { 8992,-3093,-639,-2563,10721,2122,-437,1270,5473 } }, + + { LIBRAW_CAMERAMAKER_Olympus, "C-5050Z", 0, 0, + { 10633,-3234,-1285,-7460,15570,1967,-1917,2510,6299 } }, + { LIBRAW_CAMERAMAKER_Olympus, "C-5060WZ", 0, 0, + { 10445,-3362,-1307,-7662,15690,2058,-1135,1176,7602 } }, + { LIBRAW_CAMERAMAKER_Olympus, "C-7070WZ", 0, 0, + { 10252,-3531,-1095,-7114,14850,2436,-1451,1723,6365 } }, + { LIBRAW_CAMERAMAKER_Olympus, "C-7000Z", 0, 0, + { 10793,-3791,-1146,-7498,15177,2488,-1390,1577,7321 } }, + { LIBRAW_CAMERAMAKER_Olympus, "C-8080WZ", 0, 0, + { 8606,-2509,-1014,-8238,15714,2703,-942,979,7760 } }, + + { LIBRAW_CAMERAMAKER_Olympus, "E-300", 0, 0, + { 7828,-1761,-348,-5788,14071,1830,-2853,4518,6557 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-330", 0, 0, + { 8961,-2473,-1084,-7979,15990,2067,-2319,3035,8249 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-400", 0, 0, + { 6169,-1483,-21,-7107,14761,2536,-2904,3580,8568 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-410", 0, 0xf6a, + { 8856,-2582,-1026,-7761,15766,2082,-2009,2575,7469 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-420", 0, 0xfd7, + { 8746,-2425,-1095,-7594,15612,2073,-1780,2309,7416 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-450", 0, 0xfd2, + { 8745,-2425,-1095,-7594,15613,2073,-1780,2309,7416 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-500", 0, 0, + { 8136,-1968,-299,-5481,13742,1871,-2556,4205,6630 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-510", 0, 0xf6a, + { 8785,-2529,-1033,-7639,15624,2112,-1783,2300,7817 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-520", 0, 0xfd2, + { 8344,-2322,-1020,-7596,15635,2048,-1748,2269,7287 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-600", 0, 0xfaf, + { 8453,-2198,-1092,-7609,15681,2008,-1725,2337,7824 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-620", 0, 0xfaf, + { 8453,-2198,-1092,-7609,15681,2008,-1725,2337,7824 } }, + + { LIBRAW_CAMERAMAKER_Olympus, "E-10", 0, 0x3ff, + { 12970,-4703,-1433,-7466,15843,1644,-2191,2451,6668 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-20", 0, 0x3ff, // model is "E-20,E-20N,E-20P" + { 13414,-4950,-1517,-7166,15293,1960,-2325,2664,7212 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-30", 0, 0xfbc, + { 8144,-1861,-1111,-7763,15894,1929,-1865,2542,7607 } }, + + { LIBRAW_CAMERAMAKER_Olympus, "E-1", 0, 0, + { 11846,-4767,-945,-7027,15878,1089,-2699,4122,8311 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-3", 0, 0xf99, + { 9487,-2875,-1115,-7533,15606,2010,-1618,2100,7389 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-5", 0, 0xeec, + { 11200,-3783,-1325,-4576,12593,2206,-695,1742,7504 } }, + + { LIBRAW_CAMERAMAKER_Olympus, "E-P1", 0, 0xffd, + { 8343,-2050,-1021,-7715,15705,2103,-1831,2380,8235 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-P2", 0, 0xffd, + { 8343,-2050,-1021,-7715,15705,2103,-1831,2380,8235 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-P3", 0, 0, + { 7575,-2159,-571,-3722,11341,2725,-1434,2819,6271 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-P5", 0, 0, + { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-P7", 0, 0, + { 9476,-3182,-765,-2613,10958,1893,-449,1315,5268 } }, + + { LIBRAW_CAMERAMAKER_Olympus, "E-PL10", 0, 0, + { 9197,-3190,-659,-2606,10830,2039,-458,1250,5458 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-PL1s", 0, 0, + { 11409,-3872,-1393,-4572,12757,2003,-709,1810,7415 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-PL1", 0, 0, + { 11408,-4289,-1215,-4286,12385,2118,-387,1467,7787 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-PL2", 0, 0xcf3, + { 15030,-5552,-1806,-3987,12387,1767,-592,1670,7023 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-PL3", 0, 0, + { 7575,-2159,-571,-3722,11341,2725,-1434,2819,6271 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-PL5", 0, 0xfcb, + { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-PL6", 0, 0, + { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-PL7", 0, 0, + { 9197,-3190,-659,-2606,10830,2039,-458,1250,5458 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-PL8", 0, 0, + { 9197,-3190,-659,-2606,10830,2039,-458,1250,5458 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-PL9", 0, 0, + { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, + + { LIBRAW_CAMERAMAKER_Olympus, "E-PM1", 0, 0, + { 7575,-2159,-571,-3722,11341,2725,-1434,2819,6271 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-PM2", 0, 0, + { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, + + { LIBRAW_CAMERAMAKER_Olympus, "E-M10 Mark IV", 0, 0, + { 9476,-3182,-765,-2613,10958,1893,-449,1315,5268 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-M10", 0, 0, // Same CMs: E-M10, E-M10 Mark II, E-M10 Mark III; "CLAUSS piX 5oo" + { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-M1X", 0, 0, + { 11896,-5110,-1076,-3181,11378,2048,-519,1224,5166 } }, + + { LIBRAW_CAMERAMAKER_Olympus, "E-M1 Mark III", 0, 0, + { 11896,-5110,-1076,-3181,11378,2048,-519,1224,5166 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-M1 Mark II", 0, 0, + { 9383,-3170,-763,-2457,10702,2020,-384,1236,5552 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-M1", 0, 0, + { 7687,-1984,-606,-4327,11928,2721,-1381,2339,6452 } }, + + { LIBRAW_CAMERAMAKER_Olympus, "E-M5 Mark III", 0, 0, + { 11896,-5110,-1076,-3181,11378,2048,-519,1224,5166 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-M5 Mark II", 0, 0, + { 9422,-3258,-711,-2655,10898,2015,-512,1354,5512 } }, + { LIBRAW_CAMERAMAKER_Olympus, "E-M5", 0, 0xfe1, + { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, + + { LIBRAW_CAMERAMAKER_Olympus, "PEN-F",0, 0, + { 9476,-3182,-765,-2613,10958,1893,-449,1315,5268 } }, + + { LIBRAW_CAMERAMAKER_Olympus, "SH-2", 0, 0, // same CamID: SH-2, SH-3 + { 10156,-3425,-1077,-2611,11177,1624,-385,1592,5080 } }, + + { LIBRAW_CAMERAMAKER_Olympus, "SP-350", 0, 0, + { 12078,-4836,-1069,-6671,14306,2578,-786,939,7418 } }, + { LIBRAW_CAMERAMAKER_Olympus, "SP-3", 0, 0, // Same CMs: SP310, SP320 + { 11766,-4445,-1067,-6901,14421,2707,-1029,1217,7572 } }, + { LIBRAW_CAMERAMAKER_Olympus, "SP-500UZ", 0, 0xfff, + { 9493,-3415,-666,-5211,12334,3260,-1548,2262,6482 } }, + { LIBRAW_CAMERAMAKER_Olympus, "SP-510UZ", 0, 0xffe, + { 10593,-3607,-1010,-5881,13127,3084,-1200,1805,6721 } }, + { LIBRAW_CAMERAMAKER_Olympus, "SP-550UZ", 0, 0xffe, + { 11597,-4006,-1049,-5432,12799,2957,-1029,1750,6516 } }, + { LIBRAW_CAMERAMAKER_Olympus, "SP-560UZ", 0, 0xff9, + { 10915,-3677,-982,-5587,12986,2911,-1168,1968,6223 } }, + { LIBRAW_CAMERAMAKER_Olympus, "SP-565UZ", 0, 0, + { 11856,-4469,-1159,-4814,12368,2756,-993,1779,5589 } }, + { LIBRAW_CAMERAMAKER_Olympus, "SP-570UZ", 0, 0, + { 11522,-4044,-1146,-4736,12172,2904,-988,1829,6039 } }, + + { LIBRAW_CAMERAMAKER_Olympus, "STYLUS 1",0, 0, // Olympus "STYLUS 1 and STYLUS 1s have the same CamID, cameras are slightly different + { 8360,-2420,-880,-3928,12353,1739,-1381,2416,5173 } }, + + { LIBRAW_CAMERAMAKER_Olympus, "TG-4", 0, 0, + { 11426,-4159,-1126,-2066,10678,1593,-120,1327,4998 } }, + { LIBRAW_CAMERAMAKER_Olympus, "TG-", 0, 0, // same CMs: TG-5, TG-6 + { 10899,-3833,-1082,-2112,10736,1575,-267,1452,5269 } }, + + { LIBRAW_CAMERAMAKER_Olympus, "XZ-10", 0, 0, + { 9777,-3483,-925,-2886,11297,1800,-602,1663,5134 } }, + { LIBRAW_CAMERAMAKER_Olympus, "XZ-1", 0, 0, + { 10901,-4095,-1074,-1141,9208,2293,-62,1417,5158 } }, + { LIBRAW_CAMERAMAKER_Olympus, "XZ-2", 0, 0, + { 9777,-3483,-925,-2886,11297,1800,-602,1663,5134 } }, + + { LIBRAW_CAMERAMAKER_Olympus, "OM-1", 0, 0, + { 9488, -3984, -714, -2887, 10945, 2229, -137, 960, 5786 } }, + { LIBRAW_CAMERAMAKER_Olympus, "OM-5", 0, 0, + { 11896, -5110, -1076, -3181, 11378, 2048, -519, 1224, 5166 } }, + + + { LIBRAW_CAMERAMAKER_OmniVison, "", 16, 0x3ff, + { 12782,-4059,-379,-478,9066,1413,1340,1513,5176 } }, /* DJC */ + + { LIBRAW_CAMERAMAKER_Pentax, "*istDL2", 0, 0, + { 10504,-2438,-1189,-8603,16207,2531,-1022,863,12242 } }, + { LIBRAW_CAMERAMAKER_Pentax, "*istDL", 0, 0, + { 10829,-2838,-1115,-8339,15817,2696,-837,680,11939 } }, + { LIBRAW_CAMERAMAKER_Pentax, "*istDS2", 0, 0, + { 10504,-2438,-1189,-8603,16207,2531,-1022,863,12242 } }, + { LIBRAW_CAMERAMAKER_Pentax, "*istDS", 0, 0, + { 10371,-2333,-1206,-8688,16231,2602,-1230,1116,11282 } }, + { LIBRAW_CAMERAMAKER_Pentax, "*istD", 0, 0, + { 9651,-2059,-1189,-8881,16512,2487,-1460,1345,10687 } }, + + { LIBRAW_CAMERAMAKER_Pentax, "K-01", 0, 0, + { 8134,-2728,-645,-4365,11987,2694,-838,1509,6498 } }, + { LIBRAW_CAMERAMAKER_Pentax, "K10D", 0, 0, + { 9679,-2965,-811,-8622,16514,2182,-975,883,9793 } }, + { LIBRAW_CAMERAMAKER_Pentax, "K1", 0, 0, // same CMs: K100D, "K100D Super", K110D + { 11095,-3157,-1324,-8377,15834,2720,-1108,947,11688 } }, + { LIBRAW_CAMERAMAKER_Pentax, "K20D", 0, 0, + { 9427,-2714,-868,-7493,16092,1373,-2199,3264,7180 } }, + { LIBRAW_CAMERAMAKER_Pentax, "K200D", 0, 0, + { 9186,-2678,-907,-8693,16517,2260,-1129,1094,8524 } }, + { LIBRAW_CAMERAMAKER_Pentax, "K-m", 0, 0, + { 9730,-2989,-970,-8527,16258,2381,-1060,970,8362 } }, + { LIBRAW_CAMERAMAKER_Pentax, "KP", 0, 0, + { 7825,-2160,-1403,-4841,13555,1349,-1559,2449,5814 } }, + { LIBRAW_CAMERAMAKER_Pentax, "K-x", 0, 0, + { 8843,-2837,-625,-5025,12644,2668,-411,1234,7410 } }, + { LIBRAW_CAMERAMAKER_Pentax, "K-r", 0, 0, + { 9895,-3077,-850,-5304,13035,2521,-883,1768,6936 } }, + { LIBRAW_CAMERAMAKER_Pentax, "K-1", 0, 0, // same CMs: K-1, "K-1 Mark II" + { 8596,-2981,-639,-4202,12046,2431,-685,1424,6122 } }, + { LIBRAW_CAMERAMAKER_Pentax, "K-30", 0, 0, + { 8134,-2728,-645,-4365,11987,2694,-838,1509,6498 } }, + { LIBRAW_CAMERAMAKER_Pentax, "K-3 Mark III", 0, 0, + { 9251, -3817, -1069, -4627, 12667, 2175, -798, 1660, 5633 } }, + { LIBRAW_CAMERAMAKER_Pentax, "K-3", 0, 0, // same CMs: K-3, "K-3 II" + { 7415,-2052,-721,-5186,12788,2682,-1446,2157,6773 } }, + { LIBRAW_CAMERAMAKER_Pentax, "K-500", 0, 0, + { 8109,-2740,-608,-4593,12175,2731,-1006,1515,6545 } }, + { LIBRAW_CAMERAMAKER_Pentax, "K-50", 0, 0, + { 8109,-2740,-608,-4593,12175,2731,-1006,1515,6545 } }, + { LIBRAW_CAMERAMAKER_Pentax, "K-5 II", 0, 0, // same CMs: "K-5 II" and "K-5 IIs" + { 8170,-2725,-639,-4440,12017,2744,-771,1465,6599 } }, + { LIBRAW_CAMERAMAKER_Pentax, "K-5", 0, 0, + { 8713,-2833,-743,-4342,11900,2772,-722,1543,6247 } }, + { LIBRAW_CAMERAMAKER_Pentax, "K-70", 0, 0, + { 8766,-3149,-747,-3976,11943,2292,-517,1259,5552 } }, + { LIBRAW_CAMERAMAKER_Pentax, "K-7", 0, 0, + { 9142,-2947,-678,-8648,16967,1663,-2224,2898,8615 } }, + { LIBRAW_CAMERAMAKER_Pentax, "KP", 0, 0, + { 8617,-3228,-1034,-4674,12821,2044,-803,1577,5728 } }, + { LIBRAW_CAMERAMAKER_Pentax, "K-S1", 0, 0, + { 8512,-3211,-787,-4167,11966,2487,-638,1288,6054 } }, + { LIBRAW_CAMERAMAKER_Pentax, "K-S2", 0, 0, + { 8662,-3280,-798,-3928,11771,2444,-586,1232,6054 } }, + + { LIBRAW_CAMERAMAKER_Pentax, "Q-S1", 0, 0, + { 12995,-5593,-1107,-1879,10139,2027,-64,1233,4919 } }, + { LIBRAW_CAMERAMAKER_Pentax, "Q7", 0, 0, + { 10901,-3938,-1025,-2743,11210,1738,-823,1805,5344 } }, + { LIBRAW_CAMERAMAKER_Pentax, "Q10", 0, 0, + { 11562,-4183,-1172,-2357,10919,1641,-582,1726,5112 } }, + { LIBRAW_CAMERAMAKER_Pentax, "Q", 0, 0, + { 11731,-4169,-1267,-2015,10727,1473,-217,1492,4870 } }, + + { LIBRAW_CAMERAMAKER_Pentax, "MX-1", 0, 0, + { 9296,-3146,-888,-2860,11287,1783,-618,1698,5151 } }, + + { LIBRAW_CAMERAMAKER_Pentax, "645D", 0, 0x3e00, + { 10646,-3593,-1158,-3329,11699,1831,-667,2874,6287 } }, + { LIBRAW_CAMERAMAKER_Pentax, "645Z", 0, 0, + { 9519,-3591,-664,-4074,11725,2671,-624,1501,6653 } }, + + + {LIBRAW_CAMERAMAKER_Panasonic, "DC-S1R", 0, 0, + { 11822,-5321,-1249,-5958,15114,766,-614,1264,7043 } }, + {LIBRAW_CAMERAMAKER_Panasonic, "DC-S1H", 0, 0, + { 9397,-3719,-805,-5425,13326,2309,-972,1715,6034 } }, + {LIBRAW_CAMERAMAKER_Panasonic, "DC-S1", 0, 0, + { 9744,-3905,-779,-4899,12807,2324,-798,1630,5827 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DC-S5M2", 0, 0, + { 10308, -4206, -783, -4088, 12102, 2229, -125, 1051, 5912 } }, + {LIBRAW_CAMERAMAKER_Panasonic, "DC-S5", 0, 0, + { 9744,-3905,-779,-4899,12807,2324,-798,1630,5827 } }, + + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-CM1", -15, 0, // same CMs: DMC-CM1, DMC-CM10 + { 8770,-3194,-820,-2871,11281,1803,-513,1552,4434 } }, + + { LIBRAW_CAMERAMAKER_Panasonic, "DC-FZ1000M2", -15, 0, + { 9803,-4185,-992,-4066,12578,1628,-838,1824,5288 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-FZ1000", -15, 0, + { 7830,-2696,-763,-3325,11667,1866,-641,1712,4824 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-FZ2500", -15, 0, + { 7386,-2443,-743,-3437,11864,1757,-608,1660,4766 } }, + + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-FZ100", -15, 0xfff, + { 16197,-6146,-1761,-2393,10765,1869,366,2238,5248 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-FZ150", -15, 0xfff, + { 11904,-4541,-1189,-2355,10899,1662,-296,1586,4289 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-FZ200", -15, 0xfff, + { 8112,-2563,-740,-3730,11784,2197,-941,2075,4933 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-FZ300", -15, 0xfff, + { 8378,-2798,-769,-3068,11410,1877,-538,1792,4623 } }, + + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-FZ18", 0, 0, + { 9932,-3060,-935,-5809,13331,2753,-1267,2155,5575 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-FZ28", -15, 0xf96, + { 10109,-3488,-993,-5412,12812,2916,-1305,2140,5543 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-FZ30", 0, 0xf94, + { 10976,-4029,-1141,-7918,15491,2600,-1670,2071,8246 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-FZ35", -15, 0, + { 9938,-2780,-890,-4604,12393,2480,-1117,2304,4620 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-FZ40", -15, 0, + { 13639,-5535,-1371,-1698,9633,2430,316,1152,4108 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-FZ50", 0, 0, + { 7906,-2709,-594,-6231,13351,3220,-1922,2631,6537 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-FZ70", -15, 0, + { 11532,-4324,-1066,-2375,10847,1749,-564,1699,4351 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DC-FZ80", -15, 0, + { 8550,-2908,-842,-3195,11529,1881,-338,1603,4631 } }, + + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-FZ8", 0, 0xf7f, + { 8986,-2755,-802,-6341,13575,3077,-1476,2144,6379 } }, + + + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-L10", -15, 0xf96, + { 8025,-1942,-1050,-7920,15904,2100,-2456,3005,7039 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-L1", 0, 0xf7f, + { 8054,-1885,-1025,-8349,16367,2040,-2805,3542,7629 } }, + + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-LC1", 0, 0, + { 11340,-4069,-1275,-7555,15266,2448,-2960,3426,7685 } }, + + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-LF1", -15, 0, + { 9379,-3267,-816,-3227,11560,1881,-926,1928,5340 } }, + + { LIBRAW_CAMERAMAKER_Panasonic, "DC-LX100M2", -15, 0, + { 8585,-3127,-833,-4005,12250,1953,-650,1494,4862 } }, // v.2 + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-LX100", -15, 0, + { 8844,-3538,-768,-3709,11762,2200,-698,1792,5220 } }, + + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-LX1", 0, 0xf7f, + { 10704,-4187,-1230,-8314,15952,2501,-920,945,8927 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-LX2", 0, 0, + { 8048,-2810,-623,-6450,13519,3272,-1700,2146,7049 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-LX3", -15, 0, + { 8128,-2668,-655,-6134,13307,3161,-1782,2568,6083 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-LX5", -15, 0, + { 10909,-4295,-948,-1333,9306,2399,22,1738,4582 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-LX7", -15, 0, + { 10148,-3743,-991,-2837,11366,1659,-701,1893,4899 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-LX9", -15, 0, + { 7790,-2736,-755,-3452,11870,1769,-628,1647,4898 } }, + + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-FX150", -15, 0xfff, + { 9082,-2907,-925,-6119,13377,3058,-1797,2641,5609 } }, + + { LIBRAW_CAMERAMAKER_Panasonic, "DC-G99", -15, 0, + { 9657,-3963,-748,-3361,11378,2258,-568,1415,5158 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DC-G100", -15, 0, + { 8370,-2869,-710,-3389,11372,2298,-640,1599,4887 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-G10", 0, 0, + { 10113,-3400,-1114,-4765,12683,2317,-377,1437,6710 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-G1", -15, 0xf94, + { 8199,-2065,-1056,-8124,16156,2033,-2458,3022,7220 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-G2", -15, 0xf3c, + { 10113,-3400,-1114,-4765,12683,2317,-377,1437,6710 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-G3", -15, 0xfff, + { 6763,-1919,-863,-3868,11515,2684,-1216,2387,5879 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-G5", -15, 0xfff, + { 7798,-2562,-740,-3879,11584,2613,-1055,2248,5434 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-G6", -15, 0xfff, + { 8294,-2891,-651,-3869,11590,2595,-1183,2267,5352 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-G7", -15, 0xfff, + { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-G8", -15, 0xfff, + { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, + + {LIBRAW_CAMERAMAKER_Panasonic, "DC-G9M2", 0, 0, + {8325,-3456,-623,-4330,12089,2528,-860,2646,5984}}, + + { LIBRAW_CAMERAMAKER_Panasonic, "DC-G9", -15, 0, + { 7685,-2375,-634,-3687,11700,2249,-748,1546,5111 } }, + + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-GH1", -15, 0xf92, + { 6299,-1466,-532,-6535,13852,2969,-2331,3112,5984 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-GH2", -15, 0xf95, + { 7780,-2410,-806,-3913,11724,2484,-1018,2390,5298 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-GH3", -15, 0, + { 6559,-1752,-491,-3672,11407,2586,-962,1875,5130 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-GH4", -15, 0, + { 7122,-2108,-512,-3155,11201,2231,-541,1423,5045 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DC-GH5s", -15, 0, + { 6929,-2355,-708,-4192,12534,1828,-1097,1989,5195 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DC-GH5M2", 0, 0, + { 9300, -3659, -755, -2981, 10988, 2287, -190, 1077, 5016 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DC-GH5", -15, 0, + { 7641,-2336,-605,-3218,11299,2187,-485,1338,5121 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DC-GH6", -2048, 0, + { 7949,-3491,-710,-3435,11681,1977,-503,1622,5065} }, + + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-GM1", -15, 0, + { 6770,-1895,-744,-5232,13145,2303,-1664,2691,5703 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-GM5", -15, 0, + { 8238,-3244,-679,-3921,11814,2384,-836,2022,5852 } }, + + { LIBRAW_CAMERAMAKER_Panasonic, "DC-GF10", -15, 0, + { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-GF1", -15, 0xf92, + { 7888,-1902,-1011,-8106,16085,2099,-2353,2866,7330 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-GF2", -15, 0xfff, + { 7888,-1902,-1011,-8106,16085,2099,-2353,2866,7330 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-GF3", -15, 0xfff, + { 9051,-2468,-1204,-5212,13276,2121,-1197,2510,6890 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-GF5", -15, 0xfff, + { 8228,-2945,-660,-3938,11792,2430,-1094,2278,5793 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-GF6", -15, 0, + { 8130,-2801,-946,-3520,11289,2552,-1314,2511,5791 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-GF7", -15, 0, + { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-GF8", -15, 0, + { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DC-GF9", -15, 0, + { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, + + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-GX85", -15, 0, + { 7771,-3020,-629,-4029,11950,2345,-821,1977,6119 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-GX1", -15, 0, + { 6763,-1919,-863,-3868,11515,2684,-1216,2387,5879 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-GX7", -15,0, + { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-GX8", -15,0, + { 7564,-2263,-606,-3148,11239,2177,-540,1435,4853 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DC-GX9", -15, 0, + { 7564,-2263,-606,-3148,11239,2177,-540,1435,4853 } }, + + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-TZ82", -15, 0, + { 8550,-2908,-842,-3195,11529,1881,-338,1603,4631 } }, + + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-ZS100", -15, 0, + { 7790,-2736,-755,-3452,11870,1769,-628,1647,4898 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DC-ZS200", -15, 0, + { 7790,-2736,-755,-3452,11870,1769,-628,1647,4898 } }, + + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-ZS40", -15, 0, + { 8607,-2822,-808,-3755,11930,2049,-820,2060,5224 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-ZS50", -15, 0, + { 8802,-3135,-789,-3151,11468,1904,-550,1745,4810 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DMC-ZS60", -15, 0, + { 8550,-2908,-842,-3195,11529,1881,-338,1603,4631 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DC-ZS70", -15, 0, + { 9052,-3117,-883,-3045,11346,1927,-205,1520,4730 } }, + { LIBRAW_CAMERAMAKER_Panasonic, "DC-ZS80", -15, 0, + { 12194,-5340,-1329,-3035,11394,1858,-50,1418,5219 } }, + + { LIBRAW_CAMERAMAKER_PhaseOne, "H20", 0, 0, + { 3906,1422,-467,-9953,18472,1365,-3307,4496,6406 } }, + { LIBRAW_CAMERAMAKER_PhaseOne, "H25", 0, 0, + { 2905,732,-237,-8134,16626,1476,-3038,4253,7517 } }, + { LIBRAW_CAMERAMAKER_PhaseOne, "IQ4 150MP", 0, 0, + { 6644, -2257, -804, -6459, 14562, 2019, -1221, 1876, 6411}}, + { LIBRAW_CAMERAMAKER_PhaseOne, "IQ140", 0, 0, + { 8035,435,-962,-6001,13872,2320,-1159,3065,5434 } }, + { LIBRAW_CAMERAMAKER_PhaseOne, "IQ150", 0, 0, + {10325,845,-604,-4113,13385,481,-1791,4163,6924}}, /* temp */ /* emb */ +// { 3984,0,0,0,10000,0,0,0,7666 } }, + { LIBRAW_CAMERAMAKER_PhaseOne, "IQ160", 0, 0, + { 8035,435,-962,-6001,13872,2320,-1159,3065,5434 } }, + { LIBRAW_CAMERAMAKER_PhaseOne, "IQ180", 0, 0, + { 6294,686,-712,-5435,13417,2211,-1006,2435,5042 } }, + + { LIBRAW_CAMERAMAKER_PhaseOne, "IQ250",0, 0, +// {3984,0,0,0,10000,0,0,0,7666}}, + {10325,845,-604,-4113,13385,481,-1791,4163,6924}}, /* emb */ + { LIBRAW_CAMERAMAKER_PhaseOne, "IQ260", 0, 0, + { 8035,435,-962,-6001,13872,2320,-1159,3065,5434 } }, + { LIBRAW_CAMERAMAKER_PhaseOne, "IQ280", 0, 0, + { 6294,686,-712,-5435,13417,2211,-1006,2435,5042 } }, + + { LIBRAW_CAMERAMAKER_PhaseOne, "IQ3 100MP", 0, 0, +// {2423,0,0,0,9901,0,0,0,7989}}, + { 10999,354,-742,-4590,13342,937,-1060,2166,8120} }, /* emb */ + { LIBRAW_CAMERAMAKER_PhaseOne, "IQ3 50MP", 0, 0, +// { 3984,0,0,0,10000,0,0,0,7666 } }, + {10058,1079,-587,-4135,12903,944,-916,2726,7480}}, /* emb */ + { LIBRAW_CAMERAMAKER_PhaseOne, "IQ3 60MP", 0, 0, + { 8035,435,-962,-6001,13872,2320,-1159,3065,5434 } }, + { LIBRAW_CAMERAMAKER_PhaseOne, "IQ3 80MP", 0, 0, + { 6294,686,-712,-5435,13417,2211,-1006,2435,5042 } }, + + { LIBRAW_CAMERAMAKER_PhaseOne, "P21", 0, 0, + { 6516,-2050,-507,-8217,16703,1479,-3492,4741,8489 } }, + { LIBRAW_CAMERAMAKER_PhaseOne, "P30", 0, 0, + { 4516,-244,-36,-7020,14976,2174,-3206,4670,7087 } }, + { LIBRAW_CAMERAMAKER_PhaseOne, "P40", 0, 0, + { 8035,435,-962,-6001,13872,2320,-1159,3065,5434 } }, + { LIBRAW_CAMERAMAKER_PhaseOne, "P45", 0, 0, + { 5053,-24,-117,-5685,14077,1703,-2619,4491,5850 } }, + { LIBRAW_CAMERAMAKER_PhaseOne, "P65", 0, 0, + { 8035,435,-962,-6001,13872,2320,-1159,3065,5434 } }, + { LIBRAW_CAMERAMAKER_PhaseOne, "P2", 0, 0, + { 2905,732,-237,-8134,16626,1476,-3038,4253,7517 } }, + + { LIBRAW_CAMERAMAKER_Photron, "BC2-HD", 0, 0, + { 14603,-4122,-528,-1810,9794,2017,-297,2763,5936 } }, /* DJC */ + + { LIBRAW_CAMERAMAKER_Polaroid, "x530", 0, 0, + { 13458,-2556,-510,-5444,15081,205,0,0,12120 } }, + + { LIBRAW_CAMERAMAKER_RED, "One", 704, 0xffff, + { 21014,-7891,-2613,-3056,12201,856,-2203,5125,8042 } }, /* DJC */ + + { LIBRAW_CAMERAMAKER_Ricoh, "S10 24-72mm F2.5-4.4 VC", 0, 0, + { 10531,-4043,-878,-2038,10270,2052,-107,895,4577 } }, + { LIBRAW_CAMERAMAKER_Ricoh, "GR A12 50mm F2.5 MACRO", 0, 0, + { 8849,-2560,-689,-5092,12831,2520,-507,1280,7104 } }, + { LIBRAW_CAMERAMAKER_Ricoh, "GR DIGITAL 2", 0, 0, + { 8846,-2704,-729,-5265,12708,2871,-1471,1955,6218 } }, + { LIBRAW_CAMERAMAKER_Ricoh, "GR DIGITAL 3", 0, 0, + { 8170,-2496,-655,-5147,13056,2312,-1367,1859,5265 } }, + { LIBRAW_CAMERAMAKER_Ricoh, "GR DIGITAL 4", 0, 0, + { 8771,-3151,-837,-3097,11015,2389,-703,1343,4924 } }, + { LIBRAW_CAMERAMAKER_Ricoh, "GR III", 0, 0, + { 6127,-1777,-585,-5913,13699,2428,-1088,1780,6017 } }, + { LIBRAW_CAMERAMAKER_Ricoh, "GR II", 0, 0, + { 5329,-1459,-390,-5407,12930,2768,-1119,1772,6046 } }, + { LIBRAW_CAMERAMAKER_Ricoh, "GR", 0, 0, + { 5329,-1459,-390,-5407,12930,2768,-1119,1772,6046 } }, + { LIBRAW_CAMERAMAKER_Ricoh, "GX200", 0, 0, + { 8040,-2368,-626,-4659,12543,2363,-1125,1581,5660 } }, + { LIBRAW_CAMERAMAKER_Ricoh, "GXR Mount A12", 0, 0, + { 7834,-2182,-739,-5453,13409,2241,-952,2005,6620 } }, + { LIBRAW_CAMERAMAKER_Ricoh, "GXR A12 50mm", 0, 0, + { 8849,-2560,-689,-5092,12831,2520,-507,1280,7104 } }, + { LIBRAW_CAMERAMAKER_Ricoh, "GXR A12 28mm", 0, 0, + { 10228,-3159,-933,-5304,13158,2371,-943,1873,6685 } }, + { LIBRAW_CAMERAMAKER_Ricoh, "GXR A16", 0, 0, + { 7837,-2538,-730,-4370,12184,2461,-868,1648,5830 } }, + { LIBRAW_CAMERAMAKER_Ricoh, "GXR P10", 0, 0, + { 13168,-5128,-1663,-3006,11569,1611,-373,1244,4907 } }, + { LIBRAW_CAMERAMAKER_Ricoh, "GXR S10", 0, 0, + { 8963,-2926,-754,-4881,12921,2164,-1464,1944,4901 } }, + + { LIBRAW_CAMERAMAKER_Samsung, "EX1", 0, 0x3e00, + { 8898,-2498,-994,-3144,11328,2066,-760,1381,4576 } }, + { LIBRAW_CAMERAMAKER_Samsung, "EX2F", 0, 0x7ff, + { 10648,-3897,-1055,-2022,10573,1668,-492,1611,4742 } }, +// { LIBRAW_CAMERAMAKER_Samsung, "GX20", 0, 0, +// { 23213,-14575,-4840,-7077,16564,316,385,-1656,9398 } }, // Adobe DNG +// { 27717,-17403,-5779,-8450,19778,377,459,1978,11221 } }, // Samsung DNG +// { 9427,-2714,-868,-7493,16092,1373,-2199,3264,7180 } }, // Adobe DCP + +// { LIBRAW_CAMERAMAKER_Samsung, "Galaxy S6 Edge Rear Camera", 0, 0, +// { LIBRAW_CAMERAMAKER_Samsung, "Galaxy S6 Rear Camera", 0, 0, + { LIBRAW_CAMERAMAKER_Samsung, "Galaxy S6", 0, 0, // same CMs: "Galaxy S6", "Galaxy S6 Edge" + { 13699,-5767,-1384,-4449,13879,499,-467,1691,5892 } }, + +// { LIBRAW_CAMERAMAKER_Samsung, "Galaxy S7 Edge Rear Camera", 0, 0, +// { LIBRAW_CAMERAMAKER_Samsung, "Galaxy S7 Rear Camera", 0, 0, + { LIBRAW_CAMERAMAKER_Samsung, "Galaxy S7", 0, 0, // same CMs: "Galaxy S7", "Galaxy S7 Edge" + { 9927,-3704,-1024,-3935,12758,1257,-389,1512,4993 } }, + +// { LIBRAW_CAMERAMAKER_Samsung, "Galaxy S8+ Rear Camera", 0, 0, +// { LIBRAW_CAMERAMAKER_Samsung, "Galaxy S8 Rear Camera", 0, 0, + { LIBRAW_CAMERAMAKER_Samsung, "Galaxy S8", 0, 0, // same CMs: "Galaxy S8", "Galaxy S8+" + { 9927,-3704,-1024,-3935,12758,1257,-389,1512,4993 } }, + +// { LIBRAW_CAMERAMAKER_Samsung, "Galaxy S9+ Rear Camera", 0, 0, +// { LIBRAW_CAMERAMAKER_Samsung, "Galaxy S9 Rear Camera", 0, 0, + { LIBRAW_CAMERAMAKER_Samsung, "Galaxy S9", 0, 0, // same CMs: "Galaxy S9", "Galaxy S9+" + { 13292,-6142,-1268,-4095,12890,1283,-557,1930,5163 } }, +// { LIBRAW_CAMERAMAKER_Samsung, "Galaxy Note 9 Rear Telephoto Camera", 0, 0, + { LIBRAW_CAMERAMAKER_Samsung, "Galaxy Note 9 Rear Camera", 0, 0, + { 13292,-6142,-1268,-4095,12890,1283,-557,1930,5163 } }, + + { LIBRAW_CAMERAMAKER_Samsung, "NX U", 0, 0, + { 7557,-2522,-739,-4679,12949,1894,-840,1777,5311 } }, + { LIBRAW_CAMERAMAKER_Samsung, "NX3300", 0, 0, + { 8060,-2933,-761,-4504,12890,1762,-630,1489,5227 } }, + { LIBRAW_CAMERAMAKER_Samsung, "NX3000", 0, 0, + { 8060,-2933,-761,-4504,12890,1762,-630,1489,5227 } }, + { LIBRAW_CAMERAMAKER_Samsung, "NX30", 0, 0, // same CMs: NX30, NX300, NX300M + { 7557,-2522,-739,-4679,12949,1894,-840,1777,5311 } }, + { LIBRAW_CAMERAMAKER_Samsung, "NX2000", 0, 0, + { 7557,-2522,-739,-4679,12949,1894,-840,1777,5311 } }, + { LIBRAW_CAMERAMAKER_Samsung, "NX2", 0, 0xfff, // same CMs: NX20, NX200, NX210 + { 6933,-2268,-753,-4921,13387,1647,-803,1641,6096 } }, + { LIBRAW_CAMERAMAKER_Samsung, "NX1000", 0, 0, + { 6933,-2268,-753,-4921,13387,1647,-803,1641,6096 } }, + { LIBRAW_CAMERAMAKER_Samsung, "NX1100", 0, 0, + { 6933,-2268,-753,-4921,13387,1647,-803,1641,6096 } }, + { LIBRAW_CAMERAMAKER_Samsung, "NX11", 0, 0, + { 10332,-3234,-1168,-6111,14639,1520,-1352,2647,8331 } }, + { LIBRAW_CAMERAMAKER_Samsung, "NX10", 0, 0, // same CMs: NX10, NX100 + { 10332,-3234,-1168,-6111,14639,1520,-1352,2647,8331 } }, + { LIBRAW_CAMERAMAKER_Samsung, "NX500", 0, 0, + { 10686,-4042,-1052,-3595,13238,276,-464,1259,5931 } }, + { LIBRAW_CAMERAMAKER_Samsung, "NX5", 0, 0, + { 10332,-3234,-1168,-6111,14639,1520,-1352,2647,8331 } }, + { LIBRAW_CAMERAMAKER_Samsung, "NX1", 0, 0, + { 10686,-4042,-1052,-3595,13238,276,-464,1259,5931 } }, + { LIBRAW_CAMERAMAKER_Samsung, "NX mini", 0, 0, + { 5222,-1196,-550,-6540,14649,2009,-1666,2819,5657 } }, + + { LIBRAW_CAMERAMAKER_Samsung, "WB2000", 0, 0xfff, + { 12093,-3557,-1155,-1000,9534,1733,-22,1787,4576 } }, + { LIBRAW_CAMERAMAKER_Samsung, "WB5000", 0, 0, + { 7675, -2195, -305, -5860, 14118, 1857, -2425, 4007, 6578}}, + { LIBRAW_CAMERAMAKER_Samsung, "S85", 0, 0, + { 11885,-3968,-1473,-4214,12299,1916,-835,1655,5549 } }, /* DJC */ + +// Foveon: LibRaw color data + { LIBRAW_CAMERAMAKER_Sigma, "dp0 Quattro", 2047, 0, + { 13801,-3390,-1016,5535,3802,877,1848,4245,3730 } }, + { LIBRAW_CAMERAMAKER_Sigma, "dp1 Quattro", 2047, 0, + { 13801,-3390,-1016,5535,3802,877,1848,4245,3730 } }, + { LIBRAW_CAMERAMAKER_Sigma, "dp2 Quattro", 2047, 0, + { 13801,-3390,-1016,5535,3802,877,1848,4245,3730 } }, + { LIBRAW_CAMERAMAKER_Sigma, "dp3 Quattro", 2047, 0, + { 13801,-3390,-1016,5535,3802,877,1848,4245,3730 } }, + { LIBRAW_CAMERAMAKER_Sigma, "sd Quattro H", 256, 0, + { 1295,108,-311,256,828,-65,-28,750,254 } }, /* temp */ + { LIBRAW_CAMERAMAKER_Sigma, "sd Quattro", 2047, 0, + { 1295,108,-311,256,828,-65,-28,750,254 } }, /* temp */ + { LIBRAW_CAMERAMAKER_Sigma, "SD9", 15, 4095, + { 13564,-2537,-751,-5465,15154,194,-67,116,10425 } }, + { LIBRAW_CAMERAMAKER_Sigma, "SD10", 15, 16383, + { 6787,-1682,575,-3091,8357,160,217,-369,12314 } }, + { LIBRAW_CAMERAMAKER_Sigma, "SD14", 15, 16383, + { 13589,-2509,-739,-5440,15104,193,-61,105,10554 } }, + { LIBRAW_CAMERAMAKER_Sigma, "SD15", 15, 4095, + { 13556,-2537,-730,-5462,15144,195,-61,106,10577 } }, +// Merrills + SD1 + { LIBRAW_CAMERAMAKER_Sigma, "SD1", 31, 4095, + { 5133,-1895,-353,4978,744,144,3837,3069,2777 } }, /* LibRaw */ + { LIBRAW_CAMERAMAKER_Sigma, "DP1 Merrill", 31, 4095, + { 5133,-1895,-353,4978,744,144,3837,3069,2777 } }, /* LibRaw */ + { LIBRAW_CAMERAMAKER_Sigma, "DP2 Merrill", 31, 4095, + { 5133,-1895,-353,4978,744,144,3837,3069,2777 } }, /* LibRaw */ + { LIBRAW_CAMERAMAKER_Sigma, "DP3 Merrill", 31, 4095, + { 5133,-1895,-353,4978,744,144,3837,3069,2777 } }, /* LibRaw */ +// Sigma DP (non-Merrill Versions) + { LIBRAW_CAMERAMAKER_Sigma, "DP1X", 0, 4095, + { 13704,-2452,-857,-5413,15073,186,-89,151,9820 } }, + { LIBRAW_CAMERAMAKER_Sigma, "DP1", 0, 4095, + { 12774,-2591,-394,-5333,14676,207,15,-21,12127 } }, + { LIBRAW_CAMERAMAKER_Sigma, "DP", 0, 4095, + // { 7401,-1169,-567,2059,3769,1510,664,3367,5328 } }, + { 13100,-3638,-847,6855,2369,580,2723,3218,3251 } }, /* LibRaw */ + + { LIBRAW_CAMERAMAKER_Sinar, "", 0, 0, + { 16442,-2956,-2422,-2877,12128,750,-1136,6066,4559 } }, /* DJC */ + + { LIBRAW_CAMERAMAKER_Sony, "DSC-F828", 0, 0, + { 7924,-1910,-777,-8226,15459,2998,-1517,2199,6818,-7242,11401,3481 } }, + { LIBRAW_CAMERAMAKER_Sony, "DSC-R1", 0, 0, + { 8512,-2641,-694,-8042,15670,2526,-1821,2117,7414 } }, + { LIBRAW_CAMERAMAKER_Sony, "DSC-V3", 0, 0, + { 7511,-2571,-692,-7894,15088,3060,-948,1111,8128 } }, + + { LIBRAW_CAMERAMAKER_Sony, "DSC-HX9", -800, 0, // same CMs: DSC-HX95, DSC-HX99 + { 13076,-5686,-1481,-4027,12851,1251,-167,725,4937 } }, + + { LIBRAW_CAMERAMAKER_Sony, "ZV-1", -800, 0, // same CMs: ZV-1, ZV-1B, ZV-1M2 + { 8280,-2987,-703,-3531,11645,2133,-550,1542,5312 } }, + { LIBRAW_CAMERAMAKER_Sony, "ZV-E10", 0, 0, + { 6355,-2067,-490,-3653,11542,2400,-406,1258,5506 } }, + { LIBRAW_CAMERAMAKER_Sony, "ZV-E1", 0, 0, + { 6912,-2127,-469,-4470,12175,2587,-398,1478,6492 } }, + + { LIBRAW_CAMERAMAKER_Sony, "DSC-RX100M7", -800, 0, + {10315, -4390, -937, -4859, 12734, 2365, -734, 1537, 5997 } }, + { LIBRAW_CAMERAMAKER_Sony, "DSC-RX100M6", -800, 0, + { 7325,-2321,-596,-3494,11674,2055,-668,1562,5031 } }, + { LIBRAW_CAMERAMAKER_Sony, "DSC-RX100M5A", -800, 0, + { 11176,-4700,-965,-4004,12184,2032,-763,1726,5876 } }, + { LIBRAW_CAMERAMAKER_Sony, "DSC-RX100M", -800, 0, // same CMs: DSC-RX100M2, DSC-RX100M3, DSC-RX100M4, DSC-RX100M5 + { 6596,-2079,-562,-4782,13016,1933,-970,1581,5181 } }, + { LIBRAW_CAMERAMAKER_Sony, "DSC-RX100", 0, 0, + { 8651,-2754,-1057,-3464,12207,1373,-568,1398,4434 } }, + { LIBRAW_CAMERAMAKER_Sony, "DSC-RX10M4", -800, 0, + { 7699,-2566,-629,-2967,11270,1928,-378,1286,4807 } }, + { LIBRAW_CAMERAMAKER_Sony, "DSC-RX10",0, 0, // same CMs: DSC-RX10, DSC-RX10M2, DSC-RX10M3 + { 6679,-1825,-745,-5047,13256,1953,-1580,2422,5183 } }, + { LIBRAW_CAMERAMAKER_Sony, "DSC-RX1RM2", 0, 0, + { 6629,-1900,-483,-4618,12349,2550,-622,1381,6514 } }, + { LIBRAW_CAMERAMAKER_Sony, "DSC-RX1R", 0, 0, + { 6344,-1612,-462,-4863,12477,2681,-865,1786,6899 } }, + { LIBRAW_CAMERAMAKER_Sony, "DSC-RX1", 0, 0, + { 6344,-1612,-462,-4863,12477,2681,-865,1786,6899 } }, + + { LIBRAW_CAMERAMAKER_Sony, "DSC-RX0", -800, 0, // same CMs: DSC-RX0, DSC-RX0M2 + { 9396,-3507,-843,-2497,11111,1572,-343,1355,5089 } }, + + { LIBRAW_CAMERAMAKER_Sony, "DSLR-A100", 0, 0xfeb, + { 9437,-2811,-774,-8405,16215,2290,-710,596,7181 } }, + { LIBRAW_CAMERAMAKER_Sony, "DSLR-A290", 0, 0, + { 6038,-1484,-579,-9145,16746,2512,-875,746,7218 } }, + { LIBRAW_CAMERAMAKER_Sony, "DSLR-A2", 0, 0, // same CMs: DSLR-A200, DSLR-A230 + { 9847,-3091,-928,-8485,16345,2225,-715,595,7103 } }, + { LIBRAW_CAMERAMAKER_Sony, "DSLR-A300", 0, 0, + { 9847,-3091,-928,-8485,16345,2225,-715,595,7103 } }, + { LIBRAW_CAMERAMAKER_Sony, "DSLR-A330", 0, 0, + { 9847,-3091,-929,-8485,16346,2225,-714,595,7103 } }, + { LIBRAW_CAMERAMAKER_Sony, "DSLR-A3", 0, 0, // same CMs: DSLR-A350, DSLR-A380, DSLR-A390 + { 6038,-1484,-579,-9145,16746,2512,-875,746,7218 } }, + { LIBRAW_CAMERAMAKER_Sony, "DSLR-A450", 0, 0, // close to 16596 if arw is 14-bit + { 4950,-580,-103,-5228,12542,3029,-709,1435,7371 } }, + { LIBRAW_CAMERAMAKER_Sony, "DSLR-A580", 0, 16596, + { 5932,-1492,-411,-4813,12285,2856,-741,1524,6739 } }, + { LIBRAW_CAMERAMAKER_Sony, "DSLR-A500", 0, 16596, + { 6046,-1127,-278,-5574,13076,2786,-691,1419,7625 } }, + { LIBRAW_CAMERAMAKER_Sony, "DSLR-A5", 0, 16596, // same CMs: DSLR-A550, DSLR-A560 + { 4950,-580,-103,-5228,12542,3029,-709,1435,7371 } }, + { LIBRAW_CAMERAMAKER_Sony, "DSLR-A700", 0, 0, + { 5775,-805,-359,-8574,16295,2391,-1943,2341,7249 } }, + { LIBRAW_CAMERAMAKER_Sony, "DSLR-A850", 0, 0, + { 5413,-1162,-365,-5665,13098,2866,-608,1179,8440 } }, + { LIBRAW_CAMERAMAKER_Sony, "DSLR-A900", 0, 0, + { 5209,-1072,-397,-8845,16120,2919,-1618,1803,8654 } }, + + { LIBRAW_CAMERAMAKER_Sony, "ILCA-68", 0, 0, + { 6435,-1903,-536,-4722,12449,2550,-663,1363,6517 } }, + { LIBRAW_CAMERAMAKER_Sony, "ILCA-77M2", 0, 0, + { 5991,-1732,-443,-4100,11989,2381,-704,1467,5992 } }, + { LIBRAW_CAMERAMAKER_Sony, "ILCA-99M2", 0, 0, + { 6660,-1918,-471,-4613,12398,2485,-649,1433,6447 } }, + + { LIBRAW_CAMERAMAKER_Sony, "ILCE-1", 0, 0, + { 8161, -2947, -739, -4811, 12668, 2389, -437, 1229, 6524}}, + + { LIBRAW_CAMERAMAKER_Sony, "ILCE-7RM5", 0, 0, + { 8200, -2976, -719, -4296, 12053, 2532, -429, 1282, 5774 } }, + { LIBRAW_CAMERAMAKER_Sony, "ILCE-7RM4", 0, 0, // same CMs: ILCE-7RM4, ILCE-7RM4A + { 7662, -2686,-660,-5240, 12965,2530, -796, 1508, 6167 } }, + { LIBRAW_CAMERAMAKER_Sony, "ILCE-7RM3", 0, 0, // same CMs: ILCE-7RM3, ILCE-7RM3A + { 6640,-1847,-503,-5238,13010,2474,-993,1673,6527 } }, + { LIBRAW_CAMERAMAKER_Sony, "ILCE-7RM2", 0, 0, + { 6629,-1900,-483,-4618,12349,2550,-622,1381,6514 } }, + { LIBRAW_CAMERAMAKER_Sony, "ILCE-7R", 0, 0, + { 4913,-541,-202,-6130,13513,2906,-1564,2151,7183 } }, + + { LIBRAW_CAMERAMAKER_Sony, "ILCE-7SM3", 0, 0, + { 6912,-2127,-469,-4470,12175,2587,-398,1478,6492 } }, + { LIBRAW_CAMERAMAKER_Sony, "ILCE-7S", 0, 0, // same CMs: ILCE-7S, ILCE-7SM2 + { 5838,-1430,-246,-3497,11477,2297,-748,1885,5778 } }, + + { LIBRAW_CAMERAMAKER_Sony, "ILCE-7CR", 0, 0, + { 8200,-2976,-719,-4296,12053,2532,-429,1282,5774 } }, // temp + + { LIBRAW_CAMERAMAKER_Sony, "ILCE-7CM2", 0, 0, + { 7460,-2365,-588,-5687,13442,2474,-624,1156,6584 } }, // temp + { LIBRAW_CAMERAMAKER_Sony, "ILCE-7C", 0, 0, + { 7374,-2389,-551,-5435,13162,2519,-1006,1795,6552 } }, + + { LIBRAW_CAMERAMAKER_Sony, "ILCE-7M4", 0, 0, + { 7460,-2365,-588,-5687,13442,2474,-624,1156,6584 } }, + { LIBRAW_CAMERAMAKER_Sony, "ILCE-7M3", 0, 0, + { 7374,-2389,-551,-5435,13162,2519,-1006,1795,6552 } }, + { LIBRAW_CAMERAMAKER_Sony, "ILCE-7", 0, 0, // same CMs: ILCE-7, ILCE-7M2 + { 5271,-712,-347,-6153,13653,2763,-1601,2366,7242 } }, + + { LIBRAW_CAMERAMAKER_Sony, "ILCE-9", 0, 0, // same CMs: ILCE-9, ILCE-9M2 + { 6389,-1703,-378,-4562,12265,2587,-670,1489,6550 } }, + + { LIBRAW_CAMERAMAKER_Sony, "ILCE-6100", 0, 0, + { 7657,-2847,-607,-4083,11966,2389,-684,1418,5844 } }, + { LIBRAW_CAMERAMAKER_Sony, "ILCE-6300", 0, 0, + { 5973,-1695,-419,-3826,11797,2293,-639,1398,5789 } }, + { LIBRAW_CAMERAMAKER_Sony, "ILCE-6400", 0, 0, + { 7657,-2847,-607,-4083,11966,2389,-684,1418,5844 } }, + { LIBRAW_CAMERAMAKER_Sony, "ILCE-6500", 0, 0, + { 5973,-1695,-419,-3826,11797,2293,-639,1398,5789 } }, + { LIBRAW_CAMERAMAKER_Sony, "ILCE-6600", 0, 0, + { 7657,-2847,-607,-4083,11966,2389,-684,1418,5844 } }, + { LIBRAW_CAMERAMAKER_Sony, "ILCE-6700", 0, 0, + { 6972,-2408,-600,-4330,12101,2515,-388,1277,5847 } }, + + { LIBRAW_CAMERAMAKER_Sony, "ILCE", 0, 0, // same CMs: ILCE-3000, ILCE-5000, ILCE-5100, ILCE-6000, ILCE-QX1 + { 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 } }, + + { LIBRAW_CAMERAMAKER_Sony, "ILME-FX30", 0, 0, + { 6972, -2408, -600, -4330, 12101, 2515, -388, 1277, 5847 } }, + { LIBRAW_CAMERAMAKER_Sony, "ILME-FX3", 0, 0, + { 6912, -2127, -469, -4470, 12175, 2587, -398, 1478, 6492 } }, + + { LIBRAW_CAMERAMAKER_Sony, "NEX-5N", 0, 0, + { 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 } }, + { LIBRAW_CAMERAMAKER_Sony, "NEX-5R", 0, 0, + { 6129,-1545,-418,-4930,12490,2743,-977,1693,6615 } }, + { LIBRAW_CAMERAMAKER_Sony, "NEX-5T", 0, 0, + { 6129,-1545,-418,-4930,12490,2743,-977,1693,6615 } }, + { LIBRAW_CAMERAMAKER_Sony, "NEX-5", 0, 0, + { 6549,-1550,-436,-4880,12435,2753,-854,1868,6976 } }, + { LIBRAW_CAMERAMAKER_Sony, "NEX-3N", 0, 0, + { 6129,-1545,-418,-4930,12490,2743,-977,1693,6615 } }, + { LIBRAW_CAMERAMAKER_Sony, "NEX-3", 0, 0, + { 6549,-1550,-436,-4880,12435,2753,-854,1868,6976 } }, + { LIBRAW_CAMERAMAKER_Sony, "NEX-6", 0, 0, + { 6129,-1545,-418,-4930,12490,2743,-977,1693,6615 } }, + { LIBRAW_CAMERAMAKER_Sony, "NEX-7", 0, 0, + { 5491,-1192,-363,-4951,12342,2948,-911,1722,7192 } }, + { LIBRAW_CAMERAMAKER_Sony, "NEX-VG30", 0, 0, + { 6129,-1545,-418,-4930,12490,2743,-977,1693,6615 } }, + { LIBRAW_CAMERAMAKER_Sony, "NEX-VG900", 0, 0, + { 6344,-1612,-462,-4863,12477,2681,-865,1786,6899 } }, + { LIBRAW_CAMERAMAKER_Sony, "NEX", 0, 0, // same CMs: NEX-C3, NEX-F3, NEX-VG20 + { 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 } }, + { LIBRAW_CAMERAMAKER_Sony, "SLT-A33", 0, 0, + { 6069,-1221,-366,-5221,12779,2734,-1024,2066,6834 } }, + { LIBRAW_CAMERAMAKER_Sony, "SLT-A35", 0, 0, + { 5986,-1618,-415,-4557,11820,3120,-681,1404,6971 } }, + { LIBRAW_CAMERAMAKER_Sony, "SLT-A37", 0, 0, + { 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 } }, + { LIBRAW_CAMERAMAKER_Sony, "SLT-A55", 0, 0, + { 5932,-1492,-411,-4813,12285,2856,-741,1524,6739 } }, + { LIBRAW_CAMERAMAKER_Sony, "SLT-A5", 0, 0, // same CMs: SLT-A57, SLT-A58 + { 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 } }, + { LIBRAW_CAMERAMAKER_Sony, "SLT-A65", 0, 0, + { 5491,-1192,-363,-4951,12342,2948,-911,1722,7192 } }, + { LIBRAW_CAMERAMAKER_Sony, "SLT-A77", 0, 0, + { 5491,-1192,-363,-4951,12342,2948,-911,1722,7192 } }, + { LIBRAW_CAMERAMAKER_Sony, "SLT-A99", 0, 0, + { 6344,-1612,-462,-4863,12477,2681,-865,1786,6899 } }, + { LIBRAW_CAMERAMAKER_Sony, "MODEL-NAME", 0, 0, + { 5491,-1192,-363,-4951,12342,2948,-911,1722,7192 } }, + + { LIBRAW_CAMERAMAKER_YI, "M1", 0, 0, + { 7712,-2059,-653,-3882,11494,2726,-710,1332,5958 } }, + }; + // clang-format on + + double cam_xyz[4][3]; + //char name[130]; + int i, j; + + if (colors > 4 || colors < 1) + return 1; + + int bl4 = (cblack[0] + cblack[1] + cblack[2] + cblack[3]) / 4, bl64 = 0; + if (cblack[4] * cblack[5] > 0) + { + for (unsigned c = 0; c < 4096 && c < cblack[4] * cblack[5]; c++) + bl64 += cblack[c + 6]; + bl64 /= cblack[4] * cblack[5]; + } + int rblack = black + bl4 + bl64; + + for (i = 0; i < int(sizeof table / sizeof *table); i++) + { + if (table[i].m_idx == make_idx) + { + size_t l = strlen(table[i].prefix); + if (!l || !strncasecmp(t_model, table[i].prefix, l)) + { + if (!dng_version) + { + if (table[i].t_black > 0) + { + black = (ushort)table[i].t_black; + memset(cblack, 0, sizeof(cblack)); + } + else if (table[i].t_black < 0 && rblack == 0) + { + black = (ushort)(-table[i].t_black); + memset(cblack, 0, sizeof(cblack)); + } + if (table[i].t_maximum) + maximum = (ushort)table[i].t_maximum; + } + if (table[i].trans[0]) + { + for (raw_color = j = 0; j < 12; j++) + if (internal_only) + imgdata.color.cam_xyz[j / 3][j % 3] = table[i].trans[j] / 10000.f; + else + ((double *)cam_xyz)[j] = imgdata.color.cam_xyz[j / 3][j % 3] = table[i].trans[j] / 10000.f; + if (!internal_only) + cam_xyz_coeff(rgb_cam, cam_xyz); + } + return 1; // CM found + } + } + } + return 0; // CM not found +} +void LibRaw::simple_coeff(int index) +{ + static const float table[][12] = { + /* index 0 -- all Foveon cameras */ + {1.4032f, -0.2231f, -0.1016f, -0.5263f, 1.4816f, 0.017f, -0.0112f, 0.0183f, + 0.9113f}, + /* index 1 -- Kodak DC20 and DC25 */ + {2.25f, 0.75f, -1.75f, -0.25f, -0.25f, 0.75f, 0.75f, -0.25f, -0.25f, -1.75f, 0.75f, + 2.25f}, + /* index 2 -- Logitech Fotoman Pixtura */ + {1.893f, -0.418f, -0.476f, -0.495f, 1.773f, -0.278f, -1.017f, -0.655f, 2.672f}, + /* index 3 -- Nikon E880, E900, and E990 */ + {-1.936280f, 1.800443f, -1.448486f, 2.584324f, 1.405365f, -0.524955f, -0.289090f, + 0.408680f, -1.204965f, 1.082304f, 2.941367f, -1.818705f}}; + int i, c; + + for (raw_color = i = 0; i < 3; i++) + FORCC rgb_cam[i][c] = table[index][i * MIN(colors,4) + c]; +} diff --git a/rtengine/libraw/src/tables/wblists.cpp b/rtengine/libraw/src/tables/wblists.cpp new file mode 100644 index 000000000..53206047f --- /dev/null +++ b/rtengine/libraw/src/tables/wblists.cpp @@ -0,0 +1,217 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + + +#define _ARR_SZ(a) (sizeof(a)/sizeof(a[0])) + +static const int _tagtype_dataunit_bytes [20] = { + 1, 1, 1, 2, 4, 8, 1, 1, 2, 4, 8, 4, 8, 4, 2, 8, 8, 8, 8, 8 +}; + +libraw_static_table_t LibRaw::tagtype_dataunit_bytes(_tagtype_dataunit_bytes, _ARR_SZ(_tagtype_dataunit_bytes)); + +int libraw_tagtype_dataunit_bytes(int tagtype) +{ + return _tagtype_dataunit_bytes[((unsigned)tagtype < _ARR_SZ(_tagtype_dataunit_bytes)) ? tagtype : 0]; +} + + +static const int _Canon_wbi2std[] = { // Canon WB index to standard indexes +// std. number wbi - Canon number + LIBRAW_WBI_Auto, // 0 + LIBRAW_WBI_Daylight, // 1 + LIBRAW_WBI_Cloudy, // 2 + LIBRAW_WBI_Tungsten, // 3 + LIBRAW_WBI_Fluorescent, // 4 + LIBRAW_WBI_Flash, // 5 + LIBRAW_WBI_Custom, // 6 + LIBRAW_WBI_BW, // 7 + LIBRAW_WBI_Shade, // 8 + LIBRAW_WBI_Kelvin, // 9 + LIBRAW_WBI_PC_Set1, // 10 + LIBRAW_WBI_PC_Set2, // 11 + LIBRAW_WBI_PC_Set3, // 12 + LIBRAW_WBI_Unknown, // 13, unlucky number "13", not used + LIBRAW_WBI_FluorescentHigh, // 14 + LIBRAW_WBI_Custom1, // 15 + LIBRAW_WBI_Custom2, // 16 + LIBRAW_WBI_Underwater, // 17, last one for older PowerShot models + LIBRAW_WBI_Custom3, // 18 + LIBRAW_WBI_Custom4, // 19 + LIBRAW_WBI_PC_Set4, // 20 + LIBRAW_WBI_PC_Set5, // 21 + LIBRAW_WBI_Unknown, // 22 + LIBRAW_WBI_Auto1 // 23 +}; + +libraw_static_table_t LibRaw::Canon_wbi2std(_Canon_wbi2std, _ARR_SZ(_Canon_wbi2std)); + +static const int _Canon_KeyIsZero_Len2048_linenums_2_StdWBi[] = { // Appendix A: G2, S30, S40; G3, G5, S45, S50 + LIBRAW_WBI_Custom1, + LIBRAW_WBI_Custom2, + LIBRAW_WBI_Daylight, + LIBRAW_WBI_Cloudy, + LIBRAW_WBI_Tungsten, + LIBRAW_WBI_Fluorescent, + LIBRAW_WBI_Unknown, // ? FluorescentHigh, Shade, Custom, Kelvin + LIBRAW_WBI_Flash +}; + +libraw_static_table_t LibRaw::Canon_KeyIsZero_Len2048_linenums_2_StdWBi(_Canon_KeyIsZero_Len2048_linenums_2_StdWBi, + _ARR_SZ(_Canon_KeyIsZero_Len2048_linenums_2_StdWBi)); + +static const int _Canon_KeyIs0x0410_Len3072_linenums_2_StdWBi[] = { // G6, S60, S70; offset +16 + LIBRAW_WBI_Custom1, + LIBRAW_WBI_Custom2, + LIBRAW_WBI_Daylight, + LIBRAW_WBI_Cloudy, + LIBRAW_WBI_Tungsten, + LIBRAW_WBI_Fluorescent, + LIBRAW_WBI_FluorescentHigh, // LIBRAW_WBI_Unknown, // ? FluorescentHigh, Shade, Custom, Kelvin + LIBRAW_WBI_Unknown, + LIBRAW_WBI_Underwater, // LIBRAW_WBI_Unknown, + LIBRAW_WBI_Unknown, + LIBRAW_WBI_Flash +}; + +libraw_static_table_t LibRaw::Canon_KeyIs0x0410_Len3072_linenums_2_StdWBi(_Canon_KeyIs0x0410_Len3072_linenums_2_StdWBi, + _ARR_SZ(_Canon_KeyIs0x0410_Len3072_linenums_2_StdWBi)); + +static const int _Canon_KeyIs0x0410_Len2048_linenums_2_StdWBi[] = { // Pro1; offset +8 + LIBRAW_WBI_Custom1, + LIBRAW_WBI_Custom2, + LIBRAW_WBI_Daylight, + LIBRAW_WBI_Cloudy, + LIBRAW_WBI_Tungsten, + LIBRAW_WBI_Fluorescent, + LIBRAW_WBI_Unknown, + LIBRAW_WBI_Flash, // LIBRAW_WBI_Unknown, + LIBRAW_WBI_Unknown, + LIBRAW_WBI_Unknown, + LIBRAW_WBI_Unknown // LIBRAW_WBI_Flash +}; + +libraw_static_table_t LibRaw::Canon_KeyIs0x0410_Len2048_linenums_2_StdWBi(_Canon_KeyIs0x0410_Len2048_linenums_2_StdWBi, + _ARR_SZ(_Canon_KeyIs0x0410_Len2048_linenums_2_StdWBi)); + +static const int _Canon_G9_linenums_2_StdWBi[] = { + LIBRAW_WBI_Auto, + LIBRAW_WBI_Daylight, + LIBRAW_WBI_Cloudy, + LIBRAW_WBI_Tungsten, + LIBRAW_WBI_Fluorescent, + LIBRAW_WBI_FluorescentHigh, + LIBRAW_WBI_Flash, + LIBRAW_WBI_Underwater, + LIBRAW_WBI_Custom1, + LIBRAW_WBI_Custom2 +}; +libraw_static_table_t LibRaw::Canon_G9_linenums_2_StdWBi(_Canon_G9_linenums_2_StdWBi, _ARR_SZ(_Canon_G9_linenums_2_StdWBi)); + +static const int _Canon_D30_linenums_2_StdWBi[] = { + LIBRAW_WBI_Daylight, + LIBRAW_WBI_Cloudy, + LIBRAW_WBI_Tungsten, + LIBRAW_WBI_Fluorescent, + LIBRAW_WBI_Flash, + LIBRAW_WBI_Custom +}; +libraw_static_table_t LibRaw::Canon_D30_linenums_2_StdWBi(_Canon_D30_linenums_2_StdWBi, _ARR_SZ(_Canon_D30_linenums_2_StdWBi)); + +static const int _Fuji_wb_list1[] = { + LIBRAW_WBI_FineWeather, LIBRAW_WBI_Shade, LIBRAW_WBI_FL_D, + LIBRAW_WBI_FL_N, LIBRAW_WBI_FL_W, LIBRAW_WBI_Tungsten + +}; +libraw_static_table_t LibRaw::Fuji_wb_list1(_Fuji_wb_list1, _ARR_SZ(_Fuji_wb_list1)); + +static const int _FujiCCT_K[31] = { + 2500, 2550, 2650, 2700, 2800, 2850, 2950, 3000, 3100, 3200, 3300, + 3400, 3600, 3700, 3800, 4000, 4200, 4300, 4500, 4800, 5000, 5300, + 5600, 5900, 6300, 6700, 7100, 7700, 8300, 9100, 10000 +}; +libraw_static_table_t LibRaw::FujiCCT_K(_FujiCCT_K, _ARR_SZ(_FujiCCT_K)); + +static const int _Fuji_wb_list2[] = { + LIBRAW_WBI_Auto, 0, LIBRAW_WBI_Custom, 6, LIBRAW_WBI_FineWeather, 1, + LIBRAW_WBI_Shade, 8, LIBRAW_WBI_FL_D, 10, LIBRAW_WBI_FL_N, 11, + LIBRAW_WBI_FL_W, 12, LIBRAW_WBI_Tungsten, 2, LIBRAW_WBI_Underwater, 35, + LIBRAW_WBI_Ill_A, 82, LIBRAW_WBI_D65, 83 +}; +libraw_static_table_t LibRaw::Fuji_wb_list2(_Fuji_wb_list2, _ARR_SZ(_Fuji_wb_list2)); + +static const int _Pentax_wb_list1[] = { + LIBRAW_WBI_Daylight, LIBRAW_WBI_Shade, + LIBRAW_WBI_Cloudy, LIBRAW_WBI_Tungsten, + LIBRAW_WBI_FL_D, LIBRAW_WBI_FL_N, + LIBRAW_WBI_FL_W, LIBRAW_WBI_Flash +}; +libraw_static_table_t LibRaw::Pentax_wb_list1(_Pentax_wb_list1, _ARR_SZ(_Pentax_wb_list1)); + +static const int _Pentax_wb_list2[] = { + LIBRAW_WBI_Daylight, LIBRAW_WBI_Shade, LIBRAW_WBI_Cloudy, + LIBRAW_WBI_Tungsten, LIBRAW_WBI_FL_D, LIBRAW_WBI_FL_N, + LIBRAW_WBI_FL_W, LIBRAW_WBI_Flash, LIBRAW_WBI_FL_L +}; +libraw_static_table_t LibRaw::Pentax_wb_list2(_Pentax_wb_list2, _ARR_SZ(_Pentax_wb_list2)); + + +static const int _Oly_wb_list1[] = { + LIBRAW_WBI_Shade, LIBRAW_WBI_Cloudy, LIBRAW_WBI_FineWeather, + LIBRAW_WBI_Tungsten, LIBRAW_WBI_Sunset, LIBRAW_WBI_FL_D, + LIBRAW_WBI_FL_N, LIBRAW_WBI_FL_W, LIBRAW_WBI_FL_WW +}; +libraw_static_table_t LibRaw::Oly_wb_list1(_Oly_wb_list1, _ARR_SZ(_Oly_wb_list1)); + +static const int _Oly_wb_list2[] = { + LIBRAW_WBI_Auto, 0, + LIBRAW_WBI_Tungsten, 3000, + 0x100, 3300, + 0x100, 3600, + 0x100, 3900, + LIBRAW_WBI_FL_W, 4000, + 0x100, 4300, + LIBRAW_WBI_FL_D, 4500, + 0x100, 4800, + LIBRAW_WBI_FineWeather, 5300, + LIBRAW_WBI_Cloudy, 6000, + LIBRAW_WBI_FL_N, 6600, + LIBRAW_WBI_Shade, 7500, + LIBRAW_WBI_Custom1, 0, + LIBRAW_WBI_Custom2, 0, + LIBRAW_WBI_Custom3, 0, + LIBRAW_WBI_Custom4, 0 +}; +libraw_static_table_t LibRaw::Oly_wb_list2(_Oly_wb_list2, _ARR_SZ(_Oly_wb_list2)); + +static const int _Sony_SRF_wb_list[] = { + LIBRAW_WBI_Daylight, LIBRAW_WBI_Cloudy, LIBRAW_WBI_Fluorescent, + LIBRAW_WBI_Tungsten, LIBRAW_WBI_Flash +}; +libraw_static_table_t LibRaw::Sony_SRF_wb_list(_Sony_SRF_wb_list, _ARR_SZ(_Sony_SRF_wb_list)); + +static const int _Sony_SR2_wb_list[] = { + LIBRAW_WBI_Daylight, LIBRAW_WBI_Cloudy, LIBRAW_WBI_Tungsten, LIBRAW_WBI_Flash, + 4500, LIBRAW_WBI_Unknown, LIBRAW_WBI_Fluorescent +}; +libraw_static_table_t LibRaw::Sony_SR2_wb_list(_Sony_SR2_wb_list, _ARR_SZ(_Sony_SR2_wb_list)); + +static const int _Sony_SR2_wb_list1[] = { + LIBRAW_WBI_Daylight, LIBRAW_WBI_Cloudy, LIBRAW_WBI_Tungsten, LIBRAW_WBI_Flash, + 4500, LIBRAW_WBI_Shade, LIBRAW_WBI_FL_W, LIBRAW_WBI_FL_N, LIBRAW_WBI_FL_D, + LIBRAW_WBI_FL_L, 8500, 6000, 3200, 2500 +}; +libraw_static_table_t LibRaw::Sony_SR2_wb_list1(_Sony_SR2_wb_list1, _ARR_SZ(_Sony_SR2_wb_list1)); diff --git a/rtengine/libraw/src/utils/curves.cpp b/rtengine/libraw/src/utils/curves.cpp new file mode 100644 index 000000000..58a1436f4 --- /dev/null +++ b/rtengine/libraw/src/utils/curves.cpp @@ -0,0 +1,154 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +void LibRaw::cubic_spline(const int *x_, const int *y_, const int len) +{ + float **A, *b, *c, *d, *x, *y; + int i, j; + + A = (float **)calloc(((2 * len + 4) * sizeof **A + sizeof *A), 2 * len); + if (!A) + return; + A[0] = (float *)(A + 2 * len); + for (i = 1; i < 2 * len; i++) + A[i] = A[0] + 2 * len * i; + y = len + (x = i + (d = i + (c = i + (b = A[0] + i * i)))); + for (i = 0; i < len; i++) + { + x[i] = x_[i] / 65535.0; + y[i] = y_[i] / 65535.0; + } + for (i = len - 1; i > 0; i--) + { + float _div = x[i] - x[i - 1]; + if (fabsf(_div) < 1.0e-15f) + _div = 1; + b[i] = (y[i] - y[i - 1]) / _div; + d[i - 1] = _div; + } + for (i = 1; i < len - 1; i++) + { + A[i][i] = 2 * (d[i - 1] + d[i]); + if (i > 1) + { + A[i][i - 1] = d[i - 1]; + A[i - 1][i] = d[i - 1]; + } + A[i][len - 1] = 6 * (b[i + 1] - b[i]); + } + for (i = 1; i < len - 2; i++) + { + float v = A[i + 1][i] / A[i][i]; + for (j = 1; j <= len - 1; j++) + A[i + 1][j] -= v * A[i][j]; + } + for (i = len - 2; i > 0; i--) + { + float acc = 0; + for (j = i; j <= len - 2; j++) + acc += A[i][j] * c[j]; + c[i] = (A[i][len - 1] - acc) / A[i][i]; + } + for (i = 0; i < 0x10000; i++) + { + float x_out = (float)(i / 65535.0); + float y_out = 0; + for (j = 0; j < len - 1; j++) + { + if (x[j] <= x_out && x_out <= x[j + 1]) + { + float v = x_out - x[j]; + y_out = y[j] + + ((y[j + 1] - y[j]) / d[j] - + (2 * d[j] * c[j] + c[j + 1] * d[j]) / 6) * + v + + (c[j] * 0.5) * v * v + + ((c[j + 1] - c[j]) / (6 * d[j])) * v * v * v; + } + } + curve[i] = y_out < 0.0 + ? 0 + : (y_out >= 1.0 ? 65535 : (ushort)(y_out * 65535.0 + 0.5)); + } + free(A); +} +void LibRaw::gamma_curve(double pwr, double ts, int mode, int imax) +{ + int i; + double g[6], bnd[2] = {0, 0}, r; + + g[0] = pwr; + g[1] = ts; + g[2] = g[3] = g[4] = 0; + bnd[g[1] >= 1] = 1; + if (g[1] && (g[1] - 1) * (g[0] - 1) <= 0) + { + for (i = 0; i < 48; i++) + { + g[2] = (bnd[0] + bnd[1]) / 2; + if (g[0]) + bnd[(pow(g[2] / g[1], -g[0]) - 1) / g[0] - 1 / g[2] > -1] = g[2]; + else + bnd[g[2] / exp(1 - 1 / g[2]) < g[1]] = g[2]; + } + g[3] = g[2] / g[1]; + if (g[0]) + g[4] = g[2] * (1 / g[0] - 1); + } + if (g[0]) + g[5] = 1 / (g[1] * SQR(g[3]) / 2 - g[4] * (1 - g[3]) + + (1 - pow(g[3], 1 + g[0])) * (1 + g[4]) / (1 + g[0])) - + 1; + else + 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--) + { + memcpy(gamm, g, sizeof gamm); + return; + } + for (i = 0; i < 0x10000; i++) + { + curve[i] = 0xffff; + if ((r = (double)i / imax) < 1) + curve[i] = + 0x10000 * + (mode ? (r < g[3] ? r * g[1] + : (g[0] ? pow(r, g[0]) * (1 + g[4]) - g[4] + : log(r) * g[2] + 1)) + : (r < g[2] ? r / g[1] + : (g[0] ? pow((r + g[4]) / (1 + g[4]), 1 / g[0]) + : exp((r - 1) / g[2])))); + } +} + +void LibRaw::linear_table(unsigned len) +{ + int i; + if (len > 0x10000) + len = 0x10000; + else if (len < 1) + return; + read_shorts(curve, len); + for (i = len; i < 0x10000; i++) + curve[i] = curve[i - 1]; + maximum = curve[len < 0x1000 ? 0xfff : len - 1]; +} diff --git a/rtengine/libraw/src/utils/decoder_info.cpp b/rtengine/libraw/src/utils/decoder_info.cpp new file mode 100644 index 000000000..3abc35e9b --- /dev/null +++ b/rtengine/libraw/src/utils/decoder_info.cpp @@ -0,0 +1,416 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ +#include "../../internal/libraw_cxx_defs.h" + +const char *LibRaw::unpack_function_name() +{ + libraw_decoder_info_t decoder_info; + get_decoder_info(&decoder_info); + return decoder_info.decoder_name; +} + +int LibRaw::get_decoder_info(libraw_decoder_info_t *d_info) +{ + if (!d_info) + return LIBRAW_UNSPECIFIED_ERROR; + d_info->decoder_name = 0; + d_info->decoder_flags = 0; + if (!load_raw) + return LIBRAW_OUT_OF_ORDER_CALL; + + // dcraw.c names order + if (load_raw == &LibRaw::android_tight_load_raw) + { + d_info->decoder_name = "android_tight_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_FIXEDMAXC; + } + else if (load_raw == &LibRaw::android_loose_load_raw) + { + d_info->decoder_name = "android_loose_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_FIXEDMAXC; + } + else if (load_raw == &LibRaw::vc5_dng_load_raw_placeholder) + { + d_info->decoder_name = "vc5_dng_load_raw_placeholder()"; +#ifndef USE_GPRSDK + d_info->decoder_flags = LIBRAW_DECODER_UNSUPPORTED_FORMAT; +#endif + } + else if (load_raw == &LibRaw::jxl_dng_load_raw_placeholder) + { + d_info->decoder_name = "jxl_dng_load_raw_placeholder()"; +#ifndef USE_DNGSDK + d_info->decoder_flags = LIBRAW_DECODER_UNSUPPORTED_FORMAT; +#endif + } + else if (load_raw == &LibRaw::canon_600_load_raw) + { + d_info->decoder_name = "canon_600_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_FIXEDMAXC; + } + else if (load_raw == &LibRaw::fuji_compressed_load_raw) + { + d_info->decoder_name = "fuji_compressed_load_raw()"; + } + else if (load_raw == &LibRaw::fuji_14bit_load_raw) + { + d_info->decoder_name = "fuji_14bit_load_raw()"; + } + else if (load_raw == &LibRaw::canon_load_raw) + { + d_info->decoder_name = "canon_load_raw()"; + } + else if (load_raw == &LibRaw::lossless_jpeg_load_raw) + { + d_info->decoder_name = "lossless_jpeg_load_raw()"; + d_info->decoder_flags = + LIBRAW_DECODER_HASCURVE | LIBRAW_DECODER_TRYRAWSPEED | LIBRAW_DECODER_TRYRAWSPEED3; + } + else if (load_raw == &LibRaw::canon_sraw_load_raw) + { + d_info->decoder_name = "canon_sraw_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_TRYRAWSPEED3; + } + else if (load_raw == &LibRaw::crxLoadRaw) + { + d_info->decoder_name = "crxLoadRaw()"; + } + else if (load_raw == &LibRaw::lossless_dng_load_raw) + { + d_info->decoder_name = "lossless_dng_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_HASCURVE | + LIBRAW_DECODER_TRYRAWSPEED | LIBRAW_DECODER_TRYRAWSPEED3 | + LIBRAW_DECODER_ADOBECOPYPIXEL; + } + else if (load_raw == &LibRaw::packed_dng_load_raw) + { + d_info->decoder_name = "packed_dng_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_HASCURVE | + LIBRAW_DECODER_TRYRAWSPEED | LIBRAW_DECODER_TRYRAWSPEED3 | + LIBRAW_DECODER_ADOBECOPYPIXEL; + } + else if (load_raw == &LibRaw::pentax_load_raw) + { + d_info->decoder_name = "pentax_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_TRYRAWSPEED | LIBRAW_DECODER_TRYRAWSPEED3; + } + else if (load_raw == &LibRaw::nikon_load_raw) + { + d_info->decoder_name = "nikon_load_raw()"; + d_info->decoder_flags = + LIBRAW_DECODER_TRYRAWSPEED | LIBRAW_DECODER_HASCURVE | LIBRAW_DECODER_TRYRAWSPEED3; + } + else if (load_raw == &LibRaw::nikon_coolscan_load_raw) + { + d_info->decoder_name = "nikon_coolscan_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_FIXEDMAXC; + } + else if (load_raw == &LibRaw::nikon_he_load_raw_placeholder) + { + d_info->decoder_name = "nikon_he_load_raw_placeholder()"; + d_info->decoder_flags = LIBRAW_DECODER_UNSUPPORTED_FORMAT; + } + else if (load_raw == &LibRaw::nikon_load_sraw) + { + d_info->decoder_name = "nikon_load_sraw()"; + d_info->decoder_flags = LIBRAW_DECODER_HASCURVE | LIBRAW_DECODER_FIXEDMAXC; + } + else if (load_raw == &LibRaw::nikon_yuv_load_raw) + { + d_info->decoder_name = "nikon_load_yuv_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_HASCURVE | LIBRAW_DECODER_FIXEDMAXC; + } + else if (load_raw == &LibRaw::rollei_load_raw) + { + // UNTESTED + d_info->decoder_name = "rollei_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_FIXEDMAXC; + } + else if (load_raw == &LibRaw::phase_one_load_raw) + { + d_info->decoder_name = "phase_one_load_raw()"; + } + else if (load_raw == &LibRaw::phase_one_load_raw_c) + { + d_info->decoder_name = "phase_one_load_raw_c()"; + d_info->decoder_flags = imgdata.color.phase_one_data.format == 5 ? 0: LIBRAW_DECODER_TRYRAWSPEED3; /* Use only with patched RawSpeed3; */ + } + else if (load_raw == &LibRaw::phase_one_load_raw_s) + { + d_info->decoder_name = "phase_one_load_raw_s()"; + } + else if (load_raw == &LibRaw::hasselblad_load_raw) + { + d_info->decoder_name = "hasselblad_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_TRYRAWSPEED3; /* FIXME: need to make sure correction not applied*/ + } + else if (load_raw == &LibRaw::leaf_hdr_load_raw) + { + d_info->decoder_name = "leaf_hdr_load_raw()"; + } + else if (load_raw == &LibRaw::unpacked_load_raw) + { + d_info->decoder_name = "unpacked_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_FLATDATA; + } + else if (load_raw == &LibRaw::unpacked_load_raw_reversed) + { + d_info->decoder_name = "unpacked_load_raw_reversed()"; + d_info->decoder_flags = LIBRAW_DECODER_FIXEDMAXC; + } + else if (load_raw == &LibRaw::sinar_4shot_load_raw) + { + // UNTESTED + d_info->decoder_name = "sinar_4shot_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_SINAR4SHOT; + } + else if (load_raw == &LibRaw::imacon_full_load_raw) + { + d_info->decoder_name = "imacon_full_load_raw()"; + } + else if (load_raw == &LibRaw::hasselblad_full_load_raw) + { + d_info->decoder_name = "hasselblad_full_load_raw()"; + } + else if (load_raw == &LibRaw::packed_load_raw) + { + d_info->decoder_name = "packed_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_TRYRAWSPEED | LIBRAW_DECODER_TRYRAWSPEED3; + } + else if (load_raw == &LibRaw::broadcom_load_raw) + { + // UNTESTED + d_info->decoder_name = "broadcom_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_FIXEDMAXC; + } + else if (load_raw == &LibRaw::nokia_load_raw) + { + // UNTESTED + d_info->decoder_name = "nokia_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_FIXEDMAXC; + } + else if (load_raw == &LibRaw::panasonic_load_raw) + { + d_info->decoder_name = "panasonic_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_TRYRAWSPEED | LIBRAW_DECODER_TRYRAWSPEED; + } + else if (load_raw == &LibRaw::panasonicC6_load_raw) + { + d_info->decoder_name = "panasonicC6_load_raw()"; + /* FIXME: No rawspeed3: not sure it handles 12-bit data too */ + } + else if (load_raw == &LibRaw::panasonicC7_load_raw) + { + d_info->decoder_name = "panasonicC7_load_raw()"; + } + else if (load_raw == &LibRaw::panasonicC8_load_raw) + { + d_info->decoder_name = "panasonicC8_load_raw()"; + } + else if (load_raw == &LibRaw::olympus_load_raw) + { + d_info->decoder_name = "olympus_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_TRYRAWSPEED | LIBRAW_DECODER_TRYRAWSPEED3;; + } + else if (load_raw == &LibRaw::minolta_rd175_load_raw) + { + // UNTESTED + d_info->decoder_name = "minolta_rd175_load_raw()"; + } + else if (load_raw == &LibRaw::quicktake_100_load_raw) + { + // UNTESTED + d_info->decoder_name = "quicktake_100_load_raw()"; + } + else if (load_raw == &LibRaw::kodak_radc_load_raw) + { + d_info->decoder_name = "kodak_radc_load_raw()"; + } + else if (load_raw == &LibRaw::kodak_jpeg_load_raw) + { + // UNTESTED + RBAYER + d_info->decoder_name = "kodak_jpeg_load_raw()"; + } + else if (load_raw == &LibRaw::lossy_dng_load_raw) + { + // Check rbayer + d_info->decoder_name = "lossy_dng_load_raw()"; + d_info->decoder_flags = + LIBRAW_DECODER_TRYRAWSPEED | LIBRAW_DECODER_HASCURVE; + } + else if (load_raw == &LibRaw::kodak_dc120_load_raw) + { + d_info->decoder_name = "kodak_dc120_load_raw()"; + } + else if (load_raw == &LibRaw::eight_bit_load_raw) + { + d_info->decoder_name = "eight_bit_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_HASCURVE | LIBRAW_DECODER_FIXEDMAXC; + } + else if (load_raw == &LibRaw::kodak_c330_load_raw) + { + d_info->decoder_name = "kodak_yrgb_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_HASCURVE | LIBRAW_DECODER_FIXEDMAXC; + } + else if (load_raw == &LibRaw::kodak_c603_load_raw) + { + d_info->decoder_name = "kodak_yrgb_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_HASCURVE | LIBRAW_DECODER_FIXEDMAXC; + } + else if (load_raw == &LibRaw::kodak_262_load_raw) + { + d_info->decoder_name = "kodak_262_load_raw()"; // UNTESTED! + d_info->decoder_flags = LIBRAW_DECODER_HASCURVE | LIBRAW_DECODER_FIXEDMAXC; + } + else if (load_raw == &LibRaw::kodak_65000_load_raw) + { + d_info->decoder_name = "kodak_65000_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_HASCURVE; + } + else if (load_raw == &LibRaw::kodak_ycbcr_load_raw) + { + // UNTESTED + d_info->decoder_name = "kodak_ycbcr_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_HASCURVE | LIBRAW_DECODER_FIXEDMAXC; + } + else if (load_raw == &LibRaw::kodak_rgb_load_raw) + { + // UNTESTED + d_info->decoder_name = "kodak_rgb_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_FIXEDMAXC; + } + else if (load_raw == &LibRaw::sony_load_raw) + { + d_info->decoder_name = "sony_load_raw()"; + } + else if (load_raw == &LibRaw::sony_ljpeg_load_raw) + { + d_info->decoder_name = "sony_ljpeg_load_raw()"; + } + else if (load_raw == &LibRaw::sony_ycbcr_load_raw) + { + d_info->decoder_name = "sony_ycbcr_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_LEGACY_WITH_MARGINS; + + } + else if (load_raw == &LibRaw::sony_arw_load_raw) + { + d_info->decoder_name = "sony_arw_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_TRYRAWSPEED | LIBRAW_DECODER_TRYRAWSPEED3; + } + else if (load_raw == &LibRaw::sony_arw2_load_raw) + { + d_info->decoder_name = "sony_arw2_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_HASCURVE | + LIBRAW_DECODER_TRYRAWSPEED | LIBRAW_DECODER_TRYRAWSPEED3 | + LIBRAW_DECODER_SONYARW2; + } + else if (load_raw == &LibRaw::sony_arq_load_raw) + { + d_info->decoder_name = "sony_arq_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_LEGACY_WITH_MARGINS | LIBRAW_DECODER_FLATDATA | LIBRAW_DECODER_FLAT_BG2_SWAPPED; + } + else if (load_raw == &LibRaw::samsung_load_raw) + { + d_info->decoder_name = "samsung_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_TRYRAWSPEED | LIBRAW_DECODER_TRYRAWSPEED3; + } + else if (load_raw == &LibRaw::samsung2_load_raw) + { + d_info->decoder_name = "samsung2_load_raw()"; + } + else if (load_raw == &LibRaw::samsung3_load_raw) + { + d_info->decoder_name = "samsung3_load_raw()"; + } + else if (load_raw == &LibRaw::smal_v6_load_raw) + { + // UNTESTED + d_info->decoder_name = "smal_v6_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_FIXEDMAXC; + } + else if (load_raw == &LibRaw::smal_v9_load_raw) + { + // UNTESTED + d_info->decoder_name = "smal_v9_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_FIXEDMAXC; + } + else if (load_raw == &LibRaw::x3f_load_raw) + { + d_info->decoder_name = "x3f_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_OWNALLOC | LIBRAW_DECODER_FIXEDMAXC | + LIBRAW_DECODER_LEGACY_WITH_MARGINS; + } + else if (load_raw == &LibRaw::pentax_4shot_load_raw) + { + d_info->decoder_name = "pentax_4shot_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_OWNALLOC; + } + else if (load_raw == &LibRaw::deflate_dng_load_raw) + { + d_info->decoder_name = "deflate_dng_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_OWNALLOC; + } + else if (load_raw == &LibRaw::uncompressed_fp_dng_load_raw) + { + d_info->decoder_name = "uncompressed_fp_dng_load_raw()"; + d_info->decoder_flags = LIBRAW_DECODER_OWNALLOC; + } + else if (load_raw == &LibRaw::nikon_load_striped_packed_raw) + { + d_info->decoder_name = "nikon_load_striped_packed_raw()"; + } + else if (load_raw == &LibRaw::nikon_load_padded_packed_raw) + { + d_info->decoder_name = "nikon_load_padded_packed_raw()"; + } + else if (load_raw == &LibRaw::nikon_14bit_load_raw) + { + d_info->decoder_name = "nikon_14bit_load_raw()"; + } + /* -- added 07/02/18 -- */ + else if (load_raw == &LibRaw::unpacked_load_raw_fuji_f700s20) + { + d_info->decoder_name = "unpacked_load_raw_fuji_f700s20()"; + } + else if (load_raw == &LibRaw::unpacked_load_raw_FujiDBP) + { + d_info->decoder_name = "unpacked_load_raw_FujiDBP()"; + } +#ifdef USE_6BY9RPI + else if (load_raw == &LibRaw::rpi_load_raw8) + { + d_info->decoder_name = "rpi_load_raw8"; + } + else if (load_raw == &LibRaw::rpi_load_raw12) + { + d_info->decoder_name = "rpi_load_raw12"; + } + else if (load_raw == &LibRaw::rpi_load_raw14) + { + d_info->decoder_name = "rpi_load_raw14"; + } + else if (load_raw == &LibRaw::rpi_load_raw16) + { + d_info->decoder_name = "rpi_load_raw16"; + } +#endif + else + { + d_info->decoder_name = "Unknown unpack function"; + d_info->decoder_flags = LIBRAW_DECODER_NOTSET; + } + return LIBRAW_SUCCESS; +} diff --git a/rtengine/libraw/src/utils/init_close_utils.cpp b/rtengine/libraw/src/utils/init_close_utils.cpp new file mode 100644 index 000000000..fffab4de6 --- /dev/null +++ b/rtengine/libraw/src/utils/init_close_utils.cpp @@ -0,0 +1,335 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/libraw_cxx_defs.h" +#ifdef USE_RAWSPEED3 +#include "rawspeed3_capi.h" +#endif + +static void cleargps(libraw_gps_info_t *q) +{ + for (int i = 0; i < 3; i++) + q->latitude[i] = q->longitude[i] = q->gpstimestamp[i] = 0.f; + q->altitude = 0.f; + q->altref = q->latref = q->longref = q->gpsstatus = q->gpsparsed = 0; +} + +LibRaw::LibRaw(unsigned int flags) : memmgr(1024) +{ + double aber[4] = {1, 1, 1, 1}; + double gamm[6] = {0.45, 4.5, 0, 0, 0, 0}; + unsigned greybox[4] = {0, 0, UINT_MAX, UINT_MAX}; + unsigned cropbox[4] = {0, 0, UINT_MAX, UINT_MAX}; + ZERO(imgdata); + + cleargps(&imgdata.other.parsed_gps); + ZERO(libraw_internal_data); + ZERO(callbacks); + + _rawspeed_camerameta = _rawspeed_decoder = NULL; + _rawspeed3_handle = NULL; + dnghost = NULL; + dngnegative = NULL; + dngimage = NULL; + _x3f_data = NULL; + +#ifdef USE_RAWSPEED + _rawspeed_camerameta = make_camera_metadata(); +#endif + callbacks.data_cb = (flags & LIBRAW_OPTIONS_NO_DATAERR_CALLBACK) + ? NULL + : &default_data_callback; + callbacks.exif_cb = NULL; // no default callback + callbacks.pre_identify_cb = NULL; + callbacks.post_identify_cb = NULL; + callbacks.pre_subtractblack_cb = callbacks.pre_scalecolors_cb = + callbacks.pre_preinterpolate_cb = callbacks.pre_interpolate_cb = + callbacks.interpolate_bayer_cb = callbacks.interpolate_xtrans_cb = + callbacks.post_interpolate_cb = callbacks.pre_converttorgb_cb = + callbacks.post_converttorgb_cb = NULL; + + memmove(&imgdata.params.aber, &aber, sizeof(aber)); + memmove(&imgdata.params.gamm, &gamm, sizeof(gamm)); + memmove(&imgdata.params.greybox, &greybox, sizeof(greybox)); + memmove(&imgdata.params.cropbox, &cropbox, sizeof(cropbox)); + + imgdata.params.bright = 1; + imgdata.params.use_camera_matrix = 1; + imgdata.params.user_flip = -1; + imgdata.params.user_black = -1; + imgdata.params.user_cblack[0] = imgdata.params.user_cblack[1] = + imgdata.params.user_cblack[2] = imgdata.params.user_cblack[3] = -1000001; + imgdata.params.user_sat = -1; + imgdata.params.user_qual = -1; + imgdata.params.output_color = 1; + imgdata.params.output_bps = 8; + imgdata.params.use_fuji_rotate = 1; + imgdata.params.use_p1_correction = 1; + imgdata.params.exp_shift = 1.0; + imgdata.params.auto_bright_thr = LIBRAW_DEFAULT_AUTO_BRIGHTNESS_THRESHOLD; + imgdata.params.adjust_maximum_thr = LIBRAW_DEFAULT_ADJUST_MAXIMUM_THRESHOLD; + imgdata.rawparams.use_rawspeed = 1; + imgdata.rawparams.use_dngsdk = LIBRAW_DNG_DEFAULT; + imgdata.params.no_auto_scale = 0; + imgdata.params.no_interpolation = 0; + imgdata.rawparams.specials = 0; /* was inverted : LIBRAW_PROCESSING_DP2Q_INTERPOLATERG | LIBRAW_PROCESSING_DP2Q_INTERPOLATEAF; */ + imgdata.rawparams.options = LIBRAW_RAWOPTIONS_CONVERTFLOAT_TO_INT; + imgdata.rawparams.sony_arw2_posterization_thr = 0; + imgdata.rawparams.max_raw_memory_mb = LIBRAW_MAX_ALLOC_MB_DEFAULT; + imgdata.params.green_matching = 0; + imgdata.rawparams.custom_camera_strings = 0; + imgdata.rawparams.coolscan_nef_gamma = 1.0f; + imgdata.parent_class = this; + imgdata.progress_flags = 0; + imgdata.color.dng_levels.baseline_exposure = -999.f; + imgdata.color.dng_levels.LinearResponseLimit = 1.0f; + MN.hasselblad.nIFD_CM[0] = + MN.hasselblad.nIFD_CM[1] = -1; + MN.kodak.ISOCalibrationGain = 1.0f; + _exitflag = 0; + tls = new LibRaw_TLS; + tls->init(); +} + +LibRaw::~LibRaw() +{ + recycle(); + delete tls; +#ifdef USE_RAWSPEED3 + if (_rawspeed3_handle) + rawspeed3_close(_rawspeed3_handle); + _rawspeed3_handle = NULL; +#endif + +#ifdef USE_RAWSPEED + if (_rawspeed_camerameta) + { + clear_camera_metadata(_rawspeed_camerameta); + _rawspeed_camerameta = NULL; + } +#endif +} + +void x3f_clear(void *); + +void LibRaw::recycle() +{ + recycle_datastream(); +#define FREE(a) \ + do \ + { \ + if (a) \ + { \ + free(a); \ + a = NULL; \ + } \ + } while (0) + + FREE(imgdata.image); + + // explicit cleanup of afdata allocations; entire array is zeroed below + for (int i = 0; i < LIBRAW_AFDATA_MAXCOUNT; i++) + FREE(MN.common.afdata[i].AFInfoData); + + FREE(imgdata.thumbnail.thumb); + FREE(libraw_internal_data.internal_data.meta_data); + FREE(libraw_internal_data.output_data.histogram); + FREE(libraw_internal_data.output_data.oprof); + FREE(imgdata.color.profile); + FREE(imgdata.rawdata.ph1_cblack); + FREE(imgdata.rawdata.ph1_rblack); + FREE(imgdata.rawdata.raw_alloc); + FREE(imgdata.idata.xmpdata); + + parseCR3_Free(); + +#undef FREE + + ZERO(imgdata.sizes); + imgdata.sizes.raw_inset_crops[0].cleft = imgdata.sizes.raw_inset_crops[1].cleft = 0xffff; + imgdata.sizes.raw_inset_crops[0].ctop = imgdata.sizes.raw_inset_crops[1].ctop = 0xffff; + + ZERO(imgdata.idata); + ZERO(imgdata.color); + ZERO(imgdata.lens); + ZERO(imgdata.other); + ZERO(imgdata.rawdata); + ZERO(imgdata.shootinginfo); + ZERO(imgdata.thumbnail); + ZERO(imgdata.thumbs_list); + ZERO(MN); + cleargps(&imgdata.other.parsed_gps); + ZERO(libraw_internal_data); + + imgdata.lens.makernotes.FocalUnits = 1; + imgdata.lens.makernotes.LensID = LIBRAW_LENS_NOT_SET; + imgdata.shootinginfo.DriveMode = -1; + imgdata.shootinginfo.FocusMode = -1; + imgdata.shootinginfo.MeteringMode = -1; + imgdata.shootinginfo.AFPoint = -1; + imgdata.shootinginfo.ExposureMode = -1; + imgdata.shootinginfo.ExposureProgram = -1; + imgdata.shootinginfo.ImageStabilization = -1; + + imgdata.color.dng_levels.baseline_exposure = -999.f; + imgdata.color.dng_levels.LinearResponseLimit = 1.f; + imgdata.color.dng_color[0].illuminant = + imgdata.color.dng_color[1].illuminant = LIBRAW_WBI_None; + for (int i = 0; i < 4; i++) imgdata.color.dng_levels.analogbalance[i] = 1.0f; + + MN.canon.DefaultCropAbsolute.l = -1; + MN.canon.DefaultCropAbsolute.t = -1; + MN.canon.AutoLightingOptimizer = 3; // 'off' value + + MN.fuji.WB_Preset = 0xffff; + MN.fuji.ExpoMidPointShift = -999.f; + MN.fuji.DynamicRange = 0xffff; + MN.fuji.FilmMode = 0xffff; + MN.fuji.DynamicRangeSetting = 0xffff; + MN.fuji.DevelopmentDynamicRange = 0xffff; + MN.fuji.AutoDynamicRange = 0xffff; + MN.fuji.DRangePriority = 0xffff; + MN.fuji.FocusMode = 0xffff; + MN.fuji.AFMode = 0xffff; + MN.fuji.FocusPixel[0] = MN.fuji.FocusPixel[1] = 0xffff; + MN.fuji.FocusSettings = 0xffffffff; + MN.fuji.AF_C_Settings = 0xffffffff; + MN.fuji.FocusWarning = 0xffff; + for (int i = 0; i < 3; i++) MN.fuji.ImageStabilization[i] = 0xffff; + MN.fuji.DriveMode = -1; + MN.fuji.ImageCount = -1; + MN.fuji.AutoBracketing = -1; + MN.fuji.SequenceNumber = -1; + MN.fuji.SeriesLength = -1; + MN.fuji.PixelShiftOffset[0] = MN.fuji.PixelShiftOffset[1] = -999.f; + + MN.hasselblad.nIFD_CM[0] = MN.hasselblad.nIFD_CM[1] = -1; + + MN.kodak.BlackLevelTop = 0xffff; + MN.kodak.BlackLevelBottom = 0xffff; + MN.kodak.ISOCalibrationGain = 1.0f; + + MN.nikon.SensorHighSpeedCrop.cleft = 0xffff; + MN.nikon.SensorHighSpeedCrop.ctop = 0xffff; + + MN.olympus.FocusMode[0] = 0xffff; + MN.olympus.AutoFocus = 0xffff; + MN.olympus.AFPoint = 0xffff; + MN.olympus.AFResult = 0xffff; + MN.olympus.AFFineTune = 0xff; + for (int i = 0; i < 3; i++) { + MN.olympus.AFFineTuneAdj[i] = -32768; + MN.olympus.SpecialMode[i] = 0xffffffff; + } + MN.olympus.ZoomStepCount = 0xffff; + MN.olympus.FocusStepCount = 0xffff; + MN.olympus.FocusStepInfinity = 0xffff; + MN.olympus.FocusStepNear = 0xffff; + MN.olympus.FocusDistance = -999.0; + for (int i = 0; i < 4; i++) MN.olympus.AspectFrame[i] = 0xffff; + MN.olympus.StackedImage[0] = 0xffffffff; + + MN.panasonic.LensManufacturer = 0xffffffff; + + MN.pentax.FocusMode[0] = + MN.pentax.FocusMode[1] = 0xffff; + MN.pentax.AFPointSelected[1] = 0xffff; + MN.pentax.AFPointSelected_Area = 0xffff; + MN.pentax.AFPointsInFocus = 0xffffffff; + MN.pentax.AFPointMode = 0xff; + + MN.ricoh.AFStatus = 0xffff; + MN.ricoh.AFAreaMode = 0xffff; + MN.ricoh.WideAdapter = 0xffff; + MN.ricoh.CropMode = 0xffff; + MN.ricoh.NDFilter = 0xffff; + MN.ricoh.AutoBracketing = 0xffff; + MN.ricoh.MacroMode = 0xffff; + MN.ricoh.FlashMode = 0xffff; + MN.ricoh.FlashExposureComp = -999.0; + MN.ricoh.ManualFlashOutput = -999.0; + + MN.samsung.ColorSpace[0] = MN.samsung.ColorSpace[1] = -1; + + MN.sony.CameraType = LIBRAW_SONY_CameraType_UNKNOWN; + MN.sony.group2010 = 0; + MN.sony.real_iso_offset = 0xffff; + MN.sony.ImageCount3_offset = 0xffff; + MN.sony.MeteringMode_offset = 0xffff; + MN.sony.ExposureProgram_offset = 0xffff; + MN.sony.ReleaseMode2_offset = 0xffff; + MN.sony.ElectronicFrontCurtainShutter = 0xffffffff; + MN.sony.MinoltaCamID = 0xffffffff; + MN.sony.RAWFileType = 0xffff; + MN.sony.AFAreaModeSetting = 0xff; + MN.sony.AFAreaMode = 0xffff; + MN.sony.FlexibleSpotPosition[0] = + MN.sony.FlexibleSpotPosition[1] = 0xffff; + MN.sony.AFPointSelected = MN.sony.AFPointSelected_0x201e = 0xff; + MN.sony.AFTracking = 0xff; + MN.sony.FocusPosition = 0xffff; + MN.sony.LongExposureNoiseReduction = 0xffffffff; + MN.sony.Quality = 0xffffffff; + MN.sony.HighISONoiseReduction = 0xffff; + MN.sony.SonyRawFileType = 0xffff; + MN.sony.RawSizeType = 0xffff; + MN.sony.AFMicroAdjValue = 0x7f; + MN.sony.AFMicroAdjOn = -1; + MN.sony.AFMicroAdjRegisteredLenses = 0xff; + MN.sony.AspectRatio = -999.f; + + _exitflag = 0; +#ifdef USE_RAWSPEED + if (_rawspeed_decoder) + { + clear_rawspeed_decoder(_rawspeed_decoder); + } + _rawspeed_decoder = 0; +#endif +#ifdef USE_RAWSPEED3 + if (_rawspeed3_handle) + rawspeed3_release(_rawspeed3_handle); +#endif +#ifdef USE_DNGSDK + if (dngnegative) + { + dng_negative *ng = (dng_negative *)dngnegative; + delete ng; + dngnegative = 0; + } + if(dngimage) + { + dng_image *dimage = (dng_image*)dngimage; + delete dimage; + dngimage = 0; + } +#endif +#ifdef USE_X3FTOOLS + if (_x3f_data) + { + x3f_clear(_x3f_data); + _x3f_data = 0; + } +#endif + memmgr.cleanup(); + + imgdata.thumbnail.tformat = LIBRAW_THUMBNAIL_UNKNOWN; + libraw_internal_data.unpacker_data.thumb_format = LIBRAW_INTERNAL_THUMBNAIL_UNKNOWN; + imgdata.progress_flags = 0; + + load_raw = 0; + + tls->init(); +} diff --git a/rtengine/libraw/src/utils/open.cpp b/rtengine/libraw/src/utils/open.cpp new file mode 100644 index 000000000..a1c1917cf --- /dev/null +++ b/rtengine/libraw/src/utils/open.cpp @@ -0,0 +1,1328 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/libraw_cxx_defs.h" +#include "../../internal/libraw_cameraids.h" + +#ifndef LIBRAW_NO_IOSTREAMS_DATASTREAM +int LibRaw::open_file(const char *fname, INT64 max_buf_size) +{ + int big = 0; + if (max_buf_size == LIBRAW_OPEN_BIGFILE) + big = 1; + else if (max_buf_size == LIBRAW_OPEN_FILE) + big = 0; + else + { +#ifndef LIBRAW_WIN32_CALLS + struct stat st; + if (stat(fname, &st)) + return LIBRAW_IO_ERROR; + big = (st.st_size > max_buf_size) ? 1 : 0; +#else + struct _stati64 st; + if (_stati64(fname, &st)) + return LIBRAW_IO_ERROR; + big = (st.st_size > max_buf_size) ? 1 : 0; +#endif + } + + LibRaw_abstract_datastream *stream; + try + { + if (big) + stream = new LibRaw_bigfile_datastream(fname); + else + stream = new LibRaw_file_datastream(fname); + } + + catch (const std::bad_alloc& ) + { + recycle(); + return LIBRAW_UNSUFFICIENT_MEMORY; + } + if (!stream->valid()) + { + delete stream; + return LIBRAW_IO_ERROR; + } + ID.input_internal = 0; // preserve from deletion on error + int ret = open_datastream(stream); + if (ret == LIBRAW_SUCCESS) + { + ID.input_internal = 1; // flag to delete datastream on recycle + } + else + { + delete stream; + ID.input_internal = 0; + } + return ret; +} + +#if defined(WIN32) || defined(_WIN32) +#ifndef LIBRAW_WIN32_UNICODEPATHS +int LibRaw::open_file(const wchar_t *, INT64) +{ + return LIBRAW_NOT_IMPLEMENTED; +} +#else +int LibRaw::open_file(const wchar_t *fname, INT64 max_buf_size) +{ + int big = 0; + if (max_buf_size == LIBRAW_OPEN_BIGFILE) + big = 1; + else if (max_buf_size == LIBRAW_OPEN_FILE) + big = 0; + else + { + struct _stati64 st; + if (_wstati64(fname, &st)) + return LIBRAW_IO_ERROR; + big = (st.st_size > max_buf_size) ? 1 : 0; + } + + LibRaw_abstract_datastream *stream; + try + { + if (big) + stream = new LibRaw_bigfile_datastream(fname); + else + stream = new LibRaw_file_datastream(fname); + } + + catch (const std::bad_alloc&) + { + recycle(); + return LIBRAW_UNSUFFICIENT_MEMORY; + } + if (!stream->valid()) + { + delete stream; + return LIBRAW_IO_ERROR; + } + ID.input_internal = 0; // preserve from deletion on error + int ret = open_datastream(stream); + if (ret == LIBRAW_SUCCESS) + { + ID.input_internal = 1; // flag to delete datastream on recycle + } + else + { + delete stream; + ID.input_internal = 0; + } + return ret; +} +#endif +#endif + +#else /* LIBRAW_NO_IOSTREAMS_DATASTREAM*/ + +int LibRaw::libraw_openfile_tail(LibRaw_abstract_datastream *stream) +{ + if (!stream->valid()) + { + delete stream; + return LIBRAW_IO_ERROR; + } + ID.input_internal = 0; // preserve from deletion on error + int ret = open_datastream(stream); + if (ret == LIBRAW_SUCCESS) + { + ID.input_internal = 1; // flag to delete datastream on recycle + } + else + { + delete stream; + ID.input_internal = 0; + } + return ret; +} + +int LibRaw::open_file(const char *fname) +{ + LibRaw_abstract_datastream *stream; + try + { +#ifdef LIBRAW_WIN32_CALLS + stream = new LibRaw_bigfile_buffered_datastream(fname); +#else + stream = new LibRaw_bigfile_datastream(fname); +#endif + } + catch (const std::bad_alloc&) + { + recycle(); + return LIBRAW_UNSUFFICIENT_MEMORY; + } + if ((stream->size() > (INT64)LIBRAW_MAX_NONDNG_RAW_FILE_SIZE) && (stream->size() > (INT64)LIBRAW_MAX_DNG_RAW_FILE_SIZE)) + { + delete stream; + return LIBRAW_TOO_BIG; + } + return libraw_openfile_tail(stream); +} + +#if defined(WIN32) || defined(_WIN32) +#ifndef LIBRAW_WIN32_UNICODEPATHS +int LibRaw::open_file(const wchar_t *) +{ + return LIBRAW_NOT_IMPLEMENTED; +} +#else +int LibRaw::open_file(const wchar_t *fname) +{ + LibRaw_abstract_datastream *stream; + try + { +#ifdef LIBRAW_WIN32_CALLS + stream = new LibRaw_bigfile_buffered_datastream(fname); +#else + stream = new LibRaw_bigfile_datastream(fname); +#endif + } + catch (const std::bad_alloc&) + { + recycle(); + return LIBRAW_UNSUFFICIENT_MEMORY; + } + if ((stream->size() > (INT64)LIBRAW_MAX_DNG_RAW_FILE_SIZE) && (stream->size() > (INT64)LIBRAW_MAX_NONDNG_RAW_FILE_SIZE)) + { + delete stream; + return LIBRAW_TOO_BIG; + } + + return libraw_openfile_tail(stream); +} +#endif +#endif + +#endif + +int LibRaw::open_buffer(const void *buffer, size_t size) +{ + // this stream will close on recycle() + if (!buffer || buffer == (const void *)-1) + return LIBRAW_IO_ERROR; + + if ((size > (INT64)LIBRAW_MAX_DNG_RAW_FILE_SIZE) && (size > (INT64)LIBRAW_MAX_NONDNG_RAW_FILE_SIZE)) + return LIBRAW_TOO_BIG; + + LibRaw_buffer_datastream *stream; + try + { + stream = new LibRaw_buffer_datastream(buffer, size); + } + catch (const std::bad_alloc& ) + { + recycle(); + return LIBRAW_UNSUFFICIENT_MEMORY; + } + if (!stream->valid()) + { + delete stream; + return LIBRAW_IO_ERROR; + } + ID.input_internal = 0; // preserve from deletion on error + int ret = open_datastream(stream); + if (ret == LIBRAW_SUCCESS) + { + ID.input_internal = 1; // flag to delete datastream on recycle + } + else + { + delete stream; + ID.input_internal = 0; + } + return ret; +} + +int LibRaw::open_bayer(const unsigned char *buffer, unsigned datalen, + ushort _raw_width, ushort _raw_height, + ushort _left_margin, ushort _top_margin, + ushort _right_margin, ushort _bottom_margin, + unsigned char procflags, unsigned char bayer_pattern, + unsigned unused_bits, unsigned otherflags, + unsigned black_level) +{ + // this stream will close on recycle() + if (!buffer || buffer == (const void *)-1) + return LIBRAW_IO_ERROR; + + LibRaw_buffer_datastream *stream; + try + { + stream = new LibRaw_buffer_datastream(buffer, datalen); + } + catch (const std::bad_alloc& ) + { + recycle(); + return LIBRAW_UNSUFFICIENT_MEMORY; + } + if (!stream->valid()) + { + delete stream; + return LIBRAW_IO_ERROR; + } + ID.input = stream; + SET_PROC_FLAG(LIBRAW_PROGRESS_OPEN); + // From identify + initdata(); + strcpy(imgdata.idata.make, "BayerDump"); + snprintf(imgdata.idata.model, sizeof(imgdata.idata.model) - 1, + "%u x %u pixels", _raw_width, _raw_height); + S.flip = procflags >> 2; + libraw_internal_data.internal_output_params.zero_is_bad = procflags & 2; + libraw_internal_data.unpacker_data.data_offset = 0; + S.raw_width = _raw_width; + S.raw_height = _raw_height; + S.left_margin = _left_margin; + S.top_margin = _top_margin; + S.width = S.raw_width - S.left_margin - _right_margin; + S.height = S.raw_height - S.top_margin - _bottom_margin; + + imgdata.idata.filters = 0x1010101 * bayer_pattern; + imgdata.idata.colors = + 4 - !((imgdata.idata.filters & imgdata.idata.filters >> 1) & 0x5555); + libraw_internal_data.unpacker_data.load_flags = otherflags; + switch (libraw_internal_data.unpacker_data.tiff_bps = + (datalen)*8 / (S.raw_width * S.raw_height)) + { + case 8: + load_raw = &LibRaw::eight_bit_load_raw; + break; + case 10: + if ((datalen) / S.raw_height * 3u >= S.raw_width * 4u) + { + load_raw = &LibRaw::android_loose_load_raw; + break; + } + else if (libraw_internal_data.unpacker_data.load_flags & 1) + { + load_raw = &LibRaw::android_tight_load_raw; + break; + } + case 12: + libraw_internal_data.unpacker_data.load_flags |= 128; + load_raw = &LibRaw::packed_load_raw; + break; + case 16: + libraw_internal_data.unpacker_data.order = + 0x4949 | 0x404 * (libraw_internal_data.unpacker_data.load_flags & 1); + libraw_internal_data.unpacker_data.tiff_bps -= + libraw_internal_data.unpacker_data.load_flags >> 4; + libraw_internal_data.unpacker_data.tiff_bps -= + libraw_internal_data.unpacker_data.load_flags = + libraw_internal_data.unpacker_data.load_flags >> 1 & 7; + load_raw = &LibRaw::unpacked_load_raw; + } + C.maximum = + (1 << libraw_internal_data.unpacker_data.tiff_bps) - (1 << unused_bits); + C.black = black_level; + S.iwidth = S.width; + S.iheight = S.height; + imgdata.idata.colors = 3; + imgdata.idata.filters |= ((imgdata.idata.filters >> 2 & 0x22222222) | + (imgdata.idata.filters << 2 & 0x88888888)) & + imgdata.idata.filters << 1; + + imgdata.idata.raw_count = 1; + for (int i = 0; i < 4; i++) + imgdata.color.pre_mul[i] = 1.0; + + strcpy(imgdata.idata.cdesc, "RGBG"); + + ID.input_internal = 1; + SET_PROC_FLAG(LIBRAW_PROGRESS_IDENTIFY); + return LIBRAW_SUCCESS; +} + +struct foveon_data_t +{ + const char *make; + const char *model; + const int raw_width, raw_height; + const int white; + const int left_margin, top_margin; + const int width, height; +} foveon_data[] = { + {"Sigma", "SD9", 2304, 1531, 12000, 20, 8, 2266, 1510}, + {"Sigma", "SD9", 1152, 763, 12000, 10, 2, 1132, 755}, + {"Sigma", "SD10", 2304, 1531, 12000, 20, 8, 2266, 1510}, + {"Sigma", "SD10", 1152, 763, 12000, 10, 2, 1132, 755}, + {"Sigma", "SD14", 2688, 1792, 14000, 18, 12, 2651, 1767}, + {"Sigma", "SD14", 2688, 896, 14000, 18, 6, 2651, 883}, // 2/3 + {"Sigma", "SD14", 1344, 896, 14000, 9, 6, 1326, 883}, // 1/2 + {"Sigma", "SD15", 2688, 1792, 2900, 18, 12, 2651, 1767}, + {"Sigma", "SD15", 2688, 896, 2900, 18, 6, 2651, 883}, // 2/3 ? + {"Sigma", "SD15", 1344, 896, 2900, 9, 6, 1326, 883}, // 1/2 ? + {"Sigma", "DP1", 2688, 1792, 2100, 18, 12, 2651, 1767}, + {"Sigma", "DP1", 2688, 896, 2100, 18, 6, 2651, 883}, // 2/3 ? + {"Sigma", "DP1", 1344, 896, 2100, 9, 6, 1326, 883}, // 1/2 ? + {"Sigma", "DP1S", 2688, 1792, 2200, 18, 12, 2651, 1767}, + {"Sigma", "DP1S", 2688, 896, 2200, 18, 6, 2651, 883}, // 2/3 + {"Sigma", "DP1S", 1344, 896, 2200, 9, 6, 1326, 883}, // 1/2 + {"Sigma", "DP1X", 2688, 1792, 3560, 18, 12, 2651, 1767}, + {"Sigma", "DP1X", 2688, 896, 3560, 18, 6, 2651, 883}, // 2/3 + {"Sigma", "DP1X", 1344, 896, 3560, 9, 6, 1326, 883}, // 1/2 + {"Sigma", "DP2", 2688, 1792, 2326, 13, 16, 2651, 1767}, + {"Sigma", "DP2", 2688, 896, 2326, 13, 8, 2651, 883}, // 2/3 ?? + {"Sigma", "DP2", 1344, 896, 2326, 7, 8, 1325, 883}, // 1/2 ?? + {"Sigma", "DP2S", 2688, 1792, 2300, 18, 12, 2651, 1767}, + {"Sigma", "DP2S", 2688, 896, 2300, 18, 6, 2651, 883}, // 2/3 + {"Sigma", "DP2S", 1344, 896, 2300, 9, 6, 1326, 883}, // 1/2 + {"Sigma", "DP2X", 2688, 1792, 2300, 18, 12, 2651, 1767}, + {"Sigma", "DP2X", 2688, 896, 2300, 18, 6, 2651, 883}, // 2/3 + {"Sigma", "DP2X", 1344, 896, 2300, 9, 6, 1325, 883}, // 1/2 + {"Sigma", "SD1", 4928, 3264, 3900, 12, 52, 4807, 3205}, // Full size + {"Sigma", "SD1", 4928, 1632, 3900, 12, 26, 4807, 1603}, // 2/3 size + {"Sigma", "SD1", 2464, 1632, 3900, 6, 26, 2403, 1603}, // 1/2 size + {"Sigma", "SD1 Merrill", 4928, 3264, 3900, 12, 52, 4807, 3205}, // Full size + {"Sigma", "SD1 Merrill", 4928, 1632, 3900, 12, 26, 4807, 1603}, // 2/3 size + {"Sigma", "SD1 Merrill", 2464, 1632, 3900, 6, 26, 2403, 1603}, // 1/2 size + {"Sigma", "DP1 Merrill", 4928, 3264, 3900, 12, 0, 4807, 3205}, + {"Sigma", "DP1 Merrill", 2464, 1632, 3900, 12, 0, 2403, 1603}, // 1/2 size + {"Sigma", "DP1 Merrill", 4928, 1632, 3900, 12, 0, 4807, 1603}, // 2/3 size + {"Sigma", "DP2 Merrill", 4928, 3264, 3900, 12, 0, 4807, 3205}, + {"Sigma", "DP2 Merrill", 2464, 1632, 3900, 12, 0, 2403, 1603}, // 1/2 size + {"Sigma", "DP2 Merrill", 4928, 1632, 3900, 12, 0, 4807, 1603}, // 2/3 size + {"Sigma", "DP3 Merrill", 4928, 3264, 3900, 12, 0, 4807, 3205}, + {"Sigma", "DP3 Merrill", 2464, 1632, 3900, 12, 0, 2403, 1603}, // 1/2 size + {"Sigma", "DP3 Merrill", 4928, 1632, 3900, 12, 0, 4807, 1603}, // 2/3 size + {"Polaroid", "x530", 1440, 1088, 2700, 10, 13, 1419, 1059}, + // dp2 Q + {"Sigma", "dp3 Quattro", 5888, 3776, 16383, 204, 76, 5446, + 3624}, // full size, new fw ?? + {"Sigma", "dp3 Quattro", 5888, 3672, 16383, 204, 24, 5446, + 3624}, // full size + {"Sigma", "dp3 Quattro", 2944, 1836, 16383, 102, 12, 2723, + 1812}, // half size + {"Sigma", "dp3 Quattro", 2944, 1888, 16383, 102, 38, 2723, + 1812}, // half size, new fw?? + + {"Sigma", "dp2 Quattro", 5888, 3776, 16383, 204, 76, 5446, + 3624}, // full size, new fw + {"Sigma", "dp2 Quattro", 5888, 3672, 16383, 204, 24, 5446, + 3624}, // full size + {"Sigma", "dp2 Quattro", 2944, 1836, 16383, 102, 12, 2723, + 1812}, // half size + {"Sigma", "dp2 Quattro", 2944, 1888, 16383, 102, 38, 2723, + 1812}, // half size, new fw + + {"Sigma", "dp1 Quattro", 5888, 3776, 16383, 204, 76, 5446, + 3624}, // full size, new fw?? + {"Sigma", "dp1 Quattro", 5888, 3672, 16383, 204, 24, 5446, + 3624}, // full size + {"Sigma", "dp1 Quattro", 2944, 1836, 16383, 102, 12, 2723, + 1812}, // half size + {"Sigma", "dp1 Quattro", 2944, 1888, 16383, 102, 38, 2723, + 1812}, // half size, new fw + + {"Sigma", "dp0 Quattro", 5888, 3776, 16383, 204, 76, 5446, + 3624}, // full size, new fw?? + {"Sigma", "dp0 Quattro", 5888, 3672, 16383, 204, 24, 5446, + 3624}, // full size + {"Sigma", "dp0 Quattro", 2944, 1836, 16383, 102, 12, 2723, + 1812}, // half size + {"Sigma", "dp0 Quattro", 2944, 1888, 16383, 102, 38, 2723, + 1812}, // half size, new fw + // Sigma sd Quattro + {"Sigma", "sd Quattro", 5888, 3776, 16383, 204, 76, 5446, + 3624}, // full size + {"Sigma", "sd Quattro", 2944, 1888, 16383, 102, 38, 2723, + 1812}, // half size + // Sd Quattro H + {"Sigma", "sd Quattro H", 6656, 4480, 4000, 224, 160, 6208, + 4160}, // full size + {"Sigma", "sd Quattro H", 3328, 2240, 4000, 112, 80, 3104, + 2080}, // half size + {"Sigma", "sd Quattro H", 5504, 3680, 4000, 0, 4, 5496, 3668}, // full size + {"Sigma", "sd Quattro H", 2752, 1840, 4000, 0, 2, 2748, 1834}, // half size +}; +const int foveon_count = sizeof(foveon_data) / sizeof(foveon_data[0]); + +int LibRaw::open_datastream(LibRaw_abstract_datastream *stream) +{ + + if (!stream) + return ENOENT; + if (!stream->valid()) + return LIBRAW_IO_ERROR; + if ((stream->size() > (INT64)LIBRAW_MAX_DNG_RAW_FILE_SIZE) && (stream->size() > (INT64)LIBRAW_MAX_NONDNG_RAW_FILE_SIZE)) + return LIBRAW_TOO_BIG; + + recycle(); + if (callbacks.pre_identify_cb) + { + int r = (callbacks.pre_identify_cb)(this); + if (r == 1) + goto final; + } + + try + { + ID.input = stream; + SET_PROC_FLAG(LIBRAW_PROGRESS_OPEN); + + identify(); + + // Fuji layout files: either DNG or unpacked_load_raw should be used + if (libraw_internal_data.internal_output_params.fuji_width || libraw_internal_data.unpacker_data.fuji_layout) + { + if (!imgdata.idata.dng_version && load_raw != &LibRaw::unpacked_load_raw + && load_raw != &LibRaw::unpacked_load_raw_FujiDBP + && load_raw != &LibRaw::unpacked_load_raw_fuji_f700s20 + ) + return LIBRAW_FILE_UNSUPPORTED; + } + // Remove unsupported Nikon thumbnails + if (makeIs(LIBRAW_CAMERAMAKER_Nikon) && !strncasecmp(imgdata.idata.model, "Z 8",3) && + imgdata.thumbs_list.thumbcount > 1) + { + int tgtidx = 0; + for (int idx = 0; idx < imgdata.thumbs_list.thumbcount && idx < LIBRAW_THUMBNAIL_MAXCOUNT; idx++) + { + int bps = imgdata.thumbs_list.thumblist[idx].tmisc & 0x1f; + if (bps > 8) // remove high-bit thumbs + { + // nothing: just skip this item + } + else + { + if (tgtidx < idx) + { + memmove(&imgdata.thumbs_list.thumblist[tgtidx], &imgdata.thumbs_list.thumblist[idx], + sizeof(imgdata.thumbs_list.thumblist[idx])); + tgtidx++; + } + else // same index, just assign next tgtidx + tgtidx = idx + 1; + } + } + if (tgtidx > 0 && tgtidx < imgdata.thumbs_list.thumbcount) + { + int selidx = 0; + INT64 maximgbits = INT64(imgdata.thumbs_list.thumblist[0].twidth) * + INT64(imgdata.thumbs_list.thumblist[0].theight) * INT64(imgdata.thumbs_list.thumblist[0].tmisc & 0x1f); + for (int i = 1; i < tgtidx; i++) + { + INT64 imgbits = INT64(imgdata.thumbs_list.thumblist[i].twidth) * + INT64(imgdata.thumbs_list.thumblist[i].theight) * + INT64(imgdata.thumbs_list.thumblist[i].tmisc & 0x1f); + if (imgbits > maximgbits) + { + selidx = i; + maximgbits = imgbits; + } + } + libraw_internal_data.internal_data.toffset = imgdata.thumbs_list.thumblist[selidx].toffset; + imgdata.thumbnail.tlength = imgdata.thumbs_list.thumblist[selidx].tlength; + libraw_internal_data.unpacker_data.thumb_format = imgdata.thumbs_list.thumblist[selidx].tformat; + imgdata.thumbnail.twidth = imgdata.thumbs_list.thumblist[selidx].twidth; + imgdata.thumbnail.theight = imgdata.thumbs_list.thumblist[selidx].theight; + libraw_internal_data.unpacker_data.thumb_misc = imgdata.thumbs_list.thumblist[selidx].tmisc; + // find another largest thumb and copy it to single thumbnail data + } + imgdata.thumbs_list.thumbcount = tgtidx > 0 ? tgtidx : 1; + } + + // promote the old single thumbnail to the thumbs_list if not present already + if (imgdata.thumbs_list.thumbcount < LIBRAW_THUMBNAIL_MAXCOUNT) + { + bool already = false; + if(imgdata.thumbnail.tlength || libraw_internal_data.internal_data.toffset) + for(int i = 0; i < imgdata.thumbs_list.thumbcount; i++) + if (imgdata.thumbs_list.thumblist[i].toffset == libraw_internal_data.internal_data.toffset + && imgdata.thumbs_list.thumblist[i].tlength == imgdata.thumbnail.tlength) + { + already = true; + break; + } + if (!already) + { + int idx = imgdata.thumbs_list.thumbcount; + imgdata.thumbs_list.thumblist[idx].toffset = libraw_internal_data.internal_data.toffset; + imgdata.thumbs_list.thumblist[idx].tlength = imgdata.thumbnail.tlength; + imgdata.thumbs_list.thumblist[idx].tflip = 0xffff; + imgdata.thumbs_list.thumblist[idx].tformat = libraw_internal_data.unpacker_data.thumb_format; + imgdata.thumbs_list.thumblist[idx].tmisc = libraw_internal_data.unpacker_data.thumb_misc; + // promote if set + imgdata.thumbs_list.thumblist[idx].twidth = imgdata.thumbnail.twidth; + imgdata.thumbs_list.thumblist[idx].theight = imgdata.thumbnail.theight; + imgdata.thumbs_list.thumbcount++; + } + } + + + imgdata.lens.Lens[sizeof(imgdata.lens.Lens) - 1] = 0; // make sure lens is 0-terminated + + if (callbacks.post_identify_cb) + (callbacks.post_identify_cb)(this); + +#define isRIC imgdata.sizes.raw_inset_crops[0] + + if (!imgdata.idata.dng_version && makeIs(LIBRAW_CAMERAMAKER_Fujifilm) + && (!strcmp(imgdata.idata.normalized_model, "S3Pro") + || !strcmp(imgdata.idata.normalized_model, "S5Pro") + || !strcmp(imgdata.idata.normalized_model, "S2Pro"))) + { + isRIC.cleft = isRIC.ctop = 0xffff; + isRIC.cwidth = isRIC.cheight = 0; + } + // Wipe out canon incorrect in-camera crop + if (!imgdata.idata.dng_version && makeIs(LIBRAW_CAMERAMAKER_Canon) + && isRIC.cleft == 0 && isRIC.ctop == 0 // non symmetric! + && isRIC.cwidth < (imgdata.sizes.raw_width * 4 / 5)) // less than 80% of sensor width + { + isRIC.cleft = isRIC.ctop = 0xffff; + isRIC.cwidth = isRIC.cheight = 0; + } + + // Wipe out non-standard WB + if (!imgdata.idata.dng_version && + (makeIs(LIBRAW_CAMERAMAKER_Sony) && !strcmp(imgdata.idata.normalized_model, "DSC-F828")) + && !(imgdata.rawparams.options & LIBRAW_RAWOPTIONS_PROVIDE_NONSTANDARD_WB)) + { + for (int i = 0; i < 4; i++) imgdata.color.cam_mul[i] = (i == 1); + memset(imgdata.color.WB_Coeffs, 0, sizeof(imgdata.color.WB_Coeffs)); + memset(imgdata.color.WBCT_Coeffs, 0, sizeof(imgdata.color.WBCT_Coeffs)); + } + + if (load_raw == &LibRaw::nikon_load_raw) + nikon_read_curve(); + + if (load_raw == &LibRaw::lossless_jpeg_load_raw && + MN.canon.RecordMode && makeIs(LIBRAW_CAMERAMAKER_Kodak) && + /* Not normalized models here, it is intentional */ + (!strncasecmp(imgdata.idata.model, "EOS D2000", 9) || // if we want something different for B&W cameras, + !strncasecmp(imgdata.idata.model, "EOS D6000", 9))) // it's better to compare with CamIDs + { + imgdata.color.black = 0; + imgdata.color.maximum = 4501; + memset(imgdata.color.cblack, 0, sizeof(imgdata.color.cblack)); + memset(imgdata.sizes.mask, 0, sizeof(imgdata.sizes.mask)); + imgdata.sizes.mask[0][3] = 1; // to skip mask re-calc + libraw_internal_data.unpacker_data.load_flags |= 512; + } + + if (load_raw == &LibRaw::panasonic_load_raw) + { + if (libraw_internal_data.unpacker_data.pana_encoding == 6 || + libraw_internal_data.unpacker_data.pana_encoding == 7 || + libraw_internal_data.unpacker_data.pana_encoding == 8) + { + for (int i = 0; i < 3; i++) + imgdata.color.cblack[i] = + libraw_internal_data.internal_data.pana_black[i]; + imgdata.color.cblack[3] = imgdata.color.cblack[1]; + imgdata.color.cblack[4] = imgdata.color.cblack[5] = 0; + imgdata.color.black = 0; + imgdata.color.maximum = + MAX(imgdata.color.linear_max[0], + MAX(imgdata.color.linear_max[1], imgdata.color.linear_max[2])); + } + + if (libraw_internal_data.unpacker_data.pana_encoding == 6) + { + int rowbytes11 = imgdata.sizes.raw_width / 11 * 16; + int rowbytes14 = imgdata.sizes.raw_width / 14 * 16; + INT64 ds = INT64(libraw_internal_data.unpacker_data.data_size); + if (!ds) + ds = libraw_internal_data.internal_data.input->size() - libraw_internal_data.unpacker_data.data_offset; + if ((imgdata.sizes.raw_width % 11) == 0 && + (INT64(imgdata.sizes.raw_height) * rowbytes11 == ds)) + load_raw = &LibRaw::panasonicC6_load_raw; + else if ((imgdata.sizes.raw_width % 14) == 0 && + (INT64(imgdata.sizes.raw_height) * rowbytes14 == ds)) + load_raw = &LibRaw::panasonicC6_load_raw; + else + imgdata.idata.raw_count = 0; // incorrect size + } + else if (libraw_internal_data.unpacker_data.pana_encoding == 7) + { + int pixperblock = + libraw_internal_data.unpacker_data.pana_bpp == 14 ? 9 : 10; + int rowbytes = imgdata.sizes.raw_width / pixperblock * 16; + if ((imgdata.sizes.raw_width % pixperblock) == 0 && + (INT64(imgdata.sizes.raw_height) * rowbytes == + INT64(libraw_internal_data.unpacker_data.data_size))) + load_raw = &LibRaw::panasonicC7_load_raw; + else + imgdata.idata.raw_count = 0; // incorrect size + } + else if (libraw_internal_data.unpacker_data.pana_encoding == 8) + { + if (libraw_internal_data.unpacker_data.pana8.stripe_count > 0) + load_raw = &LibRaw::panasonicC8_load_raw; + else + imgdata.idata.raw_count = 0; // incorrect stripes count + } + } + +#define NIKON_14BIT_SIZE(rw, rh) \ + (((unsigned)(ceilf((float)(rw * 7 / 4) / 16.0)) * 16) * rh) + + // Ugly hack, replace with proper data/line size for different + // cameras/format when available + if (makeIs(LIBRAW_CAMERAMAKER_Nikon) + && (!strncasecmp(imgdata.idata.model, "Z", 1) || !strcasecmp(imgdata.idata.model,"D6")) + && NIKON_14BIT_SIZE(imgdata.sizes.raw_width, imgdata.sizes.raw_height) == + libraw_internal_data.unpacker_data.data_size) + { + load_raw = &LibRaw::nikon_14bit_load_raw; + } +#undef NIKON_14BIT_SIZE + + // Linear max from 14-bit camera, but on 12-bit data? + if (makeIs(LIBRAW_CAMERAMAKER_Sony) && + imgdata.color.maximum > 0 && + imgdata.color.linear_max[0] > (long)imgdata.color.maximum && + imgdata.color.linear_max[0] <= (long)imgdata.color.maximum * 4) + for (int c = 0; c < 4; c++) + imgdata.color.linear_max[c] /= 4; + + if (makeIs(LIBRAW_CAMERAMAKER_Canon)) + { + if (MN.canon.DefaultCropAbsolute.l != -1) // tag 0x00e0 SensorInfo was parsed + { + if (imgdata.sizes.raw_aspect != LIBRAW_IMAGE_ASPECT_UNKNOWN) + { // tag 0x009a AspectInfo was parsed + isRIC.cleft += MN.canon.DefaultCropAbsolute.l; + isRIC.ctop += MN.canon.DefaultCropAbsolute.t; + } + else + { + isRIC.cleft = MN.canon.DefaultCropAbsolute.l; + isRIC.ctop = MN.canon.DefaultCropAbsolute.t; + isRIC.cwidth = MN.canon.DefaultCropAbsolute.r - MN.canon.DefaultCropAbsolute.l + 1; + isRIC.cheight = MN.canon.DefaultCropAbsolute.b - MN.canon.DefaultCropAbsolute.t + 1; + } + } + else + { + if (imgdata.sizes.raw_aspect != LIBRAW_IMAGE_ASPECT_UNKNOWN) + { + } + else + { // Canon PowerShot S2 IS + } + } +#undef isRIC + if (imgdata.color.raw_bps < 14 && !imgdata.idata.dng_version && load_raw != &LibRaw::canon_sraw_load_raw) + { + int xmax = (1 << imgdata.color.raw_bps) - 1; + if (MN.canon.SpecularWhiteLevel > xmax) // Adjust 14-bit metadata to real bps + { + int div = 1 << (14 - imgdata.color.raw_bps); + for (int c = 0; c < 4; c++) imgdata.color.linear_max[c] /= div; + for (int c = 0; c < 4; c++) MN.canon.ChannelBlackLevel[c] /= div; + MN.canon.AverageBlackLevel /= div; + MN.canon.SpecularWhiteLevel /= div; + MN.canon.NormalWhiteLevel /= div; + } + } + } + + if (makeIs(LIBRAW_CAMERAMAKER_Canon) && + (load_raw == &LibRaw::canon_sraw_load_raw) && + imgdata.sizes.raw_width > 0) + { + float ratio = + float(imgdata.sizes.raw_height) / float(imgdata.sizes.raw_width); + if ((ratio < 0.57 || ratio > 0.75) && + MN.canon.SensorHeight > 1 && + MN.canon.SensorWidth > 1) + { + imgdata.sizes.raw_width = MN.canon.SensorWidth; + imgdata.sizes.left_margin = MN.canon.DefaultCropAbsolute.l; + imgdata.sizes.iwidth = imgdata.sizes.width = + MN.canon.DefaultCropAbsolute.r - MN.canon.DefaultCropAbsolute.l + 1; + imgdata.sizes.raw_height = MN.canon.SensorHeight; + imgdata.sizes.top_margin = MN.canon.DefaultCropAbsolute.t; + imgdata.sizes.iheight = imgdata.sizes.height = + MN.canon.DefaultCropAbsolute.b - MN.canon.DefaultCropAbsolute.t + 1; + libraw_internal_data.unpacker_data.load_flags |= + 256; // reset width/height in canon_sraw_load_raw() + imgdata.sizes.raw_pitch = 8 * imgdata.sizes.raw_width; + } + else if (imgdata.sizes.raw_width == 4032 && + imgdata.sizes.raw_height == 3402 && + !strcasecmp(imgdata.idata.model, "EOS 80D")) // 80D hardcoded + { + imgdata.sizes.raw_width = 4536; + imgdata.sizes.left_margin = 28; + imgdata.sizes.iwidth = imgdata.sizes.width = + imgdata.sizes.raw_width - imgdata.sizes.left_margin; + imgdata.sizes.raw_height = 3024; + imgdata.sizes.top_margin = 8; + imgdata.sizes.iheight = imgdata.sizes.height = + imgdata.sizes.raw_height - imgdata.sizes.top_margin; + libraw_internal_data.unpacker_data.load_flags |= 256; + imgdata.sizes.raw_pitch = 8 * imgdata.sizes.raw_width; + } + } + +#ifdef USE_DNGSDK + if (imgdata.idata.dng_version + &&libraw_internal_data.unpacker_data.tiff_compress == 34892 + && libraw_internal_data.unpacker_data.tiff_bps == 8 + && libraw_internal_data.unpacker_data.tiff_samples == 3 + && load_raw == &LibRaw::lossy_dng_load_raw) + { + // Data should be linearized by DNG SDK + C.black = 0; + memset(C.cblack, 0, sizeof(C.cblack)); + } +#endif + + // XTrans Compressed? + if (!imgdata.idata.dng_version && + makeIs(LIBRAW_CAMERAMAKER_Fujifilm) && + (load_raw == &LibRaw::unpacked_load_raw)) + { + if (imgdata.sizes.raw_width * (imgdata.sizes.raw_height * 2ul) != + libraw_internal_data.unpacker_data.data_size) + { + if ((imgdata.sizes.raw_width * (imgdata.sizes.raw_height * 7ul)) / 4 == + libraw_internal_data.unpacker_data.data_size) + load_raw = &LibRaw::fuji_14bit_load_raw; + else + parse_fuji_compressed_header(); + } + else if (!strcmp(imgdata.idata.normalized_model, "X-H2S") + && libraw_internal_data.internal_data.input->size() + < (libraw_internal_data.unpacker_data.data_size + libraw_internal_data.unpacker_data.data_offset)) + { + parse_fuji_compressed_header(); // try to use compressed header: X-H2S may record wrong data size + } + } + // set raw_inset_crops[1] via raw_aspect + if (imgdata.sizes.raw_aspect >= LIBRAW_IMAGE_ASPECT_MINIMAL_REAL_ASPECT_VALUE + && imgdata.sizes.raw_aspect <= LIBRAW_IMAGE_ASPECT_MAXIMAL_REAL_ASPECT_VALUE + /* crops[0] is valid*/ + && (imgdata.sizes.raw_inset_crops[0].cleft < 0xffff) + && (imgdata.sizes.raw_inset_crops[0].cleft + imgdata.sizes.raw_inset_crops[0].cwidth <= imgdata.sizes.raw_width) + && (imgdata.sizes.raw_inset_crops[0].ctop < 0xffff) + && (imgdata.sizes.raw_inset_crops[0].ctop + imgdata.sizes.raw_inset_crops[0].cheight <= imgdata.sizes.raw_height) + && imgdata.sizes.raw_inset_crops[0].cwidth > 0 && imgdata.sizes.raw_inset_crops[0].cheight >0 + /* crops[1] is not set*/ + && (imgdata.sizes.raw_inset_crops[1].cleft == 0xffff) + && (imgdata.sizes.raw_inset_crops[1].ctop == 0xffff) + ) + { + float c0_ratio = float(imgdata.sizes.raw_inset_crops[0].cwidth) / float(imgdata.sizes.raw_inset_crops[0].cheight); + float c1_ratio = float(imgdata.sizes.raw_aspect) / 1000.f; + if (c0_ratio / c1_ratio < 0.98 || c0_ratio / c1_ratio > 1.02) // set crops[1] + { + if (c1_ratio > c0_ratio) // requested image is wider, cut from top/bottom + { + int newheight = int(imgdata.sizes.raw_inset_crops[0].cwidth / c1_ratio); + int dtop = (imgdata.sizes.raw_inset_crops[0].cheight - newheight) / 2; + imgdata.sizes.raw_inset_crops[1].ctop = imgdata.sizes.raw_inset_crops[0].ctop + dtop; + imgdata.sizes.raw_inset_crops[1].cheight = newheight; + imgdata.sizes.raw_inset_crops[1].cleft = imgdata.sizes.raw_inset_crops[0].cleft; + imgdata.sizes.raw_inset_crops[1].cwidth = imgdata.sizes.raw_inset_crops[0].cwidth; + } + else + { + int newwidth = int(imgdata.sizes.raw_inset_crops[0].cheight * c1_ratio); + int dleft = (imgdata.sizes.raw_inset_crops[0].cwidth - newwidth) / 2; + imgdata.sizes.raw_inset_crops[1].cleft = imgdata.sizes.raw_inset_crops[0].cleft + dleft; + imgdata.sizes.raw_inset_crops[1].cwidth = newwidth; + imgdata.sizes.raw_inset_crops[1].ctop = imgdata.sizes.raw_inset_crops[0].ctop; + imgdata.sizes.raw_inset_crops[1].cheight = imgdata.sizes.raw_inset_crops[0].cheight; + } + } + } + + int adjust_margins = 0; + if (makeIs(LIBRAW_CAMERAMAKER_Fujifilm) && (imgdata.idata.filters == 9)) + { + // Adjust top/left margins for X-Trans + int newtm = imgdata.sizes.top_margin % 6 + ? (imgdata.sizes.top_margin / 6 + 1) * 6 + : imgdata.sizes.top_margin; + int newlm = imgdata.sizes.left_margin % 6 + ? (imgdata.sizes.left_margin / 6 + 1) * 6 + : imgdata.sizes.left_margin; + if (newtm != imgdata.sizes.top_margin || + newlm != imgdata.sizes.left_margin) + { + imgdata.sizes.height -= (newtm - imgdata.sizes.top_margin); + imgdata.sizes.top_margin = newtm; + imgdata.sizes.width -= (newlm - imgdata.sizes.left_margin); + imgdata.sizes.left_margin = newlm; + for (int c1 = 0; c1 < 6; c1++) + for (int c2 = 0; c2 < 6; c2++) + imgdata.idata.xtrans[c1][c2] = imgdata.idata.xtrans_abs[c1][c2]; + } + adjust_margins = 6; + } + else if (!libraw_internal_data.internal_output_params.fuji_width + && imgdata.idata.filters >= 1000) + { + if ((imgdata.sizes.top_margin % 2) || (imgdata.sizes.left_margin % 2)) + { + int crop[2] = { 0,0 }; + unsigned filt; + int c; + if (imgdata.sizes.top_margin % 2) + { + imgdata.sizes.top_margin += 1; + imgdata.sizes.height -= 1; + crop[1] = 1; + } + if (imgdata.sizes.left_margin % 2) + { + imgdata.sizes.left_margin += 1; + imgdata.sizes.width -= 1; + crop[0] = 1; + } + for (filt = c = 0; c < 16; c++) + filt |= FC((c >> 1) + (crop[1]), (c & 1) + (crop[0])) << c * 2; + imgdata.idata.filters = filt; + } + adjust_margins = 2; + } + + if(adjust_margins) // adjust crop_inset margins + for (int i = 0; i < 2; i++) + { + if (imgdata.sizes.raw_inset_crops[i].cleft && imgdata.sizes.raw_inset_crops[i].cleft < 0xffff + && imgdata.sizes.raw_inset_crops[i].cwidth && imgdata.sizes.raw_inset_crops[i].cwidth < 0xffff + && (imgdata.sizes.raw_inset_crops[i].cleft%adjust_margins) + && (imgdata.sizes.raw_inset_crops[i].cwidth > adjust_margins)) + { + int newleft = ((imgdata.sizes.raw_inset_crops[i].cleft / adjust_margins) + 1) * adjust_margins; + int diff = newleft - imgdata.sizes.raw_inset_crops[i].cleft; + if (diff > 0) + { + imgdata.sizes.raw_inset_crops[i].cleft += diff; + imgdata.sizes.raw_inset_crops[i].cwidth -= diff; + } + } + if (imgdata.sizes.raw_inset_crops[i].ctop && imgdata.sizes.raw_inset_crops[i].ctop < 0xffff + && imgdata.sizes.raw_inset_crops[i].cheight && imgdata.sizes.raw_inset_crops[i].cheight < 0xffff + && (imgdata.sizes.raw_inset_crops[i].ctop%adjust_margins) + && (imgdata.sizes.raw_inset_crops[i].cheight > adjust_margins)) + { + int newtop = ((imgdata.sizes.raw_inset_crops[i].ctop / adjust_margins) + 1) * adjust_margins; + int diff = newtop - imgdata.sizes.raw_inset_crops[i].ctop; + if (diff > 0) + { + imgdata.sizes.raw_inset_crops[i].ctop += diff; + imgdata.sizes.raw_inset_crops[i].cheight -= diff; + } + } + } + + +#ifdef USE_DNGSDK + if ( + imgdata.rawparams.use_dngsdk && + !(imgdata.rawparams.options & (LIBRAW_RAWOPTIONS_DNG_STAGE2 | LIBRAW_RAWOPTIONS_DNG_STAGE3 | LIBRAW_RAWOPTIONS_DNG_DISABLEWBADJUST))) +#endif + { + // Fix DNG white balance if needed: observed only for Kalpanika X3F tools produced DNGs + if (imgdata.idata.dng_version && (imgdata.idata.filters == 0) && + imgdata.idata.colors > 1 && imgdata.idata.colors < 5) + { + float delta[4] = { 0.f, 0.f, 0.f, 0.f }; + int black[4]; + for (int c = 0; c < 4; c++) + black[c] = imgdata.color.dng_levels.dng_black + + imgdata.color.dng_levels.dng_cblack[c]; + for (int c = 0; c < imgdata.idata.colors; c++) + delta[c] = imgdata.color.dng_levels.dng_whitelevel[c] - black[c]; + float mindelta = delta[0], maxdelta = delta[0]; + for (int c = 1; c < imgdata.idata.colors; c++) + { + if (mindelta > delta[c]) + mindelta = delta[c]; + if (maxdelta < delta[c]) + maxdelta = delta[c]; + } + if (mindelta > 1 && maxdelta < (mindelta * 20)) // safety + { + for (int c = 0; c < imgdata.idata.colors; c++) + { + imgdata.color.cam_mul[c] /= (delta[c] / maxdelta); + imgdata.color.pre_mul[c] /= (delta[c] / maxdelta); + } + imgdata.color.maximum = imgdata.color.cblack[0] + maxdelta; + } + } + } + + if (imgdata.idata.dng_version && + makeIs(LIBRAW_CAMERAMAKER_Panasonic) + && !strcasecmp(imgdata.idata.normalized_model, "DMC-LX100")) + imgdata.sizes.width = 4288; + + if (imgdata.idata.dng_version + && makeIs(LIBRAW_CAMERAMAKER_Leica) + && !strcasecmp(imgdata.idata.normalized_model, "SL2")) + imgdata.sizes.height -= 16; + + if (makeIs(LIBRAW_CAMERAMAKER_Sony) && + imgdata.idata.dng_version) + { + if (S.raw_width == 3984) + S.width = 3925; + else if (S.raw_width == 4288) + S.width = S.raw_width - 32; + else if (S.raw_width == 4928 && S.height < 3280) + S.width = S.raw_width - 8; + else if (S.raw_width == 5504) + S.width = S.raw_width - (S.height > 3664 ? 8 : 32); + } + + if (makeIs(LIBRAW_CAMERAMAKER_Sony) && + !imgdata.idata.dng_version) + { + if(load_raw ==&LibRaw::sony_arq_load_raw) + { + if(S.raw_width > 12000) // A7RM4 16x, both APS-C and APS + S.width = S.raw_width - 64; + else // A7RM3/M4 4x merge + S.width = S.raw_width - 32; + } + + if (((!strncasecmp(imgdata.idata.model, "ILCE-7RM", 8) || + !strcasecmp(imgdata.idata.model, "ILCA-99M2")) && + (S.raw_width == 5216 || S.raw_width == 6304)) // A7RM2/M3/A99M2 in APS mode; A7RM4 in APS-C + || + (!strcasecmp(imgdata.idata.model, "ILCE-7R") && S.raw_width >= 4580 && + S.raw_width < 5020) // A7R in crop mode, no samples, so size est. + || (!strcasecmp(imgdata.idata.model, "ILCE-7") && + S.raw_width == 3968) // A7 in crop mode + || + ((!strncasecmp(imgdata.idata.model, "ILCE-7M", 7) || + !strcasecmp(imgdata.idata.model, "ILCE-9") || +#if 0 + !strcasecmp(imgdata.idata.model, + "SLT-A99V")) // Does SLT-A99 also have APS-C mode?? +#endif + (mnCamID == SonyID_SLT_A99)) // 2 reasons: some cameras are SLT-A99, no 'V'; some are Hasselblad HV + && S.raw_width > 3750 && + S.raw_width < 4120) // A7M2, A7M3, AA9, most likely APS-C raw_width + // is 3968 (same w/ A7), but no samples, so guess + || (!strncasecmp(imgdata.idata.model, "ILCE-7S", 7) && + S.raw_width == 2816) // A7S2=> exact, hope it works for A7S-I too + ) + S.width = S.raw_width - 32; + } + + + // FIXME: it is possible that DNG contains 4x main frames + some previews; in this case imgdata.idata.raw_count will be greater than 4 + if (makeIs(LIBRAW_CAMERAMAKER_Pentax) && + /*!strcasecmp(imgdata.idata.model,"K-3 II") &&*/ + imgdata.idata.raw_count == 4 && + (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_PENTAX_PS_ALLFRAMES)) + { + imgdata.idata.raw_count = 1; + imgdata.idata.filters = 0; + imgdata.idata.colors = 4; + imgdata.sizes.top_margin+=2; + imgdata.sizes.left_margin+=2; + imgdata.sizes.width-=4; + imgdata.sizes.height-=4; + IO.mix_green = 1; + pentax_component_load_raw = load_raw; + load_raw = &LibRaw::pentax_4shot_load_raw; + } + + if (!imgdata.idata.dng_version && makeIs(LIBRAW_CAMERAMAKER_Leaf) && + !strcmp(imgdata.idata.model, "Credo 50")) + { + imgdata.color.pre_mul[0] = 1.f / 0.3984f; + imgdata.color.pre_mul[2] = 1.f / 0.7666f; + imgdata.color.pre_mul[1] = imgdata.color.pre_mul[3] = 1.0; + } + + if (!imgdata.idata.dng_version && makeIs(LIBRAW_CAMERAMAKER_Fujifilm) && + (!strncmp(imgdata.idata.model, "S20Pro", 6) || + !strncmp(imgdata.idata.model, "F700", 4))) + { + imgdata.sizes.raw_width /= 2; + load_raw = &LibRaw::unpacked_load_raw_fuji_f700s20; + } + + if (load_raw == &LibRaw::packed_load_raw && + makeIs(LIBRAW_CAMERAMAKER_Nikon) && + !libraw_internal_data.unpacker_data.load_flags && + (!strncasecmp(imgdata.idata.model, "D810", 4) || + !strcasecmp(imgdata.idata.model, "D4S")) && + libraw_internal_data.unpacker_data.data_size * 2u == + imgdata.sizes.raw_height * imgdata.sizes.raw_width * 3u) + { + libraw_internal_data.unpacker_data.load_flags = 80; + } + // Adjust BL for Sony A900/A850 + if (load_raw == &LibRaw::packed_load_raw && + makeIs(LIBRAW_CAMERAMAKER_Sony)) // 12 bit sony, but metadata may be for 14-bit range + { + if (C.maximum > 4095) + C.maximum = 4095; + if (C.black > 256 || C.cblack[0] > 256) + { + C.black /= 4; + for (int c = 0; c < 4; c++) + C.cblack[c] /= 4; + for (unsigned c = 0; c < C.cblack[4] * C.cblack[5]; c++) + C.cblack[6 + c] /= 4; + } + } + + if (load_raw == &LibRaw::nikon_yuv_load_raw) // Is it Nikon sRAW? + { + load_raw = &LibRaw::nikon_load_sraw; + C.black = 0; + memset(C.cblack, 0, sizeof(C.cblack)); + imgdata.idata.filters = 0; + libraw_internal_data.unpacker_data.tiff_samples = 3; + imgdata.idata.colors = 3; + double beta_1 = -5.79342238397656E-02; + double beta_2 = 3.28163551282665; + double beta_3 = -8.43136004842678; + double beta_4 = 1.03533181861023E+01; + for (int i = 0; i <= 3072; i++) + { + double x = (double)i / 3072.; + double y = (1. - exp(-beta_1 * x - beta_2 * x * x - beta_3 * x * x * x - + beta_4 * x * x * x * x)); + if (y < 0.) + y = 0.; + imgdata.color.curve[i] = (y * 16383.); + } + for (int i = 0; i < 3; i++) + for (int j = 0; j < 4; j++) + imgdata.color.rgb_cam[i][j] = float(i == j); + } + // Adjust BL for Nikon 12bit + if ((load_raw == &LibRaw::nikon_load_raw || + load_raw == &LibRaw::packed_load_raw || + load_raw == &LibRaw::nikon_load_padded_packed_raw) && + makeIs(LIBRAW_CAMERAMAKER_Nikon) && + strncmp(imgdata.idata.model, "COOLPIX", 7) && + libraw_internal_data.unpacker_data.tiff_bps == 12) + { + C.maximum = 4095; + C.black /= 4; + for (int c = 0; c < 4; c++) + C.cblack[c] /= 4; + for (unsigned c = 0; c < C.cblack[4] * C.cblack[5]; c++) + C.cblack[6 + c] /= 4; + } + + // Adjust wb_already_applied + if (load_raw == &LibRaw::nikon_load_sraw) + imgdata.color.as_shot_wb_applied = + LIBRAW_ASWB_APPLIED | LIBRAW_ASWB_NIKON_SRAW; + else if (makeIs(LIBRAW_CAMERAMAKER_Canon) && + MN.canon.multishot[0] >= 8 && + MN.canon.multishot[1] > 0) + imgdata.color.as_shot_wb_applied = + LIBRAW_ASWB_APPLIED | LIBRAW_ASWB_CANON; + else if (makeIs(LIBRAW_CAMERAMAKER_Nikon) && + MN.nikon.ExposureMode == 1) + imgdata.color.as_shot_wb_applied = + LIBRAW_ASWB_APPLIED | LIBRAW_ASWB_NIKON; + else if (makeIs(LIBRAW_CAMERAMAKER_Pentax) && + ((MN.pentax.MultiExposure & 0x01) == 1)) + imgdata.color.as_shot_wb_applied = + LIBRAW_ASWB_APPLIED | LIBRAW_ASWB_PENTAX; + else if (makeIs(LIBRAW_CAMERAMAKER_Sony) && load_raw == &LibRaw::sony_ycbcr_load_raw) + imgdata.color.as_shot_wb_applied = LIBRAW_ASWB_APPLIED | LIBRAW_ASWB_SONY; + else + imgdata.color.as_shot_wb_applied = 0; + + // Adjust Highlight Linearity limit + if (C.linear_max[0] < 0) + { + if (imgdata.idata.dng_version) + { + for (int c = 0; c < 4; c++) + C.linear_max[c] = -1 * C.linear_max[c] + imgdata.color.cblack[c + 6]; + } + else + { + for (int c = 0; c < 4; c++) + C.linear_max[c] = -1 * C.linear_max[c] + imgdata.color.cblack[c]; + } + } + + if (makeIs(LIBRAW_CAMERAMAKER_Nikon) && + (!C.linear_max[0]) && (C.maximum > 1024) && (load_raw != &LibRaw::nikon_load_sraw)) + { + C.linear_max[0] = C.linear_max[1] = C.linear_max[2] = C.linear_max[3] = + (long)((float)(C.maximum) / 1.07f); + } + + // Correct WB for Samsung GX20 + if ( +#if 0 + /* GX20 should be corrected, but K20 is not */ + makeIs(LIBRAW_CAMERAMAKER_Pentax) && + !strcasecmp(imgdata.idata.normalized_model, "K20D") +#endif +#if 0 + !strcasecmp(imgdata.idata.make, "Samsung") && + !strcasecmp(imgdata.idata.model, "GX20") +#endif + makeIs(LIBRAW_CAMERAMAKER_Pentax) && + (mnCamID == PentaxID_GX20) // Samsung rebranding + ) + { + for (int cnt = LIBRAW_WBI_Unknown; cnt <= LIBRAW_WBI_StudioTungsten; cnt++) { + if (C.WB_Coeffs[cnt][1]) { + C.WB_Coeffs[cnt][0] = (int)((float)(C.WB_Coeffs[cnt][0]) * 1.0503f); + C.WB_Coeffs[cnt][2] = (int)((float)(C.WB_Coeffs[cnt][2]) * 2.2867f); + } + } + for (int cnt = 0; cnt < 64; cnt++) { + if (C.WBCT_Coeffs[cnt][0] > 0.0f) { + C.WBCT_Coeffs[cnt][1] *= 1.0503f; + C.WBCT_Coeffs[cnt][3] *= 2.2867f; + } + } + for(int cnt = 0; cnt < 4; cnt++) + imgdata.color.pre_mul[cnt] = + C.WB_Coeffs[LIBRAW_WBI_Daylight][cnt]; + } + + // Adjust BL for Panasonic + if (load_raw == &LibRaw::panasonic_load_raw && + makeIs(LIBRAW_CAMERAMAKER_Panasonic) && + ID.pana_black[0] && ID.pana_black[1] && ID.pana_black[2]) + { + if (libraw_internal_data.unpacker_data.pana_encoding == 5) + libraw_internal_data.internal_output_params.zero_is_bad = 0; + C.black = 0; + int add = libraw_internal_data.unpacker_data.pana_encoding == 4 ? 15 : 0; + C.cblack[0] = ID.pana_black[0] + add; + C.cblack[1] = C.cblack[3] = ID.pana_black[1] + add; + C.cblack[2] = ID.pana_black[2] + add; + unsigned i = C.cblack[3]; + for (int c = 0; c < 3; c++) + if (i > C.cblack[c]) + i = C.cblack[c]; + for (int c = 0; c < 4; c++) + C.cblack[c] -= i; + C.black = i; + } + + // Adjust sizes for X3F processing +#ifdef USE_X3FTOOLS + if (load_raw == &LibRaw::x3f_load_raw) + { + for (int i = 0; i < foveon_count; i++) + if (!strcasecmp(imgdata.idata.make, foveon_data[i].make) && + !strcasecmp(imgdata.idata.model, foveon_data[i].model) && + imgdata.sizes.raw_width == foveon_data[i].raw_width && + imgdata.sizes.raw_height == foveon_data[i].raw_height) + { + imgdata.sizes.top_margin = foveon_data[i].top_margin; + imgdata.sizes.left_margin = foveon_data[i].left_margin; + imgdata.sizes.width = imgdata.sizes.iwidth = foveon_data[i].width; + imgdata.sizes.height = imgdata.sizes.iheight = foveon_data[i].height; + C.maximum = foveon_data[i].white; + break; + } + } +#endif +#if 0 + size_t bytes = ID.input->size()-libraw_internal_data.unpacker_data.data_offset; + float bpp = float(bytes)/float(S.raw_width)/float(S.raw_height); + float bpp2 = float(bytes)/float(S.width)/float(S.height); + if(!strcasecmp(imgdata.idata.make,"Hasselblad") && bpp == 6.0f) + { + load_raw = &LibRaw::hasselblad_full_load_raw; + S.width = S.raw_width; + S.height = S.raw_height; + P1.filters = 0; + P1.colors=3; + P1.raw_count=1; + C.maximum=0xffff; + } +#endif + if (C.profile_length) + { + if (C.profile) + free(C.profile); + INT64 profile_sz = MIN(INT64(C.profile_length), ID.input->size() - ID.profile_offset); + if (profile_sz > 0LL && profile_sz < LIBRAW_MAX_PROFILE_SIZE_MB * 1024LL * 1024LL) + { + C.profile = malloc(size_t(profile_sz)); + ID.input->seek(ID.profile_offset, SEEK_SET); + ID.input->read(C.profile, size_t(profile_sz), 1); + } + else + C.profile = NULL; + } + + SET_PROC_FLAG(LIBRAW_PROGRESS_IDENTIFY); + } + catch (const std::bad_alloc&) + { + EXCEPTION_HANDLER(LIBRAW_EXCEPTION_ALLOC); + } + catch (const LibRaw_exceptions& err) + { + EXCEPTION_HANDLER(err); + } + catch (const std::exception& ) + { + EXCEPTION_HANDLER(LIBRAW_EXCEPTION_IO_CORRUPT); + } + +final:; + + if (P1.raw_count < 1) + return LIBRAW_FILE_UNSUPPORTED; + + write_fun = &LibRaw::write_ppm_tiff; + + if (load_raw == &LibRaw::kodak_ycbcr_load_raw) + { + S.height += S.height & 1; + S.width += S.width & 1; + } + + IO.shrink = + P1.filters && + (O.half_size || ((O.threshold || O.aber[0] != 1 || O.aber[2] != 1))); + if (IO.shrink && P1.filters >= 1000) + { + S.width &= 65534; + S.height &= 65534; + } + + S.iheight = (S.height + IO.shrink) >> IO.shrink; + S.iwidth = (S.width + IO.shrink) >> IO.shrink; + + // Save color,sizes and internal data into raw_image fields + memmove(&imgdata.rawdata.color, &imgdata.color, sizeof(imgdata.color)); + memmove(&imgdata.rawdata.sizes, &imgdata.sizes, sizeof(imgdata.sizes)); + memmove(&imgdata.rawdata.iparams, &imgdata.idata, sizeof(imgdata.idata)); + memmove(&imgdata.rawdata.ioparams, + &libraw_internal_data.internal_output_params, + sizeof(libraw_internal_data.internal_output_params)); + + SET_PROC_FLAG(LIBRAW_PROGRESS_SIZE_ADJUST); + + return LIBRAW_SUCCESS; +} diff --git a/rtengine/libraw/src/utils/phaseone_processing.cpp b/rtengine/libraw/src/utils/phaseone_processing.cpp new file mode 100644 index 000000000..6c7339223 --- /dev/null +++ b/rtengine/libraw/src/utils/phaseone_processing.cpp @@ -0,0 +1,109 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/libraw_cxx_defs.h" + + +void LibRaw::phase_one_allocate_tempbuffer() +{ + // Allocate temp raw_image buffer + if (imgdata.process_warnings & LIBRAW_WARN_RAWSPEED3_PROCESSED) + { + // Processed by RawSpeed, raw_image contains ptr to rawspeed internals + imgdata.rawdata.raw_alloc = imgdata.rawdata.raw_image; // save for data processing and future reuse + } + imgdata.rawdata.raw_image = (ushort *)malloc(S.raw_pitch * S.raw_height); +} +void LibRaw::phase_one_free_tempbuffer() +{ + free(imgdata.rawdata.raw_image); + imgdata.rawdata.raw_image = (ushort *)imgdata.rawdata.raw_alloc; + if (imgdata.process_warnings & LIBRAW_WARN_RAWSPEED3_PROCESSED) + imgdata.rawdata.raw_alloc = 0; +} + +int LibRaw::phase_one_subtract_black(ushort *src, ushort *dest) +{ + + try + { + if (O.user_black < 0 && O.user_cblack[0] <= -1000000 && + O.user_cblack[1] <= -1000000 && O.user_cblack[2] <= -1000000 && + O.user_cblack[3] <= -1000000) + { + if (!imgdata.rawdata.ph1_cblack || !imgdata.rawdata.ph1_rblack) + { + int bl = imgdata.color.phase_one_data.t_black; + for (int row = 0; row < S.raw_height; row++) + { + checkCancel(); + for (int col = 0; col < S.raw_width; col++) + { + int idx = row * S.raw_width + col; + int val = int(src[idx]) - bl; + dest[idx] = val > 0 ? val : 0; + } + } + } + else + { + int bl = imgdata.color.phase_one_data.t_black; + for (int row = 0; row < S.raw_height; row++) + { + checkCancel(); + for (int col = 0; col < S.raw_width; col++) + { + int idx = row * S.raw_width + col; + int val = + int(src[idx]) - bl + + imgdata.rawdata + .ph1_cblack[row][col >= imgdata.rawdata.color.phase_one_data + .split_col] + + imgdata.rawdata + .ph1_rblack[col][row >= imgdata.rawdata.color.phase_one_data + .split_row]; + dest[idx] = val > 0 ? val : 0; + } + } + } + } + else // black set by user interaction + { + // Black level in cblack! + for (int row = 0; row < S.raw_height; row++) + { + checkCancel(); + unsigned short cblk[16]; + for (int cc = 0; cc < 16; cc++) + cblk[cc] = C.cblack[fcol(row, cc)]; + for (int col = 0; col < S.raw_width; col++) + { + int idx = row * S.raw_width + col; + ushort val = src[idx]; + ushort bl = cblk[col & 0xf]; + dest[idx] = val > bl ? val - bl : 0; + } + } + } + return 0; + } + catch (const LibRaw_exceptions& ) + { + return LIBRAW_CANCELLED_BY_CALLBACK; + } +} diff --git a/rtengine/libraw/src/utils/read_utils.cpp b/rtengine/libraw/src/utils/read_utils.cpp new file mode 100644 index 000000000..c934344c1 --- /dev/null +++ b/rtengine/libraw/src/utils/read_utils.cpp @@ -0,0 +1,176 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +ushort LibRaw::sget2Rev(uchar *s) // specific to some Canon Makernotes fields, + // where they have endian in reverse +{ + if (order == 0x4d4d) /* "II" means little-endian, and we reverse to "MM" - big + endian */ + return s[0] | s[1] << 8; + else /* "MM" means big-endian... */ + return s[0] << 8 | s[1]; +} + +ushort libraw_sget2_static(short _order, uchar *s) +{ + if (_order == 0x4949) /* "II" means little-endian */ + return s[0] | s[1] << 8; + else /* "MM" means big-endian */ + return s[0] << 8 | s[1]; +} + +ushort LibRaw::sget2(uchar *s) +{ + return libraw_sget2_static(order, s); +} + + +ushort LibRaw::get2() +{ + uchar str[2] = {0xff, 0xff}; + fread(str, 1, 2, ifp); + return sget2(str); +} + +unsigned LibRaw::sget4(uchar *s) +{ + return libraw_sget4_static(order, s); +} + + +unsigned libraw_sget4_static(short _order, uchar *s) +{ + if (_order == 0x4949) + return s[0] | s[1] << 8 | s[2] << 16 | s[3] << 24; + else + return s[0] << 24 | s[1] << 16 | s[2] << 8 | s[3]; +} + +unsigned LibRaw::get4() +{ + uchar str[4] = {0xff, 0xff, 0xff, 0xff}; + fread(str, 1, 4, ifp); + return sget4(str); +} + +unsigned LibRaw::getint(int type) { return tagtypeIs(LIBRAW_EXIFTAG_TYPE_SHORT) ? get2() : get4(); } + +float libraw_int_to_float(int i) +{ + union { + int i; + float f; + } u; + u.i = i; + return u.f; +} + +float LibRaw::int_to_float(int i) { return libraw_int_to_float(i); } + +double LibRaw::getreal(int type) +{ + union { + char c[8]; + double d; + } u, v; + int i, rev; + + switch (type) + { + case LIBRAW_EXIFTAG_TYPE_SHORT: + return (unsigned short)get2(); + case LIBRAW_EXIFTAG_TYPE_LONG: + return (unsigned int)get4(); + case LIBRAW_EXIFTAG_TYPE_RATIONAL: // (unsigned, unsigned) + u.d = (unsigned int)get4(); + v.d = (unsigned int)get4(); + return u.d / (v.d ? v.d : 1); + case LIBRAW_EXIFTAG_TYPE_SSHORT: + return (signed short)get2(); + case LIBRAW_EXIFTAG_TYPE_SLONG: + return (signed int)get4(); + case LIBRAW_EXIFTAG_TYPE_SRATIONAL: // (int, int) + u.d = (signed int)get4(); + v.d = (signed int)get4(); + return u.d / (v.d ? v.d : 1); + case LIBRAW_EXIFTAG_TYPE_FLOAT: + return int_to_float(get4()); + case LIBRAW_EXIFTAG_TYPE_DOUBLE: + rev = 7 * ((order == 0x4949) == (ntohs(0x1234) == 0x1234)); + for (i = 0; i < 8; i++) + u.c[i ^ rev] = fgetc(ifp); + return u.d; + default: + return fgetc(ifp); + } +} + +double LibRaw::sgetreal(int type, uchar *s) +{ + return libraw_sgetreal_static(order, type, s); +} + + +double libraw_sgetreal_static(short _order, int type, uchar *s) +{ + union { + char c[8]; + double d; + } u, v; + int i, rev; + + switch (type) + { + case LIBRAW_EXIFTAG_TYPE_SHORT: + return (unsigned short) libraw_sget2_static(_order,s); + case LIBRAW_EXIFTAG_TYPE_LONG: + return (unsigned int)libraw_sget4_static(_order, s); + case LIBRAW_EXIFTAG_TYPE_RATIONAL: // (unsigned, unsigned) + u.d = (unsigned int)libraw_sget4_static(_order,s); + v.d = (unsigned int)libraw_sget4_static(_order,s+4); + return u.d / (v.d ? v.d : 1); + case LIBRAW_EXIFTAG_TYPE_SSHORT: + return (signed short)libraw_sget2_static(_order,s); + case LIBRAW_EXIFTAG_TYPE_SLONG: + return (signed int) libraw_sget4_static(_order,s); + case LIBRAW_EXIFTAG_TYPE_SRATIONAL: // (int, int) + u.d = (signed int)libraw_sget4_static(_order,s); + v.d = (signed int)libraw_sget4_static(_order,s+4); + return u.d / (v.d ? v.d : 1); + case LIBRAW_EXIFTAG_TYPE_FLOAT: + return libraw_int_to_float(libraw_sget4_static(_order,s)); + case LIBRAW_EXIFTAG_TYPE_DOUBLE: + rev = 7 * ((_order == 0x4949) == (ntohs(0x1234) == 0x1234)); + for (i = 0; i < 8; i++) + u.c[i ^ rev] = *(s+1); + return u.d; + default: + return *(s+1); + } +} + + +void LibRaw::read_shorts(ushort *pixel, unsigned count) +{ + if ((unsigned)fread(pixel, 2, count, ifp) < count) + derror(); + if ((order == 0x4949) == (ntohs(0x1234) == 0x1234)) + libraw_swab(pixel, count * 2); +} diff --git a/rtengine/libraw/src/utils/thumb_utils.cpp b/rtengine/libraw/src/utils/thumb_utils.cpp new file mode 100644 index 000000000..98184e759 --- /dev/null +++ b/rtengine/libraw/src/utils/thumb_utils.cpp @@ -0,0 +1,347 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/libraw_cxx_defs.h" +#include + +void LibRaw::dng_ycbcr_thumb_loader() +{ + // Placeholder: the only known camera w/ YCC previews in DNG provides broken files + throw LIBRAW_EXCEPTION_UNSUPPORTED_FORMAT; +} + +void LibRaw::kodak_thumb_loader() +{ + INT64 est_datasize = + T.theight * T.twidth / 3; // is 0.3 bytes per pixel good estimate? + if (ID.toffset < 0) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + if (ID.toffset + est_datasize > ID.input->size() + THUMB_READ_BEYOND) + throw LIBRAW_EXCEPTION_IO_EOF; + + if(INT64(T.theight) * INT64(T.twidth) > 1024ULL * 1024ULL * LIBRAW_MAX_THUMBNAIL_MB) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + if (INT64(T.theight) * INT64(T.twidth) < 64ULL) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + if(T.twidth < 16 || T.twidth > 8192 || T.theight < 16 || T.theight > 8192) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + // some kodak cameras + ushort s_height = S.height, s_width = S.width, s_iwidth = S.iwidth, + s_iheight = S.iheight; + ushort s_flags = libraw_internal_data.unpacker_data.load_flags; + libraw_internal_data.unpacker_data.load_flags = 12; + int s_colors = P1.colors; + unsigned s_filters = P1.filters; + ushort(*s_image)[4] = imgdata.image; + + S.height = T.theight; + S.width = T.twidth; + P1.filters = 0; + +#define Tformat libraw_internal_data.unpacker_data.thumb_format + + + if (Tformat == LIBRAW_INTERNAL_THUMBNAIL_KODAK_YCBCR) + { + S.height += S.height & 1; + S.width += S.width & 1; + } + + S.iheight = S.height; + S.iwidth = S.width; + + imgdata.image = + (ushort(*)[4])calloc(S.iheight * S.iwidth, sizeof(*imgdata.image)); + + ID.input->seek(ID.toffset, SEEK_SET); + // read kodak thumbnail into T.image[] + try + { + if (Tformat == LIBRAW_INTERNAL_THUMBNAIL_KODAK_YCBCR) + kodak_ycbcr_load_raw(); + else if(Tformat == LIBRAW_INTERNAL_THUMBNAIL_KODAK_RGB) + kodak_rgb_load_raw(); + else if (Tformat == LIBRAW_INTERNAL_THUMBNAIL_KODAK_THUMB) + kodak_thumb_load_raw(); + } + catch (...) + { + free(imgdata.image); + imgdata.image = s_image; + + T.twidth = 0; + S.width = s_width; + + S.iwidth = s_iwidth; + S.iheight = s_iheight; + + T.theight = 0; + S.height = s_height; + + T.tcolors = 0; + P1.colors = s_colors; + + P1.filters = s_filters; + T.tlength = 0; + libraw_internal_data.unpacker_data.load_flags = s_flags; + return; + } + + // from scale_colors + { + double dmax; + float scale_mul[4]; + int c, val; + for (dmax = DBL_MAX, c = 0; c < 3; c++) + if (dmax > C.pre_mul[c]) + dmax = C.pre_mul[c]; + + for (c = 0; c < 3; c++) + scale_mul[c] = (C.pre_mul[c] / dmax) * 65535.0 / C.maximum; + scale_mul[3] = scale_mul[1]; + + size_t size = S.height * S.width; + for (unsigned i = 0; i < size * 4; i++) + { + val = imgdata.image[0][i]; + if (!val) + continue; + val *= scale_mul[i & 3]; + imgdata.image[0][i] = CLIP(val); + } + } + + // from convert_to_rgb + ushort *img; + int row, col; + + int(*t_hist)[LIBRAW_HISTOGRAM_SIZE] = + (int(*)[LIBRAW_HISTOGRAM_SIZE])calloc(sizeof(*t_hist), 4); + + if (imgdata.idata.maker_index == LIBRAW_CAMERAMAKER_Canon) // Skip color conversion for canon PPM tiffs + { + for (img = imgdata.image[0], row = 0; row < S.height; row++) + for (col = 0; col < S.width; col++, img += 4) + for (int c = 0; c < P1.colors; c++) + t_hist[c][img[c] >> 3]++; + } + else + { + float out[3], out_cam[3][4] = {{2.81761312f, -1.98369181f, 0.166078627f, 0}, + {-0.111855984f, 1.73688626f, -0.625030339f, 0}, + {-0.0379119813f, -0.891268849f, 1.92918086f, 0}}; + + for (img = imgdata.image[0], row = 0; row < S.height; row++) + for (col = 0; col < S.width; col++, img += 4) + { + out[0] = out[1] = out[2] = 0; + int c; + for (c = 0; c < 3; c++) + { + out[0] += out_cam[0][c] * img[c]; + out[1] += out_cam[1][c] * img[c]; + out[2] += out_cam[2][c] * img[c]; + } + for (c = 0; c < 3; c++) + img[c] = CLIP((int)out[c]); + for (c = 0; c < P1.colors; c++) + t_hist[c][img[c] >> 3]++; + } + } + + // from gamma_lut + int(*save_hist)[LIBRAW_HISTOGRAM_SIZE] = + libraw_internal_data.output_data.histogram; + libraw_internal_data.output_data.histogram = t_hist; + + // make curve output curve! + ushort *t_curve = (ushort *)calloc(sizeof(C.curve), 1); + memmove(t_curve, C.curve, sizeof(C.curve)); + memset(C.curve, 0, sizeof(C.curve)); + { + int perc, val, total, t_white = 0x2000, c; + + perc = S.width * S.height * 0.01; /* 99th percentile white level */ + if (IO.fuji_width) + perc /= 2; + if (!((O.highlight & ~2) || O.no_auto_bright)) + for (t_white = c = 0; c < P1.colors; c++) + { + for (val = 0x2000, total = 0; --val > 32;) + if ((total += libraw_internal_data.output_data.histogram[c][val]) > + perc) + break; + if (t_white < val) + t_white = val; + } + gamma_curve(O.gamm[0], O.gamm[1], 2, (t_white << 3) / O.bright); + } + + libraw_internal_data.output_data.histogram = save_hist; + free(t_hist); + + // from write_ppm_tiff - copy pixels into bitmap + + int s_flip = imgdata.sizes.flip; + if (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_NO_ROTATE_FOR_KODAK_THUMBNAILS) + imgdata.sizes.flip = 0; + + S.iheight = S.height; + S.iwidth = S.width; + if (S.flip & 4) + SWAP(S.height, S.width); + + if (T.thumb) + free(T.thumb); + T.thumb = (char *)calloc(S.width * S.height, P1.colors); + T.tlength = S.width * S.height * P1.colors; + + // from write_tiff_ppm + { + int soff = flip_index(0, 0); + int cstep = flip_index(0, 1) - soff; + int rstep = flip_index(1, 0) - flip_index(0, S.width); + + for (int rr = 0; rr < S.height; rr++, soff += rstep) + { + char *ppm = T.thumb + rr * S.width * P1.colors; + for (int cc = 0; cc < S.width; cc++, soff += cstep) + for (int c = 0; c < P1.colors; c++) + ppm[cc * P1.colors + c] = + imgdata.color.curve[imgdata.image[soff][c]] >> 8; + } + } + + memmove(C.curve, t_curve, sizeof(C.curve)); + free(t_curve); + + // restore variables + free(imgdata.image); + imgdata.image = s_image; + + if (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_NO_ROTATE_FOR_KODAK_THUMBNAILS) + imgdata.sizes.flip = s_flip; + + T.twidth = S.width; + S.width = s_width; + + S.iwidth = s_iwidth; + S.iheight = s_iheight; + + T.theight = S.height; + S.height = s_height; + + T.tcolors = P1.colors; + P1.colors = s_colors; + + P1.filters = s_filters; + libraw_internal_data.unpacker_data.load_flags = s_flags; +} + +// ������� thumbnail �� �����, ������ thumb_format � ������������ � �������� + +int LibRaw::thumbOK(INT64 maxsz) +{ + if (!ID.input) + return 0; + if (!ID.toffset && !(imgdata.thumbnail.tlength > 0 && + load_raw == &LibRaw::broadcom_load_raw) // RPi +#ifdef USE_6BY9RPI + && !(imgdata.thumbnail.tlength > 0 && libraw_internal_data.unpacker_data.load_flags & 0x4000 && + (load_raw == &LibRaw::rpi_load_raw8 || load_raw == &LibRaw::nokia_load_raw || + load_raw == &LibRaw::rpi_load_raw12 || load_raw == &LibRaw::rpi_load_raw14)) +#endif + ) + return 0; + INT64 fsize = ID.input->size(); + if (fsize > 0xffffffffU) + return 0; // No thumb for raw > 4Gb-1 + int tsize = 0; + int tcol = (T.tcolors > 0 && T.tcolors < 4) ? T.tcolors : 3; + if (Tformat == LIBRAW_INTERNAL_THUMBNAIL_DNG_YCBCR) + return 0; // Temp: unless we get correct DNG w/ YCBCR preview + else if (Tformat == LIBRAW_INTERNAL_THUMBNAIL_JPEG) + tsize = T.tlength; + else if (Tformat == LIBRAW_INTERNAL_THUMBNAIL_PPM) + tsize = tcol * T.twidth * T.theight; + else if (Tformat == LIBRAW_INTERNAL_THUMBNAIL_PPM16) + tsize = tcol * T.twidth * T.theight * + ((imgdata.rawparams.options & LIBRAW_RAWOPTIONS_USE_PPM16_THUMBS) ? 2 : 1); +#ifdef USE_X3FTOOLS + else if (Tformat == LIBRAW_INTERNAL_THUMBNAIL_X3F) + { + tsize = x3f_thumb_size(); + } +#endif + else // Kodak => no check + tsize = 1; + if (tsize < 0) + return 0; + if (maxsz > 0 && tsize > maxsz) + return 0; + return (tsize + ID.toffset <= fsize) ? 1 : 0; +} + +int LibRaw::dcraw_thumb_writer(const char *fname) +{ + // CHECK_ORDER_LOW(LIBRAW_PROGRESS_THUMB_LOAD); + + if (!fname) + return ENOENT; + + FILE *tfp = fopen(fname, "wb"); + + if (!tfp) + return errno; + + if (!T.thumb) + { + fclose(tfp); + return LIBRAW_OUT_OF_ORDER_CALL; + } + + try + { + switch (T.tformat) + { + case LIBRAW_THUMBNAIL_JPEG: + jpeg_thumb_writer(tfp, T.thumb, T.tlength); + break; + case LIBRAW_THUMBNAIL_BITMAP: + fprintf(tfp, "P%d\n%d %d\n255\n", T.tcolors == 1 ? 5 : 6, T.twidth, T.theight); + fwrite(T.thumb, 1, T.tlength, tfp); + break; + default: + fclose(tfp); + return LIBRAW_UNSUPPORTED_THUMBNAIL; + } + fclose(tfp); + return 0; + } + catch (const std::bad_alloc&) + { + fclose(tfp); + EXCEPTION_HANDLER(LIBRAW_EXCEPTION_ALLOC); + } + catch (const LibRaw_exceptions& err) + { + fclose(tfp); + EXCEPTION_HANDLER(err); + } +} diff --git a/rtengine/libraw/src/utils/utils_dcraw.cpp b/rtengine/libraw/src/utils/utils_dcraw.cpp new file mode 100644 index 000000000..fd3085cc1 --- /dev/null +++ b/rtengine/libraw/src/utils/utils_dcraw.cpp @@ -0,0 +1,330 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" + +int LibRaw::fcol(int row, int col) +{ + static const char filter[16][16] = { + {2, 1, 1, 3, 2, 3, 2, 0, 3, 2, 3, 0, 1, 2, 1, 0}, + {0, 3, 0, 2, 0, 1, 3, 1, 0, 1, 1, 2, 0, 3, 3, 2}, + {2, 3, 3, 2, 3, 1, 1, 3, 3, 1, 2, 1, 2, 0, 0, 3}, + {0, 1, 0, 1, 0, 2, 0, 2, 2, 0, 3, 0, 1, 3, 2, 1}, + {3, 1, 1, 2, 0, 1, 0, 2, 1, 3, 1, 3, 0, 1, 3, 0}, + {2, 0, 0, 3, 3, 2, 3, 1, 2, 0, 2, 0, 3, 2, 2, 1}, + {2, 3, 3, 1, 2, 1, 2, 1, 2, 1, 1, 2, 3, 0, 0, 1}, + {1, 0, 0, 2, 3, 0, 0, 3, 0, 3, 0, 3, 2, 1, 2, 3}, + {2, 3, 3, 1, 1, 2, 1, 0, 3, 2, 3, 0, 2, 3, 1, 3}, + {1, 0, 2, 0, 3, 0, 3, 2, 0, 1, 1, 2, 0, 1, 0, 2}, + {0, 1, 1, 3, 3, 2, 2, 1, 1, 3, 3, 0, 2, 1, 3, 2}, + {2, 3, 2, 0, 0, 1, 3, 0, 2, 0, 1, 2, 3, 0, 1, 0}, + {1, 3, 1, 2, 3, 2, 3, 2, 0, 2, 0, 1, 1, 0, 3, 0}, + {0, 2, 0, 3, 1, 0, 0, 1, 1, 3, 3, 2, 3, 2, 2, 1}, + {2, 1, 3, 2, 3, 1, 2, 1, 0, 3, 0, 2, 0, 2, 0, 2}, + {0, 3, 1, 0, 0, 2, 0, 3, 2, 1, 3, 1, 1, 3, 1, 3}}; + + if (filters == 1) + return filter[(row + top_margin) & 15][(col + left_margin) & 15]; + if (filters == 9) + return xtrans[(row + 6) % 6][(col + 6) % 6]; + return FC(row, col); +} + +size_t LibRaw::strnlen(const char *s, size_t n) +{ +#if !defined(__FreeBSD__) && !defined(__OpenBSD__) + const char *p = (const char *)memchr(s, 0, n); + return (p ? p - s : n); +#else + return ::strnlen(s, n); +#endif +} + +void *LibRaw::memmem(char *haystack, size_t haystacklen, char *needle, + size_t needlelen) +{ +#if !defined(__GLIBC__) && !defined(__FreeBSD__) && !defined(__OpenBSD__) + char *c; + for (c = haystack; c <= haystack + haystacklen - needlelen; c++) + if (!memcmp(c, needle, needlelen)) + return c; + return 0; +#else + return ::memmem(haystack, haystacklen, needle, needlelen); +#endif +} + +char *LibRaw::strcasestr(char *haystack, const char *needle) +{ + char *c; + for (c = haystack; *c; c++) + if (!strncasecmp(c, needle, strlen(needle))) + return c; + return 0; +} + +void LibRaw::initdata() +{ + tiff_flip = flip = filters = UINT_MAX; /* unknown */ + raw_height = raw_width = fuji_width = fuji_layout = cr2_slice[0] = 0; + maximum = height = width = top_margin = left_margin = 0; + cdesc[0] = desc[0] = artist[0] = make[0] = model[0] = model2[0] = 0; + iso_speed = shutter = aperture = focal_len = 0; + unique_id = 0ULL; + tiff_nifds = 0; + memset(tiff_ifd, 0, sizeof tiff_ifd); + for (int i = 0; i < LIBRAW_IFD_MAXCOUNT; i++) + { + tiff_ifd[i].dng_color[0].illuminant = tiff_ifd[i].dng_color[1].illuminant = + 0xffff; + for (int c = 0; c < 4; c++) + tiff_ifd[i].dng_levels.analogbalance[c] = 1.0f; + } + for (int i = 0; i < 0x10000; i++) + curve[i] = i; + memset(gpsdata, 0, sizeof gpsdata); + memset(cblack, 0, sizeof cblack); + memset(white, 0, sizeof white); + memset(mask, 0, sizeof mask); + thumb_offset = thumb_length = thumb_width = thumb_height = 0; + load_raw = 0; + thumb_format = LIBRAW_INTERNAL_THUMBNAIL_JPEG; // default to JPEG + data_offset = meta_offset = meta_length = tiff_bps = tiff_compress = 0; + kodak_cbpp = zero_after_ff = dng_version = load_flags = 0; + timestamp = shot_order = tiff_samples = black = is_foveon = 0; + mix_green = profile_length = data_error = zero_is_bad = 0; + pixel_aspect = is_raw = raw_color = 1; + tile_width = tile_length = 0; + metadata_blocks = 0; + is_NikonTransfer = 0; + is_Olympus = 0; + OlympusDNG_SubDirOffsetValid = 0; + is_Sony = 0; + is_pana_raw = 0; + maker_index = LIBRAW_CAMERAMAKER_Unknown; + FujiCropMode = 0; + is_PentaxRicohMakernotes = 0; + normalized_model[0] = 0; + normalized_make[0] = 0; + CM_found = 0; +} + +void LibRaw::aRGB_coeff(double aRGB_cam[3][3]) +{ + static const double rgb_aRGB[3][3] = { + {1.39828313770000, -0.3982830047, 9.64980900741708E-8}, + {6.09219200572997E-8, 0.9999999809, 1.33230799934103E-8}, + {2.17237099975343E-8, -0.0429383201, 1.04293828050000}}; + + double cmatrix_tmp[3][3] = { + {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}}; + int i, j, k; + + for (i = 0; i < 3; i++) + for (j = 0; j < 3; j++) + { + for (k = 0; k < 3; k++) + cmatrix_tmp[i][j] += rgb_aRGB[i][k] * aRGB_cam[k][j]; + cmatrix[i][j] = (float)cmatrix_tmp[i][j]; + } +} + +void LibRaw::romm_coeff(float romm_cam[3][3]) +{ + static const float rgb_romm[3][3] = /* ROMM == Kodak ProPhoto */ + {{2.034193f, -0.727420f, -0.306766f}, + {-0.228811f, 1.231729f, -0.002922f}, + {-0.008565f, -0.153273f, 1.161839f}}; + int i, j, k; + + for (i = 0; i < 3; i++) + for (j = 0; j < 3; j++) + for (cmatrix[i][j] = k = 0; k < 3; k++) + cmatrix[i][j] += rgb_romm[i][k] * romm_cam[k][j]; +} + +void LibRaw::remove_zeroes() +{ + unsigned row, col, tot, n; + int r, c; + + RUN_CALLBACK(LIBRAW_PROGRESS_REMOVE_ZEROES, 0, 2); + + for (row = 0; row < height; row++) + for (col = 0; col < width; col++) + if (BAYER(row, col) == 0) + { + tot = n = 0; + for (r = (int)row - 2; r <= (int)row + 2; r++) + for (c = (int)col - 2; c <= (int)col + 2; c++) + if (r >= 0 && r < height && c >= 0 && c < width && + FC(r, c) == FC(row, col) && BAYER(r, c)) + tot += (n++, BAYER(r, c)); + if (n) + BAYER(row, col) = tot / n; + } + RUN_CALLBACK(LIBRAW_PROGRESS_REMOVE_ZEROES, 1, 2); +} +void LibRaw::crop_masked_pixels() +{ + int row, col; + unsigned c, m, zero, val; +#define mblack imgdata.color.black_stat + + if (mask[0][3] > 0) + goto mask_set; + if (load_raw == &LibRaw::canon_load_raw || + load_raw == &LibRaw::lossless_jpeg_load_raw || + load_raw == &LibRaw::crxLoadRaw) + { + mask[0][1] = mask[1][1] += 2; + mask[0][3] -= 2; + goto sides; + } + if (load_raw == &LibRaw::canon_600_load_raw || + load_raw == &LibRaw::sony_load_raw || + (load_raw == &LibRaw::eight_bit_load_raw && strncmp(model, "DC2", 3)) || + load_raw == &LibRaw::kodak_262_load_raw || + (load_raw == &LibRaw::packed_load_raw && (load_flags & 32))) + { + sides: + mask[0][0] = mask[1][0] = top_margin; + mask[0][2] = mask[1][2] = top_margin + height; + mask[0][3] += left_margin; + mask[1][1] += left_margin + width; + mask[1][3] += raw_width; + } + if (load_raw == &LibRaw::nokia_load_raw) + { + mask[0][2] = top_margin; + mask[0][3] = width; + } + if (load_raw == &LibRaw::broadcom_load_raw) + { + mask[0][2] = top_margin; + mask[0][3] = width; + } +mask_set: + memset(mblack, 0, sizeof mblack); + for (zero = m = 0; m < 8; m++) + for (row = MAX(mask[m][0], 0); row < MIN(mask[m][2], raw_height); row++) + for (col = MAX(mask[m][1], 0); col < MIN(mask[m][3], raw_width); col++) + { + /* No need to subtract margins because full area and active area filters are the same */ + c = FC(row, col); + mblack[c] += val = raw_image[(row)*raw_pitch / 2 + (col)]; + mblack[4 + c]++; + zero += !val; + } + if (load_raw == &LibRaw::canon_600_load_raw && width < raw_width) + { + black = (mblack[0] + mblack[1] + mblack[2] + mblack[3]) / + MAX(1, (mblack[4] + mblack[5] + mblack[6] + mblack[7])) - + 4; + } + else if (zero < mblack[4] && mblack[5] && mblack[6] && mblack[7]) + { + FORC4 cblack[c] = mblack[c] / MAX(1, mblack[4 + c]); + black = cblack[4] = cblack[5] = cblack[6] = 0; + } +} +#undef mblack + +void LibRaw::pseudoinverse(double (*in)[3], double (*out)[3], int size) +{ + double work[3][6], num; + int i, j, k; + + for (i = 0; i < 3; i++) + { + for (j = 0; j < 6; j++) + work[i][j] = j == i + 3; + for (j = 0; j < 3; j++) + for (k = 0; k < size && k < 4; k++) + work[i][j] += in[k][i] * in[k][j]; + } + for (i = 0; i < 3; i++) + { + num = work[i][i]; + for (j = 0; j < 6; j++) + if (fabs(num) > 0.00001f) + work[i][j] /= num; + for (k = 0; k < 3; k++) + { + if (k == i) + continue; + num = work[k][i]; + for (j = 0; j < 6; j++) + work[k][j] -= work[i][j] * num; + } + } + for (i = 0; i < size && i < 4; i++) + for (j = 0; j < 3; j++) + for (out[i][j] = k = 0; k < 3; k++) + out[i][j] += work[j][k + 3] * in[i][k]; +} + +void LibRaw::cam_xyz_coeff(float _rgb_cam[3][4], double cam_xyz[4][3]) +{ + double cam_rgb[4][3], inverse[4][3], num; + int i, j, k; + + for (i = 0; i < colors && i < 4; i++) /* Multiply out XYZ colorspace */ + for (j = 0; j < 3; j++) + for (cam_rgb[i][j] = k = 0; k < 3; k++) + cam_rgb[i][j] += cam_xyz[i][k] * LibRaw_constants::xyz_rgb[k][j]; + + for (i = 0; i < colors && i < 4; i++) + { /* Normalize cam_rgb so that */ + for (num = j = 0; j < 3; j++) /* cam_rgb * (1,1,1) is (1,1,1,1) */ + num += cam_rgb[i][j]; + if (num > 0.00001) + { + for (j = 0; j < 3; j++) + cam_rgb[i][j] /= num; + pre_mul[i] = 1 / num; + } + else + { + for (j = 0; j < 3; j++) + cam_rgb[i][j] = 0.0; + pre_mul[i] = 1.0; + } + } + pseudoinverse(cam_rgb, inverse, colors); + for (i = 0; i < 3; i++) + for (j = 0; j < colors && j < 4; j++) + _rgb_cam[i][j] = inverse[j][i]; +} + +void LibRaw::tiff_get(unsigned base, unsigned *tag, unsigned *type, + unsigned *len, unsigned *save) +{ +#ifdef LIBRAW_IOSPACE_CHECK + INT64 pos = ftell(ifp); + INT64 fsize = ifp->size(); + if (fsize < 12 || (fsize - pos) < 12) + throw LIBRAW_EXCEPTION_IO_EOF; +#endif + *tag = get2(); + *type = get2(); + *len = get4(); + *save = ftell(ifp) + 4; + if (*len * tagtype_dataunit_bytes[(*type <= LIBRAW_EXIFTAG_TYPE_IFD8) ? *type : 0] > 4) + fseek(ifp, get4() + base, SEEK_SET); +} diff --git a/rtengine/libraw/src/utils/utils_libraw.cpp b/rtengine/libraw/src/utils/utils_libraw.cpp new file mode 100644 index 000000000..dc81d0dd3 --- /dev/null +++ b/rtengine/libraw/src/utils/utils_libraw.cpp @@ -0,0 +1,742 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/libraw_cxx_defs.h" +#include "../../internal/libraw_checked_buffer.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + void default_data_callback(void *, const char *file, const int offset) + { + if (offset < 0) + fprintf(stderr, "%s: Unexpected end of file\n", + file ? file : "unknown file"); + else + fprintf(stderr, "%s: data corrupted at %d\n", + file ? file : "unknown file", offset); + } + const char *libraw_strerror(int e) + { + enum LibRaw_errors errorcode = (LibRaw_errors)e; + switch (errorcode) + { + case LIBRAW_SUCCESS: + return "No error"; + case LIBRAW_UNSPECIFIED_ERROR: + return "Unspecified error"; + case LIBRAW_FILE_UNSUPPORTED: + return "Unsupported file format or not RAW file"; + case LIBRAW_REQUEST_FOR_NONEXISTENT_IMAGE: + return "Request for nonexisting image number"; + case LIBRAW_OUT_OF_ORDER_CALL: + return "Out of order call of libraw function"; + case LIBRAW_NO_THUMBNAIL: + return "No thumbnail in file"; + case LIBRAW_UNSUPPORTED_THUMBNAIL: + return "Unsupported thumbnail format"; + case LIBRAW_INPUT_CLOSED: + return "No input stream, or input stream closed"; + case LIBRAW_NOT_IMPLEMENTED: + return "Decoder not implemented for this data format"; + case LIBRAW_REQUEST_FOR_NONEXISTENT_THUMBNAIL: + return "Request for nonexisting thumbnail number"; + case LIBRAW_MEMPOOL_OVERFLOW: + return "Libraw internal mempool overflowed"; + case LIBRAW_UNSUFFICIENT_MEMORY: + return "Unsufficient memory"; + case LIBRAW_DATA_ERROR: + return "Corrupted data or unexpected EOF"; + case LIBRAW_IO_ERROR: + return "Input/output error"; + case LIBRAW_CANCELLED_BY_CALLBACK: + return "Cancelled by user callback"; + case LIBRAW_BAD_CROP: + return "Bad crop box"; + case LIBRAW_TOO_BIG: + return "Image too big for processing"; + default: + return "Unknown error code"; + } + } + +#ifdef __cplusplus +} +#endif + +unsigned LibRaw::parse_custom_cameras(unsigned limit, + libraw_custom_camera_t table[], + char **list) +{ + if (!list) + return 0; + unsigned index = 0; + for (unsigned i = 0; i < limit; i++) + { + if (!list[i]) + break; + if (strlen(list[i]) < 10) + continue; + char *string = (char *)malloc(strlen(list[i]) + 1); + strcpy(string, list[i]); + char *start = string; + memset(&table[index], 0, sizeof(table[0])); + for (int j = 0; start && j < 14; j++) + { + char *end = strchr(start, ','); + if (end) + { + *end = 0; + end++; + } // move to next char + while (isspace(*start) && *start) + start++; // skip leading spaces? + unsigned val = strtol(start, 0, 10); + switch (j) + { + case 0: + table[index].fsize = val; + break; + case 1: + table[index].rw = val; + break; + case 2: + table[index].rh = val; + break; + case 3: + table[index].lm = val; + break; + case 4: + table[index].tm = val; + break; + case 5: + table[index].rm = val; + break; + case 6: + table[index].bm = val; + break; + case 7: + table[index].lf = val; + break; + case 8: + table[index].cf = val; + break; + case 9: + table[index].max = val; + break; + case 10: + table[index].flags = val; + break; + case 11: + strncpy(table[index].t_make, start, sizeof(table[index].t_make) - 1); + break; + case 12: + strncpy(table[index].t_model, start, sizeof(table[index].t_model) - 1); + break; + case 13: + table[index].offset = val; + break; + default: + break; + } + start = end; + } + free(string); + if (table[index].t_make[0]) + index++; + } + return index; +} + +void LibRaw::derror() +{ + if (!libraw_internal_data.unpacker_data.data_error && + libraw_internal_data.internal_data.input) + { + if (libraw_internal_data.internal_data.input->eof()) + { + if (callbacks.data_cb) + (*callbacks.data_cb)(callbacks.datacb_data, + libraw_internal_data.internal_data.input->fname(), + -1); + throw LIBRAW_EXCEPTION_IO_EOF; + } + else + { + if (callbacks.data_cb) + (*callbacks.data_cb)(callbacks.datacb_data, + libraw_internal_data.internal_data.input->fname(), + libraw_internal_data.internal_data.input->tell()); + // throw LIBRAW_EXCEPTION_IO_CORRUPT; + } + } + libraw_internal_data.unpacker_data.data_error++; +} + +const char *LibRaw::version() { return LIBRAW_VERSION_STR; } +int LibRaw::versionNumber() { return LIBRAW_VERSION; } +const char *LibRaw::strerror(int p) { return libraw_strerror(p); } + +unsigned LibRaw::capabilities() +{ + unsigned ret = 0; +#ifdef USE_RAWSPEED + ret |= LIBRAW_CAPS_RAWSPEED; +#endif +#ifdef USE_RAWSPEED3 + ret |= LIBRAW_CAPS_RAWSPEED3; +#endif +#ifdef USE_RAWSPEED_BITS + ret |= LIBRAW_CAPS_RAWSPEED_BITS; +#endif +#ifdef USE_DNGSDK + ret |= LIBRAW_CAPS_DNGSDK; +#ifdef USE_GPRSDK + ret |= LIBRAW_CAPS_GPRSDK; +#endif +#ifdef LIBRAW_WIN32_UNICODEPATHS + ret |= LIBRAW_CAPS_UNICODEPATHS; +#endif +#endif +#ifdef USE_X3FTOOLS + ret |= LIBRAW_CAPS_X3FTOOLS; +#endif +#ifdef USE_6BY9RPI + ret |= LIBRAW_CAPS_RPI6BY9; +#endif +#ifdef USE_ZLIB + ret |= LIBRAW_CAPS_ZLIB; +#endif +#ifdef USE_JPEG + ret |= LIBRAW_CAPS_JPEG; +#endif + return ret; +} + +int LibRaw::is_sraw() +{ + return load_raw == &LibRaw::canon_sraw_load_raw || + load_raw == &LibRaw::nikon_load_sraw || + load_raw == &LibRaw::sony_ycbcr_load_raw; +} +int LibRaw::is_coolscan_nef() +{ + return load_raw == &LibRaw::nikon_coolscan_load_raw; +} +int LibRaw::is_jpeg_thumb() +{ + return libraw_internal_data.unpacker_data.thumb_format == LIBRAW_INTERNAL_THUMBNAIL_JPEG; +} + +int LibRaw::is_nikon_sraw() { return load_raw == &LibRaw::nikon_load_sraw; } +int LibRaw::sraw_midpoint() +{ + if (load_raw == &LibRaw::canon_sraw_load_raw) + return 8192; + else if (load_raw == &LibRaw::sony_ycbcr_load_raw) + return 8192; // adjusted as in canon sRAW + else if (load_raw == &LibRaw::nikon_load_sraw) + return 2048; + else + return 0; +} + +void *LibRaw::malloc(size_t t) +{ + void *p = memmgr.malloc(t); + if (!p) + throw LIBRAW_EXCEPTION_ALLOC; + return p; +} +void *LibRaw::realloc(void *q, size_t t) +{ + void *p = memmgr.realloc(q, t); + if (!p) + throw LIBRAW_EXCEPTION_ALLOC; + return p; +} + +void *LibRaw::calloc(size_t n, size_t t) +{ + void *p = memmgr.calloc(n, t); + if (!p) + throw LIBRAW_EXCEPTION_ALLOC; + return p; +} +void LibRaw::free(void *p) { memmgr.free(p); } + +void LibRaw::recycle_datastream() +{ + if (libraw_internal_data.internal_data.input && + libraw_internal_data.internal_data.input_internal) + { + delete libraw_internal_data.internal_data.input; + libraw_internal_data.internal_data.input = NULL; + } + libraw_internal_data.internal_data.input_internal = 0; +} + +void LibRaw::clearCancelFlag() +{ +#ifdef _MSC_VER + InterlockedExchange(&_exitflag, 0); +#else + __sync_fetch_and_and(&_exitflag, 0); +#endif +#ifdef RAWSPEED_FASTEXIT + if (_rawspeed_decoder) + { + RawSpeed::RawDecoder *d = + static_cast(_rawspeed_decoder); + d->resumeProcessing(); + } +#endif +} + +void LibRaw::setCancelFlag() +{ +#ifdef _MSC_VER + InterlockedExchange(&_exitflag, 1); +#else + __sync_fetch_and_add(&_exitflag, 1); +#endif +#ifdef RAWSPEED_FASTEXIT + if (_rawspeed_decoder) + { + RawSpeed::RawDecoder *d = + static_cast(_rawspeed_decoder); + d->cancelProcessing(); + } +#endif +} + +void LibRaw::checkCancel() +{ +#ifdef _MSC_VER + if (InterlockedExchange(&_exitflag, 0)) + throw LIBRAW_EXCEPTION_CANCELLED_BY_CALLBACK; +#else + if (__sync_fetch_and_and(&_exitflag, 0)) + throw LIBRAW_EXCEPTION_CANCELLED_BY_CALLBACK; +#endif +} + +int LibRaw::is_curve_linear() +{ + for (int i = 0; i < 0x10000; i++) + if (imgdata.color.curve[i] != i) + return 0; + return 1; +} + +void LibRaw::free_image(void) +{ + if (imgdata.image) + { + free(imgdata.image); + imgdata.image = 0; + imgdata.progress_flags = LIBRAW_PROGRESS_START | LIBRAW_PROGRESS_OPEN | + LIBRAW_PROGRESS_IDENTIFY | + LIBRAW_PROGRESS_SIZE_ADJUST | + LIBRAW_PROGRESS_LOAD_RAW; + } +} + +int LibRaw::is_phaseone_compressed() +{ + return (load_raw == &LibRaw::phase_one_load_raw_c || + load_raw == &LibRaw::phase_one_load_raw_s || + load_raw == &LibRaw::phase_one_load_raw); +} + +int LibRaw::is_canon_600() { return load_raw == &LibRaw::canon_600_load_raw; } +const char *LibRaw::strprogress(enum LibRaw_progress p) +{ + switch (p) + { + case LIBRAW_PROGRESS_START: + return "Starting"; + case LIBRAW_PROGRESS_OPEN: + return "Opening file"; + case LIBRAW_PROGRESS_IDENTIFY: + return "Reading metadata"; + case LIBRAW_PROGRESS_SIZE_ADJUST: + return "Adjusting size"; + case LIBRAW_PROGRESS_LOAD_RAW: + return "Reading RAW data"; + case LIBRAW_PROGRESS_REMOVE_ZEROES: + return "Clearing zero values"; + case LIBRAW_PROGRESS_BAD_PIXELS: + return "Removing dead pixels"; + case LIBRAW_PROGRESS_DARK_FRAME: + return "Subtracting dark frame data"; + case LIBRAW_PROGRESS_FOVEON_INTERPOLATE: + return "Interpolating Foveon sensor data"; + case LIBRAW_PROGRESS_SCALE_COLORS: + return "Scaling colors"; + case LIBRAW_PROGRESS_PRE_INTERPOLATE: + return "Pre-interpolating"; + case LIBRAW_PROGRESS_INTERPOLATE: + return "Interpolating"; + case LIBRAW_PROGRESS_MIX_GREEN: + return "Mixing green channels"; + case LIBRAW_PROGRESS_MEDIAN_FILTER: + return "Median filter"; + case LIBRAW_PROGRESS_HIGHLIGHTS: + return "Highlight recovery"; + case LIBRAW_PROGRESS_FUJI_ROTATE: + return "Rotating Fuji diagonal data"; + case LIBRAW_PROGRESS_FLIP: + return "Flipping image"; + case LIBRAW_PROGRESS_APPLY_PROFILE: + return "ICC conversion"; + case LIBRAW_PROGRESS_CONVERT_RGB: + return "Converting to RGB"; + case LIBRAW_PROGRESS_STRETCH: + return "Stretching image"; + case LIBRAW_PROGRESS_THUMB_LOAD: + return "Loading thumbnail"; + default: + return "Some strange things"; + } +} +int LibRaw::adjust_sizes_info_only(void) +{ + CHECK_ORDER_LOW(LIBRAW_PROGRESS_IDENTIFY); + + raw2image_start(); + if (O.use_fuji_rotate) + { + if (IO.fuji_width) + { + IO.fuji_width = (IO.fuji_width - 1 + IO.shrink) >> IO.shrink; + S.iwidth = (ushort)(IO.fuji_width / sqrt(0.5)); + S.iheight = (ushort)((S.iheight - IO.fuji_width) / sqrt(0.5)); + } + else + { + if (S.pixel_aspect < 0.995) + S.iheight = (ushort)(S.iheight / S.pixel_aspect + 0.5); + if (S.pixel_aspect > 1.005) + S.iwidth = (ushort)(S.iwidth * S.pixel_aspect + 0.5); + } + } + SET_PROC_FLAG(LIBRAW_PROGRESS_FUJI_ROTATE); + if (S.flip & 4) + { + unsigned short t = S.iheight; + S.iheight = S.iwidth; + S.iwidth = t; + SET_PROC_FLAG(LIBRAW_PROGRESS_FLIP); + } + return 0; +} +int LibRaw::adjust_maximum() +{ + ushort real_max; + float auto_threshold; + + if (O.adjust_maximum_thr < 0.00001) + return LIBRAW_SUCCESS; + else if (O.adjust_maximum_thr > 0.99999) + auto_threshold = LIBRAW_DEFAULT_ADJUST_MAXIMUM_THRESHOLD; + else + auto_threshold = O.adjust_maximum_thr; + + real_max = C.data_maximum; + if (real_max > 0 && real_max < C.maximum && + real_max > C.maximum * auto_threshold) + { + C.maximum = real_max; + } + return LIBRAW_SUCCESS; +} +void LibRaw::adjust_bl() +{ + int clear_repeat = 0; + if (O.user_black >= 0) + { + C.black = O.user_black; + clear_repeat = 1; + } + for (int i = 0; i < 4; i++) + if (O.user_cblack[i] > -1000000) + { + C.cblack[i] = O.user_cblack[i]; + clear_repeat = 1; + } + + if (clear_repeat) + C.cblack[4] = C.cblack[5] = 0; + + // Add common part to cblack[] early + if (imgdata.idata.filters > 1000 && (C.cblack[4] + 1) / 2 == 1 && + (C.cblack[5] + 1) / 2 == 1) + { + int clrs[4]; + int lastg = -1, gcnt = 0; + for (int c = 0; c < 4; c++) + { + clrs[c] = FC(c / 2, c % 2); + if (clrs[c] == 1) + { + gcnt++; + lastg = c; + } + } + if (gcnt > 1 && lastg >= 0) + clrs[lastg] = 3; + for (int c = 0; c < 4; c++) + C.cblack[clrs[c]] += + C.cblack[6 + c / 2 % C.cblack[4] * C.cblack[5] + c % 2 % C.cblack[5]]; + C.cblack[4] = C.cblack[5] = 0; + // imgdata.idata.filters = sfilters; + } + else if (imgdata.idata.filters <= 1000 && C.cblack[4] == 1 && + C.cblack[5] == 1) // Fuji RAF dng + { + for (int c = 0; c < 4; c++) + C.cblack[c] += C.cblack[6]; + C.cblack[4] = C.cblack[5] = 0; + } + // remove common part from C.cblack[] + int i = C.cblack[3]; + int c; + for (c = 0; c < 3; c++) + if (i > (int)C.cblack[c]) + i = C.cblack[c]; + + for (c = 0; c < 4; c++) + C.cblack[c] -= i; // remove common part + C.black += i; + + // Now calculate common part for cblack[6+] part and move it to C.black + + if (C.cblack[4] && C.cblack[5]) + { + i = C.cblack[6]; + for (c = 1; c < int(C.cblack[4] * C.cblack[5]); c++) + if (i > int(C.cblack[6 + c])) + i = C.cblack[6 + c]; + // Remove i from cblack[6+] + int nonz = 0; + for (c = 0; c < int(C.cblack[4] * C.cblack[5]); c++) + { + C.cblack[6 + c] -= i; + if (C.cblack[6 + c]) + nonz++; + } + C.black += i; + if (!nonz) + C.cblack[4] = C.cblack[5] = 0; + } + for (c = 0; c < 4; c++) + C.cblack[c] += C.black; +} +int LibRaw::getwords(char *line, char *words[], int maxwords, int maxlen) +{ + line[maxlen - 1] = 0; + unsigned char *p = (unsigned char*)line; + int nwords = 0; + + while (1) + { + while (isspace(*p)) + p++; + if (*p == '\0') + return nwords; + words[nwords++] = (char*)p; + while (!isspace(*p) && *p != '\0') + p++; + if (*p == '\0') + return nwords; + *p++ = '\0'; + if (nwords >= maxwords) + return nwords; + } +} +int LibRaw::stread(char *buf, size_t len, LibRaw_abstract_datastream *fp) +{ + if (len > 0) + { + int r = fp->read(buf, len, 1); + buf[len - 1] = 0; + return r; + } + else + return 0; +} + +int LibRaw::find_ifd_by_offset(int o) +{ + for(unsigned i = 0; i < libraw_internal_data.identify_data.tiff_nifds && i < LIBRAW_IFD_MAXCOUNT; i++) + if(tiff_ifd[i].offset == o) + return i; + return -1; +} + +short LibRaw::tiff_sget (unsigned save, uchar *buf, unsigned buf_len, INT64 *tag_offset, + unsigned *tag_id, unsigned *tag_type, INT64 *tag_dataoffset, + unsigned *tag_datalen, int *tag_dataunitlen) { + uchar *pos = buf + *tag_offset; + if ((((*tag_offset) + 12) > buf_len) || (*tag_offset < 0)) { // abnormal, tag buffer overrun + return -1; + } + *tag_id = sget2(pos); pos += 2; + *tag_type = sget2(pos); pos += 2; + *tag_datalen = sget4(pos); pos += 4; + *tag_dataunitlen = tagtype_dataunit_bytes[(*tag_type <= LIBRAW_EXIFTAG_TYPE_IFD8) ? *tag_type : 0]; + if ((*tag_datalen * (*tag_dataunitlen)) > 4) { + *tag_dataoffset = sget4(pos) - save; + if ((*tag_dataoffset + *tag_datalen) > buf_len) { // abnormal, tag data buffer overrun + return -2; + } + } else *tag_dataoffset = *tag_offset + 8; + *tag_offset += 12; + return 0; +} + +#define rICC imgdata.sizes.raw_inset_crops +#define S imgdata.sizes +#define RS imgdata.rawdata.sizes +int LibRaw::adjust_to_raw_inset_crop(unsigned mask, float maxcrop) + +{ + int adjindex = -1; + int limwidth = S.width * maxcrop; + int limheight = S.height * maxcrop; + + for(int i = 1; i >= 0; i--) + if (mask & (1<= limwidth && rICC[i].cheight >= limheight) + { + adjindex = i; + break; + } + + if (adjindex >= 0) + { + RS.left_margin = S.left_margin = rICC[adjindex].cleft; + RS.top_margin = S.top_margin = rICC[adjindex].ctop; + RS.width = S.width = MIN(rICC[adjindex].cwidth, int(S.raw_width) - int(S.left_margin)); + RS.height = S.height = MIN(rICC[adjindex].cheight, int(S.raw_height) - int(S.top_margin)); + } + return adjindex + 1; +} + +char** LibRaw::malloc_omp_buffers(int buffer_count, size_t buffer_size) +{ + char** buffers = (char**)calloc(sizeof(char*), buffer_count); + + for (int i = 0; i < buffer_count; i++) + { + buffers[i] = (char*)malloc(buffer_size); + } + return buffers; +} + +void LibRaw::free_omp_buffers(char** buffers, int buffer_count) +{ + for (int i = 0; i < buffer_count; i++) + if(buffers[i]) + free(buffers[i]); + free(buffers); +} + +void LibRaw::libraw_swab(void *arr, size_t len) +{ +#ifdef LIBRAW_OWN_SWAB + uint16_t *array = (uint16_t*)arr; + size_t bytes = len/2; + for(; bytes; --bytes) + { + *array = ((*array << 8) & 0xff00) | ((*array >> 8) & 0xff); + array++; + } +#else + swab((char*)arr,(char*)arr,len); +#endif + +} + +checked_buffer_t::checked_buffer_t(short ord, int size) : _order(ord), storage(size + 64) +{ + _data = storage.data(); + _len = size; +} +checked_buffer_t::checked_buffer_t(short ord, unsigned char *dd, int ss) : _order(ord), _data(dd), _len(ss) {} + +ushort checked_buffer_t::sget2(int offset) +{ + checkoffset(offset + 2); + return libraw_sget2_static(_order, _data + offset); +} +void checked_buffer_t::checkoffset(int off) +{ + if (off >= _len) + throw LIBRAW_EXCEPTION_IO_EOF; +} +unsigned char checked_buffer_t::operator[](int idx) +{ + checkoffset(idx); + return _data[idx]; +} +unsigned checked_buffer_t::sget4(int offset) +{ + checkoffset(offset + 4); + return libraw_sget4_static(_order, _data + offset); +} + +double checked_buffer_t::sgetreal(int type, int offset) +{ + int sz = libraw_tagtype_dataunit_bytes(type); + checkoffset(offset + sz); + return libraw_sgetreal_static(_order, type, _data + offset); +} + +int checked_buffer_t::tiff_sget(unsigned save, INT64 *tag_offset, unsigned *tag_id, unsigned *tag_type, INT64 *tag_dataoffset, + unsigned *tag_datalen, int *tag_dataunitlen) +{ + if ((((*tag_offset) + 12) > _len) || (*tag_offset < 0)) + { // abnormal, tag buffer overrun + return -1; + } + int pos = *tag_offset; + *tag_id = sget2(pos); + pos += 2; + *tag_type = sget2(pos); + pos += 2; + *tag_datalen = sget4(pos); + pos += 4; + *tag_dataunitlen = libraw_tagtype_dataunit_bytes(*tag_type); + if ((*tag_datalen * (*tag_dataunitlen)) > 4) + { + *tag_dataoffset = sget4(pos) - save; + if ((*tag_dataoffset + *tag_datalen) > _len) + { // abnormal, tag data buffer overrun + return -2; + } + } + else + *tag_dataoffset = *tag_offset + 8; + *tag_offset += 12; + return 0; +} + diff --git a/rtengine/libraw/src/write/apply_profile.cpp b/rtengine/libraw/src/write/apply_profile.cpp new file mode 100644 index 000000000..9c8a9fd98 --- /dev/null +++ b/rtengine/libraw/src/write/apply_profile.cpp @@ -0,0 +1,76 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_fileio_defs.h" + +#ifndef NO_LCMS +void LibRaw::apply_profile(const char *input, const char *output) +{ + char *prof; + cmsHPROFILE hInProfile = 0, hOutProfile = 0; + cmsHTRANSFORM hTransform; + FILE *fp; + unsigned size; + + if (strcmp(input, "embed")) + hInProfile = cmsOpenProfileFromFile(input, "r"); + else if (profile_length) + { + hInProfile = cmsOpenProfileFromMem(imgdata.color.profile, profile_length); + } + else + { + imgdata.process_warnings |= LIBRAW_WARN_NO_EMBEDDED_PROFILE; + } + if (!hInProfile) + { + imgdata.process_warnings |= LIBRAW_WARN_NO_INPUT_PROFILE; + return; + } + if (!output) + hOutProfile = cmsCreate_sRGBProfile(); + else if ((fp = fopen(output, "rb"))) + { + fread(&size, 4, 1, fp); + fseek(fp, 0, SEEK_SET); + oprof = (unsigned *)malloc(size = ntohl(size)); + fread(oprof, 1, size, fp); + fclose(fp); + if (!(hOutProfile = cmsOpenProfileFromMem(oprof, size))) + { + free(oprof); + oprof = 0; + } + } + if (!hOutProfile) + { + imgdata.process_warnings |= LIBRAW_WARN_BAD_OUTPUT_PROFILE; + goto quit; + } + RUN_CALLBACK(LIBRAW_PROGRESS_APPLY_PROFILE, 0, 2); + hTransform = cmsCreateTransform(hInProfile, TYPE_RGBA_16, hOutProfile, + TYPE_RGBA_16, INTENT_PERCEPTUAL, 0); + cmsDoTransform(hTransform, image, image, width * height); + raw_color = 1; /* Don't use rgb_cam with a profile */ + cmsDeleteTransform(hTransform); + cmsCloseProfile(hOutProfile); +quit: + cmsCloseProfile(hInProfile); + RUN_CALLBACK(LIBRAW_PROGRESS_APPLY_PROFILE, 1, 2); +} +#endif diff --git a/rtengine/libraw/src/write/file_write.cpp b/rtengine/libraw/src/write/file_write.cpp new file mode 100644 index 000000000..ce9073d13 --- /dev/null +++ b/rtengine/libraw/src/write/file_write.cpp @@ -0,0 +1,338 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/dcraw_defs.h" +#include + +int LibRaw::flip_index(int row, int col) +{ + if (flip & 4) + SWAP(row, col); + if (flip & 2) + row = iheight - 1 - row; + if (flip & 1) + col = iwidth - 1 - col; + return row * iwidth + col; +} + +void LibRaw::tiff_set(struct tiff_hdr *th, ushort *ntag, ushort tag, + ushort type, int count, int val) +{ + struct libraw_tiff_tag *tt; + int c; + + tt = (struct libraw_tiff_tag *)(ntag + 1) + (*ntag)++; + tt->val.i = val; + if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_BYTE) && count <= 4) + FORC(4) tt->val.c[c] = val >> (c << 3); + else if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_ASCII)) + { + count = int(strnlen((char *)th + val, count - 1)) + 1; + if (count <= 4) + FORC(4) tt->val.c[c] = ((char *)th)[val + c]; + } + else if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_SHORT) && count <= 2) + FORC(2) tt->val.s[c] = val >> (c << 4); + tt->count = count; + tt->type = type; + tt->tag = tag; +} + +#define TOFF(ptr) ((char *)(&(ptr)) - (char *)th) + +void LibRaw::tiff_head(struct tiff_hdr *th, int full) +{ + int c, psize = 0; + struct tm *t; + + memset(th, 0, sizeof *th); + th->t_order = htonl(0x4d4d4949) >> 16; + th->magic = 42; + th->ifd = 10; + th->rat[0] = th->rat[2] = 300; + th->rat[1] = th->rat[3] = 1; + FORC(6) th->rat[4 + c] = 1000000; + th->rat[4] *= shutter; + th->rat[6] *= aperture; + th->rat[8] *= focal_len; + strncpy(th->t_desc, desc, 512); + strncpy(th->t_make, make, 64); + strncpy(th->t_model, model, 64); + strcpy(th->soft, "dcraw v" DCRAW_VERSION); + t = localtime(×tamp); + sprintf(th->date, "%04d:%02d:%02d %02d:%02d:%02d", t->tm_year + 1900, + t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec); + strncpy(th->t_artist, artist, 64); + if (full) + { + tiff_set(th, &th->ntag, 254, 4, 1, 0); + tiff_set(th, &th->ntag, 256, 4, 1, width); + tiff_set(th, &th->ntag, 257, 4, 1, height); + tiff_set(th, &th->ntag, 258, 3, colors, output_bps); + if (colors > 2) + th->tag[th->ntag - 1].val.i = TOFF(th->bps); + FORC4 th->bps[c] = output_bps; + tiff_set(th, &th->ntag, 259, 3, 1, 1); + tiff_set(th, &th->ntag, 262, 3, 1, 1 + (colors > 1)); + } + tiff_set(th, &th->ntag, 270, 2, 512, TOFF(th->t_desc)); + tiff_set(th, &th->ntag, 271, 2, 64, TOFF(th->t_make)); + tiff_set(th, &th->ntag, 272, 2, 64, TOFF(th->t_model)); + if (full) + { + if (oprof) + psize = ntohl(oprof[0]); + tiff_set(th, &th->ntag, 273, 4, 1, sizeof *th + psize); + tiff_set(th, &th->ntag, 277, 3, 1, colors); + tiff_set(th, &th->ntag, 278, 4, 1, height); + tiff_set(th, &th->ntag, 279, 4, 1, + height * width * colors * output_bps / 8); + } + else + tiff_set(th, &th->ntag, 274, 3, 1, "12435867"[flip] - '0'); + tiff_set(th, &th->ntag, 282, 5, 1, TOFF(th->rat[0])); + tiff_set(th, &th->ntag, 283, 5, 1, TOFF(th->rat[2])); + tiff_set(th, &th->ntag, 284, 3, 1, 1); + tiff_set(th, &th->ntag, 296, 3, 1, 2); + tiff_set(th, &th->ntag, 305, 2, 32, TOFF(th->soft)); + tiff_set(th, &th->ntag, 306, 2, 20, TOFF(th->date)); + tiff_set(th, &th->ntag, 315, 2, 64, TOFF(th->t_artist)); + tiff_set(th, &th->ntag, 34665, 4, 1, TOFF(th->nexif)); + if (psize) + tiff_set(th, &th->ntag, 34675, 7, psize, sizeof *th); + tiff_set(th, &th->nexif, 33434, 5, 1, TOFF(th->rat[4])); + tiff_set(th, &th->nexif, 33437, 5, 1, TOFF(th->rat[6])); + tiff_set(th, &th->nexif, 34855, 3, 1, iso_speed); + tiff_set(th, &th->nexif, 37386, 5, 1, TOFF(th->rat[8])); + if (gpsdata[1]) + { + uchar latref[4] = { (uchar)(gpsdata[29]),0,0,0 }, + lonref[4] = { (uchar)(gpsdata[30]),0,0,0 }; + tiff_set(th, &th->ntag, 34853, 4, 1, TOFF(th->ngps)); + tiff_set(th, &th->ngps, 0, 1, 4, 0x202); + tiff_set(th, &th->ngps, 1, 2, 2, TOFF(latref)); + tiff_set(th, &th->ngps, 2, 5, 3, TOFF(th->gps[0])); + tiff_set(th, &th->ngps, 3, 2, 2, TOFF(lonref)); + tiff_set(th, &th->ngps, 4, 5, 3, TOFF(th->gps[6])); + tiff_set(th, &th->ngps, 5, 1, 1, gpsdata[31]); + tiff_set(th, &th->ngps, 6, 5, 1, TOFF(th->gps[18])); + tiff_set(th, &th->ngps, 7, 5, 3, TOFF(th->gps[12])); + tiff_set(th, &th->ngps, 18, 2, 12, TOFF(th->gps[20])); + tiff_set(th, &th->ngps, 29, 2, 12, TOFF(th->gps[23])); + memcpy(th->gps, gpsdata, sizeof th->gps); + } +} + +void LibRaw::jpeg_thumb_writer(FILE *tfp, char *t_humb, int t_humb_length) +{ + ushort exif[5]; + struct tiff_hdr th; + fputc(0xff, tfp); + fputc(0xd8, tfp); + if (strcmp(t_humb + 6, "Exif")) + { + memcpy(exif, "\xff\xe1 Exif\0\0", 10); + exif[1] = htons(8 + sizeof th); + fwrite(exif, 1, sizeof exif, tfp); + tiff_head(&th, 0); + fwrite(&th, 1, sizeof th, tfp); + } + fwrite(t_humb + 2, 1, t_humb_length - 2, tfp); +} +void LibRaw::write_ppm_tiff() +{ + try + { + struct tiff_hdr th; + ushort *ppm2; + int c, row, col, soff, rstep, cstep; + int perc, val, total, t_white = 0x2000; + + perc = width * height * auto_bright_thr; + + if (fuji_width) + perc /= 2; + if (!((highlight & ~2) || no_auto_bright)) + for (t_white = c = 0; c < colors; c++) + { + for (val = 0x2000, total = 0; --val > 32;) + if ((total += histogram[c][val]) > perc) + break; + if (t_white < val) + t_white = val; + } + gamma_curve(gamm[0], gamm[1], 2, (t_white << 3) / bright); + iheight = height; + iwidth = width; + if (flip & 4) + SWAP(height, width); + + std::vector ppm(width * colors * output_bps / 8); + ppm2 = (ushort *)ppm.data(); + if (output_tiff) + { + tiff_head(&th, 1); + fwrite(&th, sizeof th, 1, ofp); + if (oprof) + fwrite(oprof, ntohl(oprof[0]), 1, ofp); + } + else if (colors > 3) + { + if(imgdata.params.output_flags & LIBRAW_OUTPUT_FLAGS_PPMMETA) + fprintf(ofp, + "P7\n# EXPTIME=%0.5f\n# TIMESTAMP=%d\n# ISOSPEED=%d\n" + "# APERTURE=%0.1f\n# FOCALLEN=%0.1f\n# MAKE=%s\n# MODEL=%s\n" + "WIDTH %d\nHEIGHT %d\nDEPTH %d\nMAXVAL %d\nTUPLTYPE %s\nENDHDR\n", + shutter, (int)timestamp, (int)iso_speed,aperture, + focal_len, make, model, + width, height, colors, (1 << output_bps) - 1, cdesc); + else + fprintf( + ofp, + "P7\nWIDTH %d\nHEIGHT %d\nDEPTH %d\nMAXVAL %d\nTUPLTYPE %s\nENDHDR\n", + width, height, colors, (1 << output_bps) - 1, cdesc); + } + else + { + if(imgdata.params.output_flags & LIBRAW_OUTPUT_FLAGS_PPMMETA) + fprintf(ofp, "P%d\n# EXPTIME=%0.5f\n# TIMESTAMP=%d\n" + "# ISOSPEED=%d\n# APERTURE=%0.1f\n# FOCALLEN=%0.1f\n" + "# MAKE=%s\n# MODEL=%s\n%d %d\n%d\n", + colors/2+5, + shutter, (int)timestamp, (int)iso_speed,aperture,focal_len, + make,model, + width, height, (1 << output_bps)-1); + else + fprintf(ofp, "P%d\n%d %d\n%d\n", colors / 2 + 5, width, height, + (1 << output_bps) - 1); + } + soff = flip_index(0, 0); + cstep = flip_index(0, 1) - soff; + rstep = flip_index(1, 0) - flip_index(0, width); + for (row = 0; row < height; row++, soff += rstep) + { + for (col = 0; col < width; col++, soff += cstep) + if (output_bps == 8) + FORCC ppm[col * colors + c] = curve[image[soff][c]] >> 8; + else + FORCC ppm2[col * colors + c] = curve[image[soff][c]]; + if (output_bps == 16 && !output_tiff && htons(0x55aa) != 0x55aa) + libraw_swab(ppm2, width * colors * 2); + fwrite(ppm.data(), colors * output_bps / 8, width, ofp); + } + } + catch (...) + { + throw LIBRAW_EXCEPTION_ALLOC; // rethrow + } +} +#if 0 +void LibRaw::ppm_thumb() +{ + try + { + thumb_length = thumb_width * thumb_height * 3; + std::vector thumb(thumb_length); + fprintf(ofp, "P6\n%d %d\n255\n", thumb_width, thumb_height); + fread(thumb.data(), 1, thumb_length, ifp); + fwrite(thumb.data(), 1, thumb_length, ofp); + } + catch (...) + { + throw LIBRAW_EXCEPTION_ALLOC; // rethrow + } +} + +void LibRaw::ppm16_thumb() +{ + try + { + unsigned i; + thumb_length = thumb_width * thumb_height * 3; + std::vector thumb(thumb_length * 2, 0); + read_shorts((ushort *)thumb.data(), thumb_length); + for (i = 0; i < thumb_length; i++) + thumb[i] = ((ushort *)thumb.data())[i] >> 8; + fprintf(ofp, "P6\n%d %d\n255\n", thumb_width, thumb_height); + fwrite(thumb.data(), 1, thumb_length, ofp); + } + catch (...) + { + throw LIBRAW_EXCEPTION_ALLOC; // rethrow + } +} + +void LibRaw::layer_thumb() +{ + try + { + unsigned int i; + int c; + char map[][4] = { "012", "102" }; + + colors = thumb_misc >> 5 & 7; + thumb_length = thumb_width * thumb_height; + std::vector thumb(colors * thumb_length, 0); + fprintf(ofp, "P%d\n%d %d\n255\n", 5 + (colors >> 1), thumb_width, + thumb_height); + fread(thumb.data(), thumb_length, colors, ifp); + for (i = 0; i < thumb_length; i++) + FORCC putc(thumb[i + thumb_length * (map[thumb_misc >> 8][c] - '0')], ofp); + } + catch (...) + { + throw LIBRAW_EXCEPTION_ALLOC; // rethrow + } +} + +void LibRaw::rollei_thumb() +{ + try + { + unsigned i; + thumb_length = thumb_width * thumb_height; + std::vector thumb(thumb_length, 0); + fprintf(ofp, "P6\n%d %d\n255\n", thumb_width, thumb_height); + read_shorts(thumb.data(), thumb_length); + for (i = 0; i < thumb_length; i++) + { + putc(thumb[i] << 3, ofp); + putc(thumb[i] >> 5 << 2, ofp); + putc(thumb[i] >> 11 << 3, ofp); + } + } + catch (...) + { + throw LIBRAW_EXCEPTION_ALLOC; // rethrow + } +} + +void LibRaw::jpeg_thumb() +{ + try + { + std::vector thumb(thumb_length); + fread(thumb.data(), 1, thumb_length, ifp); + jpeg_thumb_writer(ofp, thumb.data(), thumb_length); + } + catch (...) + { + throw LIBRAW_EXCEPTION_ALLOC; // rethrow + } +} +#endif diff --git a/rtengine/libraw/src/write/tiff_writer.cpp b/rtengine/libraw/src/write/tiff_writer.cpp new file mode 100644 index 000000000..f8a126af2 --- /dev/null +++ b/rtengine/libraw/src/write/tiff_writer.cpp @@ -0,0 +1,73 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, + dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. + LibRaw do not use RESTRICTED code from dcraw.c + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +#include "../../internal/libraw_cxx_defs.h" + +int LibRaw::dcraw_ppm_tiff_writer(const char *filename) +{ + CHECK_ORDER_LOW(LIBRAW_PROGRESS_LOAD_RAW); + + if (!imgdata.image) + return LIBRAW_OUT_OF_ORDER_CALL; + + if (!filename) + return ENOENT; + FILE *f = NULL; + if (!strcmp(filename, "-")) + { +#ifdef LIBRAW_WIN32_CALLS + _setmode(_fileno(stdout), _O_BINARY); +#endif + f = stdout; + } + else + f = fopen(filename, "wb"); + + if (!f) + return errno; + + try + { + if (!libraw_internal_data.output_data.histogram) + { + libraw_internal_data.output_data.histogram = + (int(*)[LIBRAW_HISTOGRAM_SIZE])malloc( + sizeof(*libraw_internal_data.output_data.histogram) * 4); + } + libraw_internal_data.internal_data.output = f; + write_ppm_tiff(); + SET_PROC_FLAG(LIBRAW_PROGRESS_FLIP); + libraw_internal_data.internal_data.output = NULL; + if (strcmp(filename, "-")) + fclose(f); + return 0; + } + catch (const LibRaw_exceptions& err) + { + if (strcmp(filename, "-")) + fclose(f); + EXCEPTION_HANDLER(err); + } + catch (const std::bad_alloc&) + { + if (strcmp(filename, "-")) + fclose(f); + EXCEPTION_HANDLER(LIBRAW_EXCEPTION_ALLOC); + } + +} diff --git a/rtengine/libraw/src/write/write_ph.cpp b/rtengine/libraw/src/write/write_ph.cpp new file mode 100644 index 000000000..1c77470f8 --- /dev/null +++ b/rtengine/libraw/src/write/write_ph.cpp @@ -0,0 +1,39 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + Placeholder functions to build LibRaw w/o postprocessing + and preprocessing calls + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + + +#include "../../internal/dcraw_defs.h" +int LibRaw::flip_index(int row, int col) +{ + if (flip & 4) + SWAP(row, col); + if (flip & 2) + row = iheight - 1 - row; + if (flip & 1) + col = iwidth - 1 - col; + return row * iwidth + col; +} + +void LibRaw::write_ppm_tiff(){} +void LibRaw::jpeg_thumb_writer(FILE *tfp, char *t_humb, int t_humb_length){} +#if 0 +void LibRaw::ppm_thumb(){} +void LibRaw::jpeg_thumb(){} +void LibRaw::rollei_thumb(){} +void LibRaw::ppm16_thumb(){} +void LibRaw::layer_thumb(){} +#endif \ No newline at end of file diff --git a/rtengine/libraw/src/x3f/x3f_parse_process.cpp b/rtengine/libraw/src/x3f/x3f_parse_process.cpp new file mode 100644 index 000000000..e704d069f --- /dev/null +++ b/rtengine/libraw/src/x3f/x3f_parse_process.cpp @@ -0,0 +1,722 @@ +/* -*- C++ -*- + * Copyright 2019-2024 LibRaw LLC (info@libraw.org) + * + + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + */ + +/* Library for accessing X3F Files +---------------------------------------------------------------- +BSD-style License +---------------------------------------------------------------- + +* Copyright (c) 2010, Roland Karlsson (roland@proxel.se) +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the organization nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY ROLAND KARLSSON ''AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL ROLAND KARLSSON BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifdef USE_X3FTOOLS + +#include "../../internal/libraw_cxx_defs.h" + +#if defined __sun && defined DS +#undef DS +#endif +#ifdef ID +#undef ID /* used in x3f utils */ +#endif + +#include "../../internal/x3f_tools.h" + +#define Sigma_X3F 22 + +void x3f_clear(void *p) { x3f_delete((x3f_t *)p); } + +static void utf2char(utf16_t *str, char *buffer, unsigned bufsz) +{ + if (bufsz < 1) + return; + buffer[bufsz - 1] = 0; + char *b = buffer; + + while (*str != 0x00 && --bufsz > 0) + { + char *chr = (char *)str; + *b++ = *chr; + str++; + } + *b = 0; +} + +static void *lr_memmem(const void *l, size_t l_len, const void *s, size_t s_len) +{ + char *cur, *last; + const char *cl = (const char *)l; + const char *cs = (const char *)s; + + /* we need something to compare */ + if (l_len == 0 || s_len == 0) + return NULL; + + /* "s" must be smaller or equal to "l" */ + if (l_len < s_len) + return NULL; + + /* special case where s_len == 1 */ + if (s_len == 1) + return (void *)memchr(l, (int)*cs, l_len); + + /* the last position where its possible to find "s" in "l" */ + last = (char *)cl + l_len - s_len; + + for (cur = (char *)cl; cur <= last; cur++) + if (cur[0] == cs[0] && memcmp(cur, cs, s_len) == 0) + return cur; + return NULL; +} + +void LibRaw::parse_x3f() +{ + x3f_t *x3f = x3f_new_from_file(libraw_internal_data.internal_data.input); + if (!x3f) + return; + _x3f_data = x3f; + + x3f_header_t *H = NULL; + + H = &x3f->header; + // Parse RAW size from RAW section + x3f_directory_entry_t *DE = x3f_get_raw(x3f); + if (!DE) + return; + imgdata.sizes.flip = H->rotation; + x3f_directory_entry_header_t *DEH = &DE->header; + x3f_image_data_t *ID = &DEH->data_subsection.image_data; + imgdata.sizes.raw_width = ID->columns; + imgdata.sizes.raw_height = ID->rows; + // Parse other params from property section + + DE = x3f_get_prop(x3f); + if ((x3f_load_data(x3f, DE) == X3F_OK)) + { + // Parse property list + DEH = &DE->header; + x3f_property_list_t *PL = &DEH->data_subsection.property_list; + utf16_t *datap = (utf16_t *)PL->data; + uint32_t maxitems = PL->data_size / sizeof(utf16_t); + if (PL->property_table.size != 0) + { + int i; + x3f_property_t *P = PL->property_table.element; + for (i = 0; i < (int)PL->num_properties; i++) + { + char name[100], value[100]; + int noffset = (P[i].name - datap); + int voffset = (P[i].value - datap); + if (noffset < 0 || noffset > (int)maxitems || voffset < 0 || + voffset > (int)maxitems) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + int maxnsize = maxitems - (P[i].name - datap); + int maxvsize = maxitems - (P[i].value - datap); + utf2char(P[i].name, name, MIN(maxnsize, ((int)sizeof(name)))); + utf2char(P[i].value, value, MIN(maxvsize, ((int)sizeof(value)))); + if (!strcmp(name, "ISO")) + imgdata.other.iso_speed = atoi(value); + if (!strcmp(name, "CAMMANUF")) + strcpy(imgdata.idata.make, value); + if (!strcmp(name, "CAMMODEL")) + strcpy(imgdata.idata.model, value); + if (!strcmp(name, "CAMSERIAL")) + strcpy(imgdata.shootinginfo.BodySerial, value); + if (!strcmp(name, "WB_DESC")) + strcpy(imgdata.color.model2, value); + if (!strcmp(name, "TIME")) + imgdata.other.timestamp = atoi(value); + if (!strcmp(name, "SHUTTER")) + imgdata.other.shutter = atof(value); + if (!strcmp(name, "APERTURE")) + imgdata.other.aperture = atof(value); + if (!strcmp(name, "FLENGTH")) + imgdata.other.focal_len = atof(value); + if (!strcmp(name, "FLEQ35MM")) + imgdata.lens.makernotes.FocalLengthIn35mmFormat = atof(value); + if (!strcmp(name, "IMAGERTEMP")) + MN.common.SensorTemperature = atof(value); + if (!strcmp(name, "LENSARANGE")) + { + char *sp; + imgdata.lens.makernotes.MaxAp4CurFocal = + imgdata.lens.makernotes.MinAp4CurFocal = atof(value); + sp = strrchr(value, ' '); + if (sp) + { + imgdata.lens.makernotes.MinAp4CurFocal = atof(sp); + if (imgdata.lens.makernotes.MaxAp4CurFocal > + imgdata.lens.makernotes.MinAp4CurFocal) + my_swap(float, imgdata.lens.makernotes.MaxAp4CurFocal, + imgdata.lens.makernotes.MinAp4CurFocal); + } + } + if (!strcmp(name, "LENSFRANGE")) + { + char *sp; + imgdata.lens.makernotes.MinFocal = imgdata.lens.makernotes.MaxFocal = + atof(value); + sp = strrchr(value, ' '); + if (sp) + { + imgdata.lens.makernotes.MaxFocal = atof(sp); + if ((imgdata.lens.makernotes.MaxFocal + 0.17f) < + imgdata.lens.makernotes.MinFocal) + my_swap(float, imgdata.lens.makernotes.MaxFocal, + imgdata.lens.makernotes.MinFocal); + } + } + if (!strcmp(name, "LENSMODEL")) + { + char *sp; + imgdata.lens.makernotes.LensID = + strtol(value, &sp, 16); // atoi(value); + if (imgdata.lens.makernotes.LensID) + imgdata.lens.makernotes.LensMount = Sigma_X3F; + } + } + imgdata.idata.raw_count = 1; + load_raw = &LibRaw::x3f_load_raw; + imgdata.sizes.raw_pitch = imgdata.sizes.raw_width * 6; + imgdata.idata.is_foveon = 1; + libraw_internal_data.internal_output_params.raw_color = + 1; // Force adobe coeff + imgdata.color.maximum = 0x3fff; // To be reset by color table + libraw_internal_data.unpacker_data.order = 0x4949; + } + } + else + { + // No property list + // sd Quattro H: 6656x4480, 3328x2240, 5504x3680, 2752x1840 + // dpN Quattro: 5888x3672, 2944x1836 + // sd Quattro: 5888x3776, 2944x1888 + if ((imgdata.sizes.raw_width == 5888) || // Quattro: dp0, dp1, dp2, sd + (imgdata.sizes.raw_width == 2944) || // Quattro: dp0, dp1, dp2, sd + (imgdata.sizes.raw_width == 6656) || // sd Quattro H + (imgdata.sizes.raw_width == 3328) || // sd Quattro H + (imgdata.sizes.raw_width == 5504) || // sd Quattro H APS-C + (imgdata.sizes.raw_width == 2752)) // sd Quattro H APS-C + { + imgdata.idata.raw_count = 1; + load_raw = &LibRaw::x3f_load_raw; + imgdata.sizes.raw_pitch = imgdata.sizes.raw_width * 6; + imgdata.idata.is_foveon = 1; + libraw_internal_data.internal_output_params.raw_color = + 1; // Force adobe coeff + libraw_internal_data.unpacker_data.order = 0x4949; + strcpy(imgdata.idata.make, "SIGMA"); +#if 1 + // Try to find model number in first 2048 bytes; + int pos = libraw_internal_data.internal_data.input->tell(); + libraw_internal_data.internal_data.input->seek(0, SEEK_SET); + unsigned char buf[2048]; + libraw_internal_data.internal_data.input->read(buf, 2048, 1); + libraw_internal_data.internal_data.input->seek(pos, SEEK_SET); + unsigned char *fnd = (unsigned char *)lr_memmem(buf, 2048, "SIGMA dp", 8); + unsigned char *fndsd = + (unsigned char *)lr_memmem(buf, 2048, "sd Quatt", 8); + if (fnd) + { + unsigned char *nm = fnd + 8; + snprintf(imgdata.idata.model, 64, "dp%c Quattro", + *nm <= '9' && *nm >= '0' ? *nm : '2'); + } + else if (fndsd) + { + unsigned char *fndsdQH = (unsigned char *)lr_memmem(fndsd, 20, "sd Quattro H", 12); + if (fndsdQH) + snprintf(imgdata.idata.model, 64, "%s", fndsdQH); + else + snprintf(imgdata.idata.model, 64, "%s", fndsd); + } + else +#endif + if ((imgdata.sizes.raw_width == 6656) || + (imgdata.sizes.raw_width == 3328) || + (imgdata.sizes.raw_width == 5504) || + (imgdata.sizes.raw_width == 2752)) + strcpy(imgdata.idata.model, "sd Quattro H"); + else if ((imgdata.sizes.raw_height == 3776) || + (imgdata.sizes.raw_height == 1888)) + strcpy(imgdata.idata.model, "sd Quattro"); + else // defaulting to dp2 Quattro + strcpy(imgdata.idata.model, "dp2 Quattro"); + } + // else + } + // Try to get thumbnail data + LibRaw_thumbnail_formats format = LIBRAW_THUMBNAIL_UNKNOWN; + if ((DE = x3f_get_thumb_jpeg(x3f))) + { + format = LIBRAW_THUMBNAIL_JPEG; + } + else if ((DE = x3f_get_thumb_plain(x3f))) + { + format = LIBRAW_THUMBNAIL_BITMAP; + } + if (DE) + { + x3f_directory_entry_header_t *_DEH = &DE->header; + x3f_image_data_t *_ID = &_DEH->data_subsection.image_data; + imgdata.thumbnail.twidth = _ID->columns; + imgdata.thumbnail.theight = _ID->rows; + imgdata.thumbnail.tcolors = 3; + imgdata.thumbnail.tformat = format; + libraw_internal_data.internal_data.toffset = DE->input.offset; + libraw_internal_data.unpacker_data.thumb_format = LIBRAW_INTERNAL_THUMBNAIL_X3F; + } + DE = x3f_get_camf(x3f); + if (DE && DE->input.size > 28) + { + libraw_internal_data.unpacker_data.meta_offset = DE->input.offset + 8; + libraw_internal_data.unpacker_data.meta_length = DE->input.size - 28; + } +} + +INT64 LibRaw::x3f_thumb_size() +{ + try + { + x3f_t *x3f = (x3f_t *)_x3f_data; + if (!x3f) + return -1; // No data pointer set + x3f_directory_entry_t *DE = x3f_get_thumb_jpeg(x3f); + if (!DE) + DE = x3f_get_thumb_plain(x3f); + if (!DE) + return -1; + int64_t p = x3f_load_data_size(x3f, DE); + if (p < 0 || p > 0xffffffff) + return -1; + return p; + } + catch (...) + { + return -1; + } +} + +void LibRaw::x3f_thumb_loader() +{ + try + { + x3f_t *x3f = (x3f_t *)_x3f_data; + if (!x3f) + return; // No data pointer set + x3f_directory_entry_t *DE = x3f_get_thumb_jpeg(x3f); + if (!DE) + DE = x3f_get_thumb_plain(x3f); + if (!DE) + return; + if (X3F_OK != x3f_load_data(x3f, DE)) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + x3f_directory_entry_header_t *DEH = &DE->header; + x3f_image_data_t *ID = &DEH->data_subsection.image_data; + imgdata.thumbnail.twidth = ID->columns; + imgdata.thumbnail.theight = ID->rows; + imgdata.thumbnail.tcolors = 3; + if (imgdata.thumbnail.tformat == LIBRAW_THUMBNAIL_JPEG) + { + imgdata.thumbnail.thumb = (char *)malloc(ID->data_size); + memmove(imgdata.thumbnail.thumb, ID->data, ID->data_size); + imgdata.thumbnail.tlength = ID->data_size; + } + else if (imgdata.thumbnail.tformat == LIBRAW_THUMBNAIL_BITMAP) + { + imgdata.thumbnail.tlength = ID->columns * ID->rows * 3; + imgdata.thumbnail.thumb = (char *)malloc(ID->columns * ID->rows * 3); + char *src0 = (char *)ID->data; + for (int row = 0; row < (int)ID->rows; row++) + { + int offset = row * ID->row_stride; + if (offset + ID->columns * 3 > ID->data_size) + break; + char *dest = &imgdata.thumbnail.thumb[row * ID->columns * 3]; + char *src = &src0[offset]; + memmove(dest, src, ID->columns * 3); + } + } + } + catch (...) + { + // do nothing + } +} + +void LibRaw::x3f_dpq_interpolate_rg() +{ + int w = imgdata.sizes.raw_width / 2; + int h = imgdata.sizes.raw_height / 2; + unsigned short *image = (ushort *)imgdata.rawdata.color3_image; + + for (int color = 0; color < 2; color++) + { + for (int y = 2; y < (h - 2); y++) + { + uint16_t *row0 = + &image[imgdata.sizes.raw_width * 3 * (y * 2) + color]; // dst[1] + uint16_t *row1 = + &image[imgdata.sizes.raw_width * 3 * (y * 2 + 1) + color]; // dst1[1] + for (int x = 2; x < (w - 2); x++) + { + row1[0] = row1[3] = row0[3] = row0[0]; + row0 += 6; + row1 += 6; + } + } + } +} + +#ifdef _ABS +#undef _ABS +#endif +#define _ABS(a) ((a) < 0 ? -(a) : (a)) + +#undef CLIP +#define CLIP(value, high) ((value) > (high) ? (high) : (value)) + +void LibRaw::x3f_dpq_interpolate_af(int xstep, int ystep, int scale) +{ + unsigned short *image = (ushort *)imgdata.rawdata.color3_image; + for (int y = 0; + y < imgdata.rawdata.sizes.height + imgdata.rawdata.sizes.top_margin; + y += ystep) + { + if (y < imgdata.rawdata.sizes.top_margin) + continue; + if (y < scale) + continue; + if (y > imgdata.rawdata.sizes.raw_height - scale) + break; + uint16_t *row0 = &image[imgdata.sizes.raw_width * 3 * y]; // Наша строка + uint16_t *row_minus = + &image[imgdata.sizes.raw_width * 3 * (y - scale)]; // Строка выше + uint16_t *row_plus = + &image[imgdata.sizes.raw_width * 3 * (y + scale)]; // Строка ниже + for (int x = 0; + x < imgdata.rawdata.sizes.width + imgdata.rawdata.sizes.left_margin; + x += xstep) + { + if (x < imgdata.rawdata.sizes.left_margin) + continue; + if (x < scale) + continue; + if (x > imgdata.rawdata.sizes.raw_width - scale) + break; + uint16_t *pixel0 = &row0[x * 3]; + uint16_t *pixel_top = &row_minus[x * 3]; + uint16_t *pixel_bottom = &row_plus[x * 3]; + uint16_t *pixel_left = &row0[(x - scale) * 3]; + uint16_t *pixel_right = &row0[(x + scale) * 3]; + uint16_t *pixf = pixel_top; + if (_ABS(pixf[2] - pixel0[2]) > _ABS(pixel_bottom[2] - pixel0[2])) + pixf = pixel_bottom; + if (_ABS(pixf[2] - pixel0[2]) > _ABS(pixel_left[2] - pixel0[2])) + pixf = pixel_left; + if (_ABS(pixf[2] - pixel0[2]) > _ABS(pixel_right[2] - pixel0[2])) + pixf = pixel_right; + int blocal = pixel0[2], bnear = pixf[2]; + if (blocal < (int)imgdata.color.black + 16 || bnear < (int)imgdata.color.black + 16) + { + if (pixel0[0] < imgdata.color.black) + pixel0[0] = imgdata.color.black; + if (pixel0[1] < imgdata.color.black) + pixel0[1] = imgdata.color.black; + pixel0[0] = CLIP( + (pixel0[0] - imgdata.color.black) * 4 + imgdata.color.black, 16383); + pixel0[1] = CLIP( + (pixel0[1] - imgdata.color.black) * 4 + imgdata.color.black, 16383); + } + else + { + float multip = float(bnear - imgdata.color.black) / + float(blocal - imgdata.color.black); + if (pixel0[0] < imgdata.color.black) + pixel0[0] = imgdata.color.black; + if (pixel0[1] < imgdata.color.black) + pixel0[1] = imgdata.color.black; + float pixf0 = pixf[0]; + if (pixf0 < imgdata.color.black) + pixf0 = imgdata.color.black; + float pixf1 = pixf[1]; + if (pixf1 < imgdata.color.black) + pixf1 = imgdata.color.black; + + pixel0[0] = CLIP( + ((float(pixf0 - imgdata.color.black) * multip + + imgdata.color.black) + + ((pixel0[0] - imgdata.color.black) * 3.75 + imgdata.color.black)) / + 2, + 16383); + pixel0[1] = CLIP( + ((float(pixf1 - imgdata.color.black) * multip + + imgdata.color.black) + + ((pixel0[1] - imgdata.color.black) * 3.75 + imgdata.color.black)) / + 2, + 16383); + // pixel0[1] = float(pixf[1]-imgdata.color.black)*multip + + // imgdata.color.black; + } + } + } +} + +void LibRaw::x3f_dpq_interpolate_af_sd(int xstart, int ystart, int xend, + int yend, int xstep, int ystep, + int scale) +{ + unsigned short *image = (ushort *)imgdata.rawdata.color3_image; + for (int y = ystart; y <= yend && y < imgdata.rawdata.sizes.height + + imgdata.rawdata.sizes.top_margin; + y += ystep) + { + uint16_t *row0 = &image[imgdata.sizes.raw_width * 3 * y]; // Наша строка + uint16_t *row1 = + &image[imgdata.sizes.raw_width * 3 * (y + 1)]; // Следующая строка + uint16_t *row_minus = + &image[imgdata.sizes.raw_width * 3 * (y - scale)]; // Строка выше + uint16_t *row_plus = + &image[imgdata.sizes.raw_width * 3 * + (y + scale)]; // Строка ниже AF-point (scale=2 -> ниже row1 + uint16_t *row_minus1 = &image[imgdata.sizes.raw_width * 3 * (y - 1)]; + for (int x = xstart; x < xend && x < imgdata.rawdata.sizes.width + + imgdata.rawdata.sizes.left_margin; + x += xstep) + { + uint16_t *pixel00 = &row0[x * 3]; // Current pixel + float sumR = 0.f, sumG = 0.f; + float cnt = 0.f; + for (int xx = -scale; xx <= scale; xx += scale) + { + sumR += row_minus[(x + xx) * 3]; + sumR += row_plus[(x + xx) * 3]; + sumG += row_minus[(x + xx) * 3 + 1]; + sumG += row_plus[(x + xx) * 3 + 1]; + cnt += 1.f; + if (xx) + { + cnt += 1.f; + sumR += row0[(x + xx) * 3]; + sumG += row0[(x + xx) * 3 + 1]; + } + } + pixel00[0] = sumR / 8.f; + pixel00[1] = sumG / 8.f; + + if (scale == 2) + { + uint16_t *pixel0B = &row0[x * 3 + 3]; // right pixel + uint16_t *pixel1B = &row1[x * 3 + 3]; // right pixel + float sumG0 = 0, sumG1 = 0.f; + float _cnt = 0.f; + for (int xx = -scale; xx <= scale; xx += scale) + { + sumG0 += row_minus1[(x + xx) * 3 + 2]; + sumG1 += row_plus[(x + xx) * 3 + 2]; + _cnt += 1.f; + if (xx) + { + sumG0 += row0[(x + xx) * 3 + 2]; + sumG1 += row1[(x + xx) * 3 + 2]; + _cnt += 1.f; + } + } + if (_cnt > 1.0) + { + pixel0B[2] = sumG0 / _cnt; + pixel1B[2] = sumG1 / _cnt; + } + } + + // uint16_t* pixel10 = &row1[x*3]; // Pixel below current + // uint16_t* pixel_bottom = &row_plus[x*3]; + } + } +} + +void LibRaw::x3f_load_raw() +{ + // already in try/catch + int raise_error = 0; + x3f_t *x3f = (x3f_t *)_x3f_data; + if (!x3f) + return; // No data pointer set + if (X3F_OK == x3f_load_data(x3f, x3f_get_raw(x3f))) + { + x3f_directory_entry_t *DE = x3f_get_raw(x3f); + x3f_directory_entry_header_t *DEH = &DE->header; + x3f_image_data_t *ID = &DEH->data_subsection.image_data; + if (!ID) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + x3f_quattro_t *Q = ID->quattro; + x3f_huffman_t *HUF = ID->huffman; + x3f_true_t *TRU = ID->tru; + uint16_t *data = NULL; + if (ID->rows != S.raw_height || ID->columns != S.raw_width) + { + raise_error = 1; + goto end; + } + if (HUF != NULL) + data = HUF->x3rgb16.data; + if (TRU != NULL) + data = TRU->x3rgb16.data; + if (data == NULL) + { + raise_error = 1; + goto end; + } + + size_t datasize = S.raw_height * S.raw_width * 3 * sizeof(unsigned short); + S.raw_pitch = S.raw_width * 3 * sizeof(unsigned short); + if (!(imgdata.rawdata.raw_alloc = malloc(datasize))) + throw LIBRAW_EXCEPTION_ALLOC; + + imgdata.rawdata.color3_image = (ushort(*)[3])imgdata.rawdata.raw_alloc; + // swap R/B channels for known old cameras + if (!strcasecmp(P1.make, "Polaroid") && !strcasecmp(P1.model, "x530")) + { + ushort(*src)[3] = (ushort(*)[3])data; + for (int p = 0; p < S.raw_height * S.raw_width; p++) + { + imgdata.rawdata.color3_image[p][0] = src[p][2]; + imgdata.rawdata.color3_image[p][1] = src[p][1]; + imgdata.rawdata.color3_image[p][2] = src[p][0]; + } + } + else if (HUF) + memmove(imgdata.rawdata.raw_alloc, data, datasize); + else if (TRU && (!Q || !Q->quattro_layout)) + memmove(imgdata.rawdata.raw_alloc, data, datasize); + else if (TRU && Q) + { + // Move quattro data in place + // R/B plane + for (int prow = 0; prow < (int)TRU->x3rgb16.rows && prow < S.raw_height / 2; + prow++) + { + ushort(*destrow)[3] = + (unsigned short(*)[3]) & + imgdata.rawdata + .color3_image[prow * 2 * S.raw_pitch / 3 / sizeof(ushort)][0]; + ushort(*srcrow)[3] = + (unsigned short(*)[3]) & data[prow * TRU->x3rgb16.row_stride]; + for (int pcol = 0; + pcol < (int)TRU->x3rgb16.columns && pcol < S.raw_width / 2; pcol++) + { + destrow[pcol * 2][0] = srcrow[pcol][0]; + destrow[pcol * 2][1] = srcrow[pcol][1]; + } + } + for (int row = 0; row < (int)Q->top16.rows && row < S.raw_height; row++) + { + ushort(*destrow)[3] = + (unsigned short(*)[3]) & + imgdata.rawdata + .color3_image[row * S.raw_pitch / 3 / sizeof(ushort)][0]; + ushort *srcrow = + (unsigned short *)&Q->top16.data[row * Q->top16.columns]; + for (int col = 0; col < (int)Q->top16.columns && col < S.raw_width; col++) + destrow[col][2] = srcrow[col]; + } + } + +#if 1 + if (TRU && Q && + !(imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_NODP2Q_INTERPOLATEAF)) + { + if (imgdata.sizes.raw_width == 5888 && + imgdata.sizes.raw_height == 3672) // dpN Quattro normal + { + x3f_dpq_interpolate_af(32, 8, 2); + } + else if (imgdata.sizes.raw_width == 5888 && + imgdata.sizes.raw_height == 3776) // sd Quattro normal raw + { + x3f_dpq_interpolate_af_sd(216, 464, imgdata.sizes.raw_width - 1, 3312, + 16, 32, 2); + } + else if (imgdata.sizes.raw_width == 6656 && + imgdata.sizes.raw_height == 4480) // sd Quattro H normal raw + { + x3f_dpq_interpolate_af_sd(232, 592, imgdata.sizes.raw_width - 1, 3920, + 16, 32, 2); + } + else if (imgdata.sizes.raw_width == 3328 && + imgdata.sizes.raw_height == 2240) // sd Quattro H half size + { + x3f_dpq_interpolate_af_sd(116, 296, imgdata.sizes.raw_width - 1, 2200, + 8, 16, 1); + } + else if (imgdata.sizes.raw_width == 5504 && + imgdata.sizes.raw_height == 3680) // sd Quattro H APS-C raw + { + x3f_dpq_interpolate_af_sd(8, 192, imgdata.sizes.raw_width - 1, 3185, 16, + 32, 2); + } + else if (imgdata.sizes.raw_width == 2752 && + imgdata.sizes.raw_height == 1840) // sd Quattro H APS-C half size + { + x3f_dpq_interpolate_af_sd(4, 96, imgdata.sizes.raw_width - 1, 1800, 8, + 16, 1); + } + else if (imgdata.sizes.raw_width == 2944 && + imgdata.sizes.raw_height == 1836) // dpN Quattro small raw + { + x3f_dpq_interpolate_af(16, 4, 1); + } + else if (imgdata.sizes.raw_width == 2944 && + imgdata.sizes.raw_height == 1888) // sd Quattro small + { + x3f_dpq_interpolate_af_sd(108, 232, imgdata.sizes.raw_width - 1, 1656, + 8, 16, 1); + } + } +#endif + if (TRU && Q && Q->quattro_layout && + !(imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_NODP2Q_INTERPOLATERG)) + x3f_dpq_interpolate_rg(); + } + else + raise_error = 1; +end: + if (raise_error) + throw LIBRAW_EXCEPTION_IO_CORRUPT; +} +#endif diff --git a/rtengine/libraw/src/x3f/x3f_utils_patched.cpp b/rtengine/libraw/src/x3f/x3f_utils_patched.cpp new file mode 100644 index 000000000..6b20b9074 --- /dev/null +++ b/rtengine/libraw/src/x3f/x3f_utils_patched.cpp @@ -0,0 +1,2119 @@ +#ifdef USE_X3FTOOLS + +/* Library for accessing X3F Files +---------------------------------------------------------------- +BSD-style License +---------------------------------------------------------------- + +* Copyright (c) 2010, Roland Karlsson (roland@proxel.se) +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the organization nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY ROLAND KARLSSON ''AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL ROLAND KARLSSON BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include "../../internal/libraw_cxx_defs.h" + +#if defined __sun && defined DS +#undef DS +#endif +#ifdef ID +#undef ID /* used in x3f utils */ +#endif + +#include "../../internal/x3f_tools.h" + +/* extern */ int legacy_offset = 0; +/* extern */ bool_t auto_legacy_offset = 1; + +/* --------------------------------------------------------------------- */ +/* Reading and writing - assuming little endian in the file */ +/* --------------------------------------------------------------------- */ + +static int x3f_get1(LibRaw_abstract_datastream *f) +{ + /* Little endian file */ + return f->get_char(); +} + +static int x3f_sget2(uchar *s) { return s[0] | s[1] << 8; } + +static int x3f_get2(LibRaw_abstract_datastream *f) +{ + uchar str[2] = {0xff, 0xff}; + f->read(str, 1, 2); + return x3f_sget2(str); +} + +unsigned x3f_sget4(uchar *s) +{ + return s[0] | s[1] << 8 | s[2] << 16 | s[3] << 24; +} + +unsigned x3f_get4(LibRaw_abstract_datastream *f) +{ + uchar str[4] = {0xff, 0xff, 0xff, 0xff}; + f->read(str, 1, 4); + return x3f_sget4(str); +} + +#define FREE(P) \ + do \ + { \ + free(P); \ + (P) = NULL; \ + } while (0) + +#define PUT_GET_N(_buffer, _size, _file, _func) \ + do \ + { \ + int _left = _size; \ + while (_left != 0) \ + { \ + int _cur = _file->_func(_buffer, 1, _left); \ + if (_cur == 0) \ + { \ + throw LIBRAW_EXCEPTION_IO_CORRUPT; \ + } \ + _left -= _cur; \ + } \ + } while (0) + +#define GET1(_v) \ + do \ + { \ + (_v) = x3f_get1(I->input.file); \ + } while (0) +#define GET2(_v) \ + do \ + { \ + (_v) = x3f_get2(I->input.file); \ + } while (0) +#define GET4(_v) \ + do \ + { \ + (_v) = x3f_get4(I->input.file); \ + } while (0) + +#define GET4F(_v) \ + do \ + { \ + union { \ + int32_t i; \ + float f; \ + } _tmp; \ + _tmp.i = x3f_get4(I->input.file); \ + (_v) = _tmp.f; \ + } while (0) + +#define GETN(_v, _s) PUT_GET_N(_v, _s, I->input.file, read) + +#define GET_TABLE(_T, _GETX, _NUM, _TYPE) \ + do \ + { \ + int _i; \ + (_T).size = (_NUM); \ + (_T).element = \ + (_TYPE *)realloc((_T).element, (_NUM) * sizeof((_T).element[0])); \ + for (_i = 0; _i < (int)(_T).size; _i++) \ + _GETX((_T).element[_i]); \ + } while (0) + +#define GET_PROPERTY_TABLE(_T, _NUM) \ + do \ + { \ + int _i; \ + (_T).size = (_NUM); \ + (_T).element = (x3f_property_t *)realloc( \ + (_T).element, (_NUM) * sizeof((_T).element[0])); \ + for (_i = 0; _i < (int)(_T).size; _i++) \ + { \ + GET4((_T).element[_i].name_offset); \ + GET4((_T).element[_i].value_offset); \ + } \ + } while (0) + +#define GET_TRUE_HUFF_TABLE(_T) \ + do \ + { \ + int _i; \ + (_T).element = NULL; \ + for (_i = 0;; _i++) \ + { \ + (_T).size = _i + 1; \ + (_T).element = (x3f_true_huffman_element_t *)realloc( \ + (_T).element, (_i + 1) * sizeof((_T).element[0])); \ + GET1((_T).element[_i].code_size); \ + GET1((_T).element[_i].code); \ + if ((_T).element[_i].code_size == 0) \ + break; \ + } \ + } while (0) + +/* --------------------------------------------------------------------- */ +/* Allocating Huffman tree help data */ +/* --------------------------------------------------------------------- */ + +static void cleanup_huffman_tree(x3f_hufftree_t *HTP) { free(HTP->nodes); } + +static void new_huffman_tree(x3f_hufftree_t *HTP, int bits) +{ + int leaves = 1 << bits; + + HTP->free_node_index = 0; + HTP->total_node_index = HUF_TREE_MAX_NODES(leaves); + HTP->nodes = (x3f_huffnode_t *)calloc(1, HUF_TREE_MAX_NODES(leaves) * + sizeof(x3f_huffnode_t)); +} + +/* --------------------------------------------------------------------- */ +/* Allocating TRUE engine RAW help data */ +/* --------------------------------------------------------------------- */ + +static void cleanup_true(x3f_true_t **TRUP) +{ + x3f_true_t *TRU = *TRUP; + + if (TRU == NULL) + return; + + FREE(TRU->table.element); + FREE(TRU->plane_size.element); + cleanup_huffman_tree(&TRU->tree); + FREE(TRU->x3rgb16.buf); + + FREE(TRU); + + *TRUP = NULL; +} + +static x3f_true_t *new_true(x3f_true_t **TRUP) +{ + x3f_true_t *TRU = (x3f_true_t *)calloc(1, sizeof(x3f_true_t)); + + cleanup_true(TRUP); + + TRU->table.size = 0; + TRU->table.element = NULL; + TRU->plane_size.size = 0; + TRU->plane_size.element = NULL; + TRU->tree.nodes = NULL; + TRU->x3rgb16.data = NULL; + TRU->x3rgb16.buf = NULL; + + *TRUP = TRU; + + return TRU; +} + +static void cleanup_quattro(x3f_quattro_t **QP) +{ + x3f_quattro_t *Q = *QP; + + if (Q == NULL) + return; + + FREE(Q->top16.buf); + FREE(Q); + + *QP = NULL; +} + +static x3f_quattro_t *new_quattro(x3f_quattro_t **QP) +{ + x3f_quattro_t *Q = (x3f_quattro_t *)calloc(1, sizeof(x3f_quattro_t)); + int i; + + cleanup_quattro(QP); + + for (i = 0; i < TRUE_PLANES; i++) + { + Q->plane[i].columns = 0; + Q->plane[i].rows = 0; + } + + Q->unknown = 0; + + Q->top16.data = NULL; + Q->top16.buf = NULL; + + *QP = Q; + + return Q; +} + +/* --------------------------------------------------------------------- */ +/* Allocating Huffman engine help data */ +/* --------------------------------------------------------------------- */ + +static void cleanup_huffman(x3f_huffman_t **HUFP) +{ + x3f_huffman_t *HUF = *HUFP; + + if (HUF == NULL) + return; + + FREE(HUF->mapping.element); + FREE(HUF->table.element); + cleanup_huffman_tree(&HUF->tree); + FREE(HUF->row_offsets.element); + FREE(HUF->rgb8.buf); + FREE(HUF->x3rgb16.buf); + FREE(HUF); + + *HUFP = NULL; +} + +static x3f_huffman_t *new_huffman(x3f_huffman_t **HUFP) +{ + x3f_huffman_t *HUF = (x3f_huffman_t *)calloc(1, sizeof(x3f_huffman_t)); + + cleanup_huffman(HUFP); + + /* Set all not read data block pointers to NULL */ + HUF->mapping.size = 0; + HUF->mapping.element = NULL; + HUF->table.size = 0; + HUF->table.element = NULL; + HUF->tree.nodes = NULL; + HUF->row_offsets.size = 0; + HUF->row_offsets.element = NULL; + HUF->rgb8.data = NULL; + HUF->rgb8.buf = NULL; + HUF->x3rgb16.data = NULL; + HUF->x3rgb16.buf = NULL; + + *HUFP = HUF; + + return HUF; +} + +/* --------------------------------------------------------------------- */ +/* Creating a new x3f structure from file */ +/* --------------------------------------------------------------------- */ + +/* extern */ x3f_t *x3f_new_from_file(LibRaw_abstract_datastream *infile) +{ + if (!infile) + return NULL; + INT64 fsize = infile->size(); + x3f_t *x3f = (x3f_t *)calloc(1, sizeof(x3f_t)); + if (!x3f) + throw LIBRAW_EXCEPTION_ALLOC; + try + { + x3f_info_t *I = NULL; + x3f_header_t *H = NULL; + x3f_directory_section_t *DS = NULL; + int i, d; + + I = &x3f->info; + I->error = NULL; + I->input.file = infile; + I->output.file = NULL; + + /* Read file header */ + H = &x3f->header; + infile->seek(0, SEEK_SET); + GET4(H->identifier); + + if (H->identifier != X3F_FOVb) + { + free(x3f); + return NULL; + } + + GET4(H->version); + GETN(H->unique_identifier, SIZE_UNIQUE_IDENTIFIER); + /* TODO: the meaning of the rest of the header for version >= 4.0 (Quattro) + * is unknown */ + if (H->version < X3F_VERSION_4_0) + { + GET4(H->mark_bits); + GET4(H->columns); + GET4(H->rows); + GET4(H->rotation); + if (H->version >= X3F_VERSION_2_1) + { + int num_ext_data = + H->version >= X3F_VERSION_3_0 ? NUM_EXT_DATA_3_0 : NUM_EXT_DATA_2_1; + + GETN(H->white_balance, SIZE_WHITE_BALANCE); + if (H->version >= X3F_VERSION_2_3) + GETN(H->color_mode, SIZE_COLOR_MODE); + GETN(H->extended_types, num_ext_data); + for (i = 0; i < num_ext_data; i++) + GET4F(H->extended_data[i]); + } + } + + /* Go to the beginning of the directory */ + infile->seek(-4, SEEK_END); + infile->seek(x3f_get4(infile), SEEK_SET); + + /* Read the directory header */ + DS = &x3f->directory_section; + GET4(DS->identifier); + GET4(DS->version); + GET4(DS->num_directory_entries); + + if (DS->num_directory_entries > 50) + goto _err; // too much direntries, most likely broken file + + if (DS->num_directory_entries > 0) + { + size_t size = DS->num_directory_entries * sizeof(x3f_directory_entry_t); + DS->directory_entry = (x3f_directory_entry_t *)calloc(1, size); + } + + /* Traverse the directory */ + for (d = 0; d < (int)DS->num_directory_entries; d++) + { + x3f_directory_entry_t *DE = &DS->directory_entry[d]; + x3f_directory_entry_header_t *DEH = &DE->header; + uint32_t save_dir_pos; + + /* Read the directory entry info */ + GET4(DE->input.offset); + GET4(DE->input.size); + if (DE->input.offset + DE->input.size > fsize * 2) + goto _err; + + DE->output.offset = 0; + DE->output.size = 0; + + GET4(DE->type); + + /* Save current pos and go to the entry */ + save_dir_pos = infile->tell(); + infile->seek(DE->input.offset, SEEK_SET); + + /* Read the type independent part of the entry header */ + DEH = &DE->header; + GET4(DEH->identifier); + GET4(DEH->version); + + /* NOTE - the tests below could be made on DE->type instead */ + + if (DEH->identifier == X3F_SECp) + { + x3f_property_list_t *PL = &DEH->data_subsection.property_list; + if (!PL) + goto _err; + /* Read the property part of the header */ + GET4(PL->num_properties); + GET4(PL->character_format); + GET4(PL->reserved); + GET4(PL->total_length); + + /* Set all not read data block pointers to NULL */ + PL->data = NULL; + PL->data_size = 0; + } + + if (DEH->identifier == X3F_SECi) + { + x3f_image_data_t *ID = &DEH->data_subsection.image_data; + if (!ID) + goto _err; + /* Read the image part of the header */ + GET4(ID->type); + GET4(ID->format); + ID->type_format = (ID->type << 16) + (ID->format); + GET4(ID->columns); + GET4(ID->rows); + GET4(ID->row_stride); + + /* Set all not read data block pointers to NULL */ + ID->huffman = NULL; + + ID->data = NULL; + ID->data_size = 0; + } + + if (DEH->identifier == X3F_SECc) + { + x3f_camf_t *CAMF = &DEH->data_subsection.camf; + if (!CAMF) + goto _err; + /* Read the CAMF part of the header */ + GET4(CAMF->type); + GET4(CAMF->tN.val0); + GET4(CAMF->tN.val1); + GET4(CAMF->tN.val2); + GET4(CAMF->tN.val3); + + /* Set all not read data block pointers to NULL */ + CAMF->data = NULL; + CAMF->data_size = 0; + + /* Set all not allocated help pointers to NULL */ + CAMF->table.element = NULL; + CAMF->table.size = 0; + CAMF->tree.nodes = NULL; + CAMF->decoded_data = NULL; + CAMF->decoded_data_size = 0; + CAMF->entry_table.element = NULL; + CAMF->entry_table.size = 0; + } + + /* Reset the file pointer back to the directory */ + infile->seek(save_dir_pos, SEEK_SET); + } + + return x3f; + _err: + if (x3f) + { + DS = &x3f->directory_section; + if (DS && DS->directory_entry) + free(DS->directory_entry); + free(x3f); + } + return NULL; + } + catch (...) + { + x3f_directory_section_t *DS = &x3f->directory_section; + if (DS && DS->directory_entry) + free(DS->directory_entry); + free(x3f); + return NULL; + } +} + +/* --------------------------------------------------------------------- */ +/* Clean up an x3f structure */ +/* --------------------------------------------------------------------- */ + +static void free_camf_entry(camf_entry_t *entry) +{ + FREE(entry->property_name); + FREE(entry->property_value); + FREE(entry->matrix_decoded); + FREE(entry->matrix_dim_entry); +} + +/* extern */ x3f_return_t x3f_delete(x3f_t *x3f) +{ + x3f_directory_section_t *DS; + int d; + + if (x3f == NULL) + return X3F_ARGUMENT_ERROR; + + DS = &x3f->directory_section; + if (DS->num_directory_entries > 50) + return X3F_ARGUMENT_ERROR; + + for (d = 0; d < (int)DS->num_directory_entries; d++) + { + x3f_directory_entry_t *DE = &DS->directory_entry[d]; + x3f_directory_entry_header_t *DEH = &DE->header; + if (DEH->identifier == X3F_SECp) + { + x3f_property_list_t *PL = &DEH->data_subsection.property_list; + FREE(PL->property_table.element); + FREE(PL->data); + } + + if (DEH->identifier == X3F_SECi) + { + x3f_image_data_t *ID = &DEH->data_subsection.image_data; + + if (ID) + { + cleanup_huffman(&ID->huffman); + cleanup_true(&ID->tru); + cleanup_quattro(&ID->quattro); + FREE(ID->data); + } + } + + if (DEH->identifier == X3F_SECc) + { + x3f_camf_t *CAMF = &DEH->data_subsection.camf; + int i; + if (CAMF) + { + FREE(CAMF->data); + FREE(CAMF->table.element); + cleanup_huffman_tree(&CAMF->tree); + FREE(CAMF->decoded_data); + for (i = 0; i < (int)CAMF->entry_table.size; i++) + { + free_camf_entry(&CAMF->entry_table.element[i]); + } + } + FREE(CAMF->entry_table.element); + } + } + + FREE(DS->directory_entry); + FREE(x3f); + + return X3F_OK; +} + +/* --------------------------------------------------------------------- */ +/* Getting a reference to a directory entry */ +/* --------------------------------------------------------------------- */ + +/* TODO: all those only get the first instance */ + +static x3f_directory_entry_t *x3f_get(x3f_t *x3f, uint32_t type, + uint32_t image_type) +{ + x3f_directory_section_t *DS; + int d; + + if (x3f == NULL) + return NULL; + + DS = &x3f->directory_section; + + for (d = 0; d < (int)DS->num_directory_entries; d++) + { + x3f_directory_entry_t *DE = &DS->directory_entry[d]; + x3f_directory_entry_header_t *DEH = &DE->header; + + if (DEH->identifier == type) + { + switch (DEH->identifier) + { + case X3F_SECi: + { + x3f_image_data_t *ID = &DEH->data_subsection.image_data; + + if (ID->type_format == image_type) + return DE; + } + break; + default: + return DE; + } + } + } + + return NULL; +} + +/* extern */ x3f_directory_entry_t *x3f_get_raw(x3f_t *x3f) +{ + x3f_directory_entry_t *DE; + + if ((DE = x3f_get(x3f, X3F_SECi, X3F_IMAGE_RAW_HUFFMAN_X530)) != NULL) + return DE; + + if ((DE = x3f_get(x3f, X3F_SECi, X3F_IMAGE_RAW_HUFFMAN_10BIT)) != NULL) + return DE; + + if ((DE = x3f_get(x3f, X3F_SECi, X3F_IMAGE_RAW_TRUE)) != NULL) + return DE; + + if ((DE = x3f_get(x3f, X3F_SECi, X3F_IMAGE_RAW_MERRILL)) != NULL) + return DE; + + if ((DE = x3f_get(x3f, X3F_SECi, X3F_IMAGE_RAW_QUATTRO)) != NULL) + return DE; + + if ((DE = x3f_get(x3f, X3F_SECi, X3F_IMAGE_RAW_SDQ)) != NULL) + return DE; + + if ((DE = x3f_get(x3f, X3F_SECi, X3F_IMAGE_RAW_SDQH)) != NULL) + return DE; + if ((DE = x3f_get(x3f, X3F_SECi, X3F_IMAGE_RAW_SDQH2)) != NULL) + return DE; + + return NULL; +} + +/* extern */ x3f_directory_entry_t *x3f_get_thumb_plain(x3f_t *x3f) +{ + return x3f_get(x3f, X3F_SECi, X3F_IMAGE_THUMB_PLAIN); +} + +/* extern */ x3f_directory_entry_t *x3f_get_thumb_huffman(x3f_t *x3f) +{ + return x3f_get(x3f, X3F_SECi, X3F_IMAGE_THUMB_HUFFMAN); +} + +/* extern */ x3f_directory_entry_t *x3f_get_thumb_jpeg(x3f_t *x3f) +{ + return x3f_get(x3f, X3F_SECi, X3F_IMAGE_THUMB_JPEG); +} + +/* extern */ x3f_directory_entry_t *x3f_get_camf(x3f_t *x3f) +{ + return x3f_get(x3f, X3F_SECc, 0); +} + +/* extern */ x3f_directory_entry_t *x3f_get_prop(x3f_t *x3f) +{ + return x3f_get(x3f, X3F_SECp, 0); +} + +/* For some obscure reason, the bit numbering is weird. It is + generally some kind of "big endian" style - e.g. the bit 7 is the + first in a byte and bit 31 first in a 4 byte int. For patterns in + the huffman pattern table, bit 27 is the first bit and bit 26 the + next one. */ + +#define PATTERN_BIT_POS(_len, _bit) ((_len) - (_bit)-1) +#define MEMORY_BIT_POS(_bit) PATTERN_BIT_POS(8, _bit) + +/* --------------------------------------------------------------------- */ +/* Huffman Decode */ +/* --------------------------------------------------------------------- */ + +/* Make the huffman tree */ + +#ifdef DBG_PRNT +static char *display_code(int length, uint32_t code, char *buffer) +{ + int i; + + for (i = 0; i < length; i++) + { + int pos = PATTERN_BIT_POS(length, i); + buffer[i] = ((code >> pos) & 1) == 0 ? '0' : '1'; + } + + buffer[i] = 0; + + return buffer; +} +#endif + +static x3f_huffnode_t *new_node(x3f_hufftree_t *tree) +{ + if (tree->free_node_index >= tree->total_node_index) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + x3f_huffnode_t *t = &tree->nodes[tree->free_node_index]; + + t->branch[0] = NULL; + t->branch[1] = NULL; + t->leaf = UNDEFINED_LEAF; + + tree->free_node_index++; + + return t; +} + +static void add_code_to_tree(x3f_hufftree_t *tree, int length, uint32_t code, + uint32_t value) +{ + int i; + + x3f_huffnode_t *t = tree->nodes; + + for (i = 0; i < length; i++) + { + int pos = PATTERN_BIT_POS(length, i); + int bit = (code >> pos) & 1; + x3f_huffnode_t *t_next = t->branch[bit]; + + if (t_next == NULL) + t_next = t->branch[bit] = new_node(tree); + + t = t_next; + } + + t->leaf = value; +} + +static void populate_true_huffman_tree(x3f_hufftree_t *tree, + x3f_true_huffman_t *table) +{ + int i; + + new_node(tree); + + for (i = 0; i < (int)table->size; i++) + { + x3f_true_huffman_element_t *element = &table->element[i]; + uint32_t length = element->code_size; + + if (length != 0) + { + /* add_code_to_tree wants the code right adjusted */ + uint32_t code = ((element->code) >> (8 - length)) & 0xff; + uint32_t value = i; + + add_code_to_tree(tree, length, code, value); + +#ifdef DBG_PRNT + { + char buffer[100]; + + x3f_printf(DEBUG, "H %5d : %5x : %5d : %02x %08x (%08x) (%s)\n", i, i, + value, length, code, value, + display_code(length, code, buffer)); + } +#endif + } + } +} + +static void populate_huffman_tree(x3f_hufftree_t *tree, x3f_table32_t *table, + x3f_table16_t *mapping) +{ + int i; + + new_node(tree); + + for (i = 0; i < (int)table->size; i++) + { + uint32_t element = table->element[i]; + + if (element != 0) + { + uint32_t length = HUF_TREE_GET_LENGTH(element); + uint32_t code = HUF_TREE_GET_CODE(element); + uint32_t value; + + /* If we have a valid mapping table - then the value from the + mapping table shall be used. Otherwise we use the current + index in the table as value. */ + if (table->size == mapping->size) + value = mapping->element[i]; + else + value = i; + + add_code_to_tree(tree, length, code, value); + +#ifdef DBG_PRNT + { + char buffer[100]; + + x3f_printf(DEBUG, "H %5d : %5x : %5d : %02x %08x (%08x) (%s)\n", i, i, + value, length, code, element, + display_code(length, code, buffer)); + } +#endif + } + } +} + +#ifdef DBG_PRNT +static void print_huffman_tree(x3f_huffnode_t *t, int length, uint32_t code) +{ + char buf1[100]; + char buf2[100]; + + x3f_printf(DEBUG, "%*s (%s,%s) %s (%s)\n", length, + length < 1 ? "-" : (code & 1) ? "1" : "0", + t->branch[0] == NULL ? "-" : "0", t->branch[1] == NULL ? "-" : "1", + t->leaf == UNDEFINED_LEAF ? "-" + : (sprintf(buf1, "%x", t->leaf), buf1), + display_code(length, code, buf2)); + + code = code << 1; + if (t->branch[0]) + print_huffman_tree(t->branch[0], length + 1, code + 0); + if (t->branch[1]) + print_huffman_tree(t->branch[1], length + 1, code + 1); +} +#endif + +/* Help machinery for reading bits in a memory */ + +typedef struct bit_state_s +{ + uint8_t *next_address; + uint8_t bit_offset; + uint8_t bits[8]; +} bit_state_t; + +static void set_bit_state(bit_state_t *BS, uint8_t *address) +{ + BS->next_address = address; + BS->bit_offset = 8; +} + +static uint8_t get_bit(bit_state_t *BS) +{ + if (BS->bit_offset == 8) + { + uint8_t byte = *BS->next_address; + int i; + + for (i = 7; i >= 0; i--) + { + BS->bits[i] = byte & 1; + byte = byte >> 1; + } + BS->next_address++; + BS->bit_offset = 0; + } + + return BS->bits[BS->bit_offset++]; +} + +/* Decode use the TRUE algorithm */ + +static int32_t get_true_diff(bit_state_t *BS, x3f_hufftree_t *HTP) +{ + int32_t diff; + x3f_huffnode_t *node = &HTP->nodes[0]; + uint8_t bits; + + while (node->branch[0] != NULL || node->branch[1] != NULL) + { + uint8_t bit = get_bit(BS); + x3f_huffnode_t *new_node = node->branch[bit]; + + node = new_node; + if (node == NULL) + { + /* TODO: Shouldn't this be treated as a fatal error? */ + return 0; + } + } + + bits = node->leaf; + + if (bits == 0) + diff = 0; + else + { + uint8_t first_bit = get_bit(BS); + int i; + + diff = first_bit; + + for (i = 1; i < bits; i++) + diff = (diff << 1) + get_bit(BS); + + if (first_bit == 0) + diff -= (1 << bits) - 1; + } + + return diff; +} + +/* This code (that decodes one of the X3F color planes, really is a + decoding of a compression algorithm suited for Bayer CFA data. In + Bayer CFA the data is divided into 2x2 squares that represents + (R,G1,G2,B) data. Those four positions are (in this compression) + treated as one data stream each, where you store the differences to + previous data in the stream. The reason for this is, of course, + that the date is more often than not near to the next data in a + stream that represents the same color. */ + +/* TODO: write more about the compression */ + +static void true_decode_one_color(x3f_image_data_t *ID, int color) +{ + x3f_true_t *TRU = ID->tru; + x3f_quattro_t *Q = ID->quattro; + uint32_t seed = TRU->seed[color]; /* TODO : Is this correct ? */ + int row; + + x3f_hufftree_t *tree = &TRU->tree; + bit_state_t BS; + + int32_t row_start_acc[2][2]; + uint32_t rows = ID->rows; + uint32_t cols = ID->columns; + x3f_area16_t *area = &TRU->x3rgb16; + uint16_t *dst = area->data + color; + + set_bit_state(&BS, TRU->plane_address[color]); + + row_start_acc[0][0] = seed; + row_start_acc[0][1] = seed; + row_start_acc[1][0] = seed; + row_start_acc[1][1] = seed; + + if (ID->type_format == X3F_IMAGE_RAW_QUATTRO || + ID->type_format == X3F_IMAGE_RAW_SDQ || + ID->type_format == X3F_IMAGE_RAW_SDQH || + ID->type_format == X3F_IMAGE_RAW_SDQH2) + { + rows = Q->plane[color].rows; + cols = Q->plane[color].columns; + + if (Q->quattro_layout && color == 2) + { + area = &Q->top16; + dst = area->data; + } + } + else + { + } + + if (rows != area->rows || cols < area->columns) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + for (row = 0; row < (int)rows; row++) + { + int col; + bool_t odd_row = row & 1; + int32_t acc[2]; + + for (col = 0; col < (int)cols; col++) + { + bool_t odd_col = col & 1; + int32_t diff = get_true_diff(&BS, tree); + int32_t prev = col < 2 ? row_start_acc[odd_row][odd_col] : acc[odd_col]; + int32_t value = prev + diff; + + acc[odd_col] = value; + if (col < 2) + row_start_acc[odd_row][odd_col] = value; + + /* Discard additional data at the right for binned Quattro plane 2 */ + if (col >= (int)area->columns) + continue; + + *dst = value; + dst += area->channels; + } + } +} + +static void true_decode(x3f_info_t * /*I*/, x3f_directory_entry_t *DE) +{ + x3f_directory_entry_header_t *DEH = &DE->header; + x3f_image_data_t *ID = &DEH->data_subsection.image_data; + int color; + + for (color = 0; color < 3; color++) + { + true_decode_one_color(ID, color); + } +} + +/* Decode use the huffman tree */ + +static int32_t get_huffman_diff(bit_state_t *BS, x3f_hufftree_t *HTP) +{ + int32_t diff; + x3f_huffnode_t *node = &HTP->nodes[0]; + + while (node->branch[0] != NULL || node->branch[1] != NULL) + { + uint8_t bit = get_bit(BS); + x3f_huffnode_t *new_node = node->branch[bit]; + + node = new_node; + if (node == NULL) + { + /* TODO: Shouldn't this be treated as a fatal error? */ + throw LIBRAW_EXCEPTION_IO_CORRUPT; + return 0; /* unreachable code */ + } + } + + diff = node->leaf; + + return diff; +} + +static void huffman_decode_row(x3f_info_t * /*I*/, x3f_directory_entry_t *DE, + int /*bits*/, int row, int offset, int *minimum) +{ + x3f_directory_entry_header_t *DEH = &DE->header; + x3f_image_data_t *ID = &DEH->data_subsection.image_data; + x3f_huffman_t *HUF = ID->huffman; + + int16_t c[3] = {(int16_t)offset, (int16_t)offset, (int16_t)offset}; + int col; + bit_state_t BS; + + if (HUF->row_offsets.element[row] > ID->data_size - 1) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + set_bit_state(&BS, (uint8_t *)ID->data + HUF->row_offsets.element[row]); + + for (col = 0; col < (int)ID->columns; col++) + { + int color; + + for (color = 0; color < 3; color++) + { + uint16_t c_fix; + + c[color] += get_huffman_diff(&BS, &HUF->tree); + if (c[color] < 0) + { + c_fix = 0; + if (c[color] < *minimum) + *minimum = c[color]; + } + else + { + c_fix = c[color]; + } + + switch (ID->type_format) + { + case X3F_IMAGE_RAW_HUFFMAN_X530: + case X3F_IMAGE_RAW_HUFFMAN_10BIT: + HUF->x3rgb16.data[3 * (row * ID->columns + col) + color] = + (uint16_t)c_fix; + break; + case X3F_IMAGE_THUMB_HUFFMAN: + HUF->rgb8.data[3 * (row * ID->columns + col) + color] = (uint8_t)c_fix; + break; + default: + /* TODO: Shouldn't this be treated as a fatal error? */ + throw LIBRAW_EXCEPTION_IO_CORRUPT; + } + } + } +} + +static void huffman_decode(x3f_info_t *I, x3f_directory_entry_t *DE, int bits) +{ + x3f_directory_entry_header_t *DEH = &DE->header; + x3f_image_data_t *ID = &DEH->data_subsection.image_data; + + int row; + int minimum = 0; + int offset = legacy_offset; + + for (row = 0; row < (int)ID->rows; row++) + huffman_decode_row(I, DE, bits, row, offset, &minimum); + + if (auto_legacy_offset && minimum < 0) + { + offset = -minimum; + for (row = 0; row < (int)ID->rows; row++) + huffman_decode_row(I, DE, bits, row, offset, &minimum); + } +} + +static int32_t get_simple_diff(x3f_huffman_t *HUF, uint16_t index) +{ + if (HUF->mapping.size == 0) + return index; + else + return HUF->mapping.element[index]; +} + +static void simple_decode_row(x3f_info_t * /*I*/, x3f_directory_entry_t *DE, + int bits, int row, int row_stride) +{ + x3f_directory_entry_header_t *DEH = &DE->header; + x3f_image_data_t *ID = &DEH->data_subsection.image_data; + x3f_huffman_t *HUF = ID->huffman; + + if (row*row_stride > (int)(ID->data_size - (ID->columns*sizeof(uint32_t)))) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + uint32_t *data = (uint32_t *)((unsigned char *)ID->data + row * row_stride); + + uint16_t c[3] = {0, 0, 0}; + int col; + + uint32_t mask = 0; + + switch (bits) + { + case 8: + mask = 0x0ff; + break; + case 9: + mask = 0x1ff; + break; + case 10: + mask = 0x3ff; + break; + case 11: + mask = 0x7ff; + break; + case 12: + mask = 0xfff; + break; + default: + mask = 0; + /* TODO: Shouldn't this be treated as a fatal error? */ + throw LIBRAW_EXCEPTION_IO_CORRUPT; + break; + } + + for (col = 0; col < (int)ID->columns; col++) + { + int color; + uint32_t val = data[col]; + + for (color = 0; color < 3; color++) + { + uint16_t c_fix; + c[color] += get_simple_diff(HUF, (val >> (color * bits)) & mask); + + switch (ID->type_format) + { + case X3F_IMAGE_RAW_HUFFMAN_X530: + case X3F_IMAGE_RAW_HUFFMAN_10BIT: + c_fix = (int16_t)c[color] > 0 ? c[color] : 0; + + HUF->x3rgb16.data[3 * (row * ID->columns + col) + color] = c_fix; + break; + case X3F_IMAGE_THUMB_HUFFMAN: + c_fix = (int8_t)c[color] > 0 ? c[color] : 0; + + HUF->rgb8.data[3 * (row * ID->columns + col) + color] = c_fix; + break; + default: + /* TODO: Shouldn't this be treated as a fatal error? */ + throw LIBRAW_EXCEPTION_IO_CORRUPT; + } + } + } +} + +static void simple_decode(x3f_info_t *I, x3f_directory_entry_t *DE, int bits, + int row_stride) +{ + x3f_directory_entry_header_t *DEH = &DE->header; + x3f_image_data_t *ID = &DEH->data_subsection.image_data; + + int row; + + for (row = 0; row < (int)ID->rows; row++) + simple_decode_row(I, DE, bits, row, row_stride); +} + +/* --------------------------------------------------------------------- */ +/* Loading the data in a directory entry */ +/* --------------------------------------------------------------------- */ + +/* First you set the offset to where to start reading the data ... */ + +static void read_data_set_offset(x3f_info_t *I, x3f_directory_entry_t *DE, + uint32_t header_size) +{ + uint32_t i_off = DE->input.offset + header_size; + + I->input.file->seek(i_off, SEEK_SET); +} + +/* ... then you read the data, block for block */ + +static uint32_t read_data_block(void **data, x3f_info_t *I, + x3f_directory_entry_t *DE, uint32_t footer) +{ + INT64 fpos = I->input.file->tell(); + uint32_t size = DE->input.size + DE->input.offset - fpos - footer; + + if (fpos + size > I->input.file->size()) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + *data = (void *)malloc(size); + + GETN(*data, size); + + return size; +} + +static uint32_t data_block_size(void ** /*data*/, x3f_info_t *I, + x3f_directory_entry_t *DE, uint32_t footer) +{ + uint32_t size = + DE->input.size + DE->input.offset - I->input.file->tell() - footer; + return size; +} + +static void x3f_load_image_verbatim(x3f_info_t *I, x3f_directory_entry_t *DE) +{ + x3f_directory_entry_header_t *DEH = &DE->header; + x3f_image_data_t *ID = &DEH->data_subsection.image_data; + if (!ID->data_size) + ID->data_size = read_data_block(&ID->data, I, DE, 0); +} + +static int32_t x3f_load_image_verbatim_size(x3f_info_t *I, + x3f_directory_entry_t *DE) +{ + x3f_directory_entry_header_t *DEH = &DE->header; + x3f_image_data_t *ID = &DEH->data_subsection.image_data; + return data_block_size(&ID->data, I, DE, 0); +} + +static void x3f_load_property_list(x3f_info_t *I, x3f_directory_entry_t *DE) +{ + x3f_directory_entry_header_t *DEH = &DE->header; + x3f_property_list_t *PL = &DEH->data_subsection.property_list; + int i; + + read_data_set_offset(I, DE, X3F_PROPERTY_LIST_HEADER_SIZE); + + GET_PROPERTY_TABLE(PL->property_table, PL->num_properties); + + if (!PL->data_size) + PL->data_size = read_data_block(&PL->data, I, DE, 0); + uint32_t maxoffset = PL->data_size / sizeof(utf16_t) - + 2; // at least 2 chars, value + terminating 0x0000 + + for (i = 0; i < (int)PL->num_properties; i++) + { + x3f_property_t *P = &PL->property_table.element[i]; + if (P->name_offset > maxoffset || P->value_offset > maxoffset) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + P->name = ((utf16_t *)PL->data + P->name_offset); + P->value = ((utf16_t *)PL->data + P->value_offset); + } +} + +static void x3f_load_true(x3f_info_t *I, x3f_directory_entry_t *DE) +{ + x3f_directory_entry_header_t *DEH = &DE->header; + x3f_image_data_t *ID = &DEH->data_subsection.image_data; + x3f_true_t *TRU = new_true(&ID->tru); + x3f_quattro_t *Q = NULL; + int i; + + if (ID->type_format == X3F_IMAGE_RAW_QUATTRO || + ID->type_format == X3F_IMAGE_RAW_SDQ || + ID->type_format == X3F_IMAGE_RAW_SDQH || + ID->type_format == X3F_IMAGE_RAW_SDQH2) + { + Q = new_quattro(&ID->quattro); + + for (i = 0; i < TRUE_PLANES; i++) + { + GET2(Q->plane[i].columns); + GET2(Q->plane[i].rows); + } + + if (Q->plane[0].rows == ID->rows / 2) + { + Q->quattro_layout = 1; + } + else if (Q->plane[0].rows == ID->rows) + { + Q->quattro_layout = 0; + } + else + { + throw LIBRAW_EXCEPTION_IO_CORRUPT; + } + } + + /* Read TRUE header data */ + GET2(TRU->seed[0]); + GET2(TRU->seed[1]); + GET2(TRU->seed[2]); + GET2(TRU->unknown); + GET_TRUE_HUFF_TABLE(TRU->table); + + if (ID->type_format == X3F_IMAGE_RAW_QUATTRO || + ID->type_format == X3F_IMAGE_RAW_SDQ || + ID->type_format == X3F_IMAGE_RAW_SDQH || + ID->type_format == X3F_IMAGE_RAW_SDQH2) + { + GET4(Q->unknown); + } + + GET_TABLE(TRU->plane_size, GET4, TRUE_PLANES, uint32_t); + + /* Read image data */ + if (!ID->data_size) + ID->data_size = read_data_block(&ID->data, I, DE, 0); + + /* TODO: can it be fewer than 8 bits? Maybe taken from TRU->table? */ + new_huffman_tree(&TRU->tree, 8); + + populate_true_huffman_tree(&TRU->tree, &TRU->table); + +#ifdef DBG_PRNT + print_huffman_tree(TRU->tree.nodes, 0, 0); +#endif + + TRU->plane_address[0] = (uint8_t *)ID->data; + for (i = 1; i < TRUE_PLANES; i++) + TRU->plane_address[i] = TRU->plane_address[i - 1] + + (((TRU->plane_size.element[i - 1] + 15) / 16) * 16); + + if ((ID->type_format == X3F_IMAGE_RAW_QUATTRO || + ID->type_format == X3F_IMAGE_RAW_SDQ || + ID->type_format == X3F_IMAGE_RAW_SDQH || + ID->type_format == X3F_IMAGE_RAW_SDQH2) && + Q->quattro_layout) + { + uint32_t columns = Q->plane[0].columns; + uint32_t rows = Q->plane[0].rows; + uint32_t channels = 3; + uint32_t size = columns * rows * channels; + + TRU->x3rgb16.columns = columns; + TRU->x3rgb16.rows = rows; + TRU->x3rgb16.channels = channels; + TRU->x3rgb16.row_stride = columns * channels; + TRU->x3rgb16.buf = malloc(sizeof(uint16_t) * size); + TRU->x3rgb16.data = (uint16_t *)TRU->x3rgb16.buf; + + columns = Q->plane[2].columns; + rows = Q->plane[2].rows; + channels = 1; + size = columns * rows * channels; + + Q->top16.columns = columns; + Q->top16.rows = rows; + Q->top16.channels = channels; + Q->top16.row_stride = columns * channels; + Q->top16.buf = malloc(sizeof(uint16_t) * size); + Q->top16.data = (uint16_t *)Q->top16.buf; + } + else + { + uint32_t size = ID->columns * ID->rows * 3; + + TRU->x3rgb16.columns = ID->columns; + TRU->x3rgb16.rows = ID->rows; + TRU->x3rgb16.channels = 3; + TRU->x3rgb16.row_stride = ID->columns * 3; + TRU->x3rgb16.buf = malloc(sizeof(uint16_t) * size); + TRU->x3rgb16.data = (uint16_t *)TRU->x3rgb16.buf; + } + + true_decode(I, DE); +} + +static void x3f_load_huffman_compressed(x3f_info_t *I, + x3f_directory_entry_t *DE, int bits, + int /*use_map_table*/) +{ + x3f_directory_entry_header_t *DEH = &DE->header; + x3f_image_data_t *ID = &DEH->data_subsection.image_data; + x3f_huffman_t *HUF = ID->huffman; + int table_size = 1 << bits; + int row_offsets_size = ID->rows * sizeof(HUF->row_offsets.element[0]); + + GET_TABLE(HUF->table, GET4, table_size, uint32_t); + + if (!ID->data_size) + ID->data_size = read_data_block(&ID->data, I, DE, row_offsets_size); + + GET_TABLE(HUF->row_offsets, GET4, ID->rows, uint32_t); + + new_huffman_tree(&HUF->tree, bits); + populate_huffman_tree(&HUF->tree, &HUF->table, &HUF->mapping); + + huffman_decode(I, DE, bits); +} + +static void x3f_load_huffman_not_compressed(x3f_info_t *I, + x3f_directory_entry_t *DE, int bits, + int /*use_map_table*/, int row_stride) +{ + x3f_directory_entry_header_t *DEH = &DE->header; + x3f_image_data_t *ID = &DEH->data_subsection.image_data; + + if (!ID->data_size) + ID->data_size = read_data_block(&ID->data, I, DE, 0); + + simple_decode(I, DE, bits, row_stride); +} + +static void x3f_load_huffman(x3f_info_t *I, x3f_directory_entry_t *DE, int bits, + int use_map_table, int row_stride) +{ + x3f_directory_entry_header_t *DEH = &DE->header; + x3f_image_data_t *ID = &DEH->data_subsection.image_data; + x3f_huffman_t *HUF = new_huffman(&ID->huffman); + uint32_t size; + + if (use_map_table) + { + int table_size = 1 << bits; + + GET_TABLE(HUF->mapping, GET2, table_size, uint16_t); + } + + switch (ID->type_format) + { + case X3F_IMAGE_RAW_HUFFMAN_X530: + case X3F_IMAGE_RAW_HUFFMAN_10BIT: + size = ID->columns * ID->rows * 3; + HUF->x3rgb16.columns = ID->columns; + HUF->x3rgb16.rows = ID->rows; + HUF->x3rgb16.channels = 3; + HUF->x3rgb16.row_stride = ID->columns * 3; + HUF->x3rgb16.buf = malloc(sizeof(uint16_t) * size); + HUF->x3rgb16.data = (uint16_t *)HUF->x3rgb16.buf; + break; + case X3F_IMAGE_THUMB_HUFFMAN: + size = ID->columns * ID->rows * 3; + HUF->rgb8.columns = ID->columns; + HUF->rgb8.rows = ID->rows; + HUF->rgb8.channels = 3; + HUF->rgb8.row_stride = ID->columns * 3; + HUF->rgb8.buf = malloc(sizeof(uint8_t) * size); + HUF->rgb8.data = (uint8_t *)HUF->rgb8.buf; + break; + default: + /* TODO: Shouldn't this be treated as a fatal error? */ + throw LIBRAW_EXCEPTION_IO_CORRUPT; + } + + if (row_stride == 0) + return x3f_load_huffman_compressed(I, DE, bits, use_map_table); + else + return x3f_load_huffman_not_compressed(I, DE, bits, use_map_table, + row_stride); +} + +static void x3f_load_pixmap(x3f_info_t *I, x3f_directory_entry_t *DE) +{ + x3f_load_image_verbatim(I, DE); +} + +static uint32_t x3f_load_pixmap_size(x3f_info_t *I, x3f_directory_entry_t *DE) +{ + return x3f_load_image_verbatim_size(I, DE); +} + +static void x3f_load_jpeg(x3f_info_t *I, x3f_directory_entry_t *DE) +{ + x3f_load_image_verbatim(I, DE); +} + +static uint32_t x3f_load_jpeg_size(x3f_info_t *I, x3f_directory_entry_t *DE) +{ + return x3f_load_image_verbatim_size(I, DE); +} + +static void x3f_load_image(x3f_info_t *I, x3f_directory_entry_t *DE) +{ + x3f_directory_entry_header_t *DEH = &DE->header; + x3f_image_data_t *ID = &DEH->data_subsection.image_data; + + if (ID->rows > 65535 || ID->columns > 65535) + throw LIBRAW_EXCEPTION_IO_CORRUPT; + + read_data_set_offset(I, DE, X3F_IMAGE_HEADER_SIZE); + + switch (ID->type_format) + { + case X3F_IMAGE_RAW_TRUE: + case X3F_IMAGE_RAW_MERRILL: + case X3F_IMAGE_RAW_QUATTRO: + case X3F_IMAGE_RAW_SDQ: + case X3F_IMAGE_RAW_SDQH: + case X3F_IMAGE_RAW_SDQH2: + x3f_load_true(I, DE); + break; + case X3F_IMAGE_RAW_HUFFMAN_X530: + case X3F_IMAGE_RAW_HUFFMAN_10BIT: + x3f_load_huffman(I, DE, 10, 1, ID->row_stride); + break; + case X3F_IMAGE_THUMB_PLAIN: + x3f_load_pixmap(I, DE); + break; + case X3F_IMAGE_THUMB_HUFFMAN: + x3f_load_huffman(I, DE, 8, 0, ID->row_stride); + break; + case X3F_IMAGE_THUMB_JPEG: + x3f_load_jpeg(I, DE); + break; + default: + /* TODO: Shouldn't this be treated as a fatal error? */ + throw LIBRAW_EXCEPTION_IO_CORRUPT; + } +} + +// Used only for thumbnail size estimation +static uint32_t x3f_load_image_size(x3f_info_t *I, x3f_directory_entry_t *DE) +{ + x3f_directory_entry_header_t *DEH = &DE->header; + x3f_image_data_t *ID = &DEH->data_subsection.image_data; + + read_data_set_offset(I, DE, X3F_IMAGE_HEADER_SIZE); + + switch (ID->type_format) + { + case X3F_IMAGE_THUMB_PLAIN: + return x3f_load_pixmap_size(I, DE); + case X3F_IMAGE_THUMB_JPEG: + return x3f_load_jpeg_size(I, DE); + break; + default: + return 0; + } +} + +static void x3f_load_camf_decode_type2(x3f_camf_t *CAMF) +{ + uint32_t key = CAMF->t2.crypt_key; + int i; + + CAMF->decoded_data_size = CAMF->data_size; + CAMF->decoded_data = malloc(CAMF->decoded_data_size); + + for (i = 0; i < (int)CAMF->data_size; i++) + { + uint8_t old, _new; + uint32_t tmp; + + old = ((uint8_t *)CAMF->data)[i]; + key = (key * 1597 + 51749) % 244944; + tmp = (uint32_t)(key * ((int64_t)301593171) >> 24); + _new = (uint8_t)(old ^ (uint8_t)(((((key << 8) - tmp) >> 1) + tmp) >> 17)); + ((uint8_t *)CAMF->decoded_data)[i] = _new; + } +} + +/* NOTE: the unpacking in this code is in big respects identical to + true_decode_one_color(). The difference is in the output you + build. It might be possible to make some parts shared. NOTE ALSO: + This means that the meta data is obfuscated using an image + compression algorithm. */ + +static void camf_decode_type4(x3f_camf_t *CAMF) +{ + uint32_t seed = CAMF->t4.decode_bias; + int row; + + uint8_t *dst; + uint32_t dst_size = CAMF->t4.decoded_data_size; + uint8_t *dst_end; + + bool_t odd_dst = 0; + + x3f_hufftree_t *tree = &CAMF->tree; + bit_state_t BS; + + int32_t row_start_acc[2][2]; + uint32_t rows = CAMF->t4.block_count; + uint32_t cols = CAMF->t4.block_size; + + CAMF->decoded_data_size = dst_size; + + CAMF->decoded_data = malloc(CAMF->decoded_data_size); + memset(CAMF->decoded_data, 0, CAMF->decoded_data_size); + + dst = (uint8_t *)CAMF->decoded_data; + dst_end = dst + dst_size; + + set_bit_state(&BS, CAMF->decoding_start); + + row_start_acc[0][0] = seed; + row_start_acc[0][1] = seed; + row_start_acc[1][0] = seed; + row_start_acc[1][1] = seed; + + for (row = 0; row < (int)rows; row++) + { + int col; + bool_t odd_row = row & 1; + int32_t acc[2]; + + /* We loop through all the columns and the rows. But the actual + data is smaller than that, so we break the loop when reaching + the end. */ + for (col = 0; col < (int)cols; col++) + { + bool_t odd_col = col & 1; + int32_t diff = get_true_diff(&BS, tree); + int32_t prev = col < 2 ? row_start_acc[odd_row][odd_col] : acc[odd_col]; + int32_t value = prev + diff; + + acc[odd_col] = value; + if (col < 2) + row_start_acc[odd_row][odd_col] = value; + + switch (odd_dst) + { + case 0: + *dst++ = (uint8_t)((value >> 4) & 0xff); + + if (dst >= dst_end) + { + goto ready; + } + + *dst = (uint8_t)((value << 4) & 0xf0); + break; + case 1: + *dst++ |= (uint8_t)((value >> 8) & 0x0f); + + if (dst >= dst_end) + { + goto ready; + } + + *dst++ = (uint8_t)((value << 0) & 0xff); + + if (dst >= dst_end) + { + goto ready; + } + + break; + } + + odd_dst = !odd_dst; + } /* end col */ + } /* end row */ + +ready:; +} + +static void x3f_load_camf_decode_type4(x3f_camf_t *CAMF) +{ + int i; + uint8_t *p; + x3f_true_huffman_element_t *element = NULL; + + for (i = 0, p = (uint8_t *)CAMF->data; *p != 0; i++) + { + /* TODO: Is this too expensive ??*/ + element = (x3f_true_huffman_element_t *)realloc(element, + (i + 1) * sizeof(*element)); + + element[i].code_size = *p++; + element[i].code = *p++; + } + + CAMF->table.size = i; + CAMF->table.element = element; + + /* TODO: where does the values 28 and 32 come from? */ +#define CAMF_T4_DATA_SIZE_OFFSET 28 +#define CAMF_T4_DATA_OFFSET 32 + CAMF->decoding_size = + *(uint32_t *)((unsigned char *)CAMF->data + CAMF_T4_DATA_SIZE_OFFSET); + CAMF->decoding_start = (uint8_t *)CAMF->data + CAMF_T4_DATA_OFFSET; + + /* TODO: can it be fewer than 8 bits? Maybe taken from TRU->table? */ + new_huffman_tree(&CAMF->tree, 8); + + populate_true_huffman_tree(&CAMF->tree, &CAMF->table); + +#ifdef DBG_PRNT + print_huffman_tree(CAMF->tree.nodes, 0, 0); +#endif + + camf_decode_type4(CAMF); +} + +static void camf_decode_type5(x3f_camf_t *CAMF) +{ + int32_t acc = CAMF->t5.decode_bias; + + uint8_t *dst; + + x3f_hufftree_t *tree = &CAMF->tree; + bit_state_t BS; + + int32_t i; + + CAMF->decoded_data_size = CAMF->t5.decoded_data_size; + CAMF->decoded_data = malloc(CAMF->decoded_data_size); + + dst = (uint8_t *)CAMF->decoded_data; + + set_bit_state(&BS, CAMF->decoding_start); + + for (i = 0; i < (int)CAMF->decoded_data_size; i++) + { + int32_t diff = get_true_diff(&BS, tree); + + acc = acc + diff; + *dst++ = (uint8_t)(acc & 0xff); + } +} + +static void x3f_load_camf_decode_type5(x3f_camf_t *CAMF) +{ + int i; + uint8_t *p; + x3f_true_huffman_element_t *element = NULL; + + for (i = 0, p = (uint8_t *)CAMF->data; *p != 0; i++) + { + /* TODO: Is this too expensive ??*/ + element = (x3f_true_huffman_element_t *)realloc(element, + (i + 1) * sizeof(*element)); + + element[i].code_size = *p++; + element[i].code = *p++; + } + + CAMF->table.size = i; + CAMF->table.element = element; + + /* TODO: where does the values 28 and 32 come from? */ +#define CAMF_T5_DATA_SIZE_OFFSET 28 +#define CAMF_T5_DATA_OFFSET 32 + CAMF->decoding_size = + *(uint32_t *)((uint8_t *)CAMF->data + CAMF_T5_DATA_SIZE_OFFSET); + CAMF->decoding_start = (uint8_t *)CAMF->data + CAMF_T5_DATA_OFFSET; + + /* TODO: can it be fewer than 8 bits? Maybe taken from TRU->table? */ + new_huffman_tree(&CAMF->tree, 8); + + populate_true_huffman_tree(&CAMF->tree, &CAMF->table); + +#ifdef DBG_PRNT + print_huffman_tree(CAMF->tree.nodes, 0, 0); +#endif + + camf_decode_type5(CAMF); +} + +static void x3f_setup_camf_text_entry(camf_entry_t *entry) +{ + entry->text_size = *(uint32_t *)entry->value_address; + entry->text = (char *)entry->value_address + 4; +} + +static void x3f_setup_camf_property_entry(camf_entry_t *entry) +{ + int i; + uint8_t *e = (uint8_t *)entry->entry; + uint8_t *v = (uint8_t *)entry->value_address; + uint32_t num = entry->property_num = *(uint32_t *)v; + uint32_t off = *(uint32_t *)(v + 4); + + entry->property_name = (char **)malloc(num * sizeof(uint8_t *)); + entry->property_value = (uint8_t **)malloc(num * sizeof(uint8_t *)); + + for (i = 0; i < (int)num; i++) + { + uint32_t name_off = off + *(uint32_t *)(v + 8 + 8 * i); + uint32_t value_off = off + *(uint32_t *)(v + 8 + 8 * i + 4); + + entry->property_name[i] = (char *)(e + name_off); + entry->property_value[i] = e + value_off; + } +} + +static void set_matrix_element_info(uint32_t type, uint32_t *size, + matrix_type_t *decoded_type) +{ + switch (type) + { + case 0: + *size = 2; + *decoded_type = M_INT; /* known to be true */ + break; + case 1: + *size = 4; + *decoded_type = M_UINT; /* TODO: unknown ???? */ + break; + case 2: + *size = 4; + *decoded_type = M_UINT; /* TODO: unknown ???? */ + break; + case 3: + *size = 4; + *decoded_type = M_FLOAT; /* known to be true */ + break; + case 5: + *size = 1; + *decoded_type = M_UINT; /* TODO: unknown ???? */ + break; + case 6: + *size = 2; + *decoded_type = M_UINT; /* TODO: unknown ???? */ + break; + default: + throw LIBRAW_EXCEPTION_IO_CORRUPT; + } +} + +static void get_matrix_copy(camf_entry_t *entry) +{ + uint32_t element_size = entry->matrix_element_size; + uint32_t elements = entry->matrix_elements; + int i, size = (entry->matrix_decoded_type == M_FLOAT ? sizeof(double) + : sizeof(uint32_t)) * + elements; + + entry->matrix_decoded = malloc(size); + + switch (element_size) + { + case 4: + switch (entry->matrix_decoded_type) + { + case M_INT: + case M_UINT: + memcpy(entry->matrix_decoded, entry->matrix_data, size); + break; + case M_FLOAT: + for (i = 0; i < (int)elements; i++) + ((double *)entry->matrix_decoded)[i] = + (double)((float *)entry->matrix_data)[i]; + break; + default: + throw LIBRAW_EXCEPTION_IO_CORRUPT; + } + break; + case 2: + switch (entry->matrix_decoded_type) + { + case M_INT: + for (i = 0; i < (int)elements; i++) + ((int32_t *)entry->matrix_decoded)[i] = + (int32_t)((int16_t *)entry->matrix_data)[i]; + break; + case M_UINT: + for (i = 0; i < (int)elements; i++) + ((uint32_t *)entry->matrix_decoded)[i] = + (uint32_t)((uint16_t *)entry->matrix_data)[i]; + break; + default: + throw LIBRAW_EXCEPTION_IO_CORRUPT; + } + break; + case 1: + switch (entry->matrix_decoded_type) + { + case M_INT: + for (i = 0; i < (int)elements; i++) + ((int32_t *)entry->matrix_decoded)[i] = + (int32_t)((int8_t *)entry->matrix_data)[i]; + break; + case M_UINT: + for (i = 0; i < (int)elements; i++) + ((uint32_t *)entry->matrix_decoded)[i] = + (uint32_t)((uint8_t *)entry->matrix_data)[i]; + break; + default: + throw LIBRAW_EXCEPTION_IO_CORRUPT; + } + break; + default: + throw LIBRAW_EXCEPTION_IO_CORRUPT; + } +} + +static void x3f_setup_camf_matrix_entry(camf_entry_t *entry) +{ + int i; + int totalsize = 1; + + uint8_t *e = (uint8_t *)entry->entry; + uint8_t *v = (uint8_t *)entry->value_address; + uint32_t type = entry->matrix_type = *(uint32_t *)(v + 0); + uint32_t dim = entry->matrix_dim = *(uint32_t *)(v + 4); + uint32_t off = entry->matrix_data_off = *(uint32_t *)(v + 8); + camf_dim_entry_t *dentry = entry->matrix_dim_entry = + (camf_dim_entry_t *)malloc(dim * sizeof(camf_dim_entry_t)); + + for (i = 0; i < (int)dim; i++) + { + uint32_t size = dentry[i].size = *(uint32_t *)(v + 12 + 12 * i + 0); + dentry[i].name_offset = *(uint32_t *)(v + 12 + 12 * i + 4); + dentry[i].n = *(uint32_t *)(v + 12 + 12 * i + 8); + dentry[i].name = (char *)(e + dentry[i].name_offset); + + if ((int)dentry[i].n != i) + { + } + + totalsize *= size; + } + + set_matrix_element_info(type, &entry->matrix_element_size, + &entry->matrix_decoded_type); + entry->matrix_data = (void *)(e + off); + + entry->matrix_elements = totalsize; + entry->matrix_used_space = entry->entry_size - off; + + /* This estimate only works for matrices above a certain size */ + entry->matrix_estimated_element_size = entry->matrix_used_space / totalsize; + + get_matrix_copy(entry); +} + +static void x3f_setup_camf_entries(x3f_camf_t *CAMF) +{ + uint8_t *p = (uint8_t *)CAMF->decoded_data; + uint8_t *end = p + CAMF->decoded_data_size; + camf_entry_t *entry = NULL; + int i; + + for (i = 0; p < end; i++) + { + uint32_t *p4 = (uint32_t *)p; + + switch (*p4) + { + case X3F_CMbP: + case X3F_CMbT: + case X3F_CMbM: + break; + default: + goto stop; + } + + /* TODO: lots of realloc - may be inefficient */ + entry = (camf_entry_t *)realloc(entry, (i + 1) * sizeof(camf_entry_t)); + + /* Pointer */ + entry[i].entry = p; + + /* Header */ + entry[i].id = *p4++; + entry[i].version = *p4++; + entry[i].entry_size = *p4++; + entry[i].name_offset = *p4++; + entry[i].value_offset = *p4++; + + /* Compute addresses and sizes */ + entry[i].name_address = (char *)(p + entry[i].name_offset); + entry[i].value_address = p + entry[i].value_offset; + entry[i].name_size = entry[i].value_offset - entry[i].name_offset; + entry[i].value_size = entry[i].entry_size - entry[i].value_offset; + + entry[i].text_size = 0; + entry[i].text = NULL; + entry[i].property_num = 0; + entry[i].property_name = NULL; + entry[i].property_value = NULL; + entry[i].matrix_type = 0; + entry[i].matrix_dim = 0; + entry[i].matrix_data_off = 0; + entry[i].matrix_data = NULL; + entry[i].matrix_dim_entry = NULL; + + entry[i].matrix_decoded = NULL; + + switch (entry[i].id) + { + case X3F_CMbP: + x3f_setup_camf_property_entry(&entry[i]); + break; + case X3F_CMbT: + x3f_setup_camf_text_entry(&entry[i]); + break; + case X3F_CMbM: + x3f_setup_camf_matrix_entry(&entry[i]); + break; + } + + p += entry[i].entry_size; + } + +stop: + + CAMF->entry_table.size = i; + CAMF->entry_table.element = entry; +} + +static void x3f_load_camf(x3f_info_t *I, x3f_directory_entry_t *DE) +{ + x3f_directory_entry_header_t *DEH = &DE->header; + x3f_camf_t *CAMF = &DEH->data_subsection.camf; + + read_data_set_offset(I, DE, X3F_CAMF_HEADER_SIZE); + + if (!CAMF->data_size) + CAMF->data_size = read_data_block(&CAMF->data, I, DE, 0); + + switch (CAMF->type) + { + case 2: /* Older SD9-SD14 */ + x3f_load_camf_decode_type2(CAMF); + break; + case 4: /* TRUE ... Merrill */ + x3f_load_camf_decode_type4(CAMF); + break; + case 5: /* Quattro ... */ + x3f_load_camf_decode_type5(CAMF); + break; + default: + /* TODO: Shouldn't this be treated as a fatal error? */ + throw LIBRAW_EXCEPTION_IO_CORRUPT; + } + + if (CAMF->decoded_data != NULL) + x3f_setup_camf_entries(CAMF); + else + throw LIBRAW_EXCEPTION_IO_CORRUPT; +} + +/* extern */ x3f_return_t x3f_load_data(x3f_t *x3f, x3f_directory_entry_t *DE) +{ + x3f_info_t *I = &x3f->info; + + if (DE == NULL) + return X3F_ARGUMENT_ERROR; + + switch (DE->header.identifier) + { + case X3F_SECp: + x3f_load_property_list(I, DE); + break; + case X3F_SECi: + x3f_load_image(I, DE); + break; + case X3F_SECc: + x3f_load_camf(I, DE); + break; + default: + return X3F_INTERNAL_ERROR; + } + return X3F_OK; +} + +/* extern */ int64_t x3f_load_data_size(x3f_t *x3f, x3f_directory_entry_t *DE) +{ + x3f_info_t *I = &x3f->info; + + if (DE == NULL) + return -1; + + switch (DE->header.identifier) + { + case X3F_SECi: + return x3f_load_image_size(I, DE); + default: + return 0; + } +} + +/* extern */ x3f_return_t x3f_load_image_block(x3f_t *x3f, + x3f_directory_entry_t *DE) +{ + x3f_info_t *I = &x3f->info; + + if (DE == NULL) + return X3F_ARGUMENT_ERROR; + + switch (DE->header.identifier) + { + case X3F_SECi: + read_data_set_offset(I, DE, X3F_IMAGE_HEADER_SIZE); + x3f_load_image_verbatim(I, DE); + break; + default: + throw LIBRAW_EXCEPTION_IO_CORRUPT; + return X3F_INTERNAL_ERROR; /* unreachable code*/ + } + + return X3F_OK; +} + +/* --------------------------------------------------------------------- */ +/* The End */ +/* --------------------------------------------------------------------- */ + +#endif diff --git a/rtengine/libraw/version.sh b/rtengine/libraw/version.sh new file mode 100755 index 000000000..c40036771 --- /dev/null +++ b/rtengine/libraw/version.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +vfile=./libraw/libraw_version.h + +major=`grep LIBRAW_MAJOR_VERSION $vfile |head -1 | awk '{print $3}'` +minor=`grep LIBRAW_MINOR_VERSION $vfile | head -1 | awk '{print $3}'` +patch=`grep LIBRAW_PATCH_VERSION $vfile | head -1 | awk '{print $3}'` +tail=`grep LIBRAW_VERSION_TAIL $vfile | head -1 | awk '{print $3}'` + +if [ x$tail = xRelease ] ; then + echo "$major.$minor.$patch" | awk '{printf $1}' +else + echo "$major.$minor.$patch-$tail" | awk '{printf $1}' +fi + + diff --git a/rtengine/metadata.cc b/rtengine/metadata.cc index 0a55c1424..add935899 100644 --- a/rtengine/metadata.cc +++ b/rtengine/metadata.cc @@ -29,6 +29,7 @@ #include "imagedata.h" #include "../rtgui/version.h" #include "../rtgui/pathutils.h" +#include #if EXIV2_TEST_VERSION(0,28,0) @@ -106,19 +107,6 @@ void clear_metadata_key(Data &data, const Key &key) } } -template -auto to_long(const Iterator &iter, Integer n = Integer{0}) -> decltype( -#if EXIV2_TEST_VERSION(0,28,0) - iter->toInt64() -) { - return iter->toInt64(n); -#else - iter->toLong() -) { - return iter->toLong(n); -#endif -} - } // namespace @@ -312,6 +300,13 @@ void Exiv2Metadata::saveToImage(const Glib::ustring &path, bool preserve_all_tag } dst->exifData()["Exif.Image.Software"] = "RawTherapee " RTVERSION; + + std::time_t t = std::time(nullptr); + char mbstr[20]; + if (std::strftime(mbstr, sizeof(mbstr), "%Y:%m:%d %H:%M:%S", std::localtime(&t))) { + dst->exifData()["Exif.Image.DateTime"] = mbstr; + } + import_exif_pairs(dst->exifData()); import_iptc_pairs(dst->iptcData()); bool xmp_tried = false; diff --git a/rtengine/metadata.h b/rtengine/metadata.h index 7424b2720..75d37d46c 100644 --- a/rtengine/metadata.h +++ b/rtengine/metadata.h @@ -97,4 +97,18 @@ private: static std::unique_ptr cache_; }; +template +auto to_long(const Iterator &iter, Integer n = Integer{0}) -> decltype( +#if EXIV2_TEST_VERSION(0,28,0) + iter->toInt64() +) { + return iter->toInt64(n); +#else + iter->toLong() +) { + return iter->toLong(n); +#endif +} + + } // namespace rtengine diff --git a/rtengine/panasonic_decoders.cc b/rtengine/panasonic_decoders.cc index bbbfb7c20..2a6e4c964 100644 --- a/rtengine/panasonic_decoders.cc +++ b/rtengine/panasonic_decoders.cc @@ -13,14 +13,17 @@ * * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . -*/ + */ #include +#include #include "dcraw.h" +#include "rt_math.h" + // Code adapted from libraw /* -*- C++ -*- - * Copyright 2019 LibRaw LLC (info@libraw.org) + * Copyright (C) 2022-2024 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: @@ -33,6 +36,431 @@ */ +namespace +{ + +using pana8_tags_t = DCraw::PanasonicRW2Info::v8_tags_t; +using ushort = DCraw::ushort; +using INT64 = DCraw::INT64; + +// in 8-byte words, 800kb +#define PANA8_BUFSIZE 102400 + +class pana8_bufio_t +{ +public: + pana8_bufio_t(rtengine::IMFILE *stream, INT64 start, uint32_t len) : + data(PANA8_BUFSIZE), input(stream), baseoffset(start), begin(0), end(0), _size(len) + { + } + uint32_t size() { return ((_size + 7) / 8) * 8; } + uint64_t getQWord(uint32_t offset) + { + if (offset >= begin && offset < end) + return data[offset - begin]; + if (!input) return 0; + refill(offset); + if (offset >= begin && offset < end) + return data[offset - begin]; + return 0; + } + void refill(uint32_t newoffset); + + std::vector data; + rtengine::IMFILE *input; + INT64 baseoffset; + INT64 begin, end; + uint32_t _size; +}; + +struct pana8_param_t { + uint32_t range_shift, gamma_base; + uint32_t tag3A[6]; + uint32_t tag39[6]; + uint32_t tag3B; + uint32_t initial[4]; + uint32_t huff_coeff[17]; + uint32_t tag3B_2; + uint32_t noGammaFlag; + uint64_t hufftable1[17]; + uint64_t hufftable2[17]; + std::vector gammaTable; + std::vector extrahuff; + + pana8_param_t(const pana8_tags_t &init); + int32_t gammaCurve(uint32_t i); + bool DecodeC8( + pana8_bufio_t &bufio, + unsigned int width, unsigned int height, ushort *raw_image, ushort raw_width, ushort raw_height, uint16_t left_margin); + uint32_t GetDBit(uint64_t a2); +}; + +void invertBits(void *buf, size_t size); + +void pana8_bufio_t::refill(uint32_t newoffset) +{ + if (newoffset >= begin && newoffset < end) + return; + uint32_t readwords, remainwords, toread; +#ifdef _OPENMP +#pragma omp critical + { +#endif + fseek(input, baseoffset + newoffset * sizeof(int64_t), SEEK_SET); + remainwords = (_size - newoffset * sizeof(int64_t) + 7) >> 3; + toread = MIN(PANA8_BUFSIZE, remainwords); + uint32_t readbytes = fread(data.data(), 1, toread * sizeof(uint64_t), input); + readwords = (readbytes + 7) >> 3; +#ifdef _OPENMP + } +#endif + + if (INT64(readwords) < INT64(toread) - 1LL) + throw std::runtime_error("Unexpected end of file in CRX bitstream"); + + if (readwords > 0) + invertBits(data.data(), readwords * sizeof(uint64_t)); + begin = newoffset; + end = newoffset + readwords; +} + +struct pana8_base_t { + pana8_base_t() { coeff[0] = coeff[1] = coeff[2] = coeff[3] = 0; } + pana8_base_t(const pana8_base_t &s) { clone(s.coeff); } + void clone(const uint32_t *scoeff) + { // TODO: implement SSE load for SSE-enabled code + coeff[0] = scoeff[0]; + coeff[1] = scoeff[1]; + coeff[2] = scoeff[2]; + coeff[3] = scoeff[3]; + } + uint32_t coeff[4]; +}; + +bool pana8_param_t::DecodeC8(pana8_bufio_t &bufio, unsigned int width, unsigned int height, ushort *raw_image, ushort raw_width, ushort raw_height, uint16_t left_margin) +{ + unsigned halfwidth = width >> 1; + unsigned halfheight = height >> 1; + if (!halfwidth || !halfheight || bufio.size() < 9) + return false; // invalid input + + uint32_t datamax = tag3B_2 >> range_shift; + + pana8_base_t start_coeff; + for (int i = 0; i < 4; i++) + start_coeff.coeff[i] = initial[i] & 0xffffu; + + bool _extrahuff = (extrahuff.size() >= 0x10000); + + uint8_t *big_huff_table = nullptr; + if (_extrahuff) + big_huff_table = extrahuff.data(); + + uint16_t *gammatable = (gammaTable.size() >= 0x10000) && !noGammaFlag ? (uint16_t *)gammaTable.data() : 0; + +#ifdef PANA8_FULLY_BUFFERED + const uint8_t *inputbyteptr = source.data(); + uint32_t jobsz_in_qwords = source.size() >> 3; +#else + uint32_t jobsz_in_qwords = bufio.size() >> 3; +#endif + int32_t doublewidth = 4 * halfwidth; + std::vector outline(4 * doublewidth); + pana8_base_t line_base(start_coeff); + int64_t bittail = 0LL; + int32_t bitportion = 0; + uint32_t inqword = 0u; + + try { + for (uint32_t current_row = 0; current_row < halfheight; current_row++) { + uint8_t *outrowp = outline.data(); + pana8_base_t current_base(line_base); + + for (int32_t col = 0; col < doublewidth; col++) { + uint64_t pixbits; + if (bitportion < 0) { + uint32_t inqword_next = inqword + 1; + if ((int)inqword + 1 >= int(jobsz_in_qwords)) + return false; + bitportion += 64; + uint64_t inputqword = bufio.getQWord(inqword); + uint64_t inputqword_next = bufio.getQWord(inqword_next); + pixbits = (inputqword_next >> bitportion) | (inputqword << (64 - (uint8_t)(bitportion & 0xffu))); + if ((unsigned int)inqword < jobsz_in_qwords) + inqword = inqword_next; + } else { + if ((unsigned int)inqword >= jobsz_in_qwords) + return false; + uint64_t inputqword = bufio.getQWord(inqword); + pixbits = (inputqword >> bitportion) | bittail; + uint32_t step = (bitportion == 0); + if (!bitportion) + bitportion = 64; + inqword += step; + } + int huff_index = 0; + if (_extrahuff) { + huff_index = *(uint8_t *)(big_huff_table + ((pixbits >> 48) & 0xffffu)); + } else { + huff_index = int(GetDBit(pixbits)); + datamax = tag3B_2; + } + int32_t v37 = (huff_coeff[huff_index] >> 24) & 0x1F; + uint32_t hc = huff_coeff[huff_index]; + int64_t v38 = pixbits << (((hc >> 16) & 0xffffu) & 0x1F); + uint64_t v90 = (uint32_t)(huff_index - v37); + int32_t v39 = (uint16_t)((uint64_t)v38 >> ((uint8_t)v37 - (uint8_t)huff_index)) << ((huff_coeff[huff_index] >> 24) & 0xffu); + + if (huff_index - v37 <= 0) + v39 &= 0xffff0000u; + + int32_t delta1; + if (v38 < 0) { + delta1 = (uint16_t)v39; + } else if (huff_index) { + int32_t v40 = -1 << huff_index; + if ((uint8_t)v37) + delta1 = (uint16_t)v39 + v40; + else + delta1 = (uint16_t)v39 + v40 + 1; + } else { + delta1 = 0; + } + + uint32_t v42 = bitportion - ((huff_coeff[huff_index] >> 16) & 0x1F); + int32_t delta2 = uint8_t(v37) ? 1 << (v37 - 1) : 0; + uint32_t *destpixel = (uint32_t *)(outrowp + 16LL * (col >> 2)); + + int32_t delta = delta1 + delta2; + int32_t col_amp_3 = col & 3; + if (col_amp_3 == 2) { + int32_t val = current_base.coeff[1] + delta; + destpixel[1] = uint32_t(rtengine::LIM(val, 0, int(datamax))); + } else if (col_amp_3 == 1) { + int32_t val = current_base.coeff[2] + delta; + destpixel[2] = uint32_t(rtengine::LIM(val, 0, int(datamax))); + } else if ((col & 3) != 0) { // == 3 + int32_t val = current_base.coeff[3] + delta; + destpixel[3] = uint32_t(rtengine::LIM(val, 0, int(datamax))); + } else { // 0 + int32_t val = current_base.coeff[0] + delta; + destpixel[0] = uint32_t(rtengine::LIM(val, 0, int(datamax))); + } + if (huff_index <= v37) + v90 = 0LL; + bittail = v38 << v90; + bitportion = int32_t(v42 - v90); + + if (col_amp_3 == 3) + current_base.clone((uint32_t *)(outrowp + 16LL * (col >> 2))); + if (col == 3) + line_base.clone((uint32_t *)(outrowp)); + } + + int destrow = current_row * 2; + uint16_t *destrow0 = raw_image + (destrow * raw_width) + left_margin; + uint16_t *destrow1 = + raw_image + (destrow + 1) * raw_width + left_margin; + uint16_t *srcrow = (uint16_t *)(outrowp); + if (gammatable) { + for (unsigned col = 0; col < width - 1; col += 2) { + const int c6 = col * 4; + destrow0[col] = gammatable[srcrow[c6]]; + destrow0[col + 1] = gammatable[srcrow[c6 + 2]]; + destrow1[col] = gammatable[srcrow[c6 + 4]]; + destrow1[col + 1] = gammatable[srcrow[c6 + 6]]; + } + } else { + for (unsigned col = 0; col < width - 1; col += 2) { + const int c6 = col * 4; + destrow0[col] = srcrow[c6]; + destrow0[col + 1] = srcrow[c6 + 2]; + destrow1[col] = srcrow[c6 + 4]; + destrow1[col + 1] = srcrow[c6 + 6]; + } + } + } + } catch (...) { // buffer read may throw an exception + return false; + } + + return true; +} + +uint32_t pana8_param_t::GetDBit(uint64_t a2) +{ + for (int i = 0; i < 16; i++) { + if ((a2 & hufftable2[i]) == hufftable1[i]) + return i; + } + + return uint32_t((hufftable2[16] & a2) == hufftable1[16]) ^ 0x11u; +} + +pana8_param_t::pana8_param_t(const pana8_tags_t &meta) : + gammaTable(0) +{ + range_shift = gamma_base = tag3B = 0; + + memset(tag3A, 0, sizeof(tag3A)); + memset(tag39, 0, sizeof(tag3A)); + memset(tag3A, 0, sizeof(tag3A)); + memset(initial, 0, sizeof(tag3A)); + memset(huff_coeff, 0, sizeof(tag3A)); + memset(hufftable1, 0, sizeof(tag3A)); + memset(hufftable2, 0, sizeof(tag3A)); + + noGammaFlag = 1; + + for (int i = 0; i < 6; i++) { + tag3A[i] = meta.tag3A[i]; + tag39[i] = meta.tag39[i]; + } + + tag3B_2 = tag3B = meta.tag3B; + + for (int i = 0; i < 4; i++) + initial[i] = meta.initial[i]; + + for (int i = 0; i < 17; i++) + huff_coeff[i] = (uint32_t(meta.tag41[i]) << 24) | (uint32_t(meta.tag40a[i]) << 16) | meta.tag40b[i]; + + std::vector tempGamma(0x10000); + for (unsigned i = 0; i < 0x10000; i++) { + uint64_t val = gammaCurve(i); + tempGamma[i] = uint16_t(val & 0xffffu); + if (i != val) + noGammaFlag = 0; + } + + if (!noGammaFlag) + gammaTable = tempGamma; + + int v7 = 0; + + for (unsigned hindex = 0; hindex < 17; hindex++) { + uint32_t hc = huff_coeff[hindex]; + uint32_t hlow = (hc >> 16) & 0x1F; + int16_t v8 = 0; + if ((hc & 0x1F0000) != 0) { + int h7 = ((hc >> 16) & 0xffffu) & 7; + if (hlow - 1 >= 7) { + uint32_t hdiff = h7 - hlow; + v8 = 0; + do { + v8 = (v8 << 8) | 0xFFu; + hdiff += 8; + } while (hdiff); + } else { + v8 = 0; + } + for (; h7; --h7) { + v8 = 2 * v8 + 1; + } + } + + uint16_t v9 = hc & v8; + if (uint32_t(v7) < hlow) { + v7 = ((huff_coeff[hindex] >> 16) & 0xFFFFu) & 0x1F; + } + hufftable2[hindex] = 0xFFFFULL << (64 - hlow); + hufftable1[hindex] = (uint64_t)v9 << (64 - hlow); + } + + if (v7 < 17) { + if (extrahuff.size() < 0x10000) + extrahuff.resize(0x10000); + uint64_t v17 = 0LL; + + for (int j = 0LL; j < 0x10000; ++j) { + extrahuff[j] = uint8_t(GetDBit(v17) & 0xffu); + v17 += 0x1000000000000ULL; + } + } +} + +int32_t pana8_param_t::gammaCurve(uint32_t idx) +{ + unsigned int v2 = idx | 0xFFFF0000; + if ((idx & 0x10000) == 0) + v2 = idx & 0x1FFFF; + + int v3 = gamma_base + v2; + unsigned int v4 = MIN(v3, 0xFFFF); + + int v5 = 0; + if ((v4 & 0x80000000) != 0) + v4 = 0; + + if (v4 >= (0xFFFF & tag3A[1])) { + v5 = 1; + if (v4 >= (0xFFFF & tag3A[2])) { + v5 = 2; + if (v4 >= (0xFFFF & tag3A[3])) { + v5 = 3; + if (v4 >= (0xFFFF & tag3A[4])) + v5 = ((v4 | 0x500000000LL) - (uint64_t)(0xFFFF & tag3A[5])) >> 32; + } + } + } + unsigned int v6 = tag3A[v5]; + int v7 = tag39[v5]; + unsigned int v8 = v4 - (uint16_t)v6; + char v9 = v7 & 0x1F; + int64_t result = 0; + + if (v9 == 31) { + result = v5 == 5 ? 0xFFFFLL : ((tag3A[v5 + 1] >> 16) & 0xFFFF); + return MIN(uint32_t(result), tag3B); + } + if ((v7 & 0x10) == 0) { + if (v9 == 15) { + result = ((v6 >> 16) & 0xFFFF); + return MIN(uint32_t(result), tag3B); + } else if (v9 != 0) { + v8 = (v8 + (1 << (v9 - 1))) >> v9; + } + } else { + v8 <<= v7 & 0xF; + } + + result = v8 + ((v6 >> 16) & 0xFFFF); + + return MIN(uint32_t(result), tag3B); +} + +const static uint8_t _bitRevTable[256] = { + 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, 0x08, 0x88, 0x48, + 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, + 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, + 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC, 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, + 0x32, 0xB2, 0x72, 0xF2, 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, + 0xFA, 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, 0x0E, 0x8E, + 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, 0x01, 0x81, 0x41, 0xC1, 0x21, + 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1, 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, + 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9, 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, + 0xD5, 0x35, 0xB5, 0x75, 0xF5, 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, + 0x7D, 0xFD, 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, 0x0B, + 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, 0x07, 0x87, 0x47, 0xC7, + 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, + 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF}; + +void invertBits(void *buf, size_t size) +{ + unsigned sz = unsigned(size / 8); + uint64_t *ptr = static_cast(buf); + for (unsigned i = 0; i < sz; i++) { + uint8_t *b = reinterpret_cast(&ptr[i]); + uint64_t r = ((uint64_t)_bitRevTable[b[0]] << 56) | ((uint64_t)_bitRevTable[b[1]] << 48) | + ((uint64_t)_bitRevTable[b[2]] << 40) | ((uint64_t)_bitRevTable[b[3]] << 32) | + ((uint64_t)_bitRevTable[b[4]] << 24) | ((uint64_t)_bitRevTable[b[5]] << 16) | + ((uint64_t)_bitRevTable[b[6]] << 8) | _bitRevTable[b[7]]; + ptr[i] = r; + } +} + +} // namespace + unsigned DCraw::pana_bits_t::operator() (int nbits, unsigned *bytes) { int byte; @@ -58,9 +486,12 @@ unsigned DCraw::pana_bits_t::operator() (int nbits, unsigned *bytes) } } +namespace +{ + class pana_cs6_page_decoder { - unsigned int pixelbuffer[14], lastoffset, maxoffset; + unsigned int pixelbuffer[18], lastoffset, maxoffset; unsigned char current, *buffer; public: pana_cs6_page_decoder(unsigned char *_buffer, unsigned int bsize) @@ -68,10 +499,15 @@ public: { } void read_page(); // will throw IO error if not enough space in buffer + void read_page12(); // 12-bit variant unsigned int nextpixel() { return current < 14 ? pixelbuffer[current++] : 0; } + unsigned int nextpixel12() + { + return current < 18 ? pixelbuffer[current++] : 0; + } }; #define wbuffer(i) ((unsigned short)buffer[lastoffset + 15 - i]) @@ -97,8 +533,41 @@ void pana_cs6_page_decoder::read_page() current = 0; lastoffset += 16; } + +void pana_cs6_page_decoder::read_page12() +{ + if (!buffer || (maxoffset - lastoffset < 16)) + ; + pixelbuffer[0] = (wbuffer(0) << 4) | (wbuffer(1) >> 4); // 12 bit: 8/0 + 4 upper bits of /1 + pixelbuffer[1] = (((wbuffer(1) & 0xf) << 8) | (wbuffer(2))) & 0xfff; // 12 bit: 4l/1 + 8/2 + + pixelbuffer[2] = (wbuffer(3) >> 6) & 0x3; // 2; 2u/3, 6 low bits remains in wbuffer(3) + pixelbuffer[3] = ((wbuffer(3) & 0x3f) << 2) | (wbuffer(4) >> 6); // 8; 6l/3 + 2u/4; 6 low bits remains in wbuffer(4) + pixelbuffer[4] = ((wbuffer(4) & 0x3f) << 2) | (wbuffer(5) >> 6); // 8: 6l/4 + 2u/5; 6 low bits remains in wbuffer(5) + pixelbuffer[5] = ((wbuffer(5) & 0x3f) << 2) | (wbuffer(6) >> 6); // 8: 6l/5 + 2u/6, 6 low bits remains in wbuffer(6) + + pixelbuffer[6] = (wbuffer(6) >> 4) & 0x3; // 2, 4 low bits remains in wbuffer(6) + pixelbuffer[7] = ((wbuffer(6) & 0xf) << 4) | (wbuffer(7) >> 4); // 8: 4 low bits from wbuffer(6), 4 upper bits from wbuffer(7) + pixelbuffer[8] = ((wbuffer(7) & 0xf) << 4) | (wbuffer(8) >> 4); // 8: 4 low bits from wbuffer(7), 4 upper bits from wbuffer(8) + pixelbuffer[9] = ((wbuffer(8) & 0xf) << 4) | (wbuffer(9) >> 4); // 8: 4 low bits from wbuffer(8), 4 upper bits from wbuffer(9) + + pixelbuffer[10] = (wbuffer(9) >> 2) & 0x3; // 2: bits 2-3 from wbuffer(9), two low bits remain in wbuffer(9) + pixelbuffer[11] = ((wbuffer(9) & 0x3) << 6) | (wbuffer(10) >> 2); // 8: 2 bits from wbuffer(9), 6 bits from wbuffer(10) + pixelbuffer[12] = ((wbuffer(10) & 0x3) << 6) | (wbuffer(11) >> 2); // 8: 2 bits from wbuffer(10), 6 bits from wbuffer(11) + pixelbuffer[13] = ((wbuffer(11) & 0x3) << 6) | (wbuffer(12) >> 2); // 8: 2 bits from wbuffer(11), 6 bits from wbuffer(12) + + pixelbuffer[14] = wbuffer(12) & 0x3; // 2: low bits from wbuffer(12) + pixelbuffer[15] = wbuffer(13); + pixelbuffer[16] = wbuffer(14); + pixelbuffer[17] = wbuffer(15); + current = 0; + lastoffset += 16; +} + #undef wbuffer +} + void DCraw::panasonic_load_raw() { int enc_blck_size = RT_pana_info.bpp == 12 ? 10 : 9; @@ -141,6 +610,8 @@ void DCraw::panasonic_load_raw() panasonicC6_load_raw(); } else if (RT_pana_info.encoding == 7) { panasonicC7_load_raw(); + } else if (RT_pana_info.encoding == 8) { + panasonicC8_load_raw(); } else { pana_bits_t pana_bits(ifp, load_flags, RT_pana_info.encoding); pana_bits(0, 0); @@ -176,8 +647,14 @@ void DCraw::panasonic_load_raw() void DCraw::panasonicC6_load_raw() { constexpr int rowstep = 16; - const int blocksperrow = raw_width / 11; + const bool _12bit = RT_pana_info.bpp == 12; + const int pixperblock = _12bit ? 14 : 11; + const int blocksperrow = raw_width / pixperblock; const int rowbytes = blocksperrow * 16; + const unsigned pixelbase0 = _12bit ? 0x80 : 0x200; + const unsigned pixelbase_compare = _12bit ? 0x800 : 0x2000; + const unsigned spix_compare = _12bit ? 0x3fff : 0xffff; + const unsigned pixel_mask = _12bit ? 0xfff : 0x3fff; unsigned char *iobuf = (unsigned char *)malloc(rowbytes * rowstep); merror(iobuf, "panasonicC6_load_raw()"); @@ -188,25 +665,28 @@ void DCraw::panasonicC6_load_raw() for (int crow = 0, col = 0; crow < rowstoread; ++crow, col = 0) { unsigned short *rowptr = &raw_image[(row + crow) * raw_width]; for (int rblock = 0; rblock < blocksperrow; rblock++) { - page.read_page(); + if (_12bit) + page.read_page12(); + else + page.read_page(); unsigned oddeven[2] = {0, 0}, nonzero[2] = {0, 0}; unsigned pmul = 0, pixel_base = 0; - for (int pix = 0; pix < 11; ++pix) { + for (int pix = 0; pix < pixperblock; ++pix) { if (pix % 3 == 2) { - unsigned base = page.nextpixel(); + unsigned base = _12bit ? page.nextpixel12(): page.nextpixel(); if (base > 3) { derror(); } if (base == 3) { base = 4; } - pixel_base = 0x200 << base; + pixel_base = pixelbase0 << base; pmul = 1 << base; } - unsigned epixel = page.nextpixel(); + unsigned epixel = _12bit ? page.nextpixel12() : page.nextpixel(); if (oddeven[pix % 2]) { epixel *= pmul; - if (pixel_base < 0x2000 && nonzero[pix % 2] > pixel_base) { + if (pixel_base < pixelbase_compare && nonzero[pix % 2] > pixel_base) { epixel += nonzero[pix % 2] - pixel_base; } nonzero[pix % 2] = epixel; @@ -219,11 +699,11 @@ void DCraw::panasonicC6_load_raw() } } const unsigned spix = epixel - 0xf; - if (spix <= 0xffff) { - rowptr[col++] = spix & 0xffff; + if (spix <= spix_compare) { + rowptr[col++] = spix & spix_compare; } else { epixel = (((signed int)(epixel + 0x7ffffff1)) >> 0x1f); - rowptr[col++] = epixel & 0x3fff; + rowptr[col++] = epixel & pixel_mask; } } } @@ -276,3 +756,55 @@ void DCraw::panasonicC7_load_raw() free(iobuf); tiff_bps = RT_pana_info.bpp; } + +void DCraw::panasonicC8_load_raw() +{ + int errs = 0; + unsigned totalw = 0; + + if (RT_pana_info.v8tags.stripe_count > 5) errs++; + for (int i = 0; i < RT_pana_info.v8tags.stripe_count && i < 5; i++) { + if (RT_pana_info.v8tags.stripe_height[i] != raw_height) + errs++; + if (RT_pana_info.v8tags.stripe_offsets[i] < 0 || (RT_pana_info.v8tags.stripe_offsets[i] + INT64((RT_pana_info.v8tags.stripe_compressed_size[i] + 7u) / 8u)) > INT64(ifp->size)) + errs++; + totalw += RT_pana_info.v8tags.stripe_width[i]; + } + if (totalw != raw_width) errs++; + + if (errs) + derror(); + + pana8_param_t pana8_param(RT_pana_info.v8tags); + pana8_decode_loop(&pana8_param); +} + +void DCraw::pana8_decode_loop(void *data) +{ +#ifdef _OPENMP + int errs = 0, scount = MIN(5, RT_pana_info.v8tags.stripe_count); +#pragma omp parallel for + for (int stream = 0; stream < scount; stream++) { + if (!pana8_decode_strip(data, stream)) + errs++; + } + if (errs) + derror(); +#else + for (int stream = 0; stream < RT_pana_info.v8tags.stripe_count && stream < 5; stream++) + if (!pana8_decode_strip(data, stream)) + derror(); +#endif +} + +bool DCraw::pana8_decode_strip(void *data, int stream) +{ + pana8_param_t *pana8_param = (pana8_param_t *)data; + if (!data || stream < 0 || stream > 4 || stream > RT_pana_info.v8tags.stripe_count) return 1; // error + + unsigned exactbytes = (RT_pana_info.v8tags.stripe_compressed_size[stream] + 7u) / 8u; + pana8_bufio_t bufio(ifp, RT_pana_info.v8tags.stripe_offsets[stream], exactbytes); + return pana8_param->DecodeC8(bufio, RT_pana_info.v8tags.stripe_width[stream], + RT_pana_info.v8tags.stripe_height[stream], raw_image, raw_width, raw_height, + RT_pana_info.v8tags.stripe_left[stream]); +} diff --git a/rtengine/pixelshift.cc b/rtengine/pixelshift.cc index 8088e2e9c..2df07f074 100644 --- a/rtengine/pixelshift.cc +++ b/rtengine/pixelshift.cc @@ -592,6 +592,7 @@ BENCHFUN static const float ePerIsoILCE7RM3 = 0.8f; + //TODO: Add data for ILCE-7RM4, and ILCE-1 if(plistener) { plistener->setProgressStr(Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), M("TP_RAW_PIXELSHIFT"))); plistener->setProgress(0.0); @@ -610,18 +611,29 @@ BENCHFUN int nReadIndex = static_cast(round(log2(idata->getISOSpeed() / 100.f) * 3.f)); - if(model.find("K-3") != string::npos) { - nRead = nReadK3II[nReadIndex]; - eperIsoModel = ePerIsoK3II; - } else if(model.find("K-1") != string::npos) { // this also matches K-1 Mark II - nRead = nReadK1[nReadIndex]; - eperIsoModel = ePerIsoK1; - } else if(model.find("ILCE-7RM3") != string::npos) { - nRead = nReadILCE7RM3[nReadIndex]; - eperIsoModel = ePerIsoILCE7RM3; - } else { // as long as we don't have values for Pentax KP, we use the values from K-70 - nRead = nReadK70[nReadIndex]; - eperIsoModel = ePerIsoK70; + if(make.find("Sony") != string::npos) { + if(model.find("ILCE-7RM3") != string::npos) { + nRead = nReadILCE7RM3[nReadIndex]; + eperIsoModel = ePerIsoILCE7RM3; + /* TODO: When we have data for missing ILCE-7RM4, and ILCE-1, add it here + } else if(model.find("ILCE-7RM4") != string::npos) { + } else if(model.find("ILCE-1") != string::npos) { + */ + } else { // default to ILCE-7RM3 for Sony cameras without data + nRead = nReadILCE7RM3[nReadIndex]; + eperIsoModel = ePerIsoILCE7RM3; + } + } else { // Pentax + if(model.find("K-3") != string::npos) { + nRead = nReadK3II[nReadIndex]; + eperIsoModel = ePerIsoK3II; + } else if(model.find("K-1") != string::npos) { // this also matches K-1 Mark II + nRead = nReadK1[nReadIndex]; + eperIsoModel = ePerIsoK1; + } else { // as long as we don't have values for Pentax KP, we use the values from K-70 + nRead = nReadK70[nReadIndex]; + eperIsoModel = ePerIsoK70; + } } eperIsoModel *= pow(2.f, eperIso - 1.f); diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 13df614dc..a1408e405 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -1108,7 +1108,7 @@ enum ProcEventCode { Evlocallabsigmoidldacie = 1078, Evlocallabsigmoidthcie = 1079, Evlocallabsigmoidblcie = 1080, - Evlocallabsigmoidqjcie = 1081, + Evlocallabcomprcieauto = 1081, Evlocallabhuecie = 1082, Evlocallabjabcie = 1083, Evlocallablightjzcie = 1084, @@ -1177,6 +1177,7 @@ enum ProcEventCode { Evlocallabsigjz = 1147, Evlocallabsigq = 1148, Evlocallablogcie = 1149, + NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 7acca8f11..8041ab298 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1886,7 +1886,7 @@ bool SHParams::operator !=(const SHParams& other) const ToneEqualizerParams::ToneEqualizerParams() : enabled(false), - bands{0, 0, 0, 0, 0}, + bands{0, 0, 0, 0, 0, 0}, regularization(0), show_colormap(false), pivot(0) @@ -2064,13 +2064,19 @@ bool LensProfParams::lfManual() const return lcMode == LcMode::LENSFUNMANUAL; } +bool LensProfParams::useMetadata() const +{ + return lcMode == LcMode::METADATA; +} + const std::vector& LensProfParams::getMethodStrings() const { static const std::vector method_strings = { "none", "lfauto", "lfmanual", - "lcp" + "lcp", + "metadata" }; return method_strings; } @@ -2390,17 +2396,24 @@ ColorManagementParams::ColorManagementParams() : workingTRC(WorkingTrc::NONE), will(Illuminant::DEFAULT), wprim(Primaries::DEFAULT), + wcat(Cat::BRAD), workingTRCGamma(2.4),//gamma sRGB workingTRCSlope(12.92), + wmidtcie(0.), + wsmoothcie(false), redx(0.7347), redy(0.2653), grex(0.1596), grey(0.8404), blux(0.0366), bluy(0.0001), + refi(0.), + shiftx(0.), + shifty(0.), preser(0.), fbw(false), - gamut(false), + trcExp(false), + gamut(true), labgridcieALow(0.51763),//Prophoto red = (0.7347+0.1) * 1.81818 - 1 labgridcieBLow(-0.33582), labgridcieAHigh(-0.75163),//Prophoto blue @@ -2409,6 +2422,8 @@ ColorManagementParams::ColorManagementParams() : labgridcieGy(-0.70909),//0.84 labgridcieWx(-0.18964),//D50 0.3457, 0.3585, labgridcieWy(-0.16636),// + labgridcieMx(0.),// + labgridcieMy(0.),// aRendIntent(RI_RELATIVE), outputProfile(options.rtSettings.srgb), outputIntent(RI_RELATIVE), @@ -2429,14 +2444,20 @@ bool ColorManagementParams::operator ==(const ColorManagementParams& other) cons && workingTRC == other.workingTRC && will == other.will && wprim == other.wprim + && wcat == other.wcat && workingTRCGamma == other.workingTRCGamma && workingTRCSlope == other.workingTRCSlope + && wmidtcie == other.wmidtcie + && wsmoothcie == other.wsmoothcie && redx == other.redx && redy == other.redy && grex == other.grex && grey == other.grey && blux == other.blux && bluy == other.bluy + && refi == other.refi + && shiftx == other.shiftx + && shifty == other.shifty && labgridcieALow == other.labgridcieALow && labgridcieBLow == other.labgridcieBLow && labgridcieAHigh == other.labgridcieAHigh @@ -2445,8 +2466,11 @@ bool ColorManagementParams::operator ==(const ColorManagementParams& other) cons && labgridcieGy == other.labgridcieGy && labgridcieWx == other.labgridcieWx && labgridcieWy == other.labgridcieWy + && labgridcieMx == other.labgridcieMx + && labgridcieMy == other.labgridcieMy && preser == other.preser && fbw == other.fbw + && trcExp == other.trcExp && gamut == other.gamut && aRendIntent == other.aRendIntent && outputProfile == other.outputProfile @@ -2972,11 +2996,11 @@ LocallabParams::LocallabSpot::LocallabSpot() : structexclu(0), struc(4.0), shapeMethod("IND"), - avoidgamutMethod("XYZ"), + avoidgamutMethod("MUNS"), loc{150, 150, 150, 150}, centerX(0), centerY(0), - circrad(18), + circrad(18.), qualityMethod("enh"), complexMethod("mod"), transit(60.), @@ -3020,12 +3044,13 @@ LocallabParams::LocallabSpot::LocallabSpot() : labgridAHighmerg(-3500.0), labgridBHighmerg(-4600.0), strengthgrid(30), - sensi(15), + sensi(30), structcol(0), strcol(0.), strcolab(0.), strcolh(0.), angcol(0.), + feathercol(25.), blurcolde(5), blurcol(0.2), contcol(0.), @@ -3268,6 +3293,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : gamex(1.), strexp(0.), angexp(0.), + featherexp(25.), excurve{ static_cast(DCT_NURBS), 0.0, @@ -3360,13 +3386,13 @@ LocallabParams::LocallabSpot::LocallabSpot() : expshadhigh(false), complexshadhigh(0), shMethod("tone"), - multsh{0, 0, 0, 0, 0}, + multsh{0, 0, 0, 0, 0, 0}, highlights(0), h_tonalwidth(70), shadows(0), s_tonalwidth(30), sh_radius(40), - sensihs(15), + sensihs(30), enaSHMask(false), CCmaskSHcurve{ static_cast(FCT_MinMaxCPoints), @@ -3418,6 +3444,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : blurSHde(5), strSH(0.), angSH(0.), + featherSH(25.), inverssh(false), chromaskSH(0.0), gammaskSH(1.0), @@ -3453,7 +3480,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : protectskins(false), avoidcolorshift(true), pastsattog(true), - sensiv(15), + sensiv(30), skintonescurve{ static_cast(DCT_Linear) }, @@ -3513,6 +3540,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : strvibab(0.0), strvibh(0.0), angvib(0.0), + feathervib(25.0), Lmaskvibcurve{ static_cast(DCT_NURBS), 0.0, @@ -3834,6 +3862,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : equilret(false), loglin(true), dehazeSaturation(50.0), + dehazeblack(0.0), softradiusret(40.0), CCmaskreticurve{ static_cast(FCT_MinMaxCPoints), @@ -3956,6 +3985,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : sigmalc2(1.0), strwav(0.0), angwav(0.0), + featherwav(25.0), strengthw(0.0), sigmaed(1.0), radiusw(15.0), @@ -4226,8 +4256,13 @@ LocallabParams::LocallabSpot::LocallabSpot() : fullimage(true), repar(100.0), ciecam(false), - blackEv(-5.0), - whiteEv(10.0), + satlog(false), + blackEv(-5.00), + whiteEv(10.00), + whiteslog(0), + blackslog(0), + comprlog(0.4), + strelog(100.), detail(0.6), sensilog(60), sursour("Average"), @@ -4235,6 +4270,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : baselog(2.), strlog(0.0), anglog(0.0), + featherlog(25.0), CCmaskcurveL{ static_cast(FCT_MinMaxCPoints), 0.0, @@ -4362,6 +4398,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : shadmask(0.0), str_mask(0), ang_mask(0), + feather_mask(25), HHhmask_curve{ static_cast(FCT_MinMaxCPoints), 0.0, @@ -4399,6 +4436,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : // ciecam visicie(false), expcie(false), + expprecam(false), complexcie(0), reparcie(100.), sensicie(60), @@ -4407,8 +4445,17 @@ LocallabParams::LocallabSpot::LocallabSpot() : forcebw(true), qtoj(false), jabcie(true), - sigmoidqjcie(false), + comprcieauto(false), + normcie(true), + gamutcie(true), + bwcie(false), + sigcie(true), logcie(false), + satcie(true), + logcieq(false), + smoothcie(false), + smoothcieyb(false), + smoothcielum(false), logjz(false), sigjz(false), sigq(false), @@ -4418,6 +4465,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : sursourcie("Average"), modecie("com"), modecam("cam16"), + bwevMethod("sig"), saturlcie(0.), rstprotectcie(0.), chromlcie(0.), @@ -4549,8 +4597,10 @@ LocallabParams::LocallabSpot::LocallabSpot() : lightlcie(0.), lightjzcie(0.), lightqcie(0.), + lightsigqcie(0.), contlcie(0.), contjzcie(0.), + detailciejz(30.), adapjzcie(4.0), jz100(0.25), pqremap(120.), @@ -4577,33 +4627,64 @@ LocallabParams::LocallabSpot::LocallabSpot() : }, csthresholdjz(0, 0, 7, 4, false), contthrescie(0.), - blackEvjz(-5.0), - whiteEvjz(10.0), + blackEvjz(-5.00), + whiteEvjz(10.00), targetjz(18.0), sigmoidldacie(0.5), - sigmoidthcie(1.), - sigmoidblcie(1.), + sigmoidthcie(1.2), + sigmoidsenscie(0.9), + sigmoidblcie(0.75), + comprcie(0.4), + strcielog(80.), + comprcieth(6.), + gamjcie(2.4), + slopjcie(12.923), + slopesmo(1.), + slopesmor(1.), + slopesmog(1.), + slopesmob(1.), + midtcie(0), + grexl(0.1596), + greyl(0.8404), + bluxl(0.0366), + bluyl(0.0001), + redxl(0.7347), + redyl(0.2653), + refi(0.), + shiftxl(0.), + shiftyl(0.), + 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.528),//Prophoto green 0.1596 + labgridcieGy(0.7096),//0.84 + labgridcieWx(-0.18964),//D50 0.3457, 0.3585, + labgridcieWy(-0.16636),// + labgridcieMx(0.), + labgridcieMy(0.),// + whitescie(0), + blackscie(0), + illMethod("d50"), + smoothciemet("none"), + primMethod("pro"), + catMethod("brad"), sigmoidldajzcie(0.5), sigmoidthjzcie(1.), sigmoidbljzcie(1.), contqcie(0.), + contsigqcie(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.), + detailcie(30.), surroundcie("Average"), + strgradcie(0.), + anggradcie(0.), + feathercie(25.), enacieMask(false), + enacieMaskall(false), CCmaskciecurve{ static_cast(FCT_MinMaxCPoints), 0.0, @@ -4649,6 +4730,22 @@ LocallabParams::LocallabSpot::LocallabSpot() : 0.35, 0.35 }, + HHhmaskciecurve{ + 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 + }, + blendmaskcie(0), radmaskcie(0.0), chromaskcie(0.0), @@ -4665,10 +4762,100 @@ LocallabParams::LocallabSpot::LocallabSpot() : recothrescie(1.), lowthrescie(12.), higthrescie(85.), - decaycie(2.) - + decaycie(2.), + strumaskcie(0.), + toolcie(false), + fftcieMask(true), + contcie(0.), + blurcie(0.2), + highmaskcie(0.), + shadmaskcie(0.), + LLmaskciecurvewav{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.5, + 0.35, + 0.35, + 1., + 0.5, + 0.35, + 0.35 + }, + csthresholdcie(0, 0, 6, 5, false) + { + // init settings with Preferences / options : must be followed by call to spotMethodChanged in controlspotpanel.cc (idle_register) + // new values default with different SpotMethod. + + if(options.spotmet == 3) {//global + spotMethod = "main"; + loc = {3000, 3000, 3000, 3000}; + transit =100.; + shape = "RECT"; + + } else if(options.spotmet == 2) {//full image + spotMethod = "full"; + loc = {3000, 3000, 3000, 3000}; + transit =100.; + shape = "RECT"; + sensi = 30; + sensiex = 60; + sensihs = 30; + sensiv = 30; + sensisf = 30; + sensibn = 40; + sensiden = 60; + sensitm = 60; + sensih = 60; + sensisha = 40; + sensilc = 60; + sensicb = 60; + sensilog = 60; + sensimask = 60; + sensicie = 60; + + } else if(options.spotmet == 1) {//exclude + spotMethod = "exc"; + shape = "ELI"; + loc = {150, 150, 150, 150}; + transit= 60.; + sensi = 30; + sensiex = 60; + sensihs = 30; + sensiv = 30; + sensibn = 40; + sensiden = 60; + sensitm = 60; + sensih = 60; + sensisha = 40; + sensilc = 60; + sensicb = 60; + sensilog = 60; + sensimask = 60; + sensicie = 60; + + } else if(options.spotmet == 0) {//normal + spotMethod = "norm"; + shape = "ELI"; + loc = {150, 150, 150, 150}; + transit= 60.; + sensi = 30; + sensiex = 60; + sensihs = 30; + sensiv = 30; + sensibn = 40; + sensiden = 60; + sensitm = 60; + sensih = 60; + sensisha = 40; + sensilc = 60; + sensicb = 60; + sensilog = 60; + sensimask = 60; + sensicie = 60; + } + } bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const @@ -4739,6 +4926,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && strcolab == other.strcolab && strcolh == other.strcolh && angcol == other.angcol + && feathercol == other.feathercol && blurcolde == other.blurcolde && blurcol == other.blurcol && contcol == other.contcol @@ -4801,6 +4989,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && gamex == other.gamex && strexp == other.strexp && angexp == other.angexp + && featherexp == other.featherexp && excurve == other.excurve && norm == other.norm && inversex == other.inversex @@ -4842,7 +5031,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && shMethod == other.shMethod && [this, &other]() -> bool { - for (int i = 0; i < 5; ++i) { + for (int i = 0; i < 6; ++i) { if (multsh[i] != other.multsh[i]) { return false; } @@ -4864,6 +5053,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && blurSHde == other.blurSHde && strSH == other.strSH && angSH == other.angSH + && featherSH == other.featherSH && inverssh == other.inverssh && chromaskSH == other.chromaskSH && gammaskSH == other.gammaskSH @@ -4909,6 +5099,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && strvibab == other.strvibab && strvibh == other.strvibh && angvib == other.angvib + && feathervib == other.feathervib && Lmaskvibcurve == other.Lmaskvibcurve && recothresv == other.recothresv && lowthresv == other.lowthresv @@ -5050,6 +5241,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && equilret == other.equilret && loglin == other.loglin && dehazeSaturation == other.dehazeSaturation + && dehazeblack == other.dehazeblack && softradiusret == other.softradiusret && CCmaskreticurve == other.CCmaskreticurve && LLmaskreticurve == other.LLmaskreticurve @@ -5124,6 +5316,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && sigmalc2 == other.sigmalc2 && strwav == other.strwav && angwav == other.angwav + && featherwav == other.featherwav && strengthw == other.strengthw && sigmaed == other.sigmaed && radiusw == other.radiusw @@ -5224,8 +5417,13 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && fullimage == other.fullimage && repar == other.repar && ciecam == other.ciecam + && satlog == other.satlog && blackEv == other.blackEv && whiteEv == other.whiteEv + && whiteslog == other.whiteslog + && blackslog == other.blackslog + && comprlog == other.comprlog + && strelog == other.strelog && detail == other.detail && sensilog == other.sensilog && baselog == other.baselog @@ -5233,6 +5431,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && surround == other.surround && strlog == other.strlog && anglog == other.anglog + && featherlog == other.featherlog && CCmaskcurveL == other.CCmaskcurveL && LLmaskcurveL == other.LLmaskcurveL && HHmaskcurveL == other.HHmaskcurveL @@ -5271,6 +5470,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && shadmask == other.shadmask && str_mask == other.str_mask && ang_mask == other.ang_mask + && feather_mask == other.feather_mask && HHhmask_curve == other.HHhmask_curve && Lmask_curve == other.Lmask_curve && LLmask_curvewav == other.LLmask_curvewav @@ -5278,6 +5478,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const //ciecam && visicie == other.visicie && expcie == other.expcie + && expprecam == other.expprecam && complexcie == other.complexcie && reparcie == other.reparcie && sensicie == other.sensicie @@ -5286,8 +5487,17 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && forcebw == other.forcebw && qtoj == other.qtoj && jabcie == other.jabcie - && sigmoidqjcie == other.sigmoidqjcie + && comprcieauto == other.comprcieauto + && normcie == other.normcie + && gamutcie == other.gamutcie + && bwcie == other.bwcie + && sigcie == other.sigcie && logcie == other.logcie + && satcie == other.satcie + && logcieq == other.logcieq + && smoothcie == other.smoothcie + && smoothcieyb == other.smoothcieyb + && smoothcielum == other.smoothcielum && logjz == other.logjz && sigjz == other.sigjz && sigq == other.sigq @@ -5297,6 +5507,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && sursourcie == other.sursourcie && modecie == other.modecie && modecam == other.modecam + && bwevMethod == other.bwevMethod && saturlcie == other.saturlcie && rstprotectcie == other.rstprotectcie && chromlcie == other.chromlcie @@ -5320,8 +5531,10 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && lightlcie == other.lightlcie && lightjzcie == other.lightjzcie && lightqcie == other.lightqcie + && lightsigqcie == other.lightsigqcie && contlcie == other.contlcie && contjzcie == other.contjzcie + && detailciejz == other.detailciejz && adapjzcie == other.adapjzcie && jz100 == other.jz100 && pqremap == other.pqremap @@ -5343,30 +5556,63 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && targetjz == other.targetjz && sigmoidldacie == other.sigmoidldacie && sigmoidthcie == other.sigmoidthcie + && sigmoidsenscie == other.sigmoidsenscie && sigmoidblcie == other.sigmoidblcie + && comprcie == other.comprcie + && strcielog == other.strcielog + && comprcieth == other.comprcieth + && gamjcie == other.gamjcie + && slopjcie == other.slopjcie + && slopesmo == other.slopesmo + && slopesmor == other.slopesmor + && slopesmog == other.slopesmog + && slopesmob == other.slopesmob + && midtcie == other.midtcie + && redxl == other.redxl + && redyl == other.redyl + && grexl == other.grexl + && greyl == other.greyl + && bluxl == other.bluxl + && bluyl == other.bluyl + && refi == other.refi + && shiftxl == other.shiftxl + && shiftyl == other.shiftyl + && labgridcieALow == other.labgridcieALow + && labgridcieBLow == other.labgridcieBLow + && labgridcieAHigh == other.labgridcieAHigh + && labgridcieBHigh == other.labgridcieBHigh + && labgridcieGx == other.labgridcieGx + && labgridcieGy == other.labgridcieGy + && labgridcieWx == other.labgridcieWx + && labgridcieWy == other.labgridcieWy + && labgridcieMx == other.labgridcieMx + && labgridcieMy == other.labgridcieMy + && whitescie == other.whitescie + && blackscie == other.blackscie + && illMethod == other.illMethod + && smoothciemet == other.smoothciemet + && primMethod == other.primMethod + && catMethod == other.catMethod && sigmoidldajzcie == other.sigmoidldajzcie && sigmoidthjzcie == other.sigmoidthjzcie && sigmoidbljzcie == other.sigmoidbljzcie && contqcie == other.contqcie + && contsigqcie == other.contsigqcie && 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 + && strgradcie == other.strgradcie + && anggradcie == other.anggradcie + && feathercie == other.feathercie && surroundcie == other.surroundcie && enacieMask == other.enacieMask + && enacieMaskall == other.enacieMaskall && CCmaskciecurve == other.CCmaskciecurve && LLmaskciecurve == other.LLmaskciecurve && HHmaskciecurve == other.HHmaskciecurve + && HHhmaskciecurve == other.HHhmaskcurve && blendmaskcie == other.blendmaskcie && radmaskcie == other.radmaskcie && chromaskcie == other.chromaskcie @@ -5377,8 +5623,16 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && recothrescie == other.recothrescie && lowthrescie == other.lowthrescie && higthrescie == other.higthrescie - && decaycie == other.decaycie; - + && decaycie == other.decaycie + && strumaskcie == other.strumaskcie + && toolcie == other.toolcie + && blurcie == other.blurcie + && contcie == other.contcie + && highmaskcie == other.highmaskcie + && shadmaskcie == other.shadmaskcie + && fftcieMask == other.fftcieMask + && LLmaskciecurvewav == other.LLmaskciecurvewav + && csthresholdcie == other.csthresholdcie; } @@ -6624,6 +6878,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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->feathercol, "Locallab", "Feathercol_" + index_str, spot.feathercol, 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); @@ -6687,6 +6942,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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->featherexp, "Locallab", "Featherexp_" + index_str, spot.featherexp, 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); @@ -6728,7 +6984,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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++) { + for (int j = 0; j < 6; j++) { saveToKeyfile(!pedited || spot_edited->multsh[j], "Locallab", "Multsh" + std::to_string(j) + "_" + index_str, spot.multsh[j], keyFile); } @@ -6747,6 +7003,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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->featherSH, "Locallab", "FeatherSH_" + index_str, spot.featherSH, 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); @@ -6792,6 +7049,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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->angvib, "Locallab", "Feathervib_" + index_str, spot.feathervib, 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); @@ -6937,6 +7195,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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->dehazeblack, "Locallab", "dehazeblack_" + index_str, spot.dehazeblack, 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); @@ -7013,6 +7272,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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->featherwav, "Locallab", "Featherwav_" + index_str, spot.featherwav, 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); @@ -7111,8 +7371,13 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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->satlog, "Locallab", "Satlog_" + index_str, spot.satlog, 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->whiteslog, "Locallab", "Whiteslog_" + index_str, spot.whiteslog, keyFile); + saveToKeyfile(!pedited || spot_edited->blackslog, "Locallab", "Blackslog_" + index_str, spot.blackslog, keyFile); + saveToKeyfile(!pedited || spot_edited->comprlog, "Locallab", "Comprlog_" + index_str, spot.comprlog, keyFile); + saveToKeyfile(!pedited || spot_edited->strelog, "Locallab", "Strelog_" + index_str, spot.strelog, 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); @@ -7120,6 +7385,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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->featherlog, "Locallab", "Featherlog_" + index_str, spot.featherlog, 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); @@ -7159,6 +7425,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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->feather_mask, "Locallab", "Feather_mask_" + index_str, spot.feather_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); @@ -7167,6 +7434,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo //ciecam if ((!pedited || spot_edited->visicie) && spot.visicie) { saveToKeyfile(!pedited || spot_edited->expcie, "Locallab", "Expcie_" + index_str, spot.expcie, keyFile); + saveToKeyfile(!pedited || spot_edited->expprecam, "Locallab", "Expprecam_" + index_str, spot.expprecam, 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); @@ -7175,8 +7443,17 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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->comprcieauto, "Locallab", "comprcieauto_" + index_str, spot.comprcieauto, keyFile); + saveToKeyfile(!pedited || spot_edited->normcie, "Locallab", "normcie_" + index_str, spot.normcie, keyFile); + saveToKeyfile(!pedited || spot_edited->gamutcie, "Locallab", "gamutcie_" + index_str, spot.gamutcie, keyFile); + saveToKeyfile(!pedited || spot_edited->bwcie, "Locallab", "bwcie_" + index_str, spot.bwcie, keyFile); + saveToKeyfile(!pedited || spot_edited->sigcie, "Locallab", "sigcie_" + index_str, spot.sigcie, keyFile); saveToKeyfile(!pedited || spot_edited->logcie, "Locallab", "logcie_" + index_str, spot.logcie, keyFile); + saveToKeyfile(!pedited || spot_edited->satcie, "Locallab", "satcie_" + index_str, spot.satcie, keyFile); + saveToKeyfile(!pedited || spot_edited->logcieq, "Locallab", "logcieq_" + index_str, spot.logcieq, keyFile); + saveToKeyfile(!pedited || spot_edited->smoothcie, "Locallab", "smoothcie_" + index_str, spot.smoothcie, keyFile); + saveToKeyfile(!pedited || spot_edited->smoothcieyb, "Locallab", "smoothcieyb_" + index_str, spot.smoothcieyb, keyFile); + saveToKeyfile(!pedited || spot_edited->smoothcielum, "Locallab", "smoothcielum_" + index_str, spot.smoothcielum, 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); @@ -7186,6 +7463,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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->bwevMethod, "Locallab", "bwevMethod_" + index_str, spot.bwevMethod, 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); @@ -7209,8 +7487,10 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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->lightsigqcie, "Locallab", "Brightsigqcie_" + index_str, spot.lightsigqcie, 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->detailciejz, "Locallab", "Detailciejz_" + index_str, spot.detailciejz, 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); @@ -7232,31 +7512,65 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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->sigmoidsenscie, "Locallab", "Sigmoidsenscie_" + index_str, spot.sigmoidsenscie, keyFile); saveToKeyfile(!pedited || spot_edited->sigmoidblcie, "Locallab", "Sigmoidblcie_" + index_str, spot.sigmoidblcie, keyFile); + saveToKeyfile(!pedited || spot_edited->comprcie, "Locallab", "comprcie_" + index_str, spot.comprcie, keyFile); + saveToKeyfile(!pedited || spot_edited->strcielog, "Locallab", "strcielog_" + index_str, spot.strcielog, keyFile); + saveToKeyfile(!pedited || spot_edited->comprcieth, "Locallab", "comprcieth_" + index_str, spot.comprcieth, keyFile); + saveToKeyfile(!pedited || spot_edited->gamjcie, "Locallab", "gamjcie_" + index_str, spot.gamjcie, keyFile); + saveToKeyfile(!pedited || spot_edited->slopjcie, "Locallab", "slopjcie_" + index_str, spot.slopjcie, keyFile); + saveToKeyfile(!pedited || spot_edited->slopesmo, "Locallab", "slopesmo_" + index_str, spot.slopesmo, keyFile); + saveToKeyfile(!pedited || spot_edited->slopesmor, "Locallab", "slopesmor_" + index_str, spot.slopesmor, keyFile); + saveToKeyfile(!pedited || spot_edited->slopesmog, "Locallab", "slopesmog_" + index_str, spot.slopesmog, keyFile); + saveToKeyfile(!pedited || spot_edited->slopesmob, "Locallab", "slopesmob_" + index_str, spot.slopesmob, keyFile); + saveToKeyfile(!pedited || spot_edited->midtcie, "Locallab", "midtcie_" + index_str, spot.midtcie, keyFile); + saveToKeyfile(!pedited || spot_edited->redxl, "Locallab", "redxl_" + index_str, spot.redxl, keyFile); + saveToKeyfile(!pedited || spot_edited->redyl, "Locallab", "redyl_" + index_str, spot.redyl, keyFile); + saveToKeyfile(!pedited || spot_edited->grexl, "Locallab", "grexl_" + index_str, spot.grexl, keyFile); + saveToKeyfile(!pedited || spot_edited->greyl, "Locallab", "greyl_" + index_str, spot.greyl, keyFile); + saveToKeyfile(!pedited || spot_edited->bluxl, "Locallab", "bluxl_" + index_str, spot.bluxl, keyFile); + saveToKeyfile(!pedited || spot_edited->bluyl, "Locallab", "bluyl_" + index_str, spot.bluyl, keyFile); + saveToKeyfile(!pedited || spot_edited->refi, "Locallab", "refi_" + index_str, spot.refi, keyFile); + saveToKeyfile(!pedited || spot_edited->shiftxl, "Locallab", "shiftxl_" + index_str, spot.shiftxl, keyFile); + saveToKeyfile(!pedited || spot_edited->shiftyl, "Locallab", "shiftyl_" + index_str, spot.shiftyl, keyFile); + + saveToKeyfile(!pedited || spot_edited->labgridcieALow, "Locallab", "labgridcieALow_" + index_str, spot.labgridcieALow, keyFile); + saveToKeyfile(!pedited || spot_edited->labgridcieBLow, "Locallab", "labgridcieBLow_" + index_str, spot.labgridcieBLow, keyFile); + saveToKeyfile(!pedited || spot_edited->labgridcieAHigh, "Locallab", "labgridcieAHigh_" + index_str, spot.labgridcieAHigh, keyFile); + saveToKeyfile(!pedited || spot_edited->labgridcieBHigh, "Locallab", "labgridcieBHigh_" + index_str, spot.labgridcieBHigh, keyFile); + saveToKeyfile(!pedited || spot_edited->labgridcieGx, "Locallab", "labgridcieGx_" + index_str, spot.labgridcieGx, keyFile); + saveToKeyfile(!pedited || spot_edited->labgridcieGy, "Locallab", "labgridcieGy_" + index_str, spot.labgridcieGy, keyFile); + saveToKeyfile(!pedited || spot_edited->labgridcieWx, "Locallab", "labgridcieWx_" + index_str, spot.labgridcieWx, keyFile); + saveToKeyfile(!pedited || spot_edited->labgridcieWy, "Locallab", "labgridcieWy_" + index_str, spot.labgridcieWy, keyFile); + saveToKeyfile(!pedited || spot_edited->labgridcieMx, "Locallab", "labgridcieMx_" + index_str, spot.labgridcieMx, keyFile); + saveToKeyfile(!pedited || spot_edited->labgridcieMy, "Locallab", "labgridcieMy_" + index_str, spot.labgridcieMy, keyFile); + + saveToKeyfile(!pedited || spot_edited->whitescie, "Locallab", "whitescie_" + index_str, spot.whitescie, keyFile); + saveToKeyfile(!pedited || spot_edited->blackscie, "Locallab", "blackscie_" + index_str, spot.blackscie, keyFile); + saveToKeyfile(!pedited || spot_edited->illMethod, "Locallab", "illMethod_" + index_str, spot.illMethod, keyFile); + saveToKeyfile(!pedited || spot_edited->smoothciemet, "Locallab", "smoothciemet_" + index_str, spot.smoothciemet, keyFile); + saveToKeyfile(!pedited || spot_edited->primMethod, "Locallab", "primMethod_" + index_str, spot.primMethod, keyFile); + saveToKeyfile(!pedited || spot_edited->catMethod, "Locallab", "catMethod_" + index_str, spot.catMethod, 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->contsigqcie, "Locallab", "Contsigqcie_" + index_str, spot.contsigqcie, 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->strgradcie, "Locallab", "Strgradcie_" + index_str, spot.strgradcie, keyFile); + saveToKeyfile(!pedited || spot_edited->anggradcie, "Locallab", "Anggradcie_" + index_str, spot.anggradcie, keyFile); + saveToKeyfile(!pedited || spot_edited->feathercie, "Locallab", "Feathercie_" + index_str, spot.feathercie, 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->enacieMaskall, "Locallab", "EnacieMaskall_" + index_str, spot.enacieMaskall, 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->HHhmaskciecurve, "Locallab", "HHhmaskcieCurve_" + index_str, spot.HHhmaskciecurve, 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); @@ -7268,11 +7582,19 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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); + saveToKeyfile(!pedited || spot_edited->strumaskcie, "Locallab", "strumaskcie_" + index_str, spot.strumaskcie, keyFile); + saveToKeyfile(!pedited || spot_edited->toolcie, "Locallab", "toolcie_" + index_str, spot.toolcie, keyFile); + saveToKeyfile(!pedited || spot_edited->fftcieMask, "Locallab", "FftcieMask_" + index_str, spot.fftcieMask, keyFile); + saveToKeyfile(!pedited || spot_edited->contcie, "Locallab", "contcie_" + index_str, spot.contcie, keyFile); + saveToKeyfile(!pedited || spot_edited->blurcie, "Locallab", "blurcie_" + index_str, spot.blurcie, keyFile); + saveToKeyfile(!pedited || spot_edited->blurcie, "Locallab", "highmaskcie_" + index_str, spot.highmaskcie, keyFile); + saveToKeyfile(!pedited || spot_edited->blurcie, "Locallab", "shadmaskcie_" + index_str, spot.shadmaskcie, keyFile); + saveToKeyfile(!pedited || spot_edited->LLmaskciecurvewav, "Locallab", "LLmaskcieCurvewav_" + index_str, spot.LLmaskciecurvewav, keyFile); + saveToKeyfile(!pedited || spot_edited->csthresholdcie, "Locallab", "CSThresholdcie_" + index_str, spot.csthresholdcie.toVector(), keyFile); } - } } @@ -7371,7 +7693,8 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo {ColorManagementParams::Illuminant::D120, "D120"}, {ColorManagementParams::Illuminant::STDA, "stda"}, {ColorManagementParams::Illuminant::TUNGSTEN_2000K, "2000"}, - {ColorManagementParams::Illuminant::TUNGSTEN_1500K, "1500"} + {ColorManagementParams::Illuminant::TUNGSTEN_1500K, "1500"}, + {ColorManagementParams::Illuminant::E, "E"} }, icm.will, keyFile @@ -7390,6 +7713,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo {ColorManagementParams::Primaries::WIDE_GAMUT, "wid"}, {ColorManagementParams::Primaries::ACES_P0, "ac0"}, {ColorManagementParams::Primaries::JDC_MAX, "jdcmax"}, + {ColorManagementParams::Primaries::JDC_MAXSTDA, "jdcmaxstdA"}, {ColorManagementParams::Primaries::BRUCE_RGB, "bru"}, {ColorManagementParams::Primaries::BETA_RGB, "bet"}, {ColorManagementParams::Primaries::BEST_RGB, "bst"}, @@ -7399,14 +7723,34 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo icm.wprim, keyFile ); + saveToKeyfile( + !pedited || pedited->icm.wcat, + "Color Management", + "Wcat", + { + {ColorManagementParams::Cat::BRAD, "brad"}, + {ColorManagementParams::Cat::CAT16, "cat16"}, + {ColorManagementParams::Cat::CAT02, "cat02"}, + {ColorManagementParams::Cat::CAT_VK, "cat_vk"}, + {ColorManagementParams::Cat::CAT_XYZ, "cat_xyz"} + }, + icm.wcat, + 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.wmidtcie, "Color Management", "Wmidtcie", icm.wmidtcie, keyFile); + saveToKeyfile(!pedited || pedited->icm.wsmoothcie, "Color Management", "Wsmoothcie", icm.wsmoothcie, 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.refi, "Color Management", "Refi", icm.refi, keyFile); + saveToKeyfile(!pedited || pedited->icm.shiftx, "Color Management", "Shiftx", icm.shiftx, keyFile); + saveToKeyfile(!pedited || pedited->icm.shifty, "Color Management", "Shifty", icm.shifty, 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); @@ -7415,8 +7759,11 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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.labgridcieMx, "Color Management", "LabGridcieMx", icm.labgridcieMx, keyFile); + saveToKeyfile(!pedited || pedited->icm.labgridcieMy, "Color Management", "LabGridcieMy", icm.labgridcieMy, 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.trcExp, "Color Management", "TrcExp", icm.trcExp, keyFile); saveToKeyfile(!pedited || pedited->icm.gamut, "Color Management", "Gamut", icm.gamut, keyFile); saveToKeyfile(!pedited || pedited->icm.outputProfile, "Color Management", "OutputProfile", icm.outputProfile, keyFile); saveToKeyfile( @@ -8739,6 +9086,11 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "ShapeMethod_" + index_str, spot.shapeMethod, spotEdited.shapeMethod); if (keyFile.has_key("Locallab", "AvoidgamutMethod_" + index_str)) { assignFromKeyfile(keyFile, "Locallab", "AvoidgamutMethod_" + index_str, spot.avoidgamutMethod, spotEdited.avoidgamutMethod); + /* if (ppVersion < 351) { + if(spot.avoidgamutMethod == "XYZ") {//5.10 default value + spot.avoidgamutMethod = "MUNS";//set to Munsell only + } + } */ } 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); @@ -8798,12 +9150,29 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "labgridAHighmerg_" + index_str, spot.labgridAHighmerg, spotEdited.labgridAHighmerg); assignFromKeyfile(keyFile, "Locallab", "labgridBHighmerg_" + index_str, spot.labgridBHighmerg, spotEdited.labgridBHighmerg); assignFromKeyfile(keyFile, "Locallab", "Strengthgrid_" + index_str, spot.strengthgrid, spotEdited.strengthgrid); - assignFromKeyfile(keyFile, "Locallab", "Sensi_" + index_str, spot.sensi, spotEdited.sensi); + assignFromKeyfile(keyFile, "Locallab", "Colorscope_" + index_str, spot.colorscope, spotEdited.colorscope); + + if (ppVersion <= 350) { + if (keyFile.has_key("Locallab", "Colorscope_" + index_str)) { + spot.sensi = keyFile.get_integer("Locallab", "Colorscope_" + index_str); + spotEdited.sensi = true; + } + } else { + assignFromKeyfile(keyFile, "Locallab", "Sensi_" + index_str, spot.sensi, spotEdited.sensi); + } assignFromKeyfile(keyFile, "Locallab", "Structcol_" + index_str, spot.structcol, spotEdited.structcol); assignFromKeyfile(keyFile, "Locallab", "Strcol_" + index_str, spot.strcol, spotEdited.strcol); assignFromKeyfile(keyFile, "Locallab", "Strcolab_" + index_str, spot.strcolab, spotEdited.strcolab); assignFromKeyfile(keyFile, "Locallab", "Strcolh_" + index_str, spot.strcolh, spotEdited.strcolh); assignFromKeyfile(keyFile, "Locallab", "Angcol_" + index_str, spot.angcol, spotEdited.angcol); + if (ppVersion <= 350) { + if (keyFile.has_key("Locallab", "Feather_" + index_str)) { + spot.feathercol = keyFile.get_integer("Locallab", "Feather_" + index_str); + spotEdited.feathercol = true; + } + } else { + assignFromKeyfile(keyFile, "Locallab", "Feathercol_" + index_str, spot.feathercol, spotEdited.feathercol); + } assignFromKeyfile(keyFile, "Locallab", "Blurcolde_" + index_str, spot.blurcolde, spotEdited.blurcolde); assignFromKeyfile(keyFile, "Locallab", "Blurcol_" + index_str, spot.blurcol, spotEdited.blurcol); assignFromKeyfile(keyFile, "Locallab", "Contcol_" + index_str, spot.contcol, spotEdited.contcol); @@ -8866,7 +9235,13 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) spotEdited.visiexpose = true; } + assignFromKeyfile(keyFile, "Locallab", "Laplacexp_" + index_str, spot.laplacexp, spotEdited.laplacexp); assignFromKeyfile(keyFile, "Locallab", "Complexexpose_" + index_str, spot.complexexpose, spotEdited.complexexpose); + if (ppVersion <= 350 && spot.laplacexp > 0.f) { // Contrast attenuator moved to "advanced" after 5.10. Set complexity to "advanced" if Contrast attenuator is in use. + spot.complexexpose = 0; + spotEdited.complexexpose = true; + } + assignFromKeyfile(keyFile, "Locallab", "Expcomp_" + index_str, spot.expcomp, spotEdited.expcomp); assignFromKeyfile(keyFile, "Locallab", "Hlcompr_" + index_str, spot.hlcompr, spotEdited.hlcompr); assignFromKeyfile(keyFile, "Locallab", "Hlcomprthresh_" + index_str, spot.hlcomprthresh, spotEdited.hlcomprthresh); @@ -8880,6 +9255,14 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Gamex_" + index_str, spot.gamex, spotEdited.gamex); assignFromKeyfile(keyFile, "Locallab", "Strexp_" + index_str, spot.strexp, spotEdited.strexp); assignFromKeyfile(keyFile, "Locallab", "Angexp_" + index_str, spot.angexp, spotEdited.angexp); + if (ppVersion <= 350) { + if (keyFile.has_key("Locallab", "Feather_" + index_str)) { + spot.featherexp = keyFile.get_integer("Locallab", "Feather_" + index_str); + spotEdited.featherexp = true; + } + } else { + assignFromKeyfile(keyFile, "Locallab", "Featherexp_" + index_str, spot.featherexp, spotEdited.featherexp); + } assignFromKeyfile(keyFile, "Locallab", "ExCurve_" + index_str, spot.excurve, spotEdited.excurve); assignFromKeyfile(keyFile, "Locallab", "Norm_" + index_str, spot.norm, spotEdited.norm); assignFromKeyfile(keyFile, "Locallab", "Inversex_" + index_str, spot.inversex, spotEdited.inversex); @@ -8900,7 +9283,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "LmaskexpCurve_" + index_str, spot.Lmaskexpcurve, spotEdited.Lmaskexpcurve); assignFromKeyfile(keyFile, "Locallab", "ExpMethod_" + index_str, spot.expMethod, spotEdited.expMethod); assignFromKeyfile(keyFile, "Locallab", "ExnoiseMethod_" + index_str, spot.exnoiseMethod, spotEdited.exnoiseMethod); - assignFromKeyfile(keyFile, "Locallab", "Laplacexp_" + index_str, spot.laplacexp, spotEdited.laplacexp); + // assignFromKeyfile(keyFile, "Locallab", "Laplacexp_" + index_str, spot.laplacexp, spotEdited.laplacexp); assignFromKeyfile(keyFile, "Locallab", "Reparexp_" + index_str, spot.reparexp, spotEdited.reparexp); assignFromKeyfile(keyFile, "Locallab", "Balanexp_" + index_str, spot.balanexp, spotEdited.balanexp); assignFromKeyfile(keyFile, "Locallab", "Linearexp_" + index_str, spot.linear, spotEdited.linear); @@ -8924,7 +9307,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Complexshadhigh_" + index_str, spot.complexshadhigh, spotEdited.complexshadhigh); assignFromKeyfile(keyFile, "Locallab", "ShMethod_" + index_str, spot.shMethod, spotEdited.shMethod); - for (int j = 0; j < 5; j ++) { + for (int j = 0; j < 6; j ++) { assignFromKeyfile(keyFile, "Locallab", "Multsh" + std::to_string(j) + "_" + index_str, spot.multsh[j], spotEdited.multsh[j]); } @@ -8934,7 +9317,14 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "shadows_" + index_str, spot.shadows, spotEdited.shadows); assignFromKeyfile(keyFile, "Locallab", "s_tonalwidth_" + index_str, spot.s_tonalwidth, spotEdited.s_tonalwidth); assignFromKeyfile(keyFile, "Locallab", "sh_radius_" + index_str, spot.sh_radius, spotEdited.sh_radius); - assignFromKeyfile(keyFile, "Locallab", "sensihs_" + index_str, spot.sensihs, spotEdited.sensihs); + if (ppVersion <= 350) { + if (keyFile.has_key("Locallab", "Colorscope_" + index_str)) { + spot.sensihs = keyFile.get_integer("Locallab", "Colorscope_" + index_str); + spotEdited.sensihs = true; + } + } else { + assignFromKeyfile(keyFile, "Locallab", "sensihs_" + index_str, spot.sensihs, spotEdited.sensihs); + } assignFromKeyfile(keyFile, "Locallab", "EnaSHMask_" + index_str, spot.enaSHMask, spotEdited.enaSHMask); assignFromKeyfile(keyFile, "Locallab", "CCmaskSHCurve_" + index_str, spot.CCmaskSHcurve, spotEdited.CCmaskSHcurve); assignFromKeyfile(keyFile, "Locallab", "LLmaskSHCurve_" + index_str, spot.LLmaskSHcurve, spotEdited.LLmaskSHcurve); @@ -8944,6 +9334,15 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "BlurSHde_" + index_str, spot.blurSHde, spotEdited.blurSHde); assignFromKeyfile(keyFile, "Locallab", "StrSH_" + index_str, spot.strSH, spotEdited.strSH); assignFromKeyfile(keyFile, "Locallab", "AngSH_" + index_str, spot.angSH, spotEdited.angSH); + if (ppVersion <= 350) { + if (keyFile.has_key("Locallab", "Feather_" + index_str)) { + spot.featherSH = keyFile.get_integer("Locallab", "Feather_" + index_str); + spotEdited.featherSH = true; + } + } else { + assignFromKeyfile(keyFile, "Locallab", "FeatherSH_" + index_str, spot.featherSH, spotEdited.featherSH); + } + assignFromKeyfile(keyFile, "Locallab", "Inverssh_" + index_str, spot.inverssh, spotEdited.inverssh); assignFromKeyfile(keyFile, "Locallab", "ChromaskSH_" + index_str, spot.chromaskSH, spotEdited.chromaskSH); assignFromKeyfile(keyFile, "Locallab", "GammaskSH_" + index_str, spot.gammaskSH, spotEdited.gammaskSH); @@ -8987,7 +9386,14 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "ProtectSkins_" + index_str, spot.protectskins, spotEdited.protectskins); assignFromKeyfile(keyFile, "Locallab", "AvoidColorShift_" + index_str, spot.avoidcolorshift, spotEdited.avoidcolorshift); assignFromKeyfile(keyFile, "Locallab", "PastSatTog_" + index_str, spot.pastsattog, spotEdited.pastsattog); - assignFromKeyfile(keyFile, "Locallab", "Sensiv_" + index_str, spot.sensiv, spotEdited.sensiv); + if (ppVersion <= 350) { + if (keyFile.has_key("Locallab", "Colorscope_" + index_str)) { + spot.sensiv = keyFile.get_integer("Locallab", "Colorscope_" + index_str); + spotEdited.sensiv = true; + } + } else { + assignFromKeyfile(keyFile, "Locallab", "Sensiv_" + index_str, spot.sensiv, spotEdited.sensiv); + } assignFromKeyfile(keyFile, "Locallab", "SkinTonesCurve_" + index_str, spot.skintonescurve, spotEdited.skintonescurve); assignFromKeyfile(keyFile, "Locallab", "CCmaskvibCurve_" + index_str, spot.CCmaskvibcurve, spotEdited.CCmaskvibcurve); assignFromKeyfile(keyFile, "Locallab", "LLmaskvibCurve_" + index_str, spot.LLmaskvibcurve, spotEdited.LLmaskvibcurve); @@ -9003,6 +9409,15 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Strvibab_" + index_str, spot.strvibab, spotEdited.strvibab); assignFromKeyfile(keyFile, "Locallab", "Strvibh_" + index_str, spot.strvibh, spotEdited.strvibh); assignFromKeyfile(keyFile, "Locallab", "Angvib_" + index_str, spot.angvib, spotEdited.angvib); + if (ppVersion <= 350) { + if (keyFile.has_key("Locallab", "Feather_" + index_str)) { + spot.feathervib = keyFile.get_integer("Locallab", "Feather_" + index_str); + spotEdited.feathervib = true; + } + } else { + assignFromKeyfile(keyFile, "Locallab", "Feathervib_" + index_str, spot.feathervib, spotEdited.feathervib); + } + assignFromKeyfile(keyFile, "Locallab", "LmaskvibCurve_" + index_str, spot.Lmaskvibcurve, spotEdited.Lmaskvibcurve); assignFromKeyfile(keyFile, "Locallab", "Recothresv_" + index_str, spot.recothresv, spotEdited.recothresv); assignFromKeyfile(keyFile, "Locallab", "Lowthresv_" + index_str, spot.lowthresv, spotEdited.lowthresv); @@ -9168,7 +9583,8 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Inversret_" + index_str, spot.inversret, spotEdited.inversret); assignFromKeyfile(keyFile, "Locallab", "Equilret_" + index_str, spot.equilret, spotEdited.equilret); assignFromKeyfile(keyFile, "Locallab", "Loglin_" + index_str, spot.loglin, spotEdited.loglin); - assignFromKeyfile(keyFile, "Locallab", "dehazeSaturation" + index_str, spot.dehazeSaturation, spotEdited.dehazeSaturation); + assignFromKeyfile(keyFile, "Locallab", "dehazeSaturation_" + index_str, spot.dehazeSaturation, spotEdited.dehazeSaturation); + assignFromKeyfile(keyFile, "Locallab", "dehazeblack_" + index_str, spot.dehazeblack, spotEdited.dehazeblack); assignFromKeyfile(keyFile, "Locallab", "Softradiusret_" + index_str, spot.softradiusret, spotEdited.softradiusret); assignFromKeyfile(keyFile, "Locallab", "CCmaskretiCurve_" + index_str, spot.CCmaskreticurve, spotEdited.CCmaskreticurve); assignFromKeyfile(keyFile, "Locallab", "LLmaskretiCurve_" + index_str, spot.LLmaskreticurve, spotEdited.LLmaskreticurve); @@ -9251,6 +9667,15 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Sigmalc2_" + index_str, spot.sigmalc2, spotEdited.sigmalc2); assignFromKeyfile(keyFile, "Locallab", "Strwav_" + index_str, spot.strwav, spotEdited.strwav); assignFromKeyfile(keyFile, "Locallab", "Angwav_" + index_str, spot.angwav, spotEdited.angwav); + if (ppVersion <= 350) { + if (keyFile.has_key("Locallab", "Feather_" + index_str)) { + spot.featherwav = keyFile.get_integer("Locallab", "Feather_" + index_str); + spotEdited.featherwav = true; + } + } else { + assignFromKeyfile(keyFile, "Locallab", "Featherwav_" + index_str, spot.featherwav, spotEdited.featherwav); + } + assignFromKeyfile(keyFile, "Locallab", "Strengthw_" + index_str, spot.strengthw, spotEdited.strengthw); assignFromKeyfile(keyFile, "Locallab", "Sigmaed_" + index_str, spot.sigmaed, spotEdited.sigmaed); assignFromKeyfile(keyFile, "Locallab", "Radiusw_" + index_str, spot.radiusw, spotEdited.radiusw); @@ -9365,9 +9790,22 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "AutoGray_" + index_str, spot.Autogray, spotEdited.Autogray); assignFromKeyfile(keyFile, "Locallab", "Fullimage_" + index_str, spot.fullimage, spotEdited.fullimage); assignFromKeyfile(keyFile, "Locallab", "Repart_" + index_str, spot.repar, spotEdited.repar); - assignFromKeyfile(keyFile, "Locallab", "Ciecam_" + index_str, spot.ciecam, spotEdited.ciecam); + if (ppVersion <= 350) {//issue 7114 + if (keyFile.has_key("Locallab", "Ciecam_" + index_str)) { + spot.ciecam = true; + spotEdited.ciecam = true; + } + } else { + assignFromKeyfile(keyFile, "Locallab", "Ciecam_" + index_str, spot.ciecam, spotEdited.ciecam); + } + + assignFromKeyfile(keyFile, "Locallab", "Satlog_" + index_str, spot.satlog, spotEdited.satlog); assignFromKeyfile(keyFile, "Locallab", "BlackEv_" + index_str, spot.blackEv, spotEdited.blackEv); assignFromKeyfile(keyFile, "Locallab", "WhiteEv_" + index_str, spot.whiteEv, spotEdited.whiteEv); + assignFromKeyfile(keyFile, "Locallab", "Whiteslog_" + index_str, spot.whiteslog, spotEdited.whiteslog); + assignFromKeyfile(keyFile, "Locallab", "Blackslog_" + index_str, spot.blackslog, spotEdited.blackslog); + assignFromKeyfile(keyFile, "Locallab", "Comprlog_" + index_str, spot.comprlog, spotEdited.comprlog); + assignFromKeyfile(keyFile, "Locallab", "Strelog_" + index_str, spot.strelog, spotEdited.strelog); assignFromKeyfile(keyFile, "Locallab", "Detail_" + index_str, spot.detail, spotEdited.detail); assignFromKeyfile(keyFile, "Locallab", "Sensilog_" + index_str, spot.sensilog, spotEdited.sensilog); assignFromKeyfile(keyFile, "Locallab", "Baselog_" + index_str, spot.baselog, spotEdited.baselog); @@ -9375,6 +9813,14 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Surround_" + index_str, spot.surround, spotEdited.surround); assignFromKeyfile(keyFile, "Locallab", "Strlog_" + index_str, spot.strlog, spotEdited.strlog); assignFromKeyfile(keyFile, "Locallab", "Anglog_" + index_str, spot.anglog, spotEdited.anglog); + if (ppVersion <= 350) { + if (keyFile.has_key("Locallab", "Feather_" + index_str)) { + spot.featherlog = keyFile.get_integer("Locallab", "Feather_" + index_str); + spotEdited.featherlog = true; + } + } else { + assignFromKeyfile(keyFile, "Locallab", "Featherlog_" + index_str, spot.featherlog, spotEdited.featherlog); + } assignFromKeyfile(keyFile, "Locallab", "CCmaskCurveL_" + index_str, spot.CCmaskcurveL, spotEdited.CCmaskcurveL); assignFromKeyfile(keyFile, "Locallab", "LLmaskCurveL_" + index_str, spot.LLmaskcurveL, spotEdited.LLmaskcurveL); assignFromKeyfile(keyFile, "Locallab", "HHmaskCurveL_" + index_str, spot.HHmaskcurveL, spotEdited.HHmaskcurveL); @@ -9412,6 +9858,15 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Shadmask_" + index_str, spot.shadmask, spotEdited.shadmask); assignFromKeyfile(keyFile, "Locallab", "Str_mask_" + index_str, spot.str_mask, spotEdited.str_mask); assignFromKeyfile(keyFile, "Locallab", "Ang_mask_" + index_str, spot.ang_mask, spotEdited.ang_mask); + if (ppVersion <= 350) { + if (keyFile.has_key("Locallab", "Feather_" + index_str)) { + spot.feather_mask = keyFile.get_integer("Locallab", "Feather_" + index_str); + spotEdited.feather_mask = true; + } + } else { + assignFromKeyfile(keyFile, "Locallab", "Feather_mask_" + index_str, spot.feather_mask, spotEdited.feather_mask); + } + assignFromKeyfile(keyFile, "Locallab", "HHhmask_Curve_" + index_str, spot.HHhmask_curve, spotEdited.HHhmask_curve); assignFromKeyfile(keyFile, "Locallab", "Lmask_Curve_" + index_str, spot.Lmask_curve, spotEdited.Lmask_curve); assignFromKeyfile(keyFile, "Locallab", "LLmask_Curvewav_" + index_str, spot.LLmask_curvewav, spotEdited.LLmask_curvewav); @@ -9436,6 +9891,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) if (spot.visicie) { spotEdited.visicie = true; } + assignFromKeyfile(keyFile, "Locallab", "Expprecam_" + index_str, spot.expprecam, spotEdited.expprecam); assignFromKeyfile(keyFile, "Locallab", "Complexcie_" + index_str, spot.complexcie, spotEdited.complexcie); assignFromKeyfile(keyFile, "Locallab", "Reparcie_" + index_str, spot.reparcie, spotEdited.reparcie); assignFromKeyfile(keyFile, "Locallab", "Sensicie_" + index_str, spot.sensicie, spotEdited.sensicie); @@ -9444,8 +9900,17 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Forcebw_" + index_str, spot.forcebw, spotEdited.forcebw); assignFromKeyfile(keyFile, "Locallab", "Qtoj_" + index_str, spot.qtoj, spotEdited.qtoj); assignFromKeyfile(keyFile, "Locallab", "jabcie_" + index_str, spot.jabcie, spotEdited.jabcie); - assignFromKeyfile(keyFile, "Locallab", "sigmoidqjcie_" + index_str, spot.sigmoidqjcie, spotEdited.sigmoidqjcie); + assignFromKeyfile(keyFile, "Locallab", "comprcieauto_" + index_str, spot.comprcieauto, spotEdited.comprcieauto); + assignFromKeyfile(keyFile, "Locallab", "normcie_" + index_str, spot.normcie, spotEdited.normcie); + assignFromKeyfile(keyFile, "Locallab", "gamutcie_" + index_str, spot.gamutcie, spotEdited.gamutcie); + assignFromKeyfile(keyFile, "Locallab", "bwcie_" + index_str, spot.bwcie, spotEdited.bwcie); + assignFromKeyfile(keyFile, "Locallab", "sigcie_" + index_str, spot.sigcie, spotEdited.sigcie); assignFromKeyfile(keyFile, "Locallab", "logcie_" + index_str, spot.logcie, spotEdited.logcie); + assignFromKeyfile(keyFile, "Locallab", "satcie_" + index_str, spot.satcie, spotEdited.satcie); + assignFromKeyfile(keyFile, "Locallab", "logcieq_" + index_str, spot.logcieq, spotEdited.logcieq); + assignFromKeyfile(keyFile, "Locallab", "smoothcie_" + index_str, spot.smoothcie, spotEdited.smoothcie); + assignFromKeyfile(keyFile, "Locallab", "smoothcieyb_" + index_str, spot.smoothcieyb, spotEdited.smoothcieyb); + assignFromKeyfile(keyFile, "Locallab", "smoothcielum_" + index_str, spot.smoothcielum, spotEdited.smoothcielum); assignFromKeyfile(keyFile, "Locallab", "Logjz_" + index_str, spot.logjz, spotEdited.logjz); assignFromKeyfile(keyFile, "Locallab", "Sigjz_" + index_str, spot.sigjz, spotEdited.sigjz); assignFromKeyfile(keyFile, "Locallab", "Sigq_" + index_str, spot.sigq, spotEdited.sigq); @@ -9455,8 +9920,9 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Sursourcie_" + index_str, spot.sursourcie, spotEdited.sursourcie); assignFromKeyfile(keyFile, "Locallab", "Modecie_" + index_str, spot.modecie, spotEdited.modecie); assignFromKeyfile(keyFile, "Locallab", "Modecam_" + index_str, spot.modecam, spotEdited.modecam); + assignFromKeyfile(keyFile, "Locallab", "bwevMethod_" + index_str, spot.bwevMethod, spotEdited.bwevMethod); assignFromKeyfile(keyFile, "Locallab", "Saturlcie_" + index_str, spot.saturlcie, spotEdited.saturlcie); - assignFromKeyfile(keyFile, "Locallab", "Rstprotectcie_" + index_str, spot.rstprotectcie, spotEdited.rstprotectcie); + assignFromKeyfile(keyFile, "Locallab", "Rstprotectcie_" + index_str, spot.rstprotectcie, spotEdited.rstprotectcie); assignFromKeyfile(keyFile, "Locallab", "Chromlcie_" + index_str, spot.chromlcie, spotEdited.chromlcie); assignFromKeyfile(keyFile, "Locallab", "Huecie_" + index_str, spot.huecie, spotEdited.huecie); assignFromKeyfile(keyFile, "Locallab", "ToneMethodcie_" + index_str, spot.toneMethodcie, spotEdited.toneMethodcie); @@ -9467,7 +9933,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Saturjzcie_" + index_str, spot.saturjzcie, spotEdited.saturjzcie); assignFromKeyfile(keyFile, "Locallab", "Huejzcie_" + index_str, spot.huejzcie, spotEdited.huejzcie); assignFromKeyfile(keyFile, "Locallab", "Softjzcie_" + index_str, spot.softjzcie, spotEdited.softjzcie); - assignFromKeyfile(keyFile, "Locallab", "strSoftjzcie_" + index_str, spot.strsoftjzcie, spotEdited.strsoftjzcie); + assignFromKeyfile(keyFile, "Locallab", "strSoftjzcie_" + index_str, spot.strsoftjzcie, spotEdited.strsoftjzcie); assignFromKeyfile(keyFile, "Locallab", "Thrhjzcie_" + index_str, spot.thrhjzcie, spotEdited.thrhjzcie); assignFromKeyfile(keyFile, "Locallab", "JzCurve_" + index_str, spot.jzcurve, spotEdited.jzcurve); assignFromKeyfile(keyFile, "Locallab", "CzCurve_" + index_str, spot.czcurve, spotEdited.czcurve); @@ -9478,14 +9944,16 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Lightlcie_" + index_str, spot.lightlcie, spotEdited.lightlcie); assignFromKeyfile(keyFile, "Locallab", "Lightjzcie_" + index_str, spot.lightjzcie, spotEdited.lightjzcie); assignFromKeyfile(keyFile, "Locallab", "Brightqcie_" + index_str, spot.lightqcie, spotEdited.lightqcie); + assignFromKeyfile(keyFile, "Locallab", "Brightsigqcie_" + index_str, spot.lightsigqcie, spotEdited.lightsigqcie); assignFromKeyfile(keyFile, "Locallab", "Contlcie_" + index_str, spot.contlcie, spotEdited.contlcie); assignFromKeyfile(keyFile, "Locallab", "Contjzcie_" + index_str, spot.contjzcie, spotEdited.contjzcie); - assignFromKeyfile(keyFile, "Locallab", "Adapjzcie_" + index_str, spot.adapjzcie, spotEdited.adapjzcie); + assignFromKeyfile(keyFile, "Locallab", "Detailciejz_" + index_str, spot.detailciejz, spotEdited.detailciejz); + assignFromKeyfile(keyFile, "Locallab", "Adapjzcie_" + index_str, spot.adapjzcie, spotEdited.adapjzcie); assignFromKeyfile(keyFile, "Locallab", "Jz100_" + index_str, spot.jz100, spotEdited.jz100); assignFromKeyfile(keyFile, "Locallab", "PQremap_" + index_str, spot.pqremap, spotEdited.pqremap); - assignFromKeyfile(keyFile, "Locallab", "PQremapcam16_" + index_str, spot.pqremapcam16, spotEdited.pqremapcam16); + assignFromKeyfile(keyFile, "Locallab", "PQremapcam16_" + index_str, spot.pqremapcam16, spotEdited.pqremapcam16); assignFromKeyfile(keyFile, "Locallab", "Hljzcie_" + index_str, spot.hljzcie, spotEdited.hljzcie); - assignFromKeyfile(keyFile, "Locallab", "Hlthjzcie_" + index_str, spot.hlthjzcie, spotEdited.hlthjzcie); + assignFromKeyfile(keyFile, "Locallab", "Hlthjzcie_" + index_str, spot.hlthjzcie, spotEdited.hlthjzcie); assignFromKeyfile(keyFile, "Locallab", "Shjzcie_" + index_str, spot.shjzcie, spotEdited.shjzcie); assignFromKeyfile(keyFile, "Locallab", "Shthjzcie_" + index_str, spot.shthjzcie, spotEdited.shthjzcie); assignFromKeyfile(keyFile, "Locallab", "Radjzcie_" + index_str, spot.radjzcie, spotEdited.radjzcie); @@ -9510,32 +9978,72 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "WhiteEvjz_" + index_str, spot.whiteEvjz, spotEdited.whiteEvjz); assignFromKeyfile(keyFile, "Locallab", "Targetjz_" + index_str, spot.targetjz, spotEdited.targetjz); assignFromKeyfile(keyFile, "Locallab", "Sigmoidthcie_" + index_str, spot.sigmoidthcie, spotEdited.sigmoidthcie); + assignFromKeyfile(keyFile, "Locallab", "Sigmoidsenscie_" + index_str, spot.sigmoidsenscie, spotEdited.sigmoidsenscie); assignFromKeyfile(keyFile, "Locallab", "Sigmoidblcie_" + index_str, spot.sigmoidblcie, spotEdited.sigmoidblcie); + assignFromKeyfile(keyFile, "Locallab", "comprcie_" + index_str, spot.comprcie, spotEdited.comprcie); + assignFromKeyfile(keyFile, "Locallab", "strcielog_" + index_str, spot.strcielog, spotEdited.strcielog); + assignFromKeyfile(keyFile, "Locallab", "comprcieth_" + index_str, spot.comprcieth, spotEdited.comprcieth); + assignFromKeyfile(keyFile, "Locallab", "gamjcie_" + index_str, spot.gamjcie, spotEdited.gamjcie); + assignFromKeyfile(keyFile, "Locallab", "slopjcie_" + index_str, spot.slopjcie, spotEdited.slopjcie); + assignFromKeyfile(keyFile, "Locallab", "slopesmo_" + index_str, spot.slopesmo, spotEdited.slopesmo); + assignFromKeyfile(keyFile, "Locallab", "slopesmor_" + index_str, spot.slopesmor, spotEdited.slopesmor); + assignFromKeyfile(keyFile, "Locallab", "slopesmog_" + index_str, spot.slopesmog, spotEdited.slopesmog); + assignFromKeyfile(keyFile, "Locallab", "midtcie_" + index_str, spot.midtcie, spotEdited.midtcie); + assignFromKeyfile(keyFile, "Locallab", "slopesmob_" + index_str, spot.slopesmob, spotEdited.slopesmob); + assignFromKeyfile(keyFile, "Locallab", "grexl_" + index_str, spot.grexl, spotEdited.grexl); + assignFromKeyfile(keyFile, "Locallab", "greyl_" + index_str, spot.greyl, spotEdited.greyl); + assignFromKeyfile(keyFile, "Locallab", "bluxl_" + index_str, spot.bluxl, spotEdited.bluxl); + assignFromKeyfile(keyFile, "Locallab", "bluyl_" + index_str, spot.bluyl, spotEdited.bluyl); + assignFromKeyfile(keyFile, "Locallab", "redxl_" + index_str, spot.redxl, spotEdited.redxl); + assignFromKeyfile(keyFile, "Locallab", "redyl_" + index_str, spot.redyl, spotEdited.redyl); + assignFromKeyfile(keyFile, "Locallab", "refi_" + index_str, spot.refi, spotEdited.refi); + assignFromKeyfile(keyFile, "Locallab", "shiftxl_" + index_str, spot.shiftxl, spotEdited.shiftxl); + assignFromKeyfile(keyFile, "Locallab", "shiftyl_" + index_str, spot.shiftyl, spotEdited.shiftyl); + assignFromKeyfile(keyFile, "Locallab", "labgridcieALow_" + index_str, spot.labgridcieALow, spotEdited.labgridcieALow); + assignFromKeyfile(keyFile, "Locallab", "labgridcieBLow_" + index_str, spot.labgridcieBLow, spotEdited.labgridcieBLow); + assignFromKeyfile(keyFile, "Locallab", "labgridcieAHigh_" + index_str, spot.labgridcieAHigh, spotEdited.labgridcieAHigh); + assignFromKeyfile(keyFile, "Locallab", "labgridcieBHigh_" + index_str, spot.labgridcieBHigh, spotEdited.labgridcieBHigh); + assignFromKeyfile(keyFile, "Locallab", "labgridcieGx_" + index_str, spot.labgridcieGx, spotEdited.labgridcieGx); + assignFromKeyfile(keyFile, "Locallab", "labgridcieGy_" + index_str, spot.labgridcieGy, spotEdited.labgridcieGy); + assignFromKeyfile(keyFile, "Locallab", "labgridcieWx_" + index_str, spot.labgridcieWx, spotEdited.labgridcieWx); + assignFromKeyfile(keyFile, "Locallab", "labgridcieWy_" + index_str, spot.labgridcieWy, spotEdited.labgridcieWy); + assignFromKeyfile(keyFile, "Locallab", "labgridcieMx_" + index_str, spot.labgridcieMx, spotEdited.labgridcieMx); + assignFromKeyfile(keyFile, "Locallab", "labgridcieMy_" + index_str, spot.labgridcieMy, spotEdited.labgridcieMy); + + assignFromKeyfile(keyFile, "Locallab", "whitescie_" + index_str, spot.whitescie, spotEdited.whitescie); + assignFromKeyfile(keyFile, "Locallab", "blackscie_" + index_str, spot.blackscie, spotEdited.blackscie); + assignFromKeyfile(keyFile, "Locallab", "illMethod_" + index_str, spot.illMethod, spotEdited.illMethod); + assignFromKeyfile(keyFile, "Locallab", "smoothciemet_" + index_str, spot.smoothciemet, spotEdited.smoothciemet); + assignFromKeyfile(keyFile, "Locallab", "primMethod_" + index_str, spot.primMethod, spotEdited.primMethod); + assignFromKeyfile(keyFile, "Locallab", "catMethod_" + index_str, spot.catMethod, spotEdited.catMethod); assignFromKeyfile(keyFile, "Locallab", "Sigmoidldajzcie_" + index_str, spot.sigmoidldajzcie, spotEdited.sigmoidldajzcie); assignFromKeyfile(keyFile, "Locallab", "Sigmoidthjzcie_" + index_str, spot.sigmoidthjzcie, spotEdited.sigmoidthjzcie); assignFromKeyfile(keyFile, "Locallab", "Sigmoidbljzcie_" + index_str, spot.sigmoidbljzcie, spotEdited.sigmoidbljzcie); assignFromKeyfile(keyFile, "Locallab", "Contqcie_" + index_str, spot.contqcie, spotEdited.contqcie); + assignFromKeyfile(keyFile, "Locallab", "Contsigqcie_" + index_str, spot.contsigqcie, spotEdited.contsigqcie); assignFromKeyfile(keyFile, "Locallab", "Colorflcie_" + index_str, spot.colorflcie, spotEdited.colorflcie); -/* - assignFromKeyfile(keyFile, "Locallab", "Lightlzcam_" + index_str, spot.lightlzcam, spotEdited.lightlzcam); - assignFromKeyfile(keyFile, "Locallab", "Lightqzcam_" + index_str, spot.lightqzcam, spotEdited.lightqzcam); - assignFromKeyfile(keyFile, "Locallab", "Contlzcam_" + index_str, spot.contlzcam, spotEdited.contlzcam); - assignFromKeyfile(keyFile, "Locallab", "Contqzcam_" + index_str, spot.contqzcam, spotEdited.contqzcam); - assignFromKeyfile(keyFile, "Locallab", "Contthreszcam_" + index_str, spot.contthreszcam, spotEdited.contthreszcam); -*/ assignFromKeyfile(keyFile, "Locallab", "Targabscie_" + index_str, spot.targabscie, spotEdited.targabscie); assignFromKeyfile(keyFile, "Locallab", "TargetGraycie_" + index_str, spot.targetGraycie, spotEdited.targetGraycie); assignFromKeyfile(keyFile, "Locallab", "Catadcie_" + index_str, spot.catadcie, spotEdited.catadcie); assignFromKeyfile(keyFile, "Locallab", "Detailcie_" + index_str, spot.detailcie, spotEdited.detailcie); -/* - assignFromKeyfile(keyFile, "Locallab", "Colorflzcam_" + index_str, spot.colorflzcam, spotEdited.colorflzcam); - assignFromKeyfile(keyFile, "Locallab", "Saturzcam_" + index_str, spot.saturzcam, spotEdited.saturzcam); - assignFromKeyfile(keyFile, "Locallab", "Chromzcam_" + index_str, spot.chromzcam, spotEdited.chromzcam); -*/ - assignFromKeyfile(keyFile, "Locallab", "EnacieMask_" + index_str, spot.enacieMask, spotEdited.enacieMask); + assignFromKeyfile(keyFile, "Locallab", "Surroundcie_" + index_str, spot.surroundcie, spotEdited.surroundcie); + assignFromKeyfile(keyFile, "Locallab", "Strgradcie_" + index_str, spot.strgradcie, spotEdited.strgradcie); + assignFromKeyfile(keyFile, "Locallab", "Anggradcie_" + index_str, spot.anggradcie, spotEdited.anggradcie); + if (ppVersion <= 350) { + if (keyFile.has_key("Locallab", "Feather_" + index_str)) { + spot.feathercie = keyFile.get_integer("Locallab", "Feather_" + index_str); + spotEdited.feathercie = true; + } + } else { + assignFromKeyfile(keyFile, "Locallab", "Feathercie_" + index_str, spot.feathercie, spotEdited.feathercie); + } + + assignFromKeyfile(keyFile, "Locallab", "EnacieMask_" + index_str, spot.enacieMask, spotEdited.enacieMask); + assignFromKeyfile(keyFile, "Locallab", "EnacieMaskall_" + index_str, spot.enacieMaskall, spotEdited.enacieMaskall); assignFromKeyfile(keyFile, "Locallab", "CCmaskcieCurve_" + index_str, spot.CCmaskciecurve, spotEdited.CCmaskciecurve); assignFromKeyfile(keyFile, "Locallab", "LLmaskcieCurve_" + index_str, spot.LLmaskciecurve, spotEdited.LLmaskciecurve); - assignFromKeyfile(keyFile, "Locallab", "HHmaskcieCurve_" + index_str, spot.HHmaskciecurve, spotEdited.HHmaskciecurve); + assignFromKeyfile(keyFile, "Locallab", "HHmaskcieCurve_" + index_str, spot.HHmaskciecurve, spotEdited.HHmaskciecurve); + assignFromKeyfile(keyFile, "Locallab", "HHhmaskcieCurve_" + index_str, spot.HHhmaskciecurve, spotEdited.HHhmaskciecurve); assignFromKeyfile(keyFile, "Locallab", "Blendmaskcie_" + index_str, spot.blendmaskcie, spotEdited.blendmaskcie); assignFromKeyfile(keyFile, "Locallab", "Radmaskcie_" + index_str, spot.radmaskcie, spotEdited.radmaskcie); assignFromKeyfile(keyFile, "Locallab", "Chromaskcie_" + index_str, spot.chromaskcie, spotEdited.chromaskcie); @@ -9547,6 +10055,24 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Lowthrescie_" + index_str, spot.lowthrescie, spotEdited.lowthrescie); assignFromKeyfile(keyFile, "Locallab", "Higthrescie_" + index_str, spot.higthrescie, spotEdited.higthrescie); assignFromKeyfile(keyFile, "Locallab", "Decaycie_" + index_str, spot.decaycie, spotEdited.decaycie); + assignFromKeyfile(keyFile, "Locallab", "strumaskcie_" + index_str, spot.strumaskcie, spotEdited.strumaskcie); + assignFromKeyfile(keyFile, "Locallab", "toolcie_" + index_str, spot.toolcie, spotEdited.toolcie); + assignFromKeyfile(keyFile, "Locallab", "FftcieMask_" + index_str, spot.fftcieMask, spotEdited.fftcieMask); + assignFromKeyfile(keyFile, "Locallab", "contcie_" + index_str, spot.contcie, spotEdited.contcie); + assignFromKeyfile(keyFile, "Locallab", "blurcie_" + index_str, spot.blurcie, spotEdited.blurcie); + assignFromKeyfile(keyFile, "Locallab", "highmaskcie_" + index_str, spot.highmaskcie, spotEdited.highmaskcie); + assignFromKeyfile(keyFile, "Locallab", "shadmaskcie_" + index_str, spot.shadmaskcie, spotEdited.shadmaskcie); + assignFromKeyfile(keyFile, "Locallab", "LLmaskcieCurvewav_" + index_str, spot.LLmaskciecurvewav, spotEdited.LLmaskciecurvewav); + + if (keyFile.has_key("Locallab", "CSThresholdcie_" + index_str)) { + const std::vector thresh = keyFile.get_integer_list("Locallab", "CSThresholdcie_" + index_str); + + if (thresh.size() >= 4) { + spot.csthresholdcie.setValues(thresh[0], thresh[1], min(thresh[2], 10), min(thresh[3], 10)); + } + + spotEdited.csthresholdcie = true; + } // Append LocallabSpot and LocallabParamsEdited locallab.spots.push_back(spot); @@ -9727,7 +10253,8 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) {"D120", ColorManagementParams::Illuminant::D120}, {"stda", ColorManagementParams::Illuminant::STDA}, {"2000", ColorManagementParams::Illuminant::TUNGSTEN_2000K}, - {"1500", ColorManagementParams::Illuminant::TUNGSTEN_1500K} + {"1500", ColorManagementParams::Illuminant::TUNGSTEN_1500K}, + {"E", ColorManagementParams::Illuminant::E} }, icm.will, pedited->icm.will @@ -9753,6 +10280,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) {"wid", ColorManagementParams::Primaries::WIDE_GAMUT}, {"ac0", ColorManagementParams::Primaries::ACES_P0}, {"jdcmax", ColorManagementParams::Primaries::JDC_MAX}, + {"jdcmaxstdA", ColorManagementParams::Primaries::JDC_MAXSTDA}, {"bru", ColorManagementParams::Primaries::BRUCE_RGB}, {"bet", ColorManagementParams::Primaries::BETA_RGB}, {"bst", ColorManagementParams::Primaries::BEST_RGB}, @@ -9768,8 +10296,33 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) pedited->icm.wprim = true; } } - assignFromKeyfile(keyFile, "Color Management", "WorkingTRCGamma", icm.workingTRCGamma, pedited->icm.workingTRCGamma); + if ( + !assignFromKeyfile( + keyFile, + "Color Management", + "Wcat", + { + {"brad", ColorManagementParams::Cat::BRAD}, + {"cat16", ColorManagementParams::Cat::CAT16}, + {"cat02", ColorManagementParams::Cat::CAT02}, + {"cat_vk", ColorManagementParams::Cat::CAT_VK}, + {"cat_xyz", ColorManagementParams::Cat::CAT_XYZ} + }, + icm.wcat, + pedited->icm.wcat + ) + ){ + icm.wcat = ColorManagementParams::Cat::BRAD; + if (pedited) { + pedited->icm.wcat = true; + } + } + + assignFromKeyfile(keyFile, "Color Management", "Gamut", icm.gamut, pedited->icm.gamut); assignFromKeyfile(keyFile, "Color Management", "WorkingTRCSlope", icm.workingTRCSlope, pedited->icm.workingTRCSlope); + assignFromKeyfile(keyFile, "Color Management", "WorkingTRCGamma", icm.workingTRCGamma, pedited->icm.workingTRCGamma); + assignFromKeyfile(keyFile, "Color Management", "Wmidtcie", icm.wmidtcie, pedited->icm.wmidtcie); + assignFromKeyfile(keyFile, "Color Management", "Wsmoothcie", icm.wsmoothcie, pedited->icm.wsmoothcie); assignFromKeyfile(keyFile, "Color Management", "Redx", icm.redx, pedited->icm.redx); assignFromKeyfile(keyFile, "Color Management", "Redy", icm.redy, pedited->icm.redy); @@ -9777,9 +10330,12 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Color Management", "Grey", icm.grey, pedited->icm.grey); assignFromKeyfile(keyFile, "Color Management", "Blux", icm.blux, pedited->icm.blux); assignFromKeyfile(keyFile, "Color Management", "Bluy", icm.bluy, pedited->icm.bluy); + assignFromKeyfile(keyFile, "Color Management", "Refi", icm.refi, pedited->icm.refi); + assignFromKeyfile(keyFile, "Color Management", "Shiftx", icm.shiftx, pedited->icm.shiftx); + assignFromKeyfile(keyFile, "Color Management", "Shifty", icm.shifty, pedited->icm.shifty); assignFromKeyfile(keyFile, "Color Management", "Preser", icm.preser, pedited->icm.preser); assignFromKeyfile(keyFile, "Color Management", "Fbw", icm.fbw, pedited->icm.fbw); - assignFromKeyfile(keyFile, "Color Management", "Gamut", icm.gamut, pedited->icm.gamut); + assignFromKeyfile(keyFile, "Color Management", "TrcExp", icm.trcExp, pedited->icm.trcExp); assignFromKeyfile(keyFile, "Color Management", "LabGridcieALow", icm.labgridcieALow, pedited->icm.labgridcieALow); assignFromKeyfile(keyFile, "Color Management", "LabGridcieBLow", icm.labgridcieBLow, pedited->icm.labgridcieBLow); assignFromKeyfile(keyFile, "Color Management", "LabGridcieAHigh", icm.labgridcieAHigh, pedited->icm.labgridcieAHigh); @@ -9788,6 +10344,8 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Color Management", "LabGridcieGy", icm.labgridcieGy, pedited->icm.labgridcieGy); assignFromKeyfile(keyFile, "Color Management", "LabGridcieWx", icm.labgridcieWx, pedited->icm.labgridcieWx); assignFromKeyfile(keyFile, "Color Management", "LabGridcieWy", icm.labgridcieWy, pedited->icm.labgridcieWy); + assignFromKeyfile(keyFile, "Color Management", "LabGridcieMx", icm.labgridcieMx, pedited->icm.labgridcieMx); + assignFromKeyfile(keyFile, "Color Management", "LabGridcieMy", icm.labgridcieMy, pedited->icm.labgridcieMy); if (keyFile.has_key("Color Management", "aIntent")) { Glib::ustring intent = keyFile.get_string("Color Management", "aIntent"); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 864937dc0..e6945cfbd 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -863,7 +863,7 @@ struct SHParams { */ struct ToneEqualizerParams { bool enabled; - std::array bands; + std::array bands; int regularization; bool show_colormap; double pivot; @@ -966,7 +966,8 @@ struct LensProfParams { NONE, // No lens correction LENSFUNAUTOMATCH, // Lens correction using auto matched lensfun database entry LENSFUNMANUAL, // Lens correction using manually selected lensfun database entry - LCP // Lens correction using lcp file + LCP, // Lens correction using lcp file + METADATA // Lens correction using embedded metadata }; LcMode lcMode; @@ -985,6 +986,7 @@ struct LensProfParams { bool lfAutoMatch() const; bool useLcp() const; bool lfManual() const; + bool useMetadata() const; const std::vector& getMethodStrings() const; Glib::ustring getMethodString(LcMode mode) const; @@ -1122,6 +1124,7 @@ struct LocallabParams { double strcolab; double strcolh; double angcol; + double feathercol; int blurcolde; double blurcol; double contcol; @@ -1184,6 +1187,7 @@ struct LocallabParams { double gamex; double strexp; double angexp; + double featherexp; std::vector excurve; bool norm; bool inversex; @@ -1223,7 +1227,7 @@ struct LocallabParams { bool expshadhigh; int complexshadhigh; Glib::ustring shMethod; // std, tone - int multsh[5]; + int multsh[6]; int highlights; int h_tonalwidth; int shadows; @@ -1239,6 +1243,7 @@ struct LocallabParams { int blurSHde; double strSH; double angSH; + double featherSH; bool inverssh; double chromaskSH; double gammaskSH; @@ -1284,6 +1289,7 @@ struct LocallabParams { double strvibab; double strvibh; double angvib; + double feathervib; std::vector Lmaskvibcurve; double recothresv; double lowthresv; @@ -1425,6 +1431,7 @@ struct LocallabParams { bool equilret; bool loglin; double dehazeSaturation; + double dehazeblack; double softradiusret; std::vector CCmaskreticurve; std::vector LLmaskreticurve; @@ -1499,6 +1506,7 @@ struct LocallabParams { double sigmalc2; double strwav; double angwav; + double featherwav; double strengthw; double sigmaed; double radiusw; @@ -1591,8 +1599,13 @@ struct LocallabParams { bool fullimage; double repar; bool ciecam; + bool satlog; double blackEv; double whiteEv; + int whiteslog; + int blackslog; + double comprlog; + double strelog; double detail; int sensilog; Glib::ustring sursour; @@ -1600,6 +1613,7 @@ struct LocallabParams { double baselog; double strlog; double anglog; + double featherlog; std::vector CCmaskcurveL; std::vector LLmaskcurveL; std::vector HHmaskcurveL; @@ -1638,6 +1652,7 @@ struct LocallabParams { double shadmask; int str_mask; int ang_mask; + int feather_mask; std::vector HHhmask_curve; std::vector Lmask_curve; std::vector LLmask_curvewav; @@ -1645,6 +1660,7 @@ struct LocallabParams { //ciecam bool visicie; bool expcie; + bool expprecam; int complexcie; double reparcie; int sensicie; @@ -1653,8 +1669,17 @@ struct LocallabParams { bool forcebw; bool qtoj; bool jabcie; - bool sigmoidqjcie; + bool comprcieauto; + bool normcie; + bool gamutcie; + bool bwcie; + bool sigcie; bool logcie; + bool satcie; + bool logcieq; + bool smoothcie; + bool smoothcieyb; + bool smoothcielum; bool logjz; bool sigjz; bool sigq; @@ -1664,6 +1689,7 @@ struct LocallabParams { Glib::ustring sursourcie; Glib::ustring modecie; Glib::ustring modecam; + Glib::ustring bwevMethod; double saturlcie; double rstprotectcie; double chromlcie; @@ -1687,8 +1713,10 @@ struct LocallabParams { double lightlcie; double lightjzcie; double lightqcie; + double lightsigqcie; double contlcie; double contjzcie; + double detailciejz; double adapjzcie; double jz100; double pqremap; @@ -1710,31 +1738,64 @@ struct LocallabParams { double targetjz; double sigmoidldacie; double sigmoidthcie; + double sigmoidsenscie; double sigmoidblcie; + double comprcie; + double strcielog; + double comprcieth; + double gamjcie; + double slopjcie; + double slopesmo; + double slopesmor; + double slopesmog; + double slopesmob; + int midtcie; + double grexl; + double greyl; + double bluxl; + double bluyl; + double redxl; + double redyl; + double refi; + double shiftxl; + double shiftyl; + double labgridcieALow; + double labgridcieBLow; + double labgridcieAHigh; + double labgridcieBHigh; + double labgridcieGx; + double labgridcieGy; + double labgridcieWx; + double labgridcieWy; + double labgridcieMx; + double labgridcieMy; + + int whitescie; + int blackscie; + Glib::ustring illMethod; + Glib::ustring smoothciemet; + Glib::ustring primMethod; + Glib::ustring catMethod; double sigmoidldajzcie; double sigmoidthjzcie; double sigmoidbljzcie; double contqcie; + double contsigqcie; 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; + double strgradcie; + double anggradcie; + double feathercie; bool enacieMask; + bool enacieMaskall; std::vector CCmaskciecurve; std::vector LLmaskciecurve; std::vector HHmaskciecurve; + std::vector HHhmaskciecurve; int blendmaskcie; double radmaskcie; double chromaskcie; @@ -1746,7 +1807,16 @@ struct LocallabParams { double lowthrescie; double higthrescie; double decaycie; - + double strumaskcie; + bool toolcie; + bool fftcieMask; + double contcie; + double blurcie; + double highmaskcie; + double shadmaskcie; + std::vector LLmaskciecurvewav; + Threshold csthresholdcie; + LocallabSpot(); bool operator ==(const LocallabSpot& other) const; @@ -1946,7 +2016,8 @@ struct ColorManagementParams { D120, STDA, TUNGSTEN_2000K, - TUNGSTEN_1500K + TUNGSTEN_1500K, + E }; enum class Primaries { @@ -1959,6 +2030,7 @@ struct ColorManagementParams { WIDE_GAMUT, ACES_P0, JDC_MAX, + JDC_MAXSTDA, BRUCE_RGB, BETA_RGB, BEST_RGB, @@ -1966,6 +2038,14 @@ struct ColorManagementParams { CUSTOM_GRID }; + enum class Cat { + BRAD, + CAT16, + CAT02, + CAT_VK, + CAT_XYZ + }; + Glib::ustring inputProfile; bool toneCurve; bool applyLookTable; @@ -1977,16 +2057,23 @@ struct ColorManagementParams { WorkingTrc workingTRC; Illuminant will; Primaries wprim; + Cat wcat; double workingTRCGamma; double workingTRCSlope; + double wmidtcie; + bool wsmoothcie; double redx; double redy; double grex; double grey; double blux; double bluy; + double refi; + double shiftx; + double shifty; double preser; bool fbw; + bool trcExp; bool gamut; double labgridcieALow; double labgridcieBLow; @@ -1996,6 +2083,8 @@ struct ColorManagementParams { double labgridcieGy; double labgridcieWx; double labgridcieWy; + double labgridcieMx; + double labgridcieMy; RenderingIntent aRendIntent; Glib::ustring outputProfile; diff --git a/rtengine/rawflatfield.cc b/rtengine/rawflatfield.cc index 22dbca852..0a6b3917e 100644 --- a/rtengine/rawflatfield.cc +++ b/rtengine/rawflatfield.cc @@ -263,13 +263,21 @@ void cfaboxblur(const float* const * riFlatFile, float* cfablur, int boxH, int b namespace rtengine { -void RawImageSource::processFlatField(const procparams::RAWParams &raw, const RawImage *riFlatFile, array2D &rawData, const float black[4]) +void RawImageSource::processFlatField(const procparams::RAWParams &raw, RawImage *riFlatFile, array2D &rawData, const float black[4]) { // BENCHFUN std::unique_ptr cfablur(new float[H * W]); const int BS = raw.ff_BlurRadius + (raw.ff_BlurRadius & 1); + std::array ffblack; + { + const auto tmpfilters = riFlatFile->get_filters(); + riFlatFile->set_filters(riFlatFile->prefilters); // we need 4 blacks for bayer processing + riFlatFile->get_colorsCoeff(nullptr, nullptr, ffblack.data(), false); + riFlatFile->set_filters(tmpfilters); + } + if (raw.ff_BlurType == procparams::RAWParams::getFlatFieldBlurTypeString(procparams::RAWParams::FlatFieldBlurType::V)) { cfaboxblur(riFlatFile->data, cfablur.get(), 2 * BS, 0, H, W); } else if (raw.ff_BlurType == procparams::RAWParams::getFlatFieldBlurTypeString(procparams::RAWParams::FlatFieldBlurType::H)) { @@ -291,7 +299,7 @@ void RawImageSource::processFlatField(const procparams::RAWParams &raw, const Ra const int col = 2 * (W >> 2) + n; const int c = ri->get_colors() != 1 ? FC(row, col) : 0; const int c4 = ri->get_colors() != 1 ? ((c == 1 && !(row & 1)) ? 3 : c) : 0; - refcolor[m][n] = std::max(0.0f, cfablur[row * W + col] - black[c4]); + refcolor[m][n] = std::max(0.0f, cfablur[row * W + col] - ffblack[c4]); } float limitFactor = 1.f; @@ -314,7 +322,7 @@ void RawImageSource::processFlatField(const procparams::RAWParams &raw, const Ra clippedBefore = true; break; } - const float tempval = (rawVal - black[c4]) * (refcolor[m][n] / std::max(1e-5f, cfablur[(row + m) * W + col + n] - black[c4])); + const float tempval = (rawVal - black[c4]) * (refcolor[m][n] / std::max(1e-5f, cfablur[(row + m) * W + col + n] - ffblack[c4])); maxval = std::max(maxval, tempval); } } @@ -363,6 +371,9 @@ void RawImageSource::processFlatField(const procparams::RAWParams &raw, const Ra const vfloat blackv[2] = {_mm_set_ps(black[c4[0][1]], black[c4[0][0]], black[c4[0][1]], black[c4[0][0]]), _mm_set_ps(black[c4[1][1]], black[c4[1][0]], black[c4[1][1]], black[c4[1][0]]) }; + const vfloat ffblackv[2] = {_mm_set_ps(ffblack[c4[0][1]], ffblack[c4[0][0]], ffblack[c4[0][1]], ffblack[c4[0][0]]), + _mm_set_ps(ffblack[c4[1][1]], ffblack[c4[1][0]], ffblack[c4[1][1]], ffblack[c4[1][0]]) + }; const vfloat onev = F2V(1.f); const vfloat minValuev = F2V(minValue); @@ -375,10 +386,11 @@ void RawImageSource::processFlatField(const procparams::RAWParams &raw, const Ra int col = 0; #ifdef __SSE2__ const vfloat rowBlackv = blackv[row & 1]; + const vfloat ffrowBlackv = ffblackv[row & 1]; const vfloat rowRefcolorv = refcolorv[row & 1]; for (; col < W - 3; col += 4) { - const vfloat blurv = LVFU(cfablur[row * W + col]) - rowBlackv; + const vfloat blurv = LVFU(cfablur[row * W + col]) - ffrowBlackv; vfloat vignettecorrv = rowRefcolorv / blurv; vignettecorrv = vself(vmaskf_le(blurv, minValuev), onev, vignettecorrv); const vfloat valv = LVFU(rawData[row][col]) - rowBlackv; @@ -388,7 +400,7 @@ void RawImageSource::processFlatField(const procparams::RAWParams &raw, const Ra #endif for (; col < W; ++col) { - const float blur = cfablur[row * W + col] - black[c4[row & 1][col & 1]]; + const float blur = cfablur[row * W + col] - ffblack[c4[row & 1][col & 1]]; const float vignettecorr = blur <= minValue ? 1.f : refcolor[row & 1][col & 1] / blur; rawData[row][col] = (rawData[row][col] - black[c4[row & 1][col & 1]]) * vignettecorr + black[c4[row & 1][col & 1]]; } @@ -490,6 +502,10 @@ void RawImageSource::processFlatField(const procparams::RAWParams &raw, const Ra const vfloat blackv[2] = {_mm_set_ps(black[c4[0][1]], black[c4[0][0]], black[c4[0][1]], black[c4[0][0]]), _mm_set_ps(black[c4[1][1]], black[c4[1][0]], black[c4[1][1]], black[c4[1][0]]) }; + const vfloat ffblackv[2] = {_mm_set_ps(ffblack[c4[0][1]], ffblack[c4[0][0]], ffblack[c4[0][1]], ffblack[c4[0][0]]), + _mm_set_ps(ffblack[c4[1][1]], ffblack[c4[1][0]], ffblack[c4[1][1]], ffblack[c4[1][0]]) + }; + const vfloat epsv = F2V(1e-5f); #endif @@ -501,10 +517,11 @@ void RawImageSource::processFlatField(const procparams::RAWParams &raw, const Ra int col = 0; #ifdef __SSE2__ const vfloat rowBlackv = blackv[row & 1]; + const vfloat ffrowBlackv = ffblackv[row & 1]; for (; col < W - 3; col += 4) { - const vfloat linecorrv = SQRV(vmaxf(LVFU(cfablur[row * W + col]) - rowBlackv, epsv)) / - (vmaxf(LVFU(cfablur1[row * W + col]) - rowBlackv, epsv) * vmaxf(LVFU(cfablur2[row * W + col]) - rowBlackv, epsv)); + const vfloat linecorrv = SQRV(vmaxf(LVFU(cfablur[row * W + col]) - ffrowBlackv, epsv)) / + (vmaxf(LVFU(cfablur1[row * W + col]) - ffrowBlackv, epsv) * vmaxf(LVFU(cfablur2[row * W + col]) - ffrowBlackv, epsv)); const vfloat valv = LVFU(rawData[row][col]) - rowBlackv; STVFU(rawData[row][col], valv * linecorrv + rowBlackv); } @@ -512,8 +529,8 @@ void RawImageSource::processFlatField(const procparams::RAWParams &raw, const Ra #endif for (; col < W; ++col) { - const float linecorr = SQR(std::max(1e-5f, cfablur[row * W + col] - black[c4[row & 1][col & 1]])) / - (std::max(1e-5f, cfablur1[row * W + col] - black[c4[row & 1][col & 1]]) * std::max(1e-5f, cfablur2[row * W + col] - black[c4[row & 1][col & 1]])); + const float linecorr = SQR(std::max(1e-5f, cfablur[row * W + col] - ffblack[c4[row & 1][col & 1]])) / + (std::max(1e-5f, cfablur1[row * W + col] - ffblack[c4[row & 1][col & 1]]) * std::max(1e-5f, cfablur2[row * W + col] - ffblack[c4[row & 1][col & 1]])); rawData[row][col] = (rawData[row][col] - black[c4[row & 1][col & 1]]) * linecorr + black[c4[row & 1][col & 1]]; } } diff --git a/rtengine/rawimage.cc b/rtengine/rawimage.cc index dc026d83a..02f6e42c5 100644 --- a/rtengine/rawimage.cc +++ b/rtengine/rawimage.cc @@ -1,6 +1,8 @@ /* * This file is part of RawTherapee. * + * LibRaw integration adapted from ART. + * * Created on: 20/nov/2010 */ @@ -11,6 +13,9 @@ #include #endif +#include + +#include "image8.h" #include "rawimage.h" #include "settings.h" #include "camconst.h" @@ -20,8 +25,13 @@ namespace rtengine { + +extern MyMutex *librawMutex; + + RawImage::RawImage(const Glib::ustring &name) - : data(nullptr) + : DCraw() + , data(nullptr) , prefilters(0) , filename(name) , rotate_deg(0) @@ -29,9 +39,12 @@ RawImage::RawImage(const Glib::ustring &name) , allocation(nullptr) { memset(maximum_c4, 0, sizeof(maximum_c4)); + memset(white, 0, sizeof(white)); RT_matrix_from_constant = ThreeValBool::X; RT_blacklevel_from_constant = ThreeValBool::X; RT_whitelevel_from_constant = ThreeValBool::X; + memset(make, 0, sizeof(make)); + memset(model, 0, sizeof(model)); } RawImage::~RawImage() @@ -41,7 +54,7 @@ RawImage::~RawImage() ifp = nullptr; } - if (image) { + if (image && decoder == Decoder::DCRAW) { free(image); } @@ -66,6 +79,18 @@ RawImage::~RawImage() } } +void RawImage::pre_interpolate() +{ + int w = width, h = height; + if (decoder == Decoder::LIBRAW) { + width = iwidth; + height = iheight; + } + DCraw::pre_interpolate(); + width = w; + height = h; +} + eSensorType RawImage::getSensorType() const { if (isBayer()) { @@ -467,7 +492,227 @@ int RawImage::loadRaw(bool loadData, unsigned int imageNum, bool closeFile, Prog // set the number of the frame to extract. If the number is larger then number of existing frames - 1, dcraw will handle that correctly shot_select = imageNum; - identify(); + + if (settings->enableLibRaw) { + libraw.reset(new LibRaw()); + } + int libraw_error = [&]() -> int { + if (!settings->enableLibRaw) { + return LIBRAW_SUCCESS; + } + + libraw->imgdata.params.use_camera_wb = 1; + libraw->imgdata.rawparams.shot_select = shot_select; + + int err = libraw->open_buffer(ifp->data, ifp->size); + + merged_pixelshift.is_merged_pixelshift = + err == LIBRAW_SUCCESS && + (strncmp(libraw->unpack_function_name(), "sony_arq_load_raw", 17) == 0 && + libraw->imgdata.idata.raw_count == 1 && + libraw->imgdata.idata.colors == 4); + + if (err == LIBRAW_REQUEST_FOR_NONEXISTENT_IMAGE || (merged_pixelshift.is_merged_pixelshift && shot_select)) { + // Try again last valid frame. Sony Pixel Shift, for example, has a + // single frame, but we want to represent the data as four. + shot_select = merged_pixelshift.is_merged_pixelshift ? shot_select / 4 : shot_select; + shot_select = std::min(shot_select, std::max(libraw->imgdata.idata.raw_count, 1u) - 1); + libraw->imgdata.rawparams.shot_select = shot_select; + err = libraw->open_buffer(ifp->data, ifp->size); + } + + if (err == LIBRAW_FILE_UNSUPPORTED || err == LIBRAW_TOO_BIG) { + // fallback to the internal one + return err; + } else if (err != LIBRAW_SUCCESS && strncmp(libraw->imgdata.idata.software, "make_arq", 8) == 0) { + return err; + } else if (err == LIBRAW_FILE_UNSUPPORTED && (strncmp(libraw->unpack_function_name(), "sony_arq_load_raw", 17) == 0 || strncmp(libraw->imgdata.idata.software, "HDRMerge", 8) == 0)) { + return err; + } else if (err != LIBRAW_SUCCESS) { + decoder = Decoder::LIBRAW; + return err; + } else if (libraw->is_floating_point() && libraw->imgdata.idata.dng_version) { + return err; + } + + auto &d = libraw->imgdata.idata; + is_raw = d.raw_count; + strncpy(make, d.normalized_make, sizeof(make)-1); + make[sizeof(make)-1] = 0; + strncpy(model, d.normalized_model, sizeof(model)-1); + model[sizeof(model)-1] = 0; + RT_software = d.software; + dng_version = d.dng_version; + filters = d.filters; + is_foveon = d.is_foveon; + colors = d.colors; + tiff_bps = 0; + + if (!strcmp("Hasselblad", make)) { + // For Hasselblad, "model" provides the better name. + strncpy(model, d.model, sizeof(model) - 1); + model[sizeof(model) - 1] = 0; + } + + if (merged_pixelshift.is_merged_pixelshift || + (strncmp(libraw->unpack_function_name(), "sony_arq_load_raw", 17) == 0 && + is_raw == 1 && colors == 4)) { + // Represent merged pixelshift as 4 sub-frames. + merged_pixelshift.is_merged_pixelshift = true; + merged_pixelshift.sub_frame_shot_select = imageNum % 4; + + filters = 0x94949494; + colors = 3; + is_raw = 4; + } + + for (int i = 0; i < 6; ++i) { + for (int j = 0; j < 6; ++j) { + xtrans[i][j] = d.xtrans[i][j]; + xtrans_abs[i][j] = d.xtrans_abs[i][j]; + } + } + auto &s = libraw->imgdata.sizes; + raw_width = s.raw_width; + raw_height = s.raw_height; + width = s.width; + height = s.height; + top_margin = s.top_margin; + left_margin = s.left_margin; + iheight = s.iheight; + iwidth = s.iwidth; + flip = s.flip; + + auto &o = libraw->imgdata.other; + iso_speed = o.iso_speed; + shutter = o.shutter; + aperture = o.aperture; + focal_len = o.focal_len; + timestamp = o.timestamp; + shot_order = o.shot_order; + + auto &io = libraw->imgdata.rawdata.ioparams; + shrink = io.shrink; + zero_is_bad = io.zero_is_bad; + fuji_width = io.fuji_width; + raw_color = io.raw_color; + mix_green = io.mix_green; + + auto &cd = libraw->imgdata.color; + black = cd.black; + maximum = cd.maximum; + tiff_bps = cd.raw_bps; + + for (size_t i = 0; i < sizeof(cblack)/sizeof(unsigned); ++i) { + cblack[i] = cd.cblack[i]; + } + // put the global black level where the rest of the code expects to find it + if (dng_version && isXtrans() && cblack[6] == 0 && black > 0) { + cblack[6] = black; + } + + for (int i = 0; i < 4; ++i) { + cam_mul[i] = cd.cam_mul[i]; + pre_mul[i] = cd.pre_mul[i]; + } + if (merged_pixelshift.is_merged_pixelshift) { + pre_mul[3] = 0.f; // 4th value is undefined after reducing to 3 colors. + } + + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 4; ++j) { + cmatrix[i][j] = cd.cmatrix[i][j]; + rgb_cam[i][j] = cd.rgb_cam[i][j]; + } + } + + for (int i = 0; i < 8; ++i) { + for (int j = 0; j < 8; ++j) { + white[i][j] = cd.white[i][j]; + } + } + + for (int i = 0; i < 8; ++i) { + for (int j = 0; j < 4; ++j) { + mask[i][j] = s.mask[i][j]; + } + } + + auto &mkn = libraw->imgdata.makernotes; + + // if (!strcmp(make, "Panasonic") && mkn.panasonic.BlackLevelDim > 0) { + // memset(cblack, 0, sizeof(cblack)); + // if (mkn.panasonic.BlackLevelDim >= 4) { + // for (size_t i = 0; i < 4; ++i) { + // cblack[i] = mkn.panasonic.BlackLevel[i]; + // } + // black = 0; + // } else { + // black = mkn.panasonic.BlackLevel[0]; + // } + // } else + if (!strcmp(make, "Canon") && isBayer() && !dng_version) { + if (mkn.canon.AverageBlackLevel) { + memset(cblack, 0, sizeof(cblack)); + for (size_t i = 0; i < 4; ++i) { + cblack[i] = mkn.canon.ChannelBlackLevel[i]; + } + black = 0; + } + if (mkn.canon.SpecularWhiteLevel) { + maximum = mkn.canon.SpecularWhiteLevel; + } else if (mkn.canon.NormalWhiteLevel) { + maximum = mkn.canon.NormalWhiteLevel; + } + } + while (tiff_bps < 16 && (size_t(1) << size_t(tiff_bps)) < maximum) { + ++tiff_bps; + } + + if (dng_version) { + RT_whitelevel_from_constant = ThreeValBool::F; + RT_blacklevel_from_constant = ThreeValBool::F; + if (!isBayer() && !isXtrans()) { + RT_matrix_from_constant = ThreeValBool::F; + } + } else if (strcmp(make, "Panasonic") != 0) { + RT_whitelevel_from_constant = ThreeValBool::T; + RT_blacklevel_from_constant = ThreeValBool::T; + } + + if (is_foveon) { + raw_width = width; + raw_height = height; + top_margin = 0; + left_margin = 0; + } + + decoder = Decoder::LIBRAW; + return err; + }(); + + if (libraw_error && verbose) { + printf("LibRaw could not load image."); + if (decoder == Decoder::DCRAW) { + printf(" Falling back to dcraw."); + } + printf("\n"); + } + + if (decoder == Decoder::LIBRAW) { + if (libraw_error) { + return libraw_error; + } + } else { + if (libraw) { + libraw->recycle(); + } + } + + if (decoder == Decoder::DCRAW) { + identify(); + } + // in case dcraw didn't handle the above mentioned case... shot_select = std::min(shot_select, std::max(is_raw, 1u) - 1); @@ -482,7 +727,7 @@ int RawImage::loadRaw(bool loadData, unsigned int imageNum, bool closeFile, Prog return 2; } - if (!strcmp(make, "Fujifilm") && raw_height * raw_width * 2u != raw_size) { + if (decoder == Decoder::DCRAW && !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 { @@ -514,29 +759,94 @@ int RawImage::loadRaw(bool loadData, unsigned int imageNum, bool closeFile, Prog iheight = height; iwidth = width; - if (filters || colors == 1) { - raw_image = (ushort *) calloc ((static_cast(raw_height) + 7u) * static_cast(raw_width), 2); - merror(raw_image, "main()"); - } + if (decoder == Decoder::DCRAW) { + if (filters || colors == 1) { + raw_image = (ushort *) calloc ((static_cast(raw_height) + 7u) * static_cast(raw_width), 2); + merror(raw_image, "main()"); + } - // dcraw needs this global variable to hold pixel data - image = (dcrawImage_t)calloc (static_cast(height) * static_cast(width) * sizeof * image + meta_length, 1); - if(!image) { - return 200; - } - meta_data = (char *) (image + static_cast(height) * static_cast(width)); + // dcraw needs this global variable to hold pixel data + image = (dcrawImage_t)calloc (static_cast(height) * static_cast(width) * sizeof * image + meta_length, 1); + if(!image) { + return 200; + } + meta_data = (char *) (image + static_cast(height) * static_cast(width)); - /* Issue 2467 - if (setjmp (failure)) { - if (image) { free (image); image=NULL; } - if (raw_image) { free(raw_image); raw_image=NULL; } - fclose(ifp); ifp=NULL; - return 100; - } - */ - // Load raw pixels data - fseek(ifp, data_offset, SEEK_SET); - (this->*load_raw)(); + /* Issue 2467 + if (setjmp (failure)) { + if (image) { free (image); image=NULL; } + if (raw_image) { free(raw_image); raw_image=NULL; } + fclose(ifp); ifp=NULL; + return 100; + } + */ + // Load raw pixels data + fseek(ifp, data_offset, SEEK_SET); + (this->*load_raw)(); + } else if (decoder == Decoder::LIBRAW) { + libraw->imgdata.rawparams.shot_select = shot_select; + + int err = libraw->open_buffer(ifp->data, ifp->size); + if (err) { + return err; + } + { +#ifdef LIBRAW_USE_OPENMP + MyMutex::MyLock lock(*librawMutex); +#endif + err = libraw->unpack(); + } + if (err) { + return err; + } + + auto &rd = libraw->imgdata.rawdata; + raw_image = rd.raw_image; + if (rd.float_image) { + float_raw_image = new float[raw_width * raw_height]; + for (int y = 0; y < raw_height; ++y) { + for (int x = 0; x < raw_width; ++x) { + size_t idx = y * raw_width + x; + float_raw_image[idx] = rd.float_image[idx]; + } + } + } else { +#ifdef LIBRAW_USE_OPENMP + MyMutex::MyLock lock(*librawMutex); +#endif + float_raw_image = nullptr; + err = libraw->raw2image(); + if (err) { + return err; + } + image = libraw->imgdata.image; + } + + // get our custom camera matrices, but don't mess with black/white levels yet + // (if we have custom levels in json files, we will get them later) + auto bl = RT_blacklevel_from_constant; + auto wl = RT_whitelevel_from_constant; + RT_blacklevel_from_constant = ThreeValBool::F; + RT_whitelevel_from_constant = ThreeValBool::F; + + adobe_coeff(make, model); + + RT_blacklevel_from_constant = bl; + RT_whitelevel_from_constant = wl; + + if (libraw->imgdata.color.profile_length) { + profile_length = libraw->imgdata.color.profile_length; + profile_data = new char[profile_length]; + memcpy(profile_data, libraw->imgdata.color.profile, profile_length); + } + + if (isBayer() && RT_blacklevel_from_constant == ThreeValBool::T && max(black, cblack[0], cblack[1], cblack[2], cblack[3]) == 0) { + auto &black_stat = libraw->imgdata.color.black_stat; + for (int i = 0; i < 4; ++i) { + cblack[i] = black_stat[i] / (1+black_stat[i+4]); + } + } + } if (!float_raw_image) { // apply baseline exposure only for float DNGs RT_baseline_exposure = 0; @@ -551,6 +861,10 @@ int RawImage::loadRaw(bool loadData, unsigned int imageNum, bool closeFile, Prog bool raw_crop_cc = false; int orig_raw_width = width; int orig_raw_height = height; + // For raw crop when using LibRaw. + int raw_top_margin = 0; + int raw_left_margin = 0; + bool adjust_margins = false; if (raw_image) { orig_raw_width = raw_width; @@ -561,33 +875,82 @@ int RawImage::loadRaw(bool loadData, unsigned int imageNum, bool closeFile, Prog int lm, tm, w, h; cc->get_rawCrop(raw_width, raw_height, lm, tm, w, h); - if (isXtrans()) { - shiftXtransMatrix(6 - ((top_margin - tm) % 6), 6 - ((left_margin - lm) % 6)); + if ((w < 0 || h < 0) && decoder != Decoder::DCRAW) { + raw_crop_cc = false; } else { - if (((int)top_margin - tm) & 1) { // we have an odd border difference - filters = (filters << 4) | (filters >> 28); // left rotate filters by 4 bits + // protect against DNG files that are already cropped + if (int(raw_width) <= w+lm) { + lm = max(int(raw_width) - w, 0); + } + if (int(raw_height) <= h+tm) { + tm = max(int(raw_height) - h, 0); } - } - left_margin = lm; - top_margin = tm; + if (decoder == Decoder::DCRAW) { + 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 + filters = (filters << 4) | (filters >> 28); // left rotate filters by 4 bits + } + } - if (w < 0) { - iwidth += w; - iwidth -= left_margin; - width += w; - width -= left_margin; - } else if (w > 0) { - iwidth = width = min((int)width, w); - } + left_margin = lm; + top_margin = tm; + } else { + if (lm < left_margin) { + lm = left_margin; + } + if (tm < top_margin) { + tm = top_margin; + } + // make sure we do not rotate filters + if (isXtrans()) { + if ((tm - top_margin) % 6) { + tm = top_margin; + } + if ((lm - left_margin) % 6) { + lm = left_margin; + } + } else { + if ((tm - top_margin) & 1) { + tm = top_margin; + } + if ((lm - left_margin) & 1) { + lm = left_margin; + } + } + raw_left_margin = lm - left_margin; + raw_top_margin = tm - top_margin; + } - if (h < 0) { - iheight += h; - iheight -= top_margin; - height += h; - height -= top_margin; - } else if (h > 0) { - iheight = height = min((int)height, h); + if (w < 0) { + iwidth += w; + iwidth -= left_margin; + width += w; + width -= left_margin; + } else if (w > 0) { + width = min((int)width, w); + if (decoder == Decoder::DCRAW) { + iwidth = width; + } else if (width > iwidth) { + width = iwidth; + } + } + + if (h < 0) { + iheight += h; + iheight -= top_margin; + height += h; + height -= top_margin; + } else if (h > 0) { + height = min((int)height, h); + if (decoder == Decoder::DCRAW) { + iheight = height; + } else if (height > iheight) { + height = iheight; + } + } } } @@ -597,11 +960,14 @@ int RawImage::loadRaw(bool loadData, unsigned int imageNum, bool closeFile, Prog } } - crop_masked_pixels(); - free(raw_image); + if (decoder == Decoder::DCRAW) { + crop_masked_pixels(); + free(raw_image); + } raw_image = nullptr; + adjust_margins = !float_raw_image; //true; } else { - if (get_maker() == "Sigma" && cc && cc->has_rawCrop(width, height)) { // foveon images + if (decoder == Decoder::DCRAW && get_maker() == "Sigma" && cc && cc->has_rawCrop(width, height)) { // foveon images raw_crop_cc = true; int lm, tm, w, h; cc->get_rawCrop(width, height, lm, tm, w, h); @@ -611,21 +977,27 @@ int RawImage::loadRaw(bool loadData, unsigned int imageNum, bool closeFile, Prog if (w < 0) { width += w; width -= left_margin; + iwidth += w; + iwidth -= left_margin; } else if (w > 0) { width = min((int)width, w); + iwidth = width; } if (h < 0) { height += h; height -= top_margin; + iheight += h; + iheight -= top_margin; } else if (h > 0) { height = min((int)height, h); + iheight = height; } } } // Load embedded profile - if (profile_length) { + if (decoder == Decoder::DCRAW && profile_length) { profile_data = new char[profile_length]; fseek(ifp, profile_offset, SEEK_SET); fread(profile_data, 1, profile_length, ifp); @@ -690,23 +1062,30 @@ int RawImage::loadRaw(bool loadData, unsigned int imageNum, bool closeFile, Prog for (int c = 0; c < 4; c++) { if (static_cast(cblack[c]) < black_c4[c]) { cblack[c] = black_c4[c]; + cblack[4] = cblack[5] = 0; } } if (settings->verbose) { + const char *decoder_name = decoder == Decoder::DCRAW ? "dcraw" : decoder == Decoder::LIBRAW ? "libraw" : "unknown"; if (cc) { printf("constants exists for \"%s %s\" in camconst.json\n", make, model); } else { - printf("no constants in camconst.json exists for \"%s %s\" (relying only on dcraw defaults)\n", make, model); + printf("no constants in camconst.json exists for \"%s %s\" (relying only on %s defaults)\n", make, model, decoder_name); } 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, raw_crop_cc ? "camconst.json" : "dcraw"); - printf("color matrix provided by %s\n", (cc && cc->has_dcrawMatrix()) ? "camconst.json" : "dcraw"); + printf("black levels: R:%d G1:%d B:%d G2:%d (provided by %s)\n", get_cblack(0), get_cblack(1), get_cblack(2), get_cblack(3), + black_from_cc ? "camconst.json" : decoder_name); + printf("white levels: R:%d G1:%d B:%d G2:%d (provided by %s)\n", get_white(0), get_white(1), get_white(2), get_white(3), + white_from_cc ? "camconst.json" : decoder_name); + printf("raw crop: %d %d %d %d (provided by %s)\n", left_margin, top_margin, iwidth, iheight, raw_crop_cc ? "camconst.json" : decoder_name); + printf("color matrix provided by %s\n", (cc && cc->has_dcrawMatrix()) ? "camconst.json" : decoder_name); + } + + if (adjust_margins) { + top_margin = raw_top_margin; + left_margin = raw_left_margin; } } @@ -772,6 +1151,41 @@ float** RawImage::compress_image(unsigned int frameNum, bool freeImage) delete [] float_raw_image; float_raw_image = nullptr; + } else if (merged_pixelshift.is_merged_pixelshift) { + // Frame 0 is not shifted. Frame 1 is shifted down. Frame 2 is shifted + // down and right. Frame 3 is shifted right. + int h_shift = (merged_pixelshift.sub_frame_shot_select >> 1) & 1; + int v_shift = ((merged_pixelshift.sub_frame_shot_select + 1u) >> 1) & 1; + + // Reset edges to 0. + for (int row = 0; row < v_shift; ++row) { + for (int col = 0; col < width; ++col) { + this->data[row][col] = 0; + } + } + for (int col = 0; col < h_shift; ++col) { + for (int row = 0; row < height; ++row) { + this->data[row][col] = 0; + } + } + + const int image_v_shift = top_margin - v_shift; + const int image_h_shift = left_margin - h_shift; + const unsigned original_filters = filters; + + filters = 0xb4b4b4b4; // R G1 B G2. + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int row = v_shift; row < height; row++) { + for (int col = h_shift; col < width; col++) { + this->data[row][col] = image[(row + image_v_shift) * iwidth + col + image_h_shift][FC(row, col)]; + } + } + + filters = original_filters; } else if (filters != 0 && !isXtrans()) { #ifdef _OPENMP #pragma omp parallel for @@ -779,7 +1193,7 @@ float** RawImage::compress_image(unsigned int frameNum, bool freeImage) for (int row = 0; row < height; row++) for (int col = 0; col < width; col++) { - this->data[row][col] = image[row * width + col][FC(row, col)]; + this->data[row][col] = image[(row + top_margin) * iwidth + col + left_margin][FC(row, col)]; } } else if (isXtrans()) { #ifdef _OPENMP @@ -788,7 +1202,7 @@ float** RawImage::compress_image(unsigned int frameNum, bool freeImage) for (int row = 0; row < height; row++) for (int col = 0; col < width; col++) { - this->data[row][col] = image[row * width + col][XTRANSFC(row, col)]; + this->data[row][col] = image[(row + top_margin) * iwidth + col + left_margin][XTRANSFC(row, col)]; } } else if (colors == 1) { #ifdef _OPENMP @@ -797,27 +1211,34 @@ float** RawImage::compress_image(unsigned int frameNum, bool freeImage) for (int row = 0; row < height; row++) for (int col = 0; col < width; col++) { - this->data[row][col] = image[row * width + col][0]; + this->data[row][col] = image[row * iwidth + col][0]; } } else { if((get_maker() == "Sigma" || get_maker() == "Pentax" || get_maker() == "Sony") && dng_version) { // Hack to prevent sigma dng files and dng files from PixelShift2DNG from crashing height -= top_margin; width -= left_margin; } + + const auto image_width = get_maker() == "Sigma" ? raw_width : iwidth; // Foveon: Image has all raw data. + #ifdef _OPENMP #pragma omp parallel for #endif for (int row = 0; row < height; row++) for (int col = 0; col < width; col++) { - this->data[row][3 * col + 0] = image[(row + top_margin) * iwidth + col + left_margin][0]; - this->data[row][3 * col + 1] = image[(row + top_margin) * iwidth + col + left_margin][1]; - this->data[row][3 * col + 2] = image[(row + top_margin) * iwidth + col + left_margin][2]; + this->data[row][3 * col + 0] = image[(row + top_margin) * image_width + col + left_margin][0]; + this->data[row][3 * col + 1] = image[(row + top_margin) * image_width + col + left_margin][1]; + this->data[row][3 * col + 2] = image[(row + top_margin) * image_width + col + left_margin][2]; } } if (freeImage) { - free(image); // we don't need this anymore + if (decoder == Decoder::DCRAW) { + free(image); // we don't need this anymore + } else if (decoder == Decoder::LIBRAW) { + libraw->recycle(); + } image = nullptr; } @@ -872,6 +1293,89 @@ RawImage::get_thumbSwap() const return (order == 0x4949) == (ntohs(0x1234) == 0x1234); } + +bool RawImage::checkThumbOk() const +{ + if (!is_supportedThumb()) { + return false; + } + + if (get_thumbOffset() >= get_file()->size) { + return false; + } + + const ssize_t length = + fdata (get_thumbOffset(), get_file())[1] != 0xD8 && is_ppmThumb() + ? get_thumbWidth() * get_thumbHeight() * (get_thumbBPS() / 8) * 3 + : get_thumbLength(); + + return get_thumbOffset() + length <= get_file()->size; +} + + +Image8 *RawImage::getThumbnail() const +{ + if (decoder == Decoder::DCRAW) { + if (!checkThumbOk()) { + return nullptr; + } + + Image8 *img = new Image8(); + img->setSampleFormat(IIOSF_UNSIGNED_CHAR); + img->setSampleArrangement(IIOSA_CHUNKY); + + const char *data = reinterpret_cast(fdata(get_thumbOffset(), get_file())); + + int err = 1; + if ((unsigned char)data[1] == 0xd8) { + err = img->loadJPEGFromMemory(data, get_thumbLength()); + } else if (is_ppmThumb()) { + err = img->loadPPMFromMemory(data, get_thumbWidth(), get_thumbHeight(), get_thumbSwap(), get_thumbBPS()); + } + + // did we succeed? + if (err) { + delete img; + img = nullptr; + } + + return img; + } + + if (!ifp) { + return nullptr; + } else { + int err = libraw->unpack_thumb(); + if (err) { + return nullptr; + } + auto &t = libraw->imgdata.thumbnail; + if (!t.thumb) { + return nullptr; + } else if (t.tformat != LIBRAW_THUMBNAIL_JPEG && t.tformat != LIBRAW_THUMBNAIL_BITMAP) { + return nullptr; + } else { + Image8 *img = new Image8(); + img->setSampleFormat(IIOSF_UNSIGNED_CHAR); + img->setSampleArrangement(IIOSA_CHUNKY); + if (t.tformat == LIBRAW_THUMBNAIL_JPEG) { + err = img->loadJPEGFromMemory(t.thumb, t.tlength); + } else { + err = img->loadPPMFromMemory(t.thumb, t.twidth, t.theight, false, 8); + } + if (err) { + delete img; + return nullptr; + } else { + return img; + } + } + } + + return nullptr; +} + + } //namespace rtengine bool diff --git a/rtengine/rawimage.h b/rtengine/rawimage.h index 2b1cd2156..cc19998f8 100644 --- a/rtengine/rawimage.h +++ b/rtengine/rawimage.h @@ -21,14 +21,23 @@ #include #include #include +#include #include #include "dcraw.h" #include "imageformat.h" + +class LibRaw; + + namespace rtengine { + +class Image8; + + class RawImage: public DCraw { public: @@ -57,11 +66,18 @@ public: double getBaselineExposure() const { return RT_baseline_exposure; } protected: + enum class Decoder { + DCRAW, + LIBRAW, + }; + Glib::ustring filename; // complete filename int rotate_deg; // 0,90,180,270 degree of rotation: info taken by dcraw from exif char* profile_data; // Embedded ICC color profile float* allocation; // pointer to allocated memory int maximum_c4[4]; + Decoder decoder{Decoder::DCRAW}; + std::unique_ptr libraw; bool isFoveon() const { return is_foveon; @@ -191,19 +207,6 @@ public: return rgb_cam[r][c]; } - int get_exifBase() const - { - return exif_base; - } - int get_ciffBase() const - { - return ciff_base; - } - int get_ciffLen() const - { - return ciff_len; - } - int get_profileLen() const { return profile_length; @@ -261,10 +264,7 @@ public: public: // dcraw functions - void pre_interpolate() - { - DCraw::pre_interpolate(); - } + void pre_interpolate(); public: bool ISRED(unsigned row, unsigned col) const @@ -304,6 +304,11 @@ public: { return dng_version; } + +public: + bool checkThumbOk() const; + Image8 *getThumbnail() const; + }; } diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 8149c0464..ab2ee58e6 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -44,6 +44,7 @@ #include "rt_math.h" #include "rtengine.h" #include "rtlensfun.h" +#include "lensmetadata.h" #include "../rtgui/options.h" #define BENCHMARK @@ -58,6 +59,16 @@ namespace { +float clipitc(float x) +{ + if (std::isnan(x)) { + x = 0.1f; + } else { + x = rtengine::LIM(x, 0.1f, 65534.9f);//White balance Itcwb - limit values + } + return x; +} + void rotateLine(const float* const line, rtengine::PlanarPtr &channel, const int tran, const int i, const int w, const int h) { switch (tran & TR_ROT) { @@ -420,6 +431,16 @@ void transLineD1x(const float* const red, const float* const green, const float* } } +bool checkRawDataDimensions(const array2D &rawData, const rtengine::RawImage &rawImage, int width, int height) +{ + const int colors = (rawImage.getSensorType() == rtengine::ST_BAYER || + rawImage.getSensorType() == rtengine::ST_FUJI_XTRANS || + rawImage.get_colors() == 1) + ? 1 + : 3; + return rawData.getHeight() == height && rawData.getWidth() == colors * width; +} + } @@ -744,7 +765,7 @@ void RawImageSource::getWBMults(const ColorTemp &ctemp, const RAWParams &raw, st void RawImageSource::getImage(const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const RAWParams &raw) { - assert(rawData.getHeight() == H && rawData.getWidth() == W); + assert(checkRawDataDimensions(rawData, *ri, W, H)); MyMutex::MyLock lock(getImageMutex); @@ -1078,7 +1099,7 @@ DCPProfile *RawImageSource::getDCP(const ColorManagementParams &cmp, DCPProfileA DCPProfile *dcpProf = nullptr; cmsHPROFILE dummy; - findInputProfile(cmp.inputProfile, nullptr, (static_cast(getMetaData()))->getCamera(), &dcpProf, dummy); + findInputProfile(cmp.inputProfile, nullptr, (static_cast(getMetaData()))->getCamera(), fileName, &dcpProf, dummy); if (dcpProf == nullptr) { if (settings->verbose) { @@ -1094,8 +1115,24 @@ DCPProfile *RawImageSource::getDCP(const ColorManagementParams &cmp, DCPProfileA void RawImageSource::convertColorSpace(Imagefloat* image, const ColorManagementParams &cmp, const ColorTemp &wb) { + cmsHPROFILE in; + DCPProfile *dcpProf; + + if (!findInputProfile(cmp.inputProfile, embProfile, (static_cast(getMetaData()))->getCamera(), fileName, &dcpProf, in)) { + return; + } + double pre_mul[3] = { ri->get_pre_mul(0), ri->get_pre_mul(1), ri->get_pre_mul(2) }; - colorSpaceConversion(image, cmp, wb, pre_mul, embProfile, camProfile, imatrices.xyz_cam, (static_cast(getMetaData()))->getCamera()); + colorSpaceConversion_(image, cmp, wb, pre_mul, camProfile, imatrices.xyz_cam, in, dcpProf); +} + +void RawImageSource::colorSpaceConversion(Imagefloat* im, const ColorManagementParams& cmp, const ColorTemp &wb, double pre_mul[3], cmsHPROFILE embedded, cmsHPROFILE camprofile, double cam[3][3], const std::string &camName, const Glib::ustring &fileName) +{ + cmsHPROFILE in; + DCPProfile *dcpProf; + if (findInputProfile(cmp.inputProfile, embedded, camName, fileName, &dcpProf, in)) { + colorSpaceConversion_(im, cmp, wb, pre_mul, camprofile, cam, in, dcpProf); + } } void RawImageSource::getFullSize(int& w, int& h, int tr) @@ -1442,7 +1479,7 @@ void RawImageSource::preprocess(const RAWParams &raw, const LensProfParams &lens 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() || (getMetaData()->hasFixBadPixelsConstant() && getMetaData()->getFixBadPixelsConstant() == 0)) { // 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); @@ -1506,7 +1543,7 @@ void RawImageSource::preprocess(const RAWParams &raw, const LensProfParams &lens //FLATFIELD end if (raw.ff_FromMetaData && isGainMapSupported()) { - applyDngGainMap(c_black, ri->getGainMaps()); + applyDngGainMap(c_black, getMetaData()->getGainMaps()); } // Always correct camera badpixels from .badpixels file @@ -1557,7 +1594,13 @@ void RawImageSource::preprocess(const RAWParams &raw, const LensProfParams &lens if (!hasFlatField && lensProf.useVign && lensProf.lcMode != LensProfParams::LcMode::NONE) { std::unique_ptr pmap; - if (lensProf.useLensfun()) { + if (lensProf.useMetadata()) { + auto corr = MetadataLensCorrectionFinder::findCorrection(idata); + if (corr) { + corr->initCorrections(W, H, coarse, -1); + pmap = std::move(corr); + } + } else if (lensProf.useLensfun()) { pmap = LFDatabase::getInstance()->findModifier(lensProf, idata, W, H, coarse, -1); } else { const std::shared_ptr pLCPProf = LCPStore::getInstance()->getProfile(lensProf.lcpFile); @@ -1747,7 +1790,7 @@ void RawImageSource::preprocess(const RAWParams &raw, const LensProfParams &lens void RawImageSource::demosaic(const RAWParams &raw, bool autoContrast, double &contrastThreshold, bool cache) { - assert(rawData.getHeight() == H && rawData.getWidth() == W); + assert(checkRawDataDimensions(rawData, *ri, W, H)); MyTime t1, t2; t1.set(); @@ -3156,18 +3199,11 @@ lab2ProphotoRgbD50(float L, float A, float B, float& r, float& g, float& b) } // Converts raw image including ICC input profile to working space - floating point version -void RawImageSource::colorSpaceConversion_(Imagefloat* im, const ColorManagementParams& cmp, const ColorTemp &wb, double pre_mul[3], cmsHPROFILE embedded, cmsHPROFILE camprofile, double camMatrix[3][3], const std::string &camName) +void RawImageSource::colorSpaceConversion_(Imagefloat* im, const ColorManagementParams& cmp, const ColorTemp &wb, double pre_mul[3], cmsHPROFILE camprofile, double camMatrix[3][3], cmsHPROFILE in, DCPProfile *dcpProf) { // MyTime t1, t2, t3; // t1.set (); - cmsHPROFILE in; - DCPProfile *dcpProf; - - if (!findInputProfile(cmp.inputProfile, embedded, camName, &dcpProf, in)) { - return; - } - if (dcpProf != nullptr) { // DCP processing const DCPProfile::Triple pre_mul_row = { @@ -3557,7 +3593,7 @@ void RawImageSource::colorSpaceConversion_(Imagefloat* im, const ColorManagement // Determine RAW input and output profiles. Returns TRUE on success -bool RawImageSource::findInputProfile(Glib::ustring inProfile, cmsHPROFILE embedded, std::string camName, DCPProfile **dcpProf, cmsHPROFILE& in) +bool RawImageSource::findInputProfile(Glib::ustring inProfile, cmsHPROFILE embedded, std::string camName, const Glib::ustring &fileName, DCPProfile **dcpProf, cmsHPROFILE& in) { in = nullptr; // cam will be taken on NULL *dcpProf = nullptr; @@ -3566,8 +3602,12 @@ bool RawImageSource::findInputProfile(Glib::ustring inProfile, cmsHPROFILE embed return false; } - if (embedded && inProfile == "(embedded)") { - in = embedded; + if (inProfile == "(embedded)") { + if (embedded) { + in = embedded; + } else { + *dcpProf = DCPStore::getInstance()->getProfile(fileName); + } } else if (inProfile == "(cameraICC)") { // DCPs have higher quality, so use them first *dcpProf = DCPStore::getInstance()->getStdProfile(camName); @@ -3842,7 +3882,7 @@ void RawImageSource::hlRecovery(const std::string &method, float* red, float* gr void RawImageSource::getAutoExpHistogram(LUTu & histogram, int& histcompr) { - assert(rawData.getHeight() == H && rawData.getWidth() == W); + assert(checkRawDataDimensions(rawData, *ri, W, H)); // BENCHFUN histcompr = 3; @@ -5277,7 +5317,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double itcwb_nopurple : false default - allow to bypass highlight recovery and inpait opposed when need flowers and not purple due to highlights... itcwb_green - adjust green refinement */ - BENCHFUN + // BENCHFUN MyTime t1, t2, t3, t4, t5, t6, t7, t8; t1.set(); @@ -6191,12 +6231,20 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } if (oldsampling == false) { + if (settings->verbose) { + printf("size rgb loc - bfh=%i bfw=%i repref=%i\n", bfh, bfw, repref); + } + #ifdef _OPENMP #pragma omp parallel for #endif for (int y = 0; y < bfh ; ++y) { for (int x = 0; x < bfw ; ++x) { + redloc[y][x] = clipitc(redloc[y][x]); + greenloc[y][x] = clipitc(greenloc[y][x]); + blueloc[y][x] = clipitc(blueloc[y][x]); + const float RR = rmm[repref] * redloc[y][x]; const float GG = gmm[repref] * greenloc[y][x]; const float BB = bmm[repref] * blueloc[y][x]; @@ -7421,17 +7469,11 @@ void RawImageSource::getrgbloc(int begx, int begy, int yEn, int xEn, int cx, int 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); - } + greenloc(bfw, bfh); - if (! redloc) { - redloc(bfw, bfh); - } + redloc(bfw, bfh); - if (! blueloc) { - blueloc(bfw, bfh); - } + blueloc(bfw, bfh); double avgL = 0.0; //center data on normal values @@ -7466,8 +7508,10 @@ void RawImageSource::getrgbloc(int begx, int begy, int yEn, int xEn, int cx, int } 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 + float multip = 60000.f / (avgL + 2.f * sig); + if(std::isnan(multip)) {//if very bad datas with avgl and sig + multip = 1.f; + } #ifdef _OPENMP #pragma omp parallel for #endif @@ -7476,7 +7520,7 @@ void RawImageSource::getrgbloc(int begx, int begy, int yEn, int xEn, int cx, int const int ii = i * precision; if (ii < H) { - for (int j = 0, jj = 0; j < bfw; ++j, jj += precision) { + for (int j = 0, jj = 0; j < bfw; ++j, jj += precision) {//isnan and <0 and > 65535 in case of redloc[i][j] = red[ii][jj] * multip; greenloc[i][j] = green[ii][jj] * multip; blueloc[i][j] = blue[ii][jj] * multip; @@ -7487,7 +7531,7 @@ void RawImageSource::getrgbloc(int begx, int begy, int yEn, int xEn, int cx, int void RawImageSource::getAutoWBMultipliersitc(bool extra, double & tempref, double & greenref, double & tempitc, double & greenitc, float &temp0, float &delta, int &bia, int &dread, int &kcam, int &nocam, float &studgood, float &minchrom, int &kmin, float &minhist, float &maxhist, 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) { - assert(rawData.getHeight() == H && rawData.getWidth() == W); + assert(checkRawDataDimensions(rawData, *ri, W, H)); // BENCHFUN constexpr double clipHigh = 64000.0; @@ -7692,9 +7736,6 @@ void RawImageSource::getAutoWBMultipliersitc(bool extra, double & tempref, doubl WBauto(extra, tempref, greenref, redloc, greenloc, blueloc, bfw, bfh, avg_rm, avg_gm, avg_bm, tempitc, greenitc, temp0, delta, bia, dread, kcam, nocam, studgood, minchrom, kmin, minhist, maxhist, twotimes, wbpar, begx, begy, yEn, xEn, cx, cy, cmp, raw, hrp); } - redloc(0, 0); - greenloc(0, 0); - blueloc(0, 0); if (settings->verbose && wbpar.method != "autitcgreen") { printf("RGB grey AVG: %g %g %g\n", avg_r / std::max(1, rn), avg_g / std::max(1, gn), avg_b / std::max(1, bn)); @@ -7713,7 +7754,7 @@ void RawImageSource::getAutoWBMultipliersitc(bool extra, double & tempref, doubl void RawImageSource::getAutoWBMultipliers(double &rm, double &gm, double &bm) { - assert(rawData.getHeight() == H && rawData.getWidth() == W); + assert(checkRawDataDimensions(rawData, *ri, W, H)); // BENCHFUN constexpr double clipHigh = 64000.0; @@ -7931,7 +7972,7 @@ void RawImageSource::getAutoWBMultipliers(double &rm, double &gm, double &bm) ColorTemp RawImageSource::getSpotWB(std::vector &red, std::vector &green, std::vector &blue, int tran, double equal, StandardObserver observer) { - assert(rawData.getHeight() == H && rawData.getWidth() == W); + assert(checkRawDataDimensions(rawData, *ri, W, H)); int x; int y; @@ -8271,7 +8312,7 @@ void RawImageSource::init() void RawImageSource::getRawValues(int x, int y, int rotate, int &R, int &G, int &B) { - if (rawData.getWidth() != W || rawData.getHeight() != H || d1x) { // Nikon D1x has special sensor. We just skip it + if (!checkRawDataDimensions(rawData, *ri, W, H) || d1x) { // Nikon D1x has special sensor. We just skip it R = G = B = 0; return; } @@ -8314,12 +8355,73 @@ void RawImageSource::getRawValues(int x, int y, int rotate, int &R, int &G, int bool RawImageSource::isGainMapSupported() const { - return ri->isGainMapSupported(); + if (!(ri->DNGVERSION() && ri->isBayer())) { + return false; + } + const auto &gainMaps = getMetaData()->getGainMaps(); + 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; } void RawImageSource::applyDngGainMap(const float black[4], const std::vector &gainMaps) { - assert(rawData.getHeight() == H && rawData.getWidth() == W); + assert(checkRawDataDimensions(rawData, *ri, W, H)); // now we can apply each gain map to raw_data array2D mvals[2][2]; diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index e65cadaa3..7296b830f 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -46,7 +46,7 @@ private: static DiagonalCurve *phaseOneIccCurveInv; 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); + static void colorSpaceConversion_ (Imagefloat* im, const procparams::ColorManagementParams& cmp, const ColorTemp &wb, double pre_mul[3], cmsHPROFILE camprofile, double cam[3][3], cmsHPROFILE in, DCPProfile *dcpProf); static int defTransform (const RawImage *ri, int tran); protected: @@ -138,7 +138,7 @@ public: return rgbSourceModified; // tracks whether cached rgb output of demosaic has been modified } - void processFlatField(const procparams::RAWParams &raw, const RawImage *riFlatFile, array2D &rawData, const float black[4]); + void processFlatField(const procparams::RAWParams &raw, 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(bool extra, 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 &temp0, float &delta, int &bia, int &dread, int &kcam, int &nocam, float &studgood, float &minchrom, int &kmin, float &minhist, float &maxhist, 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; @@ -190,11 +190,8 @@ public: 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) - { - colorSpaceConversion_(im, cmp, wb, pre_mul, embedded, camprofile, cam, camName); - } + static bool findInputProfile(Glib::ustring inProfile, cmsHPROFILE embedded, std::string camName, const Glib::ustring &filename, 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, const Glib::ustring &fileName); 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); diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index c589e8ba4..5147e09ce 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -1108,7 +1108,7 @@ int refreshmap[rtengine::NUMOFEVENTS] = { AUTOEXP, //Evlocallabsigmoidldacie AUTOEXP, //Evlocallabsigmoidthcie AUTOEXP, //Evlocallabsigmoidblcie - AUTOEXP, //Evlocallabsigmoidqjcie + HDR, //Evlocallabcomprcieauto AUTOEXP, //Evlocallabhuecie AUTOEXP, //Evlocallabjabcie AUTOEXP, //Evlocallablightjzcie diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index fb669e1c8..569bcca25 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -20,6 +20,7 @@ #pragma once #include +#include #include #include #include @@ -51,6 +52,7 @@ class LUT; using LUTu = LUT; class EditDataProvider; +class GainMap; namespace rtengine { @@ -130,6 +132,8 @@ public: virtual bool getPixelShift () const = 0; /** @return false: not an HDR file ; true: single or multi-frame HDR file (e.g. Pentax HDR raw file or 32 bit float DNG file or Log compressed) */ virtual bool getHDR() const = 0; + /** @return true if the file is a DNG file */ + virtual bool getDNG() const = 0; /** @return false: not an HDR file ; true: single or multi-frame HDR file (e.g. Pentax HDR raw file or 32 bit float DNG file or Log compressed) */ virtual std::string getImageType() const = 0; @@ -158,6 +162,9 @@ public: static FramesMetaData* fromFile(const Glib::ustring& fname); virtual Glib::ustring getFileName() const = 0; + virtual std::uint32_t getFixBadPixelsConstant() const = 0; + virtual bool hasFixBadPixelsConstant() const = 0; + virtual std::vector getGainMaps() const = 0; virtual void getDimensions(int &w, int &h) const = 0; }; @@ -192,13 +199,13 @@ class InitialImage public: /** Returns the file name of the image. * @return The file name of the image */ - virtual Glib::ustring getFileName () = 0; + virtual Glib::ustring getFileName() const = 0; /** Returns the embedded icc profile of the image. * @return The handle of the embedded profile */ - virtual cmsHPROFILE getEmbeddedProfile () = 0; + virtual cmsHPROFILE getEmbeddedProfile() const = 0; /** Returns a class providing access to the exif and iptc metadata tags of all frames of the image. * @return An instance of the FramesMetaData class */ - virtual const FramesMetaData* getMetaData () = 0; + virtual const FramesMetaData *getMetaData() const = 0; /** This is a function used for internal purposes only. */ virtual ImageSource* getImageSource () = 0; /** This class has manual reference counting. You have to call this function each time to make a new reference to an instance. */ @@ -372,7 +379,7 @@ 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; + virtual void wbCamChanged(double tem, double tin, bool autotemp) = 0; }; @@ -424,12 +431,72 @@ public: double Lnres46; }; + struct locallabcieBEF { + double blackevbef; + double whiteevbef; + double sourcegbef; + double sourceabbef; + double targetgbef; + bool autocomputbef; + bool autociebef; + double jz1bef; + }; + + struct locallabcieLC { + double redxlc; + double redylc; + double grexlc; + double greylc; + double bluxlc; + double bluylc; + double wxlc; + double wylc; + double meanxlc; + double meanylc; + double meanxelc; + double meanyelc; + int primlc; + }; + +//select spot settings + struct locallabsetLC { + int mainf; + bool iscolo; + bool iss; + bool isvi; + bool isexpo; + bool issof; + bool isblu; + bool isto; + bool isre; + bool isshar; + bool iscon; + bool iscbd; + bool islo; + bool isma; + bool isci; + }; + + struct locallabcieSIG { + double contsigq; + double lightsigq; + }; + 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 cieChanged(const std::vector &cielc, int selspot) = 0; + virtual void maiChanged(const std::vector &csetlc, int selspot) = 0; + virtual void sigChanged(const std::vector &ciesig, int selspot) = 0; + virtual void ciebefChanged(const std::vector &ciebef, int selspot) = 0; virtual void refChanged2(float *huerefp, float *chromarefp, float *lumarefp, float *fabrefp, int selspot) = 0; +// virtual void mainChanged(int spottype, int selspot, bool iscolor, bool issh, bool isvib, bool isexpos, bool issoft, bool isblur, bool istom, bool isret, bool issharp, bool iscont, bool iscbdl, bool islog, bool ismas, bool iscie) = 0; + virtual void scopeChangedcol(int scope, int selspot, bool enab) = 0; + virtual void scopeChangedsh(int scope, int selspot, bool enab) = 0; + virtual void scopeChangedvib(int scope, int selspot, bool enab) = 0; + virtual void scopeChangedset(int scope, int selspot, bool enab) = 0; + }; class AutoColorTonListener @@ -444,7 +511,7 @@ 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; + 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, float m_x, float m_y) = 0; }; diff --git a/rtengine/rtlensfun.cc b/rtengine/rtlensfun.cc index 58f3d12a3..f4714b6f7 100644 --- a/rtengine/rtlensfun.cc +++ b/rtengine/rtlensfun.cc @@ -19,12 +19,68 @@ */ #include +#include #include "imagedata.h" #include "procparams.h" #include "rtlensfun.h" #include "settings.h" + +namespace +{ + +bool isCStringIn(const char *str, const char *const *list) +{ + for (auto element_ptr = list; *element_ptr; element_ptr++) { + if (!strcmp(str, *element_ptr)) { + return true; + } + } + return false; +} + +bool isNextLensCropFactorBetter(const lfLens *current_lens, const lfCamera *camera, float next_lens_crop_factor) +{ + if (!current_lens) { + // No current lens, so next lens's crop factor is + // automatically better. + return true; + } + + const float current_lens_crop_factor = current_lens->CropFactor; + + if (!camera) { + // Favor the smaller crop factor for maximum coverage. + return current_lens_crop_factor > next_lens_crop_factor; + } + + const float camera_crop_factor = camera->CropFactor; + + if (current_lens_crop_factor > camera_crop_factor) { + // Current lens's data does not cover the entire camera + // sensor. Any lens's data with a smaller crop factor is + // better. + return current_lens->CropFactor > next_lens_crop_factor; + } + + // Current lens's data covers the entire camera sensor. A lens + // with data from a larger crop factor will be more precise, but + // also must not be larger than the camera sensor's crop factor + // to maintain full coverage. + return current_lens->CropFactor < next_lens_crop_factor && + next_lens_crop_factor <= camera_crop_factor; +} + +bool isNextLensBetter(const lfCamera *camera, const lfLens *current_lens, const lfLens &next_lens, const Glib::ustring &lens_name, const Glib::ustring &next_lens_name) +{ + return isNextLensCropFactorBetter(current_lens, camera, next_lens.CropFactor) && + lens_name == next_lens_name && + (!camera || isCStringIn(camera->Mount, next_lens.Mounts)); +} + +} // namespace + namespace rtengine { @@ -46,6 +102,21 @@ LFModifier::operator bool() const } +bool LFModifier::hasDistortionCorrection() const +{ + return (flags_ & LF_MODIFY_DISTORTION); +} + +bool LFModifier::hasCACorrection() const +{ + return (flags_ & LF_MODIFY_TCA); +} + +bool LFModifier::hasVignettingCorrection() const +{ + return (flags_ & LF_MODIFY_VIGNETTING); +} + void LFModifier::correctDistortion(double &x, double &y, int cx, int cy) const { if (!data_) { @@ -69,12 +140,6 @@ void LFModifier::correctDistortion(double &x, double &y, int cx, int cy) const } } - -bool LFModifier::isCACorrectionAvailable() const -{ - return (flags_ & LF_MODIFY_TCA); -} - void LFModifier::correctCA(double &x, double &y, int cx, int cy, int channel) const { assert(channel >= 0 && channel <= 2); @@ -85,7 +150,7 @@ void LFModifier::correctCA(double &x, double &y, int cx, int cy, int channel) co // channels. We could consider caching the info to speed this up x += cx; y += cy; - + float pos[6]; if (swap_xy_) { std::swap(x, y); @@ -100,6 +165,31 @@ void LFModifier::correctCA(double &x, double &y, int cx, int cy, int channel) co y -= cy; } +void LFModifier::correctDistortionAndCA(double &x, double &y, int cx, int cy, int channel) const +{ + assert(channel >= 0 && channel <= 2); + + // RT currently applies the CA correction per channel, whereas + // lensfun applies it to all the three channels simultaneously. This means + // we do the work 3 times, because each time we discard 2 of the 3 + // channels. We could consider caching the info to speed this up + x += cx; + y += cy; + + float pos[6]; + if (swap_xy_) { + std::swap(x, y); + } + data_->ApplySubpixelGeometryDistortion(x, y, 1, 1, pos); // This is thread-safe + x = pos[2*channel]; + y = pos[2*channel+1]; + if (swap_xy_) { + std::swap(x, y); + } + x -= cx; + y -= cy; +} + #ifdef _OPENMP void LFModifier::processVignette(int width, int height, float** rawData) const { @@ -340,7 +430,7 @@ bool LFDatabase::init(const Glib::ustring &dbdir) if (settings->verbose) { std::cout << (ok ? "OK" : "FAIL") << std::endl; } - + return ok; } @@ -435,11 +525,21 @@ std::vector LFDatabase::getLenses() const } -LFCamera LFDatabase::findCamera(const Glib::ustring &make, const Glib::ustring &model) const +LFCamera LFDatabase::findCamera(const Glib::ustring &make, const Glib::ustring &model, bool autoMatch) const { LFCamera ret; if (data_ && !make.empty()) { MyMutex::MyLock lock(lfDBMutex); + if (!autoMatch) { + // Try to find exact match by name. + for (auto camera_list = data_->GetCameras(); camera_list[0]; camera_list++) { + const auto camera = camera_list[0]; + if (make == camera->Maker && model == camera->Model) { + ret.data_ = camera; + return ret; + } + } + } auto found = data_->FindCamerasExt(make.c_str(), model.c_str()); if (found) { ret.data_ = found[0]; @@ -450,28 +550,56 @@ LFCamera LFDatabase::findCamera(const Glib::ustring &make, const Glib::ustring & } -LFLens LFDatabase::findLens(const LFCamera &camera, const Glib::ustring &name) const +LFLens LFDatabase::findLens(const LFCamera &camera, const Glib::ustring &name, bool autoMatch) const { LFLens ret; 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(); ) { - // try to split the maker from the model of the lens -- we have to - // guess a bit here, since there are makers with a multi-word name - // (e.g. "Leica Camera AG") - if (name.find("f/", pos) == 0) { - break; // no need to search further + if (!autoMatch) { + // Only the lens name provided. Try to find exact match by name. + LFLens candidate; + LFLens bestCandidate; + + for (auto lens_list = data_->GetLenses(); lens_list[0]; lens_list++) { + candidate.data_ = lens_list[0]; + if (isNextLensBetter(camera.data_, bestCandidate.data_, *(candidate.data_), name, candidate.getLens())) { + bestCandidate.data_ = candidate.data_; + } } - Glib::ustring make, model; - auto i = name.find(' ', pos); - if (i != Glib::ustring::npos) { - make = name.substr(0, i); - model = name.substr(i+1); - found = data_->FindLenses(camera.data_, make.c_str(), model.c_str()); - pos = i+1; - } else { - break; + if (bestCandidate.data_) { + return bestCandidate; + } + } + const auto find_lens_from_name = [](const lfDatabase *database, const lfCamera *cam, const Glib::ustring &lens_name) { + auto found = database->FindLenses(cam, nullptr, lens_name.c_str()); + for (size_t pos = 0; !found && pos < lens_name.size(); ) { + // try to split the maker from the model of the lens -- we have to + // guess a bit here, since there are makers with a multi-word name + // (e.g. "Leica Camera AG") + if (lens_name.find("f/", pos) == 0) { + break; // no need to search further + } + Glib::ustring make, model; + auto i = lens_name.find(' ', pos); + if (i != Glib::ustring::npos) { + make = lens_name.substr(0, i); + model = lens_name.substr(i+1); + found = database->FindLenses(cam, make.c_str(), model.c_str()); + pos = i+1; + } else { + break; + } + } + return found; + }; + auto found = find_lens_from_name(data_, camera.data_, name); + if (!found) { + // Some names have white-space around the dash(s) while Lensfun does + // not have any. + const std::regex pattern("\\s*-\\s*"); + const auto formatted_name = std::regex_replace(name.raw(), pattern, "-"); + if (name != formatted_name) { + found = find_lens_from_name(data_, camera.data_, formatted_name); } } if (!found && camera && camera.isFixedLens()) { @@ -541,13 +669,8 @@ std::unique_ptr LFDatabase::findModifier( return nullptr; } - const LFCamera c = findCamera(make, model); - const LFLens l = findLens( - lensProf.lfAutoMatch() - ? c - : LFCamera(), - lens - ); + const LFCamera c = findCamera(make, model, lensProf.lfAutoMatch()); + const LFLens l = findLens(c, lens, lensProf.lfAutoMatch()); bool swap_xy = false; if (rawRotationDeg >= 0) { diff --git a/rtengine/rtlensfun.h b/rtengine/rtlensfun.h index 51212c9b9..78c9c9ff6 100644 --- a/rtengine/rtlensfun.h +++ b/rtengine/rtlensfun.h @@ -53,8 +53,12 @@ public: explicit operator bool() const; + bool hasDistortionCorrection() const override; + bool hasCACorrection() const override; + bool hasVignettingCorrection() const override; + + void correctDistortionAndCA(double &x, double &y, int cx, int cy, int channel) 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; void processVignette3Channels(int width, int height, float** rawData) const override; @@ -120,8 +124,8 @@ public: std::vector getCameras() const; std::vector getLenses() const; - LFCamera findCamera(const Glib::ustring &make, const Glib::ustring &model) const; - LFLens findLens(const LFCamera &camera, const Glib::ustring &name) const; + LFCamera findCamera(const Glib::ustring &make, const Glib::ustring &model, bool autoMatch) const; + LFLens findLens(const LFCamera &camera, const Glib::ustring &name, bool autoMatch) const; std::unique_ptr findModifier( const procparams::LensProfParams &lensProf, diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 65c03ac96..bf5e48f59 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -495,32 +495,14 @@ Thumbnail* Thumbnail::loadQuickFromRaw (const Glib::ustring& fname, eSensorType sensorType = ri->getSensorType(); - Image8* img = new Image8 (); - // No sample format detection occurred earlier, so we set them here, - // as they are mandatory for the setScanline method - img->setSampleFormat (IIOSF_UNSIGNED_CHAR); - img->setSampleArrangement (IIOSA_CHUNKY); - - int err = 1; - - // See if it is something we support - if (checkRawImageThumb (*ri)) { - const char* data ((const char*)fdata (ri->get_thumbOffset(), ri->get_file())); - - if ( (unsigned char)data[1] == 0xd8 ) { - err = img->loadJPEGFromMemory (data, ri->get_thumbLength()); - } else if (ri->is_ppmThumb()) { - err = img->loadPPMFromMemory (data, ri->get_thumbWidth(), ri->get_thumbHeight(), ri->get_thumbSwap(), ri->get_thumbBPS()); - } - } + Image8 *img = ri->getThumbnail(); // did we succeed? - if ( err ) { + if (!img) { if (settings->verbose) { std::cout << "Could not extract thumb from " << fname.c_str() << std::endl; } delete tpp; - delete img; delete ri; return nullptr; } @@ -627,6 +609,11 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, eSensorType &sens int width = ri->get_width(); int height = ri->get_height(); + int iwidth = ri->get_iwidth(); + int iheight = ri->get_iheight(); + int left_margin = ri->get_leftmargin(); + int top_margin = ri->get_topmargin(); + rtengine::Thumbnail* tpp = new rtengine::Thumbnail; tpp->isRaw = true; @@ -717,19 +704,19 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, eSensorType &sens if (ri->getSensorType() == ST_BAYER) { // demosaicing! (sort of) for (int row = 1, y = 0; row < height - 1 && y < tmph; row += vskip, y++) { - rofs = row * width; + rofs = (row + top_margin) * iwidth; for (int col = firstgreen, x = 0; col < width - 1 && x < tmpw; col += hskip, x++) { - int ofs = rofs + col; + int ofs = rofs + col + left_margin; int g = image[ofs][1]; int r, b; if (FISRED (filter, row, col + 1)) { r = (image[ofs + 1 ][0] + image[ofs - 1 ][0]) >> 1; - b = (image[ofs + width][2] + image[ofs - width][2]) >> 1; + b = (image[ofs + iwidth][2] + image[ofs - iwidth][2]) >> 1; } else { b = (image[ofs + 1 ][2] + image[ofs - 1 ][2]) >> 1; - r = (image[ofs + width][0] + image[ofs - width][0]) >> 1; + r = (image[ofs + iwidth][0] + image[ofs - iwidth][0]) >> 1; } tmpImg->r (y, x) = r; @@ -739,28 +726,28 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, eSensorType &sens } } else if (ri->get_colors() == 1) { for (int row = 1, y = 0; row < height - 1 && y < tmph; row += vskip, y++) { - rofs = row * width; + rofs = (row + top_margin) * iwidth; for (int col = firstgreen, x = 0; col < width - 1 && x < tmpw; col += hskip, x++) { - int ofs = rofs + col; + int ofs = rofs + col + left_margin; tmpImg->r (y, x) = tmpImg->g (y, x) = tmpImg->b (y, x) = image[ofs][0]; } } } else { if (ri->getSensorType() == ST_FUJI_XTRANS) { for ( int row = 1, y = 0; row < height - 1 && y < tmph; row += vskip, y++) { - rofs = row * width; + rofs = (row + top_margin) * iwidth; for ( int col = 1, x = 0; col < width - 1 && x < tmpw; col += hskip, x++ ) { - int ofs = rofs + col; + int ofs = rofs + col + left_margin; float sum[3] = {}; int c; for (int v = -1; v <= 1; v++) { for (int h = -1; h <= 1; h++) { c = ri->XTRANSFC (row + v, col + h); - sum[c] += image[ofs + v * width + h][c]; + sum[c] += image[ofs + v * iwidth + h][c]; } } @@ -788,11 +775,11 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, eSensorType &sens } } } else { - int iwidth = ri->get_iwidth(); - int iheight = ri->get_iheight(); - int left_margin = ri->get_leftmargin(); + // int iwidth = ri->get_iwidth(); + // int iheight = ri->get_iheight(); + // int left_margin = ri->get_leftmargin(); firstgreen += left_margin; - int top_margin = ri->get_topmargin(); + // int top_margin = ri->get_topmargin(); int wmax = tmpw; int hmax = tmph; @@ -1328,7 +1315,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT if (isRaw) { double pre_mul[3] = { redMultiplier, greenMultiplier, blueMultiplier }; - RawImageSource::colorSpaceConversion (baseImg, params.icm, currWB, pre_mul, embProfile, camProfile, cam2xyz, camName ); + RawImageSource::colorSpaceConversion (baseImg, params.icm, currWB, pre_mul, embProfile, camProfile, cam2xyz, camName, metadata->getFileName()); } else { StdImageSource::colorSpaceConversion (baseImg, params.icm, embProfile, thumbImg->getSampleFormat()); } @@ -1467,7 +1454,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT if (isRaw) { cmsHPROFILE dummy; - RawImageSource::findInputProfile (params.icm.inputProfile, nullptr, camName, &dcpProf, dummy); + RawImageSource::findInputProfile (params.icm.inputProfile, nullptr, camName, metadata->getFileName(), &dcpProf, dummy); if (dcpProf) { dcpProf->setStep2ApplyState (params.icm.workingProfile, params.icm.toneCurve, params.icm.applyLookTable, params.icm.applyBaselineExposureOffset, as); @@ -1528,13 +1515,14 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT - if ((params.colorappearance.enabled && !params.colorappearance.tonecie) || !params.colorappearance.enabled) { + // if ((params.colorappearance.enabled && !params.colorappearance.tonecie) || !params.colorappearance.enabled) { + if ((params.colorappearance.enabled && !params.colorappearance.tonecie) || params.colorappearance.modelmethod != "02") { ipf.EPDToneMap (labView, 5, 6); } ipf.softLight(labView, params.softlight); - if (params.icm.workingTRC != ColorManagementParams::WorkingTrc::NONE) { + if (params.icm.workingTRC != ColorManagementParams::WorkingTrc::NONE && params.icm.trcExp) { const int GW = labView->W; const int GH = labView->H; std::unique_ptr provis; @@ -1558,8 +1546,49 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT 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); + int locprim = 0; + float rdx, rdy, grx, gry, blx, bly = 0.f; + float meanx, meany, meanxe, meanye = 0.f; + ipf.workingtrc(0, tmpImage1.get(), tmpImage1.get(), GW, GH, -5, prof, 2.4, 12.92310, 0, ill, 0, 0, rdx, rdy, grx, gry, blx, bly, meanx, meany, meanxe, meanye, dummy, true, false, false); + ipf.workingtrc(0, tmpImage1.get(), tmpImage1.get(), GW, GH, 5, prof, gamtone, slotone,0, illum, prim, locprim, rdx, rdy, grx, gry, blx, bly,meanx, meany, meanxe, meanye, dummy, false, true, true); + const int midton = params.icm.wmidtcie; + if(midton != 0) { + ToneEqualizerParams params; + params.enabled = true; + params.regularization = 0.f; + params.pivot = 0.f; + params.bands[0] = 0; + params.bands[2] = midton; + params.bands[4] = 0; + params.bands[5] = 0; + int mid = abs(midton); + int threshmid = 50; + if(mid > threshmid) { + params.bands[1] = sign(midton) * (mid - threshmid); + params.bands[3] = sign(midton) * (mid - threshmid); + } + ipf.toneEqualizer(tmpImage1.get(), params, prof, 1, false); + } + + const bool smoothi = params.icm.wsmoothcie; + if(smoothi) { + ToneEqualizerParams params; + params.enabled = true; + params.regularization = 0.f; + params.pivot = 0.f; + params.bands[0] = 0; + params.bands[1] = 0; + params.bands[2] = 0; + params.bands[3] = 0; + params.bands[4] = -40;//arbitrary value to adapt with WhiteEvjz - here White Ev # 10 + params.bands[5] = -80;//8 Ev and above + bool Evsix = true; + if(Evsix) {//EV = 6 majority of images + params.bands[4] = -15; + } + + ipf.toneEqualizer(tmpImage1.get(), params, prof, 1, false); + } ipf.rgb2lab(*tmpImage1, *labView, params.icm.workingProfile); // labView and provis diff --git a/rtengine/settings.h b/rtengine/settings.h index fbbb51bbb..87dd166cb 100644 --- a/rtengine/settings.h +++ b/rtengine/settings.h @@ -51,6 +51,7 @@ public: 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 + bool enableLibRaw; ///< Use LibRaw to decode raw images. Glib::ustring adobe; // filename of AdobeRGB1998 profile (default to the bundled one) Glib::ustring prophoto; // filename of Prophoto profile (default to the bundled one) @@ -99,7 +100,7 @@ public: bool itcwb_enable; double itcwb_deltaspec; double itcwb_powponder; - + double basecorlog; //wavelet levels double edghi; double edglo; diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index b5c5cdcdd..06194e437 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -231,7 +231,8 @@ private: bool autoContrast = imgsrc->getSensorType() == ST_BAYER ? params.raw.bayersensor.dualDemosaicAutoContrast : params.raw.xtranssensor.dualDemosaicAutoContrast; double contrastThreshold = imgsrc->getSensorType() == ST_BAYER ? params.raw.bayersensor.dualDemosaicContrast : params.raw.xtranssensor.dualDemosaicContrast; - imgsrc->demosaic (params.raw, autoContrast, contrastThreshold, params.pdsharpening.enabled && pl); + imgsrc->demosaic(params.raw, autoContrast, contrastThreshold, params.pdsharpening.enabled && pl); + if (params.pdsharpening.enabled) { imgsrc->captureSharpening(params.pdsharpening, false, params.pdsharpening.contrast, params.pdsharpening.deconvradius); } @@ -272,6 +273,7 @@ private: // set the color temperature currWB = ColorTemp(params.wb.temperature, params.wb.green, params.wb.equal, params.wb.method, params.wb.observer); ColorTemp currWBitc; + if (params.wb.method == "autitcgreen" && flush) { imgsrc->getrgbloc(0, 0, fh, fw, 0, 0, fh, fw, params.wb); } @@ -349,8 +351,9 @@ private: params.wb.green = currWB.getGreen(); params.wb.equal = currWB.getEqual(); } + //end WB auto - + calclum = nullptr ; params.dirpyrDenoise.getCurves(noiseLCurve, noiseCCurve); autoNR = (float) settings->nrauto;// @@ -867,8 +870,8 @@ private: } // Spot Removal - if (params.spot.enabled && !params.spot.entries.empty ()) { - ipf.removeSpots (baseImg, imgsrc, params.spot.entries, pp, currWB, nullptr, tr); + 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 @@ -979,7 +982,7 @@ private: } ipf.transform(baseImg, trImg, 0, 0, 0, 0, fw, fh, fw, fh, - imgsrc->getMetaData(), imgsrc->getRotateDegree(), true, true); + imgsrc->getMetaData(), imgsrc->getRotateDegree(), true, true); if (trImg != baseImg) { delete baseImg; @@ -995,14 +998,29 @@ private: 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.locallab.spots.at(sp).expsharp && params.dirpyrequalizer.cbdlMethod == "bef") { + if (params.locallab.spots.at(sp).shardamping < 1) { + params.locallab.spots.at(sp).shardamping = 1; + } + } + } + //colorappearance.modelmethod == "02" + bool execcam = false; - if (params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled && !params.colorappearance.enabled) { + //execcam => work around for pre-ciecam in LA: about 0.1 second + for (int sp = 0; sp < (int)params.locallab.spots.size(); sp++) { + if (params.locallab.spots.at(sp).expprecam) { + execcam = true; + } + } + if ((params.dirpyrequalizer.cbdlMethod == "bef") && (params.dirpyrequalizer.enabled || execcam) && !params.colorappearance.enabled) { + if (execcam && !params.dirpyrequalizer.enabled) { + params.dirpyrequalizer.enabled = true; + + if (params.dirpyrequalizer.mult[0] == 1.) { + params.dirpyrequalizer.mult[0] = 1.01; + } + } const int W = baseImg->getWidth(); const int H = baseImg->getHeight(); LabImage labcbdl(W, H); @@ -1037,6 +1055,7 @@ private: LocLLmaskCurve locllmasCurve; LocHHmaskCurve lochhmasCurve; LocHHmaskCurve lochhhmasCurve; + LocHHmaskCurve lochhhmascieCurve; LocCCmaskCurve locccmasexpCurve; LocLLmaskCurve locllmasexpCurve; LocHHmaskCurve lochhmasexpCurve; @@ -1075,6 +1094,7 @@ private: LocwavCurve loclmasCurveblwav; LocwavCurve loclmasCurvecolwav; + LocwavCurve loclmasCurveciewav; LocwavCurve loclmasCurve_wav; LocwavCurve locwavCurve; LocwavCurve locwavCurvejz; @@ -1114,6 +1134,7 @@ private: 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); @@ -1136,6 +1157,7 @@ private: 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 lhhmascieutili = lochhhmascieCurve.Set(params.locallab.spots.at(sp).HHhmaskciecurve); 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); @@ -1171,6 +1193,7 @@ private: 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 lmasutiliciewav = loclmasCurveciewav.Set(params.locallab.spots.at(sp).LLmaskciecurvewav); 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); @@ -1215,10 +1238,15 @@ private: 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" ) { + + if (lblack < 0. && params.locallab.spots.at(sp).expMethod == "pde") { lblack *= 1.5; } + float contsig = params.locallab.spots.at(sp).contsigqcie; + + float lightsig = params.locallab.spots.at(sp).lightsigqcie; + // Reference parameters computation double huere, chromare, lumare, huerefblu, chromarefblu, lumarefblu, sobelre; int lastsav; @@ -1228,12 +1256,18 @@ private: float meanretie; float stdretie; float fab = 1.f; + float maxicam = -1000.f; + float rdx, rdy, grx, gry, blx, bly = 0.f; + float meanx, meany, meanxe, meanye = 0.f; + int ill = 2; + int prim = 3; 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); @@ -1247,7 +1281,7 @@ private: float Tmax; float highresi = 0.f; float nresi = 0.f; - float highresi46 =0.f; + float highresi46 = 0.f; float nresi46 = 0.f; float Lhighresi = 0.f; float Lnresi = 0.f; @@ -1256,60 +1290,61 @@ private: // 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, + 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, + locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, lochhhmasCurve, lhhmasutili, lochhhmascieCurve, lhhmascieutili, 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 -); + 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, + loclmasCurveciewav, lmasutiliciewav, + 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, maxicam, rdx, rdy, grx, gry, blx, bly, meanx, meany, meanxe, meanye, prim, ill, contsig, lightsig, + 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 @@ -1407,7 +1442,7 @@ private: 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", static_cast(autor), static_cast(autog), static_cast(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) @@ -1476,21 +1511,22 @@ private: if (params.colorToning.enabled && params.colorToning.method == "LabGrid") { - ipf.colorToningLabGrid(labView, 0,labView->W , 0, labView->H, false); + 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); + 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.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); - if ((params.colorappearance.enabled && !params.colorappearance.tonecie) || (!params.colorappearance.enabled)) { - ipf.EPDToneMap (labView, 0, 1); + // if ((params.colorappearance.enabled && !params.colorappearance.tonecie) || (!params.colorappearance.enabled)) { + if ((params.colorappearance.enabled && !params.colorappearance.tonecie) || (params.colorappearance.modelmethod != "02")) { + ipf.EPDToneMap(labView, 0, 1); } @@ -1499,8 +1535,9 @@ private: // 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); + // if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { + if ((params.colorappearance.enabled && !settings->autocielab) || (params.colorappearance.modelmethod != "02")) { + ipf.impulsedenoise(labView); ipf.defringe(labView); } @@ -1509,12 +1546,14 @@ private: } if (params.sharpenMicro.enabled) { - if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { + // if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { + if ((params.colorappearance.enabled && !settings->autocielab) || (params.colorappearance.modelmethod != "02")) { ipf.MLmicrocontrast(labView); //!params.colorappearance.sharpcie } } - if (((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) && params.sharpening.enabled) { + // if (((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) && params.sharpening.enabled) { + if (((params.colorappearance.enabled && !settings->autocielab) || (params.colorappearance.modelmethod != "02")) && params.sharpening.enabled) { ipf.sharpening(labView, params.sharpening); } @@ -1523,12 +1562,14 @@ private: // directional pyramid wavelet if (params.dirpyrequalizer.cbdlMethod == "aft") { - if ((params.colorappearance.enabled && !settings->autocielab) || !params.colorappearance.enabled) { + // if ((params.colorappearance.enabled && !settings->autocielab) || !params.colorappearance.enabled) { + if ((params.colorappearance.enabled && !settings->autocielab) || params.colorappearance.modelmethod != "02") { ipf.dirpyrequalizer(labView, 1); //TODO: this is the luminance tonecurve, not the RGB one } } - if ((params.wavelet.enabled)) { + int savestr = params.wavelet.strength;//work around for abstract profile: time about = 0.1 second + if ((params.wavelet.enabled) || (params.icm.workingTRC != ColorManagementParams::WorkingTrc::NONE && params.icm.trcExp)) { LabImage *unshar = nullptr; WaveletParams WaveParams = params.wavelet; WavCurve wavCLVCurve; @@ -1548,12 +1589,9 @@ private: bool proton = WaveParams.exptoning; bool pronois = WaveParams.expnoise; -/* - if(WaveParams.showmask) { - WaveParams.showmask = false; - WaveParams.expclari = true; + if(params.icm.workingTRC != ColorManagementParams::WorkingTrc::NONE && params.icm.trcExp) { + params.wavelet.strength = 0; } -*/ if (WaveParams.softrad > 0.f) { provradius = new LabImage(*labView, true); } @@ -1614,6 +1652,7 @@ private: 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; @@ -1639,7 +1678,8 @@ private: Color::XYZ2Lab(X, Y, Z, L, a, b); labView->L[ir][jr] = L; } - delete tmpImage; + + delete tmpImage; } } @@ -1685,15 +1725,17 @@ private: wavCLVCurve.Reset(); } + params.wavelet.strength = savestr; ipf.softLight(labView, params.softlight); - if (params.icm.workingTRC != ColorManagementParams::WorkingTrc::NONE) { + if (params.icm.workingTRC != ColorManagementParams::WorkingTrc::NONE && params.icm.trcExp) { 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); @@ -1713,23 +1755,69 @@ private: 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); + bool gamutcontrol = params.icm.gamut; + int catc = toUnderlying(params.icm.wcat); + int locprim = 0; + float rdx, rdy, grx, gry, blx, bly = 0.f; + float meanx, meany, meanxe, meanye = 0.f; + ipf.workingtrc(0, tmpImage1.get(), tmpImage1.get(), GW, GH, -5, prof, 2.4, 12.92310, 0, ill, 0, 0, rdx, rdy, grx, gry, blx, bly, meanx, meany, meanxe, meanye, dummy, true, false, false, false); + ipf.workingtrc(0, tmpImage1.get(), tmpImage1.get(), GW, GH, 5, prof, gamtone, slotone, catc, illum, prim, locprim, rdx, rdy, grx, gry, blx, bly, meanx, meany, meanxe, meanye, dummy, false, true, true, gamutcontrol); + const int midton = params.icm.wmidtcie; + if(midton != 0) { + ToneEqualizerParams params; + params.enabled = true; + params.regularization = 0.f; + params.pivot = 0.f; + params.bands[0] = 0; + params.bands[2] = midton; + params.bands[4] = 0; + params.bands[5] = 0; + int mid = abs(midton); + int threshmid = 50; + if(mid > threshmid) { + params.bands[1] = sign(midton) * (mid - threshmid); + params.bands[3] = sign(midton) * (mid - threshmid); + } + ipf.toneEqualizer(tmpImage1.get(), params, prof, 1, false); + } + + const bool smoothi = params.icm.wsmoothcie; + if(smoothi) { + ToneEqualizerParams params; + params.enabled = true; + params.regularization = 0.f; + params.pivot = 0.f; + params.bands[0] = 0; + params.bands[1] = 0; + params.bands[2] = 0; + params.bands[3] = 0; + params.bands[4] = -40;//arbitrary value to adapt with WhiteEvjz - here White Ev # 10 + params.bands[5] = -80;//8 Ev and above + bool Evsix = true; + if(Evsix) {//EV = 6 majority of images + params.bands[4] = -15; + } + + ipf.toneEqualizer(tmpImage1.get(), params, prof, 1, false); + } ipf.rgb2lab(*tmpImage1, *labView, params.icm.workingProfile); + // labView and provis - if(provis) { + if (provis) { ipf.preserv(labView, provis.get(), GW, GH); } - if(params.icm.fbw) { + + if (params.icm.fbw) { #ifdef _OPENMP - #pragma omp parallel for + #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; - } + + 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; + } } } @@ -1768,7 +1856,7 @@ private: adap = 2000.; }//if no exif data or wrong else { - double E_V = fcomp + log2 ((fnum * fnum) / fspeed / (fiso / 100.f)); + 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 @@ -1780,7 +1868,7 @@ private: float CAMMean = NAN; float d, dj, yb; - ipf.ciecam_02float (cieView, float (adap), 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 0, 1, true, d, dj, yb, 1); + ipf.ciecam_02float(cieView, float (adap), 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 0, 1, true, d, dj, yb, 1); } delete cieView; @@ -1853,7 +1941,8 @@ private: } } - bool bwonly = params.blackwhite.enabled && !params.colorToning.enabled && !autili && !butili && !params.colorappearance.enabled; + // bool bwonly = params.blackwhite.enabled && !params.colorToning.enabled && !autili && !butili && !params.colorappearance.enabled; + bool bwonly = params.blackwhite.enabled && !params.colorToning.enabled && !autili && !butili && params.colorappearance.modelmethod != "02"; ///////////// Custom output gamma has been removed, the user now has to create ///////////// a new output profile with the ICCProfileCreator @@ -1896,21 +1985,26 @@ private: } Exiv2Metadata info(imgsrc->getFileName()); + switch (params.metadata.mode) { - case MetaDataParams::TUNNEL: - readyImg->setMetadata(std::move(info)); - break; - case MetaDataParams::EDIT: - info.setExif(params.metadata.exif); - info.setIptc(params.metadata.iptc); - if (!(params.metadata.exifKeys.size() == 1 && params.metadata.exifKeys[0] == "*")) { - info.setExifKeys(&(params.metadata.exifKeys)); - } - readyImg->setMetadata(std::move(info)); - break; - default: // case MetaDataParams::STRIP - // nothing to do - break; + case MetaDataParams::TUNNEL: + readyImg->setMetadata(std::move(info)); + break; + + case MetaDataParams::EDIT: + info.setExif(params.metadata.exif); + info.setIptc(params.metadata.iptc); + + if (!(params.metadata.exifKeys.size() == 1 && params.metadata.exifKeys[0] == "*")) { + info.setExifKeys(&(params.metadata.exifKeys)); + } + + readyImg->setMetadata(std::move(info)); + break; + + default: // case MetaDataParams::STRIP + // nothing to do + break; } diff --git a/rtengine/stdimagesource.cc b/rtengine/stdimagesource.cc index 435f2f9a0..32961f975 100644 --- a/rtengine/stdimagesource.cc +++ b/rtengine/stdimagesource.cc @@ -90,6 +90,12 @@ void StdImageSource::getSampleFormat (const Glib::ustring &fname, IIOSampleForma if (result == IMIO_SUCCESS) { return; } +#ifdef LIBJXL + } else if (hasJxlExtension(fname)) { + sFormat = IIOSF_FLOAT32; + sArrangement = IIOSA_CHUNKY; + return; +#endif } else if (hasTiffExtension(fname)) { int result = ImageIO::getTIFFSampleFormat (fname, sFormat, sArrangement); diff --git a/rtengine/utils.cc b/rtengine/utils.cc index 0674c9806..6a8321d1c 100644 --- a/rtengine/utils.cc +++ b/rtengine/utils.cc @@ -19,6 +19,8 @@ #include #include #include +#include +#include #include "rt_math.h" #include "utils.h" @@ -222,6 +224,23 @@ void vflip(unsigned char* img, int w, int h) } } +std::vector getFileData(const Glib::ustring &filename) +{ + try { + const std::string fn = Glib::filename_from_utf8(filename); + std::ifstream instream(fn, std::ios::in | std::ios::binary); + + std::vector contents( + (std::istreambuf_iterator(instream)), + std::istreambuf_iterator()); + + instream.close(); + return contents; + } catch (...) { + return {}; + } +} + Glib::ustring getFileExtension(const Glib::ustring& filename) { const Glib::ustring::size_type lastdot_pos = filename.find_last_of('.'); @@ -237,6 +256,13 @@ bool hasJpegExtension(const Glib::ustring& filename) return extension == "jpg" || extension == "jpeg"; } +#ifdef LIBJXL +bool hasJxlExtension(const Glib::ustring& filename) +{ + return getFileExtension(filename) == "jxl"; +} +#endif + bool hasTiffExtension(const Glib::ustring& filename) { const Glib::ustring extension = getFileExtension(filename); diff --git a/rtengine/utils.h b/rtengine/utils.h index e0097d76e..5dec93f51 100644 --- a/rtengine/utils.h +++ b/rtengine/utils.h @@ -18,6 +18,8 @@ */ #pragma once +#include + #include #include @@ -43,6 +45,8 @@ constexpr typename std::underlying_type::type toUnderlying(ENUM value) return static_cast::type>(value); } +std::vector getFileData(const Glib::ustring &filename); + // Return lower case extension without the "." or "" if the given name contains no "." Glib::ustring getFileExtension(const Glib::ustring& filename); // Return true if file has .jpeg or .jpg extension (ignoring case) @@ -52,6 +56,11 @@ bool hasTiffExtension(const Glib::ustring& filename); // Return true if file has .png extension (ignoring case) bool hasPngExtension(const Glib::ustring& filename); +#ifdef LIBJXL +// Return true if file has .jxl extension (ignoring case) +bool hasJxlExtension(const Glib::ustring& filename); +#endif + void swab(const void* from, void* to, ssize_t n); } diff --git a/rtgui/adjuster.cc b/rtgui/adjuster.cc index 49a5ed21b..b94bc459f 100644 --- a/rtgui/adjuster.cc +++ b/rtgui/adjuster.cc @@ -24,6 +24,7 @@ #include "multilangmgr.h" #include "options.h" #include "rtimage.h" +#include "rtscalable.h" #include "../rtengine/rt_math.h" namespace { @@ -93,7 +94,7 @@ Adjuster::Adjuster( reset = Gtk::manage(new Gtk::Button()); - reset->add(*Gtk::manage(new RTImage("undo-small.png", "redo-small.png"))); + reset->add(*Gtk::manage(new RTImage("undo-small", Gtk::ICON_SIZE_BUTTON))); setExpandAlignProperties(reset, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); reset->set_relief(Gtk::RELIEF_NONE); reset->set_tooltip_markup(M("ADJUSTER_RESET_TO_DEFAULT")); @@ -105,7 +106,7 @@ Adjuster::Adjuster( setExpandAlignProperties(spin, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); spin->set_input_purpose(Gtk::INPUT_PURPOSE_DIGITS); - reset->set_size_request(-1, spin->get_height() > MIN_RESET_BUTTON_HEIGHT ? spin->get_height() : MIN_RESET_BUTTON_HEIGHT); + reset->set_size_request(-1, RTScalable::scalePixelSize(spin->get_height() > MIN_RESET_BUTTON_HEIGHT ? spin->get_height() : MIN_RESET_BUTTON_HEIGHT)); slider = Gtk::manage(new MyHScale()); setExpandAlignProperties(slider, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); slider->set_draw_value(false); @@ -193,7 +194,7 @@ void Adjuster::addAutoButton (const Glib::ustring &tooltip) { if (!automatic) { automatic = Gtk::manage(new Gtk::CheckButton()); - //automatic->add (*Gtk::manage (new RTImage ("gears.png"))); + //automatic->add (*Gtk::manage (new RTImage ("gears"))); automatic->set_tooltip_markup(tooltip.length() ? Glib::ustring::compose("%1\n\n%2", M("GENERAL_AUTO"), tooltip) : M("GENERAL_AUTO")); setExpandAlignProperties(automatic, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); autoChange = automatic->signal_toggled().connect( sigc::mem_fun(*this, &Adjuster::autoToggled) ); @@ -616,7 +617,7 @@ void Adjuster::setLogScale(double base, double pivot, bool anchorMiddle) logPivot = pivot; logAnchorMiddle = anchorMiddle; setSliderValue(cur); - + sliderChange.block(false); spinChange.block(false); } diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc index 6ab75bd47..32f6a9430 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -20,6 +20,7 @@ #include #include #include +#include "../rtengine/imagedata.h" #include "../rtengine/rt_math.h" #include "../rtengine/procparams.h" @@ -43,6 +44,74 @@ using namespace std; using namespace rtengine; +#ifdef _WIN32 +#define PATH_SEPARATOR '\\'; +#else +#define PATH_SEPARATOR '/'; +#endif + +namespace // local helper functions +{ + // Look for N or -N in templateText at position ix, meaning "index from end" and "index from start". + // For N, return Nth index from the end, and for -N return the Nth index from the start. + // N is a digit 1 through 9. The returned value is not range-checked, so it may be >=numPathElements. + // or negative. The caller performs any required range-checking. + int decodePathIndex(unsigned int& ix, Glib::ustring& templateText, size_t numPathElements) + { + int pathIndex = static_cast(numPathElements); // a value that means input was invalid + bool fromStart = false; + if (ix < templateText.size()) { + if (templateText[ix] == '-') { + fromStart = true; // minus sign means N is from the start rather than the end of the path + ix++; + } + } + if (ix < templateText.size()) { + pathIndex = templateText[ix] - '1'; + if (!fromStart) { + pathIndex = numPathElements - pathIndex - 1; + } + } + return pathIndex; + } + + // Extract the initial characters from a canonical absolute path, and append + // those to a path string. Initial characters are '/' for Unix/Linux paths and + // '\\' or '//' for UNC paths. A single backslash is also accepted, for driveless + // Windows paths. + void appendAbsolutePathPrefix(Glib::ustring& path, const Glib::ustring& absolutePath) + { + if (absolutePath[0] == '/') { + if (absolutePath.size() > 1 && absolutePath[1] == '/') { + path += "//"; // Start of a Samba UNC path + } else { + path += '/'; // Start of a Unix/Linux path + } + } else if (absolutePath[0] == '\\') { + if (absolutePath.size() > 1 && absolutePath[1] == '\\') { + path += "\\\\"; // Start of a UNC path + } else { + path += '\\'; // Start of a Windows path that does not include a drive letter + } + } + } + + // Look in templateText at index ix for quoted string containing a time format string, and + // use that string to format dateTime. Append the formatted time to path. + void appendFormattedTime(Glib::ustring& path, unsigned int& ix, const Glib::ustring& templateText, const Glib::DateTime& dateTime) + { + constexpr gunichar quoteMark('"'); + if ((ix + 1) < templateText.size() && templateText[ix] == quoteMark) { + const auto endPos = templateText.find_first_of(quoteMark, ++ix); + if (endPos != Glib::ustring::npos) { + Glib::ustring formatString(templateText, ix, endPos-ix); + path += dateTime.format(formatString); + ix = endPos; + } + } + } +} + BatchQueue::BatchQueue (FileCatalog* aFileCatalog) : processing(nullptr), fileCatalog(aFileCatalog), sequence(0), listener(nullptr) { @@ -57,16 +126,16 @@ BatchQueue::BatchQueue (FileCatalog* aFileCatalog) : processing(nullptr), fileCa pmenu.attach (*Gtk::manage(new Gtk::SeparatorMenuItem ()), 0, 1, p, p + 1); p++; - pmenu.attach (*Gtk::manage(head = new MyImageMenuItem (M("FILEBROWSER_POPUPMOVEHEAD"), "goto-start-small.png")), 0, 1, p, p + 1); + pmenu.attach (*Gtk::manage(head = new MyImageMenuItem (M("FILEBROWSER_POPUPMOVEHEAD"), "goto-start-small")), 0, 1, p, p + 1); p++; - pmenu.attach (*Gtk::manage(tail = new MyImageMenuItem (M("FILEBROWSER_POPUPMOVEEND"), "goto-end-small.png")), 0, 1, p, p + 1); + pmenu.attach (*Gtk::manage(tail = new MyImageMenuItem (M("FILEBROWSER_POPUPMOVEEND"), "goto-end-small")), 0, 1, p, p + 1); p++; pmenu.attach (*Gtk::manage(new Gtk::SeparatorMenuItem ()), 0, 1, p, p + 1); p++; - pmenu.attach (*Gtk::manage(cancel = new MyImageMenuItem (M("FILEBROWSER_POPUPCANCELJOB"), "cancel-small.png")), 0, 1, p, p + 1); + pmenu.attach (*Gtk::manage(cancel = new MyImageMenuItem (M("FILEBROWSER_POPUPCANCELJOB"), "cancel-small")), 0, 1, p, p + 1); pmenu.show_all (); @@ -394,7 +463,7 @@ Glib::ustring BatchQueue::getTempFilenameForParams( const Glib::ustring &filenam timeval tv; gettimeofday(&tv, nullptr); char mseconds[11]; - snprintf(mseconds, sizeof(mseconds), "%d", (int)(tv.tv_usec / 1000)); + snprintf(mseconds, sizeof(mseconds), "%d", static_cast((tv.tv_usec / 1000))); time_t rawtime; struct tm *timeinfo; char stringTimestamp [80]; @@ -561,12 +630,28 @@ void BatchQueue::openLastSelectedItemInEditor() { MYREADERLOCK(l, entryRW); - if (selected.size() > 0) { + if (!selected.empty()) { openItemInEditor(selected.back()); } } } +void BatchQueue::updateDestinationPathPreview() +{ + MYWRITERLOCK(l, entryRW); + + if (!selected.empty()) { + auto& entry = *selected.at(0); + int sequence = 0; // Sequence during subsequent queue processing can't be determined here + Glib::ustring baseDestination = calcAutoFileNameBase(entry.filename, sequence); + Glib::ustring destination = Glib::ustring::compose ("%1.%2", baseDestination, options.saveFormatBatch.format); + + if (listener) { + listener->setDestinationPreviewText(destination); + } + } +} + void BatchQueue::openItemInEditor(ThumbBrowserEntryBase* item) { if (item) { @@ -811,7 +896,6 @@ rtengine::ProcessingJob* BatchQueue::imageReady(rtengine::IImagefloat* img) Glib::ustring BatchQueue::calcAutoFileNameBase (const Glib::ustring& origFileName, int sequence) { - std::vector pa; std::vector da; for (size_t i = 0; i < origFileName.size(); i++) { @@ -829,29 +913,13 @@ Glib::ustring BatchQueue::calcAutoFileNameBase (const Glib::ustring& origFileNam tok = tok + origFileName[i++]; } - da.push_back (tok); - } - - if (origFileName[0] == '/') { - pa.push_back ("/" + da[0]); - } else if (origFileName[0] == '\\') { - if (origFileName.size() > 1 && origFileName[1] == '\\') { - pa.push_back ("\\\\" + da[0]); - } else { - pa.push_back ("/" + da[0]); + if (i < origFileName.size()) { // omit the last token, which is the file name + da.push_back (tok); } - } else { - pa.push_back (da[0]); } - for (size_t i = 1; i < da.size(); i++) { - pa.push_back (pa[i - 1] + "/" + da[i]); - } - -// for (int i=0; i(da.size())) { + if (n == 0) { + appendAbsolutePathPrefix(path, origFileName); + } + for (unsigned int i = static_cast(n); i < da.size(); i++) { + path += da[i] + PATH_SEPARATOR; + } + } + // If the next template character is a separator, skip it, because path already has one ix++; + if (ix < options.savePathTemplate.size() && options.savePathTemplate[ix] != '/' && options.savePathTemplate[ix] != '\\') { + ix--; + } + } else if (options.savePathTemplate[ix] == 'p') { + // insert path elements from the start of the path up to the given index + ix++; + int n = decodePathIndex(ix, options.savePathTemplate, da.size()); + if (n >= 0) { + appendAbsolutePathPrefix(path, origFileName); + } + for (unsigned int i=0; static_cast(i) <= n && i < da.size(); i++) { + path += da[i] + PATH_SEPARATOR; + } + // If the next template character is a separator, skip it, because path already has one + ix++; + if (ix < options.savePathTemplate.size() && options.savePathTemplate[ix] != '/' && options.savePathTemplate[ix] != '\\') { + ix--; + } } else if (options.savePathTemplate[ix] == 'd') { + // insert a single directory name from the file's path ix++; - unsigned i = options.savePathTemplate[ix] - '0'; - - if (i < da.size()) { - path = path + da[da.size() - i - 1]; + int n = decodePathIndex(ix, options.savePathTemplate, da.size()); + if (n >= 0 && n < static_cast(da.size())) { + path += da[n]; } } else if (options.savePathTemplate[ix] == 'f') { - path = path + filename; + path += filename; } else if (options.savePathTemplate[ix] == 'r') { // rank from pparams char rank; rtengine::procparams::ProcParams pparams; @@ -923,11 +1017,48 @@ Glib::ustring BatchQueue::calcAutoFileNameBase (const Glib::ustring& origFileNam seqstr << sequence; path += seqstr.str (); + } else if (options.savePathTemplate[ix] == 't') { + // Insert formatted date/time value. Character after 't' defines time source + if (++ix < options.savePathTemplate.size()) { + Glib::DateTime dateTime; + switch(options.savePathTemplate[ix++]) + { + case 'E': // (approximate) time when export started + { + dateTime = Glib::DateTime::create_now_local(); + break; + } + case 'F': // time when file was last saved + { + Glib::RefPtr file = Gio::File::create_for_path(origFileName); + if (file) { + Glib::RefPtr info = file->query_info(G_FILE_ATTRIBUTE_TIME_MODIFIED); + if (info) { + dateTime = info->get_modification_date_time(); + } + } + break; + } + case 'P': // time when picture was taken + { + const auto timestamp = FramesData(origFileName).getDateTimeAsTS(); + dateTime = Glib::DateTime::create_now_local(timestamp); + break; + } + default: + { + break; + } + } + if (dateTime) { + appendFormattedTime(path, ix, options.savePathTemplate, dateTime); + } + } } } else { - path = path + options.savePathTemplate[ix]; + path += options.savePathTemplate[ix]; } ix++; @@ -1021,3 +1152,8 @@ void BatchQueue::redrawNeeded (LWButton* button) GThreadLock lock; queue_draw (); } + +void BatchQueue::selectionChanged() +{ + updateDestinationPathPreview(); +} diff --git a/rtgui/batchqueue.h b/rtgui/batchqueue.h index 5cde37748..f8f1cf255 100644 --- a/rtgui/batchqueue.h +++ b/rtgui/batchqueue.h @@ -38,6 +38,7 @@ public: virtual ~BatchQueueListener() = default; virtual void queueSizeChanged(int qsize, bool queueRunning, bool queueError, const Glib::ustring& queueErrorMessage) = 0; virtual bool canStartNext() = 0; + virtual void setDestinationPreviewText(const Glib::ustring& destinationPath) = 0; }; class FileCatalog; @@ -59,6 +60,7 @@ public: void selectAll (); void openItemInEditor(ThumbBrowserEntryBase* item); void openLastSelectedItemInEditor(); + void updateDestinationPathPreview(); void startProcessing (); @@ -79,6 +81,7 @@ public: bool keyPressed (GdkEventKey* event) override; void buttonPressed (LWButton* button, int actionCode, void* actionData) override; void redrawNeeded (LWButton* button) override; + void selectionChanged () override; void setBatchQueueListener (BatchQueueListener* l) { diff --git a/rtgui/batchqueuebuttonset.cc b/rtgui/batchqueuebuttonset.cc index 969a55079..1f4de2286 100644 --- a/rtgui/batchqueuebuttonset.cc +++ b/rtgui/batchqueuebuttonset.cc @@ -25,9 +25,9 @@ bool BatchQueueButtonSet::iconsLoaded = false; -Cairo::RefPtr BatchQueueButtonSet::cancelIcon; -Cairo::RefPtr BatchQueueButtonSet::headIcon; -Cairo::RefPtr BatchQueueButtonSet::tailIcon; +std::shared_ptr BatchQueueButtonSet::cancelIcon; +std::shared_ptr BatchQueueButtonSet::headIcon; +std::shared_ptr BatchQueueButtonSet::tailIcon; Glib::ustring BatchQueueButtonSet::moveHeadToolTip; Glib::ustring BatchQueueButtonSet::moveEndToolTip; @@ -37,9 +37,9 @@ BatchQueueButtonSet::BatchQueueButtonSet (BatchQueueEntry* myEntry) { if (!iconsLoaded) { - cancelIcon = Cairo::RefPtr(new RTSurface("cancel-small.png")); - headIcon = Cairo::RefPtr(new RTSurface("goto-start-small.png")); - tailIcon = Cairo::RefPtr(new RTSurface("goto-end-small.png")); + cancelIcon = std::shared_ptr(new RTSurface("cancel-small", Gtk::ICON_SIZE_BUTTON)); + headIcon = std::shared_ptr(new RTSurface("goto-start-small", Gtk::ICON_SIZE_BUTTON)); + tailIcon = std::shared_ptr(new RTSurface("goto-end-small", Gtk::ICON_SIZE_BUTTON)); moveHeadToolTip = M("FILEBROWSER_POPUPMOVEHEAD"); moveEndToolTip = M("FILEBROWSER_POPUPMOVEEND"); cancelJobToolTip = M("FILEBROWSER_POPUPCANCELJOB"); diff --git a/rtgui/batchqueuebuttonset.h b/rtgui/batchqueuebuttonset.h index fb45df518..2ff96c914 100644 --- a/rtgui/batchqueuebuttonset.h +++ b/rtgui/batchqueuebuttonset.h @@ -31,9 +31,9 @@ class BatchQueueButtonSet : public LWButtonSet static bool iconsLoaded; public: - static Cairo::RefPtr cancelIcon; - static Cairo::RefPtr headIcon; - static Cairo::RefPtr tailIcon; + static std::shared_ptr cancelIcon; + static std::shared_ptr headIcon; + static std::shared_ptr tailIcon; static Glib::ustring moveHeadToolTip; static Glib::ustring moveEndToolTip; diff --git a/rtgui/batchqueueentry.cc b/rtgui/batchqueueentry.cc index 8974cad59..0948a311f 100644 --- a/rtgui/batchqueueentry.cc +++ b/rtgui/batchqueueentry.cc @@ -22,16 +22,17 @@ #include "guiutils.h" #include "threadutils.h" -#include "rtimage.h" +#include "rtsurface.h" #include "multilangmgr.h" #include "thumbbrowserbase.h" #include "thumbnail.h" +#include "rtsurface.h" #include "../rtengine/procparams.h" #include "../rtengine/rtengine.h" bool BatchQueueEntry::iconsLoaded(false); -Glib::RefPtr BatchQueueEntry::savedAsIcon; +std::shared_ptr BatchQueueEntry::savedAsIcon(std::shared_ptr(nullptr)); BatchQueueEntry::BatchQueueEntry (rtengine::ProcessingJob* pjob, const rtengine::procparams::ProcParams& pparams, Glib::ustring fname, int prevw, int prevh, Thumbnail* thm, bool overwrite) : ThumbBrowserEntryBase(fname, thm), @@ -59,7 +60,7 @@ BatchQueueEntry::BatchQueueEntry (rtengine::ProcessingJob* pjob, const rtengine: #endif if (!iconsLoaded) { - savedAsIcon = RTImage::createPixbufFromFile ("save-small.png"); + savedAsIcon = std::shared_ptr(new RTSurface("save-small", Gtk::ICON_SIZE_SMALL_TOOLBAR)); iconsLoaded = true; } @@ -153,10 +154,10 @@ void BatchQueueEntry::removeButtonSet () buttonSet = nullptr; } -std::vector> BatchQueueEntry::getIconsOnImageArea () +std::vector> BatchQueueEntry::getIconsOnImageArea () { - std::vector > ret; + std::vector> ret; if (!outFileName.empty()) { ret.push_back (savedAsIcon); @@ -168,8 +169,8 @@ std::vector> BatchQueueEntry::getIconsOnImageArea () void BatchQueueEntry::getIconSize (int& w, int& h) const { - w = savedAsIcon->get_width (); - h = savedAsIcon->get_height (); + w = savedAsIcon->getWidth (); + h = savedAsIcon->getHeight (); } diff --git a/rtgui/batchqueueentry.h b/rtgui/batchqueueentry.h index f06b65046..5d17939fb 100644 --- a/rtgui/batchqueueentry.h +++ b/rtgui/batchqueueentry.h @@ -29,6 +29,7 @@ #include "../rtengine/noncopyable.h" class Thumbnail; +class RTSurface; namespace rtengine { @@ -61,7 +62,7 @@ class BatchQueueEntry final : public ThumbBrowserEntryBase, public BQEntryUpdate public: - static Glib::RefPtr savedAsIcon; + static std::shared_ptr savedAsIcon; rtengine::ProcessingJob* job; const std::unique_ptr params; @@ -84,7 +85,7 @@ public: void removeButtonSet (); - std::vector> getIconsOnImageArea () override; + std::vector> getIconsOnImageArea () override; void getIconSize (int& w, int& h) const override; std::tuple getToolTip (int x, int y) const override; diff --git a/rtgui/batchqueuepanel.cc b/rtgui/batchqueuepanel.cc index 8a6dd25b4..b477790fc 100644 --- a/rtgui/batchqueuepanel.cc +++ b/rtgui/batchqueuepanel.cc @@ -73,7 +73,10 @@ BatchQueuePanel::BatchQueuePanel (FileCatalog* aFileCatalog) : parent(nullptr) hb2->pack_start (*useTemplate, Gtk::PACK_SHRINK, 4); outdirTemplate = Gtk::manage (new Gtk::Entry ()); hb2->pack_start (*outdirTemplate); - odvb->pack_start (*hb2, Gtk::PACK_SHRINK, 4); + templateHelpButton = Gtk::manage (new Gtk::ToggleButton("?")); + templateHelpButton->set_tooltip_markup (M ("QUEUE_LOCATION_TEMPLATE_HELP_BUTTON_TOOLTIP")); + hb2->pack_start (*templateHelpButton, Gtk::PACK_SHRINK, 0); + odvb->pack_start (*hb2, Gtk::PACK_SHRINK, 0); outdirTemplate->set_tooltip_markup (M("QUEUE_LOCATION_TEMPLATE_TOOLTIP")); useTemplate->set_tooltip_markup (M("QUEUE_LOCATION_TEMPLATE_TOOLTIP")); Gtk::Box* hb3 = Gtk::manage (new Gtk::Box ()); @@ -89,7 +92,7 @@ BatchQueuePanel::BatchQueuePanel (FileCatalog* aFileCatalog) : parent(nullptr) hb3->pack_start (*outdirFolderButton); outdirFolderButton->signal_pressed().connect( sigc::mem_fun(*this, &BatchQueuePanel::pathFolderButtonPressed) ); outdirFolderButton->set_label(makeFolderLabel(options.savePathFolder)); - Gtk::Image* folderImg = Gtk::manage (new RTImage ("folder-closed.png")); + Gtk::Image* folderImg = Gtk::manage (new RTImage ("folder-closed", Gtk::ICON_SIZE_LARGE_TOOLBAR)); folderImg->show (); outdirFolderButton->set_image (*folderImg); outdirFolder = nullptr; @@ -108,6 +111,14 @@ BatchQueuePanel::BatchQueuePanel (FileCatalog* aFileCatalog) : parent(nullptr) #endif odvb->pack_start (*hb3, Gtk::PACK_SHRINK, 4); + destinationPreviewLabel = Gtk::manage (new Gtk::Label ()); + destinationPreviewLabel->set_tooltip_markup (M("QUEUE_DESTPREVIEW_TOOLTIP")); + destinationPreviewLabel->set_selectable (true); // so users can copy the path to the clipboard + destinationPreviewLabel->set_halign (Gtk::ALIGN_START); + auto destinationPreviewScrolledWindow = Gtk::manage(new Gtk::ScrolledWindow ()); + destinationPreviewScrolledWindow->set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); + destinationPreviewScrolledWindow->add (*destinationPreviewLabel); + odvb->pack_start (*destinationPreviewScrolledWindow, Gtk::PACK_SHRINK); Gtk::RadioButton::Group g = useTemplate->get_group(); useFolder->set_group (g); fdir->add (*odvb); @@ -122,11 +133,13 @@ BatchQueuePanel::BatchQueuePanel (FileCatalog* aFileCatalog) : parent(nullptr) outdirTemplate->set_text (options.savePathTemplate); useTemplate->set_active (options.saveUsePathTemplate); useFolder->set_active (!options.saveUsePathTemplate); + destinationPreviewLabel->set_text (M("QUEUE_DESTPREVIEW_TITLE")); // setup signal handlers outdirTemplate->signal_changed().connect (sigc::mem_fun(*this, &BatchQueuePanel::saveOptions)); useTemplate->signal_toggled().connect (sigc::mem_fun(*this, &BatchQueuePanel::saveOptions)); useFolder->signal_toggled().connect (sigc::mem_fun(*this, &BatchQueuePanel::saveOptions)); + templateHelpButton->signal_toggled().connect (sigc::mem_fun(*this, &BatchQueuePanel::templateHelpButtonToggled)); saveFormatPanel->setListener (this); // setup button bar @@ -138,8 +151,19 @@ BatchQueuePanel::BatchQueuePanel (FileCatalog* aFileCatalog) : parent(nullptr) topBox->pack_start (*fdir, Gtk::PACK_EXPAND_WIDGET, 4); topBox->pack_start (*fformat, Gtk::PACK_EXPAND_WIDGET, 4); + middleSplitPane = Gtk::manage (new Gtk::Paned(Gtk::ORIENTATION_HORIZONTAL)); + templateHelpTextView = Gtk::manage (new Gtk::TextView()); + templateHelpTextView->set_editable(false); + templateHelpTextView->set_wrap_mode(Gtk::WRAP_WORD); + scrolledTemplateHelpWindow = Gtk::manage(new Gtk::ScrolledWindow()); + scrolledTemplateHelpWindow->add(*templateHelpTextView); + middleSplitPane->pack1 (*scrolledTemplateHelpWindow); + middleSplitPane->pack2 (*batchQueue); + scrolledTemplateHelpWindow->set_visible(false); // initially hidden, templateHelpButton shows it + scrolledTemplateHelpWindow->set_no_show_all(true); + // add middle browser area - pack_start (*batchQueue); + pack_start (*middleSplitPane); // lower box with thumbnail zoom bottomBox = Gtk::manage (new Gtk::Box ()); @@ -152,13 +176,13 @@ BatchQueuePanel::BatchQueuePanel (FileCatalog* aFileCatalog) : parent(nullptr) zoomLabel->set_use_markup (true); zoomBox->pack_start (*zoomLabel, Gtk::PACK_SHRINK, 4); zoomInButton = Gtk::manage (new Gtk::Button ()); - zoomInButton->set_image (*Gtk::manage (new RTImage ("magnifier-plus.png"))); + zoomInButton->set_image (*Gtk::manage (new RTImage ("magnifier-plus", Gtk::ICON_SIZE_LARGE_TOOLBAR))); zoomInButton->signal_pressed().connect (sigc::mem_fun(*batchQueue, &BatchQueue::zoomIn)); zoomInButton->set_relief (Gtk::RELIEF_NONE); zoomInButton->set_tooltip_markup (M("FILEBROWSER_ZOOMINHINT")); zoomBox->pack_end (*zoomInButton, Gtk::PACK_SHRINK); zoomOutButton = Gtk::manage (new Gtk::Button ()); - zoomOutButton->set_image (*Gtk::manage (new RTImage ("magnifier-minus.png"))); + zoomOutButton->set_image (*Gtk::manage (new RTImage ("magnifier-minus", Gtk::ICON_SIZE_LARGE_TOOLBAR))); zoomOutButton->signal_pressed().connect (sigc::mem_fun(*batchQueue, &BatchQueue::zoomOut)); zoomOutButton->set_relief (Gtk::RELIEF_NONE); zoomOutButton->set_tooltip_markup (M("FILEBROWSER_ZOOMOUTHINT")); @@ -208,13 +232,13 @@ void BatchQueuePanel::updateTab (int qsize, int forceOrientation) Gtk::Label* l; if(!qsize ) { - grid->attach_next_to(*Gtk::manage (new RTImage ("gears.png")), Gtk::POS_TOP, 1, 1); + grid->attach_next_to(*Gtk::manage (new RTImage ("gears", Gtk::ICON_SIZE_LARGE_TOOLBAR)), Gtk::POS_TOP, 1, 1); l = Gtk::manage (new Gtk::Label (Glib::ustring(" ") + M("MAIN_FRAME_QUEUE")) ); } else if (qStartStop->get_active()) { - grid->attach_next_to(*Gtk::manage (new RTImage ("gears-play.png")), Gtk::POS_TOP, 1, 1); + grid->attach_next_to(*Gtk::manage (new RTImage ("gears-play", Gtk::ICON_SIZE_LARGE_TOOLBAR)), Gtk::POS_TOP, 1, 1); l = Gtk::manage (new Gtk::Label (Glib::ustring(" ") + M("MAIN_FRAME_QUEUE") + " [" + Glib::ustring::format( qsize ) + "]")); } else { - grid->attach_next_to(*Gtk::manage (new RTImage ("gears-pause.png")), Gtk::POS_TOP, 1, 1); + grid->attach_next_to(*Gtk::manage (new RTImage ("gears-pause", Gtk::ICON_SIZE_LARGE_TOOLBAR)), Gtk::POS_TOP, 1, 1); l = Gtk::manage (new Gtk::Label (Glib::ustring(" ") + M("MAIN_FRAME_QUEUE") + " [" + Glib::ustring::format( qsize ) + "]" )); } @@ -228,13 +252,13 @@ void BatchQueuePanel::updateTab (int qsize, int forceOrientation) } } else { if (!qsize ) { - grid->attach_next_to(*Gtk::manage (new RTImage ("gears.png")), Gtk::POS_RIGHT, 1, 1); + grid->attach_next_to(*Gtk::manage (new RTImage ("gears", Gtk::ICON_SIZE_LARGE_TOOLBAR)), Gtk::POS_RIGHT, 1, 1); grid->attach_next_to(*Gtk::manage (new Gtk::Label (M("MAIN_FRAME_QUEUE") )), Gtk::POS_RIGHT, 1, 1); } else if (qStartStop->get_active()) { - grid->attach_next_to(*Gtk::manage (new RTImage ("gears-play.png")), Gtk::POS_RIGHT, 1, 1); + grid->attach_next_to(*Gtk::manage (new RTImage ("gears-play", Gtk::ICON_SIZE_LARGE_TOOLBAR)), Gtk::POS_RIGHT, 1, 1); grid->attach_next_to(*Gtk::manage (new Gtk::Label (M("MAIN_FRAME_QUEUE") + " [" + Glib::ustring::format( qsize ) + "]" )), Gtk::POS_RIGHT, 1, 1); } else { - grid->attach_next_to(*Gtk::manage (new RTImage ("gears-pause.png")), Gtk::POS_RIGHT, 1, 1); + grid->attach_next_to(*Gtk::manage (new RTImage ("gears-pause", Gtk::ICON_SIZE_LARGE_TOOLBAR)), Gtk::POS_RIGHT, 1, 1); grid->attach_next_to(*Gtk::manage (new Gtk::Label (M("MAIN_FRAME_QUEUE") + " [" + Glib::ustring::format( qsize ) + "]" )), Gtk::POS_RIGHT, 1, 1); } @@ -313,6 +337,122 @@ void BatchQueuePanel::setGuiFromBatchState(bool queueRunning, int qsize) updateTab(qsize); } +void BatchQueuePanel::templateHelpButtonToggled() +{ + bool visible = templateHelpButton->get_active(); + auto buffer = templateHelpTextView->get_buffer(); + if (buffer->get_text().empty()) { + // Populate the help text the first time it's shown + populateTemplateHelpBuffer(buffer); + const auto fullWidth = middleSplitPane->get_width(); + middleSplitPane->set_position(fullWidth / 2); + } + scrolledTemplateHelpWindow->set_visible(visible); + templateHelpTextView->set_visible(visible); +} + +void BatchQueuePanel::populateTemplateHelpBuffer(Glib::RefPtr buffer) +{ + auto pos = buffer->begin(); + const auto insertTopicHeading = [&pos, buffer](const Glib::ustring& text) { + pos = buffer->insert_markup(pos, Glib::ustring::format("\n\n", text, "\n")); + }; + const auto insertTopicBody = [&pos, buffer](const Glib::ustring& text) { + pos = buffer->insert_markup(pos, Glib::ustring::format("\n", text, "\n")); + }; + const auto mainTitle = M("QUEUE_LOCATION_TEMPLATE_HELP_TITLE"); + pos = buffer->insert_markup(pos, Glib::ustring::format("", mainTitle, "\n")); + pos = buffer->insert_markup(pos, M("QUEUE_LOCATION_TEMPLATE_HELP_INTRO")); + + insertTopicHeading(M("QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_TITLE")); + pos = buffer->insert_markup(pos, M("QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_BODY")); + + insertTopicHeading(M("QUEUE_LOCATION_TEMPLATE_HELP_PATHS_TITLE")); + pos = buffer->insert_markup(pos, M("QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO")); + pos = buffer->insert(pos, "\n"); +#ifdef _WIN32 + pos = buffer->insert_markup(pos, M("QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO_WINDOWS")); + pos = buffer->insert(pos, "\n"); +#endif + pos = buffer->insert(pos, "\n"); + pos = buffer->insert_markup(pos, M("QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_1")); +#ifdef _WIN32 + const auto exampleFilePath = M("QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_WINDOWS"); +#else + const auto exampleFilePath = M("QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_LINUX"); +#endif + pos = buffer->insert_markup(pos, Glib::ustring::format("\n ", exampleFilePath, "\n")); + pos = buffer->insert_markup(pos, M("QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_2")); + // Examples are generated from exampleFilePath using the actual template processing function + const Options savedOptions = options; // to be restored after generating example results + options.saveUsePathTemplate = true; + // Since this code only ever runs once (the first time the help text is presented), no attempt is + // made to be efficient. Use a brute-force method to discover the number of elements in exampleFilePath. + int pathElementCount = 0; + for (int n=9; n>=0; n--) { + options.savePathTemplate = Glib::ustring::format("%d", n); + const auto result = BatchQueue::calcAutoFileNameBase(exampleFilePath); + if (!result.empty()) { + // The 'd' specifier returns an empty string if N exceeds the number of path elements, so + // the largest N that does not return an empty string is the number of elements in exampleFilePath. + pathElementCount = n; + break; + } + } + // Function inserts examples for a particular specifier, with every valid N value for the + // number of elements in the path. + const auto insertPathExamples = [&buffer, &pos, pathElementCount, exampleFilePath](char letter, int offset1, int mult1, int offset2, int mult2) + { + for (int n=0; ninsert_markup(pos, Glib::ustring::format("\n ", path1, " = ", path2, " = ", result1, "")); + if (result1 != result2) { + // If this error appears, it indicates a coding error in either BatchQueue::calcAutoFileNameBase + // or BatchQueuePanel::populateTemplateHelpBuffer. + pos = buffer->insert_markup(pos, Glib::ustring::format(" ", M("QUEUE_LOCATION_TEMPLATE_HELP_RESULT_MISMATCH"), " ", result2)); + } + } + }; + // Example outputs in comments below are for a 4-element path. + insertPathExamples('d', pathElementCount, -1, -1, -1); // %d4 = %d-1 = home + insertPathExamples('p', 1, 1, -pathElementCount, 1); // %p1 = %p-4 = /home/tom/photos/2010-10-31/ + insertPathExamples('P', 1, 1, -pathElementCount, 1); // %P1 = %P-4 = 2010-10-31/ + { + const Glib::ustring fspecifier("%f"); + options.savePathTemplate = fspecifier; + const auto result = BatchQueue::calcAutoFileNameBase(exampleFilePath); + pos = buffer->insert_markup(pos, Glib::ustring::format("\n ", fspecifier, " = ", result, "")); + } + + insertTopicHeading(M("QUEUE_LOCATION_TEMPLATE_HELP_RANK_TITLE")); + pos = buffer->insert_markup(pos, M("QUEUE_LOCATION_TEMPLATE_HELP_RANK_BODY")); + + insertTopicHeading(M("QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_TITLE")); + pos = buffer->insert_markup(pos, M("QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_BODY")); + + insertTopicHeading(M("QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_TITLE")); + pos = buffer->insert_markup(pos, M("QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_BODY")); + const Glib::ustring dateTimeFormatExamples[] = { + "%Y-%m-%d", + "%Y%m%d_%H%M%S", + "%y/%b/%-d/" + }; + const auto timezone = Glib::DateTime::create_now_local().get_timezone(); + const auto timeForExamples = Glib::DateTime::create_from_iso8601("2001-02-03T04:05:06.123456", timezone); + for (auto && fmt : dateTimeFormatExamples) { + const auto result = timeForExamples.format(fmt); + pos = buffer->insert_markup(pos, Glib::ustring::format("\n %tE\"", fmt, "\" = ", result, "")); + } + + pos = buffer->insert(pos, "\n"); + options = savedOptions; // Do not add any lines in this function below here +} + void BatchQueuePanel::addBatchQueueJobs(const std::vector& entries, bool head) { batchQueue->addEntries(entries, head); @@ -329,6 +469,7 @@ void BatchQueuePanel::saveOptions () options.savePathTemplate = outdirTemplate->get_text(); options.saveUsePathTemplate = useTemplate->get_active(); options.procQueueEnabled = qAutoStart->get_active(); + batchQueue->updateDestinationPathPreview(); } bool BatchQueuePanel::handleShortcutKey (GdkEventKey* event) @@ -358,6 +499,11 @@ bool BatchQueuePanel::canStartNext () return queueShouldRun; } +void BatchQueuePanel::setDestinationPreviewText(const Glib::ustring &destinationPath) +{ + destinationPreviewLabel->set_text(destinationPath); +} + void BatchQueuePanel::pathFolderButtonPressed () { @@ -381,9 +527,11 @@ void BatchQueuePanel::pathFolderButtonPressed () void BatchQueuePanel::pathFolderChanged () { options.savePathFolder = outdirFolder->get_filename(); + batchQueue->updateDestinationPathPreview(); } void BatchQueuePanel::formatChanged(const Glib::ustring& format) { options.saveFormatBatch = saveFormatPanel->getFormat(); + batchQueue->updateDestinationPathPreview(); } diff --git a/rtgui/batchqueuepanel.h b/rtgui/batchqueuepanel.h index db4e243e9..417d8a4cb 100644 --- a/rtgui/batchqueuepanel.h +++ b/rtgui/batchqueuepanel.h @@ -42,6 +42,7 @@ class BatchQueuePanel : public Gtk::Box, Gtk::CheckButton* qAutoStart; Gtk::Entry* outdirTemplate; + Gtk::Label* destinationPreviewLabel; MyFileChooserButton* outdirFolder; Gtk::Button* outdirFolderButton; Gtk::RadioButton* useTemplate; @@ -51,8 +52,12 @@ class BatchQueuePanel : public Gtk::Box, RTWindow* parent; BatchQueue* batchQueue; + Gtk::TextView* templateHelpTextView; + Gtk::ScrolledWindow* scrolledTemplateHelpWindow; + Gtk::ToggleButton* templateHelpButton; Gtk::Box* bottomBox; Gtk::Box* topBox; + Gtk::Paned* middleSplitPane; std::atomic queueShouldRun; @@ -72,12 +77,15 @@ public: // batchqueuelistener interface void queueSizeChanged(int qsize, bool queueRunning, bool queueError, const Glib::ustring& queueErrorMessage) override; bool canStartNext() override; + void setDestinationPreviewText(const Glib::ustring& destinationPath) override; private: void startBatchProc (); void stopBatchProc (); void startOrStopBatchProc(); void setGuiFromBatchState(bool queueRunning, int qsize); + void templateHelpButtonToggled(); + void populateTemplateHelpBuffer(Glib::RefPtr buffer); void pathFolderChanged (); void pathFolderButtonPressed (); diff --git a/rtgui/blackwhite.cc b/rtgui/blackwhite.cc index 6e618ea3b..2d3c35a54 100644 --- a/rtgui/blackwhite.cc +++ b/rtgui/blackwhite.cc @@ -189,18 +189,18 @@ BlackWhite::BlackWhite (): FoldableToolPanel(this, TOOL_NAME, M("TP_BWMIX_LABEL" //----------- RGB / ROYGCBPM Mixer ------------------------------ - imgIcon[0] = Gtk::manage (new RTImage ("circle-red-small.png")); - imgIcon[1] = Gtk::manage (new RTImage ("circle-orange-small.png")); - imgIcon[2] = Gtk::manage (new RTImage ("circle-yellow-small.png")); - imgIcon[3] = Gtk::manage (new RTImage ("circle-green-small.png")); - imgIcon[4] = Gtk::manage (new RTImage ("circle-cyan-small.png")); - imgIcon[5] = Gtk::manage (new RTImage ("circle-blue-small.png")); - imgIcon[6] = Gtk::manage (new RTImage ("circle-purple-small.png")); - imgIcon[7] = Gtk::manage (new RTImage ("circle-magenta-small.png")); + imgIcon[0] = Gtk::manage (new RTImage ("circle-red-small")); + imgIcon[1] = Gtk::manage (new RTImage ("circle-orange-small")); + imgIcon[2] = Gtk::manage (new RTImage ("circle-yellow-small")); + imgIcon[3] = Gtk::manage (new RTImage ("circle-green-small")); + imgIcon[4] = Gtk::manage (new RTImage ("circle-cyan-small")); + imgIcon[5] = Gtk::manage (new RTImage ("circle-blue-small")); + imgIcon[6] = Gtk::manage (new RTImage ("circle-purple-small")); + imgIcon[7] = Gtk::manage (new RTImage ("circle-magenta-small")); - imgIcon[8] = Gtk::manage (new RTImage ("circle-empty-red-small.png")); - imgIcon[9] = Gtk::manage (new RTImage ("circle-empty-green-small.png")); - imgIcon[10] = Gtk::manage (new RTImage ("circle-empty-blue-small.png")); + imgIcon[8] = Gtk::manage (new RTImage ("circle-empty-red-small")); + imgIcon[9] = Gtk::manage (new RTImage ("circle-empty-green-small")); + imgIcon[10] = Gtk::manage (new RTImage ("circle-empty-blue-small")); mixerVBox->pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL))); diff --git a/rtgui/cacheimagedata.cc b/rtgui/cacheimagedata.cc index bfc4e920a..fa71d5d44 100644 --- a/rtgui/cacheimagedata.cc +++ b/rtgui/cacheimagedata.cc @@ -20,6 +20,7 @@ #include #include #include +#include #include "version.h" #include @@ -58,6 +59,7 @@ CacheImageData::CacheImageData() : iso(0), rating(0), isHDR (false), + isDNG (false), isPixelShift (false), sensortype(rtengine::ST_NONE), sampleFormat(rtengine::IIOSF_UNKNOWN), @@ -193,6 +195,10 @@ int CacheImageData::load (const Glib::ustring& fname) isHDR = keyFile.get_boolean ("ExifInfo", "IsHDR"); } + if (keyFile.has_key ("ExifInfo", "IsDNG")) { + isDNG = keyFile.get_boolean ("ExifInfo", "IsDNG"); + } + if (keyFile.has_key ("ExifInfo", "IsPixelShift")) { isPixelShift = keyFile.get_boolean ("ExifInfo", "IsPixelShift"); } @@ -273,7 +279,9 @@ int CacheImageData::save (const Glib::ustring& fname) Glib::KeyFile keyFile; try { - keyFile.load_from_file (fname); + if (Glib::file_test(fname, Glib::FILE_TEST_EXISTS)) { + keyFile.load_from_file (fname); + } } catch (Glib::Error&) {} keyFile.set_string ("General", "MD5", md5); @@ -313,6 +321,7 @@ int CacheImageData::save (const Glib::ustring& fname) keyFile.set_double ("ExifInfo", "FocusDist", focusDist); keyFile.set_integer ("ExifInfo", "ISO", iso); keyFile.set_boolean ("ExifInfo", "IsHDR", isHDR); + keyFile.set_boolean ("ExifInfo", "IsDNG", isDNG); keyFile.set_boolean ("ExifInfo", "IsPixelShift", isPixelShift); keyFile.set_string ("ExifInfo", "ExpComp", expcomp); } @@ -362,3 +371,17 @@ int CacheImageData::save (const Glib::ustring& fname) } } +std::uint32_t CacheImageData::getFixBadPixelsConstant() const +{ + return 0; +} + +bool CacheImageData::hasFixBadPixelsConstant() const +{ + return false; +} + +std::vector CacheImageData::getGainMaps() const +{ + return std::vector(); +} diff --git a/rtgui/cacheimagedata.h b/rtgui/cacheimagedata.h index 8c0fa6513..bb37acf2f 100644 --- a/rtgui/cacheimagedata.h +++ b/rtgui/cacheimagedata.h @@ -22,6 +22,7 @@ #include "options.h" +#include "../rtengine/dnggainmap.h" #include "../rtengine/imageformat.h" #include "../rtengine/rtengine.h" @@ -60,6 +61,7 @@ public: unsigned iso; int rating; bool isHDR; + bool isDNG; bool isPixelShift; int sensortype; rtengine::IIO_Sample_Format sampleFormat; @@ -114,8 +116,12 @@ public: int getRating () const override { return rating; } // FIXME-piotr : missing rating bool getPixelShift () const override { return isPixelShift; } bool getHDR() const override { return isHDR; } + bool getDNG() const override { return isDNG; } std::string getImageType() const override { return isPixelShift ? "PS" : isHDR ? "HDR" : "STD"; } rtengine::IIOSampleFormat getSampleFormat() const override { return sampleFormat; } + std::uint32_t getFixBadPixelsConstant() const override; + bool hasFixBadPixelsConstant() const override; + std::vector getGainMaps() const override; void getDimensions(int &w, int &h) const override { w = width; diff --git a/rtgui/cacorrection.cc b/rtgui/cacorrection.cc index 52ed782df..b61c6e9e1 100644 --- a/rtgui/cacorrection.cc +++ b/rtgui/cacorrection.cc @@ -32,10 +32,10 @@ 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")); - Gtk::Image* icaredR = Gtk::manage (new RTImage ("circle-cyan-red-small.png")); - Gtk::Image* icablueL = Gtk::manage (new RTImage ("circle-blue-yellow-small.png")); - Gtk::Image* icablueR = Gtk::manage (new RTImage ("circle-yellow-blue-small.png")); + Gtk::Image* icaredL = Gtk::manage (new RTImage ("circle-red-cyan-small")); + Gtk::Image* icaredR = Gtk::manage (new RTImage ("circle-cyan-red-small")); + Gtk::Image* icablueL = Gtk::manage (new RTImage ("circle-blue-yellow-small")); + Gtk::Image* icablueR = Gtk::manage (new RTImage ("circle-yellow-blue-small")); red = Gtk::manage (new Adjuster (M("TP_CACORRECTION_RED"), -0.005, 0.005, 0.0001, 0, icaredL, icaredR)); red->setAdjusterListener (this); diff --git a/rtgui/chmixer.cc b/rtgui/chmixer.cc index e54ddfc5d..7cd924dd5 100644 --- a/rtgui/chmixer.cc +++ b/rtgui/chmixer.cc @@ -30,15 +30,15 @@ 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")); - imgIcon[1] = Gtk::manage (new RTImage ("circle-green-red-small.png")); - imgIcon[2] = Gtk::manage (new RTImage ("circle-blue-red-small.png")); - imgIcon[3] = Gtk::manage (new RTImage ("circle-red-green-small.png")); - imgIcon[4] = Gtk::manage (new RTImage ("circle-green-small.png")); - imgIcon[5] = Gtk::manage (new RTImage ("circle-blue-green-small.png")); - imgIcon[6] = Gtk::manage (new RTImage ("circle-red-blue-small.png")); - imgIcon[7] = Gtk::manage (new RTImage ("circle-green-blue-small.png")); - imgIcon[8] = Gtk::manage (new RTImage ("circle-blue-small.png")); + imgIcon[0] = Gtk::manage (new RTImage ("circle-red-small")); + imgIcon[1] = Gtk::manage (new RTImage ("circle-green-red-small")); + imgIcon[2] = Gtk::manage (new RTImage ("circle-blue-red-small")); + imgIcon[3] = Gtk::manage (new RTImage ("circle-red-green-small")); + imgIcon[4] = Gtk::manage (new RTImage ("circle-green-small")); + imgIcon[5] = Gtk::manage (new RTImage ("circle-blue-green-small")); + imgIcon[6] = Gtk::manage (new RTImage ("circle-red-blue-small")); + imgIcon[7] = Gtk::manage (new RTImage ("circle-green-blue-small")); + imgIcon[8] = Gtk::manage (new RTImage ("circle-blue-small")); Gtk::Label* rlabel = Gtk::manage (new Gtk::Label ()); rlabel->set_markup (Glib::ustring("\t") + M("TP_CHMIXER_RED") + Glib::ustring(":")); @@ -110,7 +110,7 @@ void ChMixer::read (const ProcParams* pp, const ParamsEdited* pedited) disableListener (); setEnabled(pp->chmixer.enabled); - + if (pedited) { for (int i = 0; i < 3; i++) { red[i]->setEditedState (pedited->chmixer.red[i] ? Edited : UnEdited); diff --git a/rtgui/coarsepanel.cc b/rtgui/coarsepanel.cc index c64d53017..48f8041df 100644 --- a/rtgui/coarsepanel.cc +++ b/rtgui/coarsepanel.cc @@ -31,25 +31,25 @@ CoarsePanel::CoarsePanel () : ToolPanel (), oldhflip(false), oldvflip(false) degree = 0; degreechanged = true; - Gtk::Image* rotateli = Gtk::manage (new RTImage ("rotate-left-90.png")); + Gtk::Image* rotateli = Gtk::manage (new RTImage ("rotate-left-90", Gtk::ICON_SIZE_LARGE_TOOLBAR)); rotate_left = Gtk::manage (new Gtk::Button ()); rotate_left->add (*rotateli); rotate_left->set_relief(Gtk::RELIEF_NONE); pack_start (*rotate_left); - Gtk::Image* rotateri = Gtk::manage (new RTImage ("rotate-right-90.png")); + Gtk::Image* rotateri = Gtk::manage (new RTImage ("rotate-right-90", Gtk::ICON_SIZE_LARGE_TOOLBAR)); rotate_right = Gtk::manage (new Gtk::Button ()); rotate_right->add (*rotateri); rotate_right->set_relief(Gtk::RELIEF_NONE); pack_start (*rotate_right); - Gtk::Image* fliphi = Gtk::manage (new RTImage ("flip-horizontal.png")); + Gtk::Image* fliphi = Gtk::manage (new RTImage ("flip-horizontal", Gtk::ICON_SIZE_LARGE_TOOLBAR)); hflip = Gtk::manage (new Gtk::ToggleButton ()); hflip->add (*fliphi); hflip->set_relief(Gtk::RELIEF_NONE); pack_start (*hflip); - Gtk::Image* flipvi = Gtk::manage (new RTImage ("flip-vertical.png")); + Gtk::Image* flipvi = Gtk::manage (new RTImage ("flip-vertical", Gtk::ICON_SIZE_LARGE_TOOLBAR)); vflip = Gtk::manage (new Gtk::ToggleButton ()); vflip->add (*flipvi); vflip->set_relief(Gtk::RELIEF_NONE); diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index 41f6952a7..d18cddcad 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -235,7 +235,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, TOOL_NAME, M ("TP 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")); @@ -246,7 +246,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, TOOL_NAME, M ("TP 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")); @@ -269,7 +269,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, TOOL_NAME, M ("TP 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); @@ -321,7 +321,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, TOOL_NAME, M ("TP 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") + ":")); @@ -355,10 +355,10 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, TOOL_NAME, M ("TP 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")); - Gtk::Image* igreenR = Gtk::manage (new RTImage ("circle-green-small.png")); + Gtk::Image* itempL = Gtk::manage (new RTImage ("circle-blue-small")); + Gtk::Image* itempR = Gtk::manage (new RTImage ("circle-yellow-small")); + Gtk::Image* igreenL = Gtk::manage (new RTImage ("circle-magenta-small")); + Gtk::Image* igreenR = Gtk::manage (new RTImage ("circle-green-small")); tempsc = Gtk::manage (new Adjuster (M ("TP_WBALANCE_TEMPERATURE"), MINTEMP0, MAXTEMP0, 5, CENTERTEMP0, itempL, itempR, &wbSlider2Temp, &wbTemp2Slider)); @@ -646,10 +646,10 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, TOOL_NAME, M ("TP 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")); + Gtk::Image* itempL1 = Gtk::manage (new RTImage ("circle-blue-small")); + Gtk::Image* itempR1 = Gtk::manage (new RTImage ("circle-yellow-small")); + Gtk::Image* igreenL1 = Gtk::manage (new RTImage ("circle-magenta-small")); + Gtk::Image* igreenR1 = Gtk::manage (new RTImage ("circle-green-small")); adaplum = Gtk::manage (new Adjuster (M ("TP_COLORAPP_ABSOLUTELUMINANCE"), MINLA0, MAXLA0, 0.01, 16.));//, NULL, NULL, &wbSlider2la, &wbla2Slider)); adaplum->setLogScale(500, 0); @@ -659,8 +659,8 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, TOOL_NAME, M ("TP 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")); +// Gtk::Image* iblueredL = Gtk::manage (new RTImage ("circle-blue-small")); +// Gtk::Image* iblueredR = Gtk::manage (new RTImage ("circle-red-small")); degreeout = Gtk::manage (new Adjuster (M ("TP_COLORAPP_CIECAT_DEGREEOUT"), 0., 100., 1., 90.)); @@ -672,10 +672,10 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, TOOL_NAME, M ("TP degreeout->addAutoButton (M ("TP_COLORAPP_CAT02ADAPTATION_TOOLTIP")); p3VBox->pack_start (*degreeout); /* - 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")); + Gtk::Image* itempL1 = Gtk::manage (new RTImage ("circle-blue-small")); + Gtk::Image* itempR1 = Gtk::manage (new RTImage ("circle-yellow-small")); + Gtk::Image* igreenL1 = Gtk::manage (new RTImage ("circle-magenta-small")); + Gtk::Image* igreenR1 = Gtk::manage (new RTImage ("circle-green-small")); */ 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)); @@ -746,7 +746,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, TOOL_NAME, M ("TP //reset button neutral = Gtk::manage (new Gtk::Button (M ("TP_COLORAPP_NEUTRAL"))); setExpandAlignProperties (neutral, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); - RTImage *resetImg = Gtk::manage (new RTImage ("undo-small.png", "redo-small.png")); + RTImage* const resetImg = Gtk::manage (new RTImage ("undo-small", Gtk::ICON_SIZE_BUTTON)); setExpandAlignProperties (resetImg, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); neutral->set_image (*resetImg); neutral->set_tooltip_text (M ("TP_COLORAPP_NEUTRAL_TOOLTIP")); @@ -888,8 +888,9 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) curveMode3Changed(); // This will set the correct sensitive state of depending Adjusters nexttemp = pp->wb.temperature; - nextgreen = 1.; //pp->wb.green; - + //nextgreen = 1.; //pp->wb.green; + nextgreen = pp->wb.green; + if (pedited) { degree->setEditedState (pedited->colorappearance.degree ? Edited : UnEdited); degreeout->setEditedState (pedited->colorappearance.degreeout ? Edited : UnEdited); @@ -961,7 +962,7 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) } else if (pp->colorappearance.complexmethod == "expert") { complexmethod->set_active(1); } - + modelmethod->set_active(0); if (pp->colorappearance.modelmethod == "02") { @@ -1368,11 +1369,11 @@ void ColorAppearance::updateGUIToMode(int mode) curveEditorG3->hide(); //greenout->hide(); greenout->set_sensitive(false); - + badpixsl->hide(); datacie->hide(); } else { - alHBox->show(); + alHBox->show(); wbmHBox->show(); curveEditorG->show(); curveEditorG2->show(); @@ -1411,7 +1412,7 @@ void ColorAppearance::convertParamToNormal() } void ColorAppearance::complexmethodChanged() -{ +{ if (complexmethod->get_active_row_number() == 0) { updateGUIToMode(0); convertParamToNormal(); @@ -1426,7 +1427,7 @@ void ColorAppearance::complexmethodChanged() } void ColorAppearance::modelmethodChanged() -{ +{ if (listener && (multiImage || getEnabled())) { listener->panelChanged(EvCATmodel, modelmethod->get_active_text()); @@ -1434,7 +1435,7 @@ void ColorAppearance::modelmethodChanged() } void ColorAppearance::catmethodChanged() -{ +{ if (catmethod->get_active_row_number() == 1) { disableListener(); @@ -1483,7 +1484,7 @@ void ColorAppearance::catmethodChanged() degreeout->setValue(90); ybout->setValue(18); tempout->setValue (nexttemp); - + if(tempout->getAutoValue()) { tempout->resetValue (false); tempout->setAutoValue (true); @@ -1495,7 +1496,7 @@ void ColorAppearance::catmethodChanged() greenout->setValue (nextgreen); enableListener(); - + } else if (catmethod->get_active_row_number() == 0) { disableListener(); degree->setAutoValue (true); @@ -1519,7 +1520,7 @@ void ColorAppearance::catmethodChanged() ybout->resetValue (false); tempout->resetValue (false); tempout->setAutoValue (true); - greenout->resetValue (false); + greenout->resetValue (true); enableListener(); } else if (catmethod->get_active_row_number() == 2) { disableListener(); @@ -1866,7 +1867,7 @@ void ColorAppearance::autoCamChanged (double ccam, double ccamout) void ColorAppearance::adapCamChanged (double cadap) { - + idle_register.add( [this, cadap]() -> bool { @@ -1879,16 +1880,36 @@ void ColorAppearance::adapCamChanged (double cadap) } -void ColorAppearance::wbCamChanged (double temp, double tin) +void ColorAppearance::wbCamChanged (double temp, double tin, bool autotemp) {//reactivate this function - + idle_register.add( - [this, temp, tin]() -> bool + [this, temp, tin, autotemp]() -> bool + { + if (temp != tempout->getValue()) { + disableListener(); + tempout->setValue(temp); + enableListener(); + listener->panelChanged (EvCATtempout, tempout->getTextValue()); + } + if (tin != greenout->getValue()) { + disableListener(); + greenout->setValue(tin); + enableListener(); + listener->panelChanged (EvCATgreenout, greenout->getTextValue()); + } + /* disableListener(); tempout->setValue(temp); - greenout->setValue(tin); + greenout->setValue(tin); enableListener(); + + if(!autotemp) { + listener->panelChanged (EvCATgreenout, "");//greenout->getTextValue()); + listener->panelChanged (EvCATtempout, "");//tempout->getTextValue()); + }*/ + return false; } ); @@ -2124,7 +2145,7 @@ void ColorAppearance::wbmodelChanged () tempsc->hide(); greensc->hide(); tempsc->setValue (5003); - greensc->setValue (1); + greensc->setValue (1); } if (wbmodel->get_active_row_number() == 2) { diff --git a/rtgui/colorappearance.h b/rtgui/colorappearance.h index 714f3e557..e8f6084cd 100644 --- a/rtgui/colorappearance.h +++ b/rtgui/colorappearance.h @@ -66,7 +66,7 @@ public: void autoCamChanged (double ccam, double ccamout) override; bool autoCamComputed_ (); void adapCamChanged (double cadap) override; - void wbCamChanged(double tem, double tin) override; + void wbCamChanged(double tem, double tin, bool autotemp) override; bool adapCamComputed_ (); void ybCamChanged (int yb) override; bool ybCamComputed_ (); diff --git a/rtgui/coloredbar.cc b/rtgui/coloredbar.cc index adafcbdde..0d28c335a 100644 --- a/rtgui/coloredbar.cc +++ b/rtgui/coloredbar.cc @@ -23,77 +23,20 @@ ColoredBar::ColoredBar (eRTOrientation orient) { orientation = orient; - dirty = true; this->x = this->y = this->w = this->h = 0; } -bool ColoredBar::setDrawRectangle(int newX, int newY, int newW, int newH, bool updateBackBufferSize) +void ColoredBar::setColoredBarSize(const int newX, const int newY, const int newW, const int newH) { - return BackBuffer::setDrawRectangle(Cairo::FORMAT_ARGB32, newX, newY, newW, newH, updateBackBufferSize); + this->x = newX; + this->y = newY; + this->w = newW; + this->h = newH; } -/* - * Redraw the bar to a Cairo::ImageSurface - */ -void ColoredBar::expose(Gtk::DrawingArea &drawingArea, Cairo::RefPtr destSurface) +void ColoredBar::updateColoredBar(const Cairo::RefPtr< Cairo::Context> &cr) { - // look out if the Surface has to be redrawn - if (!surfaceCreated() || !destSurface) { - return; - } - - updateBackBuffer(drawingArea); - Gdk::Rectangle rect(x, y, w, h); - copySurface(destSurface, &rect); -} - -/* - * Redraw the bar to a Gdk::Window - */ -void ColoredBar::expose(Gtk::DrawingArea &drawingArea, Glib::RefPtr destWindow) -{ - // look out if the Surface has to be redrawn - if (!surfaceCreated() || !destWindow) { - return; - } - - updateBackBuffer(drawingArea); - Gdk::Rectangle rect(x, y, w, h); - copySurface(destWindow, &rect); -} - -void ColoredBar::expose(Gtk::DrawingArea &drawingArea, const Cairo::RefPtr< Cairo::Context> &cr) -{ - // look out if the Surface has to be redrawn - if (!surfaceCreated()) { - return; - } - - updateBackBuffer(drawingArea); - Gdk::Rectangle rect(x, y, w, h); - copySurface(cr, &rect); -} - -/* - * Redraw the bar to a Gdk::Window - */ -void ColoredBar::expose(Gtk::DrawingArea &drawingArea, BackBuffer *backBuffer) -{ - // look out if the Surface has to be redrawn - if (!surfaceCreated() || !backBuffer) { - return; - } - - updateBackBuffer(drawingArea); - Gdk::Rectangle rect(x, y, w, h); - copySurface(backBuffer, &rect); -} - -void ColoredBar::updateBackBuffer(Gtk::DrawingArea &drawingArea) -{ - if (isDirty()) { - Cairo::RefPtr cr = getContext(); - + if (w > 0 && h > 0) { // the bar has to be drawn to the Surface first if (!bgGradient.empty()) { // a gradient has been set, we use it @@ -104,20 +47,20 @@ void ColoredBar::updateBackBuffer(Gtk::DrawingArea &drawingArea) switch (orientation) { case (RTO_Left2Right): - bggradient = Cairo::LinearGradient::create (0., 0., double(w), 0.); + bggradient = Cairo::LinearGradient::create (0., 0., static_cast(w), 0.); break; case (RTO_Right2Left): - bggradient = Cairo::LinearGradient::create (double(w), 0., 0., 0.); + bggradient = Cairo::LinearGradient::create (static_cast(w), 0., 0., 0.); break; case (RTO_Bottom2Top): - bggradient = Cairo::LinearGradient::create (0., double(h), 0., 0.); + bggradient = Cairo::LinearGradient::create (0., static_cast(h), 0., 0.); break; case (RTO_Top2Bottom): default: - bggradient = Cairo::LinearGradient::create (0., 0., 0., double(h)); + bggradient = Cairo::LinearGradient::create (0., 0., 0., static_cast(h)); break; } @@ -126,13 +69,13 @@ void ColoredBar::updateBackBuffer(Gtk::DrawingArea &drawingArea) } cr->set_source (bggradient); - cr->rectangle(0, 0, w, h); + cr->rectangle(static_cast(x), static_cast(y), static_cast(w), static_cast(h)); cr->fill(); } else { // ask the ColorProvider to provide colors :) for each pixels if (colorProvider) { - surface->flush(); - + // Create surface + const auto surface = Cairo::ImageSurface::create(Cairo::FORMAT_RGB24, w, h); unsigned char *surfaceData = surface->get_data(); cr->set_antialias(Cairo::ANTIALIAS_NONE); @@ -205,25 +148,22 @@ void ColoredBar::updateBackBuffer(Gtk::DrawingArea &drawingArea) break; } - surface->mark_dirty(); + cr->set_source(surface, 0., 0.); + cr->rectangle(static_cast(x), static_cast(y), static_cast(w), static_cast(h)); + cr->fill(); } } - - // has it been updated or not, we assume that the Surface has been correctly set (we don't handle allocation error) - setDirty(false); } } void ColoredBar::setBgGradient (const std::vector &milestones) { bgGradient = milestones; - setDirty(true); } void ColoredBar::clearBgGradient () { bgGradient.clear(); - setDirty(true); } bool ColoredBar::canGetColors() diff --git a/rtgui/coloredbar.h b/rtgui/coloredbar.h index f5156129e..55ac8849e 100644 --- a/rtgui/coloredbar.h +++ b/rtgui/coloredbar.h @@ -30,11 +30,15 @@ * the bar itself, i.e. use render_background (depending on its Gtk::StyleContext) * */ -class ColoredBar final : private BackBuffer, public ColorCaller +class ColoredBar final : public ColorCaller { private: - void updateBackBuffer(Gtk::DrawingArea &drawingArea); + // ColoredBar position and size parameters + int x; + int y; + int w; + int h; protected: eRTOrientation orientation; @@ -42,12 +46,9 @@ protected: public: explicit ColoredBar (eRTOrientation orient); - bool setDrawRectangle(int newX, int newY, int newW, int newH, bool updateBackBufferSize = true); + void setColoredBarSize(const int newX, const int newY, const int newW, const int newH); // Note: updateColoredBar shall be called after to update the bar - void expose(Gtk::DrawingArea &drawingArea, Glib::RefPtr destWindow); - void expose(Gtk::DrawingArea &drawingArea, Cairo::RefPtr destSurface); - void expose(Gtk::DrawingArea &drawingArea, BackBuffer *backBuffer); - void expose(Gtk::DrawingArea &drawingArea, const Cairo::RefPtr< Cairo::Context> &cr); + void updateColoredBar(const Cairo::RefPtr< Cairo::Context> &cr); bool canGetColors(); @@ -56,8 +57,4 @@ public: // by clearing the gradient, the ColorProvider will have to provide colors on a per pixel basis if a ColorProvider // has been set, through ColorProvider::colorForValue on next ColoredBar::expose void clearBgGradient (); - - void setDirty(bool isDirty) { - BackBuffer::setDirty(isDirty); - } }; diff --git a/rtgui/colortoning.cc b/rtgui/colortoning.cc index d9928cd13..d5e570994 100644 --- a/rtgui/colortoning.cc +++ b/rtgui/colortoning.cc @@ -128,8 +128,8 @@ ColorToning::ColorToning () : FoldableToolPanel(this, TOOL_NAME, M("TP_COLORTONI pack_start( *opacityCurveEditorG, Gtk::PACK_SHRINK, 2); //---------Chroma curve 1 -------------------- - iby = Gtk::manage (new RTImage ("circle-yellow-blue-small.png")); - irg = Gtk::manage (new RTImage ("circle-green-red-small.png")); + iby = Gtk::manage (new RTImage ("circle-yellow-blue-small")); + irg = Gtk::manage (new RTImage ("circle-green-red-small")); clCurveEditorG = new CurveEditorGroup (options.lastColorToningCurvesDir, M("TP_COLORTONING_CHROMAC")); clCurveEditorG->setCurveListener (this); @@ -170,7 +170,7 @@ ColorToning::ColorToning () : FoldableToolPanel(this, TOOL_NAME, M("TP_COLORTONI //--------------------- Reset curves ----------------------------- /* Each curve can reset to a different curve, so this button only save one click now... so we remove it. neutralCurves = Gtk::manage (new Gtk::Button (M("TP_COLORTONING_NEUTRALCUR"))); - RTImage *resetImgc = Gtk::manage (new RTImage ("undo-small.png", "redo-small.png")); + RTImage *resetImgc = Gtk::manage (new RTImage ("undo-small")); neutralCurves->set_image(*resetImgc); neutralCurves->set_tooltip_text (M("TP_COLORTONING_NEUTRALCUR_TIP")); neutralcurvesconn = neutralCurves->signal_pressed().connect( sigc::mem_fun(*this, &ColorToning::neutralCurves_pressed) ); @@ -250,26 +250,26 @@ ColorToning::ColorToning () : FoldableToolPanel(this, TOOL_NAME, M("TP_COLORTONI 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")); - Gtk::Image* imagL = Gtk::manage (new RTImage ("circle-magenta-small.png")); - Gtk::Image* igreenR = Gtk::manage (new RTImage ("circle-green-small.png")); - Gtk::Image* icyanL = Gtk::manage (new RTImage ("circle-blue-small.png")); - Gtk::Image* iredR = Gtk::manage (new RTImage ("circle-red-small.png")); + Gtk::Image* iblueR = Gtk::manage (new RTImage ("circle-blue-small")); + Gtk::Image* iyelL = Gtk::manage (new RTImage ("circle-yellow-small")); + Gtk::Image* imagL = Gtk::manage (new RTImage ("circle-magenta-small")); + Gtk::Image* igreenR = Gtk::manage (new RTImage ("circle-green-small")); + Gtk::Image* icyanL = Gtk::manage (new RTImage ("circle-blue-small")); + Gtk::Image* iredR = Gtk::manage (new RTImage ("circle-red-small")); - Gtk::Image* iblueRm = Gtk::manage (new RTImage ("circle-blue-small.png")); - Gtk::Image* iyelLm = Gtk::manage (new RTImage ("circle-yellow-small.png")); - Gtk::Image* imagLm = Gtk::manage (new RTImage ("circle-magenta-small.png")); - Gtk::Image* igreenRm = Gtk::manage (new RTImage ("circle-green-small.png")); - Gtk::Image* icyanLm = Gtk::manage (new RTImage ("circle-blue-small.png")); - Gtk::Image* iredRm = Gtk::manage (new RTImage ("circle-red-small.png")); + Gtk::Image* iblueRm = Gtk::manage (new RTImage ("circle-blue-small")); + Gtk::Image* iyelLm = Gtk::manage (new RTImage ("circle-yellow-small")); + Gtk::Image* imagLm = Gtk::manage (new RTImage ("circle-magenta-small")); + Gtk::Image* igreenRm = Gtk::manage (new RTImage ("circle-green-small")); + Gtk::Image* icyanLm = Gtk::manage (new RTImage ("circle-blue-small")); + Gtk::Image* iredRm = Gtk::manage (new RTImage ("circle-red-small")); - Gtk::Image* iblueRh = Gtk::manage (new RTImage ("circle-blue-small.png")); - Gtk::Image* iyelLh = Gtk::manage (new RTImage ("circle-yellow-small.png")); - Gtk::Image* imagLh = Gtk::manage (new RTImage ("circle-magenta-small.png")); - Gtk::Image* igreenRh = Gtk::manage (new RTImage ("circle-green-small.png")); - Gtk::Image* icyanLh = Gtk::manage (new RTImage ("circle-blue-small.png")); - Gtk::Image* iredRh = Gtk::manage (new RTImage ("circle-red-small.png")); + Gtk::Image* iblueRh = Gtk::manage (new RTImage ("circle-blue-small")); + Gtk::Image* iyelLh = Gtk::manage (new RTImage ("circle-yellow-small")); + Gtk::Image* imagLh = Gtk::manage (new RTImage ("circle-magenta-small")); + Gtk::Image* igreenRh = Gtk::manage (new RTImage ("circle-green-small")); + Gtk::Image* icyanLh = Gtk::manage (new RTImage ("circle-blue-small")); + Gtk::Image* iredRh = Gtk::manage (new RTImage ("circle-red-small")); redhigh = Gtk::manage (new Adjuster ("", -100., 100., 1., 0., icyanLh, iredRh )); greenhigh = Gtk::manage (new Adjuster ("", -100., 100., 1., 0., imagLh , igreenRh)); @@ -300,7 +300,7 @@ ColorToning::ColorToning () : FoldableToolPanel(this, TOOL_NAME, M("TP_COLORTONI 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); @@ -394,23 +394,23 @@ ColorToning::ColorToning () : FoldableToolPanel(this, TOOL_NAME, M("TP_COLORTONI hb->pack_start(*labRegionList, Gtk::PACK_EXPAND_WIDGET); 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->add(*Gtk::manage(new RTImage("add-small", Gtk::ICON_SIZE_BUTTON))); labRegionAdd->signal_clicked().connect(sigc::mem_fun(*this, &ColorToning::labRegionAddPressed)); add_button(labRegionAdd, vb); labRegionRemove = Gtk::manage(new Gtk::Button()); - labRegionRemove->add(*Gtk::manage(new RTImage("remove-small.png"))); + labRegionRemove->add(*Gtk::manage(new RTImage("remove-small", Gtk::ICON_SIZE_BUTTON))); labRegionRemove->signal_clicked().connect(sigc::mem_fun(*this, &ColorToning::labRegionRemovePressed)); add_button(labRegionRemove, vb); labRegionUp = Gtk::manage(new Gtk::Button()); - labRegionUp->add(*Gtk::manage(new RTImage("arrow-up-small.png"))); + labRegionUp->add(*Gtk::manage(new RTImage("arrow-up-small", Gtk::ICON_SIZE_BUTTON))); labRegionUp->signal_clicked().connect(sigc::mem_fun(*this, &ColorToning::labRegionUpPressed)); add_button(labRegionUp, vb); labRegionDown = Gtk::manage(new Gtk::Button()); - labRegionDown->add(*Gtk::manage(new RTImage("arrow-down-small.png"))); + labRegionDown->add(*Gtk::manage(new RTImage("arrow-down-small", Gtk::ICON_SIZE_BUTTON))); labRegionDown->signal_clicked().connect(sigc::mem_fun(*this, &ColorToning::labRegionDownPressed)); add_button(labRegionDown, vb); labRegionCopy = Gtk::manage(new Gtk::Button()); - labRegionCopy->add(*Gtk::manage(new RTImage("arrow-right-small.png"))); + labRegionCopy->add(*Gtk::manage(new RTImage("arrow-right-small", Gtk::ICON_SIZE_BUTTON))); labRegionCopy->signal_clicked().connect(sigc::mem_fun(*this, &ColorToning::labRegionCopyPressed)); add_button(labRegionCopy, vb); hb->pack_start(*vb, Gtk::PACK_SHRINK); @@ -647,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, 0, 0, 0, 0,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, 0, 0,false); if (pedited && !pedited->colorToning.method) { method->set_active (7); @@ -718,8 +718,8 @@ void ColorToning::write (ProcParams* pp, ParamsEdited* pedited) pp->colorToning.strength = strength->getIntValue(); double zerox = 0.; double zeroy = 0.; - - labgrid->getParams(pp->colorToning.labgridALow, pp->colorToning.labgridBLow, pp->colorToning.labgridAHigh, pp->colorToning.labgridBHigh, zerox, zeroy, zerox, zeroy); + + labgrid->getParams(pp->colorToning.labgridALow, pp->colorToning.labgridBLow, pp->colorToning.labgridAHigh, pp->colorToning.labgridBHigh, zerox, zeroy, 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; @@ -835,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, 0, 0, 0, 0); + 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, 0, 0); if (pedited) { @@ -1435,7 +1435,7 @@ void ColorToning::labRegionGet(int idx) double la, lb; double zerox = 0.; double zeroy = 0.; - labRegionAB->getParams(la, lb, r.a, r.b, zerox, zeroy, zerox, zeroy); + labRegionAB->getParams(la, lb, r.a, r.b, zerox, zeroy, zerox, zeroy, zerox, zeroy); r.saturation = labRegionSaturation->getValue(); r.slope = labRegionSlope->getValue(); r.offset = labRegionOffset->getValue(); @@ -1571,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,0, 0, 0, 0, false); + labRegionAB->setParams(0, 0, r.a, r.b,0, 0, 0, 0, 0, 0, false); labRegionSaturation->setValue(r.saturation); labRegionSlope->setValue(r.slope); labRegionOffset->setValue(r.offset); diff --git a/rtgui/controllines.cc b/rtgui/controllines.cc index 08f9eda37..179001812 100644 --- a/rtgui/controllines.cc +++ b/rtgui/controllines.cc @@ -92,14 +92,14 @@ ControlLineManager::ControlLineManager(): 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")); + line_icon_h = std::shared_ptr(new RTSurface( + "bidirectional-arrow-horizontal-hicontrast", Gtk::ICON_SIZE_BUTTON)); + line_icon_v = std::shared_ptr(new RTSurface( + "bidirectional-arrow-vertical-hicontrast", Gtk::ICON_SIZE_BUTTON)); + line_icon_h_prelight = std::shared_ptr(new RTSurface( + "bidirectional-arrow-horizontal-prelight", Gtk::ICON_SIZE_BUTTON)); + line_icon_v_prelight = std::shared_ptr(new RTSurface( + "bidirectional-arrow-vertical-prelight", Gtk::ICON_SIZE_BUTTON)); } ControlLineManager::~ControlLineManager() = default; @@ -438,8 +438,8 @@ void ControlLineManager::addLine(Coord begin, Coord end, line->begin = begin; line->end = end; - const Cairo::RefPtr null_surface = - Cairo::RefPtr(nullptr); + const std::shared_ptr null_surface = + std::shared_ptr(nullptr); icon_h = std::make_shared(line_icon_h, null_surface, line_icon_h_prelight, diff --git a/rtgui/controllines.h b/rtgui/controllines.h index 7f3f74b7b..ba05e006c 100644 --- a/rtgui/controllines.h +++ b/rtgui/controllines.h @@ -61,8 +61,8 @@ protected: 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; + std::shared_ptr line_icon_h, line_icon_v; + std::shared_ptr line_icon_h_prelight, line_icon_v_prelight; int prev_obj; int selected_object; diff --git a/rtgui/controlspotpanel.cc b/rtgui/controlspotpanel.cc index 804fab2c6..783f253c7 100644 --- a/rtgui/controlspotpanel.cc +++ b/rtgui/controlspotpanel.cc @@ -66,22 +66,23 @@ ControlSpotPanel::ControlSpotPanel(): 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))), + circrad_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CIRCRADIUS"), 1.5, 150., 0.5, 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.))), + feather_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FEATVALUE_MASK"), 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))), + thresh_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_THRESDELTAE"), 0.0, 15.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"))))), + // balan_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BALAN"), 0.05, 2.5, 0.05, 1.0, Gtk::manage(new RTImage("rawtherapee-logo-16")), Gtk::manage(new RTImage("circle-white-small"))))), + balan_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BALAN"), 0.05, 2.5, 0.05, 1.0, Gtk::manage(new RTImage("circle-yellow-small")), Gtk::manage(new RTImage("circle-white-small"))))), + balanh_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BALANH"), 0.2, 2.5, 0.1, 1.0, Gtk::manage(new RTImage("circle-multicolor-small")), Gtk::manage(new RTImage("circle-red-green-small"))))), + colorde_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_COLORDE"), -15, 15, 2, 5, Gtk::manage(new RTImage("circle-blue-yellow-small")), Gtk::manage(new RTImage("circle-gray-green-small"))))), 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")) ))), + lumask_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LUMASK"), -50, 30, 1, 10, Gtk::manage(new RTImage("circle-yellow-small")), Gtk::manage(new RTImage("circle-gray-small")) ))), hishow_(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_PREVSHOW")))), activ_(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ACTIVSPOT")))), @@ -99,8 +100,11 @@ ControlSpotPanel::ControlSpotPanel(): preview_(Gtk::manage(new Gtk::ToggleButton(M("TP_LOCALLAB_PREVIEW")))), ctboxshape(Gtk::manage(new Gtk::Box())), + ctboxactivmethod(Gtk::manage(new Gtk::Box())), + ctboxspotmethod(Gtk::manage(new Gtk::Box())), ctboxshapemethod(Gtk::manage(new Gtk::Box())), ctboxgamut(Gtk::manage(new Gtk::Box())), + artifBox2(Gtk::manage(new ToolParamBlock())), controlPanelListener(nullptr), lastObject_(-1), @@ -115,7 +119,7 @@ ControlSpotPanel::ControlSpotPanel(): auto m = ProcEventMapper::getInstance(); EvLocallabavoidgamutMethod = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_GAMUTMUNSEL"); const bool showtooltip = options.showtooltip; - pack_start(*hishow_); +// pack_start(*hishow_); Gtk::Box* const ctboxprevmethod = Gtk::manage(new Gtk::Box()); prevMethod_->append(M("TP_LOCALLAB_PREVHIDE")); @@ -124,7 +128,7 @@ ControlSpotPanel::ControlSpotPanel(): prevMethodconn_ = prevMethod_->signal_changed().connect( sigc::mem_fun( *this, &ControlSpotPanel::prevMethodChanged)); - + // ctboxprevmethod->pack_start(*prevMethod_); pack_start(*ctboxprevmethod); @@ -203,8 +207,9 @@ ControlSpotPanel::ControlSpotPanel(): scrolledwindow_->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); scrolledwindow_->set_min_content_height(150); pack_start(*scrolledwindow_); + pack_start(*hishow_); - Gtk::Box* const ctboxactivmethod = Gtk::manage(new Gtk::Box()); + // Gtk::Box* const ctboxactivmethod = Gtk::manage(new Gtk::Box()); ctboxactivmethod->pack_start(*activ_); pack_start(*ctboxactivmethod); @@ -222,7 +227,6 @@ ControlSpotPanel::ControlSpotPanel(): 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); @@ -233,6 +237,7 @@ ControlSpotPanel::ControlSpotPanel(): spotMethod_->append(M("TP_LOCALLAB_EXNORM")); spotMethod_->append(M("TP_LOCALLAB_EXECLU")); spotMethod_->append(M("TP_LOCALLAB_EXFULL")); + spotMethod_->append(M("TP_LOCALLAB_EXMAIN"));//new choice Global spotMethod_->set_active(0); spotMethodconn_ = spotMethod_->signal_changed().connect( sigc::mem_fun( @@ -256,7 +261,7 @@ ControlSpotPanel::ControlSpotPanel(): sensiexclu_->setAdjusterListener(this); structexclu_->setAdjusterListener(this); structexclu_->setLogScale(10, 0); - + excluBox->pack_start(*sensiexclu_); excluBox->pack_start(*structexclu_); excluFrame->add(*excluBox); @@ -346,7 +351,7 @@ ControlSpotPanel::ControlSpotPanel(): transitBox->pack_start(*transit_); transitBox->pack_start(*transitweak_); transitBox->pack_start(*transitgrad_); - transitBox->pack_start(*feather_); + //transitBox->pack_start(*feather_); expTransGrad_->add(*transitBox, false); pack_start(*expTransGrad_, false, false); @@ -387,10 +392,11 @@ ControlSpotPanel::ControlSpotPanel(): // artifBox->pack_start(*colorscope_); expShapeDetect_->add(*artifBox, false); pack_start(*expShapeDetect_, false, false); - ToolParamBlock* const artifBox2 = Gtk::manage(new ToolParamBlock()); - +// ToolParamBlock* const artifBox2 = Gtk::manage(new ToolParamBlock()); + artifBox2->pack_start(*preview_); - artifBox2->pack_start(*colorscope_); + artifBox2->pack_start(*colorscope_);//unused with contrlspotpanel since 17 / 01 : 2024 but data used in color, vibrance, sh + colorscope_->hide(); pack_start(*artifBox2); ToolParamBlock* const specCaseBox = Gtk::manage(new ToolParamBlock()); @@ -407,7 +413,7 @@ ControlSpotPanel::ControlSpotPanel(): avoidgamutMethod_->append(M("TP_LOCALLAB_GAMUTXYZABSO")); avoidgamutMethod_->append(M("TP_LOCALLAB_GAMUTXYZRELA")); avoidgamutMethod_->append(M("TP_LOCALLAB_GAMUTMUNSELL")); - avoidgamutMethod_->set_active(2); + avoidgamutMethod_->set_active(4); avoidgamutconn_ = avoidgamutMethod_->signal_changed().connect( sigc::mem_fun( *this, &ControlSpotPanel::avoidgamutMethodChanged)); @@ -464,7 +470,7 @@ ControlSpotPanel::ControlSpotPanel(): ctboxwavmethod->pack_start(*wavMethod_); specCaseBox->pack_start(*ctboxwavmethod); - + expSpecCases_->add(*specCaseBox, false); pack_start(*expSpecCases_, false, false); @@ -498,6 +504,7 @@ ControlSpotPanel::ControlSpotPanel(): maskBox->pack_start(*deltae_); maskBox->pack_start(*scopemask_); maskBox->pack_start(*denoichmask_); + maskBox->pack_start(*feather_); // maskBox->pack_start(*shortc_); maskBox->pack_start(*lumask_); // maskBox->pack_start(*savrest_); @@ -551,7 +558,6 @@ ControlSpotPanel::ControlSpotPanel(): pack_start(*ctboxwavmethod); */ show_all(); - // Define row background color // Mouseovered spot (opaque orange) colorMouseover.set_red(1.); @@ -794,6 +800,7 @@ bool ControlSpotPanel::on_button_visibility(GdkEventButton* event) return false; } + bool ControlSpotPanel::blockTreeviewSearch(GdkEventKey* event) { // printf("blockTreeviewSearch\n"); @@ -981,7 +988,7 @@ void ControlSpotPanel::prevMethodChanged() void ControlSpotPanel::spotMethodChanged() { - + //01 2024 take into account new problems linked to Global spotmethod // Get selected control spot const auto s = treeview_->get_selection(); @@ -994,15 +1001,20 @@ void ControlSpotPanel::spotMethodChanged() const int oldSpotMethod = row[spots_.spotMethod]; row[spots_.spotMethod] = spotMethod_->get_active_row_number(); + //ctboxspotmethod->show(); + hishow_->show(); + ctboxshape->show(); + artifBox2->show(); + colorscope_->hide(); // 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) { + // Reset spot shape only if previous spotMethod is Full image or Global + if (oldSpotMethod == 2 || oldSpotMethod == 3) { disableParamlistener(true); locX_->setValue(150.); row[spots_.locX] = locX_->getIntValue(); @@ -1022,8 +1034,8 @@ void ControlSpotPanel::spotMethodChanged() } 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) { + // Reset spot shape only if previous spotMethod is Full image or Global + if (oldSpotMethod == 2 || oldSpotMethod == 3) { disableParamlistener(true); locX_->setValue(150.); row[spots_.locX] = locX_->getIntValue(); @@ -1040,7 +1052,7 @@ void ControlSpotPanel::spotMethodChanged() disableParamlistener(false); updateControlSpotCurve(row); } - } else if (spotMethod_->get_active_row_number() == 2) { // Full image case + } else if (spotMethod_->get_active_row_number() == 2 || spotMethod_->get_active_row_number() == 3) { // Full image or Global case excluFrame->hide(); shape_->set_active(0); @@ -1056,6 +1068,31 @@ void ControlSpotPanel::spotMethodChanged() row[spots_.shape] = shape_->get_active_row_number(); transit_->setValue(100.); row[spots_.transit] = transit_->getValue(); + + if(spotMethod_->get_active_row_number() == 3) { //global + ctboxshape->hide(); + artifBox2->hide(); + hishow_->hide(); + expTransGrad_->hide(); + expShapeDetect_->hide(); + expSpecCases_->hide(); + expMaskMerge_->hide(); + circrad_->hide(); + ctboxshape->hide(); + } else { + ctboxshape->show(); + circrad_->show(); + artifBox2->show(); + colorscope_->hide(); + + hishow_->show(); + if(hishow_->get_active()) { + expTransGrad_->show(); + expShapeDetect_->show(); + expSpecCases_->show(); + expMaskMerge_->show(); + } + } } // Raise event @@ -1303,7 +1340,12 @@ void ControlSpotPanel::updateParamVisibility() } else { avoidrad_->hide(); } - + // ctboxspotmethod->show(); + hishow_->show(); + artifBox2->show(); + ctboxshape->show(); + colorscope_->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(); @@ -1311,8 +1353,35 @@ void ControlSpotPanel::updateParamVisibility() excluFrame->hide(); } else if (spotMethod_->get_active_row_number() == 1) { // Excluding case excluFrame->show(); - } else if (spotMethod_->get_active_row_number() == 2) {//full image + } else if (spotMethod_->get_active_row_number() == 2 || spotMethod_->get_active_row_number() == 3) {//full image or global excluFrame->hide(); + + if(spotMethod_->get_active_row_number() == 3) { + artifBox2->hide(); + hishow_->hide(); + hishow_->set_active(false); + ctboxshape->hide(); + circrad_->hide(); + expTransGrad_->hide(); + expShapeDetect_->hide(); + expSpecCases_->hide(); + expMaskMerge_->hide(); + + } else { + artifBox2->show(); + colorscope_->hide(); + hishow_->show(); + ctboxshape->show(); + circrad_->show(); + if(hishow_->get_active()) { + expTransGrad_->show(); + expShapeDetect_->show(); + expSpecCases_->show(); + expMaskMerge_->show(); + } + + } + } /* @@ -1325,13 +1394,35 @@ void ControlSpotPanel::updateParamVisibility() ctboxshape->show(); } else if (prevMethod_->get_active_row_number() == 0) { // Normal case */ - if (!hishow_->get_active()) { // Normal case + //ctboxshape->show(); + // artifBox2->show(); + + if (!hishow_->get_active() || spotMethod_->get_active_row_number() == 3) { // Normal case or Global expTransGrad_->hide(); expShapeDetect_->hide(); expSpecCases_->hide(); expMaskMerge_->hide(); circrad_->hide(); ctboxshape->hide(); + if(spotMethod_->get_active_row_number() == 3) { + artifBox2->hide(); + hishow_->hide(); + ctboxshape->hide(); + circrad_->hide(); + expTransGrad_->hide(); + expShapeDetect_->hide(); + expSpecCases_->hide(); + expMaskMerge_->hide(); + + } else { + hishow_->show(); + artifBox2->show(); + colorscope_->hide(); + hishow_->show(); + ctboxshape->show(); + circrad_->show(); + } + } else { // Excluding case expTransGrad_->show(); expShapeDetect_->show(); @@ -1339,9 +1430,11 @@ void ControlSpotPanel::updateParamVisibility() expMaskMerge_->show(); circrad_->show(); ctboxshape->show(); + hishow_->show(); + } - + } void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval) @@ -1456,7 +1549,7 @@ void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval) } if (a == circrad_) { - row[spots_.circrad] = circrad_->getIntValue(); + row[spots_.circrad] = circrad_->getValue(); updateControlSpotCurve(row); @@ -1602,8 +1695,9 @@ void ControlSpotPanel::hishowChanged() row[spots_.hishow] = hishow_->get_active(); + ctboxshape->show(); - if (!hishow_->get_active()) { // Normal case + if (!hishow_->get_active() || spotMethod_->get_active_row_number() == 3) { // Normal case or Global expTransGrad_->hide(); expShapeDetect_->hide(); expSpecCases_->hide(); @@ -1611,6 +1705,20 @@ void ControlSpotPanel::hishowChanged() circrad_->hide(); ctboxshape->hide(); shapeMethod_->set_active(0); + if(spotMethod_->get_active_row_number() == 3) { + hishow_->hide(); + hishow_->set_active(false); + circrad_->hide(); + expTransGrad_->hide(); + expShapeDetect_->hide(); + expSpecCases_->hide(); + expMaskMerge_->hide(); + + } else { + hishow_->show(); + circrad_->show(); + + } } else { // Excluding case expTransGrad_->show(); @@ -1619,7 +1727,9 @@ void ControlSpotPanel::hishowChanged() expMaskMerge_->show(); circrad_->show(); ctboxshape->show(); - } + hishow_->show(); + + } // Raise event if (listener) { @@ -2763,6 +2873,56 @@ void ControlSpotPanel::deleteControlSpot(const int index) disableParamlistener(false); } +//new function linked to Global and options +void ControlSpotPanel::updateguiset(int spottype, bool iscolor, bool issh, bool isvib, bool isexpos, bool issoft, bool isblur, bool istom, bool isret, bool issharp, bool iscont, bool iscbdl, bool islog, bool ismas, bool iscie) +{ + { //with this function we can 1) activate Settings SpotMethod + // also if need GUI for mask , todo... + idle_register.add( + [this, spottype, iscolor, issh , isvib, isexpos, issoft, isblur, istom, isret, issharp, iscont, iscbdl, islog, ismas, iscie]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update GUI fullimage or main + disableListener(); + if(spottype >= 2 && options.spotmet >= 2) {//optimize update + spotMethodChanged(); + } + + if((iscolor || issh || isvib || isexpos || istom || iscont || islog || ismas || iscie) + && !issharp && !issoft && !isret && !isblur & !iscbdl) { + preview_->hide(); + } else if (issoft || isblur || isret || issharp || iscbdl) { + preview_->show(); + } + enableListener(); + + return false; + } + ); + } + +} +//new function linked to change scope +void ControlSpotPanel::updateguiscopeset(int scope) +{ + { //with this function we can disabled old values scope + idle_register.add( + [this, scope]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + disableListener(); + colorscope_->setValue(scope); + adjusterChanged(colorscope_, 0.); + enableListener(); + + return false; + } + ); + } + +} + + void ControlSpotPanel::setDefaults(const rtengine::procparams::ProcParams * defParams, const ParamsEdited * pedited) { const int index = defParams->locallab.selspot; diff --git a/rtgui/controlspotpanel.h b/rtgui/controlspotpanel.h index e9eddf4e5..855f2d94a 100644 --- a/rtgui/controlspotpanel.h +++ b/rtgui/controlspotpanel.h @@ -55,7 +55,7 @@ public: bool isvisible; int prevMethod; // 0 = Normal, 1 = Excluding int shape; // 0 = Ellipse, 1 = Rectangle - int spotMethod; // 0 = Normal, 1 = Excluding + int spotMethod; // 0 = Normal, 1 = Excluding 2 = fullimage 3 = main int sensiexclu; int structexclu; int shapeMethod; // 0 = Independent (mouse), 1 = Symmetrical (mouse), 2 = Independent (mouse + sliders), 3 = Symmetrical (mouse + sliders) @@ -106,6 +106,7 @@ public: SpotDuplication = 4, SpotAllVisibilityChanged = 5 }; + IdleRegister idle_register; // Constructor and management functions /** @@ -220,6 +221,12 @@ public: // Batch mode management // Note: Batch mode is deactivated for Locallab + + /** + * upadte function to work with Preferences and spotMethod + */ + void updateguiset(int spottype, bool iscolor, bool issh, bool isvib, bool isexpos, bool issoft, bool isblur, bool istom, bool isret, bool issharp, bool iscont, bool iscbdl, bool islog, bool ismas, bool iscie); + void updateguiscopeset(int scope); private: // Cell renderer @@ -435,8 +442,12 @@ private: sigc::connection previewConn_; Gtk::Box* const ctboxshape; + Gtk::Box* const ctboxactivmethod; + Gtk::Box* const ctboxspotmethod; + Gtk::Box* const ctboxshapemethod; Gtk::Box* const ctboxgamut; + ToolParamBlock* const artifBox2; // Internal variables ControlPanelListener* controlPanelListener; diff --git a/rtgui/crop.cc b/rtgui/crop.cc index 21a32b653..0bbbdbf1f 100644 --- a/rtgui/crop.cc +++ b/rtgui/crop.cc @@ -176,12 +176,12 @@ Crop::Crop(): selectCrop = Gtk::manage (new Gtk::Button (M("TP_CROP_SELECTCROP"))); setExpandAlignProperties(selectCrop, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); selectCrop->get_style_context()->add_class("independent"); - selectCrop->set_image (*Gtk::manage (new RTImage ("crop-small.png"))); + selectCrop->set_image (*Gtk::manage (new RTImage ("crop-small", Gtk::ICON_SIZE_BUTTON))); resetCrop = Gtk::manage (new Gtk::Button (M("TP_CROP_RESETCROP"))); setExpandAlignProperties(resetCrop, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); resetCrop->get_style_context()->add_class("independent"); - resetCrop->set_image (*Gtk::manage (new RTImage ("undo-small.png"))); + resetCrop->set_image (*Gtk::manage (new RTImage ("undo-small", Gtk::ICON_SIZE_BUTTON))); methodgrid->attach (*xlab, 0, 0, 1, 1); methodgrid->attach (*x, 1, 0, 1, 1); @@ -594,11 +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); + fixr->set_active(true); int X = 0; int Y = 0; diff --git a/rtgui/cropwindow.cc b/rtgui/cropwindow.cc index ef2b7a52b..ddb38f16a 100644 --- a/rtgui/cropwindow.cc +++ b/rtgui/cropwindow.cc @@ -43,6 +43,32 @@ using namespace rtengine; +namespace { + inline double zoomLimitToFraction(Options::MaxZoom z) { + switch (z) { + case Options::MaxZoom::PERCENTS_100: + return 1.; + case Options::MaxZoom::PERCENTS_200: + return 2.; + case Options::MaxZoom::PERCENTS_300: + return 3.; + case Options::MaxZoom::PERCENTS_400: + return 4.; + case Options::MaxZoom::PERCENTS_500: + return 5.; + case Options::MaxZoom::PERCENTS_600: + return 6.; + case Options::MaxZoom::PERCENTS_700: + return 7.; + case Options::MaxZoom::PERCENTS_800: + return 8.; + case Options::MaxZoom::PERCENTS_1600: + default: + return 16.; + } + } +} + bool CropWindow::initialized = false; Glib::ustring CropWindow::zoomOuttt; @@ -62,9 +88,12 @@ CropWindow::CropWindow (ImageArea* parent, bool isLowUpdatePriority_, bool isDet initZoomSteps(); Glib::RefPtr context = parent->get_pango_context () ; - Pango::FontDescription fontd = context->get_font_description (); + Pango::FontDescription fontd = parent->get_style_context()->get_font(); fontd.set_weight (Pango::WEIGHT_BOLD); - fontd.set_size(8 * Pango::SCALE); + const int fontSize = 8; // pt + // Non-absolute size is defined in "Pango units" and shall be multiplied by + // Pango::SCALE from "pt": + fontd.set_size (fontSize * Pango::SCALE); context->set_font_description (fontd); Glib::RefPtr cllayout = parent->create_pango_layout("1000%"); @@ -80,11 +109,11 @@ CropWindow::CropWindow (ImageArea* parent, bool isLowUpdatePriority_, bool isDet closett = "Close"; initialized = true; } - bZoomOut = new LWButton(Cairo::RefPtr(new RTSurface("magnifier-minus-small.png")), 0, nullptr, LWButton::Left, LWButton::Center, &zoomOuttt); - bZoomIn = new LWButton(Cairo::RefPtr(new RTSurface("magnifier-plus-small.png")), 1, nullptr, LWButton::Left, LWButton::Center, &zoomIntt); - bZoom100 = new LWButton(Cairo::RefPtr(new RTSurface("magnifier-1to1-small.png")), 2, nullptr, LWButton::Left, LWButton::Center, &zoom100tt); - //bZoomFit = new LWButton (Cairo::RefPtr(new RTSurface("magnifier-fit.png")), 3, NULL, LWButton::Left, LWButton::Center, "Zoom Fit"); - bClose = new LWButton(Cairo::RefPtr(new RTSurface("cancel-small.png")), 4, nullptr, LWButton::Right, LWButton::Center, &closett); + bZoomOut = new LWButton(std::shared_ptr(new RTSurface("magnifier-minus-small", Gtk::ICON_SIZE_BUTTON)), 0, nullptr, LWButton::Left, LWButton::Center, &zoomOuttt); + bZoomIn = new LWButton(std::shared_ptr(new RTSurface("magnifier-plus-small", Gtk::ICON_SIZE_BUTTON)), 1, nullptr, LWButton::Left, LWButton::Center, &zoomIntt); + bZoom100 = new LWButton(std::shared_ptr(new RTSurface("magnifier-1to1-small", Gtk::ICON_SIZE_BUTTON)), 2, nullptr, LWButton::Left, LWButton::Center, &zoom100tt); + //bZoomFit = new LWButton (std::shared_ptr(new RTSurface("magnifier-fit", Gtk::ICON_SIZE_BUTTON)), 3, NULL, LWButton::Left, LWButton::Center, "Zoom Fit"); + bClose = new LWButton(std::shared_ptr(new RTSurface("cancel-small", Gtk::ICON_SIZE_BUTTON)), 4, nullptr, LWButton::Right, LWButton::Center, &closett); buttonSet.add (bZoomOut); buttonSet.add (bZoomIn); @@ -2284,13 +2313,18 @@ void CropWindow::updateHoveredPicker (rtengine::Coord *imgPos) } void CropWindow::changeZoom (int zoom, bool notify, int centerx, int centery, bool needsRedraw) { - if (zoom < 0) { zoom = 0; } else if (zoom > int(zoomSteps.size())-1) { zoom = int(zoomSteps.size())-1; } + // Limit zoom according to user preferences + double zoomLimit = zoomLimitToFraction(options.maxZoomLimit); + while(zoomSteps[zoom].zoom > zoomLimit && zoom != 0) { + --zoom; + } + cropZoom = zoom; cropLabel = zoomSteps[cropZoom].label; @@ -2449,9 +2483,12 @@ void CropWindow::drawDecoration (Cairo::RefPtr cr) int x = xpos, y = ypos; // prepare label Glib::RefPtr context = iarea->get_pango_context () ; - Pango::FontDescription fontd = context->get_font_description (); + Pango::FontDescription fontd = iarea->get_style_context()->get_font(); fontd.set_weight (Pango::WEIGHT_BOLD); - fontd.set_size(8 * Pango::SCALE); + const int fontSize = 8; // pt + // Non-absolute size is defined in "Pango units" and shall be multiplied by + // Pango::SCALE from "pt": + fontd.set_size (fontSize * Pango::SCALE); context->set_font_description (fontd); Glib::RefPtr cllayout = iarea->create_pango_layout(cropLabel); int iw, ih; @@ -2513,9 +2550,12 @@ void CropWindow::drawStraightenGuide (Cairo::RefPtr cr) } Glib::RefPtr context = iarea->get_pango_context () ; - Pango::FontDescription fontd = context->get_font_description (); + Pango::FontDescription fontd = iarea->get_style_context()->get_font(); fontd.set_weight (Pango::WEIGHT_BOLD); - fontd.set_size (8 * Pango::SCALE); + const int fontSize = 8; // pt + // Non-absolute size is defined in "Pango units" and shall be multiplied by + // Pango::SCALE from "pt": + fontd.set_size (fontSize * Pango::SCALE); context->set_font_description (fontd); Glib::RefPtr deglayout = iarea->create_pango_layout(Glib::ustring::compose ("%1 deg", Glib::ustring::format(std::setprecision(2), rot_deg))); diff --git a/rtgui/cursormanager.cc b/rtgui/cursormanager.cc index bc0e38c49..ae56b1361 100644 --- a/rtgui/cursormanager.cc +++ b/rtgui/cursormanager.cc @@ -17,8 +17,7 @@ * along with RawTherapee. If not, see . */ #include "cursormanager.h" - -#include "rtimage.h" +#include "rtsurface.h" CursorManager mainWindowCursorManager; CursorManager editWindowCursorManager; @@ -35,74 +34,50 @@ void CursorManager::init (Glib::RefPtr mainWindow) #endif - Glib::RefPtr add = RTImage::createPixbufFromFile("crosshair-hicontrast.png"); - Glib::RefPtr colPick = RTImage::createPixbufFromFile("color-picker-hicontrast.png"); - Glib::RefPtr colPickAdd = RTImage::createPixbufFromFile("color-picker-add-hicontrast.png"); - Glib::RefPtr cropDraw = RTImage::createPixbufFromFile("crop-point-hicontrast.png"); - Glib::RefPtr crosshair = RTImage::createPixbufFromFile("crosshair-hicontrast.png"); - Glib::RefPtr empty = RTImage::createPixbufFromFile("empty.png"); - Glib::RefPtr handClosed = RTImage::createPixbufFromFile("hand-closed-hicontrast.png"); - Glib::RefPtr handOpen = RTImage::createPixbufFromFile("hand-open-hicontrast.png"); - Glib::RefPtr moveBL = RTImage::createPixbufFromFile("node-move-sw-ne-hicontrast.png"); - Glib::RefPtr moveBR = RTImage::createPixbufFromFile("node-move-nw-se-hicontrast.png"); - Glib::RefPtr moveL = RTImage::createPixbufFromFile("node-move-x-hicontrast.png"); - Glib::RefPtr moveR = RTImage::createPixbufFromFile("node-move-x-hicontrast.png"); - Glib::RefPtr moveTL = RTImage::createPixbufFromFile("node-move-nw-se-hicontrast.png"); - Glib::RefPtr moveTR = RTImage::createPixbufFromFile("node-move-sw-ne-hicontrast.png"); - Glib::RefPtr moveX = RTImage::createPixbufFromFile("node-move-x-hicontrast.png"); - Glib::RefPtr moveXY = RTImage::createPixbufFromFile("node-move-xy-hicontrast.png"); - Glib::RefPtr moveY = RTImage::createPixbufFromFile("node-move-y-hicontrast.png"); - Glib::RefPtr rotate = RTImage::createPixbufFromFile("rotate-aroundnode-hicontrast.png"); - Glib::RefPtr wait = RTImage::createPixbufFromFile("gears.png"); // Currently unused, create *-hicontrast once used. + auto createCursor = [this] (const Glib::ustring &name, const Gdk::CursorType &fb_cursor, + const double offX = 0., const double offY = 0.) -> Glib::RefPtr + { + // Notes: + // - Gdk Cursor Theme is not supported on some OS (ex : MacOS). + // Cursor is retrieved from theme thanks to an RTSurface + // - By default, cursor hotspot is located at middle of surface. + // Use (offX, offY) between -1 and 0.99 to move cursor hotspot + auto cursor_surf = RTSurface(name, Gtk::ICON_SIZE_MENU); + auto cursor = Gdk::Cursor::create(this->display, + cursor_surf.get(), + std::min(std::max(cursor_surf.getWidth() / 2 * (1. + offX), 0.), static_cast(cursor_surf.getWidth())), + std::min(std::max(cursor_surf.getHeight() / 2 * (1. + offY), 0.), static_cast(cursor_surf.getHeight()))); - double s = RTScalable::getTweakedDPI() / RTScalable::baseDPI; // RTScalable::getDPI() might be preferable, however it imply a lot of work to support this option + if (!cursor) { + cursor = Gdk::Cursor::create(this->display, fb_cursor); + } - cAdd = add ? Gdk::Cursor::create(display, add, (int)(8.*s), (int)(8.*s)) : Gdk::Cursor::create(display, Gdk::PLUS); - cAddPicker = colPickAdd ? Gdk::Cursor::create(display, colPickAdd, (int)(4.*s), (int)(21.*s)) : Gdk::Cursor::create(display, Gdk::PLUS); - cCropDraw = cropDraw ? Gdk::Cursor::create(display, cropDraw, (int)(3.*s), (int)(3.*s)) : Gdk::Cursor::create(display, Gdk::DIAMOND_CROSS); - cCrosshair = crosshair ? Gdk::Cursor::create(display, crosshair, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::CROSSHAIR); - cEmpty = empty ? Gdk::Cursor::create(display, empty, 12, 12) /* PNG: do not scale */ : Gdk::Cursor::create(display, Gdk::BLANK_CURSOR); - cHandClosed = handClosed ? Gdk::Cursor::create(display, handClosed, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::HAND1); - cHandOpen = handOpen ? Gdk::Cursor::create(display, handOpen, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::HAND2); - cMoveBL = moveBL ? Gdk::Cursor::create(display, moveBL, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::BOTTOM_LEFT_CORNER); - cMoveBR = moveBR ? Gdk::Cursor::create(display, moveBR, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::BOTTOM_RIGHT_CORNER); - cMoveL = moveL ? Gdk::Cursor::create(display, moveL, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::SB_LEFT_ARROW); - cMoveR = moveR ? Gdk::Cursor::create(display, moveR, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::SB_RIGHT_ARROW); - cMoveTL = moveTL ? Gdk::Cursor::create(display, moveTL, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::TOP_LEFT_CORNER); - cMoveTR = moveTR ? Gdk::Cursor::create(display, moveTR, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::TOP_RIGHT_CORNER); - cMoveX = moveX ? Gdk::Cursor::create(display, moveX, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::SB_H_DOUBLE_ARROW); - cMoveXY = moveXY ? Gdk::Cursor::create(display, moveXY, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::FLEUR); - cMoveY = moveY ? Gdk::Cursor::create(display, moveY, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::SB_V_DOUBLE_ARROW); - cRotate = rotate ? Gdk::Cursor::create(display, rotate, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::EXCHANGE); - cWB = colPick ? Gdk::Cursor::create(display, colPick, (int)(4.*s), (int)(21.*s)) : Gdk::Cursor::create(display, Gdk::TARGET); - cWait = wait ? Gdk::Cursor::create(display, wait, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::CLOCK); + return cursor; + }; + + cAdd = createCursor("crosshair-hicontrast", Gdk::PLUS); + cAddPicker = createCursor("color-picker-add-hicontrast", Gdk::PLUS, -0.666, 0.75); + cCropDraw = createCursor("crop-point-hicontrast", Gdk::DIAMOND_CROSS, -0.75, 0.75); + cCrosshair = createCursor("crosshair-hicontrast", Gdk::CROSSHAIR); + cEmpty = createCursor("empty", Gdk::BLANK_CURSOR); + cHandClosed = createCursor("hand-closed-hicontrast", Gdk::HAND1); + cHandOpen = createCursor("hand-open-hicontrast", Gdk::HAND2); + cMoveBL = createCursor("node-move-sw-ne-hicontrast", Gdk::BOTTOM_LEFT_CORNER); + cMoveBR = createCursor("node-move-nw-se-hicontrast", Gdk::BOTTOM_RIGHT_CORNER); + cMoveL = createCursor("node-move-x-hicontrast", Gdk::SB_LEFT_ARROW); + cMoveR = createCursor("node-move-x-hicontrast", Gdk::SB_RIGHT_ARROW); + cMoveTL = createCursor("node-move-nw-se-hicontrast", Gdk::TOP_LEFT_CORNER); + cMoveTR = createCursor("node-move-sw-ne-hicontrast", Gdk::TOP_RIGHT_CORNER); + cMoveX = createCursor("node-move-x-hicontrast", Gdk::SB_H_DOUBLE_ARROW); + cMoveXY = createCursor("node-move-xy-hicontrast", Gdk::FLEUR); + cMoveY = createCursor("node-move-y-hicontrast", Gdk::SB_V_DOUBLE_ARROW); + cRotate = createCursor("rotate-aroundnode-hicontrast", Gdk::EXCHANGE); + cWB = createCursor("color-picker-hicontrast", Gdk::TARGET, -0.666, 0.75); + cWait = createCursor("gears", Gdk::CLOCK); window = mainWindow; } -void CursorManager::cleanup() -{ - cAdd.reset(); - cAddPicker.reset(); - cCropDraw.reset(); - cCrosshair.reset(); - cHandClosed.reset(); - cHandOpen.reset(); - cEmpty.reset(); - cMoveBL.reset(); - cMoveBR.reset(); - cMoveL.reset(); - cMoveR.reset(); - cMoveTL.reset(); - cMoveTR.reset(); - cMoveX.reset(); - cMoveY.reset(); - cMoveXY.reset(); - cRotate.reset(); - cWB.reset(); - cWait.reset(); -} - /* Set the cursor of the given window */ void CursorManager::setCursor (Glib::RefPtr window, CursorShape shape) { diff --git a/rtgui/cursormanager.h b/rtgui/cursormanager.h index 38f198e32..8b506bb1d 100644 --- a/rtgui/cursormanager.h +++ b/rtgui/cursormanager.h @@ -81,7 +81,6 @@ private: public: void init (Glib::RefPtr mainWindow); - void cleanup (); static void setWidgetCursor (Glib::RefPtr window, CursorShape shape); static void setCursorOfMainWindow (Glib::RefPtr window, CursorShape shape); }; diff --git a/rtgui/curveeditor.cc b/rtgui/curveeditor.cc index 67cea5174..efe2ef200 100644 --- a/rtgui/curveeditor.cc +++ b/rtgui/curveeditor.cc @@ -75,11 +75,11 @@ bool CurveEditor::reset() DiagonalCurveEditor::DiagonalCurveEditor (Glib::ustring text, CurveEditorGroup* ceGroup, CurveEditorSubGroup* ceSubGroup) : CurveEditor::CurveEditor(text, static_cast(ceGroup), ceSubGroup) { - curveType->addEntry("curve-linear-small.png", M("CURVEEDITOR_LINEAR")); // 0 Linear - curveType->addEntry("curve-spline-small.png", M("CURVEEDITOR_CUSTOM")); // 1 Spline - curveType->addEntry("curve-catmullrom-small.png", M("CURVEEDITOR_CATMULLROM")); // 4 CatmullRom - curveType->addEntry("curve-parametric-small.png", M("CURVEEDITOR_PARAMETRIC")); // 2 Parametric - curveType->addEntry("curve-nurbs-small.png", M("CURVEEDITOR_NURBS")); // 3 NURBS + curveType->addEntry("curve-linear-small", M("CURVEEDITOR_LINEAR")); // 0 Linear + curveType->addEntry("curve-spline-small", M("CURVEEDITOR_CUSTOM")); // 1 Spline + curveType->addEntry("curve-catmullrom-small", M("CURVEEDITOR_CATMULLROM")); // 4 CatmullRom + curveType->addEntry("curve-parametric-small", M("CURVEEDITOR_PARAMETRIC")); // 2 Parametric + curveType->addEntry("curve-nurbs-small", M("CURVEEDITOR_NURBS")); // 3 NURBS static_cast(curveType)->setPosIndexMap({ 0, 1, 4, 2, 3 }); curveType->setSelected(DCT_Linear); @@ -199,8 +199,8 @@ FlatCurveEditor::FlatCurveEditor (Glib::ustring text, CurveEditorGroup* ceGroup, identityValue = 0.5; // Order set in the same order than "enum FlatCurveType". Shouldn't change, for compatibility reason - curveType->addEntry("curve-flat-small.png", M("CURVEEDITOR_LINEAR")); // 0 Linear - curveType->addEntry("curve-controlpoints-small.png", M("CURVEEDITOR_MINMAXCPOINTS")); // 1 Min/Max ControlPoints + curveType->addEntry("curve-flat-small", M("CURVEEDITOR_LINEAR")); // 0 Linear + curveType->addEntry("curve-controlpoints-small", M("CURVEEDITOR_MINMAXCPOINTS")); // 1 Min/Max ControlPoints curveType->setSelected(FCT_Linear); curveType->show(); } diff --git a/rtgui/curveeditorgroup.cc b/rtgui/curveeditorgroup.cc index d099e1a99..5ce3765a2 100644 --- a/rtgui/curveeditorgroup.cc +++ b/rtgui/curveeditorgroup.cc @@ -28,6 +28,7 @@ #include "rtimage.h" #include "options.h" #include "pathutils.h" +#include "rtscalable.h" 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) @@ -39,9 +40,9 @@ CurveEditorGroup::CurveEditorGroup (Glib::ustring& curveDir, Glib::ustring group } 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()); + set_row_spacing(RTScalable::scalePixelSize(1)); } CurveEditorGroup::~CurveEditorGroup() @@ -129,7 +130,7 @@ void CurveEditorGroup::newLine() if (curveEditors.size() > numberOfPackedCurve) { Gtk::Grid* currLine = Gtk::manage (new Gtk::Grid ()); setExpandAlignProperties(currLine, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); - currLine->set_column_spacing(RTScalable::getScale()); + currLine->set_column_spacing(RTScalable::scalePixelSize(1)); bool isHeader = false; int x = 0; @@ -162,7 +163,7 @@ void CurveEditorGroup::newLine() if (isHeader) { curve_reset = Gtk::manage (new Gtk::Button ()); setExpandAlignProperties(curve_reset, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); - curve_reset->add (*Gtk::manage (new RTImage ("undo-small.png", "redo-small.png"))); + curve_reset->add (*Gtk::manage (new RTImage ("undo-small", Gtk::ICON_SIZE_BUTTON))); curve_reset->set_relief (Gtk::RELIEF_NONE); curve_reset->set_tooltip_text (M("CURVEEDITOR_TOOLTIPLINEAR")); curve_reset->signal_clicked().connect( sigc::mem_fun(*this, &CurveEditorGroup::curveResetPressed) ); @@ -381,7 +382,7 @@ void CurveEditorGroup::setTooltip( Glib::ustring ttip) void CurveEditorGroup::setBatchMode (bool batchMode) { for (std::vector::iterator i = curveEditors.begin(); i != curveEditors.end(); ++i) { - (*i)->curveType->addEntry("template-24.png", M("GENERAL_UNCHANGED")); + (*i)->curveType->addEntry("template-24", M("GENERAL_UNCHANGED")); (*i)->curveType->show(); } } @@ -441,7 +442,7 @@ void CurveEditorSubGroup::initButton (Gtk::Button &button, const Glib::ustring & vAlign = options.curvebboxpos == 0 || options.curvebboxpos == 2 ? Gtk::ALIGN_FILL : Gtk::ALIGN_END; } - button.add (*Gtk::manage (new RTImage (iconName))); + button.add (*Gtk::manage (new RTImage(iconName, Gtk::ICON_SIZE_LARGE_TOOLBAR))); button.get_style_context()->add_class(GTK_STYLE_CLASS_FLAT); if (!tooltip.empty()) { button.set_tooltip_text(M(tooltip)); diff --git a/rtgui/darkframe.cc b/rtgui/darkframe.cc index 83c7fe81c..648f96718 100644 --- a/rtgui/darkframe.cc +++ b/rtgui/darkframe.cc @@ -40,7 +40,7 @@ DarkFrame::DarkFrame () : FoldableToolPanel(this, TOOL_NAME, M("TP_DARKFRAME_LAB bindCurrentFolder (*darkFrameFile, options.lastDarkframeDir); dfLabel = Gtk::manage(new Gtk::Label(M("GENERAL_FILE"))); btnReset = Gtk::manage(new Gtk::Button()); - btnReset->set_image (*Gtk::manage(new RTImage ("cancel-small.png"))); + btnReset->set_image (*Gtk::manage(new RTImage ("cancel-small", Gtk::ICON_SIZE_BUTTON))); hbdf->pack_start(*dfLabel, Gtk::PACK_SHRINK, 0); hbdf->pack_start(*darkFrameFile); hbdf->pack_start(*btnReset, Gtk::PACK_SHRINK, 0); diff --git a/rtgui/diagonalcurveeditorsubgroup.cc b/rtgui/diagonalcurveeditorsubgroup.cc index f4fc8449e..88d9a14c5 100644 --- a/rtgui/diagonalcurveeditorsubgroup.cc +++ b/rtgui/diagonalcurveeditorsubgroup.cc @@ -85,18 +85,18 @@ DiagonalCurveEditorSubGroup::DiagonalCurveEditorSubGroup (CurveEditorGroup* prt, } editPointCustom = Gtk::manage (new Gtk::ToggleButton ()); - initButton(*editPointCustom, Glib::ustring("edit-point.png"), Gtk::ALIGN_START, false, "CURVEEDITOR_EDITPOINT_HINT"); + initButton(*editPointCustom, Glib::ustring("edit-point"), Gtk::ALIGN_START, false, "CURVEEDITOR_EDITPOINT_HINT"); editCustom = Gtk::manage (new Gtk::ToggleButton()); - initButton(*editCustom, Glib::ustring("crosshair-node-curve.png"), Gtk::ALIGN_START, false, "EDIT_PIPETTE_TOOLTIP"); + initButton(*editCustom, Glib::ustring("crosshair-node-curve"), Gtk::ALIGN_START, false, "EDIT_PIPETTE_TOOLTIP"); editCustom->hide(); copyCustom = Gtk::manage (new Gtk::Button ()); - initButton(*copyCustom, Glib::ustring("copy.png"), Gtk::ALIGN_END, true); + initButton(*copyCustom, Glib::ustring("copy"), Gtk::ALIGN_END, true); pasteCustom = Gtk::manage (new Gtk::Button ()); - initButton(*pasteCustom, Glib::ustring("paste.png"), Gtk::ALIGN_END, false); + initButton(*pasteCustom, Glib::ustring("paste"), Gtk::ALIGN_END, false); loadCustom = Gtk::manage (new Gtk::Button ()); - initButton(*loadCustom, Glib::ustring("folder-open.png"), Gtk::ALIGN_END, false); + initButton(*loadCustom, Glib::ustring("folder-open"), Gtk::ALIGN_END, false); saveCustom = Gtk::manage (new Gtk::Button ()); - initButton(*saveCustom, Glib::ustring("save.png"), Gtk::ALIGN_END, false); + initButton(*saveCustom, Glib::ustring("save"), Gtk::ALIGN_END, false); custombbox->attach_next_to(*editPointCustom, sideStart, 1, 1); custombbox->attach_next_to(*editCustom, sideStart, 1, 1); @@ -177,18 +177,18 @@ DiagonalCurveEditorSubGroup::DiagonalCurveEditorSubGroup (CurveEditorGroup* prt, } editPointNURBS = Gtk::manage (new Gtk::ToggleButton ()); - initButton(*editPointNURBS, Glib::ustring("edit-point.png"), Gtk::ALIGN_START, false, "CURVEEDITOR_EDITPOINT_HINT"); + initButton(*editPointNURBS, Glib::ustring("edit-point"), Gtk::ALIGN_START, false, "CURVEEDITOR_EDITPOINT_HINT"); editNURBS = Gtk::manage (new Gtk::ToggleButton()); - initButton(*editNURBS, Glib::ustring("crosshair-node-curve.png"), Gtk::ALIGN_START, false, "EDIT_PIPETTE_TOOLTIP"); + initButton(*editNURBS, Glib::ustring("crosshair-node-curve"), Gtk::ALIGN_START, false, "EDIT_PIPETTE_TOOLTIP"); editNURBS->hide(); copyNURBS = Gtk::manage (new Gtk::Button ()); - initButton(*copyNURBS, Glib::ustring("copy.png"), Gtk::ALIGN_END, true); + initButton(*copyNURBS, Glib::ustring("copy"), Gtk::ALIGN_END, true); pasteNURBS = Gtk::manage (new Gtk::Button ()); - initButton(*pasteNURBS, Glib::ustring("paste.png"), Gtk::ALIGN_END, false); + initButton(*pasteNURBS, Glib::ustring("paste"), Gtk::ALIGN_END, false); loadNURBS = Gtk::manage (new Gtk::Button ()); - initButton(*loadNURBS, Glib::ustring("folder-open.png"), Gtk::ALIGN_END, false); + initButton(*loadNURBS, Glib::ustring("folder-open"), Gtk::ALIGN_END, false); saveNURBS = Gtk::manage (new Gtk::Button ()); - initButton(*saveNURBS, Glib::ustring("save.png"), Gtk::ALIGN_END, false); + initButton(*saveNURBS, Glib::ustring("save"), Gtk::ALIGN_END, false); NURBSbbox->attach_next_to(*editPointNURBS, sideStart, 1, 1); NURBSbbox->attach_next_to(*editNURBS, sideStart, 1, 1); @@ -273,16 +273,16 @@ DiagonalCurveEditorSubGroup::DiagonalCurveEditorSubGroup (CurveEditorGroup* prt, paramCurveBox->attach_next_to(*shcSelector, *paramCurve, Gtk::POS_BOTTOM, 1, 1); editParam = Gtk::manage (new Gtk::ToggleButton()); - initButton(*editParam, Glib::ustring("crosshair-node-curve.png"), Gtk::ALIGN_START, false, "EDIT_PIPETTE_TOOLTIP"); + initButton(*editParam, Glib::ustring("crosshair-node-curve"), Gtk::ALIGN_START, false, "EDIT_PIPETTE_TOOLTIP"); editParam->hide(); copyParam = Gtk::manage (new Gtk::Button ()); - initButton(*copyParam, Glib::ustring("copy.png"), Gtk::ALIGN_END, true); + initButton(*copyParam, Glib::ustring("copy"), Gtk::ALIGN_END, true); pasteParam = Gtk::manage (new Gtk::Button ()); - initButton(*pasteParam, Glib::ustring("paste.png"), Gtk::ALIGN_END, false); + initButton(*pasteParam, Glib::ustring("paste"), Gtk::ALIGN_END, false); loadParam = Gtk::manage (new Gtk::Button ()); - initButton(*loadParam, Glib::ustring("folder-open.png"), Gtk::ALIGN_END, false); + initButton(*loadParam, Glib::ustring("folder-open"), Gtk::ALIGN_END, false); saveParam = Gtk::manage (new Gtk::Button ()); - initButton(*saveParam, Glib::ustring("save.png"), Gtk::ALIGN_END, false); + initButton(*saveParam, Glib::ustring("save"), Gtk::ALIGN_END, false); parambbox->attach_next_to(*editParam, sideStart, 1, 1); parambbox->attach_next_to(*copyParam, sideEnd, 1, 1); @@ -428,7 +428,6 @@ void DiagonalCurveEditorSubGroup::editModeSwitchedOff () prevState = editCustomConn.block(true); editCustom->set_active(false); customCurve->pipetteMouseOver(nullptr, nullptr, 0); - customCurve->setDirty(true); if (!prevState) { editCustomConn.block(false); @@ -437,7 +436,6 @@ void DiagonalCurveEditorSubGroup::editModeSwitchedOff () prevState = editNURBSConn.block(true); editNURBS->set_active(false); NURBSCurve->pipetteMouseOver(nullptr, nullptr, 0); - NURBSCurve->setDirty(true); if (!prevState) { editNURBSConn.block(false); @@ -446,7 +444,6 @@ void DiagonalCurveEditorSubGroup::editModeSwitchedOff () prevState = editParamConn.block(true); editParam->set_active(false); paramCurve->pipetteMouseOver(nullptr, nullptr, 0); - paramCurve->setDirty(true); if (!prevState) { editParamConn.block(false); @@ -461,12 +458,10 @@ void DiagonalCurveEditorSubGroup::pipetteMouseOver(EditDataProvider *provider, i case (DCT_Spline): case (DCT_CatumullRom): customCurve->pipetteMouseOver(curveEditor, provider, modifierKey); - customCurve->setDirty(true); break; case (DCT_Parametric): { paramCurve->pipetteMouseOver(curveEditor, provider, modifierKey); - paramCurve->setDirty(true); float pipetteVal = 0.f; editedAdjuster = nullptr; int n = 0; @@ -517,7 +512,6 @@ void DiagonalCurveEditorSubGroup::pipetteMouseOver(EditDataProvider *provider, i case (DCT_NURBS): NURBSCurve->pipetteMouseOver(curveEditor, provider, modifierKey); - NURBSCurve->setDirty(true); break; default: // (DCT_Linear, DCT_Unchanged) @@ -753,7 +747,6 @@ void DiagonalCurveEditorSubGroup::switchGUI() dCurve->paramCurveEd.at(3) ); - double s = (double)RTScalable::getScale(); highlights->setValue (dCurve->paramCurveEd.at(4)); highlights->setLabel(label[3]); lights->setValue (dCurve->paramCurveEd.at(5)); @@ -765,8 +758,8 @@ void DiagonalCurveEditorSubGroup::switchGUI() shcSelector->coloredBar.setColorProvider(barColorProvider, dCurve->getBottomBarCallerId()); shcSelector->coloredBar.setBgGradient(bgGradient); shcSelector->setMargins( - (int)( ((leftBar ? (double)CBAR_WIDTH + 2. + (double)CBAR_MARGIN + RADIUS : RADIUS) - 1.5) * s ), - (int)((RADIUS - 1.5) * s) + (int)( (leftBar ? (double)CBAR_WIDTH + 2. + (double)CBAR_MARGIN + RADIUS : RADIUS) - 1.5 ), + (int)( RADIUS - 1.5 ) ); paramCurve->setColoredBar(leftBar, nullptr); paramCurve->queue_resize_no_redraw(); @@ -895,11 +888,9 @@ void DiagonalCurveEditorSubGroup::loadPressed () if (p[0] == (double)(DCT_Spline) || p[0] == (double)(DCT_CatumullRom)) { customCurve->setPoints (p); - customCurve->queue_draw (); customCurve->notifyListener (); } else if (p[0] == (double)(DCT_NURBS)) { NURBSCurve->setPoints (p); - NURBSCurve->queue_draw (); NURBSCurve->notifyListener (); } else if (p[0] == (double)(DCT_Parametric)) { shcSelector->setPositions ( p[1], p[2], p[3] ); @@ -908,7 +899,6 @@ void DiagonalCurveEditorSubGroup::loadPressed () darks->setValue (p[6]); shadows->setValue (p[7]); paramCurve->setPoints (p); - paramCurve->queue_draw (); paramCurve->notifyListener (); } } @@ -966,7 +956,6 @@ void DiagonalCurveEditorSubGroup::pastePressed () case DCT_Spline: // custom case DCT_CatumullRom: customCurve->setPoints (curve); - customCurve->queue_draw (); customCurve->notifyListener (); break; @@ -981,13 +970,11 @@ void DiagonalCurveEditorSubGroup::pastePressed () darks->setValue (curve[6]); shadows->setValue (curve[7]); paramCurve->setPoints (curve); - paramCurve->queue_draw (); paramCurve->notifyListener (); break; case DCT_NURBS: // NURBS NURBSCurve->setPoints (curve); - NURBSCurve->queue_draw (); NURBSCurve->notifyListener (); break; diff --git a/rtgui/dirbrowser.cc b/rtgui/dirbrowser.cc index 925fdc606..6ebbb26b4 100644 --- a/rtgui/dirbrowser.cc +++ b/rtgui/dirbrowser.cc @@ -28,7 +28,7 @@ #endif #include "guiutils.h" -#include "rtimage.h" +#include "rtsurface.h" #include "multilangmgr.h" #include "options.h" @@ -86,6 +86,15 @@ std::vector listSubDirs (const Glib::RefPtr& dir, bool DirBrowser::DirBrowser () : dirTreeModel(), dtColumns(), tvc(M("DIRBROWSER_FOLDERS")), + + openfolder("folder-open-small"), + closedfolder("folder-closed-small"), + icdrom("device-optical"), + ifloppy("device-floppy"), + ihdd("device-hdd"), + inetwork("device-network"), + iremovable("device-usb"), + expandSuccess(false) #ifdef _WIN32 , volumes(0) @@ -120,15 +129,6 @@ DirBrowser::~DirBrowser() void DirBrowser::fillDirTree () { - - openfolder = RTImage::createPixbufFromFile ("folder-open-small.png"); - closedfolder = RTImage::createPixbufFromFile ("folder-closed-small.png"); - icdrom = RTImage::createPixbufFromFile ("device-optical.png"); - ifloppy = RTImage::createPixbufFromFile ("device-floppy.png"); - ihdd = RTImage::createPixbufFromFile ("device-hdd.png"); - iremovable = RTImage::createPixbufFromFile ("device-usb.png"); - inetwork = RTImage::createPixbufFromFile ("device-network.png"); - //Create the Tree model: dirTreeModel = Gtk::TreeStore::create(dtColumns); dirtree->set_model (dirTreeModel); @@ -136,10 +136,9 @@ void DirBrowser::fillDirTree () fillRoot (); Gtk::CellRendererPixbuf* render_pb = Gtk::manage ( new Gtk::CellRendererPixbuf () ); + render_pb->property_stock_size() = Gtk::ICON_SIZE_SMALL_TOOLBAR; tvc.pack_start (*render_pb, false); - tvc.add_attribute(*render_pb, "pixbuf-expander-closed", dtColumns.icon2); - tvc.add_attribute(*render_pb, "pixbuf", dtColumns.icon2); - tvc.add_attribute(*render_pb, "pixbuf-expander-open", dtColumns.icon1); + tvc.add_attribute(*render_pb, "icon-name", dtColumns.icon_name); tvc.pack_start (crt); tvc.add_attribute(crt, "text", dtColumns.filename); @@ -156,6 +155,7 @@ void DirBrowser::fillDirTree () render_pb->property_ypad() = 0; dirtree->signal_row_expanded().connect(sigc::mem_fun(*this, &DirBrowser::row_expanded)); + dirtree->signal_row_collapsed().connect(sigc::mem_fun(*this, &DirBrowser::row_collapsed)); dirtree->signal_row_activated().connect(sigc::mem_fun(*this, &DirBrowser::row_activated)); dirTreeModel->signal_sort_column_changed().connect(sigc::mem_fun(*this, &DirBrowser::on_sort_column_changed)); } @@ -175,22 +175,17 @@ void DirBrowser::addRoot (char letter) int type = GetDriveType (volume); if (type == DRIVE_CDROM) { - root->set_value (0, icdrom); - root->set_value (1, icdrom); + root->set_value (dtColumns.icon_name, icdrom); } else if (type == DRIVE_REMOVABLE) { if (letter - 'A' < 2) { - root->set_value (0, ifloppy); - root->set_value (1, ifloppy); + root->set_value (dtColumns.icon_name, ifloppy); } else { - root->set_value (0, iremovable); - root->set_value (1, iremovable); + root->set_value (dtColumns.icon_name, iremovable); } } else if (type == DRIVE_REMOTE) { - root->set_value (0, inetwork); - root->set_value (1, inetwork); + root->set_value (dtColumns.icon_name, inetwork); } else if (type == DRIVE_FIXED) { - root->set_value (0, ihdd); - root->set_value (1, ihdd); + root->set_value (dtColumns.icon_name, ihdd); } Gtk::TreeModel::iterator child = dirTreeModel->append (root->children()); @@ -319,11 +314,24 @@ void DirBrowser::row_expanded (const Gtk::TreeModel::iterator& iter, const Gtk:: expandSuccess = true; + // Update row icon (only if row icon is not a volume one or is empty) + if (iter->get_value(dtColumns.icon_name) == closedfolder || iter->get_value(dtColumns.icon_name) == "") { + iter->set_value(dtColumns.icon_name, openfolder); + } + 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())); } +void DirBrowser::row_collapsed (const Gtk::TreeModel::iterator& iter, const Gtk::TreeModel::Path& path) +{ + // Update row icon (only if row icon is not a volume one) + if (iter->get_value(dtColumns.icon_name) == openfolder) { + iter->set_value(dtColumns.icon_name, closedfolder); + } +} + void DirBrowser::updateDir (const Gtk::TreeModel::iterator& iter) { @@ -366,8 +374,7 @@ void DirBrowser::addDir (const Gtk::TreeModel::iterator& iter, const Glib::ustri Gtk::TreeModel::iterator child = dirTreeModel->append(iter->children()); child->set_value (dtColumns.filename, dirname); - child->set_value (dtColumns.icon1, openfolder); - child->set_value (dtColumns.icon2, closedfolder); + child->set_value (dtColumns.icon_name, closedfolder); Glib::ustring fullname = Glib::build_filename (iter->get_value (dtColumns.dirname), dirname); child->set_value (dtColumns.dirname, fullname); Gtk::TreeModel::iterator fooRow = dirTreeModel->append(child->children()); diff --git a/rtgui/dirbrowser.h b/rtgui/dirbrowser.h index 5d98c82ae..f5c05e30d 100644 --- a/rtgui/dirbrowser.h +++ b/rtgui/dirbrowser.h @@ -35,15 +35,13 @@ private: struct DirTreeColumns : public Gtk::TreeModelColumnRecord { public: Gtk::TreeModelColumn filename; - Gtk::TreeModelColumn > icon1; - Gtk::TreeModelColumn > icon2; + Gtk::TreeModelColumn icon_name; Gtk::TreeModelColumn dirname; Gtk::TreeModelColumn > monitor; DirTreeColumns() { - add(icon1); - add(icon2); + add(icon_name); add(filename); add(dirname); add(monitor); @@ -53,7 +51,6 @@ private: DirTreeColumns dtColumns; Gtk::TreeViewColumn tvc; Gtk::CellRendererText crt; - Gtk::CellRendererPixbuf crb; Gtk::TreeView *dirtree; @@ -62,13 +59,13 @@ private: void fillRoot (); - Glib::RefPtr openfolder; - Glib::RefPtr closedfolder; - Glib::RefPtr icdrom; - Glib::RefPtr ifloppy; - Glib::RefPtr ihdd; - Glib::RefPtr inetwork; - Glib::RefPtr iremovable; + Glib::ustring openfolder; + Glib::ustring closedfolder; + Glib::ustring icdrom; + Glib::ustring ifloppy; + Glib::ustring ihdd; + Glib::ustring inetwork; + Glib::ustring iremovable; bool expandSuccess; @@ -94,6 +91,7 @@ public: void fillDirTree (); void on_sort_column_changed() const; void row_expanded (const Gtk::TreeModel::iterator& iter, const Gtk::TreeModel::Path& path); + void row_collapsed (const Gtk::TreeModel::iterator& iter, const Gtk::TreeModel::Path& path); void row_activated (const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* column); void file_changed (const Glib::RefPtr& file, const Glib::RefPtr& other_file, Gio::FileMonitorEvent event_type, const Gtk::TreeModel::iterator& iter, const Glib::ustring& dirName); void open (const Glib::ustring& dirName, const Glib::ustring& fileName = ""); // goes to dir "dirName" and selects file "fileName" diff --git a/rtgui/dirpyrdenoise.cc b/rtgui/dirpyrdenoise.cc index 4e487b184..e1200ac20 100644 --- a/rtgui/dirpyrdenoise.cc +++ b/rtgui/dirpyrdenoise.cc @@ -69,7 +69,7 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, TOOL_NAME, M("TP_DIRPY Lmethodconn = Lmethod->signal_changed().connect ( sigc::mem_fun(*this, &DirPyrDenoise::LmethodChanged) ); luma = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING"), 0, 100, 0.01, 0)); - Ldetail = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_LUMINANCE_DETAIL"), 0, 100, 0.01, 50)); + Ldetail = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_LUMINANCE_DETAIL"), 0, 100, 0.01, 0)); NoiscurveEditorG = new CurveEditorGroup (options.lastDenoiseCurvesDir, M("TP_DIRPYRDENOISE_LUMINANCE_CURVE")); //curveEditorG = new CurveEditorGroup (options.lastLabCurvesDir); NoiscurveEditorG->setCurveListener (this); diff --git a/rtgui/distortion.cc b/rtgui/distortion.cc index a5138eb99..083c2f03a 100644 --- a/rtgui/distortion.cc +++ b/rtgui/distortion.cc @@ -34,7 +34,7 @@ Distortion::Distortion (): FoldableToolPanel(this, TOOL_NAME, M("TP_DISTORTION_L rlistener = nullptr; autoDistor = Gtk::manage (new Gtk::Button (M("GENERAL_AUTO"))); - autoDistor->set_image (*Gtk::manage (new RTImage ("distortion-auto-small.png"))); + autoDistor->set_image (*Gtk::manage (new RTImage ("distortion-auto-small", Gtk::ICON_SIZE_BUTTON))); autoDistor->get_style_context()->add_class("independent"); autoDistor->set_alignment(0.5f, 0.5f); autoDistor->set_tooltip_text (M("TP_DISTORTION_AUTO_TOOLTIP")); @@ -42,14 +42,14 @@ Distortion::Distortion (): FoldableToolPanel(this, TOOL_NAME, M("TP_DISTORTION_L autoDistor->show(); pack_start (*autoDistor); - Gtk::Image* idistL = Gtk::manage (new RTImage ("distortion-pincushion-small.png")); - Gtk::Image* idistR = Gtk::manage (new RTImage ("distortion-barrel-small.png")); + Gtk::Image* idistL = Gtk::manage (new RTImage ("distortion-pincushion-small")); + Gtk::Image* idistR = Gtk::manage (new RTImage ("distortion-barrel-small")); distor = Gtk::manage (new Adjuster (M("TP_DISTORTION_AMOUNT"), -0.5, 0.5, 0.001, 0, idistL, idistR)); distor->setAdjusterListener (this); distor->setLogScale(2, 0); - + distor->show(); pack_start (*distor); } diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 81efccccd..b03dab5e8 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -418,9 +418,9 @@ private: void prepareIntentBox () { // same order as the enum - intentBox.addEntry ("intent-perceptual.png", M ("PREFERENCES_INTENT_PERCEPTUAL")); - intentBox.addEntry ("intent-relative.png", M ("PREFERENCES_INTENT_RELATIVE")); - intentBox.addEntry ("intent-absolute.png", M ("PREFERENCES_INTENT_ABSOLUTE")); + intentBox.addEntry ("intent-perceptual", M ("PREFERENCES_INTENT_PERCEPTUAL")); + intentBox.addEntry ("intent-relative", M ("PREFERENCES_INTENT_RELATIVE")); + intentBox.addEntry ("intent-absolute", M ("PREFERENCES_INTENT_ABSOLUTE")); setExpandAlignProperties (intentBox.buttonGroup, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); intentBox.setSelected (1); @@ -429,7 +429,7 @@ private: void prepareSoftProofingBox () { - Gtk::Image *softProofImage = Gtk::manage (new RTImage ("gamut-softproof.png")); + Gtk::Image *softProofImage = Gtk::manage (new RTImage ("gamut-softproof", Gtk::ICON_SIZE_LARGE_TOOLBAR)); softProofImage->set_padding (0, 0); softProof.add (*softProofImage); softProof.set_relief (Gtk::RELIEF_NONE); @@ -438,7 +438,7 @@ private: softProof.set_active (false); softProof.show (); - Gtk::Image *spGamutCheckImage = Gtk::manage (new RTImage ("gamut-warning.png")); + Gtk::Image *spGamutCheckImage = Gtk::manage (new RTImage ("gamut-warning", Gtk::ICON_SIZE_LARGE_TOOLBAR)); spGamutCheckImage->set_padding (0, 0); spGamutCheck.add (*spGamutCheckImage); spGamutCheck.set_relief (Gtk::RELIEF_NONE); @@ -744,7 +744,7 @@ EditorPanel::EditorPanel (FilePanel* filePanel) //leftsubpaned->pack_start (*ppframe, Gtk::PACK_SHRINK, 4); navigator = Gtk::manage(new Navigator()); - navigator->previewWindow->set_size_request(-1, 150 * RTScalable::getScale()); + navigator->previewWindow->set_size_request(-1, RTScalable::scalePixelSize(150)); leftsubpaned->pack1(*navigator, false, false); history = Gtk::manage(new History()); @@ -760,19 +760,19 @@ EditorPanel::EditorPanel (FilePanel* filePanel) Gtk::Box* editbox = Gtk::manage (new Gtk::Box (Gtk::ORIENTATION_VERTICAL)); info = Gtk::manage (new Gtk::ToggleButton ()); - Gtk::Image* infoimg = Gtk::manage (new RTImage ("info.png")); + Gtk::Image* infoimg = Gtk::manage (new RTImage ("info", Gtk::ICON_SIZE_LARGE_TOOLBAR)); info->add (*infoimg); info->set_relief (Gtk::RELIEF_NONE); info->set_tooltip_markup (M ("MAIN_TOOLTIP_QINFO")); beforeAfter = Gtk::manage (new Gtk::ToggleButton ()); - Gtk::Image* beforeAfterIcon = Gtk::manage (new RTImage ("beforeafter.png")); + Gtk::Image* beforeAfterIcon = Gtk::manage (new RTImage ("beforeafter", Gtk::ICON_SIZE_LARGE_TOOLBAR)); beforeAfter->add (*beforeAfterIcon); beforeAfter->set_relief (Gtk::RELIEF_NONE); beforeAfter->set_tooltip_markup (M ("MAIN_TOOLTIP_TOGGLE")); - iBeforeLockON = new RTImage ("padlock-locked-small.png"); - iBeforeLockOFF = new RTImage ("padlock-unlocked-small.png"); + iBeforeLockON = new RTImage ("padlock-locked-small", Gtk::ICON_SIZE_LARGE_TOOLBAR); + iBeforeLockOFF = new RTImage ("padlock-unlocked-small", Gtk::ICON_SIZE_LARGE_TOOLBAR); Gtk::Separator* vsept = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)); Gtk::Separator* vsepz = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)); @@ -781,8 +781,8 @@ EditorPanel::EditorPanel (FilePanel* filePanel) hidehp = Gtk::manage (new Gtk::ToggleButton ()); - iHistoryShow = new RTImage ("panel-to-right.png"); - iHistoryHide = new RTImage ("panel-to-left.png"); + iHistoryShow = new RTImage ("panel-to-right", Gtk::ICON_SIZE_LARGE_TOOLBAR); + iHistoryHide = new RTImage ("panel-to-left", Gtk::ICON_SIZE_LARGE_TOOLBAR); hidehp->set_relief (Gtk::RELIEF_NONE); hidehp->set_active (options.showHistory); @@ -798,8 +798,8 @@ EditorPanel::EditorPanel (FilePanel* filePanel) if (!simpleEditor && filePanel) { tbTopPanel_1 = new Gtk::ToggleButton (); - iTopPanel_1_Show = new RTImage ("panel-to-bottom.png"); - iTopPanel_1_Hide = new RTImage ("panel-to-top.png"); + iTopPanel_1_Show = new RTImage ("panel-to-bottom", Gtk::ICON_SIZE_LARGE_TOOLBAR); + iTopPanel_1_Hide = new RTImage ("panel-to-top", Gtk::ICON_SIZE_LARGE_TOOLBAR); tbTopPanel_1->set_relief (Gtk::RELIEF_NONE); tbTopPanel_1->set_active (true); tbTopPanel_1->set_tooltip_markup (M ("MAIN_TOOLTIP_SHOWHIDETP1")); @@ -816,7 +816,7 @@ EditorPanel::EditorPanel (FilePanel* filePanel) // Histogram profile toggle controls toggleHistogramProfile = Gtk::manage (new Gtk::ToggleButton ()); - Gtk::Image* histProfImg = Gtk::manage (new RTImage ("gamut-hist.png")); + Gtk::Image* histProfImg = Gtk::manage (new RTImage ("gamut-hist", Gtk::ICON_SIZE_LARGE_TOOLBAR)); toggleHistogramProfile->add (*histProfImg); toggleHistogramProfile->set_relief (Gtk::RELIEF_NONE); toggleHistogramProfile->set_active (options.rtSettings.HistogramWorking); @@ -889,14 +889,14 @@ EditorPanel::EditorPanel (FilePanel* filePanel) iops->set_row_spacing (2); iops->set_column_spacing (2); - Gtk::Image *saveButtonImage = Gtk::manage (new RTImage ("save.png")); + Gtk::Image *saveButtonImage = Gtk::manage (new RTImage ("save", Gtk::ICON_SIZE_LARGE_TOOLBAR)); saveimgas = Gtk::manage (new Gtk::Button ()); saveimgas->set_relief(Gtk::RELIEF_NONE); saveimgas->add (*saveButtonImage); saveimgas->set_tooltip_markup (M ("MAIN_BUTTON_SAVE_TOOLTIP")); setExpandAlignProperties (saveimgas, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); - Gtk::Image *queueButtonImage = Gtk::manage (new RTImage ("gears.png")); + Gtk::Image *queueButtonImage = Gtk::manage (new RTImage ("gears", Gtk::ICON_SIZE_LARGE_TOOLBAR)); queueimg = Gtk::manage (new Gtk::Button ()); queueimg->set_relief(Gtk::RELIEF_NONE); queueimg->add (*queueButtonImage); @@ -905,7 +905,7 @@ EditorPanel::EditorPanel (FilePanel* filePanel) send_to_external = Gtk::manage(new PopUpButton("", false)); send_to_external->set_tooltip_text(M("MAIN_BUTTON_SENDTOEDITOR_TOOLTIP")); - send_to_external->setEmptyImage("palette-brush.png"); + send_to_external->setEmptyImage("palette-brush"); setExpandAlignProperties(send_to_external->buttonGroup, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); updateExternalEditorWidget( options.externalEditorIndex >= 0 ? options.externalEditorIndex : options.externalEditors.size(), @@ -921,8 +921,8 @@ EditorPanel::EditorPanel (FilePanel* filePanel) // tbRightPanel_1 tbRightPanel_1 = Gtk::manage(new Gtk::ToggleButton()); - iRightPanel_1_Show = new RTImage ("panel-to-left.png"); - iRightPanel_1_Hide = new RTImage ("panel-to-right.png"); + iRightPanel_1_Show = new RTImage ("panel-to-left", Gtk::ICON_SIZE_LARGE_TOOLBAR); + iRightPanel_1_Hide = new RTImage ("panel-to-right", Gtk::ICON_SIZE_LARGE_TOOLBAR); tbRightPanel_1->set_relief (Gtk::RELIEF_NONE); tbRightPanel_1->set_active (true); tbRightPanel_1->set_tooltip_markup (M ("MAIN_TOOLTIP_SHOWHIDERP1")); @@ -931,8 +931,8 @@ EditorPanel::EditorPanel (FilePanel* filePanel) // ShowHideSidePanels tbShowHideSidePanels = Gtk::manage(new Gtk::ToggleButton()); - iShowHideSidePanels = new RTImage ("crossed-arrows-out.png"); - iShowHideSidePanels_exit = new RTImage ("crossed-arrows-in.png"); + iShowHideSidePanels = new RTImage ("crossed-arrows-out", Gtk::ICON_SIZE_LARGE_TOOLBAR); + iShowHideSidePanels_exit = new RTImage ("crossed-arrows-in", Gtk::ICON_SIZE_LARGE_TOOLBAR); tbShowHideSidePanels->set_relief (Gtk::RELIEF_NONE); tbShowHideSidePanels->set_active (false); tbShowHideSidePanels->set_tooltip_markup (M ("MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP")); @@ -943,7 +943,7 @@ EditorPanel::EditorPanel (FilePanel* filePanel) if (!simpleEditor && !options.tabbedUI) { // Navigation buttons - Gtk::Image *navPrevImage = Gtk::manage (new RTImage ("arrow2-left.png")); + Gtk::Image *navPrevImage = Gtk::manage (new RTImage ("arrow2-left", Gtk::ICON_SIZE_LARGE_TOOLBAR)); navPrevImage->set_padding (0, 0); navPrev = Gtk::manage (new Gtk::Button ()); navPrev->add (*navPrevImage); @@ -951,7 +951,7 @@ EditorPanel::EditorPanel (FilePanel* filePanel) navPrev->set_tooltip_markup (M ("MAIN_BUTTON_NAVPREV_TOOLTIP")); setExpandAlignProperties (navPrev, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); - Gtk::Image *navNextImage = Gtk::manage (new RTImage ("arrow2-right.png")); + Gtk::Image *navNextImage = Gtk::manage (new RTImage ("arrow2-right", Gtk::ICON_SIZE_LARGE_TOOLBAR)); navNextImage->set_padding (0, 0); navNext = Gtk::manage (new Gtk::Button ()); navNext->add (*navNextImage); @@ -959,7 +959,7 @@ EditorPanel::EditorPanel (FilePanel* filePanel) navNext->set_tooltip_markup (M ("MAIN_BUTTON_NAVNEXT_TOOLTIP")); setExpandAlignProperties (navNext, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); - Gtk::Image *navSyncImage = Gtk::manage (new RTImage ("arrow-updown.png")); + Gtk::Image *navSyncImage = Gtk::manage (new RTImage ("arrow-updown", Gtk::ICON_SIZE_LARGE_TOOLBAR)); navSyncImage->set_padding (0, 0); navSync = Gtk::manage (new Gtk::Button ()); navSync->add (*navSyncImage); @@ -2792,11 +2792,12 @@ void EditorPanel::updateExternalEditorWidget(int selectedIndex, const std::vecto 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->insertEntry(i, "palette-brush", name, &send_to_external_radio_group); } } + #ifndef __APPLE__ - send_to_external->addEntry("palette-brush.png", M("GENERAL_OTHER"), &send_to_external_radio_group); + send_to_external->addEntry("palette-brush", M("GENERAL_OTHER"), &send_to_external_radio_group); #endif send_to_external->set_sensitive(send_to_external->getEntryCount()); send_to_external->setSelected(selectedIndex); diff --git a/rtgui/editwidgets.cc b/rtgui/editwidgets.cc index 7ae874673..0b765caef 100644 --- a/rtgui/editwidgets.cc +++ b/rtgui/editwidgets.cc @@ -989,11 +989,11 @@ void OPIcon::drivenPointToRectangle(const rtengine::Coord &pos, bottomRight.y = topLeft.y + H - 1; } -OPIcon::OPIcon(const Cairo::RefPtr &normal, - const Cairo::RefPtr &active, - const Cairo::RefPtr &prelight, - const Cairo::RefPtr &dragged, - const Cairo::RefPtr &insensitive, +OPIcon::OPIcon(const std::shared_ptr &normal, + const std::shared_ptr &active, + const std::shared_ptr &prelight, + const std::shared_ptr &dragged, + const std::shared_ptr&insensitive, DrivenPoint drivenPoint) : drivenPoint(drivenPoint) { @@ -1022,48 +1022,48 @@ OPIcon::OPIcon(Glib::ustring normalImage, Glib::ustring activeImage, Glib::ustri Glib::ustring draggedImage, Glib::ustring insensitiveImage, DrivenPoint drivenPoint) : drivenPoint(drivenPoint) { if (!normalImage.empty()) { - normalImg = Cairo::RefPtr(new RTSurface(normalImage)); + normalImg = std::shared_ptr(new RTSurface(normalImage, Gtk::ICON_SIZE_MENU)); } if (!prelightImage.empty()) { - prelightImg = Cairo::RefPtr(new RTSurface(prelightImage)); + prelightImg = std::shared_ptr(new RTSurface(prelightImage, Gtk::ICON_SIZE_MENU)); } if (!activeImage.empty()) { - activeImg = Cairo::RefPtr(new RTSurface(activeImage)); + activeImg = std::shared_ptr(new RTSurface(activeImage, Gtk::ICON_SIZE_MENU)); } if (!draggedImage.empty()) { - draggedImg = Cairo::RefPtr(new RTSurface(draggedImage)); + draggedImg = std::shared_ptr(new RTSurface(draggedImage, Gtk::ICON_SIZE_MENU)); } if (!insensitiveImage.empty()) { - insensitiveImg = Cairo::RefPtr(new RTSurface(insensitiveImage)); + insensitiveImg = std::shared_ptr(new RTSurface(insensitiveImage, Gtk::ICON_SIZE_MENU)); } } -const Cairo::RefPtr OPIcon::getNormalImg() +const std::shared_ptr OPIcon::getNormalImg() { return normalImg; } -const Cairo::RefPtr OPIcon::getPrelightImg() +const std::shared_ptr OPIcon::getPrelightImg() { return prelightImg; } -const Cairo::RefPtr OPIcon::getActiveImg() +const std::shared_ptr OPIcon::getActiveImg() { return activeImg; } -const Cairo::RefPtr OPIcon::getDraggedImg() +const std::shared_ptr OPIcon::getDraggedImg() { return draggedImg; } -const Cairo::RefPtr OPIcon::getInsensitiveImg() +const std::shared_ptr OPIcon::getInsensitiveImg() { return insensitiveImg; } -void OPIcon::drawImage(Cairo::RefPtr &img, +void OPIcon::drawImage(std::shared_ptr &img, Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) { @@ -1089,7 +1089,7 @@ void OPIcon::drawImage(Cairo::RefPtr &img, cr->fill(); } -void OPIcon::drawMOImage(Cairo::RefPtr &img, Cairo::RefPtr &cr, +void OPIcon::drawMOImage(std::shared_ptr &img, Cairo::RefPtr &cr, unsigned short id, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) { // test of F_HOVERABLE has already been done diff --git a/rtgui/editwidgets.h b/rtgui/editwidgets.h index f1cdcf87f..b22ba175e 100644 --- a/rtgui/editwidgets.h +++ b/rtgui/editwidgets.h @@ -354,34 +354,32 @@ class OPIcon : public Geometry // OP stands for "On Preview" { private: - Cairo::RefPtr normalImg; - Cairo::RefPtr prelightImg; - Cairo::RefPtr activeImg; - Cairo::RefPtr draggedImg; - Cairo::RefPtr insensitiveImg; + std::shared_ptr normalImg; + std::shared_ptr prelightImg; + std::shared_ptr activeImg; + std::shared_ptr draggedImg; + std::shared_ptr insensitiveImg; - static void updateImages(); - void changeImage(Glib::ustring &newImage); - void drawImage (Cairo::RefPtr &img, Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); - void drawMOImage (Cairo::RefPtr &img, Cairo::RefPtr &cr, unsigned short id, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); + void drawImage (std::shared_ptr &img, Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); + void drawMOImage (std::shared_ptr &img, Cairo::RefPtr &cr, unsigned short id, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); void drivenPointToRectangle(const rtengine::Coord &pos, rtengine::Coord &topLeft, rtengine::Coord &bottomRight, int W, int H); public: DrivenPoint drivenPoint; rtengine::Coord position; - OPIcon (const Cairo::RefPtr &normal, - const Cairo::RefPtr &active, - const Cairo::RefPtr &prelight = {}, - const Cairo::RefPtr &dragged = {}, - const Cairo::RefPtr &insensitive = {}, + OPIcon (const std::shared_ptr &normal, + const std::shared_ptr &active, + const std::shared_ptr &prelight = nullptr, + const std::shared_ptr &dragged = nullptr, + const std::shared_ptr &insensitive = nullptr, DrivenPoint drivenPoint = DP_CENTERCENTER); OPIcon (Glib::ustring normalImage, Glib::ustring activeImage, Glib::ustring prelightImage = "", Glib::ustring draggedImage = "", Glib::ustring insensitiveImage = "", DrivenPoint drivenPoint = DP_CENTERCENTER); - const Cairo::RefPtr getNormalImg(); - const Cairo::RefPtr getPrelightImg(); - const Cairo::RefPtr getActiveImg(); - const Cairo::RefPtr getDraggedImg(); - const Cairo::RefPtr getInsensitiveImg(); + const std::shared_ptr getNormalImg(); + const std::shared_ptr getPrelightImg(); + const std::shared_ptr getActiveImg(); + const std::shared_ptr getDraggedImg(); + const std::shared_ptr getInsensitiveImg(); 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; diff --git a/rtgui/editwindow.cc b/rtgui/editwindow.cc index 3184c21c4..d2ea0f8a2 100644 --- a/rtgui/editwindow.cc +++ b/rtgui/editwindow.cc @@ -57,15 +57,16 @@ EditWindow* EditWindow::getInstance(RTWindow* p) } EditWindow::EditWindow (RTWindow* p) - : resolution(RTScalable::baseDPI) - , parent(p) + : parent(p) , isFullscreen(false) , isClosed(true) , isMinimized(false) { + // For UNIX system, set app icon +#ifndef _WIN32 + set_default_icon_name("rawtherapee"); +#endif - updateResolution(); - setAppIcon(); set_title_decorated(""); set_modal(false); set_resizable(true); @@ -165,56 +166,8 @@ void EditWindow::on_realize () editWindowCursorManager.init (get_window()); } -bool EditWindow::updateResolution() -{ - int scale = get_scale_factor(); - double res = get_screen()->get_resolution(); - if (scale == 2) { - // from Windows' behavior : if scale==2, resolution = 192. (Gtk shows 96 dpi !?), there's no higher value - res = RTScalable::baseHiDPI; - } - bool retVal = res != resolution; - resolution = res; - return retVal; -} - -void EditWindow::setAppIcon() -{ - Glib::ustring fName; - bool downsize = false; - // findIconAbsolutePath won't be able to select the image based on resolution with the - // storage of the images, we're doing the selection here - if (resolution == RTScalable::baseDPI) { - fName = "rawtherapee-logo-24.png"; - } else { - fName = "rawtherapee-logo-48.png"; - if (resolution < RTScalable::baseHiDPI) { - downsize = true; - } - } - Glib::ustring icon_path = Glib::build_filename (argv0, "images", fName); - const Glib::RefPtr pixbuf = Gdk::Pixbuf::create_from_file(icon_path); - if (!pixbuf) { - return; - } - if (downsize) { - int size = int((48. * resolution) / RTScalable::baseHiDPI); - pixbuf->scale_simple(size, size, Gdk::InterpType::INTERP_BILINEAR); - } - - try { - set_default_icon(pixbuf); - } catch(Glib::Exception& ex) { - printf ("%s\n", ex.what().c_str()); - } -} - bool EditWindow::on_configure_event(GdkEventConfigure* event) { - if (updateResolution()) { - setAppIcon(); - } - if (!options.meowMaximized && !isFullscreen && !isMinimized) { get_position(options.meowX, options.meowY); get_size(options.meowWidth, options.meowHeight); @@ -254,11 +207,11 @@ void EditWindow::addEditorPanel (EditorPanel* ep, const std::string &name) // construct closeable tab for the image Gtk::Box* hb = Gtk::manage (new Gtk::Box ()); - hb->pack_start (*Gtk::manage (new RTImage ("aperture.png"))); + hb->pack_start (*Gtk::manage (new RTImage ("aperture"))); hb->pack_start (*Gtk::manage (new Gtk::Label (Glib::path_get_basename (name)))); hb->set_tooltip_markup (name); Gtk::Button* closeb = Gtk::manage (new Gtk::Button ()); - closeb->set_image (*Gtk::manage(new RTImage ("cancel-small.png"))); + closeb->set_image (*Gtk::manage(new RTImage ("cancel-small", Gtk::ICON_SIZE_BUTTON))); closeb->set_relief (Gtk::RELIEF_NONE); closeb->set_focus_on_click (false); diff --git a/rtgui/editwindow.h b/rtgui/editwindow.h index 02b7cd23b..b06f7690f 100644 --- a/rtgui/editwindow.h +++ b/rtgui/editwindow.h @@ -32,7 +32,6 @@ class EditWindow : { private: - double resolution; RTWindow* parent; RTImage appIcon; @@ -47,8 +46,6 @@ private: bool isMinimized; sigc::connection onConfEventConn; void toggleFullscreen (); - bool updateResolution(); - void setAppIcon(); IdleRegister idle_register; diff --git a/rtgui/exifpanel.cc b/rtgui/exifpanel.cc index 487635f5b..88a081c01 100644 --- a/rtgui/exifpanel.cc +++ b/rtgui/exifpanel.cc @@ -37,6 +37,10 @@ ExifPanel::ExifPanel() : idata(nullptr), changeList(new rtengine::procparams::ExifPairs), defChangeList(new rtengine::procparams::ExifPairs), + //keepicon("tick-small"), + editicon("edit-small"), + open_icon_("expander-open-small"), + closed_icon_("expander-closed-small"), pl_(nullptr) { for (auto &k : MetaDataParams::basicExifKeys) { @@ -64,11 +68,6 @@ ExifPanel::ExifPanel() : exifTree->set_tooltip_column(0); exifTree->set_enable_search(false); - //keepicon = RTImage::createPixbufFromFile("tick-small.png"); - editicon = RTImage::createPixbufFromFile("edit-small.png"); - open_icon_ = RTImage::createPixbufFromFile("expander-open-small.png"); - closed_icon_ = RTImage::createPixbufFromFile("expander-closed-small.png"); - exif_active_renderer_.property_mode() = Gtk::CELL_RENDERER_MODE_ACTIVATABLE; exif_active_renderer_.signal_toggled().connect(sigc::mem_fun(this, &ExifPanel::onKeyActiveToggled)); exif_active_column_.pack_start(exif_active_renderer_); @@ -77,12 +76,13 @@ ExifPanel::ExifPanel() : exifTree->append_column(exif_active_column_); Gtk::TreeView::Column *viewcol = Gtk::manage (new Gtk::TreeView::Column ("Field Name")); - Gtk::CellRendererPixbuf* render_pb = Gtk::manage (new Gtk::CellRendererPixbuf ()); + Gtk::CellRendererPixbuf* render_pb = Gtk::manage (new Gtk::CellRendererPixbuf()); + render_pb->property_stock_size() = Gtk::ICON_SIZE_SMALL_TOOLBAR; Gtk::CellRendererText *render_txt = Gtk::manage (new Gtk::CellRendererText()); render_txt->property_ellipsize() = Pango::ELLIPSIZE_END; viewcol->pack_start(*render_pb, false); viewcol->pack_start(*render_txt, true); - viewcol->add_attribute(*render_pb, "pixbuf", exifColumns.icon); + viewcol->add_attribute(*render_pb, "icon-name", exifColumns.icon); viewcol->add_attribute(*render_txt, "markup", exifColumns.label); viewcol->set_expand(true); viewcol->set_resizable(true); @@ -123,10 +123,10 @@ ExifPanel::ExifPanel() : setExpandAlignProperties (buttons1, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); const auto addbtn = - [&](const Glib::ustring &tip, const Glib::ustring &icon1, const Glib::ustring &icon2=Glib::ustring()) -> Gtk::Button * + [&](const Glib::ustring &tip, const Glib::ustring &icon) -> Gtk::Button * { Gtk::Button *b = Gtk::manage(new Gtk::Button()); - b->set_image(*Gtk::manage(new RTImage(icon1, icon2))); + b->set_image(*Gtk::manage(new RTImage(icon, Gtk::ICON_SIZE_BUTTON))); b->set_tooltip_text(M(tip)); b->get_style_context()->add_class("Right"); setExpandAlignProperties(b, true, true, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); @@ -134,11 +134,11 @@ ExifPanel::ExifPanel() : return b; }; - activate_all_ = addbtn("EXIFPANEL_ACTIVATE_ALL_HINT", "tick.png"); - activate_none_ = addbtn("EXIFPANEL_ACTIVATE_NONE_HINT", "box.png"); - add = addbtn("EXIFPANEL_ADDEDIT", "edit.png"); - reset = addbtn("EXIFPANEL_RESETHINT", "undo.png", "redo.png"); - resetAll = addbtn("EXIFPANEL_RESETALLHINT", "undo-all.png", "redo-all.png"); + activate_all_ = addbtn("EXIFPANEL_ACTIVATE_ALL_HINT", "tick"); + activate_none_ = addbtn("EXIFPANEL_ACTIVATE_NONE_HINT", "box"); + add = addbtn("EXIFPANEL_ADDEDIT", "edit"); + reset = addbtn("EXIFPANEL_RESETHINT", "undo"); + resetAll = addbtn("EXIFPANEL_RESETALLHINT", "undo-all"); pack_end (*buttons1, Gtk::PACK_SHRINK); diff --git a/rtgui/exifpanel.h b/rtgui/exifpanel.h index bc8d6229f..9097b882f 100644 --- a/rtgui/exifpanel.h +++ b/rtgui/exifpanel.h @@ -50,8 +50,8 @@ private: class ExifColumns : public Gtk::TreeModelColumnRecord { public: + Gtk::TreeModelColumn icon; // Gtk::TreeModelColumn> expander_icon; - Gtk::TreeModelColumn> icon; Gtk::TreeModelColumn key; Gtk::TreeModelColumn label; Gtk::TreeModelColumn value; @@ -75,10 +75,11 @@ private: // add(expander_icon); } }; - //Glib::RefPtr keepicon; - Glib::RefPtr editicon; - Glib::RefPtr open_icon_; - Glib::RefPtr closed_icon_; + + //Glib::ustring keepicon; + Glib::ustring editicon; + Glib::ustring open_icon_; + Glib::ustring closed_icon_; ExifColumns exifColumns; Gtk::TreeView* exifTree; @@ -122,7 +123,7 @@ private: void setExifTagValue(Gtk::CellRenderer *renderer, const Gtk::TreeModel::iterator &it); void onEditExifTagValue(const Glib::ustring &path, const Glib::ustring &value); - + public: ExifPanel (); ~ExifPanel() override; diff --git a/rtgui/exportpanel.cc b/rtgui/exportpanel.cc index f6c8a79f0..573055650 100644 --- a/rtgui/exportpanel.cc +++ b/rtgui/exportpanel.cc @@ -21,13 +21,14 @@ #include "multilangmgr.h" #include "options.h" #include "rtimage.h" +#include "rtsurface.h" #include "../rtengine/procparams.h" using namespace rtengine; using namespace rtengine::procparams; -ExportPanel::ExportPanel () : listener (nullptr) +ExportPanel::ExportPanel () : listener (nullptr), ornamentSurface(new RTSurface("ornament1.svg")) { set_orientation(Gtk::ORIENTATION_VERTICAL); @@ -185,14 +186,14 @@ ExportPanel::ExportPanel () : listener (nullptr) // Buttons btnFastExport = Gtk::manage ( new Gtk::Button () ); btnFastExport->set_tooltip_text (M ("EXPORT_PUTTOQUEUEFAST")); - btnFastExport->set_image (*Gtk::manage (new RTImage ("gears.png"))); + btnFastExport->set_image (*Gtk::manage (new RTImage ("gears"))); pack_start (*btnFastExport, Gtk::PACK_SHRINK, 4); // add panel ending 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")); + Gtk::Image* peImg = Gtk::manage (new Gtk::Image (ornamentSurface->get())); vboxpe->pack_start (*hseptpe, Gtk::PACK_SHRINK, 4); vboxpe->pack_start (*peImg); pack_start (*vboxpe, Gtk::PACK_SHRINK, 0); diff --git a/rtgui/exportpanel.h b/rtgui/exportpanel.h index 18c4bda49..45fd75e3c 100644 --- a/rtgui/exportpanel.h +++ b/rtgui/exportpanel.h @@ -23,6 +23,7 @@ #include "guiutils.h" +class RTSurface; class ExportPanelListener { public: @@ -103,6 +104,8 @@ protected: ExportPanelListener* listener; + std::shared_ptr ornamentSurface; + void bypassALL_Toggled(); void use_fast_pipeline_toggled(); void SaveSettingsAsDefault(); diff --git a/rtgui/externaleditorpreferences.cc b/rtgui/externaleditorpreferences.cc index b29666800..612356b8b 100644 --- a/rtgui/externaleditorpreferences.cc +++ b/rtgui/externaleditorpreferences.cc @@ -25,7 +25,6 @@ #include "externaleditorpreferences.h" #include "multilangmgr.h" -#include "rtimage.h" ExternalEditorPreferences::ExternalEditorPreferences(): @@ -55,12 +54,10 @@ ExternalEditorPreferences::ExternalEditorPreferences(): 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_add->set_image_from_icon_name("add-small"); + button_remove->set_image_from_icon_name("remove-small"); button_app_chooser = #ifdef __APPLE__ nullptr; @@ -107,8 +104,8 @@ ExternalEditorPreferences::getEditors() const 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(); + const auto icon = rowIter->get_value(model_columns.icon); + const auto &icon_serialized = !icon ? "" : icon->serialize().print(); editors.emplace_back( rowIter->get_value(model_columns.name), rowIter->get_value(model_columns.command), diff --git a/rtgui/fattaltonemap.cc b/rtgui/fattaltonemap.cc index d4ed90612..23a3a4ddf 100644 --- a/rtgui/fattaltonemap.cc +++ b/rtgui/fattaltonemap.cc @@ -1,5 +1,5 @@ /** -*- C++ -*- - * + * * This file is part of RawTherapee. * * Copyright (c) 2017 Alberto Griggio @@ -41,8 +41,8 @@ FattalToneMapping::FattalToneMapping(): FoldableToolPanel(this, TOOL_NAME, M("TP amount = Gtk::manage(new Adjuster (M("TP_TM_FATTAL_AMOUNT"), 1., 100., 1., 30.)); threshold = Gtk::manage(new Adjuster (M("TP_TM_FATTAL_THRESHOLD"), -100., 300., 1., 0.0)); threshold->setLogScale(10, 0); - Gtk::Image *al = Gtk::manage(new RTImage("circle-black-small.png")); - Gtk::Image *ar = Gtk::manage(new RTImage("circle-white-small.png")); + Gtk::Image *al = Gtk::manage(new RTImage("circle-black-small")); + Gtk::Image *ar = Gtk::manage(new RTImage("circle-white-small")); anchor = Gtk::manage(new Adjuster(M("TP_TM_FATTAL_ANCHOR"), 1, 100, 1, 50, al, ar)); amount->setAdjusterListener(this); diff --git a/rtgui/favoritbrowser.cc b/rtgui/favoritbrowser.cc index 0481847cb..2b16aadcc 100644 --- a/rtgui/favoritbrowser.cc +++ b/rtgui/favoritbrowser.cc @@ -16,7 +16,8 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include +#include "favoritbrowser.h" + #include "multilangmgr.h" #include "rtimage.h" @@ -57,7 +58,7 @@ FavoritBrowser::FavoritBrowser () : listener (NULL) add->set_vexpand(false); add->set_halign(Gtk::ALIGN_FILL); add->set_valign(Gtk::ALIGN_START); - add->set_image (*Gtk::manage (new RTImage ("add-small.png"))); + add->set_image (*Gtk::manage (new RTImage ("add-small", Gtk::ICON_SIZE_BUTTON))); add->get_style_context()->add_class("Left"); del = Gtk::manage (new Gtk::Button ()); del->set_tooltip_text(M("MAIN_FRAME_PLACES_DEL")); @@ -65,7 +66,7 @@ FavoritBrowser::FavoritBrowser () : listener (NULL) del->set_vexpand(false); del->set_halign(Gtk::ALIGN_FILL); del->set_valign(Gtk::ALIGN_START); - del->set_image (*Gtk::manage (new RTImage ("remove-small.png"))); + del->set_image (*Gtk::manage (new RTImage ("remove-small", Gtk::ICON_SIZE_BUTTON))); del->get_style_context()->add_class("Right"); Gtk::Box* buttonBox = Gtk::manage (new Gtk::Box ()); buttonBox->pack_start (*add); diff --git a/rtgui/filebrowser.cc b/rtgui/filebrowser.cc index b33ebcee4..661b6051a 100644 --- a/rtgui/filebrowser.cc +++ b/rtgui/filebrowser.cc @@ -157,7 +157,7 @@ FileBrowser::FileBrowser () : 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); + pmenu->attach (*Gtk::manage(develop = new MyImageMenuItem (M("FILEBROWSER_POPUPPROCESS"), "gears")), 0, 1, p, p + 1); p++; pmenu->attach (*Gtk::manage(developfast = new Gtk::MenuItem (M("FILEBROWSER_POPUPPROCESSFAST"))), 0, 1, p, p + 1); p++; @@ -244,8 +244,8 @@ FileBrowser::FileBrowser () : // Thumbnail context menu // Similar image arrays in filecatalog.cc - std::array clabelActiveIcons = {"circle-empty-gray-small.png", "circle-red-small.png", "circle-yellow-small.png", "circle-green-small.png", "circle-blue-small.png", "circle-purple-small.png"}; - std::array clabelInactiveIcons = {"circle-empty-darkgray-small.png", "circle-empty-red-small.png", "circle-empty-yellow-small.png", "circle-empty-green-small.png", "circle-empty-blue-small.png", "circle-empty-purple-small.png"}; + std::array clabelActiveIcons = {"circle-empty-gray-small", "circle-red-small", "circle-yellow-small", "circle-green-small", "circle-blue-small", "circle-purple-small"}; + std::array clabelInactiveIcons = {"circle-empty-darkgray-small", "circle-empty-red-small", "circle-empty-yellow-small", "circle-empty-green-small", "circle-empty-blue-small", "circle-empty-purple-small"}; if (options.menuGroupLabel) { pmenu->attach (*Gtk::manage(menuLabel = new Gtk::MenuItem (M("FILEBROWSER_POPUPCOLORLABEL"))), 0, 1, p, p + 1); @@ -547,13 +547,13 @@ void FileBrowser::rightClicked () untrash->set_sensitive (false); for (size_t i = 0; i < selected.size(); i++) - if ((static_cast(selected[i]))->thumbnail->getStage()) { + if ((static_cast(selected[i]))->thumbnail->getTrashed()) { untrash->set_sensitive (true); break; } for (size_t i = 0; i < selected.size(); i++) - if (!(static_cast(selected[i]))->thumbnail->getStage()) { + if (!(static_cast(selected[i]))->thumbnail->getTrashed()) { trash->set_sensitive (true); break; } @@ -649,7 +649,7 @@ void FileBrowser::addEntry_ (FileBrowserEntry* entry) entry->addButtonSet(new FileThumbnailButtonSet(entry)); entry->getThumbButtonSet()->setRank(entry->thumbnail->getRank()); entry->getThumbButtonSet()->setColorLabel(entry->thumbnail->getColorLabel()); - entry->getThumbButtonSet()->setInTrash(entry->thumbnail->getStage()); + entry->getThumbButtonSet()->setInTrash(entry->thumbnail->getTrashed()); entry->getThumbButtonSet()->setButtonListener(this); entry->resize(getThumbnailHeight()); entry->filtered = !checkFilter(entry); @@ -1023,12 +1023,12 @@ void FileBrowser::menuItemActivated (Gtk::MenuItem* m) const auto thumbnail = mselected[i]->thumbnail; const auto rank = thumbnail->getRank(); const auto colorLabel = thumbnail->getColorLabel(); - const auto stage = thumbnail->getStage(); + const auto stage = thumbnail->getTrashed(); thumbnail->createProcParamsForUpdate (false, true); thumbnail->setRank(rank); thumbnail->setColorLabel(colorLabel); - thumbnail->setStage(stage); + thumbnail->setTrashed(stage); // Empty run to update the thumb rtengine::procparams::ProcParams params = thumbnail->getProcParams (); @@ -1558,8 +1558,8 @@ bool FileBrowser::checkFilter (ThumbBrowserEntryBase* entryb) const // true -> ((entry->thumbnail->isRecentlySaved() && filter.showRecentlySaved[0]) && !filter.showRecentlySaved[1]) || ((!entry->thumbnail->isRecentlySaved() && filter.showRecentlySaved[1]) && !filter.showRecentlySaved[0]) || - (entry->thumbnail->getStage() && !filter.showTrash) || - (!entry->thumbnail->getStage() && !filter.showNotTrash)) { + (entry->thumbnail->getTrashed() && !filter.showTrash) || + (!entry->thumbnail->getTrashed() && !filter.showNotTrash)) { return false; } @@ -1625,11 +1625,11 @@ void FileBrowser::toTrashRequested (std::vector tbe) // no need to notify listeners as item goes to trash, likely to be deleted - if (tbe[i]->thumbnail->getStage()) { + if (tbe[i]->thumbnail->getTrashed()) { continue; } - tbe[i]->thumbnail->setStage (true); + tbe[i]->thumbnail->setTrashed (true); if (tbe[i]->getThumbButtonSet()) { tbe[i]->getThumbButtonSet()->setRank (tbe[i]->thumbnail->getRank()); @@ -1649,11 +1649,11 @@ void FileBrowser::fromTrashRequested (std::vector tbe) for (size_t i = 0; i < tbe.size(); i++) { // if thumbnail was marked inTrash=true then param file must be there, no need to run customprofilebuilder - if (!tbe[i]->thumbnail->getStage()) { + if (!tbe[i]->thumbnail->getTrashed()) { continue; } - tbe[i]->thumbnail->setStage (false); + tbe[i]->thumbnail->setTrashed (false); if (tbe[i]->getThumbButtonSet()) { tbe[i]->getThumbButtonSet()->setRank (tbe[i]->thumbnail->getRank()); @@ -1784,7 +1784,7 @@ void FileBrowser::buttonPressed (LWButton* button, int actionCode, void* actionD FileBrowserEntry* entry = static_cast(actionData); tbe.push_back (entry); - if (!entry->thumbnail->getStage()) { + if (!entry->thumbnail->getTrashed()) { toTrashRequested (tbe); } else { fromTrashRequested (tbe); diff --git a/rtgui/filebrowserentry.cc b/rtgui/filebrowserentry.cc index 6a4bd38b4..23b66b3cc 100644 --- a/rtgui/filebrowserentry.cc +++ b/rtgui/filebrowserentry.cc @@ -25,7 +25,7 @@ #include "cursormanager.h" #include "guiutils.h" #include "inspector.h" -#include "rtimage.h" +#include "rtsurface.h" #include "threadutils.h" #include "thumbbrowserbase.h" #include "thumbnail.h" @@ -37,11 +37,11 @@ //extern Glib::Threads::Thread* mainThread; -Glib::RefPtr FileBrowserEntry::editedIcon; -Glib::RefPtr FileBrowserEntry::recentlySavedIcon; -Glib::RefPtr FileBrowserEntry::enqueuedIcon; -Glib::RefPtr FileBrowserEntry::hdr; -Glib::RefPtr FileBrowserEntry::ps; +std::shared_ptr FileBrowserEntry::editedIcon(std::shared_ptr(nullptr)); +std::shared_ptr FileBrowserEntry::recentlySavedIcon(std::shared_ptr(nullptr)); +std::shared_ptr FileBrowserEntry::enqueuedIcon(std::shared_ptr(nullptr)); +std::shared_ptr FileBrowserEntry::hdr(std::shared_ptr(nullptr)); +std::shared_ptr FileBrowserEntry::ps(std::shared_ptr(nullptr)); FileBrowserEntry::FileBrowserEntry (Thumbnail* thm, const Glib::ustring& fname) : 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) @@ -82,11 +82,11 @@ FileBrowserEntry::~FileBrowserEntry () void FileBrowserEntry::init () { - editedIcon = RTImage::createPixbufFromFile ("tick-small.png"); - recentlySavedIcon = RTImage::createPixbufFromFile ("save-small.png"); - enqueuedIcon = RTImage::createPixbufFromFile ("gears-small.png"); - hdr = RTImage::createPixbufFromFile ("filetype-hdr.png"); - ps = RTImage::createPixbufFromFile ("filetype-ps.png"); + editedIcon = std::shared_ptr(new RTSurface("tick-small", Gtk::ICON_SIZE_SMALL_TOOLBAR)); + recentlySavedIcon = std::shared_ptr(new RTSurface("save-small", Gtk::ICON_SIZE_SMALL_TOOLBAR)); + enqueuedIcon = std::shared_ptr(new RTSurface("gears-small", Gtk::ICON_SIZE_SMALL_TOOLBAR)); + hdr = std::shared_ptr(new RTSurface("filetype-hdr", Gtk::ICON_SIZE_SMALL_TOOLBAR)); + ps = std::shared_ptr(new RTSurface("filetype-ps", Gtk::ICON_SIZE_SMALL_TOOLBAR)); } void FileBrowserEntry::refreshThumbnailImage(bool upgradeHint) @@ -127,13 +127,13 @@ void FileBrowserEntry::calcThumbnailSize () } } -std::vector> FileBrowserEntry::getIconsOnImageArea () +std::vector> FileBrowserEntry::getIconsOnImageArea () { if (!thumbnail) { return {}; } - std::vector> ret; + std::vector> ret; if (thumbnail->hasProcParams() && editedIcon) { ret.push_back(editedIcon); @@ -150,13 +150,13 @@ std::vector> FileBrowserEntry::getIconsOnImageArea () return ret; } -std::vector> FileBrowserEntry::getSpecificityIconsOnImageArea () +std::vector> FileBrowserEntry::getSpecificityIconsOnImageArea () { if (!thumbnail) { return {}; } - std::vector> ret; + std::vector> ret; if (thumbnail->isHDR() && hdr) { ret.push_back (hdr); @@ -197,8 +197,8 @@ void FileBrowserEntry::customBackBufferUpdate (Cairo::RefPtr c) void FileBrowserEntry::getIconSize (int& w, int& h) const { - w = editedIcon->get_width (); - h = editedIcon->get_height (); + w = editedIcon->getWidth (); + h = editedIcon->getHeight (); } FileThumbnailButtonSet* FileBrowserEntry::getThumbButtonSet () @@ -789,9 +789,12 @@ void FileBrowserEntry::drawStraightenGuide (Cairo::RefPtr cr) } Glib::RefPtr context = parent->getDrawingArea()->get_pango_context () ; - Pango::FontDescription fontd = context->get_font_description (); + Pango::FontDescription fontd = parent->getDrawingArea()->get_style_context()->get_font(); fontd.set_weight (Pango::WEIGHT_BOLD); - fontd.set_size (8 * Pango::SCALE); + const int fontSize = 8; // pt + // Non-absolute size is defined in "Pango units" and shall be multiplied by + // Pango::SCALE from "pt": + fontd.set_size (fontSize * Pango::SCALE); context->set_font_description (fontd); Glib::RefPtr deglayout = parent->getDrawingArea()->create_pango_layout(Glib::ustring::compose ("%1 deg", Glib::ustring::format(std::setprecision(2), rot_deg))); diff --git a/rtgui/filebrowserentry.h b/rtgui/filebrowserentry.h index c560efc16..1b1c4e73c 100644 --- a/rtgui/filebrowserentry.h +++ b/rtgui/filebrowserentry.h @@ -35,6 +35,7 @@ class FileBrowserEntry; class Thumbnail; +class RTSurface; struct FileBrowserEntryIdleHelper { FileBrowserEntry* fbentry; @@ -72,11 +73,11 @@ class FileBrowserEntry final : public ThumbBrowserEntryBase, public: - static Glib::RefPtr editedIcon; - static Glib::RefPtr recentlySavedIcon; - static Glib::RefPtr enqueuedIcon; - static Glib::RefPtr hdr; - static Glib::RefPtr ps; + static std::shared_ptr editedIcon; + static std::shared_ptr recentlySavedIcon; + static std::shared_ptr enqueuedIcon; + static std::shared_ptr hdr; + static std::shared_ptr ps; FileBrowserEntry (Thumbnail* thm, const Glib::ustring& fname); ~FileBrowserEntry () override; @@ -94,8 +95,8 @@ public: void refreshQuickThumbnailImage () override; void calcThumbnailSize () override; - std::vector> getIconsOnImageArea () override; - std::vector> getSpecificityIconsOnImageArea () override; + std::vector> getIconsOnImageArea () override; + std::vector> getSpecificityIconsOnImageArea () override; void getIconSize (int& w, int& h) const override; // thumbnaillistener interface diff --git a/rtgui/filecatalog.cc b/rtgui/filecatalog.cc index bf8125822..8c5a70628 100644 --- a/rtgui/filecatalog.cc +++ b/rtgui/filecatalog.cc @@ -19,6 +19,8 @@ */ #include "filecatalog.h" +#include +#include #include #include @@ -83,7 +85,7 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : 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"))); + emptyT->set_image (*Gtk::manage(new RTImage ("trash-delete", Gtk::ICON_SIZE_LARGE_TOOLBAR))); emptyT->signal_pressed().connect (sigc::mem_fun(*this, &FileCatalog::emptyTrash)); trashButtonBox->pack_start (*emptyT, Gtk::PACK_SHRINK, 4); emptyT->show (); @@ -93,8 +95,8 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : hbToolBar1 = Gtk::manage(new Gtk::Box ()); //setup BrowsePath - iRefreshWhite = new RTImage("refresh-small.png"); - iRefreshRed = new RTImage("refresh-red-small.png"); + iRefreshWhite = new RTImage("refresh-small", Gtk::ICON_SIZE_BUTTON); + iRefreshRed = new RTImage("refresh-red-small", Gtk::ICON_SIZE_BUTTON); BrowsePath = Gtk::manage(new Gtk::Entry ()); BrowsePath->set_width_chars (50); @@ -113,7 +115,7 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : BrowsePath->signal_key_press_event().connect(sigc::mem_fun(*this, &FileCatalog::BrowsePath_key_pressed)); //setup Query - iQueryClear = new RTImage("cancel-small.png"); + iQueryClear = new RTImage("cancel-small", Gtk::ICON_SIZE_BUTTON); Gtk::Label* labelQuery = Gtk::manage(new Gtk::Label(M("FILEBROWSER_QUERYLABEL"))); Query = Gtk::manage(new Gtk::Entry ()); // cannot use Gtk::manage here as FileCatalog::getFilter will fail on Query->get_text() Query->set_text(""); @@ -151,8 +153,8 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : pack_start (*stb, Gtk::PACK_SHRINK); tbLeftPanel_1 = new Gtk::ToggleButton (); - iLeftPanel_1_Show = new RTImage("panel-to-right.png"); - iLeftPanel_1_Hide = new RTImage("panel-to-left.png"); + iLeftPanel_1_Show = new RTImage("panel-to-right", Gtk::ICON_SIZE_LARGE_TOOLBAR); + iLeftPanel_1_Hide = new RTImage("panel-to-left", Gtk::ICON_SIZE_LARGE_TOOLBAR); tbLeftPanel_1->set_relief(Gtk::RELIEF_NONE); tbLeftPanel_1->set_active (true); @@ -164,11 +166,11 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : vSepiLeftPanel = new Gtk::Separator(Gtk::ORIENTATION_VERTICAL); buttonBar->pack_start (*vSepiLeftPanel, Gtk::PACK_SHRINK); - iFilterClear = new RTImage ("filter-clear.png"); - igFilterClear = new RTImage ("filter.png"); + iFilterClear = new RTImage ("filter-clear", Gtk::ICON_SIZE_LARGE_TOOLBAR); + igFilterClear = new RTImage ("filter", Gtk::ICON_SIZE_LARGE_TOOLBAR); bFilterClear = Gtk::manage(new Gtk::ToggleButton ()); bFilterClear->set_active (true); - bFilterClear->set_image(*iFilterClear);// (*Gtk::manage(new RTImage ("filter-clear.png"))); + bFilterClear->set_image(*iFilterClear); bFilterClear->set_relief (Gtk::RELIEF_NONE); bFilterClear->set_tooltip_markup (M("FILEBROWSER_SHOWDIRHINT")); bFilterClear->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event), false); @@ -182,8 +184,8 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : fltrLabelbox = Gtk::manage (new Gtk::Box()); fltrLabelbox->get_style_context()->add_class("smallbuttonbox"); - iUnRanked = new RTImage ("star-gold-hollow-small.png"); - igUnRanked = new RTImage ("star-hollow-small.png"); + iUnRanked = new RTImage ("star-gold-hollow-small", Gtk::ICON_SIZE_BUTTON); + igUnRanked = new RTImage ("star-hollow-small", Gtk::ICON_SIZE_BUTTON); bUnRanked = Gtk::manage( new Gtk::ToggleButton () ); bUnRanked->get_style_context()->add_class("smallbutton"); bUnRanked->set_active (false); @@ -195,8 +197,8 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : bUnRanked->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event), false); for (int i = 0; i < 5; i++) { - iranked[i] = new RTImage ("star-gold-small.png"); - igranked[i] = new RTImage ("star-small.png"); + iranked[i] = new RTImage ("star-gold-small", Gtk::ICON_SIZE_BUTTON); + igranked[i] = new RTImage ("star-small", Gtk::ICON_SIZE_BUTTON); iranked[i]->show (); igranked[i]->show (); bRank[i] = Gtk::manage( new Gtk::ToggleButton () ); @@ -210,11 +212,11 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : // Toolbar // Similar image arrays in filebrowser.cc - std::array clabelActiveIcons = {"circle-gray-small.png", "circle-red-small.png", "circle-yellow-small.png", "circle-green-small.png", "circle-blue-small.png", "circle-purple-small.png"}; - std::array clabelInactiveIcons = {"circle-empty-gray-small.png", "circle-empty-red-small.png", "circle-empty-yellow-small.png", "circle-empty-green-small.png", "circle-empty-blue-small.png", "circle-empty-purple-small.png"}; + std::array clabelActiveIcons = {"circle-gray-small", "circle-red-small", "circle-yellow-small", "circle-green-small", "circle-blue-small", "circle-purple-small"}; + std::array clabelInactiveIcons = {"circle-empty-gray-small", "circle-empty-red-small", "circle-empty-yellow-small", "circle-empty-green-small", "circle-empty-blue-small", "circle-empty-purple-small"}; - iUnCLabeled = new RTImage(clabelActiveIcons[0]); - igUnCLabeled = new RTImage(clabelInactiveIcons[0]); + iUnCLabeled = new RTImage(clabelActiveIcons[0], Gtk::ICON_SIZE_BUTTON); + igUnCLabeled = new RTImage(clabelInactiveIcons[0], Gtk::ICON_SIZE_BUTTON); bUnCLabeled = Gtk::manage(new Gtk::ToggleButton()); bUnCLabeled->get_style_context()->add_class("smallbutton"); bUnCLabeled->set_active(false); @@ -226,8 +228,8 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : bUnCLabeled->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event), false); for (int i = 0; i < 5; i++) { - iCLabeled[i] = new RTImage(clabelActiveIcons[i+1]); - igCLabeled[i] = new RTImage(clabelInactiveIcons[i+1]); + iCLabeled[i] = new RTImage(clabelActiveIcons[i+1], Gtk::ICON_SIZE_BUTTON); + igCLabeled[i] = new RTImage(clabelInactiveIcons[i+1], Gtk::ICON_SIZE_BUTTON); iCLabeled[i]->show(); igCLabeled[i]->show(); bCLabel[i] = Gtk::manage(new Gtk::ToggleButton()); @@ -267,10 +269,10 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : // TODO The "g" variant was the more transparent variant of the icon, used // when the button was not toggled. Simplify this, change to ordinary // togglebutton, use CSS for opacity change. - iEdited[0] = new RTImage ("tick-hollow-small.png"); - igEdited[0] = new RTImage ("tick-hollow-small.png"); - iEdited[1] = new RTImage ("tick-small.png"); - igEdited[1] = new RTImage ("tick-small.png"); + iEdited[0] = new RTImage ("tick-hollow-small", Gtk::ICON_SIZE_BUTTON); + igEdited[0] = new RTImage ("tick-hollow-small", Gtk::ICON_SIZE_BUTTON); + iEdited[1] = new RTImage ("tick-small", Gtk::ICON_SIZE_BUTTON); + igEdited[1] = new RTImage ("tick-small", Gtk::ICON_SIZE_BUTTON); for (int i = 0; i < 2; i++) { iEdited[i]->show (); @@ -292,10 +294,10 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : // TODO The "g" variant was the more transparent variant of the icon, used // when the button was not toggled. Simplify this, change to ordinary // togglebutton, use CSS for opacity change. - iRecentlySaved[0] = new RTImage ("saved-no-small.png"); - igRecentlySaved[0] = new RTImage ("saved-no-small.png"); - iRecentlySaved[1] = new RTImage ("saved-yes-small.png"); - igRecentlySaved[1] = new RTImage ("saved-yes-small.png"); + iRecentlySaved[0] = new RTImage ("saved-no-small", Gtk::ICON_SIZE_BUTTON); + igRecentlySaved[0] = new RTImage ("saved-no-small", Gtk::ICON_SIZE_BUTTON); + iRecentlySaved[1] = new RTImage ("saved-yes-small", Gtk::ICON_SIZE_BUTTON); + igRecentlySaved[1] = new RTImage ("saved-yes-small", Gtk::ICON_SIZE_BUTTON); for (int i = 0; i < 2; i++) { iRecentlySaved[i]->show (); @@ -320,8 +322,8 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : buttonBar->pack_start (*Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)), Gtk::PACK_SHRINK); // Trash - iTrashShowEmpty = new RTImage("trash-empty-show.png") ; - iTrashShowFull = new RTImage("trash-full-show.png") ; + iTrashShowEmpty = new RTImage("trash-empty-show", Gtk::ICON_SIZE_LARGE_TOOLBAR) ; + iTrashShowFull = new RTImage("trash-full-show", Gtk::ICON_SIZE_LARGE_TOOLBAR) ; bTrash = Gtk::manage( new Gtk::ToggleButton () ); bTrash->set_image (*iTrashShowEmpty); @@ -330,8 +332,8 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : bCateg[17] = bTrash->signal_toggled().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::categoryButtonToggled), bTrash, true)); bTrash->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event), false); - iNotTrash = new RTImage("trash-hide-deleted.png") ; - iOriginal = new RTImage("filter-original.png"); + iNotTrash = new RTImage("trash-hide-deleted", Gtk::ICON_SIZE_LARGE_TOOLBAR) ; + iOriginal = new RTImage("filter-original", Gtk::ICON_SIZE_LARGE_TOOLBAR); bNotTrash = Gtk::manage( new Gtk::ToggleButton () ); bNotTrash->set_image (*iNotTrash); @@ -347,9 +349,17 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : bCateg[19] = bOriginal->signal_toggled().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::categoryButtonToggled), bOriginal, true)); bOriginal->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event), false); + bRecursive = Gtk::manage(new Gtk::ToggleButton()); + bRecursive->set_image(*Gtk::manage(new RTImage("folder-subfolder", Gtk::ICON_SIZE_LARGE_TOOLBAR))); + bRecursive->set_tooltip_text(M("FILEBROWSER_SHOWRECURSIVE")); + bRecursive->set_relief(Gtk::RELIEF_NONE); + bRecursive->set_active(options.browseRecursive); + bRecursive->signal_toggled().connect(sigc::mem_fun(*this, &FileCatalog::showRecursiveToggled)); + buttonBar->pack_start (*bTrash, Gtk::PACK_SHRINK); buttonBar->pack_start (*bNotTrash, Gtk::PACK_SHRINK); buttonBar->pack_start (*bOriginal, Gtk::PACK_SHRINK); + buttonBar->pack_start(*bRecursive, 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) ); @@ -400,7 +410,7 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : categoryButtons[19] = bOriginal; exifInfo = Gtk::manage(new Gtk::ToggleButton ()); - exifInfo->set_image (*Gtk::manage(new RTImage ("info.png"))); + exifInfo->set_image (*Gtk::manage(new RTImage ("info", Gtk::ICON_SIZE_LARGE_TOOLBAR))); exifInfo->set_relief (Gtk::RELIEF_NONE); exifInfo->set_tooltip_markup (M("FILEBROWSER_SHOWEXIFINFO")); exifInfo->set_active( options.showFileNames ); @@ -410,13 +420,13 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : // thumbnail zoom 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->set_image (*Gtk::manage(new RTImage ("magnifier-plus", Gtk::ICON_SIZE_LARGE_TOOLBAR))); zoomInButton->signal_pressed().connect (sigc::mem_fun(*this, &FileCatalog::zoomIn)); zoomInButton->set_relief (Gtk::RELIEF_NONE); zoomInButton->set_tooltip_markup (M("FILEBROWSER_ZOOMINHINT")); zoomBox->pack_end (*zoomInButton, Gtk::PACK_SHRINK); zoomOutButton = Gtk::manage( new Gtk::Button () ); - zoomOutButton->set_image (*Gtk::manage(new RTImage ("magnifier-minus.png"))); + zoomOutButton->set_image (*Gtk::manage(new RTImage ("magnifier-minus", Gtk::ICON_SIZE_LARGE_TOOLBAR))); zoomOutButton->signal_pressed().connect (sigc::mem_fun(*this, &FileCatalog::zoomOut)); zoomOutButton->set_relief (Gtk::RELIEF_NONE); zoomOutButton->set_tooltip_markup (M("FILEBROWSER_ZOOMOUTHINT")); @@ -425,17 +435,14 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : buttonBar->pack_start (*zoomBox, 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"); - // if it IS a single row toolbar if (options.FileBrowserToolbarSingleRow) { buttonBar->pack_start (*hbToolBar1, Gtk::PACK_EXPAND_WIDGET, 0); } tbRightPanel_1 = new Gtk::ToggleButton (); - iRightPanel_1_Show = new RTImage("panel-to-left.png"); - iRightPanel_1_Hide = new RTImage("panel-to-right.png"); + iRightPanel_1_Show = new RTImage("panel-to-left", Gtk::ICON_SIZE_LARGE_TOOLBAR); + iRightPanel_1_Hide = new RTImage("panel-to-right", Gtk::ICON_SIZE_LARGE_TOOLBAR); tbRightPanel_1->set_relief(Gtk::RELIEF_NONE); tbRightPanel_1->set_active (true); @@ -528,7 +535,7 @@ void FileCatalog::on_realize() { Gtk::Box::on_realize(); - Pango::FontDescription fontd = get_pango_context()->get_font_description (); + Pango::FontDescription fontd = get_style_context()->get_font(); fileBrowser->get_pango_context()->set_font_description (fontd); // batchQueue->get_pango_context()->set_font_description (fontd); } @@ -544,9 +551,7 @@ void FileCatalog::closeDir () exportPanel->set_sensitive (false); } - if (dirMonitor) { - dirMonitor->cancel (); - } + dirMonitors.clear(); // ignore old requests ++selectedDirectoryId; @@ -570,60 +575,82 @@ void FileCatalog::closeDir () redrawAll (); } -std::vector FileCatalog::getFileList() +std::vector FileCatalog::getFileList(std::vector> *dirs_explored) { std::vector names; const std::set& extensions = options.parsedExtensionsSet; - try { + static void (*getFilesRecursively)(const Glib::ustring &, int, int &, std::vector &, std::vector> *) = [](const Glib::ustring &dir_path, int max_depth, int &dir_quota, std::vector &file_names, std::vector> * directories_explored) { + try { - const auto dir = Gio::File::create_for_path(selectedDirectory); + const auto dir = Gio::File::create_for_path(dir_path); - auto enumerator = dir->enumerate_children("standard::name,standard::type,standard::is-hidden"); + static const auto enumerate_attrs = + std::string(G_FILE_ATTRIBUTE_STANDARD_NAME) + "," + + G_FILE_ATTRIBUTE_STANDARD_TYPE + "," + + G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN + "," + + G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET; + auto enumerator = dir->enumerate_children( + enumerate_attrs, + options.browseRecursiveFollowLinks + ? Gio::FileQueryInfoFlags::FILE_QUERY_INFO_NONE + : Gio::FileQueryInfoFlags::FILE_QUERY_INFO_NOFOLLOW_SYMLINKS); - while (true) { - try { - const auto file = enumerator->next_file(); - if (!file) { - break; - } + if (directories_explored) { + directories_explored->push_back(dir); + } - if (file->get_file_type() == Gio::FILE_TYPE_DIRECTORY) { - continue; - } + while (true) { + try { + const auto file = enumerator->next_file(); + if (!file) { + break; + } - if (!options.fbShowHidden && file->is_hidden()) { - continue; - } + if (!options.fbShowHidden && file->is_hidden()) { + continue; + } - const Glib::ustring fname = file->get_name(); - const auto lastdot = fname.find_last_of('.'); + if (file->get_file_type() == Gio::FILE_TYPE_DIRECTORY) { + if (max_depth > 0 && dir_quota > 0) { + const Glib::ustring child_dir_path = Glib::build_filename(dir_path, file->get_name()); + getFilesRecursively(child_dir_path, max_depth - 1, --dir_quota, file_names, directories_explored); + } + continue; + } - if (lastdot >= fname.length() - 1) { - continue; - } + const Glib::ustring fname = file->get_name(); + const auto lastdot = fname.find_last_of('.'); - if (extensions.find(fname.substr(lastdot + 1).lowercase()) == extensions.end()) { - continue; - } + if (lastdot >= fname.length() - 1) { + continue; + } - names.push_back(Glib::build_filename(selectedDirectory, fname)); - } catch (Glib::Exception& exception) { - if (rtengine::settings->verbose) { - std::cerr << exception.what() << std::endl; + if (extensions.find(fname.substr(lastdot + 1).lowercase()) == extensions.end()) { + continue; + } + + file_names.emplace_back(Glib::build_filename(dir_path, fname)); + } catch (Glib::Exception& exception) { + if (rtengine::settings->verbose) { + std::cerr << exception.what() << std::endl; + } } } + + } catch (Glib::Exception& exception) { + + if (rtengine::settings->verbose) { + std::cerr << "Failed to list directory \"" << dir_path << "\": " << exception.what() << std::endl; + } + } + }; - } catch (Glib::Exception& exception) { - - if (rtengine::settings->verbose) { - std::cerr << "Failed to list directory \"" << selectedDirectory << "\": " << exception.what() << std::endl; - } - - } + int dirs_left = options.browseRecursive ? options.browseRecursiveMaxDirs : 0; + getFilesRecursively(selectedDirectory, options.browseRecursiveDepth, dirs_left, names, dirs_explored); return names; } @@ -649,9 +676,10 @@ void FileCatalog::dirSelected (const Glib::ustring& dirname, const Glib::ustring selectedDirectory = dir->get_parse_name(); + std::vector> allDirs; BrowsePath->set_text(selectedDirectory); buttonBrowsePath->set_image(*iRefreshWhite); - fileNameList = getFileList(); + fileNameList = getFileList(&allDirs); for (unsigned int i = 0; i < fileNameList.size(); i++) { if (openfile.empty() || fileNameList[i] != openfile) { // if we opened a file at the beginning don't add it again @@ -667,13 +695,45 @@ void FileCatalog::dirSelected (const Glib::ustring& dirname, const Glib::ustring filepanel->loadingThumbs(M("PROGRESSBAR_LOADINGTHUMBS"), 0); } - dirMonitor = dir->monitor_directory (); - dirMonitor->signal_changed().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::on_dir_changed), false)); + refreshDirectoryMonitors(allDirs); } catch (Glib::Exception& ex) { std::cout << ex.what(); } } +void FileCatalog::refreshDirectoryMonitors(const std::vector> &dirs_to_monitor) +{ + std::vector updated_dir_names; + std::transform( + dirs_to_monitor.cbegin(), dirs_to_monitor.cend(), + std::back_inserter(updated_dir_names), + [](const Glib::RefPtr &updated_dir) { return updated_dir->get_path(); }); + + // Remove monitors on directories that are no longer shown. + dirMonitors.erase( + std::remove_if(dirMonitors.begin(), dirMonitors.end(), + [&updated_dir_names](const FileMonitorInfo &fileMonitorInfo) { + return std::find(updated_dir_names.cbegin(), updated_dir_names.cend(), fileMonitorInfo.filePath) == updated_dir_names.cend(); + }), + dirMonitors.end()); + + // Add monitors that do not exist yet. + std::vector monitored_dir_names; + std::transform( + dirMonitors.cbegin(), dirMonitors.cend(), + std::back_inserter(monitored_dir_names), + [](const FileMonitorInfo &dir_monitor) { return dir_monitor.filePath; }); + for (const auto &dir_to_monitor : dirs_to_monitor) { + const auto dir_path = dir_to_monitor->get_path(); + if (std::find(monitored_dir_names.cbegin(), monitored_dir_names.cend(), dir_path) != monitored_dir_names.cend()) { + continue; // A monitor exists already. + } + auto dir_monitor = dir_to_monitor->monitor_directory(); + dir_monitor->signal_changed().connect(sigc::bind(sigc::mem_fun(*this, &FileCatalog::on_dir_changed), false)); + dirMonitors.emplace_back(dir_monitor, dir_path); + } +} + void FileCatalog::enableTabMode(bool enable) { inTabMode = enable; @@ -713,7 +773,8 @@ void FileCatalog::_refreshProgressBar () // 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")); + setExpandAlignProperties (grid, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); + progressImage = Gtk::manage(new RTImage("folder-closed", Gtk::ICON_SIZE_LARGE_TOOLBAR)); 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); @@ -727,14 +788,14 @@ void FileCatalog::_refreshProgressBar () } } if (!previewsToLoad) { - progressImage->changeImage("folder-closed.png"); + progressImage->set_from_icon_name("folder-closed", Gtk::ICON_SIZE_LARGE_TOOLBAR); int filteredCount = min(fileBrowser->getNumFiltered(), previewsLoaded); progressLabel->set_text(M("MAIN_FRAME_FILEBROWSER") + (filteredCount != previewsLoaded ? " [" + Glib::ustring::format(filteredCount) + "/" : " (") + Glib::ustring::format(previewsLoaded) + (filteredCount != previewsLoaded ? "]" : ")")); } else { - progressImage->changeImage("magnifier.png"); + progressImage->set_from_icon_name("magnifier", Gtk::ICON_SIZE_LARGE_TOOLBAR); progressLabel->set_text(M("MAIN_FRAME_FILEBROWSER") + " [" + Glib::ustring::format(previewsLoaded) + "/" + Glib::ustring::format(previewsToLoad) + "]" ); @@ -1581,6 +1642,12 @@ void FileCatalog::categoryButtonToggled (Gtk::ToggleButton* b, bool isMouseClick } } +void FileCatalog::showRecursiveToggled() +{ + options.browseRecursive = bRecursive->get_active(); + reparseDirectory(); +} + BrowserFilter FileCatalog::getFilter () { @@ -1714,21 +1781,28 @@ void FileCatalog::reparseDirectory () return; } - // check if a thumbnailed file has been deleted + // check if a thumbnailed file has been deleted or is not in a directory of interest const std::vector& t = fileBrowser->getEntries(); std::vector fileNamesToDel; + std::vector fileNamesToRemove; for (const auto& entry : t) { if (!Glib::file_test(entry->filename, Glib::FILE_TEST_EXISTS)) { fileNamesToDel.push_back(entry->filename); + fileNamesToRemove.push_back(entry->filename); + } + else if (!options.browseRecursive && Glib::path_get_dirname(entry->filename) != selectedDirectory) { + fileNamesToRemove.push_back(entry->filename); } } - for (const auto& toDelete : fileNamesToDel) { - delete fileBrowser->delEntry(toDelete); - cacheMgr->deleteEntry(toDelete); + for (const auto& toRemove : fileNamesToRemove) { + delete fileBrowser->delEntry(toRemove); --previewsLoaded; } + for (const auto& toDelete : fileNamesToDel) { + cacheMgr->deleteEntry(toDelete); + } if (!fileNamesToDel.empty()) { _refreshProgressBar(); @@ -1741,7 +1815,8 @@ void FileCatalog::reparseDirectory () oldNames.insert(oldName.collate_key()); } - fileNameList = getFileList(); + std::vector> allDirs; + fileNameList = getFileList(&allDirs); for (const auto& newName : fileNameList) { if (oldNames.find(newName.collate_key()) == oldNames.end()) { addFile(newName); @@ -1749,13 +1824,16 @@ void FileCatalog::reparseDirectory () } } + refreshDirectoryMonitors(allDirs); } void FileCatalog::on_dir_changed (const Glib::RefPtr& file, const Glib::RefPtr& other_file, Gio::FileMonitorEvent event_type, bool internal) { - if (options.has_retained_extention(file->get_parse_name()) - && (event_type == Gio::FILE_MONITOR_EVENT_CREATED || event_type == Gio::FILE_MONITOR_EVENT_DELETED || event_type == Gio::FILE_MONITOR_EVENT_CHANGED)) { + if ((options.has_retained_extention(file->get_parse_name()) + && (event_type == Gio::FILE_MONITOR_EVENT_CREATED || event_type == Gio::FILE_MONITOR_EVENT_DELETED || event_type == Gio::FILE_MONITOR_EVENT_CHANGED)) + || (event_type == Gio::FILE_MONITOR_EVENT_CREATED && Glib::file_test(file->get_path(), Glib::FileTest::FILE_TEST_IS_DIR)) + || (event_type == Gio::FILE_MONITOR_EVENT_DELETED && std::find_if(dirMonitors.cbegin(), dirMonitors.cend(), [&file](const FileMonitorInfo &monitor) { return monitor.filePath == file->get_path(); }) != dirMonitors.cend())) { if (!internal) { GThreadLock lock; reparseDirectory (); @@ -1832,7 +1910,7 @@ void FileCatalog::emptyTrash () std::vector toDel; for (const auto entry : t) { - if ((static_cast(entry))->thumbnail->getStage() == 1) { + if ((static_cast(entry))->thumbnail->getTrashed()) { toDel.push_back(static_cast(entry)); } } @@ -1848,7 +1926,7 @@ bool FileCatalog::trashIsEmpty () const auto& t = fileBrowser->getEntries(); for (const auto entry : t) { - if ((static_cast(entry))->thumbnail->getStage() == 1) { + if ((static_cast(entry))->thumbnail->getTrashed()) { return false; } } diff --git a/rtgui/filecatalog.h b/rtgui/filecatalog.h index 23d56af73..f41c42475 100644 --- a/rtgui/filecatalog.h +++ b/rtgui/filecatalog.h @@ -54,6 +54,13 @@ public: typedef sigc::slot DirSelectionSlot; private: + struct FileMonitorInfo { + FileMonitorInfo(const Glib::RefPtr &file_monitor, const Glib::ustring &file_path) : + fileMonitor(file_monitor), filePath(file_path) {} + Glib::RefPtr fileMonitor; + Glib::ustring filePath; + }; + FilePanel* filepanel; Gtk::Box* hBox; Glib::ustring selectedDirectory; @@ -95,6 +102,7 @@ private: Gtk::ToggleButton* bTrash; Gtk::ToggleButton* bNotTrash; Gtk::ToggleButton* bOriginal; + Gtk::ToggleButton* bRecursive; Gtk::ToggleButton* categoryButtons[20]; Gtk::ToggleButton* exifInfo; sigc::connection bCateg[20]; @@ -143,14 +151,15 @@ private: std::set editedFiles; guint modifierKey; // any modifiers held when rank button was pressed - Glib::RefPtr dirMonitor; + std::vector dirMonitors; IdleRegister idle_register; void addAndOpenFile (const Glib::ustring& fname); void addFile (const Glib::ustring& fName); - std::vector getFileList (); + std::vector getFileList(std::vector> *dirs_explored = nullptr); BrowserFilter getFilter (); + void refreshDirectoryMonitors(const std::vector> &dirs_to_monitor); void trashChanged (); public: @@ -240,6 +249,7 @@ public: void setExportPanel (ExportPanel* expanel); void exifInfoButtonToggled(); void categoryButtonToggled (Gtk::ToggleButton* b, bool isMouseClick); + void showRecursiveToggled(); bool capture_event(GdkEventButton* event); void filterChanged (); void runFilterDialog (); diff --git a/rtgui/filethumbnailbuttonset.cc b/rtgui/filethumbnailbuttonset.cc index bb64675a1..cb288b0c0 100644 --- a/rtgui/filethumbnailbuttonset.cc +++ b/rtgui/filethumbnailbuttonset.cc @@ -18,20 +18,20 @@ */ #include "filethumbnailbuttonset.h" -#include "rtimage.h" +#include "rtsurface.h" #include "multilangmgr.h" #include "lwbutton.h" #include "rtsurface.h" bool FileThumbnailButtonSet::iconsLoaded = false; -Cairo::RefPtr FileThumbnailButtonSet::rankIcon; -Cairo::RefPtr FileThumbnailButtonSet::gRankIcon; -Cairo::RefPtr FileThumbnailButtonSet::unRankIcon; -Cairo::RefPtr FileThumbnailButtonSet::trashIcon; -Cairo::RefPtr FileThumbnailButtonSet::unTrashIcon; -Cairo::RefPtr FileThumbnailButtonSet::processIcon; -std::array, 6> FileThumbnailButtonSet::colorLabelIcon; +std::shared_ptr FileThumbnailButtonSet::rankIcon = std::shared_ptr(nullptr); +std::shared_ptr FileThumbnailButtonSet::gRankIcon = std::shared_ptr(nullptr); +std::shared_ptr FileThumbnailButtonSet::unRankIcon = std::shared_ptr(nullptr); +std::shared_ptr FileThumbnailButtonSet::trashIcon = std::shared_ptr(nullptr); +std::shared_ptr FileThumbnailButtonSet::unTrashIcon = std::shared_ptr(nullptr); +std::shared_ptr FileThumbnailButtonSet::processIcon = std::shared_ptr(nullptr); +std::array, 6> FileThumbnailButtonSet::colorLabelIcon; Glib::ustring FileThumbnailButtonSet::processToolTip; Glib::ustring FileThumbnailButtonSet::unrankToolTip; @@ -44,18 +44,18 @@ FileThumbnailButtonSet::FileThumbnailButtonSet (FileBrowserEntry* myEntry) { if (!iconsLoaded) { - unRankIcon = Cairo::RefPtr(new RTSurface("star-hollow-narrow.png")); - rankIcon = Cairo::RefPtr(new RTSurface("star-gold-narrow.png")); - gRankIcon = Cairo::RefPtr(new RTSurface("star-narrow.png")); - trashIcon = Cairo::RefPtr(new RTSurface("trash-small.png")); - unTrashIcon = Cairo::RefPtr(new RTSurface("trash-remove-small.png")); - processIcon = Cairo::RefPtr(new RTSurface("gears-small.png")); - colorLabelIcon[0] = Cairo::RefPtr(new RTSurface("circle-empty-gray-small.png")); - colorLabelIcon[1] = Cairo::RefPtr(new RTSurface("circle-red-small.png")); - colorLabelIcon[2] = Cairo::RefPtr(new RTSurface("circle-yellow-small.png")); - colorLabelIcon[3] = Cairo::RefPtr(new RTSurface("circle-green-small.png")); - colorLabelIcon[4] = Cairo::RefPtr(new RTSurface("circle-blue-small.png")); - colorLabelIcon[5] = Cairo::RefPtr(new RTSurface("circle-purple-small.png")); + unRankIcon = std::shared_ptr(new RTSurface("star-hollow-narrow", Gtk::ICON_SIZE_BUTTON)); + rankIcon = std::shared_ptr(new RTSurface("star-gold-narrow", Gtk::ICON_SIZE_BUTTON)); + gRankIcon = std::shared_ptr(new RTSurface("star-narrow", Gtk::ICON_SIZE_BUTTON)); + trashIcon = std::shared_ptr(new RTSurface("trash-small", Gtk::ICON_SIZE_BUTTON)); + unTrashIcon = std::shared_ptr(new RTSurface("trash-remove-small", Gtk::ICON_SIZE_BUTTON)); + processIcon = std::shared_ptr(new RTSurface("gears-small", Gtk::ICON_SIZE_BUTTON)); + colorLabelIcon[0] = std::shared_ptr(new RTSurface("circle-empty-gray-small", Gtk::ICON_SIZE_BUTTON)); + colorLabelIcon[1] = std::shared_ptr(new RTSurface("circle-red-small", Gtk::ICON_SIZE_BUTTON)); + colorLabelIcon[2] = std::shared_ptr(new RTSurface("circle-yellow-small", Gtk::ICON_SIZE_BUTTON)); + colorLabelIcon[3] = std::shared_ptr(new RTSurface("circle-green-small", Gtk::ICON_SIZE_BUTTON)); + colorLabelIcon[4] = std::shared_ptr(new RTSurface("circle-blue-small", Gtk::ICON_SIZE_BUTTON)); + colorLabelIcon[5] = std::shared_ptr(new RTSurface("circle-purple-small", Gtk::ICON_SIZE_BUTTON)); processToolTip = M("FILEBROWSER_POPUPPROCESS"); unrankToolTip = M("FILEBROWSER_UNRANK_TOOLTIP"); diff --git a/rtgui/filethumbnailbuttonset.h b/rtgui/filethumbnailbuttonset.h index 868d3b58a..af6d1321d 100644 --- a/rtgui/filethumbnailbuttonset.h +++ b/rtgui/filethumbnailbuttonset.h @@ -34,14 +34,14 @@ class FileThumbnailButtonSet : static bool iconsLoaded; public: - static Cairo::RefPtr rankIcon; - static Cairo::RefPtr gRankIcon; - static Cairo::RefPtr unRankIcon; - static Cairo::RefPtr trashIcon; - static Cairo::RefPtr unTrashIcon; - static Cairo::RefPtr processIcon; + static std::shared_ptr rankIcon; + static std::shared_ptr gRankIcon; + static std::shared_ptr unRankIcon; + static std::shared_ptr trashIcon; + static std::shared_ptr unTrashIcon; + static std::shared_ptr processIcon; - static std::array, 6> colorLabelIcon; + static std::array, 6> colorLabelIcon; static Glib::ustring processToolTip; static Glib::ustring unrankToolTip; diff --git a/rtgui/filmnegative.cc b/rtgui/filmnegative.cc index e9c9f4d4c..8d894bece 100644 --- a/rtgui/filmnegative.cc +++ b/rtgui/filmnegative.cc @@ -214,8 +214,8 @@ FilmNegative::FilmNegative() : refPicker(DEFAULT_SPOT_WIDTH, M("TP_FILMNEGATIVE_REF_PICK"), M("TP_FILMNEGATIVE_REF_TOOLTIP"), M("TP_FILMNEGATIVE_REF_SIZE")), activePicker(&picker), 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 + greenBalance(createBalanceAdjuster(this, M("TP_FILMNEGATIVE_GREENBALANCE"), -3.0, 3.0, 0.0, "circle-magenta-small", "circle-green-small")), // green balance + blueBalance(createBalanceAdjuster(this, M("TP_FILMNEGATIVE_BLUEBALANCE"), -3.0, 3.0, 0.0, "circle-blue-small", "circle-yellow-small")) // blue balance { setExpandAlignProperties(refInputLabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); // refInputLabel->set_justify(Gtk::Justification::JUSTIFY_CENTER); @@ -500,18 +500,18 @@ void FilmNegative::filmRefValuesChanged(const RGB &refInput, const RGB &refOutpu [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; } diff --git a/rtgui/filterpanel.cc b/rtgui/filterpanel.cc index c407b88d7..186dd68ce 100644 --- a/rtgui/filterpanel.cc +++ b/rtgui/filterpanel.cc @@ -19,11 +19,11 @@ #include "filterpanel.h" #include "multilangmgr.h" #include "../rtengine/rtengine.h" -#include "rtimage.h" +#include "rtsurface.h" using namespace rtengine; -FilterPanel::FilterPanel () : listener (nullptr) +FilterPanel::FilterPanel () : listener (nullptr), ornamentSurface(new RTSurface("ornament1.svg")) { set_orientation(Gtk::ORIENTATION_VERTICAL); @@ -138,7 +138,7 @@ FilterPanel::FilterPanel () : listener (nullptr) // add panel ending 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")); + Gtk::Image* peImg = Gtk::manage (new Gtk::Image(ornamentSurface->get())); vboxpe->pack_start(*hseptpe, Gtk::PACK_SHRINK, 4); vboxpe->pack_start(*peImg); pack_start(*vboxpe, Gtk::PACK_SHRINK, 0); diff --git a/rtgui/filterpanel.h b/rtgui/filterpanel.h index 77c2d063e..32592bbd0 100644 --- a/rtgui/filterpanel.h +++ b/rtgui/filterpanel.h @@ -22,6 +22,8 @@ #include "exiffiltersettings.h" +class RTSurface; + class FilterPanelListener { public: @@ -61,6 +63,8 @@ protected: ExifFilterSettings curefs; FilterPanelListener* listener; + std::unique_ptr ornamentSurface; + public: FilterPanel (); diff --git a/rtgui/flatcurveeditorsubgroup.cc b/rtgui/flatcurveeditorsubgroup.cc index 1cc3f5c14..0cf522c55 100644 --- a/rtgui/flatcurveeditorsubgroup.cc +++ b/rtgui/flatcurveeditorsubgroup.cc @@ -54,7 +54,7 @@ FlatCurveEditorSubGroup::FlatCurveEditorSubGroup (CurveEditorGroup* prt, Glib::u CPointsCurve = Gtk::manage (new MyFlatCurve ()); CPointsCurve->setType (FCT_MinMaxCPoints); - + Gtk::Grid* CPointsCurveBox = Gtk::manage (new Gtk::Grid ()); CPointsCurveBox->get_style_context()->add_class("curve-curvebox"); CPointsCurveBox->add(*CPointsCurve); @@ -81,17 +81,17 @@ FlatCurveEditorSubGroup::FlatCurveEditorSubGroup (CurveEditorGroup* prt, Glib::u } editCPoints = Gtk::manage (new Gtk::ToggleButton()); - initButton(*editCPoints, Glib::ustring("crosshair-node-curve.png"), Gtk::ALIGN_START, false, "EDIT_PIPETTE_TOOLTIP"); + initButton(*editCPoints, Glib::ustring("crosshair-node-curve"), Gtk::ALIGN_START, false, "EDIT_PIPETTE_TOOLTIP"); editPointCPoints = Gtk::manage (new Gtk::ToggleButton ()); - initButton(*editPointCPoints, Glib::ustring("edit-point.png"), Gtk::ALIGN_START, false, "CURVEEDITOR_EDITPOINT_HINT"); + initButton(*editPointCPoints, Glib::ustring("edit-point"), Gtk::ALIGN_START, false, "CURVEEDITOR_EDITPOINT_HINT"); copyCPoints = Gtk::manage (new Gtk::Button ()); - initButton(*copyCPoints, Glib::ustring("copy.png"), Gtk::ALIGN_END, true); + initButton(*copyCPoints, Glib::ustring("copy"), Gtk::ALIGN_END, true); pasteCPoints = Gtk::manage (new Gtk::Button ()); - initButton(*pasteCPoints, Glib::ustring("paste.png"), Gtk::ALIGN_END, false); + initButton(*pasteCPoints, Glib::ustring("paste"), Gtk::ALIGN_END, false); loadCPoints = Gtk::manage (new Gtk::Button ()); - initButton(*loadCPoints, Glib::ustring("folder-open.png"), Gtk::ALIGN_END, false); + initButton(*loadCPoints, Glib::ustring("folder-open"), Gtk::ALIGN_END, false); saveCPoints = Gtk::manage (new Gtk::Button ()); - initButton(*saveCPoints, Glib::ustring("save.png"), Gtk::ALIGN_END, false); + initButton(*saveCPoints, Glib::ustring("save"), Gtk::ALIGN_END, false); CPointsbbox->attach_next_to(*editPointCPoints, sideStart, 1, 1); CPointsbbox->attach_next_to(*editCPoints, sideStart, 1, 1); @@ -206,7 +206,6 @@ void FlatCurveEditorSubGroup::editModeSwitchedOff () bool prevState = editCPointsConn.block(true); editCPoints->set_active(false); CPointsCurve->pipetteMouseOver(nullptr, nullptr, 0); - CPointsCurve->setDirty(true); if (!prevState) { editCPointsConn.block(false); @@ -220,7 +219,6 @@ void FlatCurveEditorSubGroup::pipetteMouseOver(EditDataProvider *provider, int m switch((FlatCurveType)(curveEditor->curveType->getSelected())) { case (FCT_MinMaxCPoints): CPointsCurve->pipetteMouseOver(curveEditor, provider, modifierKey); - CPointsCurve->setDirty(true); break; default: // (DCT_Linear, DCT_Unchanged) @@ -238,7 +236,6 @@ bool FlatCurveEditorSubGroup::pipetteButton1Pressed(EditDataProvider *provider, switch((FlatCurveType)(curveEditor->curveType->getSelected())) { case (FCT_MinMaxCPoints): isDragging = CPointsCurve->pipetteButton1Pressed(provider, modifierKey); - CPointsCurve->setDirty(true); break; default: // (DCT_Linear, DCT_Unchanged) @@ -256,7 +253,6 @@ void FlatCurveEditorSubGroup::pipetteButton1Released(EditDataProvider *provider) switch((FlatCurveType)(curveEditor->curveType->getSelected())) { case (FCT_MinMaxCPoints): CPointsCurve->pipetteButton1Released(provider); - CPointsCurve->setDirty(true); break; default: // (DCT_Linear, DCT_Unchanged) @@ -272,7 +268,6 @@ void FlatCurveEditorSubGroup::pipetteDrag(EditDataProvider *provider, int modifi switch((FlatCurveType)(curveEditor->curveType->getSelected())) { case (FCT_MinMaxCPoints): CPointsCurve->pipetteDrag(provider, modifierKey); - CPointsCurve->setDirty(true); break; default: // (DCT_Linear, DCT_Unchanged) @@ -441,7 +436,6 @@ void FlatCurveEditorSubGroup::loadPressed () if (p[0] == (double)(FCT_MinMaxCPoints)) { CPointsCurve->setPoints (p); - CPointsCurve->queue_draw (); CPointsCurve->notifyListener (); } } @@ -481,7 +475,6 @@ void FlatCurveEditorSubGroup::pastePressed () switch (type) { case FCT_MinMaxCPoints: // min/max control points CPointsCurve->setPoints (curve); - CPointsCurve->queue_draw (); CPointsCurve->notifyListener (); break; diff --git a/rtgui/flatfield.cc b/rtgui/flatfield.cc index 5246381c3..74f313080 100644 --- a/rtgui/flatfield.cc +++ b/rtgui/flatfield.cc @@ -43,7 +43,7 @@ FlatField::FlatField () : FoldableToolPanel(this, TOOL_NAME, M("TP_FLATFIELD_LAB bindCurrentFolder (*flatFieldFile, options.lastFlatfieldDir); ffLabel = Gtk::manage(new Gtk::Label(M("GENERAL_FILE"))); flatFieldFileReset = Gtk::manage(new Gtk::Button()); - flatFieldFileReset->set_image (*Gtk::manage(new RTImage ("cancel-small.png"))); + flatFieldFileReset->set_image (*Gtk::manage(new RTImage ("cancel-small", Gtk::ICON_SIZE_BUTTON))); hbff->pack_start(*ffLabel, Gtk::PACK_SHRINK); hbff->pack_start(*flatFieldFile); hbff->pack_start(*flatFieldFileReset, Gtk::PACK_SHRINK); diff --git a/rtgui/gradient.cc b/rtgui/gradient.cc index 26be51975..98d5eb8d6 100644 --- a/rtgui/gradient.cc +++ b/rtgui/gradient.cc @@ -33,7 +33,7 @@ Gradient::Gradient () : FoldableToolPanel(this, TOOL_NAME, M("TP_GRADIENT_LABEL" 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"))); + edit->add (*Gtk::manage (new RTImage ("crosshair-adjust", Gtk::ICON_SIZE_BUTTON))); edit->set_tooltip_text(M("EDIT_OBJECT_TOOLTIP")); editConn = edit->signal_toggled().connect( sigc::mem_fun(*this, &Gradient::editToggled) ); editHBox->pack_start(*edit, Gtk::PACK_SHRINK, 0); @@ -166,8 +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; diff --git a/rtgui/guiutils.cc b/rtgui/guiutils.cc index cb99b04a5..2bbdcd8cd 100644 --- a/rtgui/guiutils.cc +++ b/rtgui/guiutils.cc @@ -23,6 +23,7 @@ #include "../rtengine/utils.h" #include "../rtengine/procparams.h" #include "rtimage.h" +#include "rtscalable.h" #include "multilangmgr.h" #include @@ -31,12 +32,6 @@ using namespace std; -Glib::RefPtr MyExpander::inconsistentImage; -Glib::RefPtr MyExpander::enabledImage; -Glib::RefPtr MyExpander::disabledImage; -Glib::RefPtr MyExpander::openedImage; -Glib::RefPtr MyExpander::closedImage; - IdleRegister::~IdleRegister() { destroy(); @@ -131,13 +126,14 @@ Gtk::Border getPadding(const Glib::RefPtr style) return padding; } - int s = (double)RTScalable::getScale(); padding = style->get_padding(); - if (s > 1) { - padding.set_left(padding.get_left() * s); - padding.set_right(padding.get_right() * s); - padding.set_top(padding.get_top() * s); - padding.set_bottom(padding.get_bottom() * s); + + if (RTScalable::getGlobalScale() > 1.0) { + // Scale pixel border size based on DPI and Scale + padding.set_left(RTScalable::scalePixelSize(padding.get_left())); + padding.set_right(RTScalable::scalePixelSize(padding.get_right())); + padding.set_top(RTScalable::scalePixelSize(padding.get_top())); + padding.set_bottom(RTScalable::scalePixelSize(padding.get_bottom())); } return padding; @@ -536,27 +532,12 @@ void ExpanderBox::hideBox() Gtk::EventBox::hide(); } -void MyExpander::init() -{ - if (!inconsistentImage) { // if one is null, all are null - inconsistentImage = Glib::RefPtr(new RTImage("power-inconsistent-small.png")); - enabledImage = Glib::RefPtr(new RTImage("power-on-small.png")); - disabledImage = Glib::RefPtr(new RTImage("power-off-small.png")); - openedImage = Glib::RefPtr(new RTImage("expander-open-small.png")); - closedImage = Glib::RefPtr(new RTImage("expander-closed-small.png")); - } -} - -void MyExpander::cleanup() -{ - inconsistentImage.reset(); - enabledImage.reset(); - disabledImage.reset(); - openedImage.reset(); - closedImage.reset(); -} - MyExpander::MyExpander(bool useEnabled, Gtk::Widget* titleWidget) : + inconsistentImage("power-inconsistent-small"), + enabledImage("power-on-small"), + disabledImage("power-off-small"), + openedImage("expander-open-small"), + closedImage("expander-closed-small"), enabled(false), inconsistent(false), flushEvent(false), expBox(nullptr), child(nullptr), headerWidget(nullptr), statusImage(nullptr), label(nullptr), useEnabled(useEnabled) @@ -613,6 +594,11 @@ MyExpander::MyExpander(bool useEnabled, Gtk::Widget* titleWidget) : } MyExpander::MyExpander(bool useEnabled, Glib::ustring titleLabel) : + inconsistentImage("power-inconsistent-small"), + enabledImage("power-on-small"), + disabledImage("power-off-small"), + openedImage("expander-open-small"), + closedImage("expander-closed-small"), enabled(false), inconsistent(false), flushEvent(false), expBox(nullptr), child(nullptr), headerWidget(nullptr), label(nullptr), useEnabled(useEnabled) @@ -754,13 +740,13 @@ void MyExpander::set_inconsistent(bool isInconsistent) if (useEnabled) { if (isInconsistent) { - statusImage->set(inconsistentImage->get_surface()); + statusImage->set_from_icon_name(inconsistentImage); } else { if (enabled) { - statusImage->set(enabledImage->get_surface()); + statusImage->set_from_icon_name(enabledImage); get_style_context()->add_class("enabledTool"); } else { - statusImage->set(disabledImage->get_surface()); + statusImage->set_from_icon_name(disabledImage); get_style_context()->remove_class("enabledTool"); } } @@ -787,7 +773,7 @@ void MyExpander::setEnabled(bool isEnabled) enabled = false; if (!inconsistent) { - statusImage->set(disabledImage->get_surface()); + statusImage->set_from_icon_name(disabledImage); get_style_context()->remove_class("enabledTool"); message.emit(); } @@ -795,7 +781,7 @@ void MyExpander::setEnabled(bool isEnabled) enabled = true; if (!inconsistent) { - statusImage->set(enabledImage->get_surface()); + statusImage->set_from_icon_name(enabledImage); get_style_context()->add_class("enabledTool"); message.emit(); } @@ -826,9 +812,9 @@ void MyExpander::set_expanded( bool expanded ) if (!useEnabled) { if (expanded ) { - statusImage->set(openedImage->get_surface()); + statusImage->set_from_icon_name(openedImage); } else { - statusImage->set(closedImage->get_surface()); + statusImage->set_from_icon_name(closedImage); } } @@ -871,9 +857,9 @@ bool MyExpander::on_toggle(GdkEventButton* event) if (!useEnabled) { if (isVisible) { - statusImage->set(closedImage->get_surface()); + statusImage->set_from_icon_name(closedImage); } else { - statusImage->set(openedImage->get_surface()); + statusImage->set_from_icon_name(openedImage); } } @@ -898,11 +884,11 @@ bool MyExpander::on_enabled_change(GdkEventButton* event) if (event->button == 1) { if (enabled) { enabled = false; - statusImage->set(disabledImage->get_surface()); + statusImage->set_from_icon_name(disabledImage); get_style_context()->remove_class("enabledTool"); } else { enabled = true; - statusImage->set(enabledImage->get_surface()); + statusImage->set_from_icon_name(enabledImage); get_style_context()->add_class("enabledTool"); } @@ -966,17 +952,17 @@ bool MyScrolledWindow::on_scroll_event (GdkEventScroll* event) void MyScrolledWindow::get_preferred_width_vfunc (int &minimum_width, int &natural_width) const { - natural_width = minimum_width = 100 * RTScalable::getScale(); + natural_width = minimum_width = RTScalable::scalePixelSize(100); } void MyScrolledWindow::get_preferred_height_vfunc (int &minimum_height, int &natural_height) const { - natural_height = minimum_height = 50 * RTScalable::getScale(); + natural_height = minimum_height = RTScalable::scalePixelSize(50); } void MyScrolledWindow::get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const { - natural_height = minimum_height = 50 * RTScalable::getScale(); + natural_height = minimum_height = RTScalable::scalePixelSize(50); } /* @@ -1055,7 +1041,7 @@ void MyScrolledToolbar::get_preferred_height_vfunc (int &minimumHeight, int &nat MyComboBoxText::MyComboBoxText (bool has_entry) : Gtk::ComboBoxText(has_entry) { - minimumWidth = naturalWidth = 70; + minimumWidth = naturalWidth = RTScalable::scalePixelSize(70); Gtk::CellRendererText* cellRenderer = dynamic_cast(get_first_cell()); cellRenderer->property_ellipsize() = Pango::ELLIPSIZE_MIDDLE; add_events(Gdk::SCROLL_MASK|Gdk::SMOOTH_SCROLL_MASK); @@ -1079,12 +1065,12 @@ bool MyComboBoxText::on_scroll_event (GdkEventScroll* event) void MyComboBoxText::setPreferredWidth (int minimum_width, int natural_width) { if (natural_width == -1 && minimum_width == -1) { - naturalWidth = minimumWidth = 70 * RTScalable::getScale(); + naturalWidth = minimumWidth = RTScalable::scalePixelSize(70); } else if (natural_width == -1) { naturalWidth = minimumWidth = minimum_width; } else if (minimum_width == -1) { naturalWidth = natural_width; - minimumWidth = rtengine::max(naturalWidth / 2, 20); + minimumWidth = rtengine::max(naturalWidth / 2, RTScalable::scalePixelSize(20)); minimumWidth = rtengine::min(naturalWidth, minimumWidth); } else { naturalWidth = natural_width; @@ -1094,19 +1080,20 @@ void MyComboBoxText::setPreferredWidth (int minimum_width, int natural_width) void MyComboBoxText::get_preferred_width_vfunc (int &minimum_width, int &natural_width) const { - natural_width = rtengine::max(naturalWidth, 10 * RTScalable::getScale()); - minimum_width = rtengine::max(minimumWidth, 10 * RTScalable::getScale()); + natural_width = rtengine::max(naturalWidth, RTScalable::scalePixelSize(10)); + minimum_width = rtengine::max(minimumWidth, RTScalable::scalePixelSize(10)); } + void MyComboBoxText::get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const { - natural_width = rtengine::max(naturalWidth, 10 * RTScalable::getScale()); - minimum_width = rtengine::max(minimumWidth, 10 * RTScalable::getScale()); + natural_width = rtengine::max(naturalWidth, RTScalable::scalePixelSize(10)); + minimum_width = rtengine::max(minimumWidth, RTScalable::scalePixelSize(10)); } MyComboBox::MyComboBox () { - minimumWidth = naturalWidth = 70 * RTScalable::getScale(); + minimumWidth = naturalWidth = RTScalable::scalePixelSize(70); } bool MyComboBox::on_scroll_event (GdkEventScroll* event) @@ -1125,12 +1112,12 @@ bool MyComboBox::on_scroll_event (GdkEventScroll* event) void MyComboBox::setPreferredWidth (int minimum_width, int natural_width) { if (natural_width == -1 && minimum_width == -1) { - naturalWidth = minimumWidth = 70 * RTScalable::getScale(); + naturalWidth = minimumWidth = RTScalable::scalePixelSize(70); } else if (natural_width == -1) { naturalWidth = minimumWidth = minimum_width; } else if (minimum_width == -1) { naturalWidth = natural_width; - minimumWidth = rtengine::max(naturalWidth / 2, 20); + minimumWidth = rtengine::max(naturalWidth / 2, RTScalable::scalePixelSize(20)); minimumWidth = rtengine::min(naturalWidth, minimumWidth); } else { naturalWidth = natural_width; @@ -1140,13 +1127,14 @@ void MyComboBox::setPreferredWidth (int minimum_width, int natural_width) void MyComboBox::get_preferred_width_vfunc (int &minimum_width, int &natural_width) const { - natural_width = rtengine::max(naturalWidth, 10 * RTScalable::getScale()); - minimum_width = rtengine::max(minimumWidth, 10 * RTScalable::getScale()); + natural_width = rtengine::max(naturalWidth, RTScalable::scalePixelSize(10)); + minimum_width = rtengine::max(minimumWidth, RTScalable::scalePixelSize(10)); } + void MyComboBox::get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const { - natural_width = rtengine::max(naturalWidth, 10 * RTScalable::getScale()); - minimum_width = rtengine::max(minimumWidth, 10 * RTScalable::getScale()); + natural_width = rtengine::max(naturalWidth, RTScalable::scalePixelSize(10)); + minimum_width = rtengine::max(minimumWidth, RTScalable::scalePixelSize(10)); } MySpinButton::MySpinButton () @@ -1275,7 +1263,7 @@ MyFileChooserWidget::MyFileChooserWidget(const Glib::ustring &title, Gtk::FileCh std::unique_ptr MyFileChooserWidget::make_folder_image() { - return std::unique_ptr(new RTImage("folder-open-small.png")); + return std::unique_ptr(new RTImage("folder-open-small", Gtk::ICON_SIZE_BUTTON)); } void MyFileChooserWidget::show_chooser(Gtk::Widget *parent) @@ -1475,11 +1463,12 @@ bool MyFileChooserButton::on_scroll_event (GdkEventScroll* event) void MyFileChooserButton::get_preferred_width_vfunc (int &minimum_width, int &natural_width) const { - minimum_width = natural_width = 35 * RTScalable::getScale(); + minimum_width = natural_width = RTScalable::scalePixelSize(35); } + void MyFileChooserButton::get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const { - minimum_width = natural_width = 35 * RTScalable::getScale(); + minimum_width = natural_width = RTScalable::scalePixelSize(35); } @@ -1535,10 +1524,10 @@ void MyFileChooserEntry::on_filename_set() } -TextOrIcon::TextOrIcon (const Glib::ustring &fname, const Glib::ustring &labelTx, const Glib::ustring &tooltipTx) +TextOrIcon::TextOrIcon (const Glib::ustring &icon_name, const Glib::ustring &labelTx, const Glib::ustring &tooltipTx) { - RTImage *img = Gtk::manage(new RTImage(fname)); + RTImage *img = Gtk::manage(new RTImage(icon_name, Gtk::ICON_SIZE_LARGE_TOOLBAR)); pack_start(*img, Gtk::PACK_SHRINK, 0); set_tooltip_markup("" + labelTx + "\n" + tooltipTx); @@ -1554,19 +1543,19 @@ public: Gtk::Label* label; Impl(RTImage* image, Gtk::Label* label) : image(image), label(label) {} - static std::unique_ptr createImage(const Glib::ustring& fileName); + static std::unique_ptr createImage(const Glib::ustring& iconName); }; -std::unique_ptr ImageAndLabel::Impl::createImage(const Glib::ustring& fileName) +std::unique_ptr ImageAndLabel::Impl::createImage(const Glib::ustring& iconName) { - if (fileName.empty()) { + if (iconName.empty()) { return nullptr; } - return std::unique_ptr(new RTImage(fileName)); + return std::unique_ptr(new RTImage(iconName, Gtk::ICON_SIZE_LARGE_TOOLBAR)); } -ImageAndLabel::ImageAndLabel(const Glib::ustring& label, const Glib::ustring& imageFileName) : - ImageAndLabel(label, Gtk::manage(Impl::createImage(imageFileName).release())) +ImageAndLabel::ImageAndLabel(const Glib::ustring& label, const Glib::ustring& iconName) : + ImageAndLabel(label, Gtk::manage(Impl::createImage(iconName).release())) { } @@ -1602,15 +1591,15 @@ 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, const Glib::ustring &iconName) : + widget(new ImageAndLabel(label, iconName)) {} 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)) +MyImageMenuItem::MyImageMenuItem(const Glib::ustring& label, const Glib::ustring& iconName) : + pimpl(new Impl(label, iconName)) { add(*(pimpl->getWidget())); } @@ -1653,18 +1642,18 @@ const Gtk::Label* MyRadioImageMenuItem::getLabel() const return pimpl->getWidget()->getLabel(); } -MyProgressBar::MyProgressBar(int width) : w(rtengine::max(width, 10 * RTScalable::getScale())) {} -MyProgressBar::MyProgressBar() : w(200 * RTScalable::getScale()) {} +MyProgressBar::MyProgressBar(int width) : w(rtengine::max(width, RTScalable::scalePixelSize(10))) {} +MyProgressBar::MyProgressBar() : w(RTScalable::scalePixelSize(200)) {} void MyProgressBar::setPreferredWidth(int width) { - w = rtengine::max(width, 10 * RTScalable::getScale()); + w = rtengine::max(width, RTScalable::scalePixelSize(10)); } void MyProgressBar::get_preferred_width_vfunc (int &minimum_width, int &natural_width) const { - minimum_width = rtengine::max(w / 2, 50 * RTScalable::getScale()); - natural_width = rtengine::max(w, 50 * RTScalable::getScale()); + minimum_width = rtengine::max(w / 2, RTScalable::scalePixelSize(50)); + natural_width = rtengine::max(w, RTScalable::scalePixelSize(50)); } void MyProgressBar::get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const @@ -2031,7 +2020,7 @@ Gtk::ToggleButton SpotPicker::spotButtonTemplate(Glib::ustring const &key, const setExpandAlignProperties(&spotButton, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); spotButton.get_style_context()->add_class("independent"); spotButton.set_tooltip_text(tooltip); - spotButton.set_image(*Gtk::manage(new RTImage("color-picker-small.png"))); + spotButton.set_image_from_icon_name("color-picker-small"); return spotButton; } @@ -2039,3 +2028,42 @@ void SpotPicker::spotSizeChanged() { _spotHalfWidth = atoi(_spotSizeSetter.get_active_text().c_str()); } + +// OptionalRadioButtonGroup class + +void OptionalRadioButtonGroup::onButtonToggled(Gtk::ToggleButton *button) +{ + if (!button) { + return; + } + + if (button->get_active()) { + if (active_button == button) { + // Same button, noting to do. + } else if (active_button) { + // Deactivate the other button. + active_button->set_active(false); + } + active_button = button; + } else { + if (active_button == button) { + // Active button got deactivated. + active_button = nullptr; + } else { + // No effect on other buttons. + } + } +} + +Gtk::ToggleButton *OptionalRadioButtonGroup::getActiveButton() const +{ + return active_button; +} + +void OptionalRadioButtonGroup::register_button(Gtk::ToggleButton &button) +{ + button.signal_toggled().connect(sigc::bind( + sigc::mem_fun(this, &OptionalRadioButtonGroup::onButtonToggled), + &button)); + onButtonToggled(&button); +} diff --git a/rtgui/guiutils.h b/rtgui/guiutils.h index 02811e076..169d0ae11 100644 --- a/rtgui/guiutils.h +++ b/rtgui/guiutils.h @@ -203,11 +203,11 @@ public: typedef sigc::signal type_signal_enabled_toggled; private: type_signal_enabled_toggled message; - static Glib::RefPtr inconsistentImage; /// "inconsistent" image, displayed when useEnabled is true ; in this case, nothing will tell that an expander is opened/closed - static Glib::RefPtr enabledImage; /// "enabled" image, displayed when useEnabled is true ; in this case, nothing will tell that an expander is opened/closed - static Glib::RefPtr disabledImage; /// "disabled" image, displayed when useEnabled is true ; in this case, nothing will tell that an expander is opened/closed - static Glib::RefPtr openedImage; /// "opened" image, displayed when useEnabled is false - static Glib::RefPtr closedImage; /// "closed" image, displayed when useEnabled is false + const Glib::ustring inconsistentImage; /// "inconsistent" image, displayed when useEnabled is true ; in this case, nothing will tell that an expander is opened/closed + const Glib::ustring enabledImage; /// "enabled" image, displayed when useEnabled is true ; in this case, nothing will tell that an expander is opened/closed + const Glib::ustring disabledImage; /// "disabled" image, displayed when useEnabled is true ; in this case, nothing will tell that an expander is opened/closed + const Glib::ustring openedImage; /// "opened" image, displayed when useEnabled is false + const Glib::ustring closedImage; /// "closed" image, displayed when useEnabled is false 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 @@ -250,10 +250,6 @@ public: */ MyExpander(bool useEnabled, Gtk::Widget* titleWidget); - /// Initialize the class by loading the images - static void init(); - static void cleanup(); - Glib::SignalProxy1< bool, GdkEventButton* > signal_button_release_event() { return titleEvBox->signal_button_release_event(); @@ -518,7 +514,7 @@ class TextOrIcon final : public Gtk::Box { public: - TextOrIcon (const Glib::ustring &filename, const Glib::ustring &labelTx, const Glib::ustring &tooltipTx); + TextOrIcon (const Glib::ustring &icon_name, const Glib::ustring &labelTx, const Glib::ustring &tooltipTx); }; /** @@ -530,7 +526,7 @@ class ImageAndLabel final : public Gtk::Box std::unique_ptr pimpl; public: - ImageAndLabel(const Glib::ustring& label, const Glib::ustring& imageFileName); + ImageAndLabel(const Glib::ustring& label, const Glib::ustring& iconName); ImageAndLabel(const Glib::ustring& label, RTImage* image); const RTImage* getImage() const; const Gtk::Label* getLabel() const; @@ -554,7 +550,7 @@ class MyImageMenuItem final : public Gtk::MenuItem, public MyImageMenuItemInterf std::unique_ptr pimpl; public: - MyImageMenuItem (const Glib::ustring& label, const Glib::ustring& imageFileName); + MyImageMenuItem (const Glib::ustring& label, const Glib::ustring& iconName); MyImageMenuItem (const Glib::ustring& label, RTImage* image); const RTImage *getImage () const; const Gtk::Label* getLabel() const override; @@ -760,6 +756,30 @@ class SpotPicker : public Gtk::Grid void spotSizeChanged(); }; +/** + * Enforces the rule that zero or one registered toggle button is enabled at any + * given time. + */ +class OptionalRadioButtonGroup +{ + Gtk::ToggleButton *active_button{nullptr}; + + void onButtonToggled(Gtk::ToggleButton *button); + +public: + /** + * Returns the toggle button that is active, or null if none are active. + */ + Gtk::ToggleButton *getActiveButton() const; + /** + * Adds a toggle button to this group. + * + * If the provided button is active, any existing active button in this + * group will be deactivated. + */ + void register_button(Gtk::ToggleButton &button); +}; + inline void setActiveTextOrIndex(Gtk::ComboBoxText &comboBox, const Glib::ustring &text, int index) { bool valueSet = false; diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index b804218f5..6d866bdb7 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -23,6 +23,7 @@ #include #include #include "rtimage.h" +#include "rtscalable.h" #include "../rtengine/array2D.h" #include "../rtengine/color.h" #include "../rtengine/improcfun.h" @@ -50,24 +51,28 @@ HistogramPanel::HistogramPanel () : pointer_moved_delayed_call( [this](bool validPos, const rtengine::procparams::ColorManagementParams *cmp, int r, int g, int b) { - bool update_hist_area; + bool update_hist_area = false, update_hist_rgb_area = false; if (!validPos) { // do something to un-show vertical bars if (histogramRGBArea) { - histogramRGBArea->updateBackBuffer(-1, -1, -1); + update_hist_rgb_area = histogramRGBArea->updatePointer(-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_rgb_area = histogramRGBArea->updatePointer(r, g, b, cmp); } + update_hist_area = histogramArea->updatePointer(r, g, b, cmp); } - if (histogramRGBArea) { + + if (histogramRGBArea && update_hist_rgb_area) { histogramRGBArea->queue_draw(); } + if (update_hist_area) { histogramArea->queue_draw(); } @@ -123,30 +128,30 @@ HistogramPanel::HistogramPanel () : 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"); - barImage = new RTImage ("histogram-bar-on-small.png"); + redImage = new RTImage ("histogram-red-on-small", Gtk::ICON_SIZE_BUTTON); + greenImage = new RTImage ("histogram-green-on-small", Gtk::ICON_SIZE_BUTTON); + blueImage = new RTImage ("histogram-blue-on-small", Gtk::ICON_SIZE_BUTTON); + valueImage = new RTImage ("histogram-silver-on-small", Gtk::ICON_SIZE_BUTTON); + chroImage = new RTImage ("histogram-gold-on-small", Gtk::ICON_SIZE_BUTTON); + barImage = new RTImage ("histogram-bar-on-small", Gtk::ICON_SIZE_BUTTON); - redImage_g = new RTImage ("histogram-red-off-small.png"); - greenImage_g = new RTImage ("histogram-green-off-small.png"); - blueImage_g = new RTImage ("histogram-blue-off-small.png"); - valueImage_g = new RTImage ("histogram-silver-off-small.png"); - chroImage_g = new RTImage ("histogram-gold-off-small.png"); - barImage_g = new RTImage ("histogram-bar-off-small.png"); + redImage_g = new RTImage ("histogram-red-off-small", Gtk::ICON_SIZE_BUTTON); + greenImage_g = new RTImage ("histogram-green-off-small", Gtk::ICON_SIZE_BUTTON); + blueImage_g = new RTImage ("histogram-blue-off-small", Gtk::ICON_SIZE_BUTTON); + valueImage_g = new RTImage ("histogram-silver-off-small", Gtk::ICON_SIZE_BUTTON); + chroImage_g = new RTImage ("histogram-gold-off-small", Gtk::ICON_SIZE_BUTTON); + barImage_g = new RTImage ("histogram-bar-off-small", Gtk::ICON_SIZE_BUTTON); - mode0Image = new RTImage ("histogram-mode-linear-small.png"); - mode1Image = new RTImage ("histogram-mode-logx-small.png"); - mode2Image = new RTImage ("histogram-mode-logxy-small.png"); + mode0Image = new RTImage ("histogram-mode-linear-small", Gtk::ICON_SIZE_BUTTON); + mode1Image = new RTImage ("histogram-mode-logx-small", Gtk::ICON_SIZE_BUTTON); + mode2Image = new RTImage ("histogram-mode-logxy-small", Gtk::ICON_SIZE_BUTTON); - 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")); + Gtk::Image* histImage = Gtk::manage(new RTImage("histogram-type-histogram-small", Gtk::ICON_SIZE_BUTTON)); + Gtk::Image* histRawImage = Gtk::manage(new RTImage("histogram-type-histogram-raw-small", Gtk::ICON_SIZE_BUTTON)); + Gtk::Image* paradeImage = Gtk::manage(new RTImage("histogram-type-parade-small", Gtk::ICON_SIZE_BUTTON)); + Gtk::Image* waveImage = Gtk::manage(new RTImage("histogram-type-waveform-small", Gtk::ICON_SIZE_BUTTON)); + Gtk::Image* vectHcImage = Gtk::manage(new RTImage("histogram-type-vectorscope-hc-small", Gtk::ICON_SIZE_BUTTON)); + Gtk::Image* vectHsImage = Gtk::manage(new RTImage("histogram-type-vectorscope-hs-small", Gtk::ICON_SIZE_BUTTON)); showRed = Gtk::manage (new Gtk::ToggleButton ()); showGreen = Gtk::manage (new Gtk::ToggleButton ()); @@ -284,17 +289,17 @@ HistogramPanel::HistogramPanel () : case ScopeType::NONE: break; } - scopeOptions->set_image(*Gtk::manage(new RTImage("histogram-ellipsis-small.png"))); + scopeOptions->set_image(*Gtk::manage(new RTImage("histogram-ellipsis-small"))); showBAR->set_image (showBAR->get_active() ? *barImage : *barImage_g); - setExpandAlignProperties(showRed , false, false, Gtk::ALIGN_CENTER, 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(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(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(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); @@ -369,9 +374,13 @@ HistogramPanel::HistogramPanel () : optionButtons->set_visible(options.histogramShowOptionButtons); type_changed(); - updateHistAreaOptions(); + + // Update histogramArea internal parameters from options + histogramArea->updateFromOptions(); + if (histogramRGBArea) { - updateHistRGBAreaOptions(); + // Update histogramRGBArea internal parameters from options + histogramRGBArea->updateFromOptions(); } brightness_changed_connection = histogramArea->getBrighnessChangedSignal().connect(sigc::mem_fun(*this, &HistogramPanel::brightnessUpdated)); @@ -400,7 +409,6 @@ HistogramPanel::~HistogramPanel () delete valueImage_g; delete chroImage_g; delete barImage_g; - } void HistogramPanel::showRGBBar() @@ -409,15 +417,6 @@ void HistogramPanel::showRGBBar() 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) @@ -428,14 +427,15 @@ void HistogramPanel::resized (Gtk::Allocation& req) bool size_changed = old_height != req.get_height() || old_width != req.get_width(); - if (!histogramArea->updatePending() && size_changed) { - histogramArea->updateBackBuffer (); + // Set HistogramArea invalid + if (size_changed) { + histogramArea->updatePointer(-1, -1, -1); histogramArea->queue_draw (); } - // set histogramRGBArea invalid; + // Set HistogramRGBArea invalid if (histogramRGBArea && size_changed) { - histogramRGBArea->updateBackBuffer(-1, -1, -1); + histogramRGBArea->updatePointer(-1, -1, -1); histogramRGBArea->queue_draw (); } @@ -448,43 +448,65 @@ void HistogramPanel::resized (Gtk::Allocation& req) void HistogramPanel::red_toggled () { + // Update button image showRed->set_image(showRed->get_active() ? *redImage : *redImage_g); + // Update options value + options.histogramRed = showRed->get_active() ? true : false; + // Update drawing areas rgbv_toggled(); } + void HistogramPanel::green_toggled () { + // Update button image showGreen->set_image(showGreen->get_active() ? *greenImage : *greenImage_g); + // Update options value + options.histogramGreen = showGreen->get_active() ? true : false; + // Update drawing areas rgbv_toggled(); } + void HistogramPanel::blue_toggled () { + // Update button image showBlue->set_image(showBlue->get_active() ? *blueImage : *blueImage_g); + // Update options value + options.histogramBlue = showBlue->get_active() ? true : false; + // Update drawing areas rgbv_toggled(); } void HistogramPanel::value_toggled () { - removeIfThere(showValue, valueImage, false); - removeIfThere(showValue, valueImage_g, false); + // Update button image showValue->set_image(showValue->get_active() ? *valueImage : *valueImage_g); + // Update options value + options.histogramLuma = showValue->get_active() ? true : false; + // Update drawing areas rgbv_toggled(); } void HistogramPanel::chro_toggled () { - removeIfThere(showChro, chroImage, false); - removeIfThere(showChro, chroImage_g, false); + // Update button image showChro->set_image(showChro->get_active() ? *chroImage : *chroImage_g); + // Update options value + options.histogramChroma = showChro->get_active() ? true : false; + // Update drawing areas rgbv_toggled(); } void HistogramPanel::mode_released () { + // Update options value options.histogramDrawMode = (options.histogramDrawMode + 1) % 3; - if (options.histogramDrawMode == 0) + // Update button image + if (options.histogramDrawMode == 0) { showMode->set_image(*mode0Image); - else if (options.histogramDrawMode == 1) + } else if (options.histogramDrawMode == 1) { showMode->set_image(*mode1Image); - else + } else { showMode->set_image(*mode2Image); + } + // Update drawing areas rgbv_toggled(); } @@ -503,12 +525,15 @@ void HistogramPanel::brightnessUpdated(float brightness) void HistogramPanel::scopeOptionsToggled() { + // Update options value options.histogramShowOptionButtons = scopeOptions->get_active(); + // Show/hide secondary buttons column optionButtons->set_visible(scopeOptions->get_active()); } void HistogramPanel::type_selected(Gtk::RadioButton* button) { + // Get radio button value ScopeType new_type = ScopeType::NONE; if (button == scopeHistBtn) { @@ -525,19 +550,35 @@ void HistogramPanel::type_selected(Gtk::RadioButton* button) new_type = ScopeType::VECTORSCOPE_HS; } + // Do not update if selected radio button is identical if (new_type == options.histogramScopeType) { return; } + // Update options value options.histogramScopeType = new_type; - + // Update histogram panel GUI based on scope type type_changed(); - updateHistAreaOptions(); + if (histogramRGBArea) { - updateHistRGBAreaOptions(); + // Update histogramRGBArea internal parameters from options + histogramRGBArea->updateFromOptions(); + // Set pointer invalid for histogramRGBArea + histogramRGBArea->updatePointer(-1, -1, -1); + // Update drawing area + histogramRGBArea->queue_draw (); } - histogramArea->setDirty(true); - histogramArea->queue_draw(); + + // Update histogramArea internal parameters from options + histogramArea->updateFromOptions(); + // Set pointer invalid for histogramArea + histogramArea->updatePointer(-1, -1, -1); + // Update drawing area + // Note: No need to call queue_draw as an update of histogram data + // is requested in the type_changed function: queue_draw call will + // be performed in update function when updated histogram data are + // provided + // histogramArea->queue_draw(); } void HistogramPanel::type_changed() @@ -596,43 +637,48 @@ void HistogramPanel::type_changed() break; } + // Request histogram data update if (panel_listener) { - updateHistAreaOptions(); panel_listener->scopeTypeChanged(options.histogramScopeType); } + // Update histogram bar visibility showRGBBar(); } void HistogramPanel::bar_toggled () { + // Update button image showBAR->set_image(showBAR->get_active() ? *barImage : *barImage_g); + // Update options value + options.histogramBar = showBAR->get_active() ? true : false; + // Update drawing areas rgbv_toggled(); + // Update histogram bar visibility showRGBBar(); } void HistogramPanel::rgbv_toggled () { // Update Display - updateHistAreaOptions(); - histogramArea->updateBackBuffer (); + // Update histogramArea internal parameters from options + histogramArea->updateFromOptions(); + // Set pointer invalid for histogramArea + histogramArea->updatePointer(-1, -1, -1); + // Update drawing area histogramArea->queue_draw (); if (histogramRGBArea) { - updateHistRGBAreaOptions(); - histogramRGBArea->updateBackBuffer(-1, -1, -1); + // Update histogramRGBArea internal parameters from options + histogramRGBArea->updateFromOptions(); + // Set pointer invalid for histogramRGBArea + histogramRGBArea->updatePointer(-1, -1, -1); + // Update drawing area histogramRGBArea->queue_draw (); } } -void HistogramPanel::setHistRGBInvalid () -{ - // do something to un-show vertical bars - histogramRGBArea->updateBackBuffer(-1, -1, -1); - histogramRGBArea->queue_draw (); -} - -void HistogramPanel::pointerMoved(bool validPos, const rtengine::procparams::ColorManagementParams &cmp, 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) { pointer_moved_delayed_call(validPos, &cmp, r, g, b); } @@ -692,32 +738,6 @@ void HistogramPanel::setPanelListener(HistogramPanelListener* listener) } } -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() - ); -} - // // // @@ -733,31 +753,19 @@ double HistogramScaling::log(double vsize, double val) // // HistogramRGBArea 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), - showMode(options.histogramBar), barDisplayed(options.histogramBar), parent(nullptr) + // Saved pointer parameters + r(-1), g(-1), b(-1), lab_L(0.f), lab_a(0.f), lab_b(0.f), pointerValid(false), + // Drawing options (initialized at options file values) + needRed(options.histogramRed), needGreen(options.histogramGreen), + needBlue(options.histogramBlue), needLuma(options.histogramLuma), + needChroma(options.histogramChroma), scopeType(options.histogramScopeType), + scaleMode(options.histogramDrawMode), showBar(options.histogramBar) { get_style_context()->add_class("drawingarea"); set_name("HistogramRGBArea"); - - harih = new HistogramRGBAreaIdleHelper; - harih->harea = this; - harih->destroyed = false; - harih->pending = 0; -} - -HistogramRGBArea::~HistogramRGBArea () -{ - idle_register.destroy(); - - if (harih->pending) { - harih->destroyed = true; - } else { - delete harih; - } } +HistogramRGBArea::~HistogramRGBArea () {} void HistogramRGBArea::getPreferredThickness(int& min_thickness, int& natural_thickness) const { @@ -769,21 +777,18 @@ void HistogramRGBArea::getPreferredThickness(int& min_thickness, int& natural_th void HistogramRGBArea::getPreferredLength(int& min_length, int& natural_length) const { - int s = RTScalable::getScale(); - min_length = 60 * s; - natural_length = 200 * s; + min_length = RTScalable::scalePixelSize(60); + natural_length = RTScalable::scalePixelSize(200); } void HistogramRGBArea::getPreferredThicknessForLength(int length, int& min_thickness, int& natural_thickness) const { int bThickness = length / 30; - int s = RTScalable::getScale(); - - if (bThickness > (10 * s)) { - bThickness = 10 * s; - } else if (bThickness < (5 * s)) { - bThickness = 5 * s; + if (bThickness > RTScalable::scalePixelSize(10)) { + bThickness = RTScalable::scalePixelSize(10); + } else if (bThickness < RTScalable::scalePixelSize(5)) { + bThickness = RTScalable::scalePixelSize(5); } min_thickness = bThickness; @@ -796,175 +801,139 @@ void HistogramRGBArea::getPreferredLengthForThickness(int thickness, int& min_le getPreferredLength(min_length, natural_length); } -bool HistogramRGBArea::getShow() +void HistogramRGBArea::updateDrawingArea (const ::Cairo::RefPtr< Cairo::Context> &cc) { - return(showMode); -} - -void HistogramRGBArea::setShow(bool show) -{ - 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 - )) { + // Do not update drawing area if widget is not realized + if (!get_realized ()) { return; } - // Mostly not necessary, but should be in some case - GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + // Do not update drawing area if bar is not visible + // (by user choice or according to scope type) + if (!showBar || scopeType == Options::ScopeType::HISTOGRAM_RAW || + scopeType == Options::ScopeType::VECTORSCOPE_HC || + scopeType == Options::ScopeType::VECTORSCOPE_HS) { + return; + } + + // Do not update drawing area if pointer is not valid + if (!pointerValid) { + return; + } + + // Note: updateDrawingArea is called by the on_draw function so its call does not need to be protected + // GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected Glib::RefPtr window = get_window(); int winx, winy, winw, winh; window->get_geometry(winx, winy, winw, winh); - double s = RTScalable::getScale(); + cc->set_operator (Cairo::OPERATOR_OVER); + cc->set_antialias(Cairo::ANTIALIAS_NONE); + cc->set_line_width (1.0); - // This will create or update the size of the BackBuffer::surface - setDrawRectangle(Cairo::FORMAT_ARGB32, 0, 0, winw, winh, true); - - if (surface) { - Cairo::RefPtr cc = Cairo::Context::create(surface); - - cc->set_source_rgba (0., 0., 0., 0.); - cc->set_operator (Cairo::OPERATOR_CLEAR); - cc->paint (); - cc->set_operator (Cairo::OPERATOR_OVER); - - cc->set_antialias(Cairo::ANTIALIAS_NONE); - cc->set_line_width (1.0 * s); - - if ( r != -1 && g != -1 && b != -1 ) { - if (needRed) { - // Red - cc->set_source_rgb(1.0, 0.0, 0.0); - drawBar(cc, r, 255.0, winw, winh, s); - } - - if (needGreen) { - // Green - cc->set_source_rgb(0.0, 1.0, 0.0); - drawBar(cc, g, 255.0, winw, winh, s); - } - - if (needBlue) { - // Blue - cc->set_source_rgb(0.0, 0.4, 1.0); - drawBar(cc, b, 255.0, winw, winh, s); - } - - if( - (needLuma || needChroma) - && (options.histogramScopeType == ScopeType::HISTOGRAM - || options.histogramScopeType == ScopeType::PARADE - || options.histogramScopeType == ScopeType::WAVEFORM) - ) { - float Lab_L, Lab_a, Lab_b; - 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); - drawBar(cc, Lab_L, 32768., winw, winh, s); - } - - if (needChroma && options.histogramScopeType == ScopeType::HISTOGRAM) { - // Chroma - double chromaval = sqrt(Lab_a * Lab_a + Lab_b * Lab_b) / (255. * 188); - cc->set_source_rgb(0.9, 0.9, 0.0); - drawBar(cc, chromaval, 1.0, winw, winh, s); - } - } - } + if (needRed) { + // Red + cc->set_source_rgb(1.0, 0.0, 0.0); + drawBar(cc, r, 255.0, winw, winh); } - setDirty(false); + if (needGreen) { + // Green + cc->set_source_rgb(0.0, 1.0, 0.0); + drawBar(cc, g, 255.0, winw, winh); + } + + if (needBlue) { + // Blue + cc->set_source_rgb(0.0, 0.4, 1.0); + drawBar(cc, b, 255.0, winw, winh); + } + + if ((needLuma || needChroma) + && (scopeType == Options::ScopeType::HISTOGRAM + || scopeType == Options::ScopeType::PARADE + || scopeType == Options::ScopeType::WAVEFORM)) { + if (needLuma) { + // Luma + cc->set_source_rgb(1.0, 1.0, 1.0); + drawBar(cc, lab_L, 32768., winw, winh); + } + + if (needChroma && scopeType == Options::ScopeType::HISTOGRAM) { + // Chroma + double chromaval = sqrt(lab_a * lab_a + lab_b * lab_b) / (255. * 188); + cc->set_source_rgb(0.9, 0.9, 0.0); + drawBar(cc, chromaval, 1.0, winw, winh); + } + } } -void HistogramRGBArea::update (int valh, int rh, int gh, int bh) +bool HistogramRGBArea::updatePointer (const int new_r, const int new_g, const int new_b, const rtengine::procparams::ColorManagementParams *cmp) { + // Do not update pointer values if bar is not visible + // (by user choice or according to scope type) + if (!showBar || scopeType == Options::ScopeType::HISTOGRAM_RAW || + scopeType == Options::ScopeType::VECTORSCOPE_HC || + scopeType == Options::ScopeType::VECTORSCOPE_HS) { + return false; + } - if (valh) { - val = valh; - r = rh; - g = gh; - b = bh; - valid = true; + // Do not update pointer values if values are identical + if (r == new_r && g == new_g && b == new_b) { + return false; + } + + // Set pointer parameters to invalid if r = g = b = -1 + if (new_r == -1 || new_g == -1 || new_b == -1) { + r = b = g = -1; + lab_L = lab_a = lab_b = 0.; + pointerValid = false; } else { - valid = false; + r = new_r; + g = new_g; + b = new_b; + ImProcFunctions::rgb2lab( + static_cast(r), + static_cast(g), + static_cast(b), + lab_L, lab_a, lab_b, + cmp != nullptr ? *cmp : DEFAULT_CMP, + true); + pointerValid = true; } - harih->pending++; - - idle_register.add( - [this]() -> bool - { - if (harih->destroyed) { - if (harih->pending == 1) { - delete harih; - } else { - --harih->pending; - } - - return false; - } - - harih->harea->updateBackBuffer(-1, -1, -1); - harih->harea->queue_draw (); - - --harih->pending; - - return false; - } - ); + return true; } -void HistogramRGBArea::updateOptions (bool r, bool g, bool b, bool l, bool c, bool bar) +void HistogramRGBArea::updateFromOptions () { - - options.histogramRed = needRed = r; - options.histogramGreen = needGreen = g; - options.histogramBlue = needBlue = b; - options.histogramLuma = needLuma = l; - options.histogramChroma = needChroma = c; - options.histogramBar = showMode = bar; - + needRed = options.histogramRed; + needGreen = options.histogramGreen; + needBlue = options.histogramBlue; + needLuma = options.histogramLuma; + needChroma = options.histogramChroma; + scopeType = options.histogramScopeType; + scaleMode = options.histogramDrawMode; + showBar = options.histogramBar; } void HistogramRGBArea::on_realize () { - Gtk::DrawingArea::on_realize(); add_events(Gdk::BUTTON_PRESS_MASK); } bool HistogramRGBArea::on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) { - const Glib::RefPtr style = get_style_context(); - style->render_background(cr, 0, 0, get_width(), get_height()); + style->render_background(cr, 0., 0., static_cast(get_width()), static_cast(get_height())); - // on_realize & updateBackBuffer have to be called before - if (surface) { - if (isDirty()) { // not sure this could happen... - updateBackBuffer(-1, -1, -1); - } + // Draw drawing area + // Note: As drawing area surface is updated inside on_draw function, hidpi is automatically supported + updateDrawingArea(cr); - copySurface(cr, NULL); - } - - style->render_frame (cr, 0, 0, get_width(), get_height()); + style->render_frame (cr, 0., 0., static_cast(get_width()), static_cast(get_height())); return true; } @@ -982,18 +951,22 @@ bool HistogramRGBArea::on_button_press_event (GdkEventButton* event) void HistogramRGBArea::factorChanged (double newFactor) { factor = newFactor; + // Request bar redraw (according to scope type) + if (scopeType == Options::ScopeType::HISTOGRAM) { + queue_draw(); + } } -void HistogramRGBAreaHori::drawBar(Cairo::RefPtr cc, double value, double max_value, int winw, int winh, double scale) +void HistogramRGBAreaHori::drawBar(const Cairo::RefPtr &cc, const double value, const double max_value, const int winw, const int winh) { double pos; if (options.histogramDrawMode < 2) { - pos = padding + value * (winw - padding * 2.0) / max_value + 0.5 * scale; + pos = padding + value * (winw - padding * 2.0) / max_value; } else { - pos = padding + HistogramScaling::log (max_value, value) * (winw - padding * 2.0) / max_value + 0.5 * scale; + pos = padding + HistogramScaling::log (max_value, value) * (winw - padding * 2.0) / max_value; } cc->move_to(pos, 0.0); - cc->line_to(pos, winh - 0.0); + cc->line_to(pos, static_cast(winh)); cc->stroke(); } @@ -1022,13 +995,13 @@ void HistogramRGBAreaHori::get_preferred_width_for_height_vfunc (int height, int getPreferredLengthForThickness(height, minimum_width, natural_width); } -void HistogramRGBAreaVert::drawBar(Cairo::RefPtr cc, double value, double max_value, int winw, int winh, double scale) +void HistogramRGBAreaVert::drawBar(const Cairo::RefPtr &cc, const double value, const double max_value, const int winw, const int winh) { 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; + pos = padding + value * (winh - padding * 2.0 - 1) / max_value + 0.5; } else { - pos = padding + HistogramScaling::log (max_value, value) * (winh - padding * 2.0) / max_value + 0.5 * scale; + pos = padding + HistogramScaling::log (max_value, value) * (winh - padding * 2.0) / max_value + 0.5; } cc->move_to(0.0, winh - pos); cc->line_to(winw, winh - pos); @@ -1047,7 +1020,7 @@ void HistogramRGBAreaVert::get_preferred_height_vfunc (int &minimum_height, int void HistogramRGBAreaVert::get_preferred_width_vfunc (int &minimum_width, int &natural_width) const { - minimum_width = 10 * RTScalable::getScale(); + minimum_width = RTScalable::scalePixelSize(10); natural_width = minimum_width; } @@ -1066,6 +1039,7 @@ void HistogramRGBAreaVert::get_preferred_width_for_height_vfunc (int height, int // // HistogramArea HistogramArea::HistogramArea (DrawModeListener *fml) : + // Histogram parameters vectorscope_scale(0), vect_hc(0, 0), vect_hs(0, 0), vect_hc_buffer_dirty(true), vect_hs_buffer_dirty(true), @@ -1073,18 +1047,22 @@ HistogramArea::HistogramArea (DrawModeListener *fml) : 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), + LUT_valid(false), + // Intensity of waveform and vectorscope trace + trace_brightness(1.f), + // Saved pointer parameters + pointer_red(-1), pointer_green(-1), pointer_blue(-1), + pointer_a(0.f), pointer_b(0.f), + pointer_valid(false), + // Drawing options needRed(options.histogramRed), needGreen(options.histogramGreen), needBlue(options.histogramBlue), 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) + scopeType(options.histogramScopeType), + drawMode(options.histogramDrawMode), myDrawModeListener(fml), + // Motion event management + isPressed(false), movingPosition(0.0) { - rhist(256); ghist(256); bhist(256); @@ -1093,22 +1071,11 @@ HistogramArea::HistogramArea (DrawModeListener *fml) : get_style_context()->add_class("drawingarea"); set_name("HistogramArea"); - - haih = new HistogramAreaIdleHelper; - haih->harea = this; - haih->destroyed = false; - haih->pending = 0; } HistogramArea::~HistogramArea () { idle_register.destroy(); - - if (haih->pending) { - haih->destroyed = true; - } else { - delete haih; - } } Gtk::SizeRequestMode HistogramArea::get_request_mode_vfunc () const @@ -1118,22 +1085,18 @@ Gtk::SizeRequestMode HistogramArea::get_request_mode_vfunc () const void HistogramArea::get_preferred_height_vfunc (int &minimum_height, int &natural_height) const { - int s = RTScalable::getScale(); - minimum_height = 100 * s; - natural_height = 200 * s; + minimum_height = RTScalable::scalePixelSize(100); + natural_height = RTScalable::scalePixelSize(200); } void HistogramArea::get_preferred_width_vfunc (int &minimum_width, int &natural_width) const { - - int s = RTScalable::getScale(); - minimum_width = 200 * s; - natural_width = 400 * s; + minimum_width = RTScalable::scalePixelSize(200); + natural_width = RTScalable::scalePixelSize(400); } void HistogramArea::get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const { - minimum_height = 0; natural_height = 0; } @@ -1143,23 +1106,19 @@ 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, int mode, ScopeType type, bool pointer) +void HistogramArea::updateFromOptions () { - wave_buffer_dirty = wave_buffer_dirty || needRed != r || needGreen != g || needBlue != b; + wave_buffer_dirty = wave_buffer_dirty || needRed != options.histogramRed || + needGreen != options.histogramGreen || needBlue != options.histogramBlue; - options.histogramRed = needRed = r; - options.histogramGreen = needGreen = g; - options.histogramBlue = needBlue = b; - options.histogramLuma = needLuma = l; - options.histogramChroma = needChroma = c; - options.histogramDrawMode = drawMode = mode; - options.histogramScopeType = scopeType = type; - options.histogramBar = needPointer = pointer; -} - -bool HistogramArea::updatePending(void) -{ - return haih->pending > 0 && !haih->destroyed; + needRed = options.histogramRed; + needGreen = options.histogramGreen; + needBlue = options.histogramBlue; + needLuma = options.histogramLuma; + needChroma = options.histogramChroma; + drawMode = options.histogramDrawMode; + scopeType = options.histogramScopeType; + needPointer = options.histogramBar; } void HistogramArea::update( @@ -1181,149 +1140,137 @@ void HistogramArea::update( const array2D& waveformLuma ) { - if (histRed) { - 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; - } - - haih->pending++; - - // Can be done outside of the GUI thread + // Note: This function is called outside of GUI threads idle_register.add( - [this]() -> bool - { - if (haih->destroyed) { - if (haih->pending == 1) { - delete haih; - } else { - --haih->pending; + [this, &histRed, &histGreen, &histBlue, &histLuma, &histChroma, &histRedRaw, + &histGreenRaw, &histBlueRaw, vectorscopeScale, &vectorscopeHC, + &vectorscopeHS, waveformScale, &waveformRed, &waveformGreen, + &waveformBlue, &waveformLuma]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + if (histRed) { + switch (scopeType) { + case ScopeType::HISTOGRAM: + rhist = histRed; + ghist = histGreen; + bhist = histBlue; + lhist = histLuma; + chist = histChroma; + break; + case ScopeType::HISTOGRAM_RAW: + // Raw histogram data are always provided (refer below) + 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; } - - return false; + 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; } + // Raw histogram data are always provided + rhistRaw = histRedRaw; + ghistRaw = histGreenRaw; + bhistRaw = histBlueRaw; - haih->harea->setDirty(true); - haih->harea->updateBackBuffer(); - haih->harea->queue_draw(); + LUT_valid = true; + } else { + LUT_valid = false; + } - --haih->pending; + // Request GUI redraw + queue_draw(); - return false; + return false; } ); } -void HistogramArea::updateBackBuffer () +void HistogramArea::updateDrawingArea (const ::Cairo::RefPtr< Cairo::Context> &cr) { + // Do not update drawing area if widget is not realized if (!get_realized ()) { return; } + // Note: updateDrawingArea is called by the on_draw function so its call does not need to be protected + // GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + Glib::RefPtr window = get_window(); int winx, winy, winw, winh; window->get_geometry(winx, winy, winw, winh); - // This will create or update the size of the BackBuffer::surface - setDrawRectangle(Cairo::FORMAT_ARGB32, 0, 0, winw, winh, true); - - Cairo::RefPtr cr = Cairo::Context::create(surface); - const Glib::RefPtr style = get_style_context(); - - double s = RTScalable::getScale(); - // Setup drawing - cr->set_source_rgba (0., 0., 0., 0.); - cr->set_operator (Cairo::OPERATOR_CLEAR); - cr->paint (); - cr->set_operator (Cairo::OPERATOR_SOURCE); + cr->set_operator (Cairo::OPERATOR_OVER); // Prepare drawing gridlines first cr->set_source_rgba (1., 1., 1., 0.25); - cr->set_line_width (1.0 * s); + cr->set_line_width (1.0); cr->set_antialias(Cairo::ANTIALIAS_NONE); cr->set_line_join(Cairo::LINE_JOIN_MITER); cr->set_line_cap(Cairo::LINE_CAP_BUTT); - std::valarray ch_ds (1); - ch_ds[0] = 4; + const std::valarray ch_ds = {4.}; cr->set_dash (ch_ds, 0); // determine the number of h-gridlines based on current h - int nrOfHGridPartitions = static_cast(rtengine::min (16.0, pow (2.0, floor ((h - 100) / 250) + 2))); + int nrOfHGridPartitions = static_cast(rtengine::min (16.0, pow (2.0, floor ((winh - 100) / 250) + 2))); int nrOfVGridPartitions = 8; // always show 8 stops (lines at 1,3,7,15,31,63,127) // draw vertical gridlines - if (options.histogramScopeType == ScopeType::HISTOGRAM || options.histogramScopeType == ScopeType::HISTOGRAM_RAW) { + if (scopeType == Options::ScopeType::HISTOGRAM || scopeType == Options::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; + if (drawMode < 2) { + xpos += (pow(2.0,i) - 1) * (winw - padding * 2.0) / 255.0; } else { - xpos += HistogramScaling::log (255, pow(2.0,i) - 1) * (w - padding * 2.0) / 255.0; + xpos += HistogramScaling::log (255, pow(2.0,i) - 1) * (winw - padding * 2.0) / 255.0; } cr->move_to (xpos, 0.); - cr->line_to (xpos, h); + cr->line_to (xpos, winh); cr->stroke (); } } // draw horizontal gridlines - if (options.histogramScopeType == ScopeType::PARADE || options.histogramScopeType == ScopeType::WAVEFORM) { + if (scopeType == Options::ScopeType::PARADE || scopeType == Options::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; + const double ypos = winh - padding - (pow(2.0,i) - 1) * (winh - 2 * padding - 1) / 255.0; cr->move_to(0, ypos); - cr->line_to(w, ypos); + cr->line_to(winw, ypos); cr->stroke(); } - } else if (options.histogramScopeType == ScopeType::VECTORSCOPE_HC || options.histogramScopeType == ScopeType::VECTORSCOPE_HS) { + } else if (scopeType == Options::ScopeType::VECTORSCOPE_HC || scopeType == Options::ScopeType::VECTORSCOPE_HS) { // Vectorscope has no gridlines. - } else if (options.histogramDrawMode == 0) { + } else if (drawMode == 0) { for (int i = 1; i < nrOfHGridPartitions; i++) { - cr->move_to (padding, i * static_cast(h) / nrOfHGridPartitions + 0.5); - cr->line_to (w - padding, i * static_cast(h) / nrOfHGridPartitions + 0.5); + cr->move_to (padding, + i * static_cast(winh) / nrOfHGridPartitions + 0.5); + cr->line_to (winw - padding, + i * static_cast(winh) / nrOfHGridPartitions + 0.5); cr->stroke (); } } else { for (int i = 1; i < nrOfHGridPartitions; i++) { - 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->move_to (padding, + winh - HistogramScaling::log (winh, i * static_cast(winh) / nrOfHGridPartitions) + 0.5); + cr->line_to (winw - padding, + winh - HistogramScaling::log (winh, i * static_cast(winh) / nrOfHGridPartitions) + 0.5); cr->stroke (); } } @@ -1331,8 +1278,8 @@ void HistogramArea::updateBackBuffer () cr->unset_dash(); MYREADERLOCK(wave_lock, wave_mutex) - if (valid && (scopeType == ScopeType::HISTOGRAM || scopeType == ScopeType::HISTOGRAM_RAW)) { - bool rawMode = scopeType == ScopeType::HISTOGRAM_RAW; + if (LUT_valid && (scopeType == Options::ScopeType::HISTOGRAM || scopeType == Options::ScopeType::HISTOGRAM_RAW)) { + const bool rawMode = (scopeType == Options::ScopeType::HISTOGRAM_RAW); // For RAW mode use the other hists LUTu& rh = rawMode ? rhistRaw : rhist; @@ -1344,24 +1291,24 @@ void HistogramArea::updateBackBuffer () unsigned int lhisttemp[256] ALIGNED16 {0}, chisttemp[256] ALIGNED16 {0}, rhtemp[256] ALIGNED16 {0}, ghtemp[256] ALIGNED16 {0}, bhtemp[256] ALIGNED16 {0}; const int scale = (rawMode ? 8 : 1); - for(int i = 0; i < 256; i++) { - if(needLuma) { + for (int i = 0; i < 256; i++) { + if (needLuma && !rawMode) { lhisttemp[i] = lhist[i]; } - if(needChroma) { + if (needChroma && !rawMode) { chisttemp[i] = chist[i]; } - if(needRed) { + if (needRed) { rhchanged[i] = rhtemp[i] = rh[i] / scale; } - if(needGreen) { + if (needGreen) { ghchanged[i] = ghtemp[i] = gh[i] / scale; } - if(needBlue) { + if (needBlue) { bhchanged[i] = bhtemp[i] = bh[i] / scale; } } @@ -1372,11 +1319,11 @@ void HistogramArea::updateBackBuffer () unsigned int histheight = 0; for (int i = 1; i < 255; i++) { - if (needLuma && lhisttemp[i] > histheight) { + if (needLuma && !rawMode && lhisttemp[i] > histheight) { histheight = lhisttemp[i]; } - if (needChroma && chisttemp[i] > histheight) { + if (needChroma && !rawMode && chisttemp[i] > histheight) { histheight = chisttemp[i]; } @@ -1400,109 +1347,111 @@ void HistogramArea::updateBackBuffer () } cr->set_antialias (Cairo::ANTIALIAS_SUBPIXEL); - cr->set_line_width (1.0 * s); + cr->set_line_width (1.0); cr->set_operator (Cairo::OPERATOR_OVER); int ui = 0, oi = 0; if (needLuma && !rawMode) { - drawCurve(cr, lhist, realhistheight, w, h); + drawCurve(cr, lhist, realhistheight, winw, winh); cr->set_source_rgba (0.65, 0.65, 0.65, 0.65); cr->fill (); - drawMarks(cr, lhist, realhistheight, w, ui, oi); + drawMarks(cr, lhist, realhistheight, winw, ui, oi); } if (needChroma && !rawMode) { - drawCurve(cr, chist, realhistheight, w, h); + drawCurve(cr, chist, realhistheight, winw, winh); cr->set_source_rgb (0.9, 0.9, 0.); cr->stroke (); - drawMarks(cr, chist, realhistheight, w, ui, oi); + drawMarks(cr, chist, realhistheight, winw, ui, oi); } if (needRed) { - drawCurve(cr, rhchanged, realhistheight, w, h); + drawCurve(cr, rhchanged, realhistheight, winw, winh); cr->set_source_rgb (1.0, 0.0, 0.0); cr->stroke (); - drawMarks(cr, rhchanged, realhistheight, w, ui, oi); + drawMarks(cr, rhchanged, realhistheight, winw, ui, oi); } if (needGreen) { - drawCurve(cr, ghchanged, realhistheight, w, h); + drawCurve(cr, ghchanged, realhistheight, winw, winh); cr->set_source_rgb (0.0, 1.0, 0.0); cr->stroke (); - drawMarks(cr, ghchanged, realhistheight, w, ui, oi); + drawMarks(cr, ghchanged, realhistheight, winw, ui, oi); } if (needBlue) { - drawCurve(cr, bhchanged, realhistheight, w, h); + drawCurve(cr, bhchanged, realhistheight, winw, winh); cr->set_source_rgb (0.0, 0.4, 1.0); cr->stroke (); - drawMarks(cr, bhchanged, realhistheight, w, ui, oi); + drawMarks(cr, bhchanged, realhistheight, winw, 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); + } else if (scopeType == Options::ScopeType::PARADE && rwave.getWidth() > 0) { + drawParade(cr, winw, winh); + } else if (scopeType == Options::ScopeType::WAVEFORM && rwave.getWidth() > 0) { + drawWaveform(cr, winw, winh); + } else if (scopeType == Options::ScopeType::VECTORSCOPE_HC || scopeType == Options::ScopeType::VECTORSCOPE_HS) { + drawVectorscope(cr, winw, winh); } MYREADERLOCK_RELEASE(wave_lock); - - // Draw the frame's border - style->render_frame(cr, 0, 0, surface->get_width(), surface->get_height()); - - oldwidth = w; - oldheight = h; - - setDirty(false); } -bool HistogramArea::updatePointer(int r, int g, int b, const rtengine::procparams::ColorManagementParams *cmp) +bool HistogramArea::updatePointer(const int r, const int g, const int b, const rtengine::procparams::ColorManagementParams *cmp) { - if (!needPointer || !(scopeType == ScopeType::VECTORSCOPE_HC || scopeType == ScopeType::VECTORSCOPE_HS)) { + // Do not update pointer values if pointer is not visible + // (by user choice or according to scope type) + if (!needPointer || + !(scopeType == Options::ScopeType::VECTORSCOPE_HC || scopeType == Options::ScopeType::VECTORSCOPE_HS)) { return false; } + + // Do not update pointer values if values are identical 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(); + // Set pointer parameters to invalid if r = g = b = -1 + if (r == -1 || g == -1 || b == -1) { + pointer_red = pointer_green = pointer_blue = -1; + pointer_a = pointer_b = 0.; + pointer_valid = false; + } else { + float L; // Unused + 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; + pointer_valid = true; + } + return true; } void HistogramArea::on_realize () { - Gtk::DrawingArea::on_realize(); add_events(Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK); } -void HistogramArea::drawCurve(Cairo::RefPtr &cr, - const LUTu & data, double scale, int hsize, int vsize) +void HistogramArea::drawCurve(const Cairo::RefPtr &cr, + const LUTu & data, const double scale, const int hsize, const int vsize) { - double s = RTScalable::getScale(); - - cr->set_line_width(s); + cr->set_line_width(1.); cr->move_to (padding, vsize - 1); - scale = scale <= 0.0 ? 0.001 : scale; // avoid division by zero and negative values + const double new_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] * static_cast(vsize) / scale; + double val = data[i] * static_cast(vsize) / new_scale; if (drawMode > 0) { // scale y for single and double log-scale val = HistogramScaling::log (static_cast(vsize), val); @@ -1522,23 +1471,21 @@ void HistogramArea::drawCurve(Cairo::RefPtr &cr, cr->line_to (hsize - padding, vsize - 1); } -void HistogramArea::drawMarks(Cairo::RefPtr &cr, - const LUTu & data, double scale, int hsize, int & ui, int & oi) +void HistogramArea::drawMarks(const Cairo::RefPtr &cr, + const LUTu & data, const double scale, const int wsize, int & ui, int & oi) { - int s = 8 * RTScalable::getScale(); - if(data[0] > scale) { - cr->rectangle(padding, (ui++)*s, s, s); + cr->rectangle(padding, (ui++) * 8., 8., 8.); } if(data[255] > scale) { - cr->rectangle(hsize - s - padding, (oi++)*s, s, s); + cr->rectangle(wsize - 8. - padding, (oi++) * 8., 8., 8.); } cr->fill(); } -void HistogramArea::drawParade(Cairo::RefPtr &cr, int w, int h) +void HistogramArea::drawParade(const Cairo::RefPtr &cr, const int w, const int h) { // Arbitrary scale factor divided by current scale. const float scale = trace_brightness * 32.f * 255.f / waveform_scale; @@ -1642,7 +1589,7 @@ void HistogramArea::drawParade(Cairo::RefPtr &cr, int w, int h) 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); + 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(); @@ -1651,26 +1598,27 @@ void HistogramArea::drawParade(Cairo::RefPtr &cr, int w, int h) } } -void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, int h) +void HistogramArea::drawVectorscope(const Cairo::RefPtr &cr, const int w, const int h) { - if (scopeType != ScopeType::VECTORSCOPE_HC && scopeType != ScopeType::VECTORSCOPE_HS) { + if (scopeType != Options::ScopeType::VECTORSCOPE_HC && scopeType != Options::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 auto& vect = (scopeType == Options::ScopeType::VECTORSCOPE_HC) ? vect_hc : vect_hs; + auto& vect_buffer = (scopeType == Options::ScopeType::VECTORSCOPE_HC) ? vect_hc_buffer : vect_hs_buffer; + auto& vect_buffer_dirty = (scopeType == Options::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) { + // 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; + if (vect_buffer.size() != static_cast(cairo_stride) * vect_height) { vect_buffer.resize(static_cast(cairo_stride) * vect_height); } @@ -1693,24 +1641,23 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in 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; + (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; + 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_line_width (1.0); 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); + cr->set_line_width (2.0); constexpr double color_labels[6][3] = { {1, 0, 0}, // R {0, 1, 0}, // G @@ -1732,7 +1679,7 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in cr->rotate_degrees(-120); cr->stroke(); } - cr->set_line_width (1.0 * s); + cr->set_line_width (1.0); cr->set_source_rgba (1, 1, 1, 0.25); // 100% saturation circle. cr->arc(0, 0, scope_size / 2.0, 0, 2 * RT_PI); @@ -1752,7 +1699,7 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in } else if (scopeType == ScopeType::VECTORSCOPE_HC) { // Hue-Chroma. // a and b axes. Cairo::RefPtr gradient; - cr->set_line_width (2.0 * s); + cr->set_line_width (2.0); 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" @@ -1774,7 +1721,7 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in cr->line_to(-line_length, 0); cr->stroke(); cr->set_source_rgba (1, 1, 1, 0.25); - cr->set_line_width (1.0 * s); + cr->set_line_width (1.0); // 25%, 50%, 75%, and 100% of standard chroma range. cr->set_dash(ch_ds, 0); for (int i = 1; i <= 4; i++) { @@ -1794,7 +1741,7 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in // Vectorscope trace. if (vectorscope_scale > 0) { Cairo::RefPtr surface = Cairo::ImageSurface::create( - vect_buffer.data(), Cairo::FORMAT_ARGB32, vect_width, vect_height, cairo_stride); + 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); @@ -1803,7 +1750,7 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in surface->finish(); cr->set_matrix(orig_matrix); - if (needPointer && pointer_red >= 0 && pointer_green >= 0 && pointer_blue >= 0) { + if (needPointer && pointer_valid) { float cx, cy; if (scopeType == ScopeType::VECTORSCOPE_HS) { float H, S, L; @@ -1815,24 +1762,24 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in 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; + const float crosshair_size = 20.f; 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->arc(cx, cy, 3, 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->set_line_width (1.0); cr->stroke(); } } } -void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h) +void HistogramArea::drawWaveform(const Cairo::RefPtr &cr, const int w, const int h) { // Arbitrary scale factor divided by current scale. const float scale = trace_brightness * 32.f * 255.f / waveform_scale; @@ -1890,7 +1837,7 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h 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); + 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(); @@ -1898,7 +1845,7 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h } if (needRed || needGreen || needBlue) { surface = Cairo::ImageSurface::create( - wave_buffer.data(), Cairo::FORMAT_ARGB32, wave_width, wave_height, cairo_stride); + 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(); @@ -1909,14 +1856,13 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h bool HistogramArea::on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) { - - if (!updatePending() && (get_width() != oldwidth || get_height() != oldheight || isDirty())) { - updateBackBuffer (); - } - const Glib::RefPtr style = get_style_context(); style->render_background(cr, 0, 0, get_width(), get_height()); - copySurface(cr, NULL); + + // Draw drawing area + // Note: As drawing area surface is updated inside on_draw function, hidpi is automatically supported + updateDrawingArea(cr); + style->render_frame (cr, 0, 0, get_width(), get_height()); return true; @@ -1939,7 +1885,6 @@ bool HistogramArea::on_button_press_event (GdkEventButton* event) myDrawModeListener->toggleButtonMode (); } - updateBackBuffer (); queue_draw (); } @@ -1976,7 +1921,6 @@ bool HistogramArea::on_motion_notify_event (GdkEventMotion* event) sigFactorChanged.emit(factor); - setDirty(true); queue_draw (); } else if ( scopeType == ScopeType::PARADE @@ -2005,7 +1949,6 @@ void HistogramArea::setBrightness(float brightness) 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); diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index 7f165bb15..2ead05340 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -35,20 +35,6 @@ #include "../rtengine/LUT.h" #include "../rtengine/noncopyable.h" -class HistogramArea; - -struct HistogramAreaIdleHelper { - HistogramArea* harea; - bool destroyed; - int pending; -}; - -class HistogramRGBArea; -struct HistogramRGBAreaIdleHelper { - HistogramRGBArea* harea; - bool destroyed; - int pending; -}; class HistogramScaling { @@ -58,38 +44,39 @@ public: double log (double vsize, double val); }; -class HistogramRGBArea : public Gtk::DrawingArea, public BackBuffer, protected HistogramScaling, public rtengine::NonCopyable +class HistogramRGBArea : public Gtk::DrawingArea, protected HistogramScaling, public rtengine::NonCopyable { -private: - typedef const double (*TMatrix)[3]; - - IdleRegister idle_register; - protected: - int val; + // Saved pointer parameters int r; int g; int b; + float lab_L; + float lab_a; + float lab_b; + bool pointerValid; - bool valid; - + // Drawing options bool needRed; bool needGreen; bool needBlue; bool needLuma; bool needChroma; - bool showMode; - bool barDisplayed; + Options::ScopeType scopeType; + int scaleMode; + bool showBar; - Gtk::Grid* parent; - - double padding = 5.0; + const double padding = 5.0; - HistogramRGBAreaIdleHelper* harih; + // Internal drawing functions + void updateDrawingArea (const ::Cairo::RefPtr< Cairo::Context> &cc); + virtual void drawBar(const Cairo::RefPtr &cc, const double value, const double max_value, const int winw, const int winh) = 0; - /** 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; + // GtkDrawingArea override functions + void on_realize() override; + bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) override; + // Widget size management functions 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; @@ -99,29 +86,23 @@ public: HistogramRGBArea(); ~HistogramRGBArea() override; - 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; - }; + // Update pointer values: returns true if widget needs redrawing + bool updatePointer (const int new_r, const int new_g, const int new_b, const rtengine::procparams::ColorManagementParams *cmp = nullptr); + // Update internal parameters from options + void updateFromOptions (); - void update (int val, int rh, int gh, int bh); - 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; + // Event management functions 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; + // Internal drawing function + void drawBar(const Cairo::RefPtr &cc, const double value, const double max_value, const int winw, const int winh) override; + // Widget size management functions 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; @@ -132,8 +113,10 @@ private: class HistogramRGBAreaVert final : public HistogramRGBArea { private: - void drawBar(Cairo::RefPtr cc, double value, double max_value, int winw, int winh, double scale) override; + // Internal drawing function + void drawBar(const Cairo::RefPtr &cc, const double value, const double max_value, const int winw, const int winh) override; + // Widget size management functions 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; @@ -148,7 +131,7 @@ public: virtual void toggleButtonMode() = 0; }; -class HistogramArea final : public Gtk::DrawingArea, public BackBuffer, private HistogramScaling, public rtengine::NonCopyable +class HistogramArea final : public Gtk::DrawingArea, private HistogramScaling, public rtengine::NonCopyable { public: typedef sigc::signal type_signal_factor_changed; @@ -161,8 +144,9 @@ private: type_signal_factor_changed sigFactorChanged; protected: + // Histogram parameters LUTu rhist, ghist, bhist, lhist, chist; - LUTu rhistRaw, ghistRaw, bhistRaw, lhistRaw; //lhistRaw is unused? + LUTu rhistRaw, ghistRaw, bhistRaw; int vectorscope_scale; array2D vect_hc, vect_hs; std::vector vect_hc_buffer, vect_hs_buffer; @@ -177,36 +161,44 @@ protected: std::vector wave_buffer; std::vector wave_buffer_luma; bool wave_buffer_dirty, wave_buffer_luma_dirty; + bool LUT_valid; - bool valid; + // Intensity of waveform and vectorscope trace + float trace_brightness; + SignalBrightnessChanged signal_brightness_changed; + + // Saved pointer parameters + int pointer_red; + int pointer_green; + int pointer_blue; + float pointer_a; + float pointer_b; + bool pointer_valid; + + // Drawing options + bool needRed; + bool needGreen; + bool needBlue; + bool needLuma; + bool needChroma; + bool needPointer; + Options::ScopeType scopeType; 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; + // Motion event management 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); + // Update pointer values: returns true if widget needs redrawing + bool updatePointer(const int r, const int g, const int b, const rtengine::procparams::ColorManagementParams *cmp = nullptr); + // Update histogram data void update( const LUTu& histRed, const LUTu& histGreen, @@ -225,25 +217,36 @@ public: const array2D& waveformBlue, const array2D& waveformLuma ); - 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; + // Update internal parameters from options + void updateFromOptions(); + + // Event management functions bool on_button_press_event (GdkEventButton* event) override; bool on_button_release_event (GdkEventButton* event) override; bool on_motion_notify_event (GdkEventMotion* event) override; + + // Brightness management functions (nominal = 1) float getBrightness(void); - /** Set the trace brightness, with 1 being normal. */ void setBrightness(float brightness); SignalBrightnessChanged getBrighnessChangedSignal(void); + + // Factor management function 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); + // GtkDrawingArea override functions + void on_realize() override; + bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) override; + + // Internal drawing functions + void updateDrawingArea (const ::Cairo::RefPtr< Cairo::Context> &cr); + void drawCurve(const Cairo::RefPtr &cr, const LUTu & data, const double scale, const int hsize, const int vsize); + void drawMarks(const Cairo::RefPtr &cr, const LUTu & data, const double scale, const int wsize, int & ui, int & oi); + void drawParade(const Cairo::RefPtr &cr, const int hsize, const int vsize); + void drawVectorscope(const Cairo::RefPtr &cr, const int hsize, const int vsize); + void drawWaveform(const Cairo::RefPtr &cr, const int hsize, const int vsize); + + // Widget size management functions 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; @@ -311,10 +314,9 @@ protected: sigc::connection brightness_changed_connection; sigc::connection rconn; + void setHistInvalid (); void showRGBBar(); - void updateHistAreaOptions(); - void updateHistRGBAreaOptions(); public: @@ -345,9 +347,6 @@ public: // pointermotionlistener interface 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 (); - void reorder (Gtk::PositionType position); void red_toggled (); void green_toggled (); diff --git a/rtgui/history.cc b/rtgui/history.cc index 4d6940e9b..9cd9173a8 100644 --- a/rtgui/history.cc +++ b/rtgui/history.cc @@ -98,7 +98,7 @@ History::History (bool bookmarkSupport) : historyVPaned (nullptr), blistener (nu //addBookmark->get_style_context()->set_junction_sides(Gtk::JUNCTION_RIGHT); addBookmark->get_style_context()->add_class ("Left"); addBookmark->set_tooltip_markup (M ("HISTORY_NEWSNAPSHOT_TOOLTIP")); - Gtk::Image* addimg = Gtk::manage (new RTImage ("add-small.png")); + Gtk::Image* addimg = Gtk::manage (new RTImage ("add-small", Gtk::ICON_SIZE_BUTTON)); addBookmark->set_image (*addimg); ahbox->pack_start (*addBookmark); @@ -106,7 +106,7 @@ History::History (bool bookmarkSupport) : historyVPaned (nullptr), blistener (nu setExpandAlignProperties (delBookmark, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); //delBookmark->get_style_context()->set_junction_sides(Gtk::JUNCTION_LEFT); delBookmark->get_style_context()->add_class ("Right"); - Gtk::Image* delimg = Gtk::manage (new RTImage ("remove-small.png")); + Gtk::Image* delimg = Gtk::manage (new RTImage ("remove-small", Gtk::ICON_SIZE_BUTTON)); delBookmark->set_image (*delimg); ahbox->pack_start (*delBookmark); diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index 446dda3fb..eeca55265 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -32,7 +32,24 @@ #include "rtimage.h" #include "rtwindow.h" -const char* sTRCPreset[] = {"BT709_g2.2_s4.5", "sRGB_g2.4_s12.92", "linear_g1.0", "standard_g2.2", "standard_g1.8", "High_g1.3_s3.35", "Low_g2.6_s6.9", "Lab_g3.0s9.03296"}; //gamma free +const char* sTRCPreset[] = {"BT709_g2.2_s4.5", "sRGB_g2.4_s12.92", "linear_g1.0", "standard_g2.2", "standard_g1.8", "High_g1.3_s3.35", "Low_g2.6_s6.9", "Lab_g3.0s9.03296" /*, "PQ", "HLG" */}; //gamma free + + +// code take in ART thanks to Alberto Griggio +cmsToneCurve *make_trc(size_t size, float (*trcFunc)(float, bool)) +{ + std::vector values(size); + + for (size_t i = 0; i < size; ++i) { + float x = float(i) / (size - 1); + float y = trcFunc(x, false); //, 1.0f); + values[i] = y; + } + + cmsToneCurve *result = cmsBuildTabulatedToneCurveFloat(NULL, size, &values[0]); + return result; +} +/// ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow) : Gtk::Dialog(M("MAIN_BUTTON_ICCPROFCREATOR"), *rtwindow, true) @@ -87,21 +104,6 @@ ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow) setExpandAlignProperties(primariesGrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); primariesGrid->set_column_spacing(5); - /* - Gtk::Image* gamuts0 = Gtk::manage(new RTImage("rt-logo-tiny.png")); - Gtk::Image* gamutl0 = Gtk::manage(new RTImage("rt-logo-small.png")); - Gtk::Image* gamuts1 = Gtk::manage(new RTImage("rt-logo-tiny.png")); - Gtk::Image* gamutl1 = Gtk::manage(new RTImage("rt-logo-small.png")); - Gtk::Image* gamuts2 = Gtk::manage(new RTImage("rt-logo-tiny.png")); - Gtk::Image* gamutl2 = Gtk::manage(new RTImage("rt-logo-small.png")); - Gtk::Image* gamuts3 = Gtk::manage(new RTImage("rt-logo-tiny.png")); - Gtk::Image* gamutl3 = Gtk::manage(new RTImage("rt-logo-small.png")); - Gtk::Image* gamuts4 = Gtk::manage(new RTImage("rt-logo-tiny.png")); - Gtk::Image* gamutl4 = Gtk::manage(new RTImage("rt-logo-small.png")); - Gtk::Image* gamuts5 = Gtk::manage(new RTImage("rt-logo-tiny.png")); - Gtk::Image* gamutl5 = Gtk::manage(new RTImage("rt-logo-small.png")); - */ - aPrimariesRedX = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_REDX"), 0.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.1000, 0.6000, 0.0001, 0.3300/*, gamutl1, gamuts1*/)); @@ -219,7 +221,7 @@ ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow) setExpandAlignProperties(eCopyright, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); copygrid->attach(*eCopyright, 0, 0, 1, 1); resetCopyright = Gtk::manage(new Gtk::Button()); - resetCopyright->add(*Gtk::manage(new RTImage("undo-small.png", "redo-small.png"))); + resetCopyright->add(*Gtk::manage(new RTImage("undo-small", Gtk::ICON_SIZE_BUTTON))); setExpandAlignProperties(resetCopyright, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); resetCopyright->set_relief(Gtk::RELIEF_NONE); resetCopyright->set_tooltip_markup(M("ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP")); @@ -850,7 +852,7 @@ void ICCProfileCreator::savePressed() //g5=0.517448 presetGamma = 2.22; presetSlope = 4.5; - + } else if (gammaPreset == "linear_g1.0") { sGammaPreset = "Linear_g=1.0"; ga[0] = 1.0; //gamma=1 linear : for high dynamic images (cf D.Coffin...) @@ -1320,6 +1322,10 @@ void ICCProfileCreator::savePressed() GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, 1.0); } else if(gammaPreset == "Custom" && slope == 0.0) { GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, gamma); +// } else if(gammaPreset == "PQ") { +// GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = make_trc(4096, &rtengine::Color::eval_PQ_curve); //thanks to Alberto Griggio +// } else if(gammaPreset == "HLG") { +// GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = make_trc(4096, &rtengine::Color::eval_HLG_curve); //thanks to Alberto Griggio } else { GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(nullptr, 5, ga); } diff --git a/rtgui/icmpanel.cc b/rtgui/icmpanel.cc index 47e34f509..649978cf9 100644 --- a/rtgui/icmpanel.cc +++ b/rtgui/icmpanel.cc @@ -65,12 +65,20 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, TOOL_NAME, M("TP_ICM_LABEL")), iu EvICMLabGridciexy = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ICL_LABGRIDCIEXY"); EvICMfbw = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ICM_FBW"); EvICMgamut = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ICM_GAMUT"); + EvICMcat = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ICM_CAT"); + EvICMrefi = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ICM_REFI"); + EvICMtrcExp = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ICM_TRCEXP"); + EvICMshiftx = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ICM_SHIFTX"); + EvICMshifty = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ICM_SHIFTY"); + EvICMwmidtcie = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ICM_MIDTCIE"); + EvICMwsmoothcie = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ICM_SMOOTHCIE"); + 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)); + labgridcie = Gtk::manage(new LabGrid(EvICMLabGridciexy, M("TP_ICM_LABGRID_CIEXY"), true, true, true)); // ------------------------------- Input profile @@ -173,7 +181,7 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, TOOL_NAME, M("TP_ICM_LABEL")), iu iVBox->pack_start(*dcpFrame); saveRef = Gtk::manage(new Gtk::Button(M("TP_ICM_SAVEREFERENCE"))); - saveRef->set_image(*Gtk::manage(new RTImage("save-small.png"))); + saveRef->set_image(*Gtk::manage(new RTImage("save-small", Gtk::ICON_SIZE_BUTTON))); saveRef->set_alignment(0.5f, 0.5f); saveRef->set_tooltip_markup(M("TP_ICM_SAVEREFERENCE_TOOLTIP")); iVBox->pack_start(*saveRef, Gtk::PACK_SHRINK); @@ -205,12 +213,13 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, TOOL_NAME, M("TP_ICM_LABEL")), iu //-----------------gamma TRC working // Gtk::Frame *trcFrame = Gtk::manage(new Gtk::Frame(M("TP_ICM_TRCFRAME"))); - trcExp = Gtk::manage(new MyExpander(false, M("TP_ICM_TRCFRAME"))); + trcExp = Gtk::manage(new MyExpander(true, M("TP_ICM_TRCFRAME"))); setExpandAlignProperties(trcExp, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); // trcFrame->set_label_align(0.025, 0.5); Gtk::Box *trcProfVBox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); trcExp->set_tooltip_text(M("TP_ICM_TRCFRAME_TOOLTIP")); trcExp->signal_button_release_event().connect_notify ( sigc::bind ( sigc::mem_fun (this, &ICMPanel::foldAllButMe), trcExp) ); + trcExpconn = trcExp->signal_enabled_toggled().connect(sigc::mem_fun(*this, &ICMPanel::trcExpChanged)); wTRCBox = Gtk::manage(new Gtk::Box()); @@ -233,11 +242,19 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, TOOL_NAME, M("TP_ICM_LABEL")), iu 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)); + wmidtcie = Gtk::manage(new Adjuster(M("TP_LOCALLAB_MIDTCIE"), -100., 100., 1., 0.)); + wsmoothcie = Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_SMOOTHCIE"))); trcProfVBox->pack_start(*wGamma, Gtk::PACK_SHRINK); wGamma->show(); trcProfVBox->pack_start(*wSlope, Gtk::PACK_SHRINK); wSlope->show(); + trcProfVBox->pack_start(*wmidtcie, Gtk::PACK_SHRINK); + wmidtcie->show(); + trcProfVBox->pack_start(*wsmoothcie, Gtk::PACK_SHRINK); + wsmoothcie->show(); + wsmoothcieconn = wsmoothcie->signal_toggled().connect(sigc::mem_fun(*this, &ICMPanel::wsmoothcieChanged)); + wsmoothcie->set_active(false); willuBox = Gtk::manage(new Gtk::Box()); willulab = Gtk::manage(new Gtk::Label(M("TP_ICM_WORKING_ILLU") + ":")); @@ -257,6 +274,7 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, TOOL_NAME, M("TP_ICM_LABEL")), iu 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->append(M("TP_ICM_WORKING_ILLU_E")); will->set_active(0); will->set_tooltip_text(M("TP_ICM_ILLUMPRIM_TOOLTIP")); @@ -270,15 +288,15 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, TOOL_NAME, M("TP_ICM_LABEL")), iu 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); + gamut->set_active(true); trcProfVBox->pack_start(*wprimBox, Gtk::PACK_EXPAND_WIDGET); trcProfVBox->pack_start(*fbw, Gtk::PACK_EXPAND_WIDGET); - trcProfVBox->pack_start(*gamut, 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")); + RTImage *resetImg = Gtk::manage (new RTImage ("undo-small", Gtk::ICON_SIZE_BUTTON)); 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) ); @@ -296,6 +314,7 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, TOOL_NAME, M("TP_ICM_LABEL")), iu wprim->append(M("TP_ICM_WORKING_PRIM_WID")); wprim->append(M("TP_ICM_WORKING_PRIM_AC0")); wprim->append(M("TP_ICM_WORKING_PRIM_JDCMAX")); + wprim->append(M("TP_ICM_WORKING_PRIM_JDCMAXSTDA")); wprim->append(M("TP_ICM_WORKING_PRIM_BRU")); wprim->append(M("TP_ICM_WORKING_PRIM_BET")); wprim->append(M("TP_ICM_WORKING_PRIM_BST")); @@ -327,6 +346,10 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, TOOL_NAME, M("TP_ICM_LABEL")), iu redFrame->set_label_align(0.025, 0.5); redFrame->set_tooltip_text(M("TP_ICM_WORKING_PRIMFRAME_TOOLTIP")); + colorFramecie = Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_COLORFRAME"))); + colorFramecie->set_label_align(0.025, 0.5); + colorFramecie->set_tooltip_text(M("TP_LOCALLAB_PRECAMREFIMAIN_TOOLTIP")); + Gtk::Box *redVBox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); primCoordGrid = Gtk::manage(new Gtk::Grid()); primCoordGrid->set_column_homogeneous(true); @@ -343,7 +366,7 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, TOOL_NAME, M("TP_ICM_LABEL")), iu 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); @@ -355,32 +378,63 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, TOOL_NAME, M("TP_ICM_LABEL")), iu redVBox->pack_start(*cielab, Gtk::PACK_SHRINK); redVBox->pack_start(*labgridcie, Gtk::PACK_EXPAND_WIDGET, 4); - + redVBox->pack_start(*gamut, Gtk::PACK_EXPAND_WIDGET); + + refi = Gtk::manage(new Adjuster(M("TC_PRIM_REFI"), -0.5, 1., 0.0001, 0.)); + shiftx = Gtk::manage(new Adjuster(M("TC_LOCALLAB_PRIM_SHIFTX"), -0.2, 0.2, 0.0001, 0.)); + shifty = Gtk::manage(new Adjuster(M("TC_LOCALLAB_PRIM_SHIFTY"), -0.2, 0.2, 0.0001, 0.)); + + wcatBox = Gtk::manage(new Gtk::Box()); + wcatlab = Gtk::manage(new Gtk::Label(M("TP_ICM_WORKING_CAT") + ":")); + wcatBox->pack_start(*wcatlab, Gtk::PACK_SHRINK); + wcat = Gtk::manage(new MyComboBoxText()); + wcatBox->pack_start(*wcat, Gtk::PACK_EXPAND_WIDGET); + + wcat->append(M("TP_ICM_WORKING_CAT_BRAD")); + wcat->append(M("TP_ICM_WORKING_CAT_CAT16")); + wcat->append(M("TP_ICM_WORKING_CAT_CAT02")); + wcat->append(M("TP_ICM_WORKING_CAT_VK")); + wcat->append(M("TP_ICM_WORKING_CAT_XYZ")); + wcat->set_active(0); + redVBox->pack_start(*wcatBox, Gtk::PACK_SHRINK); + + ToolParamBlock* const colorBox = Gtk::manage(new ToolParamBlock()); + + colorBox->pack_start(*refi, Gtk::PACK_EXPAND_WIDGET); + colorBox->pack_start(*shiftx, Gtk::PACK_EXPAND_WIDGET); + colorBox->pack_start(*shifty, Gtk::PACK_EXPAND_WIDGET); + colorFramecie->add(*colorBox); + redVBox->pack_start(*colorFramecie); redFrame->add(*redVBox); wGamma->setAdjusterListener(this); wSlope->setLogScale(16, 0); wSlope->setAdjusterListener(this); + wmidtcie->setAdjusterListener(this); redx->setAdjusterListener(this); redy->setAdjusterListener(this); grex->setAdjusterListener(this); grey->setAdjusterListener(this); blux->setAdjusterListener(this); bluy->setAdjusterListener(this); + refi->setAdjusterListener(this); + shiftx->setAdjusterListener(this); + shifty->setAdjusterListener(this); wGamma->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); wSlope->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); + wmidtcie->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->addEntry("intent-perceptual", M("PREFERENCES_INTENT_PERCEPTUAL")); + aRendIntent->addEntry("intent-relative", M("PREFERENCES_INTENT_RELATIVE")); + aRendIntent->addEntry("intent-saturation", M("PREFERENCES_INTENT_SATURATION")); + aRendIntent->addEntry("intent-absolute", M("PREFERENCES_INTENT_ABSOLUTE")); aRendIntent->setSelected(1); aRendIntent->show(); riaHBox->pack_start(*aRendIntent->buttonGroup, Gtk::PACK_EXPAND_PADDING); @@ -422,10 +476,10 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, TOOL_NAME, M("TP_ICM_LABEL")), iu Gtk::Label* outputIntentLbl = Gtk::manage(new Gtk::Label(M("TP_ICM_PROFILEINTENT"))); riHBox->pack_start(*outputIntentLbl, Gtk::PACK_SHRINK); oRendIntent.reset(new PopUpButton()); - oRendIntent->addEntry("intent-perceptual.png", M("PREFERENCES_INTENT_PERCEPTUAL")); - oRendIntent->addEntry("intent-relative.png", M("PREFERENCES_INTENT_RELATIVE")); - oRendIntent->addEntry("intent-saturation.png", M("PREFERENCES_INTENT_SATURATION")); - oRendIntent->addEntry("intent-absolute.png", M("PREFERENCES_INTENT_ABSOLUTE")); + oRendIntent->addEntry("intent-perceptual", M("PREFERENCES_INTENT_PERCEPTUAL")); + oRendIntent->addEntry("intent-relative", M("PREFERENCES_INTENT_RELATIVE")); + oRendIntent->addEntry("intent-saturation", M("PREFERENCES_INTENT_SATURATION")); + oRendIntent->addEntry("intent-absolute", M("PREFERENCES_INTENT_ABSOLUTE")); oRendIntent->setSelected(1); oRendIntent->show(); riHBox->pack_start(*oRendIntent->buttonGroup, Gtk::PACK_EXPAND_PADDING); @@ -479,6 +533,7 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, TOOL_NAME, M("TP_ICM_LABEL")), iu 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)); + wcatconn = wcat->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::wcatChanged)); fbwconn = fbw->signal_toggled().connect(sigc::mem_fun(*this, &ICMPanel::fbwChanged)); gamutconn = gamut->signal_toggled().connect(sigc::mem_fun(*this, &ICMPanel::gamutChanged)); @@ -525,6 +580,8 @@ void ICMPanel::neutral_pressed () wprim->set_active(toUnderlying(ColorManagementParams::Primaries::ACES_P0)); } else if (wProfNames->get_active_text() == "JDCmax") { wprim->set_active(toUnderlying(ColorManagementParams::Primaries::JDC_MAX)); + } else if (wProfNames->get_active_text() == "JDCmax stdA") { + wprim->set_active(toUnderlying(ColorManagementParams::Primaries::JDC_MAXSTDA)); } else if (wProfNames->get_active_text() == "BruceRGB") { wprim->set_active(toUnderlying(ColorManagementParams::Primaries::BRUCE_RGB)); } else if (wProfNames->get_active_text() == "Beta RGB") { @@ -535,9 +592,11 @@ void ICMPanel::neutral_pressed () const ColorManagementParams defPar; wGamma->setValue(defPar.workingTRCGamma);//2.4 wSlope->setValue(defPar.workingTRCSlope);//12.92 + wmidtcie->setValue(defPar.wmidtcie); preser->setValue(defPar.preser); fbw->set_active(defPar.fbw); gamut->set_active(defPar.gamut); + wsmoothcie->set_active(defPar.wsmoothcie); wTRC->set_active(toUnderlying(ColorManagementParams::WorkingTrc::NONE));//reset to none will->set_active(toUnderlying(ColorManagementParams::Illuminant::DEFAULT));//reset to default - after wprim } @@ -614,7 +673,7 @@ void ICMPanel::primChanged (float rx, float ry, float bx, float by, float gx, fl ); } -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) +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, float m_x, float m_y) {//update CIE xy graph nextrx = r_x; nextry = r_y; @@ -624,6 +683,8 @@ void ICMPanel::iprimChanged (float r_x, float r_y, float b_x, float b_y, float g nextgy = g_y; nextwx = w_x; nextwy = w_y; + nextmx = m_x; + nextmy = m_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; @@ -633,12 +694,14 @@ void ICMPanel::iprimChanged (float r_x, float r_y, float b_x, float b_y, float g nextgy = 1.81818f * (nextgy + 0.1f) - 1.f; nextwx = 1.81818f * (nextwx + 0.1f) - 1.f; nextwy = 1.81818f * (nextwy + 0.1f) - 1.f; + nextmx = 1.81818f * (nextmx + 0.1f) - 1.f; + nextmy = 1.81818f * (nextmy + 0.1f) - 1.f; idle_register.add( [this]() -> bool { disableListener(); - labgridcie->setParams(nextrx, nextry, nextbx, nextby, nextgx, nextgy, nextwx, nextwy, false); + labgridcie->setParams(nextrx, nextry, nextbx, nextby, nextgx, nextgy, nextwx, nextwy, nextmx, nextmy, false); enableListener(); return false; } @@ -705,6 +768,8 @@ void ICMPanel::updateDCP(int dcpIlluminant, Glib::ustring dcp_name) if (dcp_name == "(cameraICC)") { dcp = DCPStore::getInstance()->getStdProfile(camName); + } else if (dcp_name == "(embedded)") { + dcp = DCPStore::getInstance()->getProfile(filename); } else if (ifromfile->get_active() && DCPStore::getInstance()->isValidDCPFileName(dcp_name)) { dcp = DCPStore::getInstance()->getProfile(dcp_name); } @@ -791,6 +856,7 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited) ConnectionBlocker obpcconn_(obpcconn); ConnectionBlocker fbwconn_(fbwconn); ConnectionBlocker gamutconn_(gamutconn); + ConnectionBlocker wsmoothcieconn_(wsmoothcieconn); ConnectionBlocker ipc_(ipc); ConnectionBlocker tcurveconn_(tcurveconn); ConnectionBlocker ltableconn_(ltableconn); @@ -804,10 +870,13 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited) ConnectionBlocker wtrcconn_(wtrcconn); ConnectionBlocker willconn_(willconn); ConnectionBlocker wprimconn_(wprimconn); + ConnectionBlocker wcatconn_(wcatconn); + ConnectionBlocker trcExpconn_(trcExpconn); + trcExp->set_expanded(false); - if (pp->icm.inputProfile.substr(0, 5) != "file:") { - ipDialog->set_filename(" "); + if (pp->icm.inputProfile.substr(0, 5) != "file:" && !ipDialog->get_filename().empty()) { + ipDialog->set_filename(pp->icm.inputProfile); } if (pp->icm.inputProfile == "(none)") { @@ -815,7 +884,7 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited) updateDCP(pp->icm.dcpIlluminant, ""); } else if (pp->icm.inputProfile == "(embedded)" || ((pp->icm.inputProfile == "(camera)" || pp->icm.inputProfile.empty()) && icamera->get_state() == Gtk::STATE_INSENSITIVE)) { iembedded->set_active(true); - updateDCP(pp->icm.dcpIlluminant, ""); + updateDCP(pp->icm.dcpIlluminant, "(embedded)"); } else if ((pp->icm.inputProfile == "(cameraICC)") && icameraICC->get_state() != Gtk::STATE_INSENSITIVE) { icameraICC->set_active(true); updateDCP(pp->icm.dcpIlluminant, "(cameraICC)"); @@ -845,10 +914,14 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited) will->set_active(rtengine::toUnderlying(pp->icm.will)); wprim->set_active(rtengine::toUnderlying(pp->icm.wprim)); + wcat->set_active(rtengine::toUnderlying(pp->icm.wcat)); wtrcinChanged(); willChanged(); wprimChanged(); + wcatChanged(); + gamutChanged(); + wsmoothcieChanged(); if (pp->icm.outputProfile == ColorManagementParams::NoICMString) { oProfNames->set_active_text(M("TP_ICM_NOICM")); @@ -865,7 +938,9 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited) obpc->set_active(pp->icm.outputBPC); fbw->set_active(pp->icm.fbw); + trcExp->setEnabled(pp->icm.trcExp); gamut->set_active(pp->icm.gamut); + wsmoothcie->set_active(pp->icm.wsmoothcie); ckbToneCurve->set_active(pp->icm.toneCurve); lastToneCurve = pp->icm.toneCurve; ckbApplyLookTable->set_active(pp->icm.applyLookTable); @@ -877,20 +952,26 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited) wGamma->setValue(pp->icm.workingTRCGamma); wSlope->setValue(pp->icm.workingTRCSlope); + wmidtcie->setValue(pp->icm.wmidtcie); 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); + refi->setValue(pp->icm.refi); + shiftx->setValue(pp->icm.shiftx); + shifty->setValue(pp->icm.shifty); 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); + 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, pp->icm.labgridcieMx, pp->icm.labgridcieMy, false); if (pedited) { iunchanged->set_active(!pedited->icm.inputProfile); obpc->set_inconsistent(!pedited->icm.outputBPC); fbw->set_inconsistent(!pedited->icm.fbw); + trcExp->set_inconsistent(!pedited->icm.trcExp); gamut->set_inconsistent(!pedited->icm.gamut); + wsmoothcie->set_inconsistent(!pedited->icm.wsmoothcie); ckbToneCurve->set_inconsistent(!pedited->icm.toneCurve); ckbApplyLookTable->set_inconsistent(!pedited->icm.applyLookTable); ckbApplyBaselineExposureOffset->set_inconsistent(!pedited->icm.applyBaselineExposureOffset); @@ -927,17 +1008,26 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited) 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); + + if (!pedited->icm.wcat) { + wcat->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 || pedited->icm.labgridcieMx || pedited->icm.labgridcieMy); wGamma->setEditedState(pedited->icm.workingTRCGamma ? Edited : UnEdited); wSlope->setEditedState(pedited->icm.workingTRCSlope ? Edited : UnEdited); + wmidtcie->setEditedState(pedited->icm.wmidtcie ? 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); + refi->setEditedState(pedited->icm.refi ? Edited : UnEdited); preser->setEditedState(pedited->icm.preser ? Edited : UnEdited); + shiftx->setEditedState(pedited->icm.shiftx ? Edited : UnEdited); + shifty->setEditedState(pedited->icm.shifty ? Edited : UnEdited); } @@ -945,11 +1035,15 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited) case ColorManagementParams::WorkingTrc::NONE: { wSlope->set_sensitive(false); wGamma->set_sensitive(false); + wmidtcie->set_sensitive(false); will->set_sensitive(false); willulab->set_sensitive(false); wprim->set_sensitive(false); + wcat->set_sensitive(false); + wcatlab->set_sensitive(false); fbw->set_sensitive(false); gamut->set_sensitive(false); + wsmoothcie->set_sensitive(false); wprimlab->set_sensitive(false); riaHBox->set_sensitive(false); redFrame->hide(); @@ -960,8 +1054,17 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited) will->set_sensitive(false); willulab->set_sensitive(true); wprim->set_sensitive(true); + wcat->set_sensitive(true); + wcatlab->set_sensitive(true); + if (gamut->get_active()) { + wcatBox->set_sensitive(true); + } else { + wcatBox->set_sensitive(false); + } + fbw->set_sensitive(true); gamut->set_sensitive(true); + wsmoothcie->set_sensitive(true); wprimlab->set_sensitive(true); if (ColorManagementParams::Primaries(wprim->get_active_row_number()) == ColorManagementParams::Primaries::DEFAULT) { redFrame->hide(); @@ -990,9 +1093,11 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited) if (pp->icm.workingTRCGamma <= 1.) { wGamma->set_sensitive(true); wSlope->set_sensitive(false); + wmidtcie->set_sensitive(true); } else { wGamma->set_sensitive(true); wSlope->set_sensitive(true); + wmidtcie->set_sensitive(true); } break; } @@ -1000,14 +1105,24 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited) case ColorManagementParams::WorkingTrc::BT709: wGamma->setValue(2.222); wSlope->setValue(4.5); - will->set_sensitive(true); + will->set_sensitive(false); willulab->set_sensitive(true); wprim->set_sensitive(true); + wcat->set_sensitive(true); + wcatlab->set_sensitive(true); + if (gamut->get_active()) { + wcatBox->set_sensitive(true); + } else { + wcatBox->set_sensitive(false); + } + fbw->set_sensitive(true); gamut->set_sensitive(true); + wsmoothcie->set_sensitive(true); wprimlab->set_sensitive(true); wGamma->set_sensitive(false); wSlope->set_sensitive(false); + wmidtcie->set_sensitive(true); if (ColorManagementParams::Primaries(wprim->get_active_row_number()) == ColorManagementParams::Primaries::DEFAULT) { redFrame->hide(); } else { @@ -1018,14 +1133,23 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited) case ColorManagementParams::WorkingTrc::SRGB: wGamma->setValue(2.4); wSlope->setValue(12.92); - will->set_sensitive(true); + will->set_sensitive(false); willulab->set_sensitive(true); wprim->set_sensitive(true); + wcat->set_sensitive(true); + wcatlab->set_sensitive(true); + if (gamut->get_active()) { + wcatBox->set_sensitive(true); + } else { + wcatBox->set_sensitive(false); + } fbw->set_sensitive(true); gamut->set_sensitive(true); + wsmoothcie->set_sensitive(true); wprimlab->set_sensitive(true); wGamma->set_sensitive(false); wSlope->set_sensitive(false); + wmidtcie->set_sensitive(true); riaHBox->set_sensitive(true); if (ColorManagementParams::Primaries(wprim->get_active_row_number()) == ColorManagementParams::Primaries::DEFAULT) { redFrame->hide(); @@ -1036,15 +1160,24 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited) case ColorManagementParams::WorkingTrc::GAMMA_2_2: wGamma->setValue(2.2); wSlope->setValue(0.); - will->set_sensitive(true); + will->set_sensitive(false); willulab->set_sensitive(true); wprim->set_sensitive(true); + wcat->set_sensitive(true); + wcatlab->set_sensitive(true); + if (gamut->get_active()) { + wcatBox->set_sensitive(true); + } else { + wcatBox->set_sensitive(false); + } fbw->set_sensitive(true); gamut->set_sensitive(true); + wsmoothcie->set_sensitive(true); wprimlab->set_sensitive(true); redFrame->show(); wGamma->set_sensitive(false); wSlope->set_sensitive(false); + wmidtcie->set_sensitive(true); riaHBox->set_sensitive(true); if (ColorManagementParams::Primaries(wprim->get_active_row_number()) == ColorManagementParams::Primaries::DEFAULT) { redFrame->hide(); @@ -1055,11 +1188,19 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited) case ColorManagementParams::WorkingTrc::GAMMA_1_8: wGamma->setValue(1.8); wSlope->setValue(0.); - will->set_sensitive(true); + will->set_sensitive(false); willulab->set_sensitive(true); wprim->set_sensitive(true); + wcat->set_sensitive(true); + wcatlab->set_sensitive(true); + if (gamut->get_active()) { + wcatBox->set_sensitive(true); + } else { + wcatBox->set_sensitive(false); + } fbw->set_sensitive(true); gamut->set_sensitive(true); + wsmoothcie->set_sensitive(true); wprimlab->set_sensitive(true); riaHBox->set_sensitive(true); if (ColorManagementParams::Primaries(wprim->get_active_row_number()) == ColorManagementParams::Primaries::DEFAULT) { @@ -1069,18 +1210,28 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited) } wGamma->set_sensitive(false); wSlope->set_sensitive(false); + wmidtcie->set_sensitive(true); break; case ColorManagementParams::WorkingTrc::LINEAR: wGamma->setValue(1.); wSlope->setValue(1.); - will->set_sensitive(true); + will->set_sensitive(false); willulab->set_sensitive(true); wprim->set_sensitive(true); + wcat->set_sensitive(true); + wcatlab->set_sensitive(true); + if (gamut->get_active()) { + wcatBox->set_sensitive(true); + } else { + wcatBox->set_sensitive(false); + } fbw->set_sensitive(true); gamut->set_sensitive(true); + wsmoothcie->set_sensitive(true); wprimlab->set_sensitive(true); wGamma->set_sensitive(false); wSlope->set_sensitive(false); + wmidtcie->set_sensitive(true); riaHBox->set_sensitive(true); if (ColorManagementParams::Primaries(wprim->get_active_row_number()) == ColorManagementParams::Primaries::DEFAULT) { redFrame->hide(); @@ -1100,6 +1251,7 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited) case ColorManagementParams::Primaries::WIDE_GAMUT: case ColorManagementParams::Primaries::ACES_P0: case ColorManagementParams::Primaries::JDC_MAX: + case ColorManagementParams::Primaries::JDC_MAXSTDA: case ColorManagementParams::Primaries::BRUCE_RGB: case ColorManagementParams::Primaries::BETA_RGB: case ColorManagementParams::Primaries::BEST_RGB: { @@ -1146,7 +1298,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); - 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); + 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, pp->icm.labgridcieMx, pp->icm.labgridcieMy); if (oProfNames->get_active_text() == M("TP_ICM_NOICM")) { pp->icm.outputProfile = ColorManagementParams::NoICMString; @@ -1173,6 +1325,7 @@ void ICMPanel::write(ProcParams* pp, ParamsEdited* pedited) 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.wcat = ColorManagementParams::Cat(wcat->get_active_row_number()); pp->icm.toneCurve = ckbToneCurve->get_active(); pp->icm.applyLookTable = ckbApplyLookTable->get_active(); @@ -1180,15 +1333,21 @@ void ICMPanel::write(ProcParams* pp, ParamsEdited* pedited) pp->icm.applyHueSatMap = ckbApplyHueSatMap->get_active(); pp->icm.outputBPC = obpc->get_active(); pp->icm.fbw = fbw->get_active(); + pp->icm.trcExp = trcExp->getEnabled(); pp->icm.gamut = gamut->get_active(); + pp->icm.wsmoothcie = wsmoothcie->get_active(); pp->icm.workingTRCGamma = wGamma->getValue(); pp->icm.workingTRCSlope = wSlope->getValue(); + pp->icm.wmidtcie = wmidtcie->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->icm.refi = refi->getValue(); + pp->icm.shiftx = shiftx->getValue(); + pp->icm.shifty = shifty->getValue(); pp->toneCurve.fromHistMatching = false; pp->icm.preser = preser->getValue(); @@ -1200,7 +1359,9 @@ void ICMPanel::write(ProcParams* pp, ParamsEdited* pedited) pedited->icm.aRendIntent = aRendIntent->getSelected() < 4; pedited->icm.outputBPC = !obpc->get_inconsistent(); pedited->icm.fbw = !fbw->get_inconsistent(); + pedited->icm.trcExp = !trcExp->get_inconsistent(); pedited->icm.gamut = !gamut->get_inconsistent(); + pedited->icm.wsmoothcie = !wsmoothcie->get_inconsistent(); pedited->icm.dcpIlluminant = dcpIll->get_active_text() != M("GENERAL_UNCHANGED"); pedited->icm.toneCurve = !ckbToneCurve->get_inconsistent(); pedited->icm.applyLookTable = !ckbApplyLookTable->get_inconsistent(); @@ -1208,12 +1369,14 @@ void ICMPanel::write(ProcParams* pp, ParamsEdited* pedited) pedited->icm.applyHueSatMap = !ckbApplyHueSatMap->get_inconsistent(); pedited->icm.workingTRCGamma = wGamma->getEditedState(); pedited->icm.workingTRCSlope = wSlope->getEditedState(); + pedited->icm.wmidtcie = wmidtcie->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.wcat = wcat->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(); + pedited->icm.labgridcieALow = pedited->icm.labgridcieBLow = pedited->icm.labgridcieAHigh = pedited->icm.labgridcieBHigh = pedited->icm.labgridcieGx = pedited->icm.labgridcieGy = pedited->icm.labgridcieWx = pedited->icm.labgridcieWy = pedited->icm.labgridcieMx = pedited->icm.labgridcieMy = labgridcie->getEdited(); } } @@ -1221,36 +1384,48 @@ void ICMPanel::setDefaults(const ProcParams* defParams, const ParamsEdited* pedi { wGamma->setDefault(defParams->icm.workingTRCGamma); wSlope->setDefault(defParams->icm.workingTRCSlope); + wmidtcie->setDefault(defParams->icm.wmidtcie); 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); + refi->setDefault(defParams->icm.refi); + shiftx->setDefault(defParams->icm.shiftx); + shifty->setDefault(defParams->icm.shifty); 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); + 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, defParams->icm.labgridcieMx, defParams->icm.labgridcieMy); if (pedited) { wGamma->setDefaultEditedState(pedited->icm.workingTRCGamma ? Edited : UnEdited); wSlope->setDefaultEditedState(pedited->icm.workingTRCSlope ? Edited : UnEdited); + wmidtcie->setDefaultEditedState(pedited->icm.wmidtcie ? 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); + refi->setDefaultEditedState(pedited->icm.refi ? Edited : UnEdited); + shiftx->setDefaultEditedState(pedited->icm.shiftx ? Edited : UnEdited); + shifty->setDefaultEditedState(pedited->icm.shifty ? 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 || pedited->icm.labgridcieMx || pedited->icm.labgridcieMy) ? Edited : UnEdited); preser->setDefaultEditedState(pedited->icm.preser ? Edited : UnEdited); } else { wGamma->setDefaultEditedState(Irrelevant); wSlope->setDefaultEditedState(Irrelevant); + wmidtcie->setDefaultEditedState(Irrelevant); redx->setDefaultEditedState(Irrelevant); redy->setDefaultEditedState(Irrelevant); grex->setDefaultEditedState(Irrelevant); grey->setDefaultEditedState(Irrelevant); blux->setDefaultEditedState(Irrelevant); bluy->setDefaultEditedState(Irrelevant); + refi->setDefaultEditedState(Irrelevant); + shiftx->setDefaultEditedState(Irrelevant); + shifty->setDefaultEditedState(Irrelevant); preser->setDefaultEditedState(Irrelevant); labgridcie->setEdited(Edited); @@ -1271,6 +1446,8 @@ void ICMPanel::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvICMgamm, costr2); } else if (a == wSlope) { listener->panelChanged(EvICMslop, costr2); + } else if (a == wmidtcie) { + listener->panelChanged(EvICMwmidtcie, costr2); } else if (a == redx) { listener->panelChanged(EvICMredx, costr2); } else if (a == redy) { @@ -1285,6 +1462,12 @@ void ICMPanel::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvICMbluy, costr2); } else if (a == preser) { listener->panelChanged(EvICMpreser, costr2); + } else if (a == refi) { + listener->panelChanged(EvICMrefi, costr2); + } else if (a == shiftx) { + listener->panelChanged(EvICMshiftx, costr2); + } else if (a == shifty) { + listener->panelChanged(EvICMshifty, costr2); } } @@ -1303,11 +1486,13 @@ void ICMPanel::wtrcinChanged() case ColorManagementParams::WorkingTrc::NONE: { wGamma->set_sensitive(false); wSlope->set_sensitive(false); + wmidtcie->set_sensitive(false); will->set_sensitive(false); willulab->set_sensitive(false); wprim->set_sensitive(false); fbw->set_sensitive(false); gamut->set_sensitive(false); + wsmoothcie->set_sensitive(false); wprimlab->set_sensitive(false); redFrame->hide(); riaHBox->set_sensitive(false); @@ -1317,8 +1502,12 @@ void ICMPanel::wtrcinChanged() case ColorManagementParams::WorkingTrc::CUSTOM: { will->set_sensitive(false); wprim->set_sensitive(true); + wmidtcie->set_sensitive(true); + wcat->set_sensitive(true); + wcatlab->set_sensitive(true); fbw->set_sensitive(true); gamut->set_sensitive(true); + wsmoothcie->set_sensitive(true); wprimlab->set_sensitive(true); willulab->set_sensitive(true); if (ColorManagementParams::Primaries(wprim->get_active_row_number()) == ColorManagementParams::Primaries::DEFAULT) { @@ -1348,11 +1537,15 @@ void ICMPanel::wtrcinChanged() case ColorManagementParams::WorkingTrc::BT709: { wGamma->setValue(2.222); wSlope->setValue(4.5); + wmidtcie->set_sensitive(true); will->set_sensitive(false); willulab->set_sensitive(true); wprim->set_sensitive(true); + wcat->set_sensitive(true); + wcatlab->set_sensitive(true); fbw->set_sensitive(true); gamut->set_sensitive(true); + wsmoothcie->set_sensitive(true); wprimlab->set_sensitive(true); wGamma->set_sensitive(false); wSlope->set_sensitive(false); @@ -1374,11 +1567,15 @@ void ICMPanel::wtrcinChanged() case ColorManagementParams::WorkingTrc::SRGB: { wGamma->setValue(2.4); wSlope->setValue(12.92); + wmidtcie->set_sensitive(true); will->set_sensitive(false); willulab->set_sensitive(true); wprim->set_sensitive(true); + wcat->set_sensitive(true); + wcatlab->set_sensitive(true); fbw->set_sensitive(true); gamut->set_sensitive(true); + wsmoothcie->set_sensitive(true); wGamma->set_sensitive(false); wSlope->set_sensitive(false); riaHBox->set_sensitive(true); @@ -1401,11 +1598,15 @@ void ICMPanel::wtrcinChanged() case ColorManagementParams::WorkingTrc::GAMMA_2_2: { wGamma->setValue(2.2); wSlope->setValue(0.); + wmidtcie->set_sensitive(true); will->set_sensitive(false); willulab->set_sensitive(true); wprim->set_sensitive(true); + wcat->set_sensitive(true); + wcatlab->set_sensitive(true); fbw->set_sensitive(true); gamut->set_sensitive(true); + wsmoothcie->set_sensitive(true); wprimlab->set_sensitive(true); wGamma->set_sensitive(false); wSlope->set_sensitive(false); @@ -1429,11 +1630,15 @@ void ICMPanel::wtrcinChanged() case ColorManagementParams::WorkingTrc::GAMMA_1_8: { wGamma->setValue(1.8); wSlope->setValue(0.); + wmidtcie->set_sensitive(true); will->set_sensitive(false); willulab->set_sensitive(true); wprim->set_sensitive(true); + wcat->set_sensitive(true); + wcatlab->set_sensitive(true); fbw->set_sensitive(true); gamut->set_sensitive(true); + wsmoothcie->set_sensitive(true); wprimlab->set_sensitive(true); wGamma->set_sensitive(false); wSlope->set_sensitive(false); @@ -1457,11 +1662,15 @@ void ICMPanel::wtrcinChanged() case ColorManagementParams::WorkingTrc::LINEAR: { wGamma->setValue(1.0); wSlope->setValue(1.); + wmidtcie->set_sensitive(true); will->set_sensitive(false); willulab->set_sensitive(true); wprim->set_sensitive(true); + wcat->set_sensitive(true); + wcatlab->set_sensitive(true); fbw->set_sensitive(true); gamut->set_sensitive(true); + wsmoothcie->set_sensitive(true); wprimlab->set_sensitive(true); wGamma->set_sensitive(false); wSlope->set_sensitive(false); @@ -1483,6 +1692,7 @@ void ICMPanel::wtrcinChanged() } } wprimChanged(); + wcatChanged(); switch (ColorManagementParams::Primaries(wprim->get_active_row_number())) { case ColorManagementParams::Primaries::DEFAULT: @@ -1494,6 +1704,7 @@ void ICMPanel::wtrcinChanged() case ColorManagementParams::Primaries::WIDE_GAMUT: case ColorManagementParams::Primaries::ACES_P0: case ColorManagementParams::Primaries::JDC_MAX: + case ColorManagementParams::Primaries::JDC_MAXSTDA: case ColorManagementParams::Primaries::BRUCE_RGB: case ColorManagementParams::Primaries::BETA_RGB: case ColorManagementParams::Primaries::BEST_RGB: { @@ -1517,6 +1728,8 @@ void ICMPanel::wtrcinChanged() if (ColorManagementParams::WorkingTrc(wTRC->get_active_row_number()) == ColorManagementParams::WorkingTrc::NONE) { redFrame->hide(); + will->set_sensitive(false); + } if (listener) { @@ -1536,6 +1749,7 @@ void ICMPanel::willChanged() case ColorManagementParams::Primaries::WIDE_GAMUT: case ColorManagementParams::Primaries::ACES_P0: case ColorManagementParams::Primaries::JDC_MAX: + case ColorManagementParams::Primaries::JDC_MAXSTDA: case ColorManagementParams::Primaries::BRUCE_RGB: case ColorManagementParams::Primaries::BETA_RGB: case ColorManagementParams::Primaries::BEST_RGB: { @@ -1661,6 +1875,17 @@ void ICMPanel::wprimChanged() break; } + case ColorManagementParams::Primaries::JDC_MAXSTDA: { + redx->setValue(0.734702); + redy->setValue(0.265302); + grex->setValue(0.021908); + grey->setValue(0.930288); + blux->setValue(0.120593); + bluy->setValue(0.001583); + will->set_active(toUnderlying(ColorManagementParams::Illuminant::STDA)); + break; + } + case ColorManagementParams::Primaries::BRUCE_RGB: { redx->setValue(0.64); redy->setValue(0.33); @@ -1694,8 +1919,8 @@ void ICMPanel::wprimChanged() break; } } - - + + if (ColorManagementParams::Primaries(wprim->get_active_row_number()) == ColorManagementParams::Primaries::DEFAULT) { if (wProfNames->get_active_text() == "Rec2020") { redx->setValue(0.708); @@ -1760,7 +1985,15 @@ void ICMPanel::wprimChanged() grey->setValue(0.930288); blux->setValue(0.120593); bluy->setValue(0.001583); - will->set_active(toUnderlying(ColorManagementParams::Illuminant::D50)); + will->set_active(toUnderlying(ColorManagementParams::Illuminant::D50));//D50 + } else if (wProfNames->get_active_text() == "JDCmax stdA") { + redx->setValue(0.734702); + redy->setValue(0.265302); + grex->setValue(0.021908); + grey->setValue(0.930288); + blux->setValue(0.120593); + bluy->setValue(0.001583); + will->set_active(toUnderlying(ColorManagementParams::Illuminant::STDA)); } else if (wProfNames->get_active_text() == "BruceRGB") { redx->setValue(0.64); redy->setValue(0.33); @@ -1803,7 +2036,7 @@ void ICMPanel::wprimChanged() labgridcie->set_sensitive(false); will->set_sensitive(true); } - + } willChanged (); @@ -1818,6 +2051,14 @@ void ICMPanel::wprimChanged() } } +void ICMPanel::wcatChanged() +{ + if (listener) { + listener->panelChanged(EvICMcat, wcat->get_active_text()); + } + +} + void ICMPanel::dcpIlluminantChanged() { if (listener) { @@ -2064,6 +2305,20 @@ void ICMPanel::oBPCChanged() } } +void ICMPanel::trcExpChanged() +{ + + if (listener) { + if (trcExp->getEnabled()) { + listener->panelChanged(EvICMtrcExp, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvICMtrcExp, M("GENERAL_DISABLED")); + } + } +} + + + void ICMPanel::fbwChanged() { if (multiImage) { @@ -2104,11 +2359,17 @@ void ICMPanel::gamutChanged() lastgamut = gamut->get_active(); } - + + if (gamut->get_active()) { + wcatBox->set_sensitive(true); + } else { + wcatBox->set_sensitive(false); + } + if (listener) { if (gamut->get_inconsistent()) { listener->panelChanged(EvICMgamut, M("GENERAL_UNCHANGED")); - } else if (fbw->get_active()) { + } else if (gamut->get_active()) { listener->panelChanged(EvICMgamut, M("GENERAL_ENABLED")); } else { listener->panelChanged(EvICMgamut, M("GENERAL_DISABLED")); @@ -2116,6 +2377,33 @@ void ICMPanel::gamutChanged() } } +void ICMPanel::wsmoothcieChanged() +{ + if (multiImage) { + if (wsmoothcie->get_inconsistent()) { + wsmoothcie->set_inconsistent(false); + wsmoothcieconn.block(true); + wsmoothcie->set_active(false); + wsmoothcieconn.block(false); + } else if (lastwsmoothcie) { + wsmoothcie->set_inconsistent(true); + } + + lastwsmoothcie = wsmoothcie->get_active(); + } + + + if (listener) { + if (wsmoothcie->get_inconsistent()) { + listener->panelChanged(EvICMwsmoothcie, M("GENERAL_UNCHANGED")); + } else if (wsmoothcie->get_active()) { + listener->panelChanged(EvICMwsmoothcie, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvICMwsmoothcie, M("GENERAL_DISABLED")); + } + } +} + void ICMPanel::setRawMeta(bool raw, const rtengine::FramesData* pMeta) { @@ -2126,8 +2414,9 @@ void ICMPanel::setRawMeta(bool raw, const rtengine::FramesData* pMeta) iembedded->set_active(!raw); icamera->set_sensitive(raw); camName = pMeta->getCamera(); + filename = pMeta->getFileName(); icameraICC->set_sensitive(raw && (ICCStore::getInstance()->getStdProfile(pMeta->getCamera()) != nullptr || DCPStore::getInstance()->getStdProfile(pMeta->getCamera()) != nullptr)); - iembedded->set_sensitive(!raw); + iembedded->set_sensitive(!raw || DCPStore::getInstance()->getProfile(filename)); enableListener(); } @@ -2216,9 +2505,9 @@ void ICMPanel::setBatchMode(bool batchMode) iVBox->reorder_child(*iunchanged, 5); removeIfThere(this, saveRef); oProfNames->append(M("GENERAL_UNCHANGED")); - oRendIntent->addEntry("template-24.png", M("GENERAL_UNCHANGED")); + oRendIntent->addEntry("template-24", M("GENERAL_UNCHANGED")); oRendIntent->show(); - aRendIntent->addEntry("template-24.png", M("GENERAL_UNCHANGED")); + aRendIntent->addEntry("template-24", M("GENERAL_UNCHANGED")); aRendIntent->show(); wProfNames->append(M("GENERAL_UNCHANGED")); wTRC->append(M("GENERAL_UNCHANGED")); @@ -2227,12 +2516,16 @@ void ICMPanel::setBatchMode(bool batchMode) dcpIll->append(M("GENERAL_UNCHANGED")); wGamma->showEditedCB(); wSlope->showEditedCB(); + wmidtcie->showEditedCB(); redx->showEditedCB(); redy->showEditedCB(); grex->showEditedCB(); grey->showEditedCB(); blux->showEditedCB(); bluy->showEditedCB(); + refi->showEditedCB(); + shiftx->showEditedCB(); + shifty->showEditedCB(); preser->showEditedCB(); } diff --git a/rtgui/icmpanel.h b/rtgui/icmpanel.h index f41e17b7b..0f05da2bb 100644 --- a/rtgui/icmpanel.h +++ b/rtgui/icmpanel.h @@ -49,10 +49,13 @@ protected: Gtk::Frame* dcpFrame; Gtk::Frame* coipFrame; Gtk::Frame* redFrame; + Gtk::Frame* colorFramecie; MyExpander* trcExp; Adjuster* wGamma; Adjuster* wSlope; + Adjuster* wmidtcie; + Gtk::CheckButton* wsmoothcie; Adjuster* redx; Adjuster* redy; Adjuster* grex; @@ -60,13 +63,19 @@ protected: Adjuster* blux; Adjuster* bluy; Adjuster* preser; - + Adjuster* refi; + Adjuster* shiftx; + Adjuster* shifty; + sigc::connection wsmoothcieconn; + bool lastwsmoothcie; Gtk::Label* labmga; Gtk::Box* gabox; //Gtk::Label* blr; //Gtk::Label* blg; //Gtk::Label* blb; Gtk::Button* neutral; + sigc::connection trcExpconn; + bool lasttrcExp; sigc::connection neutralconn; bool lastToneCurve; @@ -111,6 +120,13 @@ private: rtengine::ProcEvent EvICMLabGridciexy; rtengine::ProcEvent EvICMfbw; rtengine::ProcEvent EvICMgamut; + rtengine::ProcEvent EvICMcat; + rtengine::ProcEvent EvICMrefi; + rtengine::ProcEvent EvICMtrcExp; + rtengine::ProcEvent EvICMshiftx; + rtengine::ProcEvent EvICMshifty; + rtengine::ProcEvent EvICMwmidtcie; + rtengine::ProcEvent EvICMwsmoothcie; LabGrid *labgridcie; IdleRegister idle_register; @@ -127,6 +143,10 @@ private: Gtk::CheckButton* fbw; Gtk::CheckButton* gamut; + Gtk::Box* wcatBox; + Gtk::Label* wcatlab; + + Gtk::CheckButton* obpc; Gtk::RadioButton* inone; @@ -149,6 +169,9 @@ private: sigc::connection willconn; MyComboBoxText* wprim; sigc::connection wprimconn; + MyComboBoxText* wcat; + sigc::connection wcatconn; + std::unique_ptr aRendIntent; sigc::connection arendintentconn; @@ -167,6 +190,7 @@ private: double dcpTemperatures[2]; Glib::ustring lastRefFilename; Glib::ustring camName; + Glib::ustring filename; void updateDCP(int dcpIlluminant, Glib::ustring dcp_name); void updateRenderingIntent(const Glib::ustring &profile); void foldAllButMe (GdkEventButton* event, MyExpander *expander); @@ -179,6 +203,8 @@ private: float nextgy; float nextwx; float nextwy; + float nextmx; + float nextmy; public: static const Glib::ustring TOOL_NAME; @@ -192,18 +218,22 @@ public: 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 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, float m_x, float m_y) override; void neutral_pressed(); void wpChanged(); void wtrcinChanged(); void willChanged(); void wprimChanged(); + void wcatChanged(); + void trcExpChanged(); void opChanged(); void oiChanged(int n); void aiChanged(int n); void oBPCChanged(); void fbwChanged(); + void wsmoothcieChanged(); + void gamutChanged(); void ipChanged(); void ipSelectionChanged(); diff --git a/rtgui/imagearea.cc b/rtgui/imagearea.cc index 22e140e7d..a1387db02 100644 --- a/rtgui/imagearea.cc +++ b/rtgui/imagearea.cc @@ -155,7 +155,10 @@ void ImageArea::setInfoText (Glib::ustring text) // update font fontd.set_weight (Pango::WEIGHT_BOLD); - fontd.set_size (10 * Pango::SCALE); + const int fontSize = 10; // pt + // Non-absolute size is defined in "Pango units" and shall be multiplied by + // Pango::SCALE from "pt": + fontd.set_size (fontSize * Pango::SCALE); context->set_font_description (fontd); // create text layout @@ -788,14 +791,14 @@ Gtk::SizeRequestMode ImageArea::get_request_mode_vfunc () const void ImageArea::get_preferred_height_vfunc (int &minimum_height, int &natural_height) const { - minimum_height= 50 * RTScalable::getScale(); - natural_height = 300 * RTScalable::getScale(); + minimum_height = RTScalable::scalePixelSize(50); + natural_height = RTScalable::scalePixelSize(300); } void ImageArea::get_preferred_width_vfunc (int &minimum_width, int &natural_width) const { - minimum_width = 100 * RTScalable::getScale(); - natural_width = 400 * RTScalable::getScale(); + minimum_width = RTScalable::scalePixelSize(100); + natural_width = RTScalable::scalePixelSize(400); } void ImageArea::get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const diff --git a/rtgui/indclippedpanel.cc b/rtgui/indclippedpanel.cc index df9f632ab..72f68887f 100644 --- a/rtgui/indclippedpanel.cc +++ b/rtgui/indclippedpanel.cc @@ -21,31 +21,30 @@ #include "imagearea.h" #include "rtimage.h" -IndicateClippedPanel::IndicateClippedPanel (ImageArea* ia) : imageArea(ia) +IndicateClippedPanel::IndicateClippedPanel (ImageArea* ia) : + Fon("focusscreen-on"), + Foff("focusscreen-off"), + Son("contrastmask-on"), + Soff("contrastmask-off"), + iF(Gtk::manage(new RTImage(Foff, Gtk::ICON_SIZE_LARGE_TOOLBAR))), + iS(Gtk::manage(new RTImage(Soff, Gtk::ICON_SIZE_LARGE_TOOLBAR))), + imageArea(ia) { - - iFon = new RTImage ("focusscreen-on.png"); - iFoff = new RTImage ("focusscreen-off.png"); - - // for previewSharpMask, needs to be replaced with different icons - iSon = new RTImage ("contrastmask-on.png"); - iSoff = new RTImage ("contrastmask-off.png"); - previewFocusMask = Gtk::manage (new Gtk::ToggleButton ()); previewFocusMask->set_relief(Gtk::RELIEF_NONE); previewFocusMask->set_tooltip_markup (M("MAIN_TOOLTIP_PREVIEWFOCUSMASK")); - previewFocusMask->set_image(*iFoff); + previewFocusMask->set_image(*iF); previewSharpMask = Gtk::manage (new Gtk::ToggleButton ()); previewSharpMask->set_relief(Gtk::RELIEF_NONE); previewSharpMask->set_tooltip_markup (M("MAIN_TOOLTIP_PREVIEWSHARPMASK")); - previewSharpMask->set_image(*iSoff); + previewSharpMask->set_image(*iS); Glib::ustring tt; indClippedH = Gtk::manage (new Gtk::ToggleButton ()); indClippedH->set_relief(Gtk::RELIEF_NONE); - indClippedH->add (*Gtk::manage (new RTImage ("warning-highlights.png"))); + indClippedH->add (*Gtk::manage (new RTImage ("warning-highlights", Gtk::ICON_SIZE_LARGE_TOOLBAR))); tt = Glib::ustring::compose("%1\n%2 = %3", M("MAIN_TOOLTIP_INDCLIPPEDH"), M("MAIN_TOOLTIP_THRESHOLD"), options.highlightThreshold); if (tt.find("<") == Glib::ustring::npos && tt.find(">") == Glib::ustring::npos) { @@ -56,7 +55,7 @@ IndicateClippedPanel::IndicateClippedPanel (ImageArea* ia) : imageArea(ia) indClippedS = Gtk::manage (new Gtk::ToggleButton ()); indClippedS->set_relief(Gtk::RELIEF_NONE); - indClippedS->add (*Gtk::manage (new RTImage ("warning-shadows.png"))); + indClippedS->add (*Gtk::manage (new RTImage ("warning-shadows", Gtk::ICON_SIZE_LARGE_TOOLBAR))); tt = Glib::ustring::compose("%1\n%2 = %3", M("MAIN_TOOLTIP_INDCLIPPEDS"), M("MAIN_TOOLTIP_THRESHOLD"), options.shadowThreshold); if (tt.find("<") == Glib::ustring::npos && tt.find(">") == Glib::ustring::npos) { @@ -102,7 +101,7 @@ void IndicateClippedPanel::silentlyDisableSharpMask () { ConnectionBlocker conBlocker(connSharpMask); previewSharpMask->set_active(false); - previewSharpMask->set_image(*iSoff); + iS->set_from_icon_name(Soff); } @@ -141,8 +140,8 @@ void IndicateClippedPanel::buttonToggled (Gtk::ToggleButton* tb) } imageArea->sharpMaskSelected(previewSharpMask->get_active()); - previewFocusMask->set_image(previewFocusMask->get_active() ? *iFon : *iFoff); - previewSharpMask->set_image(previewSharpMask->get_active() ? *iSon : *iSoff); + iF->set_from_icon_name(previewFocusMask->get_active() ? Fon : Foff); + iS->set_from_icon_name(previewSharpMask->get_active() ? Son : Soff); connFocusMask.block(false); connSharpMask.block(false); @@ -158,10 +157,4 @@ void IndicateClippedPanel::buttonToggled (Gtk::ToggleButton* tb) } } -IndicateClippedPanel::~IndicateClippedPanel () -{ - delete iFon; - delete iFoff; - delete iSon; - delete iSoff; -} +IndicateClippedPanel::~IndicateClippedPanel () {} diff --git a/rtgui/indclippedpanel.h b/rtgui/indclippedpanel.h index 6be0a6c40..aeeb14315 100644 --- a/rtgui/indclippedpanel.h +++ b/rtgui/indclippedpanel.h @@ -22,13 +22,19 @@ #include class ImageArea; +class RTImage; class IndicateClippedPanel : public Gtk::Box { protected: - Gtk::Image* iFon, *iFoff, *iSon, *iSoff; + const Glib::ustring Fon; + const Glib::ustring Foff; + const Glib::ustring Son; + const Glib::ustring Soff; + RTImage* const iF; + RTImage* const iS; Gtk::ToggleButton* previewSharpMask; Gtk::ToggleButton* previewFocusMask; Gtk::ToggleButton* indClippedH; diff --git a/rtgui/inspector.cc b/rtgui/inspector.cc index 675da51c6..e2f9df35b 100644 --- a/rtgui/inspector.cc +++ b/rtgui/inspector.cc @@ -590,7 +590,7 @@ void Inspector::switchImage (const Glib::ustring &fullPath) bool Inspector::doSwitchImage() { Glib::ustring fullPath = next_image_path; - + // we first check the size of the list, it may have been changed in Preference if (images.size() > size_t(options.maxInspectorBuffers)) { // deleting the last entries @@ -688,14 +688,14 @@ Gtk::SizeRequestMode Inspector::get_request_mode_vfunc () const void Inspector::get_preferred_height_vfunc (int &minimum_height, int &natural_height) const { - minimum_height= 50 * RTScalable::getScale(); - natural_height = 300 * RTScalable::getScale(); + minimum_height = RTScalable::scalePixelSize(50); + natural_height = RTScalable::scalePixelSize(300); } void Inspector::get_preferred_width_vfunc (int &minimum_width, int &natural_width) const { - minimum_width = 50 * RTScalable::getScale(); - natural_width = 200 * RTScalable::getScale(); + minimum_width = RTScalable::scalePixelSize(50); + natural_width = RTScalable::scalePixelSize(200); } void Inspector::get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const diff --git a/rtgui/iptcpanel.cc b/rtgui/iptcpanel.cc index eb6366fac..b6cf84fcb 100644 --- a/rtgui/iptcpanel.cc +++ b/rtgui/iptcpanel.cc @@ -167,9 +167,9 @@ IPTCPanel::IPTCPanel(): setExpandAlignProperties(addKW, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); delKW = Gtk::manage(new Gtk::Button()); setExpandAlignProperties(delKW, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); - Gtk::Image* addKWImg = Gtk::manage(new RTImage("add-small.png")); + Gtk::Image* const addKWImg = Gtk::manage(new RTImage("add-small", Gtk::ICON_SIZE_BUTTON)); setExpandAlignProperties(addKWImg, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); - Gtk::Image* delKWImg = Gtk::manage(new RTImage("remove-small.png")); + Gtk::Image* const delKWImg = Gtk::manage(new RTImage("remove-small", Gtk::ICON_SIZE_BUTTON)); setExpandAlignProperties(delKWImg, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); addKW->add(*addKWImg); delKW->add(*delKWImg); @@ -217,9 +217,9 @@ IPTCPanel::IPTCPanel(): setExpandAlignProperties(addSC, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); delSC = Gtk::manage(new Gtk::Button()); setExpandAlignProperties(delSC, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); - Gtk::Image* addSCImg = Gtk::manage(new RTImage("add-small.png")); + Gtk::Image* const addSCImg = Gtk::manage(new RTImage("add-small", Gtk::ICON_SIZE_BUTTON)); setExpandAlignProperties(addSCImg, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); - Gtk::Image* delSCImg = Gtk::manage(new RTImage("remove-small.png")); + Gtk::Image* const delSCImg = Gtk::manage(new RTImage("remove-small", Gtk::ICON_SIZE_BUTTON)); setExpandAlignProperties(delSCImg, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); addSC->add(*addSCImg); delSC->add(*delSCImg); @@ -383,25 +383,25 @@ IPTCPanel::IPTCPanel(): reset = Gtk::manage(new Gtk::Button()); // M("IPTCPANEL_RESET") reset->get_style_context()->add_class("Left"); - reset->set_image(*Gtk::manage(new RTImage("undo.png", "redo.png"))); + reset->set_image(*Gtk::manage(new RTImage("undo", Gtk::ICON_SIZE_BUTTON))); setExpandAlignProperties(reset, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); bbox->attach_next_to(*reset, Gtk::POS_LEFT, 1, 1); file = Gtk::manage(new Gtk::Button()); // M("IPTCPANEL_EMBEDDED") file->get_style_context()->add_class("MiddleH"); - file->set_image(*Gtk::manage(new RTImage("folder-open.png"))); + file->set_image(*Gtk::manage(new RTImage("folder-open", Gtk::ICON_SIZE_BUTTON))); setExpandAlignProperties(file, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); bbox->attach_next_to(*file, Gtk::POS_RIGHT, 1, 1); copy = Gtk::manage(new Gtk::Button()); copy->get_style_context()->add_class("MiddleH"); - copy->set_image(*Gtk::manage(new RTImage("copy.png"))); + copy->set_image(*Gtk::manage(new RTImage("copy", Gtk::ICON_SIZE_BUTTON))); setExpandAlignProperties(copy, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); bbox->attach_next_to(*copy, Gtk::POS_RIGHT, 1, 1); paste = Gtk::manage(new Gtk::Button()); paste->get_style_context()->add_class("Right"); - paste->set_image(*Gtk::manage(new RTImage("paste.png"))); + paste->set_image(*Gtk::manage(new RTImage("paste", Gtk::ICON_SIZE_BUTTON))); setExpandAlignProperties(paste, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); bbox->attach_next_to(*paste, Gtk::POS_RIGHT, 1, 1); diff --git a/rtgui/labgrid.cc b/rtgui/labgrid.cc index bc3b806de..9babe17ca 100644 --- a/rtgui/labgrid.cc +++ b/rtgui/labgrid.cc @@ -1,5 +1,5 @@ /** -*- C++ -*- - * + * * This file is part of RawTherapee. * * Copyright (c) 2017 Alberto Griggio @@ -43,6 +43,7 @@ #include "../rtengine/color.h" #include "options.h" #include "rtimage.h" +#include "rtscalable.h" using rtengine::Color; @@ -75,18 +76,20 @@ bool LabGridArea::notifyListener() } -LabGridArea::LabGridArea(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low, bool ciexy): +LabGridArea::LabGridArea(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low, bool ciexy, bool mous): Gtk::DrawingArea(), evt(evt), evtMsg(msg), litPoint(NONE), - 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), + 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), me_x(0.f), me_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), defaultme_x(0.f), defaultme_y(0.f), listener(nullptr), edited(false), isDragged(false), low_enabled(enable_low), - ciexy_enabled(ciexy) + ciexy_enabled(ciexy), + mous_enabled(mous) + { 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); @@ -94,7 +97,7 @@ 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, double &gx, double &gy, double &wx, double &wy) const +void LabGridArea::getParams(double &la, double &lb, double &ha, double &hb, double &gx, double &gy, double &wx, double &wy, double &mx, double &my) const { la = low_a; ha = high_a; @@ -104,11 +107,13 @@ void LabGridArea::getParams(double &la, double &lb, double &ha, double &hb, doub gy = gre_y; wx = whi_x; wy = whi_y; + mx = me_x; + my = me_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, double gx, double gy, double wx, double wy, bool notify) +void LabGridArea::setParams(double la, double lb, double ha, double hb, double gx, double gy, double wx, double wy, double mx, double my, bool notify) { const double lo = -1.0; const double hi = 1.0; @@ -120,14 +125,16 @@ void LabGridArea::setParams(double la, double lb, double ha, double hb, double g gre_y = rtengine::LIM(gy, lo, hi); whi_x = rtengine::LIM(wx, lo, hi); whi_y = rtengine::LIM(wy, lo, hi); - + me_x = rtengine::LIM(mx, lo, hi); + me_y = rtengine::LIM(my, lo, hi); + queue_draw(); if (notify) { notifyListener(); } } -void LabGridArea::setDefault (double la, double lb, double ha, double hb, double gx, double gy, double wx, double wy) +void LabGridArea::setDefault (double la, double lb, double ha, double hb, double gx, double gy, double wx, double wy, double mx, double my) { defaultLow_a = la; defaultLow_b = lb; @@ -137,16 +144,18 @@ void LabGridArea::setDefault (double la, double lb, double ha, double hb, double defaultgre_y = gy; defaultwhi_x = wx; defaultwhi_y = wy; + defaultme_x = mx; + defaultme_y = my; } void LabGridArea::reset(bool toInitial) { if (toInitial) { - setParams(defaultLow_a, defaultLow_b, defaultHigh_a, defaultHigh_b, defaultgre_x, defaultgre_y, defaultwhi_x, defaultwhi_y, true); + setParams(defaultLow_a, defaultLow_b, defaultHigh_a, defaultHigh_b, defaultgre_x, defaultgre_y, defaultwhi_x, defaultwhi_y, defaultme_x, defaultme_y, true); } else { // printf("RESET \n"); - setParams(0., 0., 0., 0., 0., 0., 0., 0., true); + setParams(0., 0., 0., 0., 0., 0., 0., 0., 0., 0., true); } } @@ -171,304 +180,273 @@ void LabGridArea::setListener(ToolPanelListener *l) void LabGridArea::on_style_updated () { - setDirty(true); queue_draw (); } -bool LabGridArea::on_draw(const ::Cairo::RefPtr &crf) +bool LabGridArea::on_draw(const ::Cairo::RefPtr &cr) { - Gtk::Allocation allocation = get_allocation(); - allocation.set_x(0); - allocation.set_y(0); - - // setDrawRectangle will allocate the backbuffer Surface - if (setDrawRectangle(Cairo::FORMAT_ARGB32, allocation)) { - setDirty(true); - } - - if (!isDirty() || !surfaceCreated()) { + // Do not update drawing area if widget is not realized + if (!get_realized()) { return true; } Glib::RefPtr style = get_style_context(); - Gtk::Border padding = getPadding(style); // already scaled - Cairo::RefPtr cr = getContext(); + Gtk::Border padding = getPadding(style); + // Retrieve drawing area size + Gtk::Allocation allocation = get_allocation(); + allocation.set_x(0); + allocation.set_y(0); + int width = allocation.get_width(); + int height = allocation.get_height(); - if (isDirty()) { - int width = allocation.get_width(); - int height = allocation.get_height(); + // Setup drawing + cr->set_line_cap(Cairo::LINE_CAP_SQUARE); + cr->set_operator (Cairo::OPERATOR_OVER); - int s = RTScalable::getScale(); + // Render background + style->render_background(cr, + static_cast(inset + padding.get_left()) - 1., + static_cast(inset + padding.get_top()) - 1., + static_cast(width - 2 * inset - padding.get_right() - padding.get_left()) + 2., + static_cast(height - 2 * inset - padding.get_top() - padding.get_bottom()) + 2. + ); - cr->set_line_cap(Cairo::LINE_CAP_SQUARE); + // Drawing the cells + cr->translate(static_cast(inset + padding.get_left()), + static_cast(inset + padding.get_top())); + cr->set_antialias(Cairo::ANTIALIAS_NONE); + width -= 2 * inset + padding.get_right() + padding.get_left(); + height -= 2 * inset + padding.get_top() + padding.get_bottom(); - // clear background - cr->set_source_rgba (0., 0., 0., 0.); - cr->set_operator (Cairo::OPERATOR_CLEAR); - cr->paint (); - cr->set_operator (Cairo::OPERATOR_OVER); - style->render_background(cr, - inset * s + padding.get_left() - s, - inset * s + padding.get_top() - s, - width - 2 * inset * s - padding.get_right() - padding.get_left() + 2 * s, - height - 2 * inset * s - padding.get_top() - padding.get_bottom() + 2 * s - ); + // flip y: + cr->translate(0., static_cast(height)); + cr->scale(1., -1.); - // drawing the cells - cr->translate(inset * s + padding.get_left(), inset * s + padding.get_top()); - cr->set_antialias(Cairo::ANTIALIAS_NONE); - width -= 2 * inset * s + padding.get_right() + padding.get_left(); - height -= 2 * inset * s + padding.get_top() + padding.get_bottom(); - - // flip y: - cr->translate(0, height); - cr->scale(1., -1.); - - 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); + if (! ciexy_enabled) {//draw cells for Labgrid + const int cells = 8; + const float step = 12000.f / static_cast(cells/2); + const double cellW = static_cast(width) / static_cast(cells); + const double cellH = static_cast(height) / static_cast(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; + const int ii = i - cells/2; + const int jj = j - cells/2; + const float a = step * static_cast(ii + 0.5f); + const float b = step * static_cast(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. : 1.), + cellYMax - cellYMin - (j == cells-1 ? 0. : 1.) + ); + cellXMin = cellXMax; + cellXMax = std::floor(cellW * static_cast(i+2) + 0.01); + cr->fill(); } + cellYMin = cellYMax; + cellYMax = std::floor(cellH * static_cast(j+2) + 0.01); } - // drawing the connection line - cr->set_antialias(Cairo::ANTIALIAS_DEFAULT); - 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); + } else {//cells for CIE xy + const int cells = 600; + const float step = 1.f / static_cast(cells); + const double cellW = static_cast(width) / static_cast(cells); + const double cellH = static_cast(height) / static_cast(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 + const float xa = 0.2653f / (0.7347f - 0.17f); + const float xb = -0.17f * xa; + //linear values + const float axs = (0.2653f - 0.65f) / (0.7347f - 0.35f); + const float bxs = 0.65f - axs * 0.35f; + const float ay = 0.4f; + const 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; + const float x = 1.1f * step * static_cast(i) - 0.1f;//Graph CIExy with -0.1 to 1 - must be enough + const float y = 1.1f * step * static_cast(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; + const float yr = xa * x + xb; + const float y2 = axs * x + bxs; + const 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 + const 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 + const 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 < 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; + } + + cr->set_source_rgb(R , G , B); + cr->rectangle( + cellXMin, + cellYMin, + cellXMax - cellXMin, + cellYMax - cellYMin); + cellXMin = cellXMax; + cellXMax = std::floor(cellW * static_cast(i+2) + 0.001); + cr->fill(); + } + cellYMin = cellYMax; + cellYMax = std::floor(cellH * static_cast(j+2) + 0.001); + } + } + + // Drawing the connection line + cr->set_antialias(Cairo::ANTIALIAS_DEFAULT); + // float loa, hia, lob, hib, grx, gry, whx, why, mex, mey; + const double loa = .5 * (static_cast(width) + static_cast(width) * low_a); + const double hia = .5 * (static_cast(width) + static_cast(width) * high_a); + const double lob = .5 * (static_cast(height) + static_cast(height) * low_b); + const double hib = .5 * (static_cast(height) + static_cast(height) * high_b); + const double grx = .5 * (static_cast(width) + static_cast(width) * gre_x); + const double gry = .5 * (static_cast(height) + static_cast(height) * gre_y); + const double whx = .5 * (static_cast(width) + static_cast(width) * whi_x); + const double why = .5 * (static_cast(height) + static_cast(height) * whi_y); + double mex = .5 * (static_cast(width) + static_cast(width) * me_x); + double mey = .5 * (static_cast(height) + static_cast(height) * me_y); + cr->set_line_width(1.5); + mex = .5 * (width + width * me_x); + mey = .5 * (height + height * me_y); + 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); - 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) { + cr->set_line_width(0.2); + 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 * static_cast(i * width), 0.); + cr->line_to(0.04545 * static_cast(i * width), static_cast(height)); } + for(int i = 0; i < 22; i++) { + cr->move_to(0., 0.04545 * static_cast(i * height)); + cr->line_to(static_cast(width), 0.04545 * static_cast(i * height)); + } + + cr->stroke(); + //draw abciss and ordonate + cr->set_line_width(1.); + cr->set_source_rgb(0.4, 0., 0.); + cr->move_to(0.04545 * static_cast(2 * width), 0.); + cr->line_to(0.04545 * static_cast(2 * width), static_cast(height)); + cr->move_to(0., 0.04545 * static_cast(2 * height)); + cr->line_to(static_cast(width), 0.04545 * static_cast(2 * height)); 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); - } + //draw 0 and 1 with circle and lines + cr->set_line_width(1.2); + cr->set_source_rgb(0.4, 0., 0.); + cr->arc(0.06 * static_cast(width), + 0.06 * static_cast(height), + 0.016 * static_cast(width), + 0., + 2. * rtengine::RT_PI); + cr->stroke(); + cr->set_line_width(1.5); + cr->set_source_rgb(0.4, 0., 0.); + cr->move_to(0.985 * static_cast(width), 0.08 * static_cast(height)); + cr->line_to(0.985 * static_cast(width), 0.055 * static_cast(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(); + cr->move_to(0.07 * static_cast(width), 0.99 * static_cast(height)); + cr->line_to(0.07 * static_cast(width), 0.965 * static_cast(height)); - //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->stroke(); + } - 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);//black for red in Ciexy - if (litPoint == LOW) { - cr->arc(loa, lob, 5 * s, 0, 2. * rtengine::RT_PI); - } else { - cr->arc(loa, lob, 3 * s, 0, 2. * rtengine::RT_PI); - } - cr->fill(); - } - - 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); + // Drawing points + if (low_enabled) { + cr->set_source_rgb(0.1, 0.1, 0.1);//black for red in Ciexy + if (litPoint == LOW) { + cr->arc(loa, lob, 5., 0., 2. * rtengine::RT_PI); } else { - cr->arc(hia, hib, 3 * s, 0, 2. * rtengine::RT_PI); + cr->arc(loa, lob, 3., 0., 2. * rtengine::RT_PI); } cr->fill(); } - copySurface(crf); + if (ciexy_enabled) { + cr->set_source_rgb(0.5, 0.5, 0.5);//gray for green + if (litPoint == GRE) { + cr->arc(grx, gry, 5., 0., 2. * rtengine::RT_PI); + } else { + cr->arc(grx, gry, 3., 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., 0., 2. * rtengine::RT_PI); + cr->fill(); + } + + if (ciexy_enabled) {//Dominant + cr->set_source_rgb(0.3, 0.4, 0.3); + cr->arc(mex, mey, 3., 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., 0., 2. * rtengine::RT_PI); + } else { + cr->arc(hia, hib, 3., 0., 2. * rtengine::RT_PI); + } + cr->fill(); + return false; } bool LabGridArea::on_button_press_event(GdkEventButton *event) { - if (event->button == 1) { - if (!ciexy_enabled) { + if (event->button == 1 && mous_enabled) { + if (!ciexy_enabled) { if (event->type == GDK_2BUTTON_PRESS) { switch (litPoint) { case NONE: @@ -491,14 +469,15 @@ bool LabGridArea::on_button_press_event(GdkEventButton *event) 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; + if(mous_enabled) { + if (event->type == GDK_2BUTTON_PRESS) { + edited = true; + notifyListener(); + queue_draw(); + } else if (event->type == GDK_BUTTON_PRESS && litPoint != NONE) { + isDragged = true; + } } - } return false; } @@ -508,7 +487,7 @@ bool LabGridArea::on_button_press_event(GdkEventButton *event) bool LabGridArea::on_button_release_event(GdkEventButton *event) { - if (event->button == 1) { + if (event->button == 1 && mous_enabled) { isDragged = false; return false; } @@ -527,11 +506,10 @@ bool LabGridArea::on_motion_notify_event(GdkEventMotion *event) State oldLitPoint = litPoint; - int s = RTScalable::getScale(); - int width = get_allocated_width() - 2 * inset * s - padding.get_right() - padding.get_left(); - 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 int width = get_allocated_width() - 2 * inset - padding.get_right() - padding.get_left(); + const int height = get_allocated_height() - 2 * inset - padding.get_top() - padding.get_bottom(); + const float mouse_x = std::min(double(std::max(event->x - inset - padding.get_right(), 0.)), double(width)); + const float mouse_y = std::min(double(std::max(get_allocated_height() - 1 - event->y - inset - padding.get_bottom(), 0.)), double(height)); const float ma = (2.f * mouse_x - width) / width; const float mb = (2.f * mouse_y - height) / height; if (isDragged) { @@ -555,12 +533,12 @@ bool LabGridArea::on_motion_notify_event(GdkEventMotion *event) queue_draw(); } else { litPoint = NONE; - float la = low_a; - float lb = low_b; - float ha = high_a; - float hb = high_b; - float gx = gre_x; - float gy = gre_y; + const float la = low_a; + const float lb = low_b; + const float ha = high_a; + const float hb = high_b; + const float gx = gre_x; + const 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); @@ -590,8 +568,8 @@ void LabGridArea::get_preferred_width_vfunc(int &minimum_width, int &natural_wid { Glib::RefPtr style = get_style_context(); Gtk::Border padding = getPadding(style); // already scaled - int s = RTScalable::getScale(); - int p = padding.get_left() + padding.get_right(); + const int s = RTScalable::scalePixelSize(1); + const int p = padding.get_left() + padding.get_right(); minimum_width = 50 * s + p; natural_width = 150 * s + p; // same as GRAPH_SIZE from mycurve.h @@ -633,17 +611,26 @@ void LabGridArea::setciexyEnabled(bool yes) } } +void LabGridArea::setmousEnabled(bool yes) +{ + if (mous_enabled != yes) { + mous_enabled = yes; + queue_draw(); + } +} + + //----------------------------------------------------------------------------- // LabGrid //----------------------------------------------------------------------------- -LabGrid::LabGrid(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low, bool ciexy): - grid(evt, msg, enable_low, ciexy) +LabGrid::LabGrid(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low, bool ciexy, bool mous): + grid(evt, msg, enable_low, ciexy, mous) { Gtk::Button *reset = Gtk::manage(new Gtk::Button()); reset->set_tooltip_markup(M("ADJUSTER_RESET_TO_DEFAULT")); if(!ciexy) {//disabled for Cie xy - reset->add(*Gtk::manage(new RTImage("undo-small.png", "redo-small.png"))); + reset->add(*Gtk::manage(new RTImage("undo-small", Gtk::ICON_SIZE_BUTTON))); } reset->signal_button_release_event().connect(sigc::mem_fun(*this, &LabGrid::resetPressed)); @@ -653,7 +640,7 @@ LabGrid::LabGrid(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_ reset->set_can_focus(false); reset->set_size_request(-1, 20); - pack_start(grid, true, true); + pack_start(grid, true, true, true); pack_start(*reset, false, false); show_all_children(); } @@ -662,5 +649,5 @@ LabGrid::LabGrid(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_ bool LabGrid::resetPressed(GdkEventButton *event) { grid.reset(event->state & GDK_CONTROL_MASK); - return false; + return false; } diff --git a/rtgui/labgrid.h b/rtgui/labgrid.h index 0ed4cdf98..9756af626 100644 --- a/rtgui/labgrid.h +++ b/rtgui/labgrid.h @@ -1,5 +1,5 @@ /** -*- C++ -*- - * + * * This file is part of RawTherapee. * * Copyright (c) 2017 Alberto Griggio @@ -43,11 +43,11 @@ #include "toolpanel.h" -class LabGridArea final : public Gtk::DrawingArea, public BackBuffer { +class LabGridArea final : public Gtk::DrawingArea { private: rtengine::ProcEvent evt; Glib::ustring evtMsg; - + enum State { NONE, HIGH, LOW, GRE}; State litPoint; double low_a; @@ -58,7 +58,8 @@ private: double gre_y; double whi_x; double whi_y; - + double me_x; + double me_y; double defaultLow_a; double defaultHigh_a; double defaultLow_b; @@ -67,6 +68,8 @@ private: double defaultgre_y; double defaultwhi_x; double defaultwhi_y; + double defaultme_x; + double defaultme_y; ToolPanelListener *listener; bool edited; @@ -76,16 +79,17 @@ private: bool low_enabled; bool ciexy_enabled; + bool mous_enabled; bool notifyListener(); void getLitPoint(); public: - LabGridArea(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low=true, bool ciexy=false); + LabGridArea(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low=true, bool ciexy=false, bool mous=false); - 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 getParams(double &la, double &lb, double &ha, double &hb, double &gx, double &gy, double &wx, double &wy, double &mx, double &my) const; + void setParams(double la, double lb, double ha, double hb, double gx, double gy, double wx, double wy, double mx, double my, bool notify); + void setDefault (double la, double lb, double ha, double hb, double gx, double gy, double wx, double wy, double mx, double my); void setEdited(bool yes); bool getEdited() const; void reset(bool toInitial); @@ -95,8 +99,10 @@ public: void setLowEnabled(bool yes); bool ciexyEnabled() const; void setciexyEnabled(bool yes); + bool mousEnabled() const; + void setmousEnabled(bool yes); - bool on_draw(const ::Cairo::RefPtr &crf) override; + bool on_draw(const ::Cairo::RefPtr &cr) override; void on_style_updated () override; bool on_button_press_event(GdkEventButton *event) override; bool on_button_release_event(GdkEventButton *event) override; @@ -112,13 +118,13 @@ private: LabGridArea grid; bool resetPressed(GdkEventButton *event); - -public: - 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, 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); } +public: + LabGrid(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low=true, bool ciexy=false, bool mous=true); + + void getParams(double &la, double &lb, double &ha, double &hb, double &gx, double &gy, double &wx, double &wy, double &mx, double &my) const { return grid.getParams(la, lb, ha, hb, gx, gy, wx, wy, mx, my); } + void setParams(double la, double lb, double ha, double hb, double gx, double gy, double wx, double wy, double mx, double my, bool notify) { grid.setParams(la, lb, ha, hb, gx, gy, wx, wy, mx, my, notify); } + void setDefault (double la, double lb, double ha, double hb, double gx, double gy, double wx, double wy, double mx, double my) { grid.setDefault(la, lb, ha, hb, gx, gy, wx, wy, mx, my); } void setEdited(bool yes) { grid.setEdited(yes); } bool getEdited() const { return grid.getEdited(); } void reset(bool toInitial) { grid.reset(toInitial); } @@ -127,5 +133,8 @@ public: void setLowEnabled(bool yes) { grid.setLowEnabled(yes); } bool ciexyEnabled() const { return grid.ciexyEnabled(); } void setciexyEnabled(bool yes) { grid.setciexyEnabled(yes); } + bool mousEnabled() const { return grid.mousEnabled(); } + void setmousEnabled(bool yes) { grid.setmousEnabled(yes); } + }; diff --git a/rtgui/lensgeom.cc b/rtgui/lensgeom.cc index e8febf8e2..0064ecee3 100644 --- a/rtgui/lensgeom.cc +++ b/rtgui/lensgeom.cc @@ -48,7 +48,7 @@ LensGeometry::LensGeometry () : FoldableToolPanel(this, TOOL_NAME, M("TP_LENSGEO pack_start (*fill); autoCrop = Gtk::manage (new Gtk::Button (M("TP_LENSGEOM_AUTOCROP"))); - autoCrop->set_image (*Gtk::manage (new RTImage ("crop-auto-small.png"))); + autoCrop->set_image (*Gtk::manage (new RTImage ("crop-auto-small", Gtk::ICON_SIZE_BUTTON))); autoCrop->get_style_context()->add_class("independent"); pack_start (*autoCrop, Gtk::PACK_SHRINK, 2); diff --git a/rtgui/lensprofile.cc b/rtgui/lensprofile.cc index 784c49f15..4410b2fe0 100644 --- a/rtgui/lensprofile.cc +++ b/rtgui/lensprofile.cc @@ -32,6 +32,7 @@ #include "../rtengine/lcp.h" #include "../rtengine/procparams.h" #include "../rtengine/rtlensfun.h" +#include "../rtengine/lensmetadata.h" using namespace rtengine; using namespace rtengine::procparams; @@ -56,6 +57,7 @@ LensProfilePanel::LensProfilePanel() : distGrid(Gtk::manage((new Gtk::Grid()))), corrUnchangedRB(Gtk::manage((new Gtk::RadioButton(M("GENERAL_UNCHANGED"))))), corrOffRB(Gtk::manage((new Gtk::RadioButton(corrGroup, M("GENERAL_NONE"))))), + corrMetadata(Gtk::manage((new Gtk::RadioButton(corrGroup, M("TP_LENSPROFILE_CORRECTION_METADATA"))))), corrLensfunAutoRB(Gtk::manage((new Gtk::RadioButton(corrGroup, M("TP_LENSPROFILE_CORRECTION_AUTOMATCH"))))), corrLensfunManualRB(Gtk::manage((new Gtk::RadioButton(corrGroup, M("TP_LENSPROFILE_CORRECTION_MANUAL"))))), corrLcpFileRB(Gtk::manage((new Gtk::RadioButton(corrGroup, M("TP_LENSPROFILE_CORRECTION_LCPFILE"))))), @@ -64,7 +66,7 @@ LensProfilePanel::LensProfilePanel() : lensfunCameras(Gtk::manage((new MyComboBox()))), lensfunLensesLbl(Gtk::manage((new Gtk::Label(M("EXIFFILTER_LENS"))))), lensfunLenses(Gtk::manage((new MyComboBox()))), - warning(Gtk::manage(new RTImage("warning.png"))), + warning(Gtk::manage(new RTImage("warning", Gtk::ICON_SIZE_LARGE_TOOLBAR))), ckbUseDist(Gtk::manage((new Gtk::CheckButton(M("TP_LENSPROFILE_USE_GEOMETRIC"))))), ckbUseVign(Gtk::manage((new Gtk::CheckButton(M("TP_LENSPROFILE_USE_VIGNETTING"))))), ckbUseCA(Gtk::manage((new Gtk::CheckButton(M("TP_LENSPROFILE_USE_CA"))))) @@ -144,17 +146,18 @@ LensProfilePanel::LensProfilePanel() : // Populate modes grid: modesGrid->attach(*corrOffRB, 0, 0, 3, 1); - modesGrid->attach(*corrLensfunAutoRB, 0, 1, 3, 1); - modesGrid->attach(*corrLensfunManualRB, 0, 2, 3, 1); + modesGrid->attach(*corrMetadata, 0, 1, 3, 1); + modesGrid->attach(*corrLensfunAutoRB, 0, 2, 3, 1); + modesGrid->attach(*corrLensfunManualRB, 0, 3, 3, 1); - modesGrid->attach(*lensfunCamerasLbl, 0, 3, 1, 1); - modesGrid->attach(*lensfunCameras, 1, 3, 1, 1); - modesGrid->attach(*lensfunLensesLbl, 0, 4, 1, 1); - modesGrid->attach(*lensfunLenses, 1, 4, 1, 1); - modesGrid->attach(*warning, 2, 3, 1, 2); + modesGrid->attach(*lensfunCamerasLbl, 0, 4, 1, 1); + modesGrid->attach(*lensfunCameras, 1, 4, 1, 1); + modesGrid->attach(*lensfunLensesLbl, 0, 5, 1, 1); + modesGrid->attach(*lensfunLenses, 1, 5, 1, 1); + modesGrid->attach(*warning, 2, 4, 1, 2); - modesGrid->attach(*corrLcpFileRB, 0, 5, 1, 1); - modesGrid->attach(*corrLcpFileChooser, 1, 5, 1, 1); + modesGrid->attach(*corrLcpFileRB, 0, 6, 1, 1); + modesGrid->attach(*corrLcpFileChooser, 1, 6, 1, 1); // Populate distortions grid: @@ -165,7 +168,7 @@ LensProfilePanel::LensProfilePanel() : // Attach grids: nodesFrame->add(*modesGrid); distFrame->add(*distGrid); - + pack_start(*nodesFrame, Gtk::PACK_EXPAND_WIDGET); pack_start(*distFrame, Gtk::PACK_EXPAND_WIDGET); @@ -179,6 +182,7 @@ LensProfilePanel::LensProfilePanel() : lensfunCameras->signal_changed().connect(sigc::mem_fun(*this, &LensProfilePanel::onLensfunCameraChanged)); lensfunLenses->signal_changed().connect(sigc::mem_fun(*this, &LensProfilePanel::onLensfunLensChanged)); corrOffRB->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged), corrOffRB)); + corrMetadata->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged), corrMetadata)); corrLensfunAutoRB->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged), corrLensfunAutoRB)); corrLensfunManualRB->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged), corrLensfunManualRB)); corrLcpFileRB->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged), corrLcpFileRB)); @@ -211,30 +215,52 @@ void LensProfilePanel::read(const rtengine::procparams::ProcParams* pp, const Pa break; } + case procparams::LensProfParams::LcMode::METADATA: { + if (metadata) { + auto metadataCorrection= rtengine::MetadataLensCorrectionFinder::findCorrection(metadata); + if (metadataCorrection) { + corrMetadata->set_active(true); + corrMetadata->set_sensitive(true); + } else { + corrMetadata->set_sensitive(false); + corrOffRB->set_active(true); + } + } else { + corrMetadata->set_sensitive(false); + } + break; + } + case procparams::LensProfParams::LcMode::NONE: { corrOffRB->set_active(true); setManualParamsVisibility(false); + + ckbUseDist->set_sensitive(false); + ckbUseVign->set_sensitive(false); + ckbUseCA->set_sensitive(false); break; } } - if (pp->lensProf.lcpFile.empty()) { - const Glib::ustring lastFolder = corrLcpFileChooser->get_current_folder(); - corrLcpFileChooser->set_current_folder(lastFolder); - corrLcpFileChooser->unselect_all(); - bindCurrentFolder(*corrLcpFileChooser, options.lastLensProfileDir); - updateDisabled(false); - } - else if (LCPStore::getInstance()->isValidLCPFileName(pp->lensProf.lcpFile)) { - corrLcpFileChooser->set_filename(pp->lensProf.lcpFile); - - if (corrLcpFileRB->get_active()) { - updateDisabled(true); + if (pp->lensProf.lcMode == procparams::LensProfParams::LcMode::LCP) { + if (pp->lensProf.lcpFile.empty()) { + const Glib::ustring lastFolder = corrLcpFileChooser->get_current_folder(); + corrLcpFileChooser->set_current_folder(lastFolder); + corrLcpFileChooser->unselect_all(); + bindCurrentFolder(*corrLcpFileChooser, options.lastLensProfileDir); + updateLCPDisabled(false); + } + else if (LCPStore::getInstance()->isValidLCPFileName(pp->lensProf.lcpFile)) { + corrLcpFileChooser->set_filename(pp->lensProf.lcpFile); + + if (corrLcpFileRB->get_active()) { + updateLCPDisabled(true); + } + } + else { + corrLcpFileChooser->unselect_filename(corrLcpFileChooser->get_filename()); + updateLCPDisabled(false); } - } - else { - corrLcpFileChooser->unselect_filename(corrLcpFileChooser->get_filename()); - updateDisabled(false); } const LFDatabase* const db = LFDatabase::getInstance(); @@ -242,7 +268,7 @@ void LensProfilePanel::read(const rtengine::procparams::ProcParams* pp, const Pa if (pp->lensProf.lfAutoMatch()) { if (metadata) { - c = db->findCamera(metadata->getMake(), metadata->getModel()); + c = db->findCamera(metadata->getMake(), metadata->getModel(), true); setLensfunCamera(c.getMake(), c.getModel()); } } else if (pp->lensProf.lfManual()) { @@ -251,7 +277,7 @@ void LensProfilePanel::read(const rtengine::procparams::ProcParams* pp, const Pa if (pp->lensProf.lfAutoMatch()) { if (metadata) { - const LFLens l = db->findLens(c, metadata->getLens()); + const LFLens l = db->findLens(c, metadata->getLens(), true); setLensfunLens(l.getLens()); } } else if (pp->lensProf.lfManual()) { @@ -259,7 +285,7 @@ void LensProfilePanel::read(const rtengine::procparams::ProcParams* pp, const Pa } - /* + /* if (!batchMode && !checkLensfunCanCorrect(true)) { if (corrLensfunAutoRB->get_active()) { corrOffRB->set_active(true); @@ -270,26 +296,26 @@ void LensProfilePanel::read(const rtengine::procparams::ProcParams* pp, const Pa if (!batchMode && corrLensfunManualRB->get_active() && !checkLensfunCanCorrect(false)) { corrOffRB->set_active(true); - } + } */ - + ckbUseDist->set_active(pp->lensProf.useDist); ckbUseVign->set_active(pp->lensProf.useVign); ckbUseCA->set_active(pp->lensProf.useCA); - + if (pedited) { corrUnchangedRB->set_active(!pedited->lensProf.lcMode); ckbUseDist->set_inconsistent(!pedited->lensProf.useDist); ckbUseVign->set_inconsistent(!pedited->lensProf.useVign); ckbUseCA->set_inconsistent(!pedited->lensProf.useCA); - + if (!pedited->lensProf.lfCameraMake || !pedited->lensProf.lfCameraModel) { setLensfunCamera("", ""); } if (!pedited->lensProf.lfLens) { setLensfunLens(""); } - + ckbUseDist->set_sensitive(true); ckbUseVign->set_sensitive(true); ckbUseCA->set_sensitive(true); @@ -297,7 +323,7 @@ void LensProfilePanel::read(const rtengine::procparams::ProcParams* pp, const Pa lcModeChanged = lcpFileChanged = useDistChanged = useVignChanged = useCAChanged = false; useLensfunChanged = lensfunAutoChanged = lensfunCameraChanged = lensfunLensChanged = false; - + updateLensfunWarning(); enableListener(); conUseDist.block(false); @@ -308,6 +334,9 @@ void LensProfilePanel::write(rtengine::procparams::ProcParams* pp, ParamsEdited* if (corrLcpFileRB->get_active()) { pp->lensProf.lcMode = procparams::LensProfParams::LcMode::LCP; } + else if (corrMetadata->get_active()) { + pp->lensProf.lcMode = procparams::LensProfParams::LcMode::METADATA; + } else if (corrLensfunManualRB->get_active()) { pp->lensProf.lcMode = procparams::LensProfParams::LcMode::LENSFUNMANUAL; } @@ -367,12 +396,18 @@ void LensProfilePanel::setRawMeta(bool raw, const rtengine::FramesMetaData* pMet // CA is very focus layer dependent, otherwise it might even worsen things allowFocusDep = false; - ckbUseCA->set_active(false); - ckbUseCA->set_sensitive(false); enableListener(); } + corrMetadata->set_sensitive(false); + if (pMeta) { + metadataCorrection = MetadataLensCorrectionFinder::findCorrection(pMeta); + if (metadataCorrection) { + corrMetadata->set_sensitive(true); + } + } + isRaw = raw; metadata = pMeta; } @@ -381,7 +416,7 @@ void LensProfilePanel::onLCPFileChanged() { lcpFileChanged = true; const bool valid = LCPStore::getInstance()->isValidLCPFileName(corrLcpFileChooser->get_filename()); - updateDisabled(valid); + updateLCPDisabled(valid); if (listener) { if (valid) { @@ -436,7 +471,7 @@ void LensProfilePanel::onUseCAChanged() void LensProfilePanel::setBatchMode(bool yes) { FoldableToolPanel::setBatchMode(yes); - + corrUnchangedRB->set_group(corrGroup); modesGrid->attach_next_to(*corrUnchangedRB, Gtk::POS_TOP, 3, 1); corrUnchangedRB->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged), corrUnchangedRB)); @@ -501,7 +536,7 @@ void LensProfilePanel::onCorrModeChanged(const Gtk::RadioButton* rbChanged) ckbUseCA->set_sensitive(false); mode = M("GENERAL_NONE"); - + } else if (rbChanged == corrLensfunAutoRB) { lcModeChanged = true; useLensfunChanged = true; @@ -514,24 +549,24 @@ void LensProfilePanel::onCorrModeChanged(const Gtk::RadioButton* rbChanged) ckbUseVign->set_sensitive(true); ckbUseCA->set_sensitive(true); - + const bool disabled = disableListener(); if (batchMode) { setLensfunCamera("", ""); setLensfunLens(""); } else if (metadata) { const LFDatabase* const db = LFDatabase::getInstance(); - const LFCamera c = db->findCamera(metadata->getMake(), metadata->getModel()); - const LFLens l = db->findLens(c, metadata->getLens()); + const LFCamera c = db->findCamera(metadata->getMake(), metadata->getModel(), true); + const LFLens l = db->findLens(c, metadata->getLens(), true); setLensfunCamera(c.getMake(), c.getModel()); setLensfunLens(l.getLens()); } if (disabled) { enableListener(); } - + mode = M("TP_LENSPROFILE_CORRECTION_AUTOMATCH"); - + } else if (rbChanged == corrLensfunManualRB) { lcModeChanged = true; useLensfunChanged = true; @@ -545,17 +580,27 @@ void LensProfilePanel::onCorrModeChanged(const Gtk::RadioButton* rbChanged) ckbUseCA->set_sensitive(false); mode = M("TP_LENSPROFILE_CORRECTION_MANUAL"); - + } else if (rbChanged == corrLcpFileRB) { lcModeChanged = true; useLensfunChanged = true; lensfunAutoChanged = true; lcpFileChanged = true; - updateDisabled(true); + updateLCPDisabled(true); mode = M("TP_LENSPROFILE_CORRECTION_LCPFILE"); - + + } else if (rbChanged == corrMetadata) { + lcModeChanged = true; + useLensfunChanged = true; + lensfunAutoChanged = true; + lcpFileChanged = true; + + updateMetadataDisabled(); + + mode = M("TP_LENSPROFILE_CORRECTION_METADATA"); + } else if (rbChanged == corrUnchangedRB) { lcModeChanged = false; useLensfunChanged = false; @@ -680,7 +725,7 @@ void LensProfilePanel::LFDbHelper::fillLensfunLenses() } } -void LensProfilePanel::updateDisabled(bool enable) +void LensProfilePanel::updateLCPDisabled(bool enable) { if (!batchMode) { ckbUseDist->set_sensitive(enable); @@ -689,6 +734,21 @@ void LensProfilePanel::updateDisabled(bool enable) } } +void LensProfilePanel::updateMetadataDisabled() +{ + if (!batchMode) { + if (metadataCorrection) { + ckbUseDist->set_sensitive(metadataCorrection->hasDistortionCorrection()); + ckbUseVign->set_sensitive(metadataCorrection->hasVignettingCorrection()); + ckbUseCA->set_sensitive(metadataCorrection->hasCACorrection()); + } else { + ckbUseDist->set_sensitive(false); + ckbUseVign->set_sensitive(false); + ckbUseCA->set_sensitive(false); + } + } +} + bool LensProfilePanel::setLensfunCamera(const Glib::ustring& make, const Glib::ustring& model) { if (!make.empty() && !model.empty()) { @@ -801,14 +861,14 @@ void LensProfilePanel::updateLensfunWarning() return; } - const LFCamera c = db->findCamera((*itc)[lf->lensfunModelCam.make], (*itc)[lf->lensfunModelCam.model]); + const LFCamera c = db->findCamera((*itc)[lf->lensfunModelCam.make], (*itc)[lf->lensfunModelCam.model], false); const auto itl = lensfunLenses->get_active(); if (!itl) { return; } - const LFLens l = db->findLens(LFCamera(), (*itl)[lf->lensfunModelLens.lens]); + const LFLens l = db->findLens(c, (*itl)[lf->lensfunModelLens.lens], false); const float lenscrop = l.getCropFactor(); const float camcrop = c.getCropFactor(); diff --git a/rtgui/lensprofile.h b/rtgui/lensprofile.h index 42746f41e..cdf7bd6e4 100644 --- a/rtgui/lensprofile.h +++ b/rtgui/lensprofile.h @@ -22,6 +22,7 @@ #include "guiutils.h" #include "toolpanel.h" +#include "../rtengine/lensmetadata.h" class LensProfilePanel final : public ToolParamBlock, @@ -89,7 +90,8 @@ private: void fillLensfunLenses(); }; - void updateDisabled(bool enable); + void updateLCPDisabled(bool enable); + void updateMetadataDisabled(); bool setLensfunCamera(const Glib::ustring& make, const Glib::ustring& model); bool setLensfunLens(const Glib::ustring& lens); @@ -113,12 +115,14 @@ private: bool allowFocusDep; bool isRaw; const rtengine::FramesMetaData* metadata; + std::unique_ptr metadataCorrection; Gtk::Grid* const modesGrid; Gtk::Grid* const distGrid; Gtk::RadioButton* const corrUnchangedRB; Gtk::RadioButton::Group corrGroup; Gtk::RadioButton* const corrOffRB; + Gtk::RadioButton* const corrMetadata; Gtk::RadioButton* const corrLensfunAutoRB; Gtk::RadioButton* const corrLensfunManualRB; Gtk::RadioButton* const corrLcpFileRB; diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 38e84154e..13b68ba6d 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -175,6 +175,28 @@ Locallab::Locallab(): toollist->setLocallabToolListListener(this); panel->pack_start(*toollist, false, false); + // Add all the tools' preview delta E buttons to one group. + for (auto button : { + expcolor.getPreviewDeltaEButton(), + expexpose.getPreviewDeltaEButton(), + expshadhigh.getPreviewDeltaEButton(), + expvibrance.getPreviewDeltaEButton(), + expsoft.getPreviewDeltaEButton(), + expblur.getPreviewDeltaEButton(), + exptonemap.getPreviewDeltaEButton(), + expreti.getPreviewDeltaEButton(), + expsharp.getPreviewDeltaEButton(), + expcontrast.getPreviewDeltaEButton(), + expcbdl.getPreviewDeltaEButton(), + explog.getPreviewDeltaEButton(), + expmask.getPreviewDeltaEButton(), + expcie.getPreviewDeltaEButton(), + }) { + if (button) { + delta_e_preview_button_group.register_button(*button); + } + } + // Add Locallab tools to panel widget ToolVBox* const toolpanel = Gtk::manage(new ToolVBox()); toolpanel->set_name("LocallabToolPanel"); @@ -249,7 +271,7 @@ void Locallab::read(const rtengine::procparams::ProcParams* pp, const ParamsEdit if (pp->locallab.spots.at(i).shape == "ELI") { r.shape = 0; - } else { + } else if (pp->locallab.spots.at(i).shape == "RECT") { r.shape = 1; } @@ -265,8 +287,10 @@ void Locallab::read(const rtengine::procparams::ProcParams* pp, const ParamsEdit r.spotMethod = 1; } else if (pp->locallab.spots.at(i).spotMethod == "full"){ r.spotMethod = 2; + } else if (pp->locallab.spots.at(i).spotMethod == "main"){ + r.spotMethod = 3; } - + r.sensiexclu = pp->locallab.spots.at(i).sensiexclu; r.structexclu = pp->locallab.spots.at(i).structexclu; @@ -420,7 +444,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited if (newSpot->shape == "ELI") { r.shape = 0; - } else { + } else if (newSpot->shape == "RECT"){ r.shape = 1; } @@ -437,6 +461,8 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited r.spotMethod = 1; } else if(newSpot->spotMethod == "full") { r.spotMethod = 2; + } else if(newSpot->spotMethod == "main") { + r.spotMethod = 3; } r.sensiexclu = newSpot->sensiexclu; @@ -746,7 +772,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited if (newSpot->shape == "ELI") { r.shape = 0; - } else { + } else if (newSpot->shape == "RECT"){ r.shape = 1; } @@ -762,8 +788,10 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited r.spotMethod = 1; } else if (newSpot->spotMethod == "full") { r.spotMethod = 2; + } else if (newSpot->spotMethod == "main") { + r.spotMethod = 3; } - + r.sensiexclu = newSpot->sensiexclu; r.structexclu = newSpot->structexclu; @@ -810,7 +838,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited } } - if(r.spotMethod != 2) { + if(r.spotMethod == 0 || r.spotMethod == 1 ) { r.locX = newSpot->loc.at(0); r.locXL = newSpot->loc.at(1); r.locY = newSpot->loc.at(2); @@ -960,6 +988,8 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pp->locallab.spots.at(pp->locallab.selspot).spotMethod = "exc"; } else if (r->spotMethod == 2) { pp->locallab.spots.at(pp->locallab.selspot).spotMethod = "full"; + } else if (r->spotMethod == 3) { + pp->locallab.spots.at(pp->locallab.selspot).spotMethod = "main"; } pp->locallab.spots.at(pp->locallab.selspot).sensiexclu = r->sensiexclu; @@ -1130,19 +1160,252 @@ void Locallab::denChanged(const std::vector &denlc, int selsp } } - - -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) +// New fonctions to change Scope color +void Locallab::scopeChangedcol(int scope, int selspot, bool enab) { - // Update Locallab Log Encoding and Ciecam accordingly - if(autocomput) { - explog.updateAutocompute(blackev, whiteev, sourceg, sourceab, targetg, jz1); + if(enab) { + expcolor.updateguiscopecolor(scope); } - if(autocie) { - expcie.updateAutocompute(blackev, whiteev, sourceg, sourceab, targetg, jz1); + +} +// New fonctions to change Scope Shadows Highlight + +void Locallab::scopeChangedsh(int scope, int selspot, bool enab) +{ + if(enab) { + expshadhigh.updateguiscopesahd(scope); + } + +} + +// New fonctions to change Scope Vibrance + +void Locallab::scopeChangedvib(int scope, int selspot, bool enab) +{ + if(enab) { + expvibrance.updateguiscopevib(scope); + } + +} + +//reinit expsettings +void Locallab::scopeChangedset(int scope, int selspot, bool enab) +{ + if(enab) { + expsettings->updateguiscopeset(30);//30 defaut value..perhaps possible to pass default value ?? + } + +} +/* +//main new fonction global to hide show and activated or not some functions - inverse, scope... +void Locallab::mainChanged(int spottype, int selspot, bool iscolor, bool issh, bool isvib, bool isexpos, bool issoft, bool isblur, bool istom, bool isret, bool issharp, bool iscont, bool iscbdl, bool islog, bool ismas, bool iscie ) +{ + + + if(iscolor) { + expcolor.updateguicolor(spottype); + } + + if(issh) { + expshadhigh.updateguishad(spottype); + } + + if(isvib) { + expvibrance.updateguivib(spottype); + } + + if(isexpos) { + expexpose.updateguiexpos(spottype); + } + + if(issoft) { + expsoft.updateguisoft(spottype); + } + + if(isblur) { + expblur.updateguiblur(spottype); + } + + if(istom) { + exptonemap.updateguitone(spottype); + } + + if(isret) { + expreti.updateguireti(spottype); + } + + if(issharp) { + expsharp.updateguisharp(spottype); + } + + if(iscont) { + expcontrast.updateguicont(spottype); + } + + if(iscbdl) { + expcbdl.updateguicbdl(spottype); + } + + if(islog) { + explog.updateguilog(spottype); + } + + if(ismas) { + expmask.updateguimask(spottype); + } + + if(iscie) { + expcie.updateguicie(spottype); + } + + expsettings->updateguiset(spottype, iscolor, issh, isvib, isexpos, issoft, isblur, istom, isret, issharp, iscont, iscbdl, islog, ismas, iscie); + +} +*/ +void Locallab::sigChanged(const std::vector &ciesig, int selspot) +{ + cie_sig = ciesig; + + if (selspot < (int) cie_sig.size()) { + const double s1 = cie_sig.at(selspot).contsigq; + const double s2 = cie_sig.at(selspot).lightsigq; + + expcie.updatesigloc(s1, s2); + } + +} + +void Locallab::ciebefChanged(const std::vector &ciebef, int selspot) +{ + cie_bef = ciebef; + if (selspot < (int) cie_bef.size()) { + const double blackev = cie_bef.at(selspot).blackevbef; + const double whiteev = cie_bef.at(selspot).whiteevbef; + const double sourceg = cie_bef.at(selspot).sourcegbef; + const double sourceab = cie_bef.at(selspot).sourceabbef; + const double targetg = cie_bef.at(selspot).targetgbef; + const double jz1 = cie_bef.at(selspot).jz1bef; + const bool autocomput = cie_bef.at(selspot).autocomputbef; + const bool autocie = cie_bef.at(selspot).autociebef; + + if(autocomput) { + explog.updateAutocompute(blackev, whiteev, sourceg, sourceab, targetg, jz1); + } + if(autocie) { + expcie.updateAutocompute(blackev, whiteev, sourceg, sourceab, targetg, jz1); + } + } } + +void Locallab::maiChanged(const std::vector &setlc, int selspot) +{ + set_lc = setlc; + if (selspot < (int) set_lc.size()) { + const int spottype = set_lc.at(selspot).mainf; + const bool iscolor = set_lc.at(selspot).iscolo; + const bool issh = set_lc.at(selspot).iss; + const bool isvib = set_lc.at(selspot).isvi; + const bool isexpos = set_lc.at(selspot).isexpo; + const bool issoft = set_lc.at(selspot).issof; + const bool isblur = set_lc.at(selspot).isblu; + const bool istom = set_lc.at(selspot).isto; + const bool isret = set_lc.at(selspot).isre; + const bool issharp = set_lc.at(selspot).isshar; + const bool iscont = set_lc.at(selspot).iscon; + const bool iscbdl = set_lc.at(selspot).iscbd; + const bool islog = set_lc.at(selspot).islo; + const bool ismas = set_lc.at(selspot).isma; + const bool iscie = set_lc.at(selspot).isci; + + if(iscolor) { + expcolor.updateguicolor(spottype); + } + + if(issh) { + expshadhigh.updateguishad(spottype); + } + + if(isvib) { + expvibrance.updateguivib(spottype); + } + + if(isexpos) { + expexpose.updateguiexpos(spottype); + } + + if(issoft) { + expsoft.updateguisoft(spottype); + } + + if(isblur) { + expblur.updateguiblur(spottype); + } + + if(istom) { + exptonemap.updateguitone(spottype); + } + + if(isret) { + expreti.updateguireti(spottype); + } + + if(issharp) { + expsharp.updateguisharp(spottype); + } + + if(iscont) { + expcontrast.updateguicont(spottype); + } + + if(iscbdl) { + expcbdl.updateguicbdl(spottype); + } + + if(islog) { + explog.updateguilog(spottype); + } + + if(ismas) { + expmask.updateguimask(spottype); + } + + if(iscie) { + expcie.updateguicie(spottype); + } + + expsettings->updateguiset(spottype, iscolor, issh, isvib, isexpos, issoft, isblur, istom, isret, issharp, iscont, iscbdl, islog, ismas, iscie); + } +} + +void Locallab::cieChanged(const std::vector &cielc, int selspot) +{ + // Saving transmitted min/max data + cie_lc = cielc; + + //Update Locallab Denoise tool lum chro + if (selspot < (int) cie_lc.size()) { + const double r1 = cie_lc.at(selspot).redxlc; + const double r2 = cie_lc.at(selspot).redylc; + const double g1 = cie_lc.at(selspot).grexlc; + const double g2 = cie_lc.at(selspot).greylc; + const double b1 = cie_lc.at(selspot).bluxlc; + const double b2 = cie_lc.at(selspot).bluylc; + const double w1 = cie_lc.at(selspot).wxlc; + const double w2 = cie_lc.at(selspot).wylc; + const double m1 = cie_lc.at(selspot).meanxlc; + const double m2 = cie_lc.at(selspot).meanylc; + const double me1 = cie_lc.at(selspot).meanxelc; + const double me2 = cie_lc.at(selspot).meanyelc; + const int pri = cie_lc.at(selspot).primlc; + + expcie.updateiPrimloc(r1, r2, g1, g2, b1, b2, w1, w2, m1, m2, me1, me2, pri); + } + +} + + void Locallab::refChanged2(float *huerefp, float *chromarefp, float *lumarefp, float *fabrefp, int selspot) { const double huer = huerefp[selspot]; @@ -1179,6 +1442,30 @@ void Locallab::resetMaskVisibility() // Reset deltaE preview expsettings->resetDeltaEPreview(); + for (auto tool : std::initializer_list{ + &expcolor, + &expexpose, + &expshadhigh, + &expvibrance, + &expsoft, + &expblur, + &exptonemap, + &expreti, + &expsharp, + &expcontrast, + &expcbdl, + &explog, + &expmask, + &expcie, + }) { + auto button = tool->getPreviewDeltaEButton(); + auto connection = tool->getPreviewDeltaEButtonConnection(); + if (button && connection) { + connection->block(); + button->set_active(false); + connection->unblock(); + } + } // Reset mask preview for all Locallab tools for (auto tool : locallabTools) { @@ -1318,6 +1605,12 @@ void Locallab::resetToolMaskView() for (auto tool : locallabTools) { tool->resetMaskView(); } + + // Deactivate any preview delta E toggle button. + auto active_preview_button = delta_e_preview_button_group.getActiveButton(); + if (active_preview_button) { + active_preview_button->set_active(false); + } } void Locallab::resetOtherMaskView(LocallabTool* current) diff --git a/rtgui/locallab.h b/rtgui/locallab.h index e39f213cc..0add444ac 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -25,6 +25,7 @@ #pragma once #include "controlspotpanel.h" +#include "guiutils.h" #include "locallabtools.h" /* ==== LocallabToolListListener ==== */ @@ -118,6 +119,8 @@ private: LocallabMask expmask; Locallabcie expcie; + OptionalRadioButtonGroup delta_e_preview_button_group; + std::vector locallabTools; // Locallab tools mask background management data @@ -126,6 +129,15 @@ private: // Locallab tools mask background management data std::vector denoiselc; + + std::vector cie_bef; + + std::vector cie_lc; + + std::vector set_lc; + + std::vector cie_sig; + // Locallab tools mask background management data std::vector maskBackRef; @@ -147,13 +159,28 @@ public: // Locallab Retinex tool min/man management function void minmaxChanged(const std::vector &minmax, int selspot) override; - + + // new functions for global - normal use +// void mainChanged(int spottype, int selspot, bool iscolor, bool issh, bool isvib, bool isexpos, bool issoft, bool isblur, bool istom, bool isret, bool issharp, bool iscont, bool iscbdl, bool islog, bool ismas, bool iscie)override; + void scopeChangedcol(int scope, int selspot, bool enab)override; + void scopeChangedsh(int scope, int selspot, bool enab)override; + void scopeChangedvib(int scope, int selspot, bool enab)override; + void scopeChangedset(int scope, int selspot, bool enab)override; + + void maiChanged(const std::vector &setlc, 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 CIE tool primaries function + void cieChanged(const std::vector &cielc, int selspot) override; + + // Locallab Log Encoding and Cam16 autocompute function + void ciebefChanged(const std::vector &ciebef, int selspot) override; + + void sigChanged(const std::vector &ciesig, int selspot) override; + // Locallab tools mask background management function // void refChanged(const std::vector &ref, int selspot) override; diff --git a/rtgui/locallabtools.cc b/rtgui/locallabtools.cc index f659d3dfd..7fa0b608c 100644 --- a/rtgui/locallabtools.cc +++ b/rtgui/locallabtools.cc @@ -141,12 +141,12 @@ LocallabTool::LocallabTool(Gtk::Box* content, Glib::ustring toolName, Glib::ustr 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")); + RTImage* const removeImage = Gtk::manage(new RTImage("cancel-small", Gtk::ICON_SIZE_BUTTON)); removeEvBox->add(*removeImage); titleBox->pack_end(*removeEvBox, Gtk::PACK_SHRINK, 1); if (needMode) { @@ -161,7 +161,7 @@ LocallabTool::LocallabTool(Gtk::Box* content, Glib::ustring toolName, Glib::ustr titleBox->pack_end(*separator, Gtk::PACK_SHRINK, 0); if (need100Percent) { - RTImage* const titleImage = Gtk::manage(new RTImage("one-to-one-small.png")); + RTImage* const titleImage = Gtk::manage(new RTImage("one-to-one-small", Gtk::ICON_SIZE_BUTTON)); titleImage->set_tooltip_text(M("TP_GENERAL_11SCALE_TOOLTIP")); titleBox->pack_end(*titleImage, Gtk::PACK_SHRINK, 0); } @@ -300,6 +300,16 @@ void LocallabTool::refChanged(const double huer, const double lumar, const doubl updateMaskBackground(normChromar, normLumar, normHuer, normHuerjz); } +Gtk::ToggleButton *LocallabTool::getPreviewDeltaEButton() const +{ + return nullptr; +} + +sigc::connection *LocallabTool::getPreviewDeltaEButtonConnection() +{ + return nullptr; +} + void LocallabTool::colorForValue(double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller) { float R = 0.f; @@ -367,6 +377,8 @@ void LocallabTool::enableListener() } } + + bool LocallabTool::on_remove_change(GdkEventButton* event) { if (event->button == GDK_BUTTON_PRIMARY) { @@ -445,7 +457,9 @@ LocallabColor::LocallabColor(): 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))), + sensi(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 30))), + previewcol(Gtk::manage(new Gtk::ToggleButton(M("TP_LOCALLAB_PREVIEW")))), + 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.))), @@ -462,6 +476,7 @@ LocallabColor::LocallabColor(): 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.))), + feathercol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FEATVALUE"), 10., 100., 0.1, 25.))), 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())), @@ -490,7 +505,7 @@ LocallabColor::LocallabColor(): 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"))))), + merlucol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MERLUCOL"), 0.0, 100.0, 0.5, 32., Gtk::manage(new RTImage("circle-black-small")), Gtk::manage(new RTImage("circle-white-small"))))), 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())), @@ -526,9 +541,12 @@ LocallabColor::LocallabColor(): 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))) { - + auto m = ProcEventMapper::getInstance(); + //rtengine::ProcEvent EvlocallabenacieMaskall; + Evlocallabfeathercol = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_FEATHERCOL"); + Evlocallabpreviewcol = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_PREVIEWCOL"); set_orientation(Gtk::ORIENTATION_VERTICAL); - + float R, G, B; std::vector six_shape; @@ -593,9 +611,15 @@ LocallabColor::LocallabColor(): strcolh->set_tooltip_text(M("TP_LOCALLAB_GRADSTRHUE_TOOLTIP")); angcol->setAdjusterListener(this); + feathercol->setAdjusterListener(this); setExpandAlignProperties(expcurvcol, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + previewcol->set_active(false); + previewcolConn = previewcol->signal_clicked().connect( + sigc::mem_fun( + *this, &LocallabColor::previewcolChanged)); + qualitycurveMethod->append(M("TP_LOCALLAB_CURVNONE")); qualitycurveMethod->append(M("TP_LOCALLAB_CURVCURR")); qualitycurveMethod->set_active(0); @@ -813,6 +837,9 @@ LocallabColor::LocallabColor(): // Add Color & Light specific widgets to GUI pack_start(*reparcol); + pack_start(*sensi); + pack_start(*previewcol); + pack_start(*invers); ToolParamBlock* const lumBox = Gtk::manage(new ToolParamBlock()); lumBox->pack_start(*lightness); @@ -833,7 +860,7 @@ LocallabColor::LocallabColor(): superBox->pack_start(*gridFrame); superFrame->add(*superBox); pack_start(*superFrame); - // pack_start(*sensi); + // pack_start(*sensi); pack_start(*structcol); pack_start(*blurcolde); pack_start(*softradiuscol); @@ -848,13 +875,14 @@ LocallabColor::LocallabColor(): // 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); + gradcolBox->pack_start(*feathercol); expgradcol->add(*gradcolBox, false); pack_start(*expgradcol, false, false); ToolParamBlock* const curvBox = Gtk::manage(new ToolParamBlock()); @@ -949,6 +977,22 @@ LocallabColor::~LocallabColor() delete mask2CurveEditorGwav; } +void LocallabColor::previewcolChanged() +{ + + if(previewcol->get_active()) { + showmaskcolMethod->set_active(5); + } else { + showmaskcolMethod->set_active(0); + } + + if (isLocActivated) { + if (listener) { + listener->panelChanged(Evlocallabpreviewcol,""); + } + } +} + void LocallabColor::setListener(ToolPanelListener* tpl) { LocallabTool::setListener(tpl); @@ -957,6 +1001,64 @@ void LocallabColor::setListener(ToolPanelListener* tpl) labgridmerg->setListener(tpl); } +//new function Global +void LocallabColor::updateguicolor(int spottype) +{ + { + // Disable all listeners + idle_register.add( + [this, spottype]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update GUI fullimage or main + disableListener(); + + if(spottype == 3) { + invers->hide(); + sensi->hide(); + showmaskcolMethod->set_active(0); + previewcol->hide(); + previewcol->set_active(false); + resetMaskView(); + } else { + invers->show(); + sensi->show(); + if(!invers->get_active()) { + previewcol->show(); + } else { + previewcol->hide(); + } + + } + enableListener(); + + return false; + } + ); + } + +} + +//new function scope +void LocallabColor::updateguiscopecolor(int scope) +{ + { + idle_register.add( + [this, scope]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + disableListener(); + sensi->setValue(scope); + enableListener(); + + return false; + } + ); + } + +} + + bool LocallabColor::isMaskViewActive() { return ((showmaskcolMethod->get_active_row_number() != 0) || (showmaskcolMethodinv->get_active_row_number() != 0)); @@ -980,6 +1082,16 @@ void LocallabColor::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, colorMaskinv = showmaskcolMethodinv->get_active_row_number(); } +Gtk::ToggleButton *LocallabColor::getPreviewDeltaEButton() const +{ + return previewcol; +} + +sigc::connection *LocallabColor::getPreviewDeltaEButtonConnection() +{ + return &previewcolConn; +} + void LocallabColor::updateAdviceTooltips(const bool showTooltips) { if (showTooltips) { @@ -1165,7 +1277,7 @@ void LocallabColor::read(const rtengine::procparams::ProcParams* pp, const Param spot.labgridBLow / LocallabParams::LABGRIDL_CORR_MAX, spot.labgridAHigh / LocallabParams::LABGRIDL_CORR_MAX, spot.labgridBHigh / LocallabParams::LABGRIDL_CORR_MAX, - 0, 0, 0, 0, false); + 0, 0, 0, 0, 0, 0, false); // printf("labgridlow=%f \n", spot.labgridALow); if (spot.gridMethod == "one") { gridMethod->set_active(0); @@ -1183,6 +1295,7 @@ void LocallabColor::read(const rtengine::procparams::ProcParams* pp, const Param strcolab->setValue(spot.strcolab); strcolh->setValue(spot.strcolh); angcol->setValue(spot.angcol); + feathercol->setValue(spot.feathercol); if (spot.qualitycurveMethod == "none") { qualitycurveMethod->set_active(0); @@ -1278,7 +1391,7 @@ void LocallabColor::read(const rtengine::procparams::ProcParams* pp, const Param labgridmerg->setParams(0, 0, spot.labgridAHighmerg / LocallabParams::LABGRIDL_CORR_MAX, spot.labgridBHighmerg / LocallabParams::LABGRIDL_CORR_MAX, - 0, 0, 0, 0, false); + 0, 0, 0, 0, 0, 0, false); merlucol->setValue(spot.merlucol); enaColorMask->set_active(spot.enaColorMask); CCmaskshape->setCurve(spot.CCmaskcurve); @@ -1342,7 +1455,7 @@ void LocallabColor::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pe labgrid->getParams(spot.labgridALow, spot.labgridBLow, spot.labgridAHigh, - spot.labgridBHigh, zerox, zeroy, zerox, zeroy); + spot.labgridBHigh, zerox, zeroy, zerox, zeroy, zerox, zeroy); spot.labgridALow *= LocallabParams::LABGRIDL_CORR_MAX; spot.labgridAHigh *= LocallabParams::LABGRIDL_CORR_MAX; spot.labgridBLow *= LocallabParams::LABGRIDL_CORR_MAX; @@ -1364,6 +1477,7 @@ void LocallabColor::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pe spot.strcolab = strcolab->getValue(); spot.strcolh = strcolh->getValue(); spot.angcol = angcol->getValue(); + spot.feathercol = feathercol->getValue(); spot.recothresc = recothresc->getValue(); spot.lowthresc = lowthresc->getValue(); @@ -1461,7 +1575,7 @@ void LocallabColor::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pe labgridmerg->getParams(spot.labgridALowmerg, spot.labgridBLowmerg, spot.labgridAHighmerg, - spot.labgridBHighmerg, zerox1, zeroy1, zerox1, zeroy1); + spot.labgridBHighmerg, zerox1, zeroy1, zerox1, zeroy1, zerox1, zeroy1); spot.labgridALowmerg *= LocallabParams::LABGRIDL_CORR_MAX; spot.labgridAHighmerg *= LocallabParams::LABGRIDL_CORR_MAX; spot.labgridBLowmerg *= LocallabParams::LABGRIDL_CORR_MAX; @@ -1508,7 +1622,7 @@ void LocallabColor::setDefaults(const rtengine::procparams::ProcParams* defParam 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); + defSpot.labgridBHigh / LocallabParams::LABGRIDL_CORR_MAX, 0, 0, 0, 0, 0, 0); strengthgrid->setDefault((double) defSpot.strengthgrid); sensi->setDefault((double)defSpot.sensi); structcol->setDefault((double)defSpot.structcol); @@ -1518,13 +1632,14 @@ void LocallabColor::setDefaults(const rtengine::procparams::ProcParams* defParam strcolab->setDefault(defSpot.strcolab); strcolh->setDefault(defSpot.strcolh); angcol->setDefault(defSpot.angcol); + feathercol->setDefault(defSpot.feathercol); 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); + defSpot.labgridBHighmerg / LocallabParams::LABGRIDL_CORR_MAX, 0, 0, 0, 0, 0, 0); merlucol->setDefault(defSpot.merlucol); strumaskcol->setDefault(defSpot.strumaskcol); contcol->setDefault(defSpot.contcol); @@ -1541,7 +1656,7 @@ void LocallabColor::setDefaults(const rtengine::procparams::ProcParams* defParam 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 @@ -1550,7 +1665,7 @@ void LocallabColor::setDefaults(const rtengine::procparams::ProcParams* defParam void LocallabColor::adjusterChanged(Adjuster* a, double newval) { if (isLocActivated && exp->getEnabled()) { - if (a == lightness) { + if (a == lightness) { if (listener) { listener->panelChanged(Evlocallablightness, lightness->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); @@ -1595,7 +1710,7 @@ void LocallabColor::adjusterChanged(Adjuster* a, double newval) if (a == sensi) { if (listener) { listener->panelChanged(Evlocallabsensi, - sensi->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + sensi->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); } } @@ -1621,7 +1736,7 @@ void LocallabColor::adjusterChanged(Adjuster* a, double newval) } if (a == recothresc) { - + if (listener) { listener->panelChanged(Evlocallabrecothresc, recothresc->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); @@ -1678,6 +1793,13 @@ void LocallabColor::adjusterChanged(Adjuster* a, double newval) } } + if (a == feathercol) { + if (listener) { + listener->panelChanged(Evlocallabfeathercol, + feathercol->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + if (a == mercol) { if (listener) { listener->panelChanged(Evlocallabmercol, @@ -2002,7 +2124,7 @@ void LocallabColor::convertParamToNormal() labgridmerg->setParams(0, 0, defSpot.labgridAHighmerg / LocallabParams::LABGRIDL_CORR_MAX, defSpot.labgridBHighmerg / LocallabParams::LABGRIDL_CORR_MAX, - 0, 0, 0, 0, false); + 0, 0, 0, 0, 0, 0, false); merlucol->setValue(defSpot.merlucol); strumaskcol->setValue(defSpot.strumaskcol); toolcol->set_active(defSpot.toolcol); @@ -2039,6 +2161,7 @@ void LocallabColor::convertParamToSimple() softradiuscol->setValue(defSpot.softradiuscol); strcol->setValue(defSpot.strcol); angcol->setValue(defSpot.angcol); + feathercol->setValue(defSpot.feathercol); gamc->setValue(defSpot.gamc); if (defSpot.qualitycurveMethod == "none") { @@ -2117,7 +2240,7 @@ void LocallabColor::updateGUIToMode(const modeType new_type) if (enaColorMask->get_active()) { maskusablec->show(); maskunusablec->hide(); - + } else { maskusablec->hide(); maskunusablec->show(); @@ -2154,7 +2277,7 @@ void LocallabColor::updateGUIToMode(const modeType new_type) if (enaColorMask->get_active()) { maskusablec->show(); maskunusablec->hide(); - + } else { maskusablec->hide(); maskunusablec->show(); @@ -2371,7 +2494,7 @@ void LocallabColor::enaColorMaskChanged() maskusablec->hide(); maskunusablec->show(); } - + if (isLocActivated && exp->getEnabled()) { if (listener) { if (enaColorMask->get_active()) { @@ -2571,9 +2694,11 @@ LocallabExposure::LocallabExposure(): fatsatur(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_FATSAT")))), 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"))))), + fatanchor(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FATANCHOR"), 0.1, 100.0, 0.01, 50., Gtk::manage(new RTImage("circle-black-small")), Gtk::manage(new RTImage("circle-white-small"))))), 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))), + previewexe(Gtk::manage(new Gtk::ToggleButton(M("TP_LOCALLAB_PREVIEW")))), + 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")))), @@ -2596,6 +2721,7 @@ LocallabExposure::LocallabExposure(): 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.))), + featherexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FEATVALUE"), 10., 100., 0.1, 25.))), 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")))), @@ -2623,8 +2749,11 @@ LocallabExposure::LocallabExposure(): { set_orientation(Gtk::ORIENTATION_VERTICAL); - + const LocallabParams::LocallabSpot defSpot; + auto m = ProcEventMapper::getInstance(); + Evlocallabpreviewexe = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_PREVIEWEXE"); + Evlocallabfeatherexp = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_FEATHEREXE"); // Parameter Exposure specific widgets expMethod->append(M("TP_LOCALLAB_STD")); @@ -2699,6 +2828,7 @@ LocallabExposure::LocallabExposure(): angexp->setAdjusterListener(this); angexp->set_tooltip_text(M("TP_LOCALLAB_GRADANG_TOOLTIP")); + featherexp->setAdjusterListener(this); softradiusexp->setLogScale(10, 0); softradiusexp->setAdjusterListener(this); @@ -2706,6 +2836,12 @@ LocallabExposure::LocallabExposure(): lowthrese->setAdjusterListener(this); higthrese->setAdjusterListener(this); decaye->setAdjusterListener(this); + + previewexe->set_active(false); + previewexeConn = previewexe->signal_clicked().connect( + sigc::mem_fun( + *this, &LocallabExposure::previewexeChanged)); + setExpandAlignProperties(exprecove, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); normConn = norm->signal_toggled().connect(sigc::mem_fun(*this, &LocallabExposure::normChanged)); fatsaturConn = fatsatur->signal_toggled().connect(sigc::mem_fun(*this, &LocallabExposure::fatsaturChanged)); @@ -2781,6 +2917,7 @@ LocallabExposure::LocallabExposure(): // Add Color & Light specific widgets to GUI pack_start(*sensiex); + pack_start(*previewexe); pack_start(*reparexp); pack_start(*inversex); ToolParamBlock* const pdeBox = Gtk::manage(new ToolParamBlock()); @@ -2835,6 +2972,7 @@ LocallabExposure::LocallabExposure(): ToolParamBlock* const gradBox = Gtk::manage(new ToolParamBlock()); gradBox->pack_start(*strexp); gradBox->pack_start(*angexp); + gradBox->pack_start(*featherexp); expgradexp->add(*gradBox, false); pack_start(*expgradexp); pack_start(*softradiusexp); @@ -2873,6 +3011,60 @@ bool LocallabExposure::isMaskViewActive() return ((showmaskexpMethod->get_active_row_number() != 0) || (showmaskexpMethodinv->get_active_row_number() != 0)); } +//new function Global +void LocallabExposure::updateguiexpos(int spottype) +{ + { + idle_register.add( + [this, spottype]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update GUI fullimage or main + disableListener(); + + if(spottype == 3) { + inversex->hide(); + sensiex->hide(); + previewexe->hide(); + showmaskexpMethod->set_active(0); + previewexe->set_active(false); + + resetMaskView(); + } else { + inversex->show(); + sensiex->show(); + if(!inversex->get_active()) { + previewexe->show(); + } else { + previewexe->hide(); + } + } + enableListener(); + + return false; + } + ); + } + +} + +void LocallabExposure::previewexeChanged() +{ + + if(previewexe->get_active()) { + showmaskexpMethod->set_active(5); + } else { + showmaskexpMethod->set_active(0); + } + + if (isLocActivated) { + if (listener) { + listener->panelChanged(Evlocallabpreviewexe,""); + } + } +} + + void LocallabExposure::resetMaskView() { showmaskexpMethodConn.block(true); @@ -2891,6 +3083,16 @@ void LocallabExposure::getMaskView(int &colorMask, int &colorMaskinv, int &expMa expMaskinv = showmaskexpMethodinv->get_active_row_number(); } +Gtk::ToggleButton *LocallabExposure::getPreviewDeltaEButton() const +{ + return previewexe; +} + +sigc::connection *LocallabExposure::getPreviewDeltaEButtonConnection() +{ + return &previewexeConn; +} + void LocallabExposure::updateAdviceTooltips(const bool showTooltips) { if (showTooltips) { @@ -3089,6 +3291,7 @@ void LocallabExposure::read(const rtengine::procparams::ProcParams* pp, const Pa shapeexpos->setCurve(spot.excurve); strexp->setValue(spot.strexp); angexp->setValue(spot.angexp); + featherexp->setValue(spot.featherexp); softradiusexp->setValue(spot.softradiusexp); norm->set_active(spot.norm); fatsatur->set_active(spot.fatsatur); @@ -3180,6 +3383,7 @@ void LocallabExposure::write(rtengine::procparams::ProcParams* pp, ParamsEdited* spot.excurve = shapeexpos->getCurve(); spot.strexp = strexp->getValue(); spot.angexp = angexp->getValue(); + spot.featherexp = featherexp->getValue(); spot.softradiusexp = softradiusexp->getValue(); spot.inversex = inversex->get_active(); spot.norm = norm->get_active(); @@ -3233,6 +3437,7 @@ void LocallabExposure::setDefaults(const rtengine::procparams::ProcParams* defPa expchroma->setDefault((double)defSpot.expchroma); strexp->setDefault(defSpot.strexp); angexp->setDefault(defSpot.angexp); + featherexp->setDefault(defSpot.featherexp); softradiusexp->setDefault(defSpot.softradiusexp); blendmaskexp->setDefault((double)defSpot.blendmaskexp); radmaskexp->setDefault(defSpot.radmaskexp); @@ -3457,6 +3662,13 @@ void LocallabExposure::adjusterChanged(Adjuster* a, double newval) } } + if (a == featherexp) { + if (listener) { + listener->panelChanged(Evlocallabfeatherexp, + featherexp->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + if (a == softradiusexp) { if (listener) { listener->panelChanged(Evlocallabsoftradiusexp, @@ -3584,7 +3796,7 @@ void LocallabExposure::convertParamToNormal() // Disable all listeners disableListener(); gamex->setValue(defSpot.gamex); - + laplacexp->setValue(defSpot.laplacexp); // Set hidden GUI widgets in Normal mode to default spot values structexp->setValue((double)defSpot.structexp); blurexpde->setValue((double)defSpot.blurexpde); @@ -3607,15 +3819,18 @@ void LocallabExposure::convertParamToSimple() // Disable all listeners disableListener(); + laplacexp->setValue(defSpot.laplacexp); 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); + featherexp->setValue(defSpot.featherexp); softradiusexp->setValue(defSpot.softradiusexp); enaExpMask->set_active(defSpot.enaExpMask); enaExpMaskaft->set_active(defSpot.enaExpMaskaft); + showmaskexpMethod->set_active(0); gamex->setValue(defSpot.gamex); // CCmaskexpshape->setCurve(defSpot.CCmaskexpcurve); // LLmaskexpshape->setCurve(defSpot.CCmaskexpcurve); @@ -3651,7 +3866,7 @@ void LocallabExposure::updateGUIToMode(const modeType new_type) fatlevel->hide(); fatanchor->hide(); gamex->hide(); - + exppde->hide(); break; case Normal: @@ -3667,7 +3882,7 @@ void LocallabExposure::updateGUIToMode(const modeType new_type) if (enaExpMask->get_active()) { maskusablee->show(); maskunusablee->hide(); - + } else { maskusablee->hide(); maskunusablee->show(); @@ -3679,7 +3894,8 @@ void LocallabExposure::updateGUIToMode(const modeType new_type) // Specific Simple mode widgets are shown in Normal mode softradiusexp->hide(); blurexpde->hide(); - + exppde->hide(); + if (!inversex->get_active()) { // Keep widget hidden when invers is toggled expgradexp->show(); softradiusexp->show(); @@ -3718,11 +3934,12 @@ void LocallabExposure::updateGUIToMode(const modeType new_type) if (enaExpMask->get_active()) { maskusablee->show(); maskunusablee->hide(); - + } else { maskusablee->hide(); maskunusablee->show(); } + exppde->show(); expmaskexp->show(); lapmaskexp->show(); @@ -3879,7 +4096,7 @@ void LocallabExposure::enaExpMaskChanged() maskusablee->hide(); maskunusablee->show(); } - + if (isLocActivated && exp->getEnabled()) { if (listener) { if (enaExpMask->get_active()) { @@ -3978,13 +4195,15 @@ void LocallabExposure::updateExposureGUI3() expcomp->setLabel(M("TP_LOCALLAB_EXPCOMP")); gamex->hide(); expfat->show(); - exppde->show(); + exppde->hide(); if (mode == Normal) { // Keep widgets hidden in Simple mode softradiusexp->show(); expgradexp->show(); exprecove->show(); blurexpde->show(); + exppde->hide(); + } if (mode == Expert) { // Keep widgets hidden in Simple mode softradiusexp->show(); @@ -3993,9 +4212,10 @@ void LocallabExposure::updateExposureGUI3() structexp->show(); blurexpde->show(); gamex->show(); + exppde->show(); } - + reparexp->show(); showmaskexpMethodinv->hide(); @@ -4014,16 +4234,16 @@ LocallabShadow::LocallabShadow(): // 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 + multipliersh([]() -> std::array { - std::array res = {}; + 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) { + } else if (i == 5) { ss += Glib::ustring::compose(" (%1)", M("TP_LOCALLAB_LUMAWHITESEST")); } @@ -4040,7 +4260,8 @@ LocallabShadow::LocallabShadow(): 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 + sensihs(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 30))),//reused - unused here, but used for normalize_mean_dt + previewsh(Gtk::manage(new Gtk::ToggleButton(M("TP_LOCALLAB_PREVIEW")))), 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")))), @@ -4055,6 +4276,7 @@ LocallabShadow::LocallabShadow(): 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.))), + featherSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FEATVALUE"), 10., 100., 0.1, 25.))), 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())), @@ -4075,11 +4297,15 @@ LocallabShadow::LocallabShadow(): 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"))))), + fatanchorSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FATANCHOR"), 1., 100., 1., 50., Gtk::manage(new RTImage("circle-black-small")), Gtk::manage(new RTImage("circle-white-small"))))), EvlocallabTePivot(ProcEventMapper::getInstance()->newEvent(AUTOEXP, "HISTORY_MSG_LOCALLAB_TE_PIVOT")) { - set_orientation(Gtk::ORIENTATION_VERTICAL); + auto m = ProcEventMapper::getInstance(); + Evlocallabpreviewsh = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_PREVIEWSH"); + EvlocallabfeatherSH = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_FEATHERSH"); + set_orientation(Gtk::ORIENTATION_VERTICAL); + const LocallabParams::LocallabSpot defSpot; // Parameter Shadow highlight specific widgets @@ -4128,12 +4354,18 @@ LocallabShadow::LocallabShadow(): angSH->setAdjusterListener(this); angSH->set_tooltip_text(M("TP_LOCALLAB_GRADANG_TOOLTIP")); + featherSH->setAdjusterListener(this); 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); + previewsh->set_active(false); + previewshConn = previewsh->signal_clicked().connect( + sigc::mem_fun( + *this, &LocallabShadow::previewshChanged)); + showmaskSHMethod->append(M("TP_LOCALLAB_SHOWMNONE")); showmaskSHMethod->append(M("TP_LOCALLAB_SHOWMODIF")); showmaskSHMethod->append(M("TP_LOCALLAB_SHOWMODIFMASK")); @@ -4196,6 +4428,9 @@ LocallabShadow::LocallabShadow(): // Add Shadow highlight specific widgets to GUI pack_start(*reparsh); + pack_start(*sensihs);// reused / unused here, but used for normalize_mean_dt + pack_start(*previewsh); + pack_start(*inverssh); pack_start(*shMethod); @@ -4210,7 +4445,7 @@ LocallabShadow::LocallabShadow(): pack_start(*shadows); pack_start(*s_tonalwidth); pack_start(*sh_radius); - // pack_start(*sensihs);//unused here, but used for normalize_mean_dt +// pack_start(*sensihs);// reused / 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); @@ -4231,6 +4466,7 @@ LocallabShadow::LocallabShadow(): ToolParamBlock* const gradSHBox = Gtk::manage(new ToolParamBlock()); gradSHBox->pack_start(*strSH); gradSHBox->pack_start(*angSH); + gradSHBox->pack_start(*featherSH); expgradsh->add(*gradSHBox, false); pack_start(*expgradsh); // pack_start(*inverssh); @@ -4278,6 +4514,90 @@ void LocallabShadow::resetMaskView() showmaskSHMethodConninv.block(false); } +Gtk::ToggleButton *LocallabShadow::getPreviewDeltaEButton() const +{ + return previewsh; +} + +sigc::connection *LocallabShadow::getPreviewDeltaEButtonConnection() +{ + return &previewshConn; +} + +void LocallabShadow::previewshChanged() +{ + + if(previewsh->get_active()) { + showmaskSHMethod->set_active(4); + } else { + showmaskSHMethod->set_active(0); + } + + if (isLocActivated) { + if (listener) { + listener->panelChanged(Evlocallabpreviewsh,""); + } + } +} + + +//new function Global +void LocallabShadow::updateguishad(int spottype) +{ + { + idle_register.add( + [this, spottype]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update GUI fullimage or main + disableListener(); + + if(spottype == 3) { + inverssh->hide(); + sensihs->hide(); + showmaskSHMethod->set_active(0); + previewsh->hide(); + previewsh->set_active(false); + resetMaskView(); + } else { + sensihs->show(); + inverssh->show(); + if(!inverssh->get_active()) { + previewsh->show(); + } else { + previewsh->hide(); + } + + } + enableListener(); + + return false; + } + ); + } + +} + +void LocallabShadow::updateguiscopesahd(int scope) +{ + { + idle_register.add( + [this, scope]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + disableListener(); + sensihs->setValue(scope); + + enableListener(); + return 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(); @@ -4327,7 +4647,7 @@ void LocallabShadow::updateAdviceTooltips(const bool showTooltips) 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(""); @@ -4362,7 +4682,7 @@ void LocallabShadow::updateAdviceTooltips(const bool showTooltips) decays->set_tooltip_text(""); lowthress->set_tooltip_text(""); higthress->set_tooltip_text(""); - + } } @@ -4416,7 +4736,7 @@ void LocallabShadow::read(const rtengine::procparams::ProcParams* pp, const Para shMethod->set_active(1); } - for (int i = 0; i < 5; i++) { + for (int i = 0; i < 6; i++) { multipliersh[i]->setValue((double)spot.multsh[i]); } recothress->setValue((double)spot.recothress); @@ -4438,6 +4758,7 @@ void LocallabShadow::read(const rtengine::procparams::ProcParams* pp, const Para sloSH->setValue(spot.sloSH); strSH->setValue(spot.strSH); angSH->setValue(spot.angSH); + featherSH->setValue(spot.featherSH); inverssh->set_active(spot.inverssh); enaSHMask->set_active(spot.enaSHMask); CCmaskSHshape->setCurve(spot.CCmaskSHcurve); @@ -4486,7 +4807,7 @@ void LocallabShadow::write(rtengine::procparams::ProcParams* pp, ParamsEdited* p spot.shMethod = "tone"; } - for (int i = 0; i < 5; i++) { + for (int i = 0; i < 6; i++) { spot.multsh[i] = multipliersh[i]->getIntValue(); } @@ -4504,6 +4825,7 @@ void LocallabShadow::write(rtengine::procparams::ProcParams* pp, ParamsEdited* p spot.sloSH = sloSH->getValue(); spot.strSH = strSH->getValue(); spot.angSH = angSH->getValue(); + spot.featherSH = featherSH->getValue(); spot.inverssh = inverssh->get_active(); spot.enaSHMask = enaSHMask->get_active(); spot.LLmaskSHcurve = LLmaskSHshape->getCurve(); @@ -4535,7 +4857,7 @@ void LocallabShadow::setDefaults(const rtengine::procparams::ProcParams* defPara const LocallabParams::LocallabSpot& defSpot = defParams->locallab.spots.at(index); // Set default values for adjuster widgets - for (int i = 0; i < 5; i++) { + for (int i = 0; i < 6; i++) { multipliersh[i]->setDefault(defSpot.multsh[i]); } @@ -4553,6 +4875,7 @@ void LocallabShadow::setDefaults(const rtengine::procparams::ProcParams* defPara sloSH->setDefault(defSpot.sloSH); strSH->setDefault(defSpot.strSH); angSH->setDefault(defSpot.angSH); + featherSH->setDefault(defSpot.featherSH); blendmaskSH->setDefault((double)defSpot.blendmaskSH); radmaskSH->setDefault(defSpot.radmaskSH); lapmaskSH->setDefault(defSpot.lapmaskSH); @@ -4573,15 +4896,16 @@ void LocallabShadow::setDefaults(const rtengine::procparams::ProcParams* defPara 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 (a == multipliersh[0] || a == multipliersh[1] || a == multipliersh[2] || a == multipliersh[3] || a == multipliersh[4] || a == multipliersh[5]) { if (listener) { listener->panelChanged(EvlocallabEqualizersh, - Glib::ustring::compose("%1, %2, %3, %4, %5", + Glib::ustring::compose("%1, %2, %3, %4, %5, %6", 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()) + ")"); + Glib::ustring::format(std::fixed, std::setprecision(2), multipliersh[4]->getIntValue()), + Glib::ustring::format(std::fixed, std::setprecision(2), multipliersh[5]->getIntValue())) + " (" + escapeHtmlChars(getSpotName()) + ")"); } } @@ -4642,7 +4966,7 @@ void LocallabShadow::adjusterChanged(Adjuster* a, double newval) } if (a == recothress) { - + if (listener) { listener->panelChanged(Evlocallabrecothress, recothress->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); @@ -4713,6 +5037,13 @@ void LocallabShadow::adjusterChanged(Adjuster* a, double newval) } } + if (a == featherSH) { + if (listener) { + listener->panelChanged(EvlocallabfeatherSH, + featherSH->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + if (a == blendmaskSH) { if (listener) { listener->panelChanged(EvlocallabblendmaskSH, @@ -4852,6 +5183,7 @@ void LocallabShadow::convertParamToSimple() sloSH->setValue(defSpot.sloSH); strSH->setValue(defSpot.strSH); angSH->setValue(defSpot.angSH); + featherSH->setValue(defSpot.featherSH); showmaskSHMethod->set_active(0); showmaskSHMethodinv->set_active(0); enaSHMask->set_active(defSpot.enaSHMask); @@ -4862,7 +5194,7 @@ void LocallabShadow::convertParamToSimple() // radmaskSH->setValue(defSpot.radmaskSH); // chromaskSH->setValue(defSpot.chromaskSH); // LmaskSHshape->setCurve(defSpot.LmaskSHcurve); - + recothress->setValue(defSpot.recothress); lowthress->setValue(defSpot.lowthress); higthress->setValue(defSpot.higthresc); @@ -4905,7 +5237,7 @@ void LocallabShadow::updateGUIToMode(const modeType new_type) if (enaSHMask->get_active()) { maskusables->show(); maskunusables->hide(); - + } else { maskusables->hide(); maskunusables->show(); @@ -4936,7 +5268,7 @@ void LocallabShadow::updateGUIToMode(const modeType new_type) if (enaSHMask->get_active()) { maskusables->show(); maskunusables->hide(); - + } else { maskusables->hide(); maskunusables->show(); @@ -5058,7 +5390,7 @@ void LocallabShadow::enaSHMaskChanged() maskusables->hide(); maskunusables->show(); } - + if (isLocActivated && exp->getEnabled()) { if (listener) { if (enaSHMask->get_active()) { @@ -5148,12 +5480,13 @@ LocallabVibrance::LocallabVibrance(): 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"))))), + warm(Gtk::manage(new Adjuster(M("TP_LOCALLAB_WARM"), -100., 100., 1., 0., Gtk::manage(new RTImage("circle-blue-small")), Gtk::manage(new RTImage("circle-orange-small"))))), 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 + sensiv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 30))),//reused - unused here, but used for normalize_mean_dt + previewvib(Gtk::manage(new Gtk::ToggleButton(M("TP_LOCALLAB_PREVIEW")))), 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")))), @@ -5168,6 +5501,7 @@ LocallabVibrance::LocallabVibrance(): 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.))), + feathervib(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FEATVALUE"), 10., 100., 0.1, 25.))), 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")))), @@ -5185,8 +5519,11 @@ LocallabVibrance::LocallabVibrance(): mask2vibCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK2"))), Lmaskvibshape(static_cast(mask2vibCurveEditorG->addCurve(CT_Diagonal, "L(L)"))) { + auto m = ProcEventMapper::getInstance(); + Evlocallabpreviewvib = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_PREVIEWVIB"); + Evlocallabfeathervib = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_FEATHERVIB"); set_orientation(Gtk::ORIENTATION_VERTICAL); - + float R, G, B; const LocallabParams::LocallabSpot defSpot; @@ -5248,6 +5585,12 @@ LocallabVibrance::LocallabVibrance(): angvib->set_tooltip_text(M("TP_LOCALLAB_GRADANG_TOOLTIP")); angvib->setAdjusterListener(this); + feathervib->setAdjusterListener(this); + + previewvib->set_active(false); + previewvibConn = previewvib->signal_clicked().connect( + sigc::mem_fun( + *this, &LocallabVibrance::previewvibChanged)); setExpandAlignProperties(expmaskvib, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); @@ -5300,6 +5643,8 @@ LocallabVibrance::LocallabVibrance(): mask2vibCurveEditorG->curveListComplete(); // Add Vibrance specific widgets to GUI + pack_start(*sensiv, Gtk::PACK_SHRINK, 0);//reused - nused here, but used for normalize_mean_dt + pack_start(*previewvib, Gtk::PACK_SHRINK, 0); pack_start(*saturated, Gtk::PACK_SHRINK, 0); pack_start(*pastels, Gtk::PACK_SHRINK, 0); pack_start(*vibgam, Gtk::PACK_SHRINK, 0); @@ -5310,7 +5655,7 @@ LocallabVibrance::LocallabVibrance(): 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(*sensiv, Gtk::PACK_SHRINK, 0);//reused - nused 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); @@ -5328,6 +5673,7 @@ LocallabVibrance::LocallabVibrance(): gradvibBox->pack_start(*strvibab); gradvibBox->pack_start(*strvibh); gradvibBox->pack_start(*angvib); + gradvibBox->pack_start(*feathervib); expgradvib->add(*gradvibBox, false); pack_start(*expgradvib); ToolParamBlock* const maskvibBox = Gtk::manage(new ToolParamBlock()); @@ -5364,6 +5710,81 @@ void LocallabVibrance::resetMaskView() showmaskvibMethodConn.block(false); } +Gtk::ToggleButton *LocallabVibrance::getPreviewDeltaEButton() const +{ + return previewvib; +} + +sigc::connection *LocallabVibrance::getPreviewDeltaEButtonConnection() +{ + return &previewvibConn; +} + +//new function Global +void LocallabVibrance::updateguivib(int spottype) +{ + { + idle_register.add( + [this, spottype]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update GUI fullimage or main + disableListener(); + + if(spottype == 3) { + sensiv->hide(); + showmaskvibMethod->set_active(0); + previewvib->hide(); + previewvib->set_active(false); + resetMaskView(); + } else { + sensiv->show(); + previewvib->show(); + } + enableListener(); + + return false; + } + ); + } + +} + +void LocallabVibrance::previewvibChanged() +{ + + if(previewvib->get_active()) { + showmaskvibMethod->set_active(4); + } else { + showmaskvibMethod->set_active(0); + } + + if (isLocActivated) { + if (listener) { + listener->panelChanged(Evlocallabpreviewvib,""); + } + } +} + +//new function scope +void LocallabVibrance::updateguiscopevib(int scope) +{ + { + idle_register.add( + [this, scope]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + disableListener(); + sensiv->setValue(scope); + enableListener(); + + return 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(); @@ -5505,6 +5926,7 @@ void LocallabVibrance::read(const rtengine::procparams::ProcParams* pp, const Pa strvibab->setValue(spot.strvibab); strvibh->setValue(spot.strvibh); angvib->setValue(spot.angvib); + feathervib->setValue(spot.feathervib); enavibMask->set_active(spot.enavibMask); CCmaskvibshape->setCurve(spot.CCmaskvibcurve); LLmaskvibshape->setCurve(spot.LLmaskvibcurve); @@ -5559,6 +5981,7 @@ void LocallabVibrance::write(rtengine::procparams::ProcParams* pp, ParamsEdited* spot.strvibab = strvibab->getValue(); spot.strvibh = strvibh->getValue(); spot.angvib = angvib->getValue(); + spot.feathervib = feathervib->getValue(); spot.enavibMask = enavibMask->get_active(); spot.CCmaskvibcurve = CCmaskvibshape->getCurve(); spot.LLmaskvibcurve = LLmaskvibshape->getCurve(); @@ -5597,6 +6020,7 @@ void LocallabVibrance::setDefaults(const rtengine::procparams::ProcParams* defPa strvibab->setDefault(defSpot.strvibab); strvibh->setDefault(defSpot.strvibh); angvib->setDefault(defSpot.angvib); + feathervib->setDefault(defSpot.feathervib); blendmaskvib->setDefault((double)defSpot.blendmaskvib); radmaskvib->setDefault(defSpot.radmaskvib); lapmaskvib->setDefault(defSpot.lapmaskvib); @@ -5656,7 +6080,7 @@ void LocallabVibrance::adjusterChanged(Adjuster* a, double newval) } if (a == recothresv) { - + if (listener) { listener->panelChanged(Evlocallabrecothresv, recothresv->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); @@ -5712,6 +6136,13 @@ void LocallabVibrance::adjusterChanged(Adjuster* a, double newval) } } + if (a == feathervib) { + if (listener) { + listener->panelChanged(Evlocallabfeathervib, + feathervib->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + if (a == blendmaskvib) { if (listener) { listener->panelChanged(Evlocallabblendmaskvi, @@ -5879,7 +6310,7 @@ void LocallabVibrance::convertParamToNormal() // 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); @@ -5910,6 +6341,7 @@ void LocallabVibrance::convertParamToSimple() // Set hidden specific GUI widgets in Simple mode to default spot values strvib->setValue(defSpot.strvib); angvib->setValue(defSpot.angvib); + feathervib->setValue(defSpot.feathervib); showmaskvibMethod->set_active(0); enavibMask->set_active(defSpot.enavibMask); // CCmaskvibshape->setCurve(defSpot.CCmaskvibcurve); @@ -5973,7 +6405,7 @@ void LocallabVibrance::updateGUIToMode(const modeType new_type) if (enavibMask->get_active()) { maskusablev->show(); maskunusablev->hide(); - + } else { maskusablev->hide(); maskunusablev->show(); @@ -6003,7 +6435,7 @@ void LocallabVibrance::updateGUIToMode(const modeType new_type) if (enavibMask->get_active()) { maskusablev->show(); maskunusablev->hide(); - + } else { maskusablev->hide(); maskunusablev->show(); @@ -6100,7 +6532,7 @@ void LocallabVibrance::enavibMaskChanged() maskusablev->hide(); maskunusablev->show(); } - + if (isLocActivated && exp->getEnabled()) { if (listener) { if (enavibMask->get_active()) { @@ -6142,7 +6574,7 @@ LocallabSoft::LocallabSoft(): 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")); @@ -6187,6 +6619,32 @@ void LocallabSoft::resetMaskView() showmasksoftMethodConn.block(false); } +//new function Global +void LocallabSoft::updateguisoft(int spottype) +{ + { + idle_register.add( + [this, spottype]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update GUI fullimage or main + disableListener(); + + if(spottype == 3) { + sensisf->hide(); + } else { + sensisf->show(); + } + enableListener(); + + return 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(); @@ -6575,9 +7033,9 @@ LocallabBlur::LocallabBlur(): 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 + 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"))))), + noiselequal(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISELEQUAL"), -2, 10, 1, 7, Gtk::manage(new RTImage("circle-white-small")), Gtk::manage(new RTImage("circle-black-small"))))), 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))), @@ -6586,7 +7044,7 @@ LocallabBlur::LocallabBlur(): 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"))))), + adjblur(Gtk::manage(new Adjuster(M("TP_LOCALLAB_ADJ"), -100., 100., 1., 0., Gtk::manage(new RTImage("circle-blue-yellow-small")), Gtk::manage(new RTImage("circle-red-green-small"))))), 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.))), @@ -6635,7 +7093,7 @@ LocallabBlur::LocallabBlur(): 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 @@ -6807,7 +7265,7 @@ LocallabBlur::LocallabBlur(): setExpandAlignProperties (neutral, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); - RTImage *resetImg = Gtk::manage (new RTImage ("undo-small.png", "redo-small.png")); + RTImage *resetImg = Gtk::manage (new RTImage ("undo-small", Gtk::ICON_SIZE_BUTTON)); setExpandAlignProperties (resetImg, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); neutral->set_image (*resetImg); neutral->set_tooltip_text (M ("TP_RETINEX_NEUTRAL_TOOLTIP")); @@ -6941,7 +7399,7 @@ LocallabBlur::LocallabBlur(): 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); @@ -6951,14 +7409,14 @@ LocallabBlur::LocallabBlur(): 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 + // 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); @@ -6982,13 +7440,12 @@ LocallabBlur::LocallabBlur(): 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); @@ -7062,6 +7519,39 @@ void LocallabBlur::resetMaskView() showmaskblMethodConn.block(false); } +//new function Global +void LocallabBlur::updateguiblur(int spottype) +{ + { + idle_register.add( + [this, spottype]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update GUI fullimage or main + disableListener(); + + if(spottype == 3) { + sensibn->hide(); + sensiden->hide(); + invbl->hide(); + + } else { + sensibn->show(); + sensiden->show(); + invbl->show(); + + } + enableListener(); + + return 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(); @@ -7141,7 +7631,7 @@ void LocallabBlur::updateAdviceTooltips(const bool showTooltips) 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(""); @@ -7216,7 +7706,7 @@ void LocallabBlur::updateAdviceTooltips(const bool showTooltips) } void LocallabBlur::neutral_pressed () -{ +{ const LocallabParams::LocallabSpot defSpot; lnoiselow->setValue(defSpot.lnoiselow); levelthr->setValue(defSpot.levelthr); @@ -7252,7 +7742,7 @@ void LocallabBlur::neutral_pressed () 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) @@ -7452,7 +7942,7 @@ void LocallabBlur::read(const rtengine::procparams::ProcParams* pp, const Params 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") { @@ -7626,7 +8116,7 @@ void LocallabBlur::write(rtengine::procparams::ProcParams* pp, ParamsEdited* ped 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 @@ -7770,7 +8260,7 @@ void LocallabBlur::adjusterChanged(Adjuster* a, double newval) showmaskblMethodtyp->set_active(2); } } - + if (listener) { listener->panelChanged(Evlocallabrecothres, recothres->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); @@ -7797,7 +8287,7 @@ void LocallabBlur::adjusterChanged(Adjuster* a, double newval) showmaskblMethodtyp->set_active(2); } } - + if (listener) { listener->panelChanged(Evlocallabrecothresd, recothresd->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); @@ -8187,7 +8677,7 @@ void LocallabBlur::convertParamToNormal() lnoiselow->setValue(defSpot.lnoiselow); nlrad->setValue(defSpot.nlrad); noisegam->setValue(defSpot.noisegam); - + // Enable all listeners enableListener(); } @@ -8243,7 +8733,7 @@ void LocallabBlur::convertParamToSimple() nlrad->setValue(defSpot.nlrad); nlgam->setValue(defSpot.nlgam); noisegam->setValue(defSpot.noisegam); - + // Enable all listeners enableListener(); } @@ -8324,7 +8814,7 @@ void LocallabBlur::updateGUIToMode(const modeType new_type) showmaskblMethodtyp->set_active(2); } } - + if (enablMask->get_active()) { maskusable->show(); maskunusable->hide(); @@ -8332,7 +8822,7 @@ void LocallabBlur::updateGUIToMode(const modeType new_type) maskunusable2->hide(); maskusable3->show(); maskunusable3->hide(); - + } else { maskusable->hide(); maskunusable->show(); @@ -8397,7 +8887,7 @@ void LocallabBlur::updateGUIToMode(const modeType new_type) showmaskblMethodtyp->set_active(2); } } - + if (enablMask->get_active()) { maskusable->show(); maskunusable->hide(); @@ -8413,7 +8903,7 @@ void LocallabBlur::updateGUIToMode(const modeType new_type) maskusable3->show(); maskunusable3->hide(); } - + } } @@ -8537,7 +9027,7 @@ void LocallabBlur::invblChanged() } - + if (isLocActivated && exp->getEnabled()) { if (listener) { if (invbl->get_active()) { @@ -8709,7 +9199,7 @@ void LocallabBlur::updateBlurGUI() guidbl->setValue(defSpot.guidbl); } - + const int mode = complexity->get_active_row_number(); if (blMethod->get_active_row_number() == 0) { diff --git a/rtgui/locallabtools.h b/rtgui/locallabtools.h index f98007e84..828615ba3 100644 --- a/rtgui/locallabtools.h +++ b/rtgui/locallabtools.h @@ -55,7 +55,82 @@ protected: Normal = 1, Simple = 2 }; - + rtengine::ProcEvent Evlocallabpreviewcol; + rtengine::ProcEvent Evlocallabpreviewexe; + rtengine::ProcEvent Evlocallabpreviewsh; + rtengine::ProcEvent Evlocallabpreviewvib; + rtengine::ProcEvent Evlocallabpreviewtm; + rtengine::ProcEvent Evlocallabpreviewlc; + rtengine::ProcEvent Evlocallabpreviewlog; + rtengine::ProcEvent Evlocallabpreviewcie; + rtengine::ProcEvent Evlocallabpreviewmas; + rtengine::ProcEvent Evlocallabnormcie; + rtengine::ProcEvent Evlocallabstrumaskcie; + rtengine::ProcEvent EvLocallabtoolcie; + rtengine::ProcEvent EvLocallabfftcieMask; + rtengine::ProcEvent Evlocallabcontcie; + rtengine::ProcEvent Evlocallabblurcie; + rtengine::ProcEvent Evlocallabhighmaskcie; + rtengine::ProcEvent Evlocallabshadmaskcie; + rtengine::ProcEvent Evlocallabsigmoidsenscie; + rtengine::ProcEvent EvlocallabLLmaskcieshapewav; + rtengine::ProcEvent EvlocallabcsThresholdcie; + rtengine::ProcEvent Evlocallabcomprcie; + rtengine::ProcEvent Evlocallabstrcielog; + rtengine::ProcEvent Evlocallabsatcie; + rtengine::ProcEvent Evlocallablogcieq; + rtengine::ProcEvent Evlocallabcomprcieth; + rtengine::ProcEvent EvlocallabHHhmaskcieshape; + rtengine::ProcEvent EvlocallabbwevMethod; + rtengine::ProcEvent Evlocallabgamjcie; + rtengine::ProcEvent Evlocallabslopjcie; + rtengine::ProcEvent Evlocallabmidtcie; + rtengine::ProcEvent Evlocallabslopesmo; + rtengine::ProcEvent Evlocallabslopesmor; + rtengine::ProcEvent Evlocallabslopesmog; + rtengine::ProcEvent Evlocallabslopesmob; + rtengine::ProcEvent Evlocallabsmoothcie; + rtengine::ProcEvent Evlocallabsmoothcieyb; + rtengine::ProcEvent Evlocallabsmoothcielum; + rtengine::ProcEvent Evlocallabsmoothciemet; + rtengine::ProcEvent Evlocallabsigcie; + rtengine::ProcEvent Evlocallabillcie; + rtengine::ProcEvent Evlocallabprimcie; + rtengine::ProcEvent Evlocallabcatcie; + rtengine::ProcEvent Evlocallabwhitescie; + rtengine::ProcEvent Evlocallabblackscie; + rtengine::ProcEvent Evlocallabwhiteslog; + rtengine::ProcEvent Evlocallabblackslog; + rtengine::ProcEvent Evlocallabcomprlog; + rtengine::ProcEvent Evlocallabsatlog; + rtengine::ProcEvent Evlocallabstrelog; + rtengine::ProcEvent Evlocallabredxl; + rtengine::ProcEvent Evlocallabredyl; + rtengine::ProcEvent Evlocallabgrexl; + rtengine::ProcEvent Evlocallabgreyl; + rtengine::ProcEvent Evlocallabbluxl; + rtengine::ProcEvent Evlocallabbluyl; + rtengine::ProcEvent EvlocallabGridciexy; + rtengine::ProcEvent Evlocallabgamutcie; + rtengine::ProcEvent Evlocallabbwcie; + rtengine::ProcEvent Evlocallabexpprecam; + rtengine::ProcEvent Evlocallablightsigqcie; + rtengine::ProcEvent Evlocallabcontsigqcie; + rtengine::ProcEvent Evlocallabrefi; + rtengine::ProcEvent Evlocallabshiftxl; + rtengine::ProcEvent Evlocallabshiftyl; + rtengine::ProcEvent Evlocallabanggradcie; + rtengine::ProcEvent Evlocallabstrgradcie; + rtengine::ProcEvent Evlocallabdetailciejz; + rtengine::ProcEvent EvlocallabenacieMaskall; + rtengine::ProcEvent Evlocallabfeathercol; + rtengine::ProcEvent Evlocallabfeathervib; + rtengine::ProcEvent Evlocallabfeatherexp; + rtengine::ProcEvent Evlocallabfeatherwav; + rtengine::ProcEvent Evlocallabfeatherlog; + rtengine::ProcEvent Evlocallabfeathercie; + rtengine::ProcEvent EvlocallabfeatherSH; + rtengine::ProcEvent Evlocallabfeather_mask; // LocallabTool parameters bool needMode; bool isLocActivated; @@ -128,6 +203,9 @@ public: 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) {}; + virtual Gtk::ToggleButton *getPreviewDeltaEButton() const; + virtual sigc::connection *getPreviewDeltaEButtonConnection(); + // Advice tooltips management function virtual void updateAdviceTooltips(const bool showTooltips) {}; @@ -190,6 +268,8 @@ private: MyComboBoxText* const gridMethod; Adjuster* const strengthgrid; Adjuster* const sensi; + Gtk::ToggleButton* const previewcol; + Adjuster* const structcol; Adjuster* const blurcolde; Adjuster* const softradiuscol; @@ -206,6 +286,7 @@ private: Adjuster* const strcolab; Adjuster* const strcolh; Adjuster* const angcol; + Adjuster* const feathercol; MyExpander* const expcurvcol; Gtk::Label* const labqualcurv; MyComboBoxText* const qualitycurveMethod; @@ -268,18 +349,20 @@ private: FlatCurveEditor* const LLmaskcolshapewav; ThresholdAdjuster* const csThresholdcol; - sigc::connection curvactivConn, gridMethodConn, inversConn, qualitycurveMethodConn, toneMethodConn, specialConn, merMethodConn, mergecolMethodConn, showmaskcolMethodConn, showmaskcolMethodConninv, enaColorMaskConn, toolcolConn, fftColorMaskConn; + sigc::connection curvactivConn, previewcolConn, 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; + Gtk::ToggleButton *getPreviewDeltaEButton() const override; + sigc::connection *getPreviewDeltaEButtonConnection() override; + void updateAdviceTooltips(const bool showTooltips) override; void setDefaultExpanderVisibility() override; @@ -296,6 +379,9 @@ public: 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; + void updateguicolor(int spottype); + void updateguiscopecolor(int scope); + void previewcolChanged(); private: void enabledChanged() override; @@ -304,7 +390,6 @@ private: 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(); @@ -318,7 +403,6 @@ private: void enaColorMaskChanged(); void toolcolChanged(); void fftColorMaskChanged(); - void updateColorGUI1(); void updateColorGUI2(); void updateColorGUI3(); @@ -351,6 +435,8 @@ private: Adjuster* const fatanchor; Adjuster* const gamex; Adjuster* const sensiex; + Gtk::ToggleButton* const previewexe; + Adjuster* const structexp; Adjuster* const blurexpde; MyExpander* const exptoolexp; @@ -374,6 +460,7 @@ private: MyExpander* const expgradexp; Adjuster* const strexp; Adjuster* const angexp; + Adjuster* const featherexp; Adjuster* const softradiusexp; Gtk::CheckButton* const inversex; MyExpander* const expmaskexp; @@ -398,7 +485,7 @@ private: DiagonalCurveEditor* const Lmaskexpshape; rtengine::ProcEvent Evlocallabtmosatur; - sigc::connection expMethodConn, exnoiseMethodConn, inversexConn, normConn, fatsaturConn, showmaskexpMethodConn, showmaskexpMethodConninv, enaExpMaskConn, enaExpMaskaftConn; + sigc::connection expMethodConn, exnoiseMethodConn, previewexeConn, inversexConn, normConn, fatsaturConn, showmaskexpMethodConn, showmaskexpMethodConninv, enaExpMaskConn, enaExpMaskaftConn; public: LocallabExposure(); @@ -408,6 +495,9 @@ public: 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; + Gtk::ToggleButton *getPreviewDeltaEButton() const override; + sigc::connection *getPreviewDeltaEButtonConnection() override; + void updateAdviceTooltips(const bool showTooltips) override; void setDefaultExpanderVisibility() override; @@ -418,6 +508,8 @@ public: 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 updateguiexpos(int spottype); + void previewexeChanged(); private: void enabledChanged() override; @@ -452,7 +544,7 @@ private: // Shadow highlight specific widgets MyComboBoxText* const shMethod; Adjuster* const reparsh; - const std::array multipliersh; + const std::array multipliersh; Adjuster* const detailSH; Adjuster* const tePivot; Adjuster* const highlights; @@ -461,6 +553,8 @@ private: Adjuster* const s_tonalwidth; Adjuster* const sh_radius; Adjuster* const sensihs; + Gtk::ToggleButton* const previewsh; + Adjuster* const blurSHde; MyExpander* const exprecovs; Gtk::Label* const maskusables; @@ -475,6 +569,7 @@ private: MyExpander* const expgradsh; Adjuster* const strSH; Adjuster* const angSH; + Adjuster* const featherSH; Gtk::CheckButton* const inverssh; MyExpander* const expmasksh; MyComboBoxText* const showmaskSHMethod; @@ -498,7 +593,7 @@ private: rtengine::ProcEvent EvlocallabTePivot; - sigc::connection shMethodConn, inversshConn, showmaskSHMethodConn, showmaskSHMethodConninv, enaSHMaskConn; + sigc::connection shMethodConn, previewshConn, inversshConn, showmaskSHMethodConn, showmaskSHMethodConninv, enaSHMaskConn; public: LocallabShadow(); @@ -508,8 +603,13 @@ public: 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; + Gtk::ToggleButton *getPreviewDeltaEButton() const override; + sigc::connection *getPreviewDeltaEButtonConnection() override; + void updateAdviceTooltips(const bool showTooltips) override; + void updateguishad(int spottype); + void updateguiscopesahd(int scope); + void setDefaultExpanderVisibility() override; void disableListener() override; void enableListener() override; @@ -518,6 +618,7 @@ public: 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 previewshChanged(); private: void enabledChanged() override; @@ -555,6 +656,8 @@ private: Gtk::CheckButton* const avoidColorShift; Gtk::CheckButton* const pastSatTog; Adjuster* const sensiv; + Gtk::ToggleButton* const previewvib; + CurveEditorGroup* const curveEditorGG; DiagonalCurveEditor* const skinTonesCurve; MyExpander* const exprecovv; @@ -569,6 +672,7 @@ private: Adjuster* const strvibab; Adjuster* const strvibh; Adjuster* const angvib; + Adjuster* const feathervib; MyExpander* const expmaskvib; MyComboBoxText* const showmaskvibMethod; Gtk::CheckButton* const enavibMask; @@ -585,7 +689,7 @@ private: CurveEditorGroup* const mask2vibCurveEditorG; DiagonalCurveEditor* const Lmaskvibshape; - sigc::connection pskinsConn, ashiftConn, pastsattogConn, showmaskvibMethodConn, enavibMaskConn; + sigc::connection pskinsConn, previewvibConn, ashiftConn, pastsattogConn, showmaskvibMethodConn, enavibMaskConn; public: LocallabVibrance(); @@ -595,7 +699,12 @@ public: 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; + Gtk::ToggleButton *getPreviewDeltaEButton() const override; + sigc::connection *getPreviewDeltaEButtonConnection() override; + void updateAdviceTooltips(const bool showTooltips) override; + void updateguivib(int spottype); + void updateguiscopevib(int scope); void setDefaultExpanderVisibility() override; void disableListener() override; @@ -612,6 +721,7 @@ public: 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; + void previewvibChanged(); private: void enabledChanged() override; @@ -654,6 +764,7 @@ public: 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 updateguisoft(int spottype); void disableListener() override; void enableListener() override; @@ -707,6 +818,7 @@ private: Adjuster* const lowthres; Adjuster* const higthres; Adjuster* const sensibn; + MyComboBoxText* const blurMethod; Gtk::CheckButton* const invbl; MyComboBoxText* const chroMethod; @@ -769,6 +881,7 @@ private: Adjuster* const nlgam; Adjuster* const bilateral; Adjuster* const sensiden; + Adjuster* const reparden; Gtk::Button* neutral; MyExpander* const expmaskbl; @@ -805,13 +918,13 @@ public: ~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 updateguiblur(int spottype); void setDefaultExpanderVisibility() override; void disableListener() override; @@ -873,6 +986,8 @@ private: Adjuster* const rewei; Adjuster* const softradiustm; Adjuster* const sensitm; + Gtk::ToggleButton* const previewtm; + MyExpander* const exprecovt; Gtk::Label* const maskusablet; Gtk::Label* const maskunusablet; @@ -897,7 +1012,7 @@ private: CurveEditorGroup* const mask2tmCurveEditorG; DiagonalCurveEditor* const Lmasktmshape; - sigc::connection equiltmConn, showmasktmMethodConn, enatmMaskConn, enatmMaskaftConn; + sigc::connection equiltmConn, previewtmConn, showmasktmMethodConn, enatmMaskConn, enatmMaskaftConn; public: LocallabTone(); @@ -907,8 +1022,12 @@ public: 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; + Gtk::ToggleButton *getPreviewDeltaEButton() const override; + sigc::connection *getPreviewDeltaEButtonConnection() override; + void updateAdviceTooltips(const bool showTooltips) override; + void updateguitone(int spottype); + void previewtmChanged(); void setDefaultExpanderVisibility() override; void disableListener() override; void enableListener() override; @@ -943,6 +1062,7 @@ private: Adjuster* const dehaz; Adjuster* const depth; Adjuster* const dehazeSaturation; + Adjuster* const dehazeblack; Gtk::Frame* const retiFrame; Adjuster* const str; Gtk::CheckButton* const loglin; @@ -994,6 +1114,8 @@ private: DiagonalCurveEditor* const Lmaskretishape; Gtk::CheckButton* const inversret; + rtengine::ProcEvent Evlocallabdehazeblack; + sigc::connection loglinConn, retinexMethodConn, fftwretiConn, equilretConn, showmaskretiMethodConn, enaretiMaskConn, enaretiMasktmapConn, inversretConn; public: @@ -1001,6 +1123,7 @@ public: ~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); + void updateguireti(int spottype); bool isMaskViewActive() override; void resetMaskView() override; @@ -1067,6 +1190,7 @@ public: 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 updateguisharp(int spottype); void disableListener() override; void enableListener() override; @@ -1115,6 +1239,8 @@ private: Adjuster* const residgam; Adjuster* const residslop; Adjuster* const sensilc; + Gtk::ToggleButton* const previewlc; + Adjuster* const reparw; Gtk::Frame* const clariFrame; Adjuster* const clarilres; @@ -1126,6 +1252,7 @@ private: Adjuster* const sigmalc2; Adjuster* const strwav; Adjuster* const angwav; + Adjuster* const featherwav; Gtk::CheckButton* const wavedg; Adjuster* const strengthw; Adjuster* const sigmaed; @@ -1190,7 +1317,7 @@ private: CurveEditorGroup* const mask2lcCurveEditorG; DiagonalCurveEditor* const Lmasklcshape; - sigc::connection localcontMethodConn, origlcConn, wavgradlConn, wavedgConn, localedgMethodConn, waveshowConn, localneiMethodConn, wavblurConn, blurlcConn, wavcontConn, wavcompreConn, wavcompConn, fftwlcConn, showmasklcMethodConn, enalcMaskConn; + sigc::connection localcontMethodConn, previewlcConn, origlcConn, wavgradlConn, wavedgConn, localedgMethodConn, waveshowConn, localneiMethodConn, wavblurConn, blurlcConn, wavcontConn, wavcompreConn, wavcompConn, fftwlcConn, showmasklcMethodConn, enalcMaskConn; public: LocallabContrast(); @@ -1200,8 +1327,11 @@ public: 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; + Gtk::ToggleButton *getPreviewDeltaEButton() const override; + sigc::connection *getPreviewDeltaEButtonConnection() override; + void updateAdviceTooltips(const bool showTooltips) override; + void updateguicont(int spottype); void setDefaultExpanderVisibility() override; void disableListener() override; void enableListener() override; @@ -1216,6 +1346,7 @@ public: 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; + void previewlcChanged(); private: void enabledChanged() override; @@ -1300,6 +1431,7 @@ public: 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 updateguicbdl(int spottype); void setDefaultExpanderVisibility() override; void disableListener() override; @@ -1336,8 +1468,15 @@ private: Gtk::CheckButton* const ciecam; Gtk::ToggleButton* const autocompute; Gtk::Frame* const logPFrame; + Gtk::Frame* const logPFrame2; Adjuster* const blackEv; Adjuster* const whiteEv; + Adjuster* const whiteslog; + Adjuster* const blackslog; + Adjuster* const comprlog; + Adjuster* const strelog; + Gtk::CheckButton* const satlog; + Gtk::CheckButton* const fullimage; Gtk::Frame* const logFrame; Gtk::CheckButton* const Autogray; @@ -1375,9 +1514,12 @@ private: Adjuster* const decayl; Adjuster* const sensilog; + Gtk::ToggleButton* const previewlog; + Gtk::Frame* const gradlogFrame; Adjuster* const strlog; Adjuster* const anglog; + Adjuster* const featherlog; MyExpander* const expmaskL; MyComboBoxText* const showmaskLMethod; Gtk::CheckButton* const enaLMask; @@ -1392,8 +1534,8 @@ private: DiagonalCurveEditor* const LmaskshapeL; sigc::connection autoconn, ciecamconn, fullimageConn, AutograyConn; - sigc::connection surroundconn, sursourconn; - sigc::connection showmaskLMethodConn, enaLMaskConn; + sigc::connection surroundconn, sursourconn, satlogconn; + sigc::connection showmaskLMethodConn, enaLMaskConn, previewlogConn; public: LocallabLog(); ~LocallabLog(); @@ -1401,11 +1543,17 @@ public: 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 updateguilog(int spottype); + void previewlogChanged(); + + Gtk::ToggleButton *getPreviewDeltaEButton() const override; + sigc::connection *getPreviewDeltaEButtonConnection() override; void updateAdviceTooltips(const bool showTooltips) override; void surroundChanged(); void sursourChanged(); void setDefaultExpanderVisibility() override; + void satlogChanged(); void disableListener() override; void enableListener() override; @@ -1445,6 +1593,8 @@ class LocallabMask: { private: Adjuster* const sensimask; + Gtk::ToggleButton* const previewmas; + Adjuster* const blendmask; Adjuster* const blendmaskab; Adjuster* const softradiusmask; @@ -1477,9 +1627,10 @@ private: ThresholdAdjuster* const csThresholdmask; Gtk::Frame* const gradFramemask; Adjuster* const str_mask; + Adjuster* const feather_mask; Adjuster* const ang_mask; - sigc::connection showmask_MethodConn, enamaskConn, toolmaskConn, fftmaskConn; + sigc::connection showmask_MethodConn, previewmasConn, enamaskConn, toolmaskConn, fftmaskConn; public: LocallabMask(); @@ -1489,7 +1640,12 @@ public: 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; + Gtk::ToggleButton *getPreviewDeltaEButton() const override; + sigc::connection *getPreviewDeltaEButtonConnection() override; + void updateAdviceTooltips(const bool showTooltips) override; + void updateguimask(int spottype); + void previewmasChanged(); void disableListener() override; void enableListener() override; @@ -1532,6 +1688,8 @@ class Locallabcie: { private: Adjuster* const sensicie; + Gtk::ToggleButton* const previewcie; + Adjuster* const reparcie; Gtk::CheckButton* const jabcie; MyComboBoxText* const modecam; @@ -1540,6 +1698,8 @@ private: Gtk::Box* const modeHBoxcam; Gtk::Box* const modeHBoxcie; Gtk::Frame* const cieFrame; + MyExpander* const expcamscene; + Gtk::CheckButton* const Autograycie; Adjuster* const sourceGraycie; Adjuster* const sourceabscie; @@ -1583,10 +1743,13 @@ private: Adjuster* const clarisoftjz; MyExpander* const expcam16; + MyExpander* const expcamviewing; Adjuster* const lightqcie; Adjuster* const contlcie; Adjuster* const contqcie; + Adjuster* const lightsigqcie; + Adjuster* const contsigqcie; Adjuster* const contthrescie; Gtk::Frame* const logjzFrame; Gtk::CheckButton* const logjz; @@ -1595,15 +1758,78 @@ private: Adjuster* const targetjz; Gtk::Frame* const bevwevFrame; Gtk::CheckButton* const forcebw; - + ToolParamBlock* const sigBox; Gtk::Frame* const sigmoidFrame; + Gtk::Frame* const sigmoidnormFrame; Gtk::CheckButton* const sigq; Adjuster* const sigmoidldacie; Adjuster* const sigmoidthcie; + Adjuster* const sigmoidsenscie; Adjuster* const sigmoidblcie; - Gtk::CheckButton* const sigmoidqjcie; + Gtk::Box* autocomprHBox; + Gtk::ToggleButton* const comprcieauto; + Gtk::CheckButton* const normcie; + Gtk::Box* const modeHBoxbwev; + MyComboBoxText* const bwevMethod; + Gtk::Frame* const logcieFrame; Gtk::CheckButton* const logcie; + ToolParamBlock* const comprBox; + Adjuster* const comprcie; + + Adjuster* const strcielog; + Gtk::CheckButton* const satcie; + Gtk::CheckButton* const logcieq; + Adjuster* const comprcieth; + MyExpander* const expprecam; + Adjuster* const gamjcie; + Adjuster* const slopjcie; + Adjuster* const midtcie; + Gtk::CheckButton* const smoothcie; + Gtk::CheckButton* const smoothcieyb; + Gtk::CheckButton* const smoothcielum; + ToolParamBlock* const ciesmoothBox; + Gtk::Box* smoothBox; + MyComboBoxText* const smoothciemet; + Adjuster* const slopesmo; + Adjuster* const slopesmor; + Adjuster* const slopesmog; + Adjuster* const slopesmob; + + Adjuster* const whitescie; + Adjuster* const blackscie; + Gtk::Box* willBox; + MyComboBoxText* const illMethod; + Gtk::Box* wprimBox; + MyComboBoxText* const primMethod; + Gtk::Grid* primCoordGridl; + Gtk::Frame* trcFrame; + Gtk::Frame* smoothFrame; + Gtk::Frame* primillFrame; + ToolParamBlock* const redBox; + Adjuster* const redxl; + Adjuster* const redyl; + Adjuster* const grexl; + Adjuster* const greyl; + Adjuster* const bluxl; + Adjuster* const bluyl; + Adjuster* const refi; + + Gtk::Frame* const gridFramecie; + LabGrid* const labgridcie; + Gtk::Frame* const colorFramecie; + + Gtk::Box* catBox; + MyComboBoxText* const catMethod; + Gtk::Box* gamutcieBox; + Gtk::CheckButton* const gamutcie; + Adjuster* const shiftxl; + Adjuster* const shiftyl; + Gtk::Box* bwcieBox; + Gtk::CheckButton* const bwcie; + Gtk::Frame* const sigmoidjzFrame; + Gtk::Frame* const sigmoid2Frame; + Gtk::CheckButton* const sigcie; Gtk::CheckButton* const sigjz; Adjuster* const sigmoidldajzcie; Adjuster* const sigmoidthjzcie; @@ -1642,26 +1868,21 @@ private: 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 detailciejz; Adjuster* const catadcie; MyComboBoxText* const surroundcie; Gtk::Box* const surrHBoxcie; + MyExpander* const expgradcie; + Adjuster* const strgradcie; + Adjuster* const anggradcie; + Adjuster* const feathercie; + MyExpander* const exprecovcie; Gtk::Label* const maskusablecie; Gtk::Label* const maskunusablecie; @@ -1673,32 +1894,58 @@ private: MyExpander* const expmaskcie; MyComboBoxText* const showmaskcieMethod; Gtk::CheckButton* const enacieMask; + Gtk::CheckButton* const enacieMaskall; CurveEditorGroup* const maskcieCurveEditorG; FlatCurveEditor* const CCmaskcieshape; FlatCurveEditor* const LLmaskcieshape; FlatCurveEditor* const HHmaskcieshape; + Gtk::Frame* const struFramecie; + Adjuster* const strumaskcie; + Gtk::CheckButton* const toolcie; + Gtk::Frame* const blurFramecie; + Gtk::CheckButton* const fftcieMask; + Adjuster* const contcie; + Adjuster* const blurcie; + Adjuster* const blendmaskcie; Adjuster* const radmaskcie; Adjuster* const lapmaskcie; Adjuster* const chromaskcie; Adjuster* const gammaskcie; Adjuster* const slomaskcie; - + Adjuster* const highmaskcie; + Adjuster* const shadmaskcie; + CurveEditorGroup* const maskcieHCurveEditorG; + FlatCurveEditor* const HHhmaskcieshape; + 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; + Gtk::Frame* const wavFramecie; + CurveEditorGroup* const mask2cieCurveEditorGwav; + FlatCurveEditor* const LLmaskcieshapewav; + Gtk::Box* const quaHcieBox; + ThresholdAdjuster* const csThresholdcie; + int nextcomprciecount = 0; + + sigc::connection AutograycieConn, primMethodconn, illMethodconn, smoothciemetconn, catMethodconn, forcejzConn, forcebwConn, qtojConn, showmaskcieMethodConn, enacieMaskConn, enacieMaskallConn, jabcieConn, sursourcieconn, surroundcieconn, modecieconn, modecamconn, comprcieautoconn, normcieconn, logcieconn, satcieconn, logcieqconn,smoothcieconn, smoothcieybconn,smoothcielumconn, logjzconn, sigjzconn, sigqconn, chjzcieconn, toneMethodcieConn, toneMethodcieConn2, toolcieConn, bwevMethodConn, fftcieMaskConn, gamutcieconn, bwcieconn, expprecamconn, sigcieconn; + sigc::connection previewcieConn, sigmoidqjcieconn; public: Locallabcie(); ~Locallabcie(); - + + 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; + Gtk::ToggleButton *getPreviewDeltaEButton() const override; + sigc::connection *getPreviewDeltaEButtonConnection() override; + void updateAdviceTooltips(const bool showTooltips) override; void setDefaultExpanderVisibility() override; - + void updateguicie(int spottype); + void previewcieChanged(); void disableListener() override; void enableListener() override; void read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; @@ -1718,7 +1965,11 @@ public: void curveChanged(CurveEditor* ce) override; void toneMethodcieChanged(); void toneMethodcie2Changed(); + void bwevMethodChanged(); void updateAutocompute(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg, const float jz1); + void updatePrimloc(const float redx, const float redy, const float grex, const float grey, const float blux, const float bluy); + void updateiPrimloc(const float r_x, const float r_y, const float g_x, const float g_y, const float b_x, const float b_y, const float w_x, const float w_y, const float m_x, const float m_y, const float me_x, const float me_y, const int pri_); + void updatesigloc(const float cont_sig, const float light_sig); private: void enabledChanged() override; @@ -1731,8 +1982,21 @@ private: void forcebwChanged(); void qtojChanged(); void jabcieChanged(); - void sigmoidqjcieChanged(); + void comprcieautoChanged(); + void normcieChanged(); + void gamutcieChanged(); + void bwcieChanged(); + void illMethodChanged(); + void smoothciemetChanged(); + void primMethodChanged(); + void catMethodChanged(); void logcieChanged(); + void satcieChanged(); + void logcieqChanged(); + void smoothcieChanged(); + void smoothcieybChanged(); + void smoothcielumChanged(); + void sigcieChanged(); void logjzChanged(); void sigjzChanged(); void sigqChanged(); @@ -1741,6 +2005,23 @@ private: void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) override; void showmaskcieMethodChanged(); void enacieMaskChanged(); + void enacieMaskallChanged(); + void enacieMaskallChanged2(); + void guijzczhz(); + void toolcieChanged(); + void fftcieMaskChanged(); + void expprecamChanged(); + + float nextrx; + float nextry; + float nextbx; + float nextby; + float nextgx; + float nextgy; + float nextwx; + float nextwy; + float nextmx; + float nextmy; }; diff --git a/rtgui/locallabtools2.cc b/rtgui/locallabtools2.cc index a2c18ee08..b13148cd1 100644 --- a/rtgui/locallabtools2.cc +++ b/rtgui/locallabtools2.cc @@ -25,6 +25,8 @@ #include "locallab.h" #include "rtimage.h" #include "../rtengine/color.h" +#include "eventmapper.h" +#include "../rtengine/utils.h" #define MINNEIGH 0.1 #define MAXNEIGH 1500 @@ -128,8 +130,9 @@ LocallabTone::LocallabTone(): 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 + 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))), + previewtm(Gtk::manage(new Gtk::ToggleButton(M("TP_LOCALLAB_PREVIEW")))), 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")))), @@ -141,7 +144,7 @@ LocallabTone::LocallabTone(): 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, 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))), @@ -155,8 +158,11 @@ LocallabTone::LocallabTone(): mask2tmCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK2"))), Lmasktmshape(static_cast(mask2tmCurveEditorG->addCurve(CT_Diagonal, "L(L)"))) { - set_orientation(Gtk::ORIENTATION_VERTICAL); + auto m = ProcEventMapper::getInstance(); + Evlocallabpreviewtm = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_PREVIEWTM"); + set_orientation(Gtk::ORIENTATION_VERTICAL); + const LocallabParams::LocallabSpot defSpot; // Parameter Tone Mapping specific widgets @@ -189,6 +195,11 @@ LocallabTone::LocallabTone(): decayt->setAdjusterListener(this); setExpandAlignProperties(exprecovt, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + previewtm->set_active(false); + previewtmConn = previewtm->signal_clicked().connect( + sigc::mem_fun( + *this, &LocallabTone::previewtmChanged)); + setExpandAlignProperties(expmasktm, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); showmasktmMethod->append(M("TP_LOCALLAB_SHOWMNONE")); @@ -244,6 +255,7 @@ LocallabTone::LocallabTone(): // Add Tone Mapping specific widgets to GUI // pack_start(*amount); // To use if we change transit_shapedetect parameters pack_start(*sensitm); + pack_start(*previewtm); pack_start(*repartm); pack_start(*separatortm); pack_start(*stren); @@ -253,7 +265,7 @@ LocallabTone::LocallabTone(): pack_start(*estop); pack_start(*scaltm); pack_start(*rewei); - // pack_start(*softradiustm); //unused here, but used for normalize_mean_dt + // 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); @@ -262,10 +274,10 @@ LocallabTone::LocallabTone(): tmBox3->pack_start(*lowthrest); tmBox3->pack_start(*higthrest); tmBox3->pack_start(*decayt); - // colBox3->pack_start(*invmaskc); + // 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); @@ -305,6 +317,16 @@ void LocallabTone::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, tmMask = showmasktmMethod->get_active_row_number(); } +Gtk::ToggleButton *LocallabTone::getPreviewDeltaEButton() const +{ + return previewtm; +} + +sigc::connection *LocallabTone::getPreviewDeltaEButtonConnection() +{ + return &previewtmConn; +} + void LocallabTone::updateAdviceTooltips(const bool showTooltips) { if (showTooltips) { @@ -393,6 +415,58 @@ void LocallabTone::enableListener() enatmMaskaftConn.block(false); } +//new function Global +void LocallabTone::updateguitone(int spottype) +{ + { + idle_register.add( + [this, spottype]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update GUI fullimage or main + disableListener(); + + if(spottype == 3) { + sensitm->hide(); + // showmasktmMethodConn.block(true); + showmasktmMethod->set_active(0); + // showmasktmMethodConn.block(false); + previewtm->hide(); + // previewtmConn.block(true); + previewtm->set_active(false); + // previewtmConn.block(false); + resetMaskView(); + } else { + sensitm->show(); + previewtm->show(); + } + enableListener(); + + return false; + } + ); + } + +} + +void LocallabTone::previewtmChanged() +{ + // showmasktmMethodConn.block(true); + + if(previewtm->get_active()) { + showmasktmMethod->set_active(4); + } else { + showmasktmMethod->set_active(0); + } + // showmasktmMethodConn.block(false); + + if (isLocActivated) { + if (listener) { + listener->panelChanged(Evlocallabpreviewtm,""); + } + } +} + void LocallabTone::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) { // Disable all listeners @@ -568,6 +642,7 @@ void LocallabTone::adjusterChanged(Adjuster* a, double newval) } else if (a == decayt) { listener->panelChanged(Evlocallabdecayt, decayt->getTextValue() + spName); } + } } @@ -670,10 +745,11 @@ void LocallabTone::updateGUIToMode(const modeType new_type) expmasktm->show(); exprecovt->show(); decayt->hide(); + if (enatmMask->get_active()) { maskusablet->show(); maskunusablet->hide(); - + } else { maskusablet->hide(); maskunusablet->show(); @@ -692,10 +768,11 @@ void LocallabTone::updateGUIToMode(const modeType new_type) slomasktm->show(); exprecovt->show(); decayt->show(); + if (enatmMask->get_active()) { maskusablet->show(); maskunusablet->hide(); - + } else { maskusablet->hide(); maskunusablet->show(); @@ -717,7 +794,7 @@ void LocallabTone::updateMaskBackground(const double normChromar, const double n return false; } - ); + ); } void LocallabTone::equiltmChanged() @@ -742,7 +819,7 @@ void LocallabTone::showmasktmMethodChanged() locToolListener->resetOtherMaskView(this); } - if(exp->getEnabled()) { + if (exp->getEnabled()) { if (listener) { listener->panelChanged(EvlocallabshowmaskMethod, ""); } @@ -758,7 +835,7 @@ void LocallabTone::enatmMaskChanged() maskusablet->hide(); maskunusablet->show(); } - + if (isLocActivated && exp->getEnabled()) { if (listener) { if (enatmMask->get_active()) { @@ -796,6 +873,7 @@ LocallabRetinex::LocallabRetinex(): 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))), + dehazeblack(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DEHAZE_BLACK"), -65., 100., 1., 0.))), 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")))), @@ -833,7 +911,7 @@ LocallabRetinex::LocallabRetinex(): 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, 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))), @@ -848,8 +926,12 @@ LocallabRetinex::LocallabRetinex(): Lmaskretishape(static_cast(mask2retiCurveEditorG->addCurve(CT_Diagonal, "L(L)"))), inversret(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVERS")))) { + + auto m = ProcEventMapper::getInstance(); + Evlocallabdehazeblack = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_DEHAZE_BLACK"); + set_orientation(Gtk::ORIENTATION_VERTICAL); - + const LocallabParams::LocallabSpot defSpot; // Parameter Retinex specific widgets @@ -857,6 +939,7 @@ LocallabRetinex::LocallabRetinex(): dehazeSaturation->setAdjusterListener(this); depth->setAdjusterListener(this); + dehazeblack->setAdjusterListener(this); retiFrame->set_label_align(0.025, 0.5); @@ -934,7 +1017,7 @@ LocallabRetinex::LocallabRetinex(): 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->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)); @@ -991,6 +1074,7 @@ LocallabRetinex::LocallabRetinex(): dehaBox->pack_start(*dehaz); dehaBox->pack_start(*depth); dehaBox->pack_start(*dehazeSaturation); + dehaBox->pack_start(*dehazeblack); dehaFrame->add(*dehaBox); auxBox->add(*dehaFrame); ToolParamBlock* const deharetiBox = Gtk::manage(new ToolParamBlock()); @@ -998,9 +1082,9 @@ LocallabRetinex::LocallabRetinex(): deharetiBox->pack_start(*loglin); retiFrame->add(*deharetiBox); auxBox->add(*retiFrame); - // ToolParamBlock* const scopeBox = Gtk::manage(new ToolParamBlock()); - // scopeBox->pack_start(*sensih); - // auxBox->add(*scopeBox); +// 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); @@ -1012,7 +1096,7 @@ LocallabRetinex::LocallabRetinex(): retiBox->pack_start(*limd); retiBox->pack_start(*offs); ToolParamBlock* const toolretiBox = Gtk::manage(new ToolParamBlock()); - // toolretiBox->pack_start(*chrrt); + // toolretiBox->pack_start(*chrrt); toolretiBox->pack_start(*darkness); toolretiBox->pack_start(*lightnessreti); toolretiBox->pack_start(*cliptm); @@ -1031,7 +1115,7 @@ LocallabRetinex::LocallabRetinex(): reBox3->pack_start(*lowthresr); reBox3->pack_start(*higthresr); reBox3->pack_start(*decayr); - // colBox3->pack_start(*invmaskc); + // colBox3->pack_start(*invmaskc); exprecovr->add(*reBox3, false); ToolParamBlock* const maskretiBox = Gtk::manage(new ToolParamBlock()); @@ -1088,9 +1172,35 @@ void LocallabRetinex::updateMinMax(const double cdma, const double cdmin, const return false; } - ); + ); } +//new function Global +void LocallabRetinex::updateguireti(int spottype) +{ + { + idle_register.add( + [this, spottype]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update GUI fullimage or main + disableListener(); + + if(spottype == 3) { + sensih->hide(); + } else { + sensih->show(); + } + enableListener(); + + return false; + } + ); + } + +} + + bool LocallabRetinex::isMaskViewActive() { return (showmaskretiMethod->get_active_row_number() != 0); @@ -1247,6 +1357,7 @@ void LocallabRetinex::read(const rtengine::procparams::ProcParams* pp, const Par dehaz->setValue((double)spot.dehaz); depth->setValue((double)spot.depth); dehazeSaturation->setValue((double)spot.dehazeSaturation); + dehazeblack->setValue((double)spot.dehazeblack); str->setValue(spot.str); loglin->set_active(spot.loglin); sensih->setValue((double)spot.sensih); @@ -1267,7 +1378,7 @@ void LocallabRetinex::read(const rtengine::procparams::ProcParams* pp, const Par limd->setValue(spot.limd); offs->setValue(spot.offs); chrrt->setValue(0.); - // chrrt->setValue(spot.chrrt); + // chrrt->setValue(spot.chrrt); darkness->setValue(spot.darkness); lightnessreti->setValue(spot.lightnessreti); cliptm->setValue(spot.cliptm); @@ -1325,6 +1436,7 @@ void LocallabRetinex::write(rtengine::procparams::ProcParams* pp, ParamsEdited* spot.dehaz = dehaz->getIntValue(); spot.depth = depth->getIntValue(); spot.dehazeSaturation = dehazeSaturation->getIntValue(); + spot.dehazeblack = dehazeblack->getValue(); spot.str = str->getValue(); spot.loglin = loglin->get_active(); spot.sensih = sensih->getIntValue(); @@ -1383,6 +1495,7 @@ void LocallabRetinex::setDefaults(const rtengine::procparams::ProcParams* defPar // Set default values for adjuster widgets dehaz->setDefault((double)defSpot.dehaz); dehazeSaturation->setDefault((double)defSpot.dehazeSaturation); + dehazeblack->setDefault((double)defSpot.dehazeblack); depth->setDefault((double)defSpot.depth); str->setDefault(defSpot.str); sensih->setDefault((double)defSpot.sensih); @@ -1438,6 +1551,13 @@ void LocallabRetinex::adjusterChanged(Adjuster* a, double newval) } } + if (a == dehazeblack) { + if (listener) { + listener->panelChanged(Evlocallabdehazeblack, + dehazeblack->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + if (a == depth) { if (listener) { listener->panelChanged(Evlocallabdepth, @@ -1530,7 +1650,7 @@ void LocallabRetinex::adjusterChanged(Adjuster* a, double newval) } if (a == recothresr) { - + if (listener) { listener->panelChanged(Evlocallabrecothresr, recothresr->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); @@ -1740,7 +1860,7 @@ void LocallabRetinex::convertParamToSimple() higthresr->setValue(defSpot.higthresr); decayr->setValue(defSpot.decayr); enableListener(); - + } void LocallabRetinex::updateGUIToMode(const modeType new_type) @@ -1775,10 +1895,11 @@ void LocallabRetinex::updateGUIToMode(const modeType new_type) retitoolFrame->show(); exprecovr->show(); decayr->show(); + if (enaretiMask->get_active()) { maskusabler->show(); maskunusabler->hide(); - + } else { maskusabler->hide(); maskunusabler->show(); @@ -1800,7 +1921,7 @@ void LocallabRetinex::updateMaskBackground(const double normChromar, const doubl return false; } - ); + ); } void LocallabRetinex::loglinChanged() @@ -1865,7 +1986,7 @@ void LocallabRetinex::showmaskretiMethodChanged() locToolListener->resetOtherMaskView(this); } - if(exp->getEnabled()) { + if (exp->getEnabled()) { if (listener) { listener->panelChanged(EvlocallabshowmaskMethod, ""); } @@ -1882,7 +2003,7 @@ void LocallabRetinex::enaretiMaskChanged() maskusabler->hide(); maskunusabler->show(); } - + if (isLocActivated && exp->getEnabled()) { if (listener) { if (enaretiMask->get_active()) { @@ -1994,7 +2115,7 @@ LocallabSharp::LocallabSharp(): showmasksharMethod(Gtk::manage(new MyComboBoxText())) { set_orientation(Gtk::ORIENTATION_VERTICAL); - + // Parameter Sharpening specific widgets sharcontrast->setAdjusterListener(this); @@ -2086,6 +2207,33 @@ void LocallabSharp::enableListener() showmasksharMethodConn.block(false); } +//new function Global +void LocallabSharp::updateguisharp(int spottype) +{ + { + idle_register.add( + [this, spottype]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update GUI fullimage or main + disableListener(); + + if(spottype == 3) { + sensisha->hide(); + inverssha->hide(); + } else { + sensisha->show(); + inverssha->show(); + } + enableListener(); + + return false; + } + ); + } + +} + void LocallabSharp::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) { // Disable all listeners @@ -2340,7 +2488,7 @@ void LocallabSharp::showmasksharMethodChanged() locToolListener->resetOtherMaskView(this); } - if(exp->getEnabled()) { + if (exp->getEnabled()) { if (listener) { listener->panelChanged(EvlocallabshowmaskMethod, ""); } @@ -2374,6 +2522,7 @@ LocallabContrast::LocallabContrast(): 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))), + previewlc(Gtk::manage(new Gtk::ToggleButton(M("TP_LOCALLAB_PREVIEW")))), 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.))), @@ -2385,6 +2534,7 @@ LocallabContrast::LocallabContrast(): 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.))), + featherwav(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FEATVALUE"), 10., 100., 0.1, 25.))), 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.))), @@ -2412,7 +2562,7 @@ LocallabContrast::LocallabContrast(): 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"))))), + offset(Gtk::manage(new Adjuster(M("TP_LOCALLAB_OFFSETWAV"), 0.33, 1.66, 0.01, 1., Gtk::manage(new RTImage("circle-black-small")), Gtk::manage(new RTImage("circle-white-small"))))), 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))), @@ -2424,7 +2574,7 @@ LocallabContrast::LocallabContrast(): 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"))))), + deltad(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DELTAD"), -3., 3., 0.1, 0.))),//, Gtk::manage(new RTImage("circle-black-small")), Gtk::manage(new RTImage("circle-white-small"))))), 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.))), @@ -2451,8 +2601,12 @@ LocallabContrast::LocallabContrast(): mask2lcCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK2"))), Lmasklcshape(static_cast(mask2lcCurveEditorG->addCurve(CT_Diagonal, "L(L)"))) { - set_orientation(Gtk::ORIENTATION_VERTICAL); + auto m = ProcEventMapper::getInstance(); + Evlocallabpreviewlc = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_PREVIEWLC"); + Evlocallabfeatherwav = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_FEATHERWAV"); + set_orientation(Gtk::ORIENTATION_VERTICAL); + const LocallabParams::LocallabSpot defSpot; // Parameter Local contrast specific widgets @@ -2556,6 +2710,7 @@ LocallabContrast::LocallabContrast(): strwav->setAdjusterListener(this); angwav->setAdjusterListener(this); + featherwav->setAdjusterListener(this); wavedgConn = wavedg->signal_toggled().connect(sigc::mem_fun(*this, &LocallabContrast::wavedgChanged)); @@ -2636,7 +2791,7 @@ LocallabContrast::LocallabContrast(): 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)); @@ -2697,6 +2852,11 @@ LocallabContrast::LocallabContrast(): setExpandAlignProperties(expmasklc, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + previewlc->set_active(false); + previewlcConn = previewlc->signal_clicked().connect( + sigc::mem_fun( + *this, &LocallabContrast::previewlcChanged)); + showmasklcMethod->append(M("TP_LOCALLAB_SHOWMNONE")); showmasklcMethod->append(M("TP_LOCALLAB_SHOWMODIF")); showmasklcMethod->append(M("TP_LOCALLAB_SHOWMODIFMASK")); @@ -2741,6 +2901,7 @@ LocallabContrast::LocallabContrast(): // Add Local contrast specific widgets to GUI pack_start(*sensilc); + pack_start(*previewlc); pack_start(*reparw); pack_start(*localcontMethod); pack_start(*lcradius); @@ -2751,7 +2912,7 @@ LocallabContrast::LocallabContrast(): 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); + // coBox->pack_start(*csThreshold); contFrame->add(*coBox); pack_start(*contFrame); // pack_start(*levelwav); @@ -2791,6 +2952,7 @@ LocallabContrast::LocallabContrast(): gradwavBox->pack_start(*sigmalc2); gradwavBox->pack_start(*strwav); gradwavBox->pack_start(*angwav); + gradwavBox->pack_start(*featherwav); gradwavFrame->add(*gradwavBox); blurcontBox->pack_start(*gradwavFrame); Gtk::Frame* const edgFrame = Gtk::manage(new Gtk::Frame()); @@ -2841,7 +3003,7 @@ LocallabContrast::LocallabContrast(): blurlevelFrame->add(*blurlevcontBox); blurcontBox->pack_start(*blurlevelFrame); expcontrastpyr->add(*blurcontBox, false); - pack_start(*gamlc); + 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"))); @@ -2889,7 +3051,7 @@ LocallabContrast::LocallabContrast(): wwBox3->pack_start(*lowthresw); wwBox3->pack_start(*higthresw); wwBox3->pack_start(*decayw); - // colBox3->pack_start(*invmaskc); + // colBox3->pack_start(*invmaskc); exprecovw->add(*wwBox3, false); pack_start(*exprecovw, false, false); @@ -2934,6 +3096,62 @@ void LocallabContrast::getMaskView(int &colorMask, int &colorMaskinv, int &expMa lcMask = showmasklcMethod->get_active_row_number(); } +Gtk::ToggleButton *LocallabContrast::getPreviewDeltaEButton() const +{ + return previewlc; +} + +sigc::connection *LocallabContrast::getPreviewDeltaEButtonConnection() +{ + return &previewlcConn; +} + +//new function Global +void LocallabContrast::updateguicont(int spottype) +{ + { + idle_register.add( + [this, spottype]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update GUI fullimage or main + disableListener(); + + if(spottype == 3) { + sensilc->hide(); + showmasklcMethod->set_active(0); + previewlc->hide(); + previewlc->set_active(false); + resetMaskView(); + + } else { + sensilc->show(); + previewlc->show(); + } + enableListener(); + + return false; + } + ); + } + +} + +void LocallabContrast::previewlcChanged() +{ + if(previewlc->get_active()) { + showmasklcMethod->set_active(4); + } else { + showmasklcMethod->set_active(0); + } + + if (isLocActivated) { + if (listener) { + listener->panelChanged(Evlocallabpreviewlc,""); + } + } +} + void LocallabContrast::updateAdviceTooltips(const bool showTooltips) { if (showTooltips) { @@ -2981,7 +3199,7 @@ void LocallabContrast::updateAdviceTooltips(const bool showTooltips) 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")); @@ -3186,6 +3404,7 @@ void LocallabContrast::read(const rtengine::procparams::ProcParams* pp, const Pa sigmalc2->setValue(spot.sigmalc2); strwav->setValue(spot.strwav); angwav->setValue(spot.angwav); + featherwav->setValue(spot.featherwav); wavedg->set_active(spot.wavedg); strengthw->setValue(spot.strengthw); sigmaed->setValue(spot.sigmaed); @@ -3311,6 +3530,7 @@ void LocallabContrast::write(rtengine::procparams::ProcParams* pp, ParamsEdited* spot.sigmalc2 = sigmalc2->getValue(); spot.strwav = strwav->getValue(); spot.angwav = angwav->getValue(); + spot.featherwav = featherwav->getValue(); spot.wavedg = wavedg->get_active(); spot.strengthw = strengthw->getValue(); spot.sigmaed = sigmaed->getValue(); @@ -3413,6 +3633,7 @@ void LocallabContrast::setDefaults(const rtengine::procparams::ProcParams* defPa sigmalc2->setDefault(defSpot.sigmalc2); strwav->setDefault(defSpot.strwav); angwav->setDefault(defSpot.angwav); + featherwav->setDefault(defSpot.featherwav); strengthw->setDefault(defSpot.strengthw); sigmaed->setDefault(defSpot.sigmaed); gradw->setDefault(defSpot.gradw); @@ -3611,6 +3832,13 @@ void LocallabContrast::adjusterChanged(Adjuster* a, double newval) } } + if (a == featherwav) { + if (listener) { + listener->panelChanged(Evlocallabfeatherwav, + featherwav->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + if (a == strengthw) { if (listener) { listener->panelChanged(Evlocallabstrengthw, @@ -3767,7 +3995,7 @@ void LocallabContrast::adjusterChanged(Adjuster* a, double newval) //} if (a == recothresw) { - + if (listener) { listener->panelChanged(Evlocallabrecothresw, recothresw->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); @@ -3932,6 +4160,7 @@ void LocallabContrast::convertParamToNormal() sigmalc2->setValue(defSpot.sigmalc2); strwav->setValue(defSpot.strwav); angwav->setValue(defSpot.angwav); + featherwav->setValue(defSpot.featherwav); wavedg->set_active(defSpot.wavedg); strengthw->setValue(defSpot.strengthw); sigmaed->setValue(defSpot.sigmaed); @@ -4025,7 +4254,7 @@ void LocallabContrast::convertParamToSimple() lowthresw->setValue(defSpot.lowthresw); higthresw->setValue(defSpot.higthresw); decayw->setValue(defSpot.decayw); - + enableListener(); // Update GUI based on converted widget parameters: @@ -4063,14 +4292,16 @@ void LocallabContrast::updateGUIToMode(const modeType new_type) expmasklc->show(); exprecovw->show(); decayw->hide(); + if (enalcMask->get_active()) { maskusablew->show(); maskunusablew->hide(); - + } else { maskusablew->hide(); maskunusablew->show(); } + gamlc->hide(); break; @@ -4093,15 +4324,16 @@ void LocallabContrast::updateGUIToMode(const modeType new_type) expmasklc->show(); exprecovw->show(); decayw->show(); + if (enalcMask->get_active()) { maskusablew->show(); maskunusablew->hide(); - + } else { maskusablew->hide(); maskunusablew->show(); } - + } } @@ -4119,7 +4351,7 @@ void LocallabContrast::updateMaskBackground(const double normChromar, const doub return false; } - ); + ); } void LocallabContrast::localcontMethodChanged() @@ -4318,7 +4550,7 @@ void LocallabContrast::showmasklcMethodChanged() locToolListener->resetOtherMaskView(this); } - if(exp->getEnabled()) { + if (exp->getEnabled()) { if (listener) { listener->panelChanged(EvlocallabshowmaskMethod, ""); } @@ -4335,7 +4567,7 @@ void LocallabContrast::enalcMaskChanged() maskusablew->hide(); maskunusablew->show(); } - + if (isLocActivated && exp->getEnabled()) { if (listener) { if (enalcMask->get_active()) { @@ -4367,6 +4599,7 @@ void LocallabContrast::updateContrastGUI1() expcontrastpyr->hide(); expcontrastpyr2->hide(); gamlc->hide(); + if (mode == Expert) { // Keep widget hidden in Normal and Simple mode fftwlc->show(); } @@ -4421,7 +4654,7 @@ LocallabCBDL::LocallabCBDL(): // 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) { @@ -4437,44 +4670,44 @@ LocallabCBDL::LocallabCBDL(): } 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)"))), +} +()), +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")))) +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 @@ -4505,7 +4738,7 @@ LocallabCBDL::LocallabCBDL(): 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->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)); @@ -4592,7 +4825,7 @@ LocallabCBDL::LocallabCBDL(): cbBox3->pack_start(*lowthrescb); cbBox3->pack_start(*higthrescb); cbBox3->pack_start(*decaycb); - // colBox3->pack_start(*invmaskc); + // colBox3->pack_start(*invmaskc); exprecovcb->add(*cbBox3, false); pack_start(*exprecovcb, false, false); @@ -4635,6 +4868,32 @@ void LocallabCBDL::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, cbMask = showmaskcbMethod->get_active_row_number(); } +//new function Global +void LocallabCBDL::updateguicbdl(int spottype) +{ + { + idle_register.add( + [this, spottype]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update GUI fullimage or main + disableListener(); + + if(spottype == 3) { + sensicb->hide(); + } else { + sensicb->show(); + } + enableListener(); + + return false; + } + ); + } + +} + + void LocallabCBDL::updateAdviceTooltips(const bool showTooltips) { if (showTooltips) { @@ -4911,7 +5170,7 @@ void LocallabCBDL::adjusterChanged(Adjuster* a, double newval) } if (a == recothrescb) { - + if (listener) { listener->panelChanged(Evlocallabrecothrescb, recothrescb->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); @@ -5097,10 +5356,11 @@ void LocallabCBDL::updateGUIToMode(const modeType new_type) expmaskcb->show(); exprecovcb->show(); decaycb->hide(); + if (enacbMask->get_active()) { maskusablecb->show(); maskunusablecb->hide(); - + } else { maskusablecb->hide(); maskunusablecb->show(); @@ -5115,10 +5375,11 @@ void LocallabCBDL::updateGUIToMode(const modeType new_type) lapmaskcb->show(); exprecovcb->show(); decaycb->show(); + if (enacbMask->get_active()) { maskusablecb->show(); maskunusablecb->hide(); - + } else { maskusablecb->hide(); maskunusablecb->show(); @@ -5140,7 +5401,7 @@ void LocallabCBDL::updateMaskBackground(const double normChromar, const double n return false; } - ); + ); } void LocallabCBDL::showmaskcbMethodChanged() @@ -5150,7 +5411,7 @@ void LocallabCBDL::showmaskcbMethodChanged() locToolListener->resetOtherMaskView(this); } - if(exp->getEnabled()) { + if (exp->getEnabled()) { if (listener) { listener->panelChanged(EvlocallabshowmaskMethod, ""); } @@ -5166,7 +5427,7 @@ void LocallabCBDL::enacbMaskChanged() maskusablecb->hide(); maskunusablecb->show(); } - + if (isLocActivated && exp->getEnabled()) { if (listener) { if (enacbMask->get_active()) { @@ -5217,24 +5478,31 @@ 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))), + repar(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGREPART"), 1.0, 100.0, 0.5, 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))), + logPFrame2(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOGPFRA2")))), + blackEv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLACK_EV"), -16.00, 0.00, 0.01, -5.00))), + whiteEv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_WHITE_EV"), 0.00, 32.00, 0.01, 10.00))), + whiteslog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGWHITESCIE"), -100, 100, 1, 0))), + blackslog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGBLACKSSCIE"), -100, 100, 1, 0))), + comprlog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_COMPRCIE"), 0., 1., 0.01, 0.4))), + strelog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRENGTHCIELOG"), 0., 100., 0.5, 100.))), + satlog(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_SATCIE")))), + 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 ())), + 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"))))), + catad(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CATAD"), -100., 100., 0.5, 0., Gtk::manage(new RTImage("circle-blue-small")), Gtk::manage(new RTImage("circle-orange-small"))))), 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.))), @@ -5247,9 +5515,9 @@ LocallabLog::LocallabLog(): //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 ())), + 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"))))), + baselog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BASELOG"), 1.3, 3., 0.05, 2.))),//, Gtk::manage(new RTImage("circle-black-small")), Gtk::manage(new RTImage("circle-white-small"))))), 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")))), @@ -5259,13 +5527,15 @@ LocallabLog::LocallabLog(): 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))), + previewlog(Gtk::manage(new Gtk::ToggleButton(M("TP_LOCALLAB_PREVIEW")))), 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.))), + featherlog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FEATVALUE"), 10., 100., 0.1, 25.))), 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, 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))), @@ -5275,11 +5545,20 @@ LocallabLog::LocallabLog(): 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)"))) - - + + { + auto m = ProcEventMapper::getInstance(); + Evlocallabpreviewlog = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_PREVIEWLOG"); + Evlocallabwhiteslog = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_LOG_WHITES"); + Evlocallabblackslog = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_LOG_BLACKS"); + Evlocallabcomprlog = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_LOG_COMPR"); + Evlocallabstrelog = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_LOG_STRE"); + Evlocallabsatlog = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_LOG_SAT"); + Evlocallabfeatherlog = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_FEATHERLOG"); + 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; @@ -5290,9 +5569,16 @@ LocallabLog::LocallabLog(): whiteEv->setLogScale(16, 0); whiteEv->setAdjusterListener(this); + + whiteslog->setAdjusterListener(this); + blackslog->setAdjusterListener(this); + comprlog->setAdjusterListener(this); + strelog->setAdjusterListener(this); + ciecamconn = ciecam->signal_toggled().connect(sigc::mem_fun(*this, &LocallabLog::ciecamChanged)); fullimageConn = fullimage->signal_toggled().connect(sigc::mem_fun(*this, &LocallabLog::fullimageChanged)); + satlogconn = satlog->signal_toggled().connect(sigc::mem_fun(*this, &LocallabLog::satlogChanged)); AutograyConn = Autogray->signal_toggled().connect(sigc::mem_fun(*this, &LocallabLog::AutograyChanged)); @@ -5350,34 +5636,41 @@ LocallabLog::LocallabLog(): 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) ); + featherlog->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->append(M("TP_COLORAPP_SURROUND_EXDARK")); + 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) ); + 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); + previewlog->set_active(false); + previewlogConn = previewlog->signal_clicked().connect( + sigc::mem_fun( + *this, &LocallabLog::previewlogChanged)); + showmaskLMethod->append(M("TP_LOCALLAB_SHOWMNONE")); showmaskLMethod->append(M("TP_LOCALLAB_SHOWMODIF")); showmaskLMethod->append(M("TP_LOCALLAB_SHOWMODIFMASK")); @@ -5421,14 +5714,26 @@ LocallabLog::LocallabLog(): // Add Log encoding specific widgets to GUI pack_start(*sensilog); + pack_start(*previewlog); + pack_start(*repar); pack_start(*ciecam); logPFrame->set_label_align(0.025, 0.5); + logPFrame2->set_label_align(0.025, 0.5); ToolParamBlock* const logPBox = Gtk::manage(new ToolParamBlock()); + ToolParamBlock* const logPBox2 = Gtk::manage(new ToolParamBlock()); logPBox->pack_start(*autocompute); logPBox->pack_start(*blackEv); logPBox->pack_start(*whiteEv); + logPBox->pack_start(*whiteslog); + logPBox->pack_start(*blackslog); + logPBox2->pack_start(*comprlog); + // logPBox2->pack_start(*strelog); + logPBox2->pack_start(*satlog); + logPFrame2->add(*logPBox2); + logPBox->pack_start(*logPFrame2); logPBox->pack_start(*fullimage); + logPFrame->add(*logPBox); pack_start(*logPFrame); // Gtk::Frame* const logFrame = Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOGFRA"))); @@ -5437,7 +5742,7 @@ LocallabLog::LocallabLog(): logFBox->pack_start(*Autogray); logFBox->pack_start(*sourceGray); logFBox->pack_start(*sourceabs); - logFBox->pack_start (*surHBox); + logFBox->pack_start(*surHBox); // logFBox->pack_start(*baselog); logFrame->add(*logFBox); pack_start(*logFrame); @@ -5457,16 +5762,16 @@ LocallabLog::LocallabLog(): 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); + 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); + 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); @@ -5474,9 +5779,9 @@ LocallabLog::LocallabLog(): logBox3->pack_start(*lowthresl); logBox3->pack_start(*higthresl); logBox3->pack_start(*decayl); - // colBox3->pack_start(*invmaskc); + // 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); @@ -5491,16 +5796,17 @@ LocallabLog::LocallabLog(): 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"))); + +// 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); + gradlogBox->pack_start(*featherlog); gradlogFrame->add(*gradlogBox); pack_start(*gradlogFrame); } @@ -5510,7 +5816,7 @@ LocallabLog::~LocallabLog() delete maskCurveEditorL; delete mask2CurveEditorL; //delete CurveEditorL; - + } void LocallabLog::setDefaultExpanderVisibility() @@ -5521,6 +5827,54 @@ void LocallabLog::setDefaultExpanderVisibility() } +//new function Global +void LocallabLog::updateguilog(int spottype) +{ + { + idle_register.add( + [this, spottype]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update GUI fullimage or main + disableListener(); + + if(spottype == 3) { + sensilog->hide(); + showmaskLMethod->set_active(0); + previewlog->hide(); + previewlog->set_active(false); + resetMaskView(); + + } else { + sensilog->show(); + previewlog->show(); + } + enableListener(); + + return false; + } + ); + } + +} + +void LocallabLog::previewlogChanged() +{ + + if(previewlog->get_active()) { + showmaskLMethod->set_active(4); + } else { + showmaskLMethod->set_active(0); + } + + if (isLocActivated) { + if (listener) { + listener->panelChanged(Evlocallabpreviewlog,""); + } + } +} + + void LocallabLog::updateAdviceTooltips(const bool showTooltips) { if (showTooltips) { @@ -5533,11 +5887,15 @@ void LocallabLog::updateAdviceTooltips(const bool showTooltips) 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")); + // 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(""); + whiteslog->set_tooltip_text(M("TP_LOCALLAB_SIGMOIDWHITESCIE_TOOLTIP")); + blackslog->set_tooltip_text(M("TP_LOCALLAB_SIGMOIDWHITESCIE_TOOLTIP")); + comprlog->set_tooltip_text(M("TP_LOCALLAB_COMPRLOG_TOOLTIP")); + 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")); @@ -5549,8 +5907,8 @@ void LocallabLog::updateAdviceTooltips(const bool showTooltips) 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")); + 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")); @@ -5617,6 +5975,9 @@ void LocallabLog::updateAdviceTooltips(const bool showTooltips) decayl->set_tooltip_text(""); lowthresl->set_tooltip_text(""); higthresl->set_tooltip_text(""); + whiteslog->set_tooltip_text(""); + blackslog->set_tooltip_text(""); + comprlog->set_tooltip_text(""); } } @@ -5628,9 +5989,10 @@ void LocallabLog::disableListener() autoconn.block(true); fullimageConn.block(true); ciecamconn.block(true); + satlogconn.block(true); enaLMaskConn.block(true); - surroundconn.block (true); - sursourconn.block (true); + surroundconn.block(true); + sursourconn.block(true); AutograyConn.block(true); showmaskLMethodConn.block(true); } @@ -5642,9 +6004,10 @@ void LocallabLog::enableListener() autoconn.block(false); fullimageConn.block(false); ciecamconn.block(false); + satlogconn.block(false); enaLMaskConn.block(false); - surroundconn.block (false); - sursourconn.block (false); + surroundconn.block(false); + sursourconn.block(false); AutograyConn.block(false); showmaskLMethodConn.block(false); } @@ -5668,6 +6031,16 @@ void LocallabLog::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, i logMask = showmaskLMethod->get_active_row_number(); } +Gtk::ToggleButton *LocallabLog::getPreviewDeltaEButton() const +{ + return previewlog; +} + +sigc::connection *LocallabLog::getPreviewDeltaEButtonConnection() +{ + return &previewlogConn; +} + void LocallabLog::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) { @@ -5689,34 +6062,43 @@ void LocallabLog::read(const rtengine::procparams::ProcParams* pp, const ParamsE repar->setValue(spot.repar); whiteEv->setValue(spot.whiteEv); -/* if(whiteEv->getValue() < 1.5){ - whiteEv->setValue(1.5); - } -*/ + whiteslog->setValue(spot.whiteslog); + blackslog->setValue(spot.blackslog); + comprlog->setValue(spot.comprlog); + strelog->setValue(spot.strelog); + + /* if(whiteEv->getValue() < 1.5){ + whiteEv->setValue(1.5); + } + */ if (spot.sursour == "Average") { - sursour->set_active (0); + sursour->set_active(0); } else if (spot.sursour == "Dim") { - sursour->set_active (1); + sursour->set_active(1); } else if (spot.sursour == "Dark") { - sursour->set_active (2); + sursour->set_active(2); + } else if (spot.sursour == "exDark") { + sursour->set_active(3); } if (spot.surround == "Average") { - surround->set_active (0); + surround->set_active(0); } else if (spot.surround == "Dim") { - surround->set_active (1); + surround->set_active(1); } else if (spot.surround == "Dark") { - surround->set_active (2); + surround->set_active(2); } else if (spot.surround == "ExtremelyDark") { - surround->set_active (3); + 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); + satlog->set_active(spot.satlog); fullimage->set_active(spot.fullimage); Autogray->set_active(spot.Autogray); sourceGray->setValue(spot.sourceGray); @@ -5738,6 +6120,7 @@ void LocallabLog::read(const rtengine::procparams::ProcParams* pp, const ParamsE sensilog->setValue((double)spot.sensilog); strlog->setValue(spot.strlog); anglog->setValue(spot.anglog); + featherlog->setValue(spot.featherlog); CCmaskshapeL->setCurve(spot.CCmaskcurveL); LLmaskshapeL->setCurve(spot.LLmaskcurveL); HHmaskshapeL->setCurve(spot.HHmaskcurveL); @@ -5747,7 +6130,7 @@ void LocallabLog::read(const rtengine::procparams::ProcParams* pp, const ParamsE chromaskL->setValue(spot.chromaskL); LmaskshapeL->setCurve(spot.LmaskcurveL); - + } // Enable all listeners @@ -5778,8 +6161,13 @@ void LocallabLog::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedi spot.repar = repar->getValue(); spot.blackEv = blackEv->getValue(); spot.whiteEv = whiteEv->getValue(); + spot.whiteslog = whiteslog->getIntValue(); + spot.blackslog = blackslog->getIntValue(); + spot.comprlog = comprlog->getValue(); + spot.strelog = strelog->getValue(); spot.fullimage = fullimage->get_active(); spot.ciecam = ciecam->get_active(); + spot.satlog = satlog->get_active(); spot.Autogray = Autogray->get_active(); spot.sourceGray = sourceGray->getValue(); spot.sourceabs = sourceabs->getValue(); @@ -5800,6 +6188,7 @@ void LocallabLog::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedi spot.sensilog = sensilog->getIntValue(); spot.strlog = strlog->getValue(); spot.anglog = anglog->getValue(); + spot.featherlog = featherlog->getValue(); spot.CCmaskcurveL = CCmaskshapeL->getCurve(); spot.LLmaskcurveL = LLmaskshapeL->getCurve(); spot.HHmaskcurveL = HHmaskshapeL->getCurve(); @@ -5820,6 +6209,8 @@ void LocallabLog::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedi spot.sursour = "Dim"; } else if (sursour->get_active_row_number() == 2) { spot.sursour = "Dark"; + } else if (sursour->get_active_row_number() == 3) { + spot.sursour = "exDark"; } if (surround->get_active_row_number() == 0) { @@ -5831,7 +6222,7 @@ void LocallabLog::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedi } else if (surround->get_active_row_number() == 3) { spot.surround = "ExtremelyDark"; } - + } // Note: No need to manage pedited as batch mode is deactivated for Locallab @@ -5847,7 +6238,7 @@ void LocallabLog::enaLMaskChanged() maskusablel->hide(); maskunusablel->show(); } - + if (isLocActivated && exp->getEnabled()) { if (listener) { if (enaLMask->get_active()) { @@ -5870,12 +6261,12 @@ void LocallabLog::updateGUIToMode(const modeType new_type) case Simple: // Expert and Normal mode widgets are hidden in Simple mode ciecam->hide(); - ciecam->set_active(false); + ciecam->set_active(true); sourceabs->hide(); targabs->hide(); saturl->hide(); chroml->hide(); - contl->hide(); + contl->show(); contthres->hide(); lightl->hide(); lightq->hide(); @@ -5891,6 +6282,7 @@ void LocallabLog::updateGUIToMode(const modeType new_type) maskusablel->hide(); maskunusablel->hide(); decayl->hide(); + break; case Normal: @@ -5907,22 +6299,23 @@ void LocallabLog::updateGUIToMode(const modeType new_type) lightq->show(); contl->show(); contthres->show(); - contq->show(); + contq->hide(); 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(); @@ -5948,14 +6341,16 @@ void LocallabLog::updateGUIToMode(const modeType new_type) expmaskL->show(); gradlogFrame->show(); surHBox->show(); + if (enaLMask->get_active()) { maskusablel->show(); maskunusablel->hide(); - + } else { maskusablel->hide(); maskunusablel->show(); } + exprecovl->show(); decayl->show(); @@ -5980,7 +6375,9 @@ void LocallabLog::convertParamToSimple() sursour->set_active(0); strlog->setValue(defSpot.strlog); anglog->setValue(defSpot.anglog); + featherlog->setValue(defSpot.featherlog); enaLMask->set_active(false); + showmaskLMethod->set_active(0); recothresl->setValue(defSpot.recothresl); lowthresl->setValue(defSpot.lowthresl); higthresl->setValue(defSpot.higthresl); @@ -6019,7 +6416,7 @@ void LocallabLog::showmaskLMethodChanged() locToolListener->resetOtherMaskView(this); } - if(exp->getEnabled()) { + if (exp->getEnabled()) { if (listener) { listener->panelChanged(EvlocallabshowmaskMethod, ""); } @@ -6079,6 +6476,10 @@ void LocallabLog::setDefaults(const rtengine::procparams::ProcParams* defParams, repar->setDefault(defSpot.repar); blackEv->setDefault(defSpot.blackEv); whiteEv->setDefault(defSpot.whiteEv); + whiteslog->setDefault(defSpot.whiteslog); + blackslog->setDefault(defSpot.blackslog); + comprlog->setDefault(defSpot.comprlog); + strelog->setDefault(defSpot.strelog); sourceGray->setDefault(defSpot.sourceGray); sourceabs->setDefault(defSpot.sourceabs); targabs->setDefault(defSpot.targabs); @@ -6097,6 +6498,7 @@ void LocallabLog::setDefaults(const rtengine::procparams::ProcParams* defParams, sensilog->setDefault((double)defSpot.sensilog); strlog->setDefault(defSpot.strlog); anglog->setDefault(defSpot.anglog); + featherlog->setDefault(defSpot.featherlog); blendmaskL->setDefault(defSpot.blendmaskL); radmaskL->setDefault(defSpot.radmaskL); chromaskL->setDefault(defSpot.chromaskL); @@ -6135,6 +6537,34 @@ void LocallabLog::adjusterChanged(Adjuster* a, double newval) } } + if (a == whiteslog) { + if (listener) { + listener->panelChanged(Evlocallabwhiteslog, + whiteslog->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == blackslog) { + if (listener) { + listener->panelChanged(Evlocallabblackslog, + blackslog->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == comprlog) { + if (listener) { + listener->panelChanged(Evlocallabcomprlog, + comprlog->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == strelog) { + if (listener) { + listener->panelChanged(Evlocallabstrelog, + strelog->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + if (a == sourceGray) { if (listener) { listener->panelChanged(EvlocallabsourceGray, @@ -6242,7 +6672,7 @@ void LocallabLog::adjusterChanged(Adjuster* a, double newval) } if (a == recothresl) { - + if (listener) { listener->panelChanged(Evlocallabrecothresl, recothresl->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); @@ -6291,7 +6721,14 @@ void LocallabLog::adjusterChanged(Adjuster* a, double newval) anglog->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); } } - + + if (a == featherlog) { + if (listener) { + listener->panelChanged(Evlocallabfeatherlog, + featherlog->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + if (a == blendmaskL) { if (listener) { listener->panelChanged(EvLocallabblendmaskL, @@ -6313,7 +6750,7 @@ void LocallabLog::adjusterChanged(Adjuster* a, double newval) } } - + } } @@ -6335,9 +6772,9 @@ void LocallabLog::updateAutocompute(const float blackev, const float whiteev, co enableListener(); - return false; + return false; } - ); + ); } } @@ -6403,7 +6840,7 @@ void LocallabLog::ciecamChanged() targabs->set_sensitive(true); catad->set_sensitive(true); surrHBox->set_sensitive(true); - + sourceabs->show(); targabs->show(); catad->show(); @@ -6422,7 +6859,7 @@ void LocallabLog::ciecamChanged() catad->hide(); surrHBox->hide(); } -*/ + */ if (isLocActivated && exp->getEnabled()) { if (listener) { if (ciecam->get_active()) { @@ -6436,6 +6873,21 @@ void LocallabLog::ciecamChanged() } } +void LocallabLog::satlogChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (satlog->get_active()) { + listener->panelChanged(Evlocallabsatlog, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabsatlog, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + void LocallabLog::fullimageChanged() { @@ -6466,7 +6918,7 @@ void LocallabLog::updateMaskBackground(const double normChromar, const double no return false; } - ); + ); } @@ -6515,11 +6967,14 @@ void LocallabLog::updateLogGUI2() 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); + blackslog->set_sensitive(true); + whiteslog->set_sensitive(true); + if (mode == Expert || mode == Normal) { sourceabs->set_sensitive(false); } else { @@ -6529,16 +6984,20 @@ void LocallabLog::updateLogGUI() blackEv->set_sensitive(true); whiteEv->set_sensitive(true); sourceGray->set_sensitive(true); - if (mode == Expert || mode == Normal){ + blackslog->set_sensitive(false); + whiteslog->set_sensitive(false); + + 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(); - } - + + if (mode == Expert || mode == Normal) { // Keep widget hidden in Simple mode + exprecovl->show(); + } + } @@ -6548,6 +7007,7 @@ LocallabMask::LocallabMask(): // Common mask specific widgets sensimask(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 60))), + previewmas(Gtk::manage(new Gtk::ToggleButton(M("TP_LOCALLAB_PREVIEW")))), 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.))), @@ -6581,11 +7041,16 @@ LocallabMask::LocallabMask(): 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.))), + feather_mask(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FEATVALUE"), 10., 100., 0.1, 25.))), ang_mask(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADANG"), -180., 180., 0.1, 0.))) { + + auto m = ProcEventMapper::getInstance(); + Evlocallabpreviewmas = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_PREVIEWMAS"); + Evlocallabfeather_mask = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_FEATHERMAS"); set_orientation(Gtk::ORIENTATION_VERTICAL); - + const LocallabParams::LocallabSpot defSpot; // Parameter Mask common specific widgets @@ -6599,6 +7064,11 @@ LocallabMask::LocallabMask(): softradiusmask->setAdjusterListener(this); + previewmas->set_active(false); + previewmasConn = previewmas->signal_clicked().connect( + sigc::mem_fun( + *this, &LocallabMask::previewmasChanged)); + showmask_Method->append(M("TP_LOCALLAB_SHOWMNONE")); showmask_Method->append(M("TP_LOCALLAB_SHOWMODIFMASK")); showmask_Method->append(M("TP_LOCALLAB_SHOWMASK")); @@ -6687,9 +7157,11 @@ LocallabMask::LocallabMask(): ang_mask->setAdjusterListener(this); ang_mask->set_tooltip_text(M("TP_LOCALLAB_GRADANG_TOOLTIP")); + feather_mask->setAdjusterListener(this); // Add Common mask specific widgets to GUI pack_start(*sensimask); + pack_start(*previewmas); pack_start(*blendmask); pack_start(*blendmaskab); pack_start(*softradiusmask); @@ -6721,6 +7193,7 @@ LocallabMask::LocallabMask(): ToolParamBlock* const gradmaskBox = Gtk::manage(new ToolParamBlock()); gradmaskBox->pack_start(*str_mask); gradmaskBox->pack_start(*ang_mask); + gradmaskBox->pack_start(*feather_mask); gradFramemask->add(*gradmaskBox); toolmaskBox->pack_start(*gradFramemask, Gtk::PACK_SHRINK, 0); toolmaskFrame->add(*toolmaskBox); @@ -6752,6 +7225,64 @@ void LocallabMask::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, maskMask = showmask_Method->get_active_row_number(); } +Gtk::ToggleButton *LocallabMask::getPreviewDeltaEButton() const +{ + return previewmas; +} + +sigc::connection *LocallabMask::getPreviewDeltaEButtonConnection() +{ + return &previewmasConn; +} + +//new function Global +void LocallabMask::updateguimask(int spottype) +{ + { + idle_register.add( + [this, spottype]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update GUI fullimage or main + disableListener(); + + if(spottype == 3) { + sensimask->hide(); + showmask_Method->set_active(0); + previewmas->hide(); + previewmas->set_active(false); + resetMaskView(); + + } else { + sensimask->show(); + previewmas->show(); + } + enableListener(); + + return false; + } + ); + } + +} + +void LocallabMask::previewmasChanged() +{ + + if(previewmas->get_active()) { + showmask_Method->set_active(3); + } else { + showmask_Method->set_active(0); + } + + if (isLocActivated) { + if (listener) { + listener->panelChanged(Evlocallabpreviewmas,""); + } + } +} + + void LocallabMask::updateAdviceTooltips(const bool showTooltips) { if (showTooltips) { @@ -6878,6 +7409,7 @@ void LocallabMask::read(const rtengine::procparams::ProcParams* pp, const Params csThresholdmask->setValue(spot.csthresholdmask); str_mask->setValue((double)spot.str_mask); ang_mask->setValue((double)spot.ang_mask); + feather_mask->setValue((double)spot.feather_mask); } // Enable all listeners @@ -6925,6 +7457,7 @@ void LocallabMask::write(rtengine::procparams::ProcParams* pp, ParamsEdited* ped spot.csthresholdmask = csThresholdmask->getValue(); spot.str_mask = str_mask->getIntValue(); spot.ang_mask = ang_mask->getIntValue(); + spot.feather_mask = feather_mask->getIntValue(); } // Note: No need to manage pedited as batch mode is deactivated for Locallab @@ -6954,6 +7487,7 @@ void LocallabMask::setDefaults(const rtengine::procparams::ProcParams* defParams csThresholdmask->setDefault(defSpot.csthresholdmask); str_mask->setDefault((double)defSpot.str_mask); ang_mask->setDefault((double)defSpot.ang_mask); + feather_mask->setDefault((double)defSpot.feather_mask); } // Note: No need to manage pedited as batch mode is deactivated for Locallab @@ -7068,6 +7602,13 @@ void LocallabMask::adjusterChanged(Adjuster* a, double newval) } } + if (a == feather_mask) { + if (listener) { + listener->panelChanged(Evlocallabfeather_mask, + feather_mask->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } } @@ -7203,6 +7744,7 @@ void LocallabMask::convertParamToNormal() csThresholdmask->setValue(defSpot.csthresholdmask); str_mask->setValue((double)defSpot.str_mask); ang_mask->setValue((double)defSpot.ang_mask); + feather_mask->setValue((double)defSpot.feather_mask); // Enable all listeners enableListener(); @@ -7222,6 +7764,7 @@ void LocallabMask::convertParamToSimple() // 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 @@ -7281,7 +7824,7 @@ void LocallabMask::updateGUIToMode(const modeType new_type) csThresholdmask->show(); gradFramemask->show(); } - + } void LocallabMask::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) @@ -7299,7 +7842,7 @@ void LocallabMask::updateMaskBackground(const double normChromar, const double n return false; } - ); + ); } void LocallabMask::showmask_MethodChanged() @@ -7309,7 +7852,7 @@ void LocallabMask::showmask_MethodChanged() locToolListener->resetOtherMaskView(this); } - if(exp->getEnabled()) { + if (exp->getEnabled()) { if (listener) { listener->panelChanged(EvlocallabshowmaskMethod, ""); } @@ -7382,18 +7925,21 @@ 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))), + previewcie(Gtk::manage(new Gtk::ToggleButton(M("TP_LOCALLAB_PREVIEW")))), + 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 ())), + 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")))), + expcamscene(Gtk::manage(new MyExpander(false, Gtk::manage(new Gtk::Box())))), 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 ())), + 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")))), @@ -7409,7 +7955,7 @@ Locallabcie::Locallabcie(): 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.))), + pqremapcam16(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CAM16PQREMAP"), 100., 10000., 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")))), @@ -7430,30 +7976,97 @@ Locallabcie::Locallabcie(): 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())))), + expcamviewing(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.))), + lightsigqcie(Gtk::manage(new Adjuster(M(""), -100., 100., 0.5, 0.))), + contsigqcie(Gtk::manage(new Adjuster(M(""), -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))), + blackEvjz(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLACK_EV"), -16.00, 0.00, 0.01, -5.00))), + whiteEvjz(Gtk::manage(new Adjuster(M("TP_LOCALLAB_WHITE_EV"), 0.00, 32.000, 0.01, 10.00))), 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")))), - + sigBox(Gtk::manage(new ToolParamBlock())), sigmoidFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_SIGFRA")))), + sigmoidnormFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_SIGNORM")))), 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")))), + sigmoidthcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMOIDTH"), 0.1, 4., 0.01, 1.2, Gtk::manage(new RTImage("circle-black-small")), Gtk::manage(new RTImage("circle-white-small"))))), + sigmoidsenscie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMOIDSENSI"), 0.1, 1.5, 0.01, 0.9))), + sigmoidblcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMOIDBL"), 0.05, 1., 0.01, 0.75))), + autocomprHBox(Gtk::manage(new Gtk::Box())), + comprcieauto(Gtk::manage(new Gtk::ToggleButton(M("TP_LOCALLAB_SIGMOIDLOGAUTO")))), + normcie(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_SIGMOIDNORMCIE")))), + modeHBoxbwev(Gtk::manage(new Gtk::Box())), + bwevMethod(Gtk::manage(new MyComboBoxText())), + logcieFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOGCIE")))), logcie(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_LOGCIE")))), + comprBox(Gtk::manage(new ToolParamBlock())), + comprcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_COMPRCIE"), 0., 1., 0.01, 0.4))), + strcielog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRENGTHCIELOG"), 0., 100., 0.5, 80.))), + satcie(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_SATCIE")))), + logcieq(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_LOGCIEQ")))), + comprcieth(Gtk::manage(new Adjuster(M("TP_LOCALLAB_COMPRCIETH"), 0., 25., 0.01, 6.))), + + expprecam(Gtk::manage(new MyExpander(true, Gtk::manage(new Gtk::Box())))), + + gamjcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGGAMJCIE"), 0.7, 10., 0.01, 2.4))), + slopjcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGSLOPJCIE"), 0., 500., 0.01, 12.923))), + midtcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MIDTCIE"), -100, 100, 1, 0))), + smoothcie(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_SMOOTHCIE_SCA")))), + smoothcieyb(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_SMOOTHCIE_YB")))), + smoothcielum(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_SMOOTHCIE_LUM")))), + ciesmoothBox(Gtk::manage(new ToolParamBlock())), + smoothBox(Gtk::manage(new Gtk::Box())), + smoothciemet(Gtk::manage(new MyComboBoxText())), + slopesmo(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOPESMOOTH"), 0.01, 1.6, 0.01, 1.))), + slopesmor(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOPESMOOTHR"), 0.01, 1.6, 0.01, 1.))), + slopesmog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOPESMOOTHG"), 0.01, 1.6, 0.01, 1.))), + slopesmob(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOPESMOOTHB"), 0.01, 1.6, 0.01, 1.))), + whitescie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGWHITESCIE"), -100, 100, 1, 0))), + blackscie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGBLACKSSCIE"), -100, 100, 1, 0))), + willBox(Gtk::manage(new Gtk::Box())), + illMethod(Gtk::manage(new MyComboBoxText())), + wprimBox(Gtk::manage(new Gtk::Box())), + primMethod(Gtk::manage(new MyComboBoxText())), + primCoordGridl(Gtk::manage(new Gtk::Grid())), + trcFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_TRCFRAME")))), + smoothFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CIE_SMOOTHFRAME")))), + primillFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_PRIMILLFRAME")))), + redBox(Gtk::manage(new ToolParamBlock())), + redxl(Gtk::manage(new Adjuster(M("TC_PRIM_REDX"), 0.41, 1.0, 0.0001, 0.7347))), + redyl(Gtk::manage(new Adjuster(M("TC_PRIM_REDY"), 0.0, 0.70, 0.0001, 0.2653))), + grexl(Gtk::manage(new Adjuster(M("TC_PRIM_GREX"), -0.1, 0.4, 0.0001, 0.1596))), + greyl(Gtk::manage(new Adjuster(M("TC_PRIM_GREY"), 0.50, 1.0, 0.0001, 0.8404))), + bluxl(Gtk::manage(new Adjuster(M("TC_PRIM_BLUX"), -0.1, 0.4, 0.0001, 0.0366))), + bluyl(Gtk::manage(new Adjuster(M("TC_PRIM_BLUY"), -0.1, 0.49, 0.0001, 0.0001))), + refi(Gtk::manage(new Adjuster(M("TC_PRIM_REFI"), -0.5, 1., 0.0001, 0.))), + + gridFramecie(Gtk::manage(new Gtk::Frame(M("TP_ICM_WORKING_CIEDIAG")))), + labgridcie(Gtk::manage(new LabGrid(EvlocallabGridciexy, M("TP_ICM_LABGRID_CIEXY"), true, true, false))), + colorFramecie(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_COLORFRAME")))), + + catBox(Gtk::manage(new Gtk::Box())), + catMethod(Gtk::manage(new MyComboBoxText())), + gamutcieBox(Gtk::manage(new Gtk::Box())), + gamutcie(Gtk::manage(new Gtk::CheckButton(M("TP_ICM_GAMUT")))), + shiftxl(Gtk::manage(new Adjuster(M("TC_LOCALLAB_PRIM_SHIFTX"), -0.20, 0.20, 0.0001, 0.))), + shiftyl(Gtk::manage(new Adjuster(M("TC_LOCALLAB_PRIM_SHIFTY"), -0.20, 0.20, 0.0001, 0.))), + bwcieBox(Gtk::manage(new Gtk::Box())), + bwcie(Gtk::manage(new Gtk::CheckButton(M("TP_ICM_BW")))), + sigmoidjzFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_SIGJZFRA")))), + sigmoid2Frame(Gtk::manage(new Gtk::Frame(M("")))), + sigcie(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_SIGCIE")))), 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"))))), + sigmoidthjzcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMOIDTH"), 0.1, 4., 0.01, 1., Gtk::manage(new RTImage("circle-black-small")), Gtk::manage(new RTImage("circle-white-small"))))), 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.))), @@ -7486,27 +8099,21 @@ Locallabcie::Locallabcie(): 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 ())), + detailcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DETAIL"), 0., 100., 0.1, 30.))), + detailciejz(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DETAIL"), 0., 100., 0.1, 30.))), + catadcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CATAD"), -100., 100., 0.5, 0., Gtk::manage(new RTImage("circle-blue-small")), Gtk::manage(new RTImage("circle-orange-small"))))), + surroundcie(Gtk::manage(new MyComboBoxText())), surrHBoxcie(Gtk::manage(new Gtk::Box())), + expgradcie(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_EXPGRAD")))), + strgradcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTR"), -4., 4., 0.05, 0.))), + anggradcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADANG"), -180, 180, 0.1, 0.))), + feathercie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FEATVALUE"), 10., 100., 0.1, 25.))), + 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")))), @@ -7517,24 +8124,99 @@ Locallabcie::Locallabcie(): 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")))), + enacieMaskall(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASKALL")))), // 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))), + struFramecie(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LABSTRUM")))), + strumaskcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRUMASKCOL"), 0., 200., 0.1, 0.))), + toolcie(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_TOOLCOL")))), + blurFramecie(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LABBLURM")))), + fftcieMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_FFTCOL_MASK")))), + contcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CONTCOL"), 0., 200., 0.5, 0.))), + blurcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLURCOL"), 0.2, 100., 0.5, 0.2))), 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.))), + highmaskcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_HIGHMASKCOL"), 0, 100, 1, 0))), + shadmaskcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SHAMASKCOL"), 0, 100, 1, 0))), + maskcieHCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, "")), + HHhmaskcieshape(static_cast(maskcieHCurveEditorG->addCurve(CT_Flat, "h(h)", nullptr, false, true))), mask2cieCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK2"))), - Lmaskcieshape(static_cast(mask2cieCurveEditorG->addCurve(CT_Diagonal, "L(L)"))) - - - { - set_orientation(Gtk::ORIENTATION_VERTICAL); + Lmaskcieshape(static_cast(mask2cieCurveEditorG->addCurve(CT_Diagonal, "L(L)"))), + wavFramecie(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_TOOLMASK_2")))), + mask2cieCurveEditorGwav(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_WAVMASK"))), + LLmaskcieshapewav(static_cast(mask2cieCurveEditorGwav->addCurve(CT_Flat, "L(L)", nullptr, false, false))), + quaHcieBox(Gtk::manage(new Gtk::Box())), + csThresholdcie(Gtk::manage(new ThresholdAdjuster(M("TP_LOCALLAB_CSTHRESHOLDBLUR"), 0, 9, 0, 0, 6, 5, 0, false))) + + +{ + auto m = ProcEventMapper::getInstance(); + Evlocallabpreviewcie = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_PREVIEWCIE"); + Evlocallabnormcie = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_NORM"); + Evlocallabstrumaskcie = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIEMASK_STRU"); + EvLocallabtoolcie = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL"); + EvLocallabfftcieMask = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIEMASK_BLURFFT"); + Evlocallabcontcie = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIEMASK_BLURCONT"); + Evlocallabblurcie = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIEMASK_BLURRAD"); + Evlocallabhighmaskcie = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIEMASK_HIGH"); + Evlocallabshadmaskcie = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIEMASK_SHAD"); + Evlocallabsigmoidsenscie = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_SIGADAP"); + EvlocallabLLmaskcieshapewav = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIEMASK_WLC"); + EvlocallabcsThresholdcie = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIEMASK_WLEV"); + Evlocallabcomprcie = m->newEvent(HDR, "HISTORY_MSG_LOCAL_CIE_BRICOMP"); + Evlocallabstrcielog = m->newEvent(HDR, "HISTORY_MSG_LOCAL_CIE_STRLOG"); + Evlocallabsatcie = m->newEvent(HDR, "HISTORY_MSG_LOCAL_CIE_SATCIE"); + Evlocallablogcieq = m->newEvent(HDR, "HISTORY_MSG_LOCAL_CIE_LOGCIEQ"); + Evlocallabcomprcieth = m->newEvent(HDR, "HISTORY_MSG_LOCAL_CIE_BRICOMPTH"); + EvlocallabHHhmaskcieshape = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIEMASK_CHH"); + EvlocallabbwevMethod = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_SIGMET"); + Evlocallabgamjcie = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_GAM"); + Evlocallabslopjcie = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_SLOP"); + Evlocallabmidtcie = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_MIDT"); + Evlocallabslopesmo = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_SLOPESMO"); + Evlocallabslopesmor = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_SLOPESMOR"); + Evlocallabslopesmog = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_SLOPESMOG"); + Evlocallabslopesmob = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_SLOPESMOB"); + Evlocallabsmoothcie = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_SMOOTH"); + Evlocallabsmoothcieyb = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_SMOOTHYB"); + Evlocallabsmoothcielum = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_SMOOTH_LUM"); + Evlocallabsigcie = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_SIG"); + Evlocallabillcie = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_ILL"); + Evlocallabprimcie = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_PRIM"); + Evlocallabcatcie = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_CAT"); + Evlocallabwhitescie = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_WHITES"); + Evlocallabblackscie = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_BLACKS"); + Evlocallabredxl = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_REDXL"); + Evlocallabredyl = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_REDYL"); + Evlocallabgrexl = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_GREXL"); + Evlocallabgreyl = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_GREYL"); + Evlocallabbluxl = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_BLUXL"); + Evlocallabbluyl = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_BLUYL"); + EvlocallabGridciexy = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_LABGRIDCIE"); + Evlocallabgamutcie = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_GAMUTCIE"); + Evlocallabbwcie = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_BWCIE"); + Evlocallabexpprecam = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_EXPPRECAM"); + Evlocallablightsigqcie = m->newEvent(AUTOEXP, ""); + Evlocallabcontsigqcie = m->newEvent(AUTOEXP, ""); + Evlocallabrefi = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_REFI"); + Evlocallabshiftxl = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_SHIFTXL"); + Evlocallabshiftyl = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_SHIFTYL"); + Evlocallabanggradcie = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_ANGGRAD"); + Evlocallabstrgradcie = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_STRGRAD"); + Evlocallabdetailciejz = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_DETAILJZ"); + EvlocallabenacieMaskall = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_ENAMASKALL"); + Evlocallabsmoothciemet = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_SMOOTHMET"); + Evlocallabfeathercie = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_FEATHERCIE"); + set_orientation(Gtk::ORIENTATION_VERTICAL); + // Parameter Ciecam specific widgets const LocallabParams::LocallabSpot defSpot; reparcie->setAdjusterListener(this); @@ -7542,90 +8224,298 @@ Locallabcie::Locallabcie(): pack_start(*sensicie); + pack_start(*previewcie); pack_start(*reparcie); - modeHBoxcam->set_spacing (2); + 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) ); + 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->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) ); + 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->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) ); + 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->append(M("TP_COLORAPP_SURROUND_EXDARK")); + sursourcie->append(M("TP_LOCALLAB_DISAB_CIECAM")); + 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); + + Gtk::Box *TittleVBoxcamscene; + TittleVBoxcamscene = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + TittleVBoxcamscene->set_spacing(2); + Gtk::Box* const LCTitleHBoxcamscene = Gtk::manage(new Gtk::Box()); + Gtk::Label* const LCLabelcamscene = Gtk::manage(new Gtk::Label()); + LCLabelcamscene->set_markup(Glib::ustring("") + (M("TP_LOCALLAB_LOGFRA")) + Glib::ustring("")); + LCTitleHBoxcamscene->pack_start(*LCLabelcamscene, Gtk::PACK_SHRINK); + TittleVBoxcamscene->pack_start(*LCTitleHBoxcamscene, Gtk::PACK_SHRINK); + expcamscene->setLabel(TittleVBoxcamscene); + + setExpandAlignProperties(expcamscene, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + + + + ToolParamBlock* const cieFBox = Gtk::manage(new ToolParamBlock()); cieFBox->pack_start(*Autograycie); cieFBox->pack_start(*sourceGraycie); cieFBox->pack_start(*sourceabscie); cieFBox->pack_start(*pqremapcam16); + cieFBox->pack_start(*whitescie); + cieFBox->pack_start(*blackscie); + 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); + 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); + 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); + 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); + sigmoidnormFrame->set_label_align(0.025, 0.5); + sigmoidnormFrame->set_label_widget(*normcie); + + + Gtk::Box *TittleVBoxprecam; + TittleVBoxprecam = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + TittleVBoxprecam->set_spacing(2); + Gtk::Box* const LCTitleHBoxprecam = Gtk::manage(new Gtk::Box()); + Gtk::Label* const LCLabelprecam = Gtk::manage(new Gtk::Label()); + LCLabelprecam->set_markup(Glib::ustring("") + (M("TP_LOCALLAB_SIGTRCCIE")) + Glib::ustring("")); + LCTitleHBoxprecam->pack_start(*LCLabelprecam, Gtk::PACK_SHRINK); + TittleVBoxprecam->pack_start(*LCTitleHBoxprecam, Gtk::PACK_SHRINK); + expprecam->setLabel(TittleVBoxprecam); + + setExpandAlignProperties(expprecam, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + sigmoid2Frame->set_label_align(0.025, 0.5); + //sigmoid2Frame->set_label_widget(*sigcie); + logcieFrame->set_label_align(0.025, 0.5); + logcieFrame->set_label_widget(*logcie); + Gtk::Label* illLabel = Gtk::manage(new Gtk::Label(M("TP_ICM_WORKING_ILLU") + ":")); + willBox->pack_start(*illLabel, Gtk::PACK_SHRINK); + willBox->pack_start(*illMethod, Gtk::PACK_EXPAND_WIDGET); + illMethod->append(M("TP_ICM_WORKING_ILLU_D41")); + illMethod->append(M("TP_ICM_WORKING_ILLU_D50")); + illMethod->append(M("TP_ICM_WORKING_ILLU_D55")); + illMethod->append(M("TP_ICM_WORKING_ILLU_D60")); + illMethod->append(M("TP_ICM_WORKING_ILLU_D65")); + illMethod->append(M("TP_ICM_WORKING_ILLU_D80")); + + illMethod->append(M("TP_ICM_WORKING_ILLU_D120")); + + illMethod->append(M("TP_ICM_WORKING_ILLU_STDA")); + illMethod->append(M("TP_ICM_WORKING_ILLU_2000")); + illMethod->append(M("TP_ICM_WORKING_ILLU_1500")); + illMethod->append(M("TP_ICM_WORKING_ILLU_E")); + + + illMethod->set_active(1); + illMethodconn = illMethod->signal_changed().connect(sigc::mem_fun(*this, &Locallabcie::illMethodChanged)); + + + Gtk::Label* primLabel = Gtk::manage(new Gtk::Label(M("TP_ICM_WORKING_PRIM") + ":")); + wprimBox->pack_start(*primLabel, Gtk::PACK_SHRINK); + wprimBox->pack_start(*primMethod, Gtk::PACK_EXPAND_WIDGET); + primMethod->append(M("TP_ICM_WORKING_PRIM_PROP")); + primMethod->append(M("TP_ICM_WORKING_PRIM_BET")); + primMethod->append(M("TP_ICM_WORKING_PRIM_WID")); + primMethod->append(M("TP_ICM_WORKING_PRIM_ACE")); + primMethod->append(M("TP_ICM_WORKING_PRIM_REC")); + primMethod->append(M("TP_ICM_WORKING_PRIM_ADOB")); + primMethod->append(M("TP_ICM_WORKING_PRIM_SRGB")); + primMethod->append(M("TP_ICM_WORKING_PRIM_JDCMAX")); + primMethod->append(M("TP_ICM_WORKING_PRIM_JDCMAXSTDA")); + primMethod->append(M("TP_ICM_WORKING_PRIM_AC0")); + primMethod->append(M("TP_ICM_WORKING_PRIM_BST")); + primMethod->append(M("TP_ICM_WORKING_PRIM_BRU")); + primMethod->append(M("TP_ICM_WORKING_PRIM_FREE")); + + primMethod->set_active(0); + primMethodconn = primMethod->signal_changed().connect(sigc::mem_fun(*this, &Locallabcie::primMethodChanged)); + trcFrame->set_label_align(0.025, 0.5); + smoothFrame->set_label_align(0.025, 0.5); + + primillFrame->set_label_align(0.025, 0.5); + setExpandAlignProperties(grexl, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + setExpandAlignProperties(greyl, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + setExpandAlignProperties(bluxl, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + setExpandAlignProperties(bluyl, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + setExpandAlignProperties(redxl, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + setExpandAlignProperties(redyl, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + + + primCoordGridl->set_column_homogeneous(true); + primCoordGridl->attach(*redxl, 0, 0, 1, 1); + primCoordGridl->attach_next_to(*redyl, *redxl, Gtk::PositionType::POS_RIGHT, 1, 1); + primCoordGridl->attach_next_to(*grexl, *redxl, Gtk::PositionType::POS_BOTTOM, 1, 1); + primCoordGridl->attach_next_to(*greyl, *grexl, Gtk::PositionType::POS_RIGHT, 1, 1); + primCoordGridl->attach_next_to(*bluxl, *grexl, Gtk::PositionType::POS_BOTTOM, 1, 1); + primCoordGridl->attach_next_to(*bluyl, *bluxl, Gtk::PositionType::POS_RIGHT, 1, 1); + + redBox->pack_start(*primCoordGridl, Gtk::PACK_EXPAND_WIDGET); + + + redxl->setAdjusterListener(this); + redyl->setAdjusterListener(this); + grexl->setAdjusterListener(this); + greyl->setAdjusterListener(this); + bluxl->setAdjusterListener(this); + bluyl->setAdjusterListener(this); + refi->setAdjusterListener(this); + shiftxl->setAdjusterListener(this); + shiftyl->setAdjusterListener(this); + + + gridFramecie->set_label_align(0.025, 0.5); + ToolParamBlock* const gridBox = Gtk::manage(new ToolParamBlock()); + gridBox->pack_start(*labgridcie); + gridFramecie->add(*gridBox); + + Gtk::Label* catLabel = Gtk::manage(new Gtk::Label(M("TP_ICM_WORKING_CAT") + ":")); + catBox->pack_start(*catLabel, Gtk::PACK_SHRINK); + catBox->pack_start(*catMethod, Gtk::PACK_EXPAND_WIDGET); + catMethod->append(M("TP_ICM_WORKING_CAT_BRAD")); + catMethod->append(M("TP_ICM_WORKING_CAT_CAT16")); + catMethod->append(M("TP_ICM_WORKING_CAT_CAT02")); + catMethod->append(M("TP_ICM_WORKING_CAT_VK")); + catMethod->append(M("TP_ICM_WORKING_CAT_XYZ")); + catMethod->set_active(0); + catMethodconn = catMethod->signal_changed().connect(sigc::mem_fun(*this, &Locallabcie::catMethodChanged)); + gamutcieBox->pack_start(*gamutcie, Gtk::PACK_EXPAND_WIDGET); + + gamutcieconn = gamutcie->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::gamutcieChanged)); + + ToolParamBlock* const signormBox = Gtk::manage(new ToolParamBlock()); + ToolParamBlock* const sigfraBox = Gtk::manage(new ToolParamBlock()); + + bwcieBox->pack_start(*bwcie, Gtk::PACK_EXPAND_WIDGET); + + bwcieconn = bwcie->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::bwcieChanged)); + + modeHBoxbwev->set_spacing(2); + ToolParamBlock* const gamcieBox = Gtk::manage(new ToolParamBlock()); + Gtk::Label* modeLabelbwev = Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_SIGMOIDQJ") + ":")); + modeHBoxbwev->pack_start(*modeLabelbwev, Gtk::PACK_SHRINK); + + bwevMethod->append(M("TP_LOCALLAB_BWEVNONE")); + bwevMethod->append(M("TP_LOCALLAB_BWEVSIG")); + bwevMethod->set_active(1); + bwevMethodConn = bwevMethod->signal_changed().connect(sigc::mem_fun(*this, &Locallabcie::bwevMethodChanged)); + modeHBoxbwev->pack_start(*bwevMethod); + + comprBox->pack_start(*comprcie); + comprBox->pack_start(*strcielog); + comprBox->pack_start(*satcie); + comprBox->pack_start(*logcieq); + logcieFrame->add(*comprBox); + gamcieBox->pack_start(*logcieFrame); + + ToolParamBlock* const trccieBox = Gtk::manage(new ToolParamBlock()); + ToolParamBlock* const smoothcieBox = Gtk::manage(new ToolParamBlock()); + ToolParamBlock* const primillBox = Gtk::manage(new ToolParamBlock()); + ToolParamBlock* const colorBox = Gtk::manage(new ToolParamBlock()); + + trccieBox->pack_start(*gamjcie); + trccieBox->pack_start(*slopjcie); + trccieBox->pack_start(*midtcie); + + smoothBox->pack_start(*smoothciemet, Gtk::PACK_EXPAND_WIDGET); + smoothciemet->append(M("TP_LOCALLAB_CIE_SMOOTH_NONE")); + smoothciemet->append(M("TP_LOCALLAB_CIE_SMOOTH_EV")); + smoothciemet->append(M("TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF")); + smoothciemet->append(M("TP_LOCALLAB_CIE_SMOOTH_GAMMA")); + smoothciemet->append(M("TP_LOCALLAB_CIE_SMOOTH_LEVELS")); + smoothciemet->set_active(0); + ciesmoothBox->pack_start(*smoothBox); + ciesmoothBox->pack_start(*slopesmo); + ciesmoothBox->pack_start(*slopesmor); + ciesmoothBox->pack_start(*slopesmog); + ciesmoothBox->pack_start(*slopesmob); + ciesmoothBox->pack_start(*smoothcielum); + ciesmoothBox->pack_start(*smoothcieyb); + ciesmoothBox->pack_start(*smoothcie); + + smoothciemetconn = smoothciemet->signal_changed().connect(sigc::mem_fun(*this, &Locallabcie::smoothciemetChanged)); + + smoothcieBox->pack_start(*ciesmoothBox); + smoothFrame->add(*smoothcieBox); + trccieBox->pack_start(*smoothFrame); + trcFrame->add(*trccieBox); + gamcieBox->pack_start(*trcFrame); + primillBox->pack_start(*willBox); + colorFramecie->set_label_align(0.025, 0.5); + + primillBox->pack_start(*wprimBox); + primillBox->pack_start(*redBox); + primillBox->pack_start(*gridFramecie); + primillBox->pack_start(*gamutcieBox); + primillBox->pack_start(*catBox); + colorBox->pack_start(*refi); + colorBox->pack_start(*shiftxl); + colorBox->pack_start(*shiftyl); + colorFramecie->add(*colorBox); + primillBox->pack_start(*bwcieBox); + primillBox->pack_start(*colorFramecie); + primillFrame->add(*primillBox); + gamcieBox->pack_start(*primillFrame); + + + + expprecam->add(*gamcieBox, false); + + + sigfraBox->pack_start(*sigmoidldacie); + sigfraBox->pack_start(*sigmoidthcie); + sigfraBox->pack_start(*sigmoidsenscie); + sigfraBox->pack_start(*modeHBoxbwev); + sigmoid2Frame->add(*sigfraBox); + sigBox->pack_start(*sigmoid2Frame); + + signormBox->pack_start(*sigmoidblcie); + sigmoidnormFrame->add(*signormBox); + sigBox->pack_start(*sigmoidnormFrame); + sigmoidFrame->add(*sigBox); - cieFBox->pack_start(*sigmoidFrame); sigmoidjzFrame->set_label_align(0.025, 0.5); @@ -7636,13 +8526,17 @@ Locallabcie::Locallabcie(): 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); + + cieFBox->pack_start(*surHBoxcie); + + + expcamscene->add(*cieFBox, false); + + pack_start(*expcamscene, false, false); + pack_start(*expprecam, false, false); + ToolParamBlock* const jzallBox = Gtk::manage(new ToolParamBlock()); Gtk::Box *TittleVBoxjz; @@ -7659,61 +8553,53 @@ Locallabcie::Locallabcie(): 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.) ); + 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); + 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); + 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)) ); + 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); + 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->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); + 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->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP")); LHshapejz->setCurveColorProvider(this, 3); LHshapejz->setBottomBarBgGradient(six_shape); jz2CurveEditorG->curveListComplete(); @@ -7722,19 +8608,17 @@ Locallabcie::Locallabcie(): 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); @@ -7743,6 +8627,7 @@ Locallabcie::Locallabcie(): ToolParamBlock* const ciePzlightBox = Gtk::manage(new ToolParamBlock()); ciePzlightBox->pack_start(*lightjzcie); ciePzlightBox->pack_start(*contjzcie); + ciePzlightBox->pack_start(*detailciejz); czlightFrame->add(*ciePzlightBox); jzBox->pack_start(*czlightFrame); @@ -7752,7 +8637,7 @@ Locallabcie::Locallabcie(): 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()); @@ -7763,22 +8648,12 @@ Locallabcie::Locallabcie(): 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); @@ -7812,7 +8687,7 @@ Locallabcie::Locallabcie(): 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); @@ -7821,17 +8696,26 @@ Locallabcie::Locallabcie(): 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)); + comprcieautoconn = comprcieauto->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::comprcieautoChanged)); + normcieconn = normcie->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::normcieChanged)); + expprecamconn = expprecam->signal_enabled_toggled().connect(sigc::mem_fun(*this, &Locallabcie::expprecamChanged)); + + sigcieconn = sigcie->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::sigcieChanged)); logcieconn = logcie->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::logcieChanged)); + satcieconn = satcie->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::satcieChanged)); + logcieqconn = logcieq->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::logcieqChanged)); + smoothcieconn = smoothcie->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::smoothcieChanged)); + smoothcieybconn = smoothcieyb->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::smoothcieybChanged)); + smoothcielumconn = smoothcielum->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::smoothcielumChanged)); 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)); @@ -7857,40 +8741,39 @@ Locallabcie::Locallabcie(): cieCurveEditorG->setCurveListener(this); - toneMethodcie->append (M ("TP_COLORAPP_TCMODE_LIGHTNESS")); - toneMethodcie->append (M ("TP_COLORAPP_TCMODE_BRIGHTNESS")); - toneMethodcie->set_active (0); + 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); + 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); + 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); - + 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)) ); + 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->setBottomBarBgGradient(shape2Milestones); + shapecie2->setLeftBarBgGradient(shape2Milestones); + + shapecie2->setRangeDefaultMilestones(0.05, 0.2, 0.58); - shapecie2->setRangeDefaultMilestones (0.05, 0.2, 0.58); - cieCurveEditorG2->curveListComplete(); @@ -7905,12 +8788,14 @@ Locallabcie::Locallabcie(): lightjzcie->setAdjusterListener(this); lightqcie->setAdjusterListener(this); + lightsigqcie->setAdjusterListener(this); contlcie->setAdjusterListener(this); contjzcie->setAdjusterListener(this); adapjzcie->setAdjusterListener(this); jz100->setAdjusterListener(this); pqremap->setAdjusterListener(this); pqremapcam16->setAdjusterListener(this); + pqremapcam16->setLogScale(500, 100); hljzcie->setAdjusterListener(this); hlthjzcie->setAdjusterListener(this); shjzcie->setAdjusterListener(this); @@ -7925,23 +8810,24 @@ Locallabcie::Locallabcie(): targetjz->setLogScale(10, 18, true); sigmoidldacie->setAdjusterListener(this); sigmoidthcie->setAdjusterListener(this); + sigmoidsenscie->setAdjusterListener(this); sigmoidblcie->setAdjusterListener(this); + comprcie->setAdjusterListener(this); + strcielog->setAdjusterListener(this); + comprcieth->setAdjusterListener(this); + gamjcie->setAdjusterListener(this); + slopjcie->setAdjusterListener(this); + slopjcie->setLogScale(100, 1); + midtcie->setAdjusterListener(this); + whitescie->setAdjusterListener(this); + blackscie->setAdjusterListener(this); sigmoidldajzcie->setAdjusterListener(this); sigmoidthjzcie->setAdjusterListener(this); sigmoidbljzcie->setAdjusterListener(this); contqcie->setAdjusterListener(this); + contsigqcie->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); @@ -7949,8 +8835,13 @@ Locallabcie::Locallabcie(): targabscie->setAdjusterListener(this); detailcie->setAdjusterListener(this); + detailciejz->setAdjusterListener(this); catadcie->setAdjusterListener(this); + slopesmo->setAdjusterListener(this); + slopesmor->setAdjusterListener(this); + slopesmog->setAdjusterListener(this); + slopesmob->setAdjusterListener(this); Gtk::Box *TittleVBoxcam16; TittleVBoxcam16 = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); @@ -7964,17 +8855,29 @@ Locallabcie::Locallabcie(): 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) ); + + Gtk::Box *TittleVBoxcamviewing; + TittleVBoxcamviewing = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + TittleVBoxcamviewing->set_spacing(2); + Gtk::Box* const LCTitleHBoxcamviewing = Gtk::manage(new Gtk::Box()); + Gtk::Label* const LCLabelcamviewing = Gtk::manage(new Gtk::Label()); + LCLabelcamviewing->set_markup(Glib::ustring("") + (M("TP_LOCALLAB_LOG2FRA")) + Glib::ustring("")); + LCTitleHBoxcamviewing->pack_start(*LCLabelcamviewing, Gtk::PACK_SHRINK); + TittleVBoxcamviewing->pack_start(*LCTitleHBoxcamviewing, Gtk::PACK_SHRINK); + expcamviewing->setLabel(TittleVBoxcamviewing); + + setExpandAlignProperties(expcamviewing, 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->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); @@ -7984,13 +8887,19 @@ Locallabcie::Locallabcie(): ToolParamBlock* const cieP1lightBox = Gtk::manage(new ToolParamBlock()); cieP1lightBox->pack_start(*lightlcie); cieP1lightBox->pack_start(*lightqcie); + cieP1lightBox->pack_start(*lightsigqcie); 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(*contsigqcie); cieP1contBox->pack_start(*contthrescie); + + contsigqcie->hide(); + lightsigqcie->hide(); + cie1contFrame->add(*cieP1contBox); cieP1Box->pack_start(*cie1contFrame); ToolParamBlock* const cieP1colorBox = Gtk::manage(new ToolParamBlock()); @@ -8001,67 +8910,49 @@ Locallabcie::Locallabcie(): 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); - */ + cieP1Box->pack_start(*sigmoidFrame);//disable provisory Sigmoid + + 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); + + 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); + + expcamviewing->add(*cieP2Box, false); + + pack_start(*expcamviewing, false, false); + recothrescie->setAdjusterListener(this); lowthrescie->setAdjusterListener(this); higthrescie->setAdjusterListener(this); decaycie->setAdjusterListener(this); + + setExpandAlignProperties(expgradcie, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + setExpandAlignProperties(exprecovcie, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); setExpandAlignProperties(expmaskcie, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + previewcie->set_active(false); + previewcieConn = previewcie->signal_clicked().connect( + sigc::mem_fun( + *this, &Locallabcie::previewcieChanged)); + showmaskcieMethod->append(M("TP_LOCALLAB_SHOWMNONE")); showmaskcieMethod->append(M("TP_LOCALLAB_SHOWMODIF")); showmaskcieMethod->append(M("TP_LOCALLAB_SHOWMODIFMASK")); @@ -8070,8 +8961,9 @@ Locallabcie::Locallabcie(): 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)); + enacieMaskallConn = enacieMaskall->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::enacieMaskallChanged)); maskcieCurveEditorG->setCurveListener(this); CCmaskcieshape->setIdentityValue(0.); @@ -8088,12 +8980,35 @@ Locallabcie::Locallabcie(): HHmaskcieshape->setBottomBarColorProvider(this, 2); maskcieCurveEditorG->curveListComplete(); + + struFramecie->set_label_align(0.025, 0.5); + + strumaskcie->setAdjusterListener(this); + + toolcieConn = toolcie->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::toolcieChanged)); + + blurFramecie->set_label_align(0.025, 0.5); + + fftcieMaskConn = fftcieMask->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::fftcieMaskChanged)); + + contcie->setAdjusterListener(this); + + blurcie->setAdjusterListener(this); + blendmaskcie->setAdjusterListener(this); radmaskcie->setAdjusterListener(this); lapmaskcie->setAdjusterListener(this); gammaskcie->setAdjusterListener(this); slomaskcie->setAdjusterListener(this); + highmaskcie->setAdjusterListener(this); + shadmaskcie->setAdjusterListener(this); + maskcieHCurveEditorG->setCurveListener(this); + HHhmaskcieshape->setIdentityValue(0.); + HHhmaskcieshape->setResetCurve(FlatCurveType(defSpot.HHhmaskciecurve.at(0)), defSpot.HHhmaskciecurve); + HHhmaskcieshape->setCurveColorProvider(this, 2); + HHhmaskcieshape->setBottomBarColorProvider(this, 2); + maskcieHCurveEditorG->curveListComplete(); chromaskcie->setAdjusterListener(this); mask2cieCurveEditorG->setCurveListener(this); @@ -8104,6 +9019,26 @@ Locallabcie::Locallabcie(): mask2cieCurveEditorG->curveListComplete(); + mask2cieCurveEditorGwav->setCurveListener(this); + + LLmaskcieshapewav->setIdentityValue(0.); + LLmaskcieshapewav->setResetCurve(FlatCurveType(defSpot.LLmaskciecurvewav.at(0)), defSpot.LLmaskciecurvewav); + LLmaskcieshapewav->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + mask2cieCurveEditorGwav->curveListComplete(); + csThresholdcie->setAdjusterListener(this); + + + strgradcie->setAdjusterListener(this); + anggradcie->setAdjusterListener(this); + feathercie->setAdjusterListener(this); + ToolParamBlock* const cieBoxgrad = Gtk::manage(new ToolParamBlock()); + cieBoxgrad->pack_start(*strgradcie); + cieBoxgrad->pack_start(*anggradcie); + cieBoxgrad->pack_start(*feathercie); + expgradcie->add(*cieBoxgrad, false); + pack_start(*expgradcie, false, false); + ToolParamBlock* const cieBox3 = Gtk::manage(new ToolParamBlock()); cieBox3->pack_start(*maskusablecie, Gtk::PACK_SHRINK, 0); cieBox3->pack_start(*maskunusablecie, Gtk::PACK_SHRINK, 0); @@ -8117,20 +9052,54 @@ Locallabcie::Locallabcie(): 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(*enacieMaskall, Gtk::PACK_SHRINK, 0); maskcieBox->pack_start(*maskcieCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + ToolParamBlock* const strumBoxcie = Gtk::manage(new ToolParamBlock()); + strumBoxcie->pack_start(*strumaskcie); + strumBoxcie->pack_start(*toolcie); + struFramecie->add(*strumBoxcie); + maskcieBox->pack_start(*struFramecie, Gtk::PACK_SHRINK, 0); + ToolParamBlock* const blurcieBox = Gtk::manage(new ToolParamBlock()); + blurcieBox->pack_start(*fftcieMask, Gtk::PACK_SHRINK, 0); + blurcieBox->pack_start(*contcie); + blurcieBox->pack_start(*blurcie); + blurFramecie->add(*blurcieBox); + maskcieBox->pack_start(*blurFramecie, Gtk::PACK_SHRINK, 0); + 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(*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(*highmaskcie, Gtk::PACK_SHRINK, 0); + maskcieBox->pack_start(*shadmaskcie, Gtk::PACK_SHRINK, 0); + maskcieBox->pack_start(*maskcieHCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + maskcieBox->pack_start(*mask2cieCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + wavFramecie->set_label_align(0.025, 0.5); + ToolParamBlock* const toolcieBox2 = Gtk::manage(new ToolParamBlock()); + toolcieBox2->pack_start(*mask2cieCurveEditorGwav, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + toolcieBox2->pack_start(*csThresholdcie, Gtk::PACK_SHRINK, 0); + wavFramecie->add(*toolcieBox2); + maskcieBox->pack_start(*wavFramecie); + + expmaskcie->add(*maskcieBox, false); pack_start(*expmaskcie, false, false); - - - } + + +} + +void Locallabcie::setListener(ToolPanelListener* tpl) +{ + LocallabTool::setListener(tpl); + + // labgridcie->setListener(tpl); +} + + Locallabcie::~Locallabcie() { delete jz1CurveEditorG; @@ -8139,9 +9108,10 @@ Locallabcie::~Locallabcie() delete cieCurveEditorG; delete cieCurveEditorG2; delete maskcieCurveEditorG; + delete maskcieHCurveEditorG; delete mask2cieCurveEditorG; delete LocalcurveEditorwavjz; - + delete mask2cieCurveEditorGwav; } bool Locallabcie::isMaskViewActive() @@ -8160,7 +9130,63 @@ void Locallabcie::resetMaskView() 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(); + cieMask = showmaskcieMethod->get_active_row_number(); +} + +Gtk::ToggleButton *Locallabcie::getPreviewDeltaEButton() const +{ + return previewcie; +} + +sigc::connection *Locallabcie::getPreviewDeltaEButtonConnection() +{ + return &previewcieConn; +} + +//new function Global +void Locallabcie::updateguicie(int spottype) +{ + { + idle_register.add( + [this, spottype]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update GUI fullimage or main + disableListener(); + + if(spottype == 3) { + sensicie->hide(); + showmaskcieMethod->set_active(0); + previewcie->hide(); + previewcie->set_active(false); + resetMaskView(); + } else { + sensicie->show(); + previewcie->show(); + } + enableListener(); + + return false; + } + ); + } + +} + +void Locallabcie::previewcieChanged() +{ + + if(previewcie->get_active()) { + showmaskcieMethod->set_active(4); + } else { + showmaskcieMethod->set_active(0); + } + + if (isLocActivated) { + if (listener) { + listener->panelChanged(Evlocallabpreviewcie,""); + } + } } void Locallabcie::setDefaultExpanderVisibility() @@ -8168,19 +9194,28 @@ void Locallabcie::setDefaultExpanderVisibility() expLcie->set_expanded(false); expjz->set_expanded(false); expwavjz->set_expanded(false); + expcamscene->set_expanded(false); expcam16->set_expanded(false); + expcamviewing->set_expanded(false); + expprecam->set_expanded(false); expmaskcie->set_expanded(false); exprecovcie->set_expanded(false); + expgradcie->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")); + // cieFrame->set_tooltip_text(M("TP_LOCALLAB_LOGSCENE_TOOLTIP")); + expcamscene->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")); + logcie->set_tooltip_text(M("TP_LOCALLAB_LOGCIE_TOOLTIP")); + logcieq->set_tooltip_text(M("TP_LOCALLAB_LOGCIEQ_TOOLTIP")); + smoothcie->set_tooltip_text(M("TP_LOCALLAB_SMOOTHCIE_TOOLTIP")); + slopesmo->set_tooltip_text(M("TP_LOCALLAB_SMOOTHCIE_TOOLTIP")); + smoothciemet->set_tooltip_text(M("TP_LOCALLAB_SMOOTHCIE_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")); @@ -8202,7 +9237,7 @@ void Locallabcie::updateAdviceTooltips(const bool showTooltips) 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")); + sigmoidFrame->set_tooltip_text(M("TP_LOCALLAB_SIGMOID16_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")); @@ -8217,7 +9252,8 @@ void Locallabcie::updateAdviceTooltips(const bool showTooltips) 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")); + // cie2Frame->set_tooltip_text(M("TP_LOCALLAB_LOGVIEWING_TOOLTIP")); + expcamviewing->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")); @@ -8228,16 +9264,41 @@ void Locallabcie::updateAdviceTooltips(const bool showTooltips) 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")); - + // expgradcie->set_tooltip_markup(M("TP_LOCALLAB_MASKRESH_TOOLTIP")); + strumaskcie->set_tooltip_text(M("TP_LOCALLAB_STRUSTRMASK_TOOLTIP")); + fftcieMask->set_tooltip_text(M("TP_LOCALLAB_FFTMASK_TOOLTIP")); + contcie->set_tooltip_text(M("TP_LOCALLAB_CONTTHMASK_TOOLTIP")); + blurcie->set_tooltip_text(M("TP_LOCALLAB_BLURRMASK_TOOLTIP")); + LLmaskcieshapewav->setTooltip(M("TP_LOCALLAB_LMASK_LEVEL_TOOLTIP")); + maskcieHCurveEditorG->set_tooltip_text(M("TP_LOCALLAB_HHMASK_TOOLTIP")); + comprcieth->set_tooltip_text(M("TP_LOCALLAB_SIGMOIDQJCOMPRCIE_TOOLTIP")); + gamjcie->set_tooltip_text(M("TP_LOCALLAB_PRECAM_TOOLTIP")); + slopjcie->set_tooltip_text(M("TP_LOCALLAB_PRECAM_TOOLTIP")); + trcFrame->set_tooltip_text(M("TP_LOCALLAB_PRECAM_TOOLTIP")); + midtcie->set_tooltip_text(M("TP_LOCALLAB_PRECAM_TOOLTIP")); + whitescie->set_tooltip_text(M("TP_LOCALLAB_SIGMOIDWHITESCIE_TOOLTIP")); + blackscie->set_tooltip_text(M("TP_LOCALLAB_SIGMOIDWHITESCIE_TOOLTIP")); + normcie->set_tooltip_text(M("TP_LOCALLAB_SIGMOIDNORMCIE_TOOLTIP")); + sigmoidblcie->set_tooltip_text(M("TP_LOCALLAB_SIGMOIDNORMCIEBLEND_TOOLTIP")); + catBox->set_tooltip_text(M("TP_ICM_WORKING_CAT_TOOLTIP")); + wprimBox->set_tooltip_text(M("TP_ICM_WORKING_PRIM_TOOLTIP")); + expprecam->set_tooltip_text(M("TP_LOCALLAB_PRECAM_TOOLTIP")); + refi->set_tooltip_text(M("TP_LOCALLAB_PRECAMREFI_TOOLTIP")); + colorFramecie->set_tooltip_text(M("TP_LOCALLAB_PRECAMREFIMAIN_TOOLTIP")); + gamutcie->set_tooltip_text(M("TP_LOCALLAB_PRECAMGAMUT_TOOLTIP")); + shiftxl->set_tooltip_text(M("TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP")); + shiftyl->set_tooltip_text(M("TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP")); } else { reparcie->set_tooltip_text(""); recothrescie->set_tooltip_text(""); - cieFrame->set_tooltip_text(""); + // cieFrame->set_tooltip_text(""); + expcamscene->set_tooltip_text(""); PQFrame->set_tooltip_text(""); modecam->set_tooltip_text(""); qtoj->set_tooltip_text(""); logcie->set_tooltip_text(""); + logcieq->set_tooltip_text(""); jabcie->set_tooltip_text(""); adapjzcie->set_tooltip_text(""); jz100->set_tooltip_text(""); @@ -8266,7 +9327,8 @@ void Locallabcie::updateAdviceTooltips(const bool showTooltips) targetGraycie->set_tooltip_text(""); detailcie->set_tooltip_text(""); catadcie->set_tooltip_text(""); - cie2Frame->set_tooltip_text(""); + // cie2Frame->set_tooltip_text(""); + expcamviewing->set_tooltip_text(""); sensicie->set_tooltip_text(""); CCmaskcieshape->setTooltip(""); LLmaskcieshape->setTooltip(""); @@ -8277,6 +9339,7 @@ void Locallabcie::updateAdviceTooltips(const bool showTooltips) mask2cieCurveEditorG->set_tooltip_text(""); Lmaskcieshape->setTooltip(""); exprecovcie->set_tooltip_markup(""); + expgradcie->set_tooltip_markup(""); sigmalcjz->set_tooltip_text(""); clarilresjz->set_tooltip_text(""); claricresjz->set_tooltip_text(""); @@ -8285,6 +9348,32 @@ void Locallabcie::updateAdviceTooltips(const bool showTooltips) wavshapejz->setTooltip(""); LocalcurveEditorwavjz->set_tooltip_markup(""); csThresholdjz->set_tooltip_markup(""); + strumaskcie->set_tooltip_text(""); + fftcieMask->set_tooltip_text(""); + contcie->set_tooltip_text(""); + blurcie->set_tooltip_text(""); + LLmaskcieshapewav->setTooltip(""); + maskcieHCurveEditorG->set_tooltip_text(""); + comprcieth->set_tooltip_text(""); + gamjcie->set_tooltip_text(""); + slopjcie->set_tooltip_text(""); + trcFrame->set_tooltip_text(""); + midtcie->set_tooltip_text(""); + smoothcie->set_tooltip_text(""); + slopesmo->set_tooltip_text(""); + smoothciemet->set_tooltip_text(""); + whitescie->set_tooltip_text(""); + blackscie->set_tooltip_text(""); + normcie->set_tooltip_text(""); + sigmoidblcie->set_tooltip_text(""); + catBox->set_tooltip_text(""); + expprecam->set_tooltip_text(""); + wprimBox->set_tooltip_text(""); + refi->set_tooltip_text(""); + gamutcie->set_tooltip_text(""); + colorFramecie->set_tooltip_text(""); + shiftxl->set_tooltip_text(""); + shiftyl->set_tooltip_text(""); } } @@ -8296,20 +9385,38 @@ void Locallabcie::disableListener() forcebwConn.block(true); qtojConn.block(true); jabcieConn.block(true); - sigmoidqjcieconn.block(true); + comprcieautoconn.block(true); + normcieconn.block(true); + expprecamconn.block(true); + gamutcieconn.block(true); + bwcieconn.block(true); + primMethodconn.block(true); + illMethodconn.block(true); + smoothciemetconn.block(true); + catMethodconn.block(true); + sigcieconn.block(true); logcieconn.block(true); + satcieconn.block(true); + logcieqconn.block(true); + smoothcieconn.block(true); + smoothcieybconn.block(true); + smoothcielumconn.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); + sursourcieconn.block(true); + surroundcieconn.block(true); + modecieconn.block(true); + modecamconn.block(true); + bwevMethodConn.block(true); toneMethodcieConn.block(true); toneMethodcieConn2.block(true); showmaskcieMethodConn.block(true); + toolcieConn.block(true); enacieMaskConn.block(true); + enacieMaskallConn.block(true); + fftcieMaskConn.block(true); } void Locallabcie::enableListener() @@ -8320,20 +9427,38 @@ void Locallabcie::enableListener() forcebwConn.block(false); qtojConn.block(false); jabcieConn.block(false); - sigmoidqjcieconn.block(false); + comprcieautoconn.block(false); + normcieconn.block(false); + expprecamconn.block(false); + gamutcieconn.block(false); + bwcieconn.block(false); + primMethodconn.block(false); + illMethodconn.block(false); + smoothciemetconn.block(false); + catMethodconn.block(false); + sigcieconn.block(false); logcieconn.block(false); + satcieconn.block(false); + logcieqconn.block(false); + smoothcieconn.block(false); + smoothcieybconn.block(false); + smoothcielumconn.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); + sursourcieconn.block(false); + surroundcieconn.block(false); + modecieconn.block(false); + modecamconn.block(false); + bwevMethodConn.block(false); toneMethodcieConn.block(false); toneMethodcieConn2.block(false); showmaskcieMethodConn.block(false); + toolcieConn.block(false); enacieMaskConn.block(false); + enacieMaskallConn.block(false); + fftcieMaskConn.block(false); } void Locallabcie::showmaskcieMethodChanged() @@ -8345,7 +9470,7 @@ void Locallabcie::showmaskcieMethodChanged() locToolListener->resetOtherMaskView(this); } - if(exp->getEnabled()) { + if (exp->getEnabled()) { if (listener) { listener->panelChanged(EvlocallabshowmaskMethod, ""); } @@ -8364,7 +9489,7 @@ void Locallabcie::enacieMaskChanged() maskusablecie->hide(); maskunusablecie->show(); } - + if (isLocActivated && exp->getEnabled()) { if (listener) { if (enacieMask->get_active()) { @@ -8378,12 +9503,117 @@ void Locallabcie::enacieMaskChanged() } } + +void Locallabcie::enacieMaskallChanged2() +{ + const LocallabParams::LocallabSpot defSpot; + + // if (modecam->get_active_row_number() == 1) { + if(!enacieMaskall->get_active()) { + lapmaskcie->setValue(defSpot.lapmaskcie); + gammaskcie->setValue(defSpot.gammaskcie); + slomaskcie->setValue(defSpot.slomaskcie); + highmaskcie->setValue(defSpot.highmaskcie); + shadmaskcie->setValue(defSpot.shadmaskcie); + HHhmaskcieshape->setCurve(defSpot.HHhmaskciecurve); + strumaskcie->setValue(defSpot.strumaskcie); + toolcie->set_active(defSpot.toolcie); + fftcieMask->set_active(defSpot.fftcieMask); + LLmaskcieshapewav->setCurve(defSpot.LLmaskciecurvewav); + lapmaskcie->hide(); + gammaskcie->hide(); + slomaskcie->hide(); + highmaskcie->hide(); + shadmaskcie->hide(); + maskcieHCurveEditorG->hide(); + struFramecie->hide(); + blurFramecie->hide(); + strumaskcie->hide(); + contcie->setValue(defSpot.contcie); + blurcie->setValue(defSpot.blurcie); + + toolcie->hide(); + fftcieMask->hide(); + mask2cieCurveEditorGwav->hide(); + wavFramecie->hide(); + } else { + lapmaskcie->show(); + gammaskcie->show(); + slomaskcie->show(); + highmaskcie->show(); + shadmaskcie->show(); + maskcieHCurveEditorG->show(); + struFramecie->show(); + blurFramecie->show(); + strumaskcie->show(); + toolcie->show(); + fftcieMask->show(); + mask2cieCurveEditorGwav->show(); + wavFramecie->show(); + } + // } +} + +void Locallabcie::enacieMaskallChanged() +{ + + enacieMaskallChanged2(); + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (enacieMaskall->get_active()) { + listener->panelChanged(EvlocallabenacieMaskall, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvlocallabenacieMaskall, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + + + +void Locallabcie::toolcieChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (toolcie->get_active()) { + listener->panelChanged(EvLocallabtoolcie, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocallabtoolcie, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + + +void Locallabcie::fftcieMaskChanged() +{ + // updateColorGUI3(); // Update GUI according to fftColorMash button state + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (fftcieMask->get_active()) { + listener->panelChanged(EvLocallabfftcieMask, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocallabfftcieMask, + 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; + Glib::ustring prof = pp->icm.workingProfile; if (index < (int)pp->locallab.spots.size()) { const LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); @@ -8391,28 +9621,25 @@ void Locallabcie::read(const rtengine::procparams::ProcParams* pp, const ParamsE exp->set_visible(spot.visicie); exp->setEnabled(spot.expcie); complexity->set_active(spot.complexcie); + expprecam->setEnabled(spot.expprecam); reparcie->setValue(spot.reparcie); sensicie->setValue(spot.sensicie); if (spot.modecam == "cam16") { - modecam->set_active (0); + 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); + modecam->set_active(1); } if (spot.modecie == "com") { - modecie->set_active (0); + modecie->set_active(0); } else if (spot.modecie == "tm") { - modecie->set_active (1); + modecie->set_active(1); } else if (spot.modecie == "wav") { - modecie->set_active (2); + modecie->set_active(2); } else if (spot.modecie == "dr") { - modecie->set_active (3); + modecie->set_active(3); // } else if (spot.modecie == "log") { // modecie->set_active (4); } @@ -8430,53 +9657,176 @@ void Locallabcie::read(const rtengine::procparams::ProcParams* pp, const ParamsE } 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); + comprcieauto->set_active(spot.comprcieauto); + + if (Autograycie->get_active()) { + comprcieauto->set_active(true); + } + + if (spot.smoothciemet == "none") { + smoothciemet->set_active(0); + } else if (spot.smoothciemet == "Ev") { + smoothciemet->set_active(1); + } else if (spot.smoothciemet == "gam") { + smoothciemet->set_active(2); + } else if (spot.smoothciemet == "gamnorol") { + smoothciemet->set_active(3); + } else if (spot.smoothciemet == "level") { + smoothciemet->set_active(4); + } + + + if (spot.illMethod == "d41") { + illMethod->set_active(0); + } else if (spot.illMethod == "d50") { + illMethod->set_active(1); + } else if (spot.illMethod == "d55") { + illMethod->set_active(2); + } else if (spot.illMethod == "d60") { + illMethod->set_active(3); + } else if (spot.illMethod == "d65") { + illMethod->set_active(4); + } else if (spot.illMethod == "d80") { + illMethod->set_active(5); + } else if (spot.illMethod == "d120") { + illMethod->set_active(6); + } else if (spot.illMethod == "stda") { + illMethod->set_active(7); + } else if (spot.illMethod == "T2000") { + illMethod->set_active(8); + } else if (spot.illMethod == "T1500") { + illMethod->set_active(9); + } else if (spot.illMethod == "iE") { + illMethod->set_active(10); + } + + illMethod->set_sensitive(false); + + if (spot.primMethod == "pro") { + primMethod->set_active(0); + illMethod->set_active(1); + } else if (spot.primMethod == "beta") { + primMethod->set_active(1); + illMethod->set_active(1); + } else if (spot.primMethod == "wid") { + primMethod->set_active(2); + illMethod->set_active(1); + } else if (spot.primMethod == "ac1") { + primMethod->set_active(3); + illMethod->set_active(3); + } else if (spot.primMethod == "rec") { + primMethod->set_active(4); + illMethod->set_active(4); + } else if (spot.primMethod == "ado") { + primMethod->set_active(5); + illMethod->set_active(4); + } else if (spot.primMethod == "srgb") { + primMethod->set_active(6); + illMethod->set_active(4); + } else if (spot.primMethod == "jdcmax") { + primMethod->set_active(7); + illMethod->set_active(1); + } else if (spot.primMethod == "jdcmaxstdA") { + primMethod->set_active(8); + illMethod->set_active(7); + } else if (spot.primMethod == "ac0") { + primMethod->set_active(9); + illMethod->set_active(3); + } else if (spot.primMethod == "best") { + primMethod->set_active(10); + illMethod->set_active(1); + } else if (spot.primMethod == "bru") { + primMethod->set_active(11); + illMethod->set_active(4); + } else if (spot.primMethod == "free") { + primMethod->set_active(12); + illMethod->set_sensitive(true); + + } + + if (spot.catMethod == "brad") { + catMethod->set_active(0); + } else if (spot.catMethod == "cat16") { + catMethod->set_active(1); + } else if (spot.catMethod == "cat02") { + catMethod->set_active(2); + } else if (spot.catMethod == "vky") { + catMethod->set_active(3); + } else if (spot.catMethod == "xyz") { + catMethod->set_active(4); + } + + + normcie->set_active(spot.normcie); + gamutcie->set_active(spot.gamutcie); + bwcie->set_active(spot.bwcie); + sigcie->set_active(spot.sigcie); logcie->set_active(spot.logcie); + satcie->set_active(spot.satcie); + logcieq->set_active(spot.logcieq); + smoothcie->set_active(spot.smoothcie); + smoothcieyb->set_active(spot.smoothcieyb); + smoothcielum->set_active(spot.smoothcielum); 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); + sursourcieChanged(); + bwevMethodChanged(); + normcieChanged(); + expprecamChanged(); + gamutcieChanged(); + bwcieChanged(); + sigcieChanged(); + comprcieautoChanged(); + sigqChanged(); + logcieChanged(); + satcieChanged(); + logcieqChanged(); + smoothcieChanged(); + smoothcieybChanged(); + smoothcielumChanged(); + primMethodChanged(); + illMethodChanged(); + smoothciemetChanged(); + + if (spot.bwevMethod == "none") { + bwevMethod->set_active(0); + } else if (spot.bwevMethod == "sig") { + bwevMethod->set_active(1); } - 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); + 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); + } else if (spot.sursourcie == "exDark") { + sursourcie->set_active(3); + } else if (spot.sursourcie == "disacie") { + sursourcie->set_active(4); } + + + 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); + } + shapecie->setCurve(spot.ciecurve); shapecie2->setCurve(spot.ciecurve2); @@ -8500,8 +9850,10 @@ void Locallabcie::read(const rtengine::procparams::ProcParams* pp, const ParamsE lightlcie->setValue(spot.lightlcie); lightjzcie->setValue(spot.lightjzcie); lightqcie->setValue(spot.lightqcie); + lightsigqcie->setValue(spot.lightsigqcie); contlcie->setValue(spot.contlcie); contjzcie->setValue(spot.contjzcie); + detailciejz->setValue(spot.detailciejz); adapjzcie->setValue(spot.adapjzcie); jz100->setValue(spot.jz100); pqremap->setValue(spot.pqremap); @@ -8523,27 +9875,59 @@ void Locallabcie::read(const rtengine::procparams::ProcParams* pp, const ParamsE targetjz->setValue(spot.targetjz); sigmoidldacie->setValue(spot.sigmoidldacie); sigmoidthcie->setValue(spot.sigmoidthcie); + sigmoidsenscie->setValue(spot.sigmoidsenscie); sigmoidblcie->setValue(spot.sigmoidblcie); + comprcie->setValue(spot.comprcie); + strcielog->setValue(spot.strcielog); + comprcieth->setValue(spot.comprcieth); + gamjcie->setValue(spot.gamjcie); + slopjcie->setValue(spot.slopjcie); + slopesmo->setValue(spot.slopesmo); + slopesmor->setValue(spot.slopesmor); + slopesmog->setValue(spot.slopesmog); + slopesmob->setValue(spot.slopesmob); + midtcie->setValue(spot.midtcie); + whitescie->setValue(spot.whitescie); + blackscie->setValue(spot.blackscie); sigmoidldajzcie->setValue(spot.sigmoidldajzcie); sigmoidthjzcie->setValue(spot.sigmoidthjzcie); sigmoidbljzcie->setValue(spot.sigmoidbljzcie); contqcie->setValue(spot.contqcie); + contsigqcie->setValue(spot.contsigqcie); 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); -*/ + + grexl->setValue(spot.grexl); + greyl->setValue(spot.greyl); + bluxl->setValue(spot.bluxl); + bluyl->setValue(spot.bluyl); + redxl->setValue(spot.redxl); + redyl->setValue(spot.redyl); + refi->setValue(spot.refi); + shiftxl->setValue(spot.shiftxl); + shiftyl->setValue(spot.shiftyl); + + labgridcie->setParams(spot.labgridcieALow, + spot.labgridcieBLow, + spot.labgridcieAHigh, + spot.labgridcieBHigh, + spot.labgridcieGx, + spot.labgridcieGy, + spot.labgridcieWx, + spot.labgridcieWy, + spot.labgridcieMx, + spot.labgridcieMy, + false); + + strgradcie->setValue((double)spot.strgradcie); + anggradcie->setValue((double)spot.anggradcie); + feathercie->setValue((double)spot.feathercie); + enacieMask->set_active(spot.enacieMask); + enacieMaskall->set_active(spot.enacieMaskall); CCmaskcieshape->setCurve(spot.CCmaskciecurve); LLmaskcieshape->setCurve(spot.LLmaskciecurve); HHmaskcieshape->setCurve(spot.HHmaskciecurve); @@ -8553,14 +9937,26 @@ void Locallabcie::read(const rtengine::procparams::ProcParams* pp, const ParamsE lapmaskcie->setValue(spot.lapmaskcie); gammaskcie->setValue(spot.gammaskcie); slomaskcie->setValue(spot.slomaskcie); + highmaskcie->setValue(spot.highmaskcie); + shadmaskcie->setValue(spot.shadmaskcie); + HHhmaskcieshape->setCurve(spot.HHhmaskciecurve); Lmaskcieshape->setCurve(spot.Lmaskciecurve); recothrescie->setValue((double)spot.recothrescie); lowthrescie->setValue((double)spot.lowthrescie); higthrescie->setValue((double)spot.higthrescie); decaycie->setValue((double)spot.decaycie); + strumaskcie->setValue(spot.strumaskcie); + toolcie->set_active(spot.toolcie); + fftcieMask->set_active(spot.fftcieMask); + contcie->setValue(spot.contcie); +// updateColorGUI3(); + blurcie->setValue(spot.blurcie); + LLmaskcieshapewav->setCurve(spot.LLmaskciecurvewav); + csThresholdcie->setValue(spot.csthresholdcie); + - } + enableListener(); // Update GUI according to complexity mode updateGUIToMode(static_cast(complexity->get_active_row_number())); @@ -8570,13 +9966,14 @@ void Locallabcie::read(const rtengine::procparams::ProcParams* pp, const ParamsE void Locallabcie::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) { - const int index = pp->locallab.selspot; + 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.expprecam = expprecam->getEnabled(); spot.reparcie = reparcie->getValue(); spot.sensicie = sensicie->getIntValue(); @@ -8585,10 +9982,6 @@ void Locallabcie::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedi 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) { @@ -8617,6 +10010,26 @@ void Locallabcie::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedi spot.toneMethodcie2 = "thrc"; } + spot.redxl = redxl->getValue(); + spot.redyl = redyl->getValue(); + spot.grexl = grexl->getValue(); + spot.greyl = greyl->getValue(); + spot.bluxl = bluxl->getValue(); + spot.bluyl = bluyl->getValue(); + spot.refi = refi->getValue(); + spot.shiftxl = shiftxl->getValue(); + spot.shiftyl = shiftyl->getValue(); + labgridcie->getParams(spot.labgridcieALow, + spot.labgridcieBLow, + spot.labgridcieAHigh, + spot.labgridcieBHigh, + spot.labgridcieGx, + spot.labgridcieGy, + spot.labgridcieWx, + spot.labgridcieWy, + spot.labgridcieMx, + spot.labgridcieMy); + spot.Autograycie = Autograycie->get_active(); spot.forcejz = forcejz->get_active(); spot.forcebw = forcebw->get_active(); @@ -8624,19 +10037,114 @@ void Locallabcie::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedi spot.jabcie = jabcie->get_active(); spot.sourceGraycie = sourceGraycie->getValue(); spot.sourceabscie = sourceabscie->getValue(); - spot.sigmoidqjcie = sigmoidqjcie->get_active(); + spot.comprcieauto = comprcieauto->get_active(); + spot.normcie = normcie->get_active(); + spot.gamutcie = gamutcie->get_active(); + spot.bwcie = bwcie->get_active(); + spot.sigcie = sigcie->get_active(); spot.logcie = logcie->get_active(); + spot.satcie = satcie->get_active(); + spot.logcieq = logcieq->get_active(); + spot.smoothcie = smoothcie->get_active(); + spot.smoothcieyb = smoothcieyb->get_active(); + spot.smoothcielum = smoothcielum->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) { + 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"; + } else if (sursourcie->get_active_row_number() == 3) { + spot.sursourcie = "exDark"; + } else if (sursourcie->get_active_row_number() == 4) { + spot.sursourcie = "disacie"; + } + + if (bwevMethod->get_active_row_number() == 0) { + spot.bwevMethod = "none"; + } else if (bwevMethod->get_active_row_number() == 1) { + spot.bwevMethod = "sig"; + } + + if (smoothciemet->get_active_row_number() == 0) { + spot.smoothciemet = "none"; + } else if (smoothciemet->get_active_row_number() == 1) { + spot.smoothciemet = "Ev"; + } else if (smoothciemet->get_active_row_number() == 2) { + spot.smoothciemet = "gam"; + } else if (smoothciemet->get_active_row_number() == 3) { + spot.smoothciemet = "gamnorol"; + } else if (smoothciemet->get_active_row_number() == 4) { + spot.smoothciemet = "level"; + } + + if (illMethod->get_active_row_number() == 0) { + spot.illMethod = "d41"; + } else if (illMethod->get_active_row_number() == 1) { + spot.illMethod = "d50"; + } else if (illMethod->get_active_row_number() == 2) { + spot.illMethod = "d55"; + } else if (illMethod->get_active_row_number() == 3) { + spot.illMethod = "d60"; + } else if (illMethod->get_active_row_number() == 4) { + spot.illMethod = "d65"; + } else if (illMethod->get_active_row_number() == 5) { + spot.illMethod = "d80"; + } else if (illMethod->get_active_row_number() == 6) { + spot.illMethod = "d120"; + } else if (illMethod->get_active_row_number() == 7) { + spot.illMethod = "stda"; + } else if (illMethod->get_active_row_number() == 8) { + spot.illMethod = "T2000"; + } else if (illMethod->get_active_row_number() == 9) { + spot.illMethod = "T1500"; + } else if (illMethod->get_active_row_number() == 10) { + spot.illMethod = "iE"; + } + + if (primMethod->get_active_row_number() == 0) { + spot.primMethod = "pro"; + } else if (primMethod->get_active_row_number() == 1) { + spot.primMethod = "beta"; + } else if (primMethod->get_active_row_number() == 2) { + spot.primMethod = "wid"; + } else if (primMethod->get_active_row_number() == 3) { + spot.primMethod = "ac1"; + } else if (primMethod->get_active_row_number() == 4) { + spot.primMethod = "rec"; + } else if (primMethod->get_active_row_number() == 5) { + spot.primMethod = "ado"; + } else if (primMethod->get_active_row_number() == 6) { + spot.primMethod = "srgb"; + } else if (primMethod->get_active_row_number() == 7) { + spot.primMethod = "jdcmax"; + } else if (primMethod->get_active_row_number() == 8) { + spot.primMethod = "jdcmaxstdA"; + } else if (primMethod->get_active_row_number() == 9) { + spot.primMethod = "ac0"; + } else if (primMethod->get_active_row_number() == 10) { + spot.primMethod = "best"; + } else if (primMethod->get_active_row_number() == 11) { + spot.primMethod = "bru"; + } else if (primMethod->get_active_row_number() == 12) { + spot.primMethod = "free"; + } + + if (catMethod->get_active_row_number() == 0) { + spot.catMethod = "brad"; + } else if (catMethod->get_active_row_number() == 1) { + spot.catMethod = "cat16"; + } else if (catMethod->get_active_row_number() == 2) { + spot.catMethod = "cat02"; + } else if (catMethod->get_active_row_number() == 3) { + spot.catMethod = "vky"; + } else if (catMethod->get_active_row_number() == 4) { + spot.catMethod = "xyz"; } if (surroundcie->get_active_row_number() == 0) { @@ -8645,9 +10153,8 @@ void Locallabcie::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedi 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(); @@ -8670,7 +10177,9 @@ void Locallabcie::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedi spot.lightlcie = lightlcie->getValue(); spot.lightjzcie = lightjzcie->getValue(); spot.lightqcie = lightqcie->getValue(); + spot.lightsigqcie = lightsigqcie->getValue(); spot.contlcie = contlcie->getValue(); + spot.detailciejz = detailciejz->getValue(); spot.contjzcie = contjzcie->getValue(); spot.adapjzcie = adapjzcie->getValue(); spot.jz100 = jz100->getValue(); @@ -8693,27 +10202,36 @@ void Locallabcie::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedi spot.targetjz = targetjz->getValue(); spot.sigmoidldacie = sigmoidldacie->getValue(); spot.sigmoidthcie = sigmoidthcie->getValue(); + spot.sigmoidsenscie = sigmoidsenscie->getValue(); spot.sigmoidblcie = sigmoidblcie->getValue(); + spot.comprcie = comprcie->getValue(); + spot.strcielog = strcielog->getValue(); + spot.comprcieth = comprcieth->getValue(); + spot.gamjcie = gamjcie->getValue(); + spot.slopjcie = slopjcie->getValue(); + spot.slopesmo = slopesmo->getValue(); + spot.slopesmor = slopesmor->getValue(); + spot.slopesmog = slopesmog->getValue(); + spot.slopesmob = slopesmob->getValue(); + spot.midtcie = midtcie->getIntValue(); + spot.whitescie = whitescie->getIntValue(); + spot.blackscie = blackscie->getIntValue(); spot.sigmoidldajzcie = sigmoidldajzcie->getValue(); spot.sigmoidthjzcie = sigmoidthjzcie->getValue(); spot.sigmoidbljzcie = sigmoidbljzcie->getValue(); spot.contqcie = contqcie->getValue(); + spot.contsigqcie = contsigqcie->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.strgradcie = strgradcie->getValue(); + spot.anggradcie = anggradcie->getValue(); + spot.feathercie = feathercie->getValue(); + spot.enacieMask = enacieMask->get_active(); + spot.enacieMaskall = enacieMaskall->get_active(); spot.LLmaskciecurve = LLmaskcieshape->getCurve(); spot.CCmaskciecurve = CCmaskcieshape->getCurve(); spot.HHmaskciecurve = HHmaskcieshape->getCurve(); @@ -8723,11 +10241,21 @@ void Locallabcie::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedi spot.lapmaskcie = lapmaskcie->getValue(); spot.gammaskcie = gammaskcie->getValue(); spot.slomaskcie = slomaskcie->getValue(); + spot.highmaskcie = highmaskcie->getValue(); + spot.shadmaskcie = shadmaskcie->getValue(); + spot.HHhmaskciecurve = HHhmaskcieshape->getCurve(); spot.Lmaskciecurve = Lmaskcieshape->getCurve(); spot.recothrescie = recothrescie->getValue(); spot.lowthrescie = lowthrescie->getValue(); spot.higthrescie = higthrescie->getValue(); spot.decaycie = decaycie->getValue(); + spot.strumaskcie = strumaskcie->getValue(); + spot.toolcie = toolcie->get_active(); + spot.fftcieMask = fftcieMask->get_active(); + spot.contcie = contcie->getValue(); + spot.blurcie = blurcie->getValue(); + spot.LLmaskciecurvewav = LLmaskcieshapewav->getCurve(); + spot.csthresholdcie = csThresholdcie->getValue(); } } @@ -8772,15 +10300,101 @@ void Locallabcie::updateMaskBackground(const double normChromar, const double no LLmaskcieshape->updateLocallabBackground(normLumar); HHmaskcieshape->updateLocallabBackground(normHuer); Lmaskcieshape->updateLocallabBackground(normLumar); + HHhmaskcieshape->updateLocallabBackground(normHuer); + return false; + } + ); +} + +void Locallabcie::updatePrimloc(const float redx, const float redy, const float grex, const float grey, const float blux, const float bluy) +{ + idle_register.add( + [this, redx, redy, grex, grey, blux, bluy]() -> 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(); + redxl->setValue(redx); + redyl->setValue(redy); + grexl->setValue(grex); + greyl->setValue(grey); + bluxl->setValue(blux); + bluyl->setValue(bluy); + + enableListener(); return false; } - ); + ); + +} + +void Locallabcie::updatesigloc(const float cont_sig, const float light_sig) +{ + idle_register.add( + [this, cont_sig, light_sig]() -> bool { + GThreadLock lock; + disableListener(); + + contsigqcie->setValue(cont_sig); + lightsigqcie->setValue(light_sig); + + enableListener(); + return false; + } + ); + +} + + + +void Locallabcie::updateiPrimloc(const float r_x, const float r_y, const float g_x, const float g_y, const float b_x, const float b_y, const float w_x, const float w_y, const float m_x, const float m_y, const float me_x, const float me_y, const int pri_) +{ + nextrx = r_x; + nextry = r_y; + nextbx = b_x; + nextby = b_y; + nextgx = g_x; + nextgy = g_y; + nextwx = w_x; + nextwy = w_y; + nextmx = m_x; + nextmy = m_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; + nextmx = 1.81818f * (nextmx + 0.1f) - 1.f; + nextmy = 1.81818f * (nextmy + 0.1f) - 1.f; + + idle_register.add( + [this, r_x, r_y, g_x, g_y, b_x, b_y]() -> bool { + GThreadLock lock; + disableListener(); + + redxl->setValue(r_x); + redyl->setValue(r_y); + grexl->setValue(g_x); + greyl->setValue(g_y); + bluxl->setValue(b_x); + bluyl->setValue(b_y); + labgridcie->setParams(nextrx, nextry, nextbx, nextby, nextgx, nextgy, nextwx, nextwy, nextmx, nextmy, false); + enableListener(); + 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( @@ -8801,12 +10415,10 @@ void Locallabcie::updateAutocompute(const float blackev, const float whiteev, co return false; } - ); + ); } } - - void Locallabcie::AutograycieChanged() { @@ -8817,6 +10429,11 @@ void Locallabcie::AutograycieChanged() jz100->set_sensitive(false); blackEvjz->set_sensitive(false); whiteEvjz->set_sensitive(false); + + comprcieauto->set_active(true); + whitescie->set_sensitive(true); + blackscie->set_sensitive(true); + } else { sourceGraycie->set_sensitive(true); sourceabscie->set_sensitive(true); @@ -8824,9 +10441,10 @@ void Locallabcie::AutograycieChanged() jz100->set_sensitive(true); blackEvjz->set_sensitive(true); whiteEvjz->set_sensitive(true); - // adapjzcie->set_sensitive(false); - // jz100->set_sensitive(false); + whitescie->set_sensitive(false); + blackscie->set_sensitive(false); } + if (isLocActivated && exp->getEnabled()) { if (listener) { if (Autograycie->get_active()) { @@ -8889,7 +10507,7 @@ void Locallabcie::qtojChanged() } void Locallabcie::jabcieChanged() -{ +{ if (isLocActivated && exp->getEnabled()) { if (listener) { if (jabcie->get_active()) { @@ -8903,36 +10521,125 @@ void Locallabcie::jabcieChanged() } } -void Locallabcie::sigmoidqjcieChanged() +void Locallabcie::comprcieautoChanged() { + if (isLocActivated && exp->getEnabled()) { if (listener) { - if (sigmoidqjcie->get_active()) { - listener->panelChanged(Evlocallabsigmoidqjcie, + if (comprcieauto->get_active()) { + listener->panelChanged(Evlocallabcomprcieauto, M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); } else { - listener->panelChanged(Evlocallabsigmoidqjcie, + listener->panelChanged(Evlocallabcomprcieauto, M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); } } } } +void Locallabcie::normcieChanged() +{ + + if (normcie->get_active()) { + sigmoidblcie->set_sensitive(true); + } else { + sigmoidblcie->set_sensitive(false); + } + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (normcie->get_active()) { + listener->panelChanged(Evlocallabnormcie, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabnormcie, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } + +} + + +void Locallabcie::gamutcieChanged() +{ + if (gamutcie->get_active()) { + catBox->set_sensitive(true); + } else { + catBox->set_sensitive(false); + } + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (gamutcie->get_active()) { + listener->panelChanged(Evlocallabgamutcie, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabgamutcie, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } + +} + +void Locallabcie::bwcieChanged() +{ + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (bwcie->get_active()) { + listener->panelChanged(Evlocallabbwcie, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabbwcie, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } + +} + + +void Locallabcie::expprecamChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (expprecam->getEnabled()) { + listener->panelChanged(Evlocallabexpprecam, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabexpprecam, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } + +} + + +void Locallabcie::sigcieChanged() +{ + contsigqcie->hide(); + lightsigqcie->hide(); + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (sigcie->get_active()) { + listener->panelChanged(Evlocallabsigcie, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabsigcie, + 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()) { @@ -8946,6 +10653,90 @@ void Locallabcie::logcieChanged() } } +void Locallabcie::satcieChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (satcie->get_active()) { + listener->panelChanged(Evlocallabsatcie, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabsatcie, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void Locallabcie::logcieqChanged() +{ + if (logcieq->get_active()) { + satcie->hide(); + sigmoidnormFrame->hide(); + } else { + satcie->show(); + sigmoidnormFrame->show(); + } + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (logcieq->get_active()) { + listener->panelChanged(Evlocallablogcieq, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallablogcieq, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + + +void Locallabcie::smoothcieChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (smoothcie->get_active()) { + listener->panelChanged(Evlocallabsmoothcie, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabsmoothcie, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void Locallabcie::smoothcieybChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (smoothcieyb->get_active()) { + listener->panelChanged(Evlocallabsmoothcieyb, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabsmoothcieyb, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void Locallabcie::smoothcielumChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (smoothcielum->get_active()) { + listener->panelChanged(Evlocallabsmoothcielum, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabsmoothcielum, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + void Locallabcie::logjzChanged() { if (isLocActivated && exp->getEnabled()) { @@ -8978,6 +10769,9 @@ void Locallabcie::sigjzChanged() void Locallabcie::sigqChanged() { + contsigqcie->hide(); + lightsigqcie->hide(); + if (isLocActivated && exp->getEnabled()) { if (listener) { if (sigq->get_active()) { @@ -8998,6 +10792,7 @@ void Locallabcie::chjzcieChanged() } else { thrhjzcie->set_sensitive(false); } + if (isLocActivated && exp->getEnabled()) { if (listener) { if (chjzcie->get_active()) { @@ -9014,8 +10809,11 @@ void Locallabcie::chjzcieChanged() void Locallabcie::modecamChanged() { const int mode = complexity->get_active_row_number(); - - if (modecam->get_active_row_number() == 1 || modecam->get_active_row_number() == 2) { + contsigqcie->hide(); + lightsigqcie->hide(); + const LocallabParams::LocallabSpot defSpot; + + if (modecam->get_active_row_number() == 1) { expjz->show(); jzFrame->show(); adapjzcie->show(); @@ -9028,82 +10826,74 @@ void Locallabcie::modecamChanged() sigmoidjzFrame->show(); sigmoidFrame->hide(); forcejz->hide(); - + expprecam->hide(); + expcam16->hide(); + expcamviewing->hide(); + lapmaskcie->hide(); + lapmaskcie->setValue(defSpot.lapmaskcie); + enacieMaskallChanged2(); + } else { expjz->hide(); + lapmaskcie->show(); + jzFrame->hide(); adapjzcie->hide(); jz100->hide(); pqremap->hide(); - pqremapcam16->show(); + + if (mode == Expert) { + pqremapcam16->show(); + } else { + pqremapcam16->hide(); + } + jabcie->hide(); PQFrame->hide(); logjzFrame->hide(); - if (modecam->get_active_row_number() == 0){ + + if (modecam->get_active_row_number() == 0) { bevwevFrame->show(); sigmoidFrame->show(); + expprecam->show(); + } + sigmoidjzFrame->hide(); forcejz->hide(); catadcie->show(); } + surHBoxcie->show(); cie1Frame->show(); expcam16->show(); - cie2Frame->show(); + expcamviewing->show(); sourceGraycie->show(); - cieFrame->show(); + expcamscene->show(); if (modecam->get_active_row_number() == 1) { + guijzczhz(); 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) { + lapmaskcie->setValue(defSpot.lapmaskcie); + enacieMaskallChanged2(); + + if (mode == Expert) { exprecovcie->show(); expmaskcie->show(); + expgradcie->hide(); + lapmaskcie->hide(); + lapmaskcie->setValue(defSpot.lapmaskcie); + } - - } - 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(); + } else if (mode != Simple){ + exprecovcie->show(); + expgradcie->show(); + expmaskcie->show(); + } - } - } - if(mode != Expert) { + if (mode != Expert) { expjz->hide(); jzFrame->hide(); adapjzcie->hide(); @@ -9115,33 +10905,54 @@ void Locallabcie::modecamChanged() sigmoidjzFrame->hide(); sigmoidFrame->hide(); bevwevFrame->hide(); - if (modecam->get_active_row_number() == 0){ + + if (modecam->get_active_row_number() == 0) { bevwevFrame->show(); sigmoidFrame->show(); } forcejz->hide(); - pqremapcam16->show(); + + if (mode == Expert) { + pqremapcam16->show(); + } else { + pqremapcam16->hide(); + } + catadcie->show(); sourceGraycie->show(); - if (modecam->get_active_row_number() == 1 || modecam->get_active_row_number() == 3) { + if (modecam->get_active_row_number() == 1) { pqremapcam16->hide(); - cieFrame->hide(); + expcamscene->hide(); cie1Frame->hide(); expcam16->hide(); - cie2Frame->hide(); + expcamviewing->hide(); catadcie->hide(); - cie2Frame->hide(); + expgradcie->hide(); + expcam16->hide(); + lapmaskcie->hide(); + lapmaskcie->setValue(defSpot.lapmaskcie); + enacieMaskallChanged2(); + + } else if (mode != Simple){ + exprecovcie->show(); + expgradcie->show(); + expmaskcie->show(); } } else { - cieFrame->show(); - cie2Frame->show(); - if (modecam->get_active_row_number() == 0){ + expcamscene->show(); + expcamviewing->show(); + + if (modecam->get_active_row_number() == 0) { bevwevFrame->show(); sigmoidjzFrame->hide(); - + expprecam->show(); + lapmaskcie->show(); + + } + if (modecam->get_active_row_number() == 1) { targetGraycie->hide(); targabscie->hide(); @@ -9154,41 +10965,48 @@ void Locallabcie::modecamChanged() sigmoidFrame->hide(); bevwevFrame->show(); catadcie->hide(); - cie2Frame->hide(); + expcamviewing->hide(); + expgradcie->hide(); + expcam16->hide(); + lapmaskcie->hide(); + lapmaskcie->setValue(defSpot.lapmaskcie); + enacieMaskallChanged2(); + 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 (modecam->get_active_row_number() == 0) { + targetGraycie->show(); + targabscie->show(); + surrHBoxcie->show(); + expprecam->show(); + expcamviewing->show(); + if (mode != Simple){ + exprecovcie->show(); + expgradcie->show(); + expmaskcie->show(); } - + + + + if (mode == Expert) { + pqremapcam16->show(); + } else { + pqremapcam16->hide(); + } + } + + contsigqcie->hide(); + lightsigqcie->hide(); if (isLocActivated && exp->getEnabled()) { @@ -9204,31 +11022,39 @@ void Locallabcie::modecamChanged() 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) { + exprecovcie->show(); + expmaskcie->show(); + expgradcie->show(); + + if (modecie->get_active_row_number() > 0 && mode == Expert) { sensicie->hide(); reparcie->hide(); - exprecovcie->hide(); - expmaskcie->hide(); - + exprecovcie->show(); + expmaskcie->show(); + expgradcie->hide(); + } else { sensicie->show(); reparcie->show(); - if(mode == Expert) { + + if (mode == Expert) { exprecovcie->show(); expmaskcie->show(); + expgradcie->show(); } } + + contsigqcie->hide(); + lightsigqcie->hide(); + if (mode == Simple || mode == Normal) { // Keep widget hidden in Normal and Simple mode - - modecie->set_active (0); + + modecie->set_active(0); sensicie->show(); reparcie->show(); - + } if (listener) { @@ -9242,6 +11068,22 @@ void Locallabcie::modecieChanged() void Locallabcie::sursourcieChanged() { + const LocallabParams::LocallabSpot defSpot; + + if (sursourcie->get_active_row_number() == 4) { + expcam16->hide(); + expcamviewing->hide(); + } else { + expcam16->show(); + expcamviewing->show(); + if(modecam->get_active_row_number() == 1) { + expcam16->hide(); + expcamviewing->hide(); + lapmaskcie->hide(); + lapmaskcie->setValue(defSpot.lapmaskcie); + } + } + if (isLocActivated && exp->getEnabled()) { if (listener) { listener->panelChanged(Evlocallabsursourcie, @@ -9250,6 +11092,138 @@ void Locallabcie::sursourcieChanged() } } +void Locallabcie::catMethodChanged() +{ + + if (listener) { + listener->panelChanged(Evlocallabcatcie, catMethod->get_active_text()); + } + +} + +void Locallabcie::illMethodChanged() +{ + + if (listener) { + listener->panelChanged(Evlocallabillcie, illMethod->get_active_text()); + } + +} + +void Locallabcie::smoothciemetChanged() +{ + if(smoothciemet->get_active_row_number() == 3) { + slopesmo->show(); + slopesmor->hide(); + slopesmog->hide(); + slopesmob->hide(); + smoothcie->show(); + smoothcieyb->hide(); + smoothcielum->hide(); + } else if(smoothciemet->get_active_row_number() == 4) { + slopesmo->hide(); + slopesmor->show(); + slopesmog->show(); + slopesmob->show(); + smoothcie->show(); + smoothcielum->show(); + smoothcieyb->show(); + } else { + slopesmo->hide(); + slopesmor->hide(); + slopesmog->hide(); + slopesmob->hide(); + smoothcie->hide(); + smoothcielum->hide(); + smoothcieyb->hide(); + } + + if (listener) { + listener->panelChanged(Evlocallabsmoothciemet, smoothciemet->get_active_text()); + } + +} + + +void Locallabcie::primMethodChanged() +{ + + if (primMethod->get_active_row_number() == 0) { + illMethod->set_active(1); + } else if (primMethod->get_active_row_number() == 1) { + illMethod->set_active(1); + } else if (primMethod->get_active_row_number() == 2) { + illMethod->set_active(1); + } else if (primMethod->get_active_row_number() == 3) { + illMethod->set_active(3); + } else if (primMethod->get_active_row_number() == 4) { + illMethod->set_active(4); + } else if (primMethod->get_active_row_number() == 5) { + illMethod->set_active(4); + } else if (primMethod->get_active_row_number() == 6) { + illMethod->set_active(4); + } else if (primMethod->get_active_row_number() == 7) { + illMethod->set_active(1); + } else if (primMethod->get_active_row_number() == 8) { + illMethod->set_active(7); + } else if (primMethod->get_active_row_number() == 9) { + illMethod->set_active(3); + } else if (primMethod->get_active_row_number() == 10) { + illMethod->set_active(1); + } else if (primMethod->get_active_row_number() == 11) { + illMethod->set_active(4); + } + + illMethod->set_sensitive(false); + + if (primMethod->get_active_row_number() == 12) { + redBox->set_sensitive(true); + illMethod->set_sensitive(true); + + } else { + redBox->set_sensitive(false); + } + + if (listener) { + listener->panelChanged(Evlocallabprimcie, primMethod->get_active_text()); + } + +} + +void Locallabcie::bwevMethodChanged() +{ + const LocallabParams::LocallabSpot defSpot; + const int mode = complexity->get_active_row_number(); + + if (bwevMethod->get_active_row_number() == 2) {// && sigcie->get_active()) { + comprcie->set_sensitive(true); + comprcieth->set_sensitive(true); + comprcieauto->set_sensitive(true); + comprcieauto->set_active(true); + + if (mode == Simple) { + comprcieth->set_sensitive(false); + comprcieauto->set_sensitive(false); + } + + } else { + comprcieth->set_sensitive(false); + comprcieauto->set_sensitive(false); + } + + if (bwevMethod->get_active_row_number() == 2) { + comprcie->setValue(defSpot.comprcie);//to test + } + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabbwevMethod, + bwevMethod->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + + void Locallabcie::surroundcieChanged() { if (isLocActivated && exp->getEnabled()) { @@ -9260,8 +11234,37 @@ void Locallabcie::surroundcieChanged() } } +void Locallabcie::guijzczhz() +{ + expcamscene->hide(); + cie1Frame->hide(); + expcam16->hide(); + forcejz->hide(); + pqremapcam16->hide(); + PQFrame->hide(); + logjzFrame->hide(); + bevwevFrame->hide(); + sigmoidjzFrame->hide(); + sigmoidFrame->hide(); + catadcie->hide(); + expcamviewing->hide(); + maskusablecie->hide(); + maskunusablecie->hide(); + decaycie->hide(); + expmaskcie->hide(); + expprecam->hide(); + exprecovcie->hide(); + expgradcie->hide(); + lapmaskcie->hide(); +} + + + + void Locallabcie::updateGUIToMode(const modeType new_type) { + const LocallabParams::LocallabSpot defSpot; + switch (new_type) { case Simple: catadcie->show(); @@ -9280,102 +11283,145 @@ void Locallabcie::updateGUIToMode(const modeType new_type) surHBoxcie->show(); sourceabscie->show(); targabscie->show(); - detailcie->hide(); + detailcie->show(); //hide jabcie->hide(); modeHBoxcie->hide(); sensicie->show(); reparcie->show(); - sigmoidblcie->hide(); - + sigmoidsenscie->hide(); + sigmoidnormFrame->hide(); + pqremapcam16->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(); + expcamscene->show(); exprecovcie->hide(); + expgradcie->hide(); maskusablecie->hide(); maskunusablecie->hide(); decaycie->hide(); expmaskcie->hide(); - expmaskcie->hide(); + comprcie->show(); + strcielog->show(); + satcie->show(); + logcieq->hide(); + blackEvjz->hide(); + whiteEvjz->hide(); + whitescie->hide(); + blackscie->hide(); + logcieFrame->hide(); + comprcieth->hide(); + comprcieauto->hide(); + comprBox->show(); + slopesmo->hide(); + slopesmor->hide(); + slopesmog->hide(); + slopesmob->hide(); + smoothcie->hide(); + smoothcielum->hide(); + smoothcieyb->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){ + if (modecam->get_active_row_number() == 0) { bevwevFrame->show(); - sigmoidFrame->show(); + sigmoidFrame->hide(); //show + expprecam->show(); + primillFrame->hide(); + expmaskcie->hide(); + exprecovcie->hide(); + expgradcie->hide(); + if(smoothciemet->get_active_row_number() == 3) { + slopesmo->show(); + slopesmor->hide(); + slopesmog->hide(); + slopesmob->hide(); + smoothcie->show(); + smoothcielum->hide(); + smoothcieyb->hide(); + } else if(smoothciemet->get_active_row_number() == 4) { + slopesmo->hide(); + slopesmor->show(); + slopesmog->show(); + slopesmob->show(); + smoothcie->show(); + smoothcielum->show(); + smoothcieyb->show(); + } else { + slopesmo->hide(); + slopesmor->hide(); + slopesmog->hide(); + slopesmob->hide(); + smoothcie->hide(); + smoothcielum->hide(); + smoothcieyb->hide(); + } } 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(); + // cieFrame->hide(); + guijzczhz(); + lapmaskcie->setValue(defSpot.lapmaskcie); + enacieMaskallChanged2(); + enacieMaskall->hide(); } - if (modecam->get_active_row_number() == 3) { - cieFrame->hide(); - cie1Frame->hide(); - expcam16->hide(); - cie2Frame->hide(); - pqremapcam16->hide(); - PQFrame->hide(); - logjzFrame->hide(); - catadcie->hide(); - } - + + + contsigqcie->hide(); + lightsigqcie->hide(); + expmaskcie->hide(); + exprecovcie->hide(); + expgradcie->hide(); + break; + case Normal: // Expert mode widgets are hidden in Normal mode catadcie->show(); saturlcie->show(); rstprotectcie->show(); - chromlcie->hide(); - huecie->hide(); + chromlcie->show();//hide + huecie->show();//hide lightlcie->show(); - lightqcie->hide(); + lightqcie->show();//hide contlcie->show(); contthrescie->show(); - contqcie->hide(); + contqcie->show();//hide colorflcie->hide(); surrHBoxcie->show(); expLcie->hide(); surHBoxcie->show(); sourceabscie->show(); targabscie->show(); - detailcie->hide(); + detailcie->show();//hide jabcie->hide(); modeHBoxcie->hide(); sensicie->show(); reparcie->show(); sigmoidblcie->show(); + sigmoidsenscie->hide(); expjz->hide(); forcejz->hide(); + comprcie->show(); + strcielog->show(); + satcie->show(); + logcieq->hide(); + blackEvjz->show(); + whiteEvjz->show(); + whitescie->show(); + blackscie->show(); + + logcieFrame->hide(); + comprcieth->show(); + comprcieauto->show(); + comprBox->show(); jzFrame->hide(); adapjzcie->hide(); @@ -9385,69 +11431,90 @@ void Locallabcie::updateGUIToMode(const modeType new_type) targetGraycie->show(); targabscie->show(); surrHBoxcie->show(); - pqremapcam16->show(); + pqremapcam16->hide(); sourceGraycie->show(); - cieFrame->show(); + expcamscene->show(); exprecovcie->show(); + expgradcie->show(); expmaskcie->show(); decaycie->hide(); lapmaskcie->hide(); gammaskcie->hide(); slomaskcie->hide(); + highmaskcie->hide(); + shadmaskcie->hide(); + struFramecie->hide(); + blurFramecie->hide(); + wavFramecie->hide(); + maskcieHCurveEditorG->hide(); + sigmoidnormFrame->hide(); + if (enacieMask->get_active()) { maskusablecie->show(); maskunusablecie->hide(); - + } else { maskusablecie->hide(); maskunusablecie->show(); } - if (modecam->get_active_row_number() == 0){ + + if (modecam->get_active_row_number() == 0) { bevwevFrame->show(); sigmoidFrame->show(); + expprecam->show(); + primillFrame->hide();//show + enacieMaskall->hide(); + + if(smoothciemet->get_active_row_number() == 3) { + slopesmo->show(); + slopesmor->hide(); + slopesmog->hide(); + slopesmob->hide(); + smoothcie->show(); + smoothcielum->hide(); + smoothcieyb->hide(); + } else if(smoothciemet->get_active_row_number() == 4) { + slopesmo->hide(); + slopesmor->show(); + slopesmog->show(); + slopesmob->show(); + smoothcie->show(); + smoothcielum->show(); + smoothcieyb->show(); + } else { + slopesmo->hide(); + slopesmor->hide(); + slopesmog->hide(); + slopesmob->hide(); + smoothcie->hide(); + smoothcielum->hide(); + smoothcieyb->hide(); + } } - 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(); + guijzczhz(); + lapmaskcie->setValue(defSpot.lapmaskcie); + enacieMaskallChanged2(); + enacieMaskall->hide(); + + } else { + exprecovcie->show(); + expgradcie->show(); + expmaskcie->show(); } + + if (modecie->get_active_row_number() > 0) { exprecovcie->hide(); expmaskcie->hide(); + expgradcie->hide(); } + contsigqcie->hide(); + lightsigqcie->hide(); + break; case Expert: @@ -9471,34 +11538,93 @@ void Locallabcie::updateGUIToMode(const modeType new_type) detailcie->show(); modeHBoxcie->show(); sigmoidblcie->show(); + pqremapcam16->show(); + comprcie->show(); + strcielog->show(); + logcieq->show(); + blackEvjz->show(); + whiteEvjz->show(); + whitescie->show(); + blackscie->show(); + logcieFrame->show(); + comprcieth->show(); + comprcieauto->show(); + sigmoidsenscie->show(); + sigmoidnormFrame->show(); + + if (logcieq->get_active()) { + satcie->hide(); + sigmoidnormFrame->hide(); + } else { + satcie->show(); + sigmoidnormFrame->show(); + } + targetGraycie->show(); targabscie->show(); surrHBoxcie->show(); forcejz->hide(); - pqremapcam16->show(); sourceGraycie->show(); - cieFrame->show(); + expcamscene->show(); exprecovcie->show(); + expgradcie->show(); decaycie->show(); lapmaskcie->show(); gammaskcie->show(); slomaskcie->show(); + highmaskcie->show(); + shadmaskcie->show(); + maskcieHCurveEditorG->show(); expmaskcie->show(); - exprecovcie->show(); + struFramecie->show(); + blurFramecie->show(); + wavFramecie->show(); + comprBox->show(); if (enacieMask->get_active()) { maskusablecie->show(); maskunusablecie->hide(); - + } else { maskusablecie->hide(); maskunusablecie->show(); } - if (modecam->get_active_row_number() == 0){ + + if (modecam->get_active_row_number() == 0) { bevwevFrame->show(); + expprecam->show(); + primillFrame->show(); + enacieMaskallChanged2(); + enacieMaskall->show(); + + if(smoothciemet->get_active_row_number() == 3) { + slopesmo->show(); + slopesmor->hide(); + slopesmog->hide(); + slopesmob->hide(); + smoothcie->show(); + smoothcielum->hide(); + smoothcieyb->hide(); + } else if(smoothciemet->get_active_row_number() == 4) { + slopesmo->hide(); + slopesmor->show(); + slopesmog->show(); + slopesmob->show(); + smoothcie->show(); + smoothcielum->show(); + smoothcieyb->show(); + } else { + slopesmo->hide(); + slopesmor->hide(); + slopesmog->hide(); + slopesmob->hide(); + smoothcie->hide(); + smoothcielum->hide(); + smoothcieyb->hide(); + } } - if (modecam->get_active_row_number() == 1 || modecam->get_active_row_number() == 2) { + if (modecam->get_active_row_number() == 1) { jabcie->show(); expjz->show(); jzFrame->show(); @@ -9511,12 +11637,22 @@ void Locallabcie::updateGUIToMode(const modeType new_type) sigmoidjzFrame->show(); sigmoidFrame->hide(); forcejz->hide(); - - } - cieFrame->show(); - cie2Frame->show(); + expprecam->hide(); + expgradcie->hide(); + expcam16->hide(); + exprecovcie->show(); + expmaskcie->show(); + lapmaskcie->hide(); + lapmaskcie->setValue(defSpot.lapmaskcie); + enacieMaskallChanged2(); + enacieMaskall->show(); - if (modecam->get_active_row_number() == 0 || modecam->get_active_row_number() == 2) { + } + + expcamscene->show(); + expcamviewing->show(); + + if (modecam->get_active_row_number() == 0) { targetGraycie->show(); targabscie->show(); surrHBoxcie->show(); @@ -9525,19 +11661,42 @@ void Locallabcie::updateGUIToMode(const modeType new_type) logjzFrame->hide(); sigmoidjzFrame->hide(); bevwevFrame->hide(); - if (modecam->get_active_row_number() == 0){ - bevwevFrame->show(); - sigmoidFrame->show(); + + bevwevFrame->show(); + sigmoidFrame->show(); + expprecam->show(); + primillFrame->show(); + enacieMaskallChanged2(); + enacieMaskall->show(); + + if(smoothciemet->get_active_row_number() == 3) { + slopesmo->show(); + slopesmor->hide(); + slopesmog->hide(); + slopesmob->hide(); + smoothcie->show(); + smoothcielum->hide(); + smoothcieyb->hide(); + } else if(smoothciemet->get_active_row_number() == 4) { + slopesmo->hide(); + slopesmor->show(); + slopesmog->show(); + slopesmob->show(); + smoothcie->show(); + smoothcielum->show(); + smoothcieyb->show(); + } else { + slopesmo->hide(); + slopesmor->hide(); + slopesmog->hide(); + slopesmob->hide(); + smoothcie->hide(); + smoothcielum->hide(); + smoothcieyb->hide(); } - - } - 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(); @@ -9550,87 +11709,180 @@ void Locallabcie::updateGUIToMode(const modeType new_type) sigmoidFrame->hide(); bevwevFrame->show(); catadcie->hide(); - cie2Frame->hide(); + expcamviewing->hide(); exprecovcie->show(); + expgradcie->show(); expmaskcie->show(); maskusablecie->show(); maskunusablecie->show(); + expprecam->hide(); + expgradcie->hide(); + expcam16->hide(); + lapmaskcie->hide(); + lapmaskcie->setValue(defSpot.lapmaskcie); + enacieMaskallChanged2(); + enacieMaskall->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(); - } + expgradcie->hide(); + } + + contsigqcie->hide(); + lightsigqcie->hide(); } } void Locallabcie::updatecieGUI() { + const LocallabParams::LocallabSpot defSpot; const int mode = complexity->get_active_row_number(); expmaskcie->show(); exprecovcie->show(); + expgradcie->show(); + + contsigqcie->hide(); + lightsigqcie->hide(); + + if (modecie->get_active_row_number() > 0) { sensicie->hide(); reparcie->hide(); exprecovcie->hide(); + expgradcie->hide(); expmaskcie->hide(); } else { sensicie->show(); reparcie->show(); exprecovcie->show(); + expgradcie->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(); + + surHBoxcie->show(); + cie1Frame->show(); + expcam16->show(); + expcamviewing->show(); + + if (modecam->get_active_row_number() == 0) { bevwevFrame->show(); + expprecam->show(); + + if (mode == Simple) { + expmaskcie->hide(); + exprecovcie->hide(); + primillFrame->hide(); + expgradcie->hide(); + + } else if (mode == Normal) { + primillFrame->hide(); + } else { + primillFrame->show(); + } + + if(smoothciemet->get_active_row_number() == 3) { + slopesmo->show(); + slopesmor->hide(); + slopesmog->hide(); + slopesmob->hide(); + smoothcie->show(); + smoothcielum->hide(); + smoothcieyb->hide(); + } else if(smoothciemet->get_active_row_number() == 4) { + slopesmo->hide(); + slopesmor->show(); + slopesmog->show(); + slopesmob->show(); + smoothcie->show(); + smoothcielum->show(); + smoothcieyb->show(); + } else { + slopesmo->hide(); + slopesmor->hide(); + slopesmog->hide(); + slopesmob->hide(); + smoothcie->hide(); + smoothcielum->hide(); + smoothcieyb->hide(); + } } - sourceGraycie->show(); - cieFrame->show(); + + + sourceGraycie->show(); + expcamscene->show(); if (enacieMask->get_active() && mode != Simple) { maskusablecie->show(); maskunusablecie->hide(); - + } else { maskusablecie->hide(); maskunusablecie->show(); } - if (modecam->get_active_row_number() == 1) { + + 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); + whitescie->set_sensitive(true); + blackscie->set_sensitive(true); + comprcieauto->set_active(true); + + } else { + sourceGraycie->set_sensitive(true); + sourceabscie->set_sensitive(true); + adapjzcie->set_sensitive(true); + blackEvjz->set_sensitive(true); + whiteEvjz->set_sensitive(true); + whitescie->set_sensitive(false); + blackscie->set_sensitive(false); + 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 (sursourcie->get_active_row_number() == 4) { + expcam16->hide(); + expcamviewing->hide(); + } else { + expcam16->show(); + expcamviewing->show(); + if(modecam->get_active_row_number() == 1) { + expcam16->hide(); + expcamviewing->hide(); + lapmaskcie->hide(); + lapmaskcie->setValue(defSpot.lapmaskcie); + enacieMaskallChanged2(); + } + } + + + if (modecie->get_active_row_number() > 0) { + exprecovcie->hide(); + expgradcie->hide(); + expmaskcie->hide(); + } + + if (modecam->get_active_row_number() == 1 && (mode == Expert)) { surHBoxcie->show(); cie1Frame->hide(); expcam16->hide(); @@ -9644,81 +11896,20 @@ void Locallabcie::updatecieGUI() 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(); - } + expprecam->hide(); + expcamviewing->hide(); + expgradcie->hide(); + expcam16->hide(); + exprecovcie->show(); + expmaskcie->show(); + lapmaskcie->hide(); + lapmaskcie->setValue(defSpot.lapmaskcie); + enacieMaskallChanged2(); + enacieMaskall->show(); } - 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(); - } - } @@ -9729,9 +11920,30 @@ void Locallabcie::convertParamToSimple() // Disable all listeners disableListener(); sigmoidblcie->setValue(defSpot.sigmoidblcie); + normcie->set_active(defSpot.normcie); + logcieq->set_active(defSpot.logcieq); + logcie->set_active(defSpot.logcie); + blackEvjz->setValue(defSpot.blackEvjz); + whiteEvjz->setValue(defSpot.whiteEvjz); + whitescie->setValue(defSpot.whitescie); + blackscie->setValue(defSpot.blackscie); + bwcie->set_active(defSpot.bwcie); + + sigq->set_active(defSpot.sigq); + //sigq->set_active(defSpot.sigq); + pqremapcam16->setValue(defSpot.pqremapcam16); showmaskcieMethod->set_active(0); enacieMask->set_active(defSpot.enacieMask); + enacieMaskall->set_active(defSpot.enacieMaskall); + strgradcie->setValue(defSpot.strgradcie); + anggradcie->setValue(defSpot.anggradcie); + feathercie->setValue(defSpot.feathercie); + refi->setValue(defSpot.refi); modecie->set_active(0); + primMethod->set_active(0);//Prophoto + illMethod->set_active(1);//D50 + catMethod->set_active(0); + // Enable all listeners enableListener(); } @@ -9743,11 +11955,17 @@ void Locallabcie::convertParamToNormal() // Disable all listeners disableListener(); contqcie->setValue(defSpot.contqcie); + sigmoidblcie->setValue(defSpot.sigmoidblcie); + normcie->set_active(defSpot.normcie); + logcieq->set_active(defSpot.logcieq); + logcie->set_active(defSpot.logcie); + bwcie->set_active(defSpot.bwcie); + //contsigqcie->setValue(defSpot.contsigqcie); colorflcie->setValue(defSpot.colorflcie); lightqcie->setValue(defSpot.lightqcie); chromlcie->setValue(defSpot.chromlcie); huecie->setValue(defSpot.huecie); - detailcie->setValue(defSpot.detailcie); + // detailcie->setValue(defSpot.detailcie); jabcie->set_active(defSpot.jabcie); LHshapejz->setCurve(defSpot.LHcurvejz); CHshapejz->setCurve(defSpot.CHcurvejz); @@ -9759,6 +11977,7 @@ void Locallabcie::convertParamToNormal() shapecie2->setCurve(defSpot.ciecurve2); lightjzcie->setValue(defSpot.lightjzcie); contjzcie->setValue(defSpot.contjzcie); + detailciejz->setValue(defSpot.detailciejz); sigmoidldajzcie->setValue(defSpot.sigmoidldajzcie); hljzcie->setValue(defSpot.hljzcie); shjzcie->setValue(defSpot.shjzcie); @@ -9769,19 +11988,45 @@ void Locallabcie::convertParamToNormal() strsoftjzcie->setValue(defSpot.strsoftjzcie); thrhjzcie->setValue(defSpot.thrhjzcie); modecie->set_active(0); + //primMethod->set_active(0); + catMethod->set_active(0); + primMethod->set_active(0);//Prophoto + illMethod->set_active(1);//D50 + refi->setValue(defSpot.refi); + + pqremapcam16->setValue(defSpot.pqremapcam16); + logcieChanged(); + satcieChanged(); + logcieqChanged(); + 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); + enacieMaskallChanged2(); + } + lapmaskcie->setValue(defSpot.lapmaskcie); gammaskcie->setValue(defSpot.gammaskcie); slomaskcie->setValue(defSpot.slomaskcie); - + highmaskcie->setValue(defSpot.highmaskcie); + shadmaskcie->setValue(defSpot.shadmaskcie); + HHhmaskcieshape->setCurve(defSpot.HHhmaskciecurve); + strumaskcie->setValue(defSpot.strumaskcie); + toolcie->set_active(defSpot.toolcie); + fftcieMask->set_active(defSpot.fftcieMask); + contcie->setValue(defSpot.contcie); + blurcie->setValue(defSpot.blurcie); + sigmoidsenscie->setValue(defSpot.sigmoidsenscie); + LLmaskcieshapewav->setCurve(defSpot.LLmaskciecurvewav); + csThresholdcie->setValue(defSpot.csthresholdcie); + // Enable all listeners enableListener(); - + } void Locallabcie::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited) @@ -9797,8 +12042,8 @@ void Locallabcie::setDefaults(const rtengine::procparams::ProcParams* defParams, sourceabscie->setDefault(defSpot.sourceabscie); saturlcie->setDefault(defSpot.saturlcie); rstprotectcie->setDefault(defSpot.rstprotectcie); - chromlcie->setDefault(defSpot.chromlcie); - huecie->setDefault(defSpot.huecie); + // chromlcie->setDefault(defSpot.chromlcie); + // huecie->setDefault(defSpot.huecie); chromjzcie->setDefault(defSpot.chromjzcie); saturjzcie->setDefault(defSpot.saturjzcie); huejzcie->setDefault(defSpot.huejzcie); @@ -9807,9 +12052,11 @@ void Locallabcie::setDefaults(const rtengine::procparams::ProcParams* defParams, thrhjzcie->setDefault(defSpot.thrhjzcie); lightlcie->setDefault(defSpot.lightlcie); lightjzcie->setDefault(defSpot.lightjzcie); - lightqcie->setDefault(defSpot.lightqcie); + //lightqcie->setDefault(defSpot.lightqcie); + lightsigqcie->setDefault(defSpot.lightsigqcie); contlcie->setDefault(defSpot.contlcie); contjzcie->setDefault(defSpot.contjzcie); + detailciejz->setDefault(defSpot.detailciejz); adapjzcie->setDefault(defSpot.adapjzcie); jz100->setDefault(defSpot.jz100); pqremap->setDefault(defSpot.pqremap); @@ -9830,58 +12077,102 @@ void Locallabcie::setDefaults(const rtengine::procparams::ProcParams* defParams, targetjz->setDefault(defSpot.targetjz); sigmoidldacie->setDefault(defSpot.sigmoidldacie); sigmoidthcie->setDefault(defSpot.sigmoidthcie); + sigmoidsenscie->setDefault(defSpot.sigmoidsenscie); sigmoidblcie->setDefault(defSpot.sigmoidblcie); + comprcie->setDefault(defSpot.comprcie); + strcielog->setDefault(defSpot.strcielog); + comprcieth->setDefault(defSpot.comprcieth); + gamjcie->setDefault(defSpot.gamjcie); + whitescie->setDefault(defSpot.whitescie); + blackscie->setDefault(defSpot.blackscie); + slopjcie->setDefault(defSpot.slopjcie); + slopesmo->setDefault(defSpot.slopesmo); + slopesmor->setDefault(defSpot.slopesmo); + slopesmog->setDefault(defSpot.slopesmog); + slopesmob->setDefault(defSpot.slopesmob); sigmoidldajzcie->setDefault(defSpot.sigmoidldajzcie); sigmoidthjzcie->setDefault(defSpot.sigmoidthjzcie); sigmoidbljzcie->setDefault(defSpot.sigmoidbljzcie); - contqcie->setDefault(defSpot.contqcie); + // contqcie->setDefault(defSpot.contqcie); + contsigqcie->setDefault(defSpot.contsigqcie); colorflcie->setDefault(defSpot.colorflcie); targabscie->setDefault(defSpot.targabscie); targetGraycie->setDefault(defSpot.targetGraycie); catadcie->setDefault(defSpot.catadcie); - detailcie->setDefault(defSpot.detailcie); + // detailcie->setDefault(defSpot.detailcie); + strgradcie->setDefault((double)defSpot.strgradcie); + anggradcie->setDefault((double)defSpot.anggradcie); + feathercie->setDefault((double)defSpot.feathercie); 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); + highmaskcie->setDefault(defSpot.highmaskcie); + shadmaskcie->setDefault(defSpot.shadmaskcie); recothrescie->setDefault((double)defSpot.recothrescie); lowthrescie->setDefault((double)defSpot.lowthrescie); higthrescie->setDefault((double)defSpot.higthrescie); decaycie->setDefault((double)defSpot.decaycie); + strumaskcie->setDefault(defSpot.strumaskcie); + contcie->setDefault(defSpot.contcie); + blurcie->setDefault(defSpot.blurcie); + csThresholdcie->setDefault(defSpot.csthresholdcie); + redxl->setDefault(defSpot.redxl); + redyl->setDefault(defSpot.redyl); + grexl->setDefault(defSpot.grexl); + greyl->setDefault(defSpot.greyl); + bluxl->setDefault(defSpot.bluxl); + bluyl->setDefault(defSpot.bluyl); + shiftxl->setDefault(defSpot.shiftxl); + shiftyl->setDefault(defSpot.shiftyl); + refi->setDefault(defSpot.refi); + labgridcie->setDefault(defSpot.labgridcieALow, + defSpot.labgridcieBLow, + defSpot.labgridcieAHigh, + defSpot.labgridcieBHigh, + defSpot.labgridcieGx, + defSpot.labgridcieGy, + defSpot.labgridcieWx, + defSpot.labgridcieWy, + defSpot.labgridcieMx, + defSpot.labgridcieMy); } } + + void Locallabcie::curveChanged(CurveEditor* ce) { if (isLocActivated && exp->getEnabled()) { - const auto spName = M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"; - if (ce == shapejz) { + const auto spName = M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"; + + if (ce == shapejz) { if (listener) { listener->panelChanged(Evlocallabshapejz, spName); } } - if (ce == shapecz) { + if (ce == shapecz) { if (listener) { listener->panelChanged(Evlocallabshapecz, spName); } } - if (ce == shapeczjz) { + if (ce == shapeczjz) { if (listener) { listener->panelChanged(Evlocallabshapeczjz, spName); } } - - if (ce == HHshapejz) { + + if (ce == HHshapejz) { if (listener) { listener->panelChanged(EvlocallabHHshapejz, spName); } } - + if (ce == CHshapejz) { if (listener) { listener->panelChanged(EvlocallabCHshapejz, spName); @@ -9905,7 +12196,7 @@ void Locallabcie::curveChanged(CurveEditor* ce) listener->panelChanged(Evlocallabshapecie2, spName); } } - + if (ce == CCmaskcieshape) { if (listener) { listener->panelChanged(EvlocallabCCmaskcieshape, @@ -9927,6 +12218,13 @@ void Locallabcie::curveChanged(CurveEditor* ce) } } + if (ce == HHhmaskcieshape) { + if (listener) { + listener->panelChanged(EvlocallabHHhmaskcieshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + if (ce == Lmaskcieshape) { if (listener) { listener->panelChanged(EvlocallabLmaskcieshape, @@ -9941,6 +12239,12 @@ void Locallabcie::curveChanged(CurveEditor* ce) } } + if (ce == LLmaskcieshapewav) { + if (listener) { + listener->panelChanged(EvlocallabLLmaskcieshapewav, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } } } @@ -9954,6 +12258,14 @@ void Locallabcie::adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int new csThresholdjz->getHistoryString() + " (" + escapeHtmlChars(getSpotName()) + ")"); } } + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabcsThresholdcie, + csThresholdcie->getHistoryString() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } @@ -9963,6 +12275,7 @@ void Locallabcie::adjusterChanged(Adjuster* a, double newval) if (isLocActivated && exp->getEnabled()) { const auto spName = " (" + escapeHtmlChars(getSpotName()) + ")"; + if (a == reparcie) { if (listener) { listener->panelChanged(Evlocallabreparcie, @@ -9989,10 +12302,10 @@ void Locallabcie::adjusterChanged(Adjuster* a, double newval) 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 ); + sourceabscie->getTextValue() + spName); } } @@ -10087,11 +12400,18 @@ void Locallabcie::adjusterChanged(Adjuster* a, double newval) } } + if (a == lightsigqcie) { + if (listener) { + listener->panelChanged(Evlocallablightsigqcie, + lightsigqcie->getTextValue() + spName); + } + } + if (a == contlcie) { if (listener) { listener->panelChanged(Evlocallabcontlcie, - contlcie->getTextValue()+ spName); + contlcie->getTextValue() + spName); } } @@ -10102,6 +12422,13 @@ void Locallabcie::adjusterChanged(Adjuster* a, double newval) } } + if (a == detailciejz) { + if (listener) { + listener->panelChanged(Evlocallabdetailciejz, + detailciejz->getTextValue() + spName); + } + } + if (a == adapjzcie) { if (listener) { listener->panelChanged(Evlocallabadapjzcie, @@ -10119,14 +12446,14 @@ void Locallabcie::adjusterChanged(Adjuster* a, double newval) if (a == pqremap) { if (listener) { listener->panelChanged(Evlocallabpqremap, - pqremap->getTextValue()+ spName ); + pqremap->getTextValue() + spName); } } if (a == pqremapcam16) { if (listener) { listener->panelChanged(Evlocallabpqremapcam16, - pqremapcam16->getTextValue()+ spName ); + pqremapcam16->getTextValue() + spName); } } @@ -10147,7 +12474,7 @@ void Locallabcie::adjusterChanged(Adjuster* a, double newval) if (a == shjzcie) { if (listener) { listener->panelChanged(Evlocallabshjzcie, - shjzcie->getTextValue()+ spName ); + shjzcie->getTextValue() + spName); } } @@ -10242,10 +12569,17 @@ void Locallabcie::adjusterChanged(Adjuster* a, double newval) } } + if (a == sigmoidsenscie) { + if (listener) { + listener->panelChanged(Evlocallabsigmoidsenscie, + sigmoidsenscie->getTextValue() + spName); + } + } + if (a == sigmoidthjzcie) { if (listener) { listener->panelChanged(Evlocallabsigmoidthjzcie, - sigmoidthjzcie->getTextValue()+ spName ); + sigmoidthjzcie->getTextValue() + spName); } } @@ -10256,6 +12590,157 @@ void Locallabcie::adjusterChanged(Adjuster* a, double newval) } } + if (a == comprcie) { + if (listener) { + listener->panelChanged(Evlocallabcomprcie, + comprcie->getTextValue() + spName); + } + } + + if (a == strcielog) { + if (listener) { + listener->panelChanged(Evlocallabstrcielog, + strcielog->getTextValue() + spName); + } + } + + if (a == comprcieth) { + nextcomprciecount = 0; + + if (listener) { + listener->panelChanged(Evlocallabcomprcieth, + comprcieth->getTextValue() + spName); + } + } + + if (a == gamjcie) { + if (listener) { + listener->panelChanged(Evlocallabgamjcie, + gamjcie->getTextValue() + spName); + } + } + + if (a == slopjcie) { + if (listener) { + listener->panelChanged(Evlocallabslopjcie, + slopjcie->getTextValue() + spName); + } + } + + if (a == slopesmo) { + if (listener) { + listener->panelChanged(Evlocallabslopesmo, + slopesmo->getTextValue() + spName); + } + } + + if (a == slopesmor) { + if (listener) { + listener->panelChanged(Evlocallabslopesmor, + slopesmor->getTextValue() + spName); + } + } + + + if (a == slopesmog) { + if (listener) { + listener->panelChanged(Evlocallabslopesmog, + slopesmog->getTextValue() + spName); + } + } + + if (a == slopesmob) { + if (listener) { + listener->panelChanged(Evlocallabslopesmob, + slopesmob->getTextValue() + spName); + } + } + + if (a == midtcie) { + if (listener) { + listener->panelChanged(Evlocallabmidtcie, + midtcie->getTextValue() + spName); + } + } + + if (a == redxl) { + if (listener) { + listener->panelChanged(Evlocallabredxl, + redxl->getTextValue() + spName); + } + } + + if (a == redyl) { + if (listener) { + listener->panelChanged(Evlocallabredyl, + redyl->getTextValue() + spName); + } + } + + + if (a == grexl) { + if (listener) { + listener->panelChanged(Evlocallabgrexl, + grexl->getTextValue() + spName); + } + } + + if (a == greyl) { + if (listener) { + listener->panelChanged(Evlocallabgreyl, + greyl->getTextValue() + spName); + } + } + + if (a == bluxl) { + if (listener) { + listener->panelChanged(Evlocallabbluxl, + bluxl->getTextValue() + spName); + } + } + + if (a == bluyl) { + if (listener) { + listener->panelChanged(Evlocallabbluyl, + bluyl->getTextValue() + spName); + } + } + + if (a == refi) { + if (listener) { + listener->panelChanged(Evlocallabrefi, + refi->getTextValue() + spName); + } + } + + if (a == shiftxl) { + if (listener) { + listener->panelChanged(Evlocallabshiftxl, + shiftxl->getTextValue() + spName); + } + } + + if (a == shiftyl) { + if (listener) { + listener->panelChanged(Evlocallabshiftyl, + shiftyl->getTextValue() + spName); + } + } + + if (a == whitescie) { + if (listener) { + listener->panelChanged(Evlocallabwhitescie, + whitescie->getTextValue() + spName); + } + } + + if (a == blackscie) { + if (listener) { + listener->panelChanged(Evlocallabblackscie, + blackscie->getTextValue() + spName); + } + } + if (a == sigmoidbljzcie) { if (listener) { listener->panelChanged(Evlocallabsigmoidbljzcie, @@ -10270,70 +12755,20 @@ void Locallabcie::adjusterChanged(Adjuster* a, double newval) } } + if (a == contsigqcie) { + if (listener) { + listener->panelChanged(Evlocallabcontsigqcie, + contsigqcie->getTextValue() + spName); + } + } + if (a == colorflcie) { if (listener) { listener->panelChanged(Evlocallabcolorflcie, - colorflcie->getTextValue()+ spName ); + 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, @@ -10361,7 +12796,28 @@ void Locallabcie::adjusterChanged(Adjuster* a, double newval) detailcie->getTextValue() + spName); } } - + + if (a == strgradcie) { + if (listener) { + listener->panelChanged(Evlocallabstrgradcie, + strgradcie->getTextValue() + spName); + } + } + + if (a == anggradcie) { + if (listener) { + listener->panelChanged(Evlocallabanggradcie, + anggradcie->getTextValue() + spName); + } + } + + if (a == feathercie) { + if (listener) { + listener->panelChanged(Evlocallabfeathercie, + feathercie->getTextValue() + spName); + } + } + if (a == blendmaskcie) { if (listener) { listener->panelChanged(Evlocallabblendmaskcie, @@ -10404,8 +12860,22 @@ void Locallabcie::adjusterChanged(Adjuster* a, double newval) } } + if (a == highmaskcie) { + if (listener) { + listener->panelChanged(Evlocallabhighmaskcie, + highmaskcie->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == shadmaskcie) { + if (listener) { + listener->panelChanged(Evlocallabshadmaskcie, + shadmaskcie->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + if (a == recothrescie) { - + if (listener) { listener->panelChanged(Evlocallabrecothrescie, recothrescie->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); @@ -10433,12 +12903,33 @@ void Locallabcie::adjusterChanged(Adjuster* a, double newval) } } + if (a == strumaskcie) { + if (listener) { + listener->panelChanged(Evlocallabstrumaskcie, + strumaskcie->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == contcie) { + if (listener) { + listener->panelChanged(Evlocallabcontcie, + contcie->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == blurcie) { + if (listener) { + listener->panelChanged(Evlocallabblurcie, + blurcie->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } } void Locallabcie::enabledChanged() { - if (isLocActivated) { + if (isLocActivated) { if (listener) { if (exp->getEnabled()) { listener->panelChanged(EvLocenacie, diff --git a/rtgui/lockablecolorpicker.cc b/rtgui/lockablecolorpicker.cc index c87239b9c..4a8529c38 100644 --- a/rtgui/lockablecolorpicker.cc +++ b/rtgui/lockablecolorpicker.cc @@ -53,10 +53,13 @@ void LockableColorPicker::updateBackBuffer () Gtk::DrawingArea *iArea = cropWindow->getImageArea(); Glib::RefPtr pangoContext = iArea->get_pango_context (); - Pango::FontDescription fontd = pangoContext->get_font_description(); + Pango::FontDescription fontd = iArea->get_style_context()->get_font(); // set font family and size fontd.set_family(options.CPFontFamily == "default" ? "sans" : options.CPFontFamily); - fontd.set_size((options.CPFontFamily == "default" ? 8 : options.CPFontSize) * Pango::SCALE); + const int fontSize = options.CPFontFamily == "default" ? 8 : options.CPFontSize; // pt + // Non-absolute size is defined in "Pango units" and shall be multiplied by + // Pango::SCALE from "pt": + fontd.set_size (fontSize * Pango::SCALE); fontd.set_weight(Pango::WEIGHT_NORMAL); pangoContext->set_font_description (fontd); diff --git a/rtgui/lwbutton.cc b/rtgui/lwbutton.cc index 26d36f9e0..cd6678ed5 100644 --- a/rtgui/lwbutton.cc +++ b/rtgui/lwbutton.cc @@ -20,19 +20,19 @@ #include "guiutils.h" #include "rtsurface.h" -LWButton::LWButton (Cairo::RefPtr i, int aCode, void* aData, Alignment ha, Alignment va, Glib::ustring* tooltip) +LWButton::LWButton (std::shared_ptr i, int aCode, void* aData, Alignment ha, Alignment va, Glib::ustring* tooltip) : xpos(0), ypos(0), halign(ha), valign(va), icon(i), bgr(0.0), bgg(0.0), bgb(0.0), fgr(0.0), fgg(0.0), fgb(0.0), state(Normal), listener(nullptr), actionCode(aCode), actionData(aData), toolTip(tooltip) { if (i) { - w = i->getWidth () + 2; - h = i->getHeight () + 2; + w = i->getWidth (); + h = i->getHeight (); } else { w = h = 2; } } -void LWButton::getSize (int& minw, int& minh) const +void LWButton::getSize (int& minw, int& minh) const { minw = w; @@ -59,20 +59,20 @@ void LWButton::getPosition (int& x, int& y) const y = ypos; } -void LWButton::setIcon (Cairo::RefPtr i) +void LWButton::setIcon (std::shared_ptr i) { icon = i; if (i) { - w = i->getWidth () + 2; - h = i->getHeight () + 2; + w = i->getWidth (); + h = i->getHeight (); } else { w = h = 2; } } -Cairo::RefPtr LWButton::getIcon () const +std::shared_ptr LWButton::getIcon () const { return icon; @@ -186,9 +186,9 @@ void LWButton::redraw (Cairo::RefPtr context) { GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected - context->set_line_width (1.0); + context->set_line_width (2.0); // Line width shall be even to avoid blur effect when upscaling context->set_antialias (Cairo::ANTIALIAS_SUBPIXEL); - context->rectangle (xpos + 0.5, ypos + 0.5, w - 1.0, h - 1.0); + context->rectangle (xpos, ypos, w, h); if (state == Pressed_In) { context->set_source_rgb (fgr, fgg, fgb); @@ -205,13 +205,13 @@ void LWButton::redraw (Cairo::RefPtr context) } context->stroke (); - int dilat = 1; + int dilat = 0; if (state == Pressed_In) { dilat++; } - if (icon) { + if (icon && icon->hasSurface()) { context->set_source (icon->get(), xpos + dilat, ypos + dilat); context->paint (); } diff --git a/rtgui/lwbutton.h b/rtgui/lwbutton.h index a98f1fe46..43c3ffe06 100644 --- a/rtgui/lwbutton.h +++ b/rtgui/lwbutton.h @@ -40,7 +40,7 @@ public: private: int xpos, ypos, w, h; Alignment halign, valign; - Cairo::RefPtr icon; + std::shared_ptr icon; double bgr, bgg, bgb; double fgr, fgg, fgb; State state; @@ -50,7 +50,7 @@ private: Glib::ustring* toolTip; public: - LWButton (Cairo::RefPtr i, int aCode, void* aData, Alignment ha = Left, Alignment va = Center, Glib::ustring* tooltip = nullptr); + LWButton (std::shared_ptr i, int aCode, void* aData, Alignment ha = Left, Alignment va = Center, Glib::ustring* tooltip = nullptr); void getSize (int& minw, int& minh) const; void getAlignment (Alignment& ha, Alignment& va) const; @@ -58,8 +58,8 @@ public: void addPosition (int x, int y); void getPosition (int& x, int& y) const; bool inside (int x, int y) const; - void setIcon (Cairo::RefPtr i); - Cairo::RefPtr getIcon () const; + void setIcon (std::shared_ptr i); + std::shared_ptr getIcon () const; void setColors (const Gdk::RGBA& bg, const Gdk::RGBA& fg); void setToolTip (Glib::ustring* tooltip); diff --git a/rtgui/main.cc b/rtgui/main.cc index af8a6b638..fb29e9c4c 100644 --- a/rtgui/main.cc +++ b/rtgui/main.cc @@ -69,7 +69,6 @@ Glib::ustring argv2; bool simpleEditor = false; bool gimpPlugin = false; bool remote = false; -unsigned char initialGdkScale = 1; //Glib::Threads::Thread* mainThread; namespace { @@ -231,7 +230,7 @@ void cleanup_rt() RTWindow *create_rt_window() { - Glib::ustring icon_path = Glib::build_filename (argv0, "images"); + Glib::ustring icon_path = Glib::build_filename (argv0, "icons"); Glib::RefPtr defaultIconTheme = Gtk::IconTheme::get_default(); defaultIconTheme->append_search_path (icon_path); @@ -516,16 +515,6 @@ int main (int argc, char **argv) int ret = 0; - if (options.pseudoHiDPISupport) { - // Reading/updating GDK_SCALE early if it exists - const gchar *gscale = g_getenv("GDK_SCALE"); - if (gscale && gscale[0] == '2') { - initialGdkScale = 2; - } - // HOMBRE: On Windows, if resolution is set to 200%, Gtk internal variables are SCALE=2 and DPI=96 - g_setenv("GDK_SCALE", "1", true); - } - gdk_threads_set_lock_functions (G_CALLBACK (myGdkLockEnter), (G_CALLBACK (myGdkLockLeave))); gdk_threads_init(); gtk_init (&argc, &argv); // use the "--g-fatal-warnings" command line flag to make warnings fatal diff --git a/rtgui/mycurve.cc b/rtgui/mycurve.cc index d460713fb..6fd689e32 100644 --- a/rtgui/mycurve.cc +++ b/rtgui/mycurve.cc @@ -41,9 +41,7 @@ MyCurve::MyCurve () : snapToValX(0.0), snapToValY(0.0) { - - int s = RTScalable::getScale(); - int pointDiameter = (int)(RADIUS * 2.) * s; + int pointDiameter = (int)(RADIUS * 2.); graphW = get_allocation().get_width() - pointDiameter; graphH = get_allocation().get_height() - pointDiameter; prevGraphW = graphW; @@ -78,13 +76,12 @@ MyCurve::~MyCurve () void MyCurve::calcDimensions () { double newRequestedW, newRequestedH; - double s = (double)RTScalable::getScale(); newRequestedW = newRequestedH = get_allocation().get_width(); - graphX = ((double)RADIUS + (leftBar ? (double)CBAR_WIDTH + 2. + (double)CBAR_MARGIN : 0.)) * s; - graphH = graphW = newRequestedW - graphX - (double)RADIUS * s; - graphY = (double)RADIUS * s + graphW; + graphX = (double)RADIUS + (leftBar ? (double)CBAR_WIDTH + 2. + (double)CBAR_MARGIN : 0.); + graphH = graphW = newRequestedW - graphX - (double)RADIUS; + graphY = (double)RADIUS + graphW; return; } @@ -103,21 +100,19 @@ void MyCurve::get_preferred_height_vfunc (int &minimum_height, int &natural_heig void MyCurve::get_preferred_width_vfunc (int &minimum_width, int &natural_width) const { - int s = RTScalable::getScale(); - natural_width = minimum_width = (GRAPH_SIZE + (int)(RADIUS * 2.) + (leftBar ? (CBAR_WIDTH + 2 + CBAR_MARGIN) : 0)) * s; + natural_width = minimum_width = (GRAPH_SIZE + (int)(RADIUS * 2.) + RTScalable::scalePixelSize(leftBar ? (CBAR_WIDTH + 2 + CBAR_MARGIN) : 0)); } void MyCurve::get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const { minimum_height = width; - int s = RTScalable::getScale(); if (leftBar && !bottomBar) { - minimum_height -= (CBAR_WIDTH + 2 + CBAR_MARGIN) * s; + minimum_height -= CBAR_WIDTH + 2 + CBAR_MARGIN; } if (!leftBar && bottomBar) { - minimum_height += (CBAR_WIDTH + 2 + CBAR_MARGIN) * s; + minimum_height += CBAR_WIDTH + 2 + CBAR_MARGIN; } natural_height = minimum_height; @@ -189,22 +184,11 @@ float MyCurve::getVal(LUTf &curve, int x) void MyCurve::on_style_updated () { - setDirty(true); queue_draw (); } void MyCurve::refresh() { - if (leftBar != nullptr) { - leftBar->setDirty(true); - } - - if (bottomBar != nullptr) { - bottomBar->setDirty(true); - } - - setDirty(true); - Glib::RefPtr win = get_window(); if (win) { diff --git a/rtgui/mycurve.h b/rtgui/mycurve.h index 6bdfe4b66..a6e375aac 100644 --- a/rtgui/mycurve.h +++ b/rtgui/mycurve.h @@ -57,7 +57,7 @@ class MyCurveIdleHelper; class CurveEditor; class EditDataProvider; -class MyCurve : public Gtk::DrawingArea, public BackBuffer, public ColorCaller, public CoordinateProvider, public rtengine::NonCopyable +class MyCurve : public Gtk::DrawingArea, public ColorCaller, public CoordinateProvider, public rtengine::NonCopyable { friend class MyCurveIdleHelper; @@ -150,6 +150,6 @@ public: void clearPixmap () { - myCurve->setDirty(true); + myCurve->queue_draw(); } }; diff --git a/rtgui/mydiagonalcurve.cc b/rtgui/mydiagonalcurve.cc index 4f9422c69..4bf8580b5 100644 --- a/rtgui/mydiagonalcurve.cc +++ b/rtgui/mydiagonalcurve.cc @@ -23,7 +23,6 @@ #include "mydiagonalcurve.h" #include "editcallbacks.h" -#include "rtscalable.h" #include "../rtengine/curves.h" @@ -150,8 +149,7 @@ void MyDiagonalCurve::updateLocallabBackground(double ref) return false; } - mcih->clearPixmap(); - mcih->myCurve->queue_draw(); + mcih->clearPixmap(); --mcih->pending; @@ -250,24 +248,18 @@ void MyDiagonalCurve::interpolate () curveIsDirty = false; } -void MyDiagonalCurve::draw (int handle) +void MyDiagonalCurve::updateDrawingArea (const int handle, const ::Cairo::RefPtr< Cairo::Context> &cr) { - if (!isDirty()) { + if (!get_realized()) { return; } - if (!surfaceCreated()) { - return; - } - - const double s = (double)RTScalable::getScale(); - // re-calculate curve if dimensions changed int currLUTSize = point.getUpperBound(); if (curveIsDirty - || (currLUTSize == (GRAPH_SIZE * s) && (graphW > (GRAPH_SIZE * s))) - || (currLUTSize > (GRAPH_SIZE * s) && (graphW <= (GRAPH_SIZE * s) || graphW != currLUTSize)) ) + || (currLUTSize == GRAPH_SIZE && (graphW > GRAPH_SIZE)) + || (currLUTSize > GRAPH_SIZE && (graphW <= GRAPH_SIZE || graphW != currLUTSize)) ) { interpolate (); } @@ -277,20 +269,17 @@ void MyDiagonalCurve::draw (int handle) Gtk::StateFlags state = !is_sensitive() ? Gtk::STATE_FLAG_INSENSITIVE : Gtk::STATE_FLAG_NORMAL; Glib::RefPtr style = get_style_context(); - Cairo::RefPtr cr = getContext(); - cr->set_line_cap(Cairo::LINE_CAP_SQUARE); - // clear background - cr->set_source_rgba (0., 0., 0., 0.); - cr->set_operator (Cairo::OPERATOR_CLEAR); - cr->paint (); + // Setup drawing + cr->set_line_cap(Cairo::LINE_CAP_SQUARE); cr->set_operator (Cairo::OPERATOR_OVER); + // Render background style->render_background(cr, graphX, graphY-graphH, graphW, graphH); Gdk::RGBA c; - cr->set_line_width (1.0 * s); + cr->set_line_width (1.0); // Draw Locallab reference value in the background if (locallabRef > 0.0) { @@ -309,28 +298,26 @@ void MyDiagonalCurve::draw (int handle) // draw the left colored bar if (leftBar) { // first the background - BackBuffer *bb = this; - leftBar->setDrawRectangle(1. * s, graphY - graphH - 0.5, CBAR_WIDTH * s, graphH); - leftBar->expose(*this, bb); + leftBar->setColoredBarSize(1., graphY - graphH - 0.5, CBAR_WIDTH, graphH); + leftBar->updateColoredBar(cr); // now the border c = style->get_border_color(state); cr->set_source_rgb (c.get_red(), c.get_green(), c.get_blue()); - cr->rectangle(0.5 * s, graphY - graphH - 0.5 - 0.5 * s, (CBAR_WIDTH + 1) * s, (double)graphH + 1. + 1. * s); + cr->rectangle(0.5, graphY - graphH - 0.5 - 0.5, CBAR_WIDTH + 1, (double)graphH + 1. + 1.); cr->stroke(); } // draw the bottom colored bar if (bottomBar) { // first the background - BackBuffer *bb = this; - bottomBar->setDrawRectangle(graphX - 0.5, graphY + (RADIUS + CBAR_MARGIN + 1.) * s, graphW + 1., CBAR_WIDTH * s); - bottomBar->expose(*this, bb); + bottomBar->setColoredBarSize(graphX - 0.5, graphY + RADIUS + CBAR_MARGIN + 1., graphW + 1., CBAR_WIDTH); + bottomBar->updateColoredBar(cr); // now the border c = style->get_border_color (state); cr->set_source_rgb (c.get_red(), c.get_green(), c.get_blue()); - cr->rectangle(graphX - 0.5 - 0.5 * s, graphY + (RADIUS + CBAR_MARGIN + 0.5) * s, graphW + 1. + 0.5 * s, (CBAR_WIDTH + 1.) * s); + cr->rectangle(graphX - 0.5 - 0.5, graphY + CBAR_MARGIN + 0.5, graphW + 1. + 0.5, CBAR_WIDTH + 1.); cr->stroke(); } @@ -345,7 +332,7 @@ void MyDiagonalCurve::draw (int handle) } // draw histogram - cr->set_line_width (1.0 * s); + cr->set_line_width (1.0); double stepSize = graphW / 255.0; cr->move_to (graphX, graphY); c = style->get_color(state); @@ -367,18 +354,18 @@ void MyDiagonalCurve::draw (int handle) } // draw the grid lines: - cr->set_line_width (1.0 * s); + cr->set_line_width (1.0); c = style->get_border_color(state); 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++) { // horizontal lines - cr->move_to (graphX - 0.5 - 0.5 * s, graphY + 0.5 + 0.5 * s - (graphH + 1. + 1. * s) * (double)i / 10.); - cr->rel_line_to (graphW + 1. + 1. * s, 0.); + cr->move_to (graphX - 0.5 - 0.5, graphY + 0.5 + 0.5 - (graphH + 1. + 1.) * (double)i / 10.); + cr->rel_line_to (graphW + 1. + 1., 0.); // vertical lines - cr->move_to (graphX - 0.5 - 0.5 * s + (graphW + 1. + 1. * s) * (double)i / 10., graphY + 0.5 + 0.5 * s); - cr->rel_line_to (0., -graphH - 1. - 1. * s); + cr->move_to (graphX - 0.5 - 0.5 + (graphW + 1. + 1.) * (double)i / 10., graphY + 0.5 + 0.5); + cr->rel_line_to (0., -graphH - 1. - 1.); } cr->stroke (); @@ -390,16 +377,15 @@ void MyDiagonalCurve::draw (int handle) cr->set_source_rgb (c.get_red(), c.get_green(), c.get_blue()); } - std::valarray ds (1); - ds[0] = 4 * s; + const std::valarray ds = {4.}; cr->set_dash (ds, 0); - cr->move_to (graphX - 0.5 - 0.5 * s, graphY + 0.5 + 0.5 * s); - cr->rel_line_to (graphW + 1. + 1. * s, -(graphH + 1. + 1. * s)); + cr->move_to (graphX - 0.5 - 0.5, graphY + 0.5 + 0.5); + cr->rel_line_to (graphW + 1. + 1., -(graphH + 1. + 1.)); cr->stroke (); cr->unset_dash (); cr->set_antialias (Cairo::ANTIALIAS_SUBPIXEL); - cr->set_line_width (1.0 * s); + cr->set_line_width (1.0); // draw upper and lower bounds if (curve.type == DCT_Parametric && activeParam > 0 && lpoint.getUpperBound() > 1 && upoint.getUpperBound() > 1) { @@ -436,34 +422,34 @@ 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 * static_cast(pipetteR), graphY + 1. * s); - cr->rel_line_to (0, -graphH - 1. * s); + cr->move_to (graphX + graphW * static_cast(pipetteR), graphY + 1.); + cr->rel_line_to (0, -graphH - 1.); 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 * static_cast(pipetteG), graphY + 1. * s); - cr->rel_line_to (0, -graphH - 1. * s); + cr->move_to (graphX + graphW * static_cast(pipetteG), graphY + 1.); + cr->rel_line_to (0, -graphH - 1.); 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 * static_cast(pipetteB), graphY + 1. * s); - cr->rel_line_to (0, -graphH - 1. * s); + cr->move_to (graphX + graphW * static_cast(pipetteB), graphY + 1.); + cr->rel_line_to (0, -graphH - 1.); cr->stroke (); } } if (pipetteVal > -1.f) { - cr->set_line_width (2. * s); + cr->set_line_width (2.); c = style->get_color (state); cr->set_source_rgb (c.get_red(), c.get_green(), c.get_blue()); - cr->move_to (graphX + graphW * static_cast(pipetteVal), graphY + 1. * s); - cr->rel_line_to (0, -graphH - 1. * s); + cr->move_to (graphX + graphW * static_cast(pipetteVal), graphY + 1.); + cr->rel_line_to (0, -graphH - 1.); cr->stroke (); - cr->set_line_width (1. * s); + cr->set_line_width (1.); } } @@ -472,10 +458,9 @@ void MyDiagonalCurve::draw (int handle) // draw the cage of the NURBS curve if (curve.type == DCT_NURBS) { unsigned int nbPoints; - std::valarray ch_ds (1); - ch_ds[0] = 2 * s; + const std::valarray ch_ds = {2.}; cr->set_dash (ch_ds, 0); - cr->set_line_width (0.75 * s); + cr->set_line_width (0.75); cr->set_source_rgb (c.get_red(), c.get_green(), c.get_blue()); std::vector points = getPoints(); nbPoints = ((int)points.size() - 1) / 2; @@ -501,7 +486,7 @@ void MyDiagonalCurve::draw (int handle) } cr->unset_dash (); - cr->set_line_width (1.0 * s); + cr->set_line_width (1.0); } // draw curve @@ -542,40 +527,26 @@ void MyDiagonalCurve::draw (int handle) double x = graphX + graphW * curve.x.at(i); // project (curve.x.at(i), 0, 1, graphW); double y = graphY - graphH * curve.y.at(i); // project (curve.y.at(i), 0, 1, graphH); - cr->arc (x, y, RADIUS * s + 0.5, 0, 2 * rtengine::RT_PI); + cr->arc (x, y, RADIUS + 0.5, 0, 2 * rtengine::RT_PI); cr->fill (); if (i == edited_point) { - cr->set_line_width(2. * s); - cr->arc (x, y, (RADIUS + 2.) * s, 0, 2 * rtengine::RT_PI); + cr->set_line_width(2.); + cr->arc (x, y, RADIUS + 2., 0, 2 * rtengine::RT_PI); cr->stroke(); - cr->set_line_width(1. * s); + cr->set_line_width(1.); } } } - - setDirty(false); - queue_draw(); } bool MyDiagonalCurve::on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) { - Gtk::Allocation allocation = get_allocation(); - allocation.set_x(0); - allocation.set_y(0); + // Draw drawing area + // Note: As drawing area surface is updated inside on_draw function, hidpi is automatically supported + updateDrawingArea(lit_point, cr); - // setDrawRectangle will allocate the backbuffer Surface - if (setDrawRectangle(Cairo::FORMAT_ARGB32, allocation)) { - setDirty(true); - - if (prevGraphW > GRAPH_SIZE || graphW > GRAPH_SIZE) { - curveIsDirty = true; - } - } - - draw (lit_point); - copySurface(cr); return false; } @@ -594,10 +565,8 @@ bool MyDiagonalCurve::handleEvents (GdkEvent* event) return false; } - double s = RTScalable::getScale(); - - double minDistanceX = double(MIN_DISTANCE) / graphW * s; - double minDistanceY = double(MIN_DISTANCE) / graphH * s; + double minDistanceX = double(MIN_DISTANCE) / graphW; + double minDistanceY = double(MIN_DISTANCE) / graphH; switch (event->type) { case GDK_BUTTON_PRESS: @@ -644,8 +613,7 @@ bool MyDiagonalCurve::handleEvents (GdkEvent* event) curve.y.at(closest_point) = clampedY; curveIsDirty = true; - setDirty(true); - draw (closest_point); + queue_draw(); notifyListener (); } @@ -680,8 +648,7 @@ bool MyDiagonalCurve::handleEvents (GdkEvent* event) editedPos.at(1) = curve.y.at(edited_point); coordinateAdjuster->setPos(editedPos); coordinateAdjuster->startNumericalAdjustment(newBoundaries); - setDirty(true); - draw (lit_point); + queue_draw(); new_type = CSArrow; } } @@ -701,8 +668,7 @@ bool MyDiagonalCurve::handleEvents (GdkEvent* event) if (lit_point != edited_point) { edited_point = lit_point; curveIsDirty = true; - setDirty(true); - draw (lit_point); + queue_draw(); std::vector newBoundaries; newBoundaries.resize(2); int size = curve.x.size(); @@ -774,8 +740,7 @@ bool MyDiagonalCurve::handleEvents (GdkEvent* event) curve.x.push_back (0); curve.y.push_back (0); curveIsDirty = true; - setDirty(true); - draw (lit_point); + queue_draw(); } } @@ -788,8 +753,7 @@ bool MyDiagonalCurve::handleEvents (GdkEvent* event) } if (lit_point != previous_lit_point) { - setDirty(true); - draw (lit_point); + queue_draw(); } grab_point = -1; @@ -809,8 +773,7 @@ bool MyDiagonalCurve::handleEvents (GdkEvent* event) new_type = CSArrow; lit_point = -1; pipetteR = pipetteG = pipetteB = -1.f; - setDirty(true); - draw (lit_point); + queue_draw(); } } @@ -854,8 +817,7 @@ bool MyDiagonalCurve::handleEvents (GdkEvent* event) } if (lit_point != previous_lit_point) { - setDirty(true); - draw (lit_point); + queue_draw(); if (lit_point > -1) { editedPos.at(0) = curve.x.at(lit_point); @@ -884,8 +846,7 @@ bool MyDiagonalCurve::handleEvents (GdkEvent* event) } if (lit_point != previous_lit_point) { - setDirty(true); - draw (lit_point); + queue_draw(); } } } else { @@ -986,8 +947,7 @@ bool MyDiagonalCurve::handleEvents (GdkEvent* event) if (curve.x.at(grab_point) != prevPosX || curve.y.at(grab_point) != prevPosY) { // we recalculate the curve only if we have to curveIsDirty = true; - setDirty(true); - draw (lit_point); + queue_draw(); notifyListener (); if (coordinateAdjuster->is_visible()) { @@ -1069,8 +1029,7 @@ void MyDiagonalCurve::pipetteMouseOver (CurveEditor *ce, EditDataProvider *provi return; } - double s = (double)RTScalable::getScale(); - double minDistanceX = MIN_DISTANCE / graphW * s; + double minDistanceX = MIN_DISTANCE / graphW; if (curve.type == DCT_Linear || curve.type == DCT_Spline || curve.type == DCT_NURBS || curve.type == DCT_CatumullRom) { // get the pointer position @@ -1092,12 +1051,11 @@ void MyDiagonalCurve::pipetteMouseOver (CurveEditor *ce, EditDataProvider *provi } if (lit_point != previous_lit_point) { - setDirty(true); - draw (lit_point); + queue_draw(); } } } else { - draw(lit_point); + queue_draw(); } if (edited_point == -1) { @@ -1124,8 +1082,7 @@ bool MyDiagonalCurve::pipetteButton1Pressed(EditDataProvider *provider, int modi return false; } - double s = (double)RTScalable::getScale(); - double minDistanceX = double(MIN_DISTANCE) * s / graphW; + double minDistanceX = double(MIN_DISTANCE) / graphW; snapToElmt = -100; @@ -1172,8 +1129,7 @@ bool MyDiagonalCurve::pipetteButton1Pressed(EditDataProvider *provider, int modi } curveIsDirty = true; - setDirty(true); - draw (lit_point); + queue_draw(); notifyListener (); } @@ -1201,8 +1157,7 @@ void MyDiagonalCurve::pipetteButton1Released(EditDataProvider *provider) return; } - double s = (double)RTScalable::getScale(); - double minDistanceX = double(MIN_DISTANCE) * s / graphW; + double minDistanceX = double(MIN_DISTANCE) / graphW; snapToElmt = -100; @@ -1221,8 +1176,7 @@ void MyDiagonalCurve::pipetteButton1Released(EditDataProvider *provider) } if (lit_point != previous_lit_point) { - setDirty(true); - draw (lit_point); + queue_draw(); } grab_point = -1; @@ -1309,8 +1263,7 @@ void MyDiagonalCurve::pipetteDrag(EditDataProvider *provider, int modifierKey) if (curve.x.at(grab_point) != prevPosX || curve.y.at(grab_point) != prevPosY) { // we recalculate the curve only if we have to curveIsDirty = true; - setDirty(true); - draw (lit_point); + queue_draw(); notifyListener (); if (lit_point > -1 && coordinateAdjuster->is_visible()) { @@ -1505,7 +1458,6 @@ void MyDiagonalCurve::setPoints (const std::vector& p) } curveIsDirty = true; - setDirty(true); queue_draw (); } @@ -1520,8 +1472,7 @@ void MyDiagonalCurve::setPos(double pos, int chanIdx) } curveIsDirty = true; - setDirty(true); - draw(lit_point); + queue_draw(); notifyListener (); } @@ -1530,8 +1481,7 @@ void MyDiagonalCurve::stopNumericalAdjustment() if (edited_point > -1) { edited_point = grab_point = lit_point = -1; coordinateAdjuster->stopNumericalAdjustment(); - setDirty(true); - draw(lit_point); + queue_draw(); } } @@ -1539,13 +1489,12 @@ void MyDiagonalCurve::setType (DiagonalCurveType t) { curve.type = t; - setDirty(true); + queue_draw(); } void MyDiagonalCurve::setActiveParam (int ac) { activeParam = ac; - setDirty(true); queue_draw (); } @@ -1579,7 +1528,6 @@ void MyDiagonalCurve::updateBackgroundHistogram (const LUTu & hist) } mcih->clearPixmap(); - mcih->myCurve->queue_draw(); --mcih->pending; @@ -1632,6 +1580,5 @@ void MyDiagonalCurve::reset(const std::vector &resetCurve, double identi break; } - setDirty(true); - draw(-1); + queue_draw(); } diff --git a/rtgui/mydiagonalcurve.h b/rtgui/mydiagonalcurve.h index 0eb173f70..76c9c1ec0 100644 --- a/rtgui/mydiagonalcurve.h +++ b/rtgui/mydiagonalcurve.h @@ -64,7 +64,7 @@ protected: bool bghistvalid; double locallabRef; // Locallab reference value to display in the background - void draw (int handle); + void updateDrawingArea (const int handle, const ::Cairo::RefPtr< Cairo::Context> &cr); void interpolate (); void findClosestPoint(); CursorShape motionNotify(CursorShape type, double minDistanceX, double minDistanceY, int num); diff --git a/rtgui/myflatcurve.cc b/rtgui/myflatcurve.cc index 11d89ebd8..dc79a400b 100644 --- a/rtgui/myflatcurve.cc +++ b/rtgui/myflatcurve.cc @@ -23,7 +23,6 @@ #include "myflatcurve.h" #include "editcallbacks.h" -#include "rtscalable.h" #include "../rtengine/curves.h" @@ -130,24 +129,18 @@ void MyFlatCurve::interpolate () curveIsDirty = false; } -void MyFlatCurve::draw () +void MyFlatCurve::updateDrawingArea (const ::Cairo::RefPtr< Cairo::Context> &cr) { - if (!isDirty()) { + if (!get_realized()) { return; } - if (!surfaceCreated()) { - return; - } - - double s = (double)RTScalable::getScale(); - // re-calculate curve if dimensions changed int currLUTSize = point.getUpperBound(); if (curveIsDirty - || (currLUTSize == (GRAPH_SIZE * s) && (graphW > (GRAPH_SIZE * s))) - || (currLUTSize > (GRAPH_SIZE * s) && (graphW <= (GRAPH_SIZE * s) || graphW != currLUTSize)) ) + || (currLUTSize == GRAPH_SIZE && (graphW > GRAPH_SIZE)) + || (currLUTSize > GRAPH_SIZE && (graphW <= GRAPH_SIZE || graphW != currLUTSize)) ) { interpolate (); } @@ -155,20 +148,17 @@ void MyFlatCurve::draw () Gtk::StateFlags state = !is_sensitive() ? Gtk::STATE_FLAG_INSENSITIVE : Gtk::STATE_FLAG_NORMAL; Glib::RefPtr style = get_style_context(); - Cairo::RefPtr cr = getContext(); - cr->set_line_cap(Cairo::LINE_CAP_SQUARE); - // clear background - cr->set_source_rgba (0., 0., 0., 0.); - cr->set_operator (Cairo::OPERATOR_CLEAR); - cr->paint (); + // Setup drawing + cr->set_line_cap(Cairo::LINE_CAP_SQUARE); cr->set_operator (Cairo::OPERATOR_OVER); + // Render background style->render_background(cr, graphX, graphY-graphH, graphW, graphH); Gdk::RGBA c; - cr->set_line_width (1.0 * s); + cr->set_line_width (1.0); // Draw Locallab reference value in the background if (locallabRef > 0.0) { @@ -187,49 +177,46 @@ void MyFlatCurve::draw () // draw the left colored bar if (leftBar) { // first the background - BackBuffer *bb = this; - leftBar->setDrawRectangle(1. * s, graphY - graphH - 0.5, CBAR_WIDTH * s, graphH); - leftBar->expose(*this, bb); + leftBar->setColoredBarSize(1., graphY - graphH - 0.5, CBAR_WIDTH, graphH); + leftBar->updateColoredBar(cr); // now the border c = style->get_border_color(state); cr->set_source_rgb (c.get_red(), c.get_green(), c.get_blue()); - cr->rectangle(0.5 * s, graphY - graphH - 0.5 - 0.5 * s, (CBAR_WIDTH + 1) * s, (double)graphH + 1. + 1. * s); + cr->rectangle(0.5, graphY - graphH - 0.5 - 0.5, CBAR_WIDTH + 1, (double)graphH + 1.); cr->stroke(); } // draw the bottom colored bar if (bottomBar) { // first the background - BackBuffer *bb = this; - bottomBar->setDrawRectangle(graphX - 0.5, graphY + (RADIUS + CBAR_MARGIN + 1.) * s, graphW + 1., CBAR_WIDTH * s); - bottomBar->expose(*this, bb); + bottomBar->setColoredBarSize(graphX - 0.5, graphY + RADIUS + CBAR_MARGIN + 1., graphW + 1., CBAR_WIDTH); + bottomBar->updateColoredBar(cr); // now the border c = style->get_border_color(state); cr->set_source_rgb (c.get_red(), c.get_green(), c.get_blue()); - cr->rectangle(graphX - 0.5 - 0.5 * s, graphY + (RADIUS + CBAR_MARGIN + 0.5) * s, graphW + 1. + 0.5 * s, (CBAR_WIDTH + 1.) * s); + cr->rectangle(graphX - 0.5 - 0.5, graphY + RADIUS + CBAR_MARGIN + 0.5, graphW + 1. + 1., CBAR_WIDTH + 1.); cr->stroke(); } // draw f(x)=0.5 line c = style->get_border_color(state); cr->set_source_rgb (c.get_red(), c.get_green(), c.get_blue()); - std::valarray ds (1); - ds[0] = 4 * s; + const std::valarray ds = {4.}; cr->set_dash (ds, 0); - cr->move_to (graphX - 1. * s, graphY - graphH / 2.); - cr->rel_line_to (graphW + 2 * s, 0.); + cr->move_to (graphX - 1., graphY - graphH / 2.); + cr->rel_line_to (graphW + 2, 0.); cr->stroke (); cr->unset_dash (); cr->set_antialias (Cairo::ANTIALIAS_SUBPIXEL); - cr->set_line_width (1.0 * s); + cr->set_line_width (1.0); cr->set_line_cap(Cairo::LINE_CAP_BUTT); // draw the pipette values if (pipetteR > -1.f || pipetteG > -1.f || pipetteB > -1.f) { - cr->set_line_width (0.75 * s); + cr->set_line_width (0.75); cr->set_source_rgb (c.get_red(), c.get_green(), c.get_blue()); int n = 0; @@ -248,34 +235,34 @@ 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 * static_cast(pipetteR), graphY + 1. * s); - cr->rel_line_to (0, -graphH - 1. * s); + cr->move_to (graphX + graphW * static_cast(pipetteR), graphY + 1.); + cr->rel_line_to (0, -graphH - 1.); 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 * static_cast(pipetteG), graphY + 1. * s); - cr->rel_line_to (0, -graphH - 1. * s); + cr->move_to (graphX + graphW * static_cast(pipetteG), graphY + 1.); + cr->rel_line_to (0, -graphH - 1.); 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 * static_cast(pipetteB), graphY + 1. * s); - cr->rel_line_to (0, -graphH - 1. * s); + cr->move_to (graphX + graphW * static_cast(pipetteB), graphY + 1.); + cr->rel_line_to (0, -graphH - 1.); cr->stroke (); } } if (pipetteVal > -1.f) { - cr->set_line_width (2. * s); + cr->set_line_width (2.); c = style->get_color (state); cr->set_source_rgb (c.get_red(), c.get_green(), c.get_blue()); - cr->move_to (graphX + graphW * static_cast(pipetteVal), graphY + 1. * s); - cr->rel_line_to (0, -graphH - 1. * s); + cr->move_to (graphX + graphW * static_cast(pipetteVal), graphY + 1.); + cr->rel_line_to (0, -graphH - 1.); cr->stroke (); - cr->set_line_width (1. * s); + cr->set_line_width (1.); } } @@ -286,7 +273,7 @@ void MyFlatCurve::draw () for (int i = 0; i < (int)curve.x.size(); ++i) { if (curve.x.at(i) != -1.) { - double coloredLineWidth = rtengine::min( rtengine::max(75. * s, graphW) / (75. * s), 8. * s); + double coloredLineWidth = rtengine::min( rtengine::max(75., graphW) / 75., 8.); cr->set_line_width (coloredLineWidth); colorProvider->colorForValue(curve.x.at(i), curve.y.at(i), CCET_VERTICAL_BAR, colorCallerId, this); @@ -296,8 +283,8 @@ void MyFlatCurve::draw () cr->set_line_width (2 * coloredLineWidth); } - cr->move_to (graphX + graphW * curve.x.at(i), graphY + 0.5 + 0.5 * s ); - cr->rel_line_to (0., -graphH - 1. - s); + cr->move_to (graphX + graphW * curve.x.at(i), graphY + 0.5 + 0.5); + cr->rel_line_to (0., -graphH - 1. - 1.); cr->stroke (); cr->set_line_width (coloredLineWidth); @@ -323,39 +310,39 @@ void MyFlatCurve::draw () colorProvider->colorForValue(curve.x.at(i), curve.y.at(i), CCET_HORIZONTAL_BAR, colorCallerId, this); cr->set_source_rgb (ccRed, ccGreen, ccBlue); - cr->move_to (graphX - 0.5 - 0.5 * s , graphY - graphH * curve.y.at(point)); - cr->rel_line_to (graphW + 1. + s, 0.); + cr->move_to (graphX - 0.5 - 0.5 , graphY - graphH * curve.y.at(point)); + cr->rel_line_to (graphW + 1. + 1., 0.); cr->stroke (); } } } // endif - cr->set_line_width (1.0 * s); + cr->set_line_width (1.0); } else { cr->set_source_rgb (0.5, 0.0, 0.0); if (edited_point > -1 || ((lit_point > -1) && ((area & (FCT_Area_H | FCT_Area_V | FCT_Area_Point)) || editedHandle == FCT_EditedHandle_CPointUD)) ) { // draw the lit_point's vertical line if (edited_point > -1 || (editedHandle & (FCT_EditedHandle_CPointUD | FCT_EditedHandle_CPoint | FCT_EditedHandle_CPointY))) { - cr->set_line_width (2.0 * s); + cr->set_line_width (2.0); } int point = edited_point > -1 ? edited_point : lit_point; - cr->move_to (graphX + graphW * curve.x.at(point), graphY + 0.5 + 0.5 * s ); - cr->rel_line_to (0., -graphH - 1. - s); + cr->move_to (graphX + graphW * curve.x.at(point), graphY + 0.5 + 0.5); + cr->rel_line_to (0., -graphH - 1. - 1.); cr->stroke (); - cr->set_line_width (1.0 * s); + cr->set_line_width (1.0); // draw the lit_point's horizontal line if (editedHandle & (FCT_EditedHandle_CPointUD | FCT_EditedHandle_CPoint | FCT_EditedHandle_CPointY)) { - cr->set_line_width (2.0 * s); + cr->set_line_width (2.0); } - cr->move_to (graphX - 0.5 - 0.5 * s , graphY - graphH * curve.y.at(point)); - cr->rel_line_to (graphW + 1. + s, 0.); + cr->move_to (graphX - 0.5 - 0.5 , graphY - graphH * curve.y.at(point)); + cr->rel_line_to (graphW + 1. + 1., 0.); cr->stroke (); - cr->set_line_width (1.0 * s); + cr->set_line_width (1.0); } } @@ -364,10 +351,10 @@ void MyFlatCurve::draw () // draw the graph's borders: c = style->get_border_color(state); cr->set_source_rgb (c.get_red(), c.get_green(), c.get_blue()); - cr->rectangle(graphX - 0.5 - 0.5 * s, graphY + 0.5 + 0.5 * s, graphW + 1. + 1. * s, -(graphH + 1. + 1. * s)); + cr->rectangle(graphX - 0.5 - 0.5, graphY + 0.5 + 0.5, graphW + 1. + 1., -(graphH + 1. + 1.)); cr->stroke (); - double lineMinLength = 1. / graphW * (double)(SQUARE) * 0.9 * s; + double lineMinLength = 1. / graphW * (double)(SQUARE) * 0.9; if (tanHandlesDisplayed && lit_point != -1 && getHandles(lit_point) && curve.x.at(lit_point) != -1.) { double x = graphX + graphW * curve.x.at(lit_point); @@ -398,9 +385,9 @@ void MyFlatCurve::draw () cr->move_to (x, y); if (crossingTheFrame) { - cr->line_to (graphX - 0.5 - 0.5 * s, y); + cr->line_to (graphX - 0.5 - 0.5, y); cr->stroke (); - cr->move_to (graphX + graphW + 0.5 + 0.5 * s, y); + cr->move_to (graphX + graphW + 0.5 + 0.5, y); } cr->line_to (x2, y); @@ -408,7 +395,7 @@ void MyFlatCurve::draw () } // draw tangential knot - square = (area == FCT_Area_LeftTan ? SQUARE * 2. : SQUARE) * s; + square = (area == FCT_Area_LeftTan ? SQUARE * 2. : SQUARE); cr->rectangle(x2 - square, y - square, 2.*square, 2.*square); cr->fill(); @@ -434,9 +421,9 @@ void MyFlatCurve::draw () cr->move_to (x, y); if (crossingTheFrame) { - cr->line_to (graphX + graphW + 0.5 + 0.5 * s, y); + cr->line_to (graphX + graphW + 0.5 + 0.5, y); cr->stroke (); - cr->move_to (graphX - 0.5 - 0.5 * s, y); + cr->move_to (graphX - 0.5 - 0.5, y); } cr->line_to (x2, y); @@ -444,7 +431,7 @@ void MyFlatCurve::draw () } // draw tangential knot - square = (area == FCT_Area_RightTan ? SQUARE * 2. : SQUARE) * s; + square = (area == FCT_Area_RightTan ? SQUARE * 2. : SQUARE); cr->rectangle(x2 - square, y - square, 2.*square, 2.*square); cr->fill(); } @@ -483,15 +470,15 @@ void MyFlatCurve::draw () double x = graphX + graphW * curve.x.at(i); // project (curve.x.at(i), 0, 1, graphW); double y = graphY - graphH * curve.y.at(i); // project (curve.y.at(i), 0, 1, graphH); - cr->arc (x, y, RADIUS * s + 0.5, 0, 2 * rtengine::RT_PI); + cr->arc (x, y, RADIUS + 0.5, 0, 2 * rtengine::RT_PI); cr->fill (); if (i == edited_point) { cr->set_source_rgb (1.0, 0.0, 0.0); - cr->set_line_width(2. * s); - cr->arc (x, y, (RADIUS + 2.) * s, 0, 2 * rtengine::RT_PI); + cr->set_line_width(2.); + cr->arc (x, y, RADIUS + 2., 0, 2 * rtengine::RT_PI); cr->stroke(); - cr->set_line_width(1. * s); + cr->set_line_width(1.); } } @@ -524,30 +511,14 @@ void MyFlatCurve::draw () graphW * minDistanceY); cr->fill(); } - - setDirty(false); - queue_draw(); } bool MyFlatCurve::on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) { - Gtk::Allocation allocation = get_allocation(); - allocation.set_x(0); - allocation.set_y(0); + // Draw drawing area + // Note: As drawing area surface is updated inside on_draw function, hidpi is automatically supported + updateDrawingArea(cr); - int s = RTScalable::getScale(); - - // setDrawRectangle will allocate the backbuffer Surface - if (setDrawRectangle(Cairo::FORMAT_ARGB32, allocation)) { - setDirty(true); - - if (prevGraphW > (GRAPH_SIZE * s) || graphW > (GRAPH_SIZE * s)) { - curveIsDirty = true; - } - } - - draw (); - copySurface(cr); return false; } @@ -619,10 +590,8 @@ bool MyFlatCurve::handleEvents (GdkEvent* event) return false; } - double s = RTScalable::getScale(); - - minDistanceX = double(MIN_DISTANCE) / graphW * s; - minDistanceY = double(MIN_DISTANCE) / graphH * s; + minDistanceX = double(MIN_DISTANCE) / graphW; + minDistanceY = double(MIN_DISTANCE) / graphH; switch (event->type) { @@ -680,8 +649,7 @@ bool MyFlatCurve::handleEvents (GdkEvent* event) curve.rightTangent.at(closest_point) = 0.35; curveIsDirty = true; - setDirty(true); - draw (); + queue_draw(); notifyListener (); lit_point = closest_point; @@ -738,8 +706,7 @@ bool MyFlatCurve::handleEvents (GdkEvent* event) new_type = CSArrow; tanHandlesDisplayed = false; edited_point = lit_point; - setDirty(true); - draw (); + queue_draw(); std::vector newBoundaries(4); int size = curve.x.size(); @@ -787,8 +754,7 @@ bool MyFlatCurve::handleEvents (GdkEvent* event) // the cursor is close to an existing point if (lit_point != edited_point) { edited_point = lit_point; - setDirty(true); - draw (); + queue_draw(); std::vector newBoundaries(4); int size = curve.x.size(); @@ -910,8 +876,7 @@ bool MyFlatCurve::handleEvents (GdkEvent* event) break; } - setDirty(true); - draw (); + queue_draw(); retval = true; //notifyListener (); } @@ -1042,8 +1007,7 @@ bool MyFlatCurve::handleEvents (GdkEvent* event) } if ((lit_point != previous_lit_point) || (prevArea != area)) { - setDirty(true); - draw (); + queue_draw(); } if (coordinateAdjuster->is_visible() && edited_point == -1) { @@ -1121,8 +1085,7 @@ bool MyFlatCurve::handleEvents (GdkEvent* event) if (curve.leftTangent.at(lit_point) != prevValue) { curveIsDirty = true; - setDirty(true); - draw (); + queue_draw(); notifyListener (); if (coordinateAdjuster->is_visible()) { @@ -1153,8 +1116,7 @@ bool MyFlatCurve::handleEvents (GdkEvent* event) if (curve.rightTangent.at(lit_point) != prevValue) { curveIsDirty = true; - setDirty(true); - draw (); + queue_draw(); notifyListener (); editedPos.at(3) = curve.rightTangent.at(lit_point); coordinateAdjuster->setPos(editedPos); @@ -1198,8 +1160,7 @@ bool MyFlatCurve::handleEvents (GdkEvent* event) lit_point = -1; tanHandlesDisplayed = false; pipetteR = pipetteG = pipetteB = -1.f; - setDirty(true); - draw (); + queue_draw(); } retval = true; @@ -1290,11 +1251,10 @@ void MyFlatCurve::pipetteMouseOver (CurveEditor *ce, EditDataProvider *provider, if (edited_point == -1) { if (editedHandle == FCT_EditedHandle_None && lit_point != previous_lit_point) { - setDirty(true); - draw (); + queue_draw(); } } else { - draw(); + queue_draw(); } if (edited_point == -1) { @@ -1321,13 +1281,11 @@ bool MyFlatCurve::pipetteButton1Pressed(EditDataProvider *provider, int modifier // hide the tangent handles tanHandlesDisplayed = false; - int s = RTScalable::getScale(); - // Action on BUTTON_PRESS and no edited point switch (area) { case (FCT_Area_Insertion): { - rtengine::FlatCurve rtCurve(getPoints(), true, GRAPH_SIZE * s); + rtengine::FlatCurve rtCurve(getPoints(), true, GRAPH_SIZE); std::vector::iterator itx, ity, itlt, itrt; int num = (int)curve.x.size(); @@ -1364,8 +1322,7 @@ bool MyFlatCurve::pipetteButton1Pressed(EditDataProvider *provider, int modifier curve.rightTangent.at(closest_point) = 0.35; curveIsDirty = true; - setDirty(true); - draw (); + queue_draw(); notifyListener (); lit_point = closest_point; @@ -1407,8 +1364,7 @@ void MyFlatCurve::pipetteButton1Released(EditDataProvider *provider) getCursorPosition(Gdk::EventType(Gdk::BUTTON_PRESS), false, px, graphY, Gdk::ModifierType(0)); getMouseOverArea(); - setDirty(true); - draw (); + queue_draw(); //notifyListener (); } @@ -1633,8 +1589,7 @@ void MyFlatCurve::movePoint(bool moveX, bool moveY, bool pipetteDrag) if (curve.x.at(lit_point) != prevPosX || curve.y.at(lit_point) != prevPosY) { // we recompute the curve only if we have to curveIsDirty = true; - setDirty(true); - draw (); + queue_draw(); notifyListener (); } } @@ -1842,7 +1797,6 @@ void MyFlatCurve::setPoints (const std::vector& p) } curveIsDirty = true; - setDirty(true); queue_draw (); } @@ -1869,8 +1823,7 @@ void MyFlatCurve::setPos(double pos, int chanIdx) } curveIsDirty = true; - setDirty(true); - draw(); + queue_draw(); notifyListener (); } @@ -1880,8 +1833,7 @@ void MyFlatCurve::stopNumericalAdjustment() edited_point = lit_point = -1; area = FCT_Area_None; coordinateAdjuster->stopNumericalAdjustment(); - setDirty(true); - draw(); + queue_draw(); } } @@ -1904,8 +1856,7 @@ void MyFlatCurve::updateLocallabBackground(double ref) return false; } - mcih->clearPixmap(); - mcih->myCurve->queue_draw(); + mcih->clearPixmap(); --mcih->pending; @@ -1918,7 +1869,7 @@ void MyFlatCurve::setType (FlatCurveType t) { curve.type = t; - setDirty(true); + queue_draw(); } void MyFlatCurve::reset(const std::vector &resetCurve, double identityValue) @@ -1946,8 +1897,7 @@ void MyFlatCurve::reset(const std::vector &resetCurve, double identityVa break; } - setDirty(true); - draw(); + queue_draw(); } void MyFlatCurve::defaultCurve (double iVal) diff --git a/rtgui/myflatcurve.h b/rtgui/myflatcurve.h index f51586567..18d284e7e 100644 --- a/rtgui/myflatcurve.h +++ b/rtgui/myflatcurve.h @@ -99,7 +99,7 @@ protected: enum MouseOverAreas area; double locallabRef; // Locallab reference value to display in the background - void draw (); + void updateDrawingArea (const ::Cairo::RefPtr< Cairo::Context> &cr); void movePoint(bool moveX, bool moveY, bool pipetteDrag = false); void defaultCurve (double iVal = 0.5); void interpolate (); diff --git a/rtgui/options.cc b/rtgui/options.cc index 61d67f9b6..bdc595f5c 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -358,7 +358,6 @@ void Options::setDefaults() fontSize = 10; CPFontFamily = "default"; CPFontSize = 8; - pseudoHiDPISupport = false; lastScale = 5; lastShowAllExif = false; panAccelFactor = 5; @@ -368,6 +367,7 @@ void Options::setDefaults() fbShowDateTime = true; fbShowBasicExif = true; fbShowExpComp = false; + maxZoomLimit = MaxZoom::PERCENTS_1600; #ifdef _WIN32 // use windows setting for visibility of hidden files/folders SHELLFLAGSTATE sft = { 0 }; @@ -435,6 +435,10 @@ void Options::setDefaults() parseExtensionsEnabled.clear(); parsedExtensions.clear(); parsedExtensionsSet.clear(); + browseRecursive = false; + browseRecursiveDepth = 10; + browseRecursiveMaxDirs = 100; + browseRecursiveFollowLinks = true; renameUseTemplates = false; renameTemplates.clear(); thumbnailZoomRatios.clear(); @@ -466,6 +470,8 @@ void Options::setDefaults() histogramTraceBrightness = 1; curvebboxpos = 1; complexity = 2; + spotmet = 0; + inspectorWindow = false; zoomOnScroll = true; prevdemo = PD_Sidecar; @@ -574,9 +580,9 @@ void Options::setDefaults() rtSettings.darkFramesPath = ""; rtSettings.flatFieldsPath = ""; - rtSettings.cameraProfilesPath = ""; - rtSettings.lensProfilesPath = ""; - + rtSettings.cameraProfilesPath = ""; + rtSettings.lensProfilesPath = ""; + #ifdef _WIN32 const gchar* sysRoot = g_getenv("SystemRoot"); // Returns e.g. "c:\Windows" @@ -591,6 +597,7 @@ void Options::setDefaults() #else rtSettings.iccDirectory = "/usr/share/color/icc"; #endif + rtSettings.enableLibRaw = true; // rtSettings.viewingdevice = 0; // rtSettings.viewingdevicegrey = 3; // rtSettings.viewinggreySc = 1; @@ -629,6 +636,7 @@ void Options::setDefaults() 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 + rtSettings.basecorlog = 0.12;//reduction max Q in Cam16 sigmoid Log encoding between 0.05 and 0.5 // end locallab rtSettings.itcwb_enable = true; rtSettings.itcwb_deltaspec = 0.075; @@ -666,8 +674,8 @@ void Options::setDefaults() lastIccDir = rtSettings.iccDirectory; lastDarkframeDir = rtSettings.darkFramesPath; lastFlatfieldDir = rtSettings.flatFieldsPath; - lastCameraProfilesDir = rtSettings.cameraProfilesPath; - lastLensProfilesDir = rtSettings.lensProfilesPath; + 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 @@ -690,6 +698,7 @@ void Options::setDefaults() lastICCProfCreatorDir = ""; gimpPluginShowInfoDialog = true; maxRecentFolders = 15; + thumbnailRankColorMode = Options::ThumbnailPropertyMode::PROCPARAMS; sortMethod = SORT_BY_NAME; sortDescending = false; rtSettings.lensfunDbDirectory = ""; // set also in main.cc and main-cli.cc @@ -808,7 +817,7 @@ void Options::readFromFile(Glib::ustring fname) rtSettings.cameraProfilesPath = keyFile.get_string("General", "CameraProfilesPath"); } - if (keyFile.has_key("General", "LensProfilesPath")) { + if (keyFile.has_key("General", "LensProfilesPath")) { rtSettings.lensProfilesPath = keyFile.get_string("General", "LensProfilesPath"); } @@ -854,7 +863,7 @@ 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)) { @@ -875,7 +884,7 @@ void Options::readFromFile(Glib::ustring fname) if (keyFile.has_key("External Editor", "BypassOutputProfile")) { editor_bypass_output_profile = keyFile.get_boolean("External Editor", "BypassOutputProfile"); } - + } if (keyFile.has_group("External Editor")) { @@ -1260,6 +1269,29 @@ void Options::readFromFile(Glib::ustring fname) } } + // check and add extensions that are missing from config + std::map checkedExtensions; + + if (parseExtensions.size() == parseExtensionsEnabled.size()) { + for (auto i = 0; i < parseExtensions.size(); ++i) { + checkedExtensions[parseExtensions[i]] = parseExtensionsEnabled[i]; + } + } + + parseExtensions.clear(); + parseExtensionsEnabled.clear(); + + for (auto const &i : knownExtensions) { + if (checkedExtensions.count(i) == 0) { + checkedExtensions[i] = 1; + } + } + + for (auto const &x : checkedExtensions) { + parseExtensions.emplace_back(x.first); + parseExtensionsEnabled.emplace_back(x.second); + } + if (keyFile.has_key("File Browser", "ThumbnailArrangement")) { fbArrangement = keyFile.get_integer("File Browser", "ThumbnailArrangement"); } @@ -1346,6 +1378,31 @@ void Options::readFromFile(Glib::ustring fname) if (keyFile.has_key("File Browser", "SortDescending")) { sortDescending = keyFile.get_boolean("File Browser", "SortDescending"); } + + if (keyFile.has_key("File Browser", "BrowseRecursive")) { + browseRecursive = keyFile.get_boolean("File Browser", "BrowseRecursive"); + } + + if (keyFile.has_key("File Browser", "BrowseRecursiveDepth")) { + browseRecursiveDepth = keyFile.get_integer("File Browser", "BrowseRecursiveDepth"); + } + + if (keyFile.has_key("File Browser", "BrowseRecursiveMaxDirs")) { + browseRecursiveMaxDirs = keyFile.get_integer("File Browser", "BrowseRecursiveMaxDirs"); + } + + if (keyFile.has_key("File Browser", "BrowseRecursiveFollowLinks")) { + browseRecursiveFollowLinks = keyFile.get_boolean("File Browser", "BrowseRecursiveFollowLinks"); + } + + if (keyFile.has_key("File Browser", "ThumbnailRankColorMode")) { + std::string val = keyFile.get_string("File Browser", "ThumbnailRankColorMode"); + if (val == "xmp") { + thumbnailRankColorMode = ThumbnailPropertyMode::XMP; + } else { + thumbnailRankColorMode = ThumbnailPropertyMode::PROCPARAMS; + } + } } if (keyFile.has_group("Clipping Indication")) { @@ -1553,10 +1610,6 @@ void Options::readFromFile(Glib::ustring fname) CPFontSize = keyFile.get_integer("GUI", "CPFontSize"); } - if (keyFile.has_key("GUI", "PseudoHiDPISupport")) { - pseudoHiDPISupport = keyFile.get_boolean("GUI", "PseudoHiDPISupport"); - } - if (keyFile.has_key("GUI", "LastPreviewScale")) { lastScale = keyFile.get_integer("GUI", "LastPreviewScale"); } @@ -1722,6 +1775,10 @@ void Options::readFromFile(Glib::ustring fname) complexity = keyFile.get_integer("GUI", "Complexity"); } + if (keyFile.has_key("GUI", "Spotmet")) { + spotmet = keyFile.get_integer("GUI", "Spotmet"); + } + if (keyFile.has_key("GUI", "InspectorWindow")) { inspectorWindow = keyFile.get_boolean("GUI", "InspectorWindow"); } @@ -1729,6 +1786,9 @@ void Options::readFromFile(Glib::ustring fname) if (keyFile.has_key("GUI", "ZoomOnScroll")) { zoomOnScroll = keyFile.get_boolean("GUI", "ZoomOnScroll"); } + if (keyFile.has_key("GUI", "MaxZoom")) { + maxZoomLimit = static_cast(keyFile.get_integer("GUI", "MaxZoom")); + } } if (keyFile.has_group("Crop Settings")) { @@ -1745,6 +1805,14 @@ void Options::readFromFile(Glib::ustring fname) } } + const Glib::ustring groupRawDecoder = "Raw Decoder"; + if (keyFile.has_group(groupRawDecoder)) { + const Glib::ustring keyEnableLibRaw = "EnableLibRaw"; + if (keyFile.has_key(groupRawDecoder, keyEnableLibRaw)) { + rtSettings.enableLibRaw = keyFile.get_boolean(groupRawDecoder, keyEnableLibRaw); + } + } + if (keyFile.has_group("Color Management")) { if (keyFile.has_key("Color Management", "ICCDirectory")) { rtSettings.iccDirectory = keyFile.get_string("Color Management", "ICCDirectory"); @@ -1958,6 +2026,10 @@ void Options::readFromFile(Glib::ustring fname) rtSettings.cbdlsensi = keyFile.get_double("Color Management", "Cbdlsensi"); } + if (keyFile.has_key("Color Management", "Besecorlog")) {//sensi base log for Q + rtSettings.basecorlog = keyFile.get_double("Color Management", "Basecorlog"); + } + } @@ -2355,8 +2427,8 @@ 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_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); @@ -2443,8 +2515,20 @@ void Options::saveToFile(Glib::ustring fname) keyFile.set_string_list("File Browser", "RecentFolders", temp); } + switch (thumbnailRankColorMode) { + case ThumbnailPropertyMode::XMP: + keyFile.set_string("File Browser", "ThumbnailRankColorMode", "xmp"); + break; + default: // ThumbnailPropertyMode::PROCPARAMS + keyFile.set_string("File Browser", "ThumbnailRankColorMode", "procparams"); + break; + } keyFile.set_integer("File Browser", "SortMethod", sortMethod); keyFile.set_boolean("File Browser", "SortDescending", sortDescending); + keyFile.set_boolean("File Browser", "BrowseRecursive", browseRecursive); + keyFile.set_integer("File Browser", "BrowseRecursiveDepth", browseRecursiveDepth); + keyFile.set_integer("File Browser", "BrowseRecursiveMaxDirs", browseRecursiveMaxDirs); + keyFile.set_boolean("File Browser", "BrowseRecursiveFollowLinks", browseRecursiveFollowLinks); keyFile.set_integer("Clipping Indication", "HighlightThreshold", highlightThreshold); keyFile.set_integer("Clipping Indication", "ShadowThreshold", shadowThreshold); keyFile.set_boolean("Clipping Indication", "BlinkClipped", blinkClipped); @@ -2539,7 +2623,6 @@ void Options::saveToFile(Glib::ustring fname) keyFile.set_integer("GUI", "FontSize", fontSize); keyFile.set_string("GUI", "CPFontFamily", CPFontFamily); keyFile.set_integer("GUI", "CPFontSize", CPFontSize); - keyFile.set_boolean("GUI", "PseudoHiDPISupport", pseudoHiDPISupport); keyFile.set_integer("GUI", "LastPreviewScale", lastScale); keyFile.set_boolean("GUI", "LastShowAllExif", lastShowAllExif); keyFile.set_integer("GUI", "PanAccelFactor", panAccelFactor); @@ -2580,8 +2663,10 @@ void Options::saveToFile(Glib::ustring fname) keyFile.set_integer("GUI", "CurveBBoxPosition", curvebboxpos); keyFile.set_boolean("GUI", "Showtooltip", showtooltip); keyFile.set_integer("GUI", "Complexity", complexity); + keyFile.set_integer("GUI", "Spotmet", spotmet); keyFile.set_boolean("GUI", "InspectorWindow", inspectorWindow); keyFile.set_boolean("GUI", "ZoomOnScroll", zoomOnScroll); + keyFile.set_integer("GUI", "MaxZoom", static_cast(maxZoomLimit)); //Glib::ArrayHandle crvopen = crvOpen; //keyFile.set_integer_list ("GUI", "CurvePanelsExpanded", crvopen); @@ -2590,6 +2675,8 @@ void Options::saveToFile(Glib::ustring fname) keyFile.set_integer("Crop Settings", "GuidesMode", cropGuides); keyFile.set_boolean("Crop Settings", "AutoFit", cropAutoFit); + keyFile.set_boolean("Raw Decoder", "EnableLibRaw", rtSettings.enableLibRaw); + keyFile.set_string("Color Management", "PrinterProfile", rtSettings.printerProfile); keyFile.set_integer("Color Management", "PrinterIntent", rtSettings.printerIntent); keyFile.set_boolean("Color Management", "PrinterBPC", rtSettings.printerBPC); @@ -2639,6 +2726,7 @@ void Options::saveToFile(Glib::ustring fname) 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("Color Management", "Basecorlog", rtSettings.basecorlog); keyFile.set_double("Wavelet", "Edghi", rtSettings.edghi); keyFile.set_double("Wavelet", "Edglo", rtSettings.edglo); diff --git a/rtgui/options.h b/rtgui/options.h index 7c6f1d9fb..6a2b0c35d 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -37,7 +37,7 @@ #define STARTUPDIR_CUSTOM 2 #define STARTUPDIR_LAST 3 -#define THEMEREGEXSTR "^(.+)-GTK3-(\\d{1,2})?_(\\d{1,2})?\\.css$" +#define THEMEREGEXSTR "^(.+)\\.css$" // Default bundled profile name to use for Raw images #ifdef _WIN32 @@ -254,7 +254,6 @@ public: int fontSize; // RT's main font size (units: pt) Glib::ustring CPFontFamily; // ColorPicker font family int CPFontSize; // ColorPicker font size (units: pt) - bool pseudoHiDPISupport; bool fbOnlyRaw; bool fbShowDateTime; bool fbShowBasicExif; @@ -306,15 +305,26 @@ public: 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 knownExtensions = { + "3fr", "arw", "arq", "cr2", "cr3", "crf", "crw", "dcr", "dng", + "fff", "iiq", "jpg", "jpeg", "jxl", "kdc", "mef", "mos", "mrw", + "nef", "nrw", "orf", "ori", "pef", "png", "raf", "raw", "rw2", + "rwl", "rwz", "sr2", "srf", "srw", "tif", "tiff", "x3f"}; + std::vector parseExtensions; // List containing all extensions type std::vector parseExtensionsEnabled; // List of bool to retain extension or not std::vector parsedExtensions; // List containing all retained extensions (lowercase) std::set parsedExtensionsSet; // Set containing all retained extensions (lowercase) + bool browseRecursive; + int browseRecursiveDepth; + int browseRecursiveMaxDirs; + bool browseRecursiveFollowLinks; std::vector tpOpen; bool autoSaveTpOpen; //std::vector crvOpen; @@ -327,6 +337,8 @@ public: bool internalThumbIfUntouched; bool overwriteOutputFile; int complexity; + int spotmet; + bool inspectorWindow; // open inspector in separate window bool zoomOnScroll; // translate scroll events to zoom @@ -368,6 +380,22 @@ public: CropGuidesMode cropGuides; bool cropAutoFit; + // Other options + + // Maximum zoom + enum class MaxZoom: int { + PERCENTS_100 = 0, + PERCENTS_200, + PERCENTS_300, + PERCENTS_400, + PERCENTS_500, + PERCENTS_600, + PERCENTS_700, + PERCENTS_800, + PERCENTS_1600, + }; + MaxZoom maxZoomLimit; + // Performance options Glib::ustring clutsDir; int rgbDenoiseThreadLimit; // maximum number of threads for the denoising tool ; 0 = use the maximum available @@ -451,8 +479,8 @@ public: Glib::ustring lastIccDir; Glib::ustring lastDarkframeDir; Glib::ustring lastFlatfieldDir; - Glib::ustring lastCameraProfilesDir; - Glib::ustring lastLensProfilesDir; + Glib::ustring lastCameraProfilesDir; + Glib::ustring lastLensProfilesDir; Glib::ustring lastRgbCurvesDir; Glib::ustring lastLabCurvesDir; Glib::ustring lastRetinexDir; @@ -473,6 +501,12 @@ public: size_t maxRecentFolders; // max. number of recent folders stored in options file std::vector recentFolders; // List containing all recent folders + enum class ThumbnailPropertyMode { + PROCPARAMS, // store rank and color in procparams sidecars + XMP // store rank and color xmp sidecar + }; + ThumbnailPropertyMode thumbnailRankColorMode; + enum SortMethod { SORT_BY_NAME, SORT_BY_DATE, diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 6a68e36ca..81b6b34d8 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -459,14 +459,20 @@ void ParamsEdited::set(bool v) icm.outputBPC = v; icm.workingTRCGamma = v; icm.workingTRCSlope = v; + icm.wmidtcie = v; + icm.wsmoothcie = v; icm.redx = v; icm.redy = v; icm.grex = v; icm.grey = v; icm.blux = v; icm.bluy = v; + icm.refi = v; + icm.shiftx = v; + icm.shifty = v; icm.preser = v; icm.fbw = v; + icm.trcExp = v; icm.gamut = v; icm.labgridcieALow = v; icm.labgridcieBLow = v; @@ -476,10 +482,13 @@ void ParamsEdited::set(bool v) icm.labgridcieGy = v; icm.labgridcieWx = v; icm.labgridcieWy = v; + icm.labgridcieMx = v; + icm.labgridcieMy = v; icm.aRendIntent = v; icm.workingTRC = v; icm.will = v; icm.wprim = v; + icm.wcat = v; raw.bayersensor.method = v; raw.bayersensor.border = v; raw.bayersensor.imageNum = v; @@ -1176,6 +1185,7 @@ void ParamsEdited::initFrom(const std::vector& 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).feathercol = locallab.spots.at(j).feathercol && pSpot.feathercol == otherSpot.feathercol; 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; @@ -1238,6 +1248,7 @@ void ParamsEdited::initFrom(const std::vector& 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).featherexp = locallab.spots.at(j).featherexp && pSpot.featherexp == otherSpot.featherexp; 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; @@ -1278,7 +1289,7 @@ void ParamsEdited::initFrom(const std::vector& 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++) { + for (int k = 0; k < 6; k++) { locallab.spots.at(j).multsh[k] = locallab.spots.at(j).multsh[k] && pSpot.multsh[k] == otherSpot.multsh[k]; } @@ -1297,6 +1308,7 @@ void ParamsEdited::initFrom(const std::vector& 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).featherSH = locallab.spots.at(j).featherSH && pSpot.featherSH == otherSpot.featherSH; 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; @@ -1342,6 +1354,7 @@ void ParamsEdited::initFrom(const std::vector& 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).feathervib = locallab.spots.at(j).feathervib && pSpot.feathervib == otherSpot.feathervib; 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; @@ -1483,6 +1496,7 @@ void ParamsEdited::initFrom(const std::vector& 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).dehazeblack = locallab.spots.at(j).dehazeblack && pSpot.dehazeblack == otherSpot.dehazeblack; 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; @@ -1557,6 +1571,7 @@ void ParamsEdited::initFrom(const std::vector& 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).featherwav = locallab.spots.at(j).featherwav && pSpot.featherwav == otherSpot.featherwav; 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; @@ -1652,10 +1667,15 @@ void ParamsEdited::initFrom(const std::vector& 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).satlog = locallab.spots.at(j).satlog && pSpot.satlog == otherSpot.satlog; 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).whiteslog = locallab.spots.at(j).whiteslog && pSpot.whiteslog == otherSpot.whiteslog; + locallab.spots.at(j).blackslog = locallab.spots.at(j).blackslog && pSpot.blackslog == otherSpot.blackslog; + locallab.spots.at(j).comprlog = locallab.spots.at(j).comprlog && pSpot.comprlog == otherSpot.comprlog; + locallab.spots.at(j).strelog = locallab.spots.at(j).strelog && pSpot.strelog == otherSpot.strelog; 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; @@ -1663,6 +1683,7 @@ void ParamsEdited::initFrom(const std::vector& 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).featherlog = locallab.spots.at(j).featherlog && pSpot.featherlog == otherSpot.featherlog; 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; @@ -1701,6 +1722,7 @@ void ParamsEdited::initFrom(const std::vector& 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).feather_mask = locallab.spots.at(j).feather_mask && pSpot.feather_mask == otherSpot.feather_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; @@ -1709,6 +1731,7 @@ void ParamsEdited::initFrom(const std::vector& //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).expprecam = locallab.spots.at(j).expprecam && pSpot.expprecam == otherSpot.expprecam; 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; @@ -1717,8 +1740,17 @@ void ParamsEdited::initFrom(const std::vector& 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).comprcieauto = locallab.spots.at(j).comprcieauto && pSpot.comprcieauto == otherSpot.comprcieauto; + locallab.spots.at(j).normcie = locallab.spots.at(j).normcie && pSpot.normcie == otherSpot.normcie; + locallab.spots.at(j).gamutcie = locallab.spots.at(j).gamutcie && pSpot.gamutcie == otherSpot.gamutcie; + locallab.spots.at(j).bwcie = locallab.spots.at(j).bwcie && pSpot.bwcie == otherSpot.bwcie; + locallab.spots.at(j).sigcie = locallab.spots.at(j).sigcie && pSpot.sigcie == otherSpot.sigcie; locallab.spots.at(j).logcie = locallab.spots.at(j).logcie && pSpot.logcie == otherSpot.logcie; + locallab.spots.at(j).satcie = locallab.spots.at(j).satcie && pSpot.satcie == otherSpot.satcie; + locallab.spots.at(j).logcieq = locallab.spots.at(j).logcieq && pSpot.logcieq == otherSpot.logcieq; + locallab.spots.at(j).smoothcie = locallab.spots.at(j).smoothcie && pSpot.smoothcie == otherSpot.smoothcie; + locallab.spots.at(j).smoothcieyb = locallab.spots.at(j).smoothcieyb && pSpot.smoothcieyb == otherSpot.smoothcieyb; + locallab.spots.at(j).smoothcielum = locallab.spots.at(j).smoothcielum && pSpot.smoothcielum == otherSpot.smoothcielum; 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; @@ -1727,6 +1759,7 @@ void ParamsEdited::initFrom(const std::vector& 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).bwevMethod = locallab.spots.at(j).bwevMethod && pSpot.bwevMethod == otherSpot.bwevMethod; 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; @@ -1751,8 +1784,10 @@ void ParamsEdited::initFrom(const std::vector& 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).lightsigqcie = locallab.spots.at(j).lightsigqcie && pSpot.lightsigqcie == otherSpot.lightsigqcie; 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).detailciejz = locallab.spots.at(j).detailciejz && pSpot.detailciejz == otherSpot.detailciejz; 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; @@ -1768,31 +1803,66 @@ void ParamsEdited::initFrom(const std::vector& 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).sigmoidsenscie = locallab.spots.at(j).sigmoidsenscie && pSpot.sigmoidsenscie == otherSpot.sigmoidsenscie; locallab.spots.at(j).sigmoidblcie = locallab.spots.at(j).sigmoidblcie && pSpot.sigmoidblcie == otherSpot.sigmoidblcie; + locallab.spots.at(j).comprcie = locallab.spots.at(j).comprcie && pSpot.comprcie == otherSpot.comprcie; + locallab.spots.at(j).strcielog = locallab.spots.at(j).strcielog && pSpot.strcielog == otherSpot.strcielog; + locallab.spots.at(j).comprcieth = locallab.spots.at(j).comprcieth && pSpot.comprcieth == otherSpot.comprcieth; + locallab.spots.at(j).gamjcie = locallab.spots.at(j).gamjcie && pSpot.gamjcie == otherSpot.gamjcie; + locallab.spots.at(j).slopjcie = locallab.spots.at(j).slopjcie && pSpot.slopjcie == otherSpot.slopjcie; + locallab.spots.at(j).slopesmo = locallab.spots.at(j).slopesmo && pSpot.slopesmo == otherSpot.slopesmo; + locallab.spots.at(j).slopesmor = locallab.spots.at(j).slopesmor && pSpot.slopesmor == otherSpot.slopesmor; + locallab.spots.at(j).slopesmog = locallab.spots.at(j).slopesmog && pSpot.slopesmog == otherSpot.slopesmog; + locallab.spots.at(j).slopesmob = locallab.spots.at(j).slopesmob && pSpot.slopesmob == otherSpot.slopesmob; + locallab.spots.at(j).midtcie = locallab.spots.at(j).midtcie && pSpot.midtcie == otherSpot.midtcie; + locallab.spots.at(j).grexl = locallab.spots.at(j).grexl && pSpot.grexl == otherSpot.grexl; + locallab.spots.at(j).greyl = locallab.spots.at(j).greyl && pSpot.greyl == otherSpot.greyl; + locallab.spots.at(j).redxl = locallab.spots.at(j).redxl && pSpot.redxl == otherSpot.redxl; + locallab.spots.at(j).redyl = locallab.spots.at(j).redyl && pSpot.redyl == otherSpot.redyl; + locallab.spots.at(j).bluxl = locallab.spots.at(j).bluxl && pSpot.bluxl == otherSpot.bluxl; + locallab.spots.at(j).bluyl = locallab.spots.at(j).bluyl && pSpot.bluyl == otherSpot.bluyl; + locallab.spots.at(j).refi = locallab.spots.at(j).refi && pSpot.refi == otherSpot.refi; + locallab.spots.at(j).shiftxl = locallab.spots.at(j).shiftxl && pSpot.shiftxl == otherSpot.shiftxl; + locallab.spots.at(j).shiftyl = locallab.spots.at(j).shiftyl && pSpot.shiftyl == otherSpot.shiftyl; + locallab.spots.at(j).labgridcieALow = locallab.spots.at(j).labgridcieALow && pSpot.labgridcieALow == otherSpot.labgridcieALow; + locallab.spots.at(j).labgridcieBLow = locallab.spots.at(j).labgridcieBLow && pSpot.labgridcieBLow == otherSpot.labgridcieBLow; + locallab.spots.at(j).labgridcieAHigh = locallab.spots.at(j).labgridcieAHigh && pSpot.labgridcieAHigh == otherSpot.labgridcieAHigh; + locallab.spots.at(j).labgridcieBHigh = locallab.spots.at(j).labgridcieBHigh && pSpot.labgridcieBHigh == otherSpot.labgridcieBHigh; + locallab.spots.at(j).labgridcieGx = locallab.spots.at(j).labgridcieGx && pSpot.labgridcieGx == otherSpot.labgridcieGx; + locallab.spots.at(j).labgridcieGy = locallab.spots.at(j).labgridcieGy && pSpot.labgridcieGy == otherSpot.labgridcieGy; + locallab.spots.at(j).labgridcieWx = locallab.spots.at(j).labgridcieWx && pSpot.labgridcieWx == otherSpot.labgridcieWx; + locallab.spots.at(j).labgridcieWy = locallab.spots.at(j).labgridcieWy && pSpot.labgridcieWy == otherSpot.labgridcieWy; + locallab.spots.at(j).labgridcieMx = locallab.spots.at(j).labgridcieMx && pSpot.labgridcieMx == otherSpot.labgridcieMx; + locallab.spots.at(j).labgridcieMy = locallab.spots.at(j).labgridcieMy && pSpot.labgridcieMy == otherSpot.labgridcieMy; + + locallab.spots.at(j).whitescie = locallab.spots.at(j).whitescie && pSpot.whitescie == otherSpot.whitescie; + locallab.spots.at(j).blackscie = locallab.spots.at(j).blackscie && pSpot.blackscie == otherSpot.blackscie; + locallab.spots.at(j).illMethod = locallab.spots.at(j).illMethod && pSpot.illMethod == otherSpot.illMethod; + locallab.spots.at(j).smoothciemet = locallab.spots.at(j).smoothciemet && pSpot.smoothciemet == otherSpot.smoothciemet; + locallab.spots.at(j).primMethod = locallab.spots.at(j).primMethod && pSpot.primMethod == otherSpot.primMethod; + locallab.spots.at(j).catMethod = locallab.spots.at(j).catMethod && pSpot.catMethod == otherSpot.catMethod; 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).contsigqcie = locallab.spots.at(j).contsigqcie && pSpot.contsigqcie == otherSpot.contsigqcie; 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).strgradcie = locallab.spots.at(j).strgradcie && pSpot.strgradcie == otherSpot.strgradcie; + locallab.spots.at(j).anggradcie = locallab.spots.at(j).anggradcie && pSpot.anggradcie == otherSpot.anggradcie; + locallab.spots.at(j).feathercie = locallab.spots.at(j).feathercie && pSpot.feathercie == otherSpot.feathercie; + + locallab.spots.at(j).enacieMask = locallab.spots.at(j).enacieMask && pSpot.enacieMask == otherSpot.enacieMask; + locallab.spots.at(j).enacieMaskall = locallab.spots.at(j).enacieMaskall && pSpot.enacieMaskall == otherSpot.enacieMaskall; 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).HHhmaskciecurve = locallab.spots.at(j).HHhmaskciecurve && pSpot.HHhmaskciecurve == otherSpot.HHhmaskciecurve; 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; @@ -1810,6 +1880,15 @@ void ParamsEdited::initFrom(const std::vector& 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; + locallab.spots.at(j).strumaskcie = locallab.spots.at(j).strumaskcie && pSpot.strumaskcie == otherSpot.strumaskcie; + locallab.spots.at(j).toolcie = locallab.spots.at(j).toolcie && pSpot.toolcie == otherSpot.toolcie; + locallab.spots.at(j).fftcieMask = locallab.spots.at(j).fftcieMask && pSpot.fftcieMask == otherSpot.fftcieMask; + locallab.spots.at(j).blurcie = locallab.spots.at(j).blurcie && pSpot.blurcie == otherSpot.blurcie; + locallab.spots.at(j).contcie = locallab.spots.at(j).contcie && pSpot.contcie == otherSpot.contcie; + locallab.spots.at(j).highmaskcie = locallab.spots.at(j).highmaskcie && pSpot.highmaskcie == otherSpot.highmaskcie; + locallab.spots.at(j).shadmaskcie = locallab.spots.at(j).shadmaskcie && pSpot.shadmaskcie == otherSpot.shadmaskcie; + locallab.spots.at(j).LLmaskciecurvewav = locallab.spots.at(j).LLmaskciecurvewav && pSpot.LLmaskciecurvewav == otherSpot.LLmaskciecurvewav; + locallab.spots.at(j).csthresholdcie = locallab.spots.at(j).csthresholdcie && pSpot.csthresholdcie == otherSpot.csthresholdcie; } @@ -1889,12 +1968,17 @@ 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.wmidtcie = icm.wmidtcie && p.icm.wmidtcie == other.icm.wmidtcie; + icm.wsmoothcie = icm.wsmoothcie && p.icm.wsmoothcie == other.icm.wsmoothcie; 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.refi = icm.refi && p.icm.refi == other.icm.refi; + icm.shiftx = icm.shiftx && p.icm.shiftx == other.icm.shiftx; + icm.shifty = icm.shifty && p.icm.shifty == other.icm.shifty; 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; @@ -1903,13 +1987,17 @@ void ParamsEdited::initFrom(const std::vector& 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.labgridcieMx = icm.labgridcieMx && p.icm.labgridcieMx == other.icm.labgridcieMx; + icm.labgridcieMy = icm.labgridcieMy && p.icm.labgridcieMy == other.icm.labgridcieMy; icm.preser = icm.preser && p.icm.preser == other.icm.preser; icm.fbw = icm.fbw && p.icm.fbw == other.icm.fbw; + icm.trcExp = icm.trcExp && p.icm.trcExp == other.icm.trcExp; 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; + icm.wcat = icm.wcat && p.icm.wcat == other.icm.wcat; 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; @@ -3752,6 +3840,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).angcol = mods.locallab.spots.at(i).angcol; } + if (locallab.spots.at(i).feathercol) { + toEdit.locallab.spots.at(i).feathercol = mods.locallab.spots.at(i).feathercol; + } + if (locallab.spots.at(i).blurcolde) { toEdit.locallab.spots.at(i).blurcolde = mods.locallab.spots.at(i).blurcolde; } @@ -4001,6 +4093,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).angexp = mods.locallab.spots.at(i).angexp; } + if (locallab.spots.at(i).featherexp) { + toEdit.locallab.spots.at(i).featherexp = mods.locallab.spots.at(i).featherexp; + } + if (locallab.spots.at(i).excurve) { toEdit.locallab.spots.at(i).excurve = mods.locallab.spots.at(i).excurve; } @@ -4154,7 +4250,7 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).shMethod = mods.locallab.spots.at(i).shMethod; } - for (int j = 0; j < 5; j++) { + for (int j = 0; j < 6; j++) { if (locallab.spots.at(i).multsh[j]) { toEdit.locallab.spots.at(i).multsh[j] = mods.locallab.spots.at(i).multsh[j]; } @@ -4220,6 +4316,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).angSH = mods.locallab.spots.at(i).angSH; } + if (locallab.spots.at(i).featherSH) { + toEdit.locallab.spots.at(i).featherSH = mods.locallab.spots.at(i).featherSH; + } + if (locallab.spots.at(i).inverssh) { toEdit.locallab.spots.at(i).inverssh = mods.locallab.spots.at(i).inverssh; } @@ -4397,6 +4497,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).angvib = mods.locallab.spots.at(i).angvib; } + if (locallab.spots.at(i).feathervib) { + toEdit.locallab.spots.at(i).feathervib = mods.locallab.spots.at(i).feathervib; + } + if (locallab.spots.at(i).Lmaskvibcurve) { toEdit.locallab.spots.at(i).Lmaskvibcurve = mods.locallab.spots.at(i).Lmaskvibcurve; } @@ -4950,6 +5054,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).dehazeSaturation = mods.locallab.spots.at(i).dehazeSaturation; } + if (locallab.spots.at(i).dehazeblack) { + toEdit.locallab.spots.at(i).dehazeblack = mods.locallab.spots.at(i).dehazeblack; + } + if (locallab.spots.at(i).softradiusret) { toEdit.locallab.spots.at(i).softradiusret = mods.locallab.spots.at(i).softradiusret; } @@ -5241,6 +5349,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).angwav = mods.locallab.spots.at(i).angwav; } + if (locallab.spots.at(i).featherwav) { + toEdit.locallab.spots.at(i).featherwav = mods.locallab.spots.at(i).featherwav; + } + if (locallab.spots.at(i).strengthw) { toEdit.locallab.spots.at(i).strengthw = mods.locallab.spots.at(i).strengthw; } @@ -5601,6 +5713,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).ciecam = mods.locallab.spots.at(i).ciecam; } + if (locallab.spots.at(i).satlog) { + toEdit.locallab.spots.at(i).satlog = mods.locallab.spots.at(i).satlog; + } + if (locallab.spots.at(i).enaLMask) { toEdit.locallab.spots.at(i).enaLMask = mods.locallab.spots.at(i).enaLMask; } @@ -5617,6 +5733,22 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).whiteEv = mods.locallab.spots.at(i).whiteEv; } + if (locallab.spots.at(i).whiteslog) { + toEdit.locallab.spots.at(i).whiteslog = mods.locallab.spots.at(i).whiteslog; + } + + if (locallab.spots.at(i).blackslog) { + toEdit.locallab.spots.at(i).blackslog = mods.locallab.spots.at(i).blackslog; + } + + if (locallab.spots.at(i).comprlog) { + toEdit.locallab.spots.at(i).comprlog = mods.locallab.spots.at(i).comprlog; + } + + if (locallab.spots.at(i).strelog) { + toEdit.locallab.spots.at(i).strelog = mods.locallab.spots.at(i).strelog; + } + if (locallab.spots.at(i).detail) { toEdit.locallab.spots.at(i).detail = mods.locallab.spots.at(i).detail; } @@ -5645,6 +5777,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).anglog = mods.locallab.spots.at(i).anglog; } + if (locallab.spots.at(i).featherlog) { + toEdit.locallab.spots.at(i).featherlog = mods.locallab.spots.at(i).featherlog; + } + if (locallab.spots.at(i).CCmaskcurveL) { toEdit.locallab.spots.at(i).CCmaskcurveL = mods.locallab.spots.at(i).CCmaskcurveL; } @@ -5786,6 +5922,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).ang_mask = mods.locallab.spots.at(i).ang_mask; } + if (locallab.spots.at(i).feather_mask) { + toEdit.locallab.spots.at(i).feather_mask = mods.locallab.spots.at(i).feather_mask; + } + if (locallab.spots.at(i).HHhmask_curve) { toEdit.locallab.spots.at(i).HHhmask_curve = mods.locallab.spots.at(i).HHhmask_curve; } @@ -5811,6 +5951,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).expcie = mods.locallab.spots.at(i).expcie; } + if (locallab.spots.at(i).expprecam) { + toEdit.locallab.spots.at(i).expprecam = mods.locallab.spots.at(i).expprecam; + } + if (locallab.spots.at(i).complexcie) { toEdit.locallab.spots.at(i).complexcie = mods.locallab.spots.at(i).complexcie; } @@ -5843,14 +5987,50 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng 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).comprcieauto) { + toEdit.locallab.spots.at(i).comprcieauto = mods.locallab.spots.at(i).comprcieauto; + } + + if (locallab.spots.at(i).normcie) { + toEdit.locallab.spots.at(i).normcie = mods.locallab.spots.at(i).normcie; + } + + if (locallab.spots.at(i).gamutcie) { + toEdit.locallab.spots.at(i).gamutcie = mods.locallab.spots.at(i).gamutcie; + } + + if (locallab.spots.at(i).bwcie) { + toEdit.locallab.spots.at(i).bwcie = mods.locallab.spots.at(i).bwcie; + } + + if (locallab.spots.at(i).sigcie) { + toEdit.locallab.spots.at(i).sigcie = mods.locallab.spots.at(i).sigcie; } if (locallab.spots.at(i).logcie) { toEdit.locallab.spots.at(i).logcie = mods.locallab.spots.at(i).logcie; } + if (locallab.spots.at(i).satcie) { + toEdit.locallab.spots.at(i).satcie = mods.locallab.spots.at(i).satcie; + } + + if (locallab.spots.at(i).logcieq) { + toEdit.locallab.spots.at(i).logcieq = mods.locallab.spots.at(i).logcieq; + } + + if (locallab.spots.at(i).smoothcie) { + toEdit.locallab.spots.at(i).smoothcie = mods.locallab.spots.at(i).smoothcie; + } + + if (locallab.spots.at(i).smoothcieyb) { + toEdit.locallab.spots.at(i).smoothcieyb = mods.locallab.spots.at(i).smoothcieyb; + } + + if (locallab.spots.at(i).smoothcielum) { + toEdit.locallab.spots.at(i).smoothcielum = mods.locallab.spots.at(i).smoothcielum; + } + if (locallab.spots.at(i).logjz) { toEdit.locallab.spots.at(i).logjz = mods.locallab.spots.at(i).logjz; } @@ -5883,6 +6063,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).modecam = mods.locallab.spots.at(i).modecam; } + if (locallab.spots.at(i).bwevMethod) { + toEdit.locallab.spots.at(i).bwevMethod = mods.locallab.spots.at(i).bwevMethod; + } + if (locallab.spots.at(i).modecie) { toEdit.locallab.spots.at(i).modecie = mods.locallab.spots.at(i).modecie; } @@ -5975,6 +6159,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).lightqcie = mods.locallab.spots.at(i).lightqcie; } + if (locallab.spots.at(i).lightsigqcie) { + toEdit.locallab.spots.at(i).lightsigqcie = mods.locallab.spots.at(i).lightsigqcie; + } + if (locallab.spots.at(i).contlcie) { toEdit.locallab.spots.at(i).contlcie = mods.locallab.spots.at(i).contlcie; } @@ -5983,6 +6171,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).contjzcie = mods.locallab.spots.at(i).contjzcie; } + if (locallab.spots.at(i).detailciejz) { + toEdit.locallab.spots.at(i).detailciejz = mods.locallab.spots.at(i).detailciejz; + } + if (locallab.spots.at(i).adapjzcie) { toEdit.locallab.spots.at(i).adapjzcie = mods.locallab.spots.at(i).adapjzcie; } @@ -6043,10 +6235,154 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).sigmoidthcie = mods.locallab.spots.at(i).sigmoidthcie; } + if (locallab.spots.at(i).sigmoidsenscie) { + toEdit.locallab.spots.at(i).sigmoidsenscie = mods.locallab.spots.at(i).sigmoidsenscie; + } + if (locallab.spots.at(i).sigmoidblcie) { toEdit.locallab.spots.at(i).sigmoidblcie = mods.locallab.spots.at(i).sigmoidblcie; } + if (locallab.spots.at(i).comprcie) { + toEdit.locallab.spots.at(i).comprcie = mods.locallab.spots.at(i).comprcie; + } + + if (locallab.spots.at(i).strcielog) { + toEdit.locallab.spots.at(i).strcielog = mods.locallab.spots.at(i).strcielog; + } + + if (locallab.spots.at(i).comprcieth) { + toEdit.locallab.spots.at(i).comprcieth = mods.locallab.spots.at(i).comprcieth; + } + + if (locallab.spots.at(i).gamjcie) { + toEdit.locallab.spots.at(i).gamjcie = mods.locallab.spots.at(i).gamjcie; + } + + if (locallab.spots.at(i).slopjcie) { + toEdit.locallab.spots.at(i).slopjcie = mods.locallab.spots.at(i).slopjcie; + } + + if (locallab.spots.at(i).slopesmo) { + toEdit.locallab.spots.at(i).slopesmo = mods.locallab.spots.at(i).slopesmo; + } + + if (locallab.spots.at(i).slopesmor) { + toEdit.locallab.spots.at(i).slopesmor = mods.locallab.spots.at(i).slopesmor; + } + + if (locallab.spots.at(i).slopesmog) { + toEdit.locallab.spots.at(i).slopesmog = mods.locallab.spots.at(i).slopesmog; + } + + if (locallab.spots.at(i).slopesmob) { + toEdit.locallab.spots.at(i).slopesmob = mods.locallab.spots.at(i).slopesmob; + } + + if (locallab.spots.at(i).midtcie) { + toEdit.locallab.spots.at(i).midtcie = mods.locallab.spots.at(i).midtcie; + } + + if (locallab.spots.at(i).grexl) { + toEdit.locallab.spots.at(i).grexl = mods.locallab.spots.at(i).grexl; + } + + if (locallab.spots.at(i).greyl) { + toEdit.locallab.spots.at(i).greyl = mods.locallab.spots.at(i).greyl; + } + + if (locallab.spots.at(i).redxl) { + toEdit.locallab.spots.at(i).redxl = mods.locallab.spots.at(i).redxl; + } + + if (locallab.spots.at(i).redyl) { + toEdit.locallab.spots.at(i).redyl = mods.locallab.spots.at(i).redyl; + } + + if (locallab.spots.at(i).bluxl) { + toEdit.locallab.spots.at(i).bluxl = mods.locallab.spots.at(i).bluxl; + } + + if (locallab.spots.at(i).bluyl) { + toEdit.locallab.spots.at(i).bluyl = mods.locallab.spots.at(i).bluyl; + } + + if (locallab.spots.at(i).refi) { + toEdit.locallab.spots.at(i).refi = mods.locallab.spots.at(i).refi; + } + + if (locallab.spots.at(i).shiftxl) { + toEdit.locallab.spots.at(i).shiftxl = mods.locallab.spots.at(i).shiftxl; + } + + if (locallab.spots.at(i).shiftyl) { + toEdit.locallab.spots.at(i).shiftyl = mods.locallab.spots.at(i).shiftyl; + } + + if (locallab.spots.at(i).labgridcieALow) { + toEdit.locallab.spots.at(i).labgridcieALow = mods.locallab.spots.at(i).labgridcieALow; + } + + if (locallab.spots.at(i).labgridcieBLow) { + toEdit.locallab.spots.at(i).labgridcieBLow = mods.locallab.spots.at(i).labgridcieBLow; + } + + if (locallab.spots.at(i).labgridcieAHigh) { + toEdit.locallab.spots.at(i).labgridcieAHigh = mods.locallab.spots.at(i).labgridcieAHigh; + } + + if (locallab.spots.at(i).labgridcieBHigh) { + toEdit.locallab.spots.at(i).labgridcieBHigh = mods.locallab.spots.at(i).labgridcieBHigh; + } + + if (locallab.spots.at(i).labgridcieGx) { + toEdit.locallab.spots.at(i).labgridcieGx = mods.locallab.spots.at(i).labgridcieGx; + } + + if (locallab.spots.at(i).labgridcieGy) { + toEdit.locallab.spots.at(i).labgridcieGy = mods.locallab.spots.at(i).labgridcieGy; + } + + if (locallab.spots.at(i).labgridcieWx) { + toEdit.locallab.spots.at(i).labgridcieWx = mods.locallab.spots.at(i).labgridcieWx; + } + + if (locallab.spots.at(i).labgridcieWy) { + toEdit.locallab.spots.at(i).labgridcieWy = mods.locallab.spots.at(i).labgridcieWy; + } + + if (locallab.spots.at(i).labgridcieMx) { + toEdit.locallab.spots.at(i).labgridcieMx = mods.locallab.spots.at(i).labgridcieMx; + } + + if (locallab.spots.at(i).labgridcieMy) { + toEdit.locallab.spots.at(i).labgridcieMy = mods.locallab.spots.at(i).labgridcieMy; + } + + if (locallab.spots.at(i).whitescie) { + toEdit.locallab.spots.at(i).whitescie = mods.locallab.spots.at(i).whitescie; + } + + if (locallab.spots.at(i).blackscie) { + toEdit.locallab.spots.at(i).blackscie = mods.locallab.spots.at(i).blackscie; + } + + if (locallab.spots.at(i).illMethod) { + toEdit.locallab.spots.at(i).illMethod = mods.locallab.spots.at(i).illMethod; + } + + if (locallab.spots.at(i).smoothciemet) { + toEdit.locallab.spots.at(i).smoothciemet = mods.locallab.spots.at(i).smoothciemet; + } + + if (locallab.spots.at(i).primMethod) { + toEdit.locallab.spots.at(i).primMethod = mods.locallab.spots.at(i).primMethod; + } + + if (locallab.spots.at(i).catMethod) { + toEdit.locallab.spots.at(i).catMethod = mods.locallab.spots.at(i).catMethod; + } + if (locallab.spots.at(i).sigmoidldajzcie) { toEdit.locallab.spots.at(i).sigmoidldajzcie = mods.locallab.spots.at(i).sigmoidldajzcie; } @@ -6064,42 +6400,13 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).contqcie = mods.locallab.spots.at(i).contqcie; } + if (locallab.spots.at(i).contsigqcie) { + toEdit.locallab.spots.at(i).contsigqcie = mods.locallab.spots.at(i).contsigqcie; + } + 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; } @@ -6144,10 +6451,26 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).surroundcie = mods.locallab.spots.at(i).surroundcie; } + if (locallab.spots.at(i).strgradcie) { + toEdit.locallab.spots.at(i).strgradcie = mods.locallab.spots.at(i).strgradcie; + } + + if (locallab.spots.at(i).anggradcie) { + toEdit.locallab.spots.at(i).anggradcie = mods.locallab.spots.at(i).anggradcie; + } + + if (locallab.spots.at(i).feathercie) { + toEdit.locallab.spots.at(i).feathercie = mods.locallab.spots.at(i).feathercie; + } + if (locallab.spots.at(i).enacieMask) { toEdit.locallab.spots.at(i).enacieMask = mods.locallab.spots.at(i).enacieMask; } + if (locallab.spots.at(i).enacieMaskall) { + toEdit.locallab.spots.at(i).enacieMaskall = mods.locallab.spots.at(i).enacieMaskall; + } + if (locallab.spots.at(i).CCmaskciecurve) { toEdit.locallab.spots.at(i).CCmaskciecurve = mods.locallab.spots.at(i).CCmaskciecurve; } @@ -6160,6 +6483,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).HHmaskciecurve = mods.locallab.spots.at(i).HHmaskciecurve; } + if (locallab.spots.at(i).HHhmaskciecurve) { + toEdit.locallab.spots.at(i).HHhmaskciecurve = mods.locallab.spots.at(i).HHhmaskciecurve; + } + if (locallab.spots.at(i).blendmaskcie) { toEdit.locallab.spots.at(i).blendmaskcie = mods.locallab.spots.at(i).blendmaskcie; } @@ -6204,6 +6531,42 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).decaycie = mods.locallab.spots.at(i).decaycie; } + if (locallab.spots.at(i).strumaskcie) { + toEdit.locallab.spots.at(i).strumaskcie= mods.locallab.spots.at(i).strumaskcie; + } + + if (locallab.spots.at(i).toolcie) { + toEdit.locallab.spots.at(i).toolcie = mods.locallab.spots.at(i).toolcie; + } + + if (locallab.spots.at(i).fftcieMask) { + toEdit.locallab.spots.at(i).fftcieMask = mods.locallab.spots.at(i).fftcieMask; + } + + if (locallab.spots.at(i).blurcie) { + toEdit.locallab.spots.at(i).blurcie = mods.locallab.spots.at(i).blurcie; + } + + if (locallab.spots.at(i).contcie) { + toEdit.locallab.spots.at(i).contcie = mods.locallab.spots.at(i).contcie; + } + + if (locallab.spots.at(i).highmaskcie) { + toEdit.locallab.spots.at(i).highmaskcie = mods.locallab.spots.at(i).highmaskcie; + } + + if (locallab.spots.at(i).shadmaskcie) { + toEdit.locallab.spots.at(i).shadmaskcie = mods.locallab.spots.at(i).shadmaskcie; + } + + if (locallab.spots.at(i).LLmaskciecurvewav) { + toEdit.locallab.spots.at(i).LLmaskciecurvewav = mods.locallab.spots.at(i).LLmaskciecurvewav; + } + + if (locallab.spots.at(i).csthresholdcie) { + toEdit.locallab.spots.at(i).csthresholdcie = mods.locallab.spots.at(i).csthresholdcie; + } + } if (spot.enabled) { @@ -6456,6 +6819,14 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.icm.workingTRCSlope = mods.icm.workingTRCSlope; } + if (icm.wmidtcie) { + toEdit.icm.wmidtcie = mods.icm.wmidtcie; + } + + if (icm.wsmoothcie) { + toEdit.icm.wsmoothcie = mods.icm.wsmoothcie; + } + if (icm.redx) { toEdit.icm.redx = mods.icm.redx; } @@ -6480,6 +6851,18 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.icm.bluy = mods.icm.bluy; } + if (icm.refi) { + toEdit.icm.refi = mods.icm.refi; + } + + if (icm.shiftx) { + toEdit.icm.shiftx = mods.icm.shiftx; + } + + if (icm.shifty) { + toEdit.icm.shifty = mods.icm.shifty; + } + if (icm.preser) { toEdit.icm.preser = mods.icm.preser; } @@ -6488,6 +6871,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.icm.fbw = mods.icm.fbw; } + if (icm.trcExp) { + toEdit.icm.trcExp = mods.icm.trcExp; + } + if (icm.gamut) { toEdit.icm.gamut = mods.icm.gamut; } @@ -6524,6 +6911,14 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.icm.labgridcieWy = mods.icm.labgridcieWy; } + if (icm.labgridcieMx) { + toEdit.icm.labgridcieMx = mods.icm.labgridcieMx; + } + + if (icm.labgridcieMy) { + toEdit.icm.labgridcieMy = mods.icm.labgridcieMy; + } + if (icm.aRendIntent) { toEdit.icm.aRendIntent = mods.icm.aRendIntent; } @@ -6540,6 +6935,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.icm.wprim = mods.icm.wprim; } + if (icm.wcat) { + toEdit.icm.wcat = mods.icm.wcat; + } + if (raw.bayersensor.method) { toEdit.raw.bayersensor.method = mods.raw.bayersensor.method; } @@ -7579,6 +7978,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : strcolab(v), strcolh(v), angcol(v), + feathercol(v), blurcolde(v), blurcol(v), contcol(v), @@ -7641,6 +8041,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : blurexpde(v), strexp(v), angexp(v), + featherexp(v), excurve(v), norm(v), inversex(v), @@ -7680,7 +8081,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : expshadhigh(v), complexshadhigh(v), shMethod(v), - multsh{v, v, v, v, v, v}, + multsh{v, v, v, v, v, v, v}, highlights(v), h_tonalwidth(v), shadows(v), @@ -7696,6 +8097,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : blurSHde(v), strSH(v), angSH(v), + featherSH(v), inverssh(v), chromaskSH(v), gammaskSH(v), @@ -7741,6 +8143,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : strvibab(v), strvibh(v), angvib(v), + feathervib(v), Lmaskvibcurve(v), recothresv(v), lowthresv(v), @@ -7882,6 +8285,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : equilret(v), loglin(v), dehazeSaturation(v), + dehazeblack(v), softradiusret(v), CCmaskreticurve(v), LLmaskreticurve(v), @@ -7956,6 +8360,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : sigmalc2(v), strwav(v), angwav(v), + featherwav(v), strengthw(v), sigmaed(v), radiusw(v), @@ -8048,8 +8453,13 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : fullimage(v), repar(v), ciecam(v), + satlog(v), blackEv(v), whiteEv(v), + whiteslog(v), + blackslog(v), + comprlog(v), + strelog(v), detail(v), sursour(v), surround(v), @@ -8057,6 +8467,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : baselog(v), strlog(v), anglog(v), + featherlog(v), CCmaskcurveL(v), LLmaskcurveL(v), HHmaskcurveL(v), @@ -8094,6 +8505,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : shadmask(v), str_mask(v), ang_mask(v), + feather_mask(v), HHhmask_curve(v), Lmask_curve(v), LLmask_curvewav(v), @@ -8102,6 +8514,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : visicie(v), complexcie(v), expcie(v), + expprecam(v), reparcie(v), sensicie(v), Autograycie(v), @@ -8109,8 +8522,17 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : forcebw(v), qtoj(v), jabcie(v), - sigmoidqjcie(v), + comprcieauto(v), + normcie(v), + gamutcie(v), + bwcie(v), + sigcie(v), logcie(v), + satcie(v), + logcieq(v), + smoothcie(v), + smoothcieyb(v), + smoothcielum(v), logjz(v), sigjz(v), sigq(v), @@ -8119,6 +8541,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : sourceabscie(v), sursourcie(v), modecam(v), + bwevMethod(v), modecie(v), saturlcie(v), rstprotectcie(v), @@ -8143,8 +8566,10 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : lightlcie(v), lightjzcie(v), lightqcie(v), + lightsigqcie(v), contlcie(v), contjzcie(v), + detailciejz(v), adapjzcie(v), jz100(v), pqremap(v), @@ -8160,31 +8585,63 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : targetjz(v), sigmoidldacie(v), sigmoidthcie(v), + sigmoidsenscie(v), sigmoidblcie(v), + comprcie(v), + strcielog(v), + comprcieth(v), + gamjcie(v), + slopjcie(v), + slopesmo(v), + slopesmor(v), + slopesmog(v), + slopesmob(v), + midtcie(v), + redxl(v), + redyl(v), + grexl(v), + greyl(v), + bluxl(v), + bluyl(v), + refi(v), + shiftxl(v), + shiftyl(v), + labgridcieALow(v), + labgridcieBLow(v), + labgridcieAHigh(v), + labgridcieBHigh(v), + labgridcieGx(v), + labgridcieGy(v), + labgridcieWx(v), + labgridcieWy(v), + labgridcieMx(v), + labgridcieMy(v), + whitescie(v), + blackscie(v), + illMethod(v), + smoothciemet(v), + primMethod(v), + catMethod(v), sigmoidldajzcie(v), sigmoidthjzcie(v), sigmoidbljzcie(v), contqcie(v), + contsigqcie(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), + strgradcie(v), + anggradcie(v), + feathercie(v), enacieMask(v), + enacieMaskall(v), CCmaskciecurve(v), LLmaskciecurve(v), HHmaskciecurve(v), + HHhmaskciecurve(v), blendmaskcie(v), radmaskcie(v), sigmalcjz(v), @@ -8201,8 +8658,17 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : recothrescie(v), lowthrescie(v), higthrescie(v), - decaycie(v) - + decaycie(v), + strumaskcie(v), + toolcie(v), + fftcieMask(v), + contcie(v), + blurcie(v), + highmaskcie(v), + shadmaskcie(v), + LLmaskciecurvewav(v), + csthresholdcie(v) + { } @@ -8272,6 +8738,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) strcolab = v; strcolh = v; angcol = v; + feathercol = v; blurcolde = v; blurcol = v; contcol = v; @@ -8334,6 +8801,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) blurexpde = v; strexp = v; angexp = v; + featherexp = v; excurve = v; norm = v; inversex = v; @@ -8374,7 +8842,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) complexshadhigh = v; shMethod = v; - for (int i = 0; i < 5; i++) { + for (int i = 0; i < 6; i++) { multsh[i] = v; } @@ -8393,6 +8861,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) blurSHde = v; strSH = v; angSH = v; + featherSH = v; inverssh = v; chromaskSH = v; gammaskSH = v; @@ -8438,6 +8907,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) strvibab = v; strvibh = v; angvib = v; + feathervib = v; Lmaskvibcurve = v; recothresv = v; lowthresv = v; @@ -8578,6 +9048,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) equilret = v; loglin = v; dehazeSaturation = v; + dehazeblack = v; softradiusret = v; CCmaskreticurve = v; LLmaskreticurve = v; @@ -8652,6 +9123,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) sigmalc2 = v; strwav = v; angwav = v; + featherwav = v; strengthw = v; sigmaed = v; radiusw = v; @@ -8748,8 +9220,13 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) fullimage = v; repar = v; ciecam = v; + satlog = v; blackEv = v; whiteEv = v; + whiteslog = v; + blackslog = v; + comprlog = v; + strelog = v; detail = v; sursour = v; surround = v; @@ -8757,6 +9234,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) baselog = v; strlog = v; anglog = v; + featherlog = v; CCmaskcurveL = v; LLmaskcurveL = v; HHmaskcurveL = v; @@ -8794,6 +9272,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) shadmask = v; str_mask = v; ang_mask = v; + feather_mask = v; HHhmask_curve = v; Lmask_curve = v; LLmask_curvewav = v; @@ -8802,6 +9281,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) visicie= v; complexcie= v; expcie = v; + expprecam = v; reparcie = v; sensicie = v; Autograycie = v; @@ -8809,8 +9289,17 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) forcebw = v; qtoj = v; jabcie = v; - sigmoidqjcie = v; + comprcieauto = v; + normcie = v; + gamutcie = v; + bwcie = v; + sigcie = v; logcie = v; + satcie = v; + logcieq = v; + smoothcie = v; + smoothcieyb = v; + smoothcielum = v; logjz = v; sigjz = v; sigq = v; @@ -8819,6 +9308,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) sourceabscie = v; sursourcie = v; modecam = v; + bwevMethod = v; modecie = v; saturlcie = v; rstprotectcie = v; @@ -8843,8 +9333,10 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) lightlcie = v; lightjzcie = v; lightqcie = v; + lightsigqcie = v; contlcie = v; contjzcie = v; + detailciejz = v; adapjzcie = v; jz100 = v; pqremap = v; @@ -8860,31 +9352,63 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) targetjz = v; sigmoidldacie = v; sigmoidthcie = v; + sigmoidsenscie = v; sigmoidblcie = v; + comprcie = v; + strcielog = v; + comprcieth = v; + gamjcie = v; + slopjcie = v; + slopesmo = v; + slopesmor = v; + slopesmog = v; + slopesmob = v; + midtcie = v; + redxl = v; + redyl = v; + grexl = v; + greyl = v; + bluxl = v; + bluyl = v; + refi = v; + shiftxl = v; + shiftyl = v; + labgridcieALow = v; + labgridcieBLow = v; + labgridcieAHigh= v; + labgridcieBHigh = v; + labgridcieGx = v; + labgridcieGy = v; + labgridcieWx = v; + labgridcieWy = v; + labgridcieMx = v; + labgridcieMy = v; + whitescie = v; + blackscie = v; + illMethod = v; + smoothciemet = v; + primMethod = v; + catMethod = v; sigmoidldajzcie = v; sigmoidthjzcie = v; sigmoidbljzcie = v; contqcie = v; + contsigqcie = 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; + anggradcie = v; + feathercie = v; + strgradcie = v; enacieMask = v; + enacieMaskall = v; CCmaskciecurve = v; LLmaskciecurve = v; HHmaskciecurve = v; + HHhmaskciecurve = v; blendmaskcie = v; radmaskcie = v; sigmalcjz = v; @@ -8902,6 +9426,15 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) lowthrescie = v; higthrescie = v; decaycie = v; + strumaskcie = v; + toolcie = v; + fftcieMask = v; + contcie = v; + blurcie = v; + highmaskcie = v; + shadmaskcie = v; + LLmaskciecurvewav = v; + csthresholdcie = v; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 00ace3b3e..bc617612c 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -371,7 +371,7 @@ struct SHParamsEdited { struct ToneEqualizerParamsEdited { bool enabled; - std::array bands; + std::array bands; bool regularization; bool show_colormap; bool pivot; @@ -476,6 +476,7 @@ public: bool strcolab; bool strcolh; bool angcol; + bool feathercol; bool blurcolde; bool blurcol; bool contcol; @@ -538,6 +539,7 @@ public: bool blurexpde; bool strexp; bool angexp; + bool featherexp; bool excurve; bool norm; bool inversex; @@ -577,7 +579,7 @@ public: bool expshadhigh; bool complexshadhigh; bool shMethod; - bool multsh[6]; + bool multsh[7]; bool highlights; bool h_tonalwidth; bool shadows; @@ -593,6 +595,7 @@ public: bool blurSHde; bool strSH; bool angSH; + bool featherSH; bool inverssh; bool chromaskSH; bool gammaskSH; @@ -638,6 +641,7 @@ public: bool strvibab; bool strvibh; bool angvib; + bool feathervib; bool Lmaskvibcurve; bool recothresv; bool lowthresv; @@ -779,6 +783,7 @@ public: bool equilret; bool loglin; bool dehazeSaturation; + bool dehazeblack; bool softradiusret; bool CCmaskreticurve; bool LLmaskreticurve; @@ -853,6 +858,7 @@ public: bool sigmalc2; bool strwav; bool angwav; + bool featherwav; bool strengthw; bool sigmaed; bool radiusw; @@ -945,8 +951,13 @@ public: bool fullimage; bool repar; bool ciecam; + bool satlog; bool blackEv; bool whiteEv; + bool whiteslog; + bool blackslog; + bool comprlog; + bool strelog; bool detail; bool sursour; bool surround; @@ -954,6 +965,7 @@ public: bool baselog; bool strlog; bool anglog; + bool featherlog; bool CCmaskcurveL; bool LLmaskcurveL; bool HHmaskcurveL; @@ -991,6 +1003,7 @@ public: bool shadmask; bool str_mask; bool ang_mask; + bool feather_mask; bool HHhmask_curve; bool Lmask_curve; bool LLmask_curvewav; @@ -999,6 +1012,7 @@ public: bool visicie; bool complexcie; bool expcie; + bool expprecam; bool reparcie; bool sensicie; bool Autograycie; @@ -1006,8 +1020,17 @@ public: bool forcebw; bool qtoj; bool jabcie; - bool sigmoidqjcie; + bool comprcieauto; + bool normcie; + bool gamutcie; + bool bwcie; + bool sigcie; bool logcie; + bool satcie; + bool logcieq; + bool smoothcie; + bool smoothcieyb; + bool smoothcielum; bool logjz; bool sigjz; bool sigq; @@ -1016,6 +1039,7 @@ public: bool sourceabscie; bool sursourcie; bool modecam; + bool bwevMethod; bool modecie; bool saturlcie; bool rstprotectcie; @@ -1040,8 +1064,10 @@ public: bool lightlcie; bool lightjzcie; bool lightqcie; + bool lightsigqcie; bool contlcie; bool contjzcie; + bool detailciejz; bool adapjzcie; bool jz100; bool pqremap; @@ -1057,31 +1083,65 @@ public: bool targetjz; bool sigmoidldacie; bool sigmoidthcie; + bool sigmoidsenscie; bool sigmoidblcie; + bool comprcie; + bool strcielog; + bool comprcieth; + bool gamjcie; + bool slopjcie; + bool slopesmo; + bool slopesmor; + bool slopesmog; + bool slopesmob; + bool midtcie; + bool redxl; + bool redyl; + bool grexl; + bool greyl; + bool bluxl; + bool bluyl; + bool refi; + bool shiftxl; + bool shiftyl; + bool labgridcieALow; + bool labgridcieBLow; + bool labgridcieAHigh; + bool labgridcieBHigh; + bool labgridcieGx; + bool labgridcieGy; + bool labgridcieWx; + bool labgridcieWy; + bool labgridcieMx; + bool labgridcieMy; + bool whitescie; + bool blackscie; + bool illMethod; + bool smoothciemet; + bool primMethod; + bool catMethod; bool sigmoidldajzcie; bool sigmoidthjzcie; bool sigmoidbljzcie; bool contqcie; + bool contsigqcie; 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 strgradcie; + bool anggradcie; + bool feathercie; + bool enacieMask; + bool enacieMaskall; bool CCmaskciecurve; bool LLmaskciecurve; bool HHmaskciecurve; + bool HHhmaskciecurve; bool blendmaskcie; bool radmaskcie; bool sigmalcjz; @@ -1099,7 +1159,16 @@ public: bool lowthrescie; bool higthrescie; bool decaycie; - + bool strumaskcie; + bool toolcie; + bool fftcieMask; + bool contcie; + bool blurcie; + bool highmaskcie; + bool shadmaskcie; + bool LLmaskciecurvewav; + bool csthresholdcie; + LocallabSpotEdited(bool v); void set(bool v); @@ -1241,16 +1310,23 @@ struct ColorManagementParamsEdited { bool workingTRC; bool workingTRCGamma; bool workingTRCSlope; + bool wmidtcie; + bool wsmoothcie; bool will; bool wprim; + bool wcat; bool redx; bool redy; bool grex; bool grey; bool blux; bool bluy; + bool refi; + bool shiftx; + bool shifty; bool preser; bool fbw; + bool trcExp; bool gamut; bool labgridcieALow; bool labgridcieBLow; @@ -1260,6 +1336,8 @@ struct ColorManagementParamsEdited { bool labgridcieGy; bool labgridcieWx; bool labgridcieWy; + bool labgridcieMx; + bool labgridcieMy; bool aRendIntent; bool outputProfile; bool outputIntent; diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index 648db44be..e46598912 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -113,29 +113,29 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, TOOL_NAME, M("TP_P 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")); + RTImage* const ipers_draw = Gtk::manage (new RTImage ("draw", Gtk::ICON_SIZE_BUTTON)); + RTImage* const ipers_trash = Gtk::manage (new RTImage ("trash-empty", Gtk::ICON_SIZE_BUTTON)); + RTImage* const ipers_apply = Gtk::manage (new RTImage ("tick", Gtk::ICON_SIZE_BUTTON)); - 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")); + RTImage* const ipersHL = Gtk::manage (new RTImage ("perspective-horizontal-left-small")); + RTImage* const ipersHR = Gtk::manage (new RTImage ("perspective-horizontal-right-small")); + RTImage* const ipersVL = Gtk::manage (new RTImage ("perspective-vertical-bottom-small")); + RTImage* const ipersVR = Gtk::manage (new RTImage ("perspective-vertical-top-small")); - 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")); + RTImage* const ipers_auto_pitch = Gtk::manage (new RTImage ("perspective-vertical-bottom", Gtk::ICON_SIZE_BUTTON)); + RTImage* const ipers_auto_yaw = Gtk::manage (new RTImage ("perspective-horizontal-left", Gtk::ICON_SIZE_BUTTON)); + RTImage* const ipers_auto_pitch_yaw = Gtk::manage (new RTImage ("perspective-horizontal-vertical", Gtk::ICON_SIZE_BUTTON)); - 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")); + RTImage* const ipers_cam_yaw_left = Gtk::manage (new RTImage ("perspective-horizontal-left-small")); + RTImage* const ipers_cam_yaw_right = Gtk::manage (new RTImage ("perspective-horizontal-right-small")); + RTImage* const ipers_cam_pitch_left = Gtk::manage (new RTImage ("perspective-vertical-bottom-small")); + RTImage* const ipers_cam_pitch_right = Gtk::manage (new RTImage ("perspective-vertical-top-small")); + RTImage* const ipers_proj_yaw_left = Gtk::manage (new RTImage ("perspective-horizontal-left-small")); + RTImage* const ipers_proj_yaw_right = Gtk::manage (new RTImage ("perspective-horizontal-right-small")); + RTImage* const ipers_proj_pitch_left = Gtk::manage (new RTImage ("perspective-vertical-bottom-small")); + RTImage* const ipers_proj_pitch_right = Gtk::manage (new RTImage ("perspective-vertical-top-small")); + RTImage* const ipers_rotate_left = Gtk::manage(new RTImage("rotate-right-small")); + RTImage* const ipers_rotate_right = Gtk::manage(new RTImage("rotate-left-small")); Gtk::Box* method_hbox = Gtk::manage (new Gtk::Box()); Gtk::Label* method_label = Gtk::manage (new Gtk::Label (M("TP_PERSPECTIVE_METHOD") + ": ")); diff --git a/rtgui/placesbrowser.cc b/rtgui/placesbrowser.cc index 8fa86aa0b..1f7a47f15 100644 --- a/rtgui/placesbrowser.cc +++ b/rtgui/placesbrowser.cc @@ -32,7 +32,7 @@ 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); @@ -43,13 +43,13 @@ PlacesBrowser::PlacesBrowser () setExpandAlignProperties(add, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); //add->get_style_context()->set_junction_sides(Gtk::JUNCTION_RIGHT); add->get_style_context()->add_class("Left"); - add->set_image (*Gtk::manage (new RTImage ("add-small.png"))); + add->set_image (*Gtk::manage (new RTImage ("add-small", Gtk::ICON_SIZE_BUTTON))); del = Gtk::manage (new Gtk::Button ()); del->set_tooltip_text(M("MAIN_FRAME_PLACES_DEL")); setExpandAlignProperties(del, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); //del->get_style_context()->set_junction_sides(Gtk::JUNCTION_LEFT); del->get_style_context()->add_class("Right"); - del->set_image (*Gtk::manage (new RTImage ("remove-small.png"))); + del->set_image (*Gtk::manage (new RTImage ("remove-small", Gtk::ICON_SIZE_BUTTON))); Gtk::Grid* buttonBox = Gtk::manage (new Gtk::Grid ()); buttonBox->set_orientation(Gtk::ORIENTATION_HORIZONTAL); buttonBox->attach_next_to(*add, Gtk::POS_LEFT, 1, 1); diff --git a/rtgui/popupcommon.cc b/rtgui/popupcommon.cc index 741d4da0f..dfcdcc449 100644 --- a/rtgui/popupcommon.cc +++ b/rtgui/popupcommon.cc @@ -80,13 +80,13 @@ bool PopUpCommon::addEntry (const Glib::ustring& fileName, const Glib::ustring& return insertEntry(getEntryCount(), fileName, label, radioGroup); } -bool PopUpCommon::insertEntry(int position, const Glib::ustring& fileName, const Glib::ustring& label, Gtk::RadioButtonGroup *radioGroup) +bool PopUpCommon::insertEntry(int position, const Glib::ustring& iconName, const Glib::ustring& label, Gtk::RadioButtonGroup *radioGroup) { RTImage* image = nullptr; - if (!fileName.empty()) { - image = Gtk::manage(new RTImage(fileName)); + if (!iconName.empty()) { + image = Gtk::manage(new RTImage(iconName)); } - bool success = insertEntryImpl(position, fileName, Glib::RefPtr(), image, label, radioGroup); + bool success = insertEntryImpl(position, iconName, Glib::RefPtr(), image, label, radioGroup); if (!success && image) { delete image; } @@ -95,7 +95,7 @@ bool PopUpCommon::insertEntry(int position, const Glib::ustring& fileName, const 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)); + auto image = Gtk::manage(new RTImage(gIcon, Gtk::ICON_SIZE_BUTTON)); bool success = insertEntryImpl(position, "", gIcon, image, label, radioGroup); if (!success) { delete image; @@ -103,7 +103,7 @@ bool PopUpCommon::insertEntry(int position, const Glib::RefPtr& return success; } -bool PopUpCommon::insertEntryImpl(int position, const Glib::ustring& fileName, const Glib::RefPtr& gIcon, RTImage* image, const Glib::ustring& label, Gtk::RadioButtonGroup* radioGroup) +bool PopUpCommon::insertEntryImpl(int position, const Glib::ustring& iconName, const Glib::RefPtr& gIcon, RTImage* image, const Glib::ustring& label, Gtk::RadioButtonGroup* radioGroup) { if (label.empty() || position < 0 || position > getEntryCount()) return false; @@ -117,12 +117,12 @@ bool PopUpCommon::insertEntryImpl(int position, const Glib::ustring& fileName, c newItem = Gtk::manage(new MyImageMenuItem(label, image)); } imageIcons.insert(imageIcons.begin() + position, gIcon); - imageFilenames.insert(imageFilenames.begin() + position, fileName); + imageIconNames.insert(imageIconNames.begin() + position, iconName); images.insert(images.begin() + position, image); // When there is at least 1 choice, we add the arrow button if (images.size() == 1) { - changeImage(fileName, gIcon); + changeImage(iconName, gIcon); buttonImage->show(); selected = 0; button->get_style_context()->add_class("Left"); @@ -185,21 +185,21 @@ void PopUpCommon::removeEntry(int position) std::unique_ptr menuItem(menu->get_children()[position]); menu->remove(*menuItem); imageIcons.erase(imageIcons.begin() + position); - imageFilenames.erase(imageFilenames.begin() + position); + imageIconNames.erase(imageIconNames.begin() + position); images.erase(images.begin() + position); } void PopUpCommon::changeImage(int position) { - changeImage(imageFilenames.at(position), imageIcons.at(position)); + changeImage(imageIconNames.at(position), imageIcons.at(position)); } -void PopUpCommon::changeImage(const Glib::ustring& fileName, const Glib::RefPtr& gIcon) +void PopUpCommon::changeImage(const Glib::ustring& iconName, const Glib::RefPtr& gIcon) { - if (!fileName.empty()) { - buttonImage->changeImage(fileName); + if (!iconName.empty()) { + buttonImage->set_from_icon_name(iconName, Gtk::ICON_SIZE_BUTTON); } else { - buttonImage->changeImage(gIcon, static_cast(Gtk::ICON_SIZE_BUTTON)); + buttonImage->set_from_gicon(gIcon, Gtk::ICON_SIZE_BUTTON); } } @@ -250,7 +250,7 @@ void PopUpCommon::setItemSensitivity (int index, bool isSensitive) { bool PopUpCommon::setSelected (int entryNum) { entryNum = indexToPos(entryNum); - + if (entryNum < 0 || entryNum > ((int)images.size() - 1) || (int)entryNum == selected) { return false; } else { diff --git a/rtgui/popupcommon.h b/rtgui/popupcommon.h index 91bfdabea..e3e5ff74c 100644 --- a/rtgui/popupcommon.h +++ b/rtgui/popupcommon.h @@ -62,8 +62,8 @@ public: explicit PopUpCommon (Gtk::Button* button, const Glib::ustring& label = ""); virtual ~PopUpCommon (); - 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 addEntry (const Glib::ustring& iconName, const Glib::ustring& label, Gtk::RadioButtonGroup* radioGroup = nullptr); + bool insertEntry(int position, const Glib::ustring& iconName, const Glib::ustring& label, Gtk::RadioButtonGroup* radioGroup = nullptr); bool insertEntry(int position, const Glib::RefPtr& gIcon, const Glib::ustring& label, Gtk::RadioButtonGroup* radioGroup = nullptr); /// Sets the button image to show when there are no entries. void setEmptyImage(const Glib::ustring &fileName); @@ -82,7 +82,7 @@ private: Glib::ustring emptyImageFilename; std::vector> imageIcons; - std::vector imageFilenames; + std::vector imageIconNames; std::vector images; Glib::ustring buttonHint; RTImage* buttonImage; @@ -95,15 +95,15 @@ private: MyMutex entrySelectionMutex; void changeImage(int position); - void changeImage(const Glib::ustring& fileName, const Glib::RefPtr& gIcon); + void changeImage(const Glib::ustring& iconName, 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); + bool insertEntryImpl(int position, const Glib::ustring& iconName, const Glib::RefPtr& gIcon, RTImage* image, const Glib::ustring& label, Gtk::RadioButtonGroup* radioGroup); void showMenu(GdkEventButton* event); protected: virtual int posToIndex(int p) const { return p; } virtual int indexToPos(int i) const { return i; } - + void entrySelected (int i); }; diff --git a/rtgui/ppversion.h b/rtgui/ppversion.h index f2455699c..6b7909edf 100644 --- a/rtgui/ppversion.h +++ b/rtgui/ppversion.h @@ -1,11 +1,13 @@ #pragma once // This number has to be incremented whenever the PP3 file format is modified or the behaviour of a tool changes -#define PPVERSION 350 +#define PPVERSION 351 #define PPVERSION_AEXP 301 //value of PPVERSION when auto exposure algorithm was modified /* Log of version changes + 351 2024-06-19 + take into account Global in selective editing 350 2023-03-05 introduced white balance standard observer 349 2020-10-29 diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 103075274..d102a2672 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -82,9 +82,20 @@ Preferences::Preferences(RTWindow *rtwindow) 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; + // Request default font and size from Gtk::Settings + const auto defaultSettings = Gtk::Settings::get_default(); + Glib::ustring defaultFont; + defaultSettings->get_property("gtk-font-name", defaultFont); + const Pango::FontDescription defaultFontDesc = Pango::FontDescription(defaultFont); + initialFontFamily = defaultFontDesc.get_family(); +#if defined(__APPLE__) + // Default MacOS font (i.e. "") is not correctly handled + // in Gtk css. Replacing it by "-apple-system" to avoid this + if (initialFontFamily == ".AppleSystemUIFont") { + initialFontFamily = "-apple-system"; + } +#endif + initialFontSize = defaultFontDesc.get_size() / Pango::SCALE; // Font size is managed in ()"pt" * Pango::SCALE) by Pango (also refer to notes in rtscalable.h) Gtk::Box* mainBox = get_content_area(); //GTK318 @@ -139,14 +150,11 @@ Preferences::~Preferences() get_size(options.preferencesWidth, options.preferencesHeight); } -int Preferences::getThemeRowNumber (const Glib::ustring& longThemeFName) +int Preferences::getThemeRowNumber (const Glib::ustring& name) { - - if (regex->match(longThemeFName + ".css", matchInfo)) { - for (size_t i = 0 ; i < themeFNames.size(); ++i) { - if (themeFNames.at(i).longFName == longThemeFName) { - return (int)i; - } + for (size_t i = 0 ; i < themeNames.size(); ++i) { + if (themeNames.at(i) == name) { + return (int)i; } } @@ -648,7 +656,7 @@ Gtk::Widget* Preferences::getImageProcessingPanel () Gtk::Grid* dirgrid = Gtk::manage(new Gtk::Grid()); setExpandAlignProperties(dirgrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - // Dark Frames Dir + // 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)); @@ -697,7 +705,7 @@ Gtk::Widget* Preferences::getImageProcessingPanel () 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 + //Lens Profiles Dir Gtk::Label *lensProfilesDirLabel = Gtk::manage(new Gtk::Label(M("PREFERENCES_LENSPROFILESDIR") + ":")); lensProfilesDirLabel->set_tooltip_text(M("PREFERENCES_LENSPROFILESDIR_TOOLTIP")); setExpandAlignProperties(lensProfilesDirLabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); @@ -744,6 +752,37 @@ Gtk::Widget* Preferences::getImageProcessingPanel () cropFrame->add(*cropGrid); vbImageProcessing->pack_start(*cropFrame, Gtk::PACK_SHRINK, 4); + Gtk::Frame *rawDecoderFrame = Gtk::manage(new Gtk::Frame(M("PREFERENCES_RAW_DECODER"))); + Gtk::Box *rawDecoderContainer = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + rawDecoderFrame->add(*rawDecoderContainer); + enableLibRaw = Gtk::manage(new Gtk::CheckButton()); + enableLibRaw->add(*Gtk::manage(new Gtk::Label(M("PREFERENCES_RAW_DECODER_ENABLE_LIBRAW")))); + rawDecoderContainer->pack_start(*enableLibRaw); + vbImageProcessing->pack_start(*rawDecoderFrame, Gtk::PACK_SHRINK, 4); + + // Other: max zoom + { + Gtk::Frame *frame = Gtk::manage(new Gtk::Frame(M("GENERAL_OTHER"))); + frame->set_label_align (0.025, 0.5); + Gtk::Grid *grid = Gtk::manage(new Gtk::Grid()); + + Gtk::Label *label = Gtk::manage(new Gtk::Label(M("PREFERENCES_MAX_ZOOM_TITLE") + ": ", Gtk::ALIGN_START)); + label->set_line_wrap(true); + grid->attach(*label, 0, 0); + + maxZoomCombo = Gtk::manage(new Gtk::ComboBoxText()); + + // Labels order matches to Options::MaxZoom enum + for (int i = 1; i <= 8; ++i) { + maxZoomCombo->append(Glib::ustring::compose("%100%%", i)); + } + maxZoomCombo->append("1600%"); + + grid->attach(*maxZoomCombo, 1, 0, 1, 1); + frame->add(*grid); + vbImageProcessing->pack_start(*frame, Gtk::PACK_SHRINK, 4); + } + swImageProcessing->add(*vbImageProcessing); return swImageProcessing; @@ -873,7 +912,7 @@ Gtk::Widget* Preferences::getColorManPanel () vbColorMan->pack_start (*iccdgrid, Gtk::PACK_SHRINK); - + //------------------------- MONITOR ---------------------- Gtk::Frame* fmonitor = Gtk::manage(new Gtk::Frame(M("PREFERENCES_MONITOR"))); @@ -992,7 +1031,7 @@ Gtk::Widget* Preferences::getColorManPanel () 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()); @@ -1008,14 +1047,14 @@ Gtk::Widget* Preferences::getColorManPanel () //------------White-Balance auto temperature correlation - + Gtk::Frame* fwbacorr = Gtk::manage(new Gtk::Frame(M("PREFERENCES_WBACORR"))); fwbacorr->set_tooltip_text(M("PREFERENCES_WBACORR_TOOLTIP")); fwbacorr->set_label_align(0.025, 0.5); Gtk::Box* wbaVB = Gtk::manage ( new Gtk::Box(Gtk::ORIENTATION_VERTICAL) ); Gtk::Box* wbah = Gtk::manage ( new Gtk::Box () ); wbah->set_spacing (4); - + mwbaena = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_WBAENA"))); setExpandAlignProperties(mwbaena, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); mwbaena->set_active(true); @@ -1081,6 +1120,9 @@ Gtk::Widget* Preferences::getGeneralPanel() workflowGrid->attach_next_to(*curveBBoxPosC, *editorLayout, Gtk::POS_BOTTOM, 1, 1); workflowGrid->attach_next_to(*curveBBoxPosRestartL, *lNextStart, Gtk::POS_BOTTOM, 1, 1); + curveBBoxPosS = Gtk::manage(new Gtk::ComboBoxText()); + setExpandAlignProperties(curveBBoxPosS, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); + 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()); @@ -1092,13 +1134,29 @@ Gtk::Widget* Preferences::getGeneralPanel() workflowGrid->attach_next_to(*complexityL, *curveBBoxPosL, Gtk::POS_BOTTOM, 1, 1); workflowGrid->attach_next_to(*complexitylocal, *curveBBoxPosC, Gtk::POS_BOTTOM, 1, 1); + + Gtk::Label* spotlocalL = Gtk::manage(new Gtk::Label(M("PREFERENCES_SPOTLOC") + ":")); + setExpandAlignProperties(spotlocalL, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + spotlocal = Gtk::manage(new Gtk::ComboBoxText()); + setExpandAlignProperties(spotlocal, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); + spotlocal->append(M("TP_LOCALLAB_EXNORM")); + spotlocal->append(M("TP_LOCALLAB_EXECLU")); + spotlocal->append(M("TP_LOCALLAB_EXFULL")); + spotlocal->append(M("TP_LOCALLAB_EXMAIN")); + spotlocal->set_active(2); + workflowGrid->attach_next_to(*spotlocalL, *complexityL, Gtk::POS_BOTTOM, 1, 1); + workflowGrid->attach_next_to(*spotlocal, *complexitylocal, Gtk::POS_BOTTOM, 1, 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); + //workflowGrid->attach_next_to(*zoomOnScrollCB, *complexityL, Gtk::POS_BOTTOM, 1, 1); + workflowGrid->attach_next_to(*zoomOnScrollCB, *spotlocalL, Gtk::POS_BOTTOM, 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); + // workflowGrid->attach_next_to(*inspectorWindowCB, *complexitylocal, Gtk::POS_BOTTOM, 1, 1); + workflowGrid->attach_next_to(*inspectorWindowCB, *spotlocal, 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); @@ -1196,8 +1254,8 @@ Gtk::Widget* Preferences::getGeneralPanel() themeCBT = Gtk::manage(new Gtk::ComboBoxText()); themeCBT->set_active(0); parseThemeDir(Glib::build_filename(argv0, "themes")); - for (size_t i = 0; i < themeFNames.size(); i++) { - themeCBT->append(themeFNames.at(i).shortFName); + for (size_t i = 0; i < themeNames.size(); i++) { + themeCBT->append(themeNames.at(i)); } Gtk::Label* mainFontLbl = Gtk::manage(new Gtk::Label(M("PREFERENCES_APPEARANCE_MAINFONT"))); @@ -1234,9 +1292,6 @@ Gtk::Widget* Preferences::getGeneralPanel() navGuideColorCB = Gtk::manage(new Gtk::ColorButton()); navGuideColorCB->set_use_alpha(true); - 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::Separator *vSep = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)); @@ -1252,7 +1307,6 @@ Gtk::Widget* Preferences::getGeneralPanel() appearanceGrid->attach(*colorPickerFontFB, 1, 2, 1, 1); appearanceGrid->attach(*navGuideColorLbl, 3, 2, 1, 1); appearanceGrid->attach(*navGuideColorCB, 4, 2, 1, 1); - appearanceGrid->attach(*pseudoHiDPI, 0, 3, 5, 1); appearanceFrame->add(*appearanceGrid); vbGeneral->attach_next_to(*appearanceFrame, *flang, Gtk::POS_BOTTOM, 2, 1); @@ -1349,7 +1403,7 @@ Gtk::Widget* Preferences::getGeneralPanel() 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); @@ -1366,8 +1420,8 @@ Gtk::Widget* Preferences::getGeneralPanel() 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)); tconn = themeCBT->signal_changed().connect ( sigc::mem_fun (*this, &Preferences::themeChanged) ); @@ -1443,6 +1497,9 @@ Gtk::Widget* Preferences::getFileBrowserPanel() vbro->pack_start(*sameThumbSize, Gtk::PACK_SHRINK, 0); vbro->pack_start(*ckbInternalThumbIfUntouched, Gtk::PACK_SHRINK, 0); + thumbnailRankColorMode = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_THUMBNAIL_RANK_COLOR_MODE"))); + vbro->pack_start(*thumbnailRankColorMode, Gtk::PACK_SHRINK, 0); + 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()); @@ -1453,6 +1510,28 @@ Gtk::Widget* Preferences::getFileBrowserPanel() maxRecentFolders->set_range(1, 25); vbro->pack_start(*hbrecent, Gtk::PACK_SHRINK, 4); + // Recursive browsing options. + Gtk::Box *hbBrowseRecursive = Gtk::manage(new Gtk::Box()); + Gtk::Label *labBrowseRecursiveDepth = Gtk::manage(new Gtk::Label(M("PREFERENCES_BROWSERECURSIVEDEPTH") + ":")); + browseRecursiveDepth = Gtk::manage(new Gtk::SpinButton()); + browseRecursiveDepth->set_digits(0); + browseRecursiveDepth->set_increments(1, 5); + browseRecursiveDepth->set_range(1, 999); + Gtk::Label *labBrowseRecursiveMaxDirs = Gtk::manage(new Gtk::Label(M("PREFERENCES_BROWSERECURSIVEMAXDIRS") + ":")); + browseRecursiveMaxDirs = Gtk::manage(new Gtk::SpinButton()); + browseRecursiveMaxDirs->set_digits(0); + browseRecursiveMaxDirs->set_increments(1, 5); + browseRecursiveMaxDirs->set_range(1, 999); + hbBrowseRecursive->pack_start(*labBrowseRecursiveDepth, Gtk::PACK_SHRINK, 4); + hbBrowseRecursive->pack_start(*browseRecursiveDepth, Gtk::PACK_SHRINK, 4); + hbBrowseRecursive->pack_start(*labBrowseRecursiveMaxDirs, Gtk::PACK_SHRINK, 4); + hbBrowseRecursive->pack_start(*browseRecursiveMaxDirs, Gtk::PACK_SHRINK, 4); + vbro->pack_start(*hbBrowseRecursive, Gtk::PACK_SHRINK, 0); +#ifndef _WIN32 + browseRecursiveFollowLinks = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_BROWSERECURSIVEFOLLOWLINKS"))); + vbro->pack_start(*browseRecursiveFollowLinks, Gtk::PACK_SHRINK, 0); +#endif + fro->add(*vbro); @@ -1481,9 +1560,9 @@ Gtk::Widget* Preferences::getFileBrowserPanel() frmnu->add (*menuGrid); - 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); @@ -1495,14 +1574,16 @@ Gtk::Widget* Preferences::getFileBrowserPanel() 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")); + addExt->set_sensitive(false); + delExt->set_sensitive(false); + addExt->set_tooltip_markup(M("PREFERENCES_PARSEDEXTADDHINT")); + delExt->set_tooltip_markup(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")); + Gtk::Image* addExtImg = Gtk::manage ( new RTImage ("add-small", Gtk::ICON_SIZE_BUTTON) ); + Gtk::Image* delExtImg = Gtk::manage ( new RTImage ("remove-small", Gtk::ICON_SIZE_BUTTON) ); + Gtk::Image* moveExtUpImg = Gtk::manage(new RTImage("arrow-up-small", Gtk::ICON_SIZE_BUTTON)); + Gtk::Image* moveExtDownImg = Gtk::manage(new RTImage("arrow-down-small", Gtk::ICON_SIZE_BUTTON)); addExt->add(*addExtImg); delExt->add(*delExtImg); moveExtUp->set_image(*moveExtUpImg); @@ -1511,6 +1592,7 @@ Gtk::Widget* Preferences::getFileBrowserPanel() 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); @@ -1520,8 +1602,9 @@ Gtk::Widget* Preferences::getFileBrowserPanel() 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); + vbre->pack_start(*hscrollw); fre->add(*vbre); @@ -1599,11 +1682,14 @@ Gtk::Widget* Preferences::getFileBrowserPanel() vbFileBrowser->pack_start (*hb6, Gtk::PACK_SHRINK, 4); + extensions->signal_cursor_changed().connect(sigc::mem_fun(*this, &Preferences::extensionsChanged)); + extension->signal_changed().connect(sigc::mem_fun(*this, &Preferences::extensionChanged)); + 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)); @@ -1705,7 +1791,7 @@ void Preferences::parseThemeDir(Glib::ustring dirname) return; } - // process directory + // Process directory Glib::Dir* dir = nullptr; try { @@ -1715,40 +1801,17 @@ void Preferences::parseThemeDir(Glib::ustring dirname) } for (Glib::DirIterator i = dir->begin(); i != dir->end(); ++i) { - Glib::ustring fname = Glib::build_filename(dirname, *i); - Glib::ustring sname = *i; + Glib::ustring fname = *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) { - bool keepIt = false; - 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); - - if ((guint64)GTK_MINOR_VERSION >= minMinorVal) { - keepIt = true; - } - } - - if (!maxMinor.empty()) { - guint64 maxMinorVal = g_ascii_strtoll(maxMinor.c_str(), 0, 0); - - if ((guint64)GTK_MINOR_VERSION <= maxMinorVal) { - keepIt = true; - } - } - - if (keepIt) { - themeFNames.push_back(ThemeFilename(matchInfo.fetch(1), sname.substr(0, sname.size() - 4))); - } + // Ignore directories and filter to keep css files only + if (regex->match(fname, matchInfo) && !Glib::file_test(fname, Glib::FILE_TEST_IS_DIR) && fname.size() >= 4) { + themeNames.push_back(fname.substr(0, fname.size() - 4)); } } - std::sort(themeFNames.begin(), themeFNames.end(), [](const ThemeFilename & firstDir, const ThemeFilename & secondDir) { - return firstDir.longFName < secondDir.longFName; + // Sort theme by names + std::sort(themeNames.begin(), themeNames.end(), [](const Glib::ustring & first, const Glib::ustring & second) { + return first < second; }); delete dir; @@ -1787,7 +1850,7 @@ void Preferences::storePreferences() moptions.shadowThreshold = (int)shThresh->get_value(); moptions.language = languages->get_active_id(); moptions.languageAutoDetect = ckbLangAutoDetect->get_active(); - moptions.theme = themeFNames.at (themeCBT->get_active_row_number ()).longFName; + moptions.theme = themeNames.at (themeCBT->get_active_row_number ()); Gdk::RGBA cropCol = cropMaskColorCB->get_rgba(); moptions.cutOverlayBrush[0] = cropCol.get_red(); @@ -1815,8 +1878,6 @@ void Preferences::storePreferences() moptions.CPFontSize = cpfd.get_size() / Pango::SCALE; } - moptions.pseudoHiDPISupport = pseudoHiDPI->get_active(); - const std::vector &editors = externalEditors->getEditors(); moptions.externalEditors.resize(editors.size()); moptions.externalEditorIndex = @@ -1934,6 +1995,11 @@ void Preferences::storePreferences() moptions.filmStripOverlayedFileNames = filmStripOverlayedFileNames->get_active(); moptions.sameThumbSize = sameThumbSize->get_active(); moptions.internalThumbIfUntouched = ckbInternalThumbIfUntouched->get_active(); + moptions.browseRecursiveDepth = static_cast(browseRecursiveDepth->get_value()); + moptions.browseRecursiveMaxDirs = static_cast(browseRecursiveMaxDirs->get_value()); + if (browseRecursiveFollowLinks) { + moptions.browseRecursiveFollowLinks = browseRecursiveFollowLinks->get_active(); + } auto save_where = saveParamsPreference->get_active_row_number(); moptions.saveParamsFile = save_where == 0 || save_where == 2; @@ -1962,6 +2028,8 @@ void Preferences::storePreferences() moptions.curvebboxpos = curveBBoxPosC->get_active_row_number(); moptions.complexity = complexitylocal->get_active_row_number(); + moptions.spotmet = spotlocal->get_active_row_number(); + moptions.inspectorWindow = inspectorWindowCB->get_active(); moptions.zoomOnScroll = zoomOnScrollCB->get_active(); moptions.histogramPosition = ckbHistogramPositionLeft->get_active() ? 1 : 2; @@ -1994,11 +2062,16 @@ void Preferences::storePreferences() moptions.cropGuides = Options::CropGuidesMode(cropGuidesCombo->get_active_row_number()); moptions.cropAutoFit = cropAutoFitCB->get_active(); + moptions.maxZoomLimit = Options::MaxZoom(maxZoomCombo->get_active_row_number()); + + moptions.rtSettings.enableLibRaw = enableLibRaw->get_active(); toolLocationPreference->updateOptions(); moptions.rtSettings.metadata_xmp_sync = rtengine::Settings::MetadataXmpSync(metadataSyncCombo->get_active_row_number()); moptions.rtSettings.xmp_sidecar_style = rtengine::Settings::XmpSidecarStyle(xmpSidecarCombo->get_active_row_number()); + + moptions.thumbnailRankColorMode = thumbnailRankColorMode->get_active() ? Options::ThumbnailPropertyMode::XMP : Options::ThumbnailPropertyMode::PROCPARAMS; } void Preferences::fillPreferences() @@ -2088,19 +2161,17 @@ void Preferences::fillPreferences() navGuideColorCB->set_alpha ( (unsigned short) (moptions.navGuideBrush[3] * 65535.0)); if (options.fontFamily == "default") { - mainFontFB->set_font_name (Glib::ustring::compose ("%1 %2", initialFontFamily, initialFontSize)); + mainFontFB->set_font_name (Glib::ustring::compose ("%1, %2", initialFontFamily, initialFontSize)); } else { - mainFontFB->set_font_name (Glib::ustring::compose ("%1 %2", options.fontFamily, options.fontSize)); + mainFontFB->set_font_name (Glib::ustring::compose ("%1, %2", options.fontFamily, options.fontSize)); } if (options.CPFontFamily == "default") { - colorPickerFontFB->set_font_name (Glib::ustring::compose ("%1 %2", initialFontFamily, initialFontSize)); + colorPickerFontFB->set_font_name (Glib::ustring::compose ("%1, %2", initialFontFamily, initialFontSize)); } else { - colorPickerFontFB->set_font_name (Glib::ustring::compose ("%1 %2", options.CPFontFamily, options.CPFontSize)); + colorPickerFontFB->set_font_name (Glib::ustring::compose ("%1, %2", options.CPFontFamily, options.CPFontSize)); } - pseudoHiDPI->set_active(options.pseudoHiDPISupport); - showDateTime->set_active(moptions.fbShowDateTime); showBasicExif->set_active(moptions.fbShowBasicExif); showExpComp->set_active(moptions.fbShowExpComp); @@ -2164,6 +2235,11 @@ void Preferences::fillPreferences() filmStripOverlayedFileNames->set_active(moptions.filmStripOverlayedFileNames); sameThumbSize->set_active(moptions.sameThumbSize); ckbInternalThumbIfUntouched->set_active(moptions.internalThumbIfUntouched); + browseRecursiveDepth->set_value(moptions.browseRecursiveDepth); + browseRecursiveMaxDirs->set_value(moptions.browseRecursiveMaxDirs); + if (browseRecursiveFollowLinks) { + browseRecursiveFollowLinks->set_active(moptions.browseRecursiveFollowLinks); + } saveParamsPreference->set_active(moptions.saveParamsFile ? (moptions.saveParamsCache ? 2 : 0) : 1); @@ -2178,6 +2254,7 @@ void Preferences::fillPreferences() curveBBoxPosC->set_active(moptions.curvebboxpos); complexitylocal->set_active(moptions.complexity); + spotlocal->set_active(moptions.spotmet); inspectorWindowCB->set_active(moptions.inspectorWindow); zoomOnScrollCB->set_active(moptions.zoomOnScroll); @@ -2228,6 +2305,9 @@ void Preferences::fillPreferences() cropGuidesCombo->set_active(moptions.cropGuides); cropAutoFitCB->set_active(moptions.cropAutoFit); + maxZoomCombo->set_active(static_cast(options.maxZoomLimit)); + + enableLibRaw->set_active(moptions.rtSettings.enableLibRaw); addc.block(false); setc.block(false); @@ -2253,6 +2333,8 @@ void Preferences::fillPreferences() metadataSyncCombo->set_active(int(moptions.rtSettings.metadata_xmp_sync)); xmpSidecarCombo->set_active(int(moptions.rtSettings.xmp_sidecar_style)); + + thumbnailRankColorMode->set_active(moptions.thumbnailRankColorMode == Options::ThumbnailPropertyMode::XMP); } /* @@ -2315,15 +2397,14 @@ void Preferences::okPressed() void Preferences::cancelPressed() { // set the initial theme back - if (themeFNames.at (themeCBT->get_active_row_number ()).longFName != options.theme) { - RTImage::updateImages(); + if (themeNames.at (themeCBT->get_active_row_number ()) != options.theme) { switchThemeTo(options.theme); } // set the initial font back Pango::FontDescription fd (mainFontFB->get_font_name()); - if (fd.get_family() != options.fontFamily && (fd.get_size() / Pango::SCALE) != options.fontSize) { + if (fd.get_family() != options.fontFamily || (fd.get_size() / Pango::SCALE) != options.fontSize) { if (options.fontFamily == "default") { switchFontTo(initialFontFamily, initialFontSize); } else { @@ -2355,8 +2436,7 @@ void Preferences::aboutPressed() void Preferences::themeChanged() { - moptions.theme = themeFNames.at (themeCBT->get_active_row_number ()).longFName; - RTImage::updateImages(); + moptions.theme = themeNames.at (themeCBT->get_active_row_number ()); switchThemeTo(moptions.theme); } @@ -2521,33 +2601,23 @@ void Preferences::cpFontChanged() void Preferences::switchFontTo(const Glib::ustring &newFontFamily, const int newFontSize) { + // Create CssProvider if not existing + 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); + } - 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); - } + // Create css to load based on new font name and size + const auto css = Glib::ustring::compose ("* { font-family: %1; font-size: %2pt }", newFontFamily, newFontSize); - try { - //GTK318 -//#if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION < 20 -// fontcss->load_from_data (Glib::ustring::compose ("* { font-family: %1; font-size: %2px }", newFontFamily, newFontSize * RTScalable::getScale())); -//#else - fontcss->load_from_data (Glib::ustring::compose ("* { font-family: %1; font-size: %2pt }", newFontFamily, newFontSize * RTScalable::getScale())); -//#endif - //GTK318 - } catch (Glib::Error &err) { - printf("Error: \"%s\"\n", err.what().c_str()); - } catch (...) { - 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); - } + // Load css to update font name and size + try { + fontcss->load_from_data (css); + } catch (Glib::Error &err) { + printf("Error: \"%s\"\n", err.what().c_str()); + } catch (...) { + printf("Error: Can't load the desired font correctly\n"); } } @@ -2617,25 +2687,69 @@ void Preferences::workflowUpdate() } } -void Preferences::addExtPressed() +void Preferences::extensionsChanged() { + const Glib::RefPtr selection = extensions->get_selection(); + if (!selection) { + delExt->set_sensitive(false); + return; + } + + const Gtk::TreeModel::iterator selected = selection->get_selected(); + if (!selected) { + delExt->set_sensitive(false); + return; + } + + bool delOkay = true; + for (auto const &x : moptions.knownExtensions) { + if (x == (*selected)[extensionColumns.ext]) { + delOkay = false; + break; + } + } + delExt->set_sensitive(delOkay); +} + +void Preferences::extensionChanged() +{ + if (extension->get_text().empty()) { + addExt->set_sensitive(false); + return; + } Gtk::TreeNodeChildren c = extensionModel->children(); + for (size_t i = 0; i < c.size(); i++) { + if (c[i][extensionColumns.ext] == extension->get_text()) { + addExt->set_sensitive(false); + return; + } + } - for (size_t i = 0; i < c.size(); i++) + addExt->set_sensitive(true); +} + +void Preferences::addExtPressed() +{ + Gtk::TreeNodeChildren c = extensionModel->children(); + + for (size_t i = 0; i < c.size(); i++) { if (c[i][extensionColumns.ext] == extension->get_text()) { return; } + } - Gtk::TreeRow row = * (extensionModel->append()); + Gtk::TreeRow row = * (extensionModel->prepend()); row[extensionColumns.enabled] = true; row[extensionColumns.ext] = extension->get_text(); + + extension->set_text(""); + addExt->set_sensitive(false); } void Preferences::delExtPressed() { - extensionModel->erase(extensions->get_selection()->get_selected()); } diff --git a/rtgui/preferences.h b/rtgui/preferences.h index 219844d55..9b5707be3 100644 --- a/rtgui/preferences.h +++ b/rtgui/preferences.h @@ -70,18 +70,9 @@ class Preferences final : } }; - class ThemeFilename - { - public: - Glib::ustring shortFName; - Glib::ustring longFName; - - ThemeFilename (Glib::ustring sfname, Glib::ustring lfname) : shortFName (sfname), longFName (lfname) {} - }; - Glib::RefPtr behModel; BehavColumns behavColumns; - std::vector themeFNames; + std::vector themeNames; Glib::RefPtr regex; Glib::MatchInfo matchInfo; Splash* splash; @@ -104,14 +95,14 @@ class Preferences final : 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; @@ -171,8 +162,10 @@ class Preferences final : Gtk::ComboBoxText* cprevdemo; Gtk::CheckButton* ctiffserialize; Gtk::ComboBoxText* curveBBoxPosC; + Gtk::ComboBoxText* curveBBoxPosS; Gtk::ComboBoxText* complexitylocal; + Gtk::ComboBoxText* spotlocal; Gtk::CheckButton* inspectorWindowCB; Gtk::CheckButton* zoomOnScrollCB; @@ -182,8 +175,6 @@ class Preferences final : Gtk::FontButton* colorPickerFontFB; Gtk::ColorButton* cropMaskColorCB; Gtk::ColorButton* navGuideColorCB; - Gtk::CheckButton* pseudoHiDPI; - Gtk::SpinButton* maxRecentFolders; Gtk::SpinButton* maxThumbHeightSB; @@ -197,6 +188,9 @@ class Preferences final : Gtk::CheckButton* overlayedFileNames; Gtk::CheckButton* filmStripOverlayedFileNames; Gtk::CheckButton* sameThumbSize; + Gtk::SpinButton* browseRecursiveDepth; + Gtk::SpinButton* browseRecursiveMaxDirs; + Gtk::CheckButton* browseRecursiveFollowLinks{nullptr}; Gtk::SpinButton* threadsSpinBtn; Gtk::SpinButton* clutCacheSizeSB; @@ -232,6 +226,8 @@ class Preferences final : Gtk::CheckButton* ckbInternalThumbIfUntouched; + Gtk::CheckButton *thumbnailRankColorMode; + Gtk::Entry* txtCustProfBuilderPath; Gtk::ComboBoxText* custProfBuilderLabelType; @@ -249,6 +245,10 @@ class Preferences final : Gtk::ComboBoxText *cropGuidesCombo; Gtk::CheckButton *cropAutoFitCB; + Gtk::CheckButton *enableLibRaw; + + Gtk::ComboBoxText *maxZoomCombo; + Gtk::ComboBoxText *metadataSyncCombo; Gtk::ComboBoxText *xmpSidecarCombo; @@ -285,7 +285,7 @@ class Preferences final : void switchFontTo (const Glib::ustring &newFontFamily, const int newFontSize); bool splashClosed (GdkEventAny* event); - int getThemeRowNumber (const Glib::ustring& longThemeFName); + int getThemeRowNumber (const Glib::ustring& name); void appendBehavList (Gtk::TreeModel::iterator& parent, Glib::ustring label, int id, bool set); @@ -322,9 +322,11 @@ public: void sndEnableToggled (); void langAutoDetectToggled (); void autocielabToggled (); - void observer10Toggled (); + void observer10Toggled (); void selectStartupDir (); + void extensionsChanged (); + void extensionChanged (); void addExtPressed (); void delExtPressed (); void moveExtUpPressed (); diff --git a/rtgui/previewmodepanel.cc b/rtgui/previewmodepanel.cc index 586923173..25167ae3b 100644 --- a/rtgui/previewmodepanel.cc +++ b/rtgui/previewmodepanel.cc @@ -19,76 +19,67 @@ #include "options.h" #include "multilangmgr.h" #include "imagearea.h" -#include "rtimage.h" -PreviewModePanel::PreviewModePanel (ImageArea* ia) : imageArea(ia) +PreviewModePanel::PreviewModePanel (ImageArea* ia) : + imageArea(ia), + // Note: RTImage custom class only manages squared icon. To reduce toggle button width, + // toggle button image is managed by icon name + nR("square-toggle-red-on-narrow"), ngR("square-toggle-red-off-narrow"), + nG("square-toggle-green-on-narrow"), ngG("square-toggle-green-off-narrow"), + nB("square-toggle-blue-on-narrow"), ngB("square-toggle-blue-off-narrow"), + nL("square-toggle-luminosity-on-narrow"), ngL("square-toggle-luminosity-off-narrow"), + nBC0("square-toggle-theme-on-narrow"), ngBC0("square-toggle-theme-off-narrow"), + nBC1("square-toggle-black-on-narrow"), ngBC1("square-toggle-black-off-narrow"), + nBC2("square-toggle-white-on-narrow"), ngBC2("square-toggle-white-off-narrow"), + nBC3("square-toggle-gray-on-narrow"), ngBC3("square-toggle-gray-off-narrow") { - - iR = new RTImage ("square-toggle-red-on-narrow.png"); - iG = new RTImage ("square-toggle-green-on-narrow.png"); - iB = new RTImage ("square-toggle-blue-on-narrow.png"); - iL = new RTImage ("square-toggle-luminosity-on-narrow.png"); - iBC0 = new RTImage ("square-toggle-theme-on-narrow.png"); - iBC1 = new RTImage ("square-toggle-black-on-narrow.png"); - iBC2 = new RTImage ("square-toggle-white-on-narrow.png"); - iBC3 = new RTImage ("square-toggle-gray-on-narrow.png"); - - igR = new RTImage ("square-toggle-red-off-narrow.png"); - igG = new RTImage ("square-toggle-green-off-narrow.png"); - igB = new RTImage ("square-toggle-blue-off-narrow.png"); - igL = new RTImage ("square-toggle-luminosity-off-narrow.png"); - igBC0 = new RTImage ("square-toggle-theme-off-narrow.png"); - igBC1 = new RTImage ("square-toggle-black-off-narrow.png"); - igBC2 = new RTImage ("square-toggle-white-off-narrow.png"); - igBC3 = new RTImage ("square-toggle-gray-off-narrow.png"); - backColor0 = Gtk::manage (new Gtk::ToggleButton ()); backColor0->get_style_context()->add_class("narrowbutton"); backColor0->set_relief(Gtk::RELIEF_NONE); backColor0->set_tooltip_markup (M("MAIN_TOOLTIP_BACKCOLOR0")); - backColor0->set_image(options.bgcolor == 0 ? *iBC0 : *igBC0); + backColor0->set_image_from_icon_name(options.bgcolor == 0 ? nBC0 : ngBC0, Gtk::ICON_SIZE_LARGE_TOOLBAR); backColor1 = Gtk::manage (new Gtk::ToggleButton ()); backColor1->get_style_context()->add_class("narrowbutton"); backColor1->set_relief(Gtk::RELIEF_NONE); backColor1->set_tooltip_markup (M("MAIN_TOOLTIP_BACKCOLOR1")); - backColor1->set_image(options.bgcolor == 1 ? *iBC1 : *igBC1); - - backColor3 = Gtk::manage (new Gtk::ToggleButton ()); - backColor3->get_style_context()->add_class("narrowbutton"); - backColor3->set_relief(Gtk::RELIEF_NONE); - backColor3->set_tooltip_markup (M("MAIN_TOOLTIP_BACKCOLOR3")); - backColor3->set_image(options.bgcolor == 3 ? *iBC3 : *igBC3); + backColor1->set_image_from_icon_name(options.bgcolor == 1 ? nBC1 : ngBC1, Gtk::ICON_SIZE_LARGE_TOOLBAR); backColor2 = Gtk::manage (new Gtk::ToggleButton ()); backColor2->get_style_context()->add_class("narrowbutton"); backColor2->set_relief(Gtk::RELIEF_NONE); backColor2->set_tooltip_markup (M("MAIN_TOOLTIP_BACKCOLOR2")); - backColor2->set_image(options.bgcolor == 2 ? *iBC2 : *igBC2); + backColor2->set_image_from_icon_name(options.bgcolor == 2 ? nBC2 : ngBC2, Gtk::ICON_SIZE_LARGE_TOOLBAR); + + backColor3 = Gtk::manage (new Gtk::ToggleButton ()); + backColor3->get_style_context()->add_class("narrowbutton"); + backColor3->set_relief(Gtk::RELIEF_NONE); + backColor3->set_tooltip_markup (M("MAIN_TOOLTIP_BACKCOLOR3")); + backColor3->set_image_from_icon_name(options.bgcolor == 3 ? nBC3 : ngBC3, Gtk::ICON_SIZE_LARGE_TOOLBAR); previewR = Gtk::manage (new Gtk::ToggleButton ()); previewR->get_style_context()->add_class("narrowbutton"); previewR->set_relief(Gtk::RELIEF_NONE); previewR->set_tooltip_markup (M("MAIN_TOOLTIP_PREVIEWR")); - previewR->set_image(*igR); + previewR->set_image_from_icon_name(ngR, Gtk::ICON_SIZE_LARGE_TOOLBAR); previewG = Gtk::manage (new Gtk::ToggleButton ()); previewG->get_style_context()->add_class("narrowbutton"); previewG->set_relief(Gtk::RELIEF_NONE); previewG->set_tooltip_markup (M("MAIN_TOOLTIP_PREVIEWG")); - previewG->set_image(*igG); + previewG->set_image_from_icon_name(ngG, Gtk::ICON_SIZE_LARGE_TOOLBAR); previewB = Gtk::manage (new Gtk::ToggleButton ()); previewB->get_style_context()->add_class("narrowbutton"); previewB->set_relief(Gtk::RELIEF_NONE); previewB->set_tooltip_markup (M("MAIN_TOOLTIP_PREVIEWB")); - previewB->set_image(*igB); + previewB->set_image_from_icon_name(ngB, Gtk::ICON_SIZE_LARGE_TOOLBAR); previewL = Gtk::manage (new Gtk::ToggleButton ()); previewL->get_style_context()->add_class("narrowbutton"); previewL->set_relief(Gtk::RELIEF_NONE); previewL->set_tooltip_markup (M("MAIN_TOOLTIP_PREVIEWL")); - previewL->set_image(*igL); + previewL->set_image_from_icon_name(ngL, Gtk::ICON_SIZE_LARGE_TOOLBAR); previewR->set_active (false); previewG->set_active (false); @@ -125,25 +116,8 @@ PreviewModePanel::PreviewModePanel (ImageArea* ia) : imageArea(ia) //show_all (); } -PreviewModePanel::~PreviewModePanel () -{ - delete iR; - delete iG; - delete iB; - delete iL; - delete iBC0; - delete iBC1; - delete iBC2; - delete iBC3; - delete igR; - delete igG; - delete igB; - delete igL; - delete igBC0; - delete igBC1; - delete igBC2; - delete igBC3; -} +PreviewModePanel::~PreviewModePanel () {} + //toggle Functions below are for shortcuts void PreviewModePanel::toggleR () { @@ -181,35 +155,50 @@ void PreviewModePanel::togglebackColor3 () void PreviewModePanel::buttonToggled (Gtk::ToggleButton* tbpreview) { - connR.block(true); connG.block(true); connB.block(true); connL.block(true); - // control state of the buttons - // only 0 or 1 button at a time can remain pressed - if (tbpreview != previewR) { + // Control state of the others buttons: only 0 or 1 button at a time can remain pressed + // Note: Only refresh previously toggled button + if (previewR->get_active() && tbpreview != previewR) { previewR->set_active(false); + previewR->set_image_from_icon_name(ngR, Gtk::ICON_SIZE_LARGE_TOOLBAR); } - if (tbpreview != previewG) { + if (previewG->get_active() && tbpreview != previewG) { previewG->set_active(false); + previewG->set_image_from_icon_name(ngG, Gtk::ICON_SIZE_LARGE_TOOLBAR); } - if (tbpreview != previewB) { + if (previewB->get_active() && tbpreview != previewB) { previewB->set_active(false); + previewB->set_image_from_icon_name(ngB, Gtk::ICON_SIZE_LARGE_TOOLBAR); } - if (tbpreview != previewL) { + if (previewL->get_active() && tbpreview != previewL) { previewL->set_active(false); + previewL->set_image_from_icon_name(ngL, Gtk::ICON_SIZE_LARGE_TOOLBAR); } - // set image based on button's state - previewR->set_image(previewR->get_active() ? *iR : *igR); - previewG->set_image(previewG->get_active() ? *iG : *igG); - previewB->set_image(previewB->get_active() ? *iB : *igB); - previewL->set_image(previewL->get_active() ? *iL : *igL); + // Change image on activated button + // Note: Only refresh toggled button + if (tbpreview == previewR) { + previewR->set_image_from_icon_name(previewR->get_active() ? nR : ngR, Gtk::ICON_SIZE_LARGE_TOOLBAR); + } + + if (tbpreview == previewG) { + previewG->set_image_from_icon_name(previewG->get_active() ? nG : ngG, Gtk::ICON_SIZE_LARGE_TOOLBAR); + } + + if (tbpreview == previewB) { + previewB->set_image_from_icon_name(previewB->get_active() ? nB : ngB, Gtk::ICON_SIZE_LARGE_TOOLBAR); + } + + if (tbpreview == previewL) { + previewL->set_image_from_icon_name(previewL->get_active() ? nL : ngL, Gtk::ICON_SIZE_LARGE_TOOLBAR); + } connR.block(false); connG.block(false); @@ -265,51 +254,66 @@ void PreviewModePanel::togglebackColor() void PreviewModePanel::buttonToggled_backColor (Gtk::ToggleButton* tbbackColor) { - connbackColor0.block(true); connbackColor1.block(true); connbackColor2.block(true); connbackColor3.block(true); - // control the state of the buttons - // Exactly 1 button at a time must remain pressed - if (tbbackColor == backColor0 && !backColor0->get_active()) { - backColor0->set_active(true); - } - - if (tbbackColor == backColor1 && !backColor1->get_active()) { - backColor1->set_active(true); - } - - if (tbbackColor == backColor2 && !backColor2->get_active()) { - backColor2->set_active(true); - } - - if (tbbackColor == backColor3 && !backColor3->get_active()) { - backColor3->set_active(true); - } - - if (tbbackColor != backColor0) { + // Control state of the others buttons: only 1 button at a time shall remain pressed + // Note: Only refresh previously toggled button + if (backColor0->get_active() && tbbackColor != backColor0) { backColor0->set_active(false); + backColor0->set_image_from_icon_name(ngBC0, Gtk::ICON_SIZE_LARGE_TOOLBAR); } - if (tbbackColor != backColor1) { + if (backColor1->get_active() && tbbackColor != backColor1) { backColor1->set_active(false); + backColor1->set_image_from_icon_name(ngBC1, Gtk::ICON_SIZE_LARGE_TOOLBAR); } - if (tbbackColor != backColor2) { + if (backColor2->get_active() && tbbackColor != backColor2) { backColor2->set_active(false); + backColor2->set_image_from_icon_name(ngBC2, Gtk::ICON_SIZE_LARGE_TOOLBAR); } - if (tbbackColor != backColor3) { + if (backColor3->get_active() && tbbackColor != backColor3) { backColor3->set_active(false); + backColor3->set_image_from_icon_name(ngBC3, Gtk::ICON_SIZE_LARGE_TOOLBAR); } - // set image based on button's state - backColor0->set_image(backColor0->get_active() ? *iBC0 : *igBC0); - backColor1->set_image(backColor1->get_active() ? *iBC1 : *igBC1); - backColor2->set_image(backColor2->get_active() ? *iBC2 : *igBC2); - backColor3->set_image(backColor3->get_active() ? *iBC3 : *igBC3); + // Change image on toggled button + // Note: Only refresh toggled button if newly active (otherwise keep it active) + if (tbbackColor == backColor0) { + if (backColor0->get_active()) { + backColor0->set_image_from_icon_name(nBC0, Gtk::ICON_SIZE_LARGE_TOOLBAR); + } else { + backColor0->set_active(true); + } + } + + if (tbbackColor == backColor1) { + if (backColor1->get_active()) { + backColor1->set_image_from_icon_name(nBC1, Gtk::ICON_SIZE_LARGE_TOOLBAR); + } else { + backColor1->set_active(true); + } + } + + if (tbbackColor == backColor2) { + if (backColor2->get_active()) { + backColor2->set_image_from_icon_name(nBC2, Gtk::ICON_SIZE_LARGE_TOOLBAR); + } else { + backColor2->set_active(true); + } + } + + if (tbbackColor == backColor3) { + if (backColor3->get_active()) { + backColor3->set_image_from_icon_name(nBC3, Gtk::ICON_SIZE_LARGE_TOOLBAR); + } else { + backColor3->set_active(true); + } + } connbackColor0.block(false); connbackColor1.block(false); diff --git a/rtgui/previewmodepanel.h b/rtgui/previewmodepanel.h index d475fd4a4..6e869471d 100644 --- a/rtgui/previewmodepanel.h +++ b/rtgui/previewmodepanel.h @@ -36,14 +36,14 @@ protected: Gtk::ToggleButton* backColor3; ImageArea* imageArea; - Gtk::Image* iR, *igR; - Gtk::Image* iG, *igG; - Gtk::Image* iB, *igB; - Gtk::Image* iL, *igL; - Gtk::Image* iBC0, *igBC0; - Gtk::Image* iBC1, *igBC1; - Gtk::Image* iBC2, *igBC2; - Gtk::Image* iBC3, *igBC3; + const Glib::ustring nR, ngR; + const Glib::ustring nG, ngG; + const Glib::ustring nB, ngB; + const Glib::ustring nL, ngL; + const Glib::ustring nBC0, ngBC0; + const Glib::ustring nBC1, ngBC1; + const Glib::ustring nBC2, ngBC2; + const Glib::ustring nBC3, ngBC3; public: explicit PreviewModePanel (ImageArea* ia); diff --git a/rtgui/previewwindow.cc b/rtgui/previewwindow.cc index 90d0a7b4b..cc239ed26 100644 --- a/rtgui/previewwindow.cc +++ b/rtgui/previewwindow.cc @@ -156,7 +156,7 @@ bool PreviewWindow::on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) int x, y, w, h; getObservedFrameArea (x, y, w, h); if (x>imgX || y>imgY || w < imgW || h < imgH) { - double s = RTScalable::getScale(); + const double s = RTScalable::scalePixelSize(1.); double rectX = x + 0.5; double rectY = y + 0.5; double rectW = std::min(w, (int)(imgW - (x - imgX) - 1)); @@ -307,14 +307,14 @@ Gtk::SizeRequestMode PreviewWindow::get_request_mode_vfunc () const void PreviewWindow::get_preferred_height_vfunc (int &minimum_height, int &natural_height) const { - minimum_height= 50 * RTScalable::getScale(); - natural_height = 100 * RTScalable::getScale(); + minimum_height= RTScalable::scalePixelSize(50); + natural_height = RTScalable::scalePixelSize(100); } void PreviewWindow::get_preferred_width_vfunc (int &minimum_width, int &natural_width) const { - minimum_width = 80 * RTScalable::getScale(); - natural_width = 120 * RTScalable::getScale(); + minimum_width = RTScalable::scalePixelSize(80); + natural_width = RTScalable::scalePixelSize(120); } void PreviewWindow::get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const diff --git a/rtgui/profilepanel.cc b/rtgui/profilepanel.cc index 1acf23649..7c3948f42 100644 --- a/rtgui/profilepanel.cc +++ b/rtgui/profilepanel.cc @@ -45,16 +45,16 @@ void ProfilePanel::cleanup () delete partialProfileDlg; } -ProfilePanel::ProfilePanel () : storedPProfile(nullptr), lastSavedPSE(nullptr), customPSE(nullptr) +ProfilePanel::ProfilePanel () : storedPProfile(nullptr), + modeOn("profile-filled"), modeOff("profile-partial"), + profileFillImage(Gtk::manage(new RTImage(options.filledProfile ? modeOn : modeOff, Gtk::ICON_SIZE_LARGE_TOOLBAR))), + lastSavedPSE(nullptr), customPSE(nullptr) { - tpc = nullptr; - profileFillModeOnImage = new RTImage("profile-filled.png"); - profileFillModeOffImage = new RTImage("profile-partial.png"); fillMode = Gtk::manage (new Gtk::ToggleButton()); fillMode->set_active(options.filledProfile); - fillMode->add( options.filledProfile ? *profileFillModeOnImage : *profileFillModeOffImage ); + fillMode->add(*profileFillImage); fillMode->signal_toggled().connect ( sigc::mem_fun(*this, &ProfilePanel::profileFillModeToggled) ); fillMode->set_tooltip_text(M("PROFILEPANEL_MODE_TOOLTIP")); //GTK318 @@ -69,20 +69,20 @@ ProfilePanel::ProfilePanel () : storedPProfile(nullptr), lastSavedPSE(nullptr), setExpandAlignProperties(profiles, true, true, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); load = Gtk::manage (new Gtk::Button ()); - load->add (*Gtk::manage (new RTImage ("folder-open.png"))); + load->add (*Gtk::manage (new RTImage ("folder-open", Gtk::ICON_SIZE_LARGE_TOOLBAR))); load->get_style_context()->add_class("Left"); load->set_margin_left(2); setExpandAlignProperties(load, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); save = Gtk::manage (new Gtk::Button ()); - save->add (*Gtk::manage (new RTImage ("save.png"))); + save->add (*Gtk::manage (new RTImage ("save", Gtk::ICON_SIZE_LARGE_TOOLBAR))); save->get_style_context()->add_class("MiddleH"); setExpandAlignProperties(save, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); copy = Gtk::manage (new Gtk::Button ()); - copy->add (*Gtk::manage (new RTImage ("copy.png"))); + copy->add (*Gtk::manage (new RTImage ("copy", Gtk::ICON_SIZE_LARGE_TOOLBAR))); copy->get_style_context()->add_class("MiddleH"); setExpandAlignProperties(copy, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); paste = Gtk::manage (new Gtk::Button ()); - paste->add (*Gtk::manage (new RTImage ("paste.png"))); + paste->add (*Gtk::manage (new RTImage ("paste", Gtk::ICON_SIZE_LARGE_TOOLBAR))); paste->get_style_context()->add_class("Right"); setExpandAlignProperties(paste, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); @@ -132,8 +132,6 @@ ProfilePanel::~ProfilePanel () delete lastsaved; } - delete profileFillModeOnImage; - delete profileFillModeOffImage; delete lastSavedPSE; delete customPSE; } @@ -913,10 +911,10 @@ void ProfilePanel::profileFillModeToggled() { if (fillMode->get_active()) { // The button is pressed, we'll use the profileFillModeOnImage - fillMode->set_image(*profileFillModeOnImage); + profileFillImage->set_from_icon_name(modeOn); } else { // The button is released, we'll use the profileFillModeOffImage - fillMode->set_image(*profileFillModeOffImage); + profileFillImage->set_from_icon_name(modeOff); } } diff --git a/rtgui/profilepanel.h b/rtgui/profilepanel.h index c3a125c49..e1d1f4067 100644 --- a/rtgui/profilepanel.h +++ b/rtgui/profilepanel.h @@ -62,8 +62,8 @@ private: Glib::ustring storedValue; Glib::ustring lastFilename; Glib::ustring imagePath; - RTImage *profileFillModeOnImage; - RTImage *profileFillModeOffImage; + const Glib::ustring modeOn, modeOff; + RTImage* const profileFillImage; Gtk::ToggleButton* fillMode; Gtk::TreeIter currRow; ProfileStoreEntry *lastSavedPSE; diff --git a/rtgui/rawcacorrection.cc b/rtgui/rawcacorrection.cc index 473ca2ed3..3bcd3d03a 100644 --- a/rtgui/rawcacorrection.cc +++ b/rtgui/rawcacorrection.cc @@ -37,10 +37,10 @@ RAWCACorr::RAWCACorr () : FoldableToolPanel(this, TOOL_NAME, M("TP_RAWCACORR_LAB EvPreProcessCAColourshift = m->newEvent(DARKFRAME, "HISTORY_MSG_RAWCACORR_COLORSHIFT"); EvPreProcessCAColourshiftHistory = m->newEvent(M_VOID, "HISTORY_MSG_RAWCACORR_COLORSHIFT"); - Gtk::Image* icaredL = Gtk::manage (new RTImage ("circle-red-cyan-small.png")); - Gtk::Image* icaredR = Gtk::manage (new RTImage ("circle-cyan-red-small.png")); - Gtk::Image* icablueL = Gtk::manage (new RTImage ("circle-blue-yellow-small.png")); - Gtk::Image* icablueR = Gtk::manage (new RTImage ("circle-yellow-blue-small.png")); + Gtk::Image* const icaredL = Gtk::manage (new RTImage ("circle-red-cyan-small")); + Gtk::Image* const icaredR = Gtk::manage (new RTImage ("circle-cyan-red-small")); + Gtk::Image* const icablueL = Gtk::manage (new RTImage ("circle-blue-yellow-small")); + Gtk::Image* const icablueR = Gtk::manage (new RTImage ("circle-yellow-blue-small")); caAutocorrect = Gtk::manage (new CheckBox(M("TP_RAWCACORR_AUTO"), multiImage)); caAutocorrect->setCheckBoxListener (this); diff --git a/rtgui/retinex.cc b/rtgui/retinex.cc index a1a0ebf7c..11bcc74fb 100644 --- a/rtgui/retinex.cc +++ b/rtgui/retinex.cc @@ -493,7 +493,7 @@ Retinex::Retinex () : FoldableToolPanel (this, TOOL_NAME, M ("TP_RETINEX_LABEL") neutral = Gtk::manage (new Gtk::Button (M ("TP_RETINEX_NEUTRAL"))); setExpandAlignProperties (neutral, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); - RTImage *resetImg = Gtk::manage (new RTImage ("undo-small.png", "redo-small.png")); + RTImage *resetImg = Gtk::manage (new RTImage ("undo-small", Gtk::ICON_SIZE_BUTTON)); setExpandAlignProperties (resetImg, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); neutral->set_image (*resetImg); neutral->set_tooltip_text (M ("TP_RETINEX_NEUTRAL_TOOLTIP")); @@ -941,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); @@ -953,7 +953,7 @@ void Retinex::read (const ProcParams* pp, const ParamsEdited* pedited) complexmethodconn.block (false); enableListener (); - + if (complexmethod->get_active_row_number() == 0) { updateGUIToMode(0); // convertParamToNormal(); @@ -961,7 +961,7 @@ void Retinex::read (const ProcParams* pp, const ParamsEdited* pedited) } else { updateGUIToMode(1); } - + } diff --git a/rtgui/rotate.cc b/rtgui/rotate.cc index 944c54e6d..81dd9267c 100644 --- a/rtgui/rotate.cc +++ b/rtgui/rotate.cc @@ -37,15 +37,15 @@ Rotate::Rotate () : FoldableToolPanel(this, TOOL_NAME, M("TP_ROTATE_LABEL")) rlistener = nullptr; //TODO the action of the rotation slider is counter-intuitive - Gtk::Image* irotateL = Gtk::manage (new RTImage ("rotate-right-small.png")); - Gtk::Image* irotateR = Gtk::manage (new RTImage ("rotate-left-small.png")); + Gtk::Image* irotateL = Gtk::manage (new RTImage ("rotate-right-small")); + Gtk::Image* irotateR = Gtk::manage (new RTImage ("rotate-left-small")); degree = Gtk::manage (new Adjuster (M("TP_ROTATE_DEGREE"), -45, 45, 0.01, 0, irotateL, irotateR)); degree->setAdjusterListener (this); pack_start (*degree); selectStraight = Gtk::manage (new Gtk::Button (M("TP_ROTATE_SELECTLINE"))); - selectStraight->set_image (*Gtk::manage (new RTImage ("rotate-straighten-small.png"))); + selectStraight->set_image (*Gtk::manage (new RTImage ("rotate-straighten-small"))); selectStraight->get_style_context()->add_class("independent"); pack_start (*selectStraight, Gtk::PACK_SHRINK, 2); diff --git a/rtgui/rtimage.cc b/rtgui/rtimage.cc index 98e61b897..bcfa9ad55 100644 --- a/rtgui/rtimage.cc +++ b/rtgui/rtimage.cc @@ -3,6 +3,7 @@ * * Copyright (c) 2004-2010 Gabor Horvath * Copyright (c) 2018 Jean-Christophe FRISCH + * Copyright (c) 2022 Pierre CABRERA * * 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,214 +21,116 @@ #include "rtimage.h" -#include -#include -#include -#include +#include "rtsurface.h" -#include "../rtengine/settings.h" +std::map, std::shared_ptr> RTImageCache::cache; -namespace +std::shared_ptr RTImageCache::getCachedSurface(const Glib::ustring &icon_name, const Gtk::IconSize icon_size) { + // Look for an existing cached icon + const auto key = std::pair(icon_name, icon_size); + const auto item = cache.find(key); -struct GIconKey { - Glib::RefPtr icon; - /** - * Icon size in pixels. - */ - int icon_size; + if (item != cache.end()) { // A cached icon exists + return item->second; + } else { // Create the icon + auto surface = std::shared_ptr(new RTSurface(icon_name, icon_size)); - GIconKey() {} - GIconKey(const Glib::RefPtr &icon, int icon_size): icon(icon), icon_size(icon_size) {} + // Add the surface to the cache if the icon exist + if (surface) { + cache.insert({key, surface}); + } - 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; + return surface; } -}; - -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; - } -double RTImage::dpiBack = 0.; -int RTImage::scaleBack = 0; +void RTImageCache::updateCache() +{ + // Iterate over cache to updated RTSurface + for (auto const& item : cache) { + item.second->updateSurface(); + } +} RTImage::RTImage () {} -RTImage::RTImage (RTImage &other) : surface(other.surface), pixbuf(other.pixbuf) +RTImage::RTImage (const Glib::ustring& iconName, const Gtk::IconSize iconSize) : + Gtk::Image(), + size(iconSize), + icon_name(iconName), + g_icon(Glib::RefPtr()) { - if (pixbuf) { - set(pixbuf); - } else if (surface) { - set(surface); - } else if (other.gIcon) { - changeImage(other.gIcon, other.gIconSize); - } -} + // Set surface from icon cache + surface = RTImageCache::getCachedSurface(this->icon_name, this->size); -RTImage::RTImage (const Glib::ustring& fileName, const Glib::ustring& rtlFileName) : Gtk::Image() -{ - setImage (fileName, rtlFileName); -} - -RTImage::RTImage (Glib::RefPtr &pbuf) -{ + // Add it to the RTImage if surface exists if (surface) { - surface.clear(); - } - if (pbuf) { - set(pbuf); - this->pixbuf = pbuf; + set(surface->get()); } } -RTImage::RTImage (Cairo::RefPtr &surf) +RTImage::RTImage (const Glib::RefPtr& gIcon, const Gtk::IconSize iconSize) : + Gtk::Image(), + size(iconSize), + icon_name(""), + g_icon(gIcon) { - if (pixbuf) { - pixbuf.clear(); + // Configure RTImage based on g_icon + set(this->g_icon, this->size); +} + +void RTImage::set_from_icon_name(const Glib::ustring& iconName) +{ + set_from_icon_name(iconName, this->size); +} + +void RTImage::set_from_icon_name(const Glib::ustring& iconName, const Gtk::IconSize iconSize) +{ + this->icon_name = iconName; + this->size = iconSize; + + // Set surface from icon cache + surface = RTImageCache::getCachedSurface(this->icon_name, this->size); + + // Add it to the RTImage if previously chosen + if (surface) { + set(surface->get()); } - if (surf) { - set(surf); - surface = surf; + + // Unset Gio::Icon if previously chosen + if (this->g_icon) { + g_icon = Glib::RefPtr(); } } -RTImage::RTImage (Glib::RefPtr &other) +void RTImage::set_from_gicon(const Glib::RefPtr& gIcon) { - if (other) { - if (other->get_surface()) { - surface = other->get_surface(); - set(surface); - } else if (other->pixbuf) { - pixbuf = other->get_pixbuf(); - set(pixbuf); - } else if (other->gIcon) { - changeImage(other->gIcon, other->gIconSize); - } + set_from_gicon(gIcon, this->size); +} + +void RTImage::set_from_gicon(const Glib::RefPtr& gIcon, const Gtk::IconSize iconSize) +{ + this->g_icon = gIcon; + this->size = iconSize; + + // Set image from Gio::Icon + set(this->g_icon, this->size); + + // Unset surface if previously chosen + this->icon_name = ""; + + if (surface) { + surface = std::shared_ptr(); } } -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; - - if (!rtlFileName.empty() && getDirection() == Gtk::TEXT_DIR_RTL) { - imageName = rtlFileName; - } else { - imageName = fileName; - } - - changeImage (imageName); -} - -/* - * On windows, if scale = 2, the dpi is non significant, i.e. should be considered = 192 - */ -void RTImage::setDPInScale (const double newDPI, const int newScale) -{ - if (scaleBack != newScale || (scaleBack == 1 && dpiBack != newDPI)) { - RTScalable::setDPInScale(newDPI, newScale); - dpiBack = getDPI(); - scaleBack = getScale(); - updateImages(); - } -} - -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; - } - - if (pixbuf) { - auto iterator = pixbufCache.find (imageName); - assert(iterator != pixbufCache.end ()); - pixbuf = iterator->second; - set(iterator->second); - } else { // if no Pixbuf is set, we update or create a Cairo::ImageSurface - auto iterator = surfaceCache.find (imageName); - if (iterator == surfaceCache.end ()) { - auto surf = createImgSurfFromFile(imageName); - iterator = surfaceCache.emplace (imageName, surf).first; - } - surface = iterator->second; - set(iterator->second); - } -} - -Cairo::RefPtr RTImage::get_surface() -{ - return surface; -} - int RTImage::get_width() { if (surface) { - return surface->get_width(); - } - if (pixbuf) { - return pixbuf->get_width(); - } - - if (gIcon) { - return this->get_pixbuf()->get_width(); + return surface->getWidth(); + } else if (g_icon) { + Gtk::Image::get_width(); } return -1; @@ -236,94 +139,10 @@ int RTImage::get_width() int RTImage::get_height() { if (surface) { - return surface->get_height(); - } - if (pixbuf) { - return pixbuf->get_height(); - } - - if (gIcon) { - return this->get_pixbuf()->get_height(); + return surface->getHeight(); + } else if (g_icon) { + Gtk::Image::get_height(); } return -1; } - -void RTImage::init() -{ - dpiBack = RTScalable::getDPI(); - scaleBack = RTScalable::getScale(); -} - -void RTImage::cleanup(bool all) -{ - for (auto& entry : pixbufCache) { - entry.second.reset(); - } - for (auto& entry : surfaceCache) { - entry.second.clear(); - } - - for (auto& entry : gIconPixbufCache) { - entry.second.reset(); - } - - RTScalable::cleanup(all); -} - -void RTImage::updateImages() -{ - for (auto& entry : pixbufCache) { - entry.second = createPixbufFromFile(entry.first); - } - 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) -{ - Cairo::RefPtr imgSurf = createImgSurfFromFile(fileName); - 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; - - try { - surf = loadImage(fileName, getTweakedDPI()); - - // HOMBRE: As of now, GDK_SCALE is forced to 1, so setting the Cairo::ImageSurface scale is not required - /* - double x=0., y=0.; - cairo_surface_get_device_scale(surf->cobj(), &x, &y); - if (getScale() == 2) { - cairo_surface_set_device_scale(surf->cobj(), 0.5, 0.5); - cairo_surface_get_device_scale(surf->cobj(), &x, &y); - surf->flush(); - } - */ - } catch (const Glib::Exception& exception) { - if (rtengine::settings->verbose) { - std::cerr << "Failed to load image \"" << fileName << "\": " << exception.what() << std::endl; - } - } - - return surf; -} diff --git a/rtgui/rtimage.h b/rtgui/rtimage.h index 183a83a94..3fe67eb8d 100644 --- a/rtgui/rtimage.h +++ b/rtgui/rtimage.h @@ -3,6 +3,7 @@ * * Copyright (c) 2004-2010 Gabor Horvath * Copyright (c) 2018 Jean-Christophe FRISCH + * Copyright (c) 2022 Pierre CABRERA * * RawTherapee is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,53 +20,40 @@ */ #pragma once -#include -#include "rtscalable.h" +#include + +class RTSurface; +class RTImageCache final +{ +private: + static std::map, std::shared_ptr> cache; + +public: + static std::shared_ptr getCachedSurface(const Glib::ustring &icon_name, const Gtk::IconSize icon_size); + static void updateCache(); +}; /** * @brief A derived class of Gtk::Image in order to handle theme-related icon sets. */ -class RTImage final : public Gtk::Image, public RTScalable +class RTImage final : public Gtk::Image { - static double dpiBack; // used to keep track of master dpi change - static int scaleBack; // used to keep track of master scale change - //bool on_configure_event(GdkEventConfigure* configure_event); - -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; +private: + Gtk::IconSize size; + Glib::ustring icon_name; + std::shared_ptr surface; + Glib::RefPtr g_icon; public: RTImage (); - RTImage (RTImage &other); - explicit RTImage (Glib::RefPtr &pixbuf); - 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()); + explicit RTImage (const Glib::ustring& iconName, const Gtk::IconSize iconSize = Gtk::ICON_SIZE_SMALL_TOOLBAR); + explicit RTImage (const Glib::RefPtr& gIcon, const Gtk::IconSize iconSize = Gtk::ICON_SIZE_SMALL_TOOLBAR); + + void set_from_icon_name(const Glib::ustring& iconName); + void set_from_icon_name(const Glib::ustring& iconName, const Gtk::IconSize iconSize); + void set_from_gicon(const Glib::RefPtr& gIcon); + void set_from_gicon(const Glib::RefPtr& gIcon, const Gtk::IconSize iconSize); - 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(); int get_height(); - - - static void init(); - static void cleanup(bool all = false); - static void updateImages (); - static void setDPInScale (const double newDPI, const int newScale); - 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 78202326a..58b67ed52 100644 --- a/rtgui/rtscalable.cc +++ b/rtgui/rtscalable.cc @@ -2,6 +2,7 @@ * This file is part of RawTherapee. * * Copyright (c) 2018 Jean-Christophe FRISCH + * Copyright (c) 2022 Pierre CABRERA * * RawTherapee is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,47 +19,235 @@ */ #include "rtscalable.h" -#include -#include -#include + #include #include -#include "../rtengine/rt_math.h" -#include "options.h" - -double RTScalable::dpi = 0.; -int RTScalable::scale = 0; +#include "../rtengine/settings.h" +#include "guiutils.h" extern Glib::ustring argv0; -extern unsigned char initialGdkScale; -extern float fontScale; -Gtk::TextDirection RTScalable::direction = Gtk::TextDirection::TEXT_DIR_NONE; + +// Default static parameter values +double RTScalable::dpi = 96.; +int RTScalable::scale = 1; + +void RTScalable::getDPInScale(const Gtk::Window* window, double &newDPI, int &newScale) +{ + if (window) { + const auto screen = window->get_screen(); + newDPI = screen->get_resolution(); // Get DPI retrieved from the OS + + if (window->get_scale_factor() > 0) { + // Get scale factor associated to the window + newScale = window->get_scale_factor(); + } else { + newScale = 1; // Default minimum value of 1 as scale is used to scale surface + } + } +} + +Cairo::RefPtr RTScalable::loadSurfaceFromIcon(const Glib::ustring &iconName, const Gtk::IconSize iconSize) +{ + GThreadLock lock; // All icon theme access or image access on separate thread HAVE to be protected + + Cairo::RefPtr surf; // Create Cairo::RefPtr nullptr + + // Get icon theme + const auto theme = Gtk::IconTheme::get_default(); + + // Get pixel size from Gtk::IconSize + int wSize, hSize; + + if (!Gtk::IconSize::lookup(iconSize, wSize, hSize)) { // Size in invalid + wSize = hSize = 16; // Set to a default size of 16px (i.e. Gtk::ICON_SIZE_SMALL_TOOLBAR one) + } + + // Get scale based on DPI and scale + // Note: hSize not used because icon are considered squared + const int size = wSize; + + // Looking for corresponding icon (if existing) + const auto iconInfo = theme->lookup_icon(iconName, size); + + if (!iconInfo) { + std::cerr << "Failed to load icon \"" << iconName << "\" for size " << size << "px" << std::endl; + + return surf; + } + + const auto iconPath = iconInfo.get_filename(); + + if (iconPath.empty()) { + std::cerr << "Failed to load icon \"" << iconName << "\" for size " << size << "px" << std::endl; + + return surf; + } + + // Create surface from corresponding icon + const auto pos = iconPath.find_last_of('.'); + + if (pos >= 0 && pos < iconPath.length()) { + const auto fext = iconPath.substr(pos + 1, iconPath.length()).lowercase(); + + // Case where iconPath is a PNG file + if (fext == "png") { + // Create surface from PNG file + surf = RTScalable::loadSurfaceFromPNG(iconPath, true); + } + + // Case where iconPath is a SVG file + if (fext == "svg") { + // Create surface from SVG file + surf = RTScalable::loadSurfaceFromSVG(iconPath, size, size, true); + } + } + + return surf; +} + +Cairo::RefPtr RTScalable::loadSurfaceFromPNG(const Glib::ustring &fname, const bool is_path) +{ + GThreadLock lock; // All icon theme access or image access on separate thread HAVE to be protected + + Cairo::RefPtr surf; // Create Cairo::RefPtr nullptr + + Glib::ustring path; + + if (is_path) { + // Directly use fname as a path + path = fname; + } else { + // Look for PNG file in "images" folder + Glib::ustring imagesFolder = Glib::build_filename(argv0, "images"); + path = Glib::build_filename(imagesFolder, fname); + } + + // Create surface from PNG file if file exist + if (Glib::file_test(path.c_str(), Glib::FILE_TEST_EXISTS)) { + surf = Cairo::ImageSurface::create_from_png(path); + } else { + std::cerr << "Failed to load PNG file \"" << fname << "\"" << std::endl; + } + + return surf; +} + +Cairo::RefPtr RTScalable::loadSurfaceFromSVG(const Glib::ustring &fname, const int width, const int height, const bool is_path) +{ + GThreadLock lock; // All icon theme access or image access on separate thread HAVE to be protected + + Cairo::RefPtr surf; // Create Cairo::RefPtr nullptr + + Glib::ustring path; + + if (is_path) { + // Directly use fname as a path + path = fname; + } else { + // Look for SVG file in "images" folder + Glib::ustring imagesFolder = Glib::build_filename(argv0, "images"); + path = Glib::build_filename(imagesFolder, fname); + } + + // Create surface from SVG file if file exist + if (Glib::file_test(path.c_str(), Glib::FILE_TEST_EXISTS)) { + // Read content of SVG file + std::string svgFile; + try { + svgFile = Glib::file_get_contents(path); + } + catch (Glib::FileError &err) { + std::cerr << "Failed to load SVG file \"" << fname << "\": " << err.what() << std::endl; + return surf; + } + + // Create surface with librsvg library + GError* error = nullptr; + RsvgHandle* handle = rsvg_handle_new_from_data((unsigned const char*)svgFile.c_str(), svgFile.length(), &error); + + if (error) { + std::cerr << "Failed to load SVG file \"" << fname << "\": " << std::endl + << Glib::ustring(error->message) << std::endl; + free(error); + return surf; + } + + int w, h; + + if (width == -1 || height == -1) { + // Use SVG image natural width and height + double _w, _h; + const bool has_dim = rsvg_handle_get_intrinsic_size_in_pixels(handle, &_w, &_h); // Get SVG image dimensions + if (has_dim) { + w = std::ceil(_w); + h = std::ceil(_h); + } else { + w = h = 16; // Set to a default size of 16px (i.e. Gtk::ICON_SIZE_SMALL_TOOLBAR one) + } + } else { + // Use given width and height + w = width; + h = height; + } + + // Create an upscaled surface to avoid blur effect + surf = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, + w * RTScalable::getScale(), + h * RTScalable::getScale()); + + // Render (and erase with) default surface background + Cairo::RefPtr c = Cairo::Context::create(surf); + c->set_source_rgba (0., 0., 0., 0.); + c->set_operator (Cairo::OPERATOR_CLEAR); + c->paint(); + + // Render upscaled surface based on SVG image + error = nullptr; + RsvgRectangle rect = { + .x = 0., + .y = 0., + .width = static_cast(w * RTScalable::getScale()), + .height = static_cast(h * RTScalable::getScale()) + }; + c->set_operator (Cairo::OPERATOR_OVER); + const bool success = rsvg_handle_render_document(handle, c->cobj(), &rect, &error); + + if (!success && error) { + std::cerr << "Failed to load SVG file \"" << fname << "\": " << std::endl + << Glib::ustring(error->message) << std::endl; + free(error); + return surf; + } + + rsvg_handle_free(handle); + + // Set device scale to avoid blur effect + cairo_surface_set_device_scale(surf->cobj(), + static_cast(RTScalable::getScale()), + static_cast(RTScalable::getScale())); + } else { + std::cerr << "Failed to load SVG file \"" << fname << "\"" << std::endl; + } + + return surf; +} + +void RTScalable::init(const Gtk::Window* window) +{ + // Retrieve DPI and Scale paremeters from OS + getDPInScale(window, dpi, scale); +} + +void RTScalable::setDPInScale (const Gtk::Window* window) +{ + getDPInScale(window, dpi, scale); +} void RTScalable::setDPInScale (const double newDPI, const int newScale) { - if (!options.pseudoHiDPISupport) { - scale = 1; - dpi = baseDPI; - return; - } - - if (scale != newScale || (scale == 1 && dpi != newDPI)) { - // reload all images - scale = newScale; - // HOMBRE: On windows, if scale = 2, the dpi is non significant, i.e. should be considered = 192 ; don't know for linux/macos - dpi = newDPI; - if (scale == 1) { - if (dpi >= baseHiDPI) { - scale = 2; - } - } - else if (scale == 2) { - if (dpi < baseHiDPI) { - dpi *= 2.; - } - } - } + dpi = newDPI; + scale = newScale; } double RTScalable::getDPI () @@ -66,188 +255,24 @@ double RTScalable::getDPI () return dpi; } -double RTScalable::getTweakedDPI () -{ - return dpi * static_cast(fontScale); -} - int RTScalable::getScale () { return scale; } -Gtk::TextDirection RTScalable::getDirection() +double RTScalable::getGlobalScale() { - return direction; + return (RTScalable::getDPI() / RTScalable::baseDPI); } -void RTScalable::init(Gtk::Window *window) +int RTScalable::scalePixelSize(const int pixel_size) { - dpi = 0.; - scale = 0; - - setDPInScale(window->get_screen()->get_resolution(), rtengine::max((int)initialGdkScale, window->get_scale_factor())); - direction = window->get_direction(); + const double s = getGlobalScale(); + return static_cast(pixel_size * s + 0.5); // Rounded scaled size } -void RTScalable::deleteDir(const Glib::ustring& path) +double RTScalable::scalePixelSize(const double pixel_size) { - int error = 0; - try { - - Glib::Dir dir (path); - - // Removing the directory content - for (auto entry = dir.begin(); entry != dir.end(); ++entry) { - error |= g_remove (Glib::build_filename (path, *entry).c_str()); - } - - if (error != 0 && rtengine::settings->verbose) { - std::cerr << "Failed to delete all entries in '" << path << "': " << g_strerror(errno) << std::endl; - } - - } catch (Glib::Error&) { - error = 1; - } - - // Removing the directory itself - if (!error) { - try { - - error = g_remove (path.c_str()); - - } catch (Glib::Error&) {} - } -} - -void RTScalable::cleanup(bool all) -{ - Glib::ustring imagesCacheFolder = Glib::build_filename (options.cacheBaseDir, "svg2png"); - Glib::ustring sDPI = Glib::ustring::compose("%1", (int)getTweakedDPI()); - - try { - Glib::Dir dir(imagesCacheFolder); - - for (Glib::DirIterator entry = dir.begin(); entry != dir.end(); ++entry) { - const Glib::ustring fileName = *entry; - const Glib::ustring filePath = Glib::build_filename(imagesCacheFolder, fileName); - if (fileName == "." || fileName == ".." || !Glib::file_test(filePath, Glib::FILE_TEST_IS_DIR)) { - continue; - } - - if (all || fileName != sDPI) { - deleteDir(filePath); - } - } - } catch (Glib::Exception&) { - } - -} - -/* - * This function try to find the svg file converted to png in a cache and return - * the Cairo::ImageSurface. If it can't find it, it will generate it. - * - * If the provided filename doesn't end with ".svg" (and then we're assuming it's a png file), - * it will try to load that file directly from the source images folder. Scaling is disabled - * for anything else than svg files. - * - * This function will always return a usable value, but it might be a garbage image - * if something went wrong. - */ -Cairo::RefPtr RTScalable::loadImage(const Glib::ustring &fname, double dpi) -{ - // Magic color : #2a7fff - // Dark theme color : #CCCCCC - // Light theme color : #252525 -- not used - - Glib::ustring imagesFolder = Glib::build_filename (argv0, "images"); - Glib::ustring imagesCacheFolder = Glib::build_filename (options.cacheBaseDir, "svg2png"); - - // -------------------- Looking for the cached PNG file first -------------------- - - Glib::ustring imagesCacheFolderDPI = Glib::build_filename (imagesCacheFolder, Glib::ustring::compose("%1", (int)dpi)); - auto path = Glib::build_filename(imagesCacheFolderDPI, fname); - - if (Glib::file_test(path.c_str(), Glib::FILE_TEST_EXISTS)) { - return Cairo::ImageSurface::create_from_png(path); - } else { - - // -------------------- Looking for the PNG file in install directory -------------------- - - path = Glib::build_filename(imagesFolder, fname); - if (Glib::file_test(path.c_str(), Glib::FILE_TEST_EXISTS)) { - return Cairo::ImageSurface::create_from_png(path); - } - } - - // Last chance: looking for the svg file and creating the cached image file - - // -------------------- Creating the cache folder for PNGs -------------------- - - if (!Glib::file_test(imagesCacheFolderDPI.c_str(), Glib::FILE_TEST_EXISTS)) { - auto error = g_mkdir_with_parents (imagesCacheFolderDPI.c_str(), 0777); - if (error != 0) { - std::cerr << "ERROR: Can't create \"" << imagesCacheFolderDPI << "\" cache folder: " << g_strerror(error) << std::endl; - Cairo::RefPtr surf = Cairo::ImageSurface::create(Cairo::FORMAT_RGB24, 10, 10); - return surf; - } - } - - // -------------------- Loading the SVG file -------------------- - - std::string svgFile; - Glib::ustring iconNameSVG; - if (fname.find(".png") != Glib::ustring::npos) { - iconNameSVG = fname.substr(0, fname.length() - 3) + Glib::ustring("svg"); - } - try { - path = Glib::build_filename (imagesFolder, iconNameSVG); - //printf("Trying to get content of %s\n", path.c_str()); - svgFile = Glib::file_get_contents(Glib::build_filename (imagesFolder, iconNameSVG)); - } - catch (Glib::FileError &err) { - std::cerr << "ERROR: " << err.what() << std::endl; - Cairo::RefPtr surf = Cairo::ImageSurface::create(Cairo::FORMAT_RGB24, 10, 10); - return surf; - } - - // -------------------- Updating the the magic color -------------------- - - std::string updatedSVG = std::regex_replace(svgFile, std::regex("#2a7fff"), "#CCCCCC"); - - // -------------------- Creating the rsvg handle -------------------- - - GError **error = nullptr; - RsvgHandle *handle = rsvg_handle_new_from_data((unsigned const char*)updatedSVG.c_str(), updatedSVG.length(), error); - - if (error && !handle) { - std::cerr << "ERROR: Can't use the provided data for \"" << fname << "\" to create a RsvgHandle:" << std::endl - << Glib::ustring((*error)->message) << std::endl; - Cairo::RefPtr surf = Cairo::ImageSurface::create(Cairo::FORMAT_RGB24, 10, 10); - return surf; - } - - // -------------------- Drawing the image to a Cairo::ImageSurface -------------------- - - RsvgDimensionData dim; - rsvg_handle_get_dimensions(handle, &dim); - double r = dpi / baseDPI; - Cairo::RefPtr surf = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, (int)(dim.width * r + 0.499), (int)(dim.height * r + 0.499)); - Cairo::RefPtr c = Cairo::Context::create(surf); - c->set_source_rgba (0., 0., 0., 0.); - c->set_operator (Cairo::OPERATOR_CLEAR); - c->paint (); - c->set_operator (Cairo::OPERATOR_OVER); - c->scale(r, r); - rsvg_handle_render_cairo(handle, c->cobj()); - rsvg_handle_free(handle); - - // -------------------- Saving the image in cache -------------------- - - surf->write_to_png(Glib::build_filename(imagesCacheFolderDPI, fname)); - - // -------------------- Finished! Pfeeew ! -------------------- - - return surf; + const double s = getGlobalScale(); + return (pixel_size * s); } diff --git a/rtgui/rtscalable.h b/rtgui/rtscalable.h index 28ebf7be8..80312adef 100644 --- a/rtgui/rtscalable.h +++ b/rtgui/rtscalable.h @@ -2,6 +2,7 @@ * This file is part of RawTherapee. * * Copyright (c) 2018 Jean-Christophe FRISCH + * Copyright (c) 2022 Pierre CABRERA * * RawTherapee is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,39 +20,56 @@ #pragma once -#include +#include /** - * @brief A master class for derived class of Gtk::Image in order to handle theme-related icon sets. + * A static class in order to handle Hi-DPI. + * + * About Cairo size convention (for surface): + * Cairo size is expressed in "px" with a 96 DPI (i.e. px per inch) default resolution + * + * About Pango size convention (for font): + * Pango size can be expressed in two different units: + * - Absolute size (i.e. "px") + * - Non-absolute size (i.e. "pt"): The default resolution is 72 DPI (i.e. pt per inch). To + * convert the size to "px", use the following formula: + * "size in px" = "size in pt" * ("device resolution" / 72) + * Notes: + * - By default, size is expressed in non-absolute size (i.e. "pt"). Conversion between absolute + * and non-absolute size is ensured by Pango. + * - On MacOS, font is already scaled by the System library (i.e. "size in px" = "size in pt" * 1.). + * Refer to https://gitlab.gnome.org/GNOME/gtk/-/blob/gtk-3-24/gdk/quartz/gdkscreen-quartz.c + * + * Hi-DPI implementation according to the OS (source: GDK code): + * - Windows: A default DPI of 96 is considered. Current DPI parameter is provided by the OS. + * Scale is calculated by (int)("current DPI" / 96). If Scale is greater than 1, DPI is + * forced to 96. + * - MacOS: Scale is calculated from OS parameters (= "Retina screen width" / "Virtual width"). + * DPI is forced to 72. + * - Linux: DPI is calculated from OS parameter (= 96 * "text-scaling-factor"). Note: "text-scaling-factor" + * is different from "device factor". */ class RTScalable { +private: static double dpi; static int scale; - static Gtk::TextDirection direction; // cached value for text-direction - static void deleteDir(const Glib::ustring& path); + static void getDPInScale(const Gtk::Window* window, double &newDPI, int &newScale); protected: - static void setDPInScale (const double newDPI, const int newScale); - static Cairo::RefPtr loadImage(const Glib::ustring &fname, double dpi); - static Gtk::TextDirection getDirection(); - + static Cairo::RefPtr loadSurfaceFromIcon(const Glib::ustring &icon_name, const Gtk::IconSize iconSize = Gtk::ICON_SIZE_SMALL_TOOLBAR); + static Cairo::RefPtr loadSurfaceFromPNG(const Glib::ustring &fname, const bool is_path = false); + static Cairo::RefPtr loadSurfaceFromSVG(const Glib::ustring &fname, const int width = -1, const int height = -1, const bool is_path = false); public: - -#ifdef __APPLE__ - static constexpr double baseDPI = 72.; - static constexpr double baseHiDPI = 144.; - static constexpr int baseFontSize = 12; -#else - static constexpr double baseDPI = 96.; - static constexpr double baseHiDPI = 192.; - static constexpr int baseFontSize = 9; -#endif - - static void init(Gtk::Window *window); - static void cleanup(bool all = false); - static double getDPI (); - static double getTweakedDPI (); // The returned value is tweaked DPI to adapt to main the font size. Maybe not an ideal solution. - static int getScale (); + static constexpr double pangoDPI = 72.; // Pango default DPI for "pt" size + static constexpr double baseDPI = 96.; // Cairo default DPI + static void init(const Gtk::Window* window); + static void setDPInScale(const Gtk::Window* window); + static void setDPInScale(const double newDPI, const int newScale); + static double getDPI(); + static int getScale(); + static double getGlobalScale(); + static int scalePixelSize(const int pixel_size); + static double scalePixelSize(const double pixel_size); }; diff --git a/rtgui/rtsurface.cc b/rtgui/rtsurface.cc index 62dfe36d5..a4015494a 100644 --- a/rtgui/rtsurface.cc +++ b/rtgui/rtsurface.cc @@ -2,6 +2,7 @@ * This file is part of RawTherapee. * * Copyright (c) 2018 Jean-Christophe FRISCH + * Copyright (c) 2022 Pierre CABRERA * * RawTherapee is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,123 +24,167 @@ #include "options.h" -namespace -{ - -using SurfaceCache = std::map>; - -SurfaceCache surfaceCache; - -} - RTSurface::RTSurface() : surface(new Cairo::ImageSurface(nullptr, false)) { + // Initialize "back" parameters from RTScalable + dpiBack = RTScalable::getDPI(); + scaleBack = RTScalable::getScale(); + + // Initialize other private parameters + type = RTSurfaceType::InvalidType; + name = ""; + icon_size = Gtk::ICON_SIZE_INVALID; } -RTSurface::RTSurface(const Glib::ustring& fileName, const Glib::ustring& rtlFileName) : +RTSurface::RTSurface(const Glib::ustring &icon_name, const Gtk::IconSize iconSize) : RTSurface() { - setImage(fileName, rtlFileName); + // Create surface + surface = RTScalable::loadSurfaceFromIcon(icon_name, iconSize); + + if (surface) { + // Save private parameters + type = RTSurfaceType::IconType; + name = icon_name; + icon_size = iconSize; + } } -void RTSurface::setImage(const Glib::ustring& fileName, const Glib::ustring& rtlFileName) +RTSurface::RTSurface(const Glib::ustring &fname) : + RTSurface() { - const Glib::ustring& imageName = - !rtlFileName.empty() && getDirection() == Gtk::TEXT_DIR_RTL - ? rtlFileName - : fileName; + // Create surface based on file extension + const auto pos = fname.find_last_of('.'); - changeImage (imageName); + if (pos >= 0 && pos < fname.length()) { + const auto fext = fname.substr(pos + 1, fname.length()).lowercase(); + + // Case where fname is a PNG file + if (fext == "png") { + // Create surface from PNG file + surface = RTScalable::loadSurfaceFromPNG(fname); + + if (surface) { + // Save private parameter + type = RTSurfaceType::PNGType; + name = fname; + } + } + + // Case where fname is a SVG file + if (fext == "svg") { + // Create surface from SVG file + surface = RTScalable::loadSurfaceFromSVG(fname); + + if (surface) { + // Save private parameter + type = RTSurfaceType::SVGType; + name = fname; + } + } + } } -int RTSurface::getWidth() const +int RTSurface::getWidth() { - return - surface - ? surface->get_width() - : -1; + int w, h; + + if (hasSurface()) { + switch (type) { + case RTSurfaceType::IconType: + // Get width from Gtk::IconSize + if (!Gtk::IconSize::lookup(icon_size, w, h)) { // Size in invalid + w = h = -1; // Invalid case + } + + return w; + + case RTSurfaceType::PNGType: + // Directly return surface width + return surface->get_width(); + + case RTSurfaceType::SVGType: + // Returned size shall consider the scaling + return (surface->get_width() / RTScalable::getScale()); + + case RTSurfaceType::InvalidType: + default: + // Invalid case + return -1; + } + } else { + // Invalid case + return -1; + } } -int RTSurface::getHeight() const +int RTSurface::getHeight() { - return - surface - ? surface->get_height() - : -1; + int w, h; + + if (hasSurface()) { + switch (type) { + case RTSurfaceType::IconType: + // Get width from Gtk::IconSize + if (!Gtk::IconSize::lookup(icon_size, w, h)) { // Size in invalid + w = h = -1; // Invalid case + } + + return h; + + case RTSurfaceType::PNGType: + // Directly return surface width + return surface->get_height(); + + case RTSurfaceType::SVGType: + // Returned size shall consider the scaling + return (surface->get_height() / RTScalable::getScale()); + + case RTSurfaceType::InvalidType: + default: + // Invalid case + return -1; + } + } else { + // Invalid case + return -1; + } } -bool RTSurface::hasSurface() const +bool RTSurface::hasSurface() { return static_cast(surface); } -Cairo::RefPtr RTSurface::get() const +Cairo::RefPtr RTSurface::get() { - return surface; -} + if (dpiBack != RTScalable::getDPI() || + scaleBack != RTScalable::getScale()) { + updateSurface(); -const Cairo::RefPtr& RTSurface::get() -{ - return surface; -} - -void RTSurface::init() -{ - dpiBack = getDPI(); - scaleBack = getScale(); -} - -void RTSurface::updateImages() -{ - const double tweakedDpi = getTweakedDPI(); - - for (auto& entry : surfaceCache) { - entry.second = loadImage(entry.first, tweakedDpi); - } -} - -void RTSurface::setDPInScale(const double newDPI, const int newScale) -{ - if ( - getScale() != newScale - || ( - getScale() == 1 - && getDPI() != newDPI - ) - ) { - setDPInScale(newDPI, newScale); - dpiBack = getDPI(); - scaleBack = getScale(); - - updateImages(); - } -} - -void RTSurface::changeImage(const Glib::ustring& imageName) -{ - const SurfaceCache::const_iterator iterator = surfaceCache.find(imageName); - - if (iterator != surfaceCache.end()) { - surface = iterator->second; - } else { - surface = loadImage(imageName, getTweakedDPI()); - - // HOMBRE: As of now, GDK_SCALE is forced to 1, so setting the Cairo::ImageSurface scale is not required - // Anyway, this might be of use one day - /* - double x=0., y=0.; - cairo_surface_get_device_scale(surface->cobj(), &x, &y); - if (getScale() == 2) { - cairo_surface_set_device_scale(surface->cobj(), 0.5, 0.5); // Not sure if it should be 0.5 or 2.0 here ! - surface->flush(); + // Save new DPI and scale + dpiBack = RTScalable::getDPI(); + scaleBack = RTScalable::getScale(); } - */ - surfaceCache.emplace(imageName, surface); - } + return surface; } -double RTSurface::dpiBack = 0.; - -int RTSurface::scaleBack = 0; +void RTSurface::updateSurface() +{ + // Update surface based on the scale + switch (type) { + case RTSurfaceType::IconType : + surface = RTScalable::loadSurfaceFromIcon(name, icon_size); + break; + case RTSurfaceType::PNGType : + surface = RTScalable::loadSurfaceFromPNG(name); + break; + case RTSurfaceType::SVGType : + surface = RTScalable::loadSurfaceFromSVG(name); + break; + default : + break; + } +} diff --git a/rtgui/rtsurface.h b/rtgui/rtsurface.h index 1944cc2dc..515b079c7 100644 --- a/rtgui/rtsurface.h +++ b/rtgui/rtsurface.h @@ -2,6 +2,7 @@ * This file is part of RawTherapee. * * Copyright (c) 2018 Jean-Christophe FRISCH + * Copyright (c) 2022 Pierre CABRERA * * RawTherapee is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,37 +19,38 @@ */ #pragma once -#include - #include "rtscalable.h" /** - * @brief A derived class of Gtk::Image in order to handle theme-related icon sets. + * @brief A custom class in order to handle Hi-DPI surface. */ -class RTSurface : - public RTScalable +class RTSurface final : public RTScalable { public: - RTSurface(); - explicit RTSurface(const Glib::ustring& fileName, const Glib::ustring& rtlFileName = {}); - - void setImage(const Glib::ustring& fileName, const Glib::ustring& rtlFileName = {}); - - int getWidth() const; - int getHeight() const; - bool hasSurface() const; - - Cairo::RefPtr get() const; - const Cairo::RefPtr& get(); - - static void init(); - static void updateImages(); - static void setDPInScale(double newDPI, int newScale); + enum class RTSurfaceType { + InvalidType, + IconType, + PNGType, + SVGType + }; private: - void changeImage(const Glib::ustring& imageName); - - static double dpiBack; // used to keep track of master dpi change - static int scaleBack; // used to keep track of master scale change + double dpiBack; // Used to identify dpi change + int scaleBack; // Used to identify scale change + RTSurfaceType type; + Glib::ustring name; + Gtk::IconSize icon_size; Cairo::RefPtr surface; + +public: + RTSurface(); + explicit RTSurface(const Glib::ustring &icon_name, const Gtk::IconSize iconSize); + explicit RTSurface(const Glib::ustring &fname); + + int getWidth(); + int getHeight(); + bool hasSurface(); + + Cairo::RefPtr get(); + void updateSurface(); }; diff --git a/rtgui/rtwindow.cc b/rtgui/rtwindow.cc index 2165162b3..b95625a80 100755 --- a/rtgui/rtwindow.cc +++ b/rtgui/rtwindow.cc @@ -34,12 +34,9 @@ #include "filepanel.h" #include "filmsimulation.h" -float fontScale = 1.f; Glib::RefPtr cssForced; Glib::RefPtr cssRT; -extern unsigned char initialGdkScale; - #if defined(__APPLE__) static gboolean osx_should_quit_cb (GtkosxApplication *app, gpointer data) @@ -104,10 +101,6 @@ RTWindow::RTWindow () , epanel (nullptr) , fpanel (nullptr) { - - if (options.is_new_version()) { - RTImage::cleanup(true); - } cacheMgr->init (); ProfilePanel::init (this); @@ -116,44 +109,20 @@ RTWindow::RTWindow () Glib::RefPtr screen = Gdk::Screen::get_default(); if (screen) { + // Setting default theme and icon theme (bases for custom themes) Gtk::Settings::get_for_screen (screen)->property_gtk_theme_name() = "Adwaita"; Gtk::Settings::get_for_screen (screen)->property_gtk_application_prefer_dark_theme() = true; + Gtk::Settings::get_for_screen (screen)->property_gtk_icon_theme_name() = "rawtherapee"; - Glib::RefPtr regex = Glib::Regex::create (THEMEREGEXSTR, Glib::RegexCompileFlags::REGEX_CASELESS); - Glib::ustring filename; - Glib::MatchInfo mInfo; - bool match = regex->match(options.theme + ".css", mInfo); - if (match) { - // save old theme (name + version) - Glib::ustring initialTheme(options.theme); + // Initialize RTScalable for Hi-DPI support + RTScalable::init(this); - // update version - auto pos = options.theme.find("-GTK3-"); - Glib::ustring themeRootName(options.theme.substr(0, pos)); - if (GTK_MINOR_VERSION < 20) { - options.theme = themeRootName + "-GTK3-_19"; - } else { - options.theme = themeRootName + "-GTK3-20_"; - } - // check if this version exist - if (!Glib::file_test(Glib::build_filename(argv0, "themes", options.theme + ".css"), Glib::FILE_TEST_EXISTS)) { - // set back old theme version if the actual one doesn't exist yet - options.theme = initialTheme; - } - } - filename = Glib::build_filename(argv0, "themes", options.theme + ".css"); - - if (!match || !Glib::file_test(filename, Glib::FILE_TEST_EXISTS)) { - options.theme = "RawTherapee-GTK"; - - // We're not testing GTK_MAJOR_VERSION == 3 here, since this branch requires Gtk3 only - if (GTK_MINOR_VERSION < 20) { - options.theme = options.theme + "3-_19"; - } else { - options.theme = options.theme + "3-20_"; - } - - filename = Glib::build_filename (argv0, "themes", options.theme + ".css"); + // Look for theme and set it + // Check if the current theme name in options exists, otherwise set it to default one (i.e. "RawTherapee.css") + auto filename = Glib::build_filename(argv0, "themes", options.theme + ".css"); + if (!Glib::file_test(filename, Glib::FILE_TEST_EXISTS)) { + options.theme = "RawTherapee"; + filename = Glib::build_filename(argv0, "themes", options.theme + ".css"); } cssRT = Gtk::CssProvider::create(); @@ -169,90 +138,62 @@ RTWindow::RTWindow () // Set the font face and size Glib::ustring css; - if (options.fontFamily != "default") { - //GTK318 - #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION < 20 - css = Glib::ustring::compose ("* { font-family: %1; font-size: %2px}", options.fontFamily, options.fontSize * (int)initialGdkScale); - #else - css = Glib::ustring::compose ("* { font-family: %1; font-size: %2pt}", options.fontFamily, options.fontSize * (int)initialGdkScale); - #endif - //GTK318 - if (options.pseudoHiDPISupport) { - 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, static_cast(fontScale)); - } - } else { - Glib::RefPtr style = Gtk::StyleContext::create(); - Pango::FontDescription pfd = style->get_font(Gtk::STATE_FLAG_NORMAL); - if (pfd.get_set_fields() & Pango::FONT_MASK_SIZE) { - int pt; - int fontSize = pfd.get_size(); - bool isPix = pfd.get_size_is_absolute(); - int resolution = (int)style->get_screen()->get_resolution(); - if (isPix) { - // HOMBRE: guessing here... - // if resolution is lower than baseHiDPI, we're supposing that it's already expressed in a scale==1 scenario - if (resolution >= int(RTScalable::baseHiDPI)) { - // converting the resolution to a scale==1 scenario - resolution /= 2; - } - // 1pt = 1/72in @ 96 ppi - // HOMBRE: If the font unit is px, is it already scaled up to match the resolution ? - // px >inch >pt >"scaled pt" - pt = (int)(double(fontSize) / RTScalable::baseDPI * 72. * (96. / (double)resolution) + 0.49); - } else { - pt = fontSize / Pango::SCALE; - } - if (options.pseudoHiDPISupport) { - fontScale = (float)pt / (float)RTScalable::baseFontSize; - } - 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, static_cast(fontScale)); - } - } + + if (options.fontFamily != "default") { // Set font and size according to user choice + // Set font and size in css from options + css = Glib::ustring::compose ("* { font-family: %1; font-size: %2pt}", + options.fontFamily, + options.fontSize); // Font size is in "pt" in options + } else { // Set font and size according to default values + // Retrieve default style values from Gtk::Settings + const auto defaultSettings = Gtk::Settings::get_default(); + Glib::ustring defaultFont; + defaultSettings->get_property("gtk-font-name", defaultFont); + const Pango::FontDescription defaultFontDesc = Pango::FontDescription(defaultFont); + + // Set font and size in css + auto defaultFontFamily = defaultFontDesc.get_family(); + const int defaultFontSize = defaultFontDesc.get_size() / Pango::SCALE; // Font size is managed in ()"pt" * Pango::SCALE) by Pango (also refer to notes in rtscalable.h) +#if defined(__APPLE__) + // Default MacOS font (i.e. "") is not correctly handled + // in Gtk css. Replacing it by "-apple-system" to avoid this + if (defaultFontFamily == ".AppleSystemUIFont") { + defaultFontFamily = "-apple-system"; } +#endif + css = Glib::ustring::compose ("* { font-family: %1; font-size: %2pt}", + defaultFontFamily, + defaultFontSize); } + + // Load custom CSS for font if (!css.empty()) { if (rtengine::settings->verbose) { printf("CSS:\n%s\n\n", css.c_str()); } + try { cssForced = Gtk::CssProvider::create(); cssForced->load_from_data (css); Gtk::StyleContext::add_provider_for_screen (screen, cssForced, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); - } catch (Glib::Error &err) { printf ("Error: \"%s\"\n", err.what().c_str()); } catch (...) { - printf ("Error: Can't find the font named \"%s\"\n", options.fontFamily.c_str()); + printf ("Error: Can't load the desired font correctly\n"); } } } // ------- end loading theme files - RTScalable::init(this); - RTSurface::init(); - RTImage::init(); - WhiteBalance::init(); - MyExpander::init(); + // Initialize FileBrowserEntry icons FileBrowserEntry::init(); + // For UNIX system, set app icon #ifndef _WIN32 - const std::vector> appIcons = { - RTImage::createPixbufFromFile("rawtherapee-logo-16.png"), - RTImage::createPixbufFromFile("rawtherapee-logo-24.png"), - RTImage::createPixbufFromFile("rawtherapee-logo-48.png"), - RTImage::createPixbufFromFile("rawtherapee-logo-128.png"), - RTImage::createPixbufFromFile("rawtherapee-logo-256.png") - }; try { - set_default_icon_list(appIcons); + set_default_icon_name("rawtherapee"); } catch (Glib::Exception& ex) { printf ("%s\n", ex.what().c_str()); } @@ -325,11 +266,11 @@ RTWindow::RTWindow () if (options.mainNBVertical) { mainNB->set_tab_pos (Gtk::POS_LEFT); fpl->set_angle (90); - RTImage* folderIcon = Gtk::manage (new RTImage ("folder-closed.png")); + RTImage* folderIcon = Gtk::manage (new RTImage ("folder-closed", Gtk::ICON_SIZE_LARGE_TOOLBAR)); fpanelLabelGrid->attach_next_to (*folderIcon, Gtk::POS_TOP, 1, 1); fpanelLabelGrid->attach_next_to (*fpl, Gtk::POS_TOP, 1, 1); } else { - RTImage* folderIcon = Gtk::manage (new RTImage ("folder-closed.png")); + RTImage* folderIcon = Gtk::manage (new RTImage ("folder-closed", Gtk::ICON_SIZE_LARGE_TOOLBAR)); fpanelLabelGrid->attach_next_to (*folderIcon, Gtk::POS_RIGHT, 1, 1); fpanelLabelGrid->attach_next_to (*fpl, Gtk::POS_RIGHT, 1, 1); } @@ -362,27 +303,27 @@ RTWindow::RTWindow () //mainBox->pack_start (*mainNB); // filling bottom box - iFullscreen = new RTImage ("fullscreen-enter.png"); - iFullscreen_exit = new RTImage ("fullscreen-leave.png"); + iFullscreen = new RTImage ("fullscreen-enter", Gtk::ICON_SIZE_LARGE_TOOLBAR); + iFullscreen_exit = new RTImage ("fullscreen-leave", Gtk::ICON_SIZE_LARGE_TOOLBAR); Gtk::Button* iccProfileCreator = Gtk::manage (new Gtk::Button ()); setExpandAlignProperties (iccProfileCreator, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); iccProfileCreator->set_relief(Gtk::RELIEF_NONE); - iccProfileCreator->set_image (*Gtk::manage (new RTImage ("gamut-plus.png"))); + iccProfileCreator->set_image (*Gtk::manage (new RTImage ("gamut-plus", Gtk::ICON_SIZE_LARGE_TOOLBAR))); iccProfileCreator->set_tooltip_markup (M ("MAIN_BUTTON_ICCPROFCREATOR")); iccProfileCreator->signal_clicked().connect ( sigc::mem_fun (*this, &RTWindow::showICCProfileCreator) ); Gtk::Button* helpBtn = Gtk::manage (new Gtk::Button ()); setExpandAlignProperties (helpBtn, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); helpBtn->set_relief(Gtk::RELIEF_NONE); - helpBtn->set_image (*Gtk::manage (new RTImage ("questionmark.png"))); + helpBtn->set_image (*Gtk::manage (new RTImage("questionmark", Gtk::ICON_SIZE_LARGE_TOOLBAR))); helpBtn->set_tooltip_markup (M ("GENERAL_HELP")); helpBtn->signal_clicked().connect (sigc::mem_fun (*this, &RTWindow::showRawPedia)); Gtk::Button* preferences = Gtk::manage (new Gtk::Button ()); setExpandAlignProperties (preferences, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); preferences->set_relief(Gtk::RELIEF_NONE); - preferences->set_image (*Gtk::manage (new RTImage ("preferences.png"))); + preferences->set_image (*Gtk::manage (new RTImage ("preferences", Gtk::ICON_SIZE_LARGE_TOOLBAR))); preferences->set_tooltip_markup (M ("MAIN_BUTTON_PREFERENCES")); preferences->signal_clicked().connect ( sigc::mem_fun (*this, &RTWindow::showPreferences) ); @@ -455,7 +396,6 @@ RTWindow::~RTWindow() delete fpanel; delete iFullscreen; delete iFullscreen_exit; - RTImage::cleanup(); } void RTWindow::on_realize () @@ -530,8 +470,8 @@ bool RTWindow::on_configure_event (GdkEventConfigure* event) get_position (options.windowX, options.windowY); } - RTImage::setDPInScale(RTScalable::getDPI(), RTScalable::getScale()); // will update the RTImage on scale/resolution change - RTSurface::setDPInScale(RTScalable::getDPI(), RTScalable::getScale()); // will update the RTSurface on scale/resolution change + // With update the RTScalable on scale or resolution change + RTScalable::setDPInScale(this); return Gtk::Widget::on_configure_event (event); } @@ -542,7 +482,7 @@ bool RTWindow::on_window_state_event (GdkEventWindowState* event) 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); } @@ -594,7 +534,7 @@ void RTWindow::addEditorPanel (EditorPanel* ep, const std::string &name) // construct closeable tab for the image Gtk::Grid* titleGrid = Gtk::manage (new Gtk::Grid ()); titleGrid->set_tooltip_markup (name); - RTImage *closebimg = Gtk::manage (new RTImage ("cancel-small.png")); + RTImage *closebimg = Gtk::manage (new RTImage ("cancel-small", Gtk::ICON_SIZE_LARGE_TOOLBAR)); Gtk::Button* closeb = Gtk::manage (new Gtk::Button ()); closeb->set_name ("CloseButton"); closeb->add (*closebimg); @@ -603,7 +543,7 @@ void RTWindow::addEditorPanel (EditorPanel* ep, const std::string &name) closeb->signal_clicked().connect ( sigc::bind (sigc::mem_fun (*this, &RTWindow::remEditorPanel), ep)); if (!EditWindow::isMultiDisplayEnabled()) { - titleGrid->attach_next_to (*Gtk::manage (new RTImage ("aperture.png")), Gtk::POS_RIGHT, 1, 1); + titleGrid->attach_next_to (*Gtk::manage (new RTImage ("aperture", Gtk::ICON_SIZE_LARGE_TOOLBAR)), Gtk::POS_RIGHT, 1, 1); } titleGrid->attach_next_to (*Gtk::manage (new Gtk::Label (Glib::path_get_basename (name))), Gtk::POS_RIGHT, 1, 1); titleGrid->attach_next_to (*closeb, Gtk::POS_RIGHT, 1, 1); @@ -858,12 +798,8 @@ bool RTWindow::on_delete_event (GdkEventAny* event) } cacheMgr->closeCache (); // also makes cleanup if too large - WhiteBalance::cleanup(); ProfilePanel::cleanup(); ClutComboBox::cleanup(); - MyExpander::cleanup(); - mainWindowCursorManager.cleanup(); - editWindowCursorManager.cleanup(); BatchQueueEntry::savedAsIcon.reset(); FileBrowserEntry::editedIcon.reset(); FileBrowserEntry::recentlySavedIcon.reset(); @@ -1000,7 +936,7 @@ 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(); @@ -1016,7 +952,7 @@ void RTWindow::toggle_fullscreen () btn_fullscreen->set_image (*iFullscreen_exit); } } - + onConfEventConn.block(false); } @@ -1161,7 +1097,7 @@ bool RTWindow::splashClosed (GdkEventAny* event) 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); @@ -1200,7 +1136,7 @@ void RTWindow::setWindowSize () unmaximize(); resize (options.windowWidth, options.windowHeight); } - + onConfEventConn.block(false); } @@ -1208,7 +1144,7 @@ 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(); @@ -1293,7 +1229,7 @@ void RTWindow::createSetmEditor() el->set_angle (90); } - editorLabelGrid->attach_next_to (*Gtk::manage (new RTImage ("aperture.png")), pos, 1, 1); + editorLabelGrid->attach_next_to (*Gtk::manage (new RTImage ("aperture", Gtk::ICON_SIZE_LARGE_TOOLBAR)), pos, 1, 1); editorLabelGrid->attach_next_to (*el, pos, 1, 1); editorLabelGrid->set_tooltip_markup (M ("MAIN_FRAME_EDITOR_TOOLTIP")); diff --git a/rtgui/shcselector.cc b/rtgui/shcselector.cc index 175c732a2..504c209f7 100644 --- a/rtgui/shcselector.cc +++ b/rtgui/shcselector.cc @@ -27,14 +27,11 @@ SHCSelector::SHCSelector() : movingPosition(-1), tmpX(0.0), tmpPos(0.0), wslider(0.0), cl(nullptr), coloredBar(RTO_Left2Right) { - - int s = RTScalable::getScale(); - positions[0] = defaults[0] = 0.25; positions[1] = defaults[1] = 0.5; positions[2] = defaults[2] = 0.75; - leftMargin = (RADIUS - 1.5) * s; - rightMargin = (RADIUS - 1.5) * s; + leftMargin = static_cast(RTScalable::scalePixelSize(RADIUS - 1.5)); + rightMargin = static_cast(RTScalable::scalePixelSize(RADIUS - 1.5)); Glib::RefPtr style = get_style_context(); style->add_class("drawingarea"); @@ -63,14 +60,13 @@ void SHCSelector::get_preferred_height_vfunc (int &minimum_height, int &natural_ void SHCSelector::get_preferred_width_vfunc (int &minimum_width, int &natural_width) const { - int s = RTScalable::getScale(); - minimum_width = 100 * s; - natural_width = 150 * s; + minimum_width = RTScalable::scalePixelSize(100); + natural_width = RTScalable::scalePixelSize(150); } void SHCSelector::get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const { - natural_height = minimum_height = 14 * RTScalable::getScale(); + natural_height = minimum_height = RTScalable::scalePixelSize(14); } void SHCSelector::get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const @@ -117,64 +113,46 @@ void SHCSelector::on_realize() add_events(Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK); } -void SHCSelector::updateBackBuffer() +void SHCSelector::updateDrawingArea (const ::Cairo::RefPtr< Cairo::Context> &cr) { - if (!get_realized() || !isDirty() || !get_width() || !get_height()) { + if (!get_realized() || !get_width() || !get_height()) { return; } - // This will create or update the size of the BackBuffer::surface - setDrawRectangle(Cairo::FORMAT_ARGB32, 0, 0, get_width(), get_height(), true); - - if (!surface) { - return; - } - - Cairo::RefPtr cr = Cairo::Context::create(surface); Glib::RefPtr style = get_style_context(); - cr->set_source_rgba (0., 0., 0., 0.); - cr->set_operator (Cairo::OPERATOR_CLEAR); - cr->paint (); + // Setup drawing cr->set_operator (Cairo::OPERATOR_OVER); - int w = get_width () - leftMargin - rightMargin; - int h = get_height (); + // Get drawing area size + const int w = get_width () - leftMargin - rightMargin; + const int h = get_height (); - double s = RTScalable::getScale(); + // Compute slider parameters + wslider = static_cast(std::max(h / 5, 10)); + const double hwslider = wslider / 2.; - wslider = (double)std::max(h / 5, 10) * s; - double hwslider = wslider / 2.; - - // clear bg - cr->set_source_rgba (0., 0., 0., 0.); - cr->set_operator (Cairo::OPERATOR_CLEAR); - cr->paint (); - cr->set_operator (Cairo::OPERATOR_OVER); - - - // set the box's colors - cr->set_line_width (1.0 * s); + // Set the box's colors + cr->set_line_width (1.0); cr->set_antialias(Cairo::ANTIALIAS_SUBPIXEL); cr->set_line_cap(Cairo::LINE_CAP_BUTT); - int coloredBarHeight = (int)((double)h * 5.5 / 7. + 0.5); + int coloredBarHeight = static_cast(static_cast(h) * 5.5 / 7. + 0.5); if (is_sensitive() && coloredBar.canGetColors()) { - // gradient background - - // this will eventually create/update the off-screen BackBuffer - coloredBar.setDrawRectangle(leftMargin + 1 * (int)s, 1 * (int)s, w - 2 * (int)s, coloredBarHeight - 2 * (int)s); - // that we're displaying here - coloredBar.expose(*this, cr); + // Gradient background + coloredBar.setColoredBarSize(leftMargin + 1, 1, w - 2, coloredBarHeight - 2); + coloredBar.updateColoredBar(cr); } else { - style->render_background(cr, leftMargin + 1 * (int)s, 1 * (int)s, w - 2 * (int)s, coloredBarHeight - 2 * (int)s); + // Style background + style->render_background(cr, leftMargin + 1, 1, w - 2, coloredBarHeight - 2); } - // draw the box's borders + + // Draw the box's borders style->render_frame(cr, leftMargin, 0, w, coloredBarHeight); - // draw sliders + // Draw sliders for (int i = 0; i < 3; i++) { if (i == movingPosition) { style->set_state(Gtk::STATE_FLAG_ACTIVE); @@ -185,11 +163,16 @@ void SHCSelector::updateBackBuffer() style->set_state(Gtk::STATE_FLAG_NORMAL); } - style->render_slider(cr, (double)leftMargin + 1. * s + ((double)w - 2. * s) * positions[i] - (double)hwslider, (double)vb * s, wslider, (double)h - (double)vb * s, Gtk::ORIENTATION_VERTICAL); + style->render_slider(cr, + static_cast(leftMargin) + 1. + (static_cast(w) - 2.) * positions[i] - static_cast(hwslider), + static_cast(vb), + wslider, + static_cast(h) - static_cast(vb), + Gtk::ORIENTATION_VERTICAL); style->set_state(Gtk::STATE_FLAG_NORMAL); } - // draw text for the slider that is being moved + // Draw text for the slider that is being moved if (movingPosition >= 0) { int i = movingPosition; int offset; @@ -198,24 +181,27 @@ void SHCSelector::updateBackBuffer() Glib::RefPtr context = get_pango_context () ; Pango::FontDescription fontd(get_style_context()->get_font()); - // update font + // Update font fontd.set_weight (Pango::WEIGHT_NORMAL); - fontd.set_absolute_size((double)h * 0.8 * (double)Pango::SCALE); + const double fontSize = static_cast(h) * 0.8; // px + // Absolute size is defined in "Pango units" and shall be multiplied by + // Pango::SCALE from "px": + fontd.set_absolute_size (fontSize * static_cast(Pango::SCALE)); context->set_font_description (fontd); Glib::RefPtr layout = create_pango_layout(Glib::ustring::format(std::setprecision(2), positions[i])); layout->get_pixel_size(layout_width, layout_height); - offset = positions[i] > 0.5 ? -layout_width - 1 * (int)s - hwslider : 1 * (int)s + hwslider; + offset = positions[i] > 0.5 ? -layout_width - 1 - hwslider : 1 + hwslider; cr->set_source_rgb (0., 0., 0.); - cr->set_line_width(3. * s); + cr->set_line_width(3.); cr->set_line_join(Cairo::LINE_JOIN_ROUND); cr->set_line_cap(Cairo::LINE_CAP_ROUND); - cr->move_to ((double)leftMargin + (double)w * positions[i] + (double)offset, 0.); + cr->move_to (static_cast(leftMargin) + static_cast(w) * positions[i] + static_cast(offset), 0.); layout->add_to_cairo_context (cr); cr->stroke_preserve(); - cr->set_line_width(0.5 * s); + cr->set_line_width(0.5); cr->set_source_rgb (1., 1., 1.); cr->fill (); } @@ -223,17 +209,9 @@ void SHCSelector::updateBackBuffer() bool SHCSelector::on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) { - - // on_realize & updateBackBuffer have to be called before - if (get_realized() && get_width() && get_height()) { - if (isDirty()) { - updateBackBuffer(); - } - - if (surface) { - copySurface(cr); - } - } + // Draw drawing area + // Note: As drawing area surface is updated inside on_draw function, hidpi is automatically supported + updateDrawingArea(cr); return true; } @@ -242,14 +220,12 @@ bool SHCSelector::on_button_press_event (GdkEventButton* event) { // check if a slider is under the cursor - double w = double(get_width () - leftMargin - rightMargin); + const double w = static_cast(get_width () - leftMargin - rightMargin); movingPosition = -1; - double s = RTScalable::getScale(); - for (int i = 0; i < 3; i++) { - double currPos = double(leftMargin) + 1. * s + (w - 2. * s) * positions[i]; - double hwslider = wslider / 2.; + const double currPos = static_cast(leftMargin) + 1. + (w - 2.) * positions[i]; + const double hwslider = wslider / 2.; if (event->x >= currPos - hwslider && event->x <= currPos + hwslider) { movingPosition = i; tmpX = event->x; @@ -291,8 +267,7 @@ bool SHCSelector::on_motion_notify_event (GdkEventMotion* event) { if (movingPosition >= 0) { - double s = RTScalable::getScale(); - double innerw = double(get_width () - leftMargin - rightMargin) - 2. * s; + const double innerw = static_cast(get_width () - leftMargin - rightMargin) - 2.; positions[movingPosition] = tmpPos + (event->x - tmpX) / innerw; if (positions[movingPosition] < 0) { @@ -315,7 +290,6 @@ bool SHCSelector::on_motion_notify_event (GdkEventMotion* event) cl->shcChanged (); } - setDirty(true); queue_draw (); } @@ -325,7 +299,6 @@ bool SHCSelector::on_motion_notify_event (GdkEventMotion* event) void SHCSelector::styleChanged (const Glib::RefPtr& style) { - setDirty(true); queue_draw (); } @@ -339,7 +312,6 @@ bool SHCSelector::reset () // : movingPosition(-1), cl(NULL) { positions[0] = defaults[0]; positions[1] = defaults[1]; positions[2] = defaults[2]; - setDirty(true); queue_draw (); return true; } @@ -349,7 +321,6 @@ bool SHCSelector::reset () // : movingPosition(-1), cl(NULL) { void SHCSelector::refresh() { - setDirty(true); Glib::RefPtr win = get_window(); if (win) { win->invalidate(true); diff --git a/rtgui/shcselector.h b/rtgui/shcselector.h index 2422fdf56..bac1920fe 100644 --- a/rtgui/shcselector.h +++ b/rtgui/shcselector.h @@ -29,7 +29,7 @@ public: virtual void shcChanged() = 0; }; -class SHCSelector final : public Gtk::DrawingArea, BackBuffer +class SHCSelector final : public Gtk::DrawingArea { protected: @@ -61,7 +61,7 @@ protected: bool on_button_press_event (GdkEventButton* event) override; bool on_button_release_event (GdkEventButton* event) override; bool on_motion_notify_event (GdkEventMotion* event) override; - void updateBackBuffer(); + void updateDrawingArea (const ::Cairo::RefPtr< Cairo::Context> &cr); public: diff --git a/rtgui/splash.cc b/rtgui/splash.cc index 42b276a2e..0015c4864 100644 --- a/rtgui/splash.cc +++ b/rtgui/splash.cc @@ -21,48 +21,51 @@ #include #include "multilangmgr.h" -#include "rtimage.h" extern Glib::ustring creditsPath; extern Glib::ustring licensePath; extern Glib::ustring versionString; -SplashImage::SplashImage () : surface(RTImage::createImgSurfFromFile("splash.png")) +SplashImage::SplashImage () : surface(new RTSurface("splash.svg")) { } bool SplashImage::on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) { + if (surface->hasSurface()) { + cr->set_source(surface->get(), 0., 0.); + cr->rectangle(0, 0, surface->getWidth(), surface->getHeight()); + cr->fill(); - cr->set_source(surface, 0., 0.); - cr->rectangle(0, 0, surface->get_width(), surface->get_height()); - cr->fill(); + Cairo::FontOptions cfo; + cfo.set_antialias (Cairo::ANTIALIAS_SUBPIXEL); + Glib::RefPtr context = get_pango_context (); + context->set_cairo_font_options (cfo); + Pango::FontDescription fontd = get_style_context()->get_font(); + fontd.set_weight (Pango::WEIGHT_LIGHT); + const int fontSize = 12; // pt + // Non-absolute size is defined in "Pango units" and shall be multiplied by + // Pango::SCALE from "pt": + fontd.set_size(fontSize * Pango::SCALE); + context->set_font_description (fontd); - Cairo::FontOptions cfo; - cfo.set_antialias (Cairo::ANTIALIAS_SUBPIXEL); - Glib::RefPtr context = get_pango_context (); - context->set_cairo_font_options (cfo); - Pango::FontDescription fontd = context->get_font_description (); - fontd.set_weight (Pango::WEIGHT_LIGHT); - fontd.set_absolute_size (12 * Pango::SCALE); - context->set_font_description (fontd); + int w, h; + Glib::ustring versionStr(versionString); - int w, h; - Glib::ustring versionStr(versionString); - - version = create_pango_layout (versionStr); - version->set_text(versionStr); - version->get_pixel_size (w, h); - cr->set_source_rgb (0., 0., 0.); - cr->set_line_width(3.); - cr->set_line_join(Cairo::LINE_JOIN_ROUND); - cr->move_to (surface->get_width() - w - 32, surface->get_height() - h - 20); - version->add_to_cairo_context (cr); - cr->stroke_preserve(); - cr->set_source_rgb (1., 1., 1.); - cr->set_line_width(0.5); - cr->stroke_preserve(); - cr->fill(); + version = create_pango_layout (versionStr); + version->set_text(versionStr); + version->get_pixel_size (w, h); + cr->set_source_rgb (0., 0., 0.); + cr->set_line_width(3.); + cr->set_line_join(Cairo::LINE_JOIN_ROUND); + cr->move_to (surface->getWidth() - w - 32, surface->getHeight() - h - 20); + version->add_to_cairo_context (cr); + cr->stroke_preserve(); + cr->set_source_rgb (1., 1., 1.); + cr->set_line_width(0.5); + cr->stroke_preserve(); + cr->fill(); + } return true; } @@ -74,12 +77,12 @@ Gtk::SizeRequestMode SplashImage::get_request_mode_vfunc () const void SplashImage::get_preferred_height_vfunc (int &minimum_height, int &natural_height) const { - minimum_height = natural_height = surface ? surface->get_height() : 100 * RTScalable::getScale(); + minimum_height = natural_height = surface ? surface->getHeight() : RTScalable::scalePixelSize(100); } void SplashImage::get_preferred_width_vfunc (int &minimum_width, int &natural_width) const { - minimum_width = natural_width = surface ? surface->get_width() : 100 * RTScalable::getScale(); + minimum_width = natural_width = surface ? surface->getWidth() : RTScalable::scalePixelSize(100); } void SplashImage::get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const @@ -111,6 +114,8 @@ Splash::Splash (Gtk::Window& parent) : Gtk::Dialog(M("GENERAL_ABOUT"), parent, t // Tab 1: the image splashImage = Gtk::manage(new SplashImage ()); + splashImage->set_halign(Gtk::ALIGN_CENTER); + splashImage->set_valign(Gtk::ALIGN_CENTER); nb->append_page (*splashImage, M("ABOUT_TAB_SPLASH")); splashImage->show (); @@ -242,7 +247,6 @@ Splash::Splash (Gtk::Window& parent) : Gtk::Dialog(M("GENERAL_ABOUT"), parent, t } } - set_position (Gtk::WIN_POS_CENTER); //add_events(Gdk::BUTTON_RELEASE_MASK); set_resizable (true); diff --git a/rtgui/splash.h b/rtgui/splash.h index bc63cef91..6abfe91c7 100644 --- a/rtgui/splash.h +++ b/rtgui/splash.h @@ -19,13 +19,14 @@ #pragma once #include +#include "rtsurface.h" class SplashImage final : public Gtk::DrawingArea { private: - Cairo::RefPtr surface; + std::shared_ptr surface; Glib::RefPtr version; public: diff --git a/rtgui/spot.cc b/rtgui/spot.cc index 46e646945..ad5fab63e 100644 --- a/rtgui/spot.cc +++ b/rtgui/spot.cc @@ -60,18 +60,18 @@ Spot::Spot() : draggedSide(DraggedSide::NONE), lastObject(-1), activeSpot(-1), - sourceIcon("spot-normal.png", "spot-active.png", "spot-prelight.png", "", "", Geometry::DP_CENTERCENTER), + sourceIcon("spot-normal", "spot-active", "spot-prelight", "", "", 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"))); + edit->add (*Gtk::manage (new RTImage ("edit-point"))); 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->add (*Gtk::manage (new RTImage ("undo-small"))); reset->set_relief (Gtk::RELIEF_NONE); reset->set_border_width (0); reset->signal_clicked().connect ( sigc::mem_fun (*this, &Spot::resetPressed) ); @@ -85,7 +85,7 @@ Spot::Spot() : 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; @@ -346,12 +346,12 @@ void Spot::createGeometry () 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(); + std::shared_ptr normalImg = sourceIcon.getNormalImg(); + std::shared_ptr prelightImg = sourceIcon.getPrelightImg(); + std::shared_ptr 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::mouseOverGeometry.at (i) = EditSubscriber::visibleGeometry.at (j) = new OPIcon (normalImg, activeImg, prelightImg, nullptr, nullptr, Geometry::DP_CENTERCENTER); EditSubscriber::visibleGeometry.at (j)->setActive (true); EditSubscriber::visibleGeometry.at (j)->datum = Geometry::IMAGE; EditSubscriber::visibleGeometry.at (j)->state = Geometry::NORMAL; @@ -893,4 +893,7 @@ void Spot::tweakParams(procparams::ProcParams& pparams) pparams.gradient.enabled = false; pparams.pcvignette.enabled = false; pparams.colorappearance.enabled = false; + pparams.locallab.enabled = false; + // pparams.toneCurve.hrenabled = false; // not sure for this one, it could be useful for ExpComp w/o performance penalty + pparams.toneCurve.histmatching = false; } diff --git a/rtgui/thresholdadjuster.cc b/rtgui/thresholdadjuster.cc index 1f8b1c967..7f8aec508 100644 --- a/rtgui/thresholdadjuster.cc +++ b/rtgui/thresholdadjuster.cc @@ -99,7 +99,7 @@ void ThresholdAdjuster::initObject (Glib::ustring label, bool editedcb) hbox->pack_start (*this->label); reset = Gtk::manage (new Gtk::Button ()); - reset->add (*Gtk::manage (new RTImage ("undo-small.png", "redo-small.png"))); + reset->add (*Gtk::manage (new RTImage ("undo-small", Gtk::ICON_SIZE_BUTTON))); reset->set_relief (Gtk::RELIEF_NONE); reset->set_tooltip_markup (M("ADJUSTER_RESET_TO_DEFAULT")); diff --git a/rtgui/thresholdselector.cc b/rtgui/thresholdselector.cc index 61043525c..53c1b33af 100644 --- a/rtgui/thresholdselector.cc +++ b/rtgui/thresholdselector.cc @@ -148,7 +148,6 @@ void ThresholdSelector::initValues () set_name("ThresholdSelector"); set_can_focus(false); set_app_paintable(true); - setDirty(true); updateTooltip(); } @@ -167,7 +166,7 @@ void ThresholdSelector::get_preferred_height_vfunc (int &minimum_height, int &na void ThresholdSelector::get_preferred_width_vfunc (int &minimum_width, int &natural_width) const { - int s = RTScalable::getScale(); + const int s = RTScalable::scalePixelSize(1); Glib::RefPtr style = get_style_context(); Gtk::Border padding = getPadding(style); // already scaled int margins = padding.get_left() + padding.get_right(); @@ -177,7 +176,7 @@ void ThresholdSelector::get_preferred_width_vfunc (int &minimum_width, int &natu void ThresholdSelector::get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const { - int s = RTScalable::getScale(); + const int s = RTScalable::scalePixelSize(1); Glib::RefPtr style = get_style_context(); Gtk::Border padding = getPadding(style); // already scaled int margins = padding.get_left() + padding.get_right(); @@ -198,7 +197,7 @@ void ThresholdSelector::setPositions (double bottom, double top) setPositions(bottom, top, maxValBottom, maxValTop); if (updatePolicy == RTUP_DYNAMIC) { - setDirty(true); + queue_draw(); } } @@ -216,10 +215,6 @@ void ThresholdSelector::setPositions (double bottomLeft, double topLeft, double positions[TS_TOPRIGHT] = topRight; if (different) { - if (updatePolicy == RTUP_DYNAMIC) { - setDirty(true); - } - sig_val_changed.emit(); updateTooltip(); queue_draw (); @@ -246,75 +241,58 @@ void ThresholdSelector::setDefaults (double bottomLeft, double topLeft, double b void ThresholdSelector::on_realize() { - Gtk::DrawingArea::on_realize(); add_events(Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::LEAVE_NOTIFY_MASK); } -void ThresholdSelector::updateBackBuffer() +void ThresholdSelector::updateDrawingArea (const ::Cairo::RefPtr< Cairo::Context> &cr) { - - if (!get_realized() || !isDirty() || !get_allocated_width() || !get_allocated_height()) { + // on_realize has to be called before + if (!get_realized() || !get_allocated_width() || !get_allocated_height()) { return; } - // This will create or update the size of the BackBuffer::surface - setDrawRectangle(Cairo::FORMAT_ARGB32, 0, 0, get_allocated_width(), get_allocated_height(), true); + // Get border padding + const Glib::RefPtr style = get_style_context(); + Gtk::Border padding = getPadding(style); - if (!surface) { - return; - } - - Cairo::RefPtr cr = Cairo::Context::create(surface); - Glib::RefPtr style = get_style_context(); - Gtk::Border padding = getPadding(style); // already scaled - - cr->set_source_rgba (0., 0., 0., 0.); - cr->set_operator (Cairo::OPERATOR_CLEAR); - cr->paint (); + // Setup drawing cr->set_operator (Cairo::OPERATOR_OVER); - double s = (double)RTScalable::getScale(); + // Get widget size + const int w = get_allocated_width (); + const int h = get_allocated_height (); - double positions01[4]; - int w = get_allocated_width (); - int h = get_allocated_height (); + // Compute slider parameters + const double wslider = sliderWidth; // constant must be an odd value + const double hwslider = wslider / 2.; + const double verticalSliderPadding = std::floor((static_cast(h) - static_cast(padding.get_top()) - static_cast(padding.get_bottom())) * verticalSliderPaddingFactor + 0.5); + // Get threshold selector positions + const double positions01[4] = {to01(TS_BOTTOMLEFT), to01(TS_TOPLEFT), to01(TS_BOTTOMRIGHT), to01(TS_TOPRIGHT)}; - double wslider = sliderWidth * s; // constant must be an odd value - double hwslider = wslider / 2.; - double verticalSliderPadding = std::floor(((double)h - (double)padding.get_top() - (double)padding.get_bottom()) * verticalSliderPaddingFactor + 0.5); + // Compute internal background position and size + const double innerBarX = static_cast(padding.get_left()) + hwslider - 0.5; + const double innerBarY = verticalSliderPadding + 1. + static_cast(padding.get_top()); + const double innerBarW = static_cast(w) - innerBarX - static_cast(padding.get_right()) - hwslider - 0.5; + const double innerBarH = static_cast(h) - innerBarY - verticalSliderPadding - 1. - static_cast(padding.get_bottom()); - positions01[TS_BOTTOMLEFT] = to01(TS_BOTTOMLEFT); - positions01[TS_TOPLEFT] = to01(TS_TOPLEFT); - positions01[TS_BOTTOMRIGHT] = to01(TS_BOTTOMRIGHT); - positions01[TS_TOPRIGHT] = to01(TS_TOPRIGHT); - - double innerBarX = (double)padding.get_left() + hwslider - 0.5 * s; - double innerBarY = verticalSliderPadding + 1. * s + (double)padding.get_top(); - double innerBarW = (double)w - innerBarX - (double)padding.get_right() - hwslider - 0.5 * s; - double innerBarH = (double)h - innerBarY - verticalSliderPadding - 1. * s - (double)padding.get_bottom(); + // Render background (style one or colored bar one) if (is_sensitive() && coloredBar.canGetColors()) { - if (updatePolicy == RTUP_DYNAMIC) { - coloredBar.setDirty(true); - } - // this will eventually create/update the off-screen Surface for the gradient area only ! - coloredBar.setDrawRectangle(innerBarX, innerBarY, innerBarW, innerBarH); - // that we're displaying here - coloredBar.expose(*this, cr); + coloredBar.setColoredBarSize(innerBarX, innerBarY, innerBarW, innerBarH); + coloredBar.updateColoredBar(cr); } else { style->render_background(cr, innerBarX, innerBarY, innerBarW, innerBarH); } - // draw curve - - double yStart = innerBarY + innerBarH - 1. * s; - double yEnd = innerBarY + 1. * s; - double xStart = innerBarX; - double xEnd = innerBarX + innerBarW; - double iw = xEnd - xStart; - double ih = yEnd - yStart; + // Render curve + const double yStart = innerBarY + innerBarH - 1.; + const double yEnd = innerBarY + 1.; + const double xStart = innerBarX; + const double xEnd = innerBarX + innerBarW; + const double iw = xEnd - xStart; + const double ih = yEnd - yStart; if (bgCurveProvider) { @@ -390,26 +368,27 @@ void ThresholdSelector::updateBackBuffer() cr->set_line_cap(Cairo::LINE_CAP_BUTT); cr->set_line_join(Cairo::LINE_JOIN_BEVEL); + // Render surrounding curve (black) if (is_sensitive()) { - // draw surrounding curve (black) + cr->set_source_rgb (0., 0., 0.); - cr->set_line_width (4. * s); + cr->set_line_width (4.); cr->stroke_preserve(); } - // draw inner curve (white) + // Render inner curve (white) if (is_sensitive()) { cr->set_source_rgb (1., 1., 1.); } else { cr->set_source_rgba (0., 0., 0., 0.5); } - cr->set_line_width (2. * s); + cr->set_line_width (2.); cr->stroke (); - // draw the box's borders - style->render_frame(cr, innerBarX - 1. * s, innerBarY - 1. * s, innerBarW + 2. * s, innerBarH + 2. * s); + // Render the box's borders + style->render_frame(cr, innerBarX - 1., innerBarY - 1., innerBarW + 2., innerBarH + 2.); - // draw sliders + // Render sliders Gtk::StateFlags currState = style->get_state(); cr->set_antialias(Cairo::ANTIALIAS_SUBPIXEL); @@ -426,9 +405,9 @@ void ThresholdSelector::updateBackBuffer() style->set_state(Gtk::STATE_FLAG_NORMAL); } - double posX = xStart + iw * positions01[i]; - double arrowY = i == 0 || i == 2 ? yStart - 3. * s : yEnd + 3. * s; - double baseY = i == 0 || i == 2 ? (double)h - (double)padding.get_bottom() - 0.5 * s : (double)padding.get_top() + 0.5 * s; + const double posX = xStart + iw * positions01[i]; + const double arrowY = i == 0 || i == 2 ? yStart - 3. : yEnd + 3.; + const double baseY = i == 0 || i == 2 ? static_cast(h) - static_cast(padding.get_bottom()) - 0.5 : static_cast(padding.get_top()) + 0.5; style->render_slider(cr, posX - hwslider, i == 0 || i == 2 ? arrowY : baseY, wslider, i == 0 || i == 2 ? baseY - arrowY : arrowY - baseY, Gtk::ORIENTATION_HORIZONTAL); } @@ -438,17 +417,9 @@ void ThresholdSelector::updateBackBuffer() bool ThresholdSelector::on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) { - - // on_realize & updateBackBuffer have to be called before - if (get_realized() && get_allocated_width() && get_allocated_height()) { - if (isDirty()) { - updateBackBuffer(); - } - - if (surface) { - copySurface(cr); - } - } + // Draw drawing area + // Note: As drawing area surface is updated inside on_draw function, hidpi is automatically supported + updateDrawingArea(cr); return true; } @@ -494,21 +465,19 @@ bool ThresholdSelector::on_leave_notify_event (GdkEventCrossing* event) bool ThresholdSelector::on_motion_notify_event (GdkEventMotion* event) { + const int w = get_allocated_width (); + const Glib::RefPtr style = get_style_context(); + const Gtk::Border padding = getPadding(style); - int w = get_allocated_width (); - Glib::RefPtr style = get_style_context(); - Gtk::Border padding = getPadding(style); // already scaled + const double wslider = sliderWidth; // constant must be an odd value + const double hwslider = wslider / 2.; - double s = (double)RTScalable::getScale(); - double wslider = sliderWidth * s; // constant must be an odd value - double hwslider = wslider / 2.; + const double innerBarX = static_cast(padding.get_left()) + hwslider - 0.5; + const double innerBarW = static_cast(w) - innerBarX - static_cast(padding.get_right()) - hwslider - 0.5; - double innerBarX = (double)padding.get_left() + hwslider - 0.5 * s; - double innerBarW = (double)w - innerBarX - (double)padding.get_right() - hwslider - 0.5 * s; - - double xStart = innerBarX + 0.5 * s; - double xEnd = innerBarX + innerBarW - 0.5 * s; - double iw = xEnd - xStart; + const double xStart = innerBarX + 0.5; + const double xEnd = innerBarX + innerBarW - 0.5; + const double iw = xEnd - xStart; findLitCursor(event->x, event->y); @@ -556,11 +525,6 @@ bool ThresholdSelector::on_motion_notify_event (GdkEventMotion* event) // set the new reference value for the next move tmpX = event->x; - // ask to redraw the background - if (updatePolicy == RTUP_DYNAMIC) { - setDirty(true); - } - // update the tooltip updateTooltip(); @@ -581,27 +545,26 @@ bool ThresholdSelector::on_motion_notify_event (GdkEventMotion* event) void ThresholdSelector::findLitCursor(int posX, int posY) { - int w = get_allocated_width (); - int h = get_allocated_height (); - Glib::RefPtr style = get_style_context(); - Gtk::Border padding = getPadding(style); // already scaled + const int w = get_allocated_width (); + const int h = get_allocated_height (); + const Glib::RefPtr style = get_style_context(); + const Gtk::Border padding = getPadding(style); - double s = (double)RTScalable::getScale(); - double wslider = sliderWidth * s; // constant must be an odd value - double hwslider = wslider / 2.; + const double wslider = sliderWidth; // constant must be an odd value + const double hwslider = wslider / 2.; - double innerBarX = (double)padding.get_left() + hwslider - 0.5 * s; - double innerBarW = (double)w - innerBarX - (double)padding.get_right() - hwslider - 0.5 * s; + const double innerBarX = static_cast(padding.get_left()) + hwslider - 0.5; + const double innerBarW = static_cast(w) - innerBarX - static_cast(padding.get_right()) - hwslider - 0.5; litCursor = TS_UNDEFINED; if (posY >= 0 && posY <= h / 2) { - if (posX >= (int)(innerBarX - hwslider) && posX <= (int)(innerBarX + innerBarW + hwslider)) { + if (posX >= static_cast(innerBarX - hwslider) && posX <= static_cast(innerBarX + innerBarW + hwslider)) { litCursor = TS_TOPLEFT; if (doubleThresh) { // we use minValTop since if this block is executed, it means that we are in a simple Threshold where both bottom and top range are the same - double cursorX = ((double)posX - innerBarX) * (maxValTop - minValTop) / innerBarW + minValTop; + const double cursorX = (static_cast(posX) - innerBarX) * (maxValTop - minValTop) / innerBarW + minValTop; if (cursorX > positions[TS_TOPRIGHT] || std::fabs(cursorX - positions[TS_TOPRIGHT]) < std::fabs(cursorX - positions[TS_TOPLEFT])) { litCursor = TS_TOPRIGHT; @@ -609,12 +572,12 @@ void ThresholdSelector::findLitCursor(int posX, int posY) } } } else if (posY > h / 2 && posY < h) { - if (posX >= (int)(innerBarX - hwslider) && posX <= (int)(innerBarX + innerBarW + hwslider)) { + if (posX >= static_cast(innerBarX - hwslider) && posX <= static_cast(innerBarX + innerBarW + hwslider)) { litCursor = TS_BOTTOMLEFT; if (doubleThresh) { // we use minValTop since if this block is executed, it means that we are in a simple Threshold where both bottom and top range are the same - double cursorX = ((double)posX - innerBarX) * (maxValTop - minValTop) / innerBarW + minValTop; + double cursorX = (static_cast(posX) - innerBarX) * (maxValTop - minValTop) / innerBarW + minValTop; if (cursorX > positions[TS_BOTTOMRIGHT] || std::fabs(cursorX - positions[TS_BOTTOMRIGHT]) < std::fabs(cursorX - positions[TS_BOTTOMLEFT])) { litCursor = TS_BOTTOMRIGHT; @@ -728,10 +691,6 @@ void ThresholdSelector::reset () positions[2] = defPos[2]; positions[3] = defPos[3]; - if (updatePolicy == RTUP_DYNAMIC) { - setDirty(true); - } - updateTooltip(); queue_draw (); } diff --git a/rtgui/thresholdselector.h b/rtgui/thresholdselector.h index bf1d7c952..55ccce758 100644 --- a/rtgui/thresholdselector.h +++ b/rtgui/thresholdselector.h @@ -21,7 +21,6 @@ #include #include "coloredbar.h" -#include "guiutils.h" #include "../rtengine/procparams.h" @@ -61,7 +60,7 @@ public: * have to provide through the ThresholdCurveProvider interface * */ -class ThresholdSelector : public Gtk::DrawingArea, public BackBuffer +class ThresholdSelector : public Gtk::DrawingArea { public: @@ -109,16 +108,20 @@ protected: void findSecondaryMovedCursor(guint state); void findBoundaries(double &min, double &max); double to01(ThreshCursorId cursorId); + + // Internal drawing functions void updateTooltip(); - void updateBackBuffer(); + void updateDrawingArea (const ::Cairo::RefPtr< Cairo::Context> &cr); + + // GtkDrawingArea override functions + void on_realize () override; + 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 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; bool on_button_release_event (GdkEventButton* event) override; bool on_motion_notify_event (GdkEventMotion* event) override; diff --git a/rtgui/thumbbrowserbase.cc b/rtgui/thumbbrowserbase.cc index f697d6648..f873c719d 100644 --- a/rtgui/thumbbrowserbase.cc +++ b/rtgui/thumbbrowserbase.cc @@ -34,7 +34,7 @@ ThumbBrowserBase::ThumbBrowserBase () { inW = -1; inH = -1; - + hscroll.set_orientation(Gtk::ORIENTATION_HORIZONTAL); vscroll.set_orientation(Gtk::ORIENTATION_VERTICAL); @@ -1031,14 +1031,14 @@ Gtk::SizeRequestMode ThumbBrowserBase::Internal::get_request_mode_vfunc () const void ThumbBrowserBase::Internal::get_preferred_height_vfunc (int &minimum_height, int &natural_height) const { - minimum_height = 20 * RTScalable::getScale(); - natural_height = 80 * RTScalable::getScale(); + minimum_height = RTScalable::scalePixelSize(20); + natural_height = RTScalable::scalePixelSize(80); } void ThumbBrowserBase::Internal::get_preferred_width_vfunc (int &minimum_width, int &natural_width) const { - minimum_width = 200 * RTScalable::getScale(); - natural_width = 1000 * RTScalable::getScale(); + minimum_width = RTScalable::scalePixelSize(200); + natural_width = RTScalable::scalePixelSize(1000); } void ThumbBrowserBase::Internal::get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const diff --git a/rtgui/thumbbrowserentrybase.cc b/rtgui/thumbbrowserentrybase.cc index 3d1e6bdc4..2f9fb4b47 100644 --- a/rtgui/thumbbrowserentrybase.cc +++ b/rtgui/thumbbrowserentrybase.cc @@ -21,6 +21,7 @@ #include "options.h" #include "thumbbrowserbase.h" #include "../rtengine/rt_math.h" +#include "rtsurface.h" namespace { @@ -285,10 +286,10 @@ void ThumbBrowserEntryBase::updateBackBuffer () int iheight = 0; for (size_t i = 0; i < bbIcons.size(); i++) { - iwidth += bbIcons[i]->get_width() + (i > 0 ? igap : 0); + iwidth += bbIcons[i]->getWidth() + (i > 0 ? igap : 0); - if (bbIcons[i]->get_height() > iheight) { - iheight = bbIcons[i]->get_height(); + if (bbIcons[i]->getHeight() > iheight) { + iheight = bbIcons[i]->getHeight(); } } @@ -311,10 +312,10 @@ void ThumbBrowserEntryBase::updateBackBuffer () for (size_t i = 0; i < bbIcons.size(); i++) { // Draw the image at 110, 90, except for the outermost 10 pixels. - Gdk::Cairo::set_source_pixbuf(cc, bbIcons[i], istartx, istarty); - cc->rectangle(istartx, istarty, bbIcons[i]->get_width(), bbIcons[i]->get_height()); + cc->set_source(bbIcons[i]->get(), istartx, istarty); + cc->rectangle(istartx, istarty, bbIcons[i]->getWidth(), bbIcons[i]->getHeight()); cc->fill(); - istartx += bbIcons[i]->get_width() + igap; + istartx += bbIcons[i]->getWidth() + igap; } } @@ -324,9 +325,9 @@ void ThumbBrowserEntryBase::updateBackBuffer () int istarty2 = prey + preh - igap - 1; for (size_t i = 0; i < bbSpecificityIcons.size(); ++i) { - istartx2 -= bbSpecificityIcons[i]->get_width() - igap; - Gdk::Cairo::set_source_pixbuf(cc, bbSpecificityIcons[i], istartx2, istarty2 - bbSpecificityIcons[i]->get_height()); - cc->rectangle(istartx2, istarty2 - bbSpecificityIcons[i]->get_height(), bbSpecificityIcons[i]->get_width(), bbSpecificityIcons[i]->get_height()); + istartx2 -= bbSpecificityIcons[i]->getWidth() - igap; + cc->set_source(bbSpecificityIcons[i]->get(), istartx2, istarty2 - bbSpecificityIcons[i]->getHeight()); + cc->rectangle(istartx2, istarty2 - bbSpecificityIcons[i]->getHeight(), bbSpecificityIcons[i]->getWidth(), bbSpecificityIcons[i]->getHeight()); cc->fill(); } } @@ -375,7 +376,7 @@ void ThumbBrowserEntryBase::updateBackBuffer () // draw file name Glib::RefPtr context = w->get_pango_context () ; - Pango::FontDescription fontd = context->get_font_description (); + Pango::FontDescription fontd = w->get_style_context()->get_font(); fontd.set_weight (Pango::WEIGHT_BOLD); if (italicstyle) { @@ -441,7 +442,7 @@ void ThumbBrowserEntryBase::getTextSizes (int& infow, int& infoh) // filename: - Pango::FontDescription fontd = context->get_font_description (); + Pango::FontDescription fontd = w->get_style_context()->get_font(); fontd.set_weight (Pango::WEIGHT_BOLD); context->set_font_description (fontd); Glib::RefPtr fn = w->create_pango_layout(dispname); @@ -695,14 +696,14 @@ bool ThumbBrowserEntryBase::insideWindow (int x, int y, int w, int h) const return !(ofsX + startx > x + w || ofsX + startx + exp_width < x || ofsY + starty > y + h || ofsY + starty + exp_height < y); } -std::vector> ThumbBrowserEntryBase::getIconsOnImageArea() +std::vector> ThumbBrowserEntryBase::getIconsOnImageArea() { - return std::vector >(); + return std::vector>(); } -std::vector > ThumbBrowserEntryBase::getSpecificityIconsOnImageArea() +std::vector> ThumbBrowserEntryBase::getSpecificityIconsOnImageArea() { - return std::vector >(); + return std::vector>(); } bool ThumbBrowserEntryBase::motionNotify (int x, int y) diff --git a/rtgui/thumbbrowserentrybase.h b/rtgui/thumbbrowserentrybase.h index 3db03a96e..41d33382d 100644 --- a/rtgui/thumbbrowserentrybase.h +++ b/rtgui/thumbbrowserentrybase.h @@ -33,6 +33,7 @@ class Thumbnail; class ThumbBrowserBase; +class RTSurface; class ThumbBrowserEntryBase { @@ -85,8 +86,8 @@ protected: Glib::RefPtr backBuffer; bool bbSelected, bbFramed; guint8* bbPreview; - std::vector> bbIcons; - std::vector> bbSpecificityIcons; + std::vector> bbIcons; + std::vector> bbSpecificityIcons; CursorShape cursor_type; void drawFrame (Cairo::RefPtr cr, const Gdk::RGBA& bg, const Gdk::RGBA& fg); @@ -211,8 +212,8 @@ public: virtual void drawProgressBar (Glib::RefPtr win, const Gdk::RGBA& foregr, const Gdk::RGBA& backgr, int x, int w, int y, int h) {} - virtual std::vector> getIconsOnImageArea (); - virtual std::vector> getSpecificityIconsOnImageArea (); + virtual std::vector> getIconsOnImageArea (); + virtual std::vector> getSpecificityIconsOnImageArea (); virtual void getIconSize (int& w, int& h) const = 0; virtual bool motionNotify (int x, int y); diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index 266dbacd3..f5098ae6d 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -105,6 +105,46 @@ bool CPBDump( return true; } +struct ColorMapper { + std::map indexLabelMap; + std::map labelIndexMap; + + ColorMapper(std::map colors) { + for (const auto& color: colors) { + indexLabelMap.insert({color.first, color.second}); + labelIndexMap.insert({color.second, color.first}); + } + } + + int index(const std::string &label) const + { + auto it = labelIndexMap.find(label); + if (it != labelIndexMap.end()) { + return it->second; + } + return 0; + } + + std::string label(int index) const + { + auto it = indexLabelMap.find(index); + if (it != indexLabelMap.end()) { + return it->second; + } + return ""; + } +}; + +const std::map defaultColors = { + {1, "Red"}, + {2, "Yellow"}, + {3, "Green"}, + {4, "Blue"}, + {5, "Purple"} +}; + +auto defaultColorMapper = ColorMapper(defaultColors); + } // namespace using namespace rtengine::procparams; @@ -133,7 +173,7 @@ Thumbnail::Thumbnail(CacheManager* cm, const Glib::ustring& fname, CacheImageDat generateExifDateTimeStrings (); if (cfs.rankOld >= 0) { - // rank and inTrash were found in cache (old style), move them over to pparams + // rank and inTrash were found in cache (old style), move them over to pparams or xmp sidecar // try to load the last saved parameters from the cache or from the paramfile file createProcParamsForUpdate(false, false); // this can execute customprofilebuilder to generate param file @@ -141,9 +181,11 @@ Thumbnail::Thumbnail(CacheManager* cm, const Glib::ustring& fname, CacheImageDat // TODO? should we call notifylisterners_procParamsChanged here? setRank(cfs.rankOld); - setStage(cfs.inTrashOld); + setTrashed(cfs.inTrashOld); } + loadProperties(); + delete tpp; tpp = nullptr; } @@ -173,6 +215,8 @@ Thumbnail::Thumbnail(CacheManager* cm, const Glib::ustring& fname, const std::st initial_ = false; + loadProperties(); + delete tpp; tpp = nullptr; } @@ -182,13 +226,12 @@ Glib::ustring Thumbnail::xmpSidecarPath(const Glib::ustring &imagePath) return rtengine::Exiv2Metadata::xmpSidecarPath(imagePath); } -void Thumbnail::_generateThumbnailImage () +void Thumbnail::_generateThumbnailImage() { - // delete everything loaded into memory delete tpp; tpp = nullptr; - delete [] lastImg; + delete[] lastImg; lastImg = nullptr; tw = options.maxThumbnailWidth; th = options.maxThumbnailHeight; @@ -205,27 +248,15 @@ void Thumbnail::_generateThumbnailImage () cfs.exifValid = false; cfs.timeValid = false; - if (ext == "jpg" || ext == "jpeg") { - infoFromImage (fname); - tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal, pparams->wb.observer); + // this will load formats supported by imagio (jpg, png, jxl, and tiff) + 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, pparams->wb.observer); + if (tpp) { + cfs.format = FT_Custom; + infoFromImage(fname); + } - 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, pparams->wb.observer); - - if (tpp) { - cfs.format = FT_Tiff; - } - } else { + if (!tpp) { // RAW works like this: // 1. if we are here it's because we aren't in the cache so load the JPG // image out of the RAW. Mark as "quick". @@ -233,21 +264,24 @@ void Thumbnail::_generateThumbnailImage () bool quick = false; rtengine::eSensorType sensorType = rtengine::ST_NONE; - if ( initial_ && options.internalThumbIfUntouched) { + + if (initial_ && options.internalThumbIfUntouched) { quick = true; - tpp = rtengine::Thumbnail::loadQuickFromRaw (fname, sensorType, tw, th, 1, TRUE); + tpp = rtengine::Thumbnail::loadQuickFromRaw(fname, sensorType, tw, th, 1, TRUE); } - if ( tpp == nullptr ) { + if (!tpp) { quick = false; - tpp = rtengine::Thumbnail::loadFromRaw (fname, sensorType, tw, th, 1, pparams->wb.equal, pparams->wb.observer, TRUE, &(pparams->raw)); + tpp = rtengine::Thumbnail::loadFromRaw(fname, sensorType, tw, th, 1, pparams->wb.equal, pparams->wb.observer, TRUE, &(pparams->raw)); } cfs.sensortype = sensorType; + if (tpp) { cfs.format = FT_Raw; cfs.thumbImgType = quick ? CacheImageData::QUICK_THUMBNAIL : CacheImageData::FULL_THUMBNAIL; - infoFromImage (fname); + infoFromImage(fname); + if (!quick) { cfs.width = tpp->full_width; cfs.height = tpp->full_height; @@ -257,12 +291,12 @@ void Thumbnail::_generateThumbnailImage () if (tpp) { tpp->getAutoWBMultipliers(cfs.redAWBMul, cfs.greenAWBMul, cfs.blueAWBMul); - _saveThumbnail (); + _saveThumbnail(); cfs.supported = true; - cfs.save (getCacheFileName ("data", ".txt")); + cfs.save(getCacheFileName("data", ".txt")); - generateExifDateTimeStrings (); + generateExifDateTimeStrings(); } } @@ -306,7 +340,7 @@ const ProcParams& Thumbnail::getProcParamsU () * @param returnParams Ask to return a pointer to a ProcParams object if true * @param force True if the profile has to be re-generated even if it already exists * @param flaggingMode True if the ProcParams will be created because the file browser is being flagging an image - * (rang, to trash, color labels). This parameter is passed to the CPB. + * (rank, to trash, color labels). This parameter is passed to the CPB. * * @return Return a pointer to a ProcPamas structure to be updated if returnParams is true and if everything went fine, NULL otherwise. */ @@ -441,12 +475,6 @@ void Thumbnail::clearProcParams (int whoClearedIt) { MyMutex::MyLock lock(mutex); - // preserve rank, colorlabel and inTrash across clear - int rank = getRank(); - int colorlabel = getColorLabel(); - int inTrash = getStage(); - - cfs.recentlySaved = false; pparamsValid = false; @@ -456,13 +484,10 @@ void Thumbnail::clearProcParams (int whoClearedIt) // reset the params to defaults pparams->setDefaults(); - // and restore rank and inTrash - setRank(rank); - pparamsValid = cfs.rating != rank; - setColorLabel(colorlabel); - setStage(inTrash); + // preserve rank, colorlabel and inTrash across clear + updateProcParamsProperties(); - // params could get validated by rank/inTrash values restored above + // params could get validated by updateProcParamsProperties if (pparamsValid) { updateCache(); } else { @@ -560,11 +585,6 @@ void Thumbnail::setProcParams (const ProcParams& pp, ParamsEdited* pe, int whoCh return; } - // do not update rank, colorlabel and inTrash - const int rank = getRank(); - const int colorlabel = getColorLabel(); - const int inTrash = getStage(); - if (pe) { pe->combine(*pparams, pp, true); } else { @@ -573,9 +593,8 @@ void Thumbnail::setProcParams (const ProcParams& pp, ParamsEdited* pe, int whoCh pparamsValid = true; - setRank(rank); - setColorLabel(colorlabel); - setStage(inTrash); + // do not update rank, colorlabel and inTrash + updateProcParamsProperties(); if (updateCacheNow) { updateCache(); @@ -732,10 +751,10 @@ rtengine::IImage8* Thumbnail::processThumbImage (const rtengine::procparams::Pro MyMutex::MyLock lock(mutex); - if ( tpp == nullptr ) { + if (!tpp) { _loadThumbnail(); - if ( tpp == nullptr ) { + if (!tpp) { return nullptr; } } @@ -769,7 +788,7 @@ rtengine::IImage8* Thumbnail::upgradeThumbImage (const rtengine::procparams::Pro _generateThumbnailImage(); - if ( tpp == nullptr ) { + if (!tpp) { return nullptr; } @@ -975,7 +994,7 @@ void Thumbnail::_loadThumbnail(bool firstTrial) _loadThumbnail (false); } - if (tpp == nullptr) { + if (!tpp) { return; } } else if (!succ) { @@ -1045,6 +1064,7 @@ void Thumbnail::saveThumbnail () */ void Thumbnail::updateCache (bool updatePParams, bool updateCacheImageData) { + updateProcParamsProperties(); if (updatePParams && pparamsValid) { pparams->save ( @@ -1061,6 +1081,8 @@ void Thumbnail::updateCache (bool updatePParams, bool updateCacheImageData) if (updatePParams && pparamsValid) { saveMetadata(); } + + saveXMPSidecarProperties(); } Thumbnail::~Thumbnail () @@ -1084,48 +1106,34 @@ void Thumbnail::setFileName (const Glib::ustring &fn) cfs.md5 = ::getMD5 (fname); } -int Thumbnail::getRank () const +int Thumbnail::getRank() const { - // prefer the user-set rank over the embedded Rating - // pparams->rank == -1 means that there is no saved rank yet, so we should - // next look for the embedded Rating metadata. - if (pparams->rank != -1) { - return pparams->rank; - } else { - return cfs.rating; - } + return properties.rank; } -void Thumbnail::setRank (int rank) +void Thumbnail::setRank(int rank) { - pparams->rank = rank; - pparamsValid = true; + properties.rank = rank; } -int Thumbnail::getColorLabel () const +int Thumbnail::getColorLabel() const { - return pparams->colorlabel; + return properties.color; } -void Thumbnail::setColorLabel (int colorlabel) +void Thumbnail::setColorLabel(int colorlabel) { - if (pparams->colorlabel != colorlabel) { - pparams->colorlabel = colorlabel; - pparamsValid = true; - } + properties.color = colorlabel; } -int Thumbnail::getStage () const +bool Thumbnail::getTrashed() const { - return pparams->inTrash; + return properties.trashed; } -void Thumbnail::setStage (bool stage) +void Thumbnail::setTrashed(bool trashed) { - if (pparams->inTrash != stage) { - pparams->inTrash = stage; - pparamsValid = true; - } + properties.trashed = trashed; } void Thumbnail::addThumbnailListener (ThumbnailListener* tnl) @@ -1239,6 +1247,107 @@ void Thumbnail::getCamWB(double& temp, double& green, rtengine::StandardObserver } } +void Thumbnail::loadProperties() +{ + properties = Properties(); + + // get initial rank from cache or image metadata + if (cfs.exifValid) { + properties.rank.value = rtengine::LIM(cfs.getRating(), 0, 5); + } else { + const std::unique_ptr md(rtengine::FramesMetaData::fromFile(fname)); + if (md && md->hasExif()) { + properties.rank.value = rtengine::LIM(md->getRating(), 0, 5); + } + } + + // update rank and color from procparams or xmp sidecar + // load trash from procparams + if (pparamsValid) { + if (options.thumbnailRankColorMode == Options::ThumbnailPropertyMode::PROCPARAMS) { + if (pparams->rank >= 0) { + properties.rank.value = pparams->rank; + } + } + + properties.trashed.value = pparams->inTrash; + properties.color.value = pparams->colorlabel; + } + + if (options.thumbnailRankColorMode == Options::ThumbnailPropertyMode::XMP) { + try { + auto xmp = rtengine::Exiv2Metadata::getXmpSidecar(fname); + auto pos = xmp.findKey(Exiv2::XmpKey("Xmp.xmp.Rating")); + if (pos != xmp.end()) { + int r = rtengine::to_long(pos); + properties.rank.value = rtengine::LIM(r, 0, 5); + } + + pos = xmp.findKey(Exiv2::XmpKey("Xmp.xmp.Label")); + if (pos != xmp.end()) { + properties.color.value = defaultColorMapper.index(pos->toString()); + } + } catch (std::exception &exc) { + std::cerr << "ERROR loading thumbnail properties data from " + << rtengine::Exiv2Metadata::xmpSidecarPath(fname) + << ": " << exc.what() << std::endl; + } + } +} + +void Thumbnail::updateProcParamsProperties() +{ + if (!properties.edited()) { + return; + } + + if (properties.trashed.edited && properties.trashed != pparams->inTrash) { + pparams->inTrash = properties.trashed; + pparamsValid = true; + } + + // save procparams rank and color also when options.thumbnailRankColorMode == Options::ThumbnailPropertyMode::XMP + // so they'll be kept in sync + if (properties.rank.edited && properties.rank != pparams->rank) { + pparams->rank = properties.rank; + pparamsValid = true; + } + + if (properties.color.edited && properties.color != pparams->colorlabel) { + pparams->colorlabel = properties.color; + pparamsValid = true; + } +} + +void Thumbnail::saveXMPSidecarProperties() +{ + if (!properties.edited()) { + return; + } + + if (options.thumbnailRankColorMode != Options::ThumbnailPropertyMode::XMP) { + return; + } + + auto fn = rtengine::Exiv2Metadata::xmpSidecarPath(fname); + try { + auto xmp = rtengine::Exiv2Metadata::getXmpSidecar(fname); + if (properties.rank.edited) { + xmp["Xmp.xmp.Rating"] = std::to_string(properties.rank); + } + if (properties.color.edited) { + xmp["Xmp.xmp.Label"] = defaultColorMapper.label(properties.color); + } + + rtengine::Exiv2Metadata meta; + meta.xmpData() = std::move(xmp); + meta.saveToXmp(fn); + } catch (std::exception &exc) { + std::cerr << "ERROR saving thumbnail properties data to " << fn + << ": " << exc.what() << std::endl; + } +} + void Thumbnail::saveMetadata() { if (options.rtSettings.metadata_xmp_sync != rtengine::Settings::MetadataXmpSync::READ_WRITE) { diff --git a/rtgui/thumbnail.h b/rtgui/thumbnail.h index 82c4f4738..c1e52760c 100644 --- a/rtgui/thumbnail.h +++ b/rtgui/thumbnail.h @@ -78,6 +78,30 @@ class Thumbnail bool initial_; + // Properties holds values and edited states for rank, color and trashed + struct Properties { + template struct Property { + T value; + bool edited; + Property(T v): value(v), edited(false) {} + Property& operator=(T v) + { + value = v; + edited = true; + return *this; + } + operator T() const { return value; } + }; + Property rank; + Property color; + Property trashed; + + explicit Properties(int r=0, int c=0, bool t=false): + rank(r), color(c), trashed(t) {} + bool edited() const { return rank.edited || color.edited || trashed.edited; } + }; + Properties properties; + // vector of listeners std::vector listeners; @@ -90,6 +114,9 @@ class Thumbnail Glib::ustring getCacheFileName (const Glib::ustring& subdir, const Glib::ustring& fext) const; void saveMetadata(); + void loadProperties(); + void updateProcParamsProperties(); + void saveXMPSidecarProperties(); public: Thumbnail (CacheManager* cm, const Glib::ustring& fname, CacheImageData* cf); @@ -155,8 +182,8 @@ public: int getColorLabel () const; void setColorLabel (int colorlabel); - int getStage () const; - void setStage (bool stage); + bool getTrashed () const; + void setTrashed (bool trashed); void addThumbnailListener (ThumbnailListener* tnl); void removeThumbnailListener (ThumbnailListener* tnl); diff --git a/rtgui/toneequalizer.cc b/rtgui/toneequalizer.cc index d524bdc05..34c1c8a4e 100644 --- a/rtgui/toneequalizer.cc +++ b/rtgui/toneequalizer.cc @@ -44,7 +44,7 @@ ToneEqualizer::ToneEqualizer(): FoldableToolPanel(this, TOOL_NAME, M("TP_TONE_EQ "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] = 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")))); bands[i]->setAdjusterListener(this); pack_start(*bands[i]); bands[i]->showIcons(false); diff --git a/rtgui/toolbar.cc b/rtgui/toolbar.cc index 5cdfc2787..158d2518d 100644 --- a/rtgui/toolbar.cc +++ b/rtgui/toolbar.cc @@ -27,9 +27,8 @@ ToolBar::ToolBar () : showColPickers(true), listener (nullptr), pickerListener(n { editingMode = false; - - handimg.reset(new RTImage("hand-open.png")); - editinghandimg.reset(new RTImage("crosshair-adjust.png")); + handimg.reset(new RTImage("hand-open", Gtk::ICON_SIZE_LARGE_TOOLBAR)); + editinghandimg.reset(new RTImage("crosshair-adjust", Gtk::ICON_SIZE_LARGE_TOOLBAR)); handTool = Gtk::manage (new Gtk::ToggleButton ()); handTool->add (*handimg); @@ -40,7 +39,7 @@ ToolBar::ToolBar () : showColPickers(true), listener (nullptr), pickerListener(n pack_start (*handTool); wbTool = Gtk::manage (new Gtk::ToggleButton ()); - Gtk::Image* wbimg = Gtk::manage (new RTImage ("color-picker.png")); + Gtk::Image* wbimg = Gtk::manage (new RTImage ("color-picker", Gtk::ICON_SIZE_LARGE_TOOLBAR)); wbTool->add (*wbimg); wbimg->show (); wbTool->set_relief(Gtk::RELIEF_NONE); @@ -48,8 +47,8 @@ ToolBar::ToolBar () : showColPickers(true), listener (nullptr), pickerListener(n pack_start (*wbTool); - showcolpickersimg.reset(new RTImage("color-picker-bars.png")); - hidecolpickersimg.reset(new RTImage("color-picker-hide.png")); + showcolpickersimg.reset(new RTImage("color-picker-bars", Gtk::ICON_SIZE_LARGE_TOOLBAR)); + hidecolpickersimg.reset(new RTImage("color-picker-hide", Gtk::ICON_SIZE_LARGE_TOOLBAR)); colPickerTool = Gtk::manage (new Gtk::ToggleButton ()); colPickerTool->add (*showcolpickersimg); @@ -60,7 +59,7 @@ ToolBar::ToolBar () : showColPickers(true), listener (nullptr), pickerListener(n pack_start (*colPickerTool); cropTool = Gtk::manage (new Gtk::ToggleButton ()); - Gtk::Image* cropimg = Gtk::manage (new RTImage ("crop.png")); + Gtk::Image* cropimg = Gtk::manage (new RTImage ("crop", Gtk::ICON_SIZE_LARGE_TOOLBAR)); cropTool->add (*cropimg); cropimg->show (); cropTool->set_relief(Gtk::RELIEF_NONE); @@ -69,7 +68,7 @@ ToolBar::ToolBar () : showColPickers(true), listener (nullptr), pickerListener(n pack_start (*cropTool); straTool = Gtk::manage (new Gtk::ToggleButton ()); - Gtk::Image* straimg = Gtk::manage (new RTImage ("rotate-straighten.png")); + Gtk::Image* straimg = Gtk::manage (new RTImage ("rotate-straighten", Gtk::ICON_SIZE_LARGE_TOOLBAR)); straTool->add (*straimg); straimg->show (); straTool->set_relief(Gtk::RELIEF_NONE); @@ -78,7 +77,7 @@ 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")); + Gtk::Image* perspimg = Gtk::manage(new RTImage("perspective-vertical-bottom", Gtk::ICON_SIZE_LARGE_TOOLBAR)); perspTool->set_image(*perspimg); perspTool->set_relief(Gtk::RELIEF_NONE); pack_start(*perspTool); diff --git a/rtgui/toollocationpref.cc b/rtgui/toollocationpref.cc index a2e2c9480..b66f74536 100644 --- a/rtgui/toollocationpref.cc +++ b/rtgui/toollocationpref.cc @@ -21,7 +21,6 @@ #include "guiutils.h" #include "options.h" -#include "rtimage.h" #include "rtscalable.h" #include "toollocationpref.h" #include "toolpanelcoord.h" @@ -279,12 +278,9 @@ ListEditButtons::ListEditButtons(Gtk::TreeView &list, Glib::RefPtrappend_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.pack_start(toolListCellRendererFavorite, false); toolListViewColumnFavorite.set_renderer( toolListCellRendererFavorite, toolListColumns.isFavorite); toolListViewColumnFavorite.add_attribute( @@ -720,20 +714,20 @@ ToolLocationPreference::ToolLocationPreference(Options &options) : Gtk::Grid *layout_grid = Gtk::manage(new Gtk::Grid()); layout_grid->set_column_spacing(4); layout_grid->set_row_spacing(4); - add(*layout_grid); + layout_grid->set_column_homogeneous(true); + pack_start(*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)); + tool_list_scrolled_window->set_min_content_width(RTScalable::scalePixelSize(400)); 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); + tool_list_frame, true, true, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); // Favorites list. Gtk::Frame *favorites_frame = Gtk::manage(new Gtk::Frame( @@ -741,15 +735,14 @@ ToolLocationPreference::ToolLocationPreference(Options &options) : 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)); + favorites_list_scrolled_window->set_min_content_width(RTScalable::scalePixelSize(400)); 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_box->pack_start(*favorites_list_scrolled_window, true, true); favorites_frame->add(*favorites_box); favorites_list_scrolled_window->add(*impl->favoritesViewPtr); setExpandAlignProperties( - favorites_frame, false, true, Gtk::ALIGN_START, Gtk::ALIGN_FILL); + favorites_frame, true, true, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); // General options. layout_grid->attach_next_to( diff --git a/rtgui/toolpanel.cc b/rtgui/toolpanel.cc index 46899f1a2..b2c14107d 100644 --- a/rtgui/toolpanel.cc +++ b/rtgui/toolpanel.cc @@ -67,7 +67,7 @@ FoldableToolPanel::FoldableToolPanel(Gtk::Box* content, Glib::ustring toolName, label->set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_CENTER); titleHBox->pack_start(*label, Gtk::PACK_EXPAND_WIDGET, 0); - RTImage *image = Gtk::manage (new RTImage("one-to-one-small.png")); + RTImage *image = Gtk::manage (new RTImage("one-to-one-small")); image->set_tooltip_text(M("TP_GENERAL_11SCALE_TOOLTIP")); titleHBox->pack_end(*image, Gtk::PACK_SHRINK, 0); diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index c957f605a..354d3e47e 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -274,7 +274,7 @@ const ToolPanelCoordinator::ToolLayout PANEL_TOOLS = { std::unordered_map ToolPanelCoordinator::toolNamesReverseMap; -ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), favoritePanelSW(nullptr), hasChanged (false), batch(batch), editDataProvider (nullptr), photoLoadedOnce(false) +ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), favoritePanelSW(nullptr), hasChanged (false), batch(batch), editDataProvider (nullptr), photoLoadedOnce(false), ornamentSurface(new RTSurface("ornament1.svg")) { favoritePanel = Gtk::manage (new ToolVBox ()); @@ -402,7 +402,7 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), favorit // load panel endings 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] = Gtk::manage (new Gtk::Image (ornamentSurface->get())); imgPanelEnd[i]->show(); vbPanelEnd[i]->get_style_context()->add_class("PanelEnding"); vbPanelEnd[i]->pack_start(*imgPanelEnd[i], Gtk::PACK_SHRINK); @@ -460,21 +460,26 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), favorit 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"))); + toiF.reset(new TextOrIcon ("star", M ("MAIN_TAB_FAVORITES"), M ("MAIN_TAB_FAVORITES_TOOLTIP"))); + toiE = Gtk::manage (new TextOrIcon ("exposure", M ("MAIN_TAB_EXPOSURE"), M ("MAIN_TAB_EXPOSURE_TOOLTIP"))); + toiD = Gtk::manage (new TextOrIcon ("detail", M ("MAIN_TAB_DETAIL"), M ("MAIN_TAB_DETAIL_TOOLTIP"))); + toiC = Gtk::manage (new TextOrIcon ("color-circles", M ("MAIN_TAB_COLOR"), M ("MAIN_TAB_COLOR_TOOLTIP"))); + toiW = Gtk::manage (new TextOrIcon ("atom", M ("MAIN_TAB_ADVANCED"), M ("MAIN_TAB_ADVANCED_TOOLTIP"))); + toiL = Gtk::manage(new TextOrIcon("rt-spot", 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"))); + toiT = Gtk::manage (new TextOrIcon ("transform", M ("MAIN_TAB_TRANSFORM"), M ("MAIN_TAB_TRANSFORM_TOOLTIP"))); + toiR = Gtk::manage (new TextOrIcon ("bayer", M ("MAIN_TAB_RAW"), M ("MAIN_TAB_RAW_TOOLTIP"))); + toiM = Gtk::manage (new TextOrIcon ("metadata", M ("MAIN_TAB_METADATA"), M ("MAIN_TAB_METADATA_TOOLTIP"))); toiF->show_all(); if (options.favorites.size()) { toolPanelNotebook->append_page(*favoritePanelSW, *toiF); } toolPanelNotebook->append_page (*exposurePanelSW, *toiE); +/* + if (!batch) { + toolPanelNotebook->append_page(*locallabPanelSW, *toiL); + } +*/ toolPanelNotebook->append_page (*detailsPanelSW, *toiD); toolPanelNotebook->append_page (*colorPanelSW, *toiC); toolPanelNotebook->append_page (*advancedPanelSW, *toiW); diff --git a/rtgui/toolpanelcoord.h b/rtgui/toolpanelcoord.h index 762ea4a1e..d34c9870d 100644 --- a/rtgui/toolpanelcoord.h +++ b/rtgui/toolpanelcoord.h @@ -230,6 +230,7 @@ private: EditDataProvider *editDataProvider; sigc::connection notebookconn; bool photoLoadedOnce; // Used to indicated that a photo has been loaded yet + std::shared_ptr ornamentSurface; Gtk::Widget* prevPage; public: diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 765386529..c807a1bd2 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -92,7 +92,7 @@ Wavelet::Wavelet() : 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"))))), + offset(Gtk::manage(new Adjuster(M("TP_WAVELET_WAVOFFSET"), 0.33, 1.66, 0.01, 1., Gtk::manage(new RTImage("circle-black-small")), Gtk::manage(new RTImage("circle-white-small"))))), 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"), 0, 100, 1, 0))), @@ -152,8 +152,8 @@ Wavelet::Wavelet() : 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"))))), + ballum(Gtk::manage(new Adjuster(M("TP_WAVELET_BALLUM"), -2., 10., 0.5, 7., Gtk::manage(new RTImage("circle-white-small")), Gtk::manage(new RTImage("circle-black-small"))))), + balchrom(Gtk::manage(new Adjuster(M("TP_WAVELET_BALCHROM"), -100., 100., 1., 0., Gtk::manage(new RTImage("circle-blue-yellow-small")), Gtk::manage(new RTImage("circle-red-green-small"))))), 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))), @@ -606,7 +606,7 @@ Wavelet::Wavelet() : 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); @@ -716,7 +716,7 @@ Wavelet::Wavelet() : 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); @@ -742,7 +742,7 @@ Wavelet::Wavelet() : 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")); @@ -766,7 +766,7 @@ Wavelet::Wavelet() : noiseBox->pack_start(*sigm); noiseBox->pack_start(*CurveEditorwavnoise); // noiseBox->pack_start(*CurveEditorwavnoiseh); - + balchrom->setAdjusterListener(this); chromfi->setAdjusterListener(this); @@ -922,7 +922,7 @@ Wavelet::Wavelet() : //Blur Wavelet ToolParamBlock* const blBox = Gtk::manage(new ToolParamBlock()); - + curveEditorbl->setCurveListener(this); blshape = static_cast(curveEditorbl->addCurve(CT_Flat, "", nullptr, false, false)); @@ -937,8 +937,8 @@ Wavelet::Wavelet() : blBox->pack_start(*bluwav); bluwav->setAdjusterListener(this); blBox->pack_start(*curveEditorbl, Gtk::PACK_SHRINK, 4); - - + + chrwav->setAdjusterListener(this); blBox->pack_start(*chrwav); @@ -1120,20 +1120,20 @@ Wavelet::Wavelet() : cbenabConn = cbenab->signal_toggled().connect(sigc::mem_fun(*this, &Wavelet::cbenabToggled)); cbenab->set_tooltip_text(M("TP_WAVELET_CB_TOOLTIP")); - Gtk::Image* const iblueR = Gtk::manage(new RTImage("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")); + Gtk::Image* const iyelL = Gtk::manage(new RTImage("circle-yellow-small")); + Gtk::Image* const imagL = Gtk::manage(new RTImage("circle-magenta-small")); + Gtk::Image* const igreenR = Gtk::manage(new RTImage("circle-green-small")); - 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")); + Gtk::Image* const iyelLm = Gtk::manage(new RTImage("circle-yellow-small")); + Gtk::Image* const imagLm = Gtk::manage(new RTImage("circle-magenta-small")); + Gtk::Image* const igreenRm = Gtk::manage(new RTImage("circle-green-small")); - 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")); + Gtk::Image* const iyelLh = Gtk::manage(new RTImage("circle-yellow-small")); + Gtk::Image* const imagLh = Gtk::manage(new RTImage("circle-magenta-small")); + Gtk::Image* const igreenRh = Gtk::manage(new RTImage("circle-green-small")); greenhigh = Gtk::manage(new Adjuster("", -100., 100., 1., 0., igreenRh, imagLh)); bluehigh = Gtk::manage(new Adjuster("", -100., 100., 1., 0., iblueRh, iyelLh)); @@ -1167,8 +1167,6 @@ Wavelet::Wavelet() : resBox->pack_start(*chanMixerMidFrame, Gtk::PACK_SHRINK); resBox->pack_start(*chanMixerShadowsFrame, Gtk::PACK_SHRINK); - //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_TOOLTIP")); neutralconn = neutral->signal_pressed().connect(sigc::mem_fun(*this, &Wavelet::neutral_pressed)); @@ -1277,7 +1275,7 @@ Wavelet::Wavelet() : guidBox->pack_start(*CurveEditorwavguid); guidFrame->add(*guidBox); finalBox->pack_start(*guidFrame); - + //----------------------------- @@ -1584,7 +1582,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) } 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") { @@ -1751,7 +1749,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) 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); + 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, 0, 0, false); sigm->setValue(pp->wavelet.sigm); levden->setValue(pp->wavelet.levden); @@ -2053,7 +2051,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) } else { sup->hide(); } - + if (complexmethod->get_active_row_number() == 0) { updateGUIToMode(0); convertParamToNormal(); @@ -2061,7 +2059,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) } else { updateGUIToMode(1); } - + } /***************************************************************************************************** @@ -2214,7 +2212,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) 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); + labgrid->getParams(pp->wavelet.labgridALow, pp->wavelet.labgridBLow, pp->wavelet.labgridAHigh, pp->wavelet.labgridBHigh, zerox, zeroy, 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; @@ -2674,7 +2672,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit 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); + 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, 0, 0); greenlow->setDefault(defParams->wavelet.greenlow); bluelow->setDefault(defParams->wavelet.bluelow); @@ -3288,7 +3286,7 @@ void Wavelet::convertParamToNormal() cbenab->set_active(false); //final touchup - BAmethod->set_active(0); + BAmethod->set_active(0); sigmafin->setValue(def_params.sigmafin); enableListener(); @@ -3370,7 +3368,7 @@ void Wavelet::updateGUIToMode(int mode) void Wavelet::complexmethodChanged() -{ +{ if (complexmethod->get_active_row_number() == 0) { updateGUIToMode(0); convertParamToNormal(); @@ -3385,7 +3383,7 @@ void Wavelet::complexmethodChanged() } //void Wavelet::denmethodChanged() -//{ +//{ // // if (listener && (multiImage || getEnabled())) { // listener->panelChanged(EvWavdenmethod, denmethod->get_active_text()); @@ -3393,7 +3391,7 @@ void Wavelet::complexmethodChanged() //} void Wavelet::mixmethodChanged() -{ +{ if (listener && (multiImage || getEnabled())) { listener->panelChanged(EvWavmixmethod, mixmethod->get_active_text()); @@ -3401,8 +3399,8 @@ void Wavelet::mixmethodChanged() } void Wavelet::slimethodChanged() -{ - +{ + if (slimethod->get_active_row_number() == 0 && complexmethod->get_active_row_number() == 0) { updateGUIToMode(0); convertParamToNormal(); @@ -3418,7 +3416,7 @@ void Wavelet::slimethodChanged() CurveEditorwavnoiseh->show(); CurveEditorwavnoise->show(); } - + if (listener && (multiImage || getEnabled())) { listener->panelChanged(EvWavslimethod, slimethod->get_active_text()); @@ -3426,7 +3424,7 @@ void Wavelet::slimethodChanged() } void Wavelet::quamethodChanged() -{ +{ if (listener && (multiImage || getEnabled())) { listener->panelChanged(EvWavquamethod, quamethod->get_active_text()); diff --git a/rtgui/whitebalance.cc b/rtgui/whitebalance.cc index f245e42f2..d207ef7a2 100644 --- a/rtgui/whitebalance.cc +++ b/rtgui/whitebalance.cc @@ -21,6 +21,7 @@ #include #include "rtimage.h" +#include "rtsurface.h" #include "options.h" #include "eventmapper.h" @@ -30,41 +31,14 @@ #define MAXTEMP 60000 //12000 #define CENTERTEMP 4750 #define MINGREEN 0.02 -#define MAXGREEN 10.0 -#define MINEQUAL 0.8 -#define MAXEQUAL 1.5 +#define MAXGREEN 100.0 +#define MINEQUAL 0.5 +#define MAXEQUAL 2. 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 () -{ - wbPixbufs[toUnderlying(WBEntry::Type::CAMERA)] = RTImage::createPixbufFromFile ("wb-camera-small.png"); - wbPixbufs[toUnderlying(WBEntry::Type::AUTO)] = RTImage::createPixbufFromFile ("wb-auto-small.png"); - wbPixbufs[toUnderlying(WBEntry::Type::DAYLIGHT)] = RTImage::createPixbufFromFile ("wb-sun-small.png"); - wbPixbufs[toUnderlying(WBEntry::Type::CLOUDY)] = RTImage::createPixbufFromFile ("wb-cloudy-small.png"); - wbPixbufs[toUnderlying(WBEntry::Type::SHADE)] = RTImage::createPixbufFromFile ("wb-shade-small.png"); - wbPixbufs[toUnderlying(WBEntry::Type::WATER)] = RTImage::createPixbufFromFile ("wb-water-small.png"); - //wbPixbufs[toUnderlying(WBEntry::Type::WATER2)] = RTImage::createPixbufFromFile ("wb-water-small.png"); - wbPixbufs[toUnderlying(WBEntry::Type::TUNGSTEN)] = RTImage::createPixbufFromFile ("wb-tungsten-small.png"); - wbPixbufs[toUnderlying(WBEntry::Type::FLUORESCENT)] = RTImage::createPixbufFromFile ("wb-fluorescent-small.png"); - wbPixbufs[toUnderlying(WBEntry::Type::LAMP)] = RTImage::createPixbufFromFile ("wb-lamp-small.png"); - wbPixbufs[toUnderlying(WBEntry::Type::FLASH)] = RTImage::createPixbufFromFile ("wb-flash-small.png"); - wbPixbufs[toUnderlying(WBEntry::Type::LED)] = RTImage::createPixbufFromFile ("wb-led-small.png"); - wbPixbufs[toUnderlying(WBEntry::Type::CUSTOM)] = RTImage::createPixbufFromFile ("wb-custom-small.png"); -} - -void WhiteBalance::cleanup () -{ - for (int i = 0; i < toUnderlying(WBEntry::Type::CUSTOM) + 1; i++) { - wbPixbufs[i].reset(); - } -} - static double wbSlider2Temp(double sval) { @@ -149,6 +123,19 @@ static double wbTemp2Slider(double temp) WhiteBalance::WhiteBalance () : FoldableToolPanel(this, TOOL_NAME, M("TP_WBALANCE_LABEL"), true, true), wbp(nullptr), wblistener(nullptr) { + // Assign icon name to wbIcons + wbIcons[toUnderlying(WBEntry::Type::CAMERA)] = "wb-camera-small"; + wbIcons[toUnderlying(WBEntry::Type::AUTO)] = "wb-auto-small"; + wbIcons[toUnderlying(WBEntry::Type::DAYLIGHT)] = "wb-sun-small"; + wbIcons[toUnderlying(WBEntry::Type::CLOUDY)] = "wb-cloudy-small"; + wbIcons[toUnderlying(WBEntry::Type::SHADE)] = "wb-shade-small"; + wbIcons[toUnderlying(WBEntry::Type::WATER)] = "wb-water-small"; + wbIcons[toUnderlying(WBEntry::Type::TUNGSTEN)] = "wb-tungsten-small"; + wbIcons[toUnderlying(WBEntry::Type::FLUORESCENT)] = "wb-fluorescent-small"; + wbIcons[toUnderlying(WBEntry::Type::LAMP)] = "wb-lamp-small"; + wbIcons[toUnderlying(WBEntry::Type::FLASH)] = "wb-flash-small"; + wbIcons[toUnderlying(WBEntry::Type::LED)] = "wb-led-small"; + wbIcons[toUnderlying(WBEntry::Type::CUSTOM)] = "wb-custom-small"; Gtk::Grid* methodgrid = Gtk::manage(new Gtk::Grid()); methodgrid->get_style_context()->add_class("grid-spacing"); @@ -164,6 +151,15 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, TOOL_NAME, M("TP_WBALANC setExpandAlignProperties(method, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); // Assign the model to the Combobox method->set_model(refTreeModel); + method->clear(); // Clear default cell layout to add custom one + Gtk::CellRendererPixbuf* const renderer_icon = Gtk::manage(new Gtk::CellRendererPixbuf()); + renderer_icon->property_stock_size() = Gtk::ICON_SIZE_MENU; + method->pack_start(*renderer_icon, false); + method->add_attribute(*renderer_icon, "icon-name", methodColumns.colIcon); + Gtk::CellRendererText* const renderer_label = Gtk::manage(new Gtk::CellRendererText()); + renderer_label->property_ellipsize() = Pango::ELLIPSIZE_MIDDLE; + method->pack_start(*renderer_label, true); + method->add_attribute(*renderer_label, "markup", methodColumns.colLabel); WBEntry::Type oldType = WBParams::getWbEntries()[0].type; WBEntry::Type currType; @@ -175,7 +171,7 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, TOOL_NAME, M("TP_WBALANC if (currType == WBEntry::Type::FLUORESCENT) { // Creating the Fluorescent subcategory header row = *(refTreeModel->append()); - row[methodColumns.colIcon] = wbPixbufs[toUnderlying(currType)]; + row[methodColumns.colIcon] = wbIcons[toUnderlying(currType)]; row[methodColumns.colLabel] = M("TP_WBALANCE_FLUO_HEADER"); row[methodColumns.colId] = i + 100; } @@ -183,7 +179,7 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, TOOL_NAME, M("TP_WBALANC if (currType == WBEntry::Type::AUTO) { // Creating the auto category row = *(refTreeModel->append()); - row[methodColumns.colIcon] = wbPixbufs[toUnderlying(currType)]; + row[methodColumns.colIcon] = wbIcons[toUnderlying(currType)]; row[methodColumns.colLabel] = M("TP_WBALANCE_AUTO_HEADER"); row[methodColumns.colId] = i + 100; } @@ -191,7 +187,7 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, TOOL_NAME, M("TP_WBALANC if (currType == WBEntry::Type::WATER) { // Creating the under water subcategory header row = *(refTreeModel->append()); - row[methodColumns.colIcon] = wbPixbufs[toUnderlying(currType)]; + row[methodColumns.colIcon] = wbIcons[toUnderlying(currType)]; row[methodColumns.colLabel] = M("TP_WBALANCE_WATER_HEADER"); row[methodColumns.colId] = i + 100; } @@ -199,7 +195,7 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, TOOL_NAME, M("TP_WBALANC if (currType == WBEntry::Type::LAMP) { // Creating the Lamp subcategory header row = *(refTreeModel->append()); - row[methodColumns.colIcon] = wbPixbufs[toUnderlying(currType)]; + row[methodColumns.colIcon] = wbIcons[toUnderlying(currType)]; row[methodColumns.colLabel] = M("TP_WBALANCE_LAMP_HEADER"); row[methodColumns.colId] = i + 100; } @@ -207,7 +203,7 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, TOOL_NAME, M("TP_WBALANC if (currType == WBEntry::Type::LED) { // Creating the LED subcategory header row = *(refTreeModel->append()); - row[methodColumns.colIcon] = wbPixbufs[toUnderlying(currType)]; + row[methodColumns.colIcon] = wbIcons[toUnderlying(currType)]; row[methodColumns.colLabel] = M("TP_WBALANCE_LED_HEADER"); row[methodColumns.colId] = i + 100; } @@ -215,7 +211,7 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, TOOL_NAME, M("TP_WBALANC if (currType == WBEntry::Type::FLASH) { // Creating the Flash subcategory header row = *(refTreeModel->append()); - row[methodColumns.colIcon] = wbPixbufs[toUnderlying(currType)]; + row[methodColumns.colIcon] = wbIcons[toUnderlying(currType)]; row[methodColumns.colLabel] = M("TP_WBALANCE_FLASH_HEADER"); row[methodColumns.colId] = i + 100; } @@ -229,12 +225,12 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, TOOL_NAME, M("TP_WBALANC || currType == WBEntry::Type::AUTO ) { childrow = *(refTreeModel->append(row.children())); - childrow[methodColumns.colIcon] = wbPixbufs[toUnderlying(currType)]; + childrow[methodColumns.colIcon] = wbIcons[toUnderlying(currType)]; childrow[methodColumns.colLabel] = WBParams::getWbEntries()[i].GUILabel; childrow[methodColumns.colId] = i; } else { row = *(refTreeModel->append()); - row[methodColumns.colIcon] = wbPixbufs[toUnderlying(currType)]; + row[methodColumns.colIcon] = wbIcons[toUnderlying(currType)]; row[methodColumns.colLabel] = WBParams::getWbEntries()[i].GUILabel; row[methodColumns.colId] = i; } @@ -251,21 +247,11 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, TOOL_NAME, M("TP_WBALANC EvWBitcwbalg = m->newEvent(WB, "HISTORY_MSG_WBITC_OBS"); EvWBitcwgreen = m->newEvent(WB, "HISTORY_MSG_WBITC_GREEN"); - - //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); - method->pack_start(methodColumns.colLabel, true); - - 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"))); + resetButton->set_image (*Gtk::manage (new RTImage ("undo-small", Gtk::ICON_SIZE_BUTTON))); method->set_active (0); // Camera methodgrid->attach (*lab, 0, 0, 1, 1); @@ -282,7 +268,7 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, TOOL_NAME, M("TP_WBALANC setExpandAlignProperties(spotbutton, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); spotbutton->get_style_context()->add_class("independent"); spotbutton->set_tooltip_text(M("TP_WBALANCE_SPOTWB")); - spotbutton->set_image (*Gtk::manage (new RTImage ("color-picker-small.png"))); + spotbutton->set_image (*Gtk::manage (new RTImage ("color-picker-small", Gtk::ICON_SIZE_BUTTON))); Gtk::Label* slab = Gtk::manage (new Gtk::Label (M("TP_WBALANCE_SIZE"))); setExpandAlignProperties(slab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); @@ -334,14 +320,14 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, TOOL_NAME, M("TP_WBALANC separator->get_style_context()->add_class("grid-row-separator"); pack_start (*separator, Gtk::PACK_SHRINK, 0); - Gtk::Image* itempL = Gtk::manage (new RTImage ("circle-blue-small.png")); - Gtk::Image* itempR = Gtk::manage (new RTImage ("circle-yellow-small.png")); - Gtk::Image* igreenL = Gtk::manage (new RTImage ("circle-magenta-small.png")); - Gtk::Image* igreenR = Gtk::manage (new RTImage ("circle-green-small.png")); - Gtk::Image* iblueredL = Gtk::manage (new RTImage ("circle-blue-small.png")); - Gtk::Image* iblueredR = Gtk::manage (new RTImage ("circle-red-small.png")); - Gtk::Image* itempbiasL = Gtk::manage (new RTImage ("circle-blue-small.png")); - Gtk::Image* itempbiasR = Gtk::manage (new RTImage ("circle-yellow-small.png")); + Gtk::Image* itempL = Gtk::manage (new RTImage ("circle-blue-small", Gtk::ICON_SIZE_BUTTON)); + Gtk::Image* itempR = Gtk::manage (new RTImage ("circle-yellow-small", Gtk::ICON_SIZE_BUTTON)); + Gtk::Image* igreenL = Gtk::manage (new RTImage ("circle-magenta-small", Gtk::ICON_SIZE_BUTTON)); + Gtk::Image* igreenR = Gtk::manage (new RTImage ("circle-green-small", Gtk::ICON_SIZE_BUTTON)); + Gtk::Image* iblueredL = Gtk::manage (new RTImage ("circle-blue-small", Gtk::ICON_SIZE_BUTTON)); + Gtk::Image* iblueredR = Gtk::manage (new RTImage ("circle-red-small", Gtk::ICON_SIZE_BUTTON)); + Gtk::Image* itempbiasL = Gtk::manage (new RTImage ("circle-blue-small", Gtk::ICON_SIZE_BUTTON)); + Gtk::Image* itempbiasR = Gtk::manage (new RTImage ("circle-yellow-small", Gtk::ICON_SIZE_BUTTON)); StudLabel = Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER)); StudLabel->set_tooltip_text(M("TP_WBALANCE_STUDLABEL_TOOLTIP")); @@ -371,6 +357,7 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, TOOL_NAME, M("TP_WBALANC equal->show (); tempBias->show (); observer10->show(); + itcwbFrame = Gtk::manage(new Gtk::Frame(M("TP_WBALANCE_ITCWB_FRA"))); itcwbFrame->set_label_align(0.025, 0.5); @@ -409,7 +396,7 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, TOOL_NAME, M("TP_WBALANC pack_start(*StudLabel); pack_start(*PatchLabel); pack_start(*PatchlevelLabel); - + green->setLogScale(MAXGREEN / MINGREEN, MINGREEN); pack_start (*temp); //pack_start (*boxgreen); pack_start (*green); @@ -444,7 +431,7 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, TOOL_NAME, M("TP_WBALANC spotbutton->signal_pressed().connect( sigc::mem_fun(*this, &WhiteBalance::spotPressed) ); methconn = method->signal_changed().connect( sigc::mem_fun(*this, &WhiteBalance::optChanged) ); itcwb_algconn = itcwb_alg->signal_toggled().connect( sigc::mem_fun(*this, &WhiteBalance::itcwb_alg_toggled) ); - + resetButton->signal_pressed().connect( sigc::mem_fun(*this, &WhiteBalance::resetWB) ); spotsize->signal_changed().connect( sigc::mem_fun(*this, &WhiteBalance::spotSizeChanged) ); } @@ -803,7 +790,7 @@ void WhiteBalance::read (const ProcParams* pp, const ParamsEdited* pedited) itcwb_alg->show(); itcwb_prim->show(); itcwbFrame->show(); - + } else { itcwb_green->hide(); itcwb_alg->hide(); @@ -937,7 +924,7 @@ void WhiteBalance::read (const ProcParams* pp, const ParamsEdited* pedited) if(pp->wb.itcwb_sampling) { tempBias->set_sensitive(false); } - itcwbFrame->set_sensitive(!pp->wb.itcwb_sampling); + itcwbFrame->set_sensitive(!pp->wb.itcwb_sampling); itcwb_prim_changed (); } else { StudLabel->hide(); @@ -947,7 +934,7 @@ void WhiteBalance::read (const ProcParams* pp, const ParamsEdited* pedited) equal->show(); itcwbFrame->set_sensitive(false); } - + } setEnabled(pp->wb.enabled); @@ -1222,27 +1209,28 @@ void WhiteBalance::WBChanged(int met, double temperature, double greenVal, doubl Glib::ustring::format(std::fixed, std::setprecision(2), gw), Glib::ustring::format(std::fixed, std::setprecision(4), bw)) ); + if(bia == 3) { bia2 = bia - 1; StudLabel->set_text( Glib::ustring::compose(M("TP_WBALANCE_STUDLABEL"), Glib::ustring::format(std::fixed, std::setprecision(4), stud), - Glib::ustring::format(std::fixed, std::setprecision(0), bia2), - Glib::ustring::format(std::fixed, std::setprecision(0), temp0)) + Glib::ustring::format(std::fixed, std::setprecision(0), bia2), + Glib::ustring::format(std::fixed, std::setprecision(0), temp0)) ); } else if(bia == 2) { StudLabel->set_text( Glib::ustring::compose(M("TP_WBALANCE_STUDLABEL1"), Glib::ustring::format(std::fixed, std::setprecision(4), stud), - Glib::ustring::format(std::fixed, std::setprecision(0), bia), - Glib::ustring::format(std::fixed, std::setprecision(0), temp0)) + Glib::ustring::format(std::fixed, std::setprecision(0), bia), + Glib::ustring::format(std::fixed, std::setprecision(0), temp0)) ); } else { StudLabel->set_text( Glib::ustring::compose(M("TP_WBALANCE_STUDLABEL0"), Glib::ustring::format(std::fixed, std::setprecision(4), stud), - Glib::ustring::format(std::fixed, std::setprecision(0), bia), - Glib::ustring::format(std::fixed, std::setprecision(0), temp0)) + Glib::ustring::format(std::fixed, std::setprecision(0), bia), + Glib::ustring::format(std::fixed, std::setprecision(0), temp0)) ); } PatchLabel->set_text( diff --git a/rtgui/whitebalance.h b/rtgui/whitebalance.h index 4667a2fdf..02706f7e5 100644 --- a/rtgui/whitebalance.h +++ b/rtgui/whitebalance.h @@ -54,7 +54,7 @@ protected: class MethodColumns : public Gtk::TreeModel::ColumnRecord { public: - Gtk::TreeModelColumn< Glib::RefPtr > colIcon; + Gtk::TreeModelColumn colIcon; Gtk::TreeModelColumn colLabel; Gtk::TreeModelColumn colId; MethodColumns() @@ -70,7 +70,7 @@ protected: rtengine::ProcEvent EvWBitcwbalg; rtengine::ProcEvent EvWBitcwgreen; - static Glib::RefPtr wbPixbufs[rtengine::toUnderlying(rtengine::procparams::WBEntry::Type::CUSTOM) + 1]; + Glib::ustring wbIcons[rtengine::toUnderlying(rtengine::procparams::WBEntry::Type::CUSTOM) + 1]; Glib::RefPtr refTreeModel; MethodColumns methodColumns; MyComboBox* method; @@ -120,8 +120,6 @@ public: WhiteBalance (); ~WhiteBalance () override; - static void init (); - static void cleanup (); 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; diff --git a/rtgui/zoompanel.cc b/rtgui/zoompanel.cc index c10ec97b9..a683870c9 100644 --- a/rtgui/zoompanel.cc +++ b/rtgui/zoompanel.cc @@ -25,15 +25,15 @@ ZoomPanel::ZoomPanel (ImageArea* iarea) : iarea(iarea) { set_name ("EditorZoomPanel"); - Gtk::Image* imageOut = Gtk::manage (new RTImage ("magnifier-minus.png")); + Gtk::Image* imageOut = Gtk::manage (new RTImage ("magnifier-minus", Gtk::ICON_SIZE_LARGE_TOOLBAR)); imageOut->set_padding(0, 0); - Gtk::Image* imageIn = Gtk::manage (new RTImage ("magnifier-plus.png")); + Gtk::Image* imageIn = Gtk::manage (new RTImage ("magnifier-plus", Gtk::ICON_SIZE_LARGE_TOOLBAR)); imageIn->set_padding(0, 0); - Gtk::Image* image11 = Gtk::manage ( new RTImage ("magnifier-1to1.png")); + Gtk::Image* image11 = Gtk::manage ( new RTImage ("magnifier-1to1", Gtk::ICON_SIZE_LARGE_TOOLBAR)); image11->set_padding(0, 0); - Gtk::Image* imageFit = Gtk::manage (new RTImage ("magnifier-fit.png")); + Gtk::Image* imageFit = Gtk::manage (new RTImage ("magnifier-fit", Gtk::ICON_SIZE_LARGE_TOOLBAR)); imageFit->set_padding(0, 0); - Gtk::Image* imageFitCrop = Gtk::manage (new RTImage ("magnifier-crop.png")); + Gtk::Image* imageFitCrop = Gtk::manage (new RTImage ("magnifier-crop", Gtk::ICON_SIZE_LARGE_TOOLBAR)); imageFit->set_padding(0, 0); zoomOut = Gtk::manage (new Gtk::Button()); @@ -67,7 +67,7 @@ ZoomPanel::ZoomPanel (ImageArea* iarea) : iarea(iarea) setExpandAlignProperties(zoomLabel, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); attach_next_to (*zoomLabel, Gtk::POS_RIGHT, 1, 1); - Gtk::Image* imageCrop = Gtk::manage (new RTImage ("window-add.png")); + Gtk::Image* imageCrop = Gtk::manage (new RTImage ("window-add", Gtk::ICON_SIZE_LARGE_TOOLBAR)); imageCrop->set_padding(0, 0); newCrop = Gtk::manage (new Gtk::Button()); newCrop->add (*imageCrop); diff --git a/tools/generateTranslationDiffs.py b/tools/generateTranslationDiffs.py new file mode 100644 index 000000000..2b1284efb --- /dev/null +++ b/tools/generateTranslationDiffs.py @@ -0,0 +1,630 @@ +#!/usr/bin/env python + +# This script iterates through interface translation files, moves comments to +# the front, puts translated strings next, and finally looks for +# untranslated/missing strings by matching against "default" which it then adds +# to the translation, each line prepended by "!". +# +# Developers should run it after receiving a translation file from a +# translator: +# cp /tmp/new_japanese_translation rtdata/languages/Japanese +# ./tools/generateTranslationDiffs "Japanese" +# +# Running the script without an argument iterates through all files. +# +# Locale files are generated automatically: +# - English (UK) + +import argparse +from collections import defaultdict +from datetime import datetime +from functools import cmp_to_key, reduce +import logging +import os +from pathlib import Path +import re +from sys import stdout +from typing import Dict, Iterable, List, Mapping, Optional + + +FILE_DEFAULT = 'default' +FILE_ENGLISH_US = 'English (US)' +FILE_ENGLISH_UK = 'English (UK)' + + +class SortHelper: + """ + String sorting utilities. + """ + char_indices: Optional[Dict[str, str]] = None + + @staticmethod + def get_char_index(char: str): + """ + Return the sort order of a character. + """ + if SortHelper.char_indices is None: + # Printable characters sorted using the `sort -V` command. + characters = ( + '.~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' + 'abcdefghijklmnopqrstuvwxyz\t\x0b\x0c\n ' + '!"#$%&\'()*+,-/:;<=>?@[\\]^_`{|}' + ) + SortHelper.char_indices = {} + for i, char in enumerate(characters): + SortHelper.char_indices[char] = i + return SortHelper.char_indices.get(char) + + +class TranslationEntry: + """ + An entry in a translation file, consisting of a key and value. + """ + + def __init__(self, line: str, key: str, value: str): + """ + :param line: The entire line containing the entry. + :param key: The key. + :param value: The value. + """ + self.line = line + self.key = key + self.value = value + + def __repr__(self): + return ( + f'TranslationEntry(line={self.line}, key={self.key},' + f' value={self.value})' + ) + + def __str__(self): + return repr(self) + + @staticmethod + def create_from_line(line: str): + """ + Create an instance of this class from a line containing the entry + definition. + + :raises ValueError: If the line does not contain a valid definition + consisting of a key and value separated by a ';' character. + """ + split_line = line.split(';', maxsplit=1) + if len(split_line) != 2: + raise ValueError() + key, value = split_line + return TranslationEntry(line, key, value) + + +class FileLines: + """ + Lines of a translation file categorized by type. + + The types are: + - Comment: Comments, which start with the '#' character. + - Changed: Translation entries consisting of a key and value. + Other lines are ignored. + """ + + def __init__( + self, + all: List[str], + comments: List[str], + changed: List[TranslationEntry] + ): + self.all = all + self.comments = comments + self.changed = changed + + def __repr__(self): + return ( + f'FileLines(all={self.all}, comments={self.comments},' + f' changed={self.changed})' + ) + + def __str__(self): + return repr(self) + + +def main(): + args = parse_args() + configure_logger() + start_time = datetime.now() + file_paths = get_file_paths(args.file_names) + default_file_lines = format_default() + format_files(file_paths, default_file_lines) + generate_locale_files(default_file_lines, file_paths) + end_time = datetime.now() + log_duration(start_time, end_time, len(file_paths)) + + +def parse_args(): + """ + Return the arguments passed to this program. + """ + parser = argparse.ArgumentParser( + prog='generateTranslationDiffs', + description='Formats translation files in rtdata/languages.', + ) + parser.add_argument( + 'file_names', + nargs='*', + help='list of language files to format, or leave empty to format all', + ) + return parser.parse_args() + + +def configure_logger(): + """ + Set up the logger. + """ + logger = get_logger() + handler = logging.StreamHandler(stdout) + formatter = logging.Formatter('%(levelname)s: %(message)s') + handler.setFormatter(formatter) + logger.addHandler(handler) + logger.setLevel(logging.INFO) + + +def get_logger(): + """ + Return the logger. + """ + return logging.getLogger('generateTranslationDiffs') + + +def get_file_paths(file_names: List[str]): + """ + Return the paths for all the given file names if they exist and are + writable. If no files names are given, return paths of all translation + files. + + :param file_names: List of file names, as path strings and/or name. + """ + if not file_names: + return get_default_file_paths() + return list(filter(lambda p: p, (get_file_path(n) for n in file_names))) + + +def get_languages_path(): + """ + Return the path of the languages directory. + """ + return Path(__file__).parent.parent / 'rtdata' / 'languages' + + +def get_file_path(file_name): + """ + Return the path for the translation file, or None if it doesn't exist or is + not writable. + + :param file_name: The file name as a path string or name. + """ + file_path = None + if Path(file_name).exists(): + file_path = Path(file_name) + elif (get_languages_path() / file_name).exists(): + file_path = get_languages_path() / file_name + + if not is_writable_file(file_path): + get_logger().warning('File "%s" not found or not writable.', file_name) + return None + return file_path + + +def get_default_file_paths(): + """ + Return a list of paths for all translation files excluding "default" and + locale translations. + """ + ignored_files = [ + FILE_DEFAULT, FILE_ENGLISH_UK, 'LICENSE', 'README', 'temp_file' + ] + ignored_files_regex = '|'.join(re.escape(file) for file in ignored_files) + ignore_pattern = re.compile(rf'({ignored_files_regex}|.*\.sh|\..*)') + return list(filter( + lambda p: p.is_file() and not ignore_pattern.fullmatch(p.name), + get_languages_path().iterdir() + )) + + +def is_writable_file(path: Path): + """ + Return if the file is writable with the current permissions. + """ + return path and path.is_file() and os.access(path, os.W_OK) + + +def format_default(): + """ + Format the default language file. + + :return: File lines of "default". + """ + get_logger().info('Formatting %s.', FILE_DEFAULT) + path = get_languages_path() / FILE_DEFAULT + file_lines = read_file(path) + changed_lines = [key_line.line for key_line in file_lines.changed] + file_lines.all = file_lines.comments + changed_lines + [''] + new_contents = '\n'.join(file_lines.all) + get_logger().debug( + 'New contents for file %s:\n%s', + FILE_DEFAULT, + new_contents + ) + path.write_text(new_contents) + return file_lines + + +def format_files(file_paths: List[Path], default_file_lines: FileLines): + """ + Format the translation files. + + :param file_paths: Files to format. + :param default_file_lines: File lines of the default language file. + """ + if not file_paths: + get_logger().info('No language files to format.') + for file_path in file_paths: + format_file(file_path, default_file_lines) + + +def generate_locale_files( + default_file_lines: FileLines, + file_paths: List[Path] +): + """ + Generate locale translation files. + + :param default_file_lines: File lines of the default language file. + :param file_paths: Paths of files to generate locale translations of. + """ + file_name_to_generator = { + FILE_ENGLISH_US: generate_english_locales, + } + for path in file_paths: + generator = file_name_to_generator.get(path.name) + if generator: + generator(default_file_lines, path) + + +def generate_english_locales(default_file_lines: FileLines, us_path: Path): + """ + Generate English locale files. + """ + us_file_lines: FileLines = read_file(us_path) + generate_english_locale_uk(default_file_lines, us_file_lines) + + +def generate_english_locale_uk( + default_file_lines: FileLines, + us_file_lines: FileLines +): + """ + Generate the UK English locale file. + """ + get_logger().info('Creating %s file', FILE_ENGLISH_UK) + + new_lines = list(us_file_lines.comments) + new_lines.extend(get_english_uk_translations(default_file_lines)) + new_lines.extend(get_english_uk_untranslated(us_file_lines.all)) + new_lines.append('') + + new_contents = '\n'.join(new_lines) + get_logger().debug( + 'New contents for file %s:\n%s', + FILE_ENGLISH_UK, + new_contents + ) + path = get_languages_path() / FILE_ENGLISH_UK + path.write_text(new_contents) + + +def get_english_uk_translations(default_file_lines: FileLines): + """ + Return a list of lines with translated entries for UK English. + + :param default_file_lines: File lines of "default". + """ + line_pattern = re.compile(r'(color|behavior|center)', flags=re.IGNORECASE) + replacements = { + 'olor': 'olour', + 'ehavior': 'ehaviour', + 'center': 'centre', + 'Center': 'Centre', + } + entries_to_translate = filter( + lambda entry: line_pattern.search(entry.value), + default_file_lines.changed + ) + + translations = [] + for default_entry in entries_to_translate: + new_value = reduce( + lambda value, replacement: value.replace(*replacement), + replacements.items(), + default_entry.value + ) + translations.append(f'{default_entry.key};{new_value}') + return translations + + +def get_english_uk_untranslated(us_lines: List[str]): + """ + Return a list of lines from the US English file excluding comments and + those translated for UK English. + """ + pattern = re.compile( + r'.+;.*(color|behavior|center).*', + flags=re.IGNORECASE + ) + return list(filter( + lambda line: not pattern.search(line) and not line.startswith('#'), + us_lines + )) + + +def format_file(path: Path, default_file_lines: FileLines): + """ + Format a translation file. + + :param path: Path of the translation file. + :param default_file_lines: File lines of "default". + """ + get_logger().info(f'Formatting {path.name}.') + file_lines = read_file(path) + translated_lines, untranslated_lines = get_translated_untranslated_lines( + file_lines, + default_file_lines + ) + warn_removed_entry(file_lines, default_file_lines) + new_lines = list(file_lines.comments) + new_lines.append('') + new_lines.extend(translated_lines) + new_lines.append('') + new_lines.extend(untranslated_lines) + new_lines.append('') + file_lines.all = new_lines + new_contents = '\n'.join(file_lines.all) + get_logger().debug( + 'New contents for file %s:\n%s', + path.name, + new_contents + ) + path.write_text(new_contents) + + +def get_translated_untranslated_lines( + file_lines: FileLines, + default_file_lines: FileLines +): + """ + Return a tuple containing a list of translated lines and a list of + untranslated lines. + """ + key_to_entry = { + entry.key: entry for entry in file_lines.changed + } + translated_lines = [] + untranslated_lines = [] + for default_key_line in default_file_lines.changed: + key = default_key_line.key + if key in key_to_entry: + translated_lines.append(key_to_entry[key].line) + else: + untranslated_lines.append(f'!{default_key_line.line}') + if untranslated_lines: + header = [ + '!!!!!!!!!!!!!!!!!!!!!!!!!', + ( + '! Untranslated keys follow;' + ' remove the ! prefix after an entry is translated.' + ), + '!!!!!!!!!!!!!!!!!!!!!!!!!', + '', + ] + untranslated_lines = header + untranslated_lines + return translated_lines, untranslated_lines + + +def warn_removed_entry(file_lines: FileLines, default_file_lines: FileLines): + """ + Emit a warning for any translation entries in the translation file but not + in the default file, if any. + """ + default_keys = set(entry.key for entry in default_file_lines.changed) + removed_lines = [ + entry.line for entry in file_lines.changed if entry.key not in + default_keys + ] + if removed_lines: + warning_lines = ['Removed entry/entries'] + warning_lines.extend([f'\t{line}' for line in removed_lines]) + get_logger().warning('\n'.join(warning_lines)) + + +def read_file(path: Path): + """ + Return the file lines from a language file. + """ + # Begins with '#' followed by 1+ characters. + comment_pattern = re.compile(r'^#.+') + # Does not begin with '!', '#', or end of line. + changed_pattern = re.compile(r'^[^!#$]') + file_lines = FileLines(path.read_text().splitlines(), [], []) + for line_num, line in enumerate(file_lines.all): + if comment_pattern.match(line): + file_lines.comments.append(line) + elif changed_pattern.match(line): + try: + translation_entry = TranslationEntry.create_from_line(line) + except ValueError: + get_logger().warning( + 'Malformed translation entry in "%s" on line %d: %s', + path.name, + line_num, + line + ) + else: + file_lines.changed.append(translation_entry) + sort_file_lines(file_lines) + return file_lines + + +def sort_file_lines(file_lines: FileLines): + """ + Sort the comments and changed entries of a file lines. + """ + comments = sort_comment_lines(file_lines.comments) + changed = sort_changed_unchanged_lines(file_lines.changed) + file_lines.comments.clear() + file_lines.changed.clear() + file_lines.comments.extend(comments) + file_lines.changed.extend(changed) + + +def sort_comment_lines(lines: List[str]): + """ + Sort comment lines using natural sort. + """ + return sorted(set(lines), key=cmp_to_key(compare_string_natural)) + + +def sort_changed_unchanged_lines(entries: List[TranslationEntry]): + """ + Sort changed or unchanged lines using natural sort of the translation entry + keys. + """ + key_to_lines = defaultdict(set) + for entry in entries: + key_to_lines[entry.key].add(entry.line) + + warn_duplicate_entries(key_to_lines) + + sort_key = cmp_to_key(lambda a, b: compare_string_natural(a[0], b[0])) + return list(map( + lambda item: TranslationEntry.create_from_line(item[1].pop()), + sorted(key_to_lines.items(), key=sort_key) + )) + + +def warn_duplicate_entries(key_to_lines: Mapping[str, Iterable[str]]): + """ + Emit a warning if there are duplicate translation entries. + + :param key_to_lines: Mapping from entry key to iterable containing all + values. + """ + duplicate_key_to_lines = { + k: v for k, v in key_to_lines.items() if len(v) > 1 + } + if duplicate_key_to_lines: + warning_lines = ['Duplicate key(s)'] + for key, lines in duplicate_key_to_lines.items(): + warning_lines.append(f'\t{key}') + warning_lines.extend(f'\t\t{line}' for line in lines) + get_logger().warning('\n'.join(warning_lines)) + + +def compare_string_natural(a: str, b: str): + """ + Compare two strings using natural ordering. + + :return: Negative integer if a comes before b, positive integer if b comes + before a, or zero if a and b are identical. + """ + ia = 0 # Character index for a. + ib = 0 # Character index for b. + while ia < len(a) and ib < len(b): + if a[ia].isdigit(): + if b[ib].isdigit(): + # Compare numbers + a_number, ia = read_int(a, ia) + b_number, ib = read_int(b, ib) + if a_number != b_number: + return a_number - b_number + else: + # Compare number with character. + return cmp_chars(a[ia], b[ib]) + else: + if b[ib].isdigit(): + # Compare character with number. + return cmp_chars(a[ia], b[ib]) + else: + # Compare character with character. + if a[ia] != b[ib]: + return cmp_chars(a[ia], b[ib]) + ia += 1 + ib += 1 + if ia < len(a): + # a is "longer". + return 1 + if ib < len(b): + # b is "longer". + return -1 + # a and b are equivalent. + return cmp_string(a, b) + + +def read_int(string: str, index: int): + """ + Read an integer from the string starting at the index. + + :param string: The string. + :param index: Index in the string where the number starts. + :return: A tuple containing the number and the index after the end of where + the number was extracted in the string. If there is no number, returns zero + and the original index. + """ + i = index + while i < len(string) and string[i].isdigit(): + i += 1 + number = 0 if i == index else int(string[index:i]) + return number, i + + +def cmp_chars(a: str, b: str): + """ + Compare two characters according to the `sort -v` command. + + :return: Negative integer if a comes before b, positive integer if b comes + before a, or zero if a and b are identical. + """ + a_index = SortHelper.get_char_index(a) + b_index = SortHelper.get_char_index(b) + if a_index is not None and b_index is not None: + return a_index - b_index + if a == b: + return 0 + return -1 if a < b else 1 + + +def cmp_string(a: str, b: str): + """ + Compare two strings according to a character-by-character comparison using + the `sort -v` command. + + :return: Negative integer if a comes before b, positive integer if b comes + before a, or zero if a and b are identical. + """ + for a_char, b_char in zip(a, b): + cmp_result = cmp_chars(a_char, b_char) + if cmp_result != 0: + return cmp_result + return len(a) - len(b) + + +def log_duration(start_time: datetime, end_time: datetime, file_count): + """ + Log the time it took to format the files. + """ + duration = end_time - start_time + get_logger().info( + 'Finished updating %d files.\nTotal time: %fs', + file_count, + duration.total_seconds() + ) + + +if __name__ == '__main__': + main() diff --git a/tools/makedeb/PKGBUILD.libjxl b/tools/makedeb/PKGBUILD.libjxl new file mode 100644 index 000000000..ed48f846b --- /dev/null +++ b/tools/makedeb/PKGBUILD.libjxl @@ -0,0 +1,41 @@ +# Maintainer: RawTherapee Developers + +_pkgname="libjxl" +pkgname="$_pkgname" +pkgver='0.10.3' +pkgrel='1' +pkgdesc='JPEG XL image format reference implementation' +url='https://github.com/libjxl/libjxl' +license=('BSD') +arch=('amd64') + +depends=('libgif-dev' 'libjpeg-dev' 'libopenexr-dev' 'libpng-dev' 'libwebp-dev') +makedepends=('cmake' 'pkg-config' 'libbrotli-dev' 'libgflags-dev') + +_pkgsrc="$_pkgname" +source=("git+$url.git#tag=v$pkgver") +sha256sums=('SKIP') + +prepare() { + cd "$_pkgsrc" + git submodule update --init --recursive --depth 1 --recommend-shallow +} + +build() { + local _cmake_options=( + -B build + -S "$_pkgsrc" + -DCMAKE_BUILD_TYPE=Release + -DCMAKE_INSTALL_PREFIX='/usr' + -DJPEGXL_FORCE_SYSTEM_BROTLI=ON + -DBUILD_TESTING=OFF + -Wno-dev + ) + + cmake "${_cmake_options[@]}" + cmake --build build --parallel +} + +package() { + DESTDIR="$pkgdir" cmake --install build +} diff --git a/tools/osx/INSTALL.readme.rtf b/tools/osx/INSTALL.readme.rtf index dea38c37f..bffc9bae5 100644 --- a/tools/osx/INSTALL.readme.rtf +++ b/tools/osx/INSTALL.readme.rtf @@ -1,7 +1,11 @@ To install the RawTherapee application: 1. Open the RawTherapee .dmg Disk Image included alongside this document. -2. Drag the RawTherapee icon onto the /Applications folder icon +2. Drag the RawTherapee icon onto /Applications. +3. If RawTherapee.app exists, click Replace in the dialog. +4. Do not move or rename RawTherapee.app + +Note: For security reasons, RawTherapee MUST be installed in /Applications. RawTherapee will refuse to start if installed elsewhere. To run the RawTherapee application: diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 4a6509403..d6f460904 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -63,14 +63,14 @@ if [[ -x $(which git) && -d $PROJECT_SOURCE_DIR/.git ]]; then # 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). @@ -81,7 +81,7 @@ 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 @@ -155,8 +155,9 @@ fi # In: OSX_CONTINUOUS:BOOL=ON # Out: ON -OSX_CONTINUOUS="$(cmake .. -L -N | grep OSX_CONTINUOUS)"; NIGHTLY="${OSX_CONTINUOUS#*=}" && CONTINUOUS="${OSX_CONTINUOUS#*=}" +OSX_CONTINUOUS="$(cmake .. -L -N | grep OSX_CONTINUOUS)"; CONTINUOUS="${OSX_CONTINUOUS#*=}" if [[ -n $CONTINUOUS ]]; then + NIGHTLY="${OSX_CONTINUOUS#*=}" echo "Continuous/generically-named zip is ON." fi @@ -219,6 +220,9 @@ ModifyInstallNames 2>&1 # Copy libpng16 to the app bundle cp ${LOCAL_PREFIX}/lib/libpng16.16.dylib "${CONTENTS}/Frameworks/libpng16.16.dylib" +# Copy libjxl_cms to the app bundle +cp ${LOCAL_PREFIX}/lib/libjxl_cms.0.10.dylib "${CONTENTS}/Frameworks/libjxl_cms.0.10.dylib" + # Copy graphite to Frameworks cp ${LOCAL_PREFIX}/lib/libgraphite2.3.dylib "${CONTENTS}/Frameworks" @@ -251,12 +255,8 @@ ditto {"${LOCAL_PREFIX}","${RESOURCES}"}/share/themes/Default/gtk-3.0/gtk-keys.c # 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 +mkdir -p ${RESOURCES}/share/icons/Adwaita +cp -RL ${LOCAL_PREFIX}/share/icons/Adwaita/* "${RESOURCES}"/share/icons/Adwaita/ "${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" @@ -313,13 +313,17 @@ 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 +# Link to libomp instead of libgomp +sudo install_name_tool -change /Applications/RawTherapee.app/Contents/Frameworks/libgomp.1.dylib /Applications/RawTherapee.app/Contents/Frameworks/libomp.dylib RawTherapee.app/Contents/Frameworks/libfftw3f_omp.3.dylib +rm RawTherapee.app/Contents/Frameworks/libgomp.1.dylib + # 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 + hdiutil attach -mountpoint ./RawTherapeeuniv univapp/*folder/*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) @@ -336,6 +340,7 @@ if [[ -n $UNIVERSAL_URL ]]; then 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 + plutil -convert xml1 ${APP}/Contents/Info.plist hdiutil unmount ./RawTherapeeuniv rm -r univapp # Create the fat main RawTherapee binary and move it into the new bundle @@ -360,9 +365,26 @@ fi 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-cli "${APP}"/Contents/MacOS/rawtherapee-cli - codesign --force --deep --timestamp --strict -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --entitlements "${CMAKE_BUILD_TYPE}"/rt.entitlements "${APP}" + plutil -convert xml1 "${CMAKE_BUILD_TYPE}"/rt.entitlements + for frame in ${APP}/Contents/Frameworks/* ; do + echo $frame + codesign --preserve-metadata=identifier --digest-algorithm=sha1,sha256 --force --timestamp --strict -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --entitlements "${CMAKE_BUILD_TYPE}"/rt.entitlements $frame + done + for resource in ${APP}/Contents/Resources/* ; do + echo $resource + if [ ! -d $resource ]; then + codesign --preserve-metadata=identifier --digest-algorithm=sha1,sha256 --force --timestamp --strict -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --entitlements "${CMAKE_BUILD_TYPE}"/rt.entitlements $resource + else + for subresource in ${APP}/Contents/Resources/$(basename $resource)/* ; do + if [ ! -d $subresource ]; then + codesign --preserve-metadata=identifier --digest-algorithm=sha1,sha256 --force --timestamp --strict -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --entitlements "${CMAKE_BUILD_TYPE}"/rt.entitlements $subresource + fi + done + fi + done + codesign --preserve-metadata=identifier --digest-algorithm=sha1,sha256 --force --timestamp --strict -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --entitlements "${CMAKE_BUILD_TYPE}"/rt.entitlements "${APP}"/Contents/MacOS/rawtherapee-cli + codesign --preserve-metadata=identifier --digest-algorithm=sha1,sha256 --force --timestamp --strict -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --entitlements "${CMAKE_BUILD_TYPE}"/rt.entitlements "${APP}"/Contents/MacOS/rawtherapee + codesign --preserve-metadata=identifier --digest-algorithm=sha1,sha256 --force --timestamp --strict -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --entitlements "${CMAKE_BUILD_TYPE}"/rt.entitlements "${APP}" spctl -a -vvvv "${APP}" fi @@ -372,16 +394,16 @@ if [[ -n $NOTARY ]]; then ditto -c -k --sequesterRsrc --keepParent "${APP}" "${APP}.zip" echo "Uploading..." sudo xcrun notarytool submit "${APP}.zip" ${NOTARY} --wait + sudo xcrun stapler staple "${APP}" fi function CreateDmg { local srcDir="$(mktemp -dt $$.XXXXXXXXXXXX)" - + msg "Preparing disk image sources at ${srcDir}:" cp -R "${APP}" "${srcDir}" - cp "${RESOURCES}"/LICENSE "${srcDir}" ln -s /Applications "${srcDir}" - + # Web bookmarks function CreateWebloc { defaults write "${srcDir}/$1" URL "$2" @@ -391,7 +413,7 @@ function CreateDmg { 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 if [[ -n $UNIVERSAL_URL ]]; then arch="Universal" @@ -401,25 +423,27 @@ function CreateDmg { if [[ $lower_build_type != release ]]; then dmg_name="${dmg_name}_${lower_build_type}" fi - + msg "Creating disk image:" if [[ $FANCY_DMG == "ON" ]]; then echo "Building Fancy .dmg" + MESSAGE="$(cat message)" + magick ${PROJECT_SOURCE_DATA_DIR}/rtdmg-bkgd.png -pointsize 80 -fill Black -draw "text 14,1307 '${PROJECT_FULL_VERSION}'" -fill Salmon -draw "text 10,1300 '${PROJECT_FULL_VERSION}'" ./rtdmg-bkgd.png + magick ./rtdmg-bkgd.png -pointsize 90 -fill Black -gravity center -font Menlo-Bold -draw "text 5,120 \"$MESSAGE\"" -fill Red -gravity center -font Menlo-Bold -draw "text 1,124 \"$MESSAGE\"" ./rtdmg-bkgd.png create-dmg \ - --background ${PROJECT_SOURCE_DATA_DIR}/rtdmg-bkgd.png \ + --background ./rtdmg-bkgd.png \ --volname ${PROJECT_NAME}_${PROJECT_FULL_VERSION} \ --volicon ${PROJECT_SOURCE_DATA_DIR}/rtdmg.icns \ --window-pos 72 72 \ - --window-size 1000 689 \ + --window-size 1000 692 \ --text-size 16 \ --icon-size 80 \ - --icon LICENSE 810 0 \ - --icon RawTherapee.app 250 178 \ - --icon Applications 700 178 \ - --icon Website.webloc 300 423 \ - --icon Forum.webloc 420 423 \ - --icon Report\ Bug.webloc 540 423 \ - --icon Documentation.webloc 680 423 \ + --icon RawTherapee.app 250 238 \ + --icon Applications 700 238 \ + --icon Website.webloc 300 487 \ + --icon Forum.webloc 420 487 \ + --icon Report\ Bug.webloc 540 487 \ + --icon Documentation.webloc 680 487 \ --no-internet-enable \ --eula ${PROJECT_SOURCE_DATA_DIR}/../../LICENSE \ --hdiutil-verbose \ @@ -432,13 +456,13 @@ function CreateDmg { 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" + codesign --digest-algorithm=sha1,sha256 --force -v -s "${CODESIGNID}" --timestamp "${dmg_name}.dmg" fi - + # Notarize the dmg if ! test -z "$NOTARY"; then msg "Notarizing the dmg:" @@ -446,7 +470,7 @@ function CreateDmg { echo "Uploading..." sudo xcrun notarytool submit "${dmg_name}.dmg.zip" ${NOTARY} --wait fi - + # Zip disk image for redistribution msg "Zipping disk image for redistribution:" mkdir "${PROJECT_NAME}_macOS_${MINIMUM_SYSTEM_VERSION}_${arch}_${PROJECT_FULL_VERSION}_folder" @@ -462,7 +486,7 @@ function CreateDmg { 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" + mv "${PROJECT_NAME}_macOS_${arch}_latest.zip" "${PROJECT_NAME}_${BRANCH}_macOS_${arch}_${CMAKE_BUILD_TYPE}.zip" fi } diff --git a/tools/osx/rtdmg-bkgd.png b/tools/osx/rtdmg-bkgd.png index a8be0cec6..88e441ff8 100644 Binary files a/tools/osx/rtdmg-bkgd.png and b/tools/osx/rtdmg-bkgd.png differ diff --git a/tools/win/InnoSetup/WindowsInnoSetup.iss.in b/tools/win/InnoSetup/WindowsInnoSetup.iss.in index 954d39991..aa30ad2a5 100644 --- a/tools/win/InnoSetup/WindowsInnoSetup.iss.in +++ b/tools/win/InnoSetup/WindowsInnoSetup.iss.in @@ -102,6 +102,7 @@ Source: "{#MyBuildBasePath}\camconst.json"; DestDir: "{app}"; Flags: ignoreversi Source: "{#MyBuildBasePath}\dcpprofiles\*"; DestDir: "{app}\dcpprofiles\"; Flags: ignoreversion recursesubdirs createallsubdirs ;Source: "{#MyBuildBasePath}\etc\*"; DestDir: "{app}\etc\"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "{#MyBuildBasePath}\iccprofiles\*"; DestDir: "{app}\iccprofiles\"; Flags: ignoreversion recursesubdirs createallsubdirs +Source: "{#MyBuildBasePath}\icons\*"; DestDir: "{app}\icons\"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "{#MyBuildBasePath}\images\*"; DestDir: "{app}\images\"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "{#MyBuildBasePath}\languages\*"; DestDir: "{app}\languages\"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "{#MyBuildBasePath}\licenses\*"; DestDir: "{app}\licenses\"; Flags: ignoreversion recursesubdirs createallsubdirs @@ -118,8 +119,9 @@ Source: "{#MyBuildBasePath}\options"; DestDir: "{app}"; Flags: ignoreversion Source: "{#MyBuildBasePath}\*.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "{#MyBuildBasePath}\gspawn-win{#MyBitDepth}-helper.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "{#MyBuildBasePath}\gspawn-win{#MyBitDepth}-helper-console.exe"; DestDir: "{app}"; Flags: ignoreversion +Source: "{#MyBuildBasePath}\gdbus.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "{#MyBuildBasePath}\gdb.exe"; DestDir: "{app}"; Flags: skipifsourcedoesntexist ignoreversion -Source: "{#MyBuildBasePath}\fonts\DroidSansMonoSlashed.ttf"; DestDir: "{fonts}"; FontInstall: "Droid Sans Mono Slashed"; Flags: onlyifdoesntexist uninsneveruninstall +;Source: "{#MyBuildBasePath}\fonts\DroidSansMonoSlashed.ttf"; DestDir: "{fonts}"; FontInstall: "Droid Sans Mono Slashed"; Flags: onlyifdoesntexist uninsneveruninstall ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [Icons]