diff --git a/.github/workflows/appimage.yml b/.github/workflows/appimage.yml index 318a90c28..5c37486f0 100644 --- a/.github/workflows/appimage.yml +++ b/.github/workflows/appimage.yml @@ -35,7 +35,7 @@ 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 - name: Install Exiv2 run: | @@ -51,6 +51,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,6 +127,27 @@ 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 diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index f57786098..5cb91e47a 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@v3 with: fetch-depth: 0 @@ -77,7 +77,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 +90,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/windows.yml b/.github/workflows/windows.yml index cdd1f9f31..802b25431 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -17,6 +17,7 @@ on: env: publish_pre_dev_labels: '["Lawrence37:libraw-copylib"]' + jobs: build: runs-on: windows-latest @@ -130,14 +131,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." diff --git a/CMakeLists.txt b/CMakeLists.txt index f8424acc6..0fb571f9b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -463,13 +463,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") @@ -496,7 +492,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) 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/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/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/images/svg/template-24.svg b/rtdata/icons/rawtherapee/scalable/apps/template-24.svg similarity index 55% rename from rtdata/images/svg/template-24.svg rename to rtdata/icons/rawtherapee/scalable/apps/template-24.svg index 88d934fc5..9d95f52af 100644 --- a/rtdata/images/svg/template-24.svg +++ b/rtdata/icons/rawtherapee/scalable/apps/template-24.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/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 100% rename from rtdata/images/svg/splash.svg rename to rtdata/images/splash.svg 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/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index f18513c15..53aca2046 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -7,6 +7,7 @@ #006 2020-08-11 十一元人民币 #007 2021-09-24 十一元人民币 #008 2022-07-26 十一元人民币 +#009 2023-12-25 十一元人民币 #100 #101 @LANGUAGE_DISPLAY_NAME=简体中文 @@ -58,8 +59,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) @@ -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;队列已处理 @@ -862,6 +863,8 @@ 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;保存图片 @@ -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;取消 @@ -1254,7 +1257,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,7 +1313,7 @@ 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;方法 @@ -1383,7 +1386,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 @@ -1419,7 +1422,7 @@ 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_SURSOURCE_TOOLTIP;改变色调与色彩以计入场景条件\n\n一般:一般的亮度条件(标准)。图像不被改变\n\n昏暗:较暗的场景。图像会被略微提亮\n\n黑暗:黑暗的环境。图像会被提亮\n\n极暗:非常暗的环境。图片会变得非常亮 TP_COLORAPP_TCMODE_BRIGHTNESS;视明度 TP_COLORAPP_TCMODE_CHROMA;彩度 TP_COLORAPP_TCMODE_COLORF;视彩度 @@ -1430,7 +1433,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 +1525,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 +1540,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;模式 @@ -1630,7 +1633,7 @@ TP_FILMNEGATIVE_REF_LABEL;输入RGB: %1 TP_FILMNEGATIVE_REF_PICK;选择白平衡点 TP_FILMNEGATIVE_REF_TOOLTIP;为输出的正片选择一块灰色区域进行白平衡 TP_FILMSIMULATION_LABEL;胶片模拟 -TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee被设置寻找用于胶片模拟工具的Hald CLUT图像,图像所在的文件夹加载时间过长。\n前往参数设置-图片处理-Hald CLUT路径\n以寻找被使用的文件夹是哪个。你应该令该文件夹指向一个只有Hald CLUT图像而没有其他图片的文件夹,而如果你不想用胶片模拟功能,就将它指向一个空文件夹。\n\n阅读RawPedia的Film Simulation词条以获取更多信息。\n\n你现在想取消扫描吗? +TP_FILMSIMULATION_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 +1644,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 +1665,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均衡器 @@ -1725,7 +1728,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 +1816,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 +1836,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,7 +1846,6 @@ 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) @@ -1887,7 +1889,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 +2092,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 +2127,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 +2141,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 +2166,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;旋转 @@ -2316,7 +2318,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;肤色和其它色彩 @@ -2445,6 +2447,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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-- @@ -3002,7 +3005,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 +3083,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 +3106,64 @@ 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 Cie mask blur contrast +!HISTORY_MSG_LOCAL_CIEMASK_BLURFFT;Local Cie mask blur fftw +!HISTORY_MSG_LOCAL_CIEMASK_BLURRAD;Local Cie mask blur radius +!HISTORY_MSG_LOCAL_CIEMASK_CHH;Local Cie mask curve hh +!HISTORY_MSG_LOCAL_CIEMASK_HIGH;Local Cie mask highlights +!HISTORY_MSG_LOCAL_CIEMASK_SHAD;Local Cie mask shadows +!HISTORY_MSG_LOCAL_CIEMASK_STRU;Local Cie mask structure +!HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;Local Cie mask structure as tool +!HISTORY_MSG_LOCAL_CIEMASK_WLC;Local CIECAM mask wavelet Lc +!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;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;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_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 @@ -3235,8 +3302,6 @@ 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. @@ -3244,6 +3309,9 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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,12 +3332,15 @@ 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_SPOTLOC;Define Spot method for Local Adjustments !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. @@ -3292,6 +3363,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 +3400,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:\n 1) for low values adjust the image purity.\n 2) for higher values, carry out moderate Color Toning.\n 3) Be 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 @@ -3383,6 +3479,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 +3500,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), 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,7 +3520,9 @@ 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. @@ -3428,10 +3534,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;Destination primaries (Advanced): which 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 not too different, 'Working Profiles' are not modified. Perform a gamut control.\nWhen 'Custom LA (sliders)' is selected you can modify the values of the 3 primaries Red, Green, 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 @@ -3458,7 +3567,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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).\n\nDefault: Munsell only.\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 +3591,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 +3612,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 +3629,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' or 'Soft Light and Original Retinex' or 'Blur/Grain and Denoise' or 'Dehaze and Retinex' or 'Contrast by Detail Levels' in 'Add tool to current spot' menu.\nFor others tools Preview ΔE button is 'in the tool' - to be able to preview ΔE with several tools enabled, use preferably 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 theshold 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. @@ -3530,11 +3652,12 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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 +3673,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 +3684,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 local adjustment 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 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.\n\n'Global' allows you to use the local adjustment tools on the whole image, without using deltaE 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_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. @@ -3581,6 +3707,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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_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. @@ -3675,8 +3802,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.:\nThe user 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 tu 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 +3813,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 +3881,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 @@ -3777,7 +3907,6 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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 @@ -3787,6 +3916,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 @@ -3817,6 +3947,11 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !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_PRECAMGAMUT_TOOLTIP;If checked ensures a gamut control just after primary conversion to XYZ matrix. +!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;This 'Source Data Adjustments' modifies: a)the Dynamic Range using Log encoding; b) the tones of the image and primaries(simplified Abstract Profile) and also midtones, just before the Ciecam process. The values 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.\n\n\n-Destination primaries: which 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 not too different (be careful), 'Working Profiles' are not modified.\nYou can also finely adapt the primaries and the illuminant (white-point).\nMoving 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 +3980,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 +3991,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 +4021,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 the'Ciecam' and 'Sigmoid Q'.\nSigmoid Q: three 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)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 comboxbox 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 comboxbox 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. This last value stands for brightness (Q) should be a near the possible value 'Compression treshold' (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.\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_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 - Slope - based: choice (Standard and Advanced) allows you to simulate a "Tone mapping" using: a) Scene conditions: Black-Ev, White-Ev, Mean luminance (Yb%); b) Viewing conditions: Mean luminance (Yb%).\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 +4063,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 +4092,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. @@ -4243,7 +4405,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 @@ -4251,8 +4413,5 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_WBALANCE_SOLUX47;Solux 4700K (vendor) !TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) !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/Italiano b/rtdata/languages/Italiano index c150994ee..5ef63de7b 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 -EDITWINDOW_TITLE;Modifica immagine +DONT_SHOW_AGAIN;Non mostrare più questo messaggio. +DYNPROFILEEDITOR_DELETE;Elimina +DYNPROFILEEDITOR_EDIT_RULE;Modifica regola profilo dinamico +DYNPROFILEEDITOR_EDIT;Modifica +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_RULE;Nuova regola del profilo dinamico +DYNPROFILEEDITOR_NEW;Nuovo +DYNPROFILEEDITOR_PROFILE;Profilo di elaborazione 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. +EDITWINDOW_TITLE;Modifica immagine +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 @@ -58,10 +86,12 @@ 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_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] @@ -74,27 +104,39 @@ EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;Ignora i Passaggi di Miglioramento LMMSE EXPORT_BYPASS_SHARPENEDGE;Ignora Nitidezza dei bordi EXPORT_BYPASS_SHARPENING;Ignora Nitidezza EXPORT_BYPASS_SHARPENMICRO;Ignora Microcontrasto +EXPORT_BYPASS;Passaggi di elaborazione da bypassare 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_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_FAST_PIPELINE;Dedicato (elaborazione completa sull'immagine ridimensionata) +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_APPLYPROFILE;Applica 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 +155,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 +171,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 +188,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 +200,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 +216,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_AS;Salva come… GENERAL_SAVE;Salva +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_RAW;Istogramma grezzo +HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Istogramma +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 +303,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 +414,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 +422,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 +459,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 +467,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 +490,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,28 +510,1151 @@ 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_NEWSNAPSHOT;Aggiungi +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_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_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_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_BOOST;CS - Aumento del raggio d'angolo +HISTORY_MSG_PDSHARPEN_RADIUS;CS - Raggio +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_RAW_BORDER;Raw confine +HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correzione - Iterazione +HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correzione - Evita il cambiamento di colore +HISTORY_MSG_RESIZE_ALLOWUPSCALING;Ridimensiona - Consente l'ingrandimento +HISTORY_MSG_RESIZE_LONGEDGE;Ridimensiona - Bordo lungo +HISTORY_MSG_RESIZE_SHORTEDGE;Ridimensiona - Bordo corto +HISTORY_MSG_SH_COLORSPACE;S/H - Spazio colore +HISTORY_MSG_SHARPENING_BLUR;Nitidezza - Raggio di sfocatura +HISTORY_MSG_SHARPENING_CONTRAST;Nitidezza - Soglia di contrasto +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_ENTRY;Rimozione delle macchie - modifica punto +HISTORY_MSG_SPOT;Rimozione delle macchie +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_TOOLTIP;Scorciatoia: Alt-s +HISTORY_NEWSNAPSHOT;Aggiungi HISTORY_SNAPSHOT;Istantanea HISTORY_SNAPSHOTS;Istantanee +ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Ripristina il copyright predefinito, concesso a "RawTherapee, CC0". +ICCPROFCREATOR_COPYRIGHT;Copyright: +ICCPROFCREATOR_CUSTOM;Predefinito +ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Aggiungi i valori gamma e pendenza alla descrizione +ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Lascia vuoto per impostare la descrizione predefinita. +ICCPROFCREATOR_DESCRIPTION;Descrizione: +ICCPROFCREATOR_GAMMA;Gamma +ICCPROFCREATOR_ICCVERSION;ICC versione: +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_ILL;Illuminante: +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_PRIMARIES;Primarie: +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). @@ -455,22 +1662,24 @@ 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_TOOLTIP;Modifica l'immagine corrente con un programma di fotoritocco.\nScorciatoia: Ctrl+E +MAIN_BUTTON_SENDTOEDITOR;Modifica l'immagine nell'editor esterno MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Mostra/Nascondi tutti i pannelli laterali.\nScorciatoia: m MAIN_BUTTON_UNFULLSCREEN;Esci da schermo intero -MAIN_FRAME_EDITOR;Modifica MAIN_FRAME_EDITOR_TOOLTIP;Modifica.\nScorciatoia: Ctrl-F4 -MAIN_FRAME_FILEBROWSER;Navigatore +MAIN_FRAME_EDITOR;Modifica MAIN_FRAME_FILEBROWSER_TOOLTIP;Navigatore.\nScorciatoia: Ctrl-F2 -MAIN_FRAME_PLACES;Risorse +MAIN_FRAME_FILEBROWSER;Navigatore MAIN_FRAME_PLACES_ADD;Aggiungi -MAIN_FRAME_QUEUE;Coda di sviluppo +MAIN_FRAME_PLACES_DEL;Rimuovere +MAIN_FRAME_PLACES;Risorse MAIN_FRAME_QUEUE_TOOLTIP;Coda di sviluppo.\nScorciatoia: Ctrl-F3 +MAIN_FRAME_QUEUE;Coda di sviluppo MAIN_FRAME_RECENT;Cartelle recenti MAIN_MSG_ALREADYEXISTS;File già esistente MAIN_MSG_CANNOTLOAD;Impossibile caricare l'immagine MAIN_MSG_CANNOTSAVE;Errore nel salvataggio del file -MAIN_MSG_CANNOTSTARTEDITOR;Non riesco ad avviare il programma di fotoritocco. MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;Inserisci il percorso corretto nelle "Preferenze". +MAIN_MSG_CANNOTSTARTEDITOR;Non riesco ad avviare il programma di fotoritocco. MAIN_MSG_EMPTYFILENAME;Nome del file non specificato! MAIN_MSG_IMAGEUNPROCESSED;Questo comando richiede che tutte le immagini selezionate vengano prima elaborate nella coda. MAIN_MSG_NAVIGATOR;Navigatore @@ -478,27 +1687,36 @@ 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_COLOR;Colore +MAIN_TAB_ADVANCED_TOOLTIP;Scorciatoia: Alt-a +MAIN_TAB_ADVANCED;Avanzate MAIN_TAB_COLOR_TOOLTIP;Scorciatoia: Alt-c -MAIN_TAB_DETAIL;Dettaglio +MAIN_TAB_COLOR;Colore MAIN_TAB_DETAIL_TOOLTIP;Scorciatoia: Alt-d -MAIN_TAB_DEVELOP; Modifiche Batch +MAIN_TAB_DETAIL;Dettaglio +MAIN_TAB_DEVELOP; Modifiche Batch MAIN_TAB_EXIF;Exif -MAIN_TAB_EXPORT; Esportazione Rapida -MAIN_TAB_EXPOSURE;Esposizione +MAIN_TAB_EXPORT; Esportazione Rapida MAIN_TAB_EXPOSURE_TOOLTIP;Scorciatoia: Alt-e -MAIN_TAB_FILTER; Filtro +MAIN_TAB_EXPOSURE;Esposizione +MAIN_TAB_FAVORITES_TOOLTIP;Scorciatoia: Alt-u +MAIN_TAB_FAVORITES;Preferiti +MAIN_TAB_FILTER; Filtro +MAIN_TAB_INSPECT; Inspect MAIN_TAB_IPTC;IPTC -MAIN_TAB_METADATA;Metadati +MAIN_TAB_LOCALLAB_TOOLTIP;Scorciatoia: Alt-o +MAIN_TAB_LOCALLAB;Local MAIN_TAB_METADATA_TOOLTIP;Scorciatoia: Alt-m -MAIN_TAB_RAW;Raw +MAIN_TAB_METADATA;Metadati MAIN_TAB_RAW_TOOLTIP;Scorciatoia: Alt-r -MAIN_TAB_TRANSFORM;Trasformazione +MAIN_TAB_RAW;Raw MAIN_TAB_TRANSFORM_TOOLTIP;Scorciatoia: Alt-t +MAIN_TAB_TRANSFORM;Trasformazione 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 +1726,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 +1746,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 +1757,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,49 +1791,108 @@ 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_RAWCACORR_AUTO;Autocorrezione AC -PARTIALPASTE_RAWEXPOS_BLACK;Punto del Nero -PARTIALPASTE_RAWEXPOS_LINEAR;Correzione Punto del Bianco -PARTIALPASTE_RAWGROUP;Impostazioni del Raw +PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;Filtro linee PDAF +PARTIALPASTE_PREPROCWB;Preelaborare il bilanciamento del bianco +PARTIALPASTE_PRSHARPENING;Affinamento post-ridimensionamento +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_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_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_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_PSEUDOHIDPI;Modo Pseudo-HiDPI +PREFERENCES_APPEARANCE_THEME;Tema +PREFERENCES_APPEARANCE;Aspetto 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_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_CACHECLEAR;Pulisci 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_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_CHUNKSIZES;Riquadri per tipo di esecuzione +PREFERENCES_CIE;Ciecam +PREFERENCES_CIEARTIF;Evita artefatti PREFERENCES_CLIPPINGIND;Indicazione di tosaggio +PREFERENCES_CLUTSCACHE_LABEL;Numero massimo di cache CLUTs +PREFERENCES_CLUTSCACHE;HaldCLUT Cache +PREFERENCES_CLUTSDIR;Directory HaldCLUT +PREFERENCES_CMMBPC;Compensazione del punti di Nero +PREFERENCES_COMPLEXITY_EXP;Avanzate +PREFERENCES_COMPLEXITY_NORM;Standard +PREFERENCES_COMPLEXITY_SIMP;Di base +PREFERENCES_COMPLEXITYLOC;Complessità predefinita per le regolazioni locali +PREFERENCES_CROP_AUTO_FIT;Zoom automaticamente per adattare il ritaglio +PREFERENCES_CROP_GUIDES_FRAME;Frame +PREFERENCES_CROP_GUIDES_FULL;Originale +PREFERENCES_CROP_GUIDES_NONE;Nessuno +PREFERENCES_CROP_GUIDES;Guide visualizzate quando non si modifica il ritaglio +PREFERENCES_CROP;Modifica del ritaglio +PREFERENCES_CURVEBBOXPOS_ABOVE;Sopra +PREFERENCES_CURVEBBOXPOS_BELOW;Sotto +PREFERENCES_CURVEBBOXPOS_LEFT;Sinistra +PREFERENCES_CURVEBBOXPOS_RIGHT;Destra +PREFERENCES_CURVEBBOXPOS;Posizione dei pulsanti copia e incolla della curva 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 PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Nome PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID +PREFERENCES_CUSTPROFBUILDKEYFORMAT;Formato tasti PREFERENCES_CUSTPROFBUILDPATH;Percorso dell'eseguibile PREFERENCES_DARKFRAMEFOUND;Trovati PREFERENCES_DARKFRAMESHOTS;fotogrammi @@ -610,40 +1900,77 @@ 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_CURRENT;Uguale all'immagine di input +PREFERENCES_EXTEDITOR_DIR_CUSTOM;Personalizza +PREFERENCES_EXTEDITOR_DIR_TEMP;OS Directory temporanea +PREFERENCES_EXTEDITOR_DIR;Cartella di destinazione +PREFERENCES_EXTEDITOR_FLOAT32;Output TIFF in virgola mobile a 32 bit +PREFERENCES_EXTERNALEDITOR_CHANGE_FILE;Modifica eseguibile +PREFERENCES_EXTERNALEDITOR_CHANGE;Cambia applicazione +PREFERENCES_EXTERNALEDITOR_COLUMN_COMMAND;Comando +PREFERENCES_EXTERNALEDITOR_COLUMN_NAME;Nome +PREFERENCES_EXTERNALEDITOR_COLUMN_NATIVE_COMMAND;Comando nativo PREFERENCES_EXTERNALEDITOR;Programma di ritocco esterni 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_HINT;Avere dimensioni delle miniature separate richiederà più tempo di elaborazione ogni volta che passerai dalla scheda Editor singolo al Browser file. +PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Stessa altezza della miniatura tra la pellicola e il browser dei 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_HISTOGRAMPOSITIONLEFT;Istogramma nel pannello sinistro PREFERENCES_HLTHRESHOLD;Soglia per le alteluci tosate PREFERENCES_ICCDIR;Cartella profili colore PREFERENCES_IMPROCPARAMS;Parametri predefiniti di elaborazione dell'immagine +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_INSPECTORWINDOW;Apri la visualizzazione nella tua finestra o a schermo intero 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_TOOLTIP;Directory contenente il database Lensfun. Lascia vuoto per utilizzare le directory predefinite. +PREFERENCES_LENSFUNDBDIR;Directory del database di Lensfun +PREFERENCES_LENSPROFILESDIR_TOOLTIP;Directory contenente i profili di correzione dell'obiettivo Adobe (LCP) +PREFERENCES_LENSPROFILESDIR;Directory dei profili degli obiettivi +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_SYNC_NONE;Spento +PREFERENCES_METADATA_SYNC_READ;Solo lettura +PREFERENCES_METADATA_SYNC_READWRITE;Bidirezionale +PREFERENCES_METADATA_SYNC;Sincronizzazione dei metadati con sidecar XMP +PREFERENCES_METADATA;Metadata +PREFERENCES_MONINTENT;Intento di rendering predefinito +PREFERENCES_MONITOR;Monitor +PREFERENCES_MONPROFILE_WARNOSX;A causa delle limitazioni di MacOS, è supportato solo sRGB. +PREFERENCES_MONPROFILE;Profilo colore predefinito PREFERENCES_MULTITAB;Modalità a Schede Multiple PREFERENCES_MULTITABDUALMON;Modalità a Schede Multiple (se disponibile sul secondo schermo) +PREFERENCES_NAVIGATIONFRAME;Navigazione +PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Sovrapponi i nomi dei file alle miniature nel pannello dell'editor PREFERENCES_OVERLAY_FILENAMES;Mostra i nomi dei file sovrapposti alle miniature PREFERENCES_OVERWRITEOUTPUTFILE;Sovrascrivi file esistenti PREFERENCES_PANFACTORLABEL;Fattore @@ -651,19 +1978,43 @@ 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_HINT;Registra i tempi di elaborazione nella console +PREFERENCES_PERFORMANCE_MEASURE;Misurare +PREFERENCES_PERFORMANCE_THREADS_LABEL;Numero massimo di thread per la riduzione del rumore e i livelli wavelet (0 = automatico) +PREFERENCES_PERFORMANCE_THREADS;Discussioni +PREFERENCES_PREVDEMO_FAST;Veloce +PREFERENCES_PREVDEMO_LABEL;Metodo di demosaicizzazione utilizzato per l'anteprima con zoom <100%: +PREFERENCES_PREVDEMO_SIDECAR;Come in PP3 +PREFERENCES_PREVDEMO;Anteprima metodo di Demosaicizzazione +PREFERENCES_PRINTER;Stampa (Soft-Proofing) +PREFERENCES_PROFILE_NONE;Nessuno 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_PROPERTY;Proprietà +PREFERENCES_PRTINTENT;Intento di rendering +PREFERENCES_PRTPROFILE;Profilo Colore PREFERENCES_PSPATH;Cartella d'installazione di Adobe Photoshop +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_REMEMBERZOOMPAN;Ricorda la percentuale di zoom e l'offset del pan +PREFERENCES_SAVE_TP_OPEN_NOW;Salva ora lo stato compresso/espanso dello strumento PREFERENCES_SELECTLANG;Seleziona la lingua +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_SERIALIZE_TIFF_READ;Impostazioni di lettura TIFF 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 +2025,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_IF_NO_JPEG_FULLSIZE;JPEG incorporato se a grandezza naturale, raw neutro altrimenti +PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Rendering RAW neutro +PREFERENCES_TOOLPANEL_AVAILABLETOOLS;Strumenti disponibili +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_CLONE_FAVORITES;Mantieni gli strumenti preferiti nelle posizioni originali +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_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_WBACORR;Bilanciamento del bianco - correlazione automatica della temperatura +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_EXT;darktable-like (FILENAME.ext.xmp for FILENAME.ext) +PREFERENCES_XMP_SIDECAR_MODE_STD;Standard (FILENAME.xmp for FILENAME.ext) +PREFERENCES_XMP_SIDECAR_MODE;Stile sidecar XMP +PREFERENCES_ZOOMONSCROLL;Ingrandire le immagini scorrendole PROFILEPANEL_COPYPPASTE;Parametri da copiare PROFILEPANEL_GLOBALPROFILES;Profili inclusi PROFILEPANEL_LABEL;Profili di sviluppo @@ -690,6 +2070,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,30 +2080,53 @@ 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_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_PROCESSING;Elaborazione dell'immagine... +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. -QUEUE_AUTOSTART;Autoavvia +QINFO_PIXELSHIFT;Spostamento dei pixel / %2 frame(s) QUEUE_AUTOSTART_TOOLTIP;Inizia a sviluppare automaticamente quando un nuovo lavoro viene accodato +QUEUE_AUTOSTART;Autoavvia 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_TEMPLATE;Usa lo schema +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_16;16-bit virgola mobile +SAMPLEFORMAT_2;16-bit non firmato +SAMPLEFORMAT_32;24-bit virgola mobile +SAMPLEFORMAT_4;24-bit LogLuv +SAMPLEFORMAT_64;32-bit virgola mobile +SAMPLEFORMAT_8;32-bit LogLuv SAVEDLG_AUTOSUFFIX;Aggiungi automaticamente un suffisso se il file esiste già +SAVEDLG_BIGTIFF;Grande TIFF (no supporto ai metadati) +SAVEDLG_FILEFORMAT_FLOAT; virgola mobile SAVEDLG_FILEFORMAT;Formato file SAVEDLG_FORCEFORMATOPTS;Opzioni di salvataggio forzato SAVEDLG_JPEGQUAL;Qualità JPEG @@ -731,13 +2135,29 @@ SAVEDLG_PUTTOQUEUEHEAD;Metti in cima alla coda di sviluppo SAVEDLG_PUTTOQUEUETAIL;Metti in fondo alla coda di sviluppo SAVEDLG_SAVEIMMEDIATELY;Salva subito SAVEDLG_SAVESPP;Salva i parametri di elaborazione con l'immagine -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_SUBSAMP;Sottocampionamento 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,24 +2165,25 @@ 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 TP_BWMIX_ALGO_LI;Lineare TP_BWMIX_ALGO_SP;Effetti speciali TP_BWMIX_ALGO_TOOLTIP;Lineare: produrrà una risposta normale lineare.\nEffetti speciali: produrrà effetti speciali miscelando i canali non-linearmente. +TP_BWMIX_ALGO;Algoritmo OYCPM TP_BWMIX_AUTOCH;Auto TP_BWMIX_CC_ENABLED;Regola il colore complementare TP_BWMIX_CC_TOOLTIP;Abilita per consentire le regolazioni automatiche dei colori complementari nella modalità ROYGCBPM. TP_BWMIX_CHANNEL;Equalizzatore di Luminanza -TP_BWMIX_CURVEEDITOR1;Curva 'Prima' -TP_BWMIX_CURVEEDITOR2;Curva 'Dopo' TP_BWMIX_CURVEEDITOR_AFTER_TOOLTIP;Curva Tono, dopo la conversione B&W, alla fine del trattamento. TP_BWMIX_CURVEEDITOR_BEFORE_TOOLTIP;Curva Tono, appena prima della conversione B&W.\nPuò prendere in considerazione le componenti colore. TP_BWMIX_CURVEEDITOR_LH_TOOLTIP;Luminosità secondo Tonalità L=f(H).\nFai attenzione ai valori estermi: possono generare artefatti. -TP_BWMIX_FILTER;Filtro Colore +TP_BWMIX_CURVEEDITOR1;Curva 'Prima' +TP_BWMIX_CURVEEDITOR2;Curva 'Dopo' TP_BWMIX_FILTER_BLUE;Blu TP_BWMIX_FILTER_BLUEGREEN;Blu-Verde TP_BWMIX_FILTER_GREEN;Verde @@ -773,18 +2194,19 @@ TP_BWMIX_FILTER_RED;Rosso TP_BWMIX_FILTER_REDYELLOW;Rosso-Giallo TP_BWMIX_FILTER_TOOLTIP;Il filtro colore simula uno scatto con un filtro colorato posto davanti all'obiettivo. I filtri colorati riducono la trasmissione di uno specifico intervallo di colori modificando la loro luminosità. Ad esempio, un filtro rosso scurisce i cieli blu. TP_BWMIX_FILTER_YELLOW;Giallo -TP_BWMIX_GAMMA;Correzione Gamma +TP_BWMIX_FILTER;Filtro Colore TP_BWMIX_GAM_TOOLTIP;Corregge il gamma per ogni canale RGB. +TP_BWMIX_GAMMA;Correzione Gamma TP_BWMIX_LABEL;Bianco-Nero -TP_BWMIX_MET;Metodo TP_BWMIX_MET_CHANMIX;Miscelatore Canali TP_BWMIX_MET_DESAT;Desaturazione TP_BWMIX_MET_LUMEQUAL;Equalizzatore di Luminanza -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_MET;Metodo +TP_BWMIX_MIXC;Miscelatore di canali +TP_BWMIX_NEUTRAL;Ripristina 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. -TP_BWMIX_SETTING;Preimpostazioni -TP_BWMIX_SETTING_TOOLTIP;Impostazioni delle Preimpostazioni (pellicola, panorama, etc.) o del Miscelatore Canali manuale. +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_RGBLABEL;R: %1%% G: %2%% B: %3%% Totale: %4%% TP_BWMIX_SET_HIGHCONTAST;Contrasto Elevato TP_BWMIX_SET_HIGHSENSIT;Sensibilità Elevata TP_BWMIX_SET_HYPERPANCHRO;Iper-Pancromatica @@ -800,6 +2222,8 @@ TP_BWMIX_SET_RGBABS;RGB assoluto TP_BWMIX_SET_RGBREL;RGB relativo TP_BWMIX_SET_ROYGCBPMABS;ROYGCBPM assoluto TP_BWMIX_SET_ROYGCBPMREL;ROYGCBPM relativo +TP_BWMIX_SETTING_TOOLTIP;Impostazioni delle Preimpostazioni (pellicola, panorama, etc.) o del Miscelatore Canali manuale. +TP_BWMIX_SETTING;Preimpostazioni TP_BWMIX_TCMODE_FILMLIKE;BN tipo pellicola TP_BWMIX_TCMODE_SATANDVALBLENDING;BN Fusione Saturazione e Valore TP_BWMIX_TCMODE_STANDARD;BN Standard @@ -808,6 +2232,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_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_CBDL_METHOD;Processo individuato TP_CHMIXER_BLUE;Canale Blu TP_CHMIXER_GREEN;Canale Verde TP_CHMIXER_LABEL;Miscelatore Canali @@ -816,54 +2244,88 @@ 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_ALGO;Algoritmo +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_ALL;Tutto TP_COLORAPP_ALGO_JC;Chiarezza + Croma (JC) TP_COLORAPP_ALGO_JS;Chiarezza + Saturazione (JS) TP_COLORAPP_ALGO_QM;Brillanza + Pienezza (QM) TP_COLORAPP_ALGO_TOOLTIP;Scegli un sottoinsieme di parametri o tutti -TP_COLORAPP_BADPIXSL;Filtro pixel surriscaldati/guasti +TP_COLORAPP_ALGO;Algoritmo 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_BADPIXSL;Filtro pixel surriscaldati/guasti 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_CHROMA;Croma (C) -TP_COLORAPP_CHROMA_M;Pienezza (M) +TP_COLORAPP_BRIGHT;Brillanza (Q) +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_M_TOOLTIP;La Pienezza in CIECAM02 è diversa da quella in Lab e RGB. -TP_COLORAPP_CHROMA_S;Saturazione (S) +TP_COLORAPP_CHROMA_M;Pienezza (M) TP_COLORAPP_CHROMA_S_TOOLTIP;La Saturazione in CIECAM02 è diversa da quella in Lab e RGB. +TP_COLORAPP_CHROMA_S;Saturazione (S) TP_COLORAPP_CHROMA_TOOLTIP;Il Croma in CIECAM02 è diverso da quello in Lab e RGB. +TP_COLORAPP_CHROMA;Croma (C) TP_COLORAPP_CIECAT_DEGREE;Adattamento CAT02 -TP_COLORAPP_CONTRAST;Contrasto (J) -TP_COLORAPP_CONTRAST_Q;Contrasto (Q) +TP_COLORAPP_CIECAT_DEGREEOUT;Visualizzazione dell'adattamento cromatico TP_COLORAPP_CONTRAST_Q_TOOLTIP;Contrasto per il cursore Q in CIECAM02; è diverso da quello in Lab e RGB. +TP_COLORAPP_CONTRAST_Q;Contrasto (Q) TP_COLORAPP_CONTRAST_TOOLTIP;Contrasto per il cursore J in CIECAM02; è diverso da quello in Lab e RGB. -TP_COLORAPP_CURVEEDITOR1;Curva Tono 1 +TP_COLORAPP_CONTRAST;Contrasto (J) TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Mostra l'istogramma di L (Lab) prima di CIECAM02.\nSe "Mostra gli istogrammi di uscita CIECAM02 nelle curve" è abilitato, mostra gli istogrammi di J o Q dopo CIECAM02.\n\nJ e Q non sono mostrati nel pannello Istogramma.\n\nPer l'output finale fare riferimento al pannello Istogramma -TP_COLORAPP_CURVEEDITOR2;Curva Tono 2 +TP_COLORAPP_CURVEEDITOR1;Curva Tono 1 TP_COLORAPP_CURVEEDITOR2_TOOLTIP;Stesso utilizzo della Curva Tono 2 di Esposizione -TP_COLORAPP_CURVEEDITOR3;Curva Colore +TP_COLORAPP_CURVEEDITOR2;Curva Tono 2 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_CURVEEDITOR3;Curva Colore 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_DATACIE;Mostra gli istogrammi di uscita CIECAM02 nelle curve +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_HUE;Tinta (h) +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_GEN;Impostazioni TP_COLORAPP_HUE_TOOLTIP;Tinta (h) - angolo tra 0° e 360° -TP_COLORAPP_LABEL;Modello di Aspetto Colore CIE 2002 +TP_COLORAPP_HUE;Tinta (h) +TP_COLORAPP_IL41;D41 +TP_COLORAPP_IL50;D50 +TP_COLORAPP_IL55;D55 +TP_COLORAPP_IL60;D60 +TP_COLORAPP_IL65;D65 +TP_COLORAPP_IL75;D75 +TP_COLORAPP_ILA;Incandescente StdA 2856K +TP_COLORAPP_ILFREE;Libero +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_ILLUM;Illuminante 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_LABEL;Modello di Aspetto Colore CIE 2002 TP_COLORAPP_LIGHT_TOOLTIP;La Chiarezza in CIECAM02 è diversa da quella in Lab e RGB. -TP_COLORAPP_MODEL;Modello del Punto di Bianco +TP_COLORAPP_LIGHT;Chiarezza (J) +TP_COLORAPP_MEANLUMINANCE;Luminanza media (Yb%) +TP_COLORAPP_MOD02;CAM02 +TP_COLORAPP_MOD16;CAM16 TP_COLORAPP_MODEL_TOOLTIP;Modello del Punto di bianco.\n\nWB [RT] + [output]: Per la scena viene usato il Bilanciamento del Bianco di RT, CIECAM02 è impostato a D50, il bianco del dispositivo di uscita utilizza il valore impostato in Preferenze > Gestione Colore.\n\nWB [RT+CAT02] + [output]: Le impostazioni di Bilanciamento del Bianco di RT sono utilizzate da CAT02 e il bianco del dispositivo di uscita utilizza il valore impostato in Preferenze > Gestione Colore. -TP_COLORAPP_RSTPRO;Protezione rossi e incarnato +TP_COLORAPP_MODEL;Modello del Punto di Bianco +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_MODELCAT;CAM +TP_COLORAPP_NEUTRAL_TOOLTIP;Ripristina tutte le caselle di controllo e le curve dei cursori ai valori predefiniti. +TP_COLORAPP_NEUTRAL;Reset TP_COLORAPP_RSTPRO_TOOLTIP;Protezione dei toni rossi e dell'incarnato (cursori e curve) -TP_COLORAPP_SURROUND;Ambiente +TP_COLORAPP_RSTPRO;Protezione rossi e incarnato +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_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_SURROUND;Ambiente +TP_COLORAPP_SURROUNDSRC;Circondare +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 +2334,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_TONECIE;Tone mapping con CIECAM02 +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_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_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_TONECIE;Tone mapping con CIECAM02 TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Luminanza assoluta dell'ambiente di visualizzazione\n(normalmente 16cd/m²). +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_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_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +TP_COLORTONING_LABGRID;L*a*b* griglia correzione colore +TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +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_CHANNEL;Canale +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_LABREGIONS;Zona correzione colore +TP_COLORTONING_LUMA;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_LUMAMODE;Preserva la luminanza +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_METHOD;Metodo +TP_COLORTONING_MIDTONES;Mezzitoni +TP_COLORTONING_NEUTRAL_TOOLTIP;Ripristina tutti i valori (ombre, mezzitoni, luci) ai valori predefiniti. +TP_COLORTONING_NEUTRAL;Ripristina i cursori +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,60 +2427,141 @@ 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_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_CURVE;Curva di crominanza +TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Crominanza +TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manuale TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Crominanza (Principale) +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_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_PMZ;Anteprima multizona +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Dimensione anteprima=%1, Centro: Px=%2 Py=%3 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Rumore dell'anteprima: Medio=%1 Alto=%2 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Dimensione tessera=%1, Centro: Tx=%2 Ty=%3 +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_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_COLORSPACE;Metodo +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_AUTO_GAIN;Compensazione per leggerezza 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_COLORSPACE;Metodo TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Il gamma varia la forza della riduzione rumore su tutto l'intervallo di toni. Valori più piccoli incideranno sulle ombre, mentre valori maggiori estenderanno l'effetto ai toni più luminosi. -TP_DIRPYREQUALIZER_ALGO;Algoritmo Pelle +TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +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_MAIN_MODE;Modo +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_METHOD;Metodo mediano +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_PASSES;Iterazioni mediane +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_MEDIAN_TYPE;Tipo mediano +TP_DIRPYRDENOISE_TYPE_3X3;3×3 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +TP_DIRPYRDENOISE_TYPE_5X5;5×5 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +TP_DIRPYRDENOISE_TYPE_7X7;7×7 +TP_DIRPYRDENOISE_TYPE_9X9;9×9 TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: più simile ai colori dell'incarnato, minimizzando l'azione di altri colori\nAmpio: evita ulteriori artefatti -TP_DIRPYREQUALIZER_HUESKIN;Tonalità della Pelle +TP_DIRPYREQUALIZER_ALGO;Algoritmo Pelle +TP_DIRPYREQUALIZER_ARTIF;Ridurre gli artefatti 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_HUESKIN;Tonalità della Pelle TP_DIRPYREQUALIZER_LABEL;Contrasto per livelli di dettaglio (CbDL) TP_DIRPYREQUALIZER_LUMACOARSEST;Estesissimo TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrasto- TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrasto+ TP_DIRPYREQUALIZER_LUMAFINEST;Finissimo TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutro -TP_DIRPYREQUALIZER_SKIN;Toni della Pelle - Elaborazione/Protezione TP_DIRPYREQUALIZER_SKIN_TOOLTIP;A -100 i toni della pelle sono elaborati.\nA 0 tutti i toni sono trattati allo stesso modo.\nA +100 i toni della pelle sono protetti mentre gli altri toni sono elaborati. +TP_DIRPYREQUALIZER_SKIN;Toni della Pelle - Elaborazione/Protezione 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_EXPOSURE_AUTOLEVELS;Livelli automatici +TP_EPD_STRENGTH;Intensità +TP_EXPOS_BLACKPOINT_LABEL;Raw Punto di nero +TP_EXPOS_WHITEPOINT_LABEL;Raw Punto di bianco 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_AUTOLEVELS;Livelli automatici TP_EXPOSURE_BLACKLEVEL;Livello del nero TP_EXPOSURE_BRIGHTNESS;Luminosità -TP_EXPOSURE_CLIP;Tosaggio % +TP_EXPOSURE_CLAMPOOG;Ritaglia i colori fuori gamma TP_EXPOSURE_CLIP_TOOLTIP;La frazione di pixel da tosare nell'operazione di livelli automatici. +TP_EXPOSURE_CLIP;Tosaggio % TP_EXPOSURE_COMPRHIGHLIGHTS;Compressione Alteluci TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Soglia di Compressione Alteluci TP_EXPOSURE_COMPRSHADOWS;Compressione Ombre TP_EXPOSURE_CONTRAST;Contrasto 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_CURVEEDITOR2;Curva Tono 2 TP_EXPOSURE_EXPCOMP;Compensazione Esposizione +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_HISTMATCHING;Curva di tono con abbinamento automatico 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_FILMNEGATIVE_BLUE;Rapporto blu +TP_FILMNEGATIVE_BLUEBALANCE;Caldo/Freddo +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_COLORSPACE;Inversione spazio colore: +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_SIZE;Misura: +TP_FILMNEGATIVE_PICK;Scegli punti neutri +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,24 +2569,30 @@ TP_FLATFIELD_BT_AREA;Area TP_FLATFIELD_BT_HORIZONTAL;Orizzontale TP_FLATFIELD_BT_VERTHORIZ;Vert. + Oriz. TP_FLATFIELD_BT_VERTICAL;Verticale +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_CLIPCONTROL;Controllo della clip +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 -TP_GRADIENT_CENTER_X;Centro X TP_GRADIENT_CENTER_X_TOOLTIP;Sposta il gradiente a sinistra (valori negativi) o a destra (valori positivi). -TP_GRADIENT_CENTER_Y;Centro Y +TP_GRADIENT_CENTER_X;Centro X TP_GRADIENT_CENTER_Y_TOOLTIP;Sposta il gradiente su (valori negativi) o giù (valori positivi). -TP_GRADIENT_DEGREE;Angolo +TP_GRADIENT_CENTER_Y;Centro Y +TP_GRADIENT_CENTER;Centro TP_GRADIENT_DEGREE_TOOLTIP;Angolo di rotazione in gradi. -TP_GRADIENT_FEATHER;Scia +TP_GRADIENT_DEGREE;Angolo TP_GRADIENT_FEATHER_TOOLTIP;Ampiezza del gradiente in percento della diagonale dell'immagine. +TP_GRADIENT_FEATHER;Scia TP_GRADIENT_LABEL;Filtro Graduato -TP_GRADIENT_STRENGTH;Forza -TP_GRADIENT_STRENGTH_TOOLTIP;Forza del filtro in stop. +TP_GRADIENT_STRENGTH_TOOLTIP;intensità del filtro in stop. +TP_GRADIENT_STRENGTH;intensità 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,37 +2601,102 @@ TP_HSVEQUALIZER_HUE;H TP_HSVEQUALIZER_LABEL;Equalizzatore HSV TP_HSVEQUALIZER_SAT;S TP_HSVEQUALIZER_VAL;V -TP_ICM_DCPILLUMINANT;Illuminazione +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_APPLYBASELINEEXPOSUREOFFSET;Esposizione di 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_APPLYHUESATMAP;Tabella base +TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is only available if the selected DCP has one. +TP_ICM_APPLYLOOKTABLE;Guarda la tabella +TP_ICM_BPC;Compensazione punto di nero 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_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. +TP_ICM_DCPILLUMINANT;Illuminazione +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_TOOLTIP;Utilizza i semplici color matrix di dcraw, migliorati nella versione di RawTherapee (qualunque sia disponibile in base al modello di fotocamera) o inclusi nel DNG. -TP_ICM_INPUTCUSTOM;Personalizzato +TP_ICM_INPUTCAMERA;Predefinito 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. +TP_ICM_INPUTCAMERAICC;Specifico della fotocamera TP_ICM_INPUTCUSTOM_TOOLTIP;Seleziona il tuo profilo colore DCP/ICC per la fotocamera. +TP_ICM_INPUTCUSTOM;Personalizzato TP_ICM_INPUTDLGLABEL;Seleziona il profilo DCP/ICC di ingresso... -TP_ICM_INPUTEMBEDDED;Incorporato, se disponibile TP_ICM_INPUTEMBEDDED_TOOLTIP;Utilizza il profilo colore incluso nei file non-raw. -TP_ICM_INPUTNONE;Nessun profilo +TP_ICM_INPUTEMBEDDED;Incorporato, se disponibile TP_ICM_INPUTNONE_TOOLTIP;Non applicare un profilo colore.\nDa utilizzare solo in casi particolari. +TP_ICM_INPUTNONE;Nessun profilo 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_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_OUTPUTPROFILE;Profilo di Uscita +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_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_APPLYWB;Applicare il bilanciamento del bianco 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_SAVEREFERENCE;Salva immagine di riferimento 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_TONECURVE;Usa la curva tono del DCP +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_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_TRCFRAME;Profilo astratto +TP_ICM_WORKING_CIEDIAG;Diagramma xy di CIE +TP_ICM_WORKING_ILLU_1500;Tungsteno 1500K +TP_ICM_WORKING_ILLU_2000;Tungsteno 2000K +TP_ICM_WORKING_ILLU_D120;D120 +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_NONE;Default +TP_ICM_WORKING_ILLU_STDA;stdA 2875K +TP_ICM_WORKING_ILLU;Illuminante +TP_ICM_WORKING_PRESER;Preserva i toni pastello +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_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_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_ICM_WORKING_TRC;Curva di risposta tonale: TP_ICM_WORKINGPROFILE;Profilo di lavoro 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_AVOIDCOLORSHIFT_TOOLTIP;Adatta i colori all'interno del gamut dello spazio colore di lavoro e applica la correzione Munsell. +#TP_LABCURVE_AVOIDCOLORSHIFT;Evita il color shift TP_LABCURVE_BRIGHTNESS;Luminosità -TP_LABCURVE_CHROMATICITY;Cromaticità TP_LABCURVE_CHROMA_TOOLTIP;Per applicare il toning BN impostare la Cromaticità a -100. +TP_LABCURVE_CHROMATICITY;Cromaticità TP_LABCURVE_CONTRAST;Contrasto -TP_LABCURVE_CURVEEDITOR;Curva di luminanza TP_LABCURVE_CURVEEDITOR_A_RANGE1;Verde Saturo TP_LABCURVE_CURVEEDITOR_A_RANGE2;Verde Pastello TP_LABCURVE_CURVEEDITOR_A_RANGE3;Rosso Pastello @@ -1021,65 +2705,1000 @@ TP_LABCURVE_CURVEEDITOR_B_RANGE1;Blu Saturo TP_LABCURVE_CURVEEDITOR_B_RANGE2;Blu Pastello TP_LABCURVE_CURVEEDITOR_B_RANGE3;Giallo Pastello TP_LABCURVE_CURVEEDITOR_B_RANGE4;Giallo Saturo -TP_LABCURVE_CURVEEDITOR_CC;CC TP_LABCURVE_CURVEEDITOR_CC_RANGE1;Neutri TP_LABCURVE_CURVEEDITOR_CC_RANGE2;Opachi TP_LABCURVE_CURVEEDITOR_CC_RANGE3;Pastello TP_LABCURVE_CURVEEDITOR_CC_RANGE4;Saturi TP_LABCURVE_CURVEEDITOR_CC_TOOLTIP;Cromaticità secondo Cromaticità C=f(C) -TP_LABCURVE_CURVEEDITOR_CH;CH +TP_LABCURVE_CURVEEDITOR_CC;CC TP_LABCURVE_CURVEEDITOR_CH_TOOLTIP;Cromaticità secondo Tonalità C=f(H) -TP_LABCURVE_CURVEEDITOR_CL;CL +TP_LABCURVE_CURVEEDITOR_CH;CH TP_LABCURVE_CURVEEDITOR_CL_TOOLTIP;Cromaticità secondo Luminanza C=f(L) -TP_LABCURVE_CURVEEDITOR_HH;HH +TP_LABCURVE_CURVEEDITOR_CL;CL TP_LABCURVE_CURVEEDITOR_HH_TOOLTIP;Tonalità secondo Tonalità H=f(H) -TP_LABCURVE_CURVEEDITOR_LC;LC +TP_LABCURVE_CURVEEDITOR_HH;HH TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP;Luminanza secondo Cromaticità L=f(C) -TP_LABCURVE_CURVEEDITOR_LH;LH +TP_LABCURVE_CURVEEDITOR_LC;LC TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminanza secondo Tonalità L=f(H) +TP_LABCURVE_CURVEEDITOR_LH;LH TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminanza secondo Luminanza L=f(L) +TP_LABCURVE_CURVEEDITOR;Curva di luminanza TP_LABCURVE_LABEL;Regolazioni Lab -TP_LABCURVE_LCREDSK;Limita LC ai toni rossi e all'incarnato TP_LABCURVE_LCREDSK_TOOLTIP;Se abilitato, la Curva LC è applicata solo ai toni rossi e dell'incarnato.\nSe disabilitato, ha effetto su tutti i toni. -TP_LABCURVE_RSTPROTECTION;Protezione Toni rossi e dell'incarnato +TP_LABCURVE_LCREDSK;Limita LC ai toni rossi e all'incarnato TP_LABCURVE_RSTPRO_TOOLTIP;Può essere utilizzato con il cursore Cromaticità e la curva CC. +TP_LABCURVE_RSTPROTECTION;Protezione Toni rossi e dell'incarnato 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_LOCAL_HEIGHT_T;Alto +TP_LOCAL_HEIGHT;Basso +TP_LOCAL_WIDTH_L;Sinistro +TP_LOCAL_WIDTH;Destro +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_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_ARTIF;Rilevamento della forma +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_TOOLTIP;La correzione Munsell è sempre disabilitata quando si utilizza Jz o CAM16. +TP_LOCALLAB_AVOIDMUN;Solo correzione Munsell +TP_LOCALLAB_AVOIDRAD;Raggio Morbido +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_BALAN;ab-L bilanciato (ΔE) +TP_LOCALLAB_BALANEXP;Bilanciamento Laplacian +TP_LOCALLAB_BALANH;C-H bilanciato (ΔE) +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_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_BLENDMASKCOL;Miscela +TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;Se questo cursore = 0 nessuna azione.\nAggiungi o sottrai la maschera dall'immagine originale. +TP_LOCALLAB_BLENDMASKMASK;Aggiungi/sottrai la maschera luminanza +TP_LOCALLAB_BLENDMASKMASKAB;Aggiungi/sottrai la maschera crominanza +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_TOOLNAME;Sfocatura/grana e riduzione rumore +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_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_BLWH;Tutti i cambiamenti forzati in bianco e nero +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_CAM16_FRA;Regolazioni dell'immagine Cam16 +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_CAM16PQREMAP;HDR PQ (Luminanza di picco) +TP_LOCALLAB_CAMMODE_CAM16;CAM 16 +TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz +TP_LOCALLAB_CAMMODE;Modello CAM +TP_LOCALLAB_CATAD;Adattamento cromatico/Cat16 +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_CBDL;Contrasto per livelli di dettaglio +TP_LOCALLAB_CBDLCLARI_TOOLTIP;Migliora il contrasto locale dei mezzitoni. +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_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_CHROMABLU;Livelli di 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_CHROMACBDL;Crominanza +TP_LOCALLAB_CHROMALEV;Livelli di crominanza +TP_LOCALLAB_CHROMASK_TOOLTIP;Cambia la crominanza della maschera se ne esiste una (cioè C(C) o LC(H) è attivato). +TP_LOCALLAB_CHROMASKCOL;Crominanza +TP_LOCALLAB_CHROML;Crominanza (C) +TP_LOCALLAB_CHRRT;Crominanza +TP_LOCALLAB_CIE_TOOLNAME;Aspetto del colore (Cam16 & JzCzHz) +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_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_CIEMODE;Modificare la posizione dello strumento +TP_LOCALLAB_CIETOOLEXP;Curve +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_CIRCRADIUS;Dimensione del punto +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_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_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_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_CLARITYML;Clarity +TP_LOCALLAB_CLIPTM;Clip dei dati ripristinati (guadagno) +TP_LOCALLAB_COFR;Colore e luce +TP_LOCALLAB_COL_NAME;Nome +TP_LOCALLAB_COL_VIS;Stato +TP_LOCALLAB_COLOR_CIE;Curva colore +TP_LOCALLAB_COLOR_TOOLNAME;Colore e luce +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_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_COLORSCOPE_TOOLTIP;Cursore di ambito comune per Colore e luce, Ombre/Alte luci, Vividezza.\nAltri strumenti hanno i propri controlli di ambito. +TP_LOCALLAB_COLORSCOPE;Ambito (strumenti colore) +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_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_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_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_TOOLTIP;I valori negativi aggiungono 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_DELTAD;Equilibrio delta +TP_LOCALLAB_DELTAEC;ΔE Maschera immagine +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_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_DENOIEQUAL_TOOLTIP;Consente di effettuare una riduzione maggiore o minore del rumore sia nelle ombre che nelle luci. +TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Consente di indirizzare la riduzione del rumore cromatico verso i colori blu-giallo o rosso-verde. +TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Permette di recuperare il dettaglio della luminanza applicando progressivamente una trasformata di Fourier (DCT). +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_DENOIMASK;Ruzione rumore maschera di crominanza +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_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_ALL;Nascondi tutto +TP_LOCALLAB_EV_NVIS;Nascondi +TP_LOCALLAB_EV_VIS_ALL;Mostra tutto +TP_LOCALLAB_EV_VIS;Mostra +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_EXCLUF;Escluso +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;Metodo Spot +TP_LOCALLAB_EXECLU;Escluso spot +TP_LOCALLAB_EXFULL;Immagine piena +TP_LOCALLAB_EXNORM;Spot normale +TP_LOCALLAB_EXP_TOOLNAME;Gamma dinamica ed esposizione +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_TOOLTIP;Utilizzare insieme a 'Compensazione dell'esposizione f' e 'Attenuatore contrasto f' per evitare la desaturazione dei colori. +TP_LOCALLAB_EXPCHROMA;Compensazione cromatica +TP_LOCALLAB_EXPCOLOR_TOOLTIP;Regola colore, luminosità, contrasto e correggi piccoli difetti come occhi rossi, polvere del sensore, ecc. +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_EXPCOMP;Compensazione dell'esposizione ƒ +TP_LOCALLAB_EXPCOMPINV;Compensazione dell'esposizione +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_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_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_EXPLAP_TOOLTIP;Spostando il cursore verso destra si riduce progressivamente il contrasto. +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_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_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_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_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_GAMFRA;Curva di risposta tonale (CRT) +TP_LOCALLAB_GAMM;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_GAMMASKCOL;Gamma +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_TOOLTIP;Angolo di rotazione in gradi: -180 o +180. +TP_LOCALLAB_GRADANG;Angolo gradiente +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_TOOLTIP;Regola l'intensità del gradiente di tonalità. +TP_LOCALLAB_GRADSTRHUE;Intensità del gradiente di tonalità +TP_LOCALLAB_GRADSTRHUE2;Intensità del gradiente di tonalità +TP_LOCALLAB_GRADSTRLUM;Intensità del gradiente luminanza +TP_LOCALLAB_GRAIN_TOOLTIP;Aggiunge una grana simile a una pellicola all'immagine. +TP_LOCALLAB_GRAINFRA;Grana della pellicola 1:1 +TP_LOCALLAB_GRAINFRA2;Ruvidezza +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_TOOLTIP;Applica un filtro guidato con raggio regolabile. Consente di ridurre gli artefatti o sfocare l'immagine. +TP_LOCALLAB_GUIDBL;Raggio morbido +TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Modifica la funzione di distribuzione del filtro guidato. I valori negativi simulano una sfocatura gaussiana. +TP_LOCALLAB_GUIDFILTER_TOOLTIP;Può ridurre o aumentare gli artefatti. +TP_LOCALLAB_GUIDFILTER;Raggio del filtro guidato +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_TOOLTIP;Alternativa alla modalità 'Inversa': usa due spot\Primo spot:\nell'immagine intera\in\Secondo spot: escluso lo spot. +TP_LOCALLAB_INVBL;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_INVERS;Inverso +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_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_JZ100;Riferimento Jz 100cd/m2 +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_TOOLTIP;Consente di forzare il valore Jz massimo su 1 per una migliore risposta dello slider e della curva. +TP_LOCALLAB_JZFORCE;Forza il massimo Jz di 1 +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_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_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_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_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_JZPQFRA;Rimappatura Jz +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_JZPQREMAP;PQ - Luminanza di picco +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_JZQTOJ;Luminanza relativa +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_VALUES;Alto(a)=%1 Alto(b)=%2\nBasso(a)=%3 Basso(b)=%4 +TP_LOCALLAB_LABGRID;Griglia di correzione del colore +TP_LOCALLAB_LABGRIDMERG;Sfondo +TP_LOCALLAB_LABSTRUM;Maschera di struttura +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_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_LAPRAD_TOOLTIP;Il raggio uniforme utilizza un filtro guidato per ridurre gli artefatti e uniformare la transizione. +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_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_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_LCLABELS;Livelli di rumore residuo +TP_LOCALLAB_LEVELBLUR;Livelli massimi di sfocatura +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_LEVELWAV;Livelli di Wavelet +TP_LOCALLAB_LEVFRA;Livelli +TP_LOCALLAB_LIGHTN_TOOLTIP;In modalità inversa: la selezione = -100 forza la luminanza a zero. +TP_LOCALLAB_LIGHTNESS;Luminosità +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_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_LOCCONT;Maschera di contrasto +TP_LOCALLAB_LOG_TOOLNAME;Codifica del registro +TP_LOCALLAB_LOG;Codifica del registro +TP_LOCALLAB_LOG1FRA;CAM16 Regolazioni dell'immagine +TP_LOCALLAB_LOG2FRA;Condizioni di visualizzazione +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_LOGAUTO;Automatico +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_LOGAUTOGRAYJZ_TOOLTIP;Calcola automaticamente la "luminanza media" per le condizioni della scena. +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_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_LOGCIE;Codifica del registro anziché Sigmoid +TP_LOCALLAB_LOGCOLORF_TOOLTIP;Quantità di tonalità percepita in relazione al grigio.\nIndicatore che uno stimolo appare più o meno colorato. +TP_LOCALLAB_LOGCOLORFL;Colorazione (M) +TP_LOCALLAB_LOGCONQL;Contrasto (Q) +TP_LOCALLAB_LOGCONTHRES;Soglia di Contrasto (J & Q) +TP_LOCALLAB_LOGCONTL_TOOLTIP;Il contrasto (J) in CIECAM16 tiene conto dell'aumento della colorazione percepita con la luminanza. +TP_LOCALLAB_LOGCONTL;Contrasto (J) +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_TOOLTIP;Vicino alla Luminosità (L*a*b*). Tiene conto dell'aumento della colorazione percepita. +TP_LOCALLAB_LOGLIGHTL;Luminosità (J) +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_LOGLIGHTQ;Luminosità (Q) +TP_LOCALLAB_LOGLIN;Modalità logaritmo +TP_LOCALLAB_LOGPFRA;Livelli di esposizione relativa +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_LOGREPART;Overall strength +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_LUM;LL - CC +TP_LOCALLAB_LUM46LABEL;Livelli luminanza 456: Media=%1 Alta=%2 +TP_LOCALLAB_LUMADARKEST;Più oscuro +TP_LOCALLAB_LUMASK_TOOLTIP;Regola la tonalità di grigio o il colore dello sfondo della maschera in Mostra maschera (Maschera e modifiche). +TP_LOCALLAB_LUMASK;Maschera colore/luminosità dello sfondo +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_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_MASFRAME;Maschera e Unisci +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_MASK;Curve +TP_LOCALLAB_MASK2;Curva di contrasto +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_MASKCOM;Maschera di colore comune +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_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_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_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_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_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_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_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_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_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_MASKLNOISELOW;Rinforza le aree scure/chiare +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_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_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_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_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_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_MEDIAN;Mediana bassa +TP_LOCALLAB_MEDIANITER_TOOLTIP;Il numero di iterazioni successive eseguite dal filtro mediano. +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_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_MLABEL;Dati ripristinati Min=%1 Max=%2 +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_NLDENOISE_TOOLTIP;'Recupero dettagli' agisce su una trasformazione laplaciana per individuare aree uniformi anziché aree con dettagli. +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_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_NOISE_TOOLTIP;Aggiunge rumore di luminanza. +TP_LOCALLAB_NOISECHROC_TOOLTIP;Se superiore a zero, l'algoritmo di alta qualità è abilitato.\nCoarse è per slider >=0.02. +TP_LOCALLAB_NOISECHROCOARSE;Crominanza grossolana (Wav) +TP_LOCALLAB_NOISECHRODETAIL;Recupero dettagli crominanza +TP_LOCALLAB_NOISECHROFINE;Crominanza fine (Wav) +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_NOISEGAM;Gamma +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_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_QUAL_METHOD;Qualità globale +TP_LOCALLAB_QUALCURV_METHOD;Tipo di curva +TP_LOCALLAB_QUANONEALL;Disattivato +TP_LOCALLAB_QUANONEWAV;Significa solo non-locale +TP_LOCALLAB_RADIUS_TOOLTIP;Utilizza una trasformata veloce di Fourier per raggio > 30. +TP_LOCALLAB_RADIUS;Raggio +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_TOOLTIP;Forza l'algoritmo a ricalcolare i riferimenti dopo l'applicazione di ogni strumento.\nUtile anche per lavorare con le maschere. +TP_LOCALLAB_RECURS;Riferimenti ricorsivi +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_RET_TOOLNAME;Rimozione foschia e 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_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_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_TOOLTIP;Abilitato se la maschera immagine ΔE è abilitata.\nValori bassi evitano il ritocco dell'area selezionata. +TP_LOCALLAB_SCOPEMASK;Ambito (maschera immagine ΔE) +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_SENSI;Ambito +TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Regola i colori da escludere. +TP_LOCALLAB_SENSIEXCLU;Ambito +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_SETTINGS;Impostazioni +TP_LOCALLAB_SH_TOOLNAME;Ombre/luci ed equalizzatore toni +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_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_SHAPETYPE;Forma del punto +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_TOOLNAME;Nitidezza +TP_LOCALLAB_SHARP;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_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_SHOWMASKTYP1;Sfocatura e rumore +TP_LOCALLAB_SHOWMASKTYP2;Rimuovi rumore +TP_LOCALLAB_SHOWMASKTYP3;Sfocatura e rumore + Rimuovi rumore +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_SIGFRA;Sigmoide Q e codifica registro Q +TP_LOCALLAB_SIGJZFRA;Sigmoide Jz +TP_LOCALLAB_SIGMAWAV;Risposta di attenuazione +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_SIGMOIDBL;Miscela +TP_LOCALLAB_SIGMOIDLAMBDA;Contrasto +TP_LOCALLAB_SIGMOIDQJ;Utilizza Ev nero e Ev bianco +TP_LOCALLAB_SIGMOIDTH;Soglia (punto grigio) +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_SLOMASKCOL;Pendenza +TP_LOCALLAB_SLOSH;Pendenza +TP_LOCALLAB_SOFT_TOOLNAME;Luce soffusa e Retinex originale +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_TOOLTIP;Applica un filtro guidato all'immagine di output per ridurre possibili artefatti. +TP_LOCALLAB_SOFTRADIUSCOL;Raggio morbido +TP_LOCALLAB_SOFTRETI;Riduci gli artefatti ΔE +TP_LOCALLAB_SOURCE_ABS;Luminanza assoluta +TP_LOCALLAB_SOURCE_GRAY;Luminanza media (Yb%) +TP_LOCALLAB_SPECCASE;Casi specifici +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_SPECIAL;Utilizzo speciale delle curve 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_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_STRUMASKCOL;Intensità maschera struttura +TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Si consiglia un uso moderato di questo cursore! +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_STYPE;Metodo forma +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_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_TLABEL;TM Min=%1 Max=%2 Media=%3 Sig=%4 +TP_LOCALLAB_TM_MASK;Utilizza mappa di trasmissione +TP_LOCALLAB_TM;Mappatura toni +TP_LOCALLAB_TONE_TOOLNAME;Mappatura toni +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_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_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_TOOLCOL;Maschera struttura come strumento +TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Permette di modificare la maschera, se ne esiste una. +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_TOOLMASK;Strumenti maschera +TP_LOCALLAB_TRANSIT_TOOLTIP;Regola la morbidezza della transizione tra le aree interessate e quelle non interessate come percentuale del 'raggio'. +TP_LOCALLAB_TRANSIT;Gradiente di transizione +TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Permette di variare la transizione dell'asse y. +TP_LOCALLAB_TRANSITGRAD;Differenziazione transizione XY +TP_LOCALLAB_TRANSITVALUE;Valore di transizione +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_TRANSITWEAK;Decadimento della transizione (log lineare) +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_TRANSMISSIONGAIN;Guadagno di trasmissione +TP_LOCALLAB_TRANSMISSIONMAP;Mappa di trasmissione +TP_LOCALLAB_USEMASK;Laplaciano +TP_LOCALLAB_VART;Varianza (contrasto) +TP_LOCALLAB_VIB_TOOLNAME;Vibranza 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_VIBRANCE;Vivace 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_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_WARM;Artefatti caldo/freddo e 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_TOOLTIP;Permette di applicare il contrasto locale in base alla direzione della scomposizione wavelet: orizzontale, verticale, diagonale. +TP_LOCALLAB_WAVCOMP;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_WAVCOMPRE;Compressione per livello +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_TOOLTIP;Utilizza wavelet per modificare il contrasto locale della maschera e rinforzare o ridurre la struttura (pelle, edifici, ecc.). +TP_LOCALLAB_WAVMASK;Contrasto locale +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_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_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_NEUTRAL;Ripristina TP_PCVIGNETTE_FEATHER_TOOLTIP;Scia:\n0 = solo i bordi,\n50 = a metà strada con il centro,\n100 = al centro. +TP_PCVIGNETTE_FEATHER;Scia 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_ROUNDNESS;Rotondità +TP_PCVIGNETTE_STRENGTH_TOOLTIP;intensità del filtro in stop (raggiunta agli angoli). +TP_PCVIGNETTE_STRENGTH;intensità +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_LINE_APPLY_INVALID_TOOLTIP;Sono necessarie almeno due linee di controllo orizzontali o due verticali. +TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Ctrl+trascina: traccia una nuova riga\nclic destro: elimina la riga +TP_PERSPECTIVE_CONTROL_LINES;Linee di controllo TP_PERSPECTIVE_HORIZONTAL;Orizzontale TP_PERSPECTIVE_LABEL;Prospettiva +TP_PERSPECTIVE_METHOD_CAMERA_BASED;Camera-base +TP_PERSPECTIVE_METHOD_SIMPLE;Semplice +TP_PERSPECTIVE_METHOD;Metodo +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_PFCURVE_CURVEEDITOR_CH;Tonalità +TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tenta di sopprimere i pixel morti. +TP_PREPROCESS_DEADPIXFILT;Filtro pixel morti TP_PREPROCESS_GREENEQUIL;Bilanciamento del verde +TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tenta di sopprimere i pixel bruciati. +TP_PREPROCESS_HOTPIXFILT;Filtro pixel bruciati TP_PREPROCESS_LABEL;Pre-elaborazione +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_LINEDENOISE_DIRECTION;Direzione TP_PREPROCESS_LINEDENOISE;Filtro per rumore a bande TP_PREPROCESS_NO_FOUND;Nessuno presente +TP_PREPROCESS_PDAFLINESFILTER;Filtro linee PDAF +TP_PREPROCWB_LABEL;Preelaborare il bilanciamento del bianco +TP_PREPROCWB_MODE_AUTO;Auto +TP_PREPROCWB_MODE_CAMERA;Camera +TP_PREPROCWB_MODE;Modo +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_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_PROGRESSBAR_REFINE;Perfezionamento della demosaicizzazione... +TP_RAW_DMETHOD_PROGRESSBAR;Demosaicizzazione %1... +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_DMETHOD;Metodo +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_DUALDEMOSAICAUTOCONTRAST;Soglia Automatica +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_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_HD;Soglia +TP_RAW_HPHD;HPHD +TP_RAW_IGV;IGV +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_IMAGENUM;Immagine secondaria +TP_RAW_LABEL;Demosaicizzazione +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_LMMSE;LMMSE +TP_RAW_LMMSEITERATIONS;Passaggi di miglioramento LMMSE +TP_RAW_MONO;Mono +TP_RAW_NONE;Nessuno (mostra il modello del sensore) +TP_RAW_PIXELSHIFT;Pixel Shift (spostamento dei pixel) +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_PIXELSHIFTAVERAGE;Utilizzare la media per le parti in movimento +TP_RAW_PIXELSHIFTBLUR;Maschera di movimento sfocato +TP_RAW_PIXELSHIFTDMETHOD;Metodo di demosaicizzazione per il movimento +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_PIXELSHIFTEPERISO;Sensibilità +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_PIXELSHIFTEQUALBRIGHT;Equalizza la luminosità dei fotogrammi +TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Abilitato: equalizza i canali RGB individualmente.\nDisabilitato: utilizza lo stesso fattore di equalizzazione per tutti i canali. +TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;Equalizza per canale +TP_RAW_PIXELSHIFTGREEN;Controllare il movimento nel canale verde +TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Riempi i buchi nella maschera di movimento. +TP_RAW_PIXELSHIFTHOLEFILL;Riempi i buchi nella maschera di 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_PIXELSHIFTMEDIAN;Utilizzare la mediana per le parti in movimento +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_TOOLTIP;Sovrappone l'immagine con una maschera verde che mostra le regioni in movimento. +TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask +TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Mostra la maschera di movimento senza l'immagine. +TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Mostra solo la maschera di movimento +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_PIXELSHIFTSIGMA;Raggio di sfocatura +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_PIXELSHIFTSMOOTH;Transizioni fluide +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_RAWCACORR_AUTO;Autocorrezione +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_AUTOIT;Iterazioni +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_DCBENHANCE;Miglioramento DCB -TP_RAW_DCBITERATIONS;Numero di iterazioni DCB -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_FALSECOLOR;Stadi per soppressione di falsi colori -TP_RAW_LABEL;Demosaicizzazione -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_RESIZE_ALLOW_UPSCALING;Consenti l'upscaling TP_RESIZE_APPLIESTO;Applica a: TP_RESIZE_CROPPEDAREA;Zona ritagliata TP_RESIZE_FITBOX;Riquadro delimitato @@ -1088,18 +3707,101 @@ 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_TOOLTIP;Luminanza in base alla luminanza L=f(L)\nCorreggere i dati grezzi per ridurre aloni e artefatti. +TP_RETINEX_CURVEEDITOR_CD;L=f(L) +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_LH;Intensità=f(H) +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_CURVEEDITOR_MAP;L=f(L) +TP_RETINEX_EQUAL;Equalizzatore +TP_RETINEX_FREEGAMMA;Gamma libera +TP_RETINEX_GAIN;Guadagno +TP_RETINEX_GAINOFFS;Guadagno e compensazione (luminosità) +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_GAINTRANSMISSION;Transmissione guadagno +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_GAMMA;Gamma +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_GRAD;Gradiente di trasmissione +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_GRADS;Gradiente di forza +TP_RETINEX_HIGH;Alto +TP_RETINEX_HIGHLIG;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_HIGHLIGHT;Soglia alteluci +TP_RETINEX_HSLSPACE_LIN;HSL-Lineare +TP_RETINEX_HSLSPACE_LOG;HSL-Logaritmica +TP_RETINEX_ITER_TOOLTIP;Simula un operatore di mappatura dei toni.\nValori elevati aumentano il tempo di elaborazione. +TP_RETINEX_ITER;Iterazioni (mappatura dei toni) +TP_RETINEX_ITERF;Mappatura dei toni +TP_RETINEX_LABEL_MASK;Maschera +TP_RETINEX_LABEL;Retinex +TP_RETINEX_LABSPACE;L*a*b* +TP_RETINEX_LOW;Basso +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_MAP;Metodo +TP_RETINEX_MEDIAN;Filtro mediano di trasmissione +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_METHOD;Metodo +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_MLABEL;Ripristino dati Min=%1 Max=%2 +TP_RETINEX_NEIGHBOR;Raggio +TP_RETINEX_NEUTRAL_TOOLTIP;Ripristina tutti i cursori e le curve ai valori predefiniti. +TP_RETINEX_NEUTRAL;Ripristina +TP_RETINEX_OFFSET;Compensazione (luminosità) +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_SCALES;Gradiente Gaussiano +TP_RETINEX_SETTINGS;Impostazioni +TP_RETINEX_SKAL;Scala +TP_RETINEX_SLOPE;Pendenza gamma libera +TP_RETINEX_STRENGTH;Intensità +TP_RETINEX_THRESHOLD_TOOLTIP;Limiti in/out.\nIn = sorgente immagine,\nOut = gauss immagine. +TP_RETINEX_THRESHOLD;Soglia +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_TLABEL;Dati TM Min=%1 Max=%2 Media=%3 Sigma=%4 +TP_RETINEX_TLABEL2;TM Effettivo Tm=%1 TM=%2 +TP_RETINEX_TRANF;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_TRANSMISSION;Mappa di transmissione +TP_RETINEX_UNIFORM;Uniforme +TP_RETINEX_VARIANCE_TOOLTIP;Una varianza bassa aumenta il contrasto e la saturazione locali, ma può causare artefatti. +TP_RETINEX_VARIANCE;Contrasto +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_RETINEX_VIEW;Processo TP_RGBCURVES_BLUE;B TP_RGBCURVES_CHANNEL;Canale TP_RGBCURVES_GREEN;G TP_RGBCURVES_LABEL;Curve RGB -TP_RGBCURVES_LUMAMODE;Modalità Luminosità TP_RGBCURVES_LUMAMODE_TOOLTIP;La Modalità Luminosità consente di variare il contributo dei canali R, G e B alla luminosità dell'immagine, senza alterarne il colore. +TP_RGBCURVES_LUMAMODE;Modalità Luminosità TP_RGBCURVES_RED;R TP_ROTATE_DEGREE;Angolo TP_ROTATE_LABEL;Ruota @@ -1116,60 +3818,342 @@ 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_BOOST;Aumento del raggio d'angolo TP_SHARPENING_RADIUS;Raggio -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_RLD;Deconvoluzione RL 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_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_BANDS;Bande +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 TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Rosso/Viola TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE2;Rosso TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE3;Rosso/Giallo TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE4;Giallo TP_VIBRANCE_CURVEEDITOR_SKINTONES_TOOLTIP;Tonalità a seconda della Tinta H=f(H) +TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH TP_VIBRANCE_LABEL;Vividezza TP_VIBRANCE_PASTELS;Toni Pastello TP_VIBRANCE_PASTSATTOG;Lega i toni pastello e saturi TP_VIBRANCE_PROTECTSKINS;Proteggi l'incarnato -TP_VIBRANCE_PSTHRESHOLD;Soglia toni pastello/saturi TP_VIBRANCE_PSTHRESHOLD_SATTHRESH;Soglia Saturazione TP_VIBRANCE_PSTHRESHOLD_TOOLTIP;L'asse verticale rappresenta i toni pastello alla base e i toni saturi in cima.\nL'asse orizzontale rappresenta l'intervallo di saturazione. TP_VIBRANCE_PSTHRESHOLD_WEIGTHING;Peso della transizione pastello/saturi +TP_VIBRANCE_PSTHRESHOLD;Soglia toni pastello/saturi TP_VIBRANCE_SATURATED;Toni Saturi TP_VIGNETTING_AMOUNT;Quantità -TP_VIGNETTING_CENTER;Centro TP_VIGNETTING_CENTER_X;Centra X TP_VIGNETTING_CENTER_Y;Centra Y +TP_VIGNETTING_CENTER;Centro 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_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_BALANCE;Bilanciamento di contrasto d/v-h +TP_WAVELET_BALCHRO_TOOLTIP;Se abilitata, la curva o il cursore "Bilanciamento del contrasto" modifica anche il bilanciamento della crominanza. +TP_WAVELET_BALCHRO;Bilanciamento cromatico +TP_WAVELET_BALCHROM;Equalizzazione colore +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_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_CBENAB;Tonalità e bilanciamento del colore +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_TOOLTIP;Regola la crominanza in funzione dei "livelli di contrasto" e della "forza del collegamento crominanza-contrasto". +TP_WAVELET_CHR;Intensità coll.to contrasto cromatico +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_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_CHRWAV;Sfocatura cromatica +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_TOOLTIP;La regolazione della gamma dell'immagine residua consente di equilibrare i dati e l'istogramma. +TP_WAVELET_COMPGAMMA;Compressione di gamma +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_COMPLEXLAB;Complessità +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_TOOLTIP;Modifica il contrasto residuo dell'immagine. +TP_WAVELET_CONTRA;Contrasto +TP_WAVELET_CONTRAST_MINUS;Contrasto - +TP_WAVELET_CONTRAST_PLUS;Contrasto + +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_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_CH;Livelli di contrasto=f(Tonalità) +TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applica una curva finale di contrasto-luminanza al termine dell'elaborazione wavelet. +TP_WAVELET_CURVEEDITOR_CL;L +TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifica la tonalità residua dell'immagine in funzione della tonalità. +TP_WAVELET_CURVEEDITOR_HH;HH +TP_WAVELET_DALL;Tutte le direzioni +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_DAUB;Prestazioni ai bordi +TP_WAVELET_DAUB10;D10 - medio +TP_WAVELET_DAUB14;D14 - alto +TP_WAVELET_DAUB2;D2 - basso +TP_WAVELET_DAUB4;D4 - standard +TP_WAVELET_DAUB6;D6 - standard + +TP_WAVELET_DAUBLOCAL;Prestazioni ai bordi Wavelet +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_TOOLTIP;Questo cursore seleziona l'intervallo di valori di contrasto che riceveranno il pieno effetto di qualsiasi regolazione. +TP_WAVELET_EDEFFECT;Risposta di attenuazione +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_EDGCONT;Contrasto locale +TP_WAVELET_EDGE;Nitidezza dei bordi +TP_WAVELET_EDGEAMPLI;Amplificazione di base +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_EDGEDETECT;Sensibilità gradiente +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_EDGEDETECTTHR;Soglia bassa (rumore) +TP_WAVELET_EDGEDETECTTHR2;Miglioramento dei bordi +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_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_EDGTHRESH;Dettagli +TP_WAVELET_EDRAD_TOOLTIP;Questa regolazione controlla il miglioramento locale. Un valore pari a zero ha comunque effetto. +TP_WAVELET_EDRAD;Raggio +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_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_HUESKIN;Tonalità della pelle +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_HUESKY;Gamma di tonalità +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_ITER;Livelli di equilibrio delta +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_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_LEVELS;Livelli di Wavelet +TP_WAVELET_LEVELSIGM;Raggio +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_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_MEDILEV;Rilevamento dei bordi +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_TOOLTIP;Questo algoritmo utilizza la vicinanza di un pixel e otto dei suoi vicini. Se la differenza è inferiore, i bordi sono rinforzati. +TP_WAVELET_NPTYPE;Pixel vicini +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_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_OPACITYWL;Contrasto locale +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_TOOLTIP;Disabilitato se lo zoom > circa 500%. +TP_WAVELET_RESBLUR;Luminanza sfocata +TP_WAVELET_RESBLURC;Blur chromaSfocatura cromatica +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_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_SIGMA;Risposta di attenuazione +TP_WAVELET_SIGMAFIN;Risposta di attenuazione +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_SKIN;Mira/protezione della pelle +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_SKY;Mira/protezione della tonalità +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_TOOLTIP;Solo i livelli inferiori e compresi nel valore scelto saranno influenzati dall'intervallo di luminanza delle alte luci. +TP_WAVELET_THRESHOLD;Livelli più fini +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_THRESHOLD2;Livelli più grossolani +TP_WAVELET_THRH;Soglia delle Alteluci +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_TILESBIG;Riquadri +TP_WAVELET_TILESFULL;Immagine completa +TP_WAVELET_TILESIZE;Metodo di quadrettatura +TP_WAVELET_TMEDGS;Arresto del bordo +TP_WAVELET_TMSCALE;Scala +TP_WAVELET_TMSTRENGTH_TOOLTIP;Controlla l'intensità della mappatura dei toni o della compressione del contrasto dell'immagine residua. +TP_WAVELET_TMSTRENGTH;Intensità della compressione +TP_WAVELET_TMTYPE;Metodo di compressione +TP_WAVELET_TON;Tonificante +TP_WAVELET_TONFRAME;Colori esclusi +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_USH;Nessuno +TP_WAVELET_USHARP;Metodo di chiarezza +TP_WAVELET_WAVLOWTHR;Soglia di contrasto basso +TP_WAVELET_WAVOFFSET;Compensa +TP_WBALANCE_AUTO_HEADER;Automatico e perfezionamento TP_WBALANCE_AUTO;Automatico +TP_WBALANCE_AUTOITCGREEN;Correlazione della temperatura +TP_WBALANCE_AUTOOLD;Grigio RGB TP_WBALANCE_CAMERA;Fotocamera TP_WBALANCE_CLOUDY;Nuvoloso TP_WBALANCE_CUSTOM;Personalizzato TP_WBALANCE_DAYLIGHT;Luce Diurna (soleggiato) -TP_WBALANCE_EQBLUERED;Equalizzatore Blu/Rosso TP_WBALANCE_EQBLUERED_TOOLTIP;Consente di deviare dal comportamento normale del "bilanciamento del bianco" modulando il bilanciamento blu/rosso.\nPuò essere utile quando le condizioni di ripresa:\na) sono molto diverse dalle illuminazioni normali (ad esempio, sott'acqua),\nb) sono molto diverse dalle condizioni alle quali sono state effettuate le calibrazioni,\nc) quando le matrici o i profili ICC non sono disponibili. +TP_WBALANCE_EQBLUERED;Equalizzatore Blu/Rosso +TP_WBALANCE_FLASH_HEADER;Flash TP_WBALANCE_FLASH55;Leica TP_WBALANCE_FLASH60;Standard, Canon, Pentax, Olympus TP_WBALANCE_FLASH65;Nikon, Panasonic, Sony, Minolta -TP_WBALANCE_FLASH_HEADER;Flash +TP_WBALANCE_FLUO_HEADER;Fluorescente TP_WBALANCE_FLUO1;F1 - Luce Diurna +TP_WBALANCE_FLUO10;F10 - Philips TL85 +TP_WBALANCE_FLUO11;F11 - Philips TL84 +TP_WBALANCE_FLUO12;F12 - Philips TL83 TP_WBALANCE_FLUO2;F2 - Bianco Freddo TP_WBALANCE_FLUO3;F3 - Bianco TP_WBALANCE_FLUO4;F4 - Bianco Caldo @@ -1178,13 +4162,48 @@ TP_WBALANCE_FLUO6;F6 - Bianco Chiaro TP_WBALANCE_FLUO7;F7 - D65 Simulatore di Luce Diurna TP_WBALANCE_FLUO8;F8 - D50 / Sylvania F40 Design TP_WBALANCE_FLUO9;F9 - Bianco Freddo Deluxe -TP_WBALANCE_FLUO10;F10 - Philips TL85 -TP_WBALANCE_FLUO11;F11 - Philips TL84 -TP_WBALANCE_FLUO12;F12 - Philips TL83 -TP_WBALANCE_FLUO_HEADER;Fluorescente TP_WBALANCE_GREEN;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_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_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_FRA;Impostazioni correlazione temperatura auto +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_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_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_ITCWBSIZEPATCH_TOOLTIP;Questa impostazione imposta la dimensione dei dati di colore utilizzati dall'algoritmo. +TP_WBALANCE_ITCWBTHRES_TOOLTIP;Limita il campionamento comparativo tra i dati spettrali e i dati dell'immagine. +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_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_ITCWGREEN;Raffinatezza del verde +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,3058 +4211,39 @@ 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_TOOLTIP;Valori forniti a scopo informativo. Non puoi cambiarli. +TP_WBALANCE_MULLABEL;Multi: r=%1 g=%2 b=%3 +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_OBSERVER10;Osservatore 10° invece di 2° +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_PATCHLABEL;Read colors:%1 Patch: Chroma:%2 Size=%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_PATCHLEVELLABEL;Patch: ΔE=%1 - datas x 9 Min:%2 Max=%3 +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_SOLUX47;Solux 4700K (vendor) TP_WBALANCE_SPOTWB;Punto BB +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_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_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_TEMPBIAS;Distorsione temperatura AWB TP_WBALANCE_TEMPERATURE;Temperatura TP_WBALANCE_TUNGSTEN;Tungsteno +TP_WBALANCE_WATER_HEADER;Subacqueo TP_WBALANCE_WATER1;Subacqueo 1 TP_WBALANCE_WATER2;Subacqueo 2 -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: - - -!!!!!!!!!!!!!!!!!!!!!!!!! -! 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 +//TP_WBALANCE_ITCWB_FORCED;Forza l'uso dell'intero diagramma CIE +//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. diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index 76e9befdd..a0418e70c 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -16,6 +16,7 @@ #016 2017-04-21 update by wim ter meer #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 #100 #101 @LANGUAGE_DISPLAY_NAME=Nederlands @@ -1558,7 +1559,9 @@ 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 de RGB- of Lab-methode worden gebruikt.\n\nVoor niet-RAW-afbeeldingen zal altijd de Lab-methode worden gebruikt, ongeacht de geselecteerde methode. @@ -1779,9 +1782,9 @@ 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_DARKNESS;Donkere delen TP_LOCALCONTRAST_LABEL;Lokaal contrast -TP_LOCALCONTRAST_LIGHTNESS;helderheidsniveau +TP_LOCALCONTRAST_LIGHTNESS;Lichte delen TP_LOCALCONTRAST_RADIUS;Straal TP_METADATA_EDIT;Pas wijzigingen toe TP_METADATA_MODE;Metadata kopieermodus @@ -2982,13 +2985,14 @@ HISTORY_MSG_1150;LA - 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;Versterkinsrespons +HISTORY_MSG_BLUWAV;Versterkingsrespons HISTORY_MSG_CATCAT;CAL - Instellingen - Modus HISTORY_MSG_CATCOMPLEX;CAL - Instellingen - Complexiteit HISTORY_MSG_CATMODEL;CAL - Instellingen - CAM -HISTORY_MSG_COMPLEX;Wavelet complexiteit -HISTORY_MSG_COMPLEXRETI;Retinex complexiteit -HISTORY_MSG_DEHAZE_SATURATION;Ontnevel - Verzadiging +HISTORY_MSG_COMPLEX;Waveletcomplexiteit +HISTORY_MSG_COMPLEXRETI;Retinexcomplexiteit +HISTORY_MSG_DEHAZE_SATURATION;Nevelvermindering - Verzadiging +HISTORY_MSG_DIRPYRDENOISE_GAIN;NR - Compenseer lichtheid HISTORY_MSG_EDGEFFECT;Randversterking respons HISTORY_MSG_FF_FROMMETADATA;Flat-Field - Uit metadata HISTORY_MSG_FILMNEGATIVE_BALANCE;FN - Referentie-uitvoer diff --git a/rtdata/languages/default b/rtdata/languages/default index d16d703e3..08e90df72 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 @@ -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,22 +1427,85 @@ 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 HISTORY_MSG_ICM_WORKING_SLOPE;TRC - Slope HISTORY_MSG_ICM_WORKING_TRC_METHOD;TRC method HISTORY_MSG_ILLUM;CAL - SC - Illuminant +HISTORY_MSG_LOCAL_CIE_ANGGRAD;Local CIECAM - gradient angle +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;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_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_REFI;Local CIECAM Refinement Colors +HISTORY_MSG_LOCAL_CIE_SIG;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_SLOPESMOR;Local CIECAM - Red balance +HISTORY_MSG_LOCAL_CIE_SLOPESMOG;Local CIECAM - Green balance +HISTORY_MSG_LOCAL_CIE_SLOPESMOB;Local CIECAM - Blue balance +HISTORY_MSG_LOCAL_CIE_SMOOTHMET;Local CIECAM - Smooth lights method +HISTORY_MSG_LOCAL_CIE_STRGRAD;Local CIECAM - gradient strength L +HISTORY_MSG_LOCAL_CIE_TRC;Local CIECAM - TRC +HISTORY_MSG_LOCAL_CIE_REDXL;Local CIECAM - Red X +HISTORY_MSG_LOCAL_CIE_REDYL;Local CIECAM - Red Y +HISTORY_MSG_LOCAL_CIE_GREXL;Local CIECAM - Green X +HISTORY_MSG_LOCAL_CIE_GREYL;Local CIECAM - Green Y +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_SHIFTXL;Local CIECAM - Shift x +HISTORY_MSG_LOCAL_CIE_SHIFTYL;Local CIECAM - Shift y +HISTORY_MSG_LOCAL_CIE_SMOOTH;Local CIECAM - Scale Yb Scene +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_SATCIE;Local CIECAM - Saturation control +HISTORY_MSG_LOCAL_CIE_STRLOG;Local CIECAM - Log encoding strength +HISTORY_MSG_LOCAL_CIE_WHITES;Local CIECAM - Whites distribution +HISTORY_MSG_LOCAL_CIEMASK_BLURCONT;Local Cie mask blur contrast +HISTORY_MSG_LOCAL_CIEMASK_BLURFFT;Local Cie mask blur fftw +HISTORY_MSG_LOCAL_CIEMASK_BLURRAD;Local Cie mask blur radius +HISTORY_MSG_LOCAL_CIEMASK_CHH;Local Cie mask curve hh +HISTORY_MSG_LOCAL_CIEMASK_HIGH;Local Cie mask highlights +HISTORY_MSG_LOCAL_CIEMASK_SHAD;Local Cie mask shadows +HISTORY_MSG_LOCAL_CIEMASK_STRU;Local Cie mask structure +HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;Local Cie mask structure as tool +HISTORY_MSG_LOCAL_CIEMASK_WLC;Local CIECAM mask wavelet Lc +HISTORY_MSG_LOCAL_CIEMASK_WLEV;Local CIECAM mask wavelet levels +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_LOCALCONTRAST_AMOUNT;Local Contrast - Amount HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast @@ -1691,15 +1755,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 @@ -1786,8 +1850,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 @@ -1834,7 +1898,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 @@ -1845,6 +1908,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: @@ -2019,6 +2085,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 Local Adjustments PREFERENCES_STARTUPIMDIR;Image Directory at Startup PREFERENCES_TAB_BROWSER;File Browser PREFERENCES_TAB_COLORMGR;Color Management @@ -2032,6 +2099,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. @@ -2052,7 +2120,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) @@ -2174,6 +2242,7 @@ 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 @@ -2624,6 +2693,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. @@ -2637,8 +2707,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 @@ -2661,9 +2731,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), 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_CAT16;Cat16 +TP_ICM_WORKING_CAT_CAT02;Cat02 +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 @@ -2675,10 +2752,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_PRIM_TOOLTIP;Destination primaries (Advanced): which 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 not too different, 'Working Profiles' are not modified. Perform a gamut control.\nWhen 'Custom LA (sliders)' is selected you can modify the values of the 3 primaries Red, Green, Blue for X and Y. 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 @@ -2688,7 +2768,9 @@ 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 @@ -2769,9 +2851,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).\n\nDefault: Munsell only.\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 @@ -2814,9 +2896,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 @@ -2843,6 +2928,12 @@ TP_LOCALLAB_CHROMASK_TOOLTIP;Changes the chroma of the mask if one exists (i.e. TP_LOCALLAB_CHROML;Chroma (C) TP_LOCALLAB_CHRRT;Chroma TP_LOCALLAB_CIE;Color appearance (Cam16 & JzCzHz) +TP_LOCALLAB_CIE_SMOOTH_NONE;None +TP_LOCALLAB_CIE_SMOOTH_EV;Ev based +TP_LOCALLAB_CIE_SMOOTHFRAME;Highlight attenuation & Levels +TP_LOCALLAB_CIE_SMOOTH_GAMMA;Slope based +TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF;Gamma based +TP_LOCALLAB_CIE_SMOOTH_LEVELS;Levels 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 @@ -2871,16 +2962,20 @@ 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' or 'Soft Light and Original Retinex' or 'Blur/Grain and Denoise' or 'Dehaze and Retinex' or 'Contrast by Detail Levels' in 'Add tool to current spot' menu.\nFor others tools Preview ΔE button is 'in the tool' - to be able to preview ΔE with several tools enabled, use preferably 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_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_COLORFRAME;Dominant color TP_LOCALLAB_COL_NAME;Name TP_LOCALLAB_COL_VIS;Status TP_LOCALLAB_COMPFRA;Directional contrast TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +TP_LOCALLAB_COMPRCIE;Brightness compression +TP_LOCALLAB_COMPRCIETH;Compression threshold +TP_LOCALLAB_COMPRLOG_TOOLTIP;This algorithm compress the data before log conversion, above the theshold slider value. To use in conjunction with Whites distribution. TP_LOCALLAB_CONTCOL;Contrast threshold TP_LOCALLAB_CONTFRA;Contrast by level TP_LOCALLAB_CONTRAST;Contrast @@ -2911,7 +3006,7 @@ 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. @@ -2931,6 +3026,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 @@ -2938,6 +3034,7 @@ 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_MASKALL;Enable all mask tools 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 @@ -2954,9 +3051,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 local adjustment 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 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.\n\n'Global' allows you to use the local adjustment tools on the whole image, without using deltaE 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 @@ -2969,7 +3067,7 @@ TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nTh 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. @@ -3088,7 +3186,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 @@ -3133,8 +3231,11 @@ 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_LOGCIE_TOOLTIP;Allows you tu 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_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.:\nThe user 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_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) @@ -3142,7 +3243,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 @@ -3155,6 +3256,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. @@ -3169,7 +3271,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 @@ -3224,7 +3326,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 @@ -3260,6 +3362,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 @@ -3306,11 +3409,19 @@ TP_LOCALLAB_ORRETILAP_TOOLTIP;Modifies ΔE prior to any changes made by 'Scope'. 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_PRECAM_TOOLTIP;This 'Source Data Adjustments' modifies: a)the Dynamic Range using Log encoding; b) the tones of the image and primaries(simplified Abstract Profile) and also midtones, just before the Ciecam process. The values 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.\n\n\n-Destination primaries: which 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 not too different (be careful), 'Working Profiles' are not modified.\nYou can also finely adapt the primaries and the illuminant (white-point).\nMoving a primary away from the white point reduces saturation and vice versa. Pay attention to the gamut. +TP_LOCALLAB_PRECAMGAMUT_TOOLTIP;If checked ensures a gamut control just after primary conversion to XYZ matrix. +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_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_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 +TC_LOCALLAB_PRIM_SHIFTX;Shift x +TC_LOCALLAB_PRIM_SHIFTY;Shift y +TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP;In combination with "Refine colors" allows you:\n 1) for low values adjust the image purity.\n 2) for higher values, carry out moderate Color Toning.\n 3) Be careful not to go outside the CIE xy diagram. +TP_LOCALLAB_PRIMILLFRAME;Primaries & Illuminant TP_LOCALLAB_PROXI;ΔE decay TP_LOCALLAB_QUAAGRES;Aggressive TP_LOCALLAB_QUACONSER;Conservative @@ -3355,10 +3466,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 @@ -3379,7 +3491,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. @@ -3425,17 +3537,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_SIGCIE;Sigmoid +TP_LOCALLAB_SIGFRA;Sigmoid Q +TP_LOCALLAB_SIGGAMJCIE;Gamma 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_SIGMOIDLOGAUTO;Auto threshold +TP_LOCALLAB_SIGMOIDQJ;Black Ev & White Ev +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_SIGMOID_TOOLTIP;Allows you to simulate a Tone-mapping appearance using both the '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_SIGMOID16_TOOLTIP;Allows you to simulate a Tone-mapping appearance using both the'Ciecam' and 'Sigmoid Q'.\nSigmoid Q: three 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)Adaptability weights the action of the sigmoid by action on the internal exponential function. +TP_LOCALLAB_SIGMOIDLOGEV_TOOLTIP;If the comboxbox 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_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_SIGMOIDNORMCIEBLEND_TOOLTIP;Blend acts on the final aspect of the image, contrast and luminance : ratio between original and output image. +TP_LOCALLAB_SIGMOIDQJCOMPRCIE_TOOLTIP;When the comboxbox 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. This last value stands for brightness (Q) should be a near the possible value 'Compression treshold' (calculate when 'Auto threshold" checked, often > 1). +TP_LOCALLAB_SIGSLOPJCIE;Slope +TP_LOCALLAB_SIGTRCCIE;Source Data Adjustments +TP_LOCALLAB_SIGBLACKSSCIE;Blacks distribution +TP_LOCALLAB_SIGWHITESCIE;Whites distribution +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_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_SLOPESMOOTHR;Red balance (Slope) +TP_LOCALLAB_SLOPESMOOTHG;Green balance (Slope) +TP_LOCALLAB_SLOPESMOOTHB;Blue 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_YB;Scale Yb Viewing +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 - Slope - based: choice (Standard and Advanced) allows you to simulate a "Tone mapping" using: a) Scene conditions: Black-Ev, White-Ev, Mean luminance (Yb%); b) Viewing conditions: Mean luminance (Yb%).\nScale Yb Scene is function of White-Ev. 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. @@ -3457,13 +3593,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. @@ -3495,11 +3632,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 @@ -4153,7 +4291,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 @@ -4229,7 +4367,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.osx b/rtdata/options/options.osx index cf31210e6..ef68d7144 100644 --- a/rtdata/options/options.osx +++ b/rtdata/options/options.osx @@ -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/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/camconst.json b/rtengine/camconst.json index f834acdbd..b80d776b8 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1456,6 +1456,17 @@ Camera constants: ] }, + { // 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 ] } + ] + }, + { // Quality B "make_model": [ "FUJIFILM GFX 50R", "FUJIFILM GFX 50S", "FUJIFILM GFX50S II" ], "dcraw_matrix": [ 11756,-4754,-874,-3056,11045,2305,-381,1457,6006 ], // DNGv9.9 D65 @@ -2206,7 +2217,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 +2323,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 +3028,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 ] 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 8d4d58405..d7d058eb8 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); @@ -8827,6 +8934,10 @@ 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-S5M2", 0, 0, /* DC-S5M2, DC-S5M2X */ + { 10308,-4206,-783,-4088,12102,2229,-125,1051,5912 } }, + { "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 DMC-GF1", 15, 0xf92, @@ -8855,8 +8966,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, @@ -9023,6 +9138,8 @@ 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-6700", 0, 0, + { 6972,-2408,-600,-4330,12101,2515,-388,1277,5847 } }, { "Sony ILCE-6", 0, 0, /* 6300, 6500 */ { 5973,-1695,-419,-3826,11797,2293,-639,1398,5789 } }, { "Sony ILCE-7M2", 0, 0, @@ -9614,7 +9731,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) { @@ -10372,7 +10489,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; diff --git a/rtengine/dcraw.h b/rtengine/dcraw.h index 0ff0540e9..83112ce9e 100644 --- a/rtengine/dcraw.h +++ b/rtengine/dcraw.h @@ -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,8 +159,8 @@ 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]; }; @@ -159,7 +174,7 @@ protected: unsigned sub_frame_shot_select; }; - int fuji_total_lines, fuji_total_blocks, fuji_block_width, fuji_bits, fuji_raw_type; + 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; @@ -187,13 +202,6 @@ protected: double RT_baseline_exposure; struct MergedPixelshift merged_pixelshift; - struct PanasonicRW2Info { - ushort bpp; - ushort encoding; - PanasonicRW2Info(): bpp(0), encoding(0) {} - }; - PanasonicRW2Info RT_pana_info; - public: struct CanonCR3Data { // contents of tag CMP1 for relevant track in CR3 file @@ -223,6 +231,29 @@ 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); @@ -238,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)(); @@ -377,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); @@ -384,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); @@ -393,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(); @@ -489,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..580475c37 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 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/imageio.cc b/rtengine/imageio.cc index e2c6c1310..f096213dc 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -285,6 +285,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) { diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 5358f2880..46dd7bc29 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,9 @@ 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 +1186,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 +1217,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 +1264,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 +1284,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 +1314,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 +1352,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 +1376,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 +1405,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 +1421,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 +1435,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 +1525,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 +1556,87 @@ 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 != 30) {//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 +1824,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 +2051,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 +2068,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 +2142,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 +2228,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 +2333,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 +2346,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.h b/rtengine/improcfun.h index 58e597dce..9c6c794f0 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -193,7 +193,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 +253,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 +271,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 +292,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 +332,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 +349,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,10 +364,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_eqdehaz(ImProcFunctions *ipf, Imagefloat *rgb, int whits, int blacks, const Glib::ustring &workingProfile, double scale, bool multithread); + + 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); @@ -507,7 +511,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/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 3d02c9df6..1d03f7adc 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) @@ -86,12 +87,12 @@ constexpr float clipDE(float x) 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 +173,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 +184,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 +215,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 +224,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 +257,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 +312,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 +326,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 +398,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 +435,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 +448,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 +472,7 @@ struct local_params { float balance; float balanceh; int colorde; - int cir; + float cir; bool recur; float thr; float stru; @@ -684,7 +698,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 +718,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 +796,16 @@ 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; + bool satcie; + bool satlog; int sensilog; int sensicie; int sensimas; @@ -815,6 +843,12 @@ struct local_params { float mLjz; float mCjz; float softrjz; + bool fftcieMask; + float comprlo; + float comprlocie; + int moka; + int sursouci; + int smoothciem; }; @@ -822,7 +856,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 +872,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 +913,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 +932,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 +970,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 +987,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 +1037,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 +1057,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 +1099,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 +1198,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 +1232,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 +1310,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]); } @@ -1419,7 +1475,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 +1511,15 @@ 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); + + 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,7 +1550,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.angmaexp = angmaskexpo; lp.str_mas = strmask; lp.ang_mas = angmask; - + lp.strexp = strexpo; lp.angexp = angexpo; lp.strSH = strSH; @@ -1649,7 +1740,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 +1751,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 +1775,10 @@ 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.blendmacie = blendmaskcie; lp.radmacie = radmaskcie; @@ -1694,14 +1789,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 +1856,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 +1919,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 +1930,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 +1943,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 +1954,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 +2022,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 +2031,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 +2057,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 +2073,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 +2091,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 +2150,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 +2168,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 +2220,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 +2253,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 +2263,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 +2273,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 +2289,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 +2342,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 +2372,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 +2410,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 +2431,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 +2449,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 +2462,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 +2482,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 +2689,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,19 +2697,21 @@ 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]; } } @@ -2331,80 +2746,101 @@ void ImProcFunctions::tone_eqdehaz(ImProcFunctions *ipf, Imagefloat *rgb, int wh } -void sigmoidla (float &valj, float thresj, float lambda) +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]}, @@ -2414,41 +2850,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; @@ -2467,63 +2907,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 @@ -2544,7 +2984,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. @@ -2554,55 +2995,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; } } @@ -2618,19 +3090,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") { @@ -2643,11 +3122,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") { @@ -2679,7 +3162,7 @@ void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, L c2 = 0.41f; nc2 = 0.8f; } - + } } @@ -2695,8 +3178,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 { @@ -2711,8 +3195,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; @@ -2721,47 +3206,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) { @@ -2773,24 +3262,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) { @@ -2802,6 +3289,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; } @@ -2818,9 +3306,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(); @@ -2841,17 +3331,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; @@ -2861,7 +3354,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) ; @@ -2873,7 +3367,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.; @@ -2889,13 +3383,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]; @@ -2915,51 +3409,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)); @@ -2972,20 +3474,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; @@ -2994,9 +3497,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, @@ -3014,17 +3517,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) { @@ -3033,52 +3537,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]; @@ -3099,7 +3609,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; @@ -3107,7 +3617,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]; @@ -3116,11 +3627,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]; @@ -3129,21 +3641,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 ; } @@ -3151,23 +3664,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; @@ -3189,18 +3706,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); } @@ -3208,55 +3727,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); } @@ -3267,80 +3793,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]; @@ -3348,57 +3882,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); @@ -3406,54 +3950,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); @@ -3465,16 +4020,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); @@ -3489,35 +4045,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]; @@ -3529,87 +4086,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 @@ -3627,11 +4253,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); @@ -3643,10 +4270,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); @@ -3667,10 +4294,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; @@ -3685,7 +4312,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]; @@ -3705,10 +4332,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; @@ -3717,50 +4344,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); @@ -3774,7 +4409,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 @@ -3790,14 +4425,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]; @@ -3808,8 +4443,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; @@ -3820,7 +4456,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; @@ -3835,7 +4471,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; @@ -3850,7 +4486,6 @@ if(mocam == 0 || mocam == 1 || call == 1 || call == 2 || call == 10) {//call=2 Cpro = Mpro / coe; } } - } //retrieve values C,J...s @@ -3871,9 +4506,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); @@ -3895,9 +4530,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); @@ -3911,7 +4546,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; @@ -3921,303 +4556,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) @@ -4225,11 +4611,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; @@ -4239,7 +4627,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); @@ -4248,6 +4636,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]); @@ -4258,6 +4647,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; @@ -4275,6 +4665,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]; @@ -4285,6 +4676,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; @@ -4294,7 +4686,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); @@ -4303,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]; @@ -4320,6 +4713,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); @@ -4331,6 +4725,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)); @@ -4348,6 +4743,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; @@ -4361,26 +4757,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; @@ -4397,6 +4797,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) { @@ -4406,8 +4807,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]; @@ -4417,20 +4819,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 @@ -4442,7 +4846,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; @@ -4450,6 +4854,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]; @@ -4492,6 +4897,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; @@ -4545,7 +4951,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; @@ -4604,6 +5013,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 @@ -4618,9 +5028,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; @@ -4638,6 +5051,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 @@ -4654,6 +5068,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; @@ -4696,10 +5113,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; @@ -4741,8 +5161,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 @@ -4765,7 +5185,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; @@ -4776,6 +5196,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; @@ -4797,13 +5220,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; @@ -4875,6 +5301,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; @@ -4886,13 +5313,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 @@ -4908,6 +5338,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; } @@ -4930,6 +5361,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; } @@ -5015,6 +5447,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; @@ -5029,24 +5462,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); @@ -5104,24 +5543,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])); } } @@ -5132,12 +5573,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; } @@ -5150,10 +5593,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; @@ -5232,6 +5677,9 @@ void calclocalGradientParams(const struct local_params& lp, struct grad_params& } else if (indic == 12) { stops = -lp.str_mas; angs = lp.ang_mas; + } else if (indic == 15) { + stops = lp.strgradcie; + angs = lp.anggradcie; } @@ -5330,6 +5778,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; @@ -5351,6 +5800,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]; @@ -5365,6 +5815,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; @@ -5373,13 +5824,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) { @@ -5462,6 +5919,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); @@ -5470,6 +5928,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) { @@ -5504,7 +5963,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; } @@ -5512,6 +5972,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; @@ -5523,7 +5984,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); } @@ -5551,33 +6012,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; } @@ -5589,7 +6049,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"); @@ -5607,11 +6067,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]; @@ -5676,7 +6139,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 @@ -5701,11 +6164,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; @@ -5714,7 +6179,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.; @@ -5723,7 +6188,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])); } @@ -5732,10 +6198,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/ @@ -5756,18 +6222,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 */ @@ -5782,7 +6248,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 } @@ -5801,18 +6268,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(); @@ -5820,6 +6290,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(); @@ -5829,6 +6300,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(); @@ -5851,10 +6323,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); @@ -5872,13 +6346,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]); } @@ -5887,6 +6365,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++) { @@ -5913,7 +6392,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) { @@ -5921,6 +6400,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]); @@ -5935,15 +6415,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 } @@ -5973,14 +6457,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; @@ -5993,6 +6479,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]; @@ -6049,7 +6536,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); @@ -6059,7 +6546,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); @@ -6094,16 +6581,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); @@ -6122,11 +6612,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 @@ -6135,10 +6625,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])); @@ -6151,13 +6642,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); @@ -6168,34 +6661,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]; @@ -6203,12 +6699,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 @@ -6225,6 +6722,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__ @@ -6232,12 +6730,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]); } } @@ -6267,13 +6765,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)]); } @@ -6281,7 +6779,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); @@ -6318,27 +6816,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 @@ -6347,6 +6849,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); @@ -6374,6 +6877,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]); @@ -6388,6 +6892,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]); @@ -6399,6 +6904,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]]; @@ -6444,9 +6950,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]; @@ -6456,6 +6964,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; @@ -6468,13 +6977,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 @@ -6485,12 +6994,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]; @@ -6506,6 +7016,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; } @@ -6521,7 +7032,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; @@ -6529,14 +7040,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; @@ -6546,6 +7057,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]); @@ -6603,6 +7115,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]; @@ -6615,38 +7128,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; @@ -6720,6 +7235,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; @@ -6730,7 +7246,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); } @@ -6793,6 +7309,7 @@ void ImProcFunctions::InverseSharp_Local(float **loctemp, const float hueref, co transformed->b[y][x] = 0.f; } } + break; } @@ -6861,6 +7378,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 @@ -6876,7 +7394,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); } @@ -6930,7 +7448,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; @@ -6975,8 +7493,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 @@ -7005,7 +7523,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); } @@ -7066,13 +7584,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); @@ -7100,17 +7618,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)); @@ -7145,8 +7665,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++) { @@ -7156,7 +7676,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); } @@ -7200,8 +7720,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]; } @@ -7288,8 +7808,7 @@ void ImProcFunctions::transit_shapedetect_retinex(int call, int senstype, LabIma } } - if (showmas || retishow || previewreti) - { + if (showmas || retishow || previewreti) { return; } @@ -7300,7 +7819,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); @@ -7312,14 +7831,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; } @@ -7354,8 +7870,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 @@ -7367,24 +7882,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]; @@ -7401,8 +7918,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]; @@ -7433,8 +7950,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__ @@ -7463,7 +7980,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); } @@ -7551,7 +8068,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; } @@ -7592,6 +8109,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]; @@ -7608,19 +8126,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); @@ -7633,6 +8156,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 @@ -7661,6 +8185,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; @@ -7675,6 +8200,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" @@ -7693,6 +8219,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]]; @@ -7759,6 +8286,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; @@ -7778,12 +8306,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)); @@ -7939,7 +8468,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 @@ -7950,7 +8479,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; @@ -7969,7 +8498,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); @@ -8133,11 +8662,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; } @@ -8155,14 +8685,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]; @@ -8172,7 +8703,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 { @@ -8185,6 +8716,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) { @@ -8196,7 +8728,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; @@ -8213,11 +8745,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); @@ -8315,6 +8848,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; @@ -8324,7 +8858,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); } @@ -8393,14 +8927,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 @@ -8423,9 +8949,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; @@ -8452,19 +8993,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; @@ -8496,9 +9037,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; @@ -8509,6 +9052,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)); @@ -8532,29 +9076,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]; @@ -8569,14 +9116,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]); } } } @@ -8589,6 +9136,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]; @@ -8602,19 +9150,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; @@ -8631,6 +9186,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; @@ -8654,14 +9210,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__ @@ -8700,9 +9262,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]); @@ -8712,7 +9285,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; } @@ -8727,7 +9301,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; @@ -8824,17 +9398,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]); @@ -8872,6 +9449,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 @@ -8920,6 +9498,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; @@ -8939,6 +9518,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; @@ -8957,6 +9537,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; @@ -8968,6 +9549,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; @@ -8984,6 +9566,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; } @@ -8992,9 +9575,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 } @@ -9019,6 +9604,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]; @@ -9030,6 +9616,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]; @@ -9114,6 +9701,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; @@ -9226,6 +9814,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]; @@ -9266,6 +9855,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); @@ -9405,9 +9995,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]); @@ -9421,7 +10013,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; @@ -9449,78 +10043,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, @@ -9547,6 +10145,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]; @@ -9560,9 +10159,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 @@ -9579,15 +10180,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]); } @@ -9638,16 +10243,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 @@ -9663,6 +10272,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 @@ -9683,6 +10293,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; @@ -9691,11 +10302,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); @@ -9710,15 +10323,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]); } @@ -9761,11 +10378,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]; @@ -9821,6 +10440,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; @@ -9836,6 +10456,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]) { @@ -9863,6 +10484,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]; } @@ -9888,6 +10510,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; @@ -9901,6 +10524,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; @@ -9931,7 +10555,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) @@ -9950,6 +10574,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]); } @@ -9966,6 +10591,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; } @@ -10032,6 +10658,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); @@ -10041,7 +10668,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; @@ -10052,6 +10679,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 @@ -10063,12 +10691,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]); @@ -10107,6 +10736,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; @@ -10149,11 +10779,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 @@ -10171,6 +10803,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 @@ -10180,6 +10813,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" @@ -10214,11 +10848,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 { @@ -10226,11 +10862,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]); } @@ -10254,6 +10891,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) @@ -10285,41 +10923,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; @@ -10329,18 +10978,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; @@ -10349,20 +11001,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(); @@ -10373,6 +11031,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]; @@ -10386,15 +11045,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]; @@ -10412,7 +11075,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]; @@ -10490,6 +11153,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; @@ -10588,27 +11252,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; @@ -10619,7 +11287,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); @@ -10628,18 +11296,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]; @@ -10677,7 +11347,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 @@ -10697,7 +11367,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); @@ -10730,21 +11400,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)) { @@ -10777,18 +11450,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]); } } @@ -10810,6 +11487,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); @@ -10870,6 +11548,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]; @@ -10883,7 +11562,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; @@ -10891,8 +11570,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; } @@ -10900,10 +11579,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]; @@ -10916,22 +11596,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)]; } } @@ -10939,7 +11620,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); @@ -11152,6 +11833,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])); @@ -11171,7 +11853,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); @@ -11189,6 +11871,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]; @@ -11209,6 +11892,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]; @@ -11232,6 +11916,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]; @@ -11250,26 +11935,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]; @@ -11289,23 +11986,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; @@ -11316,7 +12016,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 { @@ -11330,16 +12031,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(); } @@ -11452,6 +12156,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; @@ -11470,20 +12175,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]); } } } @@ -11502,6 +12212,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); @@ -11567,6 +12278,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]; @@ -11579,56 +12291,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)]; } } @@ -11850,6 +12565,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])); @@ -11868,7 +12584,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); @@ -11886,6 +12602,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]; @@ -11910,6 +12627,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]; @@ -11931,6 +12649,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]; @@ -11946,19 +12665,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]); @@ -11966,17 +12689,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; @@ -11986,7 +12710,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]; - } + } } } @@ -11995,7 +12719,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; @@ -12011,54 +12736,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]; @@ -12139,6 +12871,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); @@ -12179,6 +12912,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); @@ -12215,6 +12949,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); @@ -12265,7 +13000,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; } @@ -12438,12 +13173,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); @@ -12476,6 +13212,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); } @@ -12579,15 +13316,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; @@ -12598,22 +13338,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) { @@ -12621,8 +13364,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); @@ -12631,21 +13376,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 @@ -12655,33 +13402,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) { @@ -12691,9 +13438,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); @@ -12705,7 +13452,7 @@ void ImProcFunctions::detail_mask(const array2D &src, array2D &mas } } } - + } // basic idea taken from Algorithm 3 in the paper: @@ -12722,11 +13469,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); @@ -12739,19 +13487,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)) @@ -12779,44 +13532,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; @@ -12824,27 +13582,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__ @@ -12854,147 +13614,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]); } @@ -13003,8 +13778,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( @@ -13033,7 +13809,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, @@ -13049,6 +13825,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, @@ -13059,12 +13836,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 ) @@ -13110,6 +13887,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; @@ -13130,6 +13908,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; @@ -13153,6 +13932,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; @@ -13166,8 +13946,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); @@ -13192,6 +13972,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]; @@ -13231,6 +14012,7 @@ void ImProcFunctions::Lab_Local( if (lp.showmasklogmet == 0) { zero = true; } + float chrom = lp.chromaL; float rad = lp.radmaL; float blendm = lp.blendmaL; @@ -13265,6 +14047,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); @@ -13274,35 +14057,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); } @@ -13310,11 +14098,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); @@ -13326,37 +14115,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; @@ -13392,12 +14184,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]; @@ -13515,6 +14308,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]; @@ -13565,12 +14359,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); @@ -13595,12 +14392,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); @@ -13729,6 +14529,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]; @@ -13748,11 +14549,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]; @@ -13764,6 +14566,7 @@ void ImProcFunctions::Lab_Local( } } + array2D iR(bfw, bfh, rr, 0); array2D iG(bfw, bfh, gg, 0); array2D iB(bfw, bfh, bb, 0); @@ -13787,11 +14590,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]; @@ -13805,16 +14609,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; @@ -13827,33 +14634,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; } } @@ -13862,8 +14673,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]; @@ -13871,6 +14683,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(); } @@ -13883,6 +14696,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]; @@ -13907,6 +14721,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]; @@ -13942,11 +14757,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]; @@ -13960,16 +14776,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; @@ -13982,27 +14801,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); } @@ -14013,8 +14835,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]; @@ -14022,6 +14845,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(); } @@ -14032,8 +14856,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); @@ -14045,8 +14869,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); @@ -14081,6 +14905,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; @@ -14135,7 +14960,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)); @@ -14157,31 +14982,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 @@ -14260,29 +15089,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]; @@ -14292,6 +15124,7 @@ void ImProcFunctions::Lab_Local( } } } + bool enatmMasktmap = params->locallab.spots.at(sp).enatmMaskaft; if (enatmMasktmap) { @@ -14335,6 +15168,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]; @@ -14364,6 +15198,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; @@ -14371,15 +15206,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); @@ -14387,11 +15223,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(); @@ -14408,7 +15245,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); @@ -14423,6 +15260,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]; @@ -14475,17 +15313,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; @@ -14498,6 +15337,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]; @@ -14507,21 +15347,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 @@ -14541,10 +15382,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); } @@ -14557,6 +15403,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]; @@ -14584,11 +15431,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]; } } @@ -14601,23 +15450,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.); } } @@ -14625,6 +15475,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]; @@ -14634,7 +15485,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; @@ -14648,6 +15499,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]; @@ -14679,6 +15531,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) { @@ -14692,6 +15545,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]); @@ -14720,6 +15574,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]; @@ -14743,6 +15598,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]; @@ -14758,6 +15614,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; @@ -14788,6 +15645,7 @@ void ImProcFunctions::Lab_Local( delete buforigmas; } } + delete bufreti; } } @@ -14838,6 +15696,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; @@ -14851,6 +15710,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]; @@ -14887,10 +15747,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); } } @@ -14907,6 +15772,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]; @@ -14939,6 +15805,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]; @@ -14951,6 +15818,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]; @@ -14958,17 +15826,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; @@ -14983,6 +15853,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]; @@ -14998,6 +15869,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; @@ -15019,6 +15891,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])); @@ -15031,6 +15904,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]); @@ -15057,6 +15931,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]; @@ -15078,6 +15953,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]; @@ -15093,6 +15969,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; @@ -15115,7 +15992,7 @@ void ImProcFunctions::Lab_Local( delete tmpl; delete bufmask; delete bufmaskorigreti; - + if (!lp.enaretiMasktmap && lp.enaretiMask) { if (buforig) { delete buforig; @@ -15125,6 +16002,7 @@ void ImProcFunctions::Lab_Local( delete buforigmas; } } + delete bufreti; } } @@ -15139,6 +16017,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); @@ -15157,6 +16036,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]; @@ -15241,6 +16121,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]; @@ -15260,12 +16141,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; @@ -15273,7 +16154,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); @@ -15286,6 +16167,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])); @@ -15315,6 +16197,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]))); @@ -15330,6 +16213,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; @@ -15339,14 +16223,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); } - + } } } @@ -15356,6 +16241,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); @@ -15381,6 +16267,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]; @@ -15459,6 +16346,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++) { @@ -15468,13 +16356,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; @@ -15487,14 +16375,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"); @@ -15503,6 +16391,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); @@ -15535,13 +16424,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); @@ -15551,12 +16440,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); @@ -15564,23 +16454,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]); } } @@ -15593,19 +16489,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]); } @@ -15615,30 +16515,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); - + } } @@ -15657,7 +16557,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; } @@ -15695,6 +16595,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]; @@ -15773,6 +16674,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]; @@ -15796,6 +16698,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); @@ -15814,10 +16717,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) { @@ -15830,16 +16735,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); @@ -15850,8 +16755,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]); @@ -15860,11 +16766,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; @@ -15884,6 +16791,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]; @@ -15980,6 +16888,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]; @@ -16005,6 +16914,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]; @@ -16017,6 +16927,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]; @@ -16050,6 +16961,7 @@ void ImProcFunctions::Lab_Local( } } } + if (loclevwavCurve && loclevwavutili) { for (int i = 0; i < 500; i++) { if (loclevwavCurve[i] != 0.f) { @@ -16058,6 +16970,7 @@ void ImProcFunctions::Lab_Local( } } } + if (locconwavCurve && locconwavutili) { for (int i = 0; i < 500; i++) { if (locconwavCurve[i] != 0.5f) { @@ -16066,6 +16979,7 @@ void ImProcFunctions::Lab_Local( } } } + if (loccompwavCurve && loccompwavutili) { for (int i = 0; i < 500; i++) { if (loccompwavCurve[i] != 0.f) { @@ -16074,6 +16988,7 @@ void ImProcFunctions::Lab_Local( } } } + if (loccomprewavCurve && loccomprewavutili) { for (int i = 0; i < 500; i++) { if (loccomprewavCurve[i] != 0.75f) { @@ -16120,6 +17035,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]; @@ -16140,6 +17056,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]; @@ -16232,6 +17149,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]; @@ -16245,6 +17163,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]; @@ -16300,7 +17219,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; @@ -16316,18 +17235,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]); } } @@ -16337,11 +17260,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); @@ -16349,17 +17273,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]); } @@ -16387,6 +17315,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]; @@ -16403,6 +17332,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]; @@ -16415,6 +17345,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]); @@ -16439,6 +17370,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]; @@ -16456,6 +17388,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]; @@ -16469,6 +17402,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]); @@ -16485,6 +17419,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]; @@ -16492,6 +17427,7 @@ void ImProcFunctions::Lab_Local( tmpresid->b[y][x] = tmp1->b[y][x]; } } + clarimerge(lp, mL, mC, exec, tmpresid.get(), wavelet_level, sk, numThreads); } @@ -16519,6 +17455,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]); @@ -16532,20 +17469,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; @@ -16553,18 +17491,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(); } @@ -16592,26 +17533,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; @@ -16622,113 +17565,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; @@ -16745,18 +17711,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]); } } @@ -16764,24 +17735,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]); @@ -16843,6 +17819,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]; @@ -16856,24 +17833,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); @@ -16883,6 +17864,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; @@ -16893,7 +17875,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); } @@ -16972,6 +17954,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]; @@ -16987,11 +17970,12 @@ 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] = 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 } @@ -17003,12 +17987,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); } } @@ -17022,6 +18007,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); @@ -17038,11 +18024,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; @@ -17053,7 +18041,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; @@ -17062,13 +18051,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); @@ -17087,12 +18078,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) { @@ -17112,6 +18105,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 @@ -17124,6 +18118,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 @@ -17132,6 +18127,7 @@ void ImProcFunctions::Lab_Local( } } } + if (lp.shadex > 0) { if (lp.expcomp == 0.f) { @@ -17145,7 +18141,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) { @@ -17163,6 +18159,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; @@ -17173,6 +18170,7 @@ void ImProcFunctions::Lab_Local( } } } + /* float gamma = lp.gamex; rtengine::GammaValues g_a; //gamma parameters @@ -17180,17 +18178,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]); } @@ -17200,22 +18202,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; @@ -17223,8 +18225,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]); @@ -17233,7 +18236,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); @@ -17264,6 +18267,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]; @@ -17399,6 +18403,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]; @@ -17413,30 +18418,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) { @@ -17447,6 +18456,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; @@ -17457,7 +18467,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); } @@ -17468,6 +18478,7 @@ void ImProcFunctions::Lab_Local( } } } + return; } } @@ -17500,6 +18511,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") { @@ -17546,6 +18558,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++) { @@ -17619,6 +18632,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; @@ -17629,7 +18643,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); } @@ -17653,6 +18667,7 @@ void ImProcFunctions::Lab_Local( } bool HHcurve = false; + if (lochhCurve && HHutili) { for (int i = 0; i < 500; i++) { if (lochhCurve[i] != 0.5f) { @@ -17683,6 +18698,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) { @@ -17691,7 +18707,9 @@ void ImProcFunctions::Lab_Local( } } } + bool CHcurve = false; + if (locchCurve && CHutili) { for (int i = 0; i < 500; i++) { if (locchCurve[i] != 0.5f) { @@ -17700,17 +18718,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]; @@ -17785,16 +18807,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 @@ -17802,7 +18824,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); @@ -17811,9 +18833,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; @@ -17843,6 +18866,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]; @@ -17852,6 +18876,7 @@ void ImProcFunctions::Lab_Local( } bool nottransit = false; + if (lp.mergemet >= 2) { //merge result with original nottransit = true; bufcolreserv.reset(new LabImage(bfw, bfh)); @@ -17861,6 +18886,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]; @@ -17877,9 +18903,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; } } } @@ -17890,6 +18916,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); @@ -17904,6 +18931,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); @@ -17919,6 +18947,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); @@ -17928,6 +18957,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) { @@ -17935,6 +18965,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) { @@ -17975,6 +19006,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]); @@ -17993,6 +19025,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]); @@ -18010,6 +19043,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]); @@ -18027,6 +19061,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]); @@ -18039,6 +19074,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]); @@ -18051,6 +19087,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) { @@ -18099,6 +19136,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]); @@ -18115,6 +19153,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]); @@ -18138,10 +19177,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)); @@ -18159,6 +19200,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)); @@ -18170,6 +19212,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)); @@ -18181,6 +19224,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)); @@ -18192,6 +19236,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)); @@ -18203,6 +19248,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)); @@ -18214,6 +19260,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)); @@ -18225,6 +19272,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)); @@ -18236,6 +19284,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)); @@ -18247,6 +19296,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)); @@ -18258,6 +19308,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)); @@ -18269,6 +19320,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)); @@ -18280,6 +19332,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)); @@ -18291,6 +19344,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)); @@ -18302,6 +19356,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)); @@ -18314,6 +19369,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)); @@ -18325,6 +19381,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)); @@ -18341,6 +19398,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]); @@ -18354,22 +19412,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); } @@ -18381,6 +19441,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); @@ -18394,6 +19455,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); @@ -18408,6 +19470,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); @@ -18440,24 +19503,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]); } @@ -18468,39 +19535,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); @@ -18552,6 +19623,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]; @@ -18614,20 +19686,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); @@ -18639,7 +19713,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; @@ -18655,9 +19729,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]; @@ -18673,6 +19749,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; @@ -18681,15 +19758,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; @@ -18719,15 +19798,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]; @@ -18740,6 +19821,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); @@ -18756,8 +19838,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]); @@ -18767,39 +19850,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)); @@ -18810,172 +19906,584 @@ 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); + } + } + } // 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/ipwavelet.cc b/rtengine/ipwavelet.cc index e5e90a77f..f0b6afaaf 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -434,7 +434,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 +4142,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/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 c68ec153f..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; @@ -63,7 +491,7 @@ 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) @@ -71,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]) @@ -100,6 +533,37 @@ 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 } @@ -146,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); @@ -181,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()"); @@ -193,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; @@ -224,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; } } } @@ -281,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/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 43b8bb3ec..9d759a723 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) @@ -2390,17 +2390,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 +2416,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 +2438,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 +2460,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 +2990,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,7 +3038,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : labgridAHighmerg(-3500.0), labgridBHighmerg(-4600.0), strengthgrid(30), - sensi(15), + sensi(30), structcol(0), strcol(0.), strcolab(0.), @@ -3360,13 +3378,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), @@ -3453,7 +3471,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : protectskins(false), avoidcolorshift(true), pastsattog(true), - sensiv(15), + sensiv(30), skintonescurve{ static_cast(DCT_Linear) }, @@ -4227,8 +4245,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"), @@ -4400,6 +4423,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : // ciecam visicie(false), expcie(false), + expprecam(false), complexcie(0), reparcie(100.), sensicie(60), @@ -4408,8 +4432,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), @@ -4419,6 +4452,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : sursourcie("Average"), modecie("com"), modecam("cam16"), + bwevMethod("sig"), saturlcie(0.), rstprotectcie(0.), chromlcie(0.), @@ -4550,8 +4584,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.), @@ -4578,33 +4614,63 @@ 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.), enacieMask(false), + enacieMaskall(false), CCmaskciecurve{ static_cast(FCT_MinMaxCPoints), 0.0, @@ -4650,6 +4716,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), @@ -4666,10 +4748,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 @@ -4843,7 +5015,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; } @@ -5226,8 +5398,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 @@ -5280,6 +5457,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 @@ -5288,8 +5466,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 @@ -5299,6 +5486,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 @@ -5322,8 +5510,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 @@ -5345,30 +5535,62 @@ 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 && 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 @@ -5379,8 +5601,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; } @@ -6730,7 +6960,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); } @@ -7114,8 +7344,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); @@ -7170,6 +7405,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); @@ -7178,8 +7414,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); @@ -7189,6 +7434,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); @@ -7212,8 +7458,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); @@ -7235,31 +7483,64 @@ 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->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); @@ -7271,11 +7552,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); } - } } @@ -7374,7 +7663,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 @@ -7393,6 +7683,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"}, @@ -7402,14 +7693,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); @@ -7418,8 +7729,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( @@ -8742,6 +9056,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); @@ -8927,7 +9246,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]); } @@ -9370,8 +9689,13 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) 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); + 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); @@ -9440,6 +9764,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); @@ -9448,8 +9773,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); @@ -9459,8 +9793,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); @@ -9471,7 +9806,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); @@ -9482,14 +9817,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); @@ -9514,32 +9851,64 @@ 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); + + 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); @@ -9551,6 +9920,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); @@ -9731,7 +10118,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 @@ -9757,6 +10145,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}, @@ -9772,8 +10161,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); @@ -9781,9 +10195,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); @@ -9792,6 +10209,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 5ffcf9c6f..d1cad0a5d 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; @@ -1223,7 +1223,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; @@ -1592,8 +1592,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; @@ -1646,6 +1651,7 @@ struct LocallabParams { //ciecam bool visicie; bool expcie; + bool expprecam; int complexcie; double reparcie; int sensicie; @@ -1654,8 +1660,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; @@ -1665,6 +1680,7 @@ struct LocallabParams { Glib::ustring sursourcie; Glib::ustring modecie; Glib::ustring modecam; + Glib::ustring bwevMethod; double saturlcie; double rstprotectcie; double chromlcie; @@ -1688,8 +1704,10 @@ struct LocallabParams { double lightlcie; double lightjzcie; double lightqcie; + double lightsigqcie; double contlcie; double contjzcie; + double detailciejz; double adapjzcie; double jz100; double pqremap; @@ -1711,31 +1729,63 @@ 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; bool enacieMask; + bool enacieMaskall; std::vector CCmaskciecurve; std::vector LLmaskciecurve; std::vector HHmaskciecurve; + std::vector HHhmaskciecurve; int blendmaskcie; double radmaskcie; double chromaskcie; @@ -1747,7 +1797,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; @@ -1947,7 +2006,8 @@ struct ColorManagementParams { D120, STDA, TUNGSTEN_2000K, - TUNGSTEN_1500K + TUNGSTEN_1500K, + E }; enum class Primaries { @@ -1960,6 +2020,7 @@ struct ColorManagementParams { WIDE_GAMUT, ACES_P0, JDC_MAX, + JDC_MAXSTDA, BRUCE_RGB, BETA_RGB, BEST_RGB, @@ -1967,6 +2028,14 @@ struct ColorManagementParams { CUSTOM_GRID }; + enum class Cat { + BRAD, + CAT16, + CAT02, + CAT_VK, + CAT_XYZ + }; + Glib::ustring inputProfile; bool toneCurve; bool applyLookTable; @@ -1978,16 +2047,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; @@ -1997,6 +2073,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/rawimagesource.cc b/rtengine/rawimagesource.cc index f547b6bb4..b61503576 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -1078,7 +1078,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 +1094,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) @@ -3156,18 +3172,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 +3566,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 +3575,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); @@ -5277,7 +5290,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(); 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 1d7cf3b3c..8979feb1e 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -377,7 +377,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; }; @@ -429,12 +429,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 @@ -449,7 +509,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 fc5bb0017..8bdda29ec 100644 --- a/rtengine/rtlensfun.cc +++ b/rtengine/rtlensfun.cc @@ -19,6 +19,7 @@ */ #include +#include #include "imagedata.h" #include "procparams.h" @@ -475,23 +476,36 @@ LFLens LFDatabase::findLens(const LFCamera &camera, const Glib::ustring &name) c } } } - 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 + 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; + } } - 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; + 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()) { diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 2b719da24..bf5e48f59 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -1315,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()); } @@ -1454,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); @@ -1515,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; @@ -1545,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 383611c2a..87dd166cb 100644 --- a/rtengine/settings.h +++ b/rtengine/settings.h @@ -100,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 4202ac336..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,6 +351,7 @@ private: params.wb.green = currWB.getGreen(); params.wb.equal = currWB.getEqual(); } + //end WB auto calclum = nullptr ; @@ -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/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 c275ee675..32f6a9430 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -126,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 (); 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 bf6cc0772..b477790fc 100644 --- a/rtgui/batchqueuepanel.cc +++ b/rtgui/batchqueuepanel.cc @@ -92,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; @@ -176,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")); @@ -232,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 ) + "]" )); } @@ -252,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); } 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 0f9826fb0..f766efda7 100644 --- a/rtgui/cacheimagedata.cc +++ b/rtgui/cacheimagedata.cc @@ -20,6 +20,7 @@ #include #include #include +#include #include "version.h" #include @@ -273,7 +274,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); 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..8588f6057 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.))), 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); @@ -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); @@ -551,7 +557,6 @@ ControlSpotPanel::ControlSpotPanel(): pack_start(*ctboxwavmethod); */ show_all(); - // Define row background color // Mouseovered spot (opaque orange) colorMouseover.set_red(1.); @@ -794,6 +799,7 @@ bool ControlSpotPanel::on_button_visibility(GdkEventButton* event) return false; } + bool ControlSpotPanel::blockTreeviewSearch(GdkEventKey* event) { // printf("blockTreeviewSearch\n"); @@ -981,7 +987,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 +1000,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 +1033,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 +1051,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 +1067,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 +1339,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 +1352,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 +1393,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 +1429,11 @@ void ControlSpotPanel::updateParamVisibility() expMaskMerge_->show(); circrad_->show(); ctboxshape->show(); + hishow_->show(); + } - + } void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval) @@ -1456,7 +1548,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 +1694,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 +1704,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 +1726,9 @@ void ControlSpotPanel::hishowChanged() expMaskMerge_->show(); circrad_->show(); ctboxshape->show(); - } + hishow_->show(); + + } // Raise event if (listener) { @@ -2763,6 +2872,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 1649034f8..ddb38f16a 100644 --- a/rtgui/cropwindow.cc +++ b/rtgui/cropwindow.cc @@ -88,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%"); @@ -106,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); @@ -2480,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; @@ -2544,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 58ea1df1d..0e17b3f40 100644 --- a/rtgui/lensprofile.cc +++ b/rtgui/lensprofile.cc @@ -64,7 +64,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"))))) @@ -165,7 +165,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); @@ -259,7 +259,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 +270,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 +297,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); @@ -436,7 +436,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 +501,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,7 +514,7 @@ void LensProfilePanel::onCorrModeChanged(const Gtk::RadioButton* rbChanged) ckbUseVign->set_sensitive(true); ckbUseCA->set_sensitive(true); - + const bool disabled = disableListener(); if (batchMode) { setLensfunCamera("", ""); @@ -529,9 +529,9 @@ void LensProfilePanel::onCorrModeChanged(const Gtk::RadioButton* rbChanged) if (disabled) { enableListener(); } - + mode = M("TP_LENSPROFILE_CORRECTION_AUTOMATCH"); - + } else if (rbChanged == corrLensfunManualRB) { lcModeChanged = true; useLensfunChanged = true; @@ -545,7 +545,7 @@ 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; @@ -555,7 +555,7 @@ void LensProfilePanel::onCorrModeChanged(const Gtk::RadioButton* rbChanged) updateDisabled(true); mode = M("TP_LENSPROFILE_CORRECTION_LCPFILE"); - + } else if (rbChanged == corrUnchangedRB) { lcModeChanged = false; useLensfunChanged = false; 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..fd4ed22be 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.))), @@ -490,7 +504,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 +540,11 @@ 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(); + Evlocallabpreviewcol = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_PREVIEWCOL"); + set_orientation(Gtk::ORIENTATION_VERTICAL); - + float R, G, B; std::vector six_shape; @@ -596,6 +612,11 @@ LocallabColor::LocallabColor(): 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 +834,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 +857,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,8 +872,8 @@ 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); @@ -949,6 +973,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 +997,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 +1078,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 +1273,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); @@ -1278,7 +1386,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 +1450,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; @@ -1461,7 +1569,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 +1616,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); @@ -1524,7 +1632,7 @@ void LocallabColor::setDefaults(const rtengine::procparams::ProcParams* defParam 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 +1649,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 +1658,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 +1703,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 +1729,7 @@ void LocallabColor::adjusterChanged(Adjuster* a, double newval) } if (a == recothresc) { - + if (listener) { listener->panelChanged(Evlocallabrecothresc, recothresc->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); @@ -2002,7 +2110,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); @@ -2117,7 +2225,7 @@ void LocallabColor::updateGUIToMode(const modeType new_type) if (enaColorMask->get_active()) { maskusablec->show(); maskunusablec->hide(); - + } else { maskusablec->hide(); maskunusablec->show(); @@ -2154,7 +2262,7 @@ void LocallabColor::updateGUIToMode(const modeType new_type) if (enaColorMask->get_active()) { maskusablec->show(); maskunusablec->hide(); - + } else { maskusablec->hide(); maskunusablec->show(); @@ -2371,7 +2479,7 @@ void LocallabColor::enaColorMaskChanged() maskusablec->hide(); maskunusablec->show(); } - + if (isLocActivated && exp->getEnabled()) { if (listener) { if (enaColorMask->get_active()) { @@ -2571,9 +2679,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")))), @@ -2623,8 +2733,10 @@ LocallabExposure::LocallabExposure(): { set_orientation(Gtk::ORIENTATION_VERTICAL); - + const LocallabParams::LocallabSpot defSpot; + auto m = ProcEventMapper::getInstance(); + Evlocallabpreviewexe = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_PREVIEWEXE"); // Parameter Exposure specific widgets expMethod->append(M("TP_LOCALLAB_STD")); @@ -2706,6 +2818,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 +2899,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()); @@ -2873,6 +2992,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 +3064,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) { @@ -3616,6 +3799,7 @@ void LocallabExposure::convertParamToSimple() 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); @@ -3667,7 +3851,7 @@ void LocallabExposure::updateGUIToMode(const modeType new_type) if (enaExpMask->get_active()) { maskusablee->show(); maskunusablee->hide(); - + } else { maskusablee->hide(); maskunusablee->show(); @@ -3679,7 +3863,7 @@ void LocallabExposure::updateGUIToMode(const modeType new_type) // Specific Simple mode widgets are shown in Normal mode softradiusexp->hide(); blurexpde->hide(); - + if (!inversex->get_active()) { // Keep widget hidden when invers is toggled expgradexp->show(); softradiusexp->show(); @@ -3718,7 +3902,7 @@ void LocallabExposure::updateGUIToMode(const modeType new_type) if (enaExpMask->get_active()) { maskusablee->show(); maskunusablee->hide(); - + } else { maskusablee->hide(); maskunusablee->show(); @@ -3879,7 +4063,7 @@ void LocallabExposure::enaExpMaskChanged() maskusablee->hide(); maskunusablee->show(); } - + if (isLocActivated && exp->getEnabled()) { if (listener) { if (enaExpMask->get_active()) { @@ -3995,7 +4179,7 @@ void LocallabExposure::updateExposureGUI3() gamex->show(); } - + reparexp->show(); showmaskexpMethodinv->hide(); @@ -4014,16 +4198,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 +4224,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")))), @@ -4075,11 +4260,14 @@ 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"); + set_orientation(Gtk::ORIENTATION_VERTICAL); + const LocallabParams::LocallabSpot defSpot; // Parameter Shadow highlight specific widgets @@ -4134,6 +4322,11 @@ LocallabShadow::LocallabShadow(): 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 +4389,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 +4406,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); @@ -4278,6 +4474,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 +4607,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 +4642,7 @@ void LocallabShadow::updateAdviceTooltips(const bool showTooltips) decays->set_tooltip_text(""); lowthress->set_tooltip_text(""); higthress->set_tooltip_text(""); - + } } @@ -4416,7 +4696,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); @@ -4486,7 +4766,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(); } @@ -4535,7 +4815,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]); } @@ -4573,15 +4853,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 +4923,7 @@ void LocallabShadow::adjusterChanged(Adjuster* a, double newval) } if (a == recothress) { - + if (listener) { listener->panelChanged(Evlocallabrecothress, recothress->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); @@ -4862,7 +5143,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 +5186,7 @@ void LocallabShadow::updateGUIToMode(const modeType new_type) if (enaSHMask->get_active()) { maskusables->show(); maskunusables->hide(); - + } else { maskusables->hide(); maskunusables->show(); @@ -4936,7 +5217,7 @@ void LocallabShadow::updateGUIToMode(const modeType new_type) if (enaSHMask->get_active()) { maskusables->show(); maskunusables->hide(); - + } else { maskusables->hide(); maskunusables->show(); @@ -5058,7 +5339,7 @@ void LocallabShadow::enaSHMaskChanged() maskusables->hide(); maskunusables->show(); } - + if (isLocActivated && exp->getEnabled()) { if (listener) { if (enaSHMask->get_active()) { @@ -5148,12 +5429,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")))), @@ -5185,8 +5467,11 @@ LocallabVibrance::LocallabVibrance(): mask2vibCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK2"))), Lmaskvibshape(static_cast(mask2vibCurveEditorG->addCurve(CT_Diagonal, "L(L)"))) { - set_orientation(Gtk::ORIENTATION_VERTICAL); + auto m = ProcEventMapper::getInstance(); + Evlocallabpreviewvib = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_PREVIEWVIB"); + set_orientation(Gtk::ORIENTATION_VERTICAL); + float R, G, B; const LocallabParams::LocallabSpot defSpot; @@ -5249,6 +5534,11 @@ LocallabVibrance::LocallabVibrance(): angvib->set_tooltip_text(M("TP_LOCALLAB_GRADANG_TOOLTIP")); angvib->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); showmaskvibMethod->append(M("TP_LOCALLAB_SHOWMNONE")); @@ -5300,6 +5590,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 +5602,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); @@ -5364,6 +5656,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(); @@ -5656,7 +6023,7 @@ void LocallabVibrance::adjusterChanged(Adjuster* a, double newval) } if (a == recothresv) { - + if (listener) { listener->panelChanged(Evlocallabrecothresv, recothresv->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); @@ -5879,7 +6246,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); @@ -5973,7 +6340,7 @@ void LocallabVibrance::updateGUIToMode(const modeType new_type) if (enavibMask->get_active()) { maskusablev->show(); maskunusablev->hide(); - + } else { maskusablev->hide(); maskunusablev->show(); @@ -6003,7 +6370,7 @@ void LocallabVibrance::updateGUIToMode(const modeType new_type) if (enavibMask->get_active()) { maskusablev->show(); maskunusablev->hide(); - + } else { maskusablev->hide(); maskunusablev->show(); @@ -6100,7 +6467,7 @@ void LocallabVibrance::enavibMaskChanged() maskusablev->hide(); maskunusablev->show(); } - + if (isLocActivated && exp->getEnabled()) { if (listener) { if (enavibMask->get_active()) { @@ -6142,7 +6509,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 +6554,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 +6968,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 +6979,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 +7028,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 +7200,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 +7334,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 +7344,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 +7375,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 +7454,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 +7566,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 +7641,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 +7677,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 +7877,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 +8051,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 +8195,7 @@ void LocallabBlur::adjusterChanged(Adjuster* a, double newval) showmaskblMethodtyp->set_active(2); } } - + if (listener) { listener->panelChanged(Evlocallabrecothres, recothres->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); @@ -7797,7 +8222,7 @@ void LocallabBlur::adjusterChanged(Adjuster* a, double newval) showmaskblMethodtyp->set_active(2); } } - + if (listener) { listener->panelChanged(Evlocallabrecothresd, recothresd->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); @@ -8187,7 +8612,7 @@ void LocallabBlur::convertParamToNormal() lnoiselow->setValue(defSpot.lnoiselow); nlrad->setValue(defSpot.nlrad); noisegam->setValue(defSpot.noisegam); - + // Enable all listeners enableListener(); } @@ -8243,7 +8668,7 @@ void LocallabBlur::convertParamToSimple() nlrad->setValue(defSpot.nlrad); nlgam->setValue(defSpot.nlgam); noisegam->setValue(defSpot.noisegam); - + // Enable all listeners enableListener(); } @@ -8324,7 +8749,7 @@ void LocallabBlur::updateGUIToMode(const modeType new_type) showmaskblMethodtyp->set_active(2); } } - + if (enablMask->get_active()) { maskusable->show(); maskunusable->hide(); @@ -8332,7 +8757,7 @@ void LocallabBlur::updateGUIToMode(const modeType new_type) maskunusable2->hide(); maskusable3->show(); maskunusable3->hide(); - + } else { maskusable->hide(); maskunusable->show(); @@ -8397,7 +8822,7 @@ void LocallabBlur::updateGUIToMode(const modeType new_type) showmaskblMethodtyp->set_active(2); } } - + if (enablMask->get_active()) { maskusable->show(); maskunusable->hide(); @@ -8413,7 +8838,7 @@ void LocallabBlur::updateGUIToMode(const modeType new_type) maskusable3->show(); maskunusable3->hide(); } - + } } @@ -8537,7 +8962,7 @@ void LocallabBlur::invblChanged() } - + if (isLocActivated && exp->getEnabled()) { if (listener) { if (invbl->get_active()) { @@ -8709,7 +9134,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 f99b3bc41..17f9bd5cb 100644 --- a/rtgui/locallabtools.h +++ b/rtgui/locallabtools.h @@ -55,7 +55,74 @@ 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; // LocallabTool parameters bool needMode; bool isLocActivated; @@ -128,6 +195,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 +260,8 @@ private: MyComboBoxText* const gridMethod; Adjuster* const strengthgrid; Adjuster* const sensi; + Gtk::ToggleButton* const previewcol; + Adjuster* const structcol; Adjuster* const blurcolde; Adjuster* const softradiuscol; @@ -268,18 +340,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 +370,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 +381,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 +394,6 @@ private: void enaColorMaskChanged(); void toolcolChanged(); void fftColorMaskChanged(); - void updateColorGUI1(); void updateColorGUI2(); void updateColorGUI3(); @@ -351,6 +426,8 @@ private: Adjuster* const fatanchor; Adjuster* const gamex; Adjuster* const sensiex; + Gtk::ToggleButton* const previewexe; + Adjuster* const structexp; Adjuster* const blurexpde; MyExpander* const exptoolexp; @@ -398,7 +475,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 +485,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 +498,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 +534,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 +543,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; @@ -498,7 +582,7 @@ private: rtengine::ProcEvent EvlocallabTePivot; - sigc::connection shMethodConn, inversshConn, showmaskSHMethodConn, showmaskSHMethodConninv, enaSHMaskConn; + sigc::connection shMethodConn, previewshConn, inversshConn, showmaskSHMethodConn, showmaskSHMethodConninv, enaSHMaskConn; public: LocallabShadow(); @@ -508,8 +592,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 +607,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 +645,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; @@ -585,7 +677,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 +687,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 +709,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 +752,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 +806,7 @@ private: Adjuster* const lowthres; Adjuster* const higthres; Adjuster* const sensibn; + MyComboBoxText* const blurMethod; Gtk::CheckButton* const invbl; MyComboBoxText* const chroMethod; @@ -769,6 +869,7 @@ private: Adjuster* const nlgam; Adjuster* const bilateral; Adjuster* const sensiden; + Adjuster* const reparden; Gtk::Button* neutral; MyExpander* const expmaskbl; @@ -805,13 +906,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 +974,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 +1000,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 +1010,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; @@ -1004,6 +1111,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; @@ -1070,6 +1178,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; @@ -1118,6 +1227,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; @@ -1193,7 +1304,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(); @@ -1203,8 +1314,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; @@ -1219,6 +1333,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; @@ -1303,6 +1418,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; @@ -1339,8 +1455,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; @@ -1378,6 +1501,8 @@ private: Adjuster* const decayl; Adjuster* const sensilog; + Gtk::ToggleButton* const previewlog; + Gtk::Frame* const gradlogFrame; Adjuster* const strlog; Adjuster* const anglog; @@ -1395,8 +1520,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(); @@ -1404,11 +1529,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; @@ -1448,6 +1579,8 @@ class LocallabMask: { private: Adjuster* const sensimask; + Gtk::ToggleButton* const previewmas; + Adjuster* const blendmask; Adjuster* const blendmaskab; Adjuster* const softradiusmask; @@ -1482,7 +1615,7 @@ private: Adjuster* const str_mask; Adjuster* const ang_mask; - sigc::connection showmask_MethodConn, enamaskConn, toolmaskConn, fftmaskConn; + sigc::connection showmask_MethodConn, previewmasConn, enamaskConn, toolmaskConn, fftmaskConn; public: LocallabMask(); @@ -1492,7 +1625,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; @@ -1535,6 +1673,8 @@ class Locallabcie: { private: Adjuster* const sensicie; + Gtk::ToggleButton* const previewcie; + Adjuster* const reparcie; Gtk::CheckButton* const jabcie; MyComboBoxText* const modecam; @@ -1543,6 +1683,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; @@ -1586,10 +1728,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; @@ -1598,15 +1743,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; @@ -1645,26 +1853,20 @@ 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; + MyExpander* const exprecovcie; Gtk::Label* const maskusablecie; Gtk::Label* const maskunusablecie; @@ -1676,32 +1878,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; @@ -1721,7 +1949,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; @@ -1734,8 +1966,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(); @@ -1744,6 +1989,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 252f95caf..af09224b5 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()) { @@ -834,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))), @@ -849,12 +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 @@ -940,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)); @@ -1005,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); @@ -1019,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); @@ -1038,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()); @@ -1095,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); @@ -1275,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); @@ -1547,7 +1650,7 @@ void LocallabRetinex::adjusterChanged(Adjuster* a, double newval) } if (a == recothresr) { - + if (listener) { listener->panelChanged(Evlocallabrecothresr, recothresr->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); @@ -1757,7 +1860,7 @@ void LocallabRetinex::convertParamToSimple() higthresr->setValue(defSpot.higthresr); decayr->setValue(defSpot.decayr); enableListener(); - + } void LocallabRetinex::updateGUIToMode(const modeType new_type) @@ -1792,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(); @@ -1817,7 +1921,7 @@ void LocallabRetinex::updateMaskBackground(const double normChromar, const doubl return false; } - ); + ); } void LocallabRetinex::loglinChanged() @@ -1882,7 +1986,7 @@ void LocallabRetinex::showmaskretiMethodChanged() locToolListener->resetOtherMaskView(this); } - if(exp->getEnabled()) { + if (exp->getEnabled()) { if (listener) { listener->panelChanged(EvlocallabshowmaskMethod, ""); } @@ -1899,7 +2003,7 @@ void LocallabRetinex::enaretiMaskChanged() maskusabler->hide(); maskunusabler->show(); } - + if (isLocActivated && exp->getEnabled()) { if (listener) { if (enaretiMask->get_active()) { @@ -2011,7 +2115,7 @@ LocallabSharp::LocallabSharp(): showmasksharMethod(Gtk::manage(new MyComboBoxText())) { set_orientation(Gtk::ORIENTATION_VERTICAL); - + // Parameter Sharpening specific widgets sharcontrast->setAdjusterListener(this); @@ -2103,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 @@ -2357,7 +2488,7 @@ void LocallabSharp::showmasksharMethodChanged() locToolListener->resetOtherMaskView(this); } - if(exp->getEnabled()) { + if (exp->getEnabled()) { if (listener) { listener->panelChanged(EvlocallabshowmaskMethod, ""); } @@ -2391,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.))), @@ -2429,7 +2561,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))), @@ -2441,7 +2573,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.))), @@ -2468,8 +2600,11 @@ 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"); + set_orientation(Gtk::ORIENTATION_VERTICAL); + const LocallabParams::LocallabSpot defSpot; // Parameter Local contrast specific widgets @@ -2653,7 +2788,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)); @@ -2714,6 +2849,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")); @@ -2758,6 +2898,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); @@ -2768,7 +2909,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); @@ -2858,7 +2999,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"))); @@ -2906,7 +3047,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); @@ -2951,6 +3092,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) { @@ -2998,7 +3195,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")); @@ -3784,7 +3981,7 @@ void LocallabContrast::adjusterChanged(Adjuster* a, double newval) //} if (a == recothresw) { - + if (listener) { listener->panelChanged(Evlocallabrecothresw, recothresw->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); @@ -4042,7 +4239,7 @@ void LocallabContrast::convertParamToSimple() lowthresw->setValue(defSpot.lowthresw); higthresw->setValue(defSpot.higthresw); decayw->setValue(defSpot.decayw); - + enableListener(); // Update GUI based on converted widget parameters: @@ -4080,14 +4277,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; @@ -4110,15 +4309,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(); } - + } } @@ -4136,7 +4336,7 @@ void LocallabContrast::updateMaskBackground(const double normChromar, const doub return false; } - ); + ); } void LocallabContrast::localcontMethodChanged() @@ -4335,7 +4535,7 @@ void LocallabContrast::showmasklcMethodChanged() locToolListener->resetOtherMaskView(this); } - if(exp->getEnabled()) { + if (exp->getEnabled()) { if (listener) { listener->panelChanged(EvlocallabshowmaskMethod, ""); } @@ -4352,7 +4552,7 @@ void LocallabContrast::enalcMaskChanged() maskusablew->hide(); maskunusablew->show(); } - + if (isLocActivated && exp->getEnabled()) { if (listener) { if (enalcMask->get_active()) { @@ -4384,6 +4584,7 @@ void LocallabContrast::updateContrastGUI1() expcontrastpyr->hide(); expcontrastpyr2->hide(); gamlc->hide(); + if (mode == Expert) { // Keep widget hidden in Normal and Simple mode fftwlc->show(); } @@ -4438,7 +4639,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) { @@ -4454,44 +4655,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 @@ -4522,7 +4723,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)); @@ -4609,7 +4810,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); @@ -4652,6 +4853,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) { @@ -4928,7 +5155,7 @@ void LocallabCBDL::adjusterChanged(Adjuster* a, double newval) } if (a == recothrescb) { - + if (listener) { listener->panelChanged(Evlocallabrecothrescb, recothrescb->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); @@ -5114,10 +5341,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(); @@ -5132,10 +5360,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(); @@ -5157,7 +5386,7 @@ void LocallabCBDL::updateMaskBackground(const double normChromar, const double n return false; } - ); + ); } void LocallabCBDL::showmaskcbMethodChanged() @@ -5167,7 +5396,7 @@ void LocallabCBDL::showmaskcbMethodChanged() locToolListener->resetOtherMaskView(this); } - if(exp->getEnabled()) { + if (exp->getEnabled()) { if (listener) { listener->panelChanged(EvlocallabshowmaskMethod, ""); } @@ -5183,7 +5412,7 @@ void LocallabCBDL::enacbMaskChanged() maskusablecb->hide(); maskunusablecb->show(); } - + if (isLocActivated && exp->getEnabled()) { if (listener) { if (enacbMask->get_active()) { @@ -5234,24 +5463,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.))), @@ -5264,9 +5500,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")))), @@ -5276,13 +5512,14 @@ 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.))), 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))), @@ -5292,11 +5529,19 @@ 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"); + 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; @@ -5307,9 +5552,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)); @@ -5367,34 +5619,40 @@ 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) ); + + 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")); @@ -5438,14 +5696,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"))); @@ -5454,7 +5724,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); @@ -5474,16 +5744,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); @@ -5491,9 +5761,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); @@ -5508,12 +5778,12 @@ 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); @@ -5527,7 +5797,7 @@ LocallabLog::~LocallabLog() delete maskCurveEditorL; delete mask2CurveEditorL; //delete CurveEditorL; - + } void LocallabLog::setDefaultExpanderVisibility() @@ -5538,6 +5808,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) { @@ -5550,11 +5868,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")); @@ -5566,8 +5888,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")); @@ -5634,6 +5956,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(""); } } @@ -5645,9 +5970,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); } @@ -5659,9 +5985,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); } @@ -5685,6 +6012,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) { @@ -5706,34 +6043,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); @@ -5764,7 +6110,7 @@ void LocallabLog::read(const rtengine::procparams::ProcParams* pp, const ParamsE chromaskL->setValue(spot.chromaskL); LmaskshapeL->setCurve(spot.LmaskcurveL); - + } // Enable all listeners @@ -5795,8 +6141,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(); @@ -5837,6 +6188,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) { @@ -5848,7 +6201,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 @@ -5864,7 +6217,7 @@ void LocallabLog::enaLMaskChanged() maskusablel->hide(); maskunusablel->show(); } - + if (isLocActivated && exp->getEnabled()) { if (listener) { if (enaLMask->get_active()) { @@ -5887,12 +6240,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(); @@ -5908,6 +6261,7 @@ void LocallabLog::updateGUIToMode(const modeType new_type) maskusablel->hide(); maskunusablel->hide(); decayl->hide(); + break; case Normal: @@ -5924,22 +6278,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(); @@ -5965,14 +6320,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(); @@ -5998,6 +6355,7 @@ void LocallabLog::convertParamToSimple() strlog->setValue(defSpot.strlog); anglog->setValue(defSpot.anglog); enaLMask->set_active(false); + showmaskLMethod->set_active(0); recothresl->setValue(defSpot.recothresl); lowthresl->setValue(defSpot.lowthresl); higthresl->setValue(defSpot.higthresl); @@ -6036,7 +6394,7 @@ void LocallabLog::showmaskLMethodChanged() locToolListener->resetOtherMaskView(this); } - if(exp->getEnabled()) { + if (exp->getEnabled()) { if (listener) { listener->panelChanged(EvlocallabshowmaskMethod, ""); } @@ -6096,6 +6454,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); @@ -6152,6 +6514,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, @@ -6259,7 +6649,7 @@ void LocallabLog::adjusterChanged(Adjuster* a, double newval) } if (a == recothresl) { - + if (listener) { listener->panelChanged(Evlocallabrecothresl, recothresl->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); @@ -6308,7 +6698,7 @@ void LocallabLog::adjusterChanged(Adjuster* a, double newval) anglog->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); } } - + if (a == blendmaskL) { if (listener) { listener->panelChanged(EvLocallabblendmaskL, @@ -6330,7 +6720,7 @@ void LocallabLog::adjusterChanged(Adjuster* a, double newval) } } - + } } @@ -6352,9 +6742,9 @@ void LocallabLog::updateAutocompute(const float blackev, const float whiteev, co enableListener(); - return false; + return false; } - ); + ); } } @@ -6420,7 +6810,7 @@ void LocallabLog::ciecamChanged() targabs->set_sensitive(true); catad->set_sensitive(true); surrHBox->set_sensitive(true); - + sourceabs->show(); targabs->show(); catad->show(); @@ -6439,7 +6829,7 @@ void LocallabLog::ciecamChanged() catad->hide(); surrHBox->hide(); } -*/ + */ if (isLocActivated && exp->getEnabled()) { if (listener) { if (ciecam->get_active()) { @@ -6453,6 +6843,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() { @@ -6483,7 +6888,7 @@ void LocallabLog::updateMaskBackground(const double normChromar, const double no return false; } - ); + ); } @@ -6532,11 +6937,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 { @@ -6546,16 +6954,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(); + } + } @@ -6565,6 +6977,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.))), @@ -6600,9 +7013,12 @@ LocallabMask::LocallabMask(): str_mask(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTR"), -2., 2., 0.05, 0.))), ang_mask(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADANG"), -180., 180., 0.1, 0.))) { + + auto m = ProcEventMapper::getInstance(); + Evlocallabpreviewmas = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_PREVIEWMAS"); set_orientation(Gtk::ORIENTATION_VERTICAL); - + const LocallabParams::LocallabSpot defSpot; // Parameter Mask common specific widgets @@ -6616,6 +7032,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")); @@ -6707,6 +7128,7 @@ LocallabMask::LocallabMask(): // Add Common mask specific widgets to GUI pack_start(*sensimask); + pack_start(*previewmas); pack_start(*blendmask); pack_start(*blendmaskab); pack_start(*softradiusmask); @@ -6769,6 +7191,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) { @@ -7239,6 +7719,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 @@ -7298,7 +7779,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) @@ -7316,7 +7797,7 @@ void LocallabMask::updateMaskBackground(const double normChromar, const double n return false; } - ); + ); } void LocallabMask::showmask_MethodChanged() @@ -7326,7 +7807,7 @@ void LocallabMask::showmask_MethodChanged() locToolListener->resetOtherMaskView(this); } - if(exp->getEnabled()) { + if (exp->getEnabled()) { if (listener) { listener->panelChanged(EvlocallabshowmaskMethod, ""); } @@ -7399,18 +7880,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")))), @@ -7426,7 +7910,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")))), @@ -7447,30 +7931,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.))), @@ -7503,27 +8054,20 @@ 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.))), + 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")))), @@ -7534,24 +8078,98 @@ 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"); + set_orientation(Gtk::ORIENTATION_VERTICAL); + // Parameter Ciecam specific widgets const LocallabParams::LocallabSpot defSpot; reparcie->setAdjusterListener(this); @@ -7559,90 +8177,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); @@ -7653,13 +8479,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; @@ -7676,61 +8506,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(); @@ -7739,19 +8561,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); @@ -7760,6 +8580,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); @@ -7769,7 +8590,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()); @@ -7780,22 +8601,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); @@ -7829,7 +8640,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); @@ -7838,17 +8649,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)); @@ -7874,40 +8694,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(); @@ -7922,12 +8741,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); @@ -7942,23 +8763,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); @@ -7966,8 +8788,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)); @@ -7981,17 +8808,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); @@ -8001,13 +8840,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()); @@ -8018,67 +8863,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")); @@ -8087,8 +8914,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.); @@ -8105,12 +8933,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); @@ -8121,6 +8972,24 @@ 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); + ToolParamBlock* const cieBoxgrad = Gtk::manage(new ToolParamBlock()); + cieBoxgrad->pack_start(*strgradcie); + cieBoxgrad->pack_start(*anggradcie); + 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); @@ -8134,20 +9003,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; @@ -8156,9 +9059,10 @@ Locallabcie::~Locallabcie() delete cieCurveEditorG; delete cieCurveEditorG2; delete maskcieCurveEditorG; + delete maskcieHCurveEditorG; delete mask2cieCurveEditorG; delete LocalcurveEditorwavjz; - + delete mask2cieCurveEditorGwav; } bool Locallabcie::isMaskViewActive() @@ -8177,7 +9081,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() @@ -8185,19 +9145,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")); @@ -8219,7 +9188,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")); @@ -8234,7 +9203,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")); @@ -8245,16 +9215,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(""); @@ -8283,7 +9278,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(""); @@ -8294,6 +9290,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(""); @@ -8302,6 +9299,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(""); } } @@ -8313,20 +9336,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() @@ -8337,20 +9378,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() @@ -8362,7 +9421,7 @@ void Locallabcie::showmaskcieMethodChanged() locToolListener->resetOtherMaskView(this); } - if(exp->getEnabled()) { + if (exp->getEnabled()) { if (listener) { listener->panelChanged(EvlocallabshowmaskMethod, ""); } @@ -8381,7 +9440,7 @@ void Locallabcie::enacieMaskChanged() maskusablecie->hide(); maskunusablecie->show(); } - + if (isLocActivated && exp->getEnabled()) { if (listener) { if (enacieMask->get_active()) { @@ -8395,12 +9454,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); @@ -8408,28 +9572,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); } @@ -8447,53 +9608,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); @@ -8517,8 +9801,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); @@ -8540,27 +9826,58 @@ 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); + enacieMask->set_active(spot.enacieMask); + enacieMaskall->set_active(spot.enacieMaskall); CCmaskcieshape->setCurve(spot.CCmaskciecurve); LLmaskcieshape->setCurve(spot.LLmaskciecurve); HHmaskcieshape->setCurve(spot.HHmaskciecurve); @@ -8570,14 +9887,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())); @@ -8587,13 +9916,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(); @@ -8602,10 +9932,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) { @@ -8634,6 +9960,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(); @@ -8641,19 +9987,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) { @@ -8662,9 +10103,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(); @@ -8687,7 +10127,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(); @@ -8710,27 +10152,35 @@ 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.enacieMask = enacieMask->get_active(); + spot.enacieMaskall = enacieMaskall->get_active(); spot.LLmaskciecurve = LLmaskcieshape->getCurve(); spot.CCmaskciecurve = CCmaskcieshape->getCurve(); spot.HHmaskciecurve = HHmaskcieshape->getCurve(); @@ -8740,11 +10190,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(); } } @@ -8789,15 +10249,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( @@ -8818,12 +10364,10 @@ void Locallabcie::updateAutocompute(const float blackev, const float whiteev, co return false; } - ); + ); } } - - void Locallabcie::AutograycieChanged() { @@ -8834,6 +10378,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); @@ -8841,9 +10390,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()) { @@ -8906,7 +10456,7 @@ void Locallabcie::qtojChanged() } void Locallabcie::jabcieChanged() -{ +{ if (isLocActivated && exp->getEnabled()) { if (listener) { if (jabcie->get_active()) { @@ -8920,36 +10470,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()) { @@ -8963,6 +10602,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()) { @@ -8995,6 +10718,9 @@ void Locallabcie::sigjzChanged() void Locallabcie::sigqChanged() { + contsigqcie->hide(); + lightsigqcie->hide(); + if (isLocActivated && exp->getEnabled()) { if (listener) { if (sigq->get_active()) { @@ -9015,6 +10741,7 @@ void Locallabcie::chjzcieChanged() } else { thrhjzcie->set_sensitive(false); } + if (isLocActivated && exp->getEnabled()) { if (listener) { if (chjzcie->get_active()) { @@ -9031,8 +10758,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(); @@ -9045,82 +10775,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(); @@ -9132,33 +10854,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(); @@ -9171,41 +10914,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()) { @@ -9221,31 +10971,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) { @@ -9259,6 +11017,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, @@ -9267,6 +11041,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()) { @@ -9277,8 +11183,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(); @@ -9297,102 +11232,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(); @@ -9402,69 +11380,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: @@ -9488,34 +11487,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(); @@ -9528,12 +11586,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(); @@ -9542,19 +11610,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(); @@ -9567,87 +11658,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(); @@ -9661,81 +11845,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(); - } - } @@ -9746,9 +11869,29 @@ 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); + 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(); } @@ -9760,11 +11903,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); @@ -9776,6 +11925,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); @@ -9786,19 +11936,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) @@ -9814,8 +11990,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); @@ -9824,9 +12000,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); @@ -9847,58 +12025,101 @@ 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); 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); @@ -9922,7 +12143,7 @@ void Locallabcie::curveChanged(CurveEditor* ce) listener->panelChanged(Evlocallabshapecie2, spName); } } - + if (ce == CCmaskcieshape) { if (listener) { listener->panelChanged(EvlocallabCCmaskcieshape, @@ -9944,6 +12165,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, @@ -9958,6 +12186,12 @@ void Locallabcie::curveChanged(CurveEditor* ce) } } + if (ce == LLmaskcieshapewav) { + if (listener) { + listener->panelChanged(EvlocallabLLmaskcieshapewav, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } } } @@ -9971,6 +12205,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()) + ")"); + } + } + } @@ -9980,6 +12222,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, @@ -10006,10 +12249,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); } } @@ -10104,11 +12347,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); } } @@ -10119,6 +12369,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, @@ -10136,14 +12393,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); } } @@ -10164,7 +12421,7 @@ void Locallabcie::adjusterChanged(Adjuster* a, double newval) if (a == shjzcie) { if (listener) { listener->panelChanged(Evlocallabshjzcie, - shjzcie->getTextValue()+ spName ); + shjzcie->getTextValue() + spName); } } @@ -10259,10 +12516,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); } } @@ -10273,6 +12537,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, @@ -10287,70 +12702,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, @@ -10378,7 +12743,21 @@ 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 == blendmaskcie) { if (listener) { listener->panelChanged(Evlocallabblendmaskcie, @@ -10421,8 +12800,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()) + ")"); @@ -10450,12 +12843,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 2c5f1cfc2..7dceb9d13 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; @@ -436,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(); @@ -467,6 +470,8 @@ void Options::setDefaults() histogramTraceBrightness = 1; curvebboxpos = 1; complexity = 2; + spotmet = 0; + inspectorWindow = false; zoomOnScroll = true; prevdemo = PD_Sidecar; @@ -575,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" @@ -631,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; @@ -692,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 @@ -856,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)) { @@ -877,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")) { @@ -1348,6 +1355,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")) { @@ -1555,10 +1587,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"); } @@ -1724,6 +1752,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"); } @@ -1971,6 +2003,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"); + } + } @@ -2456,8 +2492,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); @@ -2552,7 +2600,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); @@ -2593,6 +2640,7 @@ 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)); @@ -2655,6 +2703,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 72d2b2462..b2221e844 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,7 +305,7 @@ public: Glib::ustring editor_custom_out_dir; bool editor_float32; bool editor_bypass_output_profile; - + int maxThumbnailHeight; int maxThumbnailWidth; std::size_t maxCacheEntries; @@ -315,6 +314,10 @@ public: 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 +330,8 @@ public: bool internalThumbIfUntouched; bool overwriteOutputFile; int complexity; + int spotmet; + bool inspectorWindow; // open inspector in separate window bool zoomOnScroll; // translate scroll events to zoom @@ -489,6 +494,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 ca705682b..66ea3f9aa 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; @@ -1278,7 +1287,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]; } @@ -1653,10 +1662,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; @@ -1710,6 +1724,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; @@ -1718,8 +1733,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; @@ -1728,6 +1752,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; @@ -1752,8 +1777,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; @@ -1769,31 +1796,65 @@ 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).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; @@ -1811,6 +1872,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; } @@ -1890,12 +1960,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; @@ -1904,13 +1979,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; @@ -4155,7 +4234,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]; } @@ -5606,6 +5685,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; } @@ -5622,6 +5705,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; } @@ -5816,6 +5915,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; } @@ -5848,14 +5951,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; } @@ -5888,6 +6027,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; } @@ -5980,6 +6123,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; } @@ -5988,6 +6135,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; } @@ -6048,10 +6199,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; } @@ -6069,42 +6364,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; } @@ -6149,10 +6415,22 @@ 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).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; } @@ -6165,6 +6443,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; } @@ -6209,6 +6491,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) { @@ -6461,6 +6779,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; } @@ -6485,6 +6811,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; } @@ -6493,6 +6831,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; } @@ -6529,6 +6871,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; } @@ -6545,6 +6895,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; } @@ -7685,7 +8039,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), @@ -8054,8 +8408,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), @@ -8108,6 +8467,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : visicie(v), complexcie(v), expcie(v), + expprecam(v), reparcie(v), sensicie(v), Autograycie(v), @@ -8115,8 +8475,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), @@ -8125,6 +8494,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : sourceabscie(v), sursourcie(v), modecam(v), + bwevMethod(v), modecie(v), saturlcie(v), rstprotectcie(v), @@ -8149,8 +8519,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), @@ -8166,31 +8538,62 @@ 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), enacieMask(v), + enacieMaskall(v), CCmaskciecurve(v), LLmaskciecurve(v), HHmaskciecurve(v), + HHhmaskciecurve(v), blendmaskcie(v), radmaskcie(v), sigmalcjz(v), @@ -8207,8 +8610,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) + { } @@ -8380,7 +8792,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; } @@ -8755,8 +9167,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; @@ -8809,6 +9226,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) visicie= v; complexcie= v; expcie = v; + expprecam = v; reparcie = v; sensicie = v; Autograycie = v; @@ -8816,8 +9234,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; @@ -8826,6 +9253,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) sourceabscie = v; sursourcie = v; modecam = v; + bwevMethod = v; modecie = v; saturlcie = v; rstprotectcie = v; @@ -8850,8 +9278,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; @@ -8867,31 +9297,62 @@ 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; + strgradcie = v; enacieMask = v; + enacieMaskall = v; CCmaskciecurve = v; LLmaskciecurve = v; HHmaskciecurve = v; + HHhmaskciecurve = v; blendmaskcie = v; radmaskcie = v; sigmalcjz = v; @@ -8909,6 +9370,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 260779a7f..27f9ac9cc 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; @@ -577,7 +577,7 @@ public: bool expshadhigh; bool complexshadhigh; bool shMethod; - bool multsh[6]; + bool multsh[7]; bool highlights; bool h_tonalwidth; bool shadows; @@ -946,8 +946,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; @@ -1000,6 +1005,7 @@ public: bool visicie; bool complexcie; bool expcie; + bool expprecam; bool reparcie; bool sensicie; bool Autograycie; @@ -1007,8 +1013,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; @@ -1017,6 +1032,7 @@ public: bool sourceabscie; bool sursourcie; bool modecam; + bool bwevMethod; bool modecie; bool saturlcie; bool rstprotectcie; @@ -1041,8 +1057,10 @@ public: bool lightlcie; bool lightjzcie; bool lightqcie; + bool lightsigqcie; bool contlcie; bool contjzcie; + bool detailciejz; bool adapjzcie; bool jz100; bool pqremap; @@ -1058,31 +1076,64 @@ 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 enacieMask; + bool enacieMaskall; bool CCmaskciecurve; bool LLmaskciecurve; bool HHmaskciecurve; + bool HHhmaskciecurve; bool blendmaskcie; bool radmaskcie; bool sigmalcjz; @@ -1100,7 +1151,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); @@ -1242,16 +1302,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; @@ -1261,6 +1328,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/preferences.cc b/rtgui/preferences.cc index 0f92ccb16..37ef5ea98 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; } } @@ -904,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"))); @@ -1023,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()); @@ -1039,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); @@ -1111,6 +1119,9 @@ Gtk::Widget* Preferences::getGeneralPanel() workflowGrid->attach_next_to(*curveBBoxPosL, *flayoutlab, Gtk::POS_BOTTOM, 1, 1); workflowGrid->attach_next_to(*curveBBoxPosC, *editorLayout, Gtk::POS_BOTTOM, 1, 1); workflowGrid->attach_next_to(*curveBBoxPosRestartL, *lNextStart, Gtk::POS_BOTTOM, 1, 1); + + 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); @@ -1123,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); @@ -1227,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"))); @@ -1265,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)); @@ -1283,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); @@ -1380,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); @@ -1397,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) ); @@ -1474,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()); @@ -1484,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); @@ -1530,10 +1578,10 @@ Gtk::Widget* Preferences::getFileBrowserPanel() delExt->set_tooltip_text(M("PREFERENCES_PARSEDEXTDELHINT")); moveExtUp->set_tooltip_text(M("PREFERENCES_PARSEDEXTUPHINT")); moveExtDown->set_tooltip_text(M("PREFERENCES_PARSEDEXTDOWNHINT")); - Gtk::Image* addExtImg = Gtk::manage ( new RTImage ("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); @@ -1736,7 +1784,7 @@ void Preferences::parseThemeDir(Glib::ustring dirname) return; } - // process directory + // Process directory Glib::Dir* dir = nullptr; try { @@ -1746,40 +1794,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; @@ -1818,7 +1843,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(); @@ -1846,8 +1871,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 = @@ -1965,6 +1988,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; @@ -1993,6 +2021,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; @@ -2033,6 +2063,8 @@ void Preferences::storePreferences() 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() @@ -2122,19 +2154,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); @@ -2198,6 +2228,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); @@ -2212,6 +2247,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); @@ -2290,6 +2326,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); } /* @@ -2352,15 +2390,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 { @@ -2392,8 +2429,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); } @@ -2558,33 +2594,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"); } } diff --git a/rtgui/preferences.h b/rtgui/preferences.h index e84662525..6ec528e73 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; @@ -289,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); @@ -326,7 +322,7 @@ public: void sndEnableToggled (); void langAutoDetectToggled (); void autocielabToggled (); - void observer10Toggled (); + void observer10Toggled (); void selectStartupDir (); void addExtPressed (); 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..7ee4d3da1 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; } @@ -306,7 +350,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 +485,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 +494,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 +595,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 +603,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(); @@ -1045,6 +1074,7 @@ void Thumbnail::saveThumbnail () */ void Thumbnail::updateCache (bool updatePParams, bool updateCacheImageData) { + updateProcParamsProperties(); if (updatePParams && pparamsValid) { pparams->save ( @@ -1061,6 +1091,8 @@ void Thumbnail::updateCache (bool updatePParams, bool updateCacheImageData) if (updatePParams && pparamsValid) { saveMetadata(); } + + saveXMPSidecarProperties(); } Thumbnail::~Thumbnail () @@ -1084,48 +1116,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 +1257,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..1b59b8b24 100644 --- a/rtgui/toolbar.cc +++ b/rtgui/toolbar.cc @@ -27,9 +27,9 @@ 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)); + handimg.reset(new RTImage("hand-open-hicontrast", 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 +40,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 +48,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 +60,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 +69,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 +78,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..efad8f0a6 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("hand-open", 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/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 89b10c5af..bd0dcf3e1 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 @@ -252,12 +252,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" @@ -399,12 +395,12 @@ 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" @@ -414,7 +410,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" @@ -424,7 +420,7 @@ 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" @@ -455,13 +451,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 --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:" @@ -469,7 +465,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" diff --git a/tools/win/InnoSetup/WindowsInnoSetup.iss.in b/tools/win/InnoSetup/WindowsInnoSetup.iss.in index 954d39991..f95657bd7 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 @@ -119,7 +120,7 @@ Source: "{#MyBuildBasePath}\*.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "{#MyBuildBasePath}\gspawn-win{#MyBitDepth}-helper.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "{#MyBuildBasePath}\gspawn-win{#MyBitDepth}-helper-console.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "{#MyBuildBasePath}\gdb.exe"; DestDir: "{app}"; Flags: 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]