Merge with 'Beep6581/dev'

This commit is contained in:
Pandagrapher 2023-08-12 18:03:41 +02:00
commit d0743ef359
132 changed files with 8909 additions and 3413 deletions

View File

@ -98,6 +98,10 @@ jobs:
run: |
echo "Listing shared library dependencies."
ldd "./build/${{matrix.build_type}}/rawtherapee.exe"
echo "Finding DLLs to include."
DLLS=($(ldd "./build/${{matrix.build_type}}/rawtherapee.exe" | grep '/mingw64/bin/' | awk '{print($1)'}))
echo "Required DLLs are: ${DLLS[*]}"
echo "Getting workspace path."
export BUILD_DIR="$(pwd)/build/${{matrix.build_type}}"
echo "Build directory is '$BUILD_DIR'."
@ -110,68 +114,7 @@ jobs:
"gdbus.exe" \
"gspawn-win64-helper.exe" \
"gspawn-win64-helper-console.exe" \
"libatk-1.0-0.dll" \
"libatkmm-1.6-1.dll" \
"libbrotlicommon.dll" \
"libbrotlidec.dll" \
"libbz2-1.dll" \
"libcairo-2.dll" \
"libcairo-gobject-2.dll" \
"libcairomm-1.0-1.dll" \
"libdatrie-1.dll" \
"libdeflate.dll" \
"libepoxy-0.dll" \
"libexpat-1.dll" \
libffi-*.dll \
"libfftw3f-3.dll" \
"libfftw3f_omp-3.dll" \
"libfontconfig-1.dll" \
"libfreetype-6.dll" \
"libfribidi-0.dll" \
"libgcc_s_seh-1.dll" \
"libgdk_pixbuf-2.0-0.dll" \
"libgdk-3-0.dll" \
"libgdkmm-3.0-1.dll" \
"libgio-2.0-0.dll" \
"libgiomm-2.4-1.dll" \
"libglib-2.0-0.dll" \
"libglibmm-2.4-1.dll" \
"libgmodule-2.0-0.dll" \
"libgobject-2.0-0.dll" \
"libgomp-1.dll" \
"libgraphite2.dll" \
"libgtk-3-0.dll" \
"libgtkmm-3.0-1.dll" \
"libharfbuzz-0.dll" \
"libiconv-2.dll" \
"libintl-8.dll" \
"libjbig-0.dll" \
"libjpeg-8.dll" \
"liblcms2-2.dll" \
"liblensfun.dll" \
"libLerc.dll" \
"liblzma-5.dll" \
"libpango-1.0-0.dll" \
"libpangocairo-1.0-0.dll" \
"libpangoft2-1.0-0.dll" \
"libpangomm-1.4-1.dll" \
"libpangowin32-1.0-0.dll" \
"libpcre2-8-0.dll" \
"libpixman-1-0.dll" \
"libpng16-16.dll" \
"librsvg-2-2.dll" \
"libsharpyuv-0.dll" \
"libsigc-2.0-0.dll" \
"libstdc++-6.dll" \
"libsystre-0.dll" \
"libthai-0.dll" \
"libtiff-6.dll" \
"libtre-5.dll" \
"libwebp-7.dll" \
"libwinpthread-1.dll" \
"libxml2-2.dll" \
"libzstd.dll" \
"zlib1.dll" \
${DLLS[*]} \
"$BUILD_DIR"
cd -

3
.gitignore vendored
View File

@ -6,6 +6,8 @@
.settings
.directory
.vscode
.DS_Store
.idea
CMakeCache.txt
CMakeFiles
@ -43,4 +45,3 @@ clean
*.tar
*.xz
*.zip

View File

@ -1,4 +1,6 @@
#01 2009-10-10 JMG
#001 2009-10-10 JMG
#100
#101 @LANGUAGE_DISPLAY_NAME=Català
ABOUT_TAB_BUILD;Versió
ABOUT_TAB_CREDITS;Crèdits

View File

@ -1,12 +1,14 @@
#00 Chinese (Simplified)
#01 2008-02-13 Forrest Sun
#02 2008-11-06 Yang Gao (grantyale)
#03 2013-10-20 Jiero
#04 2014-10-24 Jie Luo
#05 2017-09-18 Chongnuo Ji
#06 2020-08-11 十一元人民币
#07 2021-09-24 十一元人民币
#08 2022-07-26 十一元人民币
#000 Chinese (Simplified)
#001 2008-02-13 Forrest Sun
#002 2008-11-06 Yang Gao (grantyale)
#003 2013-10-20 Jiero
#004 2014-10-24 Jie Luo
#005 2017-09-18 Chongnuo Ji
#006 2020-08-11 十一元人民币
#007 2021-09-24 十一元人民币
#008 2022-07-26 十一元人民币
#100
#101 @LANGUAGE_DISPLAY_NAME=简体中文
ABOUT_TAB_BUILD;版本
ABOUT_TAB_CREDITS;致谢名单

View File

@ -1,51 +1,53 @@
#00 Czech
#01 2008-01-20 translated by absolution
#02 2008-02-21 updated by mkyral (typos and some missing strings)
#03 2008-04-24 updated by mkyral (for version 2.4m1)
#04 2008-10-28 updated by mkyral (for version 2.4 beta1)
#05 2010-11-25 updated by mkyral (for version 3.0)
#06 2011-03-06 updated by mkyral (default branch)
#07 2011-03-20 updated by mkyral (default branch)
#08 2011-05-01 updated by mkyral
#09 2011-05-18 updated by mkyral
#10 2011-06-04 updated by mkyral
#11 2011-06-12 updated by mkyral
#12 2011-06-16 updated by mkyral
#13 2011-07-03 updated by mkyral
#14 2011-07-08 updated by mkyral
#15 2011-09-04 updated by mkyral
#16 2011-09-06 updated by mkyral
#17 2011-11-12 updated by mkyral
#18 2011-12-29 updated by mkyral
#19 2012-02-22 updated by mkyral
#20 2012-04-28 updated by mkyral
#21 2012-10-10 updated by mkyral
#22 2012-11-27 updated by mkyral
#23 2013-03-12 updated by mkyral
#24 2013-04-12 updated by mkyral
#25 2013-09-12 updated by mkyral
#26 2013-09-17 updated by mkyral
#27 2013-12-09 updated by mkyral
#28 2014-01-07 updated by mkyral
#29 2014-04-08 updated by mkyral
#30 2014-04-30 updated by mkyral
#31 2014-05-12 updated by mkyral
#32 2014-10-24 updated by mkyral
#33 2015-02-22 updated by mkyral
#34 2015-07-09 updated by mkyral
#35 2015-11-24 updated by mkyral
#36 2016-10-18 updated by mkyral
#37 2017-01-10 updated by mkyral
#38 2017-04-26 updated by mkyral
#39 2017-07-21 updated by mkyral
#40 2017-12-13 updated by mkyral
#41 2018-03-03 updated by mkyral
#42 2018-10-24 updated by mkyral
#43 2018-12-04 updated by mkyral
#44 2018-12-13 updated by mkyral
#45 2020-04-20 updated by mkyral
#46 2020-04-21 updated by mkyral
#47 2020-06-02 updated by mkyral
#000 Czech
#001 2008-01-20 translated by absolution
#002 2008-02-21 updated by mkyral (typos and some missing strings)
#003 2008-04-24 updated by mkyral (for version 2.4m1)
#004 2008-10-28 updated by mkyral (for version 2.4 beta1)
#005 2010-11-25 updated by mkyral (for version 3.0)
#006 2011-03-06 updated by mkyral (default branch)
#007 2011-03-20 updated by mkyral (default branch)
#008 2011-05-01 updated by mkyral
#009 2011-05-18 updated by mkyral
#010 2011-06-04 updated by mkyral
#011 2011-06-12 updated by mkyral
#012 2011-06-16 updated by mkyral
#013 2011-07-03 updated by mkyral
#014 2011-07-08 updated by mkyral
#015 2011-09-04 updated by mkyral
#016 2011-09-06 updated by mkyral
#017 2011-11-12 updated by mkyral
#018 2011-12-29 updated by mkyral
#019 2012-02-22 updated by mkyral
#020 2012-04-28 updated by mkyral
#021 2012-10-10 updated by mkyral
#022 2012-11-27 updated by mkyral
#023 2013-03-12 updated by mkyral
#024 2013-04-12 updated by mkyral
#025 2013-09-12 updated by mkyral
#026 2013-09-17 updated by mkyral
#027 2013-12-09 updated by mkyral
#028 2014-01-07 updated by mkyral
#029 2014-04-08 updated by mkyral
#030 2014-04-30 updated by mkyral
#031 2014-05-12 updated by mkyral
#032 2014-10-24 updated by mkyral
#033 2015-02-22 updated by mkyral
#034 2015-07-09 updated by mkyral
#035 2015-11-24 updated by mkyral
#036 2016-10-18 updated by mkyral
#037 2017-01-10 updated by mkyral
#038 2017-04-26 updated by mkyral
#039 2017-07-21 updated by mkyral
#040 2017-12-13 updated by mkyral
#041 2018-03-03 updated by mkyral
#042 2018-10-24 updated by mkyral
#043 2018-12-04 updated by mkyral
#044 2018-12-13 updated by mkyral
#045 2020-04-20 updated by mkyral
#046 2020-04-21 updated by mkyral
#047 2020-06-02 updated by mkyral
#100
#101 @LANGUAGE_DISPLAY_NAME=Čeština
ABOUT_TAB_BUILD;Verze
ABOUT_TAB_CREDITS;Zásluhy

View File

@ -1,4 +1,6 @@
#01 2022-04-21 mogensjaeger (github), initial danish translation
#001 2022-04-21 mogensjaeger (github), initial danish translation
#100
#101 @LANGUAGE_DISPLAY_NAME=Dansk
ABOUT_TAB_BUILD;Version
ABOUT_TAB_CREDITS;Credits

View File

@ -1,90 +1,92 @@
#01 keenonkites; Aktualisierte Version für 2.3 beta2
#02 phberlin; basiert auf keenonkites' Erstübersetzung
#03 2007-12-20
#04 2007-12-22
#05 2008-01-08
#06 2008-01-15
#07 2008-02-20
#08 2008-12-19 keenonkites, Anpassungen für 2.4beta4
#09 2008-09-20 keenonkites, Anpassungen für 2.4m2
#10 2008-04-04 Anpassungen für 2.4
#11 Leichte Anpassungen (keenonkites/klonk)
#12 Erweiterung (oduis)
#13 Erweiterung (oduis)
#14 Erweiterung (oduis)
#15 Erweiterung (oduis)
#16 2012-12-05 3.0 alpha: Erweiterung und Korrekturen (Metex)
#17 2012-04-29 Erweiterungen und Korrekturen (MaWe)
#18 Erweiterung (oduis)
#19 Erweiterung (oduis)
#20 2013-02-27 Erweiterung (cytrinox)
#21 2013-12-31 Erweiterung (Ingo)
#22 2015-09-04 komplette Überarbeitung (TooWaBoo)
#23 2015-10-24 Retinexübersetzung und Korrekturen (TooWaBoo)
#24 2015-11-01 Korrekturen (TooWaBoo) RT4.2.450
#25 2015-11-30 Korrekturen (TooWaBoo) RT4.2.507
#26 2015-12-13 Korrekturen (TooWaBoo) RT4.2.514
#26 2015-12-22 Korrekturen (TooWaBoo) RT4.2.536
#27 2016-02-12 Retinexübersetzung (TooWaBoo) RT4.2.730
#28 2016-03-19 Erweiterung/Korrekturen (TooWaBoo) RT4.2.880
#29 2016-05-24 Erweiterung/Korrekturen (TooWaBoo) RT4.2.1005
#30 2016-09-30 Erweiterung/Korrekturen (TooWaBoo) RT4.2.1234
#31 2016-12-01 Erweiterung/Korrekturen (TooWaBoo) RT4.2.1408
#32 2016-12-29 Erweiterung/Korrekturen (TooWaBoo) RT4.2.1464
#33 2017-01-04 Erweiterung/Korrekturen/Soft-Proofing (TooWaBoo) RT4.2.1477
#34 2017-01-07 IPTC (TooWaBoo) RT4.2.1492
#35 2017-02-18 AWB bias (TooWaBoo) RT 5.0 r1
#36 2017-02-23 Korrekturen (TooWaBoo) RT 5.0 r1
#37 2017-03-06 Dynamisches Profil (TooWaBoo) RT 5.0 r1
#38 2017-03-26 Pixel-Shift (TooWaBoo) RT 5.0 r1
#39 06.04.2017 Fast Export (TooWaBoo) RT 5.0 r1
#40 30.04.2017 Erweiterung/Korrekturen (TooWaBoo) RT 5.0 r1
#41 03.05.2017 Erweiterung/Korrekturen (TooWaBoo) RT 5.0 r1
#42 13.05.2017 Erweiterung (TooWaBoo) RT 5.0 r1
#43 21.07.2017 Erweiterung (TooWaBoo) RT 5.1
#44 21.09.2017 Erweiterung (TooWaBoo) RT 5.2
#45 15.10.2017 Erweiterung (TooWaBoo) RT 5.3
#46 18.10.2017 Erweiterung (TooWaBoo) RT 5.3
#47 19.11.2017 HDR-Dynamikkompression (TooWaBoo) RT 5.3
#48 13.12.2017 Erweiterung (TooWaBoo) RT 5.3
#49 21.12.2017 Lokaler Kontrast (TooWaBoo) RT 5.3
#50 07.01.2018 Crop Settings (TooWaBoo) RT 5.3
#51 10.02.2018 Erweiterung (TooWaBoo) RT 5.3
#52 10.02.2018 Korrektur (TooWaBoo) RT 5.3
#53 26.02.2018 Erweiterung (TooWaBoo) RT 5.3
#54 30.03.2018 Erweiterung (TooWaBoo) RT 5.4
#55 06.04.2018 Erweiterung (TooWaBoo) RT 5.4
#56 27.04.2018 Erweiterung (TooWaBoo) RT 5.4
#57 17.05.2018 Erweiterung (TooWaBoo) RT 5.4
#58 19.05.2018 Erweiterung (TooWaBoo) RT 5.4
#59 29.05.2018 Erweiterung (TooWaBoo) RT 5.4
#60 14.06.2018 Erweiterung (TooWaBoo) RT 5.4
#61 14.06.2018 Korrektur (TooWaBoo) RT 5.4
#62 22.06.2018 Korrektur (TooWaBoo) RT 5.4
#63 24.06.2018 DCB/RCD+VNG4 (TooWaBoo) RT 5.4
#64 24.06.2018 Erweiterung/Korrektur (TooWaBoo) RT 5.4
#65 25.06.2018 Korrekturen (TooWaBoo) RT 5.4
#66 04.07.2018 Erweiterung (TooWaBoo) RT 5.4
#67 05.07.2018 Erweiterung (TooWaBoo) RT 5.4
#68 05.07.2018 Erweiterung (TooWaBoo) RT 5.4
#69 25.07.2018 Erweiterung (TooWaBoo) RT 5.4
#70 25.07.2018 Korrekturen (TooWaBoo) RT 5.4
#71 28.09.2018 Korrekturen (TooWaBoo) RT 5.5
#72 05.10.2018 Korrekturen (TooWaBoo) RT 5.5
#73 21.11.2018 Erweiterung (TooWaBoo) RT 5.5
#74 24.11.2018 Erweiterung (TooWaBoo) RT 5.5
#75 02.12.2018 Erweiterung (TooWaBoo) RT 5.5
#76 11.12.2018 Erweiterung (TooWaBoo) RT 5.5
#77 16.12.2018 Korrektur Farbwähler-Tooltip (TooWaBoo) RT 5.5
#78 19.01.2019 Erweiterung (TooWaBoo) RT 5.5
#79 24.02.2019 Erweiterung (TooWaBoo) RT 5.5
#80 25.03.2019 Erweiterung (TooWaBoo) RT 5.6
#81 15.04.2019 Erweiterung (TooWaBoo) RT 5.6
#82 25.05.2019 Erweiterung (TooWaBoo) RT 5.6
#83 06.07.2019 Erweiterung (TooWaBoo) RT 5.6
#84 06.10.2019 Erweiterung (TooWaBoo) RT 5.7
#84 18.07.2019 Erweiterung (TooWaBoo) RT 5.6
#85 29.07.2022 Erweiterung (marter, mozzihh) RT 5.9
#001 keenonkites; Aktualisierte Version für 2.3 beta2
#002 phberlin; basiert auf keenonkites' Erstübersetzung
#003 2007-12-20
#004 2007-12-22
#005 2008-01-08
#006 2008-01-15
#007 2008-02-20
#008 2008-12-19 keenonkites, Anpassungen für 2.4beta4
#009 2008-09-20 keenonkites, Anpassungen für 2.4m2
#010 2008-04-04 Anpassungen für 2.4
#011 Leichte Anpassungen (keenonkites/klonk)
#012 Erweiterung (oduis)
#013 Erweiterung (oduis)
#014 Erweiterung (oduis)
#015 Erweiterung (oduis)
#016 2012-12-05 3.0 alpha: Erweiterung und Korrekturen (Metex)
#017 2012-04-29 Erweiterungen und Korrekturen (MaWe)
#018 Erweiterung (oduis)
#019 Erweiterung (oduis)
#020 2013-02-27 Erweiterung (cytrinox)
#021 2013-12-31 Erweiterung (Ingo)
#022 2015-09-04 komplette Überarbeitung (TooWaBoo)
#023 2015-10-24 Retinexübersetzung und Korrekturen (TooWaBoo)
#024 2015-11-01 Korrekturen (TooWaBoo) RT4.2.450
#025 2015-11-30 Korrekturen (TooWaBoo) RT4.2.507
#026 2015-12-13 Korrekturen (TooWaBoo) RT4.2.514
#026 2015-12-22 Korrekturen (TooWaBoo) RT4.2.536
#027 2016-02-12 Retinexübersetzung (TooWaBoo) RT4.2.730
#028 2016-03-19 Erweiterung/Korrekturen (TooWaBoo) RT4.2.880
#029 2016-05-24 Erweiterung/Korrekturen (TooWaBoo) RT4.2.1005
#030 2016-09-30 Erweiterung/Korrekturen (TooWaBoo) RT4.2.1234
#031 2016-12-01 Erweiterung/Korrekturen (TooWaBoo) RT4.2.1408
#032 2016-12-29 Erweiterung/Korrekturen (TooWaBoo) RT4.2.1464
#033 2017-01-04 Erweiterung/Korrekturen/Soft-Proofing (TooWaBoo) RT4.2.1477
#034 2017-01-07 IPTC (TooWaBoo) RT4.2.1492
#035 2017-02-18 AWB bias (TooWaBoo) RT 5.0 r1
#036 2017-02-23 Korrekturen (TooWaBoo) RT 5.0 r1
#037 2017-03-06 Dynamisches Profil (TooWaBoo) RT 5.0 r1
#038 2017-03-26 Pixel-Shift (TooWaBoo) RT 5.0 r1
#039 06.04.2017 Fast Export (TooWaBoo) RT 5.0 r1
#040 30.04.2017 Erweiterung/Korrekturen (TooWaBoo) RT 5.0 r1
#041 03.05.2017 Erweiterung/Korrekturen (TooWaBoo) RT 5.0 r1
#042 13.05.2017 Erweiterung (TooWaBoo) RT 5.0 r1
#043 21.07.2017 Erweiterung (TooWaBoo) RT 5.1
#044 21.09.2017 Erweiterung (TooWaBoo) RT 5.2
#045 15.10.2017 Erweiterung (TooWaBoo) RT 5.3
#046 18.10.2017 Erweiterung (TooWaBoo) RT 5.3
#047 19.11.2017 HDR-Dynamikkompression (TooWaBoo) RT 5.3
#048 13.12.2017 Erweiterung (TooWaBoo) RT 5.3
#049 21.12.2017 Lokaler Kontrast (TooWaBoo) RT 5.3
#050 07.01.2018 Crop Settings (TooWaBoo) RT 5.3
#051 10.02.2018 Erweiterung (TooWaBoo) RT 5.3
#052 10.02.2018 Korrektur (TooWaBoo) RT 5.3
#053 26.02.2018 Erweiterung (TooWaBoo) RT 5.3
#054 30.03.2018 Erweiterung (TooWaBoo) RT 5.4
#055 06.04.2018 Erweiterung (TooWaBoo) RT 5.4
#056 27.04.2018 Erweiterung (TooWaBoo) RT 5.4
#057 17.05.2018 Erweiterung (TooWaBoo) RT 5.4
#058 19.05.2018 Erweiterung (TooWaBoo) RT 5.4
#059 29.05.2018 Erweiterung (TooWaBoo) RT 5.4
#060 14.06.2018 Erweiterung (TooWaBoo) RT 5.4
#061 14.06.2018 Korrektur (TooWaBoo) RT 5.4
#062 22.06.2018 Korrektur (TooWaBoo) RT 5.4
#063 24.06.2018 DCB/RCD+VNG4 (TooWaBoo) RT 5.4
#064 24.06.2018 Erweiterung/Korrektur (TooWaBoo) RT 5.4
#065 25.06.2018 Korrekturen (TooWaBoo) RT 5.4
#066 04.07.2018 Erweiterung (TooWaBoo) RT 5.4
#067 05.07.2018 Erweiterung (TooWaBoo) RT 5.4
#068 05.07.2018 Erweiterung (TooWaBoo) RT 5.4
#069 25.07.2018 Erweiterung (TooWaBoo) RT 5.4
#070 25.07.2018 Korrekturen (TooWaBoo) RT 5.4
#071 28.09.2018 Korrekturen (TooWaBoo) RT 5.5
#072 05.10.2018 Korrekturen (TooWaBoo) RT 5.5
#073 21.11.2018 Erweiterung (TooWaBoo) RT 5.5
#074 24.11.2018 Erweiterung (TooWaBoo) RT 5.5
#075 02.12.2018 Erweiterung (TooWaBoo) RT 5.5
#076 11.12.2018 Erweiterung (TooWaBoo) RT 5.5
#077 16.12.2018 Korrektur Farbwähler-Tooltip (TooWaBoo) RT 5.5
#078 19.01.2019 Erweiterung (TooWaBoo) RT 5.5
#079 24.02.2019 Erweiterung (TooWaBoo) RT 5.5
#080 25.03.2019 Erweiterung (TooWaBoo) RT 5.6
#081 15.04.2019 Erweiterung (TooWaBoo) RT 5.6
#082 25.05.2019 Erweiterung (TooWaBoo) RT 5.6
#083 06.07.2019 Erweiterung (TooWaBoo) RT 5.6
#084 06.10.2019 Erweiterung (TooWaBoo) RT 5.7
#084 18.07.2019 Erweiterung (TooWaBoo) RT 5.6
#085 29.07.2022 Erweiterung (marter, mozzihh) RT 5.9
#100
#101 @LANGUAGE_DISPLAY_NAME=Deutsch
ABOUT_TAB_BUILD;Version
ABOUT_TAB_CREDITS;Danksagungen

View File

@ -1,5 +1,7 @@
#01 Español - Castellano
#02 2022-10-08 Francisco Lorés y Javier Bartol, para la versión 5.9
#001 Español - Castellano
#002 2022-10-08 Francisco Lorés y Javier Bartol, para la versión 5.9
#100
#101 @LANGUAGE_DISPLAY_NAME=Español (Castellano)
ABOUT_TAB_BUILD;Versión
ABOUT_TAB_CREDITS;Reconocimientos

View File

@ -1,66 +1,68 @@
#01 Latin America - Spanish
#02 Conventions used to keep the same writing style along new texts and versions
#03
#04 Abreviaturas (Abbreviations)
#05 -----------------------------
#06 AC: Aberración cromática (fringe)
#07 B&N: Blanco y Negro (Black & White)
#08 CV: Corrección de Viñeteado (Vignette Filter: in Transform tab)
#09 FG: Filtro Graduado (Gradient Filter)
#10 FV: Filtrar Viñeteado (Vignette Filter: in Exposure tab)
#11 MC: Mezclador de canales (Channel Mixer)
#12 RGB: Modelo de color Rojo Verde Azul (Red Green Blue)
#13 WB: Balance de blancos (White Balance)
#14
#15 Convención de traducción de términos importantes,
#16 sin equivalente estándar o poco conocidos en español:
#17 ---------------------------------------------
#18 Artifacts: Elementos extraños
#19 Brightness: Brillo
#20 Checkbox: Casilla (seleccionada/desmarcada)
#21 Chroma: Crominancia (**, definida en es.wikipedia)
#22 Chromatic: Cromática (*)
#23 Chromaticity: Cromaticidad (**)
#24 Colorfulness: Colorido
#25 Cyan: Cian (*)
#26 Dark Frame: Toma Negra
#27 Dim: Luz tenue
#28 Feather: Difuminado
#29 Illuminant: Iluminante
#30 Lightness: Claridad
#31 Luminance: Luminancia (*)
#32 Luminosity: Luminosidad
#33 Mapping: Mapeo (*)
#34 Sharpening: Enfoque
#35 Slider: Control deslizante
#36 Tone Curve: Curva tonal
#37 Vibrance: Vibranza
#38
#39 (*) Término incluido en diccionario RAE
#40 (**) Término no incluido en diccionario RAE
#41
#42 Términos conservados en Inglés por no tener traducción breve
#43 al español en el sentido usado por RT/fotografía digital
#44 -----------------------------------------------------
#45 ICM (Image Color Management)
#46 Gamut
#47 Gamma
#48 Raw
#49
#50 2008-01-15 keenonkites, first translation
#51 2008-03-03 Ioritz Ibarguren, corrections
#52 2008-04-05 keenonkites, completed for 2.4m1
#53 2008-04-09 Ramon, partly corrected (part of 2.3)
#54 2008-04-29 Ramon, small correction
#55 2008-06-09 Ramon, Adaptions regarding 2.4m1 and others
#56 2008-09-20 keenonkites, first version for 2.4m2
#57 2008-12-19 keenonkites, first version for 2.4beta4
#58 2010-12-07 rickydh, some translations of untranslated keys for 3.0 alpha1
#59 2011-12-25 plores, translation improvement, translation of untranslated strings
#60 2013-01-03 OdeLama, translation for v4.0.12 of untranslated/changed strings
#61 2014-01-14 mapelo, bug correction and small enhancements.
#62 2014-10-10 fotger
#63 2018-12-09 Faber777
#001 Latin America - Spanish
#002 Conventions used to keep the same writing style along new texts and versions
#003
#004 Abreviaturas (Abbreviations)
#005 -----------------------------
#006 AC: Aberración cromática (fringe)
#007 B&N: Blanco y Negro (Black & White)
#008 CV: Corrección de Viñeteado (Vignette Filter: in Transform tab)
#009 FG: Filtro Graduado (Gradient Filter)
#010 FV: Filtrar Viñeteado (Vignette Filter: in Exposure tab)
#011 MC: Mezclador de canales (Channel Mixer)
#012 RGB: Modelo de color Rojo Verde Azul (Red Green Blue)
#013 WB: Balance de blancos (White Balance)
#014
#015 Convención de traducción de términos importantes,
#016 sin equivalente estándar o poco conocidos en español:
#017 ---------------------------------------------
#018 Artifacts: Elementos extraños
#019 Brightness: Brillo
#020 Checkbox: Casilla (seleccionada/desmarcada)
#021 Chroma: Crominancia (**, definida en es.wikipedia)
#022 Chromatic: Cromática (*)
#023 Chromaticity: Cromaticidad (**)
#024 Colorfulness: Colorido
#025 Cyan: Cian (*)
#026 Dark Frame: Toma Negra
#027 Dim: Luz tenue
#028 Feather: Difuminado
#029 Illuminant: Iluminante
#030 Lightness: Claridad
#031 Luminance: Luminancia (*)
#032 Luminosity: Luminosidad
#033 Mapping: Mapeo (*)
#034 Sharpening: Enfoque
#035 Slider: Control deslizante
#036 Tone Curve: Curva tonal
#037 Vibrance: Vibranza
#038
#039 (*) Término incluido en diccionario RAE
#040 (**) Término no incluido en diccionario RAE
#041
#042 Términos conservados en Inglés por no tener traducción breve
#043 al español en el sentido usado por RT/fotografía digital
#044 -----------------------------------------------------
#045 ICM (Image Color Management)
#046 Gamut
#047 Gamma
#048 Raw
#049
#050 2008-01-15 keenonkites, first translation
#051 2008-03-03 Ioritz Ibarguren, corrections
#052 2008-04-05 keenonkites, completed for 2.4m1
#053 2008-04-09 Ramon, partly corrected (part of 2.3)
#054 2008-04-29 Ramon, small correction
#055 2008-06-09 Ramon, Adaptions regarding 2.4m1 and others
#056 2008-09-20 keenonkites, first version for 2.4m2
#057 2008-12-19 keenonkites, first version for 2.4beta4
#058 2010-12-07 rickydh, some translations of untranslated keys for 3.0 alpha1
#059 2011-12-25 plores, translation improvement, translation of untranslated strings
#060 2013-01-03 OdeLama, translation for v4.0.12 of untranslated/changed strings
#061 2014-01-14 mapelo, bug correction and small enhancements.
#062 2014-10-10 fotger
#063 2018-12-09 Faber777
#100
#101 @LANGUAGE_DISPLAY_NAME=Español (Latinoamericano)
ABOUT_TAB_BUILD;Versión
ABOUT_TAB_CREDITS;Créditos

View File

@ -1,4 +1,6 @@
#01 2008-03-01 Initial translation by Hombre
#001 2008-03-01 Initial translation by Hombre
#100
#101 @LANGUAGE_DISPLAY_NAME=Français
ABOUT_TAB_BUILD;Version
ABOUT_TAB_CREDITS;Crédits
@ -2732,8 +2734,8 @@ TP_RGBCURVES_BLUE;B
TP_RGBCURVES_CHANNEL;Canal
TP_RGBCURVES_GREEN;V
TP_RGBCURVES_LABEL;Courbes RVB
TP_RGBCURVES_LUMAMODE;Mode Lominosité
TP_RGBCURVES_LUMAMODE_TOOLTIP;<b>Mode Lominosité</b> permet de faire varier la contribution des canaux R, V et B à la luminosité de l'image, sans altérer les couleurs de l'image.
TP_RGBCURVES_LUMAMODE;Mode Luminosité
TP_RGBCURVES_LUMAMODE_TOOLTIP;<b>Mode Luminosité</b> permet de faire varier la contribution des canaux R, V et B à la luminosité de l'image, sans altérer les couleurs de l'image.
TP_RGBCURVES_RED;R
TP_ROTATE_DEGREE;Degré
TP_ROTATE_LABEL;Rotation

View File

@ -1,8 +1,10 @@
#01 2008-01-19 v2.3 breek
#02 2008-11-01 v2.4 pantaraf, chelidon, roberto
#03 2011-08-26 v3.0 joker, chelidon, ffsup2
#04 2011-08-31 v4.0 chelidon, ffsup2
#05 2014-04-21 crx
#001 2008-01-19 v2.3 breek
#002 2008-11-01 v2.4 pantaraf, chelidon, roberto
#003 2011-08-26 v3.0 joker, chelidon, ffsup2
#004 2011-08-31 v4.0 chelidon, ffsup2
#005 2014-04-21 crx
#100
#101 @LANGUAGE_DISPLAY_NAME=Italiano
ABOUT_TAB_BUILD;Versione
ABOUT_TAB_CREDITS;Riconoscimenti

View File

@ -1,4 +1,6 @@
#Last update 10-12-2022
#001 Last update 10-12-2022
#100
#101 @LANGUAGE_DISPLAY_NAME=日本語
ABOUT_TAB_BUILD;バージョン
ABOUT_TAB_CREDITS;クレジット

View File

@ -1,4 +1,6 @@
#01 2010-11-20 RT 3.0 alpha 1 rev. 597:fb291bf74c by Dr. Gyurkó M. 'dualon' Dávid
#001 2010-11-20 RT 3.0 alpha 1 rev. 597:fb291bf74c by Dr. Gyurkó M. 'dualon' Dávid
#100
#101 @LANGUAGE_DISPLAY_NAME=Magyar
ABOUT_TAB_BUILD;Verzió
ABOUT_TAB_CREDITS;Szerzők

View File

@ -1,20 +1,22 @@
#01 2007-12-26 Rens Duijsens en Brent Huisman
#02 2008-03-14 updated by reggybe
#03 2009-02-01 updated to RT2.4-RC by paul.matthijsse
#04 2010-05-02 updated to rt3a1 by paul.matthijsse
#05 2011-03-03 updated to rt3a2 by paul.matthijsse
#06 2011-10-10 updated to rt4.0 by wim ter meer
#07 2011-11-28 updated by pm
#08 2012-05-17 updated to rt4.0.8 by wim ter meer
#09 2013-03-27 updated to rt4.0.10 by wim ter meer
#10 2013-11-27 updated to rt4.0.11 by wim ter meer
#11 2014-03-24 updated to rt4.1 by wim ter meer
#12 2014-10-19 updated to rt4.1.92 by wim ter meer
#13 2015-03-03 updated to rt4.2.102 by wim ter meer
#14 2015-11-23 update by wim ter meer
#15 2016-07-21 update by wim ter meer
#16 2017-04-21 update by wim ter meer
#17 2020-06-05 update by dheijl
#001 2007-12-26 Rens Duijsens en Brent Huisman
#002 2008-03-14 updated by reggybe
#003 2009-02-01 updated to RT2.4-RC by paul.matthijsse
#004 2010-05-02 updated to rt3a1 by paul.matthijsse
#005 2011-03-03 updated to rt3a2 by paul.matthijsse
#006 2011-10-10 updated to rt4.0 by wim ter meer
#007 2011-11-28 updated by pm
#008 2012-05-17 updated to rt4.0.8 by wim ter meer
#009 2013-03-27 updated to rt4.0.10 by wim ter meer
#010 2013-11-27 updated to rt4.0.11 by wim ter meer
#011 2014-03-24 updated to rt4.1 by wim ter meer
#012 2014-10-19 updated to rt4.1.92 by wim ter meer
#013 2015-03-03 updated to rt4.2.102 by wim ter meer
#014 2015-11-23 update by wim ter meer
#015 2016-07-21 update by wim ter meer
#016 2017-04-21 update by wim ter meer
#017 2020-06-05 update by dheijl
#100
#101 @LANGUAGE_DISPLAY_NAME=Nederlands
ABOUT_TAB_BUILD;Versie
ABOUT_TAB_CREDITS;Credits

View File

@ -1,16 +1,18 @@
#01 2007-12-24 Mateusz Ludwin
#02 2010-01-08 Bartosz "Simek" Kaszubowski
#03 2011-09-06 Dariusz 'Salvadhor' Duma
#04 2011-11-30 DrSlony
#05 2012-01-14 DrSlony
#06 2012-01-30 DrSlony
#07 2012-04-02 DrSlony
#08 2013-05-21 DrSlony
#09 2014-10-16 DrSlony
#10 2020-02-02 Bartłomiej Wiśniowski
#11 2020-02-02 Bartłomiej Wiśniowski
#12 2020-02-15 Bartłomiej Wiśniowski
#13 2020-02-17 Bartłomiej Wiśniowski
#001 2007-12-24 Mateusz Ludwin
#002 2010-01-08 Bartosz "Simek" Kaszubowski
#003 2011-09-06 Dariusz 'Salvadhor' Duma
#004 2011-11-30 DrSlony
#005 2012-01-14 DrSlony
#006 2012-01-30 DrSlony
#007 2012-04-02 DrSlony
#008 2013-05-21 DrSlony
#009 2014-10-16 DrSlony
#010 2020-02-02 Bartłomiej Wiśniowski
#011 2020-02-02 Bartłomiej Wiśniowski
#012 2020-02-15 Bartłomiej Wiśniowski
#013 2020-02-17 Bartłomiej Wiśniowski
#100
#101 @LANGUAGE_DISPLAY_NAME=Polski
ABOUT_TAB_BUILD;Wersja
ABOUT_TAB_CREDITS;Zasługi

View File

@ -1,5 +1,7 @@
#01 2018-07-25 Digitalpix58
#02 2019-03-11 Xendez
#001 2018-07-25 Digitalpix58
#002 2019-03-11 Xendez
#100
#101 @LANGUAGE_DISPLAY_NAME=Português
ABOUT_TAB_BUILD;Versão
ABOUT_TAB_CREDITS;Créditos

View File

@ -1,5 +1,7 @@
#01 2018-07-25 Digitalpix58
#02 2019-03-12 Xendez
#001 2018-07-25 Digitalpix58
#002 2019-03-12 Xendez
#100
#101 @LANGUAGE_DISPLAY_NAME=Português brasileiro
ABOUT_TAB_BUILD;Versão
ABOUT_TAB_CREDITS;Créditos

View File

@ -45,6 +45,13 @@ comments in the right order, e.g.:
#01 Line 2...
#02 3, etc.
Metadata for the language file appear in comments with the following syntax:
#10 @KEY=VALUE
The @ character must appear immediately after the whitespace following the
numeric prefix. KEY is the metadata name and VALUE is value for that metadata
name. The following key(s) are recognized:
a) LANGUAGE_DISPLAY_NAME: The language name as shown in preferences.
To create a file with only Latin characters from a non-Latin one, you can use
sed with the "y" command. For example, to create a latin-only "Polish (Latin
Characters)" file from the non-latin "Polish" one:

View File

@ -1,12 +1,14 @@
#01 2007-12-23 ArtDen
#02 2008-07-20 Denis Artemov
#03 2009-02-16 Kvark
#04 2010-02-26 Sergey Smirnov AKA smiserg
#05 2010-11-01 Ilia Popov <ilia_popov@rambler.ru>
#06 2012-07-17 Roman Milanskij <loooooker@gmail.com>
#07 2014-02-12 Kostia (Kildor) Romanov <kromanov@gmail.com>
#08 2018-02-10 Kostia (Kildor) Romanov <kromanov@gmail.com>
#09 2018-12-13 Kostia (Kildor) Romanov <kromanov@gmail.com>
#001 2007-12-23 ArtDen
#002 2008-07-20 Denis Artemov
#003 2009-02-16 Kvark
#004 2010-02-26 Sergey Smirnov AKA smiserg
#005 2010-11-01 Ilia Popov <ilia_popov@rambler.ru>
#006 2012-07-17 Roman Milanskij <loooooker@gmail.com>
#007 2014-02-12 Kostia (Kildor) Romanov <kromanov@gmail.com>
#008 2018-02-10 Kostia (Kildor) Romanov <kromanov@gmail.com>
#009 2018-12-13 Kostia (Kildor) Romanov <kromanov@gmail.com>
#100
#101 @LANGUAGE_DISPLAY_NAME=Русский
ABOUT_TAB_BUILD;Версия
ABOUT_TAB_CREDITS;Авторы

View File

@ -1,4 +1,6 @@
#01 2010-11-16 gpopac
#001 2010-11-16 gpopac
#100
#101 @LANGUAGE_DISPLAY_NAME=српски
ABOUT_TAB_BUILD;Издање
ABOUT_TAB_CREDITS;Заслуге

View File

@ -1,4 +1,6 @@
#01 2019-10-05 Matjaž Jeran
#001 2019-10-05 Matjaž Jeran
#100
#101 @LANGUAGE_DISPLAY_NAME=Slovenščina
ABOUT_TAB_BUILD;Verzija
ABOUT_TAB_CREDITS;Zasluge

View File

@ -1,7 +1,9 @@
#01 2008-01-22 Emil Ericsson
#02 2010-2013 Updated by Johan Thor
#03 2015-08-09 Johan Thor
#04 2016-12-30 Johan Thor
#001 2008-01-22 Emil Ericsson
#002 2010-2013 Updated by Johan Thor
#003 2015-08-09 Johan Thor
#004 2016-12-30 Johan Thor
#100
#101 @LANGUAGE_DISPLAY_NAME=Svenska
ABOUT_TAB_BUILD;Version
ABOUT_TAB_CREDITS;Erkännande

View File

@ -1444,6 +1444,7 @@ HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast
HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness
HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius
HISTORY_MSG_LOCAL_GAMUTMUNSEL;Local - Gamut-Munsell
HISTORY_MSG_LOCALLAB_TE_PIVOT;Local - Equalizer pivot
HISTORY_MSG_METADATA_MODE;Metadata copy mode
HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold
HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold
@ -1489,6 +1490,11 @@ 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
@ -1529,6 +1535,22 @@ 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_OBS;Remove algo 2 passes
HISTORY_MSG_WBITC_CUSTOM;Itcwb Custom
HISTORY_MSG_WBITC_SAMPLING;Low sampling
HISTORY_MSG_WBITC_THRES;Itcwb Theshold
HISTORY_MSG_WBITC_NOPURPLE;Itcwb Nopurple
HISTORY_MSG_WBITC_PRIM;Primaries
HISTORY_MSG_WBITC_SORTED;Itcwb ponderated
HISTORY_MSG_WBITC_FORCE;Itcwb Force
HISTORY_MSG_WBITC_SIZE;Itcwb Size
HISTORY_MSG_WBITC_PRECIS;Itcwb Precision
HISTORY_MSG_WBITC_DELTA;Itcwb Delta green
HISTORY_MSG_WBITC_FGREEN;Itcwb Green - student
HISTORY_MSG_WBITC_RGREEN;Itcwb Green range
HISTORY_MSG_WBITC_MINSIZE;Patch min size
HISTORY_MSG_WBITC_PONDER;Itcwb ponderated
HISTORY_MSG_WBITC_GREEN;Grren refinement
HISTORY_NEWSNAPSHOT;Add
HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: <b>Alt-s</b>
HISTORY_SNAPSHOT;Snapshot
@ -1796,6 +1818,7 @@ PARTIALPASTE_SHARPENMICRO;Microcontrast
PARTIALPASTE_SOFTLIGHT;Soft light
PARTIALPASTE_SPOT;Spot removal
PARTIALPASTE_TM_FATTAL;Dynamic range compression
PARTIALPASTE_TONE_EQUALIZER;Tone equalizer
PARTIALPASTE_VIBRANCE;Vibrance
PARTIALPASTE_VIGNETTING;Vignetting correction
PARTIALPASTE_WHITEBALANCE;White balance
@ -1834,6 +1857,17 @@ PREFERENCES_CHUNKSIZE_RGB;RGB processing
PREFERENCES_CIE;Ciecam
PREFERENCES_CIEARTIF;Avoid artifacts
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_WBAPATCH;Number maximum of colors used in picture
PREFERENCES_WBAFORC;Forces Extra algoritm
PREFERENCES_WBAGREENDELTA;Delta temperature in green iterate loop (if Force Extra enabled)
PREFERENCES_WBANOPURP;No purple color used
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_CLIPPINGIND;Clipping Indication
PREFERENCES_CLUTSCACHE;HaldCLUT Cache
PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs
@ -2609,6 +2643,7 @@ 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
@ -2839,13 +2874,15 @@ TP_LOCALLAB_DENOIMASK;Denoise chroma mask
TP_LOCALLAB_DENOIMASK_TOOLTIP;For all tools, allows you to control the chromatic noise level of the mask.\nUseful for better control of chrominance and to avoid artifacts when using the LC(h) curve.
TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservative mode preserves low frequency detail. Aggressive mode removes low frequency detail.\nConservative and Aggressive modes use wavelets and DCT and can be used in conjunction with 'Non-local Means Luminance'.
TP_LOCALLAB_DENOITHR_TOOLTIP;Adjusts edge detection to help reduce noise in uniform, low-contrast areas.
TP_LOCALLAB_DENOIWAVCH;Wavelets: Chrominance
TP_LOCALLAB_DENOIWAVLUM;Wavelets: Luminance
TP_LOCALLAB_DENOI_EXP;Denoise
TP_LOCALLAB_DENOI_TOOLTIP;This module can be used for noise reduction either on its own (at the end of the processing pipeline) or in addition to the Noise Reduction module in the Detail tab (which works at the beginning of the pipeline).\n Scope allows you to differentiate the action based on color (ΔE).\nMinimum RT-spot size: 128x128.
TP_LOCALLAB_DEPTH;Depth
TP_LOCALLAB_DETAIL;Local contrast
TP_LOCALLAB_DETAILFRA;Edge detection - DCT
TP_LOCALLAB_DETAILSH;Details
TP_LOCALLAB_DETAILTHR;Luma-chro detail threshold
TP_LOCALLAB_DETAILTHR;Lum/chrom detail threshold
TP_LOCALLAB_DIVGR;Gamma
TP_LOCALLAB_DUPLSPOTNAME;Copy
TP_LOCALLAB_EDGFRA;Edge sharpness
@ -3110,7 +3147,7 @@ TP_LOCALLAB_MASKLCTHRLOW;Dark area luminance threshold
TP_LOCALLAB_MASKLCTHRLOW2;Dark area luma threshold
TP_LOCALLAB_MASKLCTHRMID;Gray area luma denoise
TP_LOCALLAB_MASKLCTHRMIDCH;Gray area chroma denoise
TP_LOCALLAB_MASKLC_TOOLTIP;This allows you to target the denoise based on the image luminance information contained in the L(L) or LC(H) mask (Mask and Modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n 'Dark area luminance threshold'. If 'Reinforce denoise in dark and light areas' > 1 the denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (determined by mask).\n 'Light area luminance threshold'. The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (determined by mask).\n In the area between the two thresholds, the denoise settings are not affected by the mask.
TP_LOCALLAB_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.
@ -3169,6 +3206,12 @@ TP_LOCALLAB_MERTHR;Difference
TP_LOCALLAB_MERTWE;Exclusion
TP_LOCALLAB_MERTWO;Subtract
TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts.
TP_LOCALLAB_LCLABELS;Residual noise levels
TP_LOCALLAB_LCLABELS_TOOLTIP;Displays the mean and high-end noise values for the area shown in the Preview Panel (at 100% zoom). The noise values are grouped by wavelet levels 0,1,2,3 and 4,5,6.\nThe displayed values are indicative only and are designed to assist with denoise adjustments. They should not be interpreted as absolute noise levels.\n\n 300: Very noisy\n 100-300: Noisy\n 50-100: Moderatly noisy\n < 50: Low noise\n\nThey allow you to see:\n*The impact of Noise Reduction in the main-menu Detail tab.\n*The influence of Non-local Means, Wavelets and DCT on the luminance noise.\n*The influence of Wavelets and DCT on the chroma noise.\n*The influence of Capture Sharpening and Demosaicing.
TP_LOCALLAB_LUMLABEL;Luma levels 0123: Mean=%1 High=%2
TP_LOCALLAB_LUM46LABEL;Luma levels 456: Mean=%1 High=%2
TP_LOCALLAB_CHROLABEL;Chroma levels 0123: Mean=%1 High=%2
TP_LOCALLAB_CHRO46LABEL;Chroma levels 456: Mean=%1 High=%2
TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2
TP_LOCALLAB_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending.
TP_LOCALLAB_MODE_EXPERT;Advanced
@ -3185,7 +3228,7 @@ TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;Use this slider to adapt the amount of denois
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_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
@ -3379,6 +3422,7 @@ TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle lin
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
@ -3775,6 +3819,16 @@ TP_TM_FATTAL_AMOUNT;Amount
TP_TM_FATTAL_ANCHOR;Anchor
TP_TM_FATTAL_LABEL;Dynamic Range Compression
TP_TM_FATTAL_THRESHOLD;Detail
TP_TONE_EQUALIZER_BAND_0;Blacks
TP_TONE_EQUALIZER_BAND_1;Shadows
TP_TONE_EQUALIZER_BAND_2;Midtones
TP_TONE_EQUALIZER_BAND_3;Highlights
TP_TONE_EQUALIZER_BAND_4;Whites
TP_TONE_EQUALIZER_BANDS;Bands
TP_TONE_EQUALIZER_DETAIL;Regularization
TP_TONE_EQUALIZER_LABEL;Tone Equalizer
TP_TONE_EQUALIZER_PIVOT;Pivot (Ev)
TP_TONE_EQUALIZER_SHOW_COLOR_MAP;Show tonal map
TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift
TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH
TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones
@ -4051,7 +4105,7 @@ TP_WAVELET_WAVOFFSET;Offset
TP_WBALANCE_AUTO;Auto
TP_WBALANCE_AUTOITCGREEN;Temperature correlation
TP_WBALANCE_AUTOOLD;RGB grey
TP_WBALANCE_AUTO_HEADER;Automatic
TP_WBALANCE_AUTO_HEADER;Automatic & Refinement
TP_WBALANCE_CAMERA;Camera
TP_WBALANCE_CLOUDY;Cloudy
TP_WBALANCE_CUSTOM;Custom
@ -4078,6 +4132,47 @@ TP_WBALANCE_FLUO_HEADER;Fluorescent
TP_WBALANCE_GREEN;Tint
TP_WBALANCE_GTI;GTI
TP_WBALANCE_HMI;HMI
TP_WBALANCE_ITCWB_DELTA;Delta temperature in green loop
TP_WBALANCE_ITCWBDELTA_TOOLTIP;Fixed for each "green" iteration tried, the temperature difference to be taken into account.
//TP_WBALANCE_ITCWB_FORCED;Forces use of the entire CIE diagram
TP_WBALANCE_ITCWB_FORCED;Close to full CIE diagram
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_ITCWB_FGREEN;Find green student
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_ITCWBFGREEN_TOOLTIP;Find the best compromise between Student and green.
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_ITCWBMINSIZEPATCH_TOOLTIP;Allows you to set the minimum patch value. values that are too low can lead to a lack of correlation.
TP_WBALANCE_ITCWB_NOPURPLE;Filter on purple color
//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_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_ITCWB_ALG;Remove 2 pass algorithm
TP_WBALANCE_ITCWB_CUSTOM;Use Custom temperature & tint
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_ITCWALG_TOOLTIP;Allows you to switch to the other Alternative temperature (Alt_temp), when possible.\nInactive in the "single choice" case.
TP_WBALANCE_ITCWB_PRECIS;Precision algorithm - scale used
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_ITCWB_PRIM_SRGB;Low sampling & No use Camera settings
TP_WBALANCE_ITCWB_PRIM_ADOB;Medium sampling
TP_WBALANCE_ITCWB_PRIM_BETA;Medium sampling - near Pointer's gamut
TP_WBALANCE_ITCWB_PRIM_REC;High sampling
TP_WBALANCE_ITCWB_PRIM_ACE;Forces use of the entire CIE diagram
TP_WBALANCE_ITCWB_PRIM_JDCMAX;Close to full CIE diagram
TP_WBALANCE_ITCWB_PRIM_XYZCAM;Camera XYZ matrix
TP_WBALANCE_ITCWB_PRIM_XYZCAM2;JDCmax after Camera XYZ matrix
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 No use camera settings' allow you to isolate high gamut parts of the image and forces the algorithm in some cases (tint > 0.8,...) not to use 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_ITCWB_RGREEN;Green range
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_ITCWB_SAMPLING;Low sampling 5.9
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_ITCWB_SIZE;Size of ref. color compare to histogram
TP_WBALANCE_ITCWB_SIZEPATCH;Size of color patch
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_ITCWB_THRES;Colors used in picture (preset)
TP_WBALANCE_ITCWBTHRES_TOOLTIP;Limits comparison sampling between spectral data and image data.
TP_WBALANCE_JUDGEIII;JudgeIII
TP_WBALANCE_LABEL;White Balance
TP_WBALANCE_LAMP_HEADER;Lamp
@ -4089,6 +4184,10 @@ 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_SHADE;Shade
TP_WBALANCE_SIZE;Size:
@ -4097,10 +4196,12 @@ TP_WBALANCE_SOLUX41;Solux 4100K
TP_WBALANCE_SOLUX47;Solux 4700K (vendor)
TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery)
TP_WBALANCE_SPOTWB;Use the pipette to pick the white balance from a neutral patch in the preview.
TP_WBALANCE_STUDLABEL;Correlation factor: %1
TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation.\nLower values are better, where <0.005 is excellent,\n<0.01 is good, and >0.5 is poor.\nLow values do not mean that the white balance is good:\nif the illuminant is non-standard the results can be erratic.\nA value of 1000 means previous calculations are used and\nthe resultsare probably good.
TP_WBALANCE_STUDLABEL;Correlation factor: %1 Passes:%2 Worst_alt=%3
TP_WBALANCE_STUDLABEL1;Correlation factor: %1 Passes:%2 Best_alt=%3
TP_WBALANCE_STUDLABEL0;Correlation factor: %1 Passes:%2 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'.
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.
TP_WBALANCE_TEMPERATURE;Temperature
TP_WBALANCE_TUNGSTEN;Tungsten
TP_WBALANCE_WATER1;UnderWater 1

View File

@ -227,6 +227,8 @@ menu separator {
}
#PlacesPaned .view.separator {
min-height: 0.16666666666666666em;
color: #363636;
}
#MetaPanelNotebook separator {

View File

@ -207,6 +207,8 @@ menu separator {
}
#PlacesPaned .view.separator {
min-height: 0.16666666666666666em;
color: #363636;
}
#MetaPanelNotebook separator {

View File

@ -946,7 +946,7 @@ dialog notebook stack {
}
/* Adds a line on top of the notebook as a separtor for the titlebar (only on CSD) */
/* Adds a line on top of the notebook as a separator for the titlebar (only on CSD) */
dialog.csd #PrefNotebook > header,
dialog.csd #AboutNotebook > header,
window.csd:not(.fullscreen) #MainNotebook > header.top {

View File

@ -102,7 +102,7 @@ notebook > header.left > tabs > arrow {
}
/* Adds a line on top of the notebook as a separtor for the titlebar (only on CSD) */
/* Adds a line on top of the notebook as a separator for the titlebar (only on CSD) */
dialog.csd #PrefNotebook > header,
dialog.csd #AboutNotebook > header,
window.csd:not(.fullscreen) #MainNotebook > header.top {

View File

@ -102,7 +102,7 @@ notebook > header.left > tabs > arrow {
}
/* Adds a line on top of the notebook as a separtor for the titlebar (only on CSD) */
/* Adds a line on top of the notebook as a separator for the titlebar (only on CSD) */
dialog.csd #PrefNotebook > header,
dialog.csd #AboutNotebook > header,
window.csd:not(.fullscreen) #MainNotebook > header.top {

View File

@ -123,6 +123,7 @@ float* RawImageSource::CA_correct_RT(
double cared,
double cablue,
bool avoidColourshift,
int border_crop,
array2D<float> &rawData,
double* fitParamsTransfer,
bool fitParamsIn,
@ -145,7 +146,7 @@ float* RawImageSource::CA_correct_RT(
const unsigned int cfa[2][2] = {{FC(0,0), FC(0,1)}, {FC(1,0), FC(1,1)}};
constexpr int ts = 128;
constexpr int tsh = ts / 2;
constexpr int cb = 2; // 2 pixels border will be excluded from correction
const int cb = border_crop;
//shifts to location of vertical and diagonal neighbours
constexpr int v1 = ts, v2 = 2 * ts, v3 = 3 * ts, v4 = 4 * ts; //, p1=-ts+1, p2=-2*ts+2, p3=-3*ts+3, m1=ts+1, m2=2*ts+2, m3=3*ts+3;

View File

@ -133,6 +133,7 @@ set(RTENGINESOURCEFILES
ipsharpen.cc
ipsharpenedges.cc
ipsoftlight.cc
iptoneequalizer.cc
iptransform.cc
ipvibrance.cc
ipwavelet.cc

View File

@ -1203,7 +1203,7 @@ BENCHFUN
if (!memoryAllocationFailed) {
if (kall == 0) {
Noise_residualAB(*adecomp, chresid, chmaxresid, denoiseMethodRgb);
Noise_residualAB(*adecomp, chresid, chmaxresid, denoiseMethodRgb, 0, levwav);
chresidtemp = chresid;
chmaxresidtemp = chmaxresid;
}
@ -1240,12 +1240,13 @@ BENCHFUN
if (!memoryAllocationFailed) {
if (kall == 0) {
Noise_residualAB(*bdecomp, chresid, chmaxresid, denoiseMethodRgb);
Noise_residualAB(*bdecomp, chresid, chmaxresid, denoiseMethodRgb, 0, levwav);
chresid += chresidtemp;
chmaxresid += chmaxresidtemp;
chresid = sqrt(chresid / (6 * (levwav)));
highresi = chresid + 0.66f * (sqrt(chmaxresid) - chresid); //evaluate sigma
nresi = chresid;
printf("Nresi=%f Highresi=%f lev=%i\n", (double) nresi, (double) highresi, levwav);
}
bdecomp->reconstruct(labdn->b[0]);
@ -2158,16 +2159,18 @@ float ImProcFunctions::MadRgb(const float * DataList, const int datalen)
void ImProcFunctions::Noise_residualAB(const wavelet_decomposition &WaveletCoeffs_ab, float &chresid, float &chmaxresid, bool denoiseMethodRgb)
void ImProcFunctions::Noise_residualAB(const wavelet_decomposition &WaveletCoeffs_ab, float &chresid, float &chmaxresid, bool denoiseMethodRgb, int beg, int end)
{
float resid = 0.f;
float maxresid = 0.f;
// int maxlev = WaveletCoeffs_ab.maxlevel();
// end = maxlev;
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic) collapse(2) reduction(+:resid) reduction(max:maxresid) num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1)
#endif
for (int lvl = 0; lvl < WaveletCoeffs_ab.maxlevel(); ++lvl) {
// for (int lvl = 0; lvl < WaveletCoeffs_ab.maxlevel(); ++lvl) {
for (int lvl = beg; lvl < end; ++lvl) {
// compute median absolute deviation (MAD) of detail coefficients as robust noise estimator
for (int dir = 1; dir < 4; ++dir) {
const int Wlvl_ab = WaveletCoeffs_ab.level_W(lvl);

View File

@ -19,7 +19,7 @@
#ifndef _ALPHA_H_
#define _ALPHA_H_
#include <gtkmm.h>
#include <cairomm/cairomm.h>
#include <assert.h>
#define CHECK_BOUNDS 0

View File

@ -126,7 +126,7 @@ typedef struct internal_hooks
} internal_hooks;
#if defined(_MSC_VER)
/* work around MSVC error C2322: '...' address of dillimport '...' is not static */
/* work around MSVC error C2322: '...' address of dllimport '...' is not static */
static void *internal_malloc(size_t size)
{
return malloc(size);

View File

@ -84,7 +84,7 @@ int calcDistortion(unsigned char* img1, unsigned char* img2, int ncols, int nrow
r0[n] = sqrt((x0 - wc) * (x0 - wc) + (y0 - hc) * (y0 - hc)) / radius;
// dots too close to the center tends to have big diviation and create noise, extract them
// dots too close to the center tends to have big deviation and create noise, extract them
if (r0[n] < CENTER_R) {
continue;
}

View File

@ -647,6 +647,7 @@ Camera constants:
"make_model": "Canon EOS 7D Mark II",
"dcraw_matrix": [ 7268,-1082,-969,-4186,11839,2663,-825,2029,5839 ], // dng_v8.7 d65
//"dcraw_matrix": [ 6285,-147,-821,-4080,11695,2714,-1045,2459,5497 ], // DXO D50
"raw_crop": [ 72, 38, 5496, 3669 ],
"ranges": {
"white": [
{ "iso": [ 100, 125 ], "levels": 13500 }, // typical 13583 - LENR 13550
@ -1230,7 +1231,7 @@ Camera constants:
"raw_crop": [ 160, 120, 6024, 4024 ]
},
{ // Quality C
{ // Quality A
"make_model": "Canon EOS R5",
"dcraw_matrix" : [9766, -2953, -1254, -4276, 12116, 2433, -437, 1336, 5131],
"raw_crop" : [
@ -1241,7 +1242,7 @@ Camera constants:
{ "frame" : [ 8352, 5586 ], "areas": [ 94, 20, 5578, 122 ] },
{ "frame" : [ 5248, 3510 ], "areas": [ 94, 20, 3510, 122 ] }
],
"ranges" : { "white" : 16382 }
"ranges" : { "white" : 16300 } // 16382 without LENR, add margin for LENR. Dual-pixel frame 2 is lower for low ISOs.
},
{ // Quality C
@ -1258,6 +1259,19 @@ Camera constants:
"ranges" : { "white" : 16382 }
},
{ // Quality C
"make_model": ["Canon EOS R6m2", "Canon EOS R8"],
"dcraw_matrix": [9539, -2795, -1224, -4175, 11998, 2458, -465, 1755, 6048],
"raw_crop": [
{"frame": [6188, 4120], "crop": [154, 96, 6024, 4024]},
{"frame": [3936, 2612], "crop": [156, 96, 3780, 2516]}
],
"masked_areas": [
{"frame": [6188, 4120], "areas": [4, 4, 4116, 150, 4, 150, 92, 6184]},
{"frame": [3936, 2612], "areas": [4, 4, 2608, 150, 4, 150, 92, 3932]}
]
},
{ // Quality C
"make_model": "Canon EOS R7",
"dcraw_matrix" : [10424, -3138, -1300, -4221, 11938, 2584, -547, 1658, 6183],
@ -1565,7 +1579,10 @@ Camera constants:
{ // Quality B
"make_model": [ "FUJIFILM X-T30", "FUJIFILM X-T30 II", "FUJIFILM X100V", "FUJIFILM X-T4", "FUJIFILM X-S10" ],
"dcraw_matrix": [ 13426,-6334,-1177,-4244,12136,2371,-580,1303,5980 ], // DNG_v11, standard_v2 d65
"raw_crop": [ 0, 5, 6252, 4176]
"raw_crop": [
{"frame": [6384, 3348], "crop": [624, 0, 5004, 3347]}, // Sports finder mode.
{"frame": [0, 0], "crop": [0, 5, 6252, 4176]}
]
},
{ // Quality B
@ -1739,7 +1756,7 @@ Camera constants:
{ // Quality B, lacks aperture and ISO scaling, known to exist, but little to gain as the levels are so close to white_max
"make_model": "Nikon D7000",
"dcraw_matrix": [ 7530,-1942,-255,-4318,11390,3362,-926,1694,7649 ], // matrix provided by Tanveer(tsk1979)
//"dcraw_matrix": [ 8198, -2239, -725, -4871, 12388, 2798, -1043, 2050, 7181 ], // DNG v13.2
// "dcraw_matrix": [ 8198, -2239, -725, -4871, 12388, 2798, -1043, 2050, 7181 ], // DNG v13.2
"ranges": {
// measured at ISO 100. ISO differences not measured, but known to exist
"white": [ 16300, 15700, 16300 ], // typical R 16383, G 15778, B 16383
@ -2187,8 +2204,8 @@ Camera constants:
{ // Quality B
"make_model": [ "Panasonic DC-LX100M2" ],
"dcraw_matrix": [ 11577, -4230, -1106, -3967, 12211, 1957, -759, 1762, 5610 ], // DNG v13.2
//"dcraw_matrix": [ 8585, -3127, -833, -4005, 12250, 1953, -650, 1494, 4862 ], // DNG v13.2 alternate
//"dcraw_matrix": [ 11577, -4230, -1106, -3967, 12211, 1957, -759, 1762, 5610 ], // DNG v13.2
"dcraw_matrix": [ 8585, -3127, -833, -4005, 12250, 1953, -650, 1494, 4862 ], // DNG v13.2 alternate
"raw_crop": [ 0, 0, 0, 0 ],
"ranges": { "black": 15 }
},
@ -2977,8 +2994,8 @@ Camera constants:
"dcraw_matrix": [ 6629,-1900,-483,-4618,12349,2550,-622,1381,6514 ], // DNG_v9.1.1 D65
"raw_crop": [ 0, 0, -36, 0 ], // full raw frame 8000x5320 - 36 rightmost columns are garbage
"ranges": { "black": 512, "white": 16300 },
// PDAF info provided by Horshack with the rawshack tool (http://testcams.com/rawshack/)
"pdaf_pattern" : [ 0,24,36,60,84,120,132,156,192,204,240,252,276,300,324,360,372,396,420 ],
// PDAF lines pattern detected from image provided by elite4jonny at https://github.com/Beep6581/RawTherapee/issues/6801.
"pdaf_pattern" : [ 0,24,36,60,84,120,132,156,192,204,240,252,276,300,324,360,372,396,420,444,480,492,504,540,564,576,612,636,660,696,720,732,756,780,804,840 ],
"pdaf_offset" : 31
},
@ -3123,6 +3140,15 @@ Camera constants:
"dcraw_matrix": [ 6344, -1612, -462, -4863, 12477, 2681, -865, 1786, 6899 ] // DNG
},
{ // Quality A
"make_model": "Sony ZV-1",
"dcraw_matrix": [ 8280, -2987, -703, -3531, 11645, 2133, -550, 1542, 5312 ], // DNG v15.2
"ranges": { "black": 800 }, // White level from EXIF.
"raw_crop": [ 0, 0, 5496, 3672 ],
"pdaf_pattern": [0, 24, 48, 72, 88, 120],
"pdaf_offset": 17
},
{ // Quality C, No proper color data, beta samples, frame set to official jpeg,
"make_model": [ "XIAOYI M1", "YI TECHNOLOGY M1" ],
"dcraw_matrix": [ 7158,-1911,-606,-3603,10669,2530,-659,1236,5530 ], // XIAO YI DNG D65

View File

@ -2895,7 +2895,7 @@ void Color::SkinSat (float lum, float hue, float chrom, float &satreduc)
*
* data (Munsell ==> Lab) obtained with WallKillcolor and http://www.cis.rit.edu/research/mcsl2/online/munsell.php
* each LUT give Hue in function of C, for each color Munsell and Luminance
* eg: _6PB20 : color Munsell 6PB for L=20 c=5 c=45 c=85 c=125..139 when possible: interpolation betwwen values
* eg: _6PB20 : color Munsell 6PB for L=20 c=5 c=45 c=85 c=125..139 when possible: interpolation between values
* no value for C<5 (gray)
* low memory footprint -- maximum: 195 LUTf * 140 values
* errors due to small number of samples in LUT and linearization are very low (1 to 2%)

File diff suppressed because it is too large Load Diff

View File

@ -56,13 +56,13 @@ private:
void temp2mul (double temp, double green, double equal, StandardObserver observer, double& rmul, double& gmul, double& bmul) const;
const static std::map<std::string,const double *> spectMap;
public:
static constexpr StandardObserver DEFAULT_OBSERVER = StandardObserver::TEN_DEGREES;
// static constexpr StandardObserver DEFAULT_OBSERVER = StandardObserver::TEN_DEGREES;
static constexpr StandardObserver DEFAULT_OBSERVER = StandardObserver::TWO_DEGREES;
ColorTemp () : temp(-1.), green(-1.), equal (1.), method("Custom") {}
explicit ColorTemp (double e) : temp(-1.), green(-1.), equal (e), method("Custom") {}
ColorTemp (double t, double g, double e, const std::string &m, StandardObserver o);
ColorTemp (double mulr, double mulg, double mulb, double e, StandardObserver observer);
static void tempxy(bool separated, int repref, float **Tx, float **Ty, float **Tz, float **Ta, float **Tb, float **TL, double *TX, double *TY, double *TZ, const procparams::WBParams & wbpar);
static void tempxy(bool separated, int repref, float **Tx, float **Ty, float **Tz, float **Ta, float **Tb, float **TL, double *TX, double *TY, double *TZ, const procparams::WBParams & wbpar, int ttbeg, int ttend, double &wpx, double &wpz, double *WPX, double *WPZ);
void update (const double rmul, const double gmul, const double bmul, const double equal, StandardObserver observer, const double tempBias=0.0)
{
@ -169,6 +169,8 @@ public:
static const double ColorchechGreE2_spect[97];
static const double ColorchechGreB3_spect[97];
static const double ColorchechCyaF3_spect[97];
static const double ColorchechCyaF3_spect2[97];
static const double ColorchechCyaF3_spect3[97];
static const double ColorchechPurD2_spect[97];
static const double ColorchechMagE3_spect[97];
static const double ColorchechSkiA138_13_14_spect[97];
@ -376,21 +378,259 @@ public:
static const double J570_NeuD17_spect[97];//neutral
static const double J570_NeuJ11_spect[97];//neutral
static const double J570_NeuL4_spect[97];//neutral
static const double J570_NeuN8_spect2[97];//neutral
static const double J570_NeuN9_spect2[97];//neutral
static const double J570_NeuO8_spect2[97];//neutral
static const double J570_NeuO11_spect2[97];//neutral
static const double J570_NeuD5_spect2[97];//neutral
static const double J570_NeuE11_spect2[97];//neutral
static const double J570_NeuK16_spect2[97];//neutral
static const double J570_NeuM3_spect2[97];//neutral
static const double J570_NeuN18_spect2[97];//neutral
static const double J570_NeuQ1_spect2[97];//neutral
static const double J570_NeuS7_spect2[97];//neutral
static const double J570_NeuV10_spect2[97];//neutral
static const double J570_NeuW18_spect2[97];//neutral
static const double J570_NeuZ14_spect2[97];//neutral
static const double J570_NeuC18_spect2[97];//neutral
static const double J570_NeuD17_spect2[97];//neutral
static const double J570_NeuJ11_spect2[97];//neutral
static const double J570_NeuL4_spect2[97];//neutral
static const double Colorlab_n72_n2_spect[97];
static const double Colorlab_10_n70_spect[97];
static const double Colorlab_10_n70_spect2[97];
static const double Colorlab_10_n70_spect3[97];
static const double Colorlab_10_n70_spect4[97];
static const double Colorlab_n33_n70_spect[97];
static const double Colorlab_n8_n74_spect[97];
static const double Colorlab_19_n69_spect[97];
static const double Colorlab_n80_10_spect[97];
static const double Colorlab_n80_26_spect[97];
static const double Colorlab_n80_5_9_5_9spect[97];
// static const double JDC468_greyc14_66_spect[97];
// static const double JDC468_greym13_325_spect[97];
// static const double JDC468_greyf26_156_spect[97];
// static const double Colorlab_n57_5_6_9spect[97];
/*
static const double JDC468_greyc14_66_spect[97];
static const double JDC468_greym13_325_spect[97];
static const double JDC468_greyf26_156_spect[97];
*/
static const double Colorlab_L61_110_110Rec2020spect[97];
static const double Colorlab_L63_120_m56Rec2020spect[97];
static const double Colorlab_L63_m50_m60Rec2020spect[97];
static const double Colorlab_L63_m120_80Rec2020spect[97];
static const double Colorlab_L42_110_m100Prospect[97];
static const double Colorlab_L42_m70_m100Prospect[97];
static const double Colorlab_L56_m120_90Prospect[97];
static const double Colorlab_L25_60_m120Prospect[97];
static const double Colorlab_L75_50_120Prospect[97];
static const double Colorlab_L75_m120_0Prospect[97];
static const double Colorlab_L22_2_1_3Prospect[97];
static const double Colorlab_L44_2_8_3_9spect[97];
static const double Colorlab_L44_2_8_3_9spect2[97];
static const double Colorlab_L95_2_3_15_6spect[97];
static const double Colorlab_L95_2_3_15_6spect2[97];
static const double Colorlab_L40_3_5_10_7spect[97];
static const double Colorlab_L40_3_5_10_7spect2[97];
static const double Colorlab_L40_3_5_10_7spect3[97];
static const double Colorlab_L34_1_8_1_9spect[97];
static const double Colorlab_L34_1_8_1_9spect2[97];
static const double Colorlab_L64_1_8_m1_9spect[97];
static const double Colorlab_L84_0_8_m1spect[97];
static const double Colorlab_L63_1_3_m2spect[97];
static const double Colorlab_L44_2_3_m3spect[97];
static const double Colorlab_L65_96_45spect[97];
static const double Colorlab_L52_47_57spect[97];
static const double Colorlab_L31_62_27spect[97];
static const double Colorlab_L79_m9_m28spect[97];
static const double Colorlab_L58_50_31spect[97];
static const double Colorlab_L31_m52_27spect[97];
static const double Colorlab_L44_2_2_m7_35spect[97];
static const double Colorlab_L47_m10_8_0_41spect[97];
static const double Colorlab_L32_4_8_m3_2spect[97];
static const double Colorlab_L57_m6_9_2_9spect[97];
static const double Colorlab_L33_2_4_m4_5spect[97];
static const double Colorlab_L35_11_65_m1_1spect[97];
static const double Colorlab_L52_m2_7_8_9spect[97];
static const double Colorlab_L32_7_m2_5spect[97];
static const double Colorlab_L32_3_4_m3_8spect[97];
static const double Colorlab_L50_m5_3_6_5spect[97];
static const double Colorlab_L44_3_96_m8_8spect[97];
static const double Colorlab_L34_3_6_m5_4spect[97];
static const double Colorlab_L31_5_9_m4spect[97];
static const double Colorlab_L35_3_4_m11spect[97];
static const double Colorlab_L31_4_5_m4_7spect[97];
static const double Colorlab_L35_4_8_m6_4spect[97];
static const double Colorlab_L95_10_7_m14_3spect[97];
static const double Colorlab_L36_34_m7_5spect[97];
static const double Colorlab_L37_59_2spect[97];
static const double Colorlab_L69_14_m9spect[97];
static const double Colorlab_L92_13_m16spect[97];
static const double Colorlab_L49_21_m12spect[97];
static const double Colorlab_L56_20_m15spect[97];
static const double Colorlab_L68_21_m19spect[97];
static const double Colorlab_L98_m2_m32spect[97];
static const double Colorlab_L98_m2_m32spect2[97];
static const double Colorlab_L41_m27_m16spect[97];
static const double Colorlab_L41_m27_m16spect2[97];
static const double Colorlab_L15_m9_4spect[97];
static const double Colorlab_L15_m9_4spect2[97];
static const double Colorlab_L11_m11_2spect[97];
static const double Colorlab_L14_m4_3spect[97];
static const double Colorlab_L41_38_24spect[97];
static const double Colorlab_L41_38_24spect2[97];
static const double Colorlab_L53_48_58spect[97];
static const double Colorlab_L53_48_58spect2[97];
static const double Colorlab_L70_44_86spect[97];
static const double Colorlab_L70_44_86spect2[97];
static const double Colorlab_L38_42_19spect[97];
static const double Colorlab_L38_42_19spect2[97];
static const double Colorlab_L60_63_85spect[97];
static const double Colorlab_L60_63_85spect2[97];
static const double Colorlab_L80_75_30spect[97];
static const double Colorlab_L80_75_30spect2[97];
static const double Colorlab_L28_m21_24spect[97];
static const double Colorlab_L28_m21_24spect2[97];
static const double Colorlab_L45_m33_47spect[97];
static const double Colorlab_L45_m33_47spect2[97];
static const double Colorlab_L26_m7_404spect[97];
static const double Colorlab_L34_m61_2spect[97];
static const double Colorlab_L32_m16_17spect[97];
static const double Colorlab_L30_m19_15spect[97];
static const double Colorlab_L30_m17_16spect[97];
static const double Colorlab_L35_m8_4spect[97];
static const double Colorlab_L37_m7_5spect[97];
static const double Colorlab_L45_m7_2spect[97];
static const double Colorlab_L40_m6_5spect[97];
static const double Colorlab_L46_m6_2spect[97];
static const double Colorlab_L48_m69_16spect[97];
static const double Colorlab_L51_89_53spect[97];
static const double Colorlab_L49_84_33spect[97];
static const double Colorlab_L59_m51_31spect[97];
static const double Colorlab_L48_m69_16spect2[97];
static const double Colorlab_L53_m71_6spect[97];
static const double Colorlab_L51_m89_53spect2[97];
static const double Colorlab_L49_84_33spect2[97];
static const double Colorlab_L36_m27_28spect[97];
static const double Colorlab_L36_m27_28spect2[97];
static const double Colorlab_L36_m27_28spect3[97];
static const double Colorlab_L63_16_71spect[97];
static const double Colorlab_L84_4_46spect[97];
static const double Colorlab_L84_4_46spect2[97];
static const double Colorlab_L75_m66_19spect[97];
static const double Colorlab_L75_m66_19spect2[97];
static const double Colorlab_L64_m82_m6spect[97];
static const double Colorlab_L64_m82_m6spect2[97];
static const double Colorlab_L66_m71_m17spect[97];
static const double Colorlab_L66_m71_m17spect2[97];
static const double Colorlab_L22_m8_m60spect[97];
static const double Colorlab_L22_m8_m60spect2[97];
static const double Colorlab_L15_m4_m42spect[97];
static const double Colorlab_L15_m4_m42spect2[97];
static const double Colorlab_L13_3_m23spect[97];
static const double Colorlab_L27_4_m90spect[97];
static const double Colorlab_L19_1_m29spect[97];
static const double Colorlab_L27_4_m90spect2[97];
static const double Colorlab_L16_0_m44spect[97];
static const double Colorlab_L16_0_m44spect2[97];
static const double Colorlab_L13_m3_m36spect[97];
static const double Colorlab_L13_m3_m36spect2[97];
static const double Colorlab_L31_m23_m60spect[97];
static const double Colorlab_L31_m23_m60spect2[97];
static const double Colorlab_L17_3_m40spect[97];
static const double Colorlab_L17_3_m40spect2[97];
static const double Colorlab_L17_3_m40spect3[97];
static const double Colorlab_L17_3_m40spect4[97];
static const double Colorlab_L17_3_m40spect5[97];
static const double Colorlab_L17_3_m40spect6[97];
static const double Colorlab_L21_9_m7spect[97];
static const double Colorlab_L78_4_m74spect[97];
static const double Colorlab_L31_m58_m66spect[97];
static const double Colorlab_L61_m11_m12spect[97];
static const double Colorlab_L61_m11_m12spect2[97];
static const double Colorlab_L29_1_m13spect[97];
static const double Colorlab_L29_1_m13spect2[97];
static const double Colorlab_L2_14_m1spect[97];
static const double Colorlab_L5_39_m7spect[97];
static const double Colorlab_L15_5_m13spect[97];
static const double Colorlab_L12_5_m6spect[97];
static const double Colorlab_L12_5_m6spect2[97];
static const double Colorlab_L37_m59_m24spect[97];
static const double Colorlab_L37_m59_m24spect2[97];
static const double Colorlab_L15_55_23spect[97];
static const double Colorlab_L11_m55_m11spect[97];
static const double Colorlab_L8_m10_m2spect[97];
static const double Colorlab_L14_m10_m7spect[97];
static const double Colorlab_L20_m16_m13spect[97];
static const double Colorlab_L8_m10_m2spect2[97];
static const double Colorlab_L14_m10_m7spect2[97];
static const double Colorlab_L20_m16_m13spect2[97];
static const double Colorlab_L6_m9_1spect[97];
static const double Colorlab_L20_m9_m10spect[97];
static const double Colorlab_L85_10_45spect[97];
static const double Colorlab_L90_m7_82spect[97];
static const double Colorlab_L95_2_18spect[97];
static const double Colorlab_L39_7_4spect[97];
static const double Colorlab_L39_4_1spect[97];
static const double Colorlab_L39_3_m1spect[97];
static const double Colorlab_L40_3_m2spect[97];
static const double Colorlab_L36_2_2spect[97];
static const double Colorlab_L39_7_4spect2[97];
static const double Colorlab_L39_4_1spect2[97];
static const double Colorlab_L39_3_m1spect2[97];
static const double Colorlab_L40_3_m2spect2[97];
static const double Colorlab_L36_2_2spect2[97];
static const double Colorlab_L40_4_m2spect[97];
static const double Colorlab_L41_1_m6spect[97];
static const double Colorlab_L40_4_m2spect2[97];
static const double Colorlab_L41_1_m6spect2[97];
static const double Colorlab_L41_12_14spect[97];
static const double Colorlab_L41_12_14spect2[97];
static const double Colorlab_L10_0_m22spect[97];
static const double Colorlab_L38_60_8spect[97];
static const double Colorlab_L49_85_39spect[97];
static const double Colorlab_L42_1_m18spect[97];
static const double Colorlab_L48_19_m25spect[97];
static const double Colorlab_L30_21_m25spect[97];
static const double Colorlab_L15_10_m15spect[97];
static const double Colorlab_L48_19_m25spect2[97];
static const double Colorlab_L30_21_m25spect2[97];
static const double Colorlab_L15_10_m15spect2[97];
static const double Colorlab_L60_26_m25spect[97];
static const double Colorlab_L40_26_m45spect[97];
static const double Colorlab_L40_26_m45spect2[97];
static const double Colorlab_L20_10_m45spect[97];
static const double Colorlab_L20_10_m45spect2[97];
static const double Colorlab_L20_10_m45spect3[97];
static const double ColorBlueSkyK3_spect2[97];
static const double ColorBlueSkyK9_spect2[97];
static const double ColorBlueSkyC4_spect2[97];
static const double ColorBlueSkyC14_spect2[97];
static const double ColorBlueSkyE4_spect2[97];
static const double ColorBlueSkyM1_spect2[97];
static const double ColorBlueSky2B1_spect2[97];
static const double ColorBlueSkyT7_spect2[97];
static const double ColorBlueSkyU19_spect2[97];
static const double ColorBlueSkyU2_spect2[97];
static const double Colorlab_L40_1_m40spect[97];
static const double Colorlab_L30_4_m30spect[97];
static const double Colorlab_L8_11_m25spect[97];
static const double Colorlab_L40_1_m40spect2[97];
static const double Colorlab_L30_4_m30spect2[97];
static const double Colorlab_L8_11_m25spect2[97];
static const double Colorlab_L26_m8_m25spect[97];
static const double Colorlab_L26_m8_m25spect2[97];
static const double Colorlab_L26_m8_m25spect3[97];
static const double Colorlab_L22_1_m42spect[97];
static const double Colorlab_L22_1_m42spect2[97];
static const double Colorlab_L22_1_m42spect3[97];
static const double Colorlab_L22_1_m42spect4[97];
static const double Colorlab_L27_m1_m47spect[97];
static const double Colorlab_L27_m1_m47spect2[97];
static const double Colorlab_L40_30_m30spect[97];
static const double Colorlab_L40_30_m30spect2[97];
static const double Colorlab_L40_20_m35spect[97];
static const double Colorlab_L40_20_m35spect2[97];
static void spectrum_to_xyz_daylight (double _m1, double _m2, double &x, double &y, double &z, const color_match_type &color_match);
static void spectrum_to_xyz_blackbody (double _temp, double &x, double &y, double &z, const color_match_type &color_match);
static void spectrum_to_xyz_preset (const double* spec_intens, double &x, double &y, double &z, const color_match_type &color_match);
@ -398,6 +638,9 @@ public:
static void spectrum_to_color_xyz_daylight (const double* spec_color, double _m1, double _m2, double &xx, double &yy, double &zz, const color_match_type &color_match);
static void spectrum_to_color_xyz_blackbody (const double* spec_color, double _temp, double &xx, double &yy, double &zz, const color_match_type &color_match);
static void spectrum_to_color_xyz_preset (const double* spec_color, const double* spec_intens, double &xx, double &yy, double &zz, const color_match_type &color_match);
static void spectrum_to_whitepoint_xyz_daylight (double _m1, double _m2, double &xx, double &yy, double &zz, const color_match_type &color_match);
static void spectrum_to_whitepoint_xyz_blackbody (double _temp, double &xx, double &yy, double &zz, const color_match_type &color_match);
static void whitepoint (double tempw, double &xx, double &yy, double &zz,const color_match_type &color_match);
};
}

View File

@ -430,6 +430,16 @@ std::map<std::string, std::string> getAliases(const Glib::ustring& profile_dir)
return res;
}
/**
* Returns a locale-independent case-insensitive collate key. Differs from
* Glib::ustring::casefold_collate_key() in that the Glib method may return
* different results depending on the current locale.
*/
std::string casefold_collate_key(const Glib::ustring &str)
{
return str.casefold().raw();
}
}
struct DCPProfileApplyState::Data {
@ -1831,7 +1841,7 @@ void DCPStore::init(const Glib::ustring& rt_profile_dir, bool loadAll)
&& lastdot <= sname.size() - 4
&& !sname.casefold().compare(lastdot, 4, ".dcp")
) {
file_std_profiles[sname.substr(0, lastdot).casefold_collate_key()] = fname; // They will be loaded and cached on demand
file_std_profiles[casefold_collate_key(sname.substr(0, lastdot))] = fname; // They will be loaded and cached on demand
}
} else {
// Directory
@ -1842,10 +1852,10 @@ void DCPStore::init(const Glib::ustring& rt_profile_dir, bool loadAll)
for (const auto& alias : getAliases(rt_profile_dir)) {
const Glib::ustring alias_name = Glib::ustring(alias.first).uppercase();
const std::map<std::string, Glib::ustring>::const_iterator real = file_std_profiles.find(Glib::ustring(alias.second).casefold_collate_key());
const std::map<std::string, Glib::ustring>::const_iterator real = file_std_profiles.find(casefold_collate_key(alias.second));
if (real != file_std_profiles.end()) {
file_std_profiles[alias_name.casefold_collate_key()] = real->second;
file_std_profiles[casefold_collate_key(alias_name)] = real->second;
}
}
}
@ -1892,7 +1902,7 @@ DCPProfile* DCPStore::getProfile(const Glib::ustring& filename) const
DCPProfile* DCPStore::getStdProfile(const Glib::ustring& requested_cam_short_name) const
{
const std::map<std::string, Glib::ustring>::const_iterator iter = file_std_profiles.find(requested_cam_short_name.casefold_collate_key());
const std::map<std::string, Glib::ustring>::const_iterator iter = file_std_profiles.find(casefold_collate_key(requested_cam_short_name));
if (iter != file_std_profiles.end()) {
return getProfile(iter->second);
}

View File

@ -4422,10 +4422,10 @@ void CLASS crop_masked_pixels()
}
} else {
if (height + top_margin > raw_height) {
top_margin = raw_height - height;
top_margin = raw_height - MIN(height, raw_height);
}
if (width + left_margin > raw_width) {
left_margin = raw_width - width;
left_margin = raw_width - MIN(width, raw_width);
}
#ifdef _OPENMP
#pragma omp parallel for
@ -6812,17 +6812,17 @@ guess_cfa_pc:
linear_table (len);
break;
case 50713: /* BlackLevelRepeatDim */
if (tiff_ifd[ifd].new_sub_file_type != 0) continue;
if (tiff_ifd[ifd].new_sub_file_type != 0) break;
cblack[4] = get2();
cblack[5] = get2();
if (cblack[4] * cblack[5] > sizeof cblack / sizeof *cblack - 6)
cblack[4] = cblack[5] = 1;
break;
case 61450:
if (tiff_ifd[ifd].new_sub_file_type != 0) continue;
if (tiff_ifd[ifd].new_sub_file_type != 0) break;
cblack[4] = cblack[5] = MIN(sqrt(len),64);
case 50714: /* BlackLevel */
if (tiff_ifd[ifd].new_sub_file_type != 0) continue;
if (tiff_ifd[ifd].new_sub_file_type != 0) break;
RT_blacklevel_from_constant = ThreeValBool::F;
//-----------------------------------------------------------------------------
// taken from LibRaw.
@ -8675,7 +8675,8 @@ void CLASS adobe_coeff (const char *make, const char *model)
{ "Olympus E-M5MarkII", 0, 0,
{ 9422,-3258,-711,-2655,10898,2015,-512,1354,5512 } },
{ "Olympus E-M5", 0, 0xfe1,
{ 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } },
{ 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } },//D65
// { 9033,-3597, 26,-2351, 9700, 3111, -181, 807, 5838} },//stDA
{ "Olympus PEN-F", 0, 0,
{ 9476,-3182,-765,-2613,10958,1893,-449,1315,5268 } },
{ "Olympus SH-2", 0, 0,
@ -9807,9 +9808,9 @@ void CLASS identify()
if (!strncasecmp (model, make, i) && model[i++] == ' ')
memmove (model, model+i, 64-i);
if (!strncmp (model,"FinePix ",8))
strcpy (model, model+8);
/* RT */ memmove (model, model+8, 64-8);
if (!strncmp (model,"Digital Camera ",15))
strcpy (model, model+15);
/* RT */ memmove (model, model+15, 64-15);
desc[511] = artist[63] = make[63] = model[63] = model2[63] = 0;
if (!is_raw) goto notraw;
@ -10138,8 +10139,8 @@ canon_a5:
width = raw_width = 5504;
height = raw_height = 3856;
}
top_margin = (raw_height - height) >> 2 << 1;
left_margin = (raw_width - width ) >> 2 << 1;
top_margin = (raw_height - MIN(height, raw_height)) >> 2 << 1;
left_margin = (raw_width - MIN(width, raw_width) ) >> 2 << 1;
if (width == 2848 || width == 3664) filters = 0x16161616;
if (width == 4032 || width == 4952 || width == 6032 || width == 8280) left_margin = 0;
if (width == 3328 && (width -= 66)) left_margin = 34;

View File

@ -18,6 +18,9 @@
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#include <glibmm/ustring.h>
#include <glibmm/timer.h>
#include "cieimage.h"
#include "color.h"
#include "curves.h"
@ -597,7 +600,6 @@ void Crop::update(int todo)
params.dirpyrDenoise.redchro = maxr;
params.dirpyrDenoise.bluechro = maxb;
parent->denoiseInfoStore.valid = true;
if (parent->adnListener) {
parent->adnListener->chromaChanged(params.dirpyrDenoise.chroma, params.dirpyrDenoise.redchro, params.dirpyrDenoise.bluechro);
}
@ -845,7 +847,7 @@ void Crop::update(int todo)
if ((todo & (M_AUTOEXP | M_RGBCURVE)) && params.locallab.enabled && !params.locallab.spots.empty()) {
//I made a little change here. Rather than have luminanceCurve (and others) use in/out lab images, we can do more if we copy right here.
parent->ipf.rgb2lab(*baseCrop, *laboCrop, params.icm.workingProfile);
@ -942,16 +944,7 @@ void Crop::update(int todo)
auto& locwavCurveden = parent->locwavCurveden;
auto& lmasklocal_curve2 = parent->lmasklocal_curve;
auto& loclmasCurve_wav = parent->loclmasCurve_wav;
// const int sizespot = (int)params.locallab.spots.size();
/* float *huerefp = nullptr;
huerefp = new float[sizespot];
float *chromarefp = nullptr;
chromarefp = new float[sizespot];
float *lumarefp = nullptr;
lumarefp = new float[sizespot];
float *fabrefp = nullptr;
fabrefp = new float[sizespot];
*/
for (int sp = 0; sp < (int)params.locallab.spots.size(); sp++) {
locRETgainCurve.Set(params.locallab.spots.at(sp).localTgaincurve);
locRETtransCurve.Set(params.locallab.spots.at(sp).localTtranscurve);
@ -1045,6 +1038,7 @@ void Crop::update(int todo)
if (black < 0. && params.locallab.spots.at(sp).expMethod == "pde" ) {
black *= 1.5;
}
std::vector<LocallabListener::locallabDenoiseLC> localldenoiselc;
double cont = params.locallab.spots.at(sp).contrast;
double huere, chromare, lumare, huerefblu, chromarefblu, lumarefblu, sobelre;
@ -1060,6 +1054,7 @@ void Crop::update(int todo)
float stdtme = parent->stdtms[sp];
float meanretie = parent->meanretis[sp];
float stdretie = parent->stdretis[sp];
float fab = 1.f;
float minCD;
float maxCD;
@ -1070,7 +1065,14 @@ void Crop::update(int todo)
float Tmin;
float Tmax;
int lastsav;
float highresi = 0.f;
float nresi = 0.f;
float highresi46 =0.f;
float nresi46 = 0.f;
float Lhighresi = 0.f;
float Lnresi = 0.f;
float Lhighresi46 = 0.f;
float Lnresi46 = 0.f;
/* huerefp[sp] = huere;
chromarefp[sp] = chromare;
lumarefp[sp] = lumare;
@ -1139,9 +1141,20 @@ 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);
// fabrefp[sp] = fab;
meantme, stdtme, meanretie, stdretie, fab,
highresi, nresi, highresi46, nresi46, Lhighresi, Lnresi, Lhighresi46, Lnresi46);
LocallabListener::locallabDenoiseLC denoiselc;
denoiselc.highres = highresi;
denoiselc.nres = nresi;
denoiselc.highres46 = highresi46;
denoiselc.nres46 = nresi46;
denoiselc.Lhighres = Lhighresi;
denoiselc.Lnres = Lnresi;
denoiselc.Lhighres46 = Lhighresi46;
denoiselc.Lnres46 = Lnresi46;
localldenoiselc.push_back(denoiselc);
if (parent->previewDeltaE || parent->locallColorMask == 5 || parent->locallvibMask == 4 || parent->locallExpMask == 5 || parent->locallSHMask == 4 || parent->localllcMask == 4 || parent->localltmMask == 4 || parent->localllogMask == 4 || parent->locallsoftMask == 6 || parent->localllcMask == 4 || parent->locallcieMask == 4) {
params.blackwhite.enabled = false;
params.colorToning.enabled = false;
@ -1171,6 +1184,20 @@ void Crop::update(int todo)
}
*/
denoiselc.highres = highresi;
denoiselc.nres = nresi;
denoiselc.highres46 = highresi46;
denoiselc.nres46 = nresi46;
denoiselc.Lhighres = Lhighresi;
denoiselc.Lnres = Lnresi;
denoiselc.Lhighres46 = Lhighresi46;
denoiselc.Lnres46 = Lnresi46;
localldenoiselc.push_back(denoiselc);
if (parent->locallListener) {
parent->locallListener->denChanged(localldenoiselc, params.locallab.selspot);
}
} else {
parent->ipf.Lab_Local(1, sp, (float**)shbuffer, labnCrop, labnCrop, reservCrop.get(), savenormtmCrop.get(), savenormretiCrop.get(), lastorigCrop.get(), fw, fh, cropx / skip, cropy / skip, skips(parent->fw, skip), skips(parent->fh, skip), skip, locRETgainCurve, locRETtransCurve,
@ -1226,8 +1253,11 @@ 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,
highresi, nresi, highresi46, nresi46, Lhighresi, Lnresi, Lhighresi46, Lnresi46);
}
if (sp + 1u < params.locallab.spots.size()) {
// do not copy for last spot as it is not needed anymore
lastorigCrop->CopyFrom(labnCrop);
@ -1735,6 +1765,11 @@ void Crop::freeAll()
shbuffer = nullptr;
}
if (shbuf_real) {
delete [] shbuf_real;
shbuf_real = nullptr;
}
PipetteBuffer::flush();
}

View File

@ -19,6 +19,7 @@
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <vector>
#include "gauss.h"
@ -1129,40 +1130,45 @@ template<class T> void gaussVertical (T** src, T** dst, const int W, const int H
// process 'numcols' columns for better usage of L1 cpu cache (especially faster for large values of H)
static const int numcols = 8;
double temp2[H][numcols] ALIGNED16;
std::vector<double> temp2(H * numcols);
double temp2Hm1[numcols], temp2H[numcols], temp2Hp1[numcols];
auto coord =
[](const int &x, const int &y) -> int {
return x * numcols + y;
};
#ifdef _OPENMP
#pragma omp for nowait
#endif
for (unsigned int i = 0; i < static_cast<unsigned>(std::max(0, W - numcols + 1)); i += numcols) {
for (int k = 0; k < numcols; k++) {
temp2[0][k] = B * src[0][i + k] + b1 * src[0][i + k] + b2 * src[0][i + k] + b3 * src[0][i + k];
temp2[1][k] = B * src[1][i + k] + b1 * temp2[0][k] + b2 * src[0][i + k] + b3 * src[0][i + k];
temp2[2][k] = B * src[2][i + k] + b1 * temp2[1][k] + b2 * temp2[0][k] + b3 * src[0][i + k];
temp2[coord(0, k)] = B * src[0][i + k] + b1 * src[0][i + k] + b2 * src[0][i + k] + b3 * src[0][i + k];
temp2[coord(1, k)] = B * src[1][i + k] + b1 * temp2[coord(0, k)] + b2 * src[0][i + k] + b3 * src[0][i + k];
temp2[coord(2, k)] = B * src[2][i + k] + b1 * temp2[coord(1, k)] + b2 * temp2[coord(0, k)] + b3 * src[0][i + k];
}
for (int j = 3; j < H; j++) {
for (int k = 0; k < numcols; k++) {
temp2[j][k] = B * src[j][i + k] + b1 * temp2[j - 1][k] + b2 * temp2[j - 2][k] + b3 * temp2[j - 3][k];
temp2[coord(j, k)] = B * src[j][i + k] + b1 * temp2[coord(j - 1, k)] + b2 * temp2[coord(j - 2, k)] + b3 * temp2[coord(j - 3, k)];
}
}
for (int k = 0; k < numcols; k++) {
temp2Hm1[k] = src[H - 1][i + k] + M[0][0] * (temp2[H - 1][k] - src[H - 1][i + k]) + M[0][1] * (temp2[H - 2][k] - src[H - 1][i + k]) + M[0][2] * (temp2[H - 3][k] - src[H - 1][i + k]);
temp2H[k] = src[H - 1][i + k] + M[1][0] * (temp2[H - 1][k] - src[H - 1][i + k]) + M[1][1] * (temp2[H - 2][k] - src[H - 1][i + k]) + M[1][2] * (temp2[H - 3][k] - src[H - 1][i + k]);
temp2Hp1[k] = src[H - 1][i + k] + M[2][0] * (temp2[H - 1][k] - src[H - 1][i + k]) + M[2][1] * (temp2[H - 2][k] - src[H - 1][i + k]) + M[2][2] * (temp2[H - 3][k] - src[H - 1][i + k]);
temp2Hm1[k] = src[H - 1][i + k] + M[0][0] * (temp2[coord(H - 1, k)] - src[H - 1][i + k]) + M[0][1] * (temp2[coord(H - 2, k)] - src[H - 1][i + k]) + M[0][2] * (temp2[coord(H - 3, k)] - src[H - 1][i + k]);
temp2H[k] = src[H - 1][i + k] + M[1][0] * (temp2[coord(H - 1, k)] - src[H - 1][i + k]) + M[1][1] * (temp2[coord(H - 2, k)] - src[H - 1][i + k]) + M[1][2] * (temp2[coord(H - 3, k)] - src[H - 1][i + k]);
temp2Hp1[k] = src[H - 1][i + k] + M[2][0] * (temp2[coord(H - 1, k)] - src[H - 1][i + k]) + M[2][1] * (temp2[coord(H - 2, k)] - src[H - 1][i + k]) + M[2][2] * (temp2[coord(H - 3, k)] - src[H - 1][i + k]);
}
for (int k = 0; k < numcols; k++) {
dst[H - 1][i + k] = temp2[H - 1][k] = temp2Hm1[k];
dst[H - 2][i + k] = temp2[H - 2][k] = B * temp2[H - 2][k] + b1 * temp2[H - 1][k] + b2 * temp2H[k] + b3 * temp2Hp1[k];
dst[H - 3][i + k] = temp2[H - 3][k] = B * temp2[H - 3][k] + b1 * temp2[H - 2][k] + b2 * temp2[H - 1][k] + b3 * temp2H[k];
dst[H - 1][i + k] = temp2[coord(H - 1, k)] = temp2Hm1[k];
dst[H - 2][i + k] = temp2[coord(H - 2, k)] = B * temp2[coord(H - 2, k)] + b1 * temp2[coord(H - 1, k)] + b2 * temp2H[k] + b3 * temp2Hp1[k];
dst[H - 3][i + k] = temp2[coord(H - 3, k)] = B * temp2[coord(H - 3, k)] + b1 * temp2[coord(H - 2, k)] + b2 * temp2[coord(H - 1, k)] + b3 * temp2H[k];
}
for (int j = H - 4; j >= 0; j--) {
for (int k = 0; k < numcols; k++) {
dst[j][i + k] = temp2[j][k] = B * temp2[j][k] + b1 * temp2[j + 1][k] + b2 * temp2[j + 2][k] + b3 * temp2[j + 3][k];
dst[j][i + k] = temp2[coord(j, k)] = B * temp2[coord(j, k)] + b1 * temp2[coord(j + 1, k)] + b2 * temp2[coord(j + 2, k)] + b3 * temp2[coord(j + 3, k)];
}
}
}
@ -1173,24 +1179,24 @@ template<class T> void gaussVertical (T** src, T** dst, const int W, const int H
// process remaining columns
for (int i = W - (W % numcols); i < W; i++) {
temp2[0][0] = B * src[0][i] + b1 * src[0][i] + b2 * src[0][i] + b3 * src[0][i];
temp2[1][0] = B * src[1][i] + b1 * temp2[0][0] + b2 * src[0][i] + b3 * src[0][i];
temp2[2][0] = B * src[2][i] + b1 * temp2[1][0] + b2 * temp2[0][0] + b3 * src[0][i];
temp2[coord(0, 0)] = B * src[0][i] + b1 * src[0][i] + b2 * src[0][i] + b3 * src[0][i];
temp2[coord(1, 0)] = B * src[1][i] + b1 * temp2[coord(0, 0)] + b2 * src[0][i] + b3 * src[0][i];
temp2[coord(2, 0)] = B * src[2][i] + b1 * temp2[coord(1, 0)] + b2 * temp2[coord(0, 0)] + b3 * src[0][i];
for (int j = 3; j < H; j++) {
temp2[j][0] = B * src[j][i] + b1 * temp2[j - 1][0] + b2 * temp2[j - 2][0] + b3 * temp2[j - 3][0];
temp2[coord(j, 0)] = B * src[j][i] + b1 * temp2[coord(j - 1, 0)] + b2 * temp2[coord(j - 2, 0)] + b3 * temp2[coord(j - 3, 0)];
}
double temp2Hm1 = src[H - 1][i] + M[0][0] * (temp2[H - 1][0] - src[H - 1][i]) + M[0][1] * (temp2[H - 2][0] - src[H - 1][i]) + M[0][2] * (temp2[H - 3][0] - src[H - 1][i]);
double temp2H = src[H - 1][i] + M[1][0] * (temp2[H - 1][0] - src[H - 1][i]) + M[1][1] * (temp2[H - 2][0] - src[H - 1][i]) + M[1][2] * (temp2[H - 3][0] - src[H - 1][i]);
double temp2Hp1 = src[H - 1][i] + M[2][0] * (temp2[H - 1][0] - src[H - 1][i]) + M[2][1] * (temp2[H - 2][0] - src[H - 1][i]) + M[2][2] * (temp2[H - 3][0] - src[H - 1][i]);
double temp2Hm1 = src[H - 1][i] + M[0][0] * (temp2[coord(H - 1, 0)] - src[H - 1][i]) + M[0][1] * (temp2[coord(H - 2, 0)] - src[H - 1][i]) + M[0][2] * (temp2[coord(H - 3, 0)] - src[H - 1][i]);
double temp2H = src[H - 1][i] + M[1][0] * (temp2[coord(H - 1, 0)] - src[H - 1][i]) + M[1][1] * (temp2[coord(H - 2, 0)] - src[H - 1][i]) + M[1][2] * (temp2[coord(H - 3, 0)] - src[H - 1][i]);
double temp2Hp1 = src[H - 1][i] + M[2][0] * (temp2[coord(H - 1, 0)] - src[H - 1][i]) + M[2][1] * (temp2[coord(H - 2, 0)] - src[H - 1][i]) + M[2][2] * (temp2[coord(H - 3, 0)] - src[H - 1][i]);
dst[H - 1][i] = temp2[H - 1][0] = temp2Hm1;
dst[H - 2][i] = temp2[H - 2][0] = B * temp2[H - 2][0] + b1 * temp2[H - 1][0] + b2 * temp2H + b3 * temp2Hp1;
dst[H - 3][i] = temp2[H - 3][0] = B * temp2[H - 3][0] + b1 * temp2[H - 2][0] + b2 * temp2[H - 1][0] + b3 * temp2H;
dst[H - 1][i] = temp2[coord(H - 1, 0)] = temp2Hm1;
dst[H - 2][i] = temp2[coord(H - 2, 0)] = B * temp2[coord(H - 2, 0)] + b1 * temp2[coord(H - 1, 0)] + b2 * temp2H + b3 * temp2Hp1;
dst[H - 3][i] = temp2[coord(H - 3, 0)] = B * temp2[coord(H - 3, 0)] + b1 * temp2[coord(H - 2, 0)] + b2 * temp2[coord(H - 1, 0)] + b3 * temp2H;
for (int j = H - 4; j >= 0; j--) {
dst[j][i] = temp2[j][0] = B * temp2[j][0] + b1 * temp2[j + 1][0] + b2 * temp2[j + 2][0] + b3 * temp2[j + 3][0];
dst[j][i] = temp2[coord(j, 0)] = B * temp2[coord(j, 0)] + b1 * temp2[coord(j + 1, 0)] + b2 * temp2[coord(j + 2, 0)] + b3 * temp2[coord(j + 3, 0)];
}
}
}
@ -1208,40 +1214,45 @@ template<class T> void gaussVerticaldiv (T** src, T** dst, T** divBuffer, const
// process 'numcols' columns for better usage of L1 cpu cache (especially faster for large values of H)
static const int numcols = 8;
double temp2[H][numcols] ALIGNED16;
std::vector<double> temp2(H * numcols);
double temp2Hm1[numcols], temp2H[numcols], temp2Hp1[numcols];
auto coord =
[](const int &x, const int &y) -> int {
return x * numcols + y;
};
#ifdef _OPENMP
#pragma omp for nowait
#endif
for (int i = 0; i < W - numcols + 1; i += numcols) {
for (int k = 0; k < numcols; k++) {
temp2[0][k] = B * src[0][i + k] + b1 * src[0][i + k] + b2 * src[0][i + k] + b3 * src[0][i + k];
temp2[1][k] = B * src[1][i + k] + b1 * temp2[0][k] + b2 * src[0][i + k] + b3 * src[0][i + k];
temp2[2][k] = B * src[2][i + k] + b1 * temp2[1][k] + b2 * temp2[0][k] + b3 * src[0][i + k];
temp2[coord(0, k)] = B * src[0][i + k] + b1 * src[0][i + k] + b2 * src[0][i + k] + b3 * src[0][i + k];
temp2[coord(1, k)] = B * src[1][i + k] + b1 * temp2[coord(0, k)] + b2 * src[0][i + k] + b3 * src[0][i + k];
temp2[coord(2, k)] = B * src[2][i + k] + b1 * temp2[coord(1, k)] + b2 * temp2[coord(0, k)] + b3 * src[0][i + k];
}
for (int j = 3; j < H; j++) {
for (int k = 0; k < numcols; k++) {
temp2[j][k] = B * src[j][i + k] + b1 * temp2[j - 1][k] + b2 * temp2[j - 2][k] + b3 * temp2[j - 3][k];
temp2[coord(j, k)] = B * src[j][i + k] + b1 * temp2[coord(j - 1, k)] + b2 * temp2[coord(j - 2, k)] + b3 * temp2[coord(j - 3, k)];
}
}
for (int k = 0; k < numcols; k++) {
temp2Hm1[k] = src[H - 1][i + k] + M[0][0] * (temp2[H - 1][k] - src[H - 1][i + k]) + M[0][1] * (temp2[H - 2][k] - src[H - 1][i + k]) + M[0][2] * (temp2[H - 3][k] - src[H - 1][i + k]);
temp2H[k] = src[H - 1][i + k] + M[1][0] * (temp2[H - 1][k] - src[H - 1][i + k]) + M[1][1] * (temp2[H - 2][k] - src[H - 1][i + k]) + M[1][2] * (temp2[H - 3][k] - src[H - 1][i + k]);
temp2Hp1[k] = src[H - 1][i + k] + M[2][0] * (temp2[H - 1][k] - src[H - 1][i + k]) + M[2][1] * (temp2[H - 2][k] - src[H - 1][i + k]) + M[2][2] * (temp2[H - 3][k] - src[H - 1][i + k]);
temp2Hm1[k] = src[H - 1][i + k] + M[0][0] * (temp2[coord(H - 1, k)] - src[H - 1][i + k]) + M[0][1] * (temp2[coord(H - 2, k)] - src[H - 1][i + k]) + M[0][2] * (temp2[coord(H - 3, k)] - src[H - 1][i + k]);
temp2H[k] = src[H - 1][i + k] + M[1][0] * (temp2[coord(H - 1, k)] - src[H - 1][i + k]) + M[1][1] * (temp2[coord(H - 2, k)] - src[H - 1][i + k]) + M[1][2] * (temp2[coord(H - 3, k)] - src[H - 1][i + k]);
temp2Hp1[k] = src[H - 1][i + k] + M[2][0] * (temp2[coord(H - 1, k)] - src[H - 1][i + k]) + M[2][1] * (temp2[coord(H - 2, k)] - src[H - 1][i + k]) + M[2][2] * (temp2[coord(H - 3, k)] - src[H - 1][i + k]);
}
for (int k = 0; k < numcols; k++) {
dst[H - 1][i + k] = rtengine::max(divBuffer[H - 1][i + k] / (temp2[H - 1][k] = temp2Hm1[k]), 0.0);
dst[H - 2][i + k] = rtengine::max(divBuffer[H - 2][i + k] / (temp2[H - 2][k] = B * temp2[H - 2][k] + b1 * temp2[H - 1][k] + b2 * temp2H[k] + b3 * temp2Hp1[k]), 0.0);
dst[H - 3][i + k] = rtengine::max(divBuffer[H - 3][i + k] / (temp2[H - 3][k] = B * temp2[H - 3][k] + b1 * temp2[H - 2][k] + b2 * temp2[H - 1][k] + b3 * temp2H[k]), 0.0);
dst[H - 1][i + k] = rtengine::max(divBuffer[H - 1][i + k] / (temp2[coord(H - 1, k)] = temp2Hm1[k]), 0.0);
dst[H - 2][i + k] = rtengine::max(divBuffer[H - 2][i + k] / (temp2[coord(H - 2, k)] = B * temp2[coord(H - 2, k)] + b1 * temp2[coord(H - 1, k)] + b2 * temp2H[k] + b3 * temp2Hp1[k]), 0.0);
dst[H - 3][i + k] = rtengine::max(divBuffer[H - 3][i + k] / (temp2[coord(H - 3, k)] = B * temp2[coord(H - 3, k)] + b1 * temp2[coord(H - 2, k)] + b2 * temp2[coord(H - 1, k)] + b3 * temp2H[k]), 0.0);
}
for (int j = H - 4; j >= 0; j--) {
for (int k = 0; k < numcols; k++) {
dst[j][i + k] = rtengine::max(divBuffer[j][i + k] / (temp2[j][k] = B * temp2[j][k] + b1 * temp2[j + 1][k] + b2 * temp2[j + 2][k] + b3 * temp2[j + 3][k]), 0.0);
dst[j][i + k] = rtengine::max(divBuffer[j][i + k] / (temp2[coord(j, k)] = B * temp2[coord(j, k)] + b1 * temp2[coord(j + 1, k)] + b2 * temp2[coord(j + 2, k)] + b3 * temp2[coord(j + 3, k)]), 0.0);
}
}
}
@ -1252,24 +1263,24 @@ template<class T> void gaussVerticaldiv (T** src, T** dst, T** divBuffer, const
// process remaining columns
for (int i = W - (W % numcols); i < W; i++) {
temp2[0][0] = B * src[0][i] + b1 * src[0][i] + b2 * src[0][i] + b3 * src[0][i];
temp2[1][0] = B * src[1][i] + b1 * temp2[0][0] + b2 * src[0][i] + b3 * src[0][i];
temp2[2][0] = B * src[2][i] + b1 * temp2[1][0] + b2 * temp2[0][0] + b3 * src[0][i];
temp2[coord(0, 0)] = B * src[0][i] + b1 * src[0][i] + b2 * src[0][i] + b3 * src[0][i];
temp2[coord(1, 0)] = B * src[1][i] + b1 * temp2[coord(0, 0)] + b2 * src[0][i] + b3 * src[0][i];
temp2[coord(2, 0)] = B * src[2][i] + b1 * temp2[coord(1, 0)] + b2 * temp2[coord(0, 0)] + b3 * src[0][i];
for (int j = 3; j < H; j++) {
temp2[j][0] = B * src[j][i] + b1 * temp2[j - 1][0] + b2 * temp2[j - 2][0] + b3 * temp2[j - 3][0];
temp2[coord(j, 0)] = B * src[j][i] + b1 * temp2[coord(j - 1, 0)] + b2 * temp2[coord(j - 2, 0)] + b3 * temp2[coord(j - 3, 0)];
}
double temp2Hm1 = src[H - 1][i] + M[0][0] * (temp2[H - 1][0] - src[H - 1][i]) + M[0][1] * (temp2[H - 2][0] - src[H - 1][i]) + M[0][2] * (temp2[H - 3][0] - src[H - 1][i]);
double temp2H = src[H - 1][i] + M[1][0] * (temp2[H - 1][0] - src[H - 1][i]) + M[1][1] * (temp2[H - 2][0] - src[H - 1][i]) + M[1][2] * (temp2[H - 3][0] - src[H - 1][i]);
double temp2Hp1 = src[H - 1][i] + M[2][0] * (temp2[H - 1][0] - src[H - 1][i]) + M[2][1] * (temp2[H - 2][0] - src[H - 1][i]) + M[2][2] * (temp2[H - 3][0] - src[H - 1][i]);
double temp2Hm1 = src[H - 1][i] + M[0][0] * (temp2[coord(H - 1, 0)] - src[H - 1][i]) + M[0][1] * (temp2[coord(H - 2, 0)] - src[H - 1][i]) + M[0][2] * (temp2[coord(H - 3, 0)] - src[H - 1][i]);
double temp2H = src[H - 1][i] + M[1][0] * (temp2[coord(H - 1, 0)] - src[H - 1][i]) + M[1][1] * (temp2[coord(H - 2, 0)] - src[H - 1][i]) + M[1][2] * (temp2[coord(H - 3, 0)] - src[H - 1][i]);
double temp2Hp1 = src[H - 1][i] + M[2][0] * (temp2[coord(H - 1, 0)] - src[H - 1][i]) + M[2][1] * (temp2[coord(H - 2, 0)] - src[H - 1][i]) + M[2][2] * (temp2[coord(H - 3, 0)] - src[H - 1][i]);
dst[H - 1][i] = rtengine::max(divBuffer[H - 1][i] / (temp2[H - 1][0] = temp2Hm1), 0.0);
dst[H - 2][i] = rtengine::max(divBuffer[H - 2][i] / (temp2[H - 2][0] = B * temp2[H - 2][0] + b1 * temp2[H - 1][0] + b2 * temp2H + b3 * temp2Hp1), 0.0);
dst[H - 3][i] = rtengine::max(divBuffer[H - 3][i] / (temp2[H - 3][0] = B * temp2[H - 3][0] + b1 * temp2[H - 2][0] + b2 * temp2[H - 1][0] + b3 * temp2H), 0.0);
dst[H - 1][i] = rtengine::max(divBuffer[H - 1][i] / (temp2[coord(H - 1, 0)] = temp2Hm1), 0.0);
dst[H - 2][i] = rtengine::max(divBuffer[H - 2][i] / (temp2[coord(H - 2, 0)] = B * temp2[coord(H - 2, 0)] + b1 * temp2[coord(H - 1, 0)] + b2 * temp2H + b3 * temp2Hp1), 0.0);
dst[H - 3][i] = rtengine::max(divBuffer[H - 3][i] / (temp2[coord(H - 3, 0)] = B * temp2[coord(H - 3, 0)] + b1 * temp2[coord(H - 2, 0)] + b2 * temp2[coord(H - 1, 0)] + b3 * temp2H), 0.0);
for (int j = H - 4; j >= 0; j--) {
dst[j][i] = rtengine::max(divBuffer[j][i] / (temp2[j][0] = B * temp2[j][0] + b1 * temp2[j + 1][0] + b2 * temp2[j + 2][0] + b3 * temp2[j + 3][0]), 0.0);
dst[j][i] = rtengine::max(divBuffer[j][i] / (temp2[coord(j, 0)] = B * temp2[coord(j, 0)] + b1 * temp2[coord(j + 1, 0)] + b2 * temp2[coord(j + 2, 0)] + b3 * temp2[coord(j + 3, 0)]), 0.0);
}
}
}
@ -1286,40 +1297,45 @@ template<class T> void gaussVerticalmult (T** src, T** dst, const int W, const i
// process 'numcols' columns for better usage of L1 cpu cache (especially faster for large values of H)
static const int numcols = 8;
double temp2[H][numcols] ALIGNED16;
std::vector<double> temp2(H * numcols);
double temp2Hm1[numcols], temp2H[numcols], temp2Hp1[numcols];
auto coord =
[](const int &x, const int &y) -> int {
return x * numcols + y;
};
#ifdef _OPENMP
#pragma omp for nowait
#endif
for (int i = 0; i < W - numcols + 1; i += numcols) {
for (int k = 0; k < numcols; k++) {
temp2[0][k] = B * src[0][i + k] + b1 * src[0][i + k] + b2 * src[0][i + k] + b3 * src[0][i + k];
temp2[1][k] = B * src[1][i + k] + b1 * temp2[0][k] + b2 * src[0][i + k] + b3 * src[0][i + k];
temp2[2][k] = B * src[2][i + k] + b1 * temp2[1][k] + b2 * temp2[0][k] + b3 * src[0][i + k];
temp2[coord(0, k)] = B * src[0][i + k] + b1 * src[0][i + k] + b2 * src[0][i + k] + b3 * src[0][i + k];
temp2[coord(1, k)] = B * src[1][i + k] + b1 * temp2[coord(0, k)] + b2 * src[0][i + k] + b3 * src[0][i + k];
temp2[coord(2, k)] = B * src[2][i + k] + b1 * temp2[coord(1, k)] + b2 * temp2[coord(0, k)] + b3 * src[0][i + k];
}
for (int j = 3; j < H; j++) {
for (int k = 0; k < numcols; k++) {
temp2[j][k] = B * src[j][i + k] + b1 * temp2[j - 1][k] + b2 * temp2[j - 2][k] + b3 * temp2[j - 3][k];
temp2[coord(j, k)] = B * src[j][i + k] + b1 * temp2[coord(j - 1, k)] + b2 * temp2[coord(j - 2, k)] + b3 * temp2[coord(j - 3, k)];
}
}
for (int k = 0; k < numcols; k++) {
temp2Hm1[k] = src[H - 1][i + k] + M[0][0] * (temp2[H - 1][k] - src[H - 1][i + k]) + M[0][1] * (temp2[H - 2][k] - src[H - 1][i + k]) + M[0][2] * (temp2[H - 3][k] - src[H - 1][i + k]);
temp2H[k] = src[H - 1][i + k] + M[1][0] * (temp2[H - 1][k] - src[H - 1][i + k]) + M[1][1] * (temp2[H - 2][k] - src[H - 1][i + k]) + M[1][2] * (temp2[H - 3][k] - src[H - 1][i + k]);
temp2Hp1[k] = src[H - 1][i + k] + M[2][0] * (temp2[H - 1][k] - src[H - 1][i + k]) + M[2][1] * (temp2[H - 2][k] - src[H - 1][i + k]) + M[2][2] * (temp2[H - 3][k] - src[H - 1][i + k]);
temp2Hm1[k] = src[H - 1][i + k] + M[0][0] * (temp2[coord(H - 1, k)] - src[H - 1][i + k]) + M[0][1] * (temp2[coord(H - 2, k)] - src[H - 1][i + k]) + M[0][2] * (temp2[coord(H - 3, k)] - src[H - 1][i + k]);
temp2H[k] = src[H - 1][i + k] + M[1][0] * (temp2[coord(H - 1, k)] - src[H - 1][i + k]) + M[1][1] * (temp2[coord(H - 2, k)] - src[H - 1][i + k]) + M[1][2] * (temp2[coord(H - 3, k)] - src[H - 1][i + k]);
temp2Hp1[k] = src[H - 1][i + k] + M[2][0] * (temp2[coord(H - 1, k)] - src[H - 1][i + k]) + M[2][1] * (temp2[coord(H - 2, k)] - src[H - 1][i + k]) + M[2][2] * (temp2[coord(H - 3, k)] - src[H - 1][i + k]);
}
for (int k = 0; k < numcols; k++) {
dst[H - 1][i + k] *= temp2[H - 1][k] = temp2Hm1[k];
dst[H - 2][i + k] *= temp2[H - 2][k] = B * temp2[H - 2][k] + b1 * temp2[H - 1][k] + b2 * temp2H[k] + b3 * temp2Hp1[k];
dst[H - 3][i + k] *= temp2[H - 3][k] = B * temp2[H - 3][k] + b1 * temp2[H - 2][k] + b2 * temp2[H - 1][k] + b3 * temp2H[k];
dst[H - 1][i + k] *= temp2[coord(H - 1, k)] = temp2Hm1[k];
dst[H - 2][i + k] *= temp2[coord(H - 2, k)] = B * temp2[coord(H - 2, k)] + b1 * temp2[coord(H - 1, k)] + b2 * temp2H[k] + b3 * temp2Hp1[k];
dst[H - 3][i + k] *= temp2[coord(H - 3, k)] = B * temp2[coord(H - 3, k)] + b1 * temp2[coord(H - 2, k)] + b2 * temp2[coord(H - 1, k)] + b3 * temp2H[k];
}
for (int j = H - 4; j >= 0; j--) {
for (int k = 0; k < numcols; k++) {
dst[j][i + k] *= (temp2[j][k] = B * temp2[j][k] + b1 * temp2[j + 1][k] + b2 * temp2[j + 2][k] + b3 * temp2[j + 3][k]);
dst[j][i + k] *= (temp2[coord(j, k)] = B * temp2[coord(j, k)] + b1 * temp2[coord(j + 1, k)] + b2 * temp2[coord(j + 2, k)] + b3 * temp2[coord(j + 3, k)]);
}
}
}
@ -1330,24 +1346,24 @@ template<class T> void gaussVerticalmult (T** src, T** dst, const int W, const i
// process remaining columns
for (int i = W - (W % numcols); i < W; i++) {
temp2[0][0] = B * src[0][i] + b1 * src[0][i] + b2 * src[0][i] + b3 * src[0][i];
temp2[1][0] = B * src[1][i] + b1 * temp2[0][0] + b2 * src[0][i] + b3 * src[0][i];
temp2[2][0] = B * src[2][i] + b1 * temp2[1][0] + b2 * temp2[0][0] + b3 * src[0][i];
temp2[coord(0, 0)] = B * src[0][i] + b1 * src[0][i] + b2 * src[0][i] + b3 * src[0][i];
temp2[coord(1, 0)] = B * src[1][i] + b1 * temp2[coord(0, 0)] + b2 * src[0][i] + b3 * src[0][i];
temp2[coord(2, 0)] = B * src[2][i] + b1 * temp2[coord(1, 0)] + b2 * temp2[coord(0, 0)] + b3 * src[0][i];
for (int j = 3; j < H; j++) {
temp2[j][0] = B * src[j][i] + b1 * temp2[j - 1][0] + b2 * temp2[j - 2][0] + b3 * temp2[j - 3][0];
temp2[coord(j, 0)] = B * src[j][i] + b1 * temp2[coord(j - 1, 0)] + b2 * temp2[coord(j - 2, 0)] + b3 * temp2[coord(j - 3, 0)];
}
double temp2Hm1 = src[H - 1][i] + M[0][0] * (temp2[H - 1][0] - src[H - 1][i]) + M[0][1] * (temp2[H - 2][0] - src[H - 1][i]) + M[0][2] * (temp2[H - 3][0] - src[H - 1][i]);
double temp2H = src[H - 1][i] + M[1][0] * (temp2[H - 1][0] - src[H - 1][i]) + M[1][1] * (temp2[H - 2][0] - src[H - 1][i]) + M[1][2] * (temp2[H - 3][0] - src[H - 1][i]);
double temp2Hp1 = src[H - 1][i] + M[2][0] * (temp2[H - 1][0] - src[H - 1][i]) + M[2][1] * (temp2[H - 2][0] - src[H - 1][i]) + M[2][2] * (temp2[H - 3][0] - src[H - 1][i]);
double temp2Hm1 = src[H - 1][i] + M[0][0] * (temp2[coord(H - 1, 0)] - src[H - 1][i]) + M[0][1] * (temp2[coord(H - 2, 0)] - src[H - 1][i]) + M[0][2] * (temp2[coord(H - 3, 0)] - src[H - 1][i]);
double temp2H = src[H - 1][i] + M[1][0] * (temp2[coord(H - 1, 0)] - src[H - 1][i]) + M[1][1] * (temp2[coord(H - 2, 0)] - src[H - 1][i]) + M[1][2] * (temp2[coord(H - 3, 0)] - src[H - 1][i]);
double temp2Hp1 = src[H - 1][i] + M[2][0] * (temp2[coord(H - 1, 0)] - src[H - 1][i]) + M[2][1] * (temp2[coord(H - 2, 0)] - src[H - 1][i]) + M[2][2] * (temp2[coord(H - 3, 0)] - src[H - 1][i]);
dst[H - 1][i] *= temp2[H - 1][0] = temp2Hm1;
dst[H - 2][i] *= temp2[H - 2][0] = B * temp2[H - 2][0] + b1 * temp2[H - 1][0] + b2 * temp2H + b3 * temp2Hp1;
dst[H - 3][i] *= temp2[H - 3][0] = B * temp2[H - 3][0] + b1 * temp2[H - 2][0] + b2 * temp2[H - 1][0] + b3 * temp2H;
dst[H - 1][i] *= temp2[coord(H - 1, 0)] = temp2Hm1;
dst[H - 2][i] *= temp2[coord(H - 2, 0)] = B * temp2[coord(H - 2, 0)] + b1 * temp2[coord(H - 1, 0)] + b2 * temp2H + b3 * temp2Hp1;
dst[H - 3][i] *= temp2[coord(H - 3, 0)] = B * temp2[coord(H - 3, 0)] + b1 * temp2[coord(H - 2, 0)] + b2 * temp2[coord(H - 1, 0)] + b3 * temp2H;
for (int j = H - 4; j >= 0; j--) {
dst[j][i] *= (temp2[j][0] = B * temp2[j][0] + b1 * temp2[j + 1][0] + b2 * temp2[j + 2][0] + b3 * temp2[j + 3][0]);
dst[j][i] *= (temp2[coord(j, 0)] = B * temp2[coord(j, 0)] + b1 * temp2[coord(j + 1, 0)] + b2 * temp2[coord(j + 2, 0)] + b3 * temp2[coord(j + 3, 0)]);
}
}
}

View File

@ -90,6 +90,19 @@ constexpr double ACESp0_xyz[3][3] = {
{0.00845768, -0.01403193, 1.21893277}
};
constexpr double xyz_jdcmax[3][3] = {//prim red 0.734702 0.265302 gr 0.021908 0.930288 bl 0.120593 0.001583
{0.8394088, 0.0163780, 0.1084133},
{0.3031122, 0.6954651, 0.0014227},
{-0.000048, 0.0357376, 0.7891671}
};
constexpr double jdcmax_xyz[3][3] = {
{1.1984508, -0.0197646, -0.1646037},
{-0.5223824, 1.4466349, 0.0691553},
{0.0236634, -0.0655113, 1.2640260}
};
constexpr double xyz_ACESp1[3][3] = {
{0.689697, 0.149944, 0.124559},
{0.284448, 0.671758 , 0.043794},

View File

@ -17,6 +17,7 @@
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#include <cstring>
#include <map>
#include <glibmm/ustring.h>
#include <glibmm/fileutils.h>
@ -195,9 +196,9 @@ cmsHPROFILE createXYZProfile()
return rtengine::ICCStore::createFromMatrix(mat, false, "XYZ");
}
const double(*wprofiles[])[3] = {xyz_sRGB, xyz_adobe, xyz_prophoto, xyz_widegamut, xyz_bruce, xyz_beta, xyz_best, xyz_rec2020, xyz_ACESp0, xyz_ACESp1};//
const double(*iwprofiles[])[3] = {sRGB_xyz, adobe_xyz, prophoto_xyz, widegamut_xyz, bruce_xyz, beta_xyz, best_xyz, rec2020_xyz, ACESp0_xyz, ACESp1_xyz};//
const char* wpnames[] = {"sRGB", "Adobe RGB", "ProPhoto", "WideGamut", "BruceRGB", "Beta RGB", "BestRGB", "Rec2020", "ACESp0", "ACESp1"};//
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"};//
//default = gamma inside profile
//BT709 g=2.22 s=4.5 sRGB g=2.4 s=12.92310
//linear g=1.0
@ -454,6 +455,8 @@ public:
if (loadAll) {
loadProfiles(profilesDir, &fileProfiles, &fileProfileContents, nullptr, false);
loadProfiles(userICCDir, &fileProfiles, &fileProfileContents, nullptr, false);
Glib::ustring user_output_icc_dir = Glib::build_filename(options.rtdir, "iccprofiles", "output");
loadProfiles(user_output_icc_dir, &fileProfiles, &fileProfileContents, nullptr, false);
}
// Input profiles

View File

@ -111,7 +111,7 @@ public:
{
rm = gm = bm = 1.0;
}
virtual void getAutoWBMultipliersitc(double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const procparams::WBParams & wbpar, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw, const procparams::ToneCurveParams &hrp)
virtual void getAutoWBMultipliersitc(bool extra, double &tempref, double &greenref, double &tempitc, double &greenitc, float &temp0, float &delta, int &bia, int &dread, int &kcam, int &nocam, float &studgood, float &minchrom, int &kmin, float &minhist, float &maxhist, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const procparams::WBParams & wbpar, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw, const procparams::ToneCurveParams &hrp)
{
rm = gm = bm = 1.0;
}
@ -1858,7 +1858,7 @@ class IImage : virtual public ImageDimensions
public:
virtual ~IImage() {}
/** @brief Returns a mutex that can is useful in many situations. No image operations shuold be performed without locking this mutex.
/** @brief Returns a mutex that can is useful in many situations. No image operations should be performed without locking this mutex.
* @return The mutex */
virtual MyMutex& getMutex () = 0;
virtual cmsHPROFILE getProfile () const = 0;

View File

@ -341,6 +341,38 @@ void Imagefloat::getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* imag
#endif
}
// From ART.
void Imagefloat::multiply(float factor, bool multithread)
{
const int W = width;
const int H = height;
#ifdef __SSE2__
vfloat vfactor = F2V(factor);
#endif
#ifdef _OPENMP
# pragma omp parallel for firstprivate(W, H) schedule(dynamic, 5) if (multithread)
#endif
for (int y = 0; y < H; y++) {
int x = 0;
#ifdef __SSE2__
for (; x < W-3; x += 4) {
vfloat rv = LVF(r(y, x));
vfloat gv = LVF(g(y, x));
vfloat bv = LVF(b(y, x));
STVF(r(y, x), rv * vfactor);
STVF(g(y, x), gv * vfactor);
STVF(b(y, x), bv * vfactor);
}
#endif
for (; x < W; ++x) {
r(y, x) *= factor;
g(y, x) *= factor;
b(y, x) *= factor;
}
}
}
void Imagefloat::normalizeFloat(float srcMinVal, float srcMaxVal)
{
@ -362,43 +394,15 @@ void Imagefloat::normalizeFloat(float srcMinVal, float srcMaxVal)
}
// convert values's range to [0;1] ; this method assumes that the input values's range is [0;65535]
void Imagefloat::normalizeFloatTo1()
void Imagefloat::normalizeFloatTo1(bool multithread)
{
const int w = width;
const int h = height;
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic, 5)
#endif
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
r(y, x) /= 65535.f;
g(y, x) /= 65535.f;
b(y, x) /= 65535.f;
}
}
multiply(1.f/65535.f, multithread);
}
// convert values's range to [0;65535 ; this method assumes that the input values's range is [0;1]
void Imagefloat::normalizeFloatTo65535()
void Imagefloat::normalizeFloatTo65535(bool multithread)
{
const int w = width;
const int h = height;
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic, 5)
#endif
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
r(y, x) *= 65535.f;
g(y, x) *= 65535.f;
b(y, x) *= 65535.f;
}
}
multiply(65535.f, multithread);
}
// Parallelized transformation; create transform with cmsFLAGS_NOCACHE!

View File

@ -213,9 +213,10 @@ public:
return (uint32_t) ((lsign << 31) | (exponent << 23) | mantissa);
}
void multiply(float factor, bool multithread);
void normalizeFloat(float srcMinVal, float srcMaxVal) override;
void normalizeFloatTo1();
void normalizeFloatTo65535();
void normalizeFloatTo1(bool multithread=true);
void normalizeFloatTo65535(bool multithread=true);
void ExecCMSTransform(cmsHTRANSFORM hTransform);
void ExecCMSTransform(cmsHTRANSFORM hTransform, const LabImage &labImage, int cx, int cy);
};

View File

@ -1033,7 +1033,7 @@ int ImageIO::savePNG (const Glib::ustring &fname, int bps) const
#if defined(PNG_SKIP_sRGB_CHECK_PROFILE) && defined(PNG_SET_OPTION_SUPPORTED)
png_set_option(png, PNG_SKIP_sRGB_CHECK_PROFILE, PNG_OPTION_ON);
#endif
png_infop info = png_create_info_struct(png);
if (!info) {
@ -1232,25 +1232,34 @@ int ImageIO::saveJPEG (const Glib::ustring &fname, int quality, int subSamp) con
jpeg_start_compress(&cinfo, TRUE);
// buffer for exif and iptc markers
unsigned char* buffer = new unsigned char[165535]; //FIXME: no buffer size check so it can be overflowed in createJPEGMarker() for large tags, and then software will crash
unsigned int size;
// buffer for exif marker
unsigned char* exifBuffer = nullptr;
unsigned int exifBufferSize = 0;
// assemble and write exif marker
if (exifRoot) {
int size = rtexif::ExifManager::createJPEGMarker (exifRoot, *exifChange, cinfo.image_width, cinfo.image_height, buffer);
rtexif::ExifManager::createJPEGMarker (exifRoot, *exifChange, cinfo.image_width, cinfo.image_height, exifBuffer, exifBufferSize);
if (size > 0 && size < 65530) {
jpeg_write_marker(&cinfo, JPEG_APP0 + 1, buffer, size);
if (exifBufferSize > 0 && exifBufferSize < 65530) {
jpeg_write_marker(&cinfo, JPEG_APP0 + 1, exifBuffer, exifBufferSize);
}
}
if (exifBuffer != nullptr) {
delete [] exifBuffer;
}
// buffer for iptc marker
unsigned char* iptcBuffer = new unsigned char[65535];
// assemble and write iptc marker
if (iptc) {
unsigned char* iptcdata;
unsigned int iptcSize;
bool error = false;
if (iptc_data_save (iptc, &iptcdata, &size)) {
if (iptc_data_save (iptc, &iptcdata, &iptcSize)) {
if (iptcdata) {
iptc_data_free_buf (iptc, iptcdata);
}
@ -1260,7 +1269,7 @@ int ImageIO::saveJPEG (const Glib::ustring &fname, int quality, int subSamp) con
int bytes = 0;
if (!error && (bytes = iptc_jpeg_ps3_save_iptc (nullptr, 0, iptcdata, size, buffer, 65532)) < 0) {
if (!error && (bytes = iptc_jpeg_ps3_save_iptc (nullptr, 0, iptcdata, iptcSize, iptcBuffer, 65532)) < 0) {
error = true;
}
@ -1269,11 +1278,11 @@ int ImageIO::saveJPEG (const Glib::ustring &fname, int quality, int subSamp) con
}
if (!error) {
jpeg_write_marker(&cinfo, JPEG_APP0 + 13, buffer, bytes);
jpeg_write_marker(&cinfo, JPEG_APP0 + 13, iptcBuffer, bytes);
}
}
delete [] buffer;
delete [] iptcBuffer;
// write icc profile to the output
if (profileData) {

View File

@ -117,10 +117,10 @@ public:
virtual void convertColorSpace (Imagefloat* image, const procparams::ColorManagementParams &cmp, const ColorTemp &wb) = 0; // DIRTY HACK: this method is derived in rawimagesource and strimagesource, but (...,RAWParams raw) will be used ONLY for raw images
virtual void getAutoWBMultipliers (double &rm, double &gm, double &bm) = 0;
virtual void getAutoWBMultipliersitc(double &tempref, double &greenref, double &tempitc, double & greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const procparams::WBParams & wbpar, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw, const procparams::ToneCurveParams &hrp) = 0;
virtual void getAutoWBMultipliersitc(bool extra, double &tempref, double &greenref, double &tempitc, double & greenitc, float &temp0, float &delta, int &bia, int &dread, int &kcam, int &nocam, float &studgood, float &minchrom, int &kmin, float &minhist, float &maxhist, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const procparams::WBParams & wbpar, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw, const procparams::ToneCurveParams &hrp) = 0;
virtual ColorTemp getWB () const = 0;
virtual ColorTemp getSpotWB (std::vector<Coord2D> &red, std::vector<Coord2D> &green, std::vector<Coord2D> &blue, int tran, double equal, StandardObserver observer) = 0;
virtual void WBauto(double &tempref, double &greenref, array2D<float> &redloc, array2D<float> &greenloc, array2D<float> &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, double &tempitc, double &greenitc, float &studgood, bool &twotimes, const procparams::WBParams & wbpar, int begx, int begy, int yEn, int xEn, int cx, int cy, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw, const procparams::ToneCurveParams &hrp) = 0;
virtual void WBauto(bool extra, double &tempref, double &greenref, array2D<float> &redloc, array2D<float> &greenloc, array2D<float> &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) = 0;
virtual void getrgbloc(int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, const procparams::WBParams & wbpar) = 0;
virtual double getDefGain () const

File diff suppressed because it is too large Load Diff

View File

@ -74,6 +74,7 @@ protected:
ImageSource* imgsrc;
ColorTemp currWB;
ColorTemp currWBcust;
ColorTemp autoWB;
ColorTemp currWBloc;
ColorTemp autoWBloc;
@ -365,6 +366,7 @@ protected:
std::vector<float> stdtms;
std::vector<float> meanretis;
std::vector<float> stdretis;
bool lastspotdup;
bool previewDeltaE;
int locallColorMask;

View File

@ -1979,11 +1979,13 @@ void ImProcFunctions::rgbProc(Imagefloat* working, LabImage* lab, PipetteBuffer
stop.reset(new StopWatch("rgb processing"));
}
Imagefloat *tmpImage = nullptr;
const bool split_tiled_parts_1_2 = params->toneEqualizer.enabled;
std::unique_ptr<Imagefloat> tmpImage;
Imagefloat* editImgFloat = nullptr;
PlanarWhateverData<float>* editWhatever = nullptr;
EditUniqueID editID = pipetteBuffer ? pipetteBuffer->getEditID() : EUID_None;
EditUniqueID editID = pipetteBuffer && pipetteBuffer->bufferCreated() ? pipetteBuffer->getEditID() : EUID_None;
if (editID != EUID_None) {
switch (pipetteBuffer->getDataProvider()->getCurrSubscriber()->getPipetteBufferType()) {
@ -2139,6 +2141,7 @@ void ImProcFunctions::rgbProc(Imagefloat* working, LabImage* lab, PipetteBuffer
const float comp = (max(0.0, expcomp) + 1.0) * hlcompr / 100.0;
const float shoulder = ((65536.f / max(1.0f, exp_scale)) * (hlcomprthresh / 200.f)) + 0.1f;
const float hlrange = 65536.f - shoulder;
const int tone_curve_black = params->toneCurve.black;
const bool isProPhoto = (params->icm.workingProfile == "ProPhoto");
// extracting data from 'params' to avoid cache flush (to be confirmed)
ToneCurveMode curveMode = params->toneCurve.curveMode;
@ -2247,8 +2250,8 @@ void ImProcFunctions::rgbProc(Imagefloat* working, LabImage* lab, PipetteBuffer
}
bool hasgammabw = gammabwr != 1.f || gammabwg != 1.f || gammabwb != 1.f;
if (hasColorToning || blackwhite || (params->dirpyrequalizer.cbdlMethod == "bef" && params->dirpyrequalizer.enabled)) {
tmpImage = new Imagefloat(working->getWidth(), working->getHeight());
if (hasColorToning || blackwhite || (params->dirpyrequalizer.cbdlMethod == "bef" && params->dirpyrequalizer.enabled) || split_tiled_parts_1_2) {
tmpImage.reset(new Imagefloat(working->getWidth(), working->getHeight()));
}
// For tonecurve histogram
@ -2263,9 +2266,53 @@ void ImProcFunctions::rgbProc(Imagefloat* working, LabImage* lab, PipetteBuffer
// For tonecurve histogram
const float lumimulf[3] = {static_cast<float>(lumimul[0]), static_cast<float>(lumimul[1]), static_cast<float>(lumimul[2])};
#define TS 112
const auto tiled_part_1 =
[working,
mixchannels,
&hltonecurve, &shtonecurve,
chMixRR, chMixRG, chMixRB,
chMixGR, chMixGG, chMixGB,
chMixBR, chMixBG, chMixBB,
exp_scale, comp, hlrange, tone_curve_black](
int istart, int jstart, int tH, int tW,
float *rtemp, float *gtemp, float *btemp) {
for (int i = istart, ti = 0; i < tH; i++, ti++) {
for (int j = jstart, tj = 0; j < tW; j++, tj++) {
rtemp[ti * TS + tj] = working->r(i, j);
gtemp[ti * TS + tj] = working->g(i, j);
btemp[ti * TS + tj] = working->b(i, j);
}
}
if (mixchannels) {
for (int i = istart, ti = 0; i < tH; i++, ti++) {
for (int j = jstart, tj = 0; j < tW; j++, tj++) {
float r = rtemp[ti * TS + tj];
float g = gtemp[ti * TS + tj];
float b = btemp[ti * TS + tj];
// if (i==100 & j==100) printf("rgbProc input R= %f G= %f B= %f \n",r,g,b);
float rmix = (r * chMixRR + g * chMixRG + b * chMixRB) / 100.f;
float gmix = (r * chMixGR + g * chMixGG + b * chMixGB) / 100.f;
float bmix = (r * chMixBR + g * chMixBG + b * chMixBB) / 100.f;
rtemp[ti * TS + tj] = rmix;
gtemp[ti * TS + tj] = gmix;
btemp[ti * TS + tj] = bmix;
}
}
}
highlightToneCurve(hltonecurve, rtemp, gtemp, btemp, istart, tH, jstart, tW, TS, exp_scale, comp, hlrange);
if (tone_curve_black != 0) {
shadowToneCurve(shtonecurve, rtemp, gtemp, btemp, istart, tH, jstart, tW, TS);
}
};
#ifdef _OPENMP
#pragma omp parallel if (multiThread)
#endif
@ -2316,6 +2363,41 @@ void ImProcFunctions::rgbProc(Imagefloat* working, LabImage* lab, PipetteBuffer
histToneCurveThr.clear();
}
if (split_tiled_parts_1_2) {
#ifdef _OPENMP
#pragma omp for schedule(dynamic, chunkSize) collapse(2)
#endif
for (int ii = 0; ii < working->getHeight(); ii += TS) {
for (int jj = 0; jj < working->getWidth(); jj += TS) {
istart = ii;
jstart = jj;
tH = min(ii + TS, working->getHeight());
tW = min(jj + TS, working->getWidth());
tiled_part_1(istart, jstart, tH, tW, rtemp, gtemp, btemp);
// Copy tile to image.
for (int i = istart, ti = 0; i < tH; i++, ti++) {
for (int j = jstart, tj = 0; j < tW; j++, tj++) {
tmpImage->r(i, j) = rtemp[ti * TS + tj];
tmpImage->g(i, j) = gtemp[ti * TS + tj];
tmpImage->b(i, j) = btemp[ti * TS + tj];
}
}
}
}
}
#ifdef _OPENMP
#pragma omp single
#endif
if (params->toneEqualizer.enabled) {
toneEqualizer(tmpImage.get());
}
#ifdef _OPENMP
#pragma omp for schedule(dynamic, chunkSize) collapse(2)
#endif
@ -2327,38 +2409,16 @@ void ImProcFunctions::rgbProc(Imagefloat* working, LabImage* lab, PipetteBuffer
tH = min(ii + TS, working->getHeight());
tW = min(jj + TS, working->getWidth());
for (int i = istart, ti = 0; i < tH; i++, ti++) {
for (int j = jstart, tj = 0; j < tW; j++, tj++) {
rtemp[ti * TS + tj] = working->r(i, j);
gtemp[ti * TS + tj] = working->g(i, j);
btemp[ti * TS + tj] = working->b(i, j);
}
}
if (mixchannels) {
if (split_tiled_parts_1_2) {
for (int i = istart, ti = 0; i < tH; i++, ti++) {
for (int j = jstart, tj = 0; j < tW; j++, tj++) {
float r = rtemp[ti * TS + tj];
float g = gtemp[ti * TS + tj];
float b = btemp[ti * TS + tj];
//if (i==100 & j==100) printf("rgbProc input R= %f G= %f B= %f \n",r,g,b);
float rmix = (r * chMixRR + g * chMixRG + b * chMixRB) / 100.f;
float gmix = (r * chMixGR + g * chMixGG + b * chMixGB) / 100.f;
float bmix = (r * chMixBR + g * chMixBG + b * chMixBB) / 100.f;
rtemp[ti * TS + tj] = rmix;
gtemp[ti * TS + tj] = gmix;
btemp[ti * TS + tj] = bmix;
rtemp[ti * TS + tj] = tmpImage->r(i, j);
gtemp[ti * TS + tj] = tmpImage->g(i, j);
btemp[ti * TS + tj] = tmpImage->b(i, j);
}
}
}
highlightToneCurve(hltonecurve, rtemp, gtemp, btemp, istart, tH, jstart, tW, TS, exp_scale, comp, hlrange);
if (params->toneCurve.black != 0.0) {
shadowToneCurve(shtonecurve, rtemp, gtemp, btemp, istart, tH, jstart, tW, TS);
} else {
tiled_part_1(istart, jstart, tH, tW, rtemp, gtemp, btemp);
}
if (dcpProf) {
@ -3509,10 +3569,6 @@ void ImProcFunctions::rgbProc(Imagefloat* working, LabImage* lab, PipetteBuffer
}
if (tmpImage) {
delete tmpImage;
}
if (hCurveEnabled) {
delete hCurve;
}
@ -4176,9 +4232,6 @@ void ImProcFunctions::chromiLuminanceCurve(PipetteBuffer *pipetteBuffer, int pW,
}
const float histLFactor = pW != 1 ? histLCurve.getSize() / 100.f : 1.f;
const float histCFactor = pW != 1 ? histCCurve.getSize() / 48000.f : 1.f;
float adjustr = 1.0f;
// if(params->labCurve.avoidclip ){
@ -4200,6 +4253,9 @@ void ImProcFunctions::chromiLuminanceCurve(PipetteBuffer *pipetteBuffer, int pW,
adjustr = 1.8f;
}
const float histLFactor = pW != 1 ? histLCurve.getSize() / 100.f : 1.f;
const float histCFactor = pW != 1 ? histCCurve.getSize() * adjustr / 65536.f : 1.f;
// reference to the params structure has to be done outside of the parallelization to avoid CPU cache problem
const bool highlight = params->toneCurve.hrenabled; //Get the value if "highlight reconstruction" is activated
const int chromaticity = params->labCurve.chromaticity;
@ -4359,11 +4415,11 @@ void ImProcFunctions::chromiLuminanceCurve(PipetteBuffer *pipetteBuffer, int pW,
if (editPipette) {
if (editID == EUID_Lab_aCurve) { // Lab a pipette
float chromapipa = lold->a[i][j] + (32768.f * 1.28f);
editWhatever->v(i, j) = LIM01<float> ((chromapipa) / (65536.f * 1.28f));
float chromapipa = lold->a[i][j] + 32768.f;
editWhatever->v(i, j) = LIM01<float> ((chromapipa) / (65536.f));
} else if (editID == EUID_Lab_bCurve) { //Lab b pipette
float chromapipb = lold->b[i][j] + (32768.f * 1.28f);
editWhatever->v(i, j) = LIM01<float> ((chromapipb) / (65536.f * 1.28f));
float chromapipb = lold->b[i][j] + 32768.f;
editWhatever->v(i, j) = LIM01<float> ((chromapipb) / (65536.f));
}
}
@ -4602,7 +4658,7 @@ void ImProcFunctions::chromiLuminanceCurve(PipetteBuffer *pipetteBuffer, int pW,
// I have placed C=f(C) after all C treatments to assure maximum amplitude of "C"
if (editPipette && editID == EUID_Lab_CCurve) {
float chromapip = sqrt(SQR(atmp) + SQR(btmp) + 0.001f);
editWhatever->v(i, j) = LIM01<float> ((chromapip) / (48000.f));
editWhatever->v(i, j) = LIM01<float> ((chromapip) / (65536.f / adjustr));
}//Lab C=f(C) pipette
if (ccut) {
@ -4669,7 +4725,7 @@ void ImProcFunctions::chromiLuminanceCurve(PipetteBuffer *pipetteBuffer, int pW,
if (editPipette && editID == EUID_Lab_LCCurve) {
float chromapiplc = sqrt(SQR(atmp) + SQR(btmp) + 0.001f);
editWhatever->v(i, j) = LIM01<float> ((chromapiplc) / (48000.f));
editWhatever->v(i, j) = LIM01<float> ((chromapiplc) / (65536.f / adjustr));
}//Lab L=f(C) pipette
@ -5667,6 +5723,11 @@ void ImProcFunctions::rgb2lab(const Imagefloat &src, LabImage &dst, const Glib::
}
void ImProcFunctions::rgb2lab(const Image8 &src, int x, int y, int w, int h, float L[], float a[], float b[], const procparams::ColorManagementParams &icm, bool consider_histogram_settings) const
{
rgb2lab(src, x, y, w, h, L, a, b, icm, consider_histogram_settings, multiThread);
}
void ImProcFunctions::rgb2lab(const Image8 &src, int x, int y, int w, int h, float L[], float a[], float b[], const procparams::ColorManagementParams &icm, bool consider_histogram_settings, bool multiThread)
{
// Adapted from ImProcFunctions::lab2rgb
const int src_width = src.getWidth();
@ -5779,6 +5840,21 @@ void ImProcFunctions::rgb2lab(const Image8 &src, int x, int y, int w, int h, flo
}
}
void ImProcFunctions::rgb2lab(std::uint8_t red, std::uint8_t green, std::uint8_t blue, float &L, float &a, float &b, const procparams::ColorManagementParams &icm, bool consider_histogram_settings)
{
float l_channel[1];
float a_channel[1];
float b_channel[1];
rtengine::Image8 buf(1, 1);
buf.r(0, 0) = red;
buf.g(0, 0) = green;
buf.b(0, 0) = blue;
ImProcFunctions::rgb2lab(buf, 0, 0, 1, 1, l_channel, a_channel, b_channel, icm, consider_histogram_settings, false);
L = l_channel[0];
a = a_channel[0];
b = b_channel[0];
}
void ImProcFunctions::lab2rgb(const LabImage &src, Imagefloat &dst, const Glib::ustring &workingSpace)
{
TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix(workingSpace);

View File

@ -97,6 +97,7 @@ struct LocalContrastParams;
struct LocallabParams;
struct SharpeningParams;
struct SoftLightParams;
struct ToneEqualizerParams;
struct VibranceParams;
struct VignettingParams;
struct WaveletParams;
@ -116,6 +117,7 @@ class ImProcFunctions
bool multiThread;
void calcVignettingParams(int oW, int oH, const procparams::VignettingParams& vignetting, double &w2, double &h2, double& maxRadius, double &v, double &b, double &mul);
static void rgb2lab(const Image8 &src, int x, int y, int w, int h, float L[], float a[], float b[], const procparams::ColorManagementParams &icm, bool consider_histogram_settings, bool multithread);
void transformLuminanceOnly(Imagefloat* original, Imagefloat* transformed, int cx, int cy, int oW, int oH, int fW, int fH);
void transformGeneral(bool highQuality, Imagefloat *original, Imagefloat *transformed, int cx, int cy, int sx, int sy, int oW, int oH, int fW, int fH, const LensCorrection *pLCPMap, bool useOriginalBuffer);
@ -360,7 +362,8 @@ 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 &highresi, float &nresi, float &highresi46, float &nresi46, float &Lhighresi, float &Lnresi, float &Lhighresi46, float &Lnresi46);
void addGaNoise(LabImage *lab, LabImage *dst, const float mean, const float variance, const int sk);
void BlurNoise_Localold(int call, const struct local_params& lp, LabImage* original, LabImage* transformed, const LabImage* const tmp1, int cx, int cy);
@ -399,7 +402,8 @@ enum class BlurType {
void DeNoise_Local(int call, const struct local_params& lp, LabImage* originalmask, int levred, float hueref, float lumaref, float chromaref, LabImage* original, LabImage* transformed, const LabImage &tmp1, int cx, int cy, int sk);
void DeNoise_Local2(const struct local_params& lp, LabImage* originalmask, int levred, float hueref, float lumaref, float chromaref, LabImage* original, LabImage* transformed, const LabImage &tmp1, int cx, int cy, int sk);
void DeNoise(int call, float * slidL, float * slida, float * slidb, 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);
void DeNoise(int call, int aut, bool noiscfactiv, const struct local_params& lp, LabImage* originalmaskbl, LabImage * bufmaskblurbl, int levred, float huerefblur, float lumarefblur, float chromarefblur, LabImage* original, LabImage* transformed,
int cx, int cy, int sk, const LocwavCurve& locwavCurvehue, bool locwavhueutili, float& highresi, float& nresi, float& highresi46, float& nresi46, float& Lhighresi, float& Lnresi, float& Lhighresi46, float& Lnresi46);
void fftw_denoise(int sk, int GW, int GH, int max_numblox_W, int min_numblox_W, float **tmp1, array2D<float> *Lin, int numThreads, const struct local_params & lp, int chrom);
@ -436,7 +440,7 @@ enum class BlurType {
void Sigma(const float* HH_Coeffs, int datalen, float averagePlus, float averageNeg, float &sigmaPlus, float &sigmaNeg, int numThreads);
void calckoe(const float* WavCoeffs_LL, float gradw, float tloww, float *koeLi, int level, int W_L, int H_L, float edd, float &maxkoeLi, float **tmC, bool multiThread = false);
void Median_Denoise(float **src, float **dst, int width, int height, Median medianType, int iterations, int numThreads, float **buffer = nullptr);
static void Median_Denoise(float **src, float **dst, int width, int height, Median medianType, int iterations, int numThreads, float **buffer = nullptr);
void Median_Denoise(float **src, float **dst, float upperBound, int width, int height, Median medianType, int iterations, int numThreads, float **buffer = nullptr);
void RGB_denoise(int kall, Imagefloat * src, Imagefloat * dst, Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, const NoiseCurve & noiseLCurve, const NoiseCurve & noiseCCurve, float &nresi, float &highresi);
void RGB_denoise_infoGamCurve(const procparams::DirPyrDenoiseParams & dnparams, const bool isRAW, LUTf &gamcurve, float &gam, float &gamthresh, float &gamslope);
@ -462,7 +466,7 @@ enum class BlurType {
void ShrinkAll_info(const float* const* WavCoeffs_a, const float* const* WavCoeffs_b,
int W_ab, int H_ab, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, int schoice, int lvl, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc,
float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb);
void Noise_residualAB(const wavelet_decomposition &WaveletCoeffs_ab, float &chresid, float &chmaxresid, bool denoiseMethodRgb);
void Noise_residualAB(const wavelet_decomposition &WaveletCoeffs_ab, float &chresid, float &chmaxresid, bool denoiseMethodRgb, int beg, int end);
void calcautodn_info(float &chaut, float &delta, int Nb, int levaut, float maxmax, float lumema, float chromina, int mode, int lissage, float redyel, float skinc, float nsknc);
float Mad(const float * DataList, int datalen);
float MadRgb(const float * DataList, int datalen);
@ -491,12 +495,14 @@ enum class BlurType {
void colorToningLabGrid(LabImage *lab, int xstart, int xend, int ystart, int yend, bool MultiThread);
//void shadowsHighlights(LabImage *lab);
void shadowsHighlights(LabImage *lab, bool ena, int labmode, int hightli, int shado, int rad, int scal, int hltonal, int shtonal);
void toneEqualizer(Imagefloat *rgb);
void toneEqualizer(Imagefloat *rgb, const procparams::ToneEqualizerParams &params, const Glib::ustring &workingProfile, double scale, bool multiThread);
void softLight(LabImage *lab, const procparams::SoftLightParams &softLightParams);
void labColorCorrectionRegions(LabImage *lab);
Image8* lab2rgb(LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, bool consider_histogram_settings = true);
void rgb2lab(const Image8 &src, int x, int y, int w, int h, float L[], float a[], float b[], const procparams::ColorManagementParams &icm, bool consider_histogram_settings = true) const;
static void rgb2lab(std::uint8_t red, std::uint8_t green, std::uint8_t blue, float &L, float &a, float &b, const procparams::ColorManagementParams &icm, bool consider_histogram_settings = true);
Imagefloat* lab2rgbOut(LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm);
// CieImage *ciec;
void workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, int ch, int mul, Glib::ustring &profile, double gampos, double slpos, int &illum, int prim, cmsHTRANSFORM &transform, bool normalizeIn = true, bool normalizeOut = true, bool keepTransForm = false) const;

View File

@ -17,7 +17,8 @@
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#include <fftw3.h>
#include "../rtgui/profilestorecombobox.h"
#include <glibmm/miscutils.h>
#include <glibmm/ustring.h>
#include "color.h"
#include "rtengine.h"
#include "iccstore.h"

View File

@ -434,7 +434,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") {
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 (settings->verbose) {
printf("Profile=%s\n", profile.c_str());
}
@ -509,7 +509,7 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw,
float greyy = params->icm.grey;
float epsil = 0.0001f;
if (prim == 12) {//convert datas area to xy
if (prim == 13) {//convert datas area to xy
float redgraphx = params->icm.labgridcieALow;
float redgraphy = params->icm.labgridcieBLow;
float blugraphx = params->icm.labgridcieAHigh;
@ -597,6 +597,12 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw,
}
case ColorManagementParams::Primaries::ACES_P0: {
profile = "ACESp0";
break;
}
case ColorManagementParams::Primaries::JDC_MAX: {
profile = "JDCmax";
break;
}
@ -754,6 +760,17 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw,
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 == "ACESp1") {
p[0] = 0.713; // ACES P1 primaries
p[1] = 0.293;

File diff suppressed because it is too large Load Diff

373
rtengine/iptoneequalizer.cc Normal file
View File

@ -0,0 +1,373 @@
#include "color.h"
#include "guidedfilter.h"
#include "iccstore.h"
#include "imagefloat.h"
#include "improcfun.h"
#include "sleef.h"
#include "StopWatch.h"
namespace
{
const std::vector<std::array<float, 3>> colormap = {
{0.5f, 0.f, 0.5f},
{0.5f, 0.f, 0.5f},
{0.5f, 0.f, 0.5f},
{0.5f, 0.f, 0.5f},
{0.5f, 0.f, 0.5f}, // blacks
{0.f, 0.f, 1.f}, // shadows
{0.5f, 0.5f, 0.5f}, // midtones
{1.f, 1.f, 0.f}, // highlights
{1.f, 0.f, 0.f}, // whites
{1.f, 0.f, 0.f},
{1.f, 0.f, 0.f},
{1.f, 0.f, 0.f}
};
void toneEqualizer(
array2D<float> &R, array2D<float> &G, array2D<float> &B,
const rtengine::ToneEqualizerParams &params,
const Glib::ustring &workingProfile,
double scale,
bool multithread)
// adapted from the tone equalizer of darktable
/*
Copyright 2019 Alberto Griggio <alberto.griggio@gmail.com>
Small adaptation to Local Adjustment 10 2019 Jacques Desmis <jdesmis@gmail.com>
This file is part of darktable,
copyright (c) 2018 Aurelien Pierre.
darktable is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
darktable is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with darktable. If not, see <http://www.gnu.org/licenses/>.
*/
{
// BENCHFUN
const int W = R.getWidth();
const int H = R.getHeight();
array2D<float> Y(W, H);
const auto log2 =
[](float x) -> float {
static const float l2 = xlogf(2);
return xlogf(x) / l2;
};
const auto exp2 =
[](float x) -> float {
return pow_F(2.f, x);
};
// Build the luma channels: band-pass filters with gaussian windows of
// std 2 EV, spaced by 2 EV
const float centers[12] = {
-16.0f, -14.0f, -12.0f, -10.0f, -8.0f, -6.0f,
-4.0f, -2.0f, 0.0f, 2.0f, 4.0f, 6.0f
};
const auto conv = [&](int v, float lo, float hi) -> float {
const float f = v < 0 ? lo : hi;
return exp2(float(v) / 100.f * f);
};
const float factors[12] = {
conv(params.bands[0], 2.f, 3.f), // -16 EV
conv(params.bands[0], 2.f, 3.f), // -14 EV
conv(params.bands[0], 2.f, 3.f), // -12 EV
conv(params.bands[0], 2.f, 3.f), // -10 EV
conv(params.bands[0], 2.f, 3.f), // -8 EV
conv(params.bands[1], 2.f, 3.f), // -6 EV
conv(params.bands[2], 2.5f, 2.5f), // -4 EV
conv(params.bands[3], 3.f, 2.f), // -2 EV
conv(params.bands[4], 3.f, 2.f), // 0 EV
conv(params.bands[4], 3.f, 2.f), // 2 EV
conv(params.bands[4], 3.f, 2.f), // 4 EV
conv(params.bands[4], 3.f, 2.f) // 6 EV
};
rtengine::TMatrix ws = rtengine::ICCStore::getInstance()->workingSpaceMatrix(workingProfile);
#ifdef _OPENMP
#pragma omp parallel for if (multithread)
#endif
for (int y = 0; y < H; ++y) {
for (int x = 0; x < W; ++x) {
Y[y][x] = rtengine::Color::rgbLuminance(R[y][x], G[y][x], B[y][x], ws);
}
}
int detail = rtengine::LIM(params.regularization + 5, 0, 5);
int radius = detail / scale + 0.5;
float epsilon2 = 0.01f + 0.002f * rtengine::max(detail - 3, 0);
if (radius > 0) {
rtengine::guidedFilterLog(10.f, Y, radius, epsilon2, multithread);
}
if (params.regularization > 0) {
array2D<float> Y2(W, H);
constexpr float base_epsilon = 0.02f;
constexpr float base_posterization = 5.f;
#ifdef _OPENMP
#pragma omp parallel for if (multithread)
#endif
for (int y = 0; y < H; ++y) {
for (int x = 0; x < W; ++x) {
float l = rtengine::LIM(log2(rtengine::max(Y[y][x], 1e-9f)), centers[0], centers[11]);
float ll = round(l * base_posterization) / base_posterization;
Y2[y][x] = Y[y][x];
Y[y][x] = exp2(ll);
}
}
radius = 350.0 / scale;
epsilon2 = base_epsilon / float(6 - rtengine::min(params.regularization, 5));
rtengine::guidedFilter(Y2, Y, Y, radius, epsilon2, multithread);
}
const auto gauss =
[](float b, float x) -> float {
return xexpf((-rtengine::SQR(x - b) / 4.0f));
};
// For every pixel luminance, the sum of the gaussian masks
float w_sum = 0.f;
for (int i = 0; i < 12; ++i) {
w_sum += gauss(centers[i], 0.f);
}
constexpr float luma_lo = -14.f;
constexpr float luma_hi = 4.f;
const auto process_pixel =
[&](float y) -> float {
// convert to log space
const float luma = rtengine::LIM(log2(rtengine::max(y, 0.f)), luma_lo, luma_hi);
// build the correction as the sum of the contribution of each
// luminance channel to current pixel
float correction = 0.0f;
for (int c = 0; c < 12; ++c)
{
correction += gauss(centers[c], luma) * factors[c];
}
correction /= w_sum;
return correction;
};
std::vector<std::array<float, 3>> cur_colormap;
if (params.show_colormap) {
rtengine::lcmsMutex->lock();
cmsHPROFILE in = rtengine::ICCStore::getInstance()->getsRGBProfile();
cmsHPROFILE out = rtengine::ICCStore::getInstance()->workingSpace(workingProfile);
cmsHTRANSFORM xform = cmsCreateTransform(in, TYPE_RGB_FLT, out, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE);
rtengine::lcmsMutex->unlock();
for (auto &c : colormap) {
cur_colormap.push_back(c);
auto &cc = cur_colormap.back();
cmsDoTransform(xform, &cc[0], &cc[0], 1);
}
cmsDeleteTransform(xform);
}
const auto process_colormap =
[&](float y) -> std::array<float, 3>
{
std::array<float, 3> ret = { 0.f, 0.f, 0.f };
// convert to log space
const float luma = rtengine::LIM(log2(rtengine::max(y, 0.f)), luma_lo, luma_hi);
// build the correction as the sum of the contribution of each
// luminance channel to current pixel
for (int c = 0; c < 12; ++c) {
float w = gauss(centers[c], luma);
for (int i = 0; i < 3; ++i) {
ret[i] += w * cur_colormap[c][i];
}
}
for (int i = 0; i < 3; ++i) {
ret[i] = rtengine::LIM01(ret[i] / w_sum);
}
return ret;
};
#ifdef __SSE2__
vfloat vfactors[12];
vfloat vcenters[12];
for (int i = 0; i < 12; ++i) {
vfactors[i] = F2V(factors[i]);
vcenters[i] = F2V(centers[i]);
}
const auto vgauss =
[](vfloat b, vfloat x) -> vfloat {
static const vfloat fourv = F2V(4.f);
return xexpf((-rtengine::SQR(x - b) / fourv));
};
vfloat zerov = F2V(0.f);
vfloat vw_sum = F2V(w_sum);
const vfloat vluma_lo = F2V(luma_lo);
const vfloat vluma_hi = F2V(luma_hi);
const vfloat xlog2v = F2V(xlogf(2.f));
const auto vprocess_pixel =
[&](vfloat y) -> vfloat {
const vfloat luma = vminf(vmaxf(xlogf(vmaxf(y, zerov)) / xlog2v, vluma_lo), vluma_hi);
vfloat correction = zerov;
for (int c = 0; c < 12; ++c)
{
correction += vgauss(vcenters[c], luma) * vfactors[c];
}
correction /= vw_sum;
return correction;
};
vfloat v1 = F2V(1.f);
vfloat v65535 = F2V(65535.f);
#endif // __SSE2__
if (params.show_colormap) {
LUTf lut_r(65537), lut_g(65537), lut_b(65537);
for (int i = 0; i < 65536; ++i) {
float y = float(i)/65535.f;
auto rgb = process_colormap(y);
lut_r[i] = rgb[0];
lut_g[i] = rgb[1];
lut_b[i] = rgb[2];
}
lut_r[65536] = cur_colormap.back()[0];
lut_g[65536] = cur_colormap.back()[1];
lut_b[65536] = cur_colormap.back()[2];
#ifdef _OPENMP
# pragma omp parallel for if (multithread)
#endif
for (int y = 0; y < H; ++y) {
for (int x = 0; x < W; ++x) {
float cY = Y[y][x] * 65535.f;
R[y][x] = lut_r[cY];
G[y][x] = lut_g[cY];
B[y][x] = lut_b[cY];
}
}
return;
}
LUTf lut(65536);
for (int i = 0; i < 65536; ++i) {
float y = float(i) / 65535.f;
float c = process_pixel(y);
lut[i] = c;
}
#ifdef _OPENMP
#pragma omp parallel for if (multithread)
#endif
for (int y = 0; y < H; ++y) {
int x = 0;
#ifdef __SSE2__
for (; x < W - 3; x += 4) {
vfloat cY = LVFU(Y[y][x]);
vmask m = vmaskf_gt(cY, v1);
vfloat corr;
if (_mm_movemask_ps((vfloat)m)) {
corr = vprocess_pixel(cY);
} else {
corr = lut[cY * v65535];
}
STVF(R[y][x], LVF(R[y][x]) * corr);
STVF(G[y][x], LVF(G[y][x]) * corr);
STVF(B[y][x], LVF(B[y][x]) * corr);
}
#endif // __SSE2__
for (; x < W; ++x) {
float cY = Y[y][x];
float corr = cY > 1.f ? process_pixel(cY) : lut[cY * 65535.f];
R[y][x] *= corr;
G[y][x] *= corr;
B[y][x] *= corr;
}
}
}
}
namespace rtengine
{
void ImProcFunctions::toneEqualizer(
Imagefloat *rgb,
const ToneEqualizerParams &params,
const Glib::ustring &workingProfile,
double scale,
bool multiThread)
{
if (!params.enabled) {
return;
}
BENCHFUN
const float gain = 1.f / 65535.f * std::pow(2.f, -params.pivot);
rgb->multiply(gain, multiThread);
const int W = rgb->getWidth();
const int H = rgb->getHeight();
array2D<float> R(W, H, rgb->r.ptrs, ARRAY2D_BYREFERENCE);
array2D<float> G(W, H, rgb->g.ptrs, ARRAY2D_BYREFERENCE);
array2D<float> B(W, H, rgb->b.ptrs, ARRAY2D_BYREFERENCE);
::toneEqualizer(R, G, B, params, workingProfile, scale, multiThread);
rgb->multiply(params.show_colormap ? 65535.f : 1.f/gain, multiThread);
}
void ImProcFunctions::toneEqualizer(Imagefloat *rgb)
{
toneEqualizer(rgb, params->toneEqualizer, params->icm.workingProfile, scale, multiThread);
}
}

View File

@ -2270,7 +2270,7 @@ void ImProcFunctions::Aver(const float* RESTRICT DataList, int datalen, float &a
int countP = 0, countN = 0;
double averaP = 0.0, averaN = 0.0; // use double precision for large summations
constexpr float thres = 32.7f;//different fom zero to take into account only data large enough 32.7 = 0.1 in range 0..100 very low value
constexpr float thres = 32.7f;//different from zero to take into account only data large enough 32.7 = 0.1 in range 0..100 very low value
max = 0.f;
min = RT_INFINITY_F;
#ifdef _OPENMP
@ -2322,7 +2322,7 @@ void ImProcFunctions::Sigma(const float* RESTRICT DataList, int datalen, float a
{
int countP = 0, countN = 0;
double variP = 0.0, variN = 0.0; // use double precision for large summations
float thres = 32.7f;//different fom zero to take into account only data large enough 32.7 = 0.1 in range 0..100
float thres = 32.7f;//different from zero to take into account only data large enough 32.7 = 0.1 in range 0..100
#ifdef _OPENMP
#pragma omp parallel for reduction(+:variP,variN,countP,countN) num_threads(numThreads) if (numThreads>1)

View File

@ -275,7 +275,11 @@ int PDAFLinesFilter::mark(const array2D<float> &rawData, PixelsMap &bpMap)
for (int y = 1; y < H_-1; ++y) {
int yy = pattern_[idx] + off;
if (y == yy) {
int n = markLine(rawData, bpMap, y) + markLine(rawData, bpMap, y-1) + markLine(rawData, bpMap, y+1);
int n = 0;
n += markLine(rawData, bpMap, y);
n += (y-1 <= 0 ) ? 0 : markLine(rawData, bpMap, y-1);
n += (y+1 >= H_-1) ? 0 : markLine(rawData, bpMap, y+1);
if (n) {
found += n;
if (settings->verbose) {

View File

@ -1387,16 +1387,12 @@ WBParams::WBParams() :
equal(1.0),
tempBias(0.0),
observer(ColorTemp::DEFAULT_OBSERVER),
itcwb_thres(34),
itcwb_precis(3),
itcwb_size(3),
itcwb_delta(2),
itcwb_fgreen(5),
itcwb_rgreen(1),
itcwb_nopurple(true),
itcwb_sorted(false),
itcwb_forceextra(false),
itcwb_sampling(false)
itcwb_green(0.),//slider
itcwb_rgreen(1),//keep for settings
itcwb_nopurple(false),//keep for settings
itcwb_alg(false),//checkbox
itcwb_prim("beta"),//combobox
itcwb_sampling(false)//keep for 5.9 and for settings
{
}
@ -1418,6 +1414,10 @@ bool WBParams::isPanningRelatedChange(const WBParams& other) const
&& equal == other.equal
&& tempBias == other.tempBias
&& observer == other.observer
&& itcwb_green == other.itcwb_green
&& itcwb_prim == other.itcwb_prim
&& itcwb_alg == other.itcwb_alg
)
)
);
@ -1433,15 +1433,11 @@ bool WBParams::operator ==(const WBParams& other) const
&& equal == other.equal
&& tempBias == other.tempBias
&& observer == other.observer
&& itcwb_thres == other.itcwb_thres
&& itcwb_precis == other.itcwb_precis
&& itcwb_size == other.itcwb_size
&& itcwb_delta == other.itcwb_delta
&& itcwb_fgreen == other.itcwb_fgreen
&& itcwb_green == other.itcwb_green
&& itcwb_rgreen == other.itcwb_rgreen
&& itcwb_nopurple == other.itcwb_nopurple
&& itcwb_sorted == other.itcwb_sorted
&& itcwb_forceextra == other.itcwb_forceextra
&& itcwb_alg == other.itcwb_alg
&& itcwb_prim == other.itcwb_prim
&& itcwb_sampling == other.itcwb_sampling;
}
@ -1866,6 +1862,30 @@ bool SHParams::operator !=(const SHParams& other) const
return !(*this == other);
}
ToneEqualizerParams::ToneEqualizerParams() :
enabled(false),
bands{0, 0, 0, 0, 0},
regularization(0),
show_colormap(false),
pivot(0)
{
}
bool ToneEqualizerParams::operator ==(const ToneEqualizerParams &other) const
{
return
enabled == other.enabled
&& bands == other.bands
&& regularization == other.regularization
&& show_colormap == other.show_colormap
&& pivot == other.pivot;
}
bool ToneEqualizerParams::operator !=(const ToneEqualizerParams &other) const
{
return !(*this == other);
}
CropParams::CropParams() :
enabled(false),
x(-1),
@ -3381,6 +3401,7 @@ LocallabParams::LocallabSpot::LocallabSpot() :
slomaskSH(0.0),
lapmaskSH(0.0),
detailSH(0),
tePivot(0.),
reparsh(100.),
LmaskSHcurve{
static_cast<double>(DCT_NURBS),
@ -4825,6 +4846,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const
&& slomaskSH == other.slomaskSH
&& lapmaskSH == other.lapmaskSH
&& detailSH == other.detailSH
&& tePivot == other.tePivot
&& reparsh == other.reparsh
&& LmaskSHcurve == other.LmaskSHcurve
&& fatamountSH == other.fatamountSH
@ -5896,6 +5918,8 @@ void ProcParams::setDefaults()
sh = {};
toneEqualizer = {};
crop = {};
coarse = {};
@ -6188,15 +6212,11 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo
saveToKeyfile(!pedited || pedited->wb.equal, "White Balance", "Equal", wb.equal, keyFile);
saveToKeyfile(!pedited || pedited->wb.tempBias, "White Balance", "TemperatureBias", wb.tempBias, keyFile);
saveToKeyfile(!pedited || pedited->wb.observer, "White Balance", "StandardObserver", Glib::ustring(wb.observer == StandardObserver::TWO_DEGREES ? "TWO_DEGREES" : "TEN_DEGREES"), keyFile);
saveToKeyfile(!pedited || pedited->wb.itcwb_thres, "White Balance", "Itcwb_thres", wb.itcwb_thres, keyFile);
saveToKeyfile(!pedited || pedited->wb.itcwb_precis, "White Balance", "Itcwb_precis", wb.itcwb_precis, keyFile);
saveToKeyfile(!pedited || pedited->wb.itcwb_size, "White Balance", "Itcwb_size", wb.itcwb_size, keyFile);
saveToKeyfile(!pedited || pedited->wb.itcwb_delta, "White Balance", "Itcwb_delta", wb.itcwb_delta, keyFile);
saveToKeyfile(!pedited || pedited->wb.itcwb_fgreen, "White Balance", "Itcwb_findgreen", wb.itcwb_fgreen, keyFile);
saveToKeyfile(!pedited || pedited->wb.itcwb_green, "White Balance", "Itcwb_green", wb.itcwb_green, keyFile);
saveToKeyfile(!pedited || pedited->wb.itcwb_rgreen, "White Balance", "Itcwb_rangegreen", wb.itcwb_rgreen, keyFile);
saveToKeyfile(!pedited || pedited->wb.itcwb_nopurple, "White Balance", "Itcwb_nopurple", wb.itcwb_nopurple, keyFile);
saveToKeyfile(!pedited || pedited->wb.itcwb_sorted, "White Balance", "Itcwb_sorted", wb.itcwb_sorted, keyFile);
saveToKeyfile(!pedited || pedited->wb.itcwb_forceextra, "White Balance", "Itcwb_forceextra", wb.itcwb_forceextra, keyFile);
saveToKeyfile(!pedited || pedited->wb.itcwb_alg, "White Balance", "Itcwb_alg", wb.itcwb_alg, keyFile);
saveToKeyfile(!pedited || pedited->wb.itcwb_prim, "White Balance", "Itcwb_prim", wb.itcwb_prim, keyFile);
saveToKeyfile(!pedited || pedited->wb.itcwb_sampling, "White Balance", "Itcwb_sampling", wb.itcwb_sampling, keyFile);
// Colorappearance
@ -6334,6 +6354,14 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo
saveToKeyfile(!pedited || pedited->sh.radius, "Shadows & Highlights", "Radius", sh.radius, keyFile);
saveToKeyfile(!pedited || pedited->sh.lab, "Shadows & Highlights", "Lab", sh.lab, keyFile);
// Tone equalizer
saveToKeyfile(!pedited || pedited->toneEqualizer.enabled, "ToneEqualizer", "Enabled", toneEqualizer.enabled, keyFile);
for (size_t i = 0; i < toneEqualizer.bands.size(); ++i) {
saveToKeyfile(!pedited || pedited->toneEqualizer.bands[i], "ToneEqualizer", "Band" + std::to_string(i), toneEqualizer.bands[i], keyFile);
}
saveToKeyfile(!pedited || pedited->toneEqualizer.regularization, "ToneEqualizer", "Regularization", toneEqualizer.regularization, keyFile);
saveToKeyfile(!pedited || pedited->toneEqualizer.pivot, "ToneEqualizer", "Pivot", toneEqualizer.pivot, keyFile);
// Crop
saveToKeyfile(!pedited || pedited->crop.enabled, "Crop", "Enabled", crop.enabled, keyFile);
saveToKeyfile(!pedited || pedited->crop.x, "Crop", "X", crop.x, keyFile);
@ -6620,6 +6648,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo
saveToKeyfile(!pedited || spot_edited->gammaskSH, "Locallab", "GammaskSH_" + index_str, spot.gammaskSH, keyFile);
saveToKeyfile(!pedited || spot_edited->slomaskSH, "Locallab", "SlomaskSH_" + index_str, spot.slomaskSH, keyFile);
saveToKeyfile(!pedited || spot_edited->detailSH, "Locallab", "DetailSH_" + index_str, spot.detailSH, keyFile);
saveToKeyfile(!pedited || spot_edited->tePivot, "Locallab", "TePivot_" + index_str, spot.tePivot, keyFile);
saveToKeyfile(!pedited || spot_edited->reparsh, "Locallab", "Reparsh_" + index_str, spot.reparsh, keyFile);
saveToKeyfile(!pedited || spot_edited->LmaskSHcurve, "Locallab", "LmaskSHCurve_" + index_str, spot.LmaskSHcurve, keyFile);
saveToKeyfile(!pedited || spot_edited->fatamountSH, "Locallab", "FatamountSH_" + index_str, spot.fatamountSH, keyFile);
@ -7256,6 +7285,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo
{ColorManagementParams::Primaries::ACES_P1, "aces"},
{ColorManagementParams::Primaries::WIDE_GAMUT, "wid"},
{ColorManagementParams::Primaries::ACES_P0, "ac0"},
{ColorManagementParams::Primaries::JDC_MAX, "jdcmax"},
{ColorManagementParams::Primaries::BRUCE_RGB, "bru"},
{ColorManagementParams::Primaries::BETA_RGB, "bet"},
{ColorManagementParams::Primaries::BEST_RGB, "bst"},
@ -8157,15 +8187,11 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited)
} else if (standard_observer == "TWO_DEGREES") {
wb.observer = StandardObserver::TWO_DEGREES;
}
assignFromKeyfile(keyFile, "White Balance", "Itcwb_thres", pedited, wb.itcwb_thres, pedited->wb.itcwb_thres);
assignFromKeyfile(keyFile, "White Balance", "Itcwb_precis", pedited, wb.itcwb_precis, pedited->wb.itcwb_precis);
assignFromKeyfile(keyFile, "White Balance", "Itcwb_size", pedited, wb.itcwb_size, pedited->wb.itcwb_size);
assignFromKeyfile(keyFile, "White Balance", "Itcwb_delta", pedited, wb.itcwb_delta, pedited->wb.itcwb_delta);
assignFromKeyfile(keyFile, "White Balance", "Itcwb_findgreen", pedited, wb.itcwb_fgreen, pedited->wb.itcwb_fgreen);
assignFromKeyfile(keyFile, "White Balance", "Itcwb_green", pedited, wb.itcwb_green, pedited->wb.itcwb_green);
assignFromKeyfile(keyFile, "White Balance", "Itcwb_rangegreen", pedited, wb.itcwb_rgreen, pedited->wb.itcwb_rgreen);
assignFromKeyfile(keyFile, "White Balance", "Itcwb_nopurple", pedited, wb.itcwb_nopurple, pedited->wb.itcwb_nopurple);
assignFromKeyfile(keyFile, "White Balance", "Itcwb_sorted", pedited, wb.itcwb_sorted, pedited->wb.itcwb_sorted);
assignFromKeyfile(keyFile, "White Balance", "Itcwb_forceextra", pedited, wb.itcwb_forceextra, pedited->wb.itcwb_forceextra);
assignFromKeyfile(keyFile, "White Balance", "Itcwb_alg", pedited, wb.itcwb_alg, pedited->wb.itcwb_alg);
assignFromKeyfile(keyFile, "White Balance", "Itcwb_prim", pedited, wb.itcwb_prim, pedited->wb.itcwb_prim);
if (ppVersion <= 349) { // 5.9 and earlier.
wb.itcwb_sampling = true;
if (pedited) {
@ -8372,6 +8398,15 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited)
}
}
if (keyFile.has_group("ToneEqualizer")) {
assignFromKeyfile(keyFile, "ToneEqualizer", "Enabled", pedited, toneEqualizer.enabled, pedited->toneEqualizer.enabled);
for (size_t i = 0; i < toneEqualizer.bands.size(); ++i) {
assignFromKeyfile(keyFile, "ToneEqualizer", "Band" + std::to_string(i), pedited, toneEqualizer.bands[i], pedited->toneEqualizer.bands[i]);
}
assignFromKeyfile(keyFile, "ToneEqualizer", "Regularization", pedited, toneEqualizer.regularization, pedited->toneEqualizer.regularization);
assignFromKeyfile(keyFile, "ToneEqualizer", "Pivot", pedited, toneEqualizer.pivot, pedited->toneEqualizer.pivot);
}
if (keyFile.has_group("Crop")) {
assignFromKeyfile(keyFile, "Crop", "Enabled", pedited, crop.enabled, pedited->crop.enabled);
assignFromKeyfile(keyFile, "Crop", "X", pedited, crop.x, pedited->crop.x);
@ -8779,6 +8814,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited)
assignFromKeyfile(keyFile, "Locallab", "SlomaskSH_" + index_str, pedited, spot.slomaskSH, spotEdited.slomaskSH);
assignFromKeyfile(keyFile, "Locallab", "LapmaskSH_" + index_str, pedited, spot.lapmaskSH, spotEdited.lapmaskSH);
assignFromKeyfile(keyFile, "Locallab", "DetailSH_" + index_str, pedited, spot.detailSH, spotEdited.detailSH);
assignFromKeyfile(keyFile, "Locallab", "TePivot_" + index_str, pedited, spot.tePivot, spotEdited.tePivot);
assignFromKeyfile(keyFile, "Locallab", "Reparsh_" + index_str, pedited, spot.reparsh, spotEdited.reparsh);
assignFromKeyfile(keyFile, "Locallab", "LmaskSHCurve_" + index_str, pedited, spot.LmaskSHcurve, spotEdited.LmaskSHcurve);
assignFromKeyfile(keyFile, "Locallab", "FatamountSH_" + index_str, pedited, spot.fatamountSH, spotEdited.fatamountSH);
@ -9583,6 +9619,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited)
{"aces", ColorManagementParams::Primaries::ACES_P1},
{"wid", ColorManagementParams::Primaries::WIDE_GAMUT},
{"ac0", ColorManagementParams::Primaries::ACES_P0},
{"jdcmax", ColorManagementParams::Primaries::JDC_MAX},
{"bru", ColorManagementParams::Primaries::BRUCE_RGB},
{"bet", ColorManagementParams::Primaries::BETA_RGB},
{"bst", ColorManagementParams::Primaries::BEST_RGB},
@ -10615,6 +10652,7 @@ bool ProcParams::operator ==(const ProcParams& other) const
&& fattal == other.fattal
&& defringe == other.defringe
&& sh == other.sh
&& toneEqualizer == other.toneEqualizer
&& crop == other.crop
&& coarse == other.coarse
&& rotate == other.rotate

View File

@ -18,6 +18,7 @@
*/
#pragma once
#include <array>
#include <cmath>
#include <cstdio>
#include <map>
@ -642,15 +643,11 @@ struct WBParams {
double equal;
double tempBias;
StandardObserver observer;
int itcwb_thres;
int itcwb_precis;
int itcwb_size;
int itcwb_delta;
int itcwb_fgreen;
double itcwb_green;
int itcwb_rgreen;
bool itcwb_nopurple;
bool itcwb_sorted;
bool itcwb_forceextra;
bool itcwb_alg;
Glib::ustring itcwb_prim;
bool itcwb_sampling;
WBParams();
@ -840,6 +837,22 @@ struct SHParams {
bool operator !=(const SHParams& other) const;
};
/**
* Tone equalizer parameters.
*/
struct ToneEqualizerParams {
bool enabled;
std::array<int, 5> bands;
int regularization;
bool show_colormap;
double pivot;
ToneEqualizerParams();
bool operator ==(const ToneEqualizerParams &other) const;
bool operator !=(const ToneEqualizerParams &other) const;
};
/**
* Parameters of the cropping
*/
@ -1210,6 +1223,7 @@ struct LocallabParams {
double slomaskSH;
double lapmaskSH;
int detailSH;
double tePivot;
double reparsh;
std::vector<double> LmaskSHcurve;
double fatamountSH;
@ -1922,6 +1936,7 @@ struct ColorManagementParams {
ACES_P1,
WIDE_GAMUT,
ACES_P0,
JDC_MAX,
BRUCE_RGB,
BETA_RGB,
BEST_RGB,
@ -2562,6 +2577,7 @@ public:
EPDParams epd; ///< Edge Preserving Decomposition parameters
FattalToneMappingParams fattal; ///< Fattal02 tone mapping
SHParams sh; ///< Shadow/highlight enhancement parameters
ToneEqualizerParams toneEqualizer; ///< Tone equalizer parameters
CropParams crop; ///< Crop parameters
CoarseTransformParams coarse; ///< Coarse transformation (90, 180, 270 deg rotation, h/v flipping) parameters
CommonTransformParams commonTrans; ///< Common transformation parameters (autofill)

View File

@ -17,6 +17,9 @@
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#include <algorithm>
#include <map>
#include <glibmm/fileutils.h>
#include <glibmm/miscutils.h>

View File

@ -18,6 +18,7 @@
*/
#pragma once
#include <list>
#include <map>
#include <vector>

File diff suppressed because it is too large Load Diff

View File

@ -112,7 +112,7 @@ protected:
void hlRecovery(const std::string &method, float* red, float* green, float* blue, int width, float* hlmax);
void transformRect(const PreviewProps &pp, int tran, int &sx1, int &sy1, int &width, int &height, int &fw);
void transformPosition(int x, int y, int tran, int& tx, int& ty);
void ItcWB(bool extra, double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, array2D<float> &redloc, array2D<float> &greenloc, array2D<float> &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw, const procparams::WBParams & wbpar, const procparams::ToneCurveParams &hrp);
void ItcWB(bool extra, double &tempref, double &greenref, double &tempitc, double &greenitc, float &temp0, float &delta, int &bia, int &dread, int &kcam, int &nocam, float &studgood, float &minchrom, int &kmin, float &minhist, float &maxhist, array2D<float> &redloc, array2D<float> &greenloc, array2D<float> &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw, const procparams::WBParams & wbpar, const procparams::ToneCurveParams &hrp);
unsigned FC(int row, int col) const;
inline void getRowStartEnd (int x, int &start, int &end);
@ -141,8 +141,8 @@ public:
void processFlatField(const procparams::RAWParams &raw, const RawImage *riFlatFile, array2D<float> &rawData, const float black[4]);
void copyOriginalPixels(const procparams::RAWParams &raw, RawImage *ri, const RawImage *riDark, RawImage *riFlatFile, array2D<float> &rawData );
void scaleColors (int winx, int winy, int winw, int winh, const procparams::RAWParams &raw, array2D<float> &rawData); // raw for cblack
void WBauto(double &tempref, double &greenref, array2D<float> &redloc, array2D<float> &greenloc, array2D<float> &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, double &tempitc, double &greenitc, float &studgood, bool &twotimes, const procparams::WBParams & wbpar, int begx, int begy, int yEn, int xEn, int cx, int cy, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw, const procparams::ToneCurveParams &hrp) override;
void getAutoWBMultipliersitc(double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const procparams::WBParams & wbpar, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw, const procparams::ToneCurveParams &hrp) override;
void WBauto(bool extra, double &tempref, double &greenref, array2D<float> &redloc, array2D<float> &greenloc, array2D<float> &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;
void getAutoWBMultipliersitc(bool extra, double &tempref, double &greenref, double &tempitc, double &greenitc, float &temp0, float &delta, int &bia, int &dread, int &kcam, int &nocam, float &studgood, float &minchrom, int &kmin, float &minhist, float &maxhist, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const procparams::WBParams & wbpar, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw, const procparams::ToneCurveParams &hrp) override;
void getrgbloc(int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, const procparams::WBParams & wbpar) override;
void getWBMults (const ColorTemp &ctemp, const procparams::RAWParams &raw, std::array<float, 4>& scale_mul, float &autoGainComp, float &rm, float &gm, float &bm) const override;
@ -249,6 +249,7 @@ protected:
double cared,
double cablue,
bool avoidColourshift,
int border,
array2D<float> &rawData,
double* fitParamsTransfer,
bool fitParamsIn,

View File

@ -438,9 +438,21 @@ public:
double Tmax;
};
struct locallabDenoiseLC {
double highres;
double nres;
double highres46;
double nres46;
double Lhighres;
double Lnres;
double Lhighres46;
double Lnres46;
};
virtual ~LocallabListener() = default;
// virtual void refChanged(const std::vector<locallabRef> &ref, int selspot) = 0;
virtual void minmaxChanged(const std::vector<locallabRetiMinMax> &minmax, int selspot) = 0;
virtual void denChanged(const std::vector<locallabDenoiseLC> &denlc, int selspot) = 0;
virtual void logencodChanged(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg, const bool autocomput, const bool autocie, const float jz1) = 0;
virtual void refChanged2(float *huerefp, float *chromarefp, float *lumarefp, float *fabrefp, int selspot) = 0;
};
@ -472,7 +484,7 @@ class AutoWBListener
{
public:
virtual ~AutoWBListener() = default;
virtual void WBChanged(double temp, double green, double rw, double gw, double bw, float studgood) = 0;
virtual void WBChanged(int met, double temp, double green, double rw, double gw, double bw, float temp0, float delta, int bia, int dread, float studgood, float minchrom, int kmin, float histmin, float histmax) = 0;
};
class FrameCountListener

View File

@ -8,7 +8,7 @@
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* RawTherapee is distributed in the hope that it will be useful,
itcw *
*
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
@ -60,6 +60,7 @@ public:
Glib::ustring srgb; // filename of sRGB profile (default to the bundled one)
Glib::ustring rec2020; // filename of Rec2020 profile (default to the bundled one)
Glib::ustring ACESp0; // filename of ACES P0 profile (default to the bundled one)
Glib::ustring JDCmax; // filename of JDCmax profile (default to the bundled one)
Glib::ustring ACESp1; // filename of ACES P1 profile (default to the bundled one)
Glib::ustring DCIP3; // filename of DCIP3 profile (default to the bundled one)
@ -95,6 +96,9 @@ public:
double cbdlsensi;
// bool showtooltip;
bool itcwb_enable;
double itcwb_deltaspec;
double itcwb_powponder;
//wavelet levels
double edghi;
double edglo;

View File

@ -1175,6 +1175,14 @@ private:
float Tsigma;
float Tmin;
float Tmax;
float highresi = 0.f;
float nresi = 0.f;
float highresi46 =0.f;
float nresi46 = 0.f;
float Lhighresi = 0.f;
float Lnresi = 0.f;
float Lhighresi46 = 0.f;
float Lnresi46 = 0.f;
// No Locallab mask is shown in exported picture
ipf.Lab_Local(2, sp, shbuffer, labView, labView, reservView.get(), savenormtmView.get(), savenormretiView.get(), lastorigView.get(), fw, fh, 0, 0, fw, fh, 1, locRETgainCurve, locRETtransCurve,
@ -1229,7 +1237,8 @@ private:
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
meantme, stdtme, meanretie, stdretie, fab,
highresi, nresi, highresi46, nresi46, Lhighresi, Lnresi, Lhighresi46, Lnresi46
);
if (sp + 1u < params.locallab.spots.size()) {

View File

@ -311,11 +311,11 @@ void StdImageSource::getAutoExpHistogram (LUTu & histogram, int& histcompr)
}
}
void StdImageSource::WBauto(double &tempref, double &greenref, array2D<float> &redloc, array2D<float> &greenloc, array2D<float> &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, double &tempitc, double &greenitc, float &studgood, bool &twotimes, const WBParams & wbpar, int begx, int begy, int yEn, int xEn, int cx, int cy, const ColorManagementParams &cmp, const RAWParams &raw, const ToneCurveParams &hrp)
void StdImageSource::WBauto(bool extra, double &tempref, double &greenref, array2D<float> &redloc, array2D<float> &greenloc, array2D<float> &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 WBParams & wbpar, int begx, int begy, int yEn, int xEn, int cx, int cy, const ColorManagementParams &cmp, const RAWParams &raw, const ToneCurveParams &hrp)
{
}
void StdImageSource::getAutoWBMultipliersitc(double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const WBParams & wbpar, const ColorManagementParams &cmp, const RAWParams &raw, const ToneCurveParams &hrp)
void StdImageSource::getAutoWBMultipliersitc(bool extra, double &tempref, double &greenref, double &tempitc, double &greenitc, float &temp0, float &delta, int &bia, int &dread, int &kcam, int &nocam, float &studgood, float &minchrom, int &kmin, float &minhist, float &maxhist, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const WBParams & wbpar, const ColorManagementParams &cmp, const RAWParams &raw, const ToneCurveParams &hrp)
{
if (redAWBMul != -1.) {
rm = redAWBMul;
@ -324,7 +324,7 @@ void StdImageSource::getAutoWBMultipliersitc(double &tempref, double &greenref,
return;
}
img->getAutoWBMultipliersitc(tempref, greenref, tempitc, greenitc,studgood, begx, begy, yEn, xEn, cx, cy, bf_h, bf_w, rm, gm, bm, params->wb, params->icm, params->raw, params->toneCurve);
img->getAutoWBMultipliersitc(extra, tempref, greenref, tempitc, greenitc, temp0, delta, bia, dread, kcam, nocam, studgood, minchrom, kmin, minhist, maxhist, begx, begy, yEn, xEn, cx, cy, bf_h, bf_w, rm, gm, bm, params->wb, params->icm, params->raw, params->toneCurve);
redAWBMul = rm;
greenAWBMul = gm;

View File

@ -66,8 +66,8 @@ public:
}
void getAutoWBMultipliers (double &rm, double &gm, double &bm) override;
ColorTemp getSpotWB (std::vector<Coord2D> &red, std::vector<Coord2D> &green, std::vector<Coord2D> &blue, int tran, double equal, StandardObserver observer) override;
void WBauto(double &tempref, double &greenref, array2D<float> &redloc, array2D<float> &greenloc, array2D<float> &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, double &tempitc, double &greenitc, float &studgood, bool &twotimes, const procparams::WBParams & wbpar, int begx, int begy, int yEn, int xEn, int cx, int cy, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw, const procparams::ToneCurveParams &hrp) override;
void getAutoWBMultipliersitc(double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const procparams::WBParams & wbpar, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw, const procparams::ToneCurveParams &hrp) override;
void WBauto(bool extra, double &tempref, double &greenref, array2D<float> &redloc, array2D<float> &greenloc, array2D<float> &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;
void getAutoWBMultipliersitc(bool extra, double &tempref, double &greenref, double &tempitc, double &greenitc, float &temp0, float &delta, int &bia, int &dread, int &kcam, int &nocam, float &studgood, float &minchrom, int &kmin, float &minhist, float &maxhist, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const procparams::WBParams & wbpar, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw, const procparams::ToneCurveParams &hrp) override;
eSensorType getSensorType() const override {return ST_NONE;}
bool isMono() const override {return false;}

View File

@ -1209,6 +1209,10 @@ Tag::Tag (TagDirectory* p, FILE* f, int base)
goto defsubdirs;
}
} else {
// In some circumstances, `value` may have been allocated, so
// delete it to prevent a leak. See issue
// https://github.com/Beep6581/RawTherapee/issues/6735
delete [] value;
// read value
value = new unsigned char [valuesize + 1];
auto readSize = fread (value, 1, valuesize, f);
@ -3243,24 +3247,17 @@ std::vector<Tag*> ExifManager::getDefaultTIFFTags (TagDirectory* forthis)
int ExifManager::createJPEGMarker (const TagDirectory* root, const rtengine::procparams::ExifPairs& changeList, int W, int H, unsigned char* buffer)
void ExifManager::createJPEGMarker (const TagDirectory* root, const rtengine::procparams::ExifPairs& changeList, int W, int H, unsigned char *&buffer, unsigned &bufferSize)
{
// write tiff header
int offs = 6;
memcpy (buffer, "Exif\0\0", 6);
int offs = 6; // "Exif\0\0"
ByteOrder order = INTEL;
if (root) {
order = root->getOrder ();
}
sset2 ((unsigned short)order, buffer + offs, order);
offs += 2;
sset2 (42, buffer + offs, order);
offs += 2;
sset4 (8, buffer + offs, order);
TagDirectory* cl;
if (root) {
@ -3322,11 +3319,18 @@ int ExifManager::createJPEGMarker (const TagDirectory* root, const rtengine::pro
}
cl->sort ();
int size = cl->write (8, buffer + 6);
bufferSize = cl->calculateSize() + 8 + 6;
buffer = new unsigned char[bufferSize]; // this has to be deleted in caller
memcpy (buffer, "Exif\0\0", 6);
sset2 ((unsigned short)order, buffer + offs, order);
offs += 2;
sset2 (42, buffer + offs, order);
offs += 2;
sset4 (8, buffer + offs, order);
cl->write (8, buffer + 6);
delete cl;
return size + 6;
}
int ExifManager::createPNGMarker(const TagDirectory* root, const rtengine::procparams::ExifPairs &changeList, int W, int H, int bps, const char* iptcdata, int iptclen, unsigned char *&buffer, unsigned &bufferSize)

View File

@ -379,7 +379,7 @@ public:
/// @param forthis The byte order will be taken from the given directory.
/// @return The ownership of the return tags is passed to the caller.
static std::vector<Tag*> getDefaultTIFFTags (TagDirectory* forthis);
static int createJPEGMarker (const TagDirectory* root, const rtengine::procparams::ExifPairs& changeList, int W, int H, unsigned char* buffer);
static void createJPEGMarker (const TagDirectory* root, const rtengine::procparams::ExifPairs& changeList, int W, int H, unsigned char *&buffer, unsigned &bufferSize);
static int createTIFFHeader (const TagDirectory* root, const rtengine::procparams::ExifPairs& changeList, int W, int H, int bps, const char* profiledata, int profilelen, const char* iptcdata, int iptclen, unsigned char *&buffer, unsigned &bufferSize);
static int createPNGMarker(const TagDirectory *root, const rtengine::procparams::ExifPairs &changeList, int W, int H, int bps, const char *iptcdata, int iptclen, unsigned char *&buffer, unsigned &bufferSize);
};

View File

@ -161,6 +161,7 @@ set(NONCLISOURCEFILES
thumbimageupdater.cc
thumbnail.cc
tonecurve.cc
toneequalizer.cc
toolbar.cc
toollocationpref.cc
toolpanel.cc

View File

@ -10,6 +10,9 @@ enum {
ADDSET_SH_HIGHLIGHTS,
ADDSET_SH_SHADOWS,
ADDSET_SH_LOCALCONTRAST, // not used anymore
ADDSET_TONE_EQUALIZER_BANDS,
ADDSET_TONE_EQUALIZER_PIVOT,
ADDSET_TONE_EQUALIZER_REGULARIZATION,
ADDSET_LC_BRIGHTNESS,
ADDSET_LC_CONTRAST,
ADDSET_SHARP_AMOUNT,

View File

@ -52,6 +52,7 @@ Adjuster::Adjuster(
grid(nullptr),
label(nullptr),
imageIcon1(imgIcon1),
imageIcon2(imgIcon2),
automatic(nullptr),
adjusterListener(nullptr),
spinChange(options.adjusterMinDelay, options.adjusterMaxDelay),
@ -77,8 +78,8 @@ Adjuster::Adjuster(
setExpandAlignProperties(imageIcon1, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER);
}
if (imgIcon2) {
setExpandAlignProperties(imgIcon2, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER);
if (imageIcon2) {
setExpandAlignProperties(imageIcon2, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER);
}
set_column_spacing(0);
@ -121,9 +122,9 @@ Adjuster::Adjuster(
attach_next_to(*imageIcon1, *slider, Gtk::POS_LEFT, 1, 1);
}
if (imgIcon2) {
attach_next_to(*imgIcon2, *slider, Gtk::POS_RIGHT, 1, 1);
attach_next_to(*spin, *imgIcon2, Gtk::POS_RIGHT, 1, 1);
if (imageIcon2) {
attach_next_to(*imageIcon2, *slider, Gtk::POS_RIGHT, 1, 1);
attach_next_to(*spin, *imageIcon2, Gtk::POS_RIGHT, 1, 1);
} else {
attach_next_to(*spin, *slider, Gtk::POS_RIGHT, 1, 1);
}
@ -141,9 +142,9 @@ Adjuster::Adjuster(
grid->attach_next_to(*imageIcon1, *slider, Gtk::POS_LEFT, 1, 1);
}
if (imgIcon2) {
grid->attach_next_to(*imgIcon2, Gtk::POS_RIGHT, 1, 1);
grid->attach_next_to(*reset, *imgIcon2, Gtk::POS_RIGHT, 1, 1);
if (imageIcon2) {
grid->attach_next_to(*imageIcon2, Gtk::POS_RIGHT, 1, 1);
grid->attach_next_to(*reset, *imageIcon2, Gtk::POS_RIGHT, 1, 1);
} else {
grid->attach_next_to(*reset, *slider, Gtk::POS_RIGHT, 1, 1);
}
@ -684,3 +685,15 @@ void Adjuster::setDelay(unsigned int min_delay_ms, unsigned int max_delay_ms)
spinChange.setDelay(min_delay_ms, max_delay_ms);
sliderChange.setDelay(min_delay_ms, max_delay_ms);
}
void Adjuster::showIcons(bool yes)
{
if (imageIcon1) {
imageIcon1->set_visible(yes);
imageIcon1->set_no_show_all(!yes);
}
if (imageIcon2) {
imageIcon2->set_visible(yes);
imageIcon2->set_no_show_all(!yes);
}
}

View File

@ -41,6 +41,7 @@ protected:
Gtk::Grid* grid;
Gtk::Label* label;
Gtk::Image *imageIcon1;
Gtk::Image *imageIcon2;
MyHScale* slider;
MySpinButton* spin;
Gtk::Button* reset;
@ -133,4 +134,5 @@ public:
void trimValue (int &val) const;
void setLogScale(double base, double pivot, bool anchorMiddle = false);
void setDelay(unsigned int min_delay_ms, unsigned int max_delay_ms = 0);
void showIcons(bool yes);
};

View File

@ -219,6 +219,7 @@ void BatchToolPanelCoordinator::initSession ()
chmixer->setAdjusterBehavior (options.baBehav[ADDSET_CHMIXER] );
blackwhite->setAdjusterBehavior (options.baBehav[ADDSET_BLACKWHITE_HUES], options.baBehav[ADDSET_BLACKWHITE_GAMMA]);
shadowshighlights->setAdjusterBehavior (options.baBehav[ADDSET_SH_HIGHLIGHTS], options.baBehav[ADDSET_SH_SHADOWS]);
toneEqualizer->setAdjusterBehavior(options.baBehav[ADDSET_TONE_EQUALIZER_BANDS], options.baBehav[ADDSET_TONE_EQUALIZER_REGULARIZATION], options.baBehav[ADDSET_TONE_EQUALIZER_PIVOT]);
dirpyrequalizer->setAdjusterBehavior (options.baBehav[ADDSET_DIRPYREQ], options.baBehav[ADDSET_DIRPYREQ_THRESHOLD], options.baBehav[ADDSET_DIRPYREQ_SKINPROTECT]);
wavelet->setAdjusterBehavior (options.baBehav[ADDSET_WA], options.baBehav[ADDSET_WA_THRESHOLD], options.baBehav[ADDSET_WA_THRESHOLD2], options.baBehav[ADDSET_WA_THRES], options.baBehav[ADDSET_WA_CHRO], options.baBehav[ADDSET_WA_CHROMA], options.baBehav[ADDSET_WA_CONTRAST], options.baBehav[ADDSET_WA_SKINPROTECT], options.baBehav[ADDSET_WA_RESCHRO], options.baBehav[ADDSET_WA_TMRS], options.baBehav[ADDSET_WA_EDGS], options.baBehav[ADDSET_WA_SCALE], options.baBehav[ADDSET_WA_RESCON], options.baBehav[ADDSET_WA_RESCONH], options.baBehav[ADDSET_WA_THRR], options.baBehav[ADDSET_WA_THRRH], options.baBehav[ADDSET_WA_RADIUS], options.baBehav[ADDSET_WA_SKYPROTECT], options.baBehav[ADDSET_WA_EDGRAD], options.baBehav[ADDSET_WA_EDGVAL], options.baBehav[ADDSET_WA_STRENGTH], options.baBehav[ADDSET_WA_GAMMA], options.baBehav[ADDSET_WA_EDGEDETECT], options.baBehav[ADDSET_WA_EDGEDETECTTHR], options.baBehav[ADDSET_WA_EDGEDETECTTHR2]);
dirpyrdenoise->setAdjusterBehavior (options.baBehav[ADDSET_DIRPYRDN_LUMA], options.baBehav[ADDSET_DIRPYRDN_LUMDET], options.baBehav[ADDSET_DIRPYRDN_CHROMA], options.baBehav[ADDSET_DIRPYRDN_CHROMARED], options.baBehav[ADDSET_DIRPYRDN_CHROMABLUE], options.baBehav[ADDSET_DIRPYRDN_GAMMA], options.baBehav[ADDSET_DIRPYRDN_PASSES]);
@ -242,6 +243,9 @@ void BatchToolPanelCoordinator::initSession ()
if (options.baBehav[ADDSET_TC_SATURATION]) { pparams.toneCurve.saturation = 0;}
if (options.baBehav[ADDSET_SH_HIGHLIGHTS]) { pparams.sh.highlights = 0; }
if (options.baBehav[ADDSET_SH_SHADOWS]) { pparams.sh.shadows = 0; }
if (options.baBehav[ADDSET_TONE_EQUALIZER_BANDS]) { pparams.toneEqualizer.bands = {}; }
if (options.baBehav[ADDSET_TONE_EQUALIZER_PIVOT]) { pparams.toneEqualizer.pivot = 0; }
if (options.baBehav[ADDSET_TONE_EQUALIZER_REGULARIZATION]) { pparams.toneEqualizer.regularization = 0; }
if (options.baBehav[ADDSET_LC_BRIGHTNESS]) { pparams.labCurve.brightness = 0; }
if (options.baBehav[ADDSET_LC_CONTRAST]) { pparams.labCurve.contrast = 0; }
if (options.baBehav[ADDSET_LC_CHROMATICITY]) { pparams.labCurve.chromaticity = 0; }

View File

@ -36,7 +36,7 @@ BayerProcess::BayerProcess () :
{
auto m = ProcEventMapper::getInstance();
EvDemosaicBorder = m->newEvent(DEMOSAIC, "HISTORY_MSG_RAW_BORDER");
EvDemosaicBorder = m->newEvent(DARKFRAME, "HISTORY_MSG_RAW_BORDER");
EvDemosaicContrast = m->newEvent(DEMOSAIC, "HISTORY_MSG_DUALDEMOSAIC_CONTRAST");
EvDemosaicAutoContrast = m->newEvent(DEMOSAIC, "HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST");
EvDemosaicPixelshiftDemosaicMethod = m->newEvent(DEMOSAIC, "HISTORY_MSG_PIXELSHIFT_DEMOSAIC");

View File

@ -415,7 +415,7 @@ void CropWindow::buttonPress (int button, int type, int bstate, int x, int y)
// Add a new Color Picker
rtengine::Coord imgPos;
screenCoordToImage(x, y, imgPos.x, imgPos.y);
LockableColorPicker *newPicker = new LockableColorPicker(this, &cropHandler.colorParams->outputProfile, &cropHandler.colorParams->workingProfile);
LockableColorPicker *newPicker = new LockableColorPicker(this, cropHandler.colorParams.get());
colorPickers.push_back(newPicker);
hoveredPicker = newPicker;
updateHoveredPicker(&imgPos);
@ -1107,10 +1107,10 @@ void CropWindow::pointerMoved (int bstate, int x, int y)
printf("Using \"%s\" output\n", outputProfile.c_str());
if(outputProfile==options.rtSettings.srgb) printf("OK SRGB2");
*/
pmlistener->pointerMoved (false, cropHandler.colorParams->outputProfile, cropHandler.colorParams->workingProfile, mx, my, -1, -1, -1);
pmlistener->pointerMoved (false, *cropHandler.colorParams, mx, my, -1, -1, -1);
if (pmhlistener) {
pmhlistener->pointerMoved (false, cropHandler.colorParams->outputProfile, cropHandler.colorParams->workingProfile, mx, my, -1, -1, -1);
pmhlistener->pointerMoved (false, *cropHandler.colorParams, mx, my, -1, -1, -1);
}
} else {
@ -1157,11 +1157,11 @@ void CropWindow::pointerMoved (int bstate, int x, int y)
// Updates the Navigator
// TODO: possible double color conversion if rval, gval, bval come from cropHandler.cropPixbuftrue ? see issue #4583
pmlistener->pointerMoved (true, cropHandler.colorParams->outputProfile, cropHandler.colorParams->workingProfile, mx, my, rval, gval, bval, isRaw);
pmlistener->pointerMoved (true, *cropHandler.colorParams, mx, my, rval, gval, bval, isRaw);
if (pmhlistener) {
// Updates the HistogramRGBArea
pmhlistener->pointerMoved (true, cropHandler.colorParams->outputProfile, cropHandler.colorParams->workingProfile, mx, my, rval, gval, bval);
pmhlistener->pointerMoved (true, *cropHandler.colorParams, mx, my, rval, gval, bval);
}
}
}

View File

@ -18,6 +18,8 @@
*/
#pragma once
#include <vector>
#include "editid.h"
#include "cursormanager.h"
#include "../rtengine/coord.h"

View File

@ -904,6 +904,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");
setExpandAlignProperties(send_to_external->buttonGroup, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL);
updateExternalEditorWidget(
options.externalEditorIndex >= 0 ? options.externalEditorIndex : options.externalEditors.size(),
@ -2030,7 +2031,7 @@ bool EditorPanel::idle_saveImage (ProgressConnector<rtengine::IImagefloat*> *pc,
msgd.run ();
saveimgas->set_sensitive (true);
send_to_external->set_sensitive(true);
send_to_external->set_sensitive(send_to_external->getEntryCount());
isProcessing = false;
}
@ -2058,7 +2059,7 @@ bool EditorPanel::idle_imageSaved (ProgressConnector<int> *pc, rtengine::IImagef
}
saveimgas->set_sensitive (true);
send_to_external->set_sensitive(true);
send_to_external->set_sensitive(send_to_external->getEntryCount());
parent->setProgressStr ("");
parent->setProgress (0.);
@ -2249,8 +2250,10 @@ void EditorPanel::sendToExternalPressed()
dialog->show();
} else {
struct ExternalEditor editor = options.externalEditors.at(options.externalEditorIndex);
external_editor_info = Gio::AppInfo::create_from_commandline(editor.command, editor.name, Gio::APP_INFO_CREATE_NONE);
external_editor_native_command = editor.native_command;
external_editor_info = {
editor.name,
editor.command,
editor.native_command};
sendToExternal();
}
}
@ -2388,7 +2391,7 @@ bool EditorPanel::idle_sendToGimp ( ProgressConnector<rtengine::IImagefloat*> *p
Gtk::MessageDialog msgd (*parent, msg_, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true);
msgd.run ();
saveimgas->set_sensitive (true);
send_to_external->set_sensitive(true);
send_to_external->set_sensitive(send_to_external->getEntryCount());
}
return false;
@ -2409,14 +2412,14 @@ bool EditorPanel::idle_sentToGimp (ProgressConnector<int> *pc, rtengine::IImagef
if ((!img && Glib::file_test(filename, Glib::FILE_TEST_IS_REGULAR)) || (img && !errore)) {
saveimgas->set_sensitive (true);
send_to_external->set_sensitive(true);
send_to_external->set_sensitive(send_to_external->getEntryCount());
parent->setProgressStr ("");
parent->setProgress (0.);
bool success = false;
setUserOnlyPermission(Gio::File::create_for_path(filename), false);
success = ExtProgStore::openInExternalEditor(filename, external_editor_info, external_editor_native_command);
success = ExtProgStore::openInExternalEditor(filename, external_editor_info);
if (!success) {
Gtk::MessageDialog msgd (*parent, M ("MAIN_MSG_CANNOTSTARTEDITOR"), false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true);
@ -2445,12 +2448,16 @@ RTAppChooserDialog *EditorPanel::getAppChooserDialog()
void EditorPanel::onAppChooserDialogResponse(int responseId)
{
switch (responseId) {
case Gtk::RESPONSE_OK:
case Gtk::RESPONSE_OK: {
getAppChooserDialog()->close();
external_editor_info = getAppChooserDialog()->get_app_info();
external_editor_native_command = false;
const auto app_info = getAppChooserDialog()->get_app_info();
external_editor_info = {
app_info->get_name(),
app_info->get_commandline(),
false};
sendToExternal();
break;
}
case Gtk::RESPONSE_CANCEL:
case Gtk::RESPONSE_CLOSE:
getAppChooserDialog()->close();
@ -2781,7 +2788,11 @@ void EditorPanel::updateExternalEditorWidget(int selectedIndex, const std::vecto
send_to_external->insertEntry(i, "palette-brush", name, &send_to_external_radio_group);
}
}
#ifndef __APPLE__
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);
send_to_external->show();
}

View File

@ -21,6 +21,7 @@
#include <gtkmm.h>
#include "extprog.h"
#include "histogrampanel.h"
#include "history.h"
#include "imageareapanel.h"
@ -252,8 +253,7 @@ private:
Gtk::Button* navSync;
Gtk::Button* navNext;
Gtk::Button* navPrev;
Glib::RefPtr<Gio::AppInfo> external_editor_info;
bool external_editor_native_command;
EditorInfo external_editor_info;
std::unique_ptr<RTAppChooserDialog> app_chooser_dialog;
ExternalEditorChangedSignal *externalEditorChangedSignal;
sigc::connection externalEditorChangedSignalConnection;

View File

@ -36,7 +36,9 @@ ExternalEditorPreferences::ExternalEditorPreferences():
list_view = Gtk::manage(new Gtk::TreeView());
list_view->set_model(list_model);
list_view->append_column(*Gtk::manage(makeAppColumn()));
#ifndef __APPLE__
list_view->append_column(*Gtk::manage(makeNativeCommandColumn()));
#endif
list_view->append_column(*Gtk::manage(makeCommandColumn()));
for (auto &&column : list_view->get_columns()) {
@ -56,11 +58,18 @@ ExternalEditorPreferences::ExternalEditorPreferences():
button_remove = Gtk::manage(new Gtk::Button());
button_add->set_image_from_icon_name("add-small");
button_remove->set_image_from_icon_name("remove-small");
button_app_chooser = Gtk::manage(new Gtk::Button(M("PREFERENCES_EXTERNALEDITOR_CHANGE")));
button_app_chooser =
#ifdef __APPLE__
nullptr;
#else
Gtk::manage(new Gtk::Button(M("PREFERENCES_EXTERNALEDITOR_CHANGE")));
#endif
button_file_chooser = Gtk::manage(new Gtk::Button(M("PREFERENCES_EXTERNALEDITOR_CHANGE_FILE")));
button_app_chooser->signal_pressed().connect(sigc::mem_fun(
*this, &ExternalEditorPreferences::openAppChooserDialog));
if (button_app_chooser) {
button_app_chooser->signal_pressed().connect(sigc::mem_fun(
*this, &ExternalEditorPreferences::openAppChooserDialog));
}
button_add->signal_pressed().connect(sigc::mem_fun(
*this, &ExternalEditorPreferences::addEditor));
button_file_chooser->signal_pressed().connect(sigc::mem_fun(
@ -74,7 +83,9 @@ ExternalEditorPreferences::ExternalEditorPreferences():
// Toolbar.
toolbar.set_halign(Gtk::Align::ALIGN_END);
toolbar.add(*button_app_chooser);
if (button_app_chooser) {
toolbar.add(*button_app_chooser);
}
toolbar.add(*button_file_chooser);
toolbar.add(*button_add);
toolbar.add(*button_remove);
@ -153,6 +164,9 @@ void ExternalEditorPreferences::addEditor()
}
row[model_columns.name] = "-";
#ifdef __APPLE__
row[model_columns.native_command] = true;
#endif
list_view->get_selection()->select(row);
}
@ -241,7 +255,12 @@ void ExternalEditorPreferences::onFileChooserDialogResponse(
for (const auto &selected : selection) {
auto row = *list_model->get_iter(selected);
row[model_columns.icon] = Glib::RefPtr<Gio::Icon>(nullptr);
row[model_columns.native_command] = false;
row[model_columns.native_command] =
#ifdef __APPLE__
true;
#else
false;
#endif
row[model_columns.command] =
#ifdef WIN32
'"' + dialog->get_filename() + '"';
@ -357,7 +376,9 @@ void ExternalEditorPreferences::setAppName(
void ExternalEditorPreferences::updateToolbarSensitivity()
{
bool selected = list_view->get_selection()->count_selected_rows();
button_app_chooser->set_sensitive(selected);
if (button_app_chooser) {
button_app_chooser->set_sensitive(selected);
}
button_file_chooser->set_sensitive(selected);
button_remove->set_sensitive(selected);
}

View File

@ -344,13 +344,13 @@ bool ExtProgStore::openInCustomEditor (const Glib::ustring& fileName, const Glib
}
bool ExtProgStore::openInExternalEditor(const Glib::ustring &fileName, const Glib::RefPtr<Gio::AppInfo> &editorInfo, bool nativeCommand)
bool ExtProgStore::openInExternalEditor(const Glib::ustring &fileName, const EditorInfo &editorInfo)
{
if (nativeCommand) {
if (editorInfo.isNativeCommand) {
if (rtengine::settings->verbose) {
std::cout << "Launching external editor as native command." << std::endl;
}
const Glib::ustring command = editorInfo->get_commandline();
const Glib::ustring command = editorInfo.commandline;
return openInCustomEditor(fileName, &command);
}
@ -361,7 +361,10 @@ bool ExtProgStore::openInExternalEditor(const Glib::ustring &fileName, const Gli
bool success = false;
try {
success = editorInfo->launch(Gio::File::create_for_path(fileName));
Glib::RefPtr<Gio::AppInfo> appInfo =
Gio::AppInfo::create_from_commandline(
editorInfo.commandline, editorInfo.name, Gio::APP_INFO_CREATE_NONE);
success = appInfo->launch(Gio::File::create_for_path(fileName));
} catch (const Glib::Error &e) {
std::cerr
<< "Error launching external editor.\n"
@ -377,7 +380,7 @@ bool ExtProgStore::openInExternalEditor(const Glib::ustring &fileName, const Gli
if (rtengine::settings->verbose) {
std::cout << "Unable to launch external editor with Gio. Trying custom launcher." << std::endl;
}
Glib::ustring command = editorInfo->get_commandline();
Glib::ustring command = editorInfo.commandline;
#if defined WIN32
if (command.length() > 2 && command[0] == '"' && command[command.length() - 1] == '"') {
command = command.substr(1, command.length() - 2);

View File

@ -42,6 +42,13 @@ struct ExtProgAction
bool execute (const std::vector<Glib::ustring>& fileNames) const;
};
struct EditorInfo
{
Glib::ustring name;
Glib::ustring commandline;
bool isNativeCommand;
};
// Stores all external programs that could be called by the user
class ExtProgStore
{
@ -70,7 +77,7 @@ public:
static bool openInGimp (const Glib::ustring& fileName);
static bool openInPhotoshop (const Glib::ustring& fileName);
static bool openInCustomEditor (const Glib::ustring& fileName, const Glib::ustring* command = nullptr);
static bool openInExternalEditor(const Glib::ustring &fileName, const Glib::RefPtr<Gio::AppInfo> &editorInfo, bool nativeCommand);
static bool openInExternalEditor(const Glib::ustring &fileName, const EditorInfo &editorInfo);
};
#define extProgStore ExtProgStore::getInstance()

View File

@ -37,7 +37,6 @@
//extern Glib::Threads::Thread* mainThread;
bool FileBrowserEntry::iconsLoaded(false);
std::shared_ptr<RTSurface> FileBrowserEntry::editedIcon(std::shared_ptr<RTSurface>(nullptr));
std::shared_ptr<RTSurface> FileBrowserEntry::recentlySavedIcon(std::shared_ptr<RTSurface>(nullptr));
std::shared_ptr<RTSurface> FileBrowserEntry::enqueuedIcon(std::shared_ptr<RTSurface>(nullptr));
@ -58,15 +57,6 @@ FileBrowserEntry::FileBrowserEntry (Thumbnail* thm, const Glib::ustring& fname)
scale = 1;
if (!iconsLoaded) {
editedIcon = std::shared_ptr<RTSurface>(new RTSurface("tick-small", Gtk::ICON_SIZE_SMALL_TOOLBAR));
recentlySavedIcon = std::shared_ptr<RTSurface>(new RTSurface("save-small", Gtk::ICON_SIZE_SMALL_TOOLBAR));
enqueuedIcon = std::shared_ptr<RTSurface>(new RTSurface("gears-small", Gtk::ICON_SIZE_SMALL_TOOLBAR));
hdr = std::shared_ptr<RTSurface>(new RTSurface("filetype-hdr", Gtk::ICON_SIZE_SMALL_TOOLBAR));
ps = std::shared_ptr<RTSurface>(new RTSurface("filetype-ps", Gtk::ICON_SIZE_SMALL_TOOLBAR));
iconsLoaded = true;
}
thumbnail->addThumbnailListener (this);
}
@ -90,6 +80,15 @@ FileBrowserEntry::~FileBrowserEntry ()
}
}
void FileBrowserEntry::init ()
{
editedIcon = std::shared_ptr<RTSurface>(new RTSurface("tick-small", Gtk::ICON_SIZE_SMALL_TOOLBAR));
recentlySavedIcon = std::shared_ptr<RTSurface>(new RTSurface("save-small", Gtk::ICON_SIZE_SMALL_TOOLBAR));
enqueuedIcon = std::shared_ptr<RTSurface>(new RTSurface("gears-small", Gtk::ICON_SIZE_SMALL_TOOLBAR));
hdr = std::shared_ptr<RTSurface>(new RTSurface("filetype-hdr", Gtk::ICON_SIZE_SMALL_TOOLBAR));
ps = std::shared_ptr<RTSurface>(new RTSurface("filetype-ps", Gtk::ICON_SIZE_SMALL_TOOLBAR));
}
void FileBrowserEntry::refreshThumbnailImage ()
{

View File

@ -51,7 +51,6 @@ class FileBrowserEntry final : public ThumbBrowserEntryBase,
{
double scale;
static bool iconsLoaded;
bool wasInside;
ImageAreaToolListener* iatlistener;
int press_x, press_y, action_x, action_y;
@ -81,6 +80,7 @@ public:
FileBrowserEntry (Thumbnail* thm, const Glib::ustring& fname);
~FileBrowserEntry () override;
static void init ();
void draw (Cairo::RefPtr<Cairo::Context> cc) override;
void setImageAreaToolListener (ImageAreaToolListener* l)

View File

@ -77,59 +77,6 @@ void IdleRegister::destroy()
mutex.unlock();
}
/*
gboolean giveMeAGo(void* data) {
GThreadLock *threadMutex = static_cast<GThreadLock*>(data);
printf("A\n");
Glib::Threads::Mutex::Lock GUILock(threadMutex->GUI);
printf("B\n");
{
Glib::Threads::Mutex::Lock operationLock(threadMutex->operation);
printf("C\n");
threadMutex->operationCond.signal();
printf("D\n");
operationLock.release(); // because we're not sure that "lock" destructor happens here...
}
threadMutex->GUICond.wait(threadMutex->GUI);
printf("E\n");
GUILock.release();
return false;
}
GThreadLock::GThreadLock() : sameThread(false) {
if (Glib::Threads::Thread::self() == mainThread) {
sameThread = true;
return;
}
printf("10\n");
{
Glib::Threads::Mutex::Lock operationLock(operation);
printf("20\n");
gdk_threads_add_idle(giveMeAGo, this);
printf("30\n");
operationCond.wait(operation);
printf("40\n");
operationLock.release();
}
}
GThreadLock::~GThreadLock() {
if (!sameThread) {
printf("50\n");
Glib::Threads::Mutex::Lock lock(GUI);
printf("60\n");
GUICond.signal();
printf("Fin\n");
}
}
*/
Glib::ustring escapeHtmlChars(const Glib::ustring &src)
{

View File

@ -22,11 +22,12 @@
#include "options.h"
#include <cstring>
#include <cmath>
#include "../rtengine/array2D.h"
#include "../rtengine/LUT.h"
#include "rtimage.h"
#include "rtscalable.h"
#include "../rtengine/array2D.h"
#include "../rtengine/color.h"
#include "../rtengine/improcfun.h"
#include "../rtengine/LUT.h"
using namespace rtengine;
@ -35,12 +36,20 @@ constexpr float HistogramArea::MIN_BRIGHT;
using ScopeType = Options::ScopeType;
namespace
{
const rtengine::procparams::ColorManagementParams DEFAULT_CMP;
}
//
//
// HistogramPanel
HistogramPanel::HistogramPanel () :
pointer_moved_delayed_call(
[this](bool validPos, const Glib::ustring &profile, const Glib::ustring &profileW, int r, int g, int b)
[this](bool validPos, const rtengine::procparams::ColorManagementParams *cmp, int r, int g, int b)
{
bool update_hist_area = false, update_hist_rgb_area = false;
@ -54,10 +63,10 @@ HistogramPanel::HistogramPanel () :
} else {
// do something to show vertical bars
if (histogramRGBArea) {
update_hist_rgb_area = histogramRGBArea->updatePointer(r, g, b, profile, profileW);
update_hist_rgb_area = histogramRGBArea->updatePointer(r, g, b, cmp);
}
update_hist_area = histogramArea->updatePointer(r, g, b, profile, profileW);
update_hist_area = histogramArea->updatePointer(r, g, b, cmp);
}
if (histogramRGBArea && update_hist_rgb_area) {
@ -669,9 +678,9 @@ void HistogramPanel::rgbv_toggled ()
}
}
void HistogramPanel::pointerMoved (bool validPos, const Glib::ustring &profile, const Glib::ustring &profileW, int x, int y, int r, int g, int b, bool isRaw)
void HistogramPanel::pointerMoved (bool validPos, const rtengine::procparams::ColorManagementParams &cmp, int x, int y, int r, int g, int b, bool isRaw)
{
pointer_moved_delayed_call(validPos, profile, profileW, r, g, b);
pointer_moved_delayed_call(validPos, &cmp, r, g, b);
}
/*
@ -848,19 +857,19 @@ void HistogramRGBArea::updateDrawingArea (const ::Cairo::RefPtr< Cairo::Context>
if (needLuma) {
// Luma
cc->set_source_rgb(1.0, 1.0, 1.0);
drawBar(cc, lab_L, 100.0, winw, winh);
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) / 1.8;
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, 100.0, winw, winh);
drawBar(cc, chromaval, 1.0, winw, winh);
}
}
}
bool HistogramRGBArea::updatePointer (const int new_r, const int new_g, const int new_b, const Glib::ustring &profile, const Glib::ustring &profileW)
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)
@ -884,11 +893,13 @@ bool HistogramRGBArea::updatePointer (const int new_r, const int new_g, const in
r = new_r;
g = new_g;
b = new_b;
Color::rgb2lab01(profile, profileW,
static_cast<float>(r) / 255.f,
static_cast<float>(g) / 255.f,
static_cast<float>(b) / 255.f,
lab_L, lab_a, lab_b, options.rtSettings.HistogramWorking);
ImProcFunctions::rgb2lab(
static_cast<std::uint8_t>(r),
static_cast<std::uint8_t>(g),
static_cast<std::uint8_t>(b),
lab_L, lab_a, lab_b,
cmp != nullptr ? *cmp : DEFAULT_CMP,
true);
pointerValid = true;
}
@ -1151,7 +1162,7 @@ void HistogramArea::update(
break;
case ScopeType::PARADE:
case ScopeType::WAVEFORM: {
MyWriterLock wave_lock(wave_mutex);
MYWRITERLOCK(wave_lock, wave_mutex)
waveform_scale = waveformScale;
rwave = waveformRed;
gwave = waveformGreen;
@ -1266,7 +1277,7 @@ void HistogramArea::updateDrawingArea (const ::Cairo::RefPtr< Cairo::Context> &c
cr->unset_dash();
MyReaderLock wave_lock(wave_mutex);
MYREADERLOCK(wave_lock, wave_mutex)
if (LUT_valid && (scopeType == Options::ScopeType::HISTOGRAM || scopeType == Options::ScopeType::HISTOGRAM_RAW)) {
const bool rawMode = (scopeType == Options::ScopeType::HISTOGRAM_RAW);
@ -1383,10 +1394,10 @@ void HistogramArea::updateDrawingArea (const ::Cairo::RefPtr< Cairo::Context> &c
} else if (scopeType == Options::ScopeType::VECTORSCOPE_HC || scopeType == Options::ScopeType::VECTORSCOPE_HS) {
drawVectorscope(cr, winw, winh);
}
wave_lock.release();
MYREADERLOCK_RELEASE(wave_lock);
}
bool HistogramArea::updatePointer(const int r, const int g, const int b, const Glib::ustring &profile, const Glib::ustring &profileW)
bool HistogramArea::updatePointer(const int r, const int g, const int b, const rtengine::procparams::ColorManagementParams *cmp)
{
// Do not update pointer values if pointer is not visible
// (by user choice or according to scope type)
@ -1410,11 +1421,16 @@ bool HistogramArea::updatePointer(const int r, const int g, const int b, const G
pointer_red = r;
pointer_green = g;
pointer_blue = b;
Color::rgb2lab01(profile, profileW,
static_cast<float>(r) / 255.f,
static_cast<float>(g) / 255.f,
static_cast<float>(b) / 255.f,
L, pointer_a, pointer_b, options.rtSettings.HistogramWorking);
ImProcFunctions::rgb2lab(
static_cast<std::uint8_t>(r),
static_cast<std::uint8_t>(g),
static_cast<std::uint8_t>(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;
}

View File

@ -87,7 +87,7 @@ public:
~HistogramRGBArea() override;
// Update pointer values: returns true if widget needs redrawing
bool updatePointer (const int new_r, const int new_g, const int new_b, const Glib::ustring &new_profile = "", const Glib::ustring &new_profileW = "");
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 ();
@ -197,7 +197,7 @@ public:
~HistogramArea() override;
// Update pointer values: returns true if widget needs redrawing
bool updatePointer(const int r, const int g, const int b, const Glib::ustring &profile = "", const Glib::ustring &profileW = "");
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,
@ -263,7 +263,7 @@ public:
class HistogramPanel final : public Gtk::Grid, public PointerMotionListener, public DrawModeListener, public rtengine::NonCopyable
{
private:
DelayedCall<bool, Glib::ustring, Glib::ustring, int, int, int> pointer_moved_delayed_call;
DelayedCall<bool, const rtengine::procparams::ColorManagementParams *, int, int, int> pointer_moved_delayed_call;
protected:
@ -345,7 +345,7 @@ public:
histogramArea->update(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw, vectorscopeScale, vectorscopeHC, vectorscopeHS, waveformScale, waveformRed, waveformGreen, waveformBlue, waveformLuma);
}
// pointermotionlistener interface
void pointerMoved (bool validPos, const Glib::ustring &profile, const Glib::ustring &profileW, int x, int y, int r, int g, int b, bool isRaw = false) override;
void pointerMoved (bool validPos, const rtengine::procparams::ColorManagementParams &cmp, int x, int y, int r, int g, int b, bool isRaw = false) override;
void reorder (Gtk::PositionType position);
void red_toggled ();

View File

@ -204,10 +204,13 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, TOOL_NAME, M("TP_ICM_LABEL")), iu
wFrame->add(*wProfVBox);
//-----------------gamma TRC working
Gtk::Frame *trcFrame = Gtk::manage(new Gtk::Frame(M("TP_ICM_TRCFRAME")));
trcFrame->set_label_align(0.025, 0.5);
// Gtk::Frame *trcFrame = Gtk::manage(new Gtk::Frame(M("TP_ICM_TRCFRAME")));
trcExp = Gtk::manage(new MyExpander(false, 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));
trcFrame->set_tooltip_text(M("TP_ICM_TRCFRAME_TOOLTIP"));
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) );
wTRCBox = Gtk::manage(new Gtk::Box());
@ -268,7 +271,7 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, TOOL_NAME, M("TP_ICM_LABEL")), iu
fbw->set_active(true);
gamut = Gtk::manage(new Gtk::CheckButton((M("TP_ICM_GAMUT"))));
gamut->set_active(false);
trcProfVBox->pack_start(*wprimBox, Gtk::PACK_EXPAND_WIDGET);
trcProfVBox->pack_start(*fbw, Gtk::PACK_EXPAND_WIDGET);
trcProfVBox->pack_start(*gamut, Gtk::PACK_EXPAND_WIDGET);
@ -292,6 +295,7 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, TOOL_NAME, M("TP_ICM_LABEL")), iu
wprim->append(M("TP_ICM_WORKING_PRIM_ACE"));
wprim->append(M("TP_ICM_WORKING_PRIM_WID"));
wprim->append(M("TP_ICM_WORKING_PRIM_AC0"));
wprim->append(M("TP_ICM_WORKING_PRIM_JDCMAX"));
wprim->append(M("TP_ICM_WORKING_PRIM_BRU"));
wprim->append(M("TP_ICM_WORKING_PRIM_BET"));
wprim->append(M("TP_ICM_WORKING_PRIM_BST"));
@ -381,11 +385,13 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, TOOL_NAME, M("TP_ICM_LABEL")), iu
aRendIntent->show();
riaHBox->pack_start(*aRendIntent->buttonGroup, Gtk::PACK_EXPAND_PADDING);
trcFrame->add(*trcProfVBox);
pack_start(*wFrame, Gtk::PACK_EXPAND_WIDGET);
pack_start(*trcFrame, Gtk::PACK_EXPAND_WIDGET);
pack_start(*redFrame, Gtk::PACK_EXPAND_WIDGET);
trcProfVBox->pack_start(*redFrame, Gtk::PACK_EXPAND_WIDGET);
trcExp->add(*trcProfVBox, false);
trcExp->setLevel (2);
pack_start(*trcExp, Gtk::PACK_EXPAND_WIDGET);
trcExp->set_expanded(false);
// ---------------------------- Output profile
@ -493,6 +499,14 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, TOOL_NAME, M("TP_ICM_LABEL")), iu
show_all();
}
void ICMPanel::foldAllButMe (GdkEventButton* event, MyExpander *expander)
{
if (event->button == 3) {
trcExp->set_expanded (trcExp == expander);
}
}
void ICMPanel::neutral_pressed ()
{ //find working profile and set the same destination proile
if (wProfNames->get_active_text() == "Rec2020") {
@ -509,6 +523,8 @@ void ICMPanel::neutral_pressed ()
wprim->set_active(toUnderlying(ColorManagementParams::Primaries::WIDE_GAMUT));
} else if (wProfNames->get_active_text() == "ACESp0") {
wprim->set_active(toUnderlying(ColorManagementParams::Primaries::ACES_P0));
} else if (wProfNames->get_active_text() == "JDCmax") {
wprim->set_active(toUnderlying(ColorManagementParams::Primaries::JDC_MAX));
} else if (wProfNames->get_active_text() == "BruceRGB") {
wprim->set_active(toUnderlying(ColorManagementParams::Primaries::BRUCE_RGB));
} else if (wProfNames->get_active_text() == "Beta RGB") {
@ -788,6 +804,7 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited)
ConnectionBlocker wtrcconn_(wtrcconn);
ConnectionBlocker willconn_(willconn);
ConnectionBlocker wprimconn_(wprimconn);
trcExp->set_expanded(false);
if (pp->icm.inputProfile.substr(0, 5) != "file:") {
ipDialog->set_filename(" ");
@ -1082,6 +1099,7 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited)
case ColorManagementParams::Primaries::ACES_P1:
case ColorManagementParams::Primaries::WIDE_GAMUT:
case ColorManagementParams::Primaries::ACES_P0:
case ColorManagementParams::Primaries::JDC_MAX:
case ColorManagementParams::Primaries::BRUCE_RGB:
case ColorManagementParams::Primaries::BETA_RGB:
case ColorManagementParams::Primaries::BEST_RGB: {
@ -1475,6 +1493,7 @@ void ICMPanel::wtrcinChanged()
case ColorManagementParams::Primaries::ACES_P1:
case ColorManagementParams::Primaries::WIDE_GAMUT:
case ColorManagementParams::Primaries::ACES_P0:
case ColorManagementParams::Primaries::JDC_MAX:
case ColorManagementParams::Primaries::BRUCE_RGB:
case ColorManagementParams::Primaries::BETA_RGB:
case ColorManagementParams::Primaries::BEST_RGB: {
@ -1507,7 +1526,7 @@ void ICMPanel::wtrcinChanged()
void ICMPanel::willChanged()
{
switch (ColorManagementParams::Primaries(wprim->get_active_row_number())) {
switch (ColorManagementParams::Primaries(wprim->get_active_row_number() )) {
case ColorManagementParams::Primaries::DEFAULT:
case ColorManagementParams::Primaries::SRGB:
case ColorManagementParams::Primaries::ADOBE_RGB:
@ -1516,6 +1535,7 @@ void ICMPanel::willChanged()
case ColorManagementParams::Primaries::ACES_P1:
case ColorManagementParams::Primaries::WIDE_GAMUT:
case ColorManagementParams::Primaries::ACES_P0:
case ColorManagementParams::Primaries::JDC_MAX:
case ColorManagementParams::Primaries::BRUCE_RGB:
case ColorManagementParams::Primaries::BETA_RGB:
case ColorManagementParams::Primaries::BEST_RGB: {
@ -1630,6 +1650,17 @@ void ICMPanel::wprimChanged()
break;
}
case ColorManagementParams::Primaries::JDC_MAX: {
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::D50));
break;
}
case ColorManagementParams::Primaries::BRUCE_RGB: {
redx->setValue(0.64);
redy->setValue(0.33);
@ -1722,6 +1753,14 @@ void ICMPanel::wprimChanged()
blux->setValue(0.0001);
bluy->setValue(-0.077);
will->set_active(toUnderlying(ColorManagementParams::Illuminant::D60));
} else if (wProfNames->get_active_text() == "JDCmax") {
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::D50));
} else if (wProfNames->get_active_text() == "BruceRGB") {
redx->setValue(0.64);
redy->setValue(0.33);
@ -1729,7 +1768,7 @@ void ICMPanel::wprimChanged()
grey->setValue(0.65);
blux->setValue(0.15);
bluy->setValue(0.06);
will->set_active(toUnderlying(ColorManagementParams::Illuminant::D65));
will->set_active(toUnderlying(ColorManagementParams::Illuminant::D65));
} else if (wProfNames->get_active_text() == "Beta RGB") {
redx->setValue(0.6888);
redy->setValue(0.3112);

View File

@ -49,6 +49,7 @@ protected:
Gtk::Frame* dcpFrame;
Gtk::Frame* coipFrame;
Gtk::Frame* redFrame;
MyExpander* trcExp;
Adjuster* wGamma;
Adjuster* wSlope;
@ -168,6 +169,7 @@ private:
Glib::ustring camName;
void updateDCP(int dcpIlluminant, Glib::ustring dcp_name);
void updateRenderingIntent(const Glib::ustring &profile);
void foldAllButMe (GdkEventButton* event, MyExpander *expander);
float nextrx;
float nextry;

View File

@ -703,6 +703,19 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited
expreti.updateMinMax(cdma, cdmin, mini, maxi, Tmean, Tsigma, Tmin, Tmax);
}
// Update Locallab Denoise tool lum/chro
if (pp->locallab.selspot < (int) denoiselc.size()) {
const double highres = denoiselc.at(pp->locallab.selspot).highres;
const double nres = denoiselc.at(pp->locallab.selspot).nres;
const double highres46 = denoiselc.at(pp->locallab.selspot).highres46;
const double nres46 = denoiselc.at(pp->locallab.selspot).nres46;
const double Lhighres = denoiselc.at(pp->locallab.selspot).Lhighres;
const double Lnres = denoiselc.at(pp->locallab.selspot).Lnres;
const double Lhighres46 = denoiselc.at(pp->locallab.selspot).Lhighres46;
const double Lnres46 = denoiselc.at(pp->locallab.selspot).Lnres46;
expblur.updatedenlc(highres, nres, highres46, nres46, Lhighres, Lnres, Lhighres46, Lnres46);
}
// Update default values according to selected spot
setDefaults(pp, pedited);
@ -1094,6 +1107,28 @@ void Locallab::minmaxChanged(const std::vector<locallabRetiMinMax> &minmax, int
}
}
void Locallab::denChanged(const std::vector<locallabDenoiseLC> &denlc, int selspot)
{
// Saving transmitted min/max data
denoiselc = denlc;
//Update Locallab Denoise tool lum chro
if (selspot < (int) denoiselc.size()) {
const double highres = denoiselc.at(selspot).highres;
const double nres = denoiselc.at(selspot).nres;
const double highres46 = denoiselc.at(selspot).highres46;
const double nres46 = denoiselc.at(selspot).nres46;
const double Lhighres = denoiselc.at(selspot).Lhighres;
const double Lnres = denoiselc.at(selspot).Lnres;
const double Lhighres46 = denoiselc.at(selspot).Lhighres46;
const double Lnres46 = denoiselc.at(selspot).Lnres46;
expblur.updatedenlc(highres, nres, highres46, nres46, Lhighres, Lnres, Lhighres46, Lnres46);
}
}
void Locallab::logencodChanged(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg, const bool autocomput, const bool autocie, const float jz1)
{
// Update Locallab Log Encoding and Ciecam accordingly

View File

@ -123,6 +123,9 @@ private:
// Locallab tools mask background management data
std::vector<locallabRetiMinMax> retiMinMax;
// Locallab tools mask background management data
std::vector<locallabDenoiseLC> denoiselc;
// Locallab tools mask background management data
std::vector<locallabRef> maskBackRef;
@ -145,6 +148,10 @@ public:
// Locallab Retinex tool min/man management function
void minmaxChanged(const std::vector<locallabRetiMinMax> &minmax, int selspot) override;
//Locallab denoise
// Locallab Retinex tool min/man management function
void denChanged(const std::vector<locallabDenoiseLC> &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;

View File

@ -3977,6 +3977,7 @@ LocallabShadow::LocallabShadow():
}
()),
detailSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DETAILSH"), -5, 5, 1, 0))),
tePivot(Gtk::manage(new Adjuster(M("TP_LOCALLAB_TE_PIVOT"), -12, 12, 0.05, 0))),
highlights(Gtk::manage(new Adjuster(M("TP_SHADOWSHLIGHTS_HIGHLIGHTS"), 0, 100, 1, 0))),
h_tonalwidth(Gtk::manage(new Adjuster(M("TP_SHADOWSHLIGHTS_HLTONALW"), 10, 100, 1, 70))),
shadows(Gtk::manage(new Adjuster(M("TP_SHADOWSHLIGHTS_SHADOWS"), 0, 100, 1, 0))),
@ -4017,7 +4018,8 @@ LocallabShadow::LocallabShadow():
LmaskSHshape(static_cast<DiagonalCurveEditor*>(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")), Gtk::manage(new RTImage("circle-white-small")))))
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);
@ -4034,6 +4036,7 @@ LocallabShadow::LocallabShadow():
}
detailSH->setAdjusterListener(this);
tePivot->setAdjusterListener(this);
reparsh->setAdjusterListener(this);
highlights->setAdjusterListener(this);
@ -4144,6 +4147,7 @@ LocallabShadow::LocallabShadow():
}
pack_start(*detailSH);
pack_start(*tePivot);
pack_start(*highlights);
pack_start(*h_tonalwidth);
pack_start(*shadows);
@ -4364,6 +4368,7 @@ void LocallabShadow::read(const rtengine::procparams::ProcParams* pp, const Para
decays->setValue((double)spot.decays);
detailSH->setValue((double)spot.detailSH);
tePivot->setValue(spot.tePivot);
reparsh->setValue(spot.reparsh);
highlights->setValue((double)spot.highlights);
h_tonalwidth->setValue((double)spot.h_tonalwidth);
@ -4429,6 +4434,7 @@ void LocallabShadow::write(rtengine::procparams::ProcParams* pp, ParamsEdited* p
}
spot.detailSH = detailSH->getIntValue();
spot.tePivot = tePivot->getValue();
spot.reparsh = reparsh->getValue();
spot.highlights = highlights->getIntValue();
spot.h_tonalwidth = h_tonalwidth->getIntValue();
@ -4477,6 +4483,7 @@ void LocallabShadow::setDefaults(const rtengine::procparams::ProcParams* defPara
}
detailSH->setDefault((double)defSpot.detailSH);
tePivot->setDefault(defSpot.tePivot);
reparsh->setDefault(defSpot.reparsh);
highlights->setDefault((double)defSpot.highlights);
h_tonalwidth->setDefault((double)defSpot.h_tonalwidth);
@ -4528,6 +4535,13 @@ void LocallabShadow::adjusterChanged(Adjuster* a, double newval)
}
}
if (a == tePivot) {
if (listener) {
listener->panelChanged(EvlocallabTePivot,
tePivot->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")");
}
}
if (a == reparsh) {
if (listener) {
listener->panelChanged(Evlocallabreparsh,
@ -5044,6 +5058,7 @@ void LocallabShadow::updateShadowGUI2()
gamFrame->hide();
detailSH->hide();
tePivot->hide();
highlights->show();
h_tonalwidth->show();
shadows->show();
@ -5059,6 +5074,7 @@ void LocallabShadow::updateShadowGUI2()
}
detailSH->show();
tePivot->show();
highlights->hide();
h_tonalwidth->hide();
shadows->hide();
@ -6477,8 +6493,17 @@ LocallabBlur::LocallabBlur():
activlum(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ACTIV")))),
expdenoise(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI_EXP")))),
quamethod(Gtk::manage(new MyComboBoxText())),
expdenoisenl(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_NLFRA")))),
expdenoiselum(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOIWAVLUM")))),
expdenoisech(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOIWAVCH")))),
LocalcurveEditorwavden(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_WAVDEN"))),
wavshapeden(static_cast<FlatCurveEditor*>(LocalcurveEditorwavden->addCurve(CT_Flat, "", nullptr, false, false))),
// lCLabels(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_LCLABELS")))),
lCLabels(Gtk::manage(new Gtk::Label("-----------------"))),
lumLabels(Gtk::manage(new Gtk::Label("---"))),
lum46Labels(Gtk::manage(new Gtk::Label("---"))),
chroLabels(Gtk::manage(new Gtk::Label("---"))),
chro46Labels(Gtk::manage(new Gtk::Label("---"))),
expdenoise1(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI1_EXP")))),
maskusable(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))),
maskunusable(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))),
@ -6514,7 +6539,7 @@ LocallabBlur::LocallabBlur():
decayd(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKDDECAY"), 0.5, 4., 0.1, 2.))),
invmaskd(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVMASK")))),
invmask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVMASK")))),
nlFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_NLFRA")))),
prevFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LCLABELS")))),
nlstr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NLLUM"), 0, 100, 1, 0))),
nldet(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NLDET"), 0, 100, 1, 50))),
nlpat(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NLPAT"), 1, 5, 1, 2))),
@ -6640,12 +6665,23 @@ LocallabBlur::LocallabBlur():
Gtk::Label* const quaLabel = Gtk::manage(new Gtk::Label(M("TP_WAVELET_DENQUA") + ":"));
quaHBox->pack_start(*quaLabel, Gtk::PACK_SHRINK, 4);
quaHBox->pack_start(*quamethod);
setExpandAlignProperties(expdenoisenl, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START);
setExpandAlignProperties(expdenoiselum, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START);
setExpandAlignProperties(expdenoisech, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START);
LocalcurveEditorwavden->setCurveListener(this);
wavshapeden->setIdentityValue(0.);
wavshapeden->setResetCurve(FlatCurveType(defSpot.locwavcurveden.at(0)), defSpot.locwavcurveden);
setExpandAlignProperties(lCLabels, true, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_START);
setExpandAlignProperties(lumLabels, true, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_START);
setExpandAlignProperties(lum46Labels, true, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_START);
setExpandAlignProperties(chroLabels, true, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_START);
setExpandAlignProperties(chro46Labels, true, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_START);
LocalcurveEditorwavden->curveListComplete();
setExpandAlignProperties(expdenoise1, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START);
@ -6701,7 +6737,7 @@ LocallabBlur::LocallabBlur():
decayd->setAdjusterListener(this);
bilateral->setAdjusterListener(this);
nlFrame->set_label_align(0.025, 0.5);
prevFrame->set_label_align(0.025, 0.5);
nlstr->setAdjusterListener(this);
nldet->setAdjusterListener(this);
@ -6838,30 +6874,16 @@ LocallabBlur::LocallabBlur():
Gtk::Frame* const wavFrame = Gtk::manage(new Gtk::Frame());
ToolParamBlock* const wavBox = Gtk::manage(new ToolParamBlock());
wavBox->pack_start(*quaHBox);
wavBox->pack_start(*LocalcurveEditorwavden, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor
// 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(*noiselumdetail);
wavBox->pack_start(*noiselequal);
wavBox->pack_start(*noisegam);
wavBox->pack_start(*LocalcurveEditorwavhue, Gtk::PACK_SHRINK, 4);
ToolParamBlock* const wavBox1 = Gtk::manage(new ToolParamBlock());
wavBox1->pack_start(*maskusable, Gtk::PACK_SHRINK, 0);
wavBox1->pack_start(*maskunusable, Gtk::PACK_SHRINK, 0);
wavBox1->pack_start(*lnoiselow, Gtk::PACK_SHRINK, 0);
wavBox1->pack_start(*levelthrlow, Gtk::PACK_SHRINK, 0);
wavBox1->pack_start(*levelthr, Gtk::PACK_SHRINK, 0);
expdenoise1->add(*wavBox1, false);
wavBox->pack_start(*expdenoise1);
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);
denoisebox->pack_start(*sensiden);
denoisebox->pack_start(*reparden);
wavBox->pack_start(*sensiden);
wavBox->pack_start(*reparden);
ToolParamBlock* const prevBox = Gtk::manage(new ToolParamBlock());
prevBox->pack_start(*lumLabels);
prevBox->pack_start(*lum46Labels);
prevBox->pack_start(*lCLabels);
prevBox->pack_start(*chroLabels);
prevBox->pack_start(*chro46Labels);
prevFrame->add(*prevBox);
wavBox->pack_start(*prevFrame);
ToolParamBlock* const nlbox = Gtk::manage(new ToolParamBlock());
nlbox->pack_start(*nlstr);
@ -6869,13 +6891,46 @@ LocallabBlur::LocallabBlur():
nlbox->pack_start(*nlgam);
nlbox->pack_start(*nlpat);
nlbox->pack_start(*nlrad);
nlFrame->add(*nlbox);
wavBox->pack_start(*nlFrame);
expdenoisenl->add(*nlbox);
wavBox->pack_start(*noisechrof);
wavBox->pack_start(*noisechroc);
wavBox->pack_start(*noisechrodetail);
wavBox->pack_start(*adjblur);
wavBox->pack_start(*expdenoisenl);
// wavBox->pack_start(*noiselumf0);
// wavBox->pack_start(*noiselumf);
// wavBox->pack_start(*noiselumf2);
// wavBox->pack_start(*noiselumc);//unused here, but used for normalize_mean_dt
ToolParamBlock* const wchBox = Gtk::manage(new ToolParamBlock());
wchBox->pack_start(*LocalcurveEditorwavden, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor
wchBox->pack_start(*noiselumdetail);
wchBox->pack_start(*noiselequal);
wchBox->pack_start(*noisegam);
wchBox->pack_start(*LocalcurveEditorwavhue, Gtk::PACK_SHRINK, 4);
ToolParamBlock* const wavBox1 = Gtk::manage(new ToolParamBlock());
wavBox1->pack_start(*maskusable, Gtk::PACK_SHRINK, 0);
wavBox1->pack_start(*maskunusable, Gtk::PACK_SHRINK, 0);
wavBox1->pack_start(*lnoiselow, Gtk::PACK_SHRINK, 0);
wavBox1->pack_start(*levelthrlow, Gtk::PACK_SHRINK, 0);
wavBox1->pack_start(*levelthr, Gtk::PACK_SHRINK, 0);
expdenoise1->add(*wavBox1, false);
wchBox->pack_start(*expdenoise1);
expdenoiselum->add(*wchBox);
wavBox->pack_start(*expdenoiselum);
ToolParamBlock* const chBox = Gtk::manage(new ToolParamBlock());
chBox->pack_start(*noisechrof);
chBox->pack_start(*noisechroc);
chBox->pack_start(*noisechrodetail);
chBox->pack_start(*adjblur);
expdenoisech->add(*chBox);
wavBox->pack_start(*expdenoisech);
ToolParamBlock* const detailBox = Gtk::manage(new ToolParamBlock());
detailBox->pack_start(*detailthr);
detailBox->pack_start(*usemask, Gtk::PACK_SHRINK, 0);
detailFrame->add(*detailBox);
wavBox->pack_start(*detailFrame);
wavFrame->add(*wavBox);
denoisebox->pack_start(*wavFrame);
@ -6978,6 +7033,7 @@ void LocallabBlur::updateAdviceTooltips(const bool showTooltips)
expdenoise1->set_tooltip_markup(M("TP_LOCALLAB_MASKLC_TOOLTIP"));
expdenoise2->set_tooltip_markup(M("TP_LOCALLAB_MASKGF_TOOLTIP"));
expdenoise3->set_tooltip_markup(M("TP_LOCALLAB_MASKDE_TOOLTIP"));
expdenoisenl->set_tooltip_markup(M("TP_LOCALLAB_NLFRAME_TOOLTIP"));
invmask->set_tooltip_text(M("TP_LOCALLAB_MASKDEINV_TOOLTIP"));
invmaskd->set_tooltip_text(M("TP_LOCALLAB_MASKDEINV_TOOLTIP"));
LocalcurveEditorwavden->setTooltip(M("TP_LOCALLAB_WASDEN_TOOLTIP"));
@ -6990,7 +7046,7 @@ void LocallabBlur::updateAdviceTooltips(const bool showTooltips)
detailthr->set_tooltip_text(M("TP_LOCALLAB_DENOITHR_TOOLTIP"));
adjblur->set_tooltip_text(M("TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP"));
bilateral->set_tooltip_text(M("TP_LOCALLAB_DENOIBILAT_TOOLTIP"));
nlFrame->set_tooltip_text(M("TP_LOCALLAB_NLFRAME_TOOLTIP"));
prevFrame->set_tooltip_text(M("TP_LOCALLAB_LCLABELS_TOOLTIP"));
nlstr->set_tooltip_text(M("TP_LOCALLAB_NLDENOISE_TOOLTIP"));
nldet->set_tooltip_text(M("TP_LOCALLAB_NLDENOISE_TOOLTIP"));
nlpat->set_tooltip_text(M("TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP"));
@ -7025,6 +7081,7 @@ void LocallabBlur::updateAdviceTooltips(const bool showTooltips)
higthresd->set_tooltip_text(M("TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP"));
higthres->set_tooltip_text(M("TP_LOCALLAB_MASKHIGTHRES_TOOLTIP"));
decayd->set_tooltip_text(M("TP_LOCALLAB_MASKDECAY_TOOLTIP"));
lCLabels->set_tooltip_text(M("TP_LOCALLAB_LCLABELS_TOOLTIP"));
} else {
expblnoise->set_tooltip_markup("");
@ -7057,7 +7114,7 @@ void LocallabBlur::updateAdviceTooltips(const bool showTooltips)
detailthr->set_tooltip_text("");
adjblur->set_tooltip_text("");
bilateral->set_tooltip_text("");
nlFrame->set_tooltip_text("");
prevFrame->set_tooltip_text("");
nlstr->set_tooltip_text("");
nldet->set_tooltip_text("");
nlpat->set_tooltip_text("");
@ -7094,6 +7151,8 @@ void LocallabBlur::updateAdviceTooltips(const bool showTooltips)
higthres->set_tooltip_text("");
// midthresd->set_tooltip_text("");
decayd->set_tooltip_text("");
lCLabels->set_tooltip_text("");
expdenoisenl->set_tooltip_markup("");
}
}
@ -7138,7 +7197,36 @@ void LocallabBlur::neutral_pressed ()
}
void LocallabBlur::updatedenlc(const double highres, const double nres, const double highres46, const double nres46, const double Lhighres, const double Lnres, const double Lhighres46, const double Lnres46)
{
idle_register.add(
[this, highres, nres, highres46, nres46, Lhighres, Lnres, Lhighres46, Lnres46]() -> bool {
GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected
lumLabels->set_text(
Glib::ustring::compose(M("TP_LOCALLAB_LUMLABEL"),
Glib::ustring::format(std::fixed, std::setprecision(0), Lnres),
Glib::ustring::format(std::fixed, std::setprecision(0), Lhighres))
);
lum46Labels->set_text(
Glib::ustring::compose(M("TP_LOCALLAB_LUM46LABEL"),
Glib::ustring::format(std::fixed, std::setprecision(0), Lnres46 ),
Glib::ustring::format(std::fixed, std::setprecision(0), Lhighres46))
);
chroLabels->set_text(
Glib::ustring::compose(M("TP_LOCALLAB_CHROLABEL"),
Glib::ustring::format(std::fixed, std::setprecision(0), nres),
Glib::ustring::format(std::fixed, std::setprecision(0), highres))
);
chro46Labels->set_text(
Glib::ustring::compose(M("TP_LOCALLAB_CHRO46LABEL"),
Glib::ustring::format(std::fixed, std::setprecision(0), nres46),
Glib::ustring::format(std::fixed, std::setprecision(0), highres46))
);
return false;
}
);
}
void LocallabBlur::setDefaultExpanderVisibility()
{
expblnoise->set_expanded(false);
@ -7147,6 +7235,9 @@ void LocallabBlur::setDefaultExpanderVisibility()
expdenoise2->set_expanded(false);
expdenoise3->set_expanded(false);
expmaskbl->set_expanded(false);
expdenoisenl->set_expanded(false);
expdenoiselum->set_expanded(false);
expdenoisech->set_expanded(false);
}
void LocallabBlur::disableListener()

View File

@ -451,6 +451,7 @@ private:
Adjuster* const reparsh;
const std::array<Adjuster*, 5> multipliersh;
Adjuster* const detailSH;
Adjuster* const tePivot;
Adjuster* const highlights;
Adjuster* const h_tonalwidth;
Adjuster* const shadows;
@ -492,6 +493,8 @@ private:
Adjuster* const fatamountSH;
Adjuster* const fatanchorSH;
rtengine::ProcEvent EvlocallabTePivot;
sigc::connection shMethodConn, inversshConn, showmaskSHMethodConn, showmaskSHMethodConninv, enaSHMaskConn;
public:
@ -707,8 +710,17 @@ private:
Gtk::CheckButton* const activlum;
MyExpander* const expdenoise;
MyComboBoxText* const quamethod;
MyExpander* const expdenoisenl;
MyExpander* const expdenoiselum;
MyExpander* const expdenoisech;
CurveEditorGroup* const LocalcurveEditorwavden;
FlatCurveEditor* const wavshapeden;
Gtk::Label* const lCLabels;
Gtk::Label* const lumLabels;
Gtk::Label* const lum46Labels;
Gtk::Label* const chroLabels;
Gtk::Label* const chro46Labels;
MyExpander* const expdenoise1;
Gtk::Label* const maskusable;
Gtk::Label* const maskunusable;
@ -746,7 +758,7 @@ private:
Gtk::CheckButton* const invmaskd;
Gtk::CheckButton* const invmask;
Gtk::Frame* const nlFrame;
Gtk::Frame* const prevFrame;
Adjuster* const nlstr;
Adjuster* const nldet;
Adjuster* const nlpat;
@ -788,6 +800,8 @@ private:
public:
LocallabBlur();
~LocallabBlur();
void updatedenlc(const double highres, const double nres, const double highres46, const double nres46, const double Lhighres, const double Lnres, const double Lhighres46, const double Lnres46);
bool isMaskViewActive() override;
void resetMaskView() override;

View File

@ -20,15 +20,23 @@
#include "lockablecolorpicker.h"
#include "options.h"
#include "../rtengine/color.h"
#include "../rtengine/improcfun.h"
#include "../rtengine/rt_math.h"
#include "../rtengine/utils.h"
#include "imagearea.h"
#include "multilangmgr.h"
#include "navigator.h"
LockableColorPicker::LockableColorPicker (CropWindow* cropWindow, Glib::ustring *oProfile, Glib::ustring *wProfile)
namespace
{
const rtengine::procparams::ColorManagementParams DEFAULT_CMP;
}
LockableColorPicker::LockableColorPicker (CropWindow* cropWindow, rtengine::procparams::ColorManagementParams *color_management_params)
: cropWindow(cropWindow), displayedValues(ColorPickerType::RGB), position(0, 0), size(Size::S15),
outputProfile(oProfile), workingProfile(wProfile), validity(Validity::OUTSIDE),
color_management_params(color_management_params), validity(Validity::OUTSIDE),
r(0.f), g(0.f), b(0.f), rpreview(0.f), gpreview(0.f), bpreview(0.f), hue(0.f), sat(0.f), val(0.f), L(0.f), a(0.f), bb(0.f)
{}
@ -289,7 +297,16 @@ void LockableColorPicker::setRGB (const float R, const float G, const float B, c
bpreview = previewB;
rtengine::Color::rgb2hsv01(r, g, b, hue, sat, val);
rtengine::Color::rgb2lab01(*outputProfile, *workingProfile, r, g, b, L, a, bb, options.rtSettings.HistogramWorking); // TODO: Really sure this function works?
rtengine::ImProcFunctions::rgb2lab(
static_cast<std::uint8_t>(255 * r),
static_cast<std::uint8_t>(255 * g),
static_cast<std::uint8_t>(255 * b),
L, a, bb,
color_management_params != nullptr ? *color_management_params : DEFAULT_CMP,
true);
L /= 327.68f;
a /= 327.68f;
bb /= 327.68f;
if (validity != Validity::OUTSIDE) {
setDirty(true);

View File

@ -24,6 +24,18 @@
class CropWindow;
namespace rtengine
{
namespace procparams
{
struct ColorManagementParams;
}
}
class LockablePickerToolListener
{
public:
@ -60,8 +72,7 @@ private:
rtengine::Coord position; // Coordinate in image space
rtengine::Coord anchorOffset;
Size size;
Glib::ustring *outputProfile;
Glib::ustring *workingProfile;
rtengine::procparams::ColorManagementParams *color_management_params;
Validity validity;
float r, g, b; // red green blue in [0;1] range
float rpreview, gpreview, bpreview;
@ -72,7 +83,7 @@ private:
public:
LockableColorPicker (CropWindow* cropWindow, Glib::ustring *oProfile, Glib::ustring *wProfile);
LockableColorPicker (CropWindow* cropWindow, rtengine::procparams::ColorManagementParams *color_management_params);
void draw (const Cairo::RefPtr<Cairo::Context> &cr);

View File

@ -20,6 +20,8 @@
#include <fstream>
#include <glib.h>
#include <iostream>
#include <utility>
#ifdef WIN32
#include <windows.h>
#include <winnls.h>
@ -28,6 +30,8 @@
#include <CoreFoundation/CoreFoundation.h>
#endif
#include "../rtengine/settings.h"
namespace
{
@ -162,6 +166,25 @@ void setGtkLanguage(const Glib::ustring &language)
}
TranslationMetadata::TranslationMetadata(std::map<std::string, std::string> &&metadata) :
metadata(std::move(metadata))
{
}
std::string TranslationMetadata::get(const std::string &key, const std::string &default_value) const
{
const auto found_entry = metadata.find(key);
if (found_entry == metadata.end()) {
return default_value;
}
return found_entry->second;
}
std::string TranslationMetadata::getLanguageName(const std::string &default_name) const
{
return get("LANGUAGE_DISPLAY_NAME", default_name);
}
MultiLangMgr langMgr;
MultiLangMgr::MultiLangMgr ()
@ -219,6 +242,77 @@ Glib::ustring MultiLangMgr::getStr (const std::string& key) const
return key;
}
const TranslationMetadata *MultiLangMgr::getMetadata(const Glib::ustring &fname) const
{
static const char comment_symbol = '#';
static const char *space_chars = " \t";
static const char var_symbol = '@';
static const char key_value_separator = '=';
// Look for the metadata in the cache.
const auto &found_metadata = lang_files_metadata.find(fname);
if (found_metadata != lang_files_metadata.end()) {
return &found_metadata->second;
}
std::ifstream file(fname.c_str());
if (!file.is_open()) {
if (rtengine::settings->verbose) {
std::cerr << "Unable to open language file " << fname << " to get metadata." << std::endl;
}
return nullptr;
}
if (rtengine::settings->verbose) {
std::cout << "Reading metadata from language file " << fname << std::endl;
}
std::map<std::string, std::string> raw_metadata;
const auto read_key_value = [&raw_metadata](const std::string &meta_line) {
// One metadata key-value pair per line. The format is as follows:
// #001 @KEY=VALUE
// The line must begin with the comment symbol (#). After the first
// sequence of whitespace characters, the metadata variable symbol (@)
// must appear. It is followed immediately with the key name. The end of
// the key name is marked with the equal sign (=). All remaining
// characters until the end of the line make up the metadata value.
if (meta_line.empty() || meta_line.front() != comment_symbol) {
return;
}
const auto first_space = meta_line.find_first_of(space_chars, 1);
if (first_space == std::string::npos) {
return;
}
const auto definition_start = meta_line.find_first_not_of(space_chars, first_space + 1);
if (definition_start == std::string::npos || meta_line[definition_start] != var_symbol) {
return;
}
const auto separator_pos = meta_line.find(key_value_separator, definition_start + 1);
if (separator_pos == std::string::npos) {
return;
}
std::string key = meta_line.substr(definition_start + 1, separator_pos - definition_start - 1);
std::string value = meta_line.substr(separator_pos + 1);
if (rtengine::settings->verbose) {
std::cout << "Found metadata key " << key << " with value " << value << std::endl;
}
raw_metadata.emplace(std::move(key), std::move(value));
};
// Read lines in order. Metadata only appear in the first section of each
// file.
for (
std::string line;
std::getline(file, line) && (line.empty() ||
line.front() == comment_symbol ||
line.find_first_not_of(space_chars) == std::string::npos);) {
read_key_value(line);
}
// Add metadata to cache and return.
lang_files_metadata[fname] = TranslationMetadata(std::move(raw_metadata));
return &lang_files_metadata[fname];
}
bool MultiLangMgr::isOSLanguageDetectSupported ()
{
#if defined (WIN32) || defined (__linux__) || defined (__APPLE__)

View File

@ -24,6 +24,25 @@
#include <glibmm/ustring.h>
class TranslationMetadata
{
public:
TranslationMetadata() = default;
~TranslationMetadata() = default;
TranslationMetadata(const TranslationMetadata &other) = delete;
TranslationMetadata(TranslationMetadata &&other) = delete;
explicit TranslationMetadata(std::map<std::string, std::string> &&metadata);
TranslationMetadata &operator =(const TranslationMetadata &other) = delete;
TranslationMetadata &operator =(TranslationMetadata &&other) noexcept = default;
std::string get(const std::string &key, const std::string &default_value) const;
std::string getLanguageName(const std::string &default_name) const;
private:
std::map<std::string, std::string> metadata;
};
class MultiLangMgr
{
public:
@ -31,11 +50,13 @@ public:
void load(const Glib::ustring &language, const std::vector<Glib::ustring> &fnames);
Glib::ustring getStr(const std::string& key) const;
const TranslationMetadata *getMetadata(const Glib::ustring &fname) const;
static bool isOSLanguageDetectSupported();
static Glib::ustring getOSUserLanguage();
private:
std::map<std::string, Glib::ustring> translations;
mutable std::map<Glib::ustring, TranslationMetadata> lang_files_metadata;
};
extern MultiLangMgr langMgr;

Some files were not shown because too many files have changed in this diff Show More