diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index e483ace01..4fa09ee98 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -14,16 +14,16 @@ on:
- created
jobs:
build:
- runs-on: macos-10.15
+ runs-on: macos-latest
steps:
- - uses: actions/checkout@v1
+ - uses: actions/checkout@v2
- name: Install dependencies
run: |
date -u
mkdir build
date +%s > build/stamp
brew uninstall --ignore-dependencies libtiff
- brew install libtiff gtk+3 gtkmm3 gtk-mac-integration adwaita-icon-theme libsigc++ little-cms2 libiptcdata fftw lensfun expat pkgconfig libomp shared-mime-info | tee -a depslog
+ brew install libtiff gtk+3 gtkmm3 gtk-mac-integration adwaita-icon-theme libsigc++@2 little-cms2 libiptcdata fftw lensfun expat pkgconfig libomp shared-mime-info | tee -a depslog
date -u
echo "----====Pourage====----"
cat depslog | grep Pouring
@@ -82,11 +82,11 @@ jobs:
echo "=== artifact: ${ARTIFACT}"
# defining environment variables for next step as per
# https://github.com/actions/starter-workflows/issues/68
- echo "::set-env name=ARTIFACT_PATH::${GITHUB_WORKSPACE}/build/${ARTIFACT}"
- echo "::set-env name=ARTIFACT_FILE::${ARTIFACT}"
+ echo "ARTIFACT_PATH=${GITHUB_WORKSPACE}/build/${ARTIFACT}" >> $GITHUB_ENV
+ echo "ARTIFACT_FILE=${ARTIFACT}" >> $GITHUB_ENV
zsh -c 'echo "Bundled in $(printf "%0.2f" $(($[$(date +%s)-$(cat bundlestamp)]/$((60.))))) minutes"'
exit
- - uses: actions/upload-artifact@v1
+ - uses: actions/upload-artifact@v2
with:
name: ${{env.ARTIFACT_FILE}}
path: ${{env.ARTIFACT_PATH}}
diff --git a/AUTHORS.txt b/AUTHORS.txt
index 227390faa..ec40f75e1 100644
--- a/AUTHORS.txt
+++ b/AUTHORS.txt
@@ -7,6 +7,7 @@ Development contributors, in last name alphabetical order:
Roel Baars
Martin Burri
+ Pierre Cabrera
Javier Celaya
Jacques Desmis
Pavlov Dmitry
@@ -14,12 +15,14 @@ Development contributors, in last name alphabetical order:
Maciek Dworak
Michael Ezra
Flössie
+ Rüdiger Franke
Jean-Christophe Frisch
Ilias Giarimis
Alberto Griggio
Steve Herrell
Philippe Hupé
Wolfgang Kuehnel
+ Lawrence Lee
Guokai Ma
Emil Martinec
Wyatt Olson
@@ -36,8 +39,9 @@ Development contributors, in last name alphabetical order:
Ingo Weyrich
Makoto Yoshida
-Other contributors (profiles, ideas, mockups, testing, forum activity, translations, etc.), in last name alphabetical order:
+Other contributors (profiles, ideas, mockups, testing, forum activity, translations, tutorials etc.), in last name alphabetical order:
+ Andy Astbury
Marcin Bajor
Javier Bartol
Thorsten Bartolomäus
@@ -56,12 +60,14 @@ Other contributors (profiles, ideas, mockups, testing, forum activity, translati
Oscar de Lama
Lebarhon
Karl Loncarek
+ Patrick Lopatto
Jie Luo
Paul Matthijsse
Wim ter Meer
Alberto Righetto
Kostia (Kildor) Romanov
Kalle Söderman
+ Wayne Sutton
Johan Thor
Vitalis Tiknius
TooWaBoo
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7d66109e0..cc5c2b09b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -44,6 +44,13 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION
"Building RawTherapee requires using GCC version 4.9 or higher!")
endif()
+# Warning for GCC 10, which causes problems #5749:
+if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL "10.1")
+ message(STATUS "WARNING: gcc ${CMAKE_CXX_COMPILER_VERSION} is known to miscompile RawTherapee when using -ftree-loop-vectorize, forcing the option to be off")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-tree-loop-vectorize")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-tree-loop-vectorize")
+endif()
+
# We might want to build using the old C++ ABI, even when using a new GCC
# version:
if(USE_OLD_CXX_ABI)
@@ -68,6 +75,11 @@ set(CACHE_NAME_SUFFIX
""
CACHE STRING "RawTherapee's cache folder suffix")
+# For macOS only, OSX_DEV_BUILD option allows using relative paths instead of absolute
+# paths. Consequently, for development builds, application can be launching without
+# being bundled. However, file access can be restricted for some folder.
+option(OSX_DEV_BUILD "Generate macOS development builds" OFF)
+
# By default we don't use a specific processor target, so PROC_TARGET_NUMBER is
# set to 0. Specify other values to optimize for specific processor architecture
# as listed in ProcessorTargets.cmake:
@@ -444,13 +456,13 @@ if(GTK_VERSION VERSION_GREATER "3.24.1" AND GTK_VERSION VERSION_LESS "3.24.7")
)
endif()
-pkg_check_modules(GLIB2 REQUIRED glib-2.0>=2.44)
-pkg_check_modules(GLIBMM REQUIRED glibmm-2.4>=2.44)
+pkg_check_modules(GLIB2 REQUIRED glib-2.0>=2.48)
+pkg_check_modules(GLIBMM REQUIRED glibmm-2.4>=2.48)
pkg_check_modules(CAIROMM REQUIRED cairomm-1.0)
-pkg_check_modules(GIO REQUIRED gio-2.0>=2.44)
-pkg_check_modules(GIOMM REQUIRED giomm-2.4>=2.44)
-pkg_check_modules(GTHREAD REQUIRED gthread-2.0>=2.44)
-pkg_check_modules(GOBJECT REQUIRED gobject-2.0>=2.44)
+pkg_check_modules(GIO REQUIRED gio-2.0>=2.48)
+pkg_check_modules(GIOMM REQUIRED giomm-2.4>=2.48)
+pkg_check_modules(GTHREAD REQUIRED gthread-2.0>=2.48)
+pkg_check_modules(GOBJECT REQUIRED gobject-2.0>=2.48)
pkg_check_modules(SIGC REQUIRED sigc++-2.0>=2.3.1)
pkg_check_modules(LENSFUN REQUIRED lensfun>=0.2)
pkg_check_modules(RSVG REQUIRED librsvg-2.0>=2.40)
@@ -481,7 +493,11 @@ endif()
# Check for libcanberra-gtk3 (sound events on Linux):
if(UNIX AND (NOT APPLE))
- pkg_check_modules(CANBERRA-GTK REQUIRED libcanberra-gtk3)
+ option(USE_LIBCANBERRA "Build with libcanberra" ON)
+ if(USE_LIBCANBERRA)
+ pkg_check_modules(CANBERRA-GTK REQUIRED libcanberra-gtk3)
+ add_definitions(-DUSE_CANBERRA)
+ endif()
endif()
if(WITH_MYFILE_MMAP)
@@ -625,14 +641,8 @@ else()
endif()
# Get compiler name and version.
- get_filename_component(COMPILER_INFO ${CMAKE_C_COMPILER} NAME_WE)
- set(COMPILER_INFO "${COMPILER_INFO} ${CMAKE_C_COMPILER_VERSION}")
-if(NOT APPLE)
- execute_process(
- COMMAND gcc -dumpversion
- OUTPUT_VARIABLE GCC_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
- set(COMPILER_INFO "gcc ${GCC_VERSION}")
-endif()
+get_filename_component(COMPILER_INFO ${CMAKE_C_COMPILER} NAME_WE)
+set(COMPILER_INFO "${COMPILER_INFO} ${CMAKE_C_COMPILER_VERSION}")
# Get C++ and linker flags for rtengine (the GUI's C++ flags may have fewer
# flags):
diff --git a/rtdata/dcpprofiles/CANON EOS 5D MARK IV.dcp b/rtdata/dcpprofiles/Canon EOS 5D Mark IV.dcp
similarity index 100%
rename from rtdata/dcpprofiles/CANON EOS 5D MARK IV.dcp
rename to rtdata/dcpprofiles/Canon EOS 5D Mark IV.dcp
diff --git a/rtdata/dcpprofiles/Canon EOS 90D.dcp b/rtdata/dcpprofiles/Canon EOS 90D.dcp
new file mode 100644
index 000000000..e50e677b1
Binary files /dev/null and b/rtdata/dcpprofiles/Canon EOS 90D.dcp differ
diff --git a/rtdata/dcpprofiles/CANON EOS M6 MARK II.dcp b/rtdata/dcpprofiles/Canon EOS M6 Mark II.dcp
similarity index 100%
rename from rtdata/dcpprofiles/CANON EOS M6 MARK II.dcp
rename to rtdata/dcpprofiles/Canon EOS M6 Mark II.dcp
diff --git a/rtdata/dcpprofiles/CANON EOS R.dcp b/rtdata/dcpprofiles/Canon EOS R.dcp
similarity index 100%
rename from rtdata/dcpprofiles/CANON EOS R.dcp
rename to rtdata/dcpprofiles/Canon EOS R.dcp
diff --git a/rtdata/dcpprofiles/Canon EOS R5.dcp b/rtdata/dcpprofiles/Canon EOS R5.dcp
new file mode 100644
index 000000000..88f94620d
Binary files /dev/null and b/rtdata/dcpprofiles/Canon EOS R5.dcp differ
diff --git a/rtdata/dcpprofiles/Canon EOS R6.dcp b/rtdata/dcpprofiles/Canon EOS R6.dcp
new file mode 100644
index 000000000..7aaa04ab2
Binary files /dev/null and b/rtdata/dcpprofiles/Canon EOS R6.dcp differ
diff --git a/rtdata/dcpprofiles/CANON POWERSHOT G1 X MARK II.dcp b/rtdata/dcpprofiles/Canon PowerShot G1 X Mark II.dcp
similarity index 100%
rename from rtdata/dcpprofiles/CANON POWERSHOT G1 X MARK II.dcp
rename to rtdata/dcpprofiles/Canon PowerShot G1 X Mark II.dcp
diff --git a/rtdata/dcpprofiles/FUJIFILM X-PRO3.dcp b/rtdata/dcpprofiles/FUJIFILM X-Pro3.dcp
similarity index 100%
rename from rtdata/dcpprofiles/FUJIFILM X-PRO3.dcp
rename to rtdata/dcpprofiles/FUJIFILM X-Pro3.dcp
diff --git a/rtdata/dcpprofiles/OLYMPUS E-M5MARKII.dcp b/rtdata/dcpprofiles/OLYMPUS E-M5MarkII.dcp
similarity index 100%
rename from rtdata/dcpprofiles/OLYMPUS E-M5MARKII.dcp
rename to rtdata/dcpprofiles/OLYMPUS E-M5MarkII.dcp
diff --git a/rtdata/dcpprofiles/Panasonic DC-S5.dcp b/rtdata/dcpprofiles/Panasonic DC-S5.dcp
new file mode 100644
index 000000000..fd01c1225
Binary files /dev/null and b/rtdata/dcpprofiles/Panasonic DC-S5.dcp differ
diff --git a/rtdata/iccprofiles/output/RTv2_Medium.icc b/rtdata/iccprofiles/output/RTv2_Medium.icc
index ebaf4d133..930f38a71 100644
Binary files a/rtdata/iccprofiles/output/RTv2_Medium.icc and b/rtdata/iccprofiles/output/RTv2_Medium.icc differ
diff --git a/rtdata/images/svg/bidirectional-arrow-horizontal-hicontrast.svg b/rtdata/images/svg/bidirectional-arrow-horizontal-hicontrast.svg
new file mode 100644
index 000000000..f2712cee9
--- /dev/null
+++ b/rtdata/images/svg/bidirectional-arrow-horizontal-hicontrast.svg
@@ -0,0 +1,127 @@
+
+
diff --git a/rtdata/images/svg/bidirectional-arrow-horizontal-prelight.svg b/rtdata/images/svg/bidirectional-arrow-horizontal-prelight.svg
new file mode 100644
index 000000000..6382cc546
--- /dev/null
+++ b/rtdata/images/svg/bidirectional-arrow-horizontal-prelight.svg
@@ -0,0 +1,127 @@
+
+
diff --git a/rtdata/images/svg/bidirectional-arrow-vertical-hicontrast.svg b/rtdata/images/svg/bidirectional-arrow-vertical-hicontrast.svg
new file mode 100644
index 000000000..93cb21a43
--- /dev/null
+++ b/rtdata/images/svg/bidirectional-arrow-vertical-hicontrast.svg
@@ -0,0 +1,127 @@
+
+
diff --git a/rtdata/images/svg/bidirectional-arrow-vertical-prelight.svg b/rtdata/images/svg/bidirectional-arrow-vertical-prelight.svg
new file mode 100644
index 000000000..76f4312cb
--- /dev/null
+++ b/rtdata/images/svg/bidirectional-arrow-vertical-prelight.svg
@@ -0,0 +1,127 @@
+
+
diff --git a/rtdata/images/svg/draw.svg b/rtdata/images/svg/draw.svg
new file mode 100644
index 000000000..30ea04ea4
--- /dev/null
+++ b/rtdata/images/svg/draw.svg
@@ -0,0 +1,108 @@
+
+
diff --git a/rtdata/images/svg/histogram-ellipsis-small.svg b/rtdata/images/svg/histogram-ellipsis-small.svg
new file mode 100644
index 000000000..4fdb17907
--- /dev/null
+++ b/rtdata/images/svg/histogram-ellipsis-small.svg
@@ -0,0 +1,135 @@
+
+
diff --git a/rtdata/images/svg/histogram-bayer-on-small.svg b/rtdata/images/svg/histogram-type-histogram-raw-small.svg
similarity index 100%
rename from rtdata/images/svg/histogram-bayer-on-small.svg
rename to rtdata/images/svg/histogram-type-histogram-raw-small.svg
diff --git a/rtdata/images/svg/histogram-bayer-off-small.svg b/rtdata/images/svg/histogram-type-histogram-small.svg
similarity index 59%
rename from rtdata/images/svg/histogram-bayer-off-small.svg
rename to rtdata/images/svg/histogram-type-histogram-small.svg
index 5d6c439fb..1d2f6547e 100644
--- a/rtdata/images/svg/histogram-bayer-off-small.svg
+++ b/rtdata/images/svg/histogram-type-histogram-small.svg
@@ -1,6 +1,4 @@
-
-
diff --git a/rtdata/images/svg/histogram-type-parade-small.svg b/rtdata/images/svg/histogram-type-parade-small.svg
new file mode 100644
index 000000000..f299f8ab2
--- /dev/null
+++ b/rtdata/images/svg/histogram-type-parade-small.svg
@@ -0,0 +1,132 @@
+
+
diff --git a/rtdata/images/svg/histogram-type-vectorscope-hc-small.svg b/rtdata/images/svg/histogram-type-vectorscope-hc-small.svg
new file mode 100644
index 000000000..ef2e8b51f
--- /dev/null
+++ b/rtdata/images/svg/histogram-type-vectorscope-hc-small.svg
@@ -0,0 +1,131 @@
+
+
diff --git a/rtdata/images/svg/histogram-type-vectorscope-hs-small.svg b/rtdata/images/svg/histogram-type-vectorscope-hs-small.svg
new file mode 100644
index 000000000..62bbf9586
--- /dev/null
+++ b/rtdata/images/svg/histogram-type-vectorscope-hs-small.svg
@@ -0,0 +1,135 @@
+
+
diff --git a/rtdata/images/svg/histogram-type-waveform-small.svg b/rtdata/images/svg/histogram-type-waveform-small.svg
new file mode 100644
index 000000000..5147ab2fc
--- /dev/null
+++ b/rtdata/images/svg/histogram-type-waveform-small.svg
@@ -0,0 +1,122 @@
+
+
diff --git a/rtdata/images/svg/perspective-horizontal-vertical.svg b/rtdata/images/svg/perspective-horizontal-vertical.svg
new file mode 100644
index 000000000..0c5046879
--- /dev/null
+++ b/rtdata/images/svg/perspective-horizontal-vertical.svg
@@ -0,0 +1,116 @@
+
+
+
+
diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified)
index 61cbd58ac..a2181050a 100644
--- a/rtdata/languages/Chinese (Simplified)
+++ b/rtdata/languages/Chinese (Simplified)
@@ -4,21 +4,29 @@
#03 2013-10-20 Jiero
#04 2014-10-24 Jie Luo
#05 2017-09-18 Chongnuo Ji
+#06 2020-08-11 十一元人民币
ABOUT_TAB_BUILD;版本
-ABOUT_TAB_CREDITS;感谢
+ABOUT_TAB_CREDITS;致谢名单
ABOUT_TAB_LICENSE;授权协议
ABOUT_TAB_RELEASENOTES;发布说明
ABOUT_TAB_SPLASH;启动页
+ADJUSTER_RESET_TO_DEFAULT;单击-恢复默认值\nCtrl+单击-恢复初始值
BATCH_PROCESSING;批量处理
+CURVEEDITOR_AXIS_IN;I:
+CURVEEDITOR_AXIS_LEFT_TAN;LT:
+CURVEEDITOR_AXIS_OUT;O:
+CURVEEDITOR_AXIS_RIGHT_TAN;RT:
+CURVEEDITOR_CATMULLROM;灵活
CURVEEDITOR_CURVE;曲线
CURVEEDITOR_CURVES;曲线
CURVEEDITOR_CUSTOM;自定义
CURVEEDITOR_DARKS;暗
-CURVEEDITOR_HIGHLIGHTS;高亮
+CURVEEDITOR_EDITPOINT_HINT;启用对于节点进/出值的编辑\n\n右击节点以选中\n右击空白处以取消选中节点
+CURVEEDITOR_HIGHLIGHTS;高光
CURVEEDITOR_LIGHTS;光
CURVEEDITOR_LINEAR;线性
-CURVEEDITOR_LOADDLGLABEL;正读取曲线...
+CURVEEDITOR_LOADDLGLABEL;加载曲线...
CURVEEDITOR_MINMAXCPOINTS;均衡器
CURVEEDITOR_NURBS;控制点
CURVEEDITOR_PARAMETRIC;参数
@@ -35,18 +43,25 @@ DONT_SHOW_AGAIN;不再显示该信息
DYNPROFILEEDITOR_DELETE;删除
DYNPROFILEEDITOR_EDIT;编辑
DYNPROFILEEDITOR_EDIT_RULE;编辑动态配置规则
-DYNPROFILEEDITOR_ENTRY_TOOLTIP;该项匹配不区分大小写 \n使用 "re:" 前缀来输入 \na 正则式
+DYNPROFILEEDITOR_ENTRY_TOOLTIP;该项匹配不区分大小写 \n使用 "re:" 前缀来输入\na 正则式
+DYNPROFILEEDITOR_IMGTYPE_ANY;Any
+DYNPROFILEEDITOR_IMGTYPE_HDR;HDR
+DYNPROFILEEDITOR_IMGTYPE_PS;像素偏移
+DYNPROFILEEDITOR_IMGTYPE_STD;标准
DYNPROFILEEDITOR_MOVE_DOWN;下移
DYNPROFILEEDITOR_MOVE_UP;上移
DYNPROFILEEDITOR_NEW;新建
DYNPROFILEEDITOR_NEW_RULE;新建动态配置规则
DYNPROFILEEDITOR_PROFILE;处理配置规则
EDITWINDOW_TITLE;图片修改
+EDIT_OBJECT_TOOLTIP;在预览窗口中展示一个允许你调整本工具的widget窗口。
+EDIT_PIPETTE_TOOLTIP;要向曲线添加调整点,点击此按钮,按住Ctrl键并用鼠标左键点击图像预览中你想要的点。\n要调整点的位置,按住Ctrl键并用鼠标左键点击图像预览中的对应位置,然后松开Ctrl(除非你希望精调)同时按住鼠标左键,将鼠标向上/下移动以上下移动曲线中的点。
EXIFFILTER_APERTURE;光圈
EXIFFILTER_CAMERA;相机
EXIFFILTER_EXPOSURECOMPENSATION;曝光补偿值 (EV)
EXIFFILTER_FILETYPE;文件类型
EXIFFILTER_FOCALLEN;焦距
+EXIFFILTER_IMAGETYPE;图像类型
EXIFFILTER_ISO;感光度
EXIFFILTER_LENS;镜头
EXIFFILTER_METADATAFILTER;启用元数据过滤器
@@ -64,101 +79,133 @@ EXIFPANEL_RESET;重置
EXIFPANEL_RESETALL;全部重置
EXIFPANEL_RESETALLHINT;重置所有标签内容
EXIFPANEL_RESETHINT;重置所选标签内容
+EXIFPANEL_SHOWALL;显示所有
EXIFPANEL_SUBDIRECTORY;子文件夹
-EXPORT_BYPASS_ALL;(取消)选择全部
-EXPORT_BYPASS_DEFRINGE;不应用去边处理
-EXPORT_BYPASS_DIRPYRDENOISE;不应用降噪处理
-EXPORT_BYPASS_DIRPYREQUALIZER;不应用分频反差调整
-EXPORT_BYPASS_EQUALIZER;不应用小波变换级别处理
-EXPORT_BYPASS_RAW_CA;不应用 [raw] 色差矫正
-EXPORT_BYPASS_RAW_CCSTEPS;不应用 [raw] 摩尔纹控制
-EXPORT_BYPASS_RAW_DF;不应用 [raw] 暗场处理
-EXPORT_BYPASS_RAW_FF;不应用 [raw] 平场
-EXPORT_BYPASS_RAW_GREENTHRESH;不应用 [raw] 绿色偏纠正
-EXPORT_BYPASS_RAW_LINENOISE;不应用 [raw] 线噪过滤
-EXPORT_BYPASS_SHARPENEDGE;不应用边缘锐化
-EXPORT_BYPASS_SHARPENING;不应用锐化
-EXPORT_BYPASS_SHARPENMICRO;不应用微反差调节
+EXPORT_BYPASS;要跳过的处理步骤
+EXPORT_BYPASS_ALL;选择/取消选择全部选项
+EXPORT_BYPASS_DEFRINGE;跳过去边处理
+EXPORT_BYPASS_DIRPYRDENOISE;跳过降噪处理
+EXPORT_BYPASS_DIRPYREQUALIZER;跳过分频反差调整
+EXPORT_BYPASS_EQUALIZER;跳过小波层级处理
+EXPORT_BYPASS_RAW_CA;跳过 [raw] 色差矫正
+EXPORT_BYPASS_RAW_CCSTEPS;跳过 [raw] 伪色抑制
+EXPORT_BYPASS_RAW_DCB_ENHANCE;跳过 [raw] DCB优化步长
+EXPORT_BYPASS_RAW_DCB_ITERATIONS;跳过 [raw] DCB迭代
+EXPORT_BYPASS_RAW_DF;跳过 [raw] 暗场处理
+EXPORT_BYPASS_RAW_FF;跳过 [raw] 平场
+EXPORT_BYPASS_RAW_GREENTHRESH;跳过 [raw] 绿平衡
+EXPORT_BYPASS_RAW_LINENOISE;跳过 [raw] 线状噪点过滤
+EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;跳过 [raw] LMMSE优化步长
+EXPORT_BYPASS_SHARPENEDGE;跳过边缘锐化
+EXPORT_BYPASS_SHARPENING;跳过锐化
+EXPORT_BYPASS_SHARPENMICRO;跳过微反差调节
EXPORT_FASTEXPORTOPTIONS;快速导出选项
-EXPORT_MAXHEIGHT;最大高度
-EXPORT_MAXWIDTH;最大宽度
-EXPORT_PUTTOQUEUEFAST; 放入快速导出序列
-EXPORT_RAW_DMETHOD;反拜尔算法
+EXPORT_INSTRUCTIONS;快速导出选项提供跳过占用资源和时间的处理步骤的选项,并使用快速导出设定来进行队列处理。\n此方法推荐在优先追求速度,生成低分辨率图片时使用,或是调整尺寸的输出大小适合你想输出的图片,你又不想修改这些照片的后期处理设定时使用。
+EXPORT_MAXHEIGHT;最大高度:
+EXPORT_MAXWIDTH;最大宽度:
+EXPORT_PIPELINE;输出流水线
+EXPORT_PUTTOQUEUEFAST; 放入快速导出队列
+EXPORT_RAW_DMETHOD;去马赛克算法
+EXPORT_USE_FAST_PIPELINE;专门(对缩放大小的图片应用全部处理)
+EXPORT_USE_FAST_PIPELINE_TIP;使用专门的处理流水线来对图片进行处理,以牺牲质量来换取速度。对图片的缩放会尽早进行,而非在正常流水线中那样在最后进行。这能够大幅提升速度,但是用户可能会在输出的图片中看到杂点和较低的总体质量。
+EXPORT_USE_NORMAL_PIPELINE;标准(跳过某些步骤,并在最后缩放图片)
EXTPROGTARGET_1;raw
EXTPROGTARGET_2;队列已处理
FILEBROWSER_APPLYPROFILE;应用配置
-FILEBROWSER_APPLYPROFILE_PARTIAL;应用 - 局部
+FILEBROWSER_APPLYPROFILE_PARTIAL;部分应用配置
FILEBROWSER_AUTODARKFRAME;自动暗场
FILEBROWSER_AUTOFLATFIELD;自动平场
+FILEBROWSER_BROWSEPATHHINT;输入你想前往的路径。\n\n快捷键:\nCtrl-o 让文本框获得焦点\nEnter / Ctrl-Enter 前往输入的目录\nEsc 清除改动\nShift-Esc 让文本框失去焦点\n\n路径快捷键:\n~ - 用户的home/文档路径\n! - 用户的图片路径
FILEBROWSER_CACHE;缓存
-FILEBROWSER_CLEARPROFILE;清空配置
-FILEBROWSER_COPYPROFILE;复制配置
+FILEBROWSER_CACHECLEARFROMFULL;清除全部,包括缓存文件
+FILEBROWSER_CACHECLEARFROMPARTIAL;清除全部,不包括缓存文件
+FILEBROWSER_CLEARPROFILE;清空
+FILEBROWSER_COLORLABEL_TOOLTIP;颜色标记,\n\n使用下拉菜单或快捷键:\nShift-Ctrl-0 无颜色\nShift-Ctrl-1 红\nShift-Ctrl-2 黄\nShift-Ctrl-3 绿\nShift-Ctrl-4 蓝\nShift-Ctrl-5 紫
+FILEBROWSER_COPYPROFILE;复制
FILEBROWSER_CURRENT_NAME;当前名称:
FILEBROWSER_DARKFRAME;暗场
-FILEBROWSER_DELETEDIALOG_HEADER;确认删除
+FILEBROWSER_DELETEDIALOG_ALL;你确定要永久删除%1个垃圾桶中的文件吗?
+FILEBROWSER_DELETEDIALOG_HEADER;删除确认
+FILEBROWSER_DELETEDIALOG_SELECTED;你希望永久删除%1个被选中的文件吗?
+FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;你希望永久删除%1个被选中的文件, 包括已进行过队列处理的版本吗?
FILEBROWSER_EMPTYTRASH;清空垃圾箱
-FILEBROWSER_EXTPROGMENU;调用程序...
+FILEBROWSER_EMPTYTRASHHINT;永久删除垃圾桶的所有文件
+FILEBROWSER_EXTPROGMENU;打开方式
FILEBROWSER_FLATFIELD;平场
FILEBROWSER_MOVETODARKFDIR;移动到暗场路径
FILEBROWSER_MOVETOFLATFIELDDIR;移动到平场路径
FILEBROWSER_NEW_NAME;新名称:
-FILEBROWSER_OPENDEFAULTVIEWER;Windows 默认阅览工具 (序列)
+FILEBROWSER_OPENDEFAULTVIEWER;Windows 默认阅览工具 (队列)
FILEBROWSER_PARTIALPASTEPROFILE;选择性粘贴
-FILEBROWSER_PASTEPROFILE;粘贴配置
+FILEBROWSER_PASTEPROFILE;粘贴
FILEBROWSER_POPUPCANCELJOB;取消任务
-FILEBROWSER_POPUPCOLORLABEL;彩色标帖
-FILEBROWSER_POPUPCOLORLABEL0;Label: 无
-FILEBROWSER_POPUPCOLORLABEL1;Label: 红
-FILEBROWSER_POPUPCOLORLABEL2;Label: 黄
-FILEBROWSER_POPUPCOLORLABEL3;Label: 绿
-FILEBROWSER_POPUPCOLORLABEL4;Label: 蓝
-FILEBROWSER_POPUPCOLORLABEL5;Label: 紫
+FILEBROWSER_POPUPCOLORLABEL;色彩标签
+FILEBROWSER_POPUPCOLORLABEL0;标签:无
+FILEBROWSER_POPUPCOLORLABEL1;标签:红
+FILEBROWSER_POPUPCOLORLABEL2;标签:黄
+FILEBROWSER_POPUPCOLORLABEL3;标签:绿
+FILEBROWSER_POPUPCOLORLABEL4;标签:蓝
+FILEBROWSER_POPUPCOLORLABEL5;标签:紫
FILEBROWSER_POPUPCOPYTO;复制至...
FILEBROWSER_POPUPFILEOPERATIONS;文件操作
FILEBROWSER_POPUPMOVEEND;移动到队列尾部
FILEBROWSER_POPUPMOVEHEAD;移动到队列头部
FILEBROWSER_POPUPMOVETO;移动至...
FILEBROWSER_POPUPOPEN;打开
-FILEBROWSER_POPUPOPENINEDITOR;打开在编辑器
+FILEBROWSER_POPUPOPENINEDITOR;在编辑器中打开
FILEBROWSER_POPUPPROCESS;放入队列
-FILEBROWSER_POPUPPROCESSFAST;放入序列(快速导出)
-FILEBROWSER_POPUPPROFILEOPERATIONS;处理色彩档案
-FILEBROWSER_POPUPRANK;评分
-FILEBROWSER_POPUPRANK0;去评分
-FILEBROWSER_POPUPRANK1;评 1 星
-FILEBROWSER_POPUPRANK2;评 2 星
-FILEBROWSER_POPUPRANK3;评 3 星
-FILEBROWSER_POPUPRANK4;评 4 星
-FILEBROWSER_POPUPRANK5;评 5 星
+FILEBROWSER_POPUPPROCESSFAST;放入队列(快速导出)
+FILEBROWSER_POPUPPROFILEOPERATIONS;后期档案操作
+FILEBROWSER_POPUPRANK;评级
+FILEBROWSER_POPUPRANK0;取消评级
+FILEBROWSER_POPUPRANK1;评1星
+FILEBROWSER_POPUPRANK2;评2星
+FILEBROWSER_POPUPRANK3;评3星
+FILEBROWSER_POPUPRANK4;评4星
+FILEBROWSER_POPUPRANK5;评5星
+FILEBROWSER_POPUPREMOVE;永久删除
+FILEBROWSER_POPUPREMOVEINCLPROC;永久删除,包括队列处理的版本
FILEBROWSER_POPUPRENAME;重命名
FILEBROWSER_POPUPSELECTALL;全部选中
FILEBROWSER_POPUPTRASH;移动到垃圾箱
FILEBROWSER_POPUPUNRANK;取消星级
FILEBROWSER_POPUPUNTRASH;从垃圾箱中移除
-FILEBROWSER_QUERYBUTTONHINT;清除搜索序列
+FILEBROWSER_QUERYBUTTONHINT;清除搜索队列
+FILEBROWSER_QUERYHINT;输入文件名进行搜索。支持不完整文件名。使用英文逗号分割关键词,例:\n1001,1004,1199\n\n在关键词前面加入!=以排除此关键词,例:\n!=1001,1004,1199\n\n快捷键:\nCtrl-f-让搜索框获得焦点,\nEnter-搜索,\nEsc-清空搜索框,\nShift-Esc-让搜索框失去焦点。
FILEBROWSER_QUERYLABEL; 查找:
-FILEBROWSER_RANK1_TOOLTIP;评分 1 *\n快捷键:Shift-1
-FILEBROWSER_RANK2_TOOLTIP;评分 2 *\n快捷键:Shift-2
-FILEBROWSER_RANK3_TOOLTIP;评分 3 *\n快捷键:Shift-3
-FILEBROWSER_RANK4_TOOLTIP;评分 4 *\n快捷键:Shift-4
-FILEBROWSER_RANK5_TOOLTIP;评分 5 *\n快捷键:Shift-5
+FILEBROWSER_RANK1_TOOLTIP;评1星\n快捷键:Shift-1
+FILEBROWSER_RANK2_TOOLTIP;评2星\n快捷键:Shift-2
+FILEBROWSER_RANK3_TOOLTIP;评3星\n快捷键:Shift-3
+FILEBROWSER_RANK4_TOOLTIP;评4星\n快捷键:Shift-4
+FILEBROWSER_RANK5_TOOLTIP;评5星\n快捷键:Shift-5
FILEBROWSER_RENAMEDLGLABEL;文件重命名
FILEBROWSER_RESETDEFAULTPROFILE;还原到默认
-FILEBROWSER_SELECTDARKFRAME;选择暗场...
-FILEBROWSER_SELECTFLATFIELD;选择平场……
+FILEBROWSER_SELECTDARKFRAME;选择暗场…
+FILEBROWSER_SELECTFLATFIELD;选择平场…
+FILEBROWSER_SHOWCOLORLABEL1HINT;显示被标记为红色的照片\n快捷键:Alt-1
+FILEBROWSER_SHOWCOLORLABEL2HINT;显示被标记为黄色的照片\n快捷键:Alt-2
+FILEBROWSER_SHOWCOLORLABEL3HINT;显示被标记为绿色的照片\n快捷键:Alt-3
+FILEBROWSER_SHOWCOLORLABEL4HINT;显示被标记为蓝色的照片\n快捷键:Alt-4
+FILEBROWSER_SHOWCOLORLABEL5HINT;显示被标记为紫色的照片\n快捷键:Alt-5
FILEBROWSER_SHOWDIRHINT;显示文件夹中所有图片
-FILEBROWSER_SHOWEXIFINFO;显示Exif 信息\n\n快捷:\ni - 多编辑标签页模式, \nAlt-i - 单编辑标签模式
+FILEBROWSER_SHOWEDITEDHINT;显示已编辑的照片\n快捷键:7
+FILEBROWSER_SHOWEDITEDNOTHINT;显示未编辑的照片\n快捷键:6
+FILEBROWSER_SHOWEXIFINFO;显示Exif信息\n\n快捷键:\ni - 多编辑标签页模式, \nAlt-i - 单编辑标签模式
+FILEBROWSER_SHOWNOTTRASHHINT;仅显示未进入垃圾箱的照片
FILEBROWSER_SHOWRANK1HINT;显示1星图片
FILEBROWSER_SHOWRANK2HINT;显示2星图片
FILEBROWSER_SHOWRANK3HINT;显示3星图片
FILEBROWSER_SHOWRANK4HINT;显示4星图片
FILEBROWSER_SHOWRANK5HINT;显示5星图片
-FILEBROWSER_SHOWRECENTLYSAVEDHINT;显示保存的图片\n快捷: Alt-7
+FILEBROWSER_SHOWRECENTLYSAVEDHINT;显示保存的图片\n快捷键: Alt-7
+FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;显示未保存的图片\n快捷键:Alt-6
FILEBROWSER_SHOWTRASHHINT;显示垃圾箱内容
+FILEBROWSER_SHOWUNCOLORHINT;显示没有颜色标记的照片\n快捷键:Alt-0
FILEBROWSER_SHOWUNRANKHINT;显示未评星图片
FILEBROWSER_THUMBSIZE;缩略图大小
+FILEBROWSER_UNRANK_TOOLTIP;未评级\n快捷键:Shift-0
FILEBROWSER_ZOOMINHINT;增大缩略图
-FILEBROWSER_ZOOMOUTHINT;减小缩略图
+FILEBROWSER_ZOOMOUTHINT;缩小缩略图
FILECHOOSER_FILTER_ANY;所有文件
FILECHOOSER_FILTER_COLPROF;色彩配置文件
FILECHOOSER_FILTER_CURVE;曲线文件
@@ -167,18 +214,20 @@ FILECHOOSER_FILTER_PP;处理预设文件
FILECHOOSER_FILTER_SAME;与当前照片格式相同
FILECHOOSER_FILTER_TIFF;TIFF 文件
GENERAL_ABOUT;关于
-GENERAL_AFTER;之后
+GENERAL_AFTER;处理后
GENERAL_APPLY;应用
GENERAL_ASIMAGE;跟随图像
GENERAL_AUTO;自动
-GENERAL_BEFORE;之前
+GENERAL_BEFORE;处理前
GENERAL_CANCEL;取消
GENERAL_CLOSE;关闭
+GENERAL_CURRENT;当前
GENERAL_DISABLE;禁用
GENERAL_DISABLED;禁用
GENERAL_ENABLE;启用
GENERAL_ENABLED;开启
GENERAL_FILE;文件
+GENERAL_HELP;帮助
GENERAL_LANDSCAPE;横向
GENERAL_NA;不适用
GENERAL_NO;否
@@ -186,137 +235,291 @@ GENERAL_NONE;无
GENERAL_OK;确定
GENERAL_OPEN;打开
GENERAL_PORTRAIT;纵向
+GENERAL_RESET;重置
GENERAL_SAVE;保存
-GENERAL_UNCHANGED;(未改变)
+GENERAL_SLIDER;滑条
+GENERAL_UNCHANGED;(不改变)
GENERAL_WARNING;警告
+GIMP_PLUGIN_INFO;欢迎使用RawTherapee的GIMP插件!\n当你完成编辑后,关闭RawTherapee主窗口,图片就会被自动导入到GIMP中。
HISTOGRAM_TOOLTIP_B;显示/隐藏 蓝色直方图
+HISTOGRAM_TOOLTIP_BAR;显示/隐藏RGB指示条。
+HISTOGRAM_TOOLTIP_CHRO;显示/隐藏色度直方图。
HISTOGRAM_TOOLTIP_G;显示/隐藏 绿色直方图
HISTOGRAM_TOOLTIP_L;显示/隐藏 CIELAB 亮度直方图
HISTOGRAM_TOOLTIP_R;显示/隐藏 红色直方图
+HISTOGRAM_TOOLTIP_RAW;显示/隐藏Raw直方图。
HISTORY_CHANGED;已更改
HISTORY_CUSTOMCURVE;自定义曲线
HISTORY_FROMCLIPBOARD;从剪贴板
HISTORY_LABEL;历史
-HISTORY_MSG_1;图片加载完
-HISTORY_MSG_2;配置加载完
+HISTORY_MSG_1;图片加载完成
+HISTORY_MSG_2;配置加载完成
HISTORY_MSG_3;配置改变
HISTORY_MSG_4;历史浏览
-HISTORY_MSG_5;亮度
-HISTORY_MSG_6;对比度
-HISTORY_MSG_7;黑点
-HISTORY_MSG_8;曝光补偿
-HISTORY_MSG_9;高光压缩
-HISTORY_MSG_10;阴影压缩
-HISTORY_MSG_11;影调曲线
-HISTORY_MSG_12;自动曝光
-HISTORY_MSG_13;曝光溢出
-HISTORY_MSG_14;亮度亮度
-HISTORY_MSG_15;亮度对比度
-HISTORY_MSG_16;亮度黑
+HISTORY_MSG_5;曝光-光亮度
+HISTORY_MSG_6;曝光-对比度
+HISTORY_MSG_7;曝光-暗部
+HISTORY_MSG_8;曝光-曝光补偿
+HISTORY_MSG_9;曝光-高光压缩
+HISTORY_MSG_10;曝光-阴影压缩
+HISTORY_MSG_11;曝光-色调曲线1
+HISTORY_MSG_12;曝光-自动曝光
+HISTORY_MSG_13;曝光-溢出
+HISTORY_MSG_14;L*a*b*-明度
+HISTORY_MSG_15;L*a*b*-对比度
+HISTORY_MSG_16;L*a*b*-黑
HISTORY_MSG_17;亮度高光压缩
HISTORY_MSG_18;亮度阴影压缩
-HISTORY_MSG_19;亮度曲线
+HISTORY_MSG_19;L*a*b*-L*曲线
HISTORY_MSG_20;锐化
-HISTORY_MSG_21;锐化半径
-HISTORY_MSG_22;锐化程度
-HISTORY_MSG_23;锐化阈值
-HISTORY_MSG_24;仅锐化边缘
-HISTORY_MSG_25;锐化边缘半径
-HISTORY_MSG_26;锐化边缘容差
-HISTORY_MSG_27;锐化光晕控制
-HISTORY_MSG_28;光晕控制量
-HISTORY_MSG_29;锐化方式
-HISTORY_MSG_30;重叠半径
-HISTORY_MSG_31;重叠程度
-HISTORY_MSG_32;重叠衰减
-HISTORY_MSG_33;重叠次数
-HISTORY_MSG_34;避免色彩溢出
-HISTORY_MSG_35;饱和度限制器
-HISTORY_MSG_36;饱和度限制
-HISTORY_MSG_37;色彩增强
-HISTORY_MSG_38;拍平衡方式
-HISTORY_MSG_39;色温
-HISTORY_MSG_40;白平衡微调
-HISTORY_MSG_41;色彩偏移 "A"
-HISTORY_MSG_42;色彩偏移 "B"
-HISTORY_MSG_43;亮度降噪
-HISTORY_MSG_44;亮度降噪半径
-HISTORY_MSG_45;亮度降噪边缘容差
-HISTORY_MSG_46;色彩降噪
-HISTORY_MSG_47;色彩降噪半径
-HISTORY_MSG_48;色彩降噪边缘容差
-HISTORY_MSG_49;色彩降噪边缘敏感度
+HISTORY_MSG_21;USM锐化-半径
+HISTORY_MSG_22;USM锐化-数量
+HISTORY_MSG_23;USM锐化-阈值
+HISTORY_MSG_24;USM锐化-仅锐化边缘
+HISTORY_MSG_25;USM锐化-边缘检测半径
+HISTORY_MSG_26;USM锐化-边缘容差
+HISTORY_MSG_27;USM锐化-光晕控制
+HISTORY_MSG_28;USM锐化-光晕控制数量
+HISTORY_MSG_29;锐化-方式
+HISTORY_MSG_30;RLD-半径
+HISTORY_MSG_31;RLD-数量
+HISTORY_MSG_32;RLD-衰减
+HISTORY_MSG_33;RLD-迭代
+HISTORY_MSG_34;镜头矫正-畸变
+HISTORY_MSG_35;镜头矫正-暗角
+HISTORY_MSG_36;镜头矫正-色差
+HISTORY_MSG_37;曝光-自动曝光
+HISTORY_MSG_38;白平衡-方式
+HISTORY_MSG_39;白平衡-色温
+HISTORY_MSG_40;白平衡-色相
+HISTORY_MSG_41;曝光-色调曲线1模式
+HISTORY_MSG_42;曝光-色调曲线2
+HISTORY_MSG_43;曝光-色调曲线2模式
+HISTORY_MSG_44;亮度噪点降低 半径
+HISTORY_MSG_45;亮度噪点降低 边缘容差
+HISTORY_MSG_46;色度降噪
+HISTORY_MSG_47;色度降噪半径
+HISTORY_MSG_48;色度降噪边缘容差
+HISTORY_MSG_49;色度降噪边缘敏感度
HISTORY_MSG_50;阴影/高光工具
-HISTORY_MSG_51;高光增强
-HISTORY_MSG_52;阴影增强
-HISTORY_MSG_53;高光色度范围
-HISTORY_MSG_54;阴影色度范围
-HISTORY_MSG_55;局部对比度
-HISTORY_MSG_56;阴影/高光半径
+HISTORY_MSG_51;阴影/高光-高光增强
+HISTORY_MSG_52;阴影/高光-阴影增强
+HISTORY_MSG_53;阴影/高光-高光色调宽度
+HISTORY_MSG_54;阴影/高光-阴影色调宽度
+HISTORY_MSG_55;阴影/高光-局部对比度
+HISTORY_MSG_56;阴影/高光-半径
HISTORY_MSG_57;粗略旋转
HISTORY_MSG_58;水平翻转
-HISTORY_MSG_59;竖直翻转
+HISTORY_MSG_59;垂直翻转
HISTORY_MSG_60;旋转
-HISTORY_MSG_61;旋转
-HISTORY_MSG_62;镜头失真矫正
-HISTORY_MSG_63;设置书签
-HISTORY_MSG_64;剪切图片
-HISTORY_MSG_65;色散矫正
-HISTORY_MSG_66;高光还原
-HISTORY_MSG_67;高光还原程度
-HISTORY_MSG_68;高光还原方式
+HISTORY_MSG_61;自动填充
+HISTORY_MSG_62;镜头畸变矫正
+HISTORY_MSG_63;选择快照
+HISTORY_MSG_64;裁切
+HISTORY_MSG_65;色差矫正
+HISTORY_MSG_66;曝光-高光还原
+HISTORY_MSG_67;曝光-高光还原数量
+HISTORY_MSG_68;曝光-高光还原方式
HISTORY_MSG_69;工作色彩空间
HISTORY_MSG_70;输出色彩空间
HISTORY_MSG_71;输入色彩空间
HISTORY_MSG_72;暗角矫正
HISTORY_MSG_73;通道混合器
-HISTORY_MSG_74;调整大小比例
-HISTORY_MSG_75;调整大小方式
+HISTORY_MSG_74;调整大小-比例
+HISTORY_MSG_75;调整大小-方式
HISTORY_MSG_76;Exif元数据
HISTORY_MSG_77;IPTC元数据
HISTORY_MSG_78;调整大小数据
-HISTORY_MSG_79;调整宽度
-HISTORY_MSG_80;调整高度
-HISTORY_MSG_81;调整尺寸开启
-HISTORY_MSG_83;S/H - 锐度蒙板
+HISTORY_MSG_79;调整大小-宽度
+HISTORY_MSG_80;调整大小-高度
+HISTORY_MSG_81;调整大小
+HISTORY_MSG_82;档案修改
+HISTORY_MSG_83;阴影/高光-锐度蒙板
HISTORY_MSG_84;视角矫正
-HISTORY_MSG_85;LCP
+HISTORY_MSG_85;镜头矫正-LCP档案
+HISTORY_MSG_86;RGB曲线-色度模式
+HISTORY_MSG_87;脉冲噪声降低
+HISTORY_MSG_88;脉冲降噪阈值
HISTORY_MSG_89;降噪
-HISTORY_MSG_90;降噪 - 亮度
-HISTORY_MSG_92;降噪 - 伽马
-HISTORY_MSG_103;HSV - 数值
-HISTORY_MSG_111;Lab - 避免色彩偏移
-HISTORY_MSG_113;Lab - 保护
+HISTORY_MSG_90;降噪-亮度
+HISTORY_MSG_92;降噪-伽马
+HISTORY_MSG_95;L*a*b*-色度
+HISTORY_MSG_96;L*a*b*-a* 曲线
+HISTORY_MSG_97;L*a*b*-b* 曲线
+HISTORY_MSG_98;去马赛克方法
+HISTORY_MSG_99;热像素过滤器
+HISTORY_MSG_100;曝光-饱和度
+HISTORY_MSG_101;HSV-色度(Hue)
+HISTORY_MSG_102;HSV-饱和度(Saturation)
+HISTORY_MSG_103;HSV-数值
+HISTORY_MSG_104;HSV均衡器
+HISTORY_MSG_105;去色彩边缘
+HISTORY_MSG_106;去边-半径
+HISTORY_MSG_107;去边-阈值
+HISTORY_MSG_109;调整大小-边界限制方块
+HISTORY_MSG_110;调整大小-应用到
+HISTORY_MSG_111;Lab-避免色彩偏移
+HISTORY_MSG_113;Lab-保护
HISTORY_MSG_114;DCB 迭代
-HISTORY_MSG_119;线性消噪
-HISTORY_MSG_122;自动暗幅
-HISTORY_MSG_123;暗幅文件
+HISTORY_MSG_115;伪色抑制
+HISTORY_MSG_116;DCB增强
+HISTORY_MSG_117;Raw色差修正-红
+HISTORY_MSG_118;Raw色差修正-蓝
+HISTORY_MSG_119;线状噪点过滤器
+HISTORY_MSG_120;绿平衡
+HISTORY_MSG_121;Raw色差修正-自动
+HISTORY_MSG_122;自动暗场
+HISTORY_MSG_123;暗场文件
HISTORY_MSG_124;线性曝光修正
HISTORY_MSG_126;平场文件
HISTORY_MSG_127;平场自动选择
HISTORY_MSG_128;平场模糊半径
HISTORY_MSG_129;平场模糊类型
HISTORY_MSG_130;自动扭曲纠正
+HISTORY_MSG_131;降噪-亮度
+HISTORY_MSG_132;降噪-色度
+HISTORY_MSG_144;微反差-数量
+HISTORY_MSG_145;微反差-均匀度
HISTORY_MSG_146;边缘锐化
-HISTORY_MSG_147;边缘锐化 - 单纯亮度
-HISTORY_MSG_155;Vib - 避免色彩偏移
+HISTORY_MSG_147;边缘锐化-单纯亮度
+HISTORY_MSG_148;微反差
+HISTORY_MSG_149;微反差-3×3阵列
+HISTORY_MSG_155;Vib-避免色彩偏移
HISTORY_MSG_158;力度
HISTORY_MSG_159;边缘停止
HISTORY_MSG_160;拉伸
HISTORY_MSG_162;色调映射
+HISTORY_MSG_163;RGB曲线-红
+HISTORY_MSG_164;RGB曲线-绿
+HISTORY_MSG_165;RGB曲线-蓝
+HISTORY_MSG_166;曝光-重置
+HISTORY_MSG_167;去马赛克方法
+HISTORY_MSG_168;L*a*b*-CC曲线
+HISTORY_MSG_169;L*a*b*-CH曲线
+HISTORY_MSG_171;L*a*b*-LC曲线
+HISTORY_MSG_172;L*a*b*-限制LC
+HISTORY_MSG_173;降噪-细节恢复
HISTORY_MSG_174;CIECAM02
-HISTORY_MSG_183;CAM02 - 对比度 (J)
-HISTORY_MSG_210;渐变 - 角度
+HISTORY_MSG_180;CAM02-亮度 (J)
+HISTORY_MSG_181;CAM02-色度 (C)
+HISTORY_MSG_183;CAM02-对比度 (J)
+HISTORY_MSG_186;CAM02-算法
+HISTORY_MSG_187;CAM02-红色/肤色保护
+HISTORY_MSG_188;CAM02-亮度 (Q)
+HISTORY_MSG_189;CAM02-对比度 (Q)
+HISTORY_MSG_190;CAM02-饱和度 (S)
+HISTORY_MSG_191;CAM02-色彩丰富度 (M)
+HISTORY_MSG_192;CAM02-色度 (h)
+HISTORY_MSG_193;CAM02-色调曲线1
+HISTORY_MSG_194;CAM02-色调曲线2
+HISTORY_MSG_195;CAM02-色调曲线1
+HISTORY_MSG_196;CAM02-色调曲线2
+HISTORY_MSG_200;CAM02-色调映射
+HISTORY_MSG_203;降噪-色彩空间
+HISTORY_MSG_204;LMMSE优化步长
+HISTORY_MSG_205;CAM02-热像素/坏点过滤器
+HISTORY_MSG_207;去边-色度曲线
+HISTORY_MSG_210;渐变-角度
HISTORY_MSG_211;渐变滤镜
-HISTORY_MSG_212;暗角 - 力度
+HISTORY_MSG_212;暗角-力度
HISTORY_MSG_213;暗角滤镜
-HISTORY_MSG_239;GF - 力度
-HISTORY_MSG_244;VC - 力度
-HISTORY_MSG_245;VC - 中心
+HISTORY_MSG_239;GF-力度
+HISTORY_MSG_244;暗角矫正-力度
+HISTORY_MSG_245;暗角矫正-中心
+HISTORY_MSG_246;L*a*b*-CL曲线
+HISTORY_MSG_247;L*a*b*-LH曲线
+HISTORY_MSG_248;L*a*b*-HH曲线
+HISTORY_MSG_255;降噪-中值滤波器
+HISTORY_MSG_256;降噪-中值滤波器-方法
+HISTORY_MSG_285;降噪-中值滤波-方法
+HISTORY_MSG_286;降噪-中值滤波-类型
+HISTORY_MSG_287;降噪-中值滤波-迭代
+HISTORY_MSG_288;平场-溢出控制
+HISTORY_MSG_289;平场-溢出控制-自动
+HISTORY_MSG_293;胶片模拟
+HISTORY_MSG_294;胶片模拟-力度
+HISTORY_MSG_295;胶片模拟-胶片
+HISTORY_MSG_296;降噪-亮度曲线
+HISTORY_MSG_297;降噪-模式
+HISTORY_MSG_298;坏点过滤器
+HISTORY_MSG_299;降噪-色度曲线
+HISTORY_MSG_305;小波层级
+HISTORY_MSG_371;调整大小后加锐(PRS)
+HISTORY_MSG_372;PRS USM-半径
+HISTORY_MSG_373;PRS USM-数量
+HISTORY_MSG_374;PRS USM-阈值
+HISTORY_MSG_375;PRS USM-仅加锐边缘
+HISTORY_MSG_376;PRS USM-边缘检测半径
+HISTORY_MSG_377;PRS USM-Edge tolerance
+HISTORY_MSG_378;PRS USM-光晕控制
+HISTORY_MSG_379;PRS USM-光晕控制数量
+HISTORY_MSG_380;PRS-方法
+HISTORY_MSG_381;PRS RLD-半径
+HISTORY_MSG_382;PRS RLD-数量
+HISTORY_MSG_383;PRS RLD-衰减
+HISTORY_MSG_384;PRS RLD-迭代
+HISTORY_MSG_445;Raw子图像
+HISTORY_MSG_449;像素偏移-ISO适应
+HISTORY_MSG_452;像素偏移-显示动体
+HISTORY_MSG_453;像素偏移-仅显示动体蒙版
+HISTORY_MSG_457;像素偏移-检测红/蓝
+HISTORY_MSG_462;像素偏移-检测绿
+HISTORY_MSG_464;像素偏移-动体蒙版模糊
+HISTORY_MSG_465;像素偏移-模糊半径
+HISTORY_MSG_468;像素偏移-填洞
+HISTORY_MSG_469;像素偏移-中值
+HISTORY_MSG_471;像素偏移-动体补正
+HISTORY_MSG_472;像素偏移-顺滑过渡
+HISTORY_MSG_473;像素偏移-使用LMMSE
+HISTORY_MSG_474;像素偏移-亮度均等
+HISTORY_MSG_475;像素偏移-均等各通道
+HISTORY_MSG_485;镜头矫正
+HISTORY_MSG_486;镜头矫正-相机
+HISTORY_MSG_487;镜头矫正-镜头
+HISTORY_MSG_488;动态范围压缩(DRC)
+HISTORY_MSG_491;白平衡
+HISTORY_MSG_492;RGB曲线
+HISTORY_MSG_493;L*a*b*调整
+HISTORY_MSG_494;捕图锐化
+HISTORY_MSG_DEHAZE_ENABLED;去雾
+HISTORY_MSG_DEHAZE_STRENGTH;去雾-力度
+HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;双重去马赛克-自动阈值
+HISTORY_MSG_DUALDEMOSAIC_CONTRAST;双重去马赛克-对比度阈值
+HISTORY_MSG_FILMNEGATIVE_ENABLED;胶片负片
+HISTORY_MSG_HISTMATCHING;自适应色调曲线
+HISTORY_MSG_LOCALCONTRAST_AMOUNT;局部反差-数量
+HISTORY_MSG_LOCALCONTRAST_DARKNESS;局部反差-黑处
+HISTORY_MSG_LOCALCONTRAST_ENABLED;局部反差
+HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;局部反差-亮处
+HISTORY_MSG_LOCALCONTRAST_RADIUS;局部反差-半径
+HISTORY_MSG_METADATA_MODE;元数据复制模式
+HISTORY_MSG_MICROCONTRAST_CONTRAST;微反差-反差阈值
+HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;捕图锐化-自动阈值
+HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;捕图锐化-自动半径
+HISTORY_MSG_PDSHARPEN_CHECKITER;捕图锐化-自动限制迭代
+HISTORY_MSG_PDSHARPEN_CONTRAST;捕图锐化-反差阈值
+HISTORY_MSG_PDSHARPEN_ITERATIONS;捕图锐化-迭代
+HISTORY_MSG_PDSHARPEN_RADIUS;捕图锐化-半径
+HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;捕图锐化-边缘半径值提升
+HISTORY_MSG_PIXELSHIFT_DEMOSAIC;像素偏移-动体部分去马赛克算法
+HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;线状噪点过滤方向
+HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF条纹过滤
+HISTORY_MSG_PRSHARPEN_CONTRAST;PRS-反差阈值
+HISTORY_MSG_RAWCACORR_AUTOIT;Raw色差矫正-迭代
+HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw色差矫正-避免色偏
+HISTORY_MSG_RAW_BORDER;Raw边界
+HISTORY_MSG_RESIZE_ALLOWUPSCALING;调整大小-允许升采样
+HISTORY_MSG_SHARPENING_BLUR;加锐-模糊半径
+HISTORY_MSG_SHARPENING_CONTRAST;加锐-反差阈值
+HISTORY_MSG_SH_COLORSPACE;阴影/高光-色彩空间
HISTORY_NEWSNAPSHOT;新建快照
HISTORY_NEWSNAPSHOT_TOOLTIP;快捷键:Alt-s
HISTORY_SNAPSHOT;快照
-HISTORY_SNAPSHOTS;系列快照
+HISTORY_SNAPSHOTS;快照
+ICCPROFCREATOR_COPYRIGHT;版权:
+ICCPROFCREATOR_CUSTOM;自定义
+ICCPROFCREATOR_DESCRIPTION;描述:
+ICCPROFCREATOR_SAVEDIALOG_TITLE;将ICC档案保存为……
IPTCPANEL_CATEGORY;类别
IPTCPANEL_CITY;城市
IPTCPANEL_COPYHINT;将IPTC设置复制到剪贴板
@@ -334,9 +537,9 @@ IPTCPANEL_RESET;重置
IPTCPANEL_RESETHINT;重置为默认配置
IPTCPANEL_SOURCE;来源
IPTCPANEL_TITLE;标题
-MAIN_BUTTON_FULLSCREEN;全屏幕
+MAIN_BUTTON_FULLSCREEN;全屏
MAIN_BUTTON_PREFERENCES;参数设置
-MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;将当前图片放入处理序列中\n快捷键: Ctrl+b
+MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;将当前图片放入处理队列中\n快捷键: Ctrl+b
MAIN_BUTTON_SAVE;保存图片
MAIN_BUTTON_SAVE_TOOLTIP;保存当前图像 \n快捷键:Ctrl+S
MAIN_BUTTON_SENDTOEDITOR;发送到编辑器
@@ -345,22 +548,25 @@ MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;显示/隐藏全部侧边栏\n快捷键:
MAIN_BUTTON_UNFULLSCREEN;退出全屏
MAIN_FRAME_EDITOR;编辑器
MAIN_FRAME_EDITOR_TOOLTIP;编辑器.\n快捷键: Ctrl-F4
-MAIN_FRAME_FILEBROWSER;文件浏览
-MAIN_FRAME_FILEBROWSER_TOOLTIP;文件浏览\n快捷键: Ctrl-F2
+MAIN_FRAME_FILEBROWSER;文件浏览器
+MAIN_FRAME_FILEBROWSER_TOOLTIP;文件浏览器\n快捷键: Ctrl-F2
MAIN_FRAME_PLACES;位置
MAIN_FRAME_PLACES_ADD;添加
+MAIN_FRAME_PLACES_DEL;移除
MAIN_FRAME_QUEUE;批处理队列
-MAIN_FRAME_QUEUE_TOOLTIP;处理序列\n快捷键: Ctrl-F3
+MAIN_FRAME_QUEUE_TOOLTIP;处理队列\n快捷键: Ctrl-F3
MAIN_FRAME_RECENT;最近使用的文件夹
MAIN_MSG_ALREADYEXISTS;该文件已存在
MAIN_MSG_CANNOTLOAD;无法加载图片
MAIN_MSG_CANNOTSAVE;文件保存中出错
MAIN_MSG_CANNOTSTARTEDITOR;无法启动编辑器
-MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;请在“首选项“对话框设置正确的路径
+MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;请在“参数设置“中设置正确的路径
MAIN_MSG_EMPTYFILENAME;未指定文件名!
-MAIN_MSG_NAVIGATOR;浏览器
+MAIN_MSG_NAVIGATOR;导航器
MAIN_MSG_OPERATIONCANCELLED;取消
MAIN_MSG_QOVERWRITE;是否覆盖?
+MAIN_TAB_ADVANCED;高级
+MAIN_TAB_ADVANCED_TOOLTIP;快捷键:Alt-a
MAIN_TAB_COLOR;色彩
MAIN_TAB_COLOR_TOOLTIP;快捷键:Alt-c
MAIN_TAB_DETAIL;细节
@@ -370,6 +576,7 @@ MAIN_TAB_EXIF;Exif
MAIN_TAB_EXPORT; 快速导出
MAIN_TAB_EXPOSURE;曝光
MAIN_TAB_EXPOSURE_TOOLTIP;快捷键:Alt-e
+MAIN_TAB_FAVORITES_TOOLTIP;快捷键: Alt-u
MAIN_TAB_FILTER;过滤器
MAIN_TAB_INSPECT; 检阅
MAIN_TAB_IPTC;IPTC
@@ -382,13 +589,19 @@ MAIN_TAB_TRANSFORM_TOOLTIP;快捷键:Alt-t
MAIN_TOOLTIP_HIDEHP;显示/隐藏左面板 (包含历史, 快捷键: H)
MAIN_TOOLTIP_INDCLIPPEDH;高光溢出提示
MAIN_TOOLTIP_INDCLIPPEDS;阴影不足提示
-MAIN_TOOLTIP_PREVIEWR;预览 红色通道.\n快捷键: r
+MAIN_TOOLTIP_PREVIEWB;预览蓝色通道\n快捷键:b
+MAIN_TOOLTIP_PREVIEWFOCUSMASK;预览合焦蒙版\n快捷键:Shift-f\n\n在浅景深,噪点少,放大得大的图片中更加精准\n在噪点多的图像中,把图片缩放到10%-30%以提升检测精准度。
+MAIN_TOOLTIP_PREVIEWG;预览绿色通道\n快捷键:g
+MAIN_TOOLTIP_PREVIEWL;预览亮度\n快捷键:v\n\n0.299*R + 0.587*G + 0.114*B
+MAIN_TOOLTIP_PREVIEWR;预览红色通道\n快捷键: r
+MAIN_TOOLTIP_PREVIEWSHARPMASK;预览加锐反差蒙版\n快捷键:p
MAIN_TOOLTIP_QINFO;图片快捷信息
MAIN_TOOLTIP_SHOWHIDELP1;显示/隐藏左面板\n快捷键: l
MAIN_TOOLTIP_SHOWHIDERP1;显示/隐藏右面板\n快捷键: Alt-l
MAIN_TOOLTIP_SHOWHIDETP1;显示/隐藏上面板\n快捷键: Shift-L
MAIN_TOOLTIP_THRESHOLD;阈值
-MAIN_TOOLTIP_TOGGLE;切换 前/后视图\n快捷键: Shift-b
+MAIN_TOOLTIP_TOGGLE;切换 处理前/处理后视图\n快捷键: Shift-b
+MONITOR_PROFILE_SYSTEM;系统默认
NAVIGATOR_B;B:
NAVIGATOR_G;G:
NAVIGATOR_H;H:
@@ -401,11 +614,12 @@ NAVIGATOR_S;S:
NAVIGATOR_V;V:
NAVIGATOR_XY_FULL;宽 = %1, 高 = %2
NAVIGATOR_XY_NA;x = n/a, y = n/a
+PARTIALPASTE_ADVANCEDGROUP;高级设置
PARTIALPASTE_BASICGROUP;基本设置
PARTIALPASTE_CACORRECTION;色彩矫正
PARTIALPASTE_CHANNELMIXER;通道混合器
PARTIALPASTE_CHANNELMIXERBW;黑白
-PARTIALPASTE_COARSETRANS;90度旋转/翻转
+PARTIALPASTE_COARSETRANS;90°旋转/翻转
PARTIALPASTE_COLORAPP;CIECAM02
PARTIALPASTE_COLORGROUP;色彩相关设定
PARTIALPASTE_COLORTONING;色调
@@ -415,77 +629,98 @@ PARTIALPASTE_CROP;剪裁
PARTIALPASTE_DARKFRAMEAUTOSELECT;暗场自动选择
PARTIALPASTE_DARKFRAMEFILE;暗场文件
PARTIALPASTE_DEFRINGE;去边
+PARTIALPASTE_DEHAZE;去雾
PARTIALPASTE_DETAILGROUP;细节设置
PARTIALPASTE_DIALOGLABEL;选择性粘贴配置
PARTIALPASTE_DIRPYRDENOISE;降噪
PARTIALPASTE_DIRPYREQUALIZER;分频反差调整
PARTIALPASTE_DISTORTION;畸变矫正
PARTIALPASTE_EPD;色调映射
-PARTIALPASTE_EQUALIZER;小波变换等级
+PARTIALPASTE_EQUALIZER;小波变换层级
PARTIALPASTE_EVERYTHING;全部
PARTIALPASTE_EXIFCHANGES;对exif所做的修改
PARTIALPASTE_EXPOSURE;曝光
+PARTIALPASTE_FILMNEGATIVE;胶片负片
PARTIALPASTE_FILMSIMULATION;胶片模拟
PARTIALPASTE_FLATFIELDAUTOSELECT;平场自动选择
PARTIALPASTE_FLATFIELDBLURRADIUS;平场模糊半径
PARTIALPASTE_FLATFIELDBLURTYPE;平场模糊类型
PARTIALPASTE_FLATFIELDCLIPCONTROL;平场剪切控制
PARTIALPASTE_FLATFIELDFILE;平场文件夹
-PARTIALPASTE_GRADIENT;渐变过滤
-PARTIALPASTE_HSVEQUALIZER;HSV均衡
-PARTIALPASTE_ICMSETTINGS;ICM 设置
+PARTIALPASTE_GRADIENT;渐变滤镜
+PARTIALPASTE_HSVEQUALIZER;HSV均衡器
+PARTIALPASTE_ICMSETTINGS;ICM设置
PARTIALPASTE_IMPULSEDENOISE;脉冲噪声降低
PARTIALPASTE_IPTCINFO;IPTC 信息
PARTIALPASTE_LABCURVE;Lab调整
PARTIALPASTE_LENSGROUP;镜头相关设置
PARTIALPASTE_LENSPROFILE;镜片修正档案
+PARTIALPASTE_LOCALCONTRAST;局部反差
PARTIALPASTE_METAGROUP;元数据
PARTIALPASTE_PCVIGNETTE;暗角滤镜
PARTIALPASTE_PERSPECTIVE;视角
PARTIALPASTE_PREPROCESS_DEADPIXFILT;坏点过滤器
PARTIALPASTE_PREPROCESS_GREENEQUIL;绿平衡
PARTIALPASTE_PREPROCESS_HOTPIXFILT;热噪过滤器
-PARTIALPASTE_PREPROCESS_LINEDENOISE;线条噪点过滤
+PARTIALPASTE_PREPROCESS_LINEDENOISE;线状噪点过滤
+PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF条带过滤器
PARTIALPASTE_PRSHARPENING;调整大小后锐化
-PARTIALPASTE_RAWCACORR_AUTO;CA自动更正
-PARTIALPASTE_RAWCACORR_CAREDBLUE;红蓝色散
+PARTIALPASTE_RAWCACORR_AUTO;色差自动矫正
+PARTIALPASTE_RAWCACORR_CAREDBLUE;红蓝色差
PARTIALPASTE_RAWEXPOS_BLACK;黑色等级
PARTIALPASTE_RAWEXPOS_LINEAR;白点纠正
PARTIALPASTE_RAWGROUP;Raw设置
-PARTIALPASTE_RAW_DCBENHANCE;DCB 增强
-PARTIALPASTE_RAW_DCBITERATIONS;DCB 反复
-PARTIALPASTE_RAW_DMETHOD;解马赛克方法
+PARTIALPASTE_RAW_BORDER;Raw边界
+PARTIALPASTE_RAW_DCBENHANCE;DCB增强
+PARTIALPASTE_RAW_DCBITERATIONS;DCB迭代
+PARTIALPASTE_RAW_DMETHOD;去马赛克方法
PARTIALPASTE_RAW_FALSECOLOR;摩尔纹抑制
PARTIALPASTE_RAW_IMAGENUM;子图像
-PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE 增强级数
-PARTIALPASTE_RAW_PIXELSHIFT;像素位移
-PARTIALPASTE_RESIZE;缩放
-PARTIALPASTE_RETINEX;Retinex增强算法
+PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE优化步长
+PARTIALPASTE_RAW_PIXELSHIFT;像素偏移
+PARTIALPASTE_RESIZE;调整大小
+PARTIALPASTE_RETINEX;Retinex
PARTIALPASTE_RGBCURVES;RGB曲线
PARTIALPASTE_ROTATION;旋转
PARTIALPASTE_SHADOWSHIGHLIGHTS;阴影/高光
PARTIALPASTE_SHARPENEDGE;边缘
PARTIALPASTE_SHARPENING;锐化
-PARTIALPASTE_SHARPENMICRO;微处对比
+PARTIALPASTE_SHARPENMICRO;微对比度
+PARTIALPASTE_TM_FATTAL;动态范围压缩
PARTIALPASTE_VIBRANCE;鲜艳度
-PARTIALPASTE_VIGNETTING;暗角修正
+PARTIALPASTE_VIGNETTING;暗角矫正
PARTIALPASTE_WHITEBALANCE;白平衡
PREFERENCES_ADD;添加
-PREFERENCES_APPEARANCE_NAVGUIDECOLOR;导航器引导颜色
+PREFERENCES_APPEARANCE;外观
+PREFERENCES_APPEARANCE_CROPMASKCOLOR;裁剪蒙版颜色
+PREFERENCES_APPEARANCE_MAINFONT;主字体
+PREFERENCES_APPEARANCE_NAVGUIDECOLOR;导航器图框颜色
+PREFERENCES_APPEARANCE_PSEUDOHIDPI;伪-高DPI模式
+PREFERENCES_APPEARANCE_THEME;主题
PREFERENCES_APPLNEXTSTARTUP;下次启动生效
PREFERENCES_AUTOMONPROFILE;使用操作系统主显示器的色彩档案
+PREFERENCES_AUTOSAVE_TP_OPEN;在退出时保存工具的展开/折叠状态
PREFERENCES_BATCH_PROCESSING;批处理
-PREFERENCES_BEHADDALL;全 '添加'
+PREFERENCES_BEHADDALL;全 “添加”
PREFERENCES_BEHAVIOR;行为
-PREFERENCES_BEHSETALL;全 '设定'
+PREFERENCES_BEHSETALL;全“ 设定”
+PREFERENCES_BEHSETALLHINT;将所有选项设为设定模式\n批处理栏的处理参数将是a绝对值,数值会被显示。
+PREFERENCES_CACHECLEAR;清空
+PREFERENCES_CACHECLEAR_ALL;清空所有缓存文件:
PREFERENCES_CACHEMAXENTRIES;最大缓存数量
PREFERENCES_CACHEOPTS;缓存选项
PREFERENCES_CACHETHUMBHEIGHT;最大缩略图高度
+PREFERENCES_CHUNKSIZE_RAW_AMAZE;AMaZE去马赛克
+PREFERENCES_CHUNKSIZE_RAW_CA;Raw色差矫正
+PREFERENCES_CHUNKSIZE_RAW_RCD;RCD去马赛克
+PREFERENCES_CHUNKSIZE_RGB;RGB处理
PREFERENCES_CLIPPINGIND;高光溢出提示
-PREFERENCES_CLUTSCACHE;HaldCLUT 缓存
-PREFERENCES_CLUTSCACHE_LABEL;CLUTs 最大缓存数
-PREFERENCES_CLUTSDIR;HaldCLUT 路径
+PREFERENCES_CLUTSCACHE;HaldCLUT缓存
+PREFERENCES_CLUTSCACHE_LABEL;CLUT最大缓存数
+PREFERENCES_CLUTSDIR;HaldCLUT路径
PREFERENCES_CMMBPC;黑场补偿
+PREFERENCES_CROP;裁切编辑
+PREFERENCES_CROP_AUTO_FIT;自动放大以适应裁剪
PREFERENCES_CURVEBBOXPOS;曲线复制/粘贴按钮位置
PREFERENCES_CURVEBBOXPOS_ABOVE;上
PREFERENCES_CURVEBBOXPOS_BELOW;下
@@ -502,14 +737,16 @@ PREFERENCES_DARKFRAMETEMPLATES;模板
PREFERENCES_DATEFORMAT;日期格式
PREFERENCES_DATEFORMATHINT;可以使用下列控制符:\n%y : 年\n%m : 月h\n%d : 日\n\n例如, 中文日期格式:\n%y/%m/%d
PREFERENCES_DIRDARKFRAMES;暗场图像路径
+PREFERENCES_DIRECTORIES;目录
PREFERENCES_DIRHOME;用户文件路径
PREFERENCES_DIRLAST;上次访问路径
PREFERENCES_DIROTHER;其他
PREFERENCES_DIRSELECTDLG;启动时选择图片路径...
PREFERENCES_DIRSOFTWARE;软件安装路径
+PREFERENCES_EDITORCMDLINE;自定义命令行
PREFERENCES_EDITORLAYOUT;编辑器布局
PREFERENCES_EXTERNALEDITOR;外部编辑器
-PREFERENCES_FBROWSEROPTS;文件浏览选项
+PREFERENCES_FBROWSEROPTS;文件浏览器选项
PREFERENCES_FLATFIELDFOUND;找到
PREFERENCES_FLATFIELDSDIR;平场图像路径
PREFERENCES_FLATFIELDSHOTS;张
@@ -519,12 +756,12 @@ PREFERENCES_FORRAW;用于Raw文件
PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser
PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser.
PREFERENCES_GIMPPATH;GIMP安装文件夹
-PREFERENCES_HISTOGRAMPOSITIONLEFT;直方图放置在左面板
-PREFERENCES_HISTOGRAM_TOOLTIP;If enabled, the working profile is used for rendering the main histogram and the Navigator panel, otherwise the gamma-corrected output profile is used.
+PREFERENCES_HISTOGRAMPOSITIONLEFT;将直方图放置在左面板
+PREFERENCES_HISTOGRAM_TOOLTIP;启用后,当前使用的后期配置档案将被用于渲染主直方图和导航栏,不启用则将使用伽马矫正的输出档案进行渲染。
PREFERENCES_HLTHRESHOLD;高光溢出阈值
PREFERENCES_ICCDIR;ICC配置路径
PREFERENCES_IMPROCPARAMS;默认图片处理参数
-PREFERENCES_INSPECT_LABEL;检阅
+PREFERENCES_INSPECT_LABEL;查看
PREFERENCES_INSPECT_MAXBUFFERS_LABEL;最大缓存图片数
PREFERENCES_INSPECT_MAXBUFFERS_TOOLTIP;Set the maximum number of images stored in cache when hovering over them in the File Browser; systems with little RAM (2GB) should keep this value set to 1 or 2.
PREFERENCES_INTENT_ABSOLUTE;绝对比色
@@ -535,72 +772,77 @@ PREFERENCES_INTERNALTHUMBIFUNTOUCHED;如果RAW文件没有修改, 显示内嵌JP
PREFERENCES_LANG;语言
PREFERENCES_LANGAUTODETECT;使用系统语言
PREFERENCES_MAXRECENTFOLDERS;最近访问路径历史记录数
-PREFERENCES_MENUGROUPEXTPROGS;Group "Open with"
-PREFERENCES_MENUGROUPFILEOPERATIONS;Group "File operations"
-PREFERENCES_MENUGROUPLABEL;Group "Color label"
-PREFERENCES_MENUGROUPPROFILEOPERATIONS;Group "Processing profile operations"
-PREFERENCES_MENUGROUPRANK;组 "评价"
-PREFERENCES_MENUOPTIONS;子菜单选项
+PREFERENCES_MENUGROUPEXTPROGS;组合"打开方式"
+PREFERENCES_MENUGROUPFILEOPERATIONS;组合"文件操作"
+PREFERENCES_MENUGROUPLABEL;组合"色彩标签"
+PREFERENCES_MENUGROUPPROFILEOPERATIONS;组合"后期档案操作"
+PREFERENCES_MENUGROUPRANK;组合 "评级"
+PREFERENCES_MENUOPTIONS;右键子菜单选项
PREFERENCES_MONINTENT;默认渲染意图
PREFERENCES_MONITOR;显示器
PREFERENCES_MONPROFILE;默认色彩配置文件
PREFERENCES_MONPROFILE_WARNOSX;受MacOS限制, 仅支持sRGB
PREFERENCES_MULTITAB;多编辑器标签模式
-PREFERENCES_MULTITABDUALMON;多编辑器标签独立模式
+PREFERENCES_MULTITABDUALMON;多编辑器,编辑器标签独立模式
PREFERENCES_NAVIGATIONFRAME;导航器
PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails in the file browser
PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Overlay filenames on thumbnails in the editor pannel
PREFERENCES_OVERWRITEOUTPUTFILE;Overwrite existing output files
-PREFERENCES_PANFACTORLABEL;Pan rate amplification
+PREFERENCES_PANFACTORLABEL;拖移速率增幅
PREFERENCES_PARSEDEXT;已知扩展名
PREFERENCES_PARSEDEXTADD;添加扩展名
PREFERENCES_PARSEDEXTADDHINT;输入扩展名并按此按钮将其添加至列表
PREFERENCES_PARSEDEXTDELHINT;从列表中删除选中的扩展名
-PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list.
-PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list.
-PREFERENCES_PREVDEMO;预览解马赛克方法
+PREFERENCES_PARSEDEXTDOWNHINT;让选中的插件在列表中的位置下降。
+PREFERENCES_PARSEDEXTUPHINT;让选中的插件在列表中的位置上升。
+PREFERENCES_PERFORMANCE_THREADS;线程
+PREFERENCES_PERFORMANCE_THREADS_LABEL;用于降噪和小波层级的最大线程数(0=自动)
+PREFERENCES_PREVDEMO;预览去马赛克方法
PREFERENCES_PREVDEMO_FAST;快速
-PREFERENCES_PREVDEMO_LABEL;小于100%缩放查看时使用的解马赛克算法:
+PREFERENCES_PREVDEMO_LABEL;小于100%缩放查看时使用的去马赛克算法:
PREFERENCES_PREVDEMO_SIDECAR;与PP3相同
PREFERENCES_PRINTER;打印机 (软打样)
PREFERENCES_PROFILEHANDLING;图片处理配置管理
PREFERENCES_PROFILELOADPR;配置文件读取优先级
PREFERENCES_PROFILEPRCACHE;缓存中的配置文件
-PREFERENCES_PROFILEPRFILE;与图片并列存放的配置文件
-PREFERENCES_PROFILESAVEBOTH;Save processing profile both to the cache and next to the input file
-PREFERENCES_PROFILESAVECACHE;将配置文件写至缓存
+PREFERENCES_PROFILEPRFILE;图片所在位置的配置文件
+PREFERENCES_PROFILESAVEBOTH;将配置文件存放到缓存和输入图片所在位置
+PREFERENCES_PROFILESAVECACHE;将配置文件存放缓存
PREFERENCES_PROFILESAVEINPUT;将配置文件与图片并列存放
-PREFERENCES_PROFILESAVELOCATION;处理配置文件存储路径
+PREFERENCES_PROFILESAVELOCATION;将配置文件存放到缓存和输入图片所在位置
PREFERENCES_PROFILE_NONE;无
PREFERENCES_PROPERTY;属性
PREFERENCES_PRTINTENT;渲染意图
PREFERENCES_PRTPROFILE;色彩配置文件
PREFERENCES_PSPATH;Adobe Photoshop安装路径
-PREFERENCES_REMEMBERZOOMPAN;记忆缩放和位置
+PREFERENCES_REMEMBERZOOMPAN;记忆图片的缩放和拖动位置
PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3".
+PREFERENCES_SAVE_TP_OPEN_NOW;保存工具的展开/折叠状态
PREFERENCES_SELECTLANG;选择语言
PREFERENCES_SERIALIZE_TIFF_READ;TIFF 读取设定
PREFERENCES_SERIALIZE_TIFF_READ_LABEL;连续载入TIFF文件
PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;开启后可以提高在无压缩TIFF图片文件夹中的缩略图生成速度
-PREFERENCES_SET;设置
+PREFERENCES_SET;设定
PREFERENCES_SHOWBASICEXIF;显示基本Exif信息
PREFERENCES_SHOWDATETIME;显示时间日期
PREFERENCES_SHOWEXPOSURECOMPENSATION;附加曝光补偿
-PREFERENCES_SHOWFILMSTRIPTOOLBAR;显示图像胶片栏
+PREFERENCES_SHOWFILMSTRIPTOOLBAR;显示“数码底片夹”栏
PREFERENCES_SHTHRESHOLD;阴影过暗阈值
-PREFERENCES_SINGLETAB;单编辑器栏模式
-PREFERENCES_SINGLETABVERTAB;单编辑器栏模式, 标签栏垂直
-PREFERENCES_SND_HELP;输入完整路径来指定声音文件, 或者留空表示无声 \nWindows系统声音可以使用 "SystemDefault", "SystemAsterisk" 等 Linux则可以使用 "complete", "window-attention" 等
+PREFERENCES_SINGLETAB;单编辑器模式
+PREFERENCES_SINGLETABVERTAB;单编辑器模式, 标签栏垂直
+PREFERENCES_SND_HELP;输入完整路径来指定声音文件, 或者留空表示无声 \nWindows系统声音可以使用 "SystemDefault", "SystemAsterisk" 等\nLinux则可以使用 "complete", "window-attention" 等
PREFERENCES_SND_LNGEDITPROCDONE;编辑器处理完成
-PREFERENCES_SND_QUEUEDONE;队列处理完成
-PREFERENCES_SND_THRESHOLDSECS;几秒之后
+PREFERENCES_SND_QUEUEDONE;完成队列
+PREFERENCES_SND_THRESHOLDSECS;等待秒数
PREFERENCES_STARTUPIMDIR;启动时路径
PREFERENCES_TAB_BROWSER;文件浏览器
PREFERENCES_TAB_COLORMGR;色彩管理
PREFERENCES_TAB_DYNAMICPROFILE;动态预设规则
-PREFERENCES_TAB_GENERAL;一般
+PREFERENCES_TAB_GENERAL;通用
PREFERENCES_TAB_IMPROC;图片处理
+PREFERENCES_TAB_PERFORMANCE;性能
PREFERENCES_TAB_SOUND;音效
+PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;内嵌JPEG预览
PREFERENCES_TP_LABEL;工具栏
PREFERENCES_TP_VSCROLLBAR;隐藏垂直滚动栏
PREFERENCES_USEBUNDLEDPROFILES;启用内置预设
@@ -616,32 +858,50 @@ PROFILEPANEL_TOOLTIPCOPY;将当前配置复制到剪贴板
PROFILEPANEL_TOOLTIPLOAD;由文件加载配置
PROFILEPANEL_TOOLTIPPASTE;从剪贴板粘贴配置
PROFILEPANEL_TOOLTIPSAVE;保存当前配置
+PROGRESSBAR_GREENEQUIL;绿平衡...
+PROGRESSBAR_HLREC;高光还原...
+PROGRESSBAR_HOTDEADPIXELFILTER;热像素/坏点过滤器...
+PROGRESSBAR_LINEDENOISE;线状噪点过滤器...
PROGRESSBAR_LOADING;图片加载中...
-PROGRESSBAR_LOADINGTHUMBS;正在读取缩略图……
+PROGRESSBAR_LOADINGTHUMBS;正在读取缩略图...
PROGRESSBAR_LOADJPEG;JPEG文件加载中...
PROGRESSBAR_LOADPNG;PNG文件加载中...
PROGRESSBAR_LOADTIFF;TIFF文件加载中...
-PROGRESSBAR_NOIMAGES;没找到图片
+PROGRESSBAR_NOIMAGES;未找到图片
PROGRESSBAR_PROCESSING;图片处理中...
+PROGRESSBAR_PROCESSING_PROFILESAVED;处理配置档案已保存
+PROGRESSBAR_RAWCACORR;Raw色差矫正...
PROGRESSBAR_READY;就绪
PROGRESSBAR_SAVEJPEG;JPEG文件保存中...
PROGRESSBAR_SAVEPNG;PNG文件保存中...
PROGRESSBAR_SAVETIFF;TIFF文件保存中...
+PROGRESSBAR_SNAPSHOT_ADDED;快照已添加
+QINFO_FRAMECOUNT;%2帧
+QINFO_HDR;HDR / %2帧
QINFO_ISO;ISO
QINFO_NOEXIF;Exif数据不可用.
+QINFO_PIXELSHIFT;像素偏移/ %2帧
QUEUE_AUTOSTART;自动开始
QUEUE_DESTFILENAME;路径和文件名
QUEUE_FORMAT_TITLE;文件格式
QUEUE_LOCATION_FOLDER;保存至文件夹
QUEUE_LOCATION_TEMPLATE;使用模板
QUEUE_LOCATION_TEMPLATE_TOOLTIP;可以使用下列控制符:\n%f, %d1, %d2, ..., %p1, %p2, ...\n\n这些控制符指向RAW文件所在文件夹及子文件夹 \n\n例如 假如 /home/tom/image/02-09-2006/dsc0012.nef已经打开, 控制符的意义如下:\n%f=dsc0012, %d1=02-09-2006, %d2=image, ...\n%p1=/home/tom/image/02-09-2006, %p2=/home/tom/image, p3=/home/tom, ...\n\n如果想将输出文件保存到输入文件所在位置:\n%p1/%f\n\n如果想将输出文件保存至输入文件夹内的'converted'子文件夹:\n%p1/converted/%f\n\n如果想将输出文件保存至 '/home/tom/converted' 并保留按日期所分的子文件夹:\n%p2/converted/%d1/%f
+QUEUE_LOCATION_TITLE;输出位置
+SAMPLEFORMAT_0;未知数据格式
+SAMPLEFORMAT_1;8-bit unsigned
+SAMPLEFORMAT_2;16-bit unsigned
+SAMPLEFORMAT_16;16-bit浮点数
+SAMPLEFORMAT_32;24-bit浮点数
+SAMPLEFORMAT_64;32-bit浮点数
SAVEDLG_AUTOSUFFIX;自动加后缀到已经存在的文件
SAVEDLG_FILEFORMAT;文件格式
+SAVEDLG_FILEFORMAT_FLOAT;浮点数
SAVEDLG_FORCEFORMATOPTS;强制保存选项
SAVEDLG_JPEGQUAL;JPEG质量
SAVEDLG_PUTTOQUEUE;放入队列
-SAVEDLG_PUTTOQUEUEHEAD;放在处理序列首位
-SAVEDLG_PUTTOQUEUETAIL;放在处理序列末位
+SAVEDLG_PUTTOQUEUEHEAD;放在处理队列首位
+SAVEDLG_PUTTOQUEUETAIL;放在处理队列末位
SAVEDLG_SAVEIMMEDIATELY;立即保存
SAVEDLG_SAVESPP;随图片保存处理参数
SAVEDLG_SUBSAMP;二次抽样
@@ -650,10 +910,10 @@ SAVEDLG_SUBSAMP_2;平衡
SAVEDLG_SUBSAMP_3;质量至优
SAVEDLG_TIFFUNCOMPRESSED;未压缩的TIFF
SAVEDLG_WARNFILENAME;文件将被命名
-TOOLBAR_TOOLTIP_CROP;剪裁选择 (快捷键: C)
-TOOLBAR_TOOLTIP_HAND;手形工具 (快捷键: N)
-TOOLBAR_TOOLTIP_STRAIGHTEN;基准线选择 (快捷键: S)
-TOOLBAR_TOOLTIP_WB;白平衡采样 (快捷键: W)
+TOOLBAR_TOOLTIP_CROP;剪裁选择\n快捷键:c
+TOOLBAR_TOOLTIP_HAND;手形工具\n快捷键:n
+TOOLBAR_TOOLTIP_STRAIGHTEN;基准线选择\n快捷键:s
+TOOLBAR_TOOLTIP_WB;白平衡采样\n快捷键:w
TP_BWMIX_ALGO_LI;线性
TP_BWMIX_ALGO_SP;特定效果
TP_BWMIX_AUTOCH;自动
@@ -671,18 +931,22 @@ TP_BWMIX_GAMMA;伽马矫正
TP_BWMIX_GAM_TOOLTIP;矫正红绿蓝三色通道(RGB)伽马
TP_BWMIX_LABEL;黑白
TP_BWMIX_MET;方式
+TP_BWMIX_MET_CHANMIX;通道混合器
TP_BWMIX_MET_DESAT;淡化饱和度
-TP_BWMIX_MET_LUMEQUAL;明亮度平衡工具
+TP_BWMIX_MET_LUMEQUAL;亮度均衡工具
+TP_BWMIX_MIXC;通道混合器
TP_BWMIX_SETTING;预设
-TP_BWMIX_SETTING_TOOLTIP;不同预设 (影片、水平排布等)或手动通道混合工具设置
+TP_BWMIX_SETTING_TOOLTIP;不同预设 (胶片、风光等)或手动的通道混合工具设置
TP_BWMIX_SET_HIGHCONTAST;高对比度
TP_BWMIX_SET_HIGHSENSIT;高灵敏度
TP_BWMIX_SET_INFRARED;红外
TP_BWMIX_SET_LANDSCAPE;水平排布(风景)
TP_BWMIX_SET_LOWSENSIT;低灵敏度
-TP_BWMIX_SET_LUMINANCE;光亮度
+TP_BWMIX_SET_LUMINANCE;亮度
TP_BWMIX_SET_PANCHRO;全色的
TP_BWMIX_SET_PORTRAIT;垂直排布(肖像)
+TP_BWMIX_SET_RGBABS;绝对RGB
+TP_BWMIX_SET_RGBREL;相对RGB
TP_BWMIX_TCMODE_FILMLIKE;黑白电影样式
TP_BWMIX_TCMODE_STANDARD;黑白电影标准
TP_BWMIX_VAL;L
@@ -697,14 +961,15 @@ TP_COARSETRAF_TOOLTIP_HFLIP;水平翻转
TP_COARSETRAF_TOOLTIP_ROTLEFT;左转
TP_COARSETRAF_TOOLTIP_ROTRIGHT;右转
TP_COARSETRAF_TOOLTIP_VFLIP;竖直翻转
+TP_COLORAPP_BADPIXSL;热像素/坏点过滤器
TP_COLORAPP_LABEL_CAM02;图像调整
-TP_COLORAPP_LIGHT;光度 (J)
-TP_COLORAPP_LIGHT_TOOLTIP; CIECAM02、Lab 、RGB中光度意义各不同
+TP_COLORAPP_LIGHT;明度 (J)
+TP_COLORAPP_LIGHT_TOOLTIP; CIECAM02、Lab 、RGB中明度意义各不同
TP_COLORAPP_SURROUND_AVER;平均
TP_COLORAPP_SURROUND_DARK;暗
TP_COLORAPP_SURROUND_DIM;暗淡
-TP_COLORAPP_TCMODE_BRIGHTNESS;亮度
-TP_COLORAPP_TCMODE_LIGHTNESS;光度
+TP_COLORAPP_TCMODE_BRIGHTNESS;光亮度
+TP_COLORAPP_TCMODE_LIGHTNESS;明度
TP_COLORAPP_TCMODE_SATUR;色彩饱和度
TP_CROP_FIXRATIO;比例:
TP_CROP_GTDIAGONALS;对角线法则
@@ -723,22 +988,63 @@ TP_CROP_W;宽
TP_CROP_X;x
TP_CROP_Y;y
TP_DARKFRAME_AUTOSELECT;自动选择
-TP_DARKFRAME_LABEL;黑框架
-TP_DEFRINGE_LABEL;去色彩边缘(紫边)
+TP_DARKFRAME_LABEL;暗场
+TP_DEFRINGE_LABEL;去边
TP_DEFRINGE_RADIUS;半径
-TP_DIRPYRDENOISE_LUMINANCE_DETAIL;明亮度细节
-TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;光亮度/发光度
+TP_DEFRINGE_THRESHOLD;阈值
+TP_DEHAZE_LABEL;去雾
+TP_DEHAZE_LUMINANCE;仅亮度
+TP_DEHAZE_STRENGTH;力度
+TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;全局自动
+TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;色度—蓝-黄
+TP_DIRPYRDENOISE_CHROMINANCE_CURVE;色度曲线
+TP_DIRPYRDENOISE_CHROMINANCE_FRAME;色度
+TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;手动
+TP_DIRPYRDENOISE_CHROMINANCE_METHOD;方法
+TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;当前预览处噪点:中位数=%1 最大=%2
+TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;当前预览处噪点:中位数=- 最大= -
+TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;色度—红-绿
+TP_DIRPYRDENOISE_LABEL;降噪
+TP_DIRPYRDENOISE_LUMINANCE_CONTROL;亮度控制
+TP_DIRPYRDENOISE_LUMINANCE_CURVE;亮度曲线
+TP_DIRPYRDENOISE_LUMINANCE_DETAIL;细节恢复
+TP_DIRPYRDENOISE_LUMINANCE_FRAME;亮度
+TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;亮度
+TP_DIRPYRDENOISE_MAIN_COLORSPACE;色彩空间
TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB
+TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;对于Raw文件,RGB和L*a*b*均可用\n\n非Raw文件只可用L*a*b*空间,不论用户选择了哪个
+TP_DIRPYRDENOISE_MAIN_MODE;模式
+TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;激进
+TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;保守
+TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;“保守”会保留低频的色度纹路,而“激进”会消除它们
+TP_DIRPYRDENOISE_MEDIAN_METHOD;中值法
+TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;仅色度
+TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b*
+TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;中值滤波器
+TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;仅亮度
+TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB
+TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;当使用“仅亮度”和“L*a*b*”法时,在降噪流水线中,\n中值滤波会在小波被应用后进行。\n当使用“RGB”模式时,它会在降噪流水线的最后被进行
+TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;权重L* (小) + a*b* (正常)
+TP_DIRPYRDENOISE_MEDIAN_PASSES;中值迭代
+TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;使用3x3大小窗口并进行三次中值迭代通常比使用7x7窗口并进行一次迭代的效果更好
+TP_DIRPYRDENOISE_MEDIAN_TYPE;中值类型
+TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;使用你想要的窗口大小的中值滤波器。窗口大小越大,处理用时越长。\n3×3柔和:处理3x3窗口中的5个像素。\n\n处理3x3像素大小的窗口里面的9个像素。\n\n5x5柔和:处理5x5像素大小的窗口里面的13个像素。\n\n5x5:处理5x5像素大小的窗口里面的25个像素。\n\n7x7:处理7x7像素大小的窗口里面的49个像素。\n\n9x9:处理9x9像素大小的窗口里面的81个像素。\n\n有时使用小窗口进行多次迭代的效果会优于使用大窗口进行一次迭代的效果
+TP_DIRPYRDENOISE_TYPE_3X3;3×3
+TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3柔和
+TP_DIRPYRDENOISE_TYPE_5X5;5×5
+TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5柔和
+TP_DIRPYRDENOISE_TYPE_7X7;7×7
+TP_DIRPYRDENOISE_TYPE_9X9;9×9
TP_DIRPYREQUALIZER_ALGO;皮肤色彩范围
TP_DIRPYREQUALIZER_ARTIF;减少杂色
TP_DIRPYREQUALIZER_HUESKIN;皮肤色相
TP_DIRPYREQUALIZER_LABEL;分频反差调整
-TP_DIRPYREQUALIZER_LUMACOARSEST;最粗
+TP_DIRPYREQUALIZER_LUMACOARSEST;最粗糙
TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;反差 -
TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;反差 +
-TP_DIRPYREQUALIZER_LUMAFINEST;最细
+TP_DIRPYREQUALIZER_LUMAFINEST;最精细
TP_DIRPYREQUALIZER_LUMANEUTRAL;自然
-TP_DIRPYREQUALIZER_SKIN;皮肤色彩 针对/保护
+TP_DIRPYREQUALIZER_SKIN;肤色针对/保护
TP_DIRPYREQUALIZER_THRESHOLD;阈值
TP_DISTORTION_AMOUNT;数量
TP_DISTORTION_LABEL;畸变
@@ -747,7 +1053,7 @@ TP_EPD_SCALE;拉伸
TP_EPD_STRENGTH;力度
TP_EXPOSURE_AUTOLEVELS;自动色阶
TP_EXPOSURE_BLACKLEVEL;黑点
-TP_EXPOSURE_BRIGHTNESS;亮度
+TP_EXPOSURE_BRIGHTNESS;光亮度
TP_EXPOSURE_CLIP;高光溢出
TP_EXPOSURE_COMPRHIGHLIGHTS;高光压缩
TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;高光压缩阈值
@@ -758,40 +1064,55 @@ TP_EXPOSURE_CURVEEDITOR1;色调曲线 1
TP_EXPOSURE_CURVEEDITOR2;色调曲线 2
TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;请从 RawPedia 网站中 Exposure > Tone Curve 文章中了解如何使用双色调曲线
TP_EXPOSURE_EXPCOMP;曝光补偿
+TP_EXPOSURE_HISTMATCHING;自适应色调曲线
+TP_EXPOSURE_HISTMATCHING_TOOLTIP;自动调整滑条和曲线(不包括曝光补偿)以使图片贴近于内嵌于Raw的JPEG预览图。
TP_EXPOSURE_LABEL;曝光
TP_EXPOSURE_SATURATION;色彩饱和度
TP_EXPOSURE_TCMODE_FILMLIKE;仿胶片式
TP_EXPOSURE_TCMODE_LABEL1;曲线模式1
TP_EXPOSURE_TCMODE_LABEL2;曲线模式2
-TP_EXPOSURE_TCMODE_SATANDVALBLENDING;饱和度和混合值
+TP_EXPOSURE_TCMODE_LUMINANCE;亮度
+TP_EXPOSURE_TCMODE_PERCEPTUAL;感知性
+TP_EXPOSURE_TCMODE_SATANDVALBLENDING;饱和度-亮度混合
TP_EXPOSURE_TCMODE_STANDARD;标准
-TP_EXPOSURE_TCMODE_WEIGHTEDSTD;倾向于标准
+TP_EXPOSURE_TCMODE_WEIGHTEDSTD;加权标准
+TP_FILMNEGATIVE_LABEL;胶片负片
+TP_FILMSIMULATION_LABEL;胶片模拟
+TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee默认会寻找用于胶片模拟工具的Hald CLUT图像,图像所在的文件夹加载时间比较长。\n前往参数设置-图片处理-Hald CLUT路径\n以寻找被使用的文件夹是哪个。你应该把这个文件夹指向一个只有Hald CLUT图像而没有其他图片的文件夹,而如果你不想用胶片模拟功能,就把它指向一个空文件夹。\n\n阅读RawPedia上的Film Simulation词条以获取更多信息。\n\n你现在想取消扫描吗?
+TP_FILMSIMULATION_STRENGTH;力度
+TP_FILMSIMULATION_ZEROCLUTSFOUND;在参数设置中设定HaldCLUT目录
TP_FLATFIELD_AUTOSELECT;自动选择
TP_FLATFIELD_BLURRADIUS;模糊半径
TP_FLATFIELD_BLURTYPE;模糊种类
TP_FLATFIELD_BT_AREA;区域
TP_FLATFIELD_BT_HORIZONTAL;水平
-TP_FLATFIELD_BT_VERTHORIZ;垂直 + 水平
+TP_FLATFIELD_BT_VERTHORIZ;垂直+水平
TP_FLATFIELD_BT_VERTICAL;垂直
+TP_FLATFIELD_CLIPCONTROL;溢出控制
+TP_FLATFIELD_CLIPCONTROL_TOOLTIP;溢出控制能够避免由于平场的应用而导致的高光溢出。如果在应用平场之前就有溢出的高光,数值就会为0
TP_FLATFIELD_LABEL;平场
+TP_GENERAL_11SCALE_TOOLTIP;此工具的效果仅在以1:1大小预览时才可见/准确
TP_GRADIENT_CENTER;中心
TP_GRADIENT_CENTER_X;中心 X
+TP_GRADIENT_CENTER_X_TOOLTIP;将渐变滤镜向左(负值)或向右(正值)移动
TP_GRADIENT_CENTER_Y;中心 Y
+TP_GRADIENT_CENTER_Y_TOOLTIP;将渐变滤镜向上(负值)或向下(正值)移动
TP_GRADIENT_DEGREE;角度
-TP_GRADIENT_DEGREE_TOOLTIP;转动角度数
+TP_GRADIENT_DEGREE_TOOLTIP;转动的角度数
TP_GRADIENT_FEATHER;羽化
-TP_GRADIENT_FEATHER_TOOLTIP;图像对角比例表示渐变宽度
-TP_GRADIENT_LABEL;渐变过滤
+TP_GRADIENT_FEATHER_TOOLTIP;以图像对角线的长度为100,设定渐变的宽度
+TP_GRADIENT_LABEL;渐变滤镜
TP_GRADIENT_STRENGTH;延展
+TP_GRADIENT_STRENGTH_TOOLTIP;滤镜的强度(档数)
TP_HLREC_BLEND;混合
TP_HLREC_CIELAB;CIELab模式混合
TP_HLREC_COLOR;色彩延伸
TP_HLREC_LABEL;高光还原
TP_HLREC_LUMINANCE;亮度还原
TP_HLREC_METHOD;方法:
-TP_HSVEQUALIZER_CHANNEL;频道
+TP_HSVEQUALIZER_CHANNEL;通道
TP_HSVEQUALIZER_HUE;H
-TP_HSVEQUALIZER_LABEL;HSV 平衡
+TP_HSVEQUALIZER_LABEL;HSV均衡器
TP_HSVEQUALIZER_SAT;S
TP_HSVEQUALIZER_VAL;V
TP_ICM_INPUTCAMERA;相机缺省
@@ -807,83 +1128,205 @@ TP_ICM_NOICM;No ICM: sRGB配置
TP_ICM_OUTPUTPROFILE;输出配置
TP_ICM_TONECURVE;使用 DCP 色调曲线
TP_ICM_WORKINGPROFILE;当前配置
-TP_IMPULSEDENOISE_LABEL;降低脉冲噪声
+TP_IMPULSEDENOISE_LABEL;脉冲噪声降低
TP_IMPULSEDENOISE_THRESH;阈值
TP_LABCURVE_AVOIDCOLORSHIFT;避免色彩偏移
TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;使色彩适应当前色彩空间范围, 并使用Munsell色矫正
-TP_LABCURVE_BRIGHTNESS;光度
+TP_LABCURVE_BRIGHTNESS;光强度
TP_LABCURVE_CHROMATICITY;色度 CIE
+TP_LABCURVE_CHROMA_TOOLTIP;若要应用黑白色调,将色度值降低为-100
TP_LABCURVE_CONTRAST;对比度
-TP_LABCURVE_CURVEEDITOR;明亮度曲线
+TP_LABCURVE_CURVEEDITOR;亮度曲线
TP_LABCURVE_LABEL;Lab调整
TP_LENSGEOM_AUTOCROP;自动剪切
TP_LENSGEOM_FILL;自动填充
TP_LENSGEOM_LABEL;镜头 / 几何
+TP_LENSGEOM_LIN;线性
+TP_LENSGEOM_LOG;对数
+TP_LENSPROFILE_CORRECTION_AUTOMATCH;自动选择
+TP_LENSPROFILE_CORRECTION_LCPFILE;LCP文件
+TP_LENSPROFILE_CORRECTION_MANUAL;手动选择
TP_LENSPROFILE_LABEL;镜头矫正档案
+TP_LENSPROFILE_MODE_HEADER;镜头档案
+TP_LENSPROFILE_USE_CA;色差
+TP_LENSPROFILE_USE_GEOMETRIC;几何畸变
+TP_LENSPROFILE_USE_HEADER;矫正
+TP_LENSPROFILE_USE_VIGNETTING;暗角
+TP_LOCALCONTRAST_AMOUNT;数量
+TP_LOCALCONTRAST_DARKNESS;黑处等级
+TP_LOCALCONTRAST_LABEL;局部反差
+TP_LOCALCONTRAST_LIGHTNESS;亮处等级
+TP_LOCALCONTRAST_RADIUS;半径
+TP_METADATA_EDIT;应用修改
+TP_METADATA_MODE;元数据复制模式:
+TP_METADATA_STRIP;移除所有元数据
TP_PCVIGNETTE_FEATHER;羽化
+TP_PCVIGNETTE_FEATHER_TOOLTIP;羽化:\n0 = 仅边角,\n50 = 到达一半的位置,\n100 = 到达中心
TP_PCVIGNETTE_LABEL;暗角滤镜
TP_PCVIGNETTE_ROUNDNESS;圆度
+TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;圆度:\n0 = 矩形,\n50 = 适于图像的椭圆\n100 = 圆形
TP_PCVIGNETTE_STRENGTH;力度
-TP_PCVIGNETTE_STRENGTH_TOOLTIP;滤镜的力度刻度 (到达角落)
+TP_PCVIGNETTE_STRENGTH_TOOLTIP;滤镜的曝光补偿力度 (到达边角)
+TP_PDSHARPENING_LABEL;捕图加锐
TP_PERSPECTIVE_HORIZONTAL;水平
TP_PERSPECTIVE_LABEL;视角
TP_PERSPECTIVE_VERTICAL;垂直
-TP_PREPROCESS_LABEL;处理中
-TP_PREPROCESS_LINEDENOISE;线性噪点过滤
+TP_PREPROCESS_DEADPIXFILT;坏点过滤器
+TP_PREPROCESS_DEADPIXFILT_TOOLTIP;尝试过滤坏点。
+TP_PREPROCESS_GREENEQUIL;绿平衡
+TP_PREPROCESS_HOTPIXFILT;热像素过滤器
+TP_PREPROCESS_HOTPIXFILT_TOOLTIP;尝试过滤热像素。
+TP_PREPROCESS_LABEL;预处理
+TP_PREPROCESS_LINEDENOISE;线状噪点过滤
+TP_PREPROCESS_LINEDENOISE_DIRECTION;方向
+TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;双向
+TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;横向
+TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;横向,只在PDAF点所在的行上
+TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;纵向
TP_PREPROCESS_NO_FOUND;没发现
+TP_PREPROCESS_PDAFLINESFILTER;PDAF条纹过滤器
+TP_PRSHARPENING_LABEL;调整大小后加锐
+TP_PRSHARPENING_TOOLTIP;在调整图片大小后加锐图像。仅在选择"Lanczos"算法时可用。本工具的效果无法预览。见RawPedia的文章以了解本工具的使用教程
TP_RAWCACORR_AUTO;自动修正
+TP_RAWCACORR_AUTOIT;迭代
+TP_RAWCACORR_AUTOIT_TOOLTIP;若“自动矫正”被勾选,此设置便可用。\n自动矫正是保守的,也就是说它经常不会去除所有色差。\n要移除全部色差,你可以使用至多迭代五次的色差矫正迭代。\n每次迭代会纠正上个迭代未能修正的色差,代价是需要花费额外的处理时间。
+TP_RAWCACORR_AVOIDCOLORSHIFT;避免偏色
TP_RAWCACORR_CABLUE;蓝
TP_RAWCACORR_CARED;红
-TP_RESIZE_CROPPEDAREA;切出的部分
-TP_RESIZE_FITBOX;Bounding Box
-TP_RESIZE_FULLIMAGE;全图
+TP_RAWCACORR_LABEL;色差矫正
+TP_RAWEXPOS_RGB;红,绿,蓝
+TP_RAW_AHD;AHD
+TP_RAW_AMAZE;AMaZE
+TP_RAW_AMAZEVNG4;AMaZE+VNG4
+TP_RAW_BORDER;边界
+TP_RAW_DCB;DCB
+TP_RAW_DCBENHANCE;DCB优化
+TP_RAW_DCBITERATIONS;DCB迭代数
+TP_RAW_DCBVNG4;DCB+VNG4
+TP_RAW_DMETHOD;方法
+TP_RAW_DMETHOD_PROGRESSBAR;%1 去马赛克中...
+TP_RAW_DMETHOD_PROGRESSBAR_REFINE;去马赛克精细化...
+TP_RAW_DMETHOD_TOOLTIP;注:IGV和LMMSE是专门用于配合降噪工具,在为高ISO图片降噪时不产生迷宫状噪点,色调分离或是褪色所用的。\n像素偏移是为宾得/索尼的像素偏移文件所用的。此算法使用AMaZE算法来处理非像素偏移文件。
+TP_RAW_DUALDEMOSAICAUTOCONTRAST;自动阈值
+TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;如果勾选框被打勾(推荐如此做),RawTherapee会根据图片中的平缓区域自动计算一个最优值。\n如果图像中没有平缓的区域,或是图片噪点太多,该数值会被设为0\n若想手动调整此数值,首先要将勾选框取消勾选(合适的值取决于具体图像的情况)。
+TP_RAW_DUALDEMOSAICCONTRAST;反差阈值
+TP_RAW_EAHD;EAHD
+TP_RAW_FALSECOLOR;伪色抑制步长
+TP_RAW_FAST;Fast
+TP_RAW_HD;阈值
+TP_RAW_HD_TOOLTIP;更低的数值会使热像素/坏点的检测更加激进,但是“宁错杀,不放过”的激进程度可能会导致杂点的产生。在启用本功能后,如果你发现了新出现的杂点,就逐渐提高阈值,直至杂点消失。
+TP_RAW_HPHD;HPHD
+TP_RAW_IGV;IGV
+TP_RAW_IMAGENUM;子图像
+TP_RAW_IMAGENUM_SN;SN模式
+TP_RAW_IMAGENUM_TOOLTIP;某些Raw文件包含多张子图像(宾得/索尼的像素偏移,宾得的3张合并HDR,佳能的双像素,富士的EXR)。\n\n当使用除像素偏移外的任意一个去马赛克算法时,本栏用来选择哪帧子图像被处理。\n\n当在像素偏移的Raw文件上使用像素偏移去马赛克算法时,所有子图像都会被应用,此时本栏用来选择哪帧子图像被用来处理动体。
+TP_RAW_LABEL;去马赛克
+TP_RAW_LMMSEITERATIONS;LMMSE优化步长
+TP_RAW_LMMSE_TOOLTIP;添加gamma(步长1),中位数(步长2-4)和精细化(步长5-6)以减少杂点并提升信噪比。
+TP_RAW_MONO;黑白
+TP_RAW_NONE;无(显示传感器阵列)
+TP_RAW_PIXELSHIFT;像素偏移
+TP_RAW_PIXELSHIFTBLUR;动体蒙版模糊
+TP_RAW_PIXELSHIFTDMETHOD;动体区域的去马赛克算法
+TP_RAW_PIXELSHIFTEPERISO;敏感度
+TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;默认值0在原生ISO下应该具有不错的效果。\n更大的数值会增强动体检测的敏感度。\n以微小的步长调整此值,同时观察动体蒙版的变化。\n对于欠曝/高ISO的照片,应提高此值。
+TP_RAW_PIXELSHIFTEQUALBRIGHT;将不同照片的亮度均等化
+TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;将各个通道分别均等化
+TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;启用:对RGB通道分别进行均等化。\n禁用:使用同一个均等化系数对所有通道进行均等化。
+TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;以当前被选中的一帧图像为基准,均等化各帧图像的亮度。\n如果各帧中有过曝的区域,应选择最亮的一帧以避免过曝区域出现紫色,也可启用动体补正来解决该问题。
+TP_RAW_PIXELSHIFTGREEN;检查绿色通道以检测动体
+TP_RAW_PIXELSHIFTHOLEFILL;填补动体蒙版的洞
+TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;填补动体蒙版中间所存在的洞
+TP_RAW_PIXELSHIFTMEDIAN;对动体区域使用中值
+TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;对于运动的部分,使用所有图片的中值,而不是用户选择的某一帧图片。\n移除在所有图片中位置都不同的物体。\n在移动慢(重叠)的物体上会产生动体效果。
+TP_RAW_PIXELSHIFTMM_AUTO;自动
+TP_RAW_PIXELSHIFTMM_CUSTOM;自定义
+TP_RAW_PIXELSHIFTMM_OFF;关闭
+TP_RAW_PIXELSHIFTMOTIONMETHOD;动体补正
+TP_RAW_PIXELSHIFTNONGREENCROSS;检查红/蓝色通道以检测动体
+TP_RAW_PIXELSHIFTSHOWMOTION;显示动体蒙版
+TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;仅显示动体蒙版
+TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;显示没有照片的动体蒙版。
+TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;在图像上用绿色蒙版显示动体区域。
+TP_RAW_PIXELSHIFTSIGMA;模糊半径
+TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;默认半径值1.0一般对于原生ISO来说足够好。\n对于高ISO照片,提高此值,5.0是不错的起始点。\n在改变此值的同时关注动体蒙版。
+TP_RAW_PIXELSHIFTSMOOTH;顺滑过渡
+TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;让存在动体的区域与没有动体之间的区域之间顺滑地过渡。\n将此值设置为0以禁用顺滑过渡\n将此值设置为1以使用AMaZE/LMMSE算法(这取决于你是否选择了“使用LMMSE”)所解出的你所选择的那一帧图像,如果你选择了“使用中值”,那么就会根据通过所有图像计算出的中值解出图像。
+TP_RAW_RCD;RCD
+TP_RAW_RCDVNG4;RCD+VNG4
+TP_RAW_SENSOR_BAYER_LABEL;拜耳阵列传感器
+TP_RESIZE_ALLOW_UPSCALING;允许升采样
+TP_RESIZE_APPLIESTO;应用到:
+TP_RESIZE_CROPPEDAREA;裁剪区域
+TP_RESIZE_FITBOX;矩形区域
+TP_RESIZE_FULLIMAGE;整张图
TP_RESIZE_H;高:
TP_RESIZE_HEIGHT;高度
TP_RESIZE_LABEL;调整大小
TP_RESIZE_LANCZOS;Lanczos算法
TP_RESIZE_METHOD;方式:
TP_RESIZE_NEAREST;最近点
-TP_RESIZE_SCALE;比例
-TP_RESIZE_SPECIFY;指定:
+TP_RESIZE_SCALE;缩放倍数
+TP_RESIZE_SPECIFY;调整:
TP_RESIZE_W;宽:
TP_RESIZE_WIDTH;宽度
+TP_RETINEX_CONTEDIT_HSL;HSL直方图
+TP_RETINEX_CONTEDIT_LAB;L*a*b*直方图
+TP_RETINEX_CONTEDIT_LH;色调
+TP_RETINEX_CONTEDIT_MAP;均衡器
+TP_RETINEX_EQUAL;均衡器
+TP_RETINEX_VIEW_UNSHARP;USM锐化
TP_RGBCURVES_BLUE;B
-TP_RGBCURVES_CHANNEL;频道
+TP_RGBCURVES_CHANNEL;通道
TP_RGBCURVES_GREEN;G
TP_RGBCURVES_LABEL;RGB曲线
-TP_RGBCURVES_LUMAMODE;光度模式
-TP_RGBCURVES_LUMAMODE_TOOLTIP;光度模式 允许改变R、G、B三种通道光量但不影响色彩
+TP_RGBCURVES_LUMAMODE;亮度模式
+TP_RGBCURVES_LUMAMODE_TOOLTIP;亮度模式 允许改变R、G、B三种通道光量但不影响色彩
TP_RGBCURVES_RED;R
TP_ROTATE_DEGREE;角度
TP_ROTATE_LABEL;旋转
-TP_ROTATE_SELECTLINE; 选择基准线
+TP_ROTATE_SELECTLINE;选择基准线
TP_SAVEDIALOG_OK_TIP;快捷键: Ctrl-Enter
TP_SHADOWSHLIGHTS_HIGHLIGHTS;高光
-TP_SHADOWSHLIGHTS_HLTONALW;影调范围
+TP_SHADOWSHLIGHTS_HLTONALW;色调范围
TP_SHADOWSHLIGHTS_LABEL;阴影/高光
TP_SHADOWSHLIGHTS_RADIUS;半径
TP_SHADOWSHLIGHTS_SHADOWS;阴影
-TP_SHADOWSHLIGHTS_SHTONALW;影调范围
+TP_SHADOWSHLIGHTS_SHTONALW;色调范围
TP_SHARPENEDGE_AMOUNT;数量
TP_SHARPENEDGE_LABEL;边缘
-TP_SHARPENEDGE_PASSES;迭代次数
-TP_SHARPENEDGE_THREE;仅光度
+TP_SHARPENEDGE_PASSES;迭代
+TP_SHARPENEDGE_THREE;仅亮度
TP_SHARPENING_AMOUNT;数量
+TP_SHARPENING_BLUR;模糊半径
+TP_SHARPENING_CONTRAST;反差阈值
TP_SHARPENING_EDRADIUS;半径
TP_SHARPENING_EDTOLERANCE;边缘容差
TP_SHARPENING_HALOCONTROL;光晕控制
TP_SHARPENING_HCAMOUNT;数量
+TP_SHARPENING_ITERCHECK;自动限制迭代
TP_SHARPENING_LABEL;锐化
TP_SHARPENING_METHOD;方式
TP_SHARPENING_ONLYEDGES;仅锐化边缘
TP_SHARPENING_RADIUS;半径
-TP_SHARPENING_RLD;理查森-露西反卷积法
+TP_SHARPENING_RADIUS_BOOST;边缘半径值提升
+TP_SHARPENING_RLD;理查森-露西反卷积法(RLD)
TP_SHARPENING_RLD_AMOUNT;数量
TP_SHARPENING_RLD_DAMPING;衰减
TP_SHARPENING_RLD_ITERATIONS;迭代
TP_SHARPENING_THRESHOLD;阈值
TP_SHARPENING_USM;USM锐化
TP_SHARPENMICRO_AMOUNT;数量
+TP_SHARPENMICRO_CONTRAST;反差阈值
+TP_SHARPENMICRO_LABEL;微反差
+TP_SHARPENMICRO_MATRIX;使用3×3阵列而非5×5阵列
+TP_SHARPENMICRO_UNIFORMITY;均匀度
+TP_TM_FATTAL_AMOUNT;数量
+TP_TM_FATTAL_ANCHOR;锚点
+TP_TM_FATTAL_LABEL;动态范围压缩
+TP_TM_FATTAL_THRESHOLD;细节
+TP_VIBRANCE_AVOIDCOLORSHIFT;避免偏色
+TP_VIBRANCE_PROTECTSKINS;保护肤色
TP_VIGNETTING_AMOUNT;数量
TP_VIGNETTING_CENTER;中心
TP_VIGNETTING_CENTER_X;中心 X
@@ -891,6 +1334,66 @@ TP_VIGNETTING_CENTER_Y;中心 Y
TP_VIGNETTING_LABEL;暗角矫正
TP_VIGNETTING_RADIUS;半径
TP_VIGNETTING_STRENGTH;力度
+TP_WAVELET_1;第1级
+TP_WAVELET_2;第2级
+TP_WAVELET_3;第3级
+TP_WAVELET_4;第4级
+TP_WAVELET_5;第5级
+TP_WAVELET_6;第6级
+TP_WAVELET_7;第7级
+TP_WAVELET_8;第8级
+TP_WAVELET_9;第9级
+TP_WAVELET_APPLYTO;应用到
+TP_WAVELET_AVOID;避免偏色
+TP_WAVELET_B0;黑色
+TP_WAVELET_B1;灰色
+TP_WAVELET_BACKGROUND;背景
+TP_WAVELET_BACUR;曲线
+TP_WAVELET_BASLI;滑条
+TP_WAVELET_CCURVE;局部反差
+TP_WAVELET_CH3;与反差等级挂钩
+TP_WAVELET_CHCU;曲线
+TP_WAVELET_CHR;色度-反差挂钩力度
+TP_WAVELET_CHSL;滑条
+TP_WAVELET_COMPCONT;反差
+TP_WAVELET_CONTRA;反差
+TP_WAVELET_CONTRAST_MINUS;反差 -
+TP_WAVELET_CONTRAST_PLUS;反差 +
+TP_WAVELET_CONTRA_TOOLTIP;改变余像的反差。
+TP_WAVELET_CTYPE;色度控制
+TP_WAVELET_DALL;所有方向
+TP_WAVELET_DAUB;Edge performance
+TP_WAVELET_DAUB2;D2-低
+TP_WAVELET_DAUB4;D4-标准
+TP_WAVELET_DAUB6;D6-标准增强
+TP_WAVELET_DAUB10;D10-中等
+TP_WAVELET_DAUB14;D14-高
+TP_WAVELET_DONE;纵向
+TP_WAVELET_DTHR;斜向
+TP_WAVELET_DTWO;横向
+TP_WAVELET_EDCU;曲线
+TP_WAVELET_EDGCONT;局部反差
+TP_WAVELET_EDSL;阈值滑条
+TP_WAVELET_EDVAL;力度
+TP_WAVELET_LABEL;小波层级
+TP_WAVELET_LARGEST;最粗糙
+TP_WAVELET_LEVDIR_ALL;所有方向的全部层级
+TP_WAVELET_LEVDIR_INF;小于等于此层级
+TP_WAVELET_LEVDIR_ONE;一个层级
+TP_WAVELET_LEVDIR_SUP;高于此层级
+TP_WAVELET_LEVELS;小波层级
+TP_WAVELET_LEVELS_TOOLTIP;选择将图像分解为几个层级的细节。更多的层级需要使用更多的内存和更长的处理时间。
+TP_WAVELET_LEVONE;第2级
+TP_WAVELET_LEVTHRE;第4级
+TP_WAVELET_LEVTWO;第3级
+TP_WAVELET_LEVZERO;第1级
+TP_WAVELET_MEDGREINF;第一层级
+TP_WAVELET_MEDI;减少蓝天中的杂点
+TP_WAVELET_NOIS;去噪
+TP_WAVELET_NOISE;去噪和精细化
+TP_WAVELET_SETTINGS;小波设定
+TP_WAVELET_STREN;力度
+TP_WAVELET_STRENGTH;力度
TP_WBALANCE_AUTO;自动
TP_WBALANCE_CAMERA;相机
TP_WBALANCE_CLOUDY;阴天
@@ -898,6 +1401,8 @@ TP_WBALANCE_CUSTOM;自定义
TP_WBALANCE_DAYLIGHT;晴天
TP_WBALANCE_EQBLUERED;蓝红平衡
TP_WBALANCE_FLASH55;徕卡
+TP_WBALANCE_FLASH60;标准,佳能,宾得,奥林巴斯
+TP_WBALANCE_FLASH65;尼康,松下,索尼,美能达
TP_WBALANCE_FLASH_HEADER;闪光
TP_WBALANCE_GREEN;色度
TP_WBALANCE_LABEL;白平衡
@@ -913,1403 +1418,9 @@ TP_WBALANCE_WATER1;水下 1
TP_WBALANCE_WATER2;水下 2
TP_WBALANCE_WATER_HEADER;水下
ZOOMPANEL_100;(100%)
-ZOOMPANEL_NEWCROPWINDOW;开启(新)细节窗口
+ZOOMPANEL_NEWCROPWINDOW;开启(新的)细节窗口
ZOOMPANEL_ZOOM100;缩放到100%\n快捷键: z
ZOOMPANEL_ZOOMFITCROPSCREEN;适应边缘到屏幕\n快捷键:f
ZOOMPANEL_ZOOMFITSCREEN;适应屏幕\n快捷键: Alt-f
ZOOMPANEL_ZOOMIN;缩放拉近\n快捷键: +
ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: -
-
-!!!!!!!!!!!!!!!!!!!!!!!!!
-! Untranslated keys follow; remove the ! prefix after an entry is translated.
-!!!!!!!!!!!!!!!!!!!!!!!!!
-
-!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value.
-!CURVEEDITOR_AXIS_IN;I:
-!CURVEEDITOR_AXIS_LEFT_TAN;LT:
-!CURVEEDITOR_AXIS_OUT;O:
-!CURVEEDITOR_AXIS_RIGHT_TAN;RT:
-!CURVEEDITOR_CATMULLROM;Flexible
-!CURVEEDITOR_EDITPOINT_HINT;Enable edition of node in/out values.\n\nRight-click on a node to select it.\nRight-click on empty space to de-select the node.
-!DYNPROFILEEDITOR_IMGTYPE_ANY;Any
-!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR
-!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift
-!DYNPROFILEEDITOR_IMGTYPE_STD;Standard
-!EDIT_OBJECT_TOOLTIP;Displays a widget on the preview window which lets you adjust this tool.
-!EDIT_PIPETTE_TOOLTIP;To add an adjustment point to the curve, hold the Ctrl key while left-clicking the desired spot in the image preview.\nTo adjust the point, hold the Ctrl key while left-clicking the corresponding area in the preview, then let go of Ctrl (unless you desire fine control) and while still holding the left mouse button move the mouse up or down to move that point up or down in the curve.
-!EXIFFILTER_IMAGETYPE;Image type
-!EXIFPANEL_SHOWALL;Show all
-!EXPORT_BYPASS;Processing steps to bypass
-!EXPORT_BYPASS_RAW_DCB_ENHANCE;Bypass [raw] DCB Enhancement Steps
-!EXPORT_BYPASS_RAW_DCB_ITERATIONS;Bypass [raw] DCB Iterations
-!EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;Bypass [raw] LMMSE Enhancement Steps
-!EXPORT_INSTRUCTIONS;Fast Export options provide overrides to bypass time and resource consuming development settings and to run queue processing using the fast export settings instead. This method is recommended for quicker generation of lower resolution images when speed is a priority or when resized output is desired for one or many images without making modifications to their saved development parameters.
-!EXPORT_PIPELINE;Processing pipeline
-!EXPORT_USE_FAST_PIPELINE;Dedicated (full processing on resized image)
-!EXPORT_USE_FAST_PIPELINE_TIP;Use a dedicated processing pipeline for images in Fast Export mode, that trades speed for quality. Resizing of the image is done as early as possible, instead of doing it at the end like in the normal pipeline. The speedup can be significant, but be prepared to see artifacts and a general degradation of output quality.
-!EXPORT_USE_NORMAL_PIPELINE;Standard (bypass some steps, resize at the end)
-!FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords.
-!FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory
-!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles
-!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles
-!FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple
-!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash?
-!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files?
-!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version?
-!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash.
-!FILEBROWSER_POPUPREMOVE;Delete permanently
-!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version
-!FILEBROWSER_QUERYHINT;Type filenames to search for. Supports partial filenames. Separate the search terms using commas, e.g.\n1001,1004,1199\n\nExclude search terms by prefixing them with !=\ne.g.\n!=1001,1004,1199\n\nShortcuts:\nCtrl-f - focus the Find box,\nEnter - search,\nEsc - clear the Find box,\nShift-Esc - defocus the Find box.
-!FILEBROWSER_SHOWCOLORLABEL1HINT;Show images labeled Red.\nShortcut: Alt-1
-!FILEBROWSER_SHOWCOLORLABEL2HINT;Show images labeled Yellow.\nShortcut: Alt-2
-!FILEBROWSER_SHOWCOLORLABEL3HINT;Show images labeled Green.\nShortcut: Alt-3
-!FILEBROWSER_SHOWCOLORLABEL4HINT;Show images labeled Blue.\nShortcut: Alt-4
-!FILEBROWSER_SHOWCOLORLABEL5HINT;Show images labeled Purple.\nShortcut: Alt-5
-!FILEBROWSER_SHOWEDITEDHINT;Show edited images.\nShortcut: 7
-!FILEBROWSER_SHOWEDITEDNOTHINT;Show not edited images.\nShortcut: 6
-!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash.
-!FILEBROWSER_SHOWORIGINALHINT;Show only original images.\n\nWhen several images exist with the same filename but different extensions, the one considered original is the one whose extension is nearest the top of the parsed extensions list in Preferences > File Browser > Parsed Extensions.
-!FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6
-!FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0
-!FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0
-!GENERAL_CURRENT;Current
-!GENERAL_HELP;Help
-!GENERAL_RESET;Reset
-!GENERAL_SAVE_AS;Save as...
-!GENERAL_SLIDER;Slider
-!GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP.
-!HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.
-!HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram.
-!HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram.
-!HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram.
-!HISTORY_MSG_82;Profile changed
-!HISTORY_MSG_86;RGB Curves - Luminosity mode
-!HISTORY_MSG_87;Impulse Noise Reduction
-!HISTORY_MSG_88;Impulse NR threshold
-!HISTORY_MSG_91;NR - Chrominance master
-!HISTORY_MSG_93;CbDL - Value
-!HISTORY_MSG_94;Contrast by Detail Levels
-!HISTORY_MSG_95;L*a*b* - Chromaticity
-!HISTORY_MSG_96;L*a*b* - a* curve
-!HISTORY_MSG_97;L*a*b* - b* curve
-!HISTORY_MSG_98;Demosaicing method
-!HISTORY_MSG_99;Hot pixel filter
-!HISTORY_MSG_100;Exposure - Saturation
-!HISTORY_MSG_101;HSV - Hue
-!HISTORY_MSG_102;HSV - Saturation
-!HISTORY_MSG_104;HSV Equalizer
-!HISTORY_MSG_105;Defringe
-!HISTORY_MSG_106;Defringe - Radius
-!HISTORY_MSG_107;Defringe - Threshold
-!HISTORY_MSG_108;Exposure - HLC threshold
-!HISTORY_MSG_109;Resize - Bounding box
-!HISTORY_MSG_110;Resize - Applies to
-!HISTORY_MSG_112;--unused--
-!HISTORY_MSG_115;False color suppression
-!HISTORY_MSG_116;DCB enhancement
-!HISTORY_MSG_117;Raw CA correction - Red
-!HISTORY_MSG_118;Raw CA correction - Blue
-!HISTORY_MSG_120;Green equilibration
-!HISTORY_MSG_121;Raw CA Correction - Auto
-!HISTORY_MSG_131;NR - Luma
-!HISTORY_MSG_132;NR - Chroma
-!HISTORY_MSG_133;Output gamma
-!HISTORY_MSG_134;Free gamma
-!HISTORY_MSG_135;Free gamma
-!HISTORY_MSG_136;Free gamma slope
-!HISTORY_MSG_137;Black level - Green 1
-!HISTORY_MSG_138;Black level - Red
-!HISTORY_MSG_139;Black level - Blue
-!HISTORY_MSG_140;Black level - Green 2
-!HISTORY_MSG_141;Black level - Link greens
-!HISTORY_MSG_142;ES - Iterations
-!HISTORY_MSG_143;ES - Quantity
-!HISTORY_MSG_144;Microcontrast - Quantity
-!HISTORY_MSG_145;Microcontrast - Uniformity
-!HISTORY_MSG_148;Microcontrast
-!HISTORY_MSG_149;Microcontrast - 3×3 matrix
-!HISTORY_MSG_150;Post-demosaic artifact/noise red.
-!HISTORY_MSG_151;Vibrance
-!HISTORY_MSG_152;Vib - Pastel tones
-!HISTORY_MSG_153;Vib - Saturated tones
-!HISTORY_MSG_154;Vib - Protect skin-tones
-!HISTORY_MSG_156;Vib - Link pastel/saturated
-!HISTORY_MSG_157;Vib - P/S threshold
-!HISTORY_MSG_161;TM - Reweighting iterates
-!HISTORY_MSG_163;RGB Curves - Red
-!HISTORY_MSG_164;RGB Curves - Green
-!HISTORY_MSG_165;RGB Curves - Blue
-!HISTORY_MSG_166;Exposure - Reset
-!HISTORY_MSG_167;Demosaicing method
-!HISTORY_MSG_168;L*a*b* - CC curve
-!HISTORY_MSG_169;L*a*b* - CH curve
-!HISTORY_MSG_170;Vibrance - HH curve
-!HISTORY_MSG_171;L*a*b* - LC curve
-!HISTORY_MSG_172;L*a*b* - Restrict LC
-!HISTORY_MSG_173;NR - Detail recovery
-!HISTORY_MSG_175;CAM02 - CAT02 adaptation
-!HISTORY_MSG_176;CAM02 - Viewing surround
-!HISTORY_MSG_177;CAM02 - Scene luminosity
-!HISTORY_MSG_178;CAM02 - Viewing luminosity
-!HISTORY_MSG_179;CAM02 - White-point model
-!HISTORY_MSG_180;CAM02 - Lightness (J)
-!HISTORY_MSG_181;CAM02 - Chroma (C)
-!HISTORY_MSG_182;CAM02 - Automatic CAT02
-!HISTORY_MSG_184;CAM02 - Scene surround
-!HISTORY_MSG_185;CAM02 - Gamut control
-!HISTORY_MSG_186;CAM02 - Algorithm
-!HISTORY_MSG_187;CAM02 - Red/skin prot.
-!HISTORY_MSG_188;CAM02 - Brightness (Q)
-!HISTORY_MSG_189;CAM02 - Contrast (Q)
-!HISTORY_MSG_190;CAM02 - Saturation (S)
-!HISTORY_MSG_191;CAM02 - Colorfulness (M)
-!HISTORY_MSG_192;CAM02 - Hue (h)
-!HISTORY_MSG_193;CAM02 - Tone curve 1
-!HISTORY_MSG_194;CAM02 - Tone curve 2
-!HISTORY_MSG_195;CAM02 - Tone curve 1
-!HISTORY_MSG_196;CAM02 - Tone curve 2
-!HISTORY_MSG_197;CAM02 - Color curve
-!HISTORY_MSG_198;CAM02 - Color curve
-!HISTORY_MSG_199;CAM02 - Output histograms
-!HISTORY_MSG_200;CAM02 - Tone mapping
-!HISTORY_MSG_201;NR - Chrominance - R&G
-!HISTORY_MSG_202;NR - Chrominance - B&Y
-!HISTORY_MSG_203;NR - Color space
-!HISTORY_MSG_204;LMMSE enhancement steps
-!HISTORY_MSG_205;CAM02 - Hot/bad pixel filter
-!HISTORY_MSG_206;CAT02 - Auto scene luminosity
-!HISTORY_MSG_207;Defringe - Hue curve
-!HISTORY_MSG_208;WB - B/R equalizer
-!HISTORY_MSG_214;Black-and-White
-!HISTORY_MSG_215;B&W - CM - Red
-!HISTORY_MSG_216;B&W - CM - Green
-!HISTORY_MSG_217;B&W - CM - Blue
-!HISTORY_MSG_218;B&W - Gamma - Red
-!HISTORY_MSG_219;B&W - Gamma - Green
-!HISTORY_MSG_220;B&W - Gamma - Blue
-!HISTORY_MSG_221;B&W - Color filter
-!HISTORY_MSG_222;B&W - Presets
-!HISTORY_MSG_223;B&W - CM - Orange
-!HISTORY_MSG_224;B&W - CM - Yellow
-!HISTORY_MSG_225;B&W - CM - Cyan
-!HISTORY_MSG_226;B&W - CM - Magenta
-!HISTORY_MSG_227;B&W - CM - Purple
-!HISTORY_MSG_228;B&W - Luminance equalizer
-!HISTORY_MSG_229;B&W - Luminance equalizer
-!HISTORY_MSG_230;B&W - Mode
-!HISTORY_MSG_231;B&W - 'Before' curve
-!HISTORY_MSG_232;B&W - 'Before' curve type
-!HISTORY_MSG_233;B&W - 'After' curve
-!HISTORY_MSG_234;B&W - 'After' curve type
-!HISTORY_MSG_235;B&W - CM - Auto
-!HISTORY_MSG_236;--unused--
-!HISTORY_MSG_237;B&W - CM
-!HISTORY_MSG_238;GF - Feather
-!HISTORY_MSG_240;GF - Center
-!HISTORY_MSG_241;VF - Feather
-!HISTORY_MSG_242;VF - Roundness
-!HISTORY_MSG_243;VC - Radius
-!HISTORY_MSG_246;L*a*b* - CL curve
-!HISTORY_MSG_247;L*a*b* - LH curve
-!HISTORY_MSG_248;L*a*b* - HH curve
-!HISTORY_MSG_249;CbDL - Threshold
-!HISTORY_MSG_250;NR - Enhanced
-!HISTORY_MSG_251;B&W - Algorithm
-!HISTORY_MSG_252;CbDL - Skin tar/prot
-!HISTORY_MSG_253;CbDL - Reduce artifacts
-!HISTORY_MSG_254;CbDL - Skin hue
-!HISTORY_MSG_255;NR - Median filter
-!HISTORY_MSG_256;NR - Median - Type
-!HISTORY_MSG_257;Color Toning
-!HISTORY_MSG_258;CT - Color curve
-!HISTORY_MSG_259;CT - Opacity curve
-!HISTORY_MSG_260;CT - a*[b*] opacity
-!HISTORY_MSG_261;CT - Method
-!HISTORY_MSG_262;CT - b* opacity
-!HISTORY_MSG_263;CT - Shadows - Red
-!HISTORY_MSG_264;CT - Shadows - Green
-!HISTORY_MSG_265;CT - Shadows - Blue
-!HISTORY_MSG_266;CT - Mid - Red
-!HISTORY_MSG_267;CT - Mid - Green
-!HISTORY_MSG_268;CT - Mid - Blue
-!HISTORY_MSG_269;CT - High - Red
-!HISTORY_MSG_270;CT - High - Green
-!HISTORY_MSG_271;CT - High - Blue
-!HISTORY_MSG_272;CT - Balance
-!HISTORY_MSG_273;CT - Color Balance SMH
-!HISTORY_MSG_274;CT - Sat. Shadows
-!HISTORY_MSG_275;CT - Sat. Highlights
-!HISTORY_MSG_276;CT - Opacity
-!HISTORY_MSG_277;--unused--
-!HISTORY_MSG_278;CT - Preserve luminance
-!HISTORY_MSG_279;CT - Shadows
-!HISTORY_MSG_280;CT - Highlights
-!HISTORY_MSG_281;CT - Sat. strength
-!HISTORY_MSG_282;CT - Sat. threshold
-!HISTORY_MSG_283;CT - Strength
-!HISTORY_MSG_284;CT - Auto sat. protection
-!HISTORY_MSG_285;NR - Median - Method
-!HISTORY_MSG_286;NR - Median - Type
-!HISTORY_MSG_287;NR - Median - Iterations
-!HISTORY_MSG_288;Flat-Field - Clip control
-!HISTORY_MSG_289;Flat-Field - Clip control - Auto
-!HISTORY_MSG_290;Black Level - Red
-!HISTORY_MSG_291;Black Level - Green
-!HISTORY_MSG_292;Black Level - Blue
-!HISTORY_MSG_293;Film Simulation
-!HISTORY_MSG_294;Film Simulation - Strength
-!HISTORY_MSG_295;Film Simulation - Film
-!HISTORY_MSG_296;NR - Luminance curve
-!HISTORY_MSG_297;NR - Mode
-!HISTORY_MSG_298;Dead pixel filter
-!HISTORY_MSG_299;NR - Chrominance curve
-!HISTORY_MSG_300;-
-!HISTORY_MSG_301;NR - Luma control
-!HISTORY_MSG_302;NR - Chroma method
-!HISTORY_MSG_303;NR - Chroma method
-!HISTORY_MSG_304;W - Contrast levels
-!HISTORY_MSG_305;Wavelet Levels
-!HISTORY_MSG_306;W - Process
-!HISTORY_MSG_307;W - Process
-!HISTORY_MSG_308;W - Process direction
-!HISTORY_MSG_309;W - ES - Detail
-!HISTORY_MSG_310;W - Residual - Sky tar/prot
-!HISTORY_MSG_311;W - Wavelet levels
-!HISTORY_MSG_312;W - Residual - Shadows threshold
-!HISTORY_MSG_313;W - Chroma - Sat/past
-!HISTORY_MSG_314;W - Gamut - Reduce artifacts
-!HISTORY_MSG_315;W - Residual - Contrast
-!HISTORY_MSG_316;W - Gamut - Skin tar/prot
-!HISTORY_MSG_317;W - Gamut - Skin hue
-!HISTORY_MSG_318;W - Contrast - Highlight levels
-!HISTORY_MSG_319;W - Contrast - Highlight range
-!HISTORY_MSG_320;W - Contrast - Shadow range
-!HISTORY_MSG_321;W - Contrast - Shadow levels
-!HISTORY_MSG_322;W - Gamut - Avoid color shift
-!HISTORY_MSG_323;W - ES - Local contrast
-!HISTORY_MSG_324;W - Chroma - Pastel
-!HISTORY_MSG_325;W - Chroma - Saturated
-!HISTORY_MSG_326;W - Chroma - Method
-!HISTORY_MSG_327;W - Contrast - Apply to
-!HISTORY_MSG_328;W - Chroma - Link strength
-!HISTORY_MSG_329;W - Toning - Opacity RG
-!HISTORY_MSG_330;W - Toning - Opacity BY
-!HISTORY_MSG_331;W - Contrast levels - Extra
-!HISTORY_MSG_332;W - Tiling method
-!HISTORY_MSG_333;W - Residual - Shadows
-!HISTORY_MSG_334;W - Residual - Chroma
-!HISTORY_MSG_335;W - Residual - Highlights
-!HISTORY_MSG_336;W - Residual - Highlights threshold
-!HISTORY_MSG_337;W - Residual - Sky hue
-!HISTORY_MSG_338;W - ES - Radius
-!HISTORY_MSG_339;W - ES - Strength
-!HISTORY_MSG_340;W - Strength
-!HISTORY_MSG_341;W - Edge performance
-!HISTORY_MSG_342;W - ES - First level
-!HISTORY_MSG_343;W - Chroma levels
-!HISTORY_MSG_344;W - Meth chroma sl/cur
-!HISTORY_MSG_345;W - ES - Local contrast
-!HISTORY_MSG_346;W - ES - Local contrast method
-!HISTORY_MSG_347;W - Denoise - Level 1
-!HISTORY_MSG_348;W - Denoise - Level 2
-!HISTORY_MSG_349;W - Denoise - Level 3
-!HISTORY_MSG_350;W - ES - Edge detection
-!HISTORY_MSG_351;W - Residual - HH curve
-!HISTORY_MSG_352;W - Background
-!HISTORY_MSG_353;W - ES - Gradient sensitivity
-!HISTORY_MSG_354;W - ES - Enhanced
-!HISTORY_MSG_355;W - ES - Threshold low
-!HISTORY_MSG_356;W - ES - Threshold high
-!HISTORY_MSG_357;W - Denoise - Link with ES
-!HISTORY_MSG_358;W - Gamut - CH
-!HISTORY_MSG_359;Hot/Dead - Threshold
-!HISTORY_MSG_360;TM - Gamma
-!HISTORY_MSG_361;W - Final - Chroma balance
-!HISTORY_MSG_362;W - Residual - Compression method
-!HISTORY_MSG_363;W - Residual - Compression strength
-!HISTORY_MSG_364;W - Final - Contrast balance
-!HISTORY_MSG_365;W - Final - Delta balance
-!HISTORY_MSG_366;W - Residual - Compression gamma
-!HISTORY_MSG_367;W - Final - 'After' contrast curve
-!HISTORY_MSG_368;W - Final - Contrast balance
-!HISTORY_MSG_369;W - Final - Balance method
-!HISTORY_MSG_370;W - Final - Local contrast curve
-!HISTORY_MSG_371;Post-Resize Sharpening
-!HISTORY_MSG_372;PRS USM - Radius
-!HISTORY_MSG_373;PRS USM - Amount
-!HISTORY_MSG_374;PRS USM - Threshold
-!HISTORY_MSG_375;PRS USM - Sharpen only edges
-!HISTORY_MSG_376;PRS USM - Edge detection radius
-!HISTORY_MSG_377;PRS USM - Edge tolerance
-!HISTORY_MSG_378;PRS USM - Halo control
-!HISTORY_MSG_379;PRS USM - Halo control amount
-!HISTORY_MSG_380;PRS - Method
-!HISTORY_MSG_381;PRS RLD - Radius
-!HISTORY_MSG_382;PRS RLD - Amount
-!HISTORY_MSG_383;PRS RLD - Damping
-!HISTORY_MSG_384;PRS RLD - Iterations
-!HISTORY_MSG_385;W - Residual - Color Balance
-!HISTORY_MSG_386;W - Residual - CB green high
-!HISTORY_MSG_387;W - Residual - CB blue high
-!HISTORY_MSG_388;W - Residual - CB green mid
-!HISTORY_MSG_389;W - Residual - CB blue mid
-!HISTORY_MSG_390;W - Residual - CB green low
-!HISTORY_MSG_391;W - Residual - CB blue low
-!HISTORY_MSG_392;W - Residual - Color Balance
-!HISTORY_MSG_393;DCP - Look table
-!HISTORY_MSG_394;DCP - Baseline exposure
-!HISTORY_MSG_395;DCP - Base table
-!HISTORY_MSG_396;W - Contrast sub-tool
-!HISTORY_MSG_397;W - Chroma sub-tool
-!HISTORY_MSG_398;W - ES sub-tool
-!HISTORY_MSG_399;W - Residual sub-tool
-!HISTORY_MSG_400;W - Final sub-tool
-!HISTORY_MSG_401;W - Toning sub-tool
-!HISTORY_MSG_402;W - Denoise sub-tool
-!HISTORY_MSG_403;W - ES - Edge sensitivity
-!HISTORY_MSG_404;W - ES - Base amplification
-!HISTORY_MSG_405;W - Denoise - Level 4
-!HISTORY_MSG_406;W - ES - Neighboring pixels
-!HISTORY_MSG_407;Retinex - Method
-!HISTORY_MSG_408;Retinex - Radius
-!HISTORY_MSG_409;Retinex - Contrast
-!HISTORY_MSG_410;Retinex - Offset
-!HISTORY_MSG_411;Retinex - Strength
-!HISTORY_MSG_412;Retinex - Gaussian gradient
-!HISTORY_MSG_413;Retinex - Contrast
-!HISTORY_MSG_414;Retinex - Histogram - Lab
-!HISTORY_MSG_415;Retinex - Transmission
-!HISTORY_MSG_416;Retinex
-!HISTORY_MSG_417;Retinex - Transmission median
-!HISTORY_MSG_418;Retinex - Threshold
-!HISTORY_MSG_419;Retinex - Color space
-!HISTORY_MSG_420;Retinex - Histogram - HSL
-!HISTORY_MSG_421;Retinex - Gamma
-!HISTORY_MSG_422;Retinex - Gamma
-!HISTORY_MSG_423;Retinex - Gamma slope
-!HISTORY_MSG_424;Retinex - HL threshold
-!HISTORY_MSG_425;Retinex - Log base
-!HISTORY_MSG_426;Retinex - Hue equalizer
-!HISTORY_MSG_427;Output rendering intent
-!HISTORY_MSG_428;Monitor rendering intent
-!HISTORY_MSG_429;Retinex - Iterations
-!HISTORY_MSG_430;Retinex - Transmission gradient
-!HISTORY_MSG_431;Retinex - Strength gradient
-!HISTORY_MSG_432;Retinex - M - Highlights
-!HISTORY_MSG_433;Retinex - M - Highlights TW
-!HISTORY_MSG_434;Retinex - M - Shadows
-!HISTORY_MSG_435;Retinex - M - Shadows TW
-!HISTORY_MSG_436;Retinex - M - Radius
-!HISTORY_MSG_437;Retinex - M - Method
-!HISTORY_MSG_438;Retinex - M - Equalizer
-!HISTORY_MSG_439;Retinex - Process
-!HISTORY_MSG_440;CbDL - Method
-!HISTORY_MSG_441;Retinex - Gain transmission
-!HISTORY_MSG_442;Retinex - Scale
-!HISTORY_MSG_443;Output black point compensation
-!HISTORY_MSG_444;WB - Temp bias
-!HISTORY_MSG_445;Raw sub-image
-!HISTORY_MSG_449;PS - ISO adaption
-!HISTORY_MSG_452;PS - Show motion
-!HISTORY_MSG_453;PS - Show mask only
-!HISTORY_MSG_457;PS - Check red/blue
-!HISTORY_MSG_462;PS - Check green
-!HISTORY_MSG_464;PS - Blur motion mask
-!HISTORY_MSG_465;PS - Blur radius
-!HISTORY_MSG_468;PS - Fill holes
-!HISTORY_MSG_469;PS - Median
-!HISTORY_MSG_471;PS - Motion correction
-!HISTORY_MSG_472;PS - Smooth transitions
-!HISTORY_MSG_473;PS - Use LMMSE
-!HISTORY_MSG_474;PS - Equalize
-!HISTORY_MSG_475;PS - Equalize channel
-!HISTORY_MSG_476;CAM02 - Temp out
-!HISTORY_MSG_477;CAM02 - Green out
-!HISTORY_MSG_478;CAM02 - Yb out
-!HISTORY_MSG_479;CAM02 - CAT02 adaptation out
-!HISTORY_MSG_480;CAM02 - Automatic CAT02 out
-!HISTORY_MSG_481;CAM02 - Temp scene
-!HISTORY_MSG_482;CAM02 - Green scene
-!HISTORY_MSG_483;CAM02 - Yb scene
-!HISTORY_MSG_484;CAM02 - Auto Yb scene
-!HISTORY_MSG_485;Lens Correction
-!HISTORY_MSG_486;Lens Correction - Camera
-!HISTORY_MSG_487;Lens Correction - Lens
-!HISTORY_MSG_488;Dynamic Range Compression
-!HISTORY_MSG_489;DRC - Detail
-!HISTORY_MSG_490;DRC - Amount
-!HISTORY_MSG_491;White Balance
-!HISTORY_MSG_492;RGB Curves
-!HISTORY_MSG_493;L*a*b* Adjustments
-!HISTORY_MSG_494;Capture Sharpening
-!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors
-!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction
-!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction
-!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel
-!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask
-!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask
-!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness
-!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask
-!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List
-!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur
-!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset
-!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power
-!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation
-!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask
-!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope
-!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth
-!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal
-!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only
-!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map
-!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength
-!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
-!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold
-!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
-!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
-!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve
-!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries
-!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D
-!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type
-!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma
-!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope
-!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method
-!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount
-!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness
-!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast
-!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness
-!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius
-!HISTORY_MSG_METADATA_MODE;Metadata copy mode
-!HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold
-!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold
-!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius
-!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations
-!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold
-!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations
-!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius
-!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost
-!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion
-!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction
-!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
-!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold
-!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations
-!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift
-!HISTORY_MSG_RAW_BORDER;Raw border
-!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling
-!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius
-!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold
-!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace
-!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light
-!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength
-!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor
-!HISTORY_MSG_TRANS_Method;Geometry - Method
-!ICCPROFCREATOR_COPYRIGHT;Copyright:
-!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0"
-!ICCPROFCREATOR_CUSTOM;Custom
-!ICCPROFCREATOR_DESCRIPTION;Description:
-!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description
-!ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description.
-!ICCPROFCREATOR_GAMMA;Gamma
-!ICCPROFCREATOR_ICCVERSION;ICC version:
-!ICCPROFCREATOR_ILL;Illuminant:
-!ICCPROFCREATOR_ILL_41;D41
-!ICCPROFCREATOR_ILL_50;D50
-!ICCPROFCREATOR_ILL_55;D55
-!ICCPROFCREATOR_ILL_60;D60
-!ICCPROFCREATOR_ILL_65;D65
-!ICCPROFCREATOR_ILL_80;D80
-!ICCPROFCREATOR_ILL_DEF;Default
-!ICCPROFCREATOR_ILL_INC;StdA 2856K
-!ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles.
-!ICCPROFCREATOR_PRIMARIES;Primaries:
-!ICCPROFCREATOR_PRIM_ACESP0;ACES AP0
-!ICCPROFCREATOR_PRIM_ACESP1;ACES AP1
-!ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998)
-!ICCPROFCREATOR_PRIM_BEST;BestRGB
-!ICCPROFCREATOR_PRIM_BETA;BetaRGB
-!ICCPROFCREATOR_PRIM_BLUX;Blue X
-!ICCPROFCREATOR_PRIM_BLUY;Blue Y
-!ICCPROFCREATOR_PRIM_BRUCE;BruceRGB
-!ICCPROFCREATOR_PRIM_GREX;Green X
-!ICCPROFCREATOR_PRIM_GREY;Green Y
-!ICCPROFCREATOR_PRIM_PROPH;Prophoto
-!ICCPROFCREATOR_PRIM_REC2020;Rec2020
-!ICCPROFCREATOR_PRIM_REDX;Red X
-!ICCPROFCREATOR_PRIM_REDY;Red Y
-!ICCPROFCREATOR_PRIM_SRGB;sRGB
-!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles.
-!ICCPROFCREATOR_PRIM_WIDEG;Widegamut
-!ICCPROFCREATOR_PROF_V2;ICC v2
-!ICCPROFCREATOR_PROF_V4;ICC v4
-!ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as...
-!ICCPROFCREATOR_SLOPE;Slope
-!ICCPROFCREATOR_TRC_PRESET;Tone response curve:
-!IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider.
-!IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image.
-!IPTCPANEL_COPYRIGHT;Copyright notice
-!IPTCPANEL_COPYRIGHTHINT;Enter a Notice on the current owner of the Copyright for this image, such as ©2008 Jane Doe.
-!IPTCPANEL_COUNTRYHINT;Enter the name of the country pictured in this image.
-!IPTCPANEL_CREATOR;Creator
-!IPTCPANEL_CREATORHINT;Enter the name of the person that created this image.
-!IPTCPANEL_CREATORJOBTITLE;Creator's job title
-!IPTCPANEL_CREATORJOBTITLEHINT;Enter the Job Title of the person listed in the Creator field.
-!IPTCPANEL_DATECREATEDHINT;Enter the Date the image was taken.
-!IPTCPANEL_DESCRIPTION;Description
-!IPTCPANEL_DESCRIPTIONHINT;Enter a "caption" describing the who, what, and why of what is happening in this image, this might include names of people, and/or their role in the action that is taking place within the image.
-!IPTCPANEL_DESCRIPTIONWRITER;Description writer
-!IPTCPANEL_DESCRIPTIONWRITERHINT;Enter the name of the person involved in writing, editing or correcting the description of the image.
-!IPTCPANEL_HEADLINEHINT;Enter a brief publishable synopsis or summary of the contents of the image.
-!IPTCPANEL_INSTRUCTIONSHINT;Enter information about embargoes, or other restrictions not covered by the Copyright field.
-!IPTCPANEL_KEYWORDSHINT;Enter any number of keywords, terms or phrases used to express the subject matter in the image.
-!IPTCPANEL_PROVINCE;Province or state
-!IPTCPANEL_PROVINCEHINT;Enter the name of the province or state pictured in this image.
-!IPTCPANEL_SOURCEHINT;Enter or edit the name of a person or party who has a role in the content supply chain, such as a person or entity from whom you received this image from.
-!IPTCPANEL_SUPPCATEGORIES;Supplemental categories
-!IPTCPANEL_SUPPCATEGORIESHINT;Further refines the subject of the image.
-!IPTCPANEL_TITLEHINT;Enter a short verbal and human readable name for the image, this may be the file name.
-!IPTCPANEL_TRANSREFERENCE;Job ID
-!IPTCPANEL_TRANSREFERENCEHINT;Enter a number or identifier needed for workflow control or tracking.
-!MAIN_BUTTON_ICCPROFCREATOR;ICC Profile Creator
-!MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4
-!MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3
-!MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out).
-!MAIN_FRAME_PLACES_DEL;Remove
-!MAIN_MSG_IMAGEUNPROCESSED;This command requires all selected images to be queue-processed first.
-!MAIN_MSG_PATHDOESNTEXIST;The path\n\n%1\n\ndoes not exist. Please set a correct path in Preferences.
-!MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in order to use this function!
-!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
-!MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it.
-!MAIN_TAB_ADVANCED;Advanced
-!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a
-!MAIN_TAB_FAVORITES;Favorites
-!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u
-!MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: theme-based\nShortcut: 9
-!MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: black\nShortcut: 9
-!MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: white\nShortcut: 9
-!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9
-!MAIN_TOOLTIP_BEFOREAFTERLOCK;Lock / Unlock the Before view\n\nLock: keep the Before view unchanged.\nUseful to evaluate the cumulative effect of multiple tools.\nAdditionally, comparisons can be made to any state in the History.\n\nUnlock: the Before view will follow the After view one step behind, showing the image before the effect of the currently used tool.
-!MAIN_TOOLTIP_PREVIEWB;Preview the blue channel.\nShortcut: b
-!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the focus mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images.
-!MAIN_TOOLTIP_PREVIEWG;Preview the green channel.\nShortcut: g
-!MAIN_TOOLTIP_PREVIEWL;Preview the luminosity.\nShortcut: v\n\n0.299*R + 0.587*G + 0.114*B
-!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%.
-!MONITOR_PROFILE_SYSTEM;System default
-!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead.
-!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead.
-!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead.
-!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings
-!PARTIALPASTE_DEHAZE;Haze removal
-!PARTIALPASTE_FILMNEGATIVE;Film Negative
-!PARTIALPASTE_LOCALCONTRAST;Local contrast
-!PARTIALPASTE_METADATA;Metadata mode
-!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
-!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift
-!PARTIALPASTE_RAW_BORDER;Raw border
-!PARTIALPASTE_SOFTLIGHT;Soft light
-!PARTIALPASTE_TM_FATTAL;Dynamic range compression
-!PREFERENCES_APPEARANCE;Appearance
-!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font
-!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color
-!PREFERENCES_APPEARANCE_MAINFONT;Main font
-!PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode
-!PREFERENCES_APPEARANCE_THEME;Theme
-!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit
-!PREFERENCES_BEHADDALLHINT;Set all parameters to the Add mode.\nAdjustments of parameters in the batch tool panel will be deltas to the stored values.
-!PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed.
-!PREFERENCES_CACHECLEAR;Clear
-!PREFERENCES_CACHECLEAR_ALL;Clear all cached files:
-!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles:
-!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles:
-!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched.
-!PREFERENCES_CHUNKSIZES;Tiles per thread
-!PREFERENCES_CHUNKSIZE_RAW_AMAZE;AMaZE demosaic
-!PREFERENCES_CHUNKSIZE_RAW_CA;Raw CA correction
-!PREFERENCES_CHUNKSIZE_RAW_RCD;RCD demosaic
-!PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demosaic
-!PREFERENCES_CHUNKSIZE_RGB;RGB processing
-!PREFERENCES_CROP;Crop Editing
-!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop
-!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop
-!PREFERENCES_CROP_GUIDES_FRAME;Frame
-!PREFERENCES_CROP_GUIDES_FULL;Original
-!PREFERENCES_CROP_GUIDES_NONE;None
-!PREFERENCES_CUSTPROFBUILDHINT;Executable (or script) file called when a new initial processing profile should be generated for an image.\n\nThe path of the communication file (*.ini style, a.k.a. "Keyfile") is added as a command line parameter. It contains various parameters required for the scripts and image Exif to allow a rules-based processing profile generation.\n\nWARNING: You are responsible for using double quotes where necessary if you're using paths containing spaces.
-!PREFERENCES_DIRECTORIES;Directories
-!PREFERENCES_EDITORCMDLINE;Custom command line
-!PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser
-!PREFERENCES_PERFORMANCE_MEASURE;Measure
-!PREFERENCES_PERFORMANCE_MEASURE_HINT;Logs processing times in console
-!PREFERENCES_PERFORMANCE_THREADS;Threads
-!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic)
-!PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now
-!PREFERENCES_TAB_PERFORMANCE;Performance
-!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview
-!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show
-!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering
-!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise
-!PROFILEPANEL_COPYPPASTE;Parameters to copy
-!PROFILEPANEL_GLOBALPROFILES;Bundled profiles
-!PROFILEPANEL_LOADPPASTE;Parameters to load
-!PROFILEPANEL_MODE_TIP;Processing profile fill mode.\n\nButton pressed: partial profiles will be converted to full profiles; the missing values will be replaced with hard-coded defaults.\n\nButton released: profiles will be applied as they are, altering only those values which they contain.
-!PROFILEPANEL_PASTEPPASTE;Parameters to paste
-!PROFILEPANEL_PDYNAMIC;Dynamic
-!PROFILEPANEL_PINTERNAL;Neutral
-!PROFILEPANEL_SAVEPPASTE;Parameters to save
-!PROGRESSBAR_DECODING;Decoding...
-!PROGRESSBAR_GREENEQUIL;Green equilibration...
-!PROGRESSBAR_HLREC;Highlight reconstruction...
-!PROGRESSBAR_HOTDEADPIXELFILTER;Hot/dead pixel filter...
-!PROGRESSBAR_LINEDENOISE;Line noise filter...
-!PROGRESSBAR_PROCESSING_PROFILESAVED;Processing profile saved
-!PROGRESSBAR_RAWCACORR;Raw CA correction...
-!PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added
-!PROGRESSDLG_PROFILECHANGEDINBROWSER;Processing profile changed in browser
-!QINFO_FRAMECOUNT;%2 frames
-!QINFO_HDR;HDR / %2 frame(s)
-!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s)
-!QUEUE_AUTOSTART_TOOLTIP;Start processing automatically when a new job arrives.
-!QUEUE_LOCATION_TITLE;Output Location
-!QUEUE_STARTSTOP_TOOLTIP;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s
-!SAMPLEFORMAT_0;Unknown data format
-!SAMPLEFORMAT_1;8-bit unsigned
-!SAMPLEFORMAT_2;16-bit unsigned
-!SAMPLEFORMAT_4;24-bit LogLuv
-!SAMPLEFORMAT_8;32-bit LogLuv
-!SAMPLEFORMAT_16;16-bit floating-point
-!SAMPLEFORMAT_32;24-bit floating-point
-!SAMPLEFORMAT_64;32-bit floating-point
-!SAVEDLG_FILEFORMAT_FLOAT; floating-point
-!SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling.
-!SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders.
-!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled.
-!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set.
-!THRESHOLDSELECTOR_B;Bottom
-!THRESHOLDSELECTOR_BL;Bottom-left
-!THRESHOLDSELECTOR_BR;Bottom-right
-!THRESHOLDSELECTOR_HINT;Hold the Shift key to move individual control points.
-!THRESHOLDSELECTOR_T;Top
-!THRESHOLDSELECTOR_TL;Top-left
-!THRESHOLDSELECTOR_TR;Top-right
-!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker.
-!TP_BWMIX_ALGO;Algorithm OYCPM
-!TP_BWMIX_ALGO_TOOLTIP;Linear: will produce a normal linear response.\nSpecial effects: will produce special effects by mixing channels non-linearly.
-!TP_BWMIX_CC_ENABLED;Adjust complementary color
-!TP_BWMIX_CC_TOOLTIP;Enable to allow automatic adjustment of complementary colors in ROYGCBPM mode.
-!TP_BWMIX_CHANNEL;Luminance equalizer
-!TP_BWMIX_CURVEEDITOR1;'Before' curve
-!TP_BWMIX_CURVEEDITOR2;'After' curve
-!TP_BWMIX_CURVEEDITOR_AFTER_TOOLTIP;Tone curve, after B&W conversion, at the end of treatment.
-!TP_BWMIX_CURVEEDITOR_BEFORE_TOOLTIP;Tone curve, just before B&W conversion.\nMay take into account the color components.
-!TP_BWMIX_CURVEEDITOR_LH_TOOLTIP;Luminance according to hue L=f(H).\nPay attention to extreme values as they may cause artifacts.
-!TP_BWMIX_FILTER_TOOLTIP;The color filter simulates shots taken with a colored filter placed in front of the lens. Colored filters reduce the transmission of specific color ranges and therefore affect their lightness. E.g. a red filter darkens blue skies.
-!TP_BWMIX_MET_CHANMIX;Channel Mixer
-!TP_BWMIX_MIXC;Channel Mixer
-!TP_BWMIX_NEUTRAL;Reset
-!TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%%
-!TP_BWMIX_RGBLABEL_HINT;Final RGB factors that take care of all the mixer options.\n"Total" displays the sum of the RGB values:\n- always 100% in relative mode\n- higher (lighter) or lower (darker) than 100% in absolute mode.
-!TP_BWMIX_RGB_TOOLTIP;Mix the RGB channels. Use presets for guidance.\nPay attention to negative values that may cause artifacts or erratic behavior.
-!TP_BWMIX_SET_HYPERPANCHRO;Hyper Panchromatic
-!TP_BWMIX_SET_NORMCONTAST;Normal Contrast
-!TP_BWMIX_SET_ORTHOCHRO;Orthochromatic
-!TP_BWMIX_SET_RGBABS;Absolute RGB
-!TP_BWMIX_SET_RGBREL;Relative RGB
-!TP_BWMIX_SET_ROYGCBPMABS;Absolute ROYGCBPM
-!TP_BWMIX_SET_ROYGCBPMREL;Relative ROYGCBPM
-!TP_BWMIX_TCMODE_SATANDVALBLENDING;B&W Saturation and Value Blending
-!TP_BWMIX_TCMODE_WEIGHTEDSTD;B&W Weighted Standard
-!TP_CBDL_AFT;After Black-and-White
-!TP_CBDL_BEF;Before Black-and-White
-!TP_CBDL_METHOD;Process located
-!TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space.
-!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance
-!TP_COLORAPP_ALGO;Algorithm
-!TP_COLORAPP_ALGO_ALL;All
-!TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC)
-!TP_COLORAPP_ALGO_JS;Lightness + Saturation (JS)
-!TP_COLORAPP_ALGO_QM;Brightness + Colorfulness (QM)
-!TP_COLORAPP_ALGO_TOOLTIP;Lets you choose between parameter subsets or all parameters.
-!TP_COLORAPP_BADPIXSL;Hot/bad pixel filter
-!TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression of hot/bad (brightly colored) pixels.\n0 = No effect\n1 = Median\n2 = Gaussian.\nAlternatively, adjust the image to avoid very dark shadows.\n\nThese artifacts are due to limitations of CIECAM02.
-!TP_COLORAPP_BRIGHT;Brightness (Q)
-!TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 takes into account the white's luminosity and differs from L*a*b* and RGB brightness.
-!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended.
-!TP_COLORAPP_CHROMA;Chroma (C)
-!TP_COLORAPP_CHROMA_M;Colorfulness (M)
-!TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 differs from L*a*b* and RGB colorfulness.
-!TP_COLORAPP_CHROMA_S;Saturation (S)
-!TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 differs from L*a*b* and RGB saturation.
-!TP_COLORAPP_CHROMA_TOOLTIP;Chroma in CIECAM02 differs from L*a*b* and RGB chroma.
-!TP_COLORAPP_CIECAT_DEGREE;CAT02 adaptation
-!TP_COLORAPP_CONTRAST;Contrast (J)
-!TP_COLORAPP_CONTRAST_Q;Contrast (Q)
-!TP_COLORAPP_CONTRAST_Q_TOOLTIP;Differs from L*a*b* and RGB contrast.
-!TP_COLORAPP_CONTRAST_TOOLTIP;Differs from L*a*b* and RGB contrast.
-!TP_COLORAPP_CURVEEDITOR1;Tone curve 1
-!TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Shows the histogram of L* (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of J or Q after CIECAM02.\n\nJ and Q are not shown in the main histogram panel.\n\nFor final output refer to the main histogram panel.
-!TP_COLORAPP_CURVEEDITOR2;Tone curve 2
-!TP_COLORAPP_CURVEEDITOR2_TOOLTIP;Same usage as with the second exposure tone curve.
-!TP_COLORAPP_CURVEEDITOR3;Color curve
-!TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel.
-!TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves
-!TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments.
-!TP_COLORAPP_FREE;Free temp+green + CAT02 + [output]
-!TP_COLORAPP_GAMUT;Gamut control (L*a*b*)
-!TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode.
-!TP_COLORAPP_HUE;Hue (h)
-!TP_COLORAPP_HUE_TOOLTIP;Hue (h) - angle between 0° and 360°.
-!TP_COLORAPP_LABEL;CIE Color Appearance Model 2002
-!TP_COLORAPP_LABEL_SCENE;Scene Conditions
-!TP_COLORAPP_LABEL_VIEWING;Viewing Conditions
-!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%)
-!TP_COLORAPP_MODEL;WP Model
-!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected by the user, the output device's white balance is set in Viewing Conditions.
-!TP_COLORAPP_NEUTRAL;Reset
-!TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values
-!TP_COLORAPP_RSTPRO;Red & skin-tones protection
-!TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves.
-!TP_COLORAPP_SURROUND;Surround
-!TP_COLORAPP_SURROUND_EXDARK;Extremly Dark (Cutsheet)
-!TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slightly dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark.
-!TP_COLORAPP_TCMODE_CHROMA;Chroma
-!TP_COLORAPP_TCMODE_COLORF;Colorfulness
-!TP_COLORAPP_TCMODE_LABEL1;Curve mode 1
-!TP_COLORAPP_TCMODE_LABEL2;Curve mode 2
-!TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode
-!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504
-!TP_COLORAPP_TONECIE;Tone mapping using CIECAM02
-!TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect.
-!TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16 cd/m²).
-!TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output]
-!TP_COLORAPP_WBRT;WB [RT] + [output]
-!TP_COLORTONING_AB;o C/L
-!TP_COLORTONING_AUTOSAT;Automatic
-!TP_COLORTONING_BALANCE;Balance
-!TP_COLORTONING_BY;o C/L
-!TP_COLORTONING_CHROMAC;Opacity
-!TP_COLORTONING_COLOR;Color
-!TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP;Chroma opacity as a function of luminance oC=f(L)
-!TP_COLORTONING_HIGHLIGHT;Highlights
-!TP_COLORTONING_HUE;Hue
-!TP_COLORTONING_LAB;L*a*b* blending
-!TP_COLORTONING_LABEL;Color Toning
-!TP_COLORTONING_LABGRID;L*a*b* color correction grid
-!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4
-!TP_COLORTONING_LABREGIONS;Color correction regions
-!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2
-!TP_COLORTONING_LABREGION_CHANNEL;Channel
-!TP_COLORTONING_LABREGION_CHANNEL_ALL;All
-!TP_COLORTONING_LABREGION_CHANNEL_B;Blue
-!TP_COLORTONING_LABREGION_CHANNEL_G;Green
-!TP_COLORTONING_LABREGION_CHANNEL_R;Red
-!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C
-!TP_COLORTONING_LABREGION_HUEMASK;H
-!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness
-!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L
-!TP_COLORTONING_LABREGION_LIST_TITLE;Correction
-!TP_COLORTONING_LABREGION_MASK;Mask
-!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur
-!TP_COLORTONING_LABREGION_OFFSET;Offset
-!TP_COLORTONING_LABREGION_POWER;Power
-!TP_COLORTONING_LABREGION_SATURATION;Saturation
-!TP_COLORTONING_LABREGION_SHOWMASK;Show mask
-!TP_COLORTONING_LABREGION_SLOPE;Slope
-!TP_COLORTONING_LUMA;Luminance
-!TP_COLORTONING_LUMAMODE;Preserve luminance
-!TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved.
-!TP_COLORTONING_METHOD;Method
-!TP_COLORTONING_METHOD_TOOLTIP;"L*a*b* blending", "RGB sliders" and "RGB curves" use interpolated color blending.\n"Color balance (Shadows/Midtones/Highlights)" and "Saturation 2 colors" use direct colors.\n\nThe Black-and-White tool can be enabled when using any color toning method, which allows for color toning.
-!TP_COLORTONING_MIDTONES;Midtones
-!TP_COLORTONING_NEUTRAL;Reset sliders
-!TP_COLORTONING_NEUTRAL_TIP;Reset all values (Shadows, Midtones, Highlights) to default.
-!TP_COLORTONING_OPACITY;Opacity
-!TP_COLORTONING_RGBCURVES;RGB - Curves
-!TP_COLORTONING_RGBSLIDERS;RGB - Sliders
-!TP_COLORTONING_SA;Saturation Protection
-!TP_COLORTONING_SATURATEDOPACITY;Strength
-!TP_COLORTONING_SATURATIONTHRESHOLD;Threshold
-!TP_COLORTONING_SHADOWS;Shadows
-!TP_COLORTONING_SPLITCO;Shadows/Midtones/Highlights
-!TP_COLORTONING_SPLITCOCO;Color Balance Shadows/Midtones/Highlights
-!TP_COLORTONING_SPLITLR;Saturation 2 colors
-!TP_COLORTONING_STR;Strength
-!TP_COLORTONING_STRENGTH;Strength
-!TP_COLORTONING_TWO2;Special chroma '2 colors'
-!TP_COLORTONING_TWOALL;Special chroma
-!TP_COLORTONING_TWOBY;Special a* and b*
-!TP_COLORTONING_TWOCOLOR_TOOLTIP;Standard chroma:\nLinear response, a* = b*.\n\nSpecial chroma:\nLinear response, a* = b*, but unbound - try under the diagonal.\n\nSpecial a* and b*:\nLinear response unbound with separate curves for a* and b*. Intended for special effects.\n\nSpecial chroma 2 colors:\nMore predictable.
-!TP_COLORTONING_TWOSTD;Standard chroma
-!TP_CROP_PPI;PPI
-!TP_CROP_RESETCROP;Reset
-!TP_CROP_SELECTCROP;Select
-!TP_DEFRINGE_THRESHOLD;Threshold
-!TP_DEHAZE_DEPTH;Depth
-!TP_DEHAZE_LABEL;Haze Removal
-!TP_DEHAZE_LUMINANCE;Luminance only
-!TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map
-!TP_DEHAZE_STRENGTH;Strength
-!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones
-!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global
-!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow
-!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve
-!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation.
-!TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance
-!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual
-!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master
-!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method
-!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
-!TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
-!TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones
-!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview
-!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance.
-!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3
-!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2
-!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= -
-!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3
-!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green
-!TP_DIRPYRDENOISE_LABEL;Noise Reduction
-!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control
-!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve
-!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance
-!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space
-!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b*
-!TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection.
-!TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma
-!TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones.
-!TP_DIRPYRDENOISE_MAIN_MODE;Mode
-!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive
-!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative
-!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them.
-!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method
-!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only
-!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b*
-!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter
-!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only
-!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB
-!TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline.
-!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal)
-!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations
-!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size.
-!TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type
-!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one.
-!TP_DIRPYRDENOISE_TYPE_3X3;3×3
-!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft
-!TP_DIRPYRDENOISE_TYPE_5X5;5×5
-!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft
-!TP_DIRPYRDENOISE_TYPE_7X7;7×7
-!TP_DIRPYRDENOISE_TYPE_9X9;9×9
-!TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts.
-!TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;This pyramid is for the upper part, so far as the algorithm at its maximum efficiency.\nTo the lower part, the transition zones.\nIf you need to move the area significantly to the left or right - or if there are artifacts: the white balance is incorrect\nYou can slightly reduce the zone to prevent the rest of the image is affected.
-!TP_DIRPYREQUALIZER_SKIN_TOOLTIP;At -100 skin-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 skin-tones are protected while all other tones are affected.
-!TP_DIRPYREQUALIZER_TOOLTIP;Attempts to reduce artifacts in the transitions between skin colors (hue, chroma, luma) and the rest of the image.
-!TP_DISTORTION_AUTO_TIP;Automatically corrects lens distortion in raw files by matching it against the embedded JPEG image if one exists and has had its lens disortion auto-corrected by the camera.
-!TP_EPD_EDGESTOPPING;Edge stopping
-!TP_EPD_GAMMA;Gamma
-!TP_EPD_REWEIGHTINGITERATES;Reweighting iterates
-!TP_EXPOSURE_AUTOLEVELS_TIP;Toggles execution of Auto Levels to automatically set Exposure slider values based on an image analysis.\nEnables Highlight Reconstruction if necessary.
-!TP_EXPOSURE_CLAMPOOG;Clip out-of-gamut colors
-!TP_EXPOSURE_CLIP_TIP;The fraction of pixels to be clipped in Auto Levels operation.
-!TP_EXPOSURE_HISTMATCHING;Auto-Matched Tone Curve
-!TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatically adjust sliders and curves (except exposure compensation) to match the look of the embedded JPEG thumbnail.
-!TP_EXPOSURE_TCMODE_LUMINANCE;Luminance
-!TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual
-!TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points
-!TP_EXPOS_WHITEPOINT_LABEL;Raw White Points
-!TP_FILMNEGATIVE_BLUE;Blue ratio
-!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
-!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards.
-!TP_FILMNEGATIVE_LABEL;Film Negative
-!TP_FILMNEGATIVE_PICK;Pick neutral spots
-!TP_FILMNEGATIVE_RED;Red ratio
-!TP_FILMSIMULATION_LABEL;Film Simulation
-!TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now?
-!TP_FILMSIMULATION_STRENGTH;Strength
-!TP_FILMSIMULATION_ZEROCLUTSFOUND;Set HaldCLUT directory in Preferences
-!TP_FLATFIELD_CLIPCONTROL;Clip control
-!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, value 0 is used.
-!TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1.
-!TP_GRADIENT_CENTER_X_TOOLTIP;Shift gradient to the left (negative values) or right (positive values).
-!TP_GRADIENT_CENTER_Y_TOOLTIP;Shift gradient up (negative values) or down (positive values).
-!TP_GRADIENT_STRENGTH_TOOLTIP;Filter strength in stops.
-!TP_HLREC_ENA_TOOLTIP;Could be activated by Auto Levels.
-!TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Baseline exposure
-!TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Employ the embedded DCP baseline exposure offset. The setting is only available if the selected DCP has one.
-!TP_ICM_APPLYHUESATMAP;Base table
-!TP_ICM_APPLYHUESATMAP_TOOLTIP;Employ the embedded DCP base table (HueSatMap). The setting is only available if the selected DCP has one.
-!TP_ICM_APPLYLOOKTABLE;Look table
-!TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is only available if the selected DCP has one.
-!TP_ICM_BPC;Black Point Compensation
-!TP_ICM_DCPILLUMINANT;Illuminant
-!TP_ICM_DCPILLUMINANT_INTERPOLATED;Interpolated
-!TP_ICM_DCPILLUMINANT_TOOLTIP;Select which embedded DCP illuminant to employ. Default is "interpolated" which is a mix between the two based on white balance. The setting is only available if a dual-illuminant DCP with interpolation support is selected.
-!TP_ICM_INPUTCAMERAICC;Auto-matched camera profile
-!TP_ICM_INPUTCAMERAICC_TOOLTIP;Use RawTherapee's camera-specific DCP or ICC input color profiles. These profiles are more precise than simpler matrix ones. They are not available for all cameras. These profiles are stored in the /iccprofiles/input and /dcpprofiles folders and are automatically retrieved based on a file name matching to the exact model name of the camera.
-!TP_ICM_INPUTCAMERA_TOOLTIP;Use a simple color matrix from dcraw, an enhanced RawTherapee version (whichever is available based on camera model) or one embedded in the DNG.
-!TP_ICM_INPUTNONE_TOOLTIP;Use no input color profile at all.\nUse only in special cases.
-!TP_ICM_PROFILEINTENT;Rendering Intent
-!TP_ICM_SAVEREFERENCE;Save Reference Image
-!TP_ICM_SAVEREFERENCE_APPLYWB;Apply white balance
-!TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;Generally, apply the white balance when saving images to create ICC profiles, and do not apply the white balance to create DCP profiles.
-!TP_ICM_SAVEREFERENCE_TOOLTIP;Save the linear TIFF image before the input profile is applied. The result can be used for calibration purposes and generation of a camera profile.
-!TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only available if the selected DCP has a tone curve.
-!TP_ICM_WORKING_TRC;Tone response curve:
-!TP_ICM_WORKING_TRC_CUSTOM;Custom
-!TP_ICM_WORKING_TRC_GAMMA;Gamma
-!TP_ICM_WORKING_TRC_NONE;None
-!TP_ICM_WORKING_TRC_SLOPE;Slope
-!TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles.
-!TP_LABCURVE_CHROMA_TOOLTIP;To apply B&W toning, set Chromaticity to -100.
-!TP_LABCURVE_CURVEEDITOR_A_RANGE1;Green Saturated
-!TP_LABCURVE_CURVEEDITOR_A_RANGE2;Green Pastel
-!TP_LABCURVE_CURVEEDITOR_A_RANGE3;Red Pastel
-!TP_LABCURVE_CURVEEDITOR_A_RANGE4;Red Saturated
-!TP_LABCURVE_CURVEEDITOR_B_RANGE1;Blue Saturated
-!TP_LABCURVE_CURVEEDITOR_B_RANGE2;Blue Pastel
-!TP_LABCURVE_CURVEEDITOR_B_RANGE3;Yellow Pastel
-!TP_LABCURVE_CURVEEDITOR_B_RANGE4;Yellow Saturated
-!TP_LABCURVE_CURVEEDITOR_CC;CC
-!TP_LABCURVE_CURVEEDITOR_CC_RANGE1;Neutral
-!TP_LABCURVE_CURVEEDITOR_CC_RANGE2;Dull
-!TP_LABCURVE_CURVEEDITOR_CC_RANGE3;Pastel
-!TP_LABCURVE_CURVEEDITOR_CC_RANGE4;Saturated
-!TP_LABCURVE_CURVEEDITOR_CC_TOOLTIP;Chromaticity according to chromaticity C=f(C)
-!TP_LABCURVE_CURVEEDITOR_CH;CH
-!TP_LABCURVE_CURVEEDITOR_CH_TOOLTIP;Chromaticity according to hue C=f(H)
-!TP_LABCURVE_CURVEEDITOR_CL;CL
-!TP_LABCURVE_CURVEEDITOR_CL_TOOLTIP;Chromaticity according to luminance C=f(L)
-!TP_LABCURVE_CURVEEDITOR_HH;HH
-!TP_LABCURVE_CURVEEDITOR_HH_TOOLTIP;Hue according to hue H=f(H)
-!TP_LABCURVE_CURVEEDITOR_LC;LC
-!TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP;Luminance according to chromaticity L=f(C)
-!TP_LABCURVE_CURVEEDITOR_LH;LH
-!TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminance according to hue L=f(H)
-!TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminance according to luminance L=f(L)
-!TP_LABCURVE_LCREDSK;Restrict LC to red and skin-tones
-!TP_LABCURVE_LCREDSK_TIP;If enabled, the LC Curve affects only red and skin-tones.\nIf disabled, it applies to all tones.
-!TP_LABCURVE_RSTPROTECTION;Red and skin-tones protection
-!TP_LABCURVE_RSTPRO_TOOLTIP;Works on the Chromaticity slider and the CC curve.
-!TP_LENSGEOM_LIN;Linear
-!TP_LENSGEOM_LOG;Logarithmic
-!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected
-!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file
-!TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected
-!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong.
-!TP_LENSPROFILE_MODE_HEADER;Lens Profile
-!TP_LENSPROFILE_USE_CA;Chromatic aberration
-!TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion
-!TP_LENSPROFILE_USE_HEADER;Correct
-!TP_LENSPROFILE_USE_VIGNETTING;Vignetting
-!TP_LOCALCONTRAST_AMOUNT;Amount
-!TP_LOCALCONTRAST_DARKNESS;Darkness level
-!TP_LOCALCONTRAST_LABEL;Local Contrast
-!TP_LOCALCONTRAST_LIGHTNESS;Lightness level
-!TP_LOCALCONTRAST_RADIUS;Radius
-!TP_METADATA_EDIT;Apply modifications
-!TP_METADATA_MODE;Metadata copy mode
-!TP_METADATA_STRIP;Strip all metadata
-!TP_METADATA_TUNNEL;Copy unchanged
-!TP_NEUTRAL;Reset
-!TP_NEUTRAL_TIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not.
-!TP_PCVIGNETTE_FEATHER_TOOLTIP;Feathering:\n0 = corners only,\n50 = halfway to center,\n100 = to center.
-!TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle.
-!TP_PDSHARPENING_LABEL;Capture Sharpening
-!TP_PFCURVE_CURVEEDITOR_CH;Hue
-!TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controls defringe strength by color.\nHigher = more,\nLower = less.
-!TP_PREPROCESS_DEADPIXFILT;Dead pixel filter
-!TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels.
-!TP_PREPROCESS_GREENEQUIL;Green equilibration
-!TP_PREPROCESS_HOTPIXFILT;Hot pixel filter
-!TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels.
-!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction
-!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both
-!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal
-!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows
-!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical
-!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
-!TP_PRSHARPENING_LABEL;Post-Resize Sharpening
-!TP_PRSHARPENING_TOOLTIP;Sharpens the image after resizing. Only works when the "Lanczos" resizing method is used. It is impossible to preview the effects of this tool. See RawPedia for usage instructions.
-!TP_RAWCACORR_AUTOIT;Iterations
-!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time.
-!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift
-!TP_RAWCACORR_LABEL;Chromatic Aberration Correction
-!TP_RAWEXPOS_BLACK_0;Green 1 (lead)
-!TP_RAWEXPOS_BLACK_1;Red
-!TP_RAWEXPOS_BLACK_2;Blue
-!TP_RAWEXPOS_BLACK_3;Green 2
-!TP_RAWEXPOS_BLACK_BLUE;Blue
-!TP_RAWEXPOS_BLACK_GREEN;Green
-!TP_RAWEXPOS_BLACK_RED;Red
-!TP_RAWEXPOS_LINEAR;White-point correction
-!TP_RAWEXPOS_RGB;Red, Green, Blue
-!TP_RAWEXPOS_TWOGREEN;Link greens
-!TP_RAW_1PASSMEDIUM;1-pass (Markesteijn)
-!TP_RAW_2PASS;1-pass+fast
-!TP_RAW_3PASSBEST;3-pass (Markesteijn)
-!TP_RAW_4PASS;3-pass+fast
-!TP_RAW_AHD;AHD
-!TP_RAW_AMAZE;AMaZE
-!TP_RAW_AMAZEVNG4;AMaZE+VNG4
-!TP_RAW_BORDER;Border
-!TP_RAW_DCB;DCB
-!TP_RAW_DCBENHANCE;DCB enhancement
-!TP_RAW_DCBITERATIONS;Number of DCB iterations
-!TP_RAW_DCBVNG4;DCB+VNG4
-!TP_RAW_DMETHOD;Method
-!TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing...
-!TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement...
-!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files.
-!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold
-!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image).
-!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold
-!TP_RAW_EAHD;EAHD
-!TP_RAW_FALSECOLOR;False color suppression steps
-!TP_RAW_FAST;Fast
-!TP_RAW_HD;Threshold
-!TP_RAW_HD_TOOLTIP;Lower values make hot/dead pixel detection more aggressive, but false positives may lead to artifacts. If you notice any artifacts appearing when enabling the Hot/Dead Pixel Filters, gradually increase the threshold value until they disappear.
-!TP_RAW_HPHD;HPHD
-!TP_RAW_IGV;IGV
-!TP_RAW_IMAGENUM;Sub-image
-!TP_RAW_IMAGENUM_SN;SN mode
-!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts.
-!TP_RAW_LABEL;Demosaicing
-!TP_RAW_LMMSE;LMMSE
-!TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps
-!TP_RAW_LMMSE_TOOLTIP;Adds gamma (step 1), median (steps 2-4) and refinement (steps 5-6) to reduce artifacts and improve the signal-to-noise ratio.
-!TP_RAW_MONO;Mono
-!TP_RAW_NONE;None (Shows sensor pattern)
-!TP_RAW_PIXELSHIFT;Pixel Shift
-!TP_RAW_PIXELSHIFTBLUR;Blur motion mask
-!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion
-!TP_RAW_PIXELSHIFTEPERISO;Sensitivity
-!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images.
-!TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames
-!TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;Equalize per channel
-!TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Enabled: Equalize the RGB channels individually.\nDisabled: Use same equalization factor for all channels.
-!TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction.
-!TP_RAW_PIXELSHIFTGREEN;Check green channel for motion
-!TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask
-!TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask
-!TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts
-!TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects.
-!TP_RAW_PIXELSHIFTMM_AUTO;Automatic
-!TP_RAW_PIXELSHIFTMM_CUSTOM;Custom
-!TP_RAW_PIXELSHIFTMM_OFF;Off
-!TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction
-!TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion
-!TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask
-!TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask
-!TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image.
-!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion.
-!TP_RAW_PIXELSHIFTSIGMA;Blur radius
-!TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value.
-!TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions
-!TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected.
-!TP_RAW_RCD;RCD
-!TP_RAW_RCDVNG4;RCD+VNG4
-!TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix
-!TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster.\n+fast gives less artifacts in flat areas
-!TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix
-!TP_RAW_VNG4;VNG4
-!TP_RAW_XTRANS;X-Trans
-!TP_RAW_XTRANSFAST;Fast X-Trans
-!TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling
-!TP_RESIZE_APPLIESTO;Applies to:
-!TP_RETINEX_CONTEDIT_HSL;HSL histogram
-!TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram
-!TP_RETINEX_CONTEDIT_LH;Hue
-!TP_RETINEX_CONTEDIT_MAP;Equalizer
-!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
-!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
-!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
-!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
-!TP_RETINEX_CURVEEDITOR_MAP;L=f(L)
-!TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts!
-!TP_RETINEX_EQUAL;Equalizer
-!TP_RETINEX_FREEGAMMA;Free gamma
-!TP_RETINEX_GAIN;Gain
-!TP_RETINEX_GAINOFFS;Gain and Offset (brightness)
-!TP_RETINEX_GAINTRANSMISSION;Gain transmission
-!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain.
-!TP_RETINEX_GAMMA;Gamma
-!TP_RETINEX_GAMMA_FREE;Free
-!TP_RETINEX_GAMMA_HIGH;High
-!TP_RETINEX_GAMMA_LOW;Low
-!TP_RETINEX_GAMMA_MID;Middle
-!TP_RETINEX_GAMMA_NONE;None
-!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
-!TP_RETINEX_GRAD;Transmission gradient
-!TP_RETINEX_GRADS;Strength gradient
-!TP_RETINEX_GRADS_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Strength is reduced when iterations increase, and conversely.
-!TP_RETINEX_GRAD_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Variance and Threshold are reduced when iterations increase, and conversely.
-!TP_RETINEX_HIGH;High
-!TP_RETINEX_HIGHLIG;Highlight
-!TP_RETINEX_HIGHLIGHT;Highlight threshold
-!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
-!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
-!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
-!TP_RETINEX_ITER;Iterations (Tone-mapping)
-!TP_RETINEX_ITERF;Tone mapping
-!TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time.
-!TP_RETINEX_LABEL;Retinex
-!TP_RETINEX_LABEL_MASK;Mask
-!TP_RETINEX_LABSPACE;L*a*b*
-!TP_RETINEX_LOW;Low
-!TP_RETINEX_MAP;Method
-!TP_RETINEX_MAP_GAUS;Gaussian mask
-!TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial)
-!TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total)
-!TP_RETINEX_MAP_METHOD_TOOLTIP;Use the mask generated by the Gaussian function above (Radius, Method) to reduce halos and artifacts.\n\nCurve only: apply a diagonal contrast curve on the mask.\nBeware of artifacts!\n\nGaussian mask: generate and use a Gaussian blur of the original mask.\nQuick.\n\nSharp mask: generate and use a wavelet on the original mask.\nSlow.
-!TP_RETINEX_MAP_NONE;None
-!TP_RETINEX_MEDIAN;Transmission median filter
-!TP_RETINEX_METHOD;Method
-!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Equalize action.\nHigh = Reinforce high light.\nHighlights = Remove magenta in highlights.
-!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
-!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
-!TP_RETINEX_NEIGHBOR;Radius
-!TP_RETINEX_NEUTRAL;Reset
-!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
-!TP_RETINEX_OFFSET;Offset (brightness)
-!TP_RETINEX_SCALES;Gaussian gradient
-!TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely.
-!TP_RETINEX_SETTINGS;Settings
-!TP_RETINEX_SKAL;Scale
-!TP_RETINEX_SLOPE;Free gamma slope
-!TP_RETINEX_STRENGTH;Strength
-!TP_RETINEX_THRESHOLD;Threshold
-!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
-!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
-!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
-!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map.
-!TP_RETINEX_TRANF;Transmission
-!TP_RETINEX_TRANSMISSION;Transmission map
-!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
-!TP_RETINEX_UNIFORM;Uniform
-!TP_RETINEX_VARIANCE;Contrast
-!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
-!TP_RETINEX_VIEW;Process
-!TP_RETINEX_VIEW_MASK;Mask
-!TP_RETINEX_VIEW_METHOD_TOOLTIP;Standard - Normal display.\nMask - Displays the mask.\nUnsharp mask - Displays the image with a high radius unsharp mask.\nTransmission - Auto/Fixed - Displays the file transmission-map, before any action on contrast and brightness.\n\nAttention: the mask does not correspond to reality, but is amplified to make it more visible.
-!TP_RETINEX_VIEW_NONE;Standard
-!TP_RETINEX_VIEW_TRAN;Transmission - Auto
-!TP_RETINEX_VIEW_TRAN2;Transmission - Fixed
-!TP_RETINEX_VIEW_UNSHARP;Unsharp mask
-!TP_SHARPENING_BLUR;Blur radius
-!TP_SHARPENING_CONTRAST;Contrast threshold
-!TP_SHARPENING_ITERCHECK;Auto limit iterations
-!TP_SHARPENING_RADIUS_BOOST;Corner radius boost
-!TP_SHARPENMICRO_CONTRAST;Contrast threshold
-!TP_SHARPENMICRO_LABEL;Microcontrast
-!TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5
-!TP_SHARPENMICRO_UNIFORMITY;Uniformity
-!TP_SOFTLIGHT_LABEL;Soft Light
-!TP_SOFTLIGHT_STRENGTH;Strength
-!TP_TM_FATTAL_AMOUNT;Amount
-!TP_TM_FATTAL_ANCHOR;Anchor
-!TP_TM_FATTAL_LABEL;Dynamic Range Compression
-!TP_TM_FATTAL_THRESHOLD;Detail
-!TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift
-!TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH
-!TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones
-!TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Red/Purple
-!TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE2;Red
-!TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE3;Red/Yellow
-!TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE4;Yellow
-!TP_VIBRANCE_CURVEEDITOR_SKINTONES_TOOLTIP;Hue according to hue H=f(H)
-!TP_VIBRANCE_LABEL;Vibrance
-!TP_VIBRANCE_PASTELS;Pastel Tones
-!TP_VIBRANCE_PASTSATTOG;Link pastel and saturated tones
-!TP_VIBRANCE_PROTECTSKINS;Protect skin-tones
-!TP_VIBRANCE_PSTHRESHOLD;Pastel/saturated tones threshold
-!TP_VIBRANCE_PSTHRESHOLD_SATTHRESH;Saturation threshold
-!TP_VIBRANCE_PSTHRESHOLD_TOOLTIP;The vertical axis represents pastel tones at the bottom and saturated tones at the top.\nThe horizontal axis represents the saturation range.
-!TP_VIBRANCE_PSTHRESHOLD_WEIGTHING;Pastel/saturated transition's weighting
-!TP_VIBRANCE_SATURATED;Saturated Tones
-!TP_WAVELET_1;Level 1
-!TP_WAVELET_2;Level 2
-!TP_WAVELET_3;Level 3
-!TP_WAVELET_4;Level 4
-!TP_WAVELET_5;Level 5
-!TP_WAVELET_6;Level 6
-!TP_WAVELET_7;Level 7
-!TP_WAVELET_8;Level 8
-!TP_WAVELET_9;Level 9
-!TP_WAVELET_APPLYTO;Apply To
-!TP_WAVELET_AVOID;Avoid color shift
-!TP_WAVELET_B0;Black
-!TP_WAVELET_B1;Grey
-!TP_WAVELET_B2;Residual
-!TP_WAVELET_BACKGROUND;Background
-!TP_WAVELET_BACUR;Curve
-!TP_WAVELET_BALANCE;Contrast balance d/v-h
-!TP_WAVELET_BALANCE_TOOLTIP;Alters the balance between the wavelet directions: vertical-horizontal and diagonal.\nIf contrast, chroma or residual tone mapping are activated, the effect due to balance is amplified.
-!TP_WAVELET_BALCHRO;Chroma balance
-!TP_WAVELET_BALCHRO_TOOLTIP;If enabled, the 'Contrast balance' curve or slider also modifies chroma balance.
-!TP_WAVELET_BANONE;None
-!TP_WAVELET_BASLI;Slider
-!TP_WAVELET_BATYPE;Contrast balance method
-!TP_WAVELET_CBENAB;Toning and Color Balance
-!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
-!TP_WAVELET_CCURVE;Local contrast
-!TP_WAVELET_CH1;Whole chroma range
-!TP_WAVELET_CH2;Saturated/pastel
-!TP_WAVELET_CH3;Link contrast levels
-!TP_WAVELET_CHCU;Curve
-!TP_WAVELET_CHR;Chroma-contrast link strength
-!TP_WAVELET_CHRO;Saturated/pastel threshold
-!TP_WAVELET_CHRO_TOOLTIP;Sets the wavelet level which will be the threshold between saturated and pastel colors.\n1-x: saturated\nx-9: pastel\n\nIf the value exceeds the amount of wavelet levels you are using then it will be ignored.
-!TP_WAVELET_CHR_TOOLTIP;Adjusts chroma as a function of "contrast levels" and "chroma-contrast link strength"
-!TP_WAVELET_CHSL;Sliders
-!TP_WAVELET_CHTYPE;Chrominance method
-!TP_WAVELET_COLORT;Opacity Red-Green
-!TP_WAVELET_COMPCONT;Contrast
-!TP_WAVELET_COMPGAMMA;Compression gamma
-!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
-!TP_WAVELET_COMPTM;Tone mapping
-!TP_WAVELET_CONTEDIT;'After' contrast curve
-!TP_WAVELET_CONTR;Gamut
-!TP_WAVELET_CONTRA;Contrast
-!TP_WAVELET_CONTRAST_MINUS;Contrast -
-!TP_WAVELET_CONTRAST_PLUS;Contrast +
-!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
-!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
-!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
-!TP_WAVELET_CURVEEDITOR_CL;L
-!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
-!TP_WAVELET_CURVEEDITOR_HH;HH
-!TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image's hue as a function of hue.
-!TP_WAVELET_DALL;All directions
-!TP_WAVELET_DAUB;Edge performance
-!TP_WAVELET_DAUB2;D2 - low
-!TP_WAVELET_DAUB4;D4 - standard
-!TP_WAVELET_DAUB6;D6 - standard plus
-!TP_WAVELET_DAUB10;D10 - medium
-!TP_WAVELET_DAUB14;D14 - high
-!TP_WAVELET_DAUB_TOOLTIP;Changes Daubechies coefficients:\nD4 = Standard,\nD14 = Often best performance, 10% more time-intensive.\n\nAffects edge detection as well as the general quality of the firsts levels. However the quality is not strictly related to this coefficient and can vary with images and uses.
-!TP_WAVELET_DONE;Vertical
-!TP_WAVELET_DTHR;Diagonal
-!TP_WAVELET_DTWO;Horizontal
-!TP_WAVELET_EDCU;Curve
-!TP_WAVELET_EDGCONT;Local contrast
-!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima.
-!TP_WAVELET_EDGE;Edge Sharpness
-!TP_WAVELET_EDGEAMPLI;Base amplification
-!TP_WAVELET_EDGEDETECT;Gradient sensitivity
-!TP_WAVELET_EDGEDETECTTHR;Threshold low (noise)
-!TP_WAVELET_EDGEDETECTTHR2;Threshold high (detection)
-!TP_WAVELET_EDGEDETECTTHR_TOOLTIP;This adjuster lets you target edge detection for example to avoid applying edge sharpness to fine details, such as noise in the sky.
-!TP_WAVELET_EDGEDETECT_TOOLTIP;Moving the slider to the right increases edge sensitivity. This affects local contrast, edge settings and noise.
-!TP_WAVELET_EDGESENSI;Edge sensitivity
-!TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged.
-!TP_WAVELET_EDGTHRESH;Detail
-!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts.
-!TP_WAVELET_EDRAD;Radius
-!TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect.
-!TP_WAVELET_EDSL;Threshold Sliders
-!TP_WAVELET_EDTYPE;Local contrast method
-!TP_WAVELET_EDVAL;Strength
-!TP_WAVELET_FINAL;Final Touchup
-!TP_WAVELET_FINEST;Finest
-!TP_WAVELET_HIGHLIGHT;Highlight luminance range
-!TP_WAVELET_HS1;Whole luminance range
-!TP_WAVELET_HS2;Shadows/Highlights
-!TP_WAVELET_HUESKIN;Skin hue
-!TP_WAVELET_HUESKIN_TOOLTIP;The bottom points set the beginning of the transition zone, and the upper points the end of it, where the effect is at its maximum.\n\nIf you need to move the area significantly, or if there are artifacts, then the white balance is incorrect.
-!TP_WAVELET_HUESKY;Sky hue
-!TP_WAVELET_HUESKY_TOOLTIP;The bottom points set the beginning of the transition zone, and the upper points the end of it, where the effect is at its maximum.\n\nIf you need to move the area significantly, or if there are artifacts, then the white balance is incorrect.
-!TP_WAVELET_ITER;Delta balance levels
-!TP_WAVELET_ITER_TOOLTIP;Left: increase low levels and reduce high levels,\nRight: reduce low levels and increase high levels.
-!TP_WAVELET_LABEL;Wavelet Levels
-!TP_WAVELET_LARGEST;Coarsest
-!TP_WAVELET_LEVCH;Chroma
-!TP_WAVELET_LEVDIR_ALL;All levels in all directions
-!TP_WAVELET_LEVDIR_INF;Below or equal the level
-!TP_WAVELET_LEVDIR_ONE;One level
-!TP_WAVELET_LEVDIR_SUP;Above the level
-!TP_WAVELET_LEVELS;Wavelet levels
-!TP_WAVELET_LEVELS_TOOLTIP;Choose the number of detail levels the image is to be decomposed into. More levels require more RAM and require a longer processing time.
-!TP_WAVELET_LEVF;Contrast
-!TP_WAVELET_LEVLABEL;Preview maximum possible levels = %1
-!TP_WAVELET_LEVONE;Level 2
-!TP_WAVELET_LEVTHRE;Level 4
-!TP_WAVELET_LEVTWO;Level 3
-!TP_WAVELET_LEVZERO;Level 1
-!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
-!TP_WAVELET_LIPST;Enhanced algoritm
-!TP_WAVELET_LOWLIGHT;Shadow luminance range
-!TP_WAVELET_MEDGREINF;First level
-!TP_WAVELET_MEDI;Reduce artifacts in blue sky
-!TP_WAVELET_MEDILEV;Edge detection
-!TP_WAVELET_MEDILEV_TOOLTIP;When you enable Edge Detection, it is recommanded:\n- to disabled low contrast levels to avoid artifacts,\n- to use high values of gradient sensitivity.\n\nYou can modulate the strength with 'refine' from Denoise and Refine.
-!TP_WAVELET_NEUTRAL;Neutral
-!TP_WAVELET_NOIS;Denoise
-!TP_WAVELET_NOISE;Denoise and Refine
-!TP_WAVELET_NPHIGH;High
-!TP_WAVELET_NPLOW;Low
-!TP_WAVELET_NPNONE;None
-!TP_WAVELET_NPTYPE;Neighboring pixels
-!TP_WAVELET_NPTYPE_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
-!TP_WAVELET_OPACITY;Opacity Blue-Yellow
-!TP_WAVELET_OPACITYW;Contrast balance d/v-h curve
-!TP_WAVELET_OPACITYWL;Final local contrast
-!TP_WAVELET_OPACITYWL_TOOLTIP;Modify the final local contrast at the end of the wavelet treatment.\n\nThe left side represents the smallest local contrast, progressing to the largest local contrast on the right.
-!TP_WAVELET_PASTEL;Pastel chroma
-!TP_WAVELET_PROC;Process
-!TP_WAVELET_RE1;Reinforced
-!TP_WAVELET_RE2;Unchanged
-!TP_WAVELET_RE3;Reduced
-!TP_WAVELET_RESCHRO;Chroma
-!TP_WAVELET_RESCON;Shadows
-!TP_WAVELET_RESCONH;Highlights
-!TP_WAVELET_RESID;Residual Image
-!TP_WAVELET_SAT;Saturated chroma
-!TP_WAVELET_SETTINGS;Wavelet Settings
-!TP_WAVELET_SKIN;Skin targetting/protection
-!TP_WAVELET_SKIN_TOOLTIP;At -100 skin-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 skin-tones are protected while all other tones are affected.
-!TP_WAVELET_SKY;Sky targetting/protection
-!TP_WAVELET_SKY_TOOLTIP;At -100 sky-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 sky-tones are protected while all other tones are affected.
-!TP_WAVELET_STREN;Strength
-!TP_WAVELET_STRENGTH;Strength
-!TP_WAVELET_SUPE;Extra
-!TP_WAVELET_THR;Shadows threshold
-!TP_WAVELET_THRESHOLD;Highlight levels
-!TP_WAVELET_THRESHOLD2;Shadow levels
-!TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels between 9 and 9 minus the value will be affected by the shadow luminance range. Other levels will be fully treated. The highest level possible is limited by the highlight level value (9 minus highlight level value).
-!TP_WAVELET_THRESHOLD_TOOLTIP;Only levels beyond the chosen value will be affected by the highlight luminance range. Other levels will be fully treated. The chosen value here limits the highest possible value of the shadow levels.
-!TP_WAVELET_THRH;Highlights threshold
-!TP_WAVELET_TILESBIG;Big tiles
-!TP_WAVELET_TILESFULL;Full image
-!TP_WAVELET_TILESIZE;Tiling method
-!TP_WAVELET_TILESLIT;Little tiles
-!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-!TP_WAVELET_TMSTRENGTH;Compression strength
-!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
-!TP_WAVELET_TMTYPE;Compression method
-!TP_WAVELET_TON;Toning
-!TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behavior of "white balance" by modulating the blue/red balance.\nThis can be useful when shooting conditions:\na) are far from the standard illuminant (e.g. underwater),\nb) are far from conditions where calibrations were performed,\nc) where the matrices or ICC profiles are unsuitable.
-!TP_WBALANCE_FLASH60;Standard, Canon, Pentax, Olympus
-!TP_WBALANCE_FLASH65;Nikon, Panasonic, Sony, Minolta
-!TP_WBALANCE_FLUO1;F1 - Daylight
-!TP_WBALANCE_FLUO2;F2 - Cool White
-!TP_WBALANCE_FLUO3;F3 - White
-!TP_WBALANCE_FLUO4;F4 - Warm White
-!TP_WBALANCE_FLUO5;F5 - Daylight
-!TP_WBALANCE_FLUO6;F6 - Lite White
-!TP_WBALANCE_FLUO7;F7 - D65 Daylight Simulator
-!TP_WBALANCE_FLUO8;F8 - D50 / Sylvania F40 Design
-!TP_WBALANCE_FLUO9;F9 - Cool White Deluxe
-!TP_WBALANCE_FLUO10;F10 - Philips TL85
-!TP_WBALANCE_FLUO11;F11 - Philips TL84
-!TP_WBALANCE_FLUO12;F12 - Philips TL83
-!TP_WBALANCE_FLUO_HEADER;Fluorescent
-!TP_WBALANCE_GTI;GTI
-!TP_WBALANCE_HMI;HMI
-!TP_WBALANCE_JUDGEIII;JudgeIII
-!TP_WBALANCE_LAMP_HEADER;Lamp
-!TP_WBALANCE_LED_CRS;CRS SP12 WWMR16
-!TP_WBALANCE_LED_LSI;LSI Lumelex 2040
-!TP_WBALANCE_PICKER;Pick
-!TP_WBALANCE_SOLUX47;Solux 4700K (vendor)
-!TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery)
-!TP_WBALANCE_TEMPBIAS;AWB temperature bias
-!TP_WBALANCE_TEMPBIAS_TOOLTIP;Allows to alter the computation of the "auto white balance"\nby biasing it towards warmer or cooler temperatures. The bias\nis expressed as a percentage of the computed temperature,\nso that the result is given by "computedTemp + computedTemp * bias".
-!TP_WBALANCE_TUNGSTEN;Tungsten
diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech
index 19182a1e5..b6006cd36 100644
--- a/rtdata/languages/Czech
+++ b/rtdata/languages/Czech
@@ -40,10 +40,12 @@
#39 2017-07-21 updated by mkyral
#40 2017-12-13 updated by mkyral
#41 2018-03-03 updated by mkyral
-#42 2018-04-28 updated by mkyral
-#43 2018-12-13 updated by mkyral
-#44 2019-04-17 updated by mkyral
-
+#42 2018-10-24 updated by mkyral
+#43 2018-12-04 updated by mkyral
+#44 2018-12-13 updated by mkyral
+#45 2020-04-20 updated by mkyral
+#46 2020-04-21 updated by mkyral
+#47 2020-06-02 updated by mkyral
ABOUT_TAB_BUILD;Verze
ABOUT_TAB_CREDITS;Zásluhy
ABOUT_TAB_LICENSE;Licence
@@ -153,7 +155,7 @@ FILEBROWSER_APPLYPROFILE;Použít
FILEBROWSER_APPLYPROFILE_PARTIAL;Aplikovat - částečně
FILEBROWSER_AUTODARKFRAME;Automatický tmavý snímek
FILEBROWSER_AUTOFLATFIELD;Auto Flat Field
-FILEBROWSER_BROWSEPATHBUTTONHINT;Klikněte pro otevření zadané cesty, obnovte složku a aplikujte klíčové slovo "find".
+FILEBROWSER_BROWSEPATHBUTTONHINT;Klikněte pro otevření zadané cesty, obnovte složku a aplikujte klíčová slova z pole "Najít:".
FILEBROWSER_BROWSEPATHHINT;Vložte cestu pro procházení.\n\nKlávesové zkratky:\nCtrl-o pro přepnutí do adresního řádku.\nEnter/ Ctrl-Enter pro procházení ;\nEsc pro zrušení změn.\nShift-Esc pro zrušení přepnutí.\n\nZkratky pro cesty:\n~\t- domácí složka uživatele.\n!\t- složka s obrázky uživatele.
FILEBROWSER_CACHE;Mezipaměť
FILEBROWSER_CACHECLEARFROMFULL;Smazat vše včetně profilů zpracování v mezipaměti
@@ -163,8 +165,12 @@ FILEBROWSER_COLORLABEL_TOOLTIP;Barevný štítek.\n\nPoužijte výběr ze seznam
FILEBROWSER_COPYPROFILE;Kopírovat
FILEBROWSER_CURRENT_NAME;Současné jméno:
FILEBROWSER_DARKFRAME;Tmavý snímek
-FILEBROWSER_DELETEDIALOG_HEADER;Potvrzení smazání souboru
+FILEBROWSER_DELETEDIALOG_ALL;Jste si jisti, že chcete trvale vymazat %1 vybraných souborů?
+FILEBROWSER_DELETEDIALOG_HEADER;Potvrzení smazání souboru:
+FILEBROWSER_DELETEDIALOG_SELECTED;Jste si jisti, že chcete trvale vymazat %1 vybraných souborů?
+FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Jste si jisti, že chcete trvale vymazat %1 vybraných souborů včetně výstupů dávkového zpracování?
FILEBROWSER_EMPTYTRASH;Vysypat koš
+FILEBROWSER_EMPTYTRASHHINT;Trvale smaže všechny soubory z koše.
FILEBROWSER_EXTPROGMENU;Otevřít pomocí
FILEBROWSER_FLATFIELD;Flat Field
FILEBROWSER_MOVETODARKFDIR;Přesunout do složky tmavých snímků
@@ -198,6 +204,8 @@ FILEBROWSER_POPUPRANK2;Hodnocení 2 **
FILEBROWSER_POPUPRANK3;Hodnocení 3 ***
FILEBROWSER_POPUPRANK4;Hodnocení 4 ****
FILEBROWSER_POPUPRANK5;Hodnocení 5 *****
+FILEBROWSER_POPUPREMOVE;Trvale smazat
+FILEBROWSER_POPUPREMOVEINCLPROC;Trvale smazat, včetně dávkově zpracovaných verzí
FILEBROWSER_POPUPRENAME;Přejmenovat
FILEBROWSER_POPUPSELECTALL;Vybrat vše
FILEBROWSER_POPUPTRASH;Přesunout do koše
@@ -224,6 +232,7 @@ FILEBROWSER_SHOWDIRHINT;Smazat všechny filtry.\nZkratka: d
FILEBROWSER_SHOWEDITEDHINT;Ukázat upravené obrázky.\nZkratka: 7
FILEBROWSER_SHOWEDITEDNOTHINT;Ukázat neupravené obrázky.\nZkratka: 6
FILEBROWSER_SHOWEXIFINFO;Zobrazit Exif informace.\n\nZkratky:\ni - režim více karet editoru,\nAlt-i - režim jedné karty editoru.
+FILEBROWSER_SHOWNOTTRASHHINT;Zobrazit pouze snímky které nejsou v koši.
FILEBROWSER_SHOWORIGINALHINT;Zobrazí pouze originální obrázky.\n\nPokud existuje několik obrázků se stejným názvem, ale rozdílnými příponami, bude jako originál vybrán ten, jehož přípona je nejvýše v seznamu přípon veVolby > Prohlížeč souborů > Analyzované přípony.
FILEBROWSER_SHOWRANK1HINT;Ukázat obrázky hodnocené jednou hvězdičkou.\nZkratka: 1
FILEBROWSER_SHOWRANK2HINT;Ukázat obrázky hodnocené dvěma hvězdičkami.\nZkratka: 2
@@ -260,6 +269,7 @@ GENERAL_DISABLED;Vypnuto
GENERAL_ENABLE;Zapnout
GENERAL_ENABLED;Zapnuto
GENERAL_FILE;Soubor
+GENERAL_HELP;Nápověda
GENERAL_LANDSCAPE;Na šířku
GENERAL_NA;n/a
GENERAL_NO;Ne
@@ -402,11 +412,11 @@ HISTORY_MSG_113;L*a*b* - Ochrana červ. a pleť. tónů
HISTORY_MSG_114;Průchody DCB
HISTORY_MSG_115;Potlačení chybných barev
HISTORY_MSG_116;Vylepšení DCB
-HISTORY_MSG_117;Raw korekce CA - červená
-HISTORY_MSG_118;Raw korekce CA - modrá
+HISTORY_MSG_117;Raw korekce ChA - červená
+HISTORY_MSG_118;Raw korekce ChA - modrá
HISTORY_MSG_119;Filtrovat linkové rušení
HISTORY_MSG_120;Vyrovnání zelené
-HISTORY_MSG_121;Raw korekce CA - automatická
+HISTORY_MSG_121;Raw korekce ChA - automatická
HISTORY_MSG_122;Tmavé snímky - Automatický výběr
HISTORY_MSG_123;Tmavé snímky - Soubor
HISTORY_MSG_124;Korekce bílého bodu
@@ -601,10 +611,10 @@ HISTORY_MSG_314;Vlnka - Gamut - Omezení artefaktů
HISTORY_MSG_315;Vlnka - Zůstatek - Kontrast
HISTORY_MSG_316;Vlnka - Gamut - Ochrana a zaměření pleťových tónů
HISTORY_MSG_317;Vlnka - Gamut - Odstín pleti
-HISTORY_MSG_318;Vlnka - Kontrast - Úrovně světel
-HISTORY_MSG_319;Vlnka - Kontrast - - rozsah světel
-HISTORY_MSG_320;Vlnka - Kontrast - Rozsah stínů
-HISTORY_MSG_321;Vlnka - Kontrast - Úrovně stínů
+HISTORY_MSG_318;Vlnka - Kontrast - Jemnější úrovně
+HISTORY_MSG_319;Vlnka - Kontrast - Jemnější rozsah
+HISTORY_MSG_320;Vlnka - Kontrast - Hrubší rozsah
+HISTORY_MSG_321;Vlnka - Kontrast - Hrubší úrovně
HISTORY_MSG_322;Vlnka - Gamut - Zabránit posunu barev
HISTORY_MSG_323;Vlnka - DH - Místní kontrast
HISTORY_MSG_324;Vlnka - Barevnost - Pastelové
@@ -761,6 +771,12 @@ HISTORY_MSG_490;DRC - Míra
HISTORY_MSG_491;Vyvážení bílé
HISTORY_MSG_492;RGB křivky
HISTORY_MSG_493;L*a*b* úpravy
+HISTORY_MSG_494;Doostření vstupu
+HISTORY_MSG_BLSHAPE;Rozmazat dle úrovně
+HISTORY_MSG_BLURCWAV;Rozmazat barevnost
+HISTORY_MSG_BLURWAV;Rozmazat jas
+HISTORY_MSG_BLUWAV;Útlum
+HISTORY_MSG_CAT02PRESET;Automatické přednastavení Cat02
HISTORY_MSG_CLAMPOOG;Oříznout barvy mimo gamut
HISTORY_MSG_COLORTONING_LABGRID_VALUE;Barevné tónování - Korekce barev
HISTORY_MSG_COLORTONING_LABREGION_AB;Barevné tónování - Korekce barev
@@ -769,7 +785,7 @@ HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;BT -oblast C masky
HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;Barevné tónování - H maska
HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;BT - Světlost
HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;BT - L maska
-HISTORY_MSG_COLORTONING_LABREGION_LIST;BT -
+HISTORY_MSG_COLORTONING_LABREGION_LIST;BT -
HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;BT - oblast masky rozostření
HISTORY_MSG_COLORTONING_LABREGION_OFFSET;BT - oblast posunu
HISTORY_MSG_COLORTONING_LABREGION_POWER;BT - oblast síly
@@ -778,10 +794,15 @@ HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;BT - oblast zobrazené masky
HISTORY_MSG_COLORTONING_LABREGION_SLOPE;BT - oblast sklonu
HISTORY_MSG_DEHAZE_DEPTH;Závoj - Hloubka
HISTORY_MSG_DEHAZE_ENABLED;Odstranění závoje
+HISTORY_MSG_DEHAZE_LUMINANCE;Závoj - Pouze jas
HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Závoj - Ukázat hloubkovou mapu
HISTORY_MSG_DEHAZE_STRENGTH;Závoj - Síla
HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dvojité demozajkování - automatický práh
HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dvojité demozajkování - Práh kontrastu
+HISTORY_MSG_EDGEFFECT;Útlum hrany
+HISTORY_MSG_FILMNEGATIVE_ENABLED;Negativní film
+HISTORY_MSG_FILMNEGATIVE_FILMBASE;Barva podkladu filmu
+HISTORY_MSG_FILMNEGATIVE_VALUES;Film negativní hodnoty
HISTORY_MSG_HISTMATCHING;Automaticky nalezená tónová křivka
HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Výstup - Základní barvy
HISTORY_MSG_ICM_OUTPUT_TEMP;Výstup - ICC-v4 světelný zdroj D
@@ -789,6 +810,7 @@ HISTORY_MSG_ICM_OUTPUT_TYPE;Výstup - Typ
HISTORY_MSG_ICM_WORKING_GAMMA;Pracovní - Gama
HISTORY_MSG_ICM_WORKING_SLOPE;Pracovní - sklon
HISTORY_MSG_ICM_WORKING_TRC_METHOD;Pracovní - Metoda TRC
+HISTORY_MSG_ILLUM;Osvětlení
HISTORY_MSG_LOCALCONTRAST_AMOUNT;Místní kontrast - Míra
HISTORY_MSG_LOCALCONTRAST_DARKNESS;Místní kontrast - Tmavé
HISTORY_MSG_LOCALCONTRAST_ENABLED;Místní kontrast
@@ -796,20 +818,56 @@ HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Místní kontrast - Světlé
HISTORY_MSG_LOCALCONTRAST_RADIUS;Místní kontrast - Poloměr
HISTORY_MSG_METADATA_MODE;Režim kopírování metadat
HISTORY_MSG_MICROCONTRAST_CONTRAST;Mikrokontrast - Práh kontrastu
+HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;DV - Automatický práh
+HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;DV - Automatický poloměr
+HISTORY_MSG_PDSHARPEN_CHECKITER;DV- Automatický počet průchodů
+HISTORY_MSG_PDSHARPEN_CONTRAST;DV - Práh kontrastu
+HISTORY_MSG_PDSHARPEN_ITERATIONS;DV - Průchody
+HISTORY_MSG_PDSHARPEN_RADIUS;DV - Poloměr
+HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;DV - Zvýšení poloměru rohu
HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Metoda demozajkování pohybu
HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Směr filtru linkového rušení
HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;Filtr PDAF linek
+HISTORY_MSG_PREPROCWB_MODE;Režim předzpracování VB
+HISTORY_MSG_PROTAB;Ochrana
HISTORY_MSG_PRSHARPEN_CONTRAST;Doostření - Práh kontrastu
-HISTORY_MSG_RAWCACORR_AUTOIT;Raw korekce CA - Iterace
-HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw korekce CA - Zabránit posunu barev
+HISTORY_MSG_RANGEAB;Rozsah ab
+HISTORY_MSG_RAWCACORR_AUTOIT;Raw korekce ChA - Iterace
+HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw korekce ChA - Zabránit posunu barev
HISTORY_MSG_RAW_BORDER;Okraj Raw
HISTORY_MSG_RESIZE_ALLOWUPSCALING;Změna rozměrů - Povolit zvětšení
HISTORY_MSG_SHARPENING_BLUR;Doostření - Poloměr rozmazání
HISTORY_MSG_SHARPENING_CONTRAST;Doostření - Práh kontrastu
HISTORY_MSG_SH_COLORSPACE;S/S - Barevný prostor
+HISTORY_MSG_SIGMACOL;Útlum barevnosti
+HISTORY_MSG_SIGMADIR;Útlum směru
+HISTORY_MSG_SIGMAFIN;Finální útlum kontrastu
+HISTORY_MSG_SIGMATON;Útlum tónování
HISTORY_MSG_SOFTLIGHT_ENABLED;Měkké světlo
HISTORY_MSG_SOFTLIGHT_STRENGTH;Měkká světla - Síla
+HISTORY_MSG_TEMPOUT;CAM02 - Automatická teplota
+HISTORY_MSG_THRESWAV;Práh vyvážení
HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Kotva
+HISTORY_MSG_TRANS_Method;Geometrie - Metoda
+HISTORY_MSG_WAVBALCHROM;Vyvážení barevnosti
+HISTORY_MSG_WAVBALLUM;Vyvážení jasu
+HISTORY_MSG_WAVBL;Úrovně rozmazání
+HISTORY_MSG_WAVCHROMCO;Hrubá barevnost
+HISTORY_MSG_WAVCHROMFI;Jemné barevnost
+HISTORY_MSG_WAVCLARI;Čirost
+HISTORY_MSG_WAVEDGS;Zachování hran
+HISTORY_MSG_WAVLOWTHR;Práh nízkého kontrastu
+HISTORY_MSG_WAVMERGEC;Sloučení barevnosti
+HISTORY_MSG_WAVMERGEL;Sloučení jasu
+HISTORY_MSG_WAVOFFSET;Posun
+HISTORY_MSG_WAVOLDSH;Starý algoritmus
+HISTORY_MSG_WAVRADIUS;Poloměr Stíny-Světla
+HISTORY_MSG_WAVSCALE;Měřítko
+HISTORY_MSG_WAVSHOWMASK;Ukázat masku vlnky
+HISTORY_MSG_WAVSIGMA;Útlum
+HISTORY_MSG_WAVSOFTRAD;Čirost jemný poloměr
+HISTORY_MSG_WAVSOFTRADEND;Konečný jemný poloměr
+HISTORY_MSG_WAVUSHAMET;Metoda čirosti
HISTORY_NEWSNAPSHOT;Přidat
HISTORY_NEWSNAPSHOT_TOOLTIP;Zkratka: Alt-s
HISTORY_SNAPSHOT;Snímek
@@ -939,15 +997,15 @@ MAIN_TAB_COLOR;Barvy
MAIN_TAB_COLOR_TOOLTIP;Zkratka: Alt-c
MAIN_TAB_DETAIL;Detaily
MAIN_TAB_DETAIL_TOOLTIP;Zkratka: Alt-d
-MAIN_TAB_DEVELOP; Dávková editace
+MAIN_TAB_DEVELOP; Dávková editace
MAIN_TAB_EXIF;Exif
-MAIN_TAB_EXPORT; Rychlý export
+MAIN_TAB_EXPORT; Rychlý export
MAIN_TAB_EXPOSURE;Expozice
MAIN_TAB_EXPOSURE_TOOLTIP;Zkratka: Alt-e
MAIN_TAB_FAVORITES;Oblíbené
MAIN_TAB_FAVORITES_TOOLTIP;Zkratka: Alt-u
-MAIN_TAB_FILTER; Filtr
-MAIN_TAB_INSPECT; Prohlížení
+MAIN_TAB_FILTER; Filtr
+MAIN_TAB_INSPECT; Prohlížení
MAIN_TAB_IPTC;IPTC
MAIN_TAB_METADATA;Metadata
MAIN_TAB_METADATA_TOOLTIP;Zkratka: Alt-m
@@ -961,8 +1019,8 @@ MAIN_TOOLTIP_BACKCOLOR2;Barva pozadí náhledu: bílá\nZkratka: 9
MAIN_TOOLTIP_BACKCOLOR3;Barva pozadí náhledu: středně šedá\nZkratka: 9
MAIN_TOOLTIP_BEFOREAFTERLOCK;Zamknout / Odemknout pohled Před\n\nZamknout: ponechá pohled Před nezměněn.\nUžitečné pro posouzení výsledného efektu po použití více nástrojů.\nNavíc může být porovnání provedeno proti kterémukoli stavu v historii.\n\nOdemknout: pohled Před bude následovat pohled Poté, vždy jen o jeden krok zpět, představí vliv právě použitého nástroje.
MAIN_TOOLTIP_HIDEHP;Zobrazit či schovat levý panel (obsahující historii).\nZkratka: l
-MAIN_TOOLTIP_INDCLIPPEDH;Zvýraznit oříznutá světla.\nZkratka: >
-MAIN_TOOLTIP_INDCLIPPEDS;Zvýraznit oříznuté stíny.\nZkratka: <
+MAIN_TOOLTIP_INDCLIPPEDH;Zvýraznění oříznutých světel.\nZkratka: >
+MAIN_TOOLTIP_INDCLIPPEDS;Zvýraznění oříznutých stínů.\nZkratka: <
MAIN_TOOLTIP_PREVIEWB;Náhled modrého kanálu.\nZkratka: b
MAIN_TOOLTIP_PREVIEWFOCUSMASK;Náhled masky zaostření.\nZkratka: Shift-f\n\nVíce přesné u snímků s nízkou hloubkou ostrosti, nízkým šumem a na vyšších úrovních zvětšení.\n\nPoužijte přiblížení v rozsahu 10 až 30% pro zlepšení přesnosti detekce u zašuměných snímků.
MAIN_TOOLTIP_PREVIEWG;Náhled zeleného kanálu.\nZkratka: g
@@ -1017,6 +1075,7 @@ PARTIALPASTE_EQUALIZER;Úrovně vlnky
PARTIALPASTE_EVERYTHING;Vše
PARTIALPASTE_EXIFCHANGES;Exif
PARTIALPASTE_EXPOSURE;Expozice
+PARTIALPASTE_FILMNEGATIVE;Negativní film
PARTIALPASTE_FILMSIMULATION;Simulace filmu
PARTIALPASTE_FLATFIELDAUTOSELECT;Automatický výběr Flat Field
PARTIALPASTE_FLATFIELDBLURRADIUS;Poloměr rozostření Flat Field
@@ -1041,6 +1100,7 @@ PARTIALPASTE_PREPROCESS_GREENEQUIL;Vyrovnání zelené
PARTIALPASTE_PREPROCESS_HOTPIXFILT;Filtr vypálených pixelů
PARTIALPASTE_PREPROCESS_LINEDENOISE;Filtrovat linkové rušení
PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;Filtr PDAF linek
+PARTIALPASTE_PREPROCWB;Předzpracování Vyvážení bílé
PARTIALPASTE_PRSHARPENING;Doostření po změně velikosti
PARTIALPASTE_RAWCACORR_AUTO;Automatická korekce CA
PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA zabránit posunu barev
@@ -1075,6 +1135,7 @@ PREFERENCES_APPEARANCE_COLORPICKERFONT;Písmo Průzkumníka barev
PREFERENCES_APPEARANCE_CROPMASKCOLOR;Barva masky ořezu
PREFERENCES_APPEARANCE_MAINFONT;Hlavní písmo
PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Barva vodítek navigátoru
+PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI režim
PREFERENCES_APPEARANCE_THEME;Motiv
PREFERENCES_APPLNEXTSTARTUP;vyžaduje restart aplikace
PREFERENCES_AUTOMONPROFILE;Použít barevný profil hlavního monitoru z operačního systému
@@ -1094,11 +1155,11 @@ PREFERENCES_CACHEMAXENTRIES;Maximální počet záznamů v mezipaměti
PREFERENCES_CACHEOPTS;Vlastnosti mezipaměti
PREFERENCES_CACHETHUMBHEIGHT;Maximální výška náhledu
PREFERENCES_CHUNKSIZES;Dlaždic na vlákno
-PREFERENCES_CHUNKSIZE_RAW_AMAZE;AMaZE demozajkování
-PREFERENCES_CHUNKSIZE_RAW_CA;Raw korekce CA
+PREFERENCES_CHUNKSIZE_RAW_AMAZE;Demozajkování AMaZE
+PREFERENCES_CHUNKSIZE_RAW_CA;Raw korekce ChA
PREFERENCES_CHUNKSIZE_RAW_RCD;RCD demozajkování
-PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demozajkování
-PREFERENCES_CHUNKSIZE_RGB;RGB zpracování
+PREFERENCES_CHUNKSIZE_RAW_XT;Demozajkování Xtrans
+PREFERENCES_CHUNKSIZE_RGB;Zpracování barev
PREFERENCES_CLIPPINGIND;Indikace oříznutí
PREFERENCES_CLUTSCACHE;Mezipaměť HaldCLUT
PREFERENCES_CLUTSCACHE_LABEL;Maximální počet přednačtených CLUTů
@@ -1186,8 +1247,8 @@ PREFERENCES_PARSEDEXTADDHINT;Vymazat označenou příponu ze seznamu.
PREFERENCES_PARSEDEXTDELHINT;Vymazat označenou příponu ze seznamu.
PREFERENCES_PARSEDEXTDOWNHINT;Vybranou příponu posunout na seznamu níže.
PREFERENCES_PARSEDEXTUPHINT;Vybranou příponu posunout na seznamu výše.
-PREFERENCES_PERFORMANCE_MEASURE;Měřit
-PREFERENCES_PERFORMANCE_MEASURE_HINT;Vypisovat časy zpracování v konzoli
+PREFERENCES_PERFORMANCE_MEASURE;Měření
+PREFERENCES_PERFORMANCE_MEASURE_HINT;Vypisuje doby zpracování do konzole
PREFERENCES_PERFORMANCE_THREADS;Vlákna
PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximální počet vláken pro Redukci šumu a Úrovně vlnky (0 = Automaticky)
PREFERENCES_PREVDEMO;Metoda demozajkování náhledu
@@ -1262,11 +1323,11 @@ PROFILEPANEL_TOOLTIPCOPY;Kopírovat současný profil do schránky.\nCtrl-kli
PROFILEPANEL_TOOLTIPLOAD;Nahrát profil ze souboru.\nCtrl-klik umožní vybrat parametry pro nahrání.
PROFILEPANEL_TOOLTIPPASTE;Vložit profil ze schránky.\nCtrl-klik umožní vybrat parametry pro vložení.
PROFILEPANEL_TOOLTIPSAVE;Uložit současný profil.\nCtrl-klik umožní vybrat parametry pro uložení.
-PROGRESSBAR_DECODING;Dekodování...
+PROGRESSBAR_DECODING;Dekódování…
PROGRESSBAR_GREENEQUIL;Vyrovnání zelené...
-PROGRESSBAR_HLREC;Rekonstrukce světel...
-PROGRESSBAR_HOTDEADPIXELFILTER;Filtr vypálených/mrtvých pixelů...
-PROGRESSBAR_LINEDENOISE;Filtr linkového rušení...
+PROGRESSBAR_HLREC;Rekonstrukce světel…
+PROGRESSBAR_HOTDEADPIXELFILTER;Filtrování vypálených/mrtvých pixelů…
+PROGRESSBAR_LINEDENOISE;Filtr linkového rušení…
PROGRESSBAR_LOADING;Načítání obrázku...
PROGRESSBAR_LOADINGTHUMBS;Načítání náhledů...
PROGRESSBAR_LOADJPEG;Načítání JPEG...
@@ -1275,7 +1336,7 @@ PROGRESSBAR_LOADTIFF;Načítání TIFF...
PROGRESSBAR_NOIMAGES;Složka neobsahuje obrázky
PROGRESSBAR_PROCESSING;Zpracovávaní obrázku...
PROGRESSBAR_PROCESSING_PROFILESAVED;Profil zpracování uložen
-PROGRESSBAR_RAWCACORR;RAW korekce chromatické aberace...
+PROGRESSBAR_RAWCACORR;Korekce ChA…
PROGRESSBAR_READY;Připraven
PROGRESSBAR_SAVEJPEG;Ukládání JPEG souboru...
PROGRESSBAR_SAVEPNG;Ukládání PNG souboru...
@@ -1293,8 +1354,8 @@ QUEUE_DESTFILENAME;Cesta a název souboru
QUEUE_FORMAT_TITLE;Formát souboru
QUEUE_LOCATION_FOLDER;Ulož do souboru
QUEUE_LOCATION_TEMPLATE;Použít šablonu
-QUEUE_LOCATION_TEMPLATE_TOOLTIP;Specifikujte kam se mají uložit výstupy. Lze použít umístění zdrojových souborů, pořadí, stav koše nebo pozice ve frontě.\n\nNapříklad pokud má zpracovávaná fotografie následující cestu:\n/home/tomas/fotky/2010-10-31/dsc0042.nef,\nmají jednotlivé formátovací řetězce tento význam:\n%d4 = home\n%d3 = tomas\n%d2 = fotky\n%d1 = 2010-10-31\n%f = dsc0042\n%p1 = /home/tomas/fotky/2010-10-31/\n%p2 = /home/tomas/fotky/\n%p3 = /home/tomas/\n%p4 = /home/\n\n%r bude nahrazeno hodnocením fotografie.Pokud není fotografie ohodnocena, bude %r nahrazeno '0'.Pokud je fotografie v koši, bude %r nahrazeno 'x'.\n\nPokud si přejete uložit výstupní obrázek vedle originálu, napište:\n%p1/%f\n\nPokud si jej ale přejete uložit do adresáře "converted" ve stejném adresáři jako otevřený obrázek, napište:\n%p1/converted/%f\n\nPro uložení výstupního obrázku do adresáře"/home/tom/photos/converted/2010-10-31", napište:\n%p2/converted/%d1/%f
-QUEUE_LOCATION_TITLE;Výstupní umístění
+QUEUE_LOCATION_TEMPLATE_TOOLTIP;Lze použít následující formátovací řetězce:\n%f, %d1, %d2, ..., %p1, %p2, ..., %r\n\nTyto formátovací řetězce reprezentují různé části cesty k uložené fotografii.\n\nNapříklad pokud má zpracovávaná fotografie následující cestu:\n/home/tomas/fotky/2010-10-31/fotka1.raw,\nmají jednotlivé formátovací řetězce tento význam:\n%d4 = home\n%d3 = tomas\n%d2 = fotky\n%d1 = 2010-10-31\n%f = fotka1\n%p1 = /home/tomas/fotky/2010-10-31/\n%p2 = /home/tomas/fotky/\n%p3 = /home/tomas/\n%p4 = /home/\n\n%r bude nahrazeno hodnocením fotografie.Pokud není fotografie ohodnocena, bude %r nahrazeno '0'.Pokud je fotografie v koši, bude %r nahrazeno 'x'.\n\nPokud si přejete uložit výstupní obrázek vedle originálu, napište:\n%p1/%f\n\nPokud si jej ale přejete uložit do adresáře "converted" ve stejném adresáři jako otevřený obrázek, napište:\n%p1/converted/%f\n\nPro uložení výstupního obrázku do adresáře"/home/tom/photos/converted/2010-10-31", napište:\n%p2/converted/%d1/%f
+QUEUE_LOCATION_TITLE;Umístění výstupu
QUEUE_STARTSTOP_TOOLTIP;Spustit nebo zastavit zpracování obrázků ve frontě.\n\nZkratka: Ctrl+s
SAMPLEFORMAT_0;Neznámý datový formát
SAMPLEFORMAT_1;8-bitový neznaménkový
@@ -1331,7 +1392,7 @@ THRESHOLDSELECTOR_HINT;Držte klávesu Shift pro přesun individuálních
THRESHOLDSELECTOR_T;Nahoře
THRESHOLDSELECTOR_TL;Nahoře vlevo
THRESHOLDSELECTOR_TR;Nahoře vpravo
-TOOLBAR_TOOLTIP_COLORPICKER;Uzamykatelný Průzkumník barev\n\nPokud je nástroj aktivní:\n- Přidání sondy: levý-klik.\n- Posunutí sondy: levý-klik a posunutí.\n- Smazání sondy: pravý-klik.\n- Smazání všech sond: Ctrl+Shift+pravý-klik.\n- Návrat k nástroji posunu: pravý-klik mimo průzkumníky.
+TOOLBAR_TOOLTIP_COLORPICKER;Uzamykatelný Průzkumník barev\n\nPokud je nástroj aktivní:\n- Přidání sondy: levý-klik.\n- Posunutí sondy: levý-klik a posunutí.\n- Smazání sondy: pravý-klik.\n- Smazání všech sond: Ctrl+Shift+pravý-klik.\n- Návrat k nástroji posunu: pravý-klik mimo jakoukoli sondu.
TOOLBAR_TOOLTIP_CROP;Oříznutí výběru.\nZkratka: c\nVýřez posunete pomocí Shift + tažení myši
TOOLBAR_TOOLTIP_HAND;Posun.\nZkratka: h
TOOLBAR_TOOLTIP_STRAIGHTEN;Vyznačení roviny / rotace.\nZkratka: s\n\nZobrazení míry rotace pomocí vodící linky na náhledu snímky. Úhel rotace je zobrazen vedle vodící linky. Střed rotace je geometrický střed snímku.
@@ -1417,7 +1478,7 @@ TP_COLORAPP_ALGO_JS;Světlost + Nasycení (JS)
TP_COLORAPP_ALGO_QM;Jas a pestrobarevnost (QM)
TP_COLORAPP_ALGO_TOOLTIP;Umožňuje vybrat mezi podmnožinou nebo všemi parametry.
TP_COLORAPP_BADPIXSL;Filtr vypálených/mrtvých pixelů
-TP_COLORAPP_BADPIXSL_TOOLTIP;Potlačení vypálených/mrtvých (jasně zabarvených) pixelů.\n0 = Bez efektu\n1 = Medián\n2 = Gaussův.\nPopřípadě obrázek upravte tak, aby jste se vyhnuli velmi tmavým stínům.\n\nTyto artefakty vznikají díky omezením CIECAM02.
+TP_COLORAPP_BADPIXSL_TOOLTIP;Potlačení vypálených/mrtvých (jasně zabarvených) pixelů.\n0 = Bez efektu\n1 = Medián\n2 = Gaussův.\nPopřípadě obrázek upravte tak, aby jste se vyhnuli velmi tmavým stínům.\n\nTyto artefakty vznikají díky omezením CIECAM02.
TP_COLORAPP_BRIGHT;Jas (O)
TP_COLORAPP_BRIGHT_TOOLTIP;Jas v CIECAM02 bere v potaz svítivost bílé a rozdíly jasů mezi L*a*b* a RGB.
TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;U ručního nastavení jsou doporučeny hodnoty nad 65.
@@ -1428,7 +1489,7 @@ TP_COLORAPP_CHROMA_S;Nasycení (S)
TP_COLORAPP_CHROMA_S_TOOLTIP;Nasycení se v CIECAM02 liší od nasycení L*a*b* a RGB.
TP_COLORAPP_CHROMA_TOOLTIP;Barevnost se v CIECAM02 liší od barevnosti L*a*b* a RGB.
TP_COLORAPP_CIECAT_DEGREE;CAT02 přizpůsobení
-TP_COLORAPP_CONTRAST;Kontrast (I)
+TP_COLORAPP_CONTRAST;Kontrast (J)
TP_COLORAPP_CONTRAST_Q;Kontrast (O)
TP_COLORAPP_CONTRAST_Q_TOOLTIP;Liší se od kontrastu L*a*b* a RGB.
TP_COLORAPP_CONTRAST_TOOLTIP;Liší se od kontrastu L*a*b* a RGB.
@@ -1445,17 +1506,29 @@ TP_COLORAPP_GAMUT;Kontrola gamutu (L*a*b*)
TP_COLORAPP_GAMUT_TOOLTIP;Povolí kontrolu gamutu v L*a*b* režimu.
TP_COLORAPP_HUE;Odstín (h)
TP_COLORAPP_HUE_TOOLTIP;Odstín (h) - úhel mezi 0° a 360°.
+TP_COLORAPP_IL41;D41
+TP_COLORAPP_IL50;D50
+TP_COLORAPP_IL55;D55
+TP_COLORAPP_IL60;D60
+TP_COLORAPP_IL65;D65
+TP_COLORAPP_IL75;D75
+TP_COLORAPP_ILA;Žárovka StdA 2856K
+TP_COLORAPP_ILFREE;Volná
+TP_COLORAPP_ILLUM;Osvětlení
+TP_COLORAPP_ILLUM_TOOLTIP;Vyberte osvětlení nejvíce se blížící podmínkám v době pořízení snímku.\nObecně D50, to se ale může lišit v závislosti na denní době a zeměpisné šířce.
TP_COLORAPP_LABEL;CIE model přizpůsobení barev 2002
TP_COLORAPP_LABEL_CAM02;Úpravy obrázku
TP_COLORAPP_LABEL_SCENE;Podmínky scény
TP_COLORAPP_LABEL_VIEWING;Podmínky zobrazení
-TP_COLORAPP_LIGHT;Světlost (I)
+TP_COLORAPP_LIGHT;Světlost (J)
TP_COLORAPP_LIGHT_TOOLTIP;Světlost v CIECAM02 se liší od světlosti v L*a*b* a RGB.
TP_COLORAPP_MEANLUMINANCE;Střední jas (Yb%)
TP_COLORAPP_MODEL;VB - Model
TP_COLORAPP_MODEL_TOOLTIP;Model bílého bodu.\n\nWB [RT] + [výstup]: Pro scénu je použito vyvážení bílé RawTherapee , CIECAM02 je nastaven na D50 a vyvážení bílé výstupního zařízení je nastaveno v Podmínkách prohlížení.\n\nWB [RT+CAT02] + [výstup]: CAT02 používá RawTherapee nastavení vyvážení bílé a vyvážení bílé výstupního zařízení je nastaveno v Podmínkách prohlížení.\n\nVolná teplota+zelená + CAT02 + [výstup]: teplota a zelená je vybrána uživatelem, vyvážení bílé výstupního zařízení je nastaveno v Podmínkách prohlížení.
TP_COLORAPP_NEUTRAL;Obnovit
TP_COLORAPP_NEUTRAL_TIP;Obnoví původní hodnoty u všech posuvníků a křivek.
+TP_COLORAPP_PRESETCAT02;Automatické přednastavení Cat02
+TP_COLORAPP_PRESETCAT02_TIP;Nastaví volby, posuvníky, teplotu a zelenou podle Cat02 automatického přednastavení.\nMusíte nastavit světelné podmínky při fotografování.\nPokud je potřeba, musíte změnit Cat02 podmínky přizpůsobení pro prohlížení.\nPokud je potřeba, můžete změnit teplotu a odstín podmínek při prohlížení a také další nastavení.
TP_COLORAPP_RSTPRO;Ochrana červených a pleťových tónů
TP_COLORAPP_RSTPRO_TOOLTIP;Ochrana červených a pleťových tónů ovlivňuje posuvníky i křivky.
TP_COLORAPP_SURROUND;Okolí
@@ -1472,7 +1545,9 @@ TP_COLORAPP_TCMODE_LABEL2;Mód křivky 2
TP_COLORAPP_TCMODE_LABEL3;Mód barevné křivky
TP_COLORAPP_TCMODE_LIGHTNESS;Světlost
TP_COLORAPP_TCMODE_SATUR;Nasycení
-TP_COLORAPP_TEMP_TOOLTIP;Pro výběr osvětlení vždy nastavte Tint=1.\n\nA barva=2856\nD50 barva=5003\nD55 barva=5503\nD65 barva=6504\nD75 barva=7504
+TP_COLORAPP_TEMP2_TOOLTIP;Buď symetrický režim teploty = Nastavení bílé,\nNebo vyberte osvětlení, vždy nastavte Odstín=1.\n\nA barva=2856\nD50 barva=5003\nD55 barva=5503\nD65 barva=6504\nD75 barva=7504
+TP_COLORAPP_TEMPOUT_TOOLTIP;Zakažte pro změnu teploty a nádechu
+TP_COLORAPP_TEMP_TOOLTIP;Pro výběr osvětlení vždy nastavte Odstín=1.\n\nA barva=2856\nD41 temp=4100\nD50 barva=5003\nD55 barva=5503\nD60 temp=6000\nD65 barva=6504\nD75 barva=7504
TP_COLORAPP_TONECIE;Mapování tónů pomocí CIECAM02
TP_COLORAPP_TONECIE_TOOLTIP;Pokud je volba zakázána, probíhá mapování tónů v prostoru L*a*b*.\nPokud je volba povolena. probíhá mapování tónů pomocí CIECAM02.\nAby měla tato volba efekt, musí být povolen nástroj Mapování tónů.
TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolutní jas prostředí prohlížení\n(obvykle 16 cd/m²).
@@ -1499,7 +1574,7 @@ TP_COLORTONING_LABREGION_CHANNEL_B;Modrá
TP_COLORTONING_LABREGION_CHANNEL_G;Zelená
TP_COLORTONING_LABREGION_CHANNEL_R;Červená
TP_COLORTONING_LABREGION_CHROMATICITYMASK;C
-TP_COLORTONING_LABREGION_HUEMASK;H
+TP_COLORTONING_LABREGION_HUEMASK;H
TP_COLORTONING_LABREGION_LIGHTNESS;Světlost
TP_COLORTONING_LABREGION_LIGHTNESSMASK;L
TP_COLORTONING_LABREGION_LIST_TITLE;Oprava
@@ -1561,6 +1636,7 @@ TP_DEFRINGE_RADIUS;Poloměr
TP_DEFRINGE_THRESHOLD;Práh
TP_DEHAZE_DEPTH;Hloubka
TP_DEHAZE_LABEL;Odstranění závoje
+TP_DEHAZE_LUMINANCE;Pouze jas
TP_DEHAZE_SHOW_DEPTH_MAP;Ukázat hloubkovou mapu
TP_DEHAZE_STRENGTH;Síla
TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Více zónová automatika
@@ -1669,6 +1745,15 @@ TP_EXPOSURE_TCMODE_STANDARD;Běžný
TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Běžný vážený
TP_EXPOS_BLACKPOINT_LABEL;Raw černé body
TP_EXPOS_WHITEPOINT_LABEL;Raw bílé body
+TP_FILMNEGATIVE_BLUE;Poměr modré
+TP_FILMNEGATIVE_FILMBASE_PICK;Výběr barvy podkladu filmu
+TP_FILMNEGATIVE_FILMBASE_TOOLTIP;Vyberte místo neexponovaného filmu (například okraj mezi snímky) pro získání aktuální barvy podkladu a uložte jej do profilu zpracování.\nTo umožňuje jednoduchou kontrolu konzistence vyvážení barev během dávkového zpracování více obrázků ze stejného filmu.\nTaké použijte pokud jsou převáděné snímky moc tmavé, přesvícené nebo barevně nevyvážené.
+TP_FILMNEGATIVE_FILMBASE_VALUES;Barva podkladu filmu:
+TP_FILMNEGATIVE_GREEN;Referenční exponent (kontrast)
+TP_FILMNEGATIVE_GUESS_TOOLTIP;Automaticky nastaví poměr červené a modré výběrem dvou vzorků s neutrálním odstínem (bez barvy) v původní scéně. Vzorky by se měly lišit jasem. Následně je nastaveno vyvážení bílé.
+TP_FILMNEGATIVE_LABEL;Negativní film
+TP_FILMNEGATIVE_PICK;Výběr neutrálních míst
+TP_FILMNEGATIVE_RED;Poměr červené
TP_FILMSIMULATION_LABEL;Simulace filmu
TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee je nakonfigurován aby hledal Hald CLUT obrázky pro nástroj Simulace filmu ve složce, jejíž načítání trvá velmi dlouho.\nZkontrolujte prosím nastavení v menu Volby > Zpracování obrázku > Simulace filmu.\nNastavená složka by měla buď obsahovat jen a pouze Hald CLUT obrázky nebo být prázdná, pokud nechcete nástroj Simulace filmu používat.\n\nVíce informací získáte v článku o nástroji Simulace filmu na RawPedii.\n\nChcete zrušit právě probíhající prohledávání složky?
TP_FILMSIMULATION_STRENGTH;Síla
@@ -1681,7 +1766,7 @@ TP_FLATFIELD_BT_HORIZONTAL;Vodorovně
TP_FLATFIELD_BT_VERTHORIZ;Vodorovně a svisle
TP_FLATFIELD_BT_VERTICAL;Svisle
TP_FLATFIELD_CLIPCONTROL;Kontrola oříznutí
-TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Kontrola oříznutí zabrání oříznutí světel po aplikaci Flat Field. Pokud byly světla oříznuta ještě před aplikací Flat field, může se objevit barevný nádech.
+TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Kontrola oříznutí zabrání oříznutí světel po aplikaci Flat Field. Pokud byly světla oříznuta ještě před aplikací Flat field, použije se hodnota 0.
TP_FLATFIELD_LABEL;Flat Field
TP_GENERAL_11SCALE_TOOLTIP;Efekt tohoto nástroje je viditelný pouze při přiblížení 1:1.
TP_GRADIENT_CENTER;Střed
@@ -1789,6 +1874,8 @@ TP_LABCURVE_RSTPRO_TOOLTIP;Pracuje s posuvníkem barevnosti a CC křivkou.
TP_LENSGEOM_AUTOCROP;Automatický ořez
TP_LENSGEOM_FILL;Automatické vyplnění
TP_LENSGEOM_LABEL;Objektiv / Geometrie
+TP_LENSGEOM_LIN;Lineární
+TP_LENSGEOM_LOG;Logaritmická
TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automaticky vybráno
TP_LENSPROFILE_CORRECTION_LCPFILE;LCP soubor
TP_LENSPROFILE_CORRECTION_MANUAL;Ručně vybráno
@@ -1817,6 +1904,7 @@ TP_PCVIGNETTE_ROUNDNESS;Zaoblení
TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Zaoblení:\n0 = čtverec,\n50 = elipsa,\n100 = kruh.
TP_PCVIGNETTE_STRENGTH;Síla
TP_PCVIGNETTE_STRENGTH_TOOLTIP;Síla filtru v expozičních stupních (v rozích).
+TP_PDSHARPENING_LABEL;Doostření vstupu
TP_PERSPECTIVE_HORIZONTAL;Vodorovně
TP_PERSPECTIVE_LABEL;Perspektiva
TP_PERSPECTIVE_VERTICAL;Svisle
@@ -1836,6 +1924,10 @@ TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Vodorovně pouze u PDAF řádků
TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Svisle
TP_PREPROCESS_NO_FOUND;Nic nenalezeno
TP_PREPROCESS_PDAFLINESFILTER;Filtr PDAF linek
+TP_PREPROCWB_LABEL;Předzpracování Vyvážení bílé
+TP_PREPROCWB_MODE;Mód
+TP_PREPROCWB_MODE_AUTO;Automaticky
+TP_PREPROCWB_MODE_CAMERA;Fotoaparát
TP_PRSHARPENING_LABEL;Doostření po změně velikosti
TP_PRSHARPENING_TOOLTIP;Obrázek po zmenšení doostří. Funguje pouze pokud je použita "Lanczos" metoda zmenšení. Náhled výsledku není v tomto nástroji možný. Podívejte se do RawPedie pro návod k použití.
TP_RAWCACORR_AUTO;Automatická korekce
@@ -1868,7 +1960,7 @@ TP_RAW_DCBENHANCE;Vylepšení DCB
TP_RAW_DCBITERATIONS;Počet průchodů DCB
TP_RAW_DCBVNG4;DCB+VNG4
TP_RAW_DMETHOD;Metoda
-TP_RAW_DMETHOD_PROGRESSBAR;%1 demozajkování...
+TP_RAW_DMETHOD_PROGRESSBAR;%1 demozajkování…
TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Vylepšení demozajkování...
TP_RAW_DMETHOD_TOOLTIP;Poznámka: IGV a LMMSE jsou určeny pro obrázky s vysokým ISO, kterým pomáhají vyhnout se u redukce šumu vzniku vzorů, posterizaci a vyžehlenému vzhledu.\n\nPixel Shift je určen pro soubory Pentax/Sony Pixel Shift.\nPro soubory neobsahující Pixel Shift data je použita metoda AMaZE.
TP_RAW_DUALDEMOSAICAUTOCONTRAST;Automatický práh
@@ -1882,7 +1974,7 @@ TP_RAW_HD_TOOLTIP;Nižší hodnoty učiní detekci vypálených/mrtvých bodů a
TP_RAW_HPHD;HPHD
TP_RAW_IGV;IGV
TP_RAW_IMAGENUM;Dílčí snímek
-TP_RAW_IMAGENUM_SN;Režim SN
+TP_RAW_IMAGENUM_SN;Režim Signál/Šum
TP_RAW_IMAGENUM_TOOLTIP;Některé raw snímky obsahují několik podsnímků (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\n\nV případě, že je pro demozajkování použita jiná metoda než Pixel Shift, tato volba určí, který podsnímek se použije.\n\nPokud je použita Pixel Shift metoda demozajkování na Pixel Shift raw soubory, budou použity všechny podsnímky a tato volba určí, který snímek bude použit pro pohyblivé části.
TP_RAW_LABEL;Demozajkování
TP_RAW_LMMSE;LMMSE
@@ -1924,7 +2016,7 @@ TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;Tří průchodová dává lepší výsledky
TP_RAW_SENSOR_XTRANS_LABEL;Senzory s X-Trans maticí
TP_RAW_VNG4;VNG4
TP_RAW_XTRANS;X-Trans
-TP_RAW_XTRANSFAST;Fast X-Trans
+TP_RAW_XTRANSFAST;Rychlý X-Trans
TP_RESIZE_ALLOW_UPSCALING;Povolit zvětšení
TP_RESIZE_APPLIESTO;Aplikovat na:
TP_RESIZE_CROPPEDAREA;Oblast ořezu
@@ -2047,10 +2139,12 @@ TP_SHARPENING_EDRADIUS;Poloměr
TP_SHARPENING_EDTOLERANCE;Tolerance k hranám
TP_SHARPENING_HALOCONTROL;Omezení halo efektu
TP_SHARPENING_HCAMOUNT;Míra
+TP_SHARPENING_ITERCHECK;Automatické omezení průchodů
TP_SHARPENING_LABEL;Doostření
TP_SHARPENING_METHOD;Metoda
TP_SHARPENING_ONLYEDGES;Doostřit pouze hrany
TP_SHARPENING_RADIUS;Poloměr
+TP_SHARPENING_RADIUS_BOOST;Zvýšení poloměru rohu
TP_SHARPENING_RLD;RL Dekonvoluce
TP_SHARPENING_RLD_AMOUNT;Míra
TP_SHARPENING_RLD_DAMPING;Útlum
@@ -2110,11 +2204,17 @@ TP_WAVELET_BACKGROUND;Pozadí
TP_WAVELET_BACUR;Křivka
TP_WAVELET_BALANCE;Vyvážení kontrastu d/v-h
TP_WAVELET_BALANCE_TOOLTIP;Změní vyvážení mezi směry vlnky: svisle-vodorovně a úhlopříčně.\nPokud je aktivován kontrast, barevnost nebo zbytkové tónové mapování je efekt díky vyvážení zesílen.
-TP_WAVELET_BALCHRO;Vyvážení barev
+TP_WAVELET_BALCHRO;Vyvážení barevnosti
+TP_WAVELET_BALCHROM;Korekce odšumění Modrá-Červená
TP_WAVELET_BALCHRO_TOOLTIP;Pokud je povoleno, křivka nebo posuvníky "Vyvážení kontrastu" ovlivňují i vyvážení barev.
+TP_WAVELET_BALLUM;Korekce odšumění Bílá-Černá
TP_WAVELET_BANONE;Nic
TP_WAVELET_BASLI;Posuvník
TP_WAVELET_BATYPE;Metoda vyvážení kontrastu
+TP_WAVELET_BL;Úrovně rozmazání
+TP_WAVELET_BLCURVE;Rozmazání dle úrovní
+TP_WAVELET_BLURFRAME;Rozmazání
+TP_WAVELET_BLUWAV;Útlum
TP_WAVELET_CBENAB;Tónování a vyvážení barev
TP_WAVELET_CB_TOOLTIP;Pro silnější hodnoty barevného tónování s kombinováním nebo bez rozkladu na vrstvy tónování\nPro menší hodnoty můžete změnit vyvážení bílé na barvu pozadí (obloha, ...) bez změny předního plánu, obecně více kontrastní.
TP_WAVELET_CCURVE;Místní kontrast
@@ -2124,22 +2224,32 @@ TP_WAVELET_CH3;Propojit kontrast úrovní
TP_WAVELET_CHCU;Křivka
TP_WAVELET_CHR;Barevnost - kontrast síla propojení
TP_WAVELET_CHRO;Práh nasycené/pastelové
+TP_WAVELET_CHROFRAME;Odšumění Barevnosti
+TP_WAVELET_CHROMAFRAME;Barevnost
+TP_WAVELET_CHROMCO;Hrubá barevnost
+TP_WAVELET_CHROMFI;Jemná barevnost
TP_WAVELET_CHRO_TOOLTIP;Nastaví úroveň vlnky, která bude prahová pro syté a pastelové barvy.\n1-x: syté\nx-9: pastelové\n\nHodnota bude ignorována pokud přesáhne množství úrovní vlnky.
+TP_WAVELET_CHRWAV;Rozmazat barevnost
TP_WAVELET_CHR_TOOLTIP;Upraví barevnost jako funkci "Kontrast úrovní" a "Barevnost - kontrast síla propojení"
TP_WAVELET_CHSL;Posuvníky
TP_WAVELET_CHTYPE;Metoda barevnost
+TP_WAVELET_CLA;Čirost
+TP_WAVELET_CLARI;Ostrá maska a čirost
TP_WAVELET_COLORT;Neprůhlednost červená-zelená
TP_WAVELET_COMPCONT;Kontrast
TP_WAVELET_COMPGAMMA;Komprese gamy
TP_WAVELET_COMPGAMMA_TOOLTIP;Úprava gamy zůstatku obrázku vám umožní vyvážit data a histogram.
TP_WAVELET_COMPTM;Mapování tónů
TP_WAVELET_CONTEDIT;Křivka kontrastu 'Po'
+TP_WAVELET_CONTFRAME;Kontrast - komprese
TP_WAVELET_CONTR;Gamut
TP_WAVELET_CONTRA;Kontrast
+TP_WAVELET_CONTRASTEDIT;Jemnější - Hrubší úrovně
TP_WAVELET_CONTRAST_MINUS;Kontrast -
TP_WAVELET_CONTRAST_PLUS;Kontrast +
TP_WAVELET_CONTRA_TOOLTIP;Změní kontrast zůstatku obrazu.
TP_WAVELET_CTYPE;Ovládání barevnosti
+TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Zakázáno pokud je přiblížení přes 300%
TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Mění lokální kontrast jako funkci originálního lokálního kontrastu(úsečka).\nNízké hodnoty na úsečce představují malý lokální kontrast (skutečné hodnoty okolo 10..20).\n50% z úsečky představuje průměrný lokální kontrast (skutečné hodnoty okolo 100..300).\n66% z úsečky představuje představuje standardní odchylku lokálního kontrastu (skutečné hodnoty okolo 300..800).\n100% z úsečky představuje maximální lokální kontrast (skutečné hodnoty okolo 3000..8000).
TP_WAVELET_CURVEEDITOR_CH;Kontrast úrovní=f(Barevnost)
TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Mění kontrast každé úrovně jako funkci odstínu.\nDejte pozor, abyste nepřepsali změny udělané v podnástroji Gamut nástroje Odstín.\nZměny křivky se projeví pouze v případě, že posuvníky kontrastu úrovní vlnky nejsou nastaveny na nulu.
@@ -2155,10 +2265,13 @@ TP_WAVELET_DAUB6;D6 - standard plus
TP_WAVELET_DAUB10;D10 - střední
TP_WAVELET_DAUB14;D14 - Vysoká
TP_WAVELET_DAUB_TOOLTIP;Změní Daubechiesové koeficienty:\nD4 = Standard,\nD14 = Nejčastěji nejlepší výkon, ale o 10% delší zpracování .\n\nOvlivňuje detekci hran a obecnou kvalitu obrázku na prvních úrovních.Ovšem kvalita není striktně vázána na koeficienty a může se lišit v závislosti na obrázku a použití.
+TP_WAVELET_DIRFRAME;Směrový kontrast
TP_WAVELET_DONE;Svisle
TP_WAVELET_DTHR;Napříč
TP_WAVELET_DTWO;Vodorovně
TP_WAVELET_EDCU;Křivka
+TP_WAVELET_EDEFFECT;Útlum
+TP_WAVELET_EDEFFECT_TOOLTIP;Posuvník ovlivňuje rozsah hodnot kontrastu, které získají maximální efekt nástroje.\nMaximální hodnota (2.5) nástroj zakáže.
TP_WAVELET_EDGCONT;Místní kontrast
TP_WAVELET_EDGCONT_TOOLTIP;Posunutí bodů doleva snižuje kontrast a posunutí bodů doprava jej zvyšuje.\nRohy levý spodní, levý horní, pravý horní, pravý spodní postupně představují místní kontrast pro nízké hodnoty, průměr, průměr + stdev a maximum.
TP_WAVELET_EDGE;Doostření hran
@@ -2178,10 +2291,12 @@ TP_WAVELET_EDSL;Práh posuvníků
TP_WAVELET_EDTYPE;Metoda místního kontrastu
TP_WAVELET_EDVAL;Síla
TP_WAVELET_FINAL;Finální doladění
+TP_WAVELET_FINCFRAME;Finální místní kontrast
+TP_WAVELET_FINCOAR_TOOLTIP;Levá (pozitivní) část křivky působí na jemnější úrovně (navýšení).\nDva body na úsečce představují příslušné akční limity jemnějšía hrubší úrovně 5 a 6 (výchozí). Pravá (negativní) část křivky působí na hrubší úrovně (navýšení).\nVyvarujte se posouvání levé části křivky se zápornými hodnotami. Vyvarujte se posouvání pravé části křivky s kladnými hodnotami.
TP_WAVELET_FINEST;Nejjemnější
-TP_WAVELET_HIGHLIGHT;Zvýrazněný rozsah jasů
+TP_WAVELET_HIGHLIGHT;Jemnější úrovně rozsahu jasu
TP_WAVELET_HS1;Celý rozsah jasů
-TP_WAVELET_HS2;Stíny/Světla
+TP_WAVELET_HS2;Výběrový rozsah jasu
TP_WAVELET_HUESKIN;Odstín pleti
TP_WAVELET_HUESKIN_TOOLTIP;Spodní body nastaví začátek zóny přenosu a horní body její konec. Tam bude efekt největší.\n\nPokud potřebujete oblast výrazně změnit nebo se objevily artefakty, je nastavení vyvážení bílé nesprávné.
TP_WAVELET_HUESKY;Odstín oblohy
@@ -2192,9 +2307,9 @@ TP_WAVELET_LABEL;Úrovně vlnky
TP_WAVELET_LARGEST;Nejhrubší
TP_WAVELET_LEVCH;Barevnost
TP_WAVELET_LEVDIR_ALL;Všechny úrovně ve všech směrech
-TP_WAVELET_LEVDIR_INF;Méně nebo shodně s úrovní
+TP_WAVELET_LEVDIR_INF;Jemnější úrovně detailů s vybranou úrovní
TP_WAVELET_LEVDIR_ONE;Jedna úroveň
-TP_WAVELET_LEVDIR_SUP;Nad úrovní
+TP_WAVELET_LEVDIR_SUP;Hrubší úrovně detailů s vybranou úrovní
TP_WAVELET_LEVELS;Úrovně vlnky
TP_WAVELET_LEVELS_TOOLTIP;Vyberte počet úrovní detailu mezi které bude obrázek rozložen. Více úrovní potřebuje více paměti a zpracování trvá déle.
TP_WAVELET_LEVF;Kontrast
@@ -2205,57 +2320,89 @@ TP_WAVELET_LEVTWO;Úroveň 3
TP_WAVELET_LEVZERO;Úroveň 1
TP_WAVELET_LINKEDG;Spojit se sílou doostření hran
TP_WAVELET_LIPST;Vylepšený algoritmus
-TP_WAVELET_LOWLIGHT;Rozsah jasu a stínů
+TP_WAVELET_LOWLIGHT;Hrubší úrovně rozsahu jasu
+TP_WAVELET_LOWTHR_TOOLTIP;Zabraňuje zesílení šumu v jemných texturách
TP_WAVELET_MEDGREINF;První úroveň
TP_WAVELET_MEDI;Omezení artefaktů na modré obloze
TP_WAVELET_MEDILEV;Detekce hran
TP_WAVELET_MEDILEV_TOOLTIP;Pro povolení Detekce hran Vám doporučujeme:\n- zakázat úrovně s nízkým kontrastem pro vyhnutí se vzniku artefaktů,\n- použít vysoké hodnoty gradientu citlivosti.\n\nSílu můžete ovlivnit pomocí 'vylepšení' z Odšumění a vylepšení.
+TP_WAVELET_MERGEC;Sloučení barevnosti
+TP_WAVELET_MERGEL;Sloučení jasu
TP_WAVELET_NEUTRAL;Neutrální
TP_WAVELET_NOIS;Odšumění
TP_WAVELET_NOISE;Odšumění a vylepšení
+TP_WAVELET_NOISE_TOOLTIP;Pokud je čtvrtá úroveň jasu odšumění lepší než 20, použije se Agresivní režim.\nPokud je hrubší barevnost lepší než 20, použije se Agresívní režim.
TP_WAVELET_NPHIGH;Vysoká
TP_WAVELET_NPLOW;Nízká
TP_WAVELET_NPNONE;Nic
TP_WAVELET_NPTYPE;Sousední pixely
TP_WAVELET_NPTYPE_TOOLTIP;Tento algoritmus zkoumá blízkost pixelu a jeho osmi sousedů. V případě menšího rozdílu je hrana zesílena.
+TP_WAVELET_OFFSET_TOOLTIP;Posun změní vyvážení mezi světly a stíny.\nVyšší hodnoty zdůrazní změnu kontrastu světel, kdežto nižší hodnoty zdůrazní změnu kontrastu stínů.\nZároveň s nízkou hodnotou útlumu máte možnost si vybrat, které kontrasty budou zvýrazněny.
+TP_WAVELET_OLDSH;Algoritmus používá záporné hodnoty
TP_WAVELET_OPACITY;Neprůhlednost modrá-žlutá
TP_WAVELET_OPACITYW;Vyrovnání kontrastu d/v-h křivka
-TP_WAVELET_OPACITYWL;Finální místní kontrast
+TP_WAVELET_OPACITYWL;Místní kontrast
TP_WAVELET_OPACITYWL_TOOLTIP;Změní finální lokální kontrast na konci zpracování vlnky.\n\nLevá strana představuje nejmenší lokální kontrast a pravá strana zase největší lokální kontrast.
TP_WAVELET_PASTEL;Barevnost pastelů
TP_WAVELET_PROC;Zpracování
+TP_WAVELET_PROTAB;Ochrana
+TP_WAVELET_RADIUS;Poloměr Stíny - Světla
+TP_WAVELET_RANGEAB;Rozsah a a b %
TP_WAVELET_RE1;Zesílená
TP_WAVELET_RE2;Nezměněno
TP_WAVELET_RE3;Omezená
-TP_WAVELET_RESCHRO;Barevnost
+TP_WAVELET_RESBLUR;Jas rozmazání
+TP_WAVELET_RESBLURC;Barevnost rozmazání
+TP_WAVELET_RESBLUR_TOOLTIP;Zakázáno pokud je přiblížení přes 500%
+TP_WAVELET_RESCHRO;Intenzita
TP_WAVELET_RESCON;Stíny
TP_WAVELET_RESCONH;Světla
TP_WAVELET_RESID;Zůstatek obrazu
TP_WAVELET_SAT;Nasycená barevnost
TP_WAVELET_SETTINGS;Nastavení vlnky
+TP_WAVELET_SHA;Ostrá maska
+TP_WAVELET_SHFRAME;Stíny/Světla
+TP_WAVELET_SHOWMASK;Ukázat vlnkovou 'masku'
+TP_WAVELET_SIGMA;Útlum
+TP_WAVELET_SIGMAFIN;Útlum
+TP_WAVELET_SIGMA_TOOLTIP;Efekt posuvníků kontrastu je silnější u detailů se středními hodnotami kontrastu, a slabší u detailů s vysokými nebo nízkými hodnotami kontrastu.\n Tímto posuvníkem můžete kontrolovat jak rychle je potlačen efekt u extrémních hodnot kontrastu.\n Čím výše je posuvník nastaven, tím širší je rozsah hodnot kontrastů u kterých nastane silnější změna s větší šancí na vytvoření artefaktů.\n Čím je níže, tím přesněji bude účinek aplikován na úzkýrozsah hodnot kontrastu.
TP_WAVELET_SKIN;Ochrana: zaměření na pleťové tóny
TP_WAVELET_SKIN_TOOLTIP;Hodnota -100: zaměřeno na pleťové tóny.\nHodnota 0: se všemi tóny je zacházeno stejně.\nHodnota +100: pleťové tóny jsou chráněny zatímco všechny ostatní tóny jsou ovlivněny.
TP_WAVELET_SKY;Ochrana a zaměření na tóny oblohy
TP_WAVELET_SKY_TOOLTIP;Hodnota -100: zaměřeno na pleťové tóny.\nHodnota 0: se všemi tóny je zacházeno stejně.\nHodnota +100: pleťové tóny jsou chráněny zatímco všechny ostatní tóny jsou ovlivněny.
+TP_WAVELET_SOFTRAD;Jemný poloměr
TP_WAVELET_STREN;Síla
TP_WAVELET_STRENGTH;Síla
TP_WAVELET_SUPE;Extra
TP_WAVELET_THR;Práh stínů
-TP_WAVELET_THRESHOLD;Úrovně světel
-TP_WAVELET_THRESHOLD2;Úrovně stínů
-TP_WAVELET_THRESHOLD2_TOOLTIP;Pouze úrovně 9 a 9 mínus hodnota budou ovlivněny rozsahem stínů a jasů.Ostatní úrovně budou plně zpracovány. Maximální možná úroveň je omezena na nejvyšší hodnotu úrovně (9 - nejvyšší úroveň).
-TP_WAVELET_THRESHOLD_TOOLTIP;Pouze úrovně pod vybranou hodnotou budou ovlivněny rozsahem zvýraznění jasů.Ostatní úrovně budou plně zpracovány. Zde vybraná hodnota omezí nejvyšší možnou hodnotu úrovně stínů.
+TP_WAVELET_THRESHOLD;Jemnější úrovně
+TP_WAVELET_THRESHOLD2;Hrubší úrovně
+TP_WAVELET_THRESHOLD2_TOOLTIP;Pouze úrovně mezi 9 a 9 mínus hodnota budou ovlivněny rozsahem jasu stínů. Ostatní úrovně budou upraveny celé. Nejvyšší možná úroveň je omezena hodnotou zvýrazněné úrovně (9 mínus hodnota zvýrazněné úrovně). Pouze úrovně mezi vybranou hodnotou a úrovní 9/Extra budou ovlivněny Hrubým rozsahem úrovní.\nVšechny ostatní úrovně budou ovlivněny v celém rozsahu jasu, pokud nebudou omezeny nastavením Jemnými úrovněmi.\nNejnižší možná úroveň, kterou bude algoritmus zvažovat, je omezená hodnotou Jemných úrovní.
+TP_WAVELET_THRESHOLD_TOOLTIP;Pouze úrovně mimo vybranou hodnotu budou ovlivněny rozsahem jasu stínů. Ostatní úrovně budou upraveny celé. Zde vybraná hodnota omezuje nejvyšší možnou hodnotu úrovní stínů. Všechny úrovně od úrovně jedna až po vybranou úroveň ovlivněny Jemným rozsahem úrovní.\nVšechny ostatní úrovně budou ovlivněny v celém rozsahu jasu, pokud nebudou omezeny nastavením Hrubými úrovněmi.\nZde vybraná hodnota, se stane nejnižší možnou úrovní Hrubých úrovní.
+TP_WAVELET_THRESWAV;Práh vyvážení
TP_WAVELET_THRH;Práh světel
-TP_WAVELET_TILESBIG;Velké dlaždice
+TP_WAVELET_TILESBIG;Dlaždice
TP_WAVELET_TILESFULL;Celý obrázek
TP_WAVELET_TILESIZE;Metoda dlaždicování
TP_WAVELET_TILESLIT;Malé dlaždice
TP_WAVELET_TILES_TOOLTIP;Zpracování celého obrázku vede k lepší kvalitě a je doporučováno. Naproti tomu dlaždice jsou náhradní řešení pro uživatele s nedostatkem paměti. Paměťové nároky najdete na RawPedii.
+TP_WAVELET_TMEDGS;Zachování hran
+TP_WAVELET_TMSCALE;Měřítko
TP_WAVELET_TMSTRENGTH;Síla komprese
-TP_WAVELET_TMSTRENGTH_TOOLTIP;Ovládá sílu mapování tónů nebo kontrast komprese zůstatku obrázku. Pokud je hodnota rozdílná od nuly, budou posuvníky Síla a Gama v nástroji Mapování tónů v kartě Expozice neaktivní.
+TP_WAVELET_TMSTRENGTH_TOOLTIP;Kontroluje sílu tónového mapování nebo komprese kontrastu zůstatku obrazu.
TP_WAVELET_TMTYPE;Metoda komprese
TP_WAVELET_TON;Tónování
+TP_WAVELET_TONFRAME;Vyloučené barvy
+TP_WAVELET_USH;Nic
+TP_WAVELET_USHARP;Metoda čirosti
+TP_WAVELET_USHARP_TOOLTIP;Původní : zdrojovým souborem je soubor před Vlnkou.\nVlnka : zdrojovým souborem je soubor s aplikovanou Vlnkou.
+TP_WAVELET_USH_TOOLTIP;Pokud vyberete Ostrou masku, bude nastavení vlnky automaticky změněno na:\nPozadí=černá, zpracování=pod, úroveň=3 — ta může být změněna v rozmezí 1 až 4.\n\nPokud vyberete Čirost, bude nastavení vlnky automaticky změněno na:\nPozadí=zůstatek, zpracování=nad, úroveň=7 — ta může být změněna v rozmezí 5 až 10 úrovní vlnky.
+TP_WAVELET_WAVLOWTHR;Práh nízkého kontrastu
+TP_WAVELET_WAVOFFSET;Posun
TP_WBALANCE_AUTO;Automaticky
+TP_WBALANCE_AUTOITCGREEN;Teplotní korelace
+TP_WBALANCE_AUTOOLD;RGB šedé
+TP_WBALANCE_AUTO_HEADER;Automaticky
TP_WBALANCE_CAMERA;Fotoaparát
TP_WBALANCE_CLOUDY;Zataženo
TP_WBALANCE_CUSTOM;Vlastní
@@ -2297,6 +2444,8 @@ TP_WBALANCE_SOLUX41;Solux 4100K
TP_WBALANCE_SOLUX47;Solux 4700K (vendor)
TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery)
TP_WBALANCE_SPOTWB;Použijte pipetu pro nabrání vyvážení bílé z neutrální oblasti v náhledu.
+TP_WBALANCE_STUDLABEL;Faktor korelace: %1
+TP_WBALANCE_STUDLABEL_TOOLTIP;Zobrazí vypočítanou korelaci metody Student\nNižší hodnoty jsou lepší, přičemž pro <0.005 jsou výborné\n<0.01 jsou dobré a >0.5 jsou špatné.\nNízké hodnoty neznamenají, že je vyvážení bílé dobré: pro nestandardní světelné podmínky jsou výsledky nepředvídatelné.\nHodnota 1000 znamená, že byl použit předchozí výpočet a výsledky jsou pravděpodobně dobré.
TP_WBALANCE_TEMPBIAS;AVB - Zdůraznění teploty
TP_WBALANCE_TEMPBIAS_TOOLTIP;Dovolí ovlivnit výpočet "automatického vyvážení bílé"\nzdůrazněním teplejší nebo chladnější teploty. Toto zdůraznění\nje vyjádřeno v procentech vypočtené teploty a výsledek\nlze vyjádřit vzorcem "vypočtenáTeplota + vypočtenáTeplota * zdůraznění".
TP_WBALANCE_TEMPERATURE;Teplota
@@ -2311,42 +2460,3 @@ ZOOMPANEL_ZOOMFITCROPSCREEN;Přizpůsobit ořez obrazovce\nZkratka: f
ZOOMPANEL_ZOOMFITSCREEN;Přizpůsobit celý obrázek obrazovce\nZkratka: Alt-f
ZOOMPANEL_ZOOMIN;Přiblížit\nZkratka: +
ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: -
-
-!!!!!!!!!!!!!!!!!!!!!!!!!
-! Untranslated keys follow; remove the ! prefix after an entry is translated.
-!!!!!!!!!!!!!!!!!!!!!!!!!
-
-!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash?
-!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files?
-!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version?
-!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash.
-!FILEBROWSER_POPUPREMOVE;Delete permanently
-!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version
-!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash.
-!GENERAL_HELP;Help
-!HISTORY_MSG_494;Capture Sharpening
-!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only
-!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
-!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
-!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold
-!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius
-!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations
-!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold
-!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations
-!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius
-!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost
-!HISTORY_MSG_TRANS_Method;Geometry - Method
-!PARTIALPASTE_FILMNEGATIVE;Film Negative
-!PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode
-!TP_DEHAZE_LUMINANCE;Luminance only
-!TP_FILMNEGATIVE_BLUE;Blue ratio
-!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
-!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards.
-!TP_FILMNEGATIVE_LABEL;Film Negative
-!TP_FILMNEGATIVE_PICK;Pick neutral spots
-!TP_FILMNEGATIVE_RED;Red ratio
-!TP_LENSGEOM_LIN;Linear
-!TP_LENSGEOM_LOG;Logarithmic
-!TP_PDSHARPENING_LABEL;Capture Sharpening
-!TP_SHARPENING_ITERCHECK;Auto limit iterations
-!TP_SHARPENING_RADIUS_BOOST;Corner radius boost
diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US)
index d8c497f16..1bd319e6f 100644
--- a/rtdata/languages/English (US)
+++ b/rtdata/languages/English (US)
@@ -937,7 +937,7 @@
!MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: theme-based\nShortcut: 9
!MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: black\nShortcut: 9
!MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: white\nShortcut: 9
-!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9
+!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle gray\nShortcut: 9
!MAIN_TOOLTIP_BEFOREAFTERLOCK;Lock / Unlock the Before view\n\nLock: keep the Before view unchanged.\nUseful to evaluate the cumulative effect of multiple tools.\nAdditionally, comparisons can be made to any state in the History.\n\nUnlock: the Before view will follow the After view one step behind, showing the image before the effect of the currently used tool.
!MAIN_TOOLTIP_HIDEHP;Show/Hide the left panel (including the history).\nShortcut: l
!MAIN_TOOLTIP_INDCLIPPEDH;Clipped highlight indication.\nShortcut: >
@@ -2097,7 +2097,7 @@
!TP_WAVELET_APPLYTO;Apply To
!TP_WAVELET_AVOID;Avoid color shift
!TP_WAVELET_B0;Black
-!TP_WAVELET_B1;Grey
+!TP_WAVELET_B1;Gray
!TP_WAVELET_B2;Residual
!TP_WAVELET_BACKGROUND;Background
!TP_WAVELET_BACUR;Curve
diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais
index 55824ba44..1c8b5fee4 100644
--- a/rtdata/languages/Francais
+++ b/rtdata/languages/Francais
@@ -906,6 +906,8 @@ MAIN_TAB_FAVORITES_TOOLTIP;Raccourci: Alt-u
MAIN_TAB_FILTER; Filtrer
MAIN_TAB_INSPECT; Inspecter
MAIN_TAB_IPTC;IPTC
+MAIN_TAB_LOCALLAB;Local
+MAIN_TAB_LOCALLAB_TOOLTIP;Raccourci: Alt-o
MAIN_TAB_METADATA;Métadonnées
MAIN_TAB_METADATA_TOOLTIP;Raccourci:Alt-m
MAIN_TAB_RAW;RAW
@@ -989,6 +991,8 @@ PARTIALPASTE_LABCURVE;Courbes Lab
PARTIALPASTE_LENSGROUP;Réglages de l'objectif
PARTIALPASTE_LENSPROFILE;Profil de correction d'Objectif
PARTIALPASTE_LOCALCONTRAST;Contraste local
+PARTIALPASTE_LOCALLAB;Ajustements locauc
+PARTIALPASTE_LOCALLABGROUP;Réglages Ajustements locaux
PARTIALPASTE_METADATA;Mode des Metadonnées
PARTIALPASTE_METAGROUP;Réglages des Métadonnées
PARTIALPASTE_PCVIGNETTE;Filtre Vignettage
@@ -1750,6 +1754,644 @@ TP_LOCALCONTRAST_DARKNESS;Niveau des ombres
TP_LOCALCONTRAST_LABEL;Contraste Local
TP_LOCALCONTRAST_LIGHTNESS;Niveau des hautes-lumières
TP_LOCALCONTRAST_RADIUS;Rayon
+TP_LOCALLAB_ACTIV;Luminosité seulement
+TP_LOCALLAB_ACTIVSPOT;Activer le Spot
+TP_LOCALLAB_ADJ;Egalisateur Bleu-jaune Rouge-vert
+TP_LOCALLAB_ALL;Toutes les rubriques
+TP_LOCALLAB_AMOUNT;Quantité
+TP_LOCALLAB_ARTIF;Détection de forme
+TP_LOCALLAB_ARTIF_TOOLTIP;Le seuil deltaE étendue accroit la plage of étendue-deltaE - les valeurs élévées sont pour les images à gamut élévé.\nAugmenter l'affaiblissement deltaE améliore la détection de forme, mais peu réduire la capacité de détection.
+TP_LOCALLAB_AUTOGRAY;Automatique
+TP_LOCALLAB_AVOID;Evite les dérives de couleurs
+TP_LOCALLAB_BALAN;Balance ΔE ab-L
+TP_LOCALLAB_BALANEXP;Balance Laplacien
+TP_LOCALLAB_BALANH;Balance ΔE C-H
+TP_LOCALLAB_BALAN_TOOLTIP;Change l'algorithme des paramètres ΔE.\nPlus ou moins ab-L, plus ou moins C-H.\nPas pour le Debruitage
+TP_LOCALLAB_BASELOG;Base Logarithme
+TP_LOCALLAB_BILATERAL;Filtre Bilateral
+TP_LOCALLAB_BLACK_EV;Noir Ev
+TP_LOCALLAB_BLCO;Chrominance seulement
+TP_LOCALLAB_BLENDMASKCOL;Mélange - fusion
+TP_LOCALLAB_BLENDMASKMASK;Ajout / soustrait le masque Luminance
+TP_LOCALLAB_BLENDMASKMASKAB;Ajout / soustrait le masque Chrominance
+TP_LOCALLAB_BLENDMASK_TOOLTIP;Si fusion = 0 seule la détection de forme est améliorée.\nSi fusion > 0 le masque est ajouté à l'image. Si fusion < 0 le masque est soustrait à l'image
+TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;Si ce curseur = 0 pas d'action.\nAjoute ou soustrait le masque de l'image originale
+TP_LOCALLAB_BLGUID;Filtre guidé
+TP_LOCALLAB_BLINV;Inverse
+TP_LOCALLAB_BLLC;Luminance & Chrominance
+TP_LOCALLAB_BLLO;Luminance seulement
+TP_LOCALLAB_BLMED;Median
+TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal - direct floute et bruite avec tous les réglages.\nInverse floute et bruite avec tous les réglages. Soyez prudents certains resultats peuvent être curieux
+TP_LOCALLAB_BLNOI_EXP;Flouter & Bruit
+TP_LOCALLAB_BLNORM;Normal
+TP_LOCALLAB_BLSYM;Symétrique
+TP_LOCALLAB_BLURCOLDE_TOOLTIP;L'image pour calculer dE est légèrement floutéeafin d'éviter de prendre en compte des pixels isolés.
+TP_LOCALLAB_BLUFR;Flouter - Grain - Debruiter
+TP_LOCALLAB_BLUMETHOD_TOOLTIP;Pour flouter l'arrère plan et isoler le premier plan:\n*Flouter l'arrière plan avec un RT-spot couvrant totalement l'image (valeurs élevées Etendue et transition) - normal ou inverse.\n*Isoler le premier plan avec un ou plusieurs RT-spot Exclusion avec l'outils que vous voulez (accroître Etendue).\n\nCe module peut être utilisé en réduction de bruit additionnelle,incluant un "median" et un "Filtre Guidé"
+TP_LOCALLAB_BLUR;Flou Gaussien - Bruit - Grain
+TP_LOCALLAB_BLURCBDL;Flouter niveaux 0-1-2-3-4
+TP_LOCALLAB_BLURCOL;Rayon floutage
+TP_LOCALLAB_BLURDE;Flouter la détection de forme
+TP_LOCALLAB_BLURLC;Luminance seulement
+TP_LOCALLAB_BLURLEVELFRA;Flouter niveaux
+TP_LOCALLAB_BLURMASK_TOOLTIP;Génère un masque flou, prend en compte la structure avec le curseur de seuil de contraste du Masque flou.
+TP_LOCALLAB_BLURRMASK_TOOLTIP;Vous permet de faire varier "rayon" du flou Gaussien (0 to 1000)
+TP_LOCALLAB_BLURRESIDFRA;Flouter image Résiduelle
+TP_LOCALLAB_BLUR_TOOLNAME;Flouter/Grain & Réduction du Bruit - 1
+TP_LOCALLAB_BLWH;Tous les changements forcés en noir et blanc
+TP_LOCALLAB_BLWH_TOOLTIP;Force le changement de la composante "a" et "b" à zéro.\nUtile quand l'utilisateur choisit un processus noir et blanc, ou un film.
+TP_LOCALLAB_BUTTON_ADD;Ajouter
+TP_LOCALLAB_BUTTON_DEL;Effacer
+TP_LOCALLAB_BUTTON_DUPL;Dupliquer
+TP_LOCALLAB_BUTTON_REN;Renommer
+TP_LOCALLAB_BUTTON_VIS;Montrer/Cacher
+TP_LOCALLAB_CBDL;Contraste par niveaux de détail
+TP_LOCALLAB_CBDLCLARI_TOOLTIP;Ajuste les tons moyens et les réhausse.
+TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Agit comme un outil ondelettes.\nLe premier niveau (0) agit sur des détails de 2x2.\nLe dernier niveau (5) agit sur des détails de 64x64.
+TP_LOCALLAB_CBDL_THRES_TOOLTIP;Empêche d'augmenter le bruit
+TP_LOCALLAB_CBDL_TOOLNAME;Contraste par niveaux de détail - 2
+TP_LOCALLAB_CENTER_X;Centre X
+TP_LOCALLAB_CENTER_Y;Centre Y
+TP_LOCALLAB_CH;Courbes CL - LC
+TP_LOCALLAB_CHROMA;Chrominance
+TP_LOCALLAB_CHROMABLU;Niveaux Chroma
+TP_LOCALLAB_CHROMABLU_TOOLTIP;Agit comme un amplificateur-reducteur d'action en comparant aux réglages de luma.\nEn dessous de 1 reduit, au dessus de 1 amplifie
+TP_LOCALLAB_CHROMACBDL;Chroma
+TP_LOCALLAB_CHROMACB_TOOLTIP;Agit comme un amplificateur-reducteur d'action en comparant aux curseurs de luminance.\nEn dessous de 100 reduit, au dessus de 100 amplifie
+TP_LOCALLAB_CHROMALEV;Niveaux de Chroma
+TP_LOCALLAB_CHROMASKCOL;Chroma
+TP_LOCALLAB_CHROMASK_TOOLTIP;Vous pouvez utiliser ce curseur pour désaturer l'arrière plan (inverse masque - courbe proche de 0).\nEgalement pour atténier ou accroître l'action du masque sur la chroma
+TP_LOCALLAB_CHRRT;Chroma
+TP_LOCALLAB_CIRCRADIUS;Taille Spot
+TP_LOCALLAB_CIRCRAD_TOOLTIP;Contient les références du RT-spot, utile pour la détection de forme (couleur, luma, chroma, Sobel).\nLes faibles valeurs peuvent être utiles pour les feuillages.\nLes valeurs élevées peuvent être utile pour la peau
+TP_LOCALLAB_CLARICRES;Fusion Chroma
+TP_LOCALLAB_CLARIFRA;Clarté & Masque de netteté - Fusion & adoucir images
+TP_LOCALLAB_CLARILRES;Fusion Luma
+TP_LOCALLAB_CLARISOFT;Rayon adoucir
+TP_LOCALLAB_CLARISOFT_TOOLTIP;Actif pour Clarté et Masque de netteté si différent de zéro.\n\nActif pour toutes les pyramides ondelettes.\nInactif si rayon = 0
+TP_LOCALLAB_CLARITYML;Clarté
+TP_LOCALLAB_CLARI_TOOLTIP;En dessous ou égal à 4, 'Masque netteté' est actif.\nAu dessus du niveau ondelettes 5 'Clarté' est actif.\nUtilesu=i vous utilisez 'Compression dynamique des niveaux'
+TP_LOCALLAB_CLIPTM;Clip Recupère données (gain)
+TP_LOCALLAB_COFR;Couleur & Lumière
+TP_LOCALLAB_COLORDE;Couleur prévisualisation sélection ΔE - Intensité
+TP_LOCALLAB_COLORDEPREV_TOOLTIP;Bouton Prévisualisation ΔE a besoin qu'un seul outil soit activé (expander).\nPour pouvoir avoir une Prévisualisation ΔE avec plusieurs outils activés utiliser Masque et modifications - Prévisualisation ΔE
+TP_LOCALLAB_COLORDE_TOOLTIP;Affiche la prévisualisation ΔE en bleu si négatif et en vert si positif.\n\nMasque et modifications (montre modifications sans masque): montre les modifications réelles si positf, montre les modifications améliorées (luminance seule) en bleu et jaune si négatif.
+TP_LOCALLAB_COLORSCOPE;Etendue Outils Couleur
+TP_LOCALLAB_COLORSCOPE_TOOLTIP;Utilise une étendue commune pour Couleur et lumière, Ombres Lumières, Vibrance.\nLes autres outils ont leur étendue spécifique.
+TP_LOCALLAB_COLOR_TOOLNAME;Couleur & Lumière - 11
+TP_LOCALLAB_COL_NAME;Nom
+TP_LOCALLAB_COL_VIS;Statut
+TP_LOCALLAB_COMPFRA;Niveaux Contraste directionnel
+TP_LOCALLAB_COMPFRAME_TOOLTIP;Autorise des effets spéciaux. Vous pouvez réduire les artéfacts avec 'Clarté & Masque netteté - Fusion & Images douces".\nUtilise des ressources
+TP_LOCALLAB_COMPLEX_METHOD;Complexitée logicielle
+TP_LOCALLAB_COMPLEX_TOOLTIP; Autorise l'utilisateur à sélectionner des rubriques Ajustements locaux.
+TP_LOCALLAB_COMPREFRA;Niveaux de (de)compression dynamique
+TP_LOCALLAB_COMPRESS_TOOLTIP;Utilisesi nécessaire le module 'Clarté & Masque de netteté - Fusion & Images douces' en ajustant 'Rayon doux' pour réduire les artéfacts.
+TP_LOCALLAB_CONTCOL;Seuil de Contraste Masque flou
+TP_LOCALLAB_CONTFRA;Contraste par niveau
+TP_LOCALLAB_CONTRAST;Contraste
+TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Contrôle de contraste du masque.
+TP_LOCALLAB_CONTRESID;Contraste
+TP_LOCALLAB_CONTTHMASK_TOOLTIP;Vous permet de déterminer quelles parties de l'image seront concernées par la texture.
+TP_LOCALLAB_CONTTHR;Seuil contraste
+TP_LOCALLAB_CONTWFRA;Contrast Local
+TP_LOCALLAB_CSTHRESHOLD;Ψ Ondelettes niveaux
+TP_LOCALLAB_CSTHRESHOLDBLUR;Ψ Masque Ondelettes niveau
+TP_LOCALLAB_CURV;Luminosité - Contraste - Chrominance "Super"
+TP_LOCALLAB_CURVCURR;Normal
+TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;Si la courbe est au sommet, le masque est compétement noir aucune transformation n'est réalisée par le masque sur l'image.\nQuand vous descendez la courbe, progressivement le masque va se colorer et s'éclaicir, l'image change de plus en plus.\n\nIl est recommendé (pas obligatoire) de positionner le sommet des courbes curves sur la ligne de transition grise qui représnte les références (chroma, luma, couleur).
+TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;Si la courbe est au sommet,le masque est compétement noir aucune transformation n'est réalisée par le masque sur l'image.\nQuand vous descendez la courbe, progressivement le masque va se colorer et s'éclaicir, l'image change de plus en plus.\nVous pouvez choisir ou non de positionner le sommet de la courbe sur la transition.
+TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;Pour être actif, vous devez activer la combobox 'Curves type'
+TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Courbe tonale
+TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), peut être utilisée avec L(H) dans Couleur et lumière
+TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', la courbe L=f(L) a le même algorithme que le curseur luminosité.\n'Super' the curve L=f(L) has an new improved algorithm, which can leeds in some cases to artifacts.
+TP_LOCALLAB_CURVENCONTRAST;Super+Contrast threshold (experimental)
+TP_LOCALLAB_CURVENH;Super
+TP_LOCALLAB_CURVENHSU;Combined HueChroma (experimental)
+TP_LOCALLAB_CURVENSOB2;Combined HueChroma + Contrast threshold (experimental)
+TP_LOCALLAB_CURVNONE;Désactive courbes
+TP_LOCALLAB_DARKRETI;Obscuirité
+TP_LOCALLAB_DEHAFRA;Elimination de la brume
+TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Élimine la brume atmosphérique. Augmente généralement la saturation et les détails. \ N Peut supprimer les dominantes de couleur, mais peut également introduire une dominante bleue qui peut être corrigée à l'aide d'autres outils.
+TP_LOCALLAB_DEHAZ;Force
+TP_LOCALLAB_DEHAZ_TOOLTIP;Valeurs Négatives ajoute de la brume
+TP_LOCALLAB_DELTAD;Delta balance
+TP_LOCALLAB_DELTAEC;Masque ΔE Image
+TP_LOCALLAB_DENOIS;Ψ Réduction du bruit
+TP_LOCALLAB_DENOI_EXP;Réduction du bruit
+TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservatif préserve les fréquences basses, alors que agressif tend à les effacer
+TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Equilibre l'action de denoise luminance entre les ombres et les lumières
+TP_LOCALLAB_DENOI_TOOLTIP;Ce module peut être utilisé seul (à la fin du processus), ou en complément de Réduction du bruit (au début).\nEtendue(deltaE)permet de différencier l'action.\nVous pouvez compléter avec "median" ou "Filtre guidé" (Adoucir Flou...).\nVous pouvez compléter l'action avec "Flou niveaux" "Ondelette pyramide"
+TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Permet de récupérer les détails de luminance par mise en oeuvre progressive de la transformée de Fourier (DCT)
+TP_LOCALLAB_DENOICHROF_TOOLTIP;Agit sur les fins détails du bruit de chrominance
+TP_LOCALLAB_DENOICHROC_TOOLTIP;Agit sur les paquets et amas de bruit de chrominance
+TP_LOCALLAB_DENOICHRODET_TOOLTIP;Permet de récupérer les détails de chrominance par mise en oeuvre progressive de la transformée de Fourier (DCT)
+TP_LOCALLAB_DENOITHR_TOOLTIP;Règle l'effet de bord pour privilégier l'action sur les aplats
+TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Equilibre l'action de denoise chrominance entre les bleus-jaunes et les rouges-verts
+TP_LOCALLAB_DENOIBILAT_TOOLTIP;Traite le bruit d'impulsion (poivre et sel)
+TP_LOCALLAB_DEPTH;Profondeur
+TP_LOCALLAB_DETAIL;Contrast local
+TP_LOCALLAB_DETAILSH;Details
+TP_LOCALLAB_DETAILTHR;Seuil Detail Luminance Chroma (DCT ƒ)
+TP_LOCALLAB_DUPLSPOTNAME;Copier
+TP_LOCALLAB_EDGFRA;Netteté des bords
+TP_LOCALLAB_EDGSHOW;Montre tous les outils
+TP_LOCALLAB_ELI;Ellipse
+TP_LOCALLAB_ENABLE_AFTER_MASK;Utilise Tone Mapping
+TP_LOCALLAB_ENABLE_MASK;Active masque
+TP_LOCALLAB_ENABLE_MASKAFT;Utilise tous les algorithmes Exposition
+TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;Si activé, le Masque utilise les données recupérées après 'Transmission Map' au lieu des données originales
+TP_LOCALLAB_ENH;Amélioré
+TP_LOCALLAB_ENHDEN;Amélioré + chroma réduction bruit
+TP_LOCALLAB_EPSBL;Detail
+TP_LOCALLAB_EQUIL;Normalise Luminance
+TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruit la luminance de telle manière que la moyenne et la variance de l'image traitée soient identiques à celle d'origine
+TP_LOCALLAB_ESTOP;Arrêt des bords
+TP_LOCALLAB_EV_DUPL;Copier vers
+TP_LOCALLAB_EV_NVIS;Cacher
+TP_LOCALLAB_EV_NVIS_ALL;Cacher tout
+TP_LOCALLAB_EV_VIS;Montrer
+TP_LOCALLAB_EV_VIS_ALL;Montrer tout
+TP_LOCALLAB_EXCLUF;Exclure
+TP_LOCALLAB_EXCLUF_TOOLTIP;Peut être utilsé pour exclure une partie des données - agir sur Etendue pour prendre en compte plus de couleurs.\n Vous pouvez utiliser tous les réglages pour ce type de RT-spot.
+TP_LOCALLAB_EXCLUTYPE;Spot méthode
+TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Spot Normal utilise les données récursives.\n\nSpot exclusion réinitialise les données d'origine.\nPeut être utilsé pour annuler totalement ou partiellement une action précédente ou pour réaliser un mode inverse
+TP_LOCALLAB_EXECLU;Spot Exclusion
+TP_LOCALLAB_EXNORM;Spot Normal
+TP_LOCALLAB_EXPCBDL_TOOLTIP;Peut être utilisé pour retirer les marques sur le capteur ou la lentille.
+TP_LOCALLAB_EXPCHROMA;Chroma compensation
+TP_LOCALLAB_EXPCHROMA_TOOLTIP;Seulement en association avec compensation d'exposition et PDE Ipol.\nEvite la desaturation des couleurs
+TP_LOCALLAB_EXPCOLOR_TOOLTIP;Ajuste les couleurs, la luminosité, le contrast et corrige les petits défauts tels que teux-rouges, poussières sur le capteur, etc.
+TP_LOCALLAB_EXPCOMP;Compensation d'exposition ƒ
+TP_LOCALLAB_EXPCOMPINV;Compensation d'exposition
+TP_LOCALLAB_EXPCOMP_TOOLTIP;Pour les portraits et les images à faible gradient, vous pouvez changer "Détection de forme" dans "Réglages":\n\nAugmentez 'Seuil ΔE Etendue'\nRéduire 'ΔE affaiblissement'\nAugmenter 'Balance ΔE ab-L'
+TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;Voir la documentation de ondelettes niveaux.\nCependant il y a des différences: plus d'outils et plus proches des détails .\nEx: Tone mapping pour ondelettes.
+TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Evitez les spots trop petits(< 32x32 pixels).\nUtilisez de faibles valeurs de transition et de hautes valeurs de transition affaiblissement et d'Etendue pour simuler un petit RT-spot et s'adapter aux défauts.\nUtimiser si nécessaire le module 'Clarté & Maqsue netteté' et 'Fusion d'images' en ajustant 'Rayon adoucir' pour réduire les artéfacts.
+TP_LOCALLAB_EXPCURV;Courbes
+TP_LOCALLAB_EXPGRAD;Filtre gradué
+TP_LOCALLAB_EXPGRADCOL_TOOLTIP;Un filtre gardué est disponible dans Couleur et lumière (luminance, chrominance & teinte gradients, et "Fusion fichier") Exposure (luminance grad.), Exposition Masque(luminance grad.), Ombres/lumières (luminance grad.), Vibrance (luminance, chrominance & teinte gradients), Local contrast & ondelettes pyramide (local contrast grad.).\nAdoucissement de gradient est dans "Réglages".
+TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Balance l'action entre l'iamge originale image et la transformée de Laplace.
+TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Applique un gamma avant et après la transformée de Laplace
+TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Ajoute une exposition linéaire avant l'application de la transformée de Laplace
+TP_LOCALLAB_EXPLAP_TOOLTIP;Plus vous agissez sur ce curseur de seuil, plus grande sera l'action de reduire le contraste.
+TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Autorise de nombreuses possibilités de fusionner les images (comme les calques dans Photosshop) : difference, multiply, soft light, overlay...avec opacité...\nOriginale Image : fusionne le RT-spot en cours avec Originale.\nSpot Précédent : fusionne le RT-spot en cours avec le précédent - si il n'y a qu'un spot précédent = original.\nArrière plan : fusionne le RT-spot en cours avec la couleur et la luminance de l'arrière plan (moins de possibilités)
+TP_LOCALLAB_EXPMETHOD_TOOLTIP;Standard : utilise un algorithme similaire à Exposure principal mais en L*a*b* et en prenant en compte le deltaE.\n\nCompression dynamique et atténuateur de contraste : utilise un autre algorithme aussi avec deltaE et avec l'équation de Poisson pour résoudre le Laplacien dans l'espace de Fourier.\nAtténuateur, Compression dynamqiue et Standard peuvent être combinés.\nFFTW La transformée de Fourier est optimisée en taille pour réduire les temps de traitement.\nRéduit les artéfacts et le bruit.
+TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Applique un median avant la transformée de Laplace pour éviter les artéfacts (bruit).\nVous pouvez aussi utiliser l'outil "Réduction du bruit".
+TP_LOCALLAB_EXPOSE;Compression dynamique & Exposition
+TP_LOCALLAB_EXPOSURE_TOOLTIP;Modifie l'exposition dans l'espace L*a*b* en utilisant un Laplacien et les algorithmes PDE en prenant en compte dE, minimise les artéfacts.
+TP_LOCALLAB_EXPRETITOOLS;Outils Retinex avancés
+TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUtiliser de basses valeurs de transition et de hautes valeurs de transition affaiblissement et Etendue pour simuler un petit RT-spot.
+TP_LOCALLAB_EXPTOOL;Outils exposition
+TP_LOCALLAB_EXPTRC;Courbe de réponse Tonale - TRC
+TP_LOCALLAB_EXP_TOOLNAME;Compression Dynamique & Exposition- 10
+TP_LOCALLAB_FATAMOUNT;Quantité
+TP_LOCALLAB_FATANCHOR;Ancre
+TP_LOCALLAB_FATANCHORA;Décalage
+TP_LOCALLAB_FATDETAIL;Detail
+TP_LOCALLAB_FATFRA;Compression Dynamique ƒ
+TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal - utilise Fattal Tone mapping algorithme.
+TP_LOCALLAB_FATLEVEL;Sigma
+TP_LOCALLAB_FATRES;Quantité de Residual Image
+TP_LOCALLAB_FATSHFRA;Compression Dynamique Masque ƒ
+TP_LOCALLAB_FEATH_TOOLTIP;Largeur du Gradient en porcentage de la diagonale du Spot\nUtilisé par tous les Filtres Gradués dans tous les outils.\nPas d'action si les filtres gradués ne sont pas utilisés.
+TP_LOCALLAB_FEATVALUE;Adoucissement gradient (Filtres Gradués)
+TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ
+TP_LOCALLAB_FFTMASK_TOOLTIP;Utilise une transformée de Fourier pour une meilleure qualité (accroit le temps de traitement et le besoin en mémoire)
+TP_LOCALLAB_FFTW;ƒ - Utilise Fast Fourier Transform
+TP_LOCALLAB_FFTW2;ƒ - Utilise Fast Fourier Transform (TIF, JPG,..)
+TP_LOCALLAB_FFTWBLUR;ƒ - Utilise toujours Fast Fourier Transform
+TP_LOCALLAB_FULLIMAGE;Calcule les valeurs Noir Ev - Blanc Ev - sur l'image entière
+TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calcule les valeurs Ev sur l'image entière.
+TP_LOCALLAB_GAM;Gamma
+TP_LOCALLAB_GAMFRA;Courbe Réponse Tonale (TRC)
+TP_LOCALLAB_GAMM;Gamma
+TP_LOCALLAB_GAMMASKCOL;Gamma
+TP_LOCALLAB_GAMMASK_TOOLTIP;Gamma et Pente (Slope) autorise une transformation du masque en douceur et sans artefacts en modifiant progressivement "L" pour éviter les discontinuité.
+TP_LOCALLAB_GAMSH;Gamma
+TP_LOCALLAB_GRADANG;Angle du Gradient
+TP_LOCALLAB_GRADANG_TOOLTIP;Angle de Rotation en degrés : -180 0 +180
+TP_LOCALLAB_GRADFRA;Filtre gradué Masque
+TP_LOCALLAB_GRADGEN_TOOLTIP;Filtre Gradué est fourni avec Couleur et Lumière & Fusion fichier, Exposition & masque, Shadows Highlight, Vibrance, Encoding log.\n\nVibrance, Couleur et Lumière & Fusion fichier, sont fournis avec GF luminance, chrominance, teinte.\nAdoucissement est situé dans "réglages".
+TP_LOCALLAB_GRADLOGFRA;Filtre Gradué Luminance
+TP_LOCALLAB_GRADSTR;Force du Gradient
+TP_LOCALLAB_GRADSTRAB_TOOLTIP;Filtre chroma force
+TP_LOCALLAB_GRADSTRCHRO;Force Gradient Chrominance
+TP_LOCALLAB_GRADSTRHUE;Force Gradient Teinte
+TP_LOCALLAB_GRADSTRHUE2;Force Gradient Teinte
+TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Filttre Teinte force
+TP_LOCALLAB_GRADSTRLUM;Force Gradient Luminance
+TP_LOCALLAB_GRADSTR_TOOLTIP;Force Filtre en Ev
+TP_LOCALLAB_GRAINFRA;Film Grain 1:1
+TP_LOCALLAB_GRAIN_TOOLTIP;Ajoute du grain pour simuler un film
+TP_LOCALLAB_GRALWFRA;Filtre Gradué Local contraste
+TP_LOCALLAB_GRIDFRAME_TOOLTIP;Vous pouvez utiliser cet outil comme une brosse. Utiliser un petit Spot et adaptez transition et transition affaiblissement\nSeulement en mode NORMAL et éventuellement Teinte, Saturation, Couleur, Luminosité sont concernés par Fusion arrire plan (ΔE)
+TP_LOCALLAB_GRIDONE;Virage partiel
+TP_LOCALLAB_GRIDTWO;Direct
+TP_LOCALLAB_GRIDMETH_TOOLTIP;Virage partiel: la luminance est prise en compte quand varie la chroma -Equivalent de H=f(H) si le "point blanc" sur la grille the grid est à zéro et vous faites varier le "point noir" -Equivalent de "Virage partiel" si vous faites varier les 2 points.\n\nDirect: agit directement sur la chroma
+TP_LOCALLAB_GUIDBL;Rayon adoucir
+TP_LOCALLAB_GUIDFILTER;Rayon Filtre Guidé
+TP_LOCALLAB_GUIDFILTER_TOOLTIP;Adapter cette valeur en fonction des images - peut réduire ou accroître les artéfacts.
+TP_LOCALLAB_GUIDBL_TOOLTIP;Applique un filtre guidé avec un rayon donné, pour réduire les artefacts ou flouter l'image
+TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Force du filtre guidé
+TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Détail - agit sur la répartition du filtre guidé, les valeurs négatives simulent un flou gaussien
+TP_LOCALLAB_HHMASK_TOOLTIP;Ajustements fin de la teinte par exemple pour la peau.
+TP_LOCALLAB_HIGHMASKCOL;Hautes lumières masque
+TP_LOCALLAB_HLH;Courbes H
+TP_LOCALLAB_IND;Independant (souris)
+TP_LOCALLAB_INDSL;Independant (souris + curseurs)
+TP_LOCALLAB_INVERS;Inverse
+TP_LOCALLAB_INVERS_TOOLTIP;Si sélectionné (inverse) moins de possibilités.\n\nAlternative\nPremier Spot:\n image entière - delimiteurs en dehors de la prévisualisation\n RT-spot forme sélection : rectangle. Transition 100\n\nDeuxième spot : Spot Exclusion
+TP_LOCALLAB_INVBL_TOOLTIP;Alternative\nPremier Spot:\n image entière - delimiteurs en dehors de la prévisualisation\n RT-spot forme sélection : rectangle. Transition 100\n\nDeuxième spot : Spot Exclusion
+TP_LOCALLAB_ISOGR;Plus gros (ISO)
+TP_LOCALLAB_LABBLURM;Masque Flouter
+TP_LOCALLAB_LABEL;Ajustements Locaux
+TP_LOCALLAB_LABGRID;Grille correction couleurs
+TP_LOCALLAB_LABGRIDMERG;Arrière plan
+TP_LOCALLAB_LABGRID_VALUES;Haut(a)=%1 Haut(b)=%2\nBas(a)=%3 Bas(b)=%4
+TP_LOCALLAB_LABSTRUM;Masque Structure
+TP_LOCALLAB_LAPLACC;ΔØ Masque Laplacien résoud PDE
+TP_LOCALLAB_LAPLACE;Laplacien seuil ΔE
+TP_LOCALLAB_LAPLACEXP;Laplacien seuil
+TP_LOCALLAB_LAPMASKCOL;Laplacien seuil
+TP_LOCALLAB_LAPRAD_TOOLTIP;Eviter d'utiliser Radius and Laplace Seuil en même temps.\nLaplacien seuil reduit le contraste, artéfacts, adoucit le résultat.
+TP_LOCALLAB_LAPRAD1_TOOLTIP;Eviter d'utiliser Radius and Laplace Seuil en même temps.\nTransforme le masque pour éliminer les valeurs inférieures au seuil.\nReduit les artefacts et le bruit, et permet une modification du contraste local.
+TP_LOCALLAB_LAP_MASK_TOOLTIP;Résoud PDE (Equation aux dérivées partielles) pour tous les masques Laplacien.\nSi activé Laplacien masque seuil reduit les artéfacts et adoucit les résultats.\nSi désactivé réponse linaire.
+TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT améliore la qualité et autorise de grands rayons, mais accroît les temps de traitement.\nCe temps dépends de la surface devant être traitée.\nA utiliser de préférences pour de grands rayons.\n\nLes Dimensions peuvent être réduites de quelques pixels pour optimiser FFTW.\nCette optimisation peut réduire le temps de traitement d'un facteur de 1.5 à 10.\n
+TP_LOCALLAB_LC_TOOLNAME;Constraste Local & Ondelettes - 7
+TP_LOCALLAB_LEVELBLUR;Maximum Flouter
+TP_LOCALLAB_LEVELLOCCONTRAST_TOOLTIP;En abscisse le contraste local (proche du concept de luminance). En ordonnée, amplification ou reduction du contraste local.
+TP_LOCALLAB_LEVELWAV;Ψ Ondelettes Niveaux
+TP_LOCALLAB_LEVELWAV_TOOLTIP;Le niveau est automatiquement adapté à la taille du spot et de la prévisualisation.\nDu niveau 9 taille max 512 jusqu'au niveau 1 taille max = 4
+TP_LOCALLAB_LEVFRA;Niveaux
+TP_LOCALLAB_LIGHTNESS;Luminosité
+TP_LOCALLAB_LIGHTN_TOOLTIP;En mode inverse: selection = -100 force la luminance à zero
+TP_LOCALLAB_LIGHTRETI;Luminosité
+TP_LOCALLAB_LINEAR;Linéarité
+TP_LOCALLAB_LIST_NAME;Ajoute un outil au spot courant...
+TP_LOCALLAB_LIST_TOOLTIP;Vous pouvez choisir 3 niveaux de complexité pour chaque outil: Basic, Normal & Avancé.\nLe réglage par défaut est Basic mais il peut être changé dans Préférences.\nVous pouvez aussi changer ce niveau pour chaque outil en cours.
+TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Donne priorité à l'action sur les tons moyens et hautes lumières en choisissant les niveaux concernés d'ondelettes
+TP_LOCALLAB_LMASK_LL_TOOLTIP;Vous permet de modifier librement le contraste du masque. Peut amener de artefacts.
+TP_LOCALLAB_LOCCONT;Masque Flou
+TP_LOCALLAB_LOC_CONTRAST;Contraste Local & Ondelettes
+TP_LOCALLAB_LOC_CONTRASTPYR;Ψ Pyramide 1:
+TP_LOCALLAB_LOC_CONTRASTPYR2;Ψ Pyramide 2:
+TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contr. par niveaux- Tone Mapping - Cont.Dir.
+TP_LOCALLAB_LOC_CONTRASTPYRLAB; Filtre Gradué - Netteté bords - Flouter
+TP_LOCALLAB_LOC_RESIDPYR;Image Residuelle
+TP_LOCALLAB_LOG;Codage log
+TP_LOCALLAB_LOGAUTO;Automatique
+TP_LOCALLAB_LOGAUTO_TOOLTIP;Presser ce bouton va amner une évaluation an evaluation de l'amplitude dynamique et du point gris "source" (Si "Automatique" Source gris activé).\nPour être autorisé à retoucher les valeurs automatiques, presser le bouton à nouveau
+TP_LOCALLAB_LOGBASE_TOOLTIP;Défaut = 2.\nValeurs inférieures à 2 réduisent l'action de l'algorithme, les ombres sont plus sombres, les hautes lumières plus brillantes.\nValeurs supérieures à 2 changent l'action de l'algorithme, les ombres sont plus grises, les hautes lumières lavées
+TP_LOCALLAB_LOGBLACKWHEV_TOOLTIP;Valeurs estimées de la plage Dynamique - Noir Ev et Blanc Ev
+TP_LOCALLAB_LOGENCOD_TOOLTIP;Autorise 'Tone Mapping' avec codage Logarithmique (ACES).\nUtile pour images ous-exposées, ou avec une plage dynamique élévée.\n\nDeux étapes dans le processus : 1) Calculer Plage Dynamique 2) Adaptation par utilisateur
+TP_LOCALLAB_LOGFRA;Point gris source
+TP_LOCALLAB_LOGFRAME_TOOLTIP;Calcule ou utilise le niveau d'Exposition de l'image tôt dans le processus:\n Noir Ev, Blanc Ev et Point gris source.\n Prend en compte la compensation d'exposition principale.
+TP_LOCALLAB_LOGLIN;Logarithme mode
+TP_LOCALLAB_LOGPFRA;Niveaux d'Exposition relatif
+TP_LOCALLAB_LOGSRCGREY_TOOLTIP;Estime la valeur du point gris de l'image, tôt dans le processus
+TP_LOCALLAB_LOGTARGGREY_TOOLTIP;Vous pouvez changer cette valeur pour l'adapter à votre goût.
+TP_LOCALLAB_LOG_TOOLNAME;Codage log - 0
+TP_LOCALLAB_LUM;Courbes LL - CC
+TP_LOCALLAB_LUMADARKEST;Plus Sombre
+TP_LOCALLAB_LUMASK;Maqsue Luminance arrière plan
+TP_LOCALLAB_LUMASK_TOOLTIP;Ajuste le gris de l'arrière plan du masque dans Montrer Masque (Masque et modifications)
+TP_LOCALLAB_LUMAWHITESEST;Plus clair
+TP_LOCALLAB_LUMONLY;Luminance seulement
+TP_LOCALLAB_MASKCOM;Masque couleur Commun
+TP_LOCALLAB_MASKCOM_TOOLTIP;Ces masques travaillent comme les autres outils, ils prennet en compte Etendue.\nIls sont différents des autres masques qui complètent un outil (Couleur et Lumière, Exposition...)
+TP_LOCALLAB_MASFRAME;Masque et Fusion
+TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTake into account deltaE image to avoid retouching the selection area when sliders gamma mask, slope mask, chroma mask and curves contrast , levels contrasts, and mask blur, structure(if enabled tool) are used.\nDisabled in Inverse
+TP_LOCALLAB_MASK;Masque
+TP_LOCALLAB_MASK2;Courbe de Contraste
+TP_LOCALLAB_MASKCOL;Masque Courbes
+TP_LOCALLAB_MASKCURVE_TOOLTIP;Si la courbe est au sommet, le masque est compétement noir aucune transformation n'est réalisée par le masque sur l'image.\nQuand vous descendez la courbe, progressivement le masque va se colorer et s'éclaicir, l'image change de plus en plus.\n\nIl est recommendé (pas obligatoire) de positionner le sommet des courbes curves sur la ligne de transition grise qui représnte les références (chroma, luma, couleur).
+TP_LOCALLAB_MASKH;Courbe teinte
+TP_LOCALLAB_MASK_TOOLTIP;Vous pouvez activer plusieurs masques pour un simple outil, ceci nécessite d'activer un autre outil (mais sans utilser l'outil : curseurs à 0,...)où est le masque que vous souhaitez activer.\n\nVous pouvez aussi dupliquer le RT-spot et le placer juste à côté de l'autre,les variations de références autorisent un travail fin sur les images.
+TP_LOCALLAB_MED;Medium
+TP_LOCALLAB_MEDIAN;Median Bas
+TP_LOCALLAB_MEDIAN_TOOLTIP;Choisir un median 3x3 à 9x9: plus les valeurs sont élévées, plus la réduction du bruit ou le flou seront marqués
+TP_LOCALLAB_MEDIANITER_TOOLTIP;Nombre d'applications successives du median
+TP_LOCALLAB_MEDNONE;Rien
+TP_LOCALLAB_MERCOL;Couleur
+TP_LOCALLAB_MERDCOL;Fusion arrière plan (ΔE)
+TP_LOCALLAB_MERELE;Eclaicit seulement
+TP_LOCALLAB_MERFIV;Addition
+TP_LOCALLAB_MERFOR;Couleur esquiver
+TP_LOCALLAB_MERFOU;Multiplier
+TP_LOCALLAB_MERGE1COLFRA;Fusion avec Original ou Précédent ou arrière plan
+TP_LOCALLAB_MERGECOLFRA;Masque: LCH & Structure
+TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Vous permet de créer des masques basés sur les 3 courbes LCH et/ou un algorithm de détection de structure
+TP_LOCALLAB_MERGEFIV;Previous Spot(Mask 7) + Mask LCH
+TP_LOCALLAB_MERGEFOU;Previous Spot(Mask 7)
+TP_LOCALLAB_MERGEMER_TOOLTIP;Prend en compte ΔE pour fusionner les fichiers (équivalent de Etendue pour cet usage)
+TP_LOCALLAB_MERGENONE;Rien
+TP_LOCALLAB_MERGEONE;Short Curves 'L' Mask
+TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacité fusion % Spot courant avec original ou Spot précédent.\nContraste seuil : ajuste le résulat en fonction du contraste original
+TP_LOCALLAB_MERGETHR;Original(Mask 7) + Mask LCH
+TP_LOCALLAB_MERGETWO;Original(Mask 7)
+TP_LOCALLAB_MERGETYPE;Fusion image et masque
+TP_LOCALLAB_MERGETYPE_TOOLTIP;Rien, use all mask in LCH mode.\nShort curves 'L' mask, use a short circuit for mask 2, 3, 4, 6, 7.\nOriginal mask 8, blend current image with original
+TP_LOCALLAB_MERHEI;Overlay
+TP_LOCALLAB_MERHUE;Teite
+TP_LOCALLAB_MERLUCOL;Luminance
+TP_LOCALLAB_MERLUM;Luminosité
+TP_LOCALLAB_MERNIN;Ecran
+TP_LOCALLAB_MERONE;Normal
+TP_LOCALLAB_MERSAT;Saturation
+TP_LOCALLAB_MERSEV;Soft Light (legacy)
+TP_LOCALLAB_MERSEV0;Soft Light Illusion
+TP_LOCALLAB_MERSEV1;Soft Light W3C
+TP_LOCALLAB_MERSEV2;Lumière dure
+TP_LOCALLAB_MERSIX;Divise
+TP_LOCALLAB_MERTEN;Assombrit seulement
+TP_LOCALLAB_MERTHI;Couleur Brûlé
+TP_LOCALLAB_MERTHR;Difference
+TP_LOCALLAB_MERTWE;Exclusion
+TP_LOCALLAB_MERTWO;Soustrait
+TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts.
+TP_LOCALLAB_MLABEL;Récupère les données Min=%1 Max=%2 (Clip - décalage)
+TP_LOCALLAB_MLABEL_TOOLTIP;'Doit être' près de min=0 max=32768 (log mode) mais d'autres valeurs sont possibles.\nVous pouvez agir sur les données récupérées (CLIP) et décalage pour normaliser.\n\nRécupère les données image sans mélange.
+TP_LOCALLAB_MODE_EXPERT;Avancé
+TP_LOCALLAB_MODE_NORMAL;Standard
+TP_LOCALLAB_MRFIV;Arrière plan
+TP_LOCALLAB_MRFOU;Spot précédent
+TP_LOCALLAB_MRONE;Rien
+TP_LOCALLAB_MRTHR;Image Originale
+TP_LOCALLAB_MRTWO;Short Curves 'L' Mask
+TP_LOCALLAB_MULTIPL_TOOLTIP;Autorise la retouche des tons sur une large plage : -18EV +4EV. Le remier curseur agit sur -18EV and -6EV. Le dernier curseur agit sur les tons au-dessus de 4EV
+TP_LOCALLAB_NEIGH;Rayon
+TP_LOCALLAB_NOISE_TOOLTIP;Ajoute du bruit de luminance
+TP_LOCALLAB_NOISECHROCOARSE;Chroma gros (Ond)
+TP_LOCALLAB_NOISECHROC_TOOLTIP;Si supérieur à zéro, algorithme haute qualité est activé.\nGros est sélectionné si curseur >=0.2
+TP_LOCALLAB_NOISECHRODETAIL;Récupération des détails Chroma (DCT ƒ)
+TP_LOCALLAB_NOISECHROFINE;Chroma fin (Ond)
+TP_LOCALLAB_NOISEDETAIL_TOOLTIP;Désactivé si curseur = 100
+TP_LOCALLAB_NOISELEQUAL;Egalisateurs balnc-noir
+TP_LOCALLAB_NOISELUMCOARSE;Luminance gros (ond)
+TP_LOCALLAB_NOISELUMDETAIL;Récupération Luminance fin(DCT ƒ)
+TP_LOCALLAB_NOISELUMFINE;Luminance fin 1 (ond)
+TP_LOCALLAB_NOISELUMFINETWO;Luminance fin 2 (ond)
+TP_LOCALLAB_NOISELUMFINEZERO;Luminance fin 0 (ond)
+TP_LOCALLAB_NOISEMETH;Réduction du bruit
+TP_LOCALLAB_NONENOISE;Rien
+TP_LOCALLAB_OFFS;Décalage
+TP_LOCALLAB_OFFSETWAV;Décalage
+TP_LOCALLAB_OPACOL;Opacité
+TP_LOCALLAB_ORIGLC;Fusion seulement avec image originale
+TP_LOCALLAB_ORRETILAP_TOOLTIP;Agit sur un deuxième seuil Laplacien, pour prendre en compte ΔE pour différencier l'action nottament avec l'arrière plan (différent de Etendue)
+TP_LOCALLAB_ORRETISTREN_TOOLTIP;Aagit sur un seuil Laplacien, plus grande est l'action, plus les différences de contraste seront réduites
+TP_LOCALLAB_PASTELS2;Vibrance
+TP_LOCALLAB_PDE;Atténuation de Contraste - Compression dynamique
+TP_LOCALLAB_PDEFRA;Contraste atténuation ƒ
+TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL - algorithme personnel adapté de IPOL à Rawtherapee: conduit à des résultats très variés et a besoin de différents réglages que Standard (Noir négatif, gamma < 1,...)\nPeut être utils pour des iamges sous-exposées ou avec une étendue dynamique importante.\n
+TP_LOCALLAB_PREVIEW;Prévisualisation ΔE
+TP_LOCALLAB_PREVHIDE;Cacher tous les réglages
+TP_LOCALLAB_PREVSHOW;Montrer tous les réglages
+TP_LOCALLAB_PROXI;ΔE Affaiblissement
+TP_LOCALLAB_QUALCURV_METHOD;Types de Courbes
+TP_LOCALLAB_QUAL_METHOD;Qualité globale
+TP_LOCALLAB_RADIUS;Rayon
+TP_LOCALLAB_RADIUS_TOOLTIP;Above Radius 30 Use Fast Fourier Transform
+TP_LOCALLAB_RADMASKCOL;Rayon adoucir
+TP_LOCALLAB_RECT;Rectangle
+TP_LOCALLAB_RECURS;Réferences Récursives
+TP_LOCALLAB_RECURS_TOOLTIP;Recalcule les références pour teinte, luma, chroma après chaque module et après chaque RT-spot.\nAussi utile pour le travail avec les masques.
+TP_LOCALLAB_REFLABEL;Ref. (0..1) Chroma=%1 Luma=%2 teinte=%3
+TP_LOCALLAB_REN_DIALOG_LAB;Entrer le nouveau nom de Spot
+TP_LOCALLAB_REN_DIALOG_NAME;Renomme le Controle Spot
+TP_LOCALLAB_RESETSHOW;Annuler Montrer Toutes les Modifications
+TP_LOCALLAB_RESID;Image Résiduelle
+TP_LOCALLAB_RESIDBLUR;Flouter Image Résiduelle
+TP_LOCALLAB_RESIDCHRO;Image Résiduelle Chroma
+TP_LOCALLAB_RESIDCOMP;Image Résiduelle Compression
+TP_LOCALLAB_RESIDCONT;Image Résiduelle Contraste
+TP_LOCALLAB_RESIDHI;Hautes lumières
+TP_LOCALLAB_RESIDHITHR;Hautes lumières seuil
+TP_LOCALLAB_RESIDSHA;Ombres
+TP_LOCALLAB_RESIDSHATHR;Ombres seuil
+TP_LOCALLAB_RETI;De-brume - Retinex Fort contraste
+TP_LOCALLAB_RETIFRA;Retinex
+TP_LOCALLAB_RETIM;Original Retinex
+TP_LOCALLAB_RETITOOLFRA;Retinex Outils
+TP_LOCALLAB_RETIFRAME_TOOLTIP; L'utilisation de Retinex peut être bénéfique pour le traitement des images: \ nqui sont floues, brumeuses ou ayant un voile de brouillard (en complément de Dehaz). \ Navec d'importants écarts de luminance. \ N où l'utilisateur recherche des effets spéciaux (cartographie des tons…)
+TP_LOCALLAB_RETI_FFTW_TOOLTIP;FFT améliore la qualité et autorise de grands rayons, mais accroît les temps de traitement.\nCe temps dépends de la surface traitée\nLe temps de traitements dépend de "scale" (échelle) (soyez prudent avec les hautes valeurs ).\nA utiliser de préférence avec de grand rayons.\n\nLes Dimensions peuvent être réduites de quelques pixels pour optimiser FFTW.\nCette optimisation peut réduire le temps de traitement d'un facteur de 1.5 à 10.\nOptimisation pas utilsée en prévisualisation
+TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Have no effect when the value "Lightness = 1" or "Darkness =2" is chosen.\nIn other cases, the last step of "Multiple scale Retinex" is applied an algorithm close to "local contrast", these 2 cursors, associated with "Strength" will allow to play upstream on the local contrast.
+TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Play on internal parameters to optimize response.\nLook at the "restored datas" indicators "near" min=0 and max=32768 (log mode), but others values are possible.
+TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm allows differenciation for haze or normal.\nLogarithm brings more contrast but will generate more halo.
+TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;Adapt these values according to images - if misty images and depending on whether you want to act on the front or the background
+TP_LOCALLAB_RETI_SCALE_TOOLTIP;If scale=1, retinex behaves like local contrast with many more possibilities.\nThe greater the scale, the more intense the recursive action, the longer the calculation times
+TP_LOCALLAB_RET_TOOLNAME;De-brume & Retinex - 9
+TP_LOCALLAB_REWEI;Repondération iterations
+TP_LOCALLAB_RGB;RGB Courbe de tonalité
+TP_LOCALLAB_ROW_NVIS;Pas visible
+TP_LOCALLAB_ROW_VIS;Visible
+TP_LOCALLAB_SATUR;Saturation
+TP_LOCALLAB_SAVREST;Sauve - Récupère Image Courante
+TP_LOCALLAB_SCALEGR;Echelle
+TP_LOCALLAB_SCALERETI;Echelle
+TP_LOCALLAB_SCALTM;Echelle
+TP_LOCALLAB_SCOPEMASK;Etendue Masque ΔE Image
+TP_LOCALLAB_SCOPEMASK_TOOLTIP;Actif si Masque DeltaE Image est activé.\nLes faibles valeurs évitent de retoucher l'aire sélectionnée
+TP_LOCALLAB_SENSI;Etendue
+TP_LOCALLAB_SENSIBN;Etendue
+TP_LOCALLAB_SENSICB;Etendue
+TP_LOCALLAB_SENSIDEN;Etendue
+TP_LOCALLAB_SENSIEXCLU;Etendue
+TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Ajuste les couleurs pour les inclure dans exclusion!
+TP_LOCALLAB_SENSIH;Etendue
+TP_LOCALLAB_SENSIH_TOOLTIP;Ajuste Etendue de l'action:\nLes petites valeurs limitent l'action aux couleurs très similaires à celles sous le centre du spot.\nHautes valeurs laissent l'outil agir sur une large plage de couleurs.
+TP_LOCALLAB_SENSILOG;Etendue
+TP_LOCALLAB_SENSIS;Etendue
+TP_LOCALLAB_SENSI_TOOLTIP;Ajuste Etendue de l'action:\nLes petites valeurs limitent l'action aux couleurs très similaires à celles sous le centre du spot.\nHautes valeurs laissent l'outil agir sur une large plage de couleurs.
+TP_LOCALLAB_SENSIMASK_TOOLTIP;Ajuste Etendue pour ce masque commun.\nAgit sur l'écart entre l'image originale et le masque.\nLes références (luma, chroma, teinte) sont celles du centre du RT-spot\n\nVous pouvez aussi agir sur le deltaE interne au masque avec 'Etendue Masque deltaE image' dans 'Réglages'
+TP_LOCALLAB_SETTINGS;Réglages
+TP_LOCALLAB_SH1;Ombres Lumières
+TP_LOCALLAB_SH2;Egaliseur
+TP_LOCALLAB_SHADEX;Ombres
+TP_LOCALLAB_SHADEXCOMP;Compression ombres & profondeur tonale
+TP_LOCALLAB_SHADHIGH;Ombres/Lumières - Egaliseur tonal
+TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Peut être utilisé - ou en complement - du module Exposition dans les cas difficiles.\nUtiliser réduction du bruit Denoise peut être nécessaire : éclaicir les ombres.\n\nPeut être utilisé comme un filtre gradué (augmenter Etendue)
+TP_LOCALLAB_SHAMASKCOL;Ombres
+TP_LOCALLAB_SHADMASK_TOOLTIP;Relève les ombres du masque de la même manière que l'algorithme "ombres/lumières"
+TP_LOCALLAB_SHADHMASK_TOOLTIP;Abaisse les hautes lumières du masque de la même manière que l'algorithme "ombres/lumières"
+TP_LOCALLAB_SHAPETYPE;Forme aire RT-spot
+TP_LOCALLAB_SHAPE_TOOLTIP;Ellipse est le mode normal.\nRectangle peut être utilé dans certains cas, par exemple pour travailler en image complète en conjonction avec les délimiteurs en dehors de la prévisualisation, transition = 100.\n\nPolygone - Beziers sont en attente de GUI...
+TP_LOCALLAB_SHARAMOUNT;Quantité
+TP_LOCALLAB_SHARBLUR;Rayon flouter
+TP_LOCALLAB_SHARDAMPING;Amortissement
+TP_LOCALLAB_SHARFRAME;Modifications
+TP_LOCALLAB_SHARITER;Iterations
+TP_LOCALLAB_SHARP;Netteté
+TP_LOCALLAB_SHARP_TOOLNAME;Netteté - 8
+TP_LOCALLAB_SHARRADIUS;Rayon
+TP_LOCALLAB_SHORTC;Short Curves 'L' Mask
+TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7
+TP_LOCALLAB_SHOWC;Masque et modifications
+TP_LOCALLAB_SHOWC1;Fusion fichier
+TP_LOCALLAB_SHOWCB;Masque et modifications
+TP_LOCALLAB_SHOWDCT;Montrer processus Fourier ƒ
+TP_LOCALLAB_SHOWE;Masque et modifications
+TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct)
+TP_LOCALLAB_SHOWLAPLACE;∆ Laplacien (premier)
+TP_LOCALLAB_SHOWLC;Masque et modifications
+TP_LOCALLAB_SHOWMASK;Montrer masque
+TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Affiche masque modifications.\nAttention, vous ne pouvez voir qu'un seul masque à la fois.\n\nNote: Utilisation du Masque est avant l'algorihtme de détection de forme.
+TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Montre le processus Fourier:\nMontre les différentes étapes du processus.\nLaplace - construit la dérivée seconde the second dérivée associée au seuil (Premiére étape).\nFourier -montre la transformée de Laplace avec DCT.\nPoisson - montre la solution de Poisson DCE.\nNormalise - montre le résultat sans normalisation de la luminance.
+TP_LOCALLAB_SHOWMASKTYP1;Flouter & Bruit
+TP_LOCALLAB_SHOWMASKTYP2;Réduction du bruit
+TP_LOCALLAB_SHOWMASKTYP3;Flouter & Bruit + De-bruite
+TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Masque et modifications peuvent être choisis.\nFlouter et bruit: dans ce cas il n'est pas utilisé pour 'Réduction du bruit'.\nRéduction du bruit : dans ce cas il n'est pas utilisé pour 'flouter et bruit'.\n\nFlouter et bruit + Réduction du bruit : le masque est partagé, faire attention à 'montrer modifications' et 'Etendue'
+TP_LOCALLAB_SHOWMNONE;Montrer image modifiée
+TP_LOCALLAB_SHOWMODIF;Montrer modifications sans masque
+TP_LOCALLAB_SHOWMODIFMASK;Montrer modifications avec masque
+TP_LOCALLAB_SHOWNORMAL;Normalise luminance (non)
+TP_LOCALLAB_SHOWPLUS;Masque et modifications - Adoucir-flouter & De-bruite
+TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ)
+TP_LOCALLAB_SHOWR;Masque et modifications
+TP_LOCALLAB_SHOWREF;Prévisualisation ΔE
+TP_LOCALLAB_SHOWS;Masque et modifications
+TP_LOCALLAB_SHOWSTRUC;Montrer Spot structure (avancé)
+TP_LOCALLAB_SHOWSTRUCEX;Montrer Spot structure (avancé)
+TP_LOCALLAB_SHOWT;Masque et modifications
+TP_LOCALLAB_SHOWVI;Masque et modifications
+TP_LOCALLAB_SHRESFRA;Ombres/Lumières
+TP_LOCALLAB_SHTRC_TOOLTIP;Modifie les tons de l'image en agissant sur la TRC (Tone Response Curve).\nGamma agit principalement sur les tons lumineux.\nSlope (pente) agit principalement sur les tons sombres.
+TP_LOCALLAB_SH_TOOLNAME;Ombres/lumières & Egaliseur tonal - 5
+TP_LOCALLAB_SIGMAWAV;Atténuation Réponse
+TP_LOCALLAB_SIM;Simple
+TP_LOCALLAB_SLOMASKCOL;Pente (slope)
+TP_LOCALLAB_SLOMASK_TOOLTIP;Gamma et Pente (Slope) autorise une transformation du masque en douceur et sans artefacts en modifiant progressivement "L" pour éviter les discontinuité.
+TP_LOCALLAB_SLOSH;Pente
+TP_LOCALLAB_SOFT;Lumière douce - Original Retinex
+TP_LOCALLAB_SOFTM;Lumière douce (soft light)
+TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Applique un mélange Lumière douce. Effectue une émulation de "dodge and burn" en utilisant l'algorithme original de retinex.
+TP_LOCALLAB_SOFTRADIUSCOL;Rayon adoucir
+TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applique un filtre guidé à l'image de sortie pour réduire les éventuels artefacts.
+TP_LOCALLAB_SOFTRETI;Reduire artefact ΔE
+TP_LOCALLAB_SOFTRETI_TOOLTIP;Prend en compte ΔE pour améliorer Transmission map
+TP_LOCALLAB_SOFT_TOOLNAME;Lumière douce & Original Retinex - 6
+TP_LOCALLAB_SOURCE_GRAY;Valeur
+TP_LOCALLAB_SPECCASE; Cas spécifiques
+TP_LOCALLAB_SPECIAL;Usage Special des courbes RGB
+TP_LOCALLAB_SPECIAL_TOOLTIP;Seulement pour cette courbe RGB, désactive (ou réduit les effecs) de Etendue, masque...par exemple, si vous voulez rendre un effet "négatif".
+TP_LOCALLAB_SPOTNAME;Nouveau Spot
+TP_LOCALLAB_STD;Standard
+TP_LOCALLAB_STR;Force
+TP_LOCALLAB_STRBL;Force
+TP_LOCALLAB_STREN;Compression Force
+TP_LOCALLAB_STRENG;Force
+TP_LOCALLAB_STRENGRID_TOOLTIP;Vous pouvez ajuster l'effet désiré avec "force", mais vous pouvez aussi utiliser la fonction "Etendue" qui permet de délimiter l'action (par exemple, pour isoler une couleur particulière).
+TP_LOCALLAB_STRENGR;Force
+TP_LOCALLAB_STRENGTH;Bruit
+TP_LOCALLAB_STRGRID;Force
+TP_LOCALLAB_STRRETI_TOOLTIP;Si force Retinex < 0.2 seul Dehaze est activé.\nSi force Retinex >= 0.1 Dehaze est en mode luminance.
+TP_LOCALLAB_STRUC;Structure
+TP_LOCALLAB_STRUCCOL;Structure
+TP_LOCALLAB_STRUCCOL1;Spot structure
+TP_LOCALLAB_STRUCT_TOOLTIP;Utilise l'algorithme de Sobel pour prendre en compte la structure dans la détection de forme.\nvous pouvez prévisualiser avec "masque et modifications - Montrer structure spot".\n\nPeut être utilisé avec masques (avancé) structure, flouter, ondelettes pour améliorer la détection de bords.\n\nA besoin de réglages sans-masque pour êtrre activé (luminosité, exposition...)
+TP_LOCALLAB_STRUMASKCOL;Structure force
+TP_LOCALLAB_STRUMASK_TOOLTIP;Génère un masque structure qui va différencier les aplats et reliefs.\nSi structure masque comme outil est activé, ce masque est untilisé en plus des autres outils (gamma, slope, courbe contraste ...)
+TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Un usage modéré de ce curseur est recommandé!
+TP_LOCALLAB_STYPE;Forme méthode
+TP_LOCALLAB_STYPE_TOOLTIP;Vous pouvez choisir entre:\nSymétrique - gauche et droite sont liés, haut et bas sont liés.\nIndépendent - toutes les saisies sont indépendantes.
+TP_LOCALLAB_SYM;Symétrique (souris)
+TP_LOCALLAB_SYMSL;Symétrique (souris + curseurs)
+TP_LOCALLAB_TARGET_GRAY;Point Gris Cible
+TP_LOCALLAB_THRES;Seuil structure
+TP_LOCALLAB_THRESDELTAE;Seuil ΔE-Etendue
+TP_LOCALLAB_THRESRETI;Seuil
+TP_LOCALLAB_THRESWAV;Balance Seuil
+TP_LOCALLAB_TLABEL;TM Datas Min=%1 Max=%2 Mean=%3 Sigma=%4 (Seuil)
+TP_LOCALLAB_TLABEL2;TM Effectif Tm=%1 TM=%2
+TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can act on Threshold to normalize
+TP_LOCALLAB_TM;Compression tonale - Texture
+TP_LOCALLAB_TM_MASK;Utilise transmission map
+TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;Ce paramètre affecte la sensibilité aux bords.\n Plus grand il est, plus la luminosité change peut être considéré comme un bord.\n Si réglé à zéro 'compression tonale' va avoir un effet similaire à masque flou.
+TP_LOCALLAB_TONEMAPGAM_TOOLTIP;Gamma déplace l'action de 'compression tonale' des ombres vers les lumières.
+TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;Dans certains 'compression tonal' peut amener des effets de perspective, et dans de rares cas des halos peuvent apparaître.\n Accroître le nombre d'itérations peut aider à résoudre ces problèmes.
+TP_LOCALLAB_TONEMAP_TOOLTIP;Compression tonal - menu principal doit être désactivé
+TP_LOCALLAB_TONEMASCALE_TOOLTIP;Ce contrôle donne le pouvoir de différencier le contraste "local" et "global".\nPlus il est important, plus un détail sera accentué.
+TP_LOCALLAB_TONE_TOOLNAME;Compression tonale - 4
+TP_LOCALLAB_TOOLCOL;Masque Structure comme outil
+TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Autorise de modifier le masque s'il a été créé
+TP_LOCALLAB_TOOLMASK;Outils du masque
+TP_LOCALLAB_TOOLMASK_TOOLTIP;Génère un masque structure qui va différencier les aplats et reliefs.\nSi structure masque comme outil est activé, ce masque est untilisé en plus des autres outils (gamma, slope, courbe contraste ...)
+TP_LOCALLAB_TRANSIT;Transition - Gradient
+TP_LOCALLAB_TRANSITGRAD;Transition différentiation XY
+TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Change la transition des abscisses vers les ordonnées
+TP_LOCALLAB_TRANSITVALUE;Transition valeur
+TP_LOCALLAB_TRANSITWEAK;Transition affaiblissement (linéaire-log)
+TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Ajuste l'affaiblissement de la transition : change le processus d'affaiblissement - 1 linéaire - 2 parabolique - 3 cubique - ^25.\nPeut être utilisé en conjonction avec de très faibles valeurs de transition pour traiter/réduire les défauts (CBDL, Ondelettes, Couleur et lumière)
+TP_LOCALLAB_TRANSIT_TOOLTIP;Ajuste la progressions de la transition enttre les zones affectées ou non affectées, comme un pourcentage du "rayon"
+TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain
+TP_LOCALLAB_TRANSMISSIONMAP;Transmission map
+TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission en accord à transmission.\nAbscisse: transmission pour les valeurs négatives (min), mean, et les valeurs positives (max).\nOrdonnée: amplification ou réduction.\nVous pouvez agir sur cette courbe pour chnager la Transmission et réduire les artefacts
+TP_LOCALLAB_USEMASK;Utiliser masque
+TP_LOCALLAB_VART;Variance (contraste)
+TP_LOCALLAB_VIBRANCE;Vibrance - Chaud & Froid
+TP_LOCALLAB_VIBRA_TOOLTIP;Ajuste vibrance (Globalement identique à Couleur ajustement).\nAmène l'équivalent d'une balance des blancs en utilisant l'algorithme CIECAM.
+TP_LOCALLAB_VIB_TOOLNAME;Vibrance - Chaud & Froid - 3
+TP_LOCALLAB_SOFT_TOOLNAME;Lumière douce & Original Retinex - 6
+TP_LOCALLAB_BLUR_TOOLNAME;Flouter/Grain & Réduction du bruit - 1
+TP_LOCALLAB_TONE_TOOLNAME;Compression tonale - 4
+TP_LOCALLAB_RET_TOOLNAME;De-brume & Retinex - 9
+TP_LOCALLAB_SHARP_TOOLNAME;Netteté - 8
+TP_LOCALLAB_LC_TOOLNAME;Constraste local & Ondelettes (Défauts) - 7
+TP_LOCALLAB_CBDL_TOOLNAME;Contraste par Niveau détail - 2
+TP_LOCALLAB_LOG_TOOLNAME;Codage log - 0
+TP_LOCALLAB_MASKCOM_TOOLNAME;Masque Commun Couleur - 13
+TP_LOCALLAB_VIS_TOOLTIP;Click pour montrer/cacher le Spot sélectionné.\nCtrl+click pour montrer/cacher tous les Spot.
+TP_LOCALLAB_WAMASKCOL;Ψ Niveau Ondelettes
+TP_LOCALLAB_WARM;Chaud - Froid & Artefacts de couleur
+TP_LOCALLAB_WARM_TOOLTIP;Ce curseur utilise l'algorithme Ciecam et agit comme une Balance des blancs, il prut réchauffer ou refroidir cool la zone concernée.\nIl peut aussi dans certains réduire les artefacts colorés.
+TP_LOCALLAB_WASDEN_TOOLTIP;De-bruite luminance pour les 3 premiers niveaux (fin).\nLa limite droite de la courbe correspond à gros : niveau 3 et au delà.
+TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Contraste faible à élevé de gauche à droite en abscisse\nAugmente ou réduit le contraste en ordonnée.
+TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Contraste faible à élevé de gauche à droite en abscisse\nAugmente ou réduit le contraste en ordonnée.
+TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;L'effet sur le contraste local est maximum pour les valeurs moyennes, et affaibli pour les valeurs faibles ou élevées.\n Le curseur contrôle comment s'effectue les changements pour ces valeurs extêmse.\n Plus la valeur du curseur est élevée, plus grande sera l'étendue qui recevra le maximum d'ajustements, ainsi que le risque de voir apparaître des artefacts.\n .Plus faible sera cette valeur, plus les différences de contraste seront atténuées
+TP_LOCALLAB_WAT_BLURLC_TOOLTIP;Par défaut les 3 dimensions de L*a*b* luminance et couleur sont concernées par le floutage.\nCase cochée - luminance seulement
+TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Etendue des niveaux d’ondelettes utilisée dans l’ensemble du module “wavelets”
+TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;Image résiduelle, a le même comportement que l'image principale
+TP_LOCALLAB_WAT_CLARIL_TOOLTIP;"Fusion luma" est utilisée pour selectionner l'intensité de l'effet désiré sur la luminance.
+TP_LOCALLAB_WAT_CLARIC_TOOLTIP;"Fusion chroma" est utilisée pour selectionner l'intensité de l'effet désiré sur la luminance.
+TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;"Fusion seulement avec image originale", empêche les actions "Wavelet Pyramid" d'interférer avec "Claté" and "Masque netteté"
+TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Permet au contraste local de varier en fonction d'un gradient et d'un angle. La variation du signal de la luminance signal est prise en compte et non pas la luminance.
+TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;Décalage modifie la balance entre faible contraste et contraste élévé.\nLes hautes valeurs amplifient les changements de contraste pour les détails à contraste élévé, alors que les faibles valeurs vont amplifier les détails à contraste faible .\nEn selectionant des valeurs faibles vous pouvez ainsi sélectionner les zones de contrastes qui seront accentuées.
+TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;"Niveaux de Chroma": ajuste les valeurs "a" et "b" des composantes L*a*b* comme une proportion de la luminance.
+TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Similaira à Contraste par niveaux de détail. Des détails fins au gros details de gauche à droite en abscisse.
+TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensité de la détection d'effet de bord
+TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;Vous pouvez agir sur la répartition du contraste local selon l'intensité initiale du contraste par niveaux d'ondelettes.\nCeci aura comme conséquences de modifier l'effet de perspective et de relief de l'image, et/ou réduire les contrastes pour les très faibles niveaux de contraste initial
+TP_LOCALLAB_WAT_GRADW_TOOLTIP;Plus vous déplacez le curseur à droite, plus l'algorithme de détection sera efficace, moins les effets du contraste local seront sensibles
+TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Montre l'ensemble des outils "Netteté bords".\nLa lecture de la documentation wavelet est recommandée
+TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Permet d'ajuster l'effet maximum de floutage des niveaux
+TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Vous permet de flouter chaque niveau de décomposition.\nEn abscisse de gauche à droite, les niveaux de décomposition du plus fin au plus gros
+TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Floute l'image résiduelle, indépendamment des niveaux
+TP_LOCALLAB_WAT_WAVTM_TOOLTIP;La partie inférieure (négative) compresse chaque niveau de décomposition créant un effet tone mapping.\nLa partie supérieure (positive) atténue le contraste par niveau.\nEn abscisse de gauche à droite, les niveaux de décomposition du plus fin au plus gros
+TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Equilibre l'action à l'intérieur de chaque niveau
+TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Commpresse l'image résiduelle afin d'accentuer ou réduire les contrastes
+TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;En déplaçant le curseur à gauche, les bas niveaux sont accentués, et vers la droite ce sont les bas niveaux qui sont réduits et les hauts niveaux accentués
+TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Agit sur la balance des trois directions horizontale - verticale - diagonale - en fonction de la luminance de l'image.\nPar défaut les parties sombres ou hautes lumières sont réduites afin d'éviter les artefacts
+TP_LOCALLAB_WAV;Contrast local niveau
+TP_LOCALLAB_WAVBLUR_TOOLTIP;Réalise un flou pour chaque niveau de décomposition, également pour l'image résiduelle.
+TP_LOCALLAB_WAVCOMP;Compression par niveau
+TP_LOCALLAB_WAVCOMPRE;Compression par niveau
+TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Réalise un 'Tone-mapping' ou une réduction du contraste local par niveau.\nEn abscisse: niveaux
+TP_LOCALLAB_WAVCOMP_TOOLTIP;Réalise un contrast local en fonction de la direction de la décomposition en ondelettes : horizontal, vertical, diagonal
+TP_LOCALLAB_WAVCON;Contraste par niveau
+TP_LOCALLAB_WAVCONTF_TOOLTIP;Similaire à Contrast By Detail Levels : en abscisse niveaux.
+TP_LOCALLAB_WAVDEN;de-bruite luminance par niveau (0 1 2 + 3 et plus)
+TP_LOCALLAB_WAVE;Ψ Ondelette
+TP_LOCALLAB_WAVEDG;Contrast Local
+TP_LOCALLAB_WAVEEDG_TOOLTIP;Améliore la netteté prenant en compte la notion de "ondelettes bords".\nNécessite au moins que les 4 premiers niveaux sont utilisables
+TP_LOCALLAB_WAVGRAD_TOOLTIP;Filtre gradué pour Contraste local "luminance"
+TP_LOCALLAB_WAVHIGH;Ψ Ondelette haut
+TP_LOCALLAB_WAVLEV;Flouter par niveau
+TP_LOCALLAB_WAVLOW;Ψ Ondelette bas
+TP_LOCALLAB_WAVMASK;Ψ Niveau contraste local
+TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Amplitude des niveaux d'ondelettes utilisés par “Local contrast”
+TP_LOCALLAB_WAVMASK_TOOLTIP;Autorise un travail fin sur les masques niveaux de contraste (structure)
+TP_LOCALLAB_WAVMED;Ψ Ondelette normal
+TP_LOCALLAB_WEDIANHI;Median Haut
+TP_LOCALLAB_WHITE_EV;Blanc Ev
TP_METADATA_EDIT;Appliquer les modifications
TP_METADATA_MODE;Mode de copie des métadonnées
TP_METADATA_STRIP;Retirer toutes les métadonnées
@@ -2078,6 +2720,8 @@ TP_WAVELET_CHR_TOOLTIP;Ajuste le chroma en fonction des "niveaux de contraste" e
TP_WAVELET_CHSL;Curseurs
TP_WAVELET_CHTYPE;Méthode de chrominance
TP_WAVELET_COLORT;Opacité Rouge-Vert
+TP_WAVELET_COMPLEX_TOOLTIP;Standard: l’application dispose du nécessaire pour assurer les opérations courantes, l’interface graphique est simplifiée.\nAvancé: toutes les fonctionnalités sont présentes, certaines nécessitent un apprentissage important
+TP_WAVELET_COMPEXPERT;Avancé
TP_WAVELET_COMPCONT;Contraste
TP_WAVELET_COMPGAMMA;Compression gamma
TP_WAVELET_COMPGAMMA_TOOLTIP;Ajuster le gamma de l'image résiduelle vous permet d'équiilibrer les données de l'histogramme.
diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese
index b7c0b7e22..22dc027ea 100644
--- a/rtdata/languages/Japanese
+++ b/rtdata/languages/Japanese
@@ -8,6 +8,7 @@
#08 2012-12-22 a3novy
#09 2013-04-01 a3novy
#10 2013-04-19 a3novy
+#11 2020-06-24 Yz2house
ABOUT_TAB_BUILD;バージョン
ABOUT_TAB_CREDITS;クレジット
@@ -25,7 +26,7 @@ CURVEEDITOR_CURVE;カーブ
CURVEEDITOR_CURVES;カーブ
CURVEEDITOR_CUSTOM;カスタム
CURVEEDITOR_DARKS;ダーク
-CURVEEDITOR_EDITPOINT_HINT;ボタンを押すと数値で入出力を編集出来ます\n\n編集したいカーブ上のポイントを右クリックします\n編集を無効にする場合はポイント以外の部分で右クリックします
+CURVEEDITOR_EDITPOINT_HINT;ボタンを押すと数値で入出力値を変えられるようになります\n\nカーブ上で目標ポイントを右クリックし、カーブ下に表示されるI(入力値)或いはO(出力値)\n編集するポイントを変更する場合はポイント以外の部分で右クリックします
CURVEEDITOR_HIGHLIGHTS;ハイライト
CURVEEDITOR_LIGHTS;ライト
CURVEEDITOR_LINEAR;リニア
@@ -103,14 +104,14 @@ EXPORT_BYPASS_SHARPENEDGE;エッジ・シャープニングを迂回
EXPORT_BYPASS_SHARPENING;シャープニングを迂回
EXPORT_BYPASS_SHARPENMICRO;マイクロコントラストを迂回
EXPORT_FASTEXPORTOPTIONS;高速書き出しオプション
-EXPORT_INSTRUCTIONS;現像の設定に要する時間と手間を省くために、高速書き出しを優先させるオプションです。処理速度が優先される場合や、既定の現像パラメータを変えずに何枚ものリサイズ画像が要求される場合に奨められる方法で、低解像度画像を迅速に生成します。
+EXPORT_INSTRUCTIONS;出力設定に要する時間と手間を省くために、高速書き出しを優先させるオプションです。処理速度が優先される場合や、既定の出力パラメータを変えずに何枚ものリサイズ画像が要求される場合に奨められる方法で、低解像度画像を迅速に生成します。
EXPORT_MAXHEIGHT;最大高:
EXPORT_MAXWIDTH;最大幅:
EXPORT_PIPELINE;高速書き出しの方法
EXPORT_PUTTOQUEUEFAST; 高速書き出しのキューに追加
EXPORT_RAW_DMETHOD;デモザイクの方式
EXPORT_USE_FAST_PIPELINE;処理速度優先(リサイズした画像に調整を全て行う)
-EXPORT_USE_FAST_PIPELINE_TIP;処理速度を優先すると、処理は速くなりますが、画像の質は落ちます。通常、画像のリサイズは全現像処理工程の最後で行われますが、ここでは処理工程の初めの方でリサイズが行われます。処理速度は著しく上がりますが、現像処理された画像にアーティファクトが発生したり、全体的な質が低下したりします。
+EXPORT_USE_FAST_PIPELINE_TIP;処理速度を優先すると、処理は速くなりますが、画像の質は落ちます。通常、画像のリサイズは全処理工程の最後で行われますが、ここでは処理工程の初めの方でリサイズが行われます。処理速度は著しく上がりますが、処理された画像にアーティファクトが発生したり、全体的な質が低下したりします。
EXPORT_USE_NORMAL_PIPELINE;標準(リサイズ処理は最後、幾つかの処理を迂回)
EXTPROGTARGET_1;raw
EXTPROGTARGET_2;キュー処理
@@ -232,6 +233,7 @@ GENERAL_DISABLED;無効
GENERAL_ENABLE;有効
GENERAL_ENABLED;有効
GENERAL_FILE;ファイル
+GENERAL_HELP;ヘルプ
GENERAL_LANDSCAPE;横
GENERAL_NA;n/a
GENERAL_NO;No
@@ -262,7 +264,7 @@ HISTORY_MSG_1;写真を読み込みました
HISTORY_MSG_2;PP3を読み込みました
HISTORY_MSG_3;PP3を変更しました
HISTORY_MSG_4;履歴ブラウジング
-HISTORY_MSG_5;明度
+HISTORY_MSG_5;明るさ
HISTORY_MSG_6;コントラスト
HISTORY_MSG_7;黒
HISTORY_MSG_8;露光量補正
@@ -431,16 +433,16 @@ HISTORY_MSG_171;L*a*b* LC カーブ
HISTORY_MSG_172;LCの適用をレッドと肌色トーンだけに制限
HISTORY_MSG_173;ノイズ低減 - 細部の復元
HISTORY_MSG_174;CIE色の見えモデル2002
-HISTORY_MSG_175;CAM02 - 色順応量
-HISTORY_MSG_176;CAM02 - 観視の暗い周囲環境
-HISTORY_MSG_177;CAM02 - 撮影環境の順応輝度
-HISTORY_MSG_178;CAM02 - 観視の順応輝度
-HISTORY_MSG_179;CAM02 - モデル
+HISTORY_MSG_175;CAM02 - CAT02
+HISTORY_MSG_176;CAM02 - 観視環境
+HISTORY_MSG_177;CAM02 - 画像の輝度
+HISTORY_MSG_178;CAM02 - 観視の輝度
+HISTORY_MSG_179;CAM02 - ホワイトポイントモデル
HISTORY_MSG_180;CAM02 - 明度 (J)
HISTORY_MSG_181;CAM02 - 色度 (C)
HISTORY_MSG_182;CAM02 - 自動 CAT02
HISTORY_MSG_183;CAM02 - コントラスト (J)
-HISTORY_MSG_184;CAM02 - 暗い周囲環境を伴う撮影環境
+HISTORY_MSG_184;CAM02 - 画像の周辺環境
HISTORY_MSG_185;CAM02 - 色域制御
HISTORY_MSG_186;CAM02 - アルゴリズム
HISTORY_MSG_187;CAM02 - レッドと肌色トーンを保護
@@ -455,8 +457,8 @@ HISTORY_MSG_195;CAM02 - トーンカーブ 1
HISTORY_MSG_196;CAM02 - トーンカーブ 2
HISTORY_MSG_197;CAM02 - カラー・カーブ
HISTORY_MSG_198;CAM02 - カラー・カーブ
-HISTORY_MSG_199;CAM02 - カーブでCIECAM02出力のヒストグラムを表示
-HISTORY_MSG_200;CAM02 - CIECAM02 Q でトーンマッピング
+HISTORY_MSG_199;CAM02 - 出力のヒストグラムを表示
+HISTORY_MSG_200;CAM02 - トーンマッピング
HISTORY_MSG_201;色差 レッド/グリーン
HISTORY_MSG_202;色差 ブルー/イエロー
HISTORY_MSG_203;ノイズ低減 - 方式
@@ -592,7 +594,7 @@ HISTORY_MSG_333;W- 残差 シャドウ
HISTORY_MSG_334;W- 残差 色度
HISTORY_MSG_335;W- 残差 ハイライト
HISTORY_MSG_336;W- 残差 ハイライトのしきい値
-HISTORY_MSG_337;W- 残差 青空の色相
+HISTORY_MSG_337;W- 残差 色相の目標/保護
HISTORY_MSG_338;W- ES 半径
HISTORY_MSG_339;W- ES 強さ
HISTORY_MSG_340;W- 強さ
@@ -667,7 +669,7 @@ HISTORY_MSG_408;レティネックス - 半径
HISTORY_MSG_409;レティネックス - コントラスト
HISTORY_MSG_410;レティネックス - 明るさ
HISTORY_MSG_411;レティネックス - 強さ
-HISTORY_MSG_412;レティネックス - ガウス暈しのグラデーション
+HISTORY_MSG_412;レティネックス - ガウスフィルタの勾配
HISTORY_MSG_413;レティネックス - 差異
HISTORY_MSG_414;レティネックス - ヒストグラム - Lab
HISTORY_MSG_415;レティネックス - 透過
@@ -685,8 +687,8 @@ HISTORY_MSG_426;レティネックス - 色相イコライザ
HISTORY_MSG_427;出力レンダリングの意図
HISTORY_MSG_428;モニターレンダリングの意図
HISTORY_MSG_429;レティネックス - 繰り返し
-HISTORY_MSG_430;レティネックス - 透過のグラデーション
-HISTORY_MSG_431;レティネックス - 強さのグラデーション
+HISTORY_MSG_430;レティネックス - 透過マップの勾配
+HISTORY_MSG_431;レティネックス - 強さの勾配
HISTORY_MSG_432;レティネックス - M - ハイライト
HISTORY_MSG_433;レティネックス - M - ハイライト TW
HISTORY_MSG_434;レティネックス - M - シャドウ
@@ -695,21 +697,37 @@ HISTORY_MSG_436;レティネックス - M - 半径
HISTORY_MSG_437;レティネックス - M - 方式
HISTORY_MSG_438;レティネックス - M - イコライザ
HISTORY_MSG_439;レティネックス - プロセス
-HISTORY_MSG_440;詳細レベルコントラスト - 適用
+HISTORY_MSG_440;詳細レベルコントラスト - 処理の順番
HISTORY_MSG_441;レティネックス - 透過率の増加
HISTORY_MSG_442;レティネックス - スケール
HISTORY_MSG_443;出力のブラックポイント補正
HISTORY_MSG_444;WB - 色温度のバイアス
HISTORY_MSG_445;Raw サブイメージ
+HISTORY_MSG_446;EvPixelShiftMotion
+HISTORY_MSG_447;EvPixelShiftMotionCorrection
+HISTORY_MSG_448;EvPixelShiftStddevFactorGreen
HISTORY_MSG_449;PS - ISOへの適合
+HISTORY_MSG_450;EvPixelShiftNreadIso
+HISTORY_MSG_451;EvPixelShiftPrnu
HISTORY_MSG_452;PS - モーションを表示
HISTORY_MSG_453;PS - マスクだけを表示
+HISTORY_MSG_454;EvPixelShiftAutomatic
+HISTORY_MSG_455;EvPixelShiftNonGreenHorizontal
+HISTORY_MSG_456;EvPixelShiftNonGreenVertical
HISTORY_MSG_457;PS - レッド/ブルーを確認
+HISTORY_MSG_458;EvPixelShiftStddevFactorRed
+HISTORY_MSG_459;EvPixelShiftStddevFactorBlue
+HISTORY_MSG_460;EvPixelShiftGreenAmaze
+HISTORY_MSG_461;EvPixelShiftNonGreenAmaze
HISTORY_MSG_462;PS - グリーンを確認
+HISTORY_MSG_463;EvPixelShiftRedBlueWeight
HISTORY_MSG_464;PS - モーションマスクをぼかす
HISTORY_MSG_465;PS - ぼかしの半径
+HISTORY_MSG_466;EvPixelShiftSum
+HISTORY_MSG_467;EvPixelShiftExp0
HISTORY_MSG_468;PS - 穴を埋める
HISTORY_MSG_469;PS - メディアン
+HISTORY_MSG_470;EvPixelShiftMedian3
HISTORY_MSG_471;PS - 振れの補正
HISTORY_MSG_472;PS - 境界を滑らかにする
HISTORY_MSG_473;PS - LMMSEを使う
@@ -732,8 +750,434 @@ HISTORY_MSG_489;DRC - CbDL
HISTORY_MSG_490;DRC - 量
HISTORY_MSG_491;ホワイトバランス
HISTORY_MSG_492;RGBカーブ
-HISTORY_MSG_493;L*a*b*調整
+HISTORY_MSG_493;ローカル調整
HISTORY_MSG_494;キャプチャーシャープニング
+HISTORY_MSG_496;ローカル スポット 削除
+HISTORY_MSG_497;ローカル スポット 選択
+HISTORY_MSG_498;ローカル スポット 名前
+HISTORY_MSG_499;ローカル スポット 表示
+HISTORY_MSG_500;ローカル スポット 形状
+HISTORY_MSG_501;ローカル スポット 方法
+HISTORY_MSG_502;ローカル スポット 形状の方式
+HISTORY_MSG_503;ローカル スポット 右の垂直線
+HISTORY_MSG_504;ローカル スポット 左の垂直線
+HISTORY_MSG_505;ローカル スポット 下の水平線
+HISTORY_MSG_506;ローカル スポット 上の水平線
+HISTORY_MSG_507;ローカル スポット 中心
+HISTORY_MSG_508;ローカル スポット 大きさ
+HISTORY_MSG_509;ローカル スポット 質の種類
+HISTORY_MSG_510;ローカル スポット 境界
+HISTORY_MSG_511;ローカル スポット しきい値
+HISTORY_MSG_512;ローカル スポット ΔEの減衰
+HISTORY_MSG_513;ローカル スポット スコープ
+HISTORY_MSG_514;ローカル スポット 構造
+HISTORY_MSG_515;ローカル調整
+HISTORY_MSG_516;ローカル - 色と明るさ
+HISTORY_MSG_517;ローカル - 強力を有効にする
+HISTORY_MSG_518;ローカル - 明るさ
+HISTORY_MSG_519;ローカル - コントラスト
+HISTORY_MSG_520;ローカル - 色度
+HISTORY_MSG_521;ローカル - スコープ
+HISTORY_MSG_522;ローカル - カーブの方式
+HISTORY_MSG_523;ローカル - LL カーブ
+HISTORY_MSG_524;ローカル - CC カーブ
+HISTORY_MSG_525;ローカル - LH カーブ
+HISTORY_MSG_526;ローカル - H カーブ
+HISTORY_MSG_527;ローカル - 反対色
+HISTORY_MSG_528;ローカル - 露光補正
+HISTORY_MSG_529;ローカル - Exp 露光量補正
+HISTORY_MSG_530;ローカル - Exp ハイライト圧縮
+HISTORY_MSG_531;ローカル - Exp ハイライト圧縮のしきい値
+HISTORY_MSG_532;ローカル - Exp 黒レベル
+HISTORY_MSG_533;ローカル - Exp 黒レベルの圧縮
+HISTORY_MSG_534;ローカル - ウォームとクール
+HISTORY_MSG_535;ローカル - Exp スコープ
+HISTORY_MSG_536;ローカル - Exp コントラストカーブ
+HISTORY_MSG_537;ローカル - 自然な彩度
+HISTORY_MSG_538;ローカル - Vib 純色
+HISTORY_MSG_539;ローカル - Vib パステル
+HISTORY_MSG_540;ローカル - Vib しきい値
+HISTORY_MSG_541;ローカル - Vib 肌色の保護
+HISTORY_MSG_542;ローカル - Vib 色ずれの回避
+HISTORY_MSG_543;ローカル - Vib リンク
+HISTORY_MSG_544;ローカル - Vib スコープ
+HISTORY_MSG_545;ローカル - Vib H カーブ
+HISTORY_MSG_546;ローカル - ぼかしとノイズ
+HISTORY_MSG_547;ローカル - 半径
+HISTORY_MSG_548;ローカル - ノイズ
+HISTORY_MSG_549;ローカル - ぼかしのスコープ
+HISTORY_MSG_550;ローカル - ぼかしの方式
+HISTORY_MSG_551;ローカル - ぼかし 輝度だけ
+HISTORY_MSG_552;ローカル - トーンマッピング
+HISTORY_MSG_553;ローカル - TM 強さ
+HISTORY_MSG_554;ローカル - TM ガンマ
+HISTORY_MSG_555;ローカル - TM エッジ停止
+HISTORY_MSG_556;ローカル - TM スケール
+HISTORY_MSG_557;ローカル - TM 再加重
+HISTORY_MSG_558;ローカル - TM スコープ
+HISTORY_MSG_559;ローカル - レティネックス
+HISTORY_MSG_560;ローカル - レティネックス 方式
+HISTORY_MSG_561;ローカル - レティネックス 強さ
+HISTORY_MSG_562;ローカル - レティネックス 色度
+HISTORY_MSG_563;ローカル - レティネックス 半径
+HISTORY_MSG_564;ローカル - レティネックス コントラスト
+HISTORY_MSG_565;ローカル - スコープ
+HISTORY_MSG_566;ローカル - レティネックス ゲインのカーブ
+HISTORY_MSG_567;ローカル - レティネックス 反対処理
+HISTORY_MSG_568;ローカル - シャープニング
+HISTORY_MSG_569;ローカル - Sh 半径
+HISTORY_MSG_570;ローカル - Sh 量
+HISTORY_MSG_571;ローカル - Sh 減衰
+HISTORY_MSG_572;ローカル - Sh 繰り返し
+HISTORY_MSG_573;ローカル - Sh スコープ
+HISTORY_MSG_574;ローカル - Sh 反対処理
+HISTORY_MSG_575;ローカル - 詳細レベルによるコントラスト調整
+HISTORY_MSG_576;ローカル - CbDL 複数のレベル
+HISTORY_MSG_577;ローカル - CbDL 色度
+HISTORY_MSG_578;ローカル - CbDL しきい値
+HISTORY_MSG_579;ローカル - CbDL スコープ
+HISTORY_MSG_580;ローカル - ノイズ除去
+HISTORY_MSG_581;ローカル - ノイズ除去 輝度 細かい1
+HISTORY_MSG_582;ローカル - ノイズ除去 輝度 祖い
+HISTORY_MSG_583;ローカル - ノイズ除去 細部の回復
+HISTORY_MSG_584;ローカル - ノイズ除去 イコライザ 白黒
+HISTORY_MSG_585;ローカル - ノイズ除去 色度 細かい
+HISTORY_MSG_586;ローカル - ノイズ除去 色度 粗い
+HISTORY_MSG_587;ローカル - ノイズ除去 色度の回復
+HISTORY_MSG_588;ローカル - ノイズ除去 イコライザ ブルー-レッド
+HISTORY_MSG_589;ローカル - ノイズ除去 平滑化フィルタ
+HISTORY_MSG_590;ローカル - ノイズ除去 スコープ
+HISTORY_MSG_591;ローカル - 色ずれの回避
+HISTORY_MSG_592;ローカル - Sh コントラスト
+HISTORY_MSG_593;ローカル - ローカルコントラスト
+HISTORY_MSG_594;ローカル - ローカルコントラスト 半径
+HISTORY_MSG_595;ローカル - ローカルコントラスト 量
+HISTORY_MSG_596;ローカル - ローカルコントラスト 暗さ
+HISTORY_MSG_597;ローカル - ローカルコントラスト 明るさ
+HISTORY_MSG_598;ローカル - ローカルコントラスト スコープ
+HISTORY_MSG_599;ローカル - レティネックス 霞除去
+HISTORY_MSG_600;ローカル - ソフトライト 有効
+HISTORY_MSG_601;ローカル - ソフトライト 強さ
+HISTORY_MSG_602;ローカル - ソフトライト スコープ
+HISTORY_MSG_603;ローカル - Sh ぼかしの半径
+HISTORY_MSG_605;ローカル - 色と明るさの変更
+HISTORY_MSG_606;ローカル - 露光の変更
+HISTORY_MSG_607;ローカル - 色と明るさ マスク C
+HISTORY_MSG_608;ローカル - 色と明るさ マスク L
+HISTORY_MSG_609;ローカル - 露光補正 マスク C
+HISTORY_MSG_610;ローカル - 露光補正 マスク L
+HISTORY_MSG_611;ローカル - 色と明るさ マスク H
+HISTORY_MSG_612;ローカル - 色と明るさ 構造
+HISTORY_MSG_613;ローカル - 露光補正 構造
+HISTORY_MSG_614;ローカル - 露光補正 マスク H
+HISTORY_MSG_615;ローカル - 色と明るさ ブレンド
+HISTORY_MSG_616;ローカル - 露光補正 ブレンド
+HISTORY_MSG_617;ローカル - 露光補正 ぼかし
+HISTORY_MSG_618;ローカル - 色と明るさ マスクを使う
+HISTORY_MSG_619;ローカル - 露光補正 マスクを使う
+HISTORY_MSG_620;ローカル - 色と明るさ ぼかし
+HISTORY_MSG_621;ローカル - 露光補正 反対処理
+HISTORY_MSG_622;ローカル - 構造の除外
+HISTORY_MSG_623;ローカル - 露光補正 色の補間
+HISTORY_MSG_624;ローカル - 色と明るさ 補正グリッド
+HISTORY_MSG_625;ローカル - 色と明るさ 補正の強さ
+HISTORY_MSG_626;ローカル - 色と明るさ 補正の方式
+HISTORY_MSG_627;ローカル - シャドウ/ハイライト
+HISTORY_MSG_628;ローカル - SH ハイライト
+HISTORY_MSG_629;ローカル - SH ハイライトトーンの幅
+HISTORY_MSG_630;ローカル - SH シャドウ
+HISTORY_MSG_631;ローカル - SH シャドウトーンの幅
+HISTORY_MSG_632;ローカル - SH 半径
+HISTORY_MSG_633;ローカル - SH スコープ
+HISTORY_MSG_634;ローカル - 色と明るさ 半径
+HISTORY_MSG_635;ローカル - 露光補正 半径
+HISTORY_MSG_636;ローカル - 追加された機能
+HISTORY_MSG_637;ローカル - SH マスク C
+HISTORY_MSG_638;ローカル - SH マスク L
+HISTORY_MSG_639;ローカル - SH マスク H
+HISTORY_MSG_640;ローカル - SH ブレンド
+HISTORY_MSG_641;ローカル - SH マスクを使用
+HISTORY_MSG_642;ローカル - SH 半径
+HISTORY_MSG_643;ローカル - SH ぼかし
+HISTORY_MSG_644;ローカル - SH 反対処理
+HISTORY_MSG_645;ローカル - 色差のバランス ab-L
+HISTORY_MSG_646;ローカル - 露光補正 色度のマスク
+HISTORY_MSG_647;ローカル - 露光補正 ガンマのマスク
+HISTORY_MSG_648;ローカル - 露光補正 スロープのマスク
+HISTORY_MSG_649;ローカル - 露光補正 ソフトな半径
+HISTORY_MSG_650;ローカル - 色と明るさ 色度のマスク
+HISTORY_MSG_651;ローカル - 色と明るさ ガンマのマスク
+HISTORY_MSG_652;ローカル - 色と明るさ スロープのマスク
+HISTORY_MSG_653;ローカル - SH 色度のマスク
+HISTORY_MSG_654;ローカル - SH ガンマのマスク
+HISTORY_MSG_655;ローカル - SH スロープのマスク
+HISTORY_MSG_656;ローカル - 色と明るさ ソフトな半径
+HISTORY_MSG_657;ローカル - レティネックス アーティファクトの軽減
+HISTORY_MSG_658;ローカル - CbDL ソフトな半径
+HISTORY_MSG_659;ローカル スポット 境界値の減衰
+HISTORY_MSG_660;ローカル - CbDL 明瞭
+HISTORY_MSG_661;ローカル - CbDL 残差のコントラスト
+HISTORY_MSG_662;ローカル - deNoise 輝度 細かい0
+HISTORY_MSG_663;ローカル - deNoise 輝度 細かい2
+HISTORY_MSG_664;ローカル - CbDL ぼかし
+HISTORY_MSG_665;ローカル - CbDL ブレンドのマスク
+HISTORY_MSG_666;ローカル - CbDL 半径のマスク
+HISTORY_MSG_667;ローカル - CbDL 色度のマスク
+HISTORY_MSG_668;ローカル - CbDL ガンマのマスク
+HISTORY_MSG_669;ローカル - CbDL スロープのマスク
+HISTORY_MSG_670;ローカル - CbDL マスク C
+HISTORY_MSG_671;ローカル - CbDL マスク L
+HISTORY_MSG_672;ローカル - CbDL マスク CL
+HISTORY_MSG_673;ローカル - CbDL マスクを使う
+HISTORY_MSG_674;ローカル - 削除された機能
+HISTORY_MSG_675;ローカル - TM ソフトな半径
+HISTORY_MSG_676;ローカル スポット 境界の差異
+HISTORY_MSG_677;ローカル - TM 量
+HISTORY_MSG_678;ローカル - TM 彩度
+HISTORY_MSG_679;ローカル - レティネックス マスク C
+HISTORY_MSG_680;ローカル - レティネックス マスク L
+HISTORY_MSG_681;ローカル - レティネックス マスク CL
+HISTORY_MSG_682;ローカル - レティネックス マスク
+HISTORY_MSG_683;ローカル - レティネックス ブレンドのマスク
+HISTORY_MSG_684;ローカル - レティネックス 半径のマスク
+HISTORY_MSG_685;ローカル - レティネックス 色度のマスク
+HISTORY_MSG_686;ローカル - レティネックス ガンマのマスク
+HISTORY_MSG_687;ローカル - レティネックス スロープのマスク
+HISTORY_MSG_688;ローカル - 削除された機能
+HISTORY_MSG_689;ローカル - レティネックス 透過マップのマスク
+HISTORY_MSG_690;ローカル - レティネックス スケール
+HISTORY_MSG_691;ローカル - レティネックス 暗さ
+HISTORY_MSG_692;ローカル - レティネックス 明るさ
+HISTORY_MSG_693;ローカル - レティネックス しきい値
+HISTORY_MSG_694;ローカル - レティネックス ラプラシアンのしきい値
+HISTORY_MSG_695;ローカル - ソフトの方式
+HISTORY_MSG_696;ローカル - レティネックス 標準化
+HISTORY_MSG_697;ローカル - TM 標準化
+HISTORY_MSG_698;ローカル - ローカルコントラスト 高速フーリエ変換
+HISTORY_MSG_699;ローカル - レティネックス 高速フーリエ変換
+HISTORY_MSG_701;ローカル - Exp シャドウ
+HISTORY_MSG_702;ローカル - Exp 方式
+HISTORY_MSG_703;ローカル - Exp ラプラシアンのしきい値
+HISTORY_MSG_704;ローカル - Exp PDEのバランス
+HISTORY_MSG_705;ローカル - Exp 線形
+HISTORY_MSG_706;ローカル - TM マスク C
+HISTORY_MSG_707;ローカル - TM マスク L
+HISTORY_MSG_708;ローカル - TM マスク CL
+HISTORY_MSG_709;ローカル - TM マスク マスク
+HISTORY_MSG_710;ローカル - TM ブレンドのマスク
+HISTORY_MSG_711;ローカル - TM 半径のマスク
+HISTORY_MSG_712;ローカル - TM 色度のマスク
+HISTORY_MSG_713;ローカル - TM ガンマのマスク
+HISTORY_MSG_714;ローカル - TM スロープのマスク
+HISTORY_MSG_716;ローカル - ローカル 方式
+HISTORY_MSG_717;ローカル - ローカルコントラスト
+HISTORY_MSG_718;ローカル - ローカルコントラストのレベル
+HISTORY_MSG_719;ローカル - ローカルコントラスト 残差L
+HISTORY_MSG_720;ローカル - ぼかし マスク C
+HISTORY_MSG_721;ローカル - ぼかし マスク L
+HISTORY_MSG_722;ローカル - ぼかし マスク CL
+HISTORY_MSG_723;ローカル - ぼかし マスクを使う
+HISTORY_MSG_725;ローカル - ぼかし ブレンドのマスク
+HISTORY_MSG_726;ローカル - ぼかし 半径のマスク
+HISTORY_MSG_727;ローカル - ぼかし 色度のマスク
+HISTORY_MSG_728;ローカル - ぼかし ガンマのマスク
+HISTORY_MSG_729;ローカル - ぼかし スロープのマスク
+HISTORY_MSG_730;ローカル - ぼかしの方式
+HISTORY_MSG_731;ローカル - メディアンの方式
+HISTORY_MSG_732;ローカル - メディアン 繰り返し
+HISTORY_MSG_733;ローカル - ソフトな半径
+HISTORY_MSG_734;ローカル - ディテール
+HISTORY_MSG_738;ローカル - ローカルコントラスト Lを統合
+HISTORY_MSG_739;ローカル - ローカルコントラスト ソフトな半径
+HISTORY_MSG_740;ローカル - ローカルコントラスト Cを統合
+HISTORY_MSG_741;ローカル - ローカルコントラスト 残差C
+HISTORY_MSG_742;ローカル - Exp ラプラシアンのガンマ
+HISTORY_MSG_743;ローカル - Exp Fattal 量
+HISTORY_MSG_744;ローカル - Exp Fattal ディテール
+HISTORY_MSG_745;ローカル - Exp Fattal オフセット
+HISTORY_MSG_746;ローカル - Exp Fattal シグマ
+HISTORY_MSG_747;ローカル 作成されたスポット
+HISTORY_MSG_748;ローカル - Exp ノイズ除去
+HISTORY_MSG_749;ローカル - Reti 深度
+HISTORY_MSG_750;ローカル - Reti モード 対数 - 線形
+HISTORY_MSG_751;ローカル - Reti 霞除去 輝度だけ
+HISTORY_MSG_752;ローカル - Reti オフセット
+HISTORY_MSG_753;ローカル - Reti 透過マップ
+HISTORY_MSG_754;ローカル - Reti クリップ
+HISTORY_MSG_755;ローカル - TM マスクを使う
+HISTORY_MSG_756;ローカル - Exp 露光補正マスクのアルゴリズムを使う
+HISTORY_MSG_757;ローカル - Exp ラプラシアンマスク
+HISTORY_MSG_758;ローカル - Reti ラプラシアンマスク
+HISTORY_MSG_759;ローカル - Exp ラプラシアンマスク
+HISTORY_MSG_760;ローカル - Color ラプラシアンマスク
+HISTORY_MSG_761;ローカル - SH ラプラシアンマスク
+HISTORY_MSG_762;ローカル - cbdl ラプラシアンマスク
+HISTORY_MSG_763;ローカル - Blur ラプラシアンマスク
+HISTORY_MSG_764;ローカル - Solve PDE ラプラシアンマスク
+HISTORY_MSG_765;ローカル - deNoise ディテールのしきい値
+HISTORY_MSG_766;ローカル - Blur 高速フーリエ変換
+HISTORY_MSG_767;ローカル - Grain ISO
+HISTORY_MSG_768;ローカル - Grain 強さ
+HISTORY_MSG_769;ローカル - Grain スケール
+HISTORY_MSG_770;ローカル - Color コントラストカーブのマスク
+HISTORY_MSG_771;ローカル - Exp コントラストカーブのマスク
+HISTORY_MSG_772;ローカル - SH コントラストカーブのマスク
+HISTORY_MSG_773;ローカル - TM コントラストカーブのマスク
+HISTORY_MSG_774;ローカル - Reti コントラストカーブのマスク
+HISTORY_MSG_775;ローカル - CBDL コントラストカーブのマスク
+HISTORY_MSG_776;ローカル - Blur Denoise コントラストカーブのマスク
+HISTORY_MSG_777;ローカル - Blur ローカルコントラストカーブのマスク
+HISTORY_MSG_778;ローカル - ハイライトのマスク
+HISTORY_MSG_779;ローカル - 色と明るさ ローカルコントラストカーブのマスク
+HISTORY_MSG_780;ローカル - 色と明るさ シャドウのマスク
+HISTORY_MSG_781;ローカル - コントラスト ウェーブレットのレベルのマスク
+HISTORY_MSG_782;ローカル - Blur Denoise ウェーブレットのレベルのマスク
+HISTORY_MSG_783;ローカル - 色と明るさ ウェーブレットのレベル
+HISTORY_MSG_784;ローカル - ΔEのマスク
+HISTORY_MSG_785;ローカル - ΔEのスコープのマスク
+HISTORY_MSG_786;ローカル - SH 方式
+HISTORY_MSG_787;ローカル - イコライザの乗数
+HISTORY_MSG_788;ローカル - イコライザのディテール
+HISTORY_MSG_789;ローカル - SH マスクの量
+HISTORY_MSG_790;ローカル - SH マスクのアンカー
+HISTORY_MSG_791;ローカル - マスク ショートLカーブ
+HISTORY_MSG_792;ローカル - マスク 背景輝度
+HISTORY_MSG_793;ローカル - SH TRCのガンマ
+HISTORY_MSG_794;ローカル - SH TRCのスロープ
+HISTORY_MSG_795;ローカル - マスク 復元したイメージの保存
+HISTORY_MSG_796;ローカル - 参考値の繰り返し
+HISTORY_MSG_797;ローカル - オリジナルとの融合方式
+HISTORY_MSG_798;ローカル - 不透明度
+HISTORY_MSG_799;ローカル - Color RGB トーンカーブ
+HISTORY_MSG_800;ローカル - Color トーンカーブの方式
+HISTORY_MSG_801;ローカル - Color 特殊なトーンカーブ
+HISTORY_MSG_802;ローカル - コントラストしきい値
+HISTORY_MSG_803;ローカル - 色と明るさ 融合
+HISTORY_MSG_804;ローカル - 色と明るさ マスクの構造
+HISTORY_MSG_805;ローカル - ぼかしとノイズ マスクの構造
+HISTORY_MSG_806;ローカル - 色と明るさ 機能としてのマスクの構造
+HISTORY_MSG_807;ローカル - ぼかしとノイズ 機能としてのマスクの構造
+HISTORY_MSG_808;ローカル - 色と明るさ マスクカーブ H(H)
+HISTORY_MSG_809;ローカル - Vib カーブのマスク C(C)
+HISTORY_MSG_810;ローカル - Vib カーブのマスク L(L)
+HISTORY_MSG_811;ローカル - Vib カーブのマスク LC(H)
+HISTORY_MSG_813;ローカル - 自然な彩度 マスクを使う
+HISTORY_MSG_814;ローカル - Vib ブレンドのマスク
+HISTORY_MSG_815;ローカル - Vib 半径のマスク
+HISTORY_MSG_816;ローカル - Vib 色度のマスク
+HISTORY_MSG_817;ローカル - Vib ガンマのマスク
+HISTORY_MSG_818;ローカル - Vib 勾配のマスク
+HISTORY_MSG_819;ローカル - Vib ラプラシアンのマスク
+HISTORY_MSG_820;ローカル - Vib コントラストカーブのマスク
+HISTORY_MSG_821;ローカル - 色と明るさ 背景のグリッド
+HISTORY_MSG_822;ローカル - 色と明るさ 背景の融合
+HISTORY_MSG_823;ローカル - 色と明るさ 背景の融合 輝度だけ
+HISTORY_MSG_824;ローカル - Exp 減光マスクの強さ
+HISTORY_MSG_825;ローカル - Exp 減光マスクの角度
+HISTORY_MSG_826;ローカル - Exp 減光の強さ
+HISTORY_MSG_827;ローカル - Exp 減光の角度
+HISTORY_MSG_828;ローカル - SH 階調 強さ
+HISTORY_MSG_829;ローカル - SH 階調 角度
+HISTORY_MSG_830;ローカル - 色と明るさ 階調 Lの強さ
+HISTORY_MSG_831;ローカル - 色と明るさ 階調 角度
+HISTORY_MSG_832;ローカル - 色と明るさ 階調 Cの強さ
+HISTORY_MSG_833;ローカル - 減光のフェザー処理
+HISTORY_MSG_834;ローカル - 色と明るさ 減光の強さ H
+HISTORY_MSG_835;ローカル - Vib 諧調 Lの強さ
+HISTORY_MSG_836;ローカル - Vib 階調 角度
+HISTORY_MSG_837;ローカル - Vib 階調 Cの強さ
+HISTORY_MSG_838;ローカル - Vib 階調 Hの強さ
+HISTORY_MSG_839;ローカル - ソフトウェアの難易度
+HISTORY_MSG_840;ローカル - CL カーブ
+HISTORY_MSG_841;ローカル - LC カーブ
+HISTORY_MSG_842;ローカル - マスクぼかしのコントラストしきい値
+HISTORY_MSG_843;ローカル - マスクぼかしの半径
+HISTORY_MSG_844;ローカル - 色と明るさ マスク FTTW
+HISTORY_MSG_845;ローカル - 対数符号化
+HISTORY_MSG_846;ローカル - 符号化 自動
+HISTORY_MSG_847;ローカル - グレーポイントの源泉
+HISTORY_MSG_848;ローカル - グレーポイントの源泉 自動
+HISTORY_MSG_849;ローカル - グレーポイントの自動選択
+HISTORY_MSG_850;ローカル - ブラックEv
+HISTORY_MSG_851;ローカル - ホワイトEv
+HISTORY_MSG_852;ローカル - グレーポイントの目標
+HISTORY_MSG_853;ローカル - ローカルコントラスト
+HISTORY_MSG_854;ローカル - 対数符号化のスコープ
+HISTORY_MSG_855;ローカル - 画像全体
+HISTORY_MSG_856;ローカル - 対数の基数
+HISTORY_MSG_857;ローカル - Contrast 残差のぼかし
+HISTORY_MSG_858;ローカル - Contrast 輝度だけ
+HISTORY_MSG_859;ローカル - Contrast 最大値 ぼかしレベル
+HISTORY_MSG_860;ローカル - Contrast カーブ ぼかすレベル
+HISTORY_MSG_861;ローカル - Contrast カーブ コントラストレベル
+HISTORY_MSG_862;ローカル - Contrast シグマ 輝度
+HISTORY_MSG_863;ローカル - Contrast 元画像との融合
+HISTORY_MSG_864;ローカル - Contrast ディテール
+HISTORY_MSG_865;ローカル - Contrast アンカー
+HISTORY_MSG_866;ローカル - Contrast カーブの圧縮
+HISTORY_MSG_867;ローカル - Contrast 残差の量
+HISTORY_MSG_868;ローカル - ΔEのバランス C-H
+HISTORY_MSG_869;ローカル - ノイズ除去カーブ 輝度
+HISTORY_MSG_870;ローカル - LC カーブのマスク LC(H)
+HISTORY_MSG_871;ローカル - LC カーブのマスク C(C)
+HISTORY_MSG_872;ローカル - LC カーブのマスク L(L)
+HISTORY_MSG_873;ローカル - LC マスク 有効
+HISTORY_MSG_875;ローカル - LC マスク ブレンド
+HISTORY_MSG_876;ローカル - LC マスク 半径
+HISTORY_MSG_877;ローカル - LC マスク 色度
+HISTORY_MSG_878;ローカル - LC カーブのマスク コントラスト
+HISTORY_MSG_879;ローカル - LC 色度 レベル
+HISTORY_MSG_880;ローカル - LC 色度のぼかし レベル
+HISTORY_MSG_881;ローカル - Contrast オフセット 輝度
+HISTORY_MSG_882;ローカル - Contrast ぼかし
+HISTORY_MSG_883;ローカル - Contrast レベルごと
+HISTORY_MSG_884;ローカル - Contrast ダイナミックレンジ ラプラシアン
+HISTORY_MSG_885;ローカル - Contrast ダイナミックレンジ ウェーブレット
+HISTORY_MSG_886;ローカル - Contrast ウェーブレット カーブの圧縮
+HISTORY_MSG_887;ローカル - Contrast ウェーブレット 残差の圧縮
+HISTORY_MSG_888;ローカル - Contrast ウェーブレット バランスのしきい値
+HISTORY_MSG_889;ローカル - Contrast ウェーブレット 階調の強さ
+HISTORY_MSG_890;ローカル - Contrast ウェーブレット 階調の角度
+HISTORY_MSG_891;ローカル - Contrast ウェーブレット 階調フィルタ
+HISTORY_MSG_892;ローカル - 対数符号化 階調の強さ
+HISTORY_MSG_893;ローカル - 対数符号化 階調の角度
+HISTORY_MSG_894;ローカル - 色と明るさ 色差のプレビュー
+HISTORY_MSG_897;ローカル - Contrast ウェーブレット ES 強さ
+HISTORY_MSG_898;ローカル - Contrast ウェーブレット ES 半径
+HISTORY_MSG_899;ローカル - Contrast ウェーブレット ES ディテール
+HISTORY_MSG_900;ローカル - Contrast ウェーブレット ES 勾配
+HISTORY_MSG_901;ローカル - Contrast ウェーブレット ES しきい値 低
+HISTORY_MSG_902;ローカル - Contrast ウェーブレット ES しきい値 高
+HISTORY_MSG_903;ローカル - Contrast ウェーブレット ES ローカルコントラスト
+HISTORY_MSG_904;ローカル - Contrast ウェーブレット ES 最初のレベル
+HISTORY_MSG_905;ローカル - Contrast ウェーブレット エッジシャープネス
+HISTORY_MSG_906;ローカル - Contrast ウェーブレット ES 感度
+HISTORY_MSG_907;ローカル - Contrast ウェーブレット ES 増幅
+HISTORY_MSG_908;ローカル - Contrast ウェーブレット ES 隣接
+HISTORY_MSG_909;ローカル - Contrast ウェーブレット ES 表示
+HISTORY_MSG_910;ローカル - ウェーブレット エッジ検出の効果
+HISTORY_MSG_911;ローカル - ぼかし 色度 輝度
+HISTORY_MSG_912;ローカル - ガイド付きフィルターの強さのぼかし
+HISTORY_MSG_913;ローカル - Contrast Wavelet Sigma DR
+HISTORY_MSG_914;ローカル - ウェーブレットのぼかし シグマ BL
+HISTORY_MSG_915;ローカル - ウェーブレットのエッジ シグマ ED
+HISTORY_MSG_916;ローカル - ウェーブレットの残差画像 シャドウ
+HISTORY_MSG_917;ローカル - ウェーブレットの残差画像 シャドウのしきい値
+HISTORY_MSG_918;ローカル - ウェーブレットの残差画像 ハイライト
+HISTORY_MSG_919;ローカル - ウェーブレットの残差画像 ハイライトのしきい値
+HISTORY_MSG_920;ローカル - ウェーブレット シグマ LC
+HISTORY_MSG_921;ローカル - ウェーブレット 階調のシグマ LC2
+HISTORY_MSG_922;ローカル - 白黒での変更
+HISTORY_MSG_923;ローカル - 機能の複雑度モード
+HISTORY_MSG_924;ローカル - 機能の複雑度モード
+HISTORY_MSG_925;Local - カラー機能のスコープ
+HISTORY_MSG_926;Local - マスクのタイプを表示
+HISTORY_MSG_927;Local - シャドウマスク
+HISTORY_MSG_BLSHAPE;詳細レベルによるぼかし
+HISTORY_MSG_BLURCWAV;色度のぼかし
+HISTORY_MSG_BLURWAV;輝度のぼかし
+HISTORY_MSG_BLUWAV;減衰応答
+HISTORY_MSG_CAT02PRESET;Cat02 自動プリセット
HISTORY_MSG_CLAMPOOG;色域外の色を切り取る
HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - カラー補正
HISTORY_MSG_COLORTONING_LABREGION_AB;CT - 色の補正
@@ -756,7 +1200,9 @@ HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;霞除去 - 深度マップの表示
HISTORY_MSG_DEHAZE_STRENGTH;霞除去 - 強さ
HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;デュアルデモザイク - 自動しきい値
HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - コントラストのしきい値
+HISTORY_MSG_EDGEFFECT;エッジの効果調整
HISTORY_MSG_FILMNEGATIVE_ENABLED;ネガフィルム
+HISTORY_MSG_FILMNEGATIVE_FILMBASE;フィルムのベースカラー
HISTORY_MSG_FILMNEGATIVE_VALUES;ネガフィルムの値
HISTORY_MSG_HISTMATCHING;トーンカーブの自動調節
HISTORY_MSG_ICM_OUTPUT_PRIMARIES;出力 - プライマリ
@@ -765,6 +1211,7 @@ HISTORY_MSG_ICM_OUTPUT_TYPE;出力 - タイプ
HISTORY_MSG_ICM_WORKING_GAMMA;作業色空間 - ガンマ
HISTORY_MSG_ICM_WORKING_SLOPE;作業色空間 - 勾配
HISTORY_MSG_ICM_WORKING_TRC_METHOD;作業色空間 - TRCの方式
+HISTORY_MSG_ILLUM;輝度
HISTORY_MSG_LOCALCONTRAST_AMOUNT;ローカルコントラスト - 量
HISTORY_MSG_LOCALCONTRAST_DARKNESS;ローカルコントラスト - 暗い部分
HISTORY_MSG_LOCALCONTRAST_ENABLED;ローカルコントラスト
@@ -779,10 +1226,20 @@ HISTORY_MSG_PDSHARPEN_CONTRAST;CS - コントラストのしきい値
HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - 繰り返し
HISTORY_MSG_PDSHARPEN_RADIUS;CS - シグマ
HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - 周辺のシグマを増やす
+HISTORY_MSG_PERSP_CAM_ANGLE;パースペクティブ - カメラ
+HISTORY_MSG_PERSP_CAM_FL;パースペクティブ - カメラ
+HISTORY_MSG_PERSP_CAM_SHIFT;パースペクティブ - カメラ
+HISTORY_MSG_PERSP_METHOD;パースペクティブ - 方法
+HISTORY_MSG_PERSP_PROJ_ANGLE;パースペクティブ - 回復
+HISTORY_MSG_PERSP_PROJ_ROTATE;パースペクティブ - PCA 回転
+HISTORY_MSG_PERSP_PROJ_SHIFT;パースペクティブ - PCA
HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - 振れに対するデモザイクの方式
HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;ラインノイズフィルタの方向
HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAFラインフィルタ
+HISTORY_MSG_PREPROCWB_MODE;ホワイトバランスモードの前処理
+HISTORY_MSG_PROTAB;保護
HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - コントラストのしきい値
+HISTORY_MSG_RANGEAB;abの範囲
HISTORY_MSG_RAWCACORR_AUTOIT;Rawの色収差補正 - 繰り返し
HISTORY_MSG_RAWCACORR_COLORSHIFT;Rawの色収差補正 - 色ずれを回避
HISTORY_MSG_RAW_BORDER;Rawの境界
@@ -790,9 +1247,35 @@ HISTORY_MSG_RESIZE_ALLOWUPSCALING;リサイズ - アップスケーリングを
HISTORY_MSG_SHARPENING_BLUR;シャープニング - ぼかしの半径
HISTORY_MSG_SHARPENING_CONTRAST;シャープニング - コントラストのしきい値
HISTORY_MSG_SH_COLORSPACE;S/H - 色空間
+HISTORY_MSG_SIGMACOL;色度の効果調整
+HISTORY_MSG_SIGMADIR;Dirの効果調整
+HISTORY_MSG_SIGMAFIN;最終的なコントラストの効果調整
+HISTORY_MSG_SIGMATON;トーンの効果調整
HISTORY_MSG_SOFTLIGHT_ENABLED;ソフトライト
HISTORY_MSG_SOFTLIGHT_STRENGTH;ソフトライト - 強さ
+HISTORY_MSG_TEMPOUT;CAM02 自動色温度設定
+HISTORY_MSG_THRESWAV;バランスのしきい値
HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - アンカー
+HISTORY_MSG_TRANS_Method;ジオメトリ - 方式
+HISTORY_MSG_WAVBALCHROM;イコライザ 色度
+HISTORY_MSG_WAVBALLUM;イコライザ 輝度
+HISTORY_MSG_WAVBL;レベルのぼかし
+HISTORY_MSG_WAVCHROMCO;粗い部分の色度
+HISTORY_MSG_WAVCHROMFI;細部の色度
+HISTORY_MSG_WAVCLARI;明瞭
+HISTORY_MSG_WAVEDGS;エッジ停止
+HISTORY_MSG_WAVLOWTHR;最小コントラストのしきい値
+HISTORY_MSG_WAVMERGEC;色度の融合
+HISTORY_MSG_WAVMERGEL;輝度の融合
+HISTORY_MSG_WAVOFFSET;オフセット
+HISTORY_MSG_WAVOLDSH;古いアルゴリズムを使う
+HISTORY_MSG_WAVRADIUS;シャドウ/ハイライトの半径
+HISTORY_MSG_WAVSCALE;スケール
+HISTORY_MSG_WAVSHOWMASK;ウェーブレットのマスクを表示
+HISTORY_MSG_WAVSIGMA;シグマ
+HISTORY_MSG_WAVSOFTRAD;明瞭のソフトな半径
+HISTORY_MSG_WAVSOFTRADEND;最終画像のソフトな半径
+HISTORY_MSG_WAVUSHAMET;明瞭の方式
HISTORY_NEWSNAPSHOT;追加
HISTORY_NEWSNAPSHOT_TOOLTIP;ショートカット: Alt-s
HISTORY_SNAPSHOT;スナップショット
@@ -880,7 +1363,6 @@ IPTCPANEL_TITLE;タイトル
IPTCPANEL_TITLEHINT;画像を短く表す言葉や撮影者名、或いは画像のタイトルでもよい
IPTCPANEL_TRANSREFERENCE;作業のID
IPTCPANEL_TRANSREFERENCEHINT;作業工程の管理やトラッキングのための画像の数字或いは識別
-LENSPROFILE_LENS_WARNING;注意:レンズプロファイルに関する切り抜きの因数がカメラの因数より大きいと、誤った結果になるかもしれません
MAIN_BUTTON_FULLSCREEN;フルスクリーン
MAIN_BUTTON_ICCPROFCREATOR;ICCプロファイルクリエーター
MAIN_BUTTON_NAVNEXT_TOOLTIP;エディタで開いている画像に対応する次の画像に移動します\nショートカット: Shift-F4\n\nファイルブラウザで選択したサムネイルに対応する次の画像に移動するには\nショートカット: F4
@@ -921,7 +1403,7 @@ MAIN_TAB_ADVANCED;高度な機能
MAIN_TAB_ADVANCED_TOOLTIP;ショートカット: Alt-a
MAIN_TAB_COLOR;カラー
MAIN_TAB_COLOR_TOOLTIP;ショートカット: Alt-c
-MAIN_TAB_DETAIL;CbDL
+MAIN_TAB_DETAIL;ディテール
MAIN_TAB_DETAIL_TOOLTIP;ショートカット: Alt-d
MAIN_TAB_DEVELOP;一括編集
MAIN_TAB_EXIF;Exif
@@ -933,6 +1415,8 @@ MAIN_TAB_FAVORITES_TOOLTIP;ショートカット: Alt-u
MAIN_TAB_FILTER;絞り込み
MAIN_TAB_INSPECT;カメラ出しJPEG
MAIN_TAB_IPTC;IPTC
+MAIN_TAB_LOCALLAB;ローカル調整
+MAIN_TAB_LOCALLAB_TOOLTIP;ショートカット Alt-o
MAIN_TAB_METADATA;メタデータ
MAIN_TAB_METADATA_TOOLTIP;ショートカット: Alt-m
MAIN_TAB_RAW;raw
@@ -1012,20 +1496,24 @@ PARTIALPASTE_GRADIENT;減光フィルター
PARTIALPASTE_HSVEQUALIZER;HSV イコライザ
PARTIALPASTE_ICMSETTINGS;ICM 設定
PARTIALPASTE_IMPULSEDENOISE;インパルス・ノイズ低減
-PARTIALPASTE_IPTCINFO;IPTC 情報
+PARTIALPASTE_IPTCINFO;IPTC
PARTIALPASTE_LABCURVE;L*a*b* 調整
-PARTIALPASTE_LENSGROUP;レンズ設定
+PARTIALPASTE_LENSGROUP;レンズ関係の設定
PARTIALPASTE_LENSPROFILE;レンズ補正プロファイル
PARTIALPASTE_LOCALCONTRAST;ローカルコントラスト
+PARTIALPASTE_LOCALLAB;ローカル調整
+PARTIALPASTE_LOCALLABGROUP;ローカル調整の設定
+PARTIALPASTE_LOCGROUP;ローカル
PARTIALPASTE_METADATA;メタデータモード
PARTIALPASTE_METAGROUP;メタデータ
PARTIALPASTE_PCVIGNETTE;ビネットフィルター
PARTIALPASTE_PERSPECTIVE;パースペクティブの補正
PARTIALPASTE_PREPROCESS_DEADPIXFILT;デッドピクセルフィルターを適用
PARTIALPASTE_PREPROCESS_GREENEQUIL;グリーン 平衡化
-PARTIALPASTE_PREPROCESS_HOTPIXFILT;ホットピクセルフィルターを適用
+PARTIALPASTE_PREPROCESS_HOTPIXFILT;ホットピクセルフィルター
PARTIALPASTE_PREPROCESS_LINEDENOISE;ラインノイズ フィルタ
PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF ラインフィルタ
+PARTIALPASTE_PREPROCWB;ホワイトバランスの前処理
PARTIALPASTE_PRSHARPENING;リサイズ後のシャープニング
PARTIALPASTE_RAWCACORR_AUTO;自動色収差補正
PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA 色ずれを回避
@@ -1049,7 +1537,7 @@ PARTIALPASTE_SHADOWSHIGHLIGHTS;シャドウ/ハイライト
PARTIALPASTE_SHARPENEDGE;エッジ
PARTIALPASTE_SHARPENING;シャープニング (USM/RL)
PARTIALPASTE_SHARPENMICRO;マイクロコントラスト
-PARTIALPASTE_SOFTLIGHT;ソフトな明るさ
+PARTIALPASTE_SOFTLIGHT;ソフトライト
PARTIALPASTE_TM_FATTAL;ダイナミックレンジ圧縮
PARTIALPASTE_VIBRANCE;自然な彩度
PARTIALPASTE_VIGNETTING;周辺光量補正
@@ -1090,6 +1578,9 @@ PREFERENCES_CLUTSCACHE;HaldCLUT cache
PREFERENCES_CLUTSCACHE_LABEL;cacheに入れるHaldCLUTの最大数
PREFERENCES_CLUTSDIR;HaldCLUTのディレクトリー
PREFERENCES_CMMBPC;ブラックポイントの補正
+PREFERENCES_COMPLEXITYLOC;ローカル調整のデフォルトの複雑度
+PREFERENCES_COMPLEXITY_EXP;エキスパート
+PREFERENCES_COMPLEXITY_NORM;通常
PREFERENCES_CROP;切り抜き画像の編集
PREFERENCES_CROP_AUTO_FIT;切り抜き画像を自動的に拡大します
PREFERENCES_CROP_GUIDES;切り抜き画像が編集されていない時はガイドを表示します
@@ -1155,7 +1646,7 @@ PREFERENCES_MENUGROUPLABEL;"カラーラベル"のグループ
PREFERENCES_MENUGROUPPROFILEOPERATIONS;"処理プロファイル操作"のグループ
PREFERENCES_MENUGROUPRANK;"ランキング"のグループ
PREFERENCES_MENUOPTIONS;メニューオプションの状況
-PREFERENCES_MONINTENT;デフォルトのモニターインテント
+PREFERENCES_MONINTENT;デフォルトのレンダリングの目標
PREFERENCES_MONITOR;モニター
PREFERENCES_MONPROFILE;デフォルトのモニタープロファイル
PREFERENCES_MONPROFILE_WARNOSX;MacのOSの制約により、サポート出来るのはsRGBだけです
@@ -1206,6 +1697,7 @@ PREFERENCES_SHOWBASICEXIF;基本Exif情報を表示
PREFERENCES_SHOWDATETIME;日付表示
PREFERENCES_SHOWEXPOSURECOMPENSATION;露光補正追加
PREFERENCES_SHOWFILMSTRIPTOOLBAR;画像スライドにツールバーを表示する
+PREFERENCES_SHOWTOOLTIP;ローカル調整の機能のヒントを表示
PREFERENCES_SHTHRESHOLD;シャドウ・クリッピング領域のしきい値
PREFERENCES_SINGLETAB;シングルタブモードモード
PREFERENCES_SINGLETABVERTAB;シングル編集タブモード, 垂直タブ
@@ -1413,7 +1905,7 @@ TP_COLORAPP_CHROMA_M_TOOLTIP;CIECAM02の鮮やかさは L*a*b*やRGBの鮮やか
TP_COLORAPP_CHROMA_S;彩度 (S)
TP_COLORAPP_CHROMA_S_TOOLTIP;CIECAM02の彩度は L*a*b*やRGBの彩度とは異なります
TP_COLORAPP_CHROMA_TOOLTIP;CIECAM02の色度は L*a*b*やRGBの色度とは異なります
-TP_COLORAPP_CIECAT_DEGREE;CAT02に適応
+TP_COLORAPP_CIECAT_DEGREE;CAT02
TP_COLORAPP_CONTRAST;コントラスト (J)
TP_COLORAPP_CONTRAST_Q;コントラスト (Q)
TP_COLORAPP_CONTRAST_Q_TOOLTIP;CIECAM02のコントラスト(明るさQ)スライダーは L*a*b*やRGBとは異なります
@@ -1424,17 +1916,27 @@ TP_COLORAPP_CURVEEDITOR2;トーンカーブ2
TP_COLORAPP_CURVEEDITOR2_TOOLTIP;2番目の露光トーンカーブも同じ使い方です
TP_COLORAPP_CURVEEDITOR3;カラーカーブ
TP_COLORAPP_CURVEEDITOR3_TOOLTIP;色度、彩度、鮮やかさのいずれかを調整します\n\nCIECAM02調整前の色度(L*a*b*)のヒストグラムを表示します\nチェックボックスの"カーブにCIECAM02出力のヒストグラムを表示" が有効の場合、CIECAM02調整後のC,sまたはMのヒストグラムを表示します\n\nC, sとMは、メインのヒストグラム・パネルには表示されません\n最終出力は、メインのヒストグラム・パネルを参照してください
-TP_COLORAPP_DATACIE;カーブにCIECAM02出力のヒストグラムを表示
+TP_COLORAPP_DATACIE;カーブでCIECAM02出力のヒストグラムを表示
TP_COLORAPP_DATACIE_TOOLTIP;有効の場合、CIECAM02カーブのヒストグラムは、JかQ、CIECAM02調整後のCかs、またはMの値/範囲の近似値を表示します\nこの選択はメイン・ヒストグラムパネルには影響を与えません\n\n無効の場合、CIECAM02カーブのヒストグラムは、CIECAM調整前のL*a*b*値を表示します
-TP_COLORAPP_FREE;任意の色温度+グリーン + CAT02 + [出力]
+TP_COLORAPP_FREE;任意の色温度と色偏差 + CAT02 + [出力]
TP_COLORAPP_GAMUT;色域制御 (L*a*b*)
-TP_COLORAPP_GAMUT_TOOLTIP;L*a*b*モードの色域制御を許可
+TP_COLORAPP_GAMUT_TOOLTIP;L*a*b*モードの色域制御を可能にします
TP_COLORAPP_HUE;色相 (h)
TP_COLORAPP_HUE_TOOLTIP;色相 (h) - 0° から 360°の角度
+TP_COLORAPP_IL41;D41
+TP_COLORAPP_IL50;D50
+TP_COLORAPP_IL55;D55
+TP_COLORAPP_IL60;D60
+TP_COLORAPP_IL65;D65
+TP_COLORAPP_IL75;D75
+TP_COLORAPP_ILA;白熱灯標準A 2856K
+TP_COLORAPP_ILFREE;フリー
+TP_COLORAPP_ILLUM;光源
+TP_COLORAPP_ILLUM_TOOLTIP;撮影条件に最も近い条件を選択します\n一般的にはD50 ですが、時間と緯度に応じて変えます
TP_COLORAPP_LABEL;CIE色の見えモデル2002
TP_COLORAPP_LABEL_CAM02;画像の調整
-TP_COLORAPP_LABEL_SCENE;撮影環境条件
-TP_COLORAPP_LABEL_VIEWING;観視条件
+TP_COLORAPP_LABEL_SCENE;撮影環境
+TP_COLORAPP_LABEL_VIEWING;観視環境
TP_COLORAPP_LIGHT;明度 (J)
TP_COLORAPP_LIGHT_TOOLTIP;CIECAM02の明度は L*a*b*やRGBの明度とは異なります
TP_COLORAPP_MEANLUMINANCE;中間輝度 (Yb%)
@@ -1442,6 +1944,8 @@ TP_COLORAPP_MODEL;ホワイトポイント・モデル
TP_COLORAPP_MODEL_TOOLTIP;WB [RT] + [出力]:\nRTのホワイトバランスは、撮影環境に使用されます。CIECAM02はD50の設定, 出力デバイスのホワイトバランスは「環境設定」の「カラーマネジメント」の設定\n\nWB [RT+CAT02] + [出力]:\nRTのホワイトバランス設定は、CAT02で使用され、出力デバイスのホワイトバランスは環境設定の値を使用します
TP_COLORAPP_NEUTRAL;リセット
TP_COLORAPP_NEUTRAL_TIP;全てのスライダーチェックボックスとカーブをデフォルトにリセットします
+TP_COLORAPP_PRESETCAT02;cat02の自動プリセット
+TP_COLORAPP_PRESETCAT02_TIP;これを有効にすると、スライダー、色温度、色偏差がCAT02自動に合わせて設定されます\n撮影環境の輝度は変えることが出来ます\n必要であれば、CAT02の観視環境を変更します\n必要に応じて観視環境の色温度、色偏差、を変更します
TP_COLORAPP_RSTPRO;レッドと肌色トーンを保護
TP_COLORAPP_RSTPRO_TOOLTIP;レッドと肌色トーンを保護はスライダーとカーブの両方に影響します
TP_COLORAPP_SURROUND;周囲環境
@@ -1458,6 +1962,8 @@ TP_COLORAPP_TCMODE_LABEL2;カーブ・モード2
TP_COLORAPP_TCMODE_LABEL3;カーブ・色度モード
TP_COLORAPP_TCMODE_LIGHTNESS;明度
TP_COLORAPP_TCMODE_SATUR;彩度
+TP_COLORAPP_TEMP2_TOOLTIP;シンメトリカルモードの場合は色温度 = White balance.\n色偏差は常に1.0\n\nA光源 色温度=2856\nD41 色温度=4100\nD50 色温度=5003\nD55 色温度=5503\nD60 色温度=6000\nD65 色温度=6504\nD75 色温度=7504
+TP_COLORAPP_TEMPOUT_TOOLTIP;色温度と色偏差を変えるために無効にします
TP_COLORAPP_TEMP_TOOLTIP;選択した光源に関し色偏差は常に1が使われます\n\n色温度=2856\nD50 色温度=5003\nD55 色温度=5503\nD65 色温度=6504\nD75 色温度=7504
TP_COLORAPP_TONECIE;CIECAM02 明るさ(Q)を使用してトーンマッピング
TP_COLORAPP_TONECIE_TOOLTIP;このオプションが無効になっている場合、トーンマッピングはL*a*b*空間を使用します\nこのオプションが有効になっている場合、トーンマッピングは、CIECAM02を使用します\nトーンマッピング(L*a*b*/CIECAM02)ツールを有効にするには、この設定を有効にする必要があります
@@ -1538,8 +2044,8 @@ TP_CROP_PPI;PPI
TP_CROP_RESETCROP;リセット
TP_CROP_SELECTCROP;セレクト
TP_CROP_W;W 幅
-TP_CROP_X;X
-TP_CROP_Y;Y
+TP_CROP_X;左
+TP_CROP_Y;上部
TP_DARKFRAME_AUTOSELECT;自動選択
TP_DARKFRAME_LABEL;ダークフレーム
TP_DEFRINGE_LABEL;フリンジ低減
@@ -1552,7 +2058,7 @@ TP_DEHAZE_SHOW_DEPTH_MAP;深度マップの表示
TP_DEHAZE_STRENGTH;強さ
TP_DIRPYRDENOISE_CHROMINANCE_AMZ;自動(多分割方式)
TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;自動(分割方式)
-TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;色差 ブルー/イエロー
+TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;ブルー/イエロー
TP_DIRPYRDENOISE_CHROMINANCE_CURVE;色ノイズ低減のカーブ
TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;クロミナンススライダー全ての値を増幅します\n色度をベースにこのカーブで色ノイズ低減の強さを加減します。例えば彩度の低い部分で作用を強める、或いは色度の高い部分で作用を弱めるように使います
TP_DIRPYRDENOISE_CHROMINANCE_FRAME;色ノイズ
@@ -1568,7 +2074,7 @@ TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;プレビュー画像のサイズ=%1,
TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;プレビュー画像のノイズ: 平均値=%1 最大値=%2
TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;プレビュー画像のノイズ: 平均値= - 最大値= -
TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;タイルのサイズ=%1, 中心位置: X座標=%2 Y座標=%3
-TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;色差 レッド/グリーン
+TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;レッド/グリーン
TP_DIRPYRDENOISE_LABEL;ノイズ低減
TP_DIRPYRDENOISE_LUMINANCE_CONTROL;輝度ノイズの調整法
TP_DIRPYRDENOISE_LUMINANCE_CURVE;輝度カーブ
@@ -1585,7 +2091,7 @@ TP_DIRPYRDENOISE_MAIN_MODE;モード
TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;積極的
TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;控えめ
TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;”控えめ”モードは低周波の色度パターンが維持されますが、”積極的”モードではそれらも取り除かれます
-TP_DIRPYRDENOISE_MEDIAN_METHOD;方式
+TP_DIRPYRDENOISE_MEDIAN_METHOD;メディアンの方式
TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;色ノイズだけ
TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b*
TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;メディアンフィルター
@@ -1609,7 +2115,7 @@ TP_DIRPYREQUALIZER_ARTIF;アーティファクトを軽減
TP_DIRPYREQUALIZER_HUESKIN;肌色の色相
TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;このカーブは上部ほど、アルゴリズムが効率良く働くことを示しています。\n下部ほど、色相の遷移が見られる部分です。\nコントロールポイントを左右に大きく動かす必要が生じたり、アーティファクトが生じたりする場合は、ホワイトバランスが妥当ではない時です。\n他の色への影響を避けるには、調整範囲を少し減らします
TP_DIRPYREQUALIZER_LABEL;詳細レベルによるコントラスト調整
-TP_DIRPYREQUALIZER_LUMACOARSEST;粗い
+TP_DIRPYREQUALIZER_LUMACOARSEST;大まか
TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;コントラスト-
TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;コントラスト+
TP_DIRPYREQUALIZER_LUMAFINEST;細かい
@@ -1628,12 +2134,12 @@ TP_EPD_REWEIGHTINGITERATES;再加重反復
TP_EPD_SCALE;スケール
TP_EPD_STRENGTH;強さ
TP_EXPOSURE_AUTOLEVELS;自動露光補正
-TP_EXPOSURE_AUTOLEVELS_TIP;画像を解析し露光補正を自動で設定します
+TP_EXPOSURE_AUTOLEVELS_TIP;画像を解析し、露光補正を自動で行います\n必要に応じてハイライト復元を有効にします
TP_EXPOSURE_BLACKLEVEL;黒レベル
-TP_EXPOSURE_BRIGHTNESS;明度
+TP_EXPOSURE_BRIGHTNESS;明るさ
TP_EXPOSURE_CLAMPOOG;色域から外れた色を切り取る
TP_EXPOSURE_CLIP;クリップ %
-TP_EXPOSURE_CLIP_TIP;自動露光補正によるハイライトとシャドウ部分での飽和ピクセルの割合制限
+TP_EXPOSURE_CLIP_TIP;自動露光補正で使う飽和ピクセルの割合
TP_EXPOSURE_COMPRHIGHLIGHTS;ハイライト圧縮
TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;ハイライト圧縮 しきい値
TP_EXPOSURE_COMPRSHADOWS;シャドウ圧縮
@@ -1657,6 +2163,9 @@ TP_EXPOSURE_TCMODE_WEIGHTEDSTD;加重平均
TP_EXPOS_BLACKPOINT_LABEL;raw ブラック・ポイント
TP_EXPOS_WHITEPOINT_LABEL;raw ホワイト・ポイント
TP_FILMNEGATIVE_BLUE;ブルーの比率
+TP_FILMNEGATIVE_FILMBASE_PICK;フィルのベースカラーをピック
+TP_FILMNEGATIVE_FILMBASE_TOOLTIP;実際のフィルムのベースカラーを取得して、処理プロファイルに保存するために未露光のスポットをピック(例 フレームの境)\nこの方が、同じフィルムロールからの複数の画像をバッチ処理する際に、一貫性のあるカラーバランスを取り易いです\n変換する画像が極端に暗い、明るい、色のバランスが悪い場合に使えます。
+TP_FILMNEGATIVE_FILMBASE_VALUES;フィルムをベースにしたRGB:
TP_FILMNEGATIVE_GREEN;参考指数(コントラスト)
TP_FILMNEGATIVE_GUESS_TOOLTIP;原画像の中で色相がニュートラルな部分2か所をピックすることでレッドとブルーの比率を自動で設定します。明るさが異なる2か所をピックします。その後、ホワイトバランスを設定します。
TP_FILMNEGATIVE_LABEL;ネガフィルム
@@ -1734,7 +2243,7 @@ TP_ICM_SAVEREFERENCE_TOOLTIP;入力プロファイルが適用される前のリ
TP_ICM_TONECURVE;DCPトーンカーブ使用
TP_ICM_TONECURVE_TOOLTIP;DCPのプロファイルに含まれているトーンカーブを使用することができます
TP_ICM_WORKINGPROFILE;作業プロファイル
-TP_ICM_WORKING_TRC;トーン再現カーブ:
+TP_ICM_WORKING_TRC;TRC:
TP_ICM_WORKING_TRC_CUSTOM;カスタム
TP_ICM_WORKING_TRC_GAMMA;ガンマ
TP_ICM_WORKING_TRC_NONE;なし
@@ -1782,6 +2291,8 @@ TP_LABCURVE_RSTPRO_TOOLTIP;色度スライダーとCCカーブを使用するこ
TP_LENSGEOM_AUTOCROP;自動的に切り抜き選択
TP_LENSGEOM_FILL;オートフィル
TP_LENSGEOM_LABEL;レンズ / ジオメトリ
+TP_LENSGEOM_LIN;線形
+TP_LENSGEOM_LOG;対数
TP_LENSPROFILE_CORRECTION_AUTOMATCH;自動で選択
TP_LENSPROFILE_CORRECTION_LCPFILE;LCPファイル
TP_LENSPROFILE_CORRECTION_MANUAL;手動で選択
@@ -1797,6 +2308,561 @@ TP_LOCALCONTRAST_DARKNESS;暗い部分のレベル
TP_LOCALCONTRAST_LABEL;ローカルコントラスト
TP_LOCALCONTRAST_LIGHTNESS;明るい部分のレベル
TP_LOCALCONTRAST_RADIUS;半径
+TP_LOCALLAB_ACTIV;輝度だけ
+TP_LOCALLAB_ADJ;イコライザ ブルー/イエロー レッド/グリーン
+TP_LOCALLAB_ALL;全ての種類
+TP_LOCALLAB_AMOUNT;量
+TP_LOCALLAB_ARTIF;形状検出
+TP_LOCALLAB_ARTIF_TOOLTIP;色差の軽減を強めることで形状検出を向上させますが、形状の検出の範囲が狭まることがあります\n画像の形状のしきい値が画像のベタな部分のレベルを考慮します
+TP_LOCALLAB_AUTOGRAY;自動
+TP_LOCALLAB_AVOID;色ずれの回避
+TP_LOCALLAB_BALAN;ΔEのバランス ab-L
+TP_LOCALLAB_BALANEXP;ΔØ PDE バランス
+TP_LOCALLAB_BALANH;ΔEのバランス C-H
+TP_LOCALLAB_BALAN_TOOLTIP;色差のアルゴリズムのパラメータを変えます。\nab-L、C - Hを増減させます\nノイズ除去は変わりません
+TP_LOCALLAB_BASELOG;対数の基数
+TP_LOCALLAB_BILATERAL;平滑化フィルタ
+TP_LOCALLAB_BLACK_EV;ブラックEv
+TP_LOCALLAB_BLCO;色度だけ
+TP_LOCALLAB_BLENDMASKCOL;ブレンド
+TP_LOCALLAB_BLENDMASK_TOOLTIP;ブレンド=0の場合は、形状検出だけが改善します\nブレンドが0より大きい場合は、画像にマスクが追加されます。 ブレンドが0より小さい場合は、画像からマスクが除かれます。
+TP_LOCALLAB_BLGUID;ガイド付きフィルタ
+TP_LOCALLAB_BLINV;インバース
+TP_LOCALLAB_BLLC;輝度と色度
+TP_LOCALLAB_BLLO;輝度だけ
+TP_LOCALLAB_BLMED;メディアン
+TP_LOCALLAB_BLMETHOD_TOOLTIP;通常-全ての設定に対し、直接的なぼかしとノイズ\n反対‐スコープと拡張アルゴリズムを除いた設定で、ぼかしとノイズの反対処理\nシンメトリック‐全ての設定でぼかしとノイズの反対処理(予期せぬ結果になることが有り)
+TP_LOCALLAB_BLNOI_EXP;ぼかし & ノイズ
+TP_LOCALLAB_BLNORM;通常
+TP_LOCALLAB_BLSYM;シンメトリック
+TP_LOCALLAB_BLUFR;平滑化 - ぼかし - 質感 - ノイズ除去
+TP_LOCALLAB_BLUMETHOD_TOOLTIP;背景をぼかし、前景を分離するために:\n*RT-スポットが画像全体をカバーできるようにして(スコープと境界を高くする)背景をぼかします-通常或いはリバースモード\n*使用したい機能で一つ以上の除外RT-スポットを追加し(スコープを大きくします)、前景を分離します、マスクを使うことで効果を増幅出来ます
+TP_LOCALLAB_BLUR;ガウスぼかし - ノイズ - ノイズ除去
+TP_LOCALLAB_BLURCBDL;ぼかしのレベル 0-1-2-3-4
+TP_LOCALLAB_BLURCOL;マスクぼかしの半径
+TP_LOCALLAB_BLURDE;形状検出のぼかし
+TP_LOCALLAB_BLURLC;輝度だけ
+TP_LOCALLAB_BLURLEVELFRA;レベルのぼかし
+TP_LOCALLAB_BLURMASK_TOOLTIP;コントラストのしきい値と構造を考慮したマスクぼかしのスライダーでぼかしマスクを生成します。
+TP_LOCALLAB_BLURRESIDFRA;残差のぼかし
+TP_LOCALLAB_BLUR_TOOLNAME;平滑化ぼかし 質感 & ノイズ除去 - 1
+TP_LOCALLAB_BLWH;全ての変更を強制的に白黒にする
+TP_LOCALLAB_BLWH_TOOLTIP;色の構成要素、"a"と"b"の値を強制的にゼロにします
+TP_LOCALLAB_BUTTON_ADD;追加
+TP_LOCALLAB_BUTTON_DEL;削除
+TP_LOCALLAB_BUTTON_DUPL;複製
+TP_LOCALLAB_BUTTON_REN;名前の変更
+TP_LOCALLAB_BUTTON_VIS;表示/非表示
+TP_LOCALLAB_CBDL;詳細レベルによるコントラスト調整 - 不良の補正
+TP_LOCALLAB_CBDLCLARI_TOOLTIP;中間トーンを強化します
+TP_LOCALLAB_CBDL_ADJ_TOOLTIP;ウェーブレット機能のように作用します\n最初のレベル(0)は2x2ピクセルで解析します\n最後のレベル(5)は64x64ピクセルで解析します
+TP_LOCALLAB_CBDL_THRES_TOOLTIP;ノイズが先鋭化するのを避けます
+TP_LOCALLAB_CBDL_TOOLNAME;詳細レベルによるコントラスト調整 (不良部分の補正) - 2
+TP_LOCALLAB_CENTER_X;センターX
+TP_LOCALLAB_CENTER_Y;センターY
+TP_LOCALLAB_CH;カーブ CL - LC
+TP_LOCALLAB_CHROMA;色度
+TP_LOCALLAB_CHROMABLU;色度のレベル
+TP_LOCALLAB_CHROMABLU_TOOLTIP;輝度のスライダーと比べて増幅と減衰の作用の働きをします\n1以下で減衰、1以上で増幅の作用となります
+TP_LOCALLAB_CHROMACBDL;色度
+TP_LOCALLAB_CHROMACB_TOOLTIP;輝度のスライダーと比べて増幅と減衰の作用の働きをします\n100以下で減衰、100以上で増幅の作用となります
+TP_LOCALLAB_CHROMALEV;色度のレベル
+TP_LOCALLAB_CHROMASKCOL;色度のマスク
+TP_LOCALLAB_CHROMASK_TOOLTIP;このスライダーを使って背景の彩度を下げることが出来ます(インバースマスクで言う0に近いカーブ).\n色度に対するマスクの作用を強めることも出来ます。
+TP_LOCALLAB_CHRRT;色度
+TP_LOCALLAB_CIRCRADIUS;スポットサイズ
+TP_LOCALLAB_CIRCRAD_TOOLTIP;RT-スポットの参考値を含んでいるので、形状検出(色相、輝度、色度、Sobel)に有利です\n小さい値は花びらの補正などに便利です\n大きな値は肌などの補正に便利です
+TP_LOCALLAB_CLARICRES;色度を融合
+TP_LOCALLAB_CLARIFRA;明瞭とシャープマスク - ブレンド & ソフトイメージ
+TP_LOCALLAB_CLARILRES;輝度の融合
+TP_LOCALLAB_CLARISOFT;ソフトな半径
+TP_LOCALLAB_CLARISOFT_TOOLTIP;輝度の融合が0以外の場合に明瞭とシャープマスクが有効となります。\n\nウェーブレットピラミッドモジュールの全てが有効となります\nソフトな半径が0の場合は無効となります
+TP_LOCALLAB_CLARITYML;明瞭
+TP_LOCALLAB_CLARI_TOOLTIP;ウェーブレットのレベルが4以下の場合は、’シャープマスク’が有効となります。\n5以上のレベルでは’明瞭化’が有効となります。
+TP_LOCALLAB_CLIPTM;復元されたデータの切り取り(ゲイン)
+TP_LOCALLAB_COFR;色と明るさ - 小さな不良
+TP_LOCALLAB_COLORDE;プレビューのカラー選択 ΔE - 強さ
+TP_LOCALLAB_COLORDEPREV_TOOLTIP;有効になっている機能が1つだけの時は、設定のパネル(拡張する)のΔEのプレビューボタンを使います。\n複数の機能が有効になっている時は、各機能に備わっているマスクと調節の中のΔEのプレビューを使います。
+TP_LOCALLAB_COLORDE_TOOLTIP;設定値がマイナスの場合は色差(ΔE)のプレビューの色をブルーで表示、プラスの場合はグリーンで表示\n\nマスクと調節(マスクなしで調節を表示):プラスであれば、実際の変更を表示、マイナスであれば、強化した調節(輝度のみ)をブルーとイエローで表示
+TP_LOCALLAB_COLORSCOPE;カラー機能のスコープ
+TP_LOCALLAB_COLORSCOPE_TOOLTIP;色と明るさ、露光補正(標準)、シャドウ/ハイライト、自然な彩度は共通したスコープを使います。\n他の機能に関しては、それぞれ特定のスコープを使います。
+TP_LOCALLAB_COLOR_TOOLNAME;色&&明るさ (不良部分の補正) - 11
+TP_LOCALLAB_COL_NAME;名前
+TP_LOCALLAB_COL_VIS;ステータス
+TP_LOCALLAB_COMPFRA;詳細レベルの方向によるコントラスト
+TP_LOCALLAB_COMPFRAME_TOOLTIP;特殊な効果を付けるために使います。アーティファクトを軽減するためには'明瞭 & シャープマスク、ブレンド & ソフトイメージ'を使います\n処理時間が大きく増えます
+TP_LOCALLAB_COMPLEX_METHOD;ソフトウェアの複雑度
+TP_LOCALLAB_COMPLEX_TOOLTIP; ローカル調整の扱いの複雑度を選択出来ます
+TP_LOCALLAB_COMPREFRA;ウェーブレットを使ったレベルのダイナミックレンジ(非)圧縮
+TP_LOCALLAB_COMPRESS_TOOLTIP;アーティファクトを軽減するため必要に応じて'明瞭 & シャープマスク、ブレンド & ソフトイメージ'の'ソフトな半径'使います
+TP_LOCALLAB_CONTCOL;マスクぼかしのコントラストしきい値
+TP_LOCALLAB_CONTFRA;レベルによるコントラスト調整
+TP_LOCALLAB_CONTRAST;コントラスト
+TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;メインのマスクのコントラストをコントロール
+TP_LOCALLAB_CONTRESID;コントラスト
+TP_LOCALLAB_CONTTHR;コントラストのしきい値
+TP_LOCALLAB_CSTHRESHOLD;Ψ ウェーブレットのレベル
+TP_LOCALLAB_CSTHRESHOLDBLUR;Ψ ウェーブレットレベルのマスク
+TP_LOCALLAB_CURV;明るさ - コントラスト - 色度 "強力"
+TP_LOCALLAB_CURVCURR;通常
+TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;カーブが最上部に位置している時は、マスクが完全に黒く表示され、マスクの作用がない状態\nカーブを下に下げるにつれ、マスクの色が変わり、合わせて画像の状態も変わる
+TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;使うためには'カーブを有効にする'に✔を入れる
+TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;トーンカーブ
+TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), 色と明るさでL(H)との併用可
+TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'通常', L=f(L)カーブはスライダーと同じアルゴリズムを使っています\n'強力' L=f(L)カーブで作用を強めた新しいアルゴリズムを使っていますが、場合によってアーティファクトが出ることがあります
+TP_LOCALLAB_CURVENCONTRAST;強力+コントラストのしきい値(試験的)
+TP_LOCALLAB_CURVENH;強力
+TP_LOCALLAB_CURVENHSU;色相と色度の組み合わせ(試験的)
+TP_LOCALLAB_CURVENSOB2;色相と色度の組み合わせ+コントラストのしきい値(試験的)
+TP_LOCALLAB_CURVNONE;カーブを無効
+TP_LOCALLAB_DARKRETI;暗さ
+TP_LOCALLAB_DEHAFRA;霞除去
+TP_LOCALLAB_DEHAZ;強さ
+TP_LOCALLAB_DEHAZ_TOOLTIP;マイナス値にすると霞が増えます
+TP_LOCALLAB_DELTAD;色差のバランス
+TP_LOCALLAB_DELTAEC;ΔE画像のマスク
+TP_LOCALLAB_DENOIS;Ψ ノイズ除去
+TP_LOCALLAB_DENOI_EXP;ノイズ除去
+TP_LOCALLAB_DENOI_TOOLTIP;このモジュール(処理工程の後の方に位置)だけで使うことも、メインのノイズ低減(処理工程の最初の方に位置)と併用することも出来ます\nスコープは色(ΔE)に応じてノイズ除去の作用に違いを持たせます。\n”メディアン”と”ガイド付きフィルタ”(平滑化ぼかし)も使えば、ノイズ除去のパフォーマンスが良くなります。\n”レベルのぼかし”や”ウェーブレットピラミッド”の併用で更にノイズ除去のパフォーマンスが上がります。
+TP_LOCALLAB_DEPTH;深度
+TP_LOCALLAB_DETAIL;ローカルコントラスト
+TP_LOCALLAB_DETAILSH;ディテール
+TP_LOCALLAB_DETAILTHR;細部の色の明るさのしきい値 (DCT)
+TP_LOCALLAB_DUPLSPOTNAME;コピー
+TP_LOCALLAB_EDGFRA;エッジシャープネス
+TP_LOCALLAB_EDGSHOW;全ての機能を表示
+TP_LOCALLAB_ELI;楕円
+TP_LOCALLAB_ENABLE_AFTER_MASK;トーンマッピングを使う
+TP_LOCALLAB_ENABLE_MASK;マスクを有効にする
+TP_LOCALLAB_ENABLE_MASKAFT;露光補正の全てのアルゴリズムを使う
+TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;元のデータの代わりに透過マップを使った後は、有効にしたマスクは保持されているデータを使います。
+TP_LOCALLAB_ENH;強化
+TP_LOCALLAB_ENHDEN;強化 + 色ノイズの軽減
+TP_LOCALLAB_EPSBL;ディテール
+TP_LOCALLAB_EQUIL;輝度の標準化
+TP_LOCALLAB_EQUILTM_TOOLTIP;出力画像の輝度の平均と分散が元画像のそれらと同じになるように輝度を回復するオプションです
+TP_LOCALLAB_ESTOP;エッジ停止
+TP_LOCALLAB_EV_DUPL;のコピー
+TP_LOCALLAB_EV_NVIS;非表示
+TP_LOCALLAB_EV_NVIS_ALL;全て非表示
+TP_LOCALLAB_EV_VIS;表示
+TP_LOCALLAB_EV_VIS_ALL;全て表示
+TP_LOCALLAB_EXCLUF;除外
+TP_LOCALLAB_EXCLUF_TOOLTIP;スコープを動かして色を拡張するような場合、データの一部を除外する場合に使います\nRT-スポットに対する全ての設定で適用できます。
+TP_LOCALLAB_EXCLUTYPE;スポットのタイプ
+TP_LOCALLAB_EXCLUTYPE_TOOLTIP;通常方式は、スポットのデータを繰り返して使います\n例外方式は元のデータに戻して使う方式です
+TP_LOCALLAB_EXECLU;除外スポット
+TP_LOCALLAB_EXNORM;通常スポット
+TP_LOCALLAB_EXPCBDL_TOOLTIP;センサーの汚れに起因する不良で、それらが画像の大切な部分にある、或いは複数個所にそれらある場合\n\na) RT-スポットをその部分に作成(必要であれば大きさを調節); b) または複数個所をカバーするスポットを作成; c) 比較的大きな境界の調整を設定; d) レベル3と4のスライダー、場合によっては2の値も100以下にします。必要に応じて色度のスライダーも使います。
+TP_LOCALLAB_EXPCHROMA;色度の補間
+TP_LOCALLAB_EXPCHROMA_TOOLTIP;この機能は露光量補正とPDE IPOLだけに関わります\n色が褪せるのを避けます
+TP_LOCALLAB_EXPCOLOR_TOOLTIP;不良個所か小さい場合:\n\n赤目 : 中心円を赤い部分に合わせ、RT-スポットの範囲を眼の大きさ程度にします。スコープの値を小さくし、"明るさ" -100, "色" -100にします\n\n赤外線センサーのスポット:中心円を不良個所に合わせます、 RT-スポットの範囲はデフォルトに近い大きさで構いません - "色"を減らし、場合によっては"スコープ"を使って作用の及ぶ範囲を調節します\n\nセンサーの汚れ(小):中心円を不良部分に合わせます(スポットサイズも調整します)、RT-スポットの範囲が不良個所にあまり近づかないようにします(境界部分が目立たないようにする) a) "境界の調節"は小さくします; b) "輝度"、場合によっては"色" を使って不良個所のレンダリングを正常な部分のレンダリングに近づけます; c) "スコープ"を適度に使って作用の及ぶ範囲を調節します
+TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;ウェーブレットのレベル或いはノイズ除去の説明を参照して下さい。\n但し、幾つか変更されている部分もあります:より多くの機能がノイズ除去に関する詳細が多くなっています。\nウェーブレットのレベルのトーンマッピング
+TP_LOCALLAB_EXPCONTRAST_TOOLTIP;大きさが50x50ピクセルより小さいスポットを使うのは避けます\n代わりに、境界値を低く、境界の減衰値とスコープ値を高く設定して小さなRT-スポットを真似ます\nアーティストを軽減するために、必要であれば’ソフトな半径’を調整しながら’明瞭 & シャープマスクとイメージのブレンド’モジュールを使います
+TP_LOCALLAB_EXPCURV;カーブ
+TP_LOCALLAB_EXPGRAD;階調フィルタ
+TP_LOCALLAB_EXPLAPBAL_TOOLTIP;元画像とラプラス変換の間のバランスをとります
+TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;ラプラス変換の適用前後でガンマを適用します
+TP_LOCALLAB_EXPLAPLIN_TOOLTIP;ラプラス変換の適用前に、露光補正の線形要素を追加します
+TP_LOCALLAB_EXPLAP_TOOLTIP;しきい値のスライダーを増やすほど、コントラストの減衰作用が強くなります
+TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;画像を融合するために複数の機能が使えます(Photoshopのレイヤーのように):差分、積算、ソフトライト、オーバーレイ+不透明度。。。\n元画像 : 現在のRT-スポットを元画像と融合.\n前のスポット : 現在のRT-スポットを前のRT-スポットと融合 – スポットが一つだけの場合は元画像との融合になります\n背景:現在のRT-スポットを背景の色と輝度と融合します
+TP_LOCALLAB_EXPMETHOD_TOOLTIP;標準:メインの露光補正と類似したアルゴリズムを使いますが、 L*a*b*で作業するため色差を考慮します\n\nラプラスとポアソン方程式:色差を考慮する別なアルゴリズムですが、フーリエ空間でのラプラスの欠点を解決すためポアソン方程式(PDE)を使います\nPDEを使ったアルゴリズムは結果が大きく異なるため、標準とは異なる設定が必要でしょう\n露出不足の画像に有効かもしれません\nPDEはアーティファクトとノイズを軽減します
+TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;アーティファクト(ノイズ)の発生を避けるため、ラプラス変換の前にメディアンを適用します
+TP_LOCALLAB_EXPOSE;露光補正-PDEアルゴリズム
+TP_LOCALLAB_EXPOSURE_TOOLTIP;シャドウ部分が強いような場合は、”シャドウ/ハイライト”のモジュールが使えます
+TP_LOCALLAB_EXPRETITOOLS;高度なレティネックス機能
+TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-スポットの大きさが最低でも39x39ピクセル必要です\nスポットが小さい場合は、低い境界値、高い減衰値、高いスコープ値を設定します
+TP_LOCALLAB_EXPTOOL;露光補正の機能
+TP_LOCALLAB_EXPTRC;トーンリプロダクションカーブ - TRC
+TP_LOCALLAB_EXP_TOOLNAME;露光補正 - ダイナミックレンジ圧縮 - 10
+TP_LOCALLAB_FATAMOUNT;量
+TP_LOCALLAB_FATANCHOR;アンカー
+TP_LOCALLAB_FATANCHORA;オフセット
+TP_LOCALLAB_FATDETAIL;ディテール
+TP_LOCALLAB_FATFRA;ダイナミックレンジ圧縮 f
+TP_LOCALLAB_FATFRAME_TOOLTIP;ここではFattalトーンマッピングアルゴリズムを使います\nアンカーで画像の露出不足・過多に応じた選択が出来ます\n現在のスポットに近く、マスクを使用する2番目のスポットの輝度を増やすのに便利です
+TP_LOCALLAB_FATLEVEL;シグマ
+TP_LOCALLAB_FATRES;残差画像の量
+TP_LOCALLAB_FATSHFRA;マスクのダイナミックレンジ圧縮のマスク f
+TP_LOCALLAB_FEATH_TOOLTIP;スポットの対角線に対する減光フィルタの幅の割合\n..
+TP_LOCALLAB_FEATVALUE;フェザー処理(階調フィルタ)
+TP_LOCALLAB_FFTCOL_MASK;FFTW f
+TP_LOCALLAB_FFTW;f 高速フーリエ変換を使う
+TP_LOCALLAB_FFTW2;f 高速フーリエ変換を使う(TIF, JPG,..)
+TP_LOCALLAB_FFTWBLUR;ƒ - 常に高速フーリエ変換を使う
+TP_LOCALLAB_FULLIMAGE;画像全体のブラックEvとホワイトEvを計算
+TP_LOCALLAB_GAM;ガンマ
+TP_LOCALLAB_GAMFRA;トーンリプロダクションカーブ(TRC)
+TP_LOCALLAB_GAMM;ガンマ
+TP_LOCALLAB_GAMMASKCOL;ガンマのマスク
+TP_LOCALLAB_GAMSH;ガンマ
+TP_LOCALLAB_GRADANG;階調フィルタの角度
+TP_LOCALLAB_GRADANG_TOOLTIP;-180度から+180度の間で角度を調整
+TP_LOCALLAB_GRADFRA;階調フィルタ
+TP_LOCALLAB_GRADGEN_TOOLTIP;階調フィルタの機能は”色と明るさ”と、”露光”、”シャドウ/ハイライト”、”自然な彩度”に備わっています\n\n自然な彩度、色と明るさには輝度、色調、色相の階調フィルタが使えます\nフェザー処理は設定の中にあります
+TP_LOCALLAB_GRADLOGFRA;階調フィルタ 輝度
+TP_LOCALLAB_GRADSTR;階調フィルタ 強さ
+TP_LOCALLAB_GRADSTRAB_TOOLTIP;色度の階調の強さを調整します
+TP_LOCALLAB_GRADSTRCHRO;色調の階調の強さ
+TP_LOCALLAB_GRADSTRHUE;色相の階調の強さ(融合されたファイル)
+TP_LOCALLAB_GRADSTRHUE2;色相の階調の強さ
+TP_LOCALLAB_GRADSTRHUE_TOOLTIP;色相の階調の強さを調整します
+TP_LOCALLAB_GRADSTRLUM;輝度の階調の強さ
+TP_LOCALLAB_GRADSTR_TOOLTIP;露出度の階調の強さを調整します
+TP_LOCALLAB_GRAINFRA;フィルムの質感 1:1
+TP_LOCALLAB_GRALWFRA;階調フィルタ ローカルコントラスト
+TP_LOCALLAB_GRIDFRAME_TOOLTIP;スポットは均一な画像部分にある方が望ましいです\n\n通常モードの場合だけに使えます。融合された背景による色相、彩度、色、輝度が関係します。
+TP_LOCALLAB_GRIDONE;カラートーン調整
+TP_LOCALLAB_GRIDTWO;直接
+TP_LOCALLAB_GUIDBL;ソフトな半径
+TP_LOCALLAB_GUIDFILTER;ガイド付きフィルタの半径
+TP_LOCALLAB_GUIDFILTER_TOOLTIP;画像に応じて値を決めます - 画像が霞んでいなければ値を低く取ります
+TP_LOCALLAB_HHMASK_TOOLTIP;例えば肌の微妙な色相調整に使います
+TP_LOCALLAB_HIGHMASKCOL;ハイライトマスク
+TP_LOCALLAB_HLH;カーブ H
+TP_LOCALLAB_IND;独立 (マウス)
+TP_LOCALLAB_INDSL;独立 (マウス + スライダー)
+TP_LOCALLAB_INVERS;反対
+TP_LOCALLAB_INVERS_TOOLTIP;反対を選択すると調整の多様性が失われます\n\n代わりの方法\n初めのスポット:\n画像全体 –境界線をプレビュー画像の外側にセットします\n スポットの形状は矩形、境界値は100\n\n2番目のスポットを作成し除外スポットにします
+TP_LOCALLAB_ISOGR;粗さ (ISO)
+TP_LOCALLAB_LABBLURM;マスクぼかし
+TP_LOCALLAB_LABEL;ローカル調整
+TP_LOCALLAB_LABGRID;カラー補正グリッド
+TP_LOCALLAB_LABGRIDMERG;背景
+TP_LOCALLAB_LABGRID_VALUES;高(a)=%1 高(b)=%2\n低(a)=%3 低(b)=%4
+TP_LOCALLAB_LABSTRUM;マスクの構造
+TP_LOCALLAB_LAPLACC;ΔØ ラプラシアンマスク PDEの境界条件あり
+TP_LOCALLAB_LAPLACE;Δ ラプラシアンのしきい値 ΔE
+TP_LOCALLAB_LAPLACEXP;Δ ラプラシアンのしきい値
+TP_LOCALLAB_LAPMASKCOL;Δ ラプラシアンのしきい値マスク
+TP_LOCALLAB_LAPRAD_TOOLTIP;半径とラプラス変換のしきい値を同時に使うことを避けます。
+TP_LOCALLAB_LAP_MASK_TOOLTIP;全てのラプラシアンマスクのポアソン方程式の解を求めます\nラプラシアンのしきい値マスクを有効にするとアーティファクトが軽減され、スムーズな効果が得られます\n無効の場合は線形的な応答となります
+TP_LOCALLAB_LC_FFTW_TOOLTIP;高速フーリエ変換は画像の質を改善し、大きな半径を使えるようにします\n処理する領域の大きさに応じて処理時間が増えます\n大きな半径で使うことを奨めます\n\nFFTWの最適化を図るために領域を数ピクセル削ります
+TP_LOCALLAB_LC_TOOLNAME;ローカルコントラスト & ウェーブレット (不良部分の補正) - 7
+TP_LOCALLAB_LEVELBLUR;ぼかしを施すレベルの最大値
+TP_LOCALLAB_LEVELLOCCONTRAST_TOOLTIP;横軸はローカルコントラスト(輝度に近い)を表し、縦軸はローカルコントラストの増減を表します
+TP_LOCALLAB_LEVELWAV;Ψ ウェーブレットのレベル
+TP_LOCALLAB_LEVELWAV_TOOLTIP;詳細レベルの数はスポットとプレビューのサイズに応じて自動で決まります\n最大512ピクセルで解析するレベル8から最大4ピクセルで解析するレベル1まで
+TP_LOCALLAB_LIGHTNESS;明るさ
+TP_LOCALLAB_LIGHTN_TOOLTIP;反対モードで明るさを-100にすると輝度が0になります
+TP_LOCALLAB_LIGHTRETI;明るさ
+TP_LOCALLAB_LINEAR;線形性
+TP_LOCALLAB_LIST_NAME;現在のスポットに機能を追加
+TP_LOCALLAB_LIST_TOOLTIP;機能を選んだ後、その複雑度、”通常”或いは”エキスパート”を選択します\n付随する番号は各RT-スポットの処理の中の機能がある場所をしましています
+TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;選択したウェーブレットのレベルによって、中間トーンとハイライトへの作用を優先します
+TP_LOCALLAB_LMASK_LL_TOOLTIP;中間トーンとハイライトへの作用を優先します
+TP_LOCALLAB_LOCCONT;アンシャープマスク
+TP_LOCALLAB_LOC_CONTRAST;ローカルコントラスト-ウェーブレット-欠損/汚れの補正
+TP_LOCALLAB_LOC_CONTRASTPYR;Ψ ピラミッド1:
+TP_LOCALLAB_LOC_CONTRASTPYR2;Ψ ピラミッド2:
+TP_LOCALLAB_LOC_CONTRASTPYR2LAB;レベルによるコントラスト調整- トーンマッピング(s)
+TP_LOCALLAB_LOC_CONTRASTPYRLAB;階調フィルタ - エッジシャープネス - ぼかし
+TP_LOCALLAB_LOC_RESIDPYR;残差画像 メイン
+TP_LOCALLAB_LOG;対数符号化
+TP_LOCALLAB_LOGAUTO;自動
+TP_LOCALLAB_LOGAUTO_TOOLTIP;このボタンを押すことで、ダイナミックレンジとグレーポイントの源泉の推定値が得られます(グレーポイントの源泉で"自動"が有効になっている場合)\n自動計算による値を仕上げるためには、もう一度ボタンを押します
+TP_LOCALLAB_LOGBASE_TOOLTIP;デフォルト値は2です\n2以下にするとアルゴリズムの作用が減少します。シャドウ部分がより暗く、ハイライト部分がより明るくなります\n2以上にするとアルゴリズムの作用が変わります。シャドウ部分は灰色がかり、ハイライト部分の色がさめた印象になります
+TP_LOCALLAB_LOGBLACKWHEV_TOOLTIP;ダイナミックレンジの推定値 - ブラックEvとホワイトEv
+TP_LOCALLAB_LOGENCOD_TOOLTIP;対数符号化(ACES)を使ってトーンマッピングを行います\n露出不足やハイダイナミックレンジの画像の補正に便利です\n\n処理は : 1) ダイナミックレンジを計算、2) 好みに応じて調節
+TP_LOCALLAB_LOGFRA;グレーポイントの源泉
+TP_LOCALLAB_LOGFRAME_TOOLTIP;処理の初期段階で画像の露光レベルを計算する、或いはそのまま使用します:\n前者はブラックEv, ホワイトEv、グレーポイントの源泉から計算\n後者はメインの露光量補正の値を使います
+TP_LOCALLAB_LOGLIN;対数モード
+TP_LOCALLAB_LOGPFRA;相対的な露光レベル
+TP_LOCALLAB_LOGSRCGREY_TOOLTIP;画像のグレーポイントの推定値、処理行程の前の方
+TP_LOCALLAB_LOGTARGGREY_TOOLTIP;好みに合わせて適用する値を変えられます
+TP_LOCALLAB_LOG_TOOLNAME;対数符号化 - 0
+TP_LOCALLAB_LUM;カーブ LL - CC
+TP_LOCALLAB_LUMADARKEST;最も暗い部分
+TP_LOCALLAB_LUMASK;マスクの背景輝度
+TP_LOCALLAB_LUMASK_TOOLTIP;マスクの表示(マスクと調節)で、背景のグレーを調節します
+TP_LOCALLAB_LUMAWHITESEST;最も明るい部分
+TP_LOCALLAB_LUMONLY;輝度だけ
+TP_LOCALLAB_MASFRAME;マスクと融合
+TP_LOCALLAB_MASFRAME_TOOLTIP;全てのマスクに共通する\nガンマ、スロープ、色度、コントラストカーブ、詳細レベルのコントラストカーブのマスクが使われる時は、選択領域のレタッチを避けるために色差イメージを考慮する。
+TP_LOCALLAB_MASK;マスク
+TP_LOCALLAB_MASK2;コントラストカーブのマスク
+TP_LOCALLAB_MASKCOL;カーブマスク
+TP_LOCALLAB_MASKH;色相のカーブマスク
+TP_LOCALLAB_MASK_TOOLTIP;使いたい一つの機能で複数のマスクを有効に出来ますが、そのためには別の機能を有効にする必要があります(但し、その機能自体を使う必要はありません、例えば、スライダーが0でも構いません)\nこの特性を有するマスクには’+’のマークがあります\n追加的な機能を持つマスクには’*’のマークが付いています\n数字が示すのはマスクの使用の順番です\n\nインバースマスクがある機能に関するマスクは組み合わせることが可能です\nこの場合、マスクに関連する新しい機能はインバースの中で選択します;その機能を使う際は値を非常に小さくしなければなりません(例えば、露光0.01)
+TP_LOCALLAB_MED;中間
+TP_LOCALLAB_MEDIAN;メディアン 低
+TP_LOCALLAB_MEDNONE;なし
+TP_LOCALLAB_MERCOL;色
+TP_LOCALLAB_MERDCOL;背景の融合(ΔE)
+TP_LOCALLAB_MERELE;明るくするだけ
+TP_LOCALLAB_MERFIV;追加
+TP_LOCALLAB_MERFOR;色の覆い焼き
+TP_LOCALLAB_MERFOU;乗算
+TP_LOCALLAB_MERGE1COLFRA;オリジナル或いは前のイメージと融合
+TP_LOCALLAB_MERGECOLFRA;マスク: LCHと構造
+TP_LOCALLAB_MERGEFIV;前のスポット(マスク7) + LCHマスク
+TP_LOCALLAB_MERGEFOU;前のスポット(マスク7)
+TP_LOCALLAB_MERGEMER_TOOLTIP;融合画像に対しΔEを計算に入れます(この方法はスコープの作用と同等です)
+TP_LOCALLAB_MERGENONE;なし
+TP_LOCALLAB_MERGEONE;ショートカーブ'L'のマスク
+TP_LOCALLAB_MERGEOPA_TOOLTIP;オリジナル或いは前のスポットと現在のスポットとの融合する際の不透明度の % \nコントラストのしきい値:オリジナルコントラストの機能の結果を調整
+TP_LOCALLAB_MERGETHR;オリジナル(マスク7) + LCHマスク
+TP_LOCALLAB_MERGETWO;オリジナル(マスク7)
+TP_LOCALLAB_MERGETYPE;イメージとマスクの融合
+TP_LOCALLAB_MERGETYPE_TOOLTIP;なしの場合、LCHモードの全てのマスクを使います\nショートカーブ 'L'マスクの場合、マスク2、3、4、6、7はスキップします\nオリジナルマスク7の場合、現在のイメージと元のイメージを融合します
+TP_LOCALLAB_MERHEI;重ね合わせ
+TP_LOCALLAB_MERHUE;色相
+TP_LOCALLAB_MERLUCOL;輝度
+TP_LOCALLAB_MERLUM;光度
+TP_LOCALLAB_MERNIN;スクリーン
+TP_LOCALLAB_MERONE;標準
+TP_LOCALLAB_MERSAT;彩度
+TP_LOCALLAB_MERSEV;ソフトライト Photoshop
+TP_LOCALLAB_MERSEV0;ソフトライト イリュージョン
+TP_LOCALLAB_MERSEV1;ソフトライト W3C
+TP_LOCALLAB_MERSEV2;ハードライト
+TP_LOCALLAB_MERSIX;分割
+TP_LOCALLAB_MERTEN;暗くするだけ
+TP_LOCALLAB_MERTHI;色の焼き込み
+TP_LOCALLAB_MERTHR;差異
+TP_LOCALLAB_MERTWE;除外
+TP_LOCALLAB_MERTWO;減算
+TP_LOCALLAB_METHOD_TOOLTIP;'強化 + 色ノイズ低減'を選ぶと処理時間が著しく増加します\nしかし、アーティファクトは軽減されます
+TP_LOCALLAB_MLABEL;復元されたデータ 最小値=%1 最大値=%2 (クリップ - オフセット)
+TP_LOCALLAB_MLABEL_TOOLTIP;最低値=0、最大値=32768の近くになるよう調整します\n標準化を行うため‘保持されたデータを切り取る’と‘オフセット’を使えます\n\n混成のない画像に戻します
+TP_LOCALLAB_MODE_EXPERT;エキスパート
+TP_LOCALLAB_MODE_NORMAL;通常
+TP_LOCALLAB_MRFIV;背景
+TP_LOCALLAB_MRFOU;前のスポット
+TP_LOCALLAB_MRONE;なし
+TP_LOCALLAB_MRTHR;元のイメージ
+TP_LOCALLAB_MRTWO;ショートカーブ 'L'マスク
+TP_LOCALLAB_MULTIPL_TOOLTIP;非常に広範囲(-18EV~+4EV)でトーンのレタッチが出来ます。初めのスライダーは-18EV~-6EVの非常に暗い部分に作用します。最後のスライダーは4EVまでの明るい部分に作用します
+TP_LOCALLAB_NEIGH;半径
+TP_LOCALLAB_NOISECHROCOARSE;色度 粗い (ウェーブレット)
+TP_LOCALLAB_NOISECHROC_TOOLTIP;0より大きい値で効果の高いアルゴリズムが働き始めます\n大まかなスライダーの場合は2以上からです
+TP_LOCALLAB_NOISECHRODETAIL;色度 細部の回復 (DCT)
+TP_LOCALLAB_NOISECHROFINE;色度 細かい (ウェーブレット)
+TP_LOCALLAB_NOISEDETAIL_TOOLTIP;スライダー値が100になると無効
+TP_LOCALLAB_NOISELEQUAL;イコライザ 白黒
+TP_LOCALLAB_NOISELUMCOARSE;輝度 大まか(ウェーブレット)
+TP_LOCALLAB_NOISELUMDETAIL;輝度 細部の回復 (DCT)
+TP_LOCALLAB_NOISELUMFINE;輝度 詳細レベル2(ウェーブレット)
+TP_LOCALLAB_NOISELUMFINETWO;輝度 詳細レベル3(ウェーブレット)
+TP_LOCALLAB_NOISELUMFINEZERO;輝度 詳細レベル1(ウェーブレット)
+TP_LOCALLAB_NOISEMETH;ノイズ低減
+TP_LOCALLAB_NONENOISE;なし
+TP_LOCALLAB_OFFS;オフセット
+TP_LOCALLAB_OFFSETWAV;オフセット
+TP_LOCALLAB_OPACOL;不透明度
+TP_LOCALLAB_ORIGLC;元画像だけと融合
+TP_LOCALLAB_ORRETILAP_TOOLTIP;2次ラプラシアンのしきい値に作用します。作用に差をつけるため、特に背景に対する作用、ΔEを計算に入れます(スコープの作用と異なります)
+TP_LOCALLAB_ORRETISTREN_TOOLTIP;1次ラプラシアンのしきい値に作用します。設定値を高くするほど、コントラストの違いが減少します
+TP_LOCALLAB_PASTELS2;自然な彩度
+TP_LOCALLAB_PDE;ΔØ ラプラシアン PDE - ダイナミックレンジ圧縮 + 標準
+TP_LOCALLAB_PDEFRA;PDE IPOL - コントラスト減衰
+TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL - IPOLから取り入れ、独自にRawtherapee用にアレンジしたアルゴリズム:非常に異なる効果が出るので設定を変える必要があります。標準的にはブラックをマイナス値、ガンマを1以下にするなど\n露出の低い画像に便利だと思われます\n
+TP_LOCALLAB_PREVIEW;ΔEのプレビュー
+TP_LOCALLAB_PROXI;ΔEの減衰
+TP_LOCALLAB_QUALCURV_METHOD;カーブのタイプ
+TP_LOCALLAB_QUAL_METHOD;全体の質
+TP_LOCALLAB_RADIUS;半径
+TP_LOCALLAB_RADIUS_TOOLTIP;半径の値が30より大きい場合は、高速フーリエ変換を使います
+TP_LOCALLAB_RADMASKCOL;半径のマスクを滑らかにする
+TP_LOCALLAB_RECT;長方形
+TP_LOCALLAB_RECURS;参考値の繰り返し
+TP_LOCALLAB_RECURS_TOOLTIP;新しいモジュール使用とRT-スポットが作成される度に、色相、輝度、色度の参考値が再計算されます。\nマスクを使った作業に便利です。
+TP_LOCALLAB_REFLABEL;参照 (0..1) 色度=%1 輝度=%2 色相=%3
+TP_LOCALLAB_REN_DIALOG_LAB;新しいコントロールスポットの名前を入力
+TP_LOCALLAB_REN_DIALOG_NAME;コントロールスポットの名前変更
+TP_LOCALLAB_RESETSHOW;全ての表示変更をリセット
+TP_LOCALLAB_RESID;残差画像
+TP_LOCALLAB_RESIDBLUR;残差画像をぼかす
+TP_LOCALLAB_RESIDCHRO;残差画像の色度
+TP_LOCALLAB_RESIDCOMP;残差画像の圧縮
+TP_LOCALLAB_RESIDCONT;残差画像のコントラスト
+TP_LOCALLAB_RESIDHI;ハイライト
+TP_LOCALLAB_RESIDHITHR;ハイライトのしきい値
+TP_LOCALLAB_RESIDSHA;シャドウ
+TP_LOCALLAB_RESIDSHATHR;シャドウのしきい値
+TP_LOCALLAB_RETI;霞除去 - レティネックス 強いコントラスト
+TP_LOCALLAB_RETIFRA;レティネックス
+TP_LOCALLAB_RETIM;独自のレティネックス
+TP_LOCALLAB_RETITOOLFRA;レティネックスの機能
+TP_LOCALLAB_RETI_FFTW_TOOLTIP;高速フーリエ変換は質を向上させ大きな半径の使用が可能になります\n処理時間は編集する領域の大きさに応じて変わります \n大きな半径を扱う場合に適用するのがいいでしょう\n\n処理領域を数ピクセル減らすことでFFTWの最適化を図ることが出来ます \n但し、RT-スポットの境界線(縦或いは横)が画像からはみ出している場合は最適化を図れません
+TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Have no effect when the value "Lightness = 1" or "Darkness =2" is chosen.\nIn other cases, the last step of "Multiple scale Retinex" is applied an algorithm close to "local contrast", these 2 cursors, associated with "Strength" will allow to play upstream on the local contrast.
+TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Play on internal parameters to optimize response.\nLook at the "restored datas" indicators "near" min=0 and max=32768 (log mode), but others values are possible.
+TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm allows differenciation for haze or normal.\nLogarithm brings more contrast but will generate more halo.
+TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;画像に応じてこれらの値を適用します - 霧のかかった画像の場合で、調整したいのが前景或いは背景なのかに応じて。
+TP_LOCALLAB_RETI_SCALE_TOOLTIP;If scale=1, retinex behaves like local contrast with many more possibilities.\nThe greater the scale, the more intense the recursive action, the longer the calculation times
+TP_LOCALLAB_RET_TOOLNAME;霞除去 & レティネックス - 9
+TP_LOCALLAB_REWEI;再加重平均の繰り返し
+TP_LOCALLAB_RGB;RGB トーンカーブ
+TP_LOCALLAB_ROW_NVIS;非表示
+TP_LOCALLAB_ROW_VIS;表示
+TP_LOCALLAB_SATUR;彩度
+TP_LOCALLAB_SAVREST;保存 - 元に戻した現在のイメージ
+TP_LOCALLAB_SCALEGR;スケール
+TP_LOCALLAB_SCALERETI;スケール
+TP_LOCALLAB_SCALTM;スケール
+TP_LOCALLAB_SCOPEMASK;ΔE画像のスコープマスク
+TP_LOCALLAB_SCOPEMASK_TOOLTIP;色差画像のマスクを有効にすると使えます\n低い値にすると選択した領域の調整が行われません
+TP_LOCALLAB_SENSI;スコープ
+TP_LOCALLAB_SENSIBN;スコープ
+TP_LOCALLAB_SENSICB;スコープ
+TP_LOCALLAB_SENSIDEN;スコープ
+TP_LOCALLAB_SENSIEXCLU;スコープ
+TP_LOCALLAB_SENSIEXCLU_TOOLTIP;除外モードに含まれている色も調整
+TP_LOCALLAB_SENSIH;スコープ
+TP_LOCALLAB_SENSIH_TOOLTIP;スコープの作用を調整します:\n小さい値を設定すると調整領域の色の変化は中心円に近いものに制限されます\n高い値を設定すると色の変化の範囲が広がります。\n20以下の設定がアルゴリズムの働きにとっていいでしょう
+TP_LOCALLAB_SENSILOG;スコープ
+TP_LOCALLAB_SENSIS;スコープ
+TP_LOCALLAB_SENSIS_TOOLTIP;スコープの作用を調整します:\n小さい値を設定すると調整領域の色の変化は中心円に近いものに制限されます\n高い値を設定すると色の変化の範囲が広がります。\n20以下の設定がアルゴリズムの働きにとっていいでしょう
+TP_LOCALLAB_SENSI_TOOLTIP;スコープの作用を調整します:\n小さい値を設定すると調整領域の色の変化は中心円に近いものに制限されます\n高い値を設定すると色の変化の範囲が広がります。\n20以下の設定がアルゴリズムの働きにとっていいでしょう
+TP_LOCALLAB_SETTINGS;設定
+TP_LOCALLAB_SH1;シャドウ/ハイライト
+TP_LOCALLAB_SH2;イコライザ
+TP_LOCALLAB_SHADEX;シャドウ
+TP_LOCALLAB_SHADEXCOMP;シャドウの圧縮とトーンの幅
+TP_LOCALLAB_SHADHIGH;シャドウ/ハイライト-階調-トーンイコライザ-TRC
+TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;露光モジュールだけでは処理が困難な場合に、代わりに使う、或いは補間に使います。\nノイズ低減の使用が必要かもしれません:シャドウを明るく
+TP_LOCALLAB_SHAMASKCOL;シャドウのマスク
+TP_LOCALLAB_SHAPETYPE;RT-スポット領域の形状
+TP_LOCALLAB_SHAPE_TOOLTIP;長方形は通常モードのみ
+TP_LOCALLAB_SHARAMOUNT;量
+TP_LOCALLAB_SHARBLUR;半径のぼかし
+TP_LOCALLAB_SHARDAMPING;減衰
+TP_LOCALLAB_SHARFRAME;変更
+TP_LOCALLAB_SHARITER;繰り返し
+TP_LOCALLAB_SHARP;シャープニング
+TP_LOCALLAB_SHARP_TOOLNAME;シャープニング - 8
+TP_LOCALLAB_SHARRADIUS;半径
+TP_LOCALLAB_SHORTC;ショートカーブ'L'マスク
+TP_LOCALLAB_SHORTCMASK_TOOLTIP;L(L)とL(H)2つのカーブをつスキップします。\nマスクの作用によって調整された現在のイメージと元イメージを融合します\n但し、これが使えるのは2, 3, 4, 6, 7のマスクです
+TP_LOCALLAB_SHOWC;マスクと調節
+TP_LOCALLAB_SHOWC1;ファイルの融合
+TP_LOCALLAB_SHOWCB;マスクと調節
+TP_LOCALLAB_SHOWDCT;フーリエの処理を表示
+TP_LOCALLAB_SHOWE;マスクと調節
+TP_LOCALLAB_SHOWFOURIER;フーリエ (DCT)
+TP_LOCALLAB_SHOWLAPLACE;Δ ラプラシアン (最初)
+TP_LOCALLAB_SHOWLC;マスクと調節
+TP_LOCALLAB_SHOWMASK;マスクの表示
+TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;調整具合を表示させます\n但し、見られる表示は1度に1種類(色と明るさ、或いは露光のセクション)だけです\n'マスクと調整'のドロップダウンボックスで、'なし' 或いは マスクを表示できるものを選択します\n\nマスクの処理はは形状検出の前に行われます
+TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;フーリエによる処理を表示します:\n処理の異なる段階を表示\nラプラス - しきい値に応じた2次微分を行う(最初のステップ)\nフーリエ -変換したラプラスをDCTで表示\nポアソン - ポアソンDCEの解を表示\n標準化 - 輝度の標準化なしに結果を表示
+TP_LOCALLAB_SHOWMASKTYP1;ぼかしとノイズ
+TP_LOCALLAB_SHOWMASKTYP2;ノイズ除去
+TP_LOCALLAB_SHOWMASKTYP3;ぼかしとノイズ + ノイズ除去
+TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;マスクと調節を選択出来ます\nぼかしとノイズ:この場合は、'ノイズ除去'は使えません\nノイズ除去:この場合は、'ぼかしとノイズ'は使えません\n\nぼかしとノイズ+ノイズ除去:マスクを共用しますが、'調節を表示'と'スコープ'の扱いには注意が必要です
+TP_LOCALLAB_SHOWMNONE;なし
+TP_LOCALLAB_SHOWMODIF;マスクなしで変更を表示
+TP_LOCALLAB_SHOWMODIFMASK;マスクと共に変更を表示
+TP_LOCALLAB_SHOWNORMAL;輝度の標準化(なし)
+TP_LOCALLAB_SHOWPLUS;マスクと調節- 平滑化によるぼかしとノイズ低減
+TP_LOCALLAB_SHOWPOISSON;ポアソン (pde f)
+TP_LOCALLAB_SHOWR;マスクと調節
+TP_LOCALLAB_SHOWREF;ΔEのプレビュー
+TP_LOCALLAB_SHOWS;マスクと調節
+TP_LOCALLAB_SHOWSTRUC;構造スポットを表示
+TP_LOCALLAB_SHOWSTRUCEX;構造スポットを表示 - "通常"では不可
+TP_LOCALLAB_SHOWT;マスクと調節
+TP_LOCALLAB_SHOWVI;マスクと調節
+TP_LOCALLAB_SHRESFRA;シャドウ/ハイライト
+TP_LOCALLAB_SHTRC_TOOLTIP;TRC(諧調再現カーブ)を使って画像のトーンを調節します。\nガンマは主に明るいトーンに作用します\n勾配は主に暗いトーンに作用します
+TP_LOCALLAB_SH_TOOLNAME;シャドウ/ハイライト & トーンイコライザ - 5
+TP_LOCALLAB_SIGMAWAV;減衰応答
+TP_LOCALLAB_SIM;シンプル
+TP_LOCALLAB_SLOMASKCOL;スロープのマスク
+TP_LOCALLAB_SLOSH;スロープ
+TP_LOCALLAB_SOFT;ソフトライトと独自のレティネックス
+TP_LOCALLAB_SOFTM;ソフトライト
+TP_LOCALLAB_SOFTMETHOD_TOOLTIP;独自のレティネックスは他のレティネックス方式とは大きく異なります\nグレーと輝度のバランスに作用します
+TP_LOCALLAB_SOFTRADIUSCOL;ソフトな半径
+TP_LOCALLAB_SOFTRETI;アーティファクトの軽減 ΔE
+TP_LOCALLAB_SOFTRETI_TOOLTIP;透過マップを向上させるため色差を考慮します。
+TP_LOCALLAB_SOFT_TOOLNAME;ソフトライト & 独自のレティネックス - 6
+TP_LOCALLAB_SOURCE_GRAY;値
+TP_LOCALLAB_SPECCASE;特定のケース
+TP_LOCALLAB_SPECIAL;RGBカーブの特殊な利用
+TP_LOCALLAB_SPECIAL_TOOLTIP;Only for this RGB curve, disabled (or reduce effects) of Scope, mask...for example, if you want to have a negative effect.
+TP_LOCALLAB_SPOTNAME;新しいスポット
+TP_LOCALLAB_STD;標準
+TP_LOCALLAB_STR;強さ
+TP_LOCALLAB_STRBL;強さ
+TP_LOCALLAB_STREN;圧縮の強さ
+TP_LOCALLAB_STRENG;強さ
+TP_LOCALLAB_STRENGR;強さ
+TP_LOCALLAB_STRENGTH;ノイズ
+TP_LOCALLAB_STRGRID;強さ
+TP_LOCALLAB_STRRETI_TOOLTIP;レティネックスの強さが0.2より小さい場合は霞除去だけが有効となります。\nレティネックスの強さが0.1以上の場合、霞除去の作用は輝度だけです。
+TP_LOCALLAB_STRUC;構造
+TP_LOCALLAB_STRUCCOL;構造
+TP_LOCALLAB_STRUCCOL1;構造のスポット
+TP_LOCALLAB_STRUCT_TOOLTIP;形状検出で構造を計算に入れるため、Sobelアルゴリズムを使います。\n“マスクと調節の構造スポットを表示”を有効にすればプレビューを見ることが出来ます。
+TP_LOCALLAB_STRUMASKCOL;構造マスクの強さ
+TP_LOCALLAB_STRUMASK_TOOLTIP;Generate a structure mask with difference between surface areas and reliefs.\nIf structure mask as tool is enabled, this mask is used in addition to the other tools (gamma, slope, contrast curve ...)
+TP_LOCALLAB_STYPE;形状の方式
+TP_LOCALLAB_STYPE_TOOLTIP;2つのタイプから選びます:\nシンメトリックは左と右の境界線、上部と底部の境界線がリンクしています\n独立は全ての境界線を独立で動かすことが出来ます
+TP_LOCALLAB_SYM;シンメトリック(マウス)
+TP_LOCALLAB_SYMSL;シンメトリック(マウス + スライダー)
+TP_LOCALLAB_TARGET_GRAY;グレーポイントの目標
+TP_LOCALLAB_THRES;構造のしきい値
+TP_LOCALLAB_THRESDELTAE;ΔE-スコープのしきい値
+TP_LOCALLAB_THRESRETI;しきい値
+TP_LOCALLAB_THRESWAV;バランスのしきい値
+TP_LOCALLAB_TLABEL;TM データ 最小値=%1 最大値=%2 平均値=%3 標準偏差=%4 (しきい値)
+TP_LOCALLAB_TLABEL2;TM 効果 Tm=%1 TM=%2
+TP_LOCALLAB_TLABEL_TOOLTIP;これは透過マップの結果を示しています。\n最小値と最大値は分散に使われます。\nTm、TMはそれぞれ透過マップの最小値と最大値です。\nしきい値を調整して標準化できます。
+TP_LOCALLAB_TM;トーンマッピング - 質感
+TP_LOCALLAB_TM_MASK;透過マップを使う
+TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;エッジ停止を増やす - 或いは再加重平均の繰り返しを増やすと処理時間も増えます - 但し、その分効果が増します
+TP_LOCALLAB_TONEMAPGAM_TOOLTIP;Gamma moves the action of tone-mapping to shadows or highlights.
+TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems.
+TP_LOCALLAB_TONEMAP_TOOLTIP;トーンマッピング - メインメニューの同じ機能は必ず無効にする
+TP_LOCALLAB_TONEMASCALE_TOOLTIP;This control gives meaning to the difference between "local" and "global" contrast.\nThe greater it is the larger a detail needs to be in order to be boosted
+TP_LOCALLAB_TONE_TOOLNAME;トーンマッピング - 4
+TP_LOCALLAB_TOOLCOL;機能としての構造マスク
+TP_LOCALLAB_TOOLMASK;機能
+TP_LOCALLAB_TRANSIT;境界の階調調整
+TP_LOCALLAB_TRANSITGRAD;境界の差異 XY
+TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Y軸方向の境界に対するX軸方向の境界の割合を変える
+TP_LOCALLAB_TRANSITVALUE;境界値
+TP_LOCALLAB_TRANSITWEAK;境界値の減衰
+TP_LOCALLAB_TRANSITWEAK_TOOLTIP;境界値の減衰を調節 : 処理の滑らかさを変える - 1 線形 - 2 パラボリック - 3 3乗
+TP_LOCALLAB_TRANSIT_TOOLTIP;作用が及ぶ部分と及ばない部分の境界の平滑化を調整します
+TP_LOCALLAB_TRANSMISSIONGAIN;透過のゲイン
+TP_LOCALLAB_TRANSMISSIONMAP;透過マップ
+TP_LOCALLAB_TRANSMISSION_TOOLTIP;透過に応じて透過を決めるカーブです\n横軸はマイナス値(最小)から平均値、プラス値(最大)まであります\n\nこのカーブを使って透過を変え、アーティファクトを軽減できます
+TP_LOCALLAB_USEMASK;マスクの使う
+TP_LOCALLAB_VART;分散(コントラスト)
+TP_LOCALLAB_VIBRANCE;自然な彩度 - ウォーム & クール
+TP_LOCALLAB_VIB_TOOLNAME;自然な彩度 - ウォーム & クール - 3
+TP_LOCALLAB_VIS_TOOLTIP;選択したコントロールスポットを表示・非表示するためにはクリックします\n全てのコントロールスポットを表示・非表示するためにはCtrlを押しながらクリックします
+TP_LOCALLAB_WAMASKCOL;Ψ ウェーブレットレベルのマスク
+TP_LOCALLAB_WARM;ウォーム & -クールと偽色
+TP_LOCALLAB_WARM_TOOLTIP;このスライダーはホワイトバランスのようなCIECAMのアルゴリズムを使っています、選択したエリアの印象を暖かくしたり、冷たくしたりします。\n場合によっては、色のアーティファクトを軽減できます
+TP_LOCALLAB_WASDEN_TOOLTIP;最初の3つの細かいレベルのノイズを軽減\n3より粗いレベルのノイズを軽減
+TP_LOCALLAB_WAV;レベルによるローカルコントラスト調整
+TP_LOCALLAB_WAVBLUR_TOOLTIP;残差画像を含め、分解された各詳細レベルに対してぼかしを実行します
+TP_LOCALLAB_WAVCOMP;レベルごとの圧縮
+TP_LOCALLAB_WAVCOMPRE;レベルごとの(非)圧縮
+TP_LOCALLAB_WAVCOMPRE_TOOLTIP;トーンマッピング或いはレベルごとのローカルコントラストが軽減出来ます\n横軸がレベルの番手を表しています
+TP_LOCALLAB_WAVCOMP_TOOLTIP;ウェーブレットによる分解の方向(水平、垂直、斜め)に応じたローカルコントラストを調整できます
+TP_LOCALLAB_WAVCON;レベルによるコントラスト調整
+TP_LOCALLAB_WAVCONTF_TOOLTIP;詳細レベルによるコントラスト調整と似ています:横軸がレベルを表しています
+TP_LOCALLAB_WAVDEN;レベルによる輝度ノイズの軽減(0 1 2 + 3、それ以上)
+TP_LOCALLAB_WAVE;Ψ ウェーブレット
+TP_LOCALLAB_WAVEDG;ローカルコントラスト
+TP_LOCALLAB_WAVEEDG_TOOLTIP;少なくとも最初の4つのレベルが使える必要があります
+TP_LOCALLAB_WAVGRAD_TOOLTIP;ローカルコントラストの”輝度”に関する諧調調整
+TP_LOCALLAB_WAVHIGH;Ψ ウェーブレット 高
+TP_LOCALLAB_WAVLEV;レベルごとのぼかし
+TP_LOCALLAB_WAVLOW;Ψ ウェーブレット 低
+TP_LOCALLAB_WAVMASK;Ψ ローカルコントラストのレベルのマスク
+TP_LOCALLAB_WAVMASK_TOOLTIP;Allows fine work on mask levels contrasts (structure)
+TP_LOCALLAB_WAVMED;Ψ ウェーブレット 普通
+TP_LOCALLAB_WEDIANHI;メディアン 高
+TP_LOCALLAB_WHITE_EV;ホワイトEv
+TP_LOCAL_HEIGHT;ボトム
+TP_LOCAL_HEIGHT_T;トップ
+TP_LOCAL_WIDTH;右
+TP_LOCAL_WIDTH_L;左
+TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Equalize action.\nHigh = Reinforce high light.\n
TP_METADATA_EDIT;変更を適用
TP_METADATA_MODE;メタデータ コピーモード
TP_METADATA_STRIP;メタデータを全て取り除く
@@ -1811,8 +2877,26 @@ TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;形状: 0=長方形、50=楕円形、100=円
TP_PCVIGNETTE_STRENGTH;強さ
TP_PCVIGNETTE_STRENGTH_TOOLTIP;終点位置でのフィルターの強さ(四隅)
TP_PDSHARPENING_LABEL;キャプチャーシャープニング
+TP_PERSPECTIVE_CAMERA_CROP_FACTOR;クロップ・ファクター
+TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;焦点距離
+TP_PERSPECTIVE_CAMERA_FRAME;補正
+TP_PERSPECTIVE_CAMERA_PITCH;垂直
+TP_PERSPECTIVE_CAMERA_ROLL;回転
+TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;水平移動
+TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;垂直移動
+TP_PERSPECTIVE_CAMERA_YAW;水平
TP_PERSPECTIVE_HORIZONTAL;水平
TP_PERSPECTIVE_LABEL;パースペクティブ
+TP_PERSPECTIVE_METHOD;方式
+TP_PERSPECTIVE_METHOD_CAMERA_BASED;カメラベース
+TP_PERSPECTIVE_METHOD_SIMPLE;シンプル
+TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;補正後の調整
+TP_PERSPECTIVE_PROJECTION_PITCH;垂直
+TP_PERSPECTIVE_PROJECTION_ROTATE;回転
+TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;水平移動
+TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;垂直移動
+TP_PERSPECTIVE_PROJECTION_YAW;水平
+TP_PERSPECTIVE_RECOVERY_FRAME;回復
TP_PERSPECTIVE_VERTICAL;垂直
TP_PFCURVE_CURVEEDITOR_CH;色相
TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;デフリンジの強さをコントロールします。値が高いと効果が強まり、低いと弱まります
@@ -1830,6 +2914,10 @@ TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;PDAFの場合は水平方向だ
TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;垂直方向
TP_PREPROCESS_NO_FOUND;未検出
TP_PREPROCESS_PDAFLINESFILTER;PDAFラインフィルタ
+TP_PREPROCWB_LABEL;ホワイトバランスの前処理
+TP_PREPROCWB_MODE;モード
+TP_PREPROCWB_MODE_AUTO;自動
+TP_PREPROCWB_MODE_CAMERA;カメラ
TP_PRSHARPENING_LABEL;リサイズ後のシャープニング
TP_PRSHARPENING_TOOLTIP;リサイズ後の画像をシャープニングします。但し、リサイズの方式がランチョスの場合に限ります。プレビュー画面でこの機能の効果を見ることは出来ません。使用法に関してはRawPediaを参照して下さい。
TP_RAWCACORR_AUTO;自動補正
@@ -1934,8 +3022,8 @@ TP_RESIZE_SCALE;スケール
TP_RESIZE_SPECIFY;条件指定:
TP_RESIZE_W;幅:
TP_RESIZE_WIDTH;幅
-TP_RETINEX_CONTEDIT_HSL;ヒストグラムイコライザ HSL
-TP_RETINEX_CONTEDIT_LAB;ヒストグラムイコライザ L*a*b*
+TP_RETINEX_CONTEDIT_HSL;HSLヒストグラム
+TP_RETINEX_CONTEDIT_LAB;L*a*b*ヒストグラム
TP_RETINEX_CONTEDIT_LH;色相イコライザ
TP_RETINEX_CONTEDIT_MAP;イコライザ
TP_RETINEX_CURVEEDITOR_CD;輝度=f(輝度)
@@ -1947,8 +3035,8 @@ TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;このカーブは単独で使うことも、
TP_RETINEX_EQUAL;イコライザ
TP_RETINEX_FREEGAMMA;フリーガンマ
TP_RETINEX_GAIN;ゲイン
-TP_RETINEX_GAINOFFS;ゲインとオフセット(明るさ)
-TP_RETINEX_GAINTRANSMISSION;ゲインの透過
+TP_RETINEX_GAINOFFS;透過マップのゲインとオフセット
+TP_RETINEX_GAINTRANSMISSION;ゲイン
TP_RETINEX_GAINTRANSMISSION_TOOLTIP;目標とする輝度を得るために、透過マップ増幅したり減衰させたりします。\n横軸:左から最小、平均、最大となります。\n縦軸:ゲイン
TP_RETINEX_GAMMA;ガンマ
TP_RETINEX_GAMMA_FREE;フリー
@@ -1957,8 +3045,8 @@ TP_RETINEX_GAMMA_LOW;低
TP_RETINEX_GAMMA_MID;中間
TP_RETINEX_GAMMA_NONE;なし
TP_RETINEX_GAMMA_TOOLTIP;レティネックス機能の前後のガンマで画像のトーンを修復します。レティネックスのカーブや他のカーブ(Lab調整、露光補正などのカーブ)とは異なるカーブです。
-TP_RETINEX_GRAD;透過のグラデーション
-TP_RETINEX_GRADS;強さのグラデーション
+TP_RETINEX_GRAD;透過マップの勾配
+TP_RETINEX_GRADS;強さの勾配
TP_RETINEX_GRADS_TOOLTIP;スライダー値が0の場合、全ての繰り返しは同じになります\n0より大きい場合は、繰り返しが増加すると強さが減ります。0より小さい場合はその逆です
TP_RETINEX_GRAD_TOOLTIP;スライダー値が0の場合、全ての繰り返しが同じになります\n0より大きい場合は、繰り返しが増加すると差異としきい値が減ります。0より小さい場合はその逆です
TP_RETINEX_HIGH;高
@@ -1978,25 +3066,25 @@ TP_RETINEX_MAP;方式
TP_RETINEX_MAP_GAUS;ガウシアンマスク
TP_RETINEX_MAP_MAPP;シャープマスク (一部ウェーブレット)
TP_RETINEX_MAP_MAPT;シャープマスク (全てウェーブレット)
-TP_RETINEX_MAP_METHOD_TOOLTIP;ガウス関数を利用して生成したマスクをハロやアーティファクトを減らすために使う方法です\n\nカーブだけ:マスクにコントラストカーブを適用します\nアーティファクト発生に注意\n\nガウシアンマスク:元画像に対しガウス暈しでマスクを生成し、それを使います\n処理時間短い\n\nシャープマスク:元画像に対しウェーブレットでマスクを生成し、それを使います\n処理時間が長い
+TP_RETINEX_MAP_METHOD_TOOLTIP;ガウス関数(半径や方式)で生成されたマスクを利用してハロやアーティファクトを減らします\n\nカーブだけ:マスクにコントラストカーブを適用します\nアーティファクト発生に注意\n\nガウシアンマスク:元画像に対しガウス暈しでマスクを生成し、それを使います\n処理時間短い\n\nシャープマスク:元画像に対しウェーブレットでマスクを生成し、それを使います\n処理時間が長い
TP_RETINEX_MAP_NONE;なし
TP_RETINEX_MEDIAN;透過のメディアンフィルター
TP_RETINEX_METHOD;方法
-TP_RETINEX_METHOD_TOOLTIP;高=明瞭な部分のレンダリングを補正します\n均等=明瞭な部分と不明瞭な部分をバランスよく補正します\n低=不明瞭な部分を重点的に補正します\nハイライト=ハイライト部分のマゼンタ被りを補正します
+TP_RETINEX_METHOD_TOOLTIP;高=光度の高い部分のレンダリングを補正します\n均等=光度の高い部分と低い部分を均等に補正します\n低=光度の低い部分を重点的に補正します\nハイライト=ハイライト部分のマゼンタ被りを補正します
TP_RETINEX_MLABEL;霞のない画像に修復 最小値=%1 最大値=%2
TP_RETINEX_MLABEL_TOOLTIP;最小値=0 最大値=32768に近づける\nバランスの良い霞のない画像
TP_RETINEX_NEIGHBOR;半径
TP_RETINEX_NEUTRAL;リセット
TP_RETINEX_NEUTRAL_TIP;全てのスライダー値とカーブをデフォルトの状態に戻します
-TP_RETINEX_OFFSET;オフセット(明るさ)
-TP_RETINEX_SCALES;ガウス暈しのグラデーション
+TP_RETINEX_OFFSET;オフセット
+TP_RETINEX_SCALES;ガウスフィルタの勾配
TP_RETINEX_SCALES_TOOLTIP;スライダー値が0の場合、同一の作業を繰り返します\n0より大きい値を設定すると、繰り返し作業を増やした時に、スケールと隣接するピクセルに対する作用は減ります。0より小さい場合は、その逆です
TP_RETINEX_SETTINGS;設定
TP_RETINEX_SKAL;スケール
-TP_RETINEX_SLOPE;フリーなガンマの勾配
+TP_RETINEX_SLOPE;フリーガンマの勾配
TP_RETINEX_STRENGTH;強さ
TP_RETINEX_THRESHOLD;しきい値
-TP_RETINEX_THRESHOLD_TOOLTIP;インとアウトの制限を意味します\nイン=原画像\nアウト=ガウス暈しを施した原画像
+TP_RETINEX_THRESHOLD_TOOLTIP;インとアウトの制限を意味します\nイン=原画像\nアウト=ガウスフィルタを施した原画像
TP_RETINEX_TLABEL;透過 差異の最小値=%1 最大値=%2 平均=%3 標準偏差=%4
TP_RETINEX_TLABEL2;透過 最小値=%1 最大値=%2
TP_RETINEX_TLABEL_TOOLTIP;透過マップの結果を表示しています\n差異の最小値と最大値です\n平均と標準偏差\n透過マップの最小値と最大値です
@@ -2024,11 +3112,11 @@ TP_ROTATE_DEGREE;角度
TP_ROTATE_LABEL;回転
TP_ROTATE_SELECTLINE;直線選択・角度補正ツール
TP_SAVEDIALOG_OK_TIP;ショートカット Ctrl-Enter
-TP_SHADOWSHLIGHTS_HIGHLIGHTS;ハイライトを暗く
+TP_SHADOWSHLIGHTS_HIGHLIGHTS;ハイライト
TP_SHADOWSHLIGHTS_HLTONALW;ハイライトトーンの幅
TP_SHADOWSHLIGHTS_LABEL;シャドウ/ハイライト
TP_SHADOWSHLIGHTS_RADIUS;半径
-TP_SHADOWSHLIGHTS_SHADOWS;シャドウを明るく
+TP_SHADOWSHLIGHTS_SHADOWS;シャドウ
TP_SHADOWSHLIGHTS_SHTONALW;シャドウトーンの幅
TP_SHARPENEDGE_AMOUNT;適用量
TP_SHARPENEDGE_LABEL;エッジ
@@ -2105,14 +3193,20 @@ TP_WAVELET_B2;残差
TP_WAVELET_BACKGROUND;背景
TP_WAVELET_BACUR;カーブ
TP_WAVELET_BALANCE;コントラストバランス 斜め/垂直-水平
-TP_WAVELET_BALANCE_TOOLTIP;ウェーブレットの方向で垂直-水平と斜めのバランスを変えます\nコントラスト、色度、或いは残差画像のトーンマッピングが有効の場合、バランスにより効果が増幅されます
+TP_WAVELET_BALANCE_TOOLTIP;ウェーブレットの解析方向の垂直-水平と斜めのバランスを変えます\nコントラスト、色度、或いは残差画像のトーンマッピングが有効の場合、バランスにより効果が増幅されます
TP_WAVELET_BALCHRO;色度のバランス
+TP_WAVELET_BALCHROM;色ノイズ除去のイコライザ ブルー/イエロー レッド/グリーン
TP_WAVELET_BALCHRO_TOOLTIP;有効にすると、’コントラストバランス’のカーブやスライダーも色度のバランスに影響します
+TP_WAVELET_BALLUM;輝度ノイズ除去のイコライザ 白黒
TP_WAVELET_BANONE;なし
TP_WAVELET_BASLI;スライダー
-TP_WAVELET_BATYPE;バランス方式
+TP_WAVELET_BATYPE;コントラストバランス方式
+TP_WAVELET_BL;ぼかしのレベル
+TP_WAVELET_BLCURVE;詳細レベルによるぼかし
+TP_WAVELET_BLURFRAME;ぼかし
+TP_WAVELET_BLUWAV;減衰応答
TP_WAVELET_CBENAB;カラートーンとカラーバランス
-TP_WAVELET_CB_TOOLTIP;高い値は、’カラートーン’と併用するか、或いはカラートーンは使わないで単独で使います。\n低い値の場合は前景の色合いを変えずに背景(sky, ...) のホワイトバランスを変えるような効果を得られます。一般的にはコントラストが高くなる印象があります。
+TP_WAVELET_CB_TOOLTIP;高い値は、’カラートーン’と併用するか、或いはカラートーンは使わないで単独で使います。\n低い値の場合は前景の色合いを変えずに背景(空 ...) のホワイトバランスを変えるような効果を得られます。一般的にはコントラストが高くなる印象があります。
TP_WAVELET_CCURVE;ローカルコントラスト
TP_WAVELET_CH1;全ての色
TP_WAVELET_CH2;明清色 - 純色
@@ -2120,22 +3214,32 @@ TP_WAVELET_CH3;コントラストのレベルとリンク
TP_WAVELET_CHCU;カーブ
TP_WAVELET_CHR;色度とコントラストのリンクの強さ
TP_WAVELET_CHRO;純色 - 明清色のしきい値
+TP_WAVELET_CHROFRAME;色ノイズの除去
+TP_WAVELET_CHROMAFRAME;色度
+TP_WAVELET_CHROMCO;番手の高いレベルの色度
+TP_WAVELET_CHROMFI;番手の低いレベルの色度
TP_WAVELET_CHRO_TOOLTIP;どのレベルで明清色と純色を調整するか決めます\n1-x:純色を調整するレベルの範囲\nx-9:明清色を調整するレベルの範囲\n\n但し、値がレベルの総数より多い場合は機能が無効となります
+TP_WAVELET_CHRWAV;色度のぼかし
TP_WAVELET_CHR_TOOLTIP;色度を”コントラストレベル”と”色度とコントラストのリンクの強さ”の相関関係で調整します
TP_WAVELET_CHSL;スライダー
TP_WAVELET_CHTYPE;調整の方法
+TP_WAVELET_CLA;明瞭
+TP_WAVELET_CLARI;シャープマスクと明瞭
TP_WAVELET_COLORT;レッド/グリーンの不透明度
TP_WAVELET_COMPCONT;コントラスト
TP_WAVELET_COMPGAMMA;ガンマの圧縮
TP_WAVELET_COMPGAMMA_TOOLTIP;残差画像のガンマを調整することで、画像データとヒストグラムの均衡を図ります。
TP_WAVELET_COMPTM;トーンマッピング
TP_WAVELET_CONTEDIT;'後の' コントラストカーブ
+TP_WAVELET_CONTFRAME;コントラスト - 圧縮
TP_WAVELET_CONTR;色域
TP_WAVELET_CONTRA;コントラスト
+TP_WAVELET_CONTRASTEDIT;細かい~大まか レベルの指定
TP_WAVELET_CONTRAST_MINUS;コントラスト -
TP_WAVELET_CONTRAST_PLUS;コントラスト +
TP_WAVELET_CONTRA_TOOLTIP;残差画像のコントラストを変えます
TP_WAVELET_CTYPE;色の制御
+TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;拡大率が300%より上になると無効になります
TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;元画像のローカルコントラストに応じてローカルコントラストを調節します\n横軸の低い部分は細かいローカルコントラストを表しています(実質値10~20)\n50%はローカルコントラストの平均(実質値100~300)を表しています\n66%はローカルコントラストの標準偏差(実質値300~800)を表しています\n100%はローカルコントラストの最大値を表しています(実質値3000~8000)
TP_WAVELET_CURVEEDITOR_CH;コントラストレベル=f(色相)
TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;色相に応じて各レベルのコントラストを調節します\n色域抑制のカーブ調整と重複しないように注意します\nウェーブレットのコントラストレベルスライダー値が0の場合は効果はありません
@@ -2150,11 +3254,15 @@ TP_WAVELET_DAUB4;D4 - 標準
TP_WAVELET_DAUB6;D6 - 標準プラス
TP_WAVELET_DAUB10;D10 - やや高い
TP_WAVELET_DAUB14;D14 - 高い
+TP_WAVELET_DAUBLOCAL;ウェーブレット エッジ検出の効果
TP_WAVELET_DAUB_TOOLTIP;ドブシー関数の係数を変更します\nD4=標準的なエッジ検出の効果\nD14=通常はエッジ検出の効果が高いが、処理時間が約10%増加\n\n初めのレベルの質だけでなくエッジ検出にも影響します。但し、レベル質は厳格に係数の種類に比例している訳ではありません。画像や使い方にも影響されます。
+TP_WAVELET_DIRFRAME;方向によるコントラスト
TP_WAVELET_DONE;垂直
TP_WAVELET_DTHR;対角線
TP_WAVELET_DTWO;水平
TP_WAVELET_EDCU;カーブ
+TP_WAVELET_EDEFFECT;減衰応答
+TP_WAVELET_EDEFFECT_TOOLTIP;このスライダーは機能の最大効果を受けるコントラスト値の範囲を調整するものです。最大値(2.5)を設定すると機能の効果が無効となります。
TP_WAVELET_EDGCONT;ローカルコントラスト
TP_WAVELET_EDGCONT_TOOLTIP;スライダーを左に動かすとコントラストが減り、右に動かすと増えます\n底部の左、天井部の左、底部の右、天井部の右は、それぞれ低いコントラスト、平均的コントラスト、平均+1標準偏差のコントラスト、最も高いコントラストを示しています
TP_WAVELET_EDGE;エッジのシャープネス
@@ -2174,10 +3282,11 @@ TP_WAVELET_EDSL;しきい値スライダー
TP_WAVELET_EDTYPE;ローカルコントラストの方式
TP_WAVELET_EDVAL;強さ
TP_WAVELET_FINAL;最終調整
+TP_WAVELET_FINCFRAME;最終的なローカルコントラスト
TP_WAVELET_FINEST;最も細かい
-TP_WAVELET_HIGHLIGHT;ハイライトの輝度範囲
+TP_WAVELET_HIGHLIGHT;細かいレベルの輝度調整範囲
TP_WAVELET_HS1;全輝度範囲
-TP_WAVELET_HS2;シャドウ-ハイライト
+TP_WAVELET_HS2;指定した輝度範囲
TP_WAVELET_HUESKIN;肌色の色相
TP_WAVELET_HUESKIN_TOOLTIP;底部の2つのポイントは、色相変化が始まる部分に設定されています、天井部の2つのポイントは変化が終わる所で、色相調整の効果が最も高い部分です\n\n設定ポイントを著しく動かす必要がある場合、或いはアーティファクトが発生するようであれば、ホワイトバランスが不適切と考えられます
TP_WAVELET_HUESKY;色相の範囲(デフォルト:青空)
@@ -2185,7 +3294,7 @@ TP_WAVELET_HUESKY_TOOLTIP;底部の2つのポイントは、色相変化が始
TP_WAVELET_ITER;デルタバランスのレベル
TP_WAVELET_ITER_TOOLTIP;スライダーを左に動かすと、低いレベルのデルタが増え、高いレベルのデルタが減ります\n右に動かすとその逆です
TP_WAVELET_LABEL;ウェーブレット
-TP_WAVELET_LARGEST;最も粗い
+TP_WAVELET_LARGEST;最も大まか
TP_WAVELET_LEVCH;色度
TP_WAVELET_LEVDIR_ALL;全てのレベルと方向を合わせた画像
TP_WAVELET_LEVDIR_INF;選択したレベル以下を合わせた画像
@@ -2201,57 +3310,89 @@ TP_WAVELET_LEVTWO;レベル3
TP_WAVELET_LEVZERO;レベル1
TP_WAVELET_LINKEDG;エッジのシャープネスの強さとリンク
TP_WAVELET_LIPST;高度なアルゴリズム
-TP_WAVELET_LOWLIGHT;シャドウの輝度範囲
+TP_WAVELET_LOWLIGHT;大まかなレベルの輝度調整範囲
+TP_WAVELET_LOWTHR_TOOLTIP;詳細とノイズの増幅を避けます
TP_WAVELET_MEDGREINF;最初のレベル
TP_WAVELET_MEDI;青空のアーティファクトを軽減
TP_WAVELET_MEDILEV;エッジ検出
TP_WAVELET_MEDILEV_TOOLTIP;エッジの検出を有効にした際には、次の操作が奨められます:\n- アーティファクト発生を避けるため低いレベルのコントラストを使わない\n- グラデーション感度では高い値を使う\n\n効果を和らげるには、ノイズ低減とリファインの’リファイン’を下げる
+TP_WAVELET_MERGEC;色度を融合
+TP_WAVELET_MERGEL;輝度を融合
TP_WAVELET_NEUTRAL;ニュートラル
TP_WAVELET_NOIS;ノイズ低減
TP_WAVELET_NOISE;ノイズ低減とリファイン
+TP_WAVELET_NOISE_TOOLTIP;詳細レベル4の輝度ノイズ除去が20以上の時にはアグレッシブモードが使われます\n色ノイズ除去で、大まかなレベルの値が20以上の時は、アグレッシブモードが使われます
TP_WAVELET_NPHIGH;高い
TP_WAVELET_NPLOW;低い
TP_WAVELET_NPNONE;なし
TP_WAVELET_NPTYPE;隣接するピクセルに対する効果
TP_WAVELET_NPTYPE_TOOLTIP;このアルゴリズムは近傍する8つのピクセルを使って比較します。違いが少ない場合に、エッジを強化します。
+TP_WAVELET_OFFSET_TOOLTIP;オフセットはシャドウとハイライトのバランスを調整する機能です\n 高い値を設定するとシャドウ部分のコントラスト強化が増幅されます。最小コントラストのしきい値と合わせて使えば、コントラストを高くしたい部分の見極めに役立つでしょう
+TP_WAVELET_OLDSH;マイナス値が使えるアルゴリズム
TP_WAVELET_OPACITY;ブルー/イエローの不透明度
TP_WAVELET_OPACITYW;コントラストバランス d/v-hカーブ
TP_WAVELET_OPACITYWL;最終的なローカルコントラスト
TP_WAVELET_OPACITYWL_TOOLTIP;ウェーブレット処理の最後で最終的なローカルコントラストを調整します\n\nイコライザは左から右に向かって、最も細かいローカルコントラストから大きいローカルコントラストを表しています
TP_WAVELET_PASTEL;明清色の色度
TP_WAVELET_PROC;プロセス
+TP_WAVELET_PROTAB;保護
+TP_WAVELET_RADIUS;シャドウ/ハイライトの半径
+TP_WAVELET_RANGEAB;aとbの範囲 %
TP_WAVELET_RE1;強める
TP_WAVELET_RE2;変えない
TP_WAVELET_RE3;弱める
-TP_WAVELET_RESCHRO;色度
+TP_WAVELET_RESBLUR;輝度のぼかし
+TP_WAVELET_RESBLURC;色度のぼかし
+TP_WAVELET_RESBLUR_TOOLTIP;拡大率が500%以上の場合は作用が無効となります
+TP_WAVELET_RESCHRO;強さ
TP_WAVELET_RESCON;シャドウ
TP_WAVELET_RESCONH;ハイライト
TP_WAVELET_RESID;残差画像
TP_WAVELET_SAT;純色の色度
TP_WAVELET_SETTINGS;ウェーブレットの設定
-TP_WAVELET_SKIN;色相-トーン (肌色) の目標/保護
+TP_WAVELET_SHA;シャープマスク
+TP_WAVELET_SHFRAME;シャドウ/ハイライト
+TP_WAVELET_SHOWMASK;ウェーブレットの'マスク'を表示
+TP_WAVELET_SIGMA;減衰応答
+TP_WAVELET_SIGMAFIN;減衰応答
+TP_WAVELET_SIGMA_TOOLTIP;コントラストスライダーの調整効果は、中間的なマイクロコントラストは強く、低い、或いは高いマイクロコントラストはそうでもありません。\n減衰応答は、この調整作用を極端なコントラスト値に向けて、どれだけ素早く減衰させるかコントロールするスライダーです。\n高い値を設定すると、減衰が強く作用するマイクロコントラストの領域が広がりますが、アーティファクトが発生することがあります。\n低い値を設定すると、減衰が強く作用するマイクロコントラストの領域が狭くなるので、よりピンポイントに効果が表れます。
+TP_WAVELET_SKIN;肌色の目標/保護
TP_WAVELET_SKIN_TOOLTIP;-100にすると肌色のトーンだけが調整の対象になります\n0にすると全てのカラートーンが調整されます\n+100にすると肌色のトーンは保護され、他のカラートーンが調整されます
-TP_WAVELET_SKY;色相-トーン(青空)の目標/保護
+TP_WAVELET_SKY;色相の目標/保護
TP_WAVELET_SKY_TOOLTIP;-100にすると青空のトーンだけが調整の対象になります\n0にすると全てのカラートーンが調整されます\n+100にすると青空のトーンは保護され、他のカラートーンが調整されます
+TP_WAVELET_SOFTRAD;ソフトな半径
TP_WAVELET_STREN;強さ
TP_WAVELET_STRENGTH;強さ
TP_WAVELET_SUPE;エキストラ
TP_WAVELET_THR;シャドウのしきい値
-TP_WAVELET_THRESHOLD;ハイライトを調整するレベル
-TP_WAVELET_THRESHOLD2;シャドウを調整するレベル
-TP_WAVELET_THRESHOLD2_TOOLTIP;レベル9と(9-設定値)のレベルの間でシャドウの輝度が調整されます。他のレベルは輝度範囲全体で調整されます。
-TP_WAVELET_THRESHOLD_TOOLTIP;設定値以上のレベルだけが、ハイライトの輝度で調整されます。他のレベルは輝度範囲全体で調整されます。選べる設定値の最大数はシャドウレベルの設定に左右されます。
+TP_WAVELET_THRESHOLD;調整するレベル 細かい
+TP_WAVELET_THRESHOLD2;調整するレベル 大まか
+TP_WAVELET_THRESHOLD2_TOOLTIP;設定値より上の詳細レベルだけが、大まかなレベルの輝度範囲で設定された条件で調整されます。
+TP_WAVELET_THRESHOLD_TOOLTIP;設定値以下の詳細レベルだけが、細かいレベルの輝度範囲で設定された条件で調整されます。
+TP_WAVELET_THRESWAV;バランスのしきい値
TP_WAVELET_THRH;ハイライトのしきい値
TP_WAVELET_TILESBIG;大きいタイル
TP_WAVELET_TILESFULL;画像全体
TP_WAVELET_TILESIZE;タイルのサイズ
TP_WAVELET_TILESLIT;小さいタイル
TP_WAVELET_TILES_TOOLTIP;画像全体を処理する方が良い結果をもたらすので、推奨される選択です。タイルによる処理はRAMの容量が小さいユーザー向けです。必要なメモリー容量に関してはRawPediaを参照して下さい。
-TP_WAVELET_TMSTRENGTH;残差の効力を圧縮
+TP_WAVELET_TMEDGS;エッジ停止
+TP_WAVELET_TMSCALE;スケール
+TP_WAVELET_TMSTRENGTH;圧縮の強さ
TP_WAVELET_TMSTRENGTH_TOOLTIP;トーンマッピングの強さや残差画像のコントラストの圧縮を加減します。値が0以外の場合、露光補正パネルのトーンマッピングでは、強さとガンマのスライダー無効となります
TP_WAVELET_TMTYPE;圧縮の方法
TP_WAVELET_TON;カラートーン
+TP_WAVELET_TONFRAME;除外されたカラー
+TP_WAVELET_USH;なし
+TP_WAVELET_USHARP;明瞭の方式
+TP_WAVELET_USHARP_TOOLTIP;オリジン : ウェーブレットによる調整を含まないソースファイル\nウェーブレット : ウェーブレットによる調整を含むソースファイル
+TP_WAVELET_USH_TOOLTIP;シャープマスクを選択すると、ウェーブレットの設定が次の様に自動的に行われます:\n背景=ブラック、処理=レベル3以下...レベルは1~4の間で変えられます\n\n明瞭を選択すると、ウェーブレットの設定が次の様に自動的に行われます:\n背景=残差画像、処理=レベル7以上 レベルは5~10の間で変えられます
+TP_WAVELET_WAVLOWTHR;最小コントラストのしきい値
+TP_WAVELET_WAVOFFSET;オフセット
TP_WBALANCE_AUTO;自動補正
+TP_WBALANCE_AUTOITCGREEN;色温度の相関関係を繰り返し解析する
+TP_WBALANCE_AUTOOLD;RGBグレーを使う
+TP_WBALANCE_AUTO_HEADER;自動
TP_WBALANCE_CAMERA;カメラ
TP_WBALANCE_CLOUDY;曇天
TP_WBALANCE_CUSTOM;カスタム
@@ -2284,7 +3425,7 @@ TP_WBALANCE_LAMP_HEADER;ランプ
TP_WBALANCE_LED_CRS;CRS SP12 WWMR16
TP_WBALANCE_LED_HEADER;LED
TP_WBALANCE_LED_LSI;LSI Lumelex 2040
-TP_WBALANCE_METHOD;モード
+TP_WBALANCE_METHOD;方式
TP_WBALANCE_PICKER;ピック
TP_WBALANCE_SHADE;日陰
TP_WBALANCE_SIZE;サイズ:
@@ -2292,7 +3433,9 @@ TP_WBALANCE_SOLUX35;Solux 3500K
TP_WBALANCE_SOLUX41;Solux 4100K
TP_WBALANCE_SOLUX47;Solux 4700K (vendor)
TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery)
-TP_WBALANCE_SPOTWB;スポットWB
+TP_WBALANCE_SPOTWB;ピペットを使ってプレビュー画像のニュートラルな部分をピックアップ
+TP_WBALANCE_STUDLABEL;t検定 Itcwb: %1
+TP_WBALANCE_STUDLABEL_TOOLTIP;t検定の結果を表示\n低い値ほど相関関係が良いことになります\n値が0.002以下はエクセレント\n0.005以下は非常に良い\n0.01以下は良い\n0.05以下は十分\n0.5以上は悪い\n光源が標準的ではない場合は、t検定が良好であってもホワイトバラスが良いことにはなりません\nt検定結果が1000と表示された場合は反復解析が行われなかったことを意味します。良い結果と想定される前の計算結果が使われます
TP_WBALANCE_TEMPBIAS;自動ホワイトバランス 色温度のバイアス
TP_WBALANCE_TEMPBIAS_TOOLTIP;”自動ホワイトバランスの計算に変更を加えます”\n色温度を変えることで画像の暖かみを増やしたり、冷たさを増やしたりします。\n偏向の度合いは色温度の割合で表示されます\n従って計算値は "算出した色温度 + 算出した色温度 * 偏向"で計算したものです
TP_WBALANCE_TEMPERATURE;色温度
@@ -2300,7 +3443,6 @@ TP_WBALANCE_TUNGSTEN;タングステン
TP_WBALANCE_WATER1;水中 1
TP_WBALANCE_WATER2;水中 2
TP_WBALANCE_WATER_HEADER;水中
-The last update by firefly 2019-12-21
ZOOMPANEL_100;(100%)
ZOOMPANEL_NEWCROPWINDOW;新規ディテール ウィンドウを開く
ZOOMPANEL_ZOOM100;100%にズーム\nショートカット: z
@@ -2313,7 +3455,4 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: -
! Untranslated keys follow; remove the ! prefix after an entry is translated.
!!!!!!!!!!!!!!!!!!!!!!!!!
-!GENERAL_HELP;Help
-!HISTORY_MSG_TRANS_Method;Geometry - Method
-!TP_LENSGEOM_LIN;Linear
-!TP_LENSGEOM_LOG;Logarithmic
+!TP_WAVELET_FINCOAR_TOOLTIP;The left (positive) part of the curve acts on the finer levels (increase).\nThe 2 points on the abscissa represent the respective action limits of finer and coarser levels 5 and 6 (default).\nThe right (negative) part of the curve acts on the coarser levels (increase).\nAvoid moving the left part of the curve with negative values. Avoid moving the right part of the curve with positives values
diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands
index c43f6314e..ba5880bfb 100644
--- a/rtdata/languages/Nederlands
+++ b/rtdata/languages/Nederlands
@@ -14,6 +14,7 @@
#14 2015-11-23 update by wim ter meer
#15 2016-07-21 update by wim ter meer
#16 2017-04-21 update by wim ter meer
+#17 2020-06-05 update by dheijl
ABOUT_TAB_BUILD;Versie
ABOUT_TAB_CREDITS;Credits
@@ -1962,367 +1963,367 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: -
! Untranslated keys follow; remove the ! prefix after an entry is translated.
!!!!!!!!!!!!!!!!!!!!!!!!!
-!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value.
-!CURVEEDITOR_CATMULLROM;Flexible
-!DONT_SHOW_AGAIN;Don't show this message again.
-!DYNPROFILEEDITOR_IMGTYPE_ANY;Any
-!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR
-!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift
-!DYNPROFILEEDITOR_IMGTYPE_STD;Standard
-!EXIFFILTER_IMAGETYPE;Image type
-!EXIFPANEL_SHOWALL;Show all
-!FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords.
-!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles
-!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles
-!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash?
-!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files?
-!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version?
-!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash.
-!FILEBROWSER_POPUPREMOVE;Delete permanently
-!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version
-!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash.
-!GENERAL_CURRENT;Current
-!GENERAL_HELP;Help
-!GENERAL_RESET;Reset
-!GENERAL_SAVE_AS;Save as...
-!GENERAL_SLIDER;Slider
-!GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP.
-!HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram.
-!HISTORY_MSG_173;NR - Detail recovery
-!HISTORY_MSG_203;NR - Color space
-!HISTORY_MSG_235;B&W - CM - Auto
-!HISTORY_MSG_237;B&W - CM
-!HISTORY_MSG_256;NR - Median - Type
-!HISTORY_MSG_273;CT - Color Balance SMH
-!HISTORY_MSG_297;NR - Mode
-!HISTORY_MSG_392;W - Residual - Color Balance
-!HISTORY_MSG_441;Retinex - Gain transmission
-!HISTORY_MSG_475;PS - Equalize channel
-!HISTORY_MSG_476;CAM02 - Temp out
-!HISTORY_MSG_477;CAM02 - Green out
-!HISTORY_MSG_478;CAM02 - Yb out
-!HISTORY_MSG_479;CAM02 - CAT02 adaptation out
-!HISTORY_MSG_480;CAM02 - Automatic CAT02 out
-!HISTORY_MSG_481;CAM02 - Temp scene
-!HISTORY_MSG_482;CAM02 - Green scene
-!HISTORY_MSG_483;CAM02 - Yb scene
-!HISTORY_MSG_484;CAM02 - Auto Yb scene
-!HISTORY_MSG_485;Lens Correction
-!HISTORY_MSG_486;Lens Correction - Camera
-!HISTORY_MSG_487;Lens Correction - Lens
-!HISTORY_MSG_488;Dynamic Range Compression
-!HISTORY_MSG_489;DRC - Detail
-!HISTORY_MSG_490;DRC - Amount
-!HISTORY_MSG_491;White Balance
-!HISTORY_MSG_492;RGB Curves
-!HISTORY_MSG_493;L*a*b* Adjustments
-!HISTORY_MSG_494;Capture Sharpening
-!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors
-!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction
-!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction
-!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel
-!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask
-!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask
-!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness
-!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask
-!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List
-!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur
-!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset
-!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power
-!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation
-!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask
-!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope
-!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth
-!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal
-!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only
-!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map
-!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength
-!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
-!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold
-!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
-!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
-!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve
-!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries
-!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D
-!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type
-!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma
-!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope
-!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method
-!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount
-!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness
-!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast
-!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness
-!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius
-!HISTORY_MSG_METADATA_MODE;Metadata copy mode
-!HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold
-!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold
-!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius
-!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations
-!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold
-!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations
-!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius
-!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost
-!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion
-!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction
-!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
-!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold
-!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations
-!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift
-!HISTORY_MSG_RAW_BORDER;Raw border
-!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling
-!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius
-!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold
-!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace
-!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light
-!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength
-!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor
-!HISTORY_MSG_TRANS_Method;Geometry - Method
-!ICCPROFCREATOR_COPYRIGHT;Copyright:
-!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0"
-!ICCPROFCREATOR_CUSTOM;Custom
-!ICCPROFCREATOR_DESCRIPTION;Description:
-!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description
-!ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description.
-!ICCPROFCREATOR_GAMMA;Gamma
-!ICCPROFCREATOR_ICCVERSION;ICC version:
-!ICCPROFCREATOR_ILL;Illuminant:
-!ICCPROFCREATOR_ILL_41;D41
-!ICCPROFCREATOR_ILL_50;D50
-!ICCPROFCREATOR_ILL_55;D55
-!ICCPROFCREATOR_ILL_60;D60
-!ICCPROFCREATOR_ILL_65;D65
-!ICCPROFCREATOR_ILL_80;D80
-!ICCPROFCREATOR_ILL_DEF;Default
-!ICCPROFCREATOR_ILL_INC;StdA 2856K
-!ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles.
-!ICCPROFCREATOR_PRIMARIES;Primaries:
-!ICCPROFCREATOR_PRIM_ACESP0;ACES AP0
-!ICCPROFCREATOR_PRIM_ACESP1;ACES AP1
-!ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998)
-!ICCPROFCREATOR_PRIM_BEST;BestRGB
-!ICCPROFCREATOR_PRIM_BETA;BetaRGB
-!ICCPROFCREATOR_PRIM_BLUX;Blue X
-!ICCPROFCREATOR_PRIM_BLUY;Blue Y
-!ICCPROFCREATOR_PRIM_BRUCE;BruceRGB
-!ICCPROFCREATOR_PRIM_GREX;Green X
-!ICCPROFCREATOR_PRIM_GREY;Green Y
-!ICCPROFCREATOR_PRIM_PROPH;Prophoto
-!ICCPROFCREATOR_PRIM_REC2020;Rec2020
-!ICCPROFCREATOR_PRIM_REDX;Red X
-!ICCPROFCREATOR_PRIM_REDY;Red Y
-!ICCPROFCREATOR_PRIM_SRGB;sRGB
-!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles.
-!ICCPROFCREATOR_PRIM_WIDEG;Widegamut
-!ICCPROFCREATOR_PROF_V2;ICC v2
-!ICCPROFCREATOR_PROF_V4;ICC v4
-!ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as...
-!ICCPROFCREATOR_SLOPE;Slope
-!ICCPROFCREATOR_TRC_PRESET;Tone response curve:
-!MAIN_BUTTON_ICCPROFCREATOR;ICC Profile Creator
-!MAIN_FRAME_PLACES_DEL;Remove
-!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
-!MAIN_TAB_ADVANCED;Advanced
-!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a
-!MAIN_TAB_FAVORITES;Favorites
-!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u
-!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9
-!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%.
-!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead.
-!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead.
-!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead.
-!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings
-!PARTIALPASTE_DEHAZE;Haze removal
-!PARTIALPASTE_FILMNEGATIVE;Film Negative
-!PARTIALPASTE_LOCALCONTRAST;Local contrast
-!PARTIALPASTE_METADATA;Metadata mode
-!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
-!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift
-!PARTIALPASTE_RAW_BORDER;Raw border
-!PARTIALPASTE_SOFTLIGHT;Soft light
-!PARTIALPASTE_TM_FATTAL;Dynamic range compression
-!PREFERENCES_APPEARANCE;Appearance
-!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font
-!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color
-!PREFERENCES_APPEARANCE_MAINFONT;Main font
-!PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode
-!PREFERENCES_APPEARANCE_THEME;Theme
-!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit
-!PREFERENCES_CACHECLEAR;Clear
-!PREFERENCES_CACHECLEAR_ALL;Clear all cached files:
-!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles:
-!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles:
-!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched.
-!PREFERENCES_CHUNKSIZES;Tiles per thread
-!PREFERENCES_CHUNKSIZE_RAW_AMAZE;AMaZE demosaic
-!PREFERENCES_CHUNKSIZE_RAW_CA;Raw CA correction
-!PREFERENCES_CHUNKSIZE_RAW_RCD;RCD demosaic
-!PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demosaic
-!PREFERENCES_CHUNKSIZE_RGB;RGB processing
-!PREFERENCES_CROP;Crop Editing
-!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop
-!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop
-!PREFERENCES_CROP_GUIDES_FRAME;Frame
-!PREFERENCES_CROP_GUIDES_FULL;Original
-!PREFERENCES_CROP_GUIDES_NONE;None
-!PREFERENCES_DIRECTORIES;Directories
-!PREFERENCES_EDITORCMDLINE;Custom command line
-!PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser
-!PREFERENCES_LANG;Language
-!PREFERENCES_PERFORMANCE_MEASURE;Measure
-!PREFERENCES_PERFORMANCE_MEASURE_HINT;Logs processing times in console
-!PREFERENCES_PERFORMANCE_THREADS;Threads
-!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic)
-!PREFERENCES_PROFILESAVEBOTH;Save processing profile both to the cache and next to the input file
-!PREFERENCES_PROFILESAVELOCATION;Processing profile saving location
-!PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now
-!PREFERENCES_TAB_PERFORMANCE;Performance
-!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview
-!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show
-!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering
-!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise
-!PROGRESSBAR_DECODING;Decoding...
-!PROGRESSBAR_GREENEQUIL;Green equilibration...
-!PROGRESSBAR_HLREC;Highlight reconstruction...
-!PROGRESSBAR_HOTDEADPIXELFILTER;Hot/dead pixel filter...
-!PROGRESSBAR_LINEDENOISE;Line noise filter...
-!PROGRESSBAR_RAWCACORR;Raw CA correction...
-!QINFO_FRAMECOUNT;%2 frames
-!QINFO_HDR;HDR / %2 frame(s)
-!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s)
-!QUEUE_LOCATION_TITLE;Output Location
-!QUEUE_STARTSTOP_TOOLTIP;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s
-!SAMPLEFORMAT_0;Unknown data format
-!SAMPLEFORMAT_1;8-bit unsigned
-!SAMPLEFORMAT_2;16-bit unsigned
-!SAMPLEFORMAT_4;24-bit LogLuv
-!SAMPLEFORMAT_8;32-bit LogLuv
-!SAMPLEFORMAT_16;16-bit floating-point
-!SAMPLEFORMAT_32;24-bit floating-point
-!SAMPLEFORMAT_64;32-bit floating-point
-!SAVEDLG_FILEFORMAT_FLOAT; floating-point
-!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled.
-!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set.
-!TP_BWMIX_MIXC;Channel Mixer
-!TP_BWMIX_NEUTRAL;Reset
-!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance
-!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended.
-!TP_COLORAPP_FREE;Free temp+green + CAT02 + [output]
-!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%)
-!TP_COLORAPP_NEUTRAL;Reset
-!TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values
-!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504
-!TP_COLORTONING_LABGRID;L*a*b* color correction grid
-!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4
-!TP_COLORTONING_LABREGIONS;Color correction regions
-!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2
-!TP_COLORTONING_LABREGION_CHANNEL;Channel
-!TP_COLORTONING_LABREGION_CHANNEL_ALL;All
-!TP_COLORTONING_LABREGION_CHANNEL_B;Blue
-!TP_COLORTONING_LABREGION_CHANNEL_G;Green
-!TP_COLORTONING_LABREGION_CHANNEL_R;Red
-!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C
-!TP_COLORTONING_LABREGION_HUEMASK;H
-!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness
-!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L
-!TP_COLORTONING_LABREGION_LIST_TITLE;Correction
-!TP_COLORTONING_LABREGION_MASK;Mask
-!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur
-!TP_COLORTONING_LABREGION_OFFSET;Offset
-!TP_COLORTONING_LABREGION_POWER;Power
-!TP_COLORTONING_LABREGION_SATURATION;Saturation
-!TP_COLORTONING_LABREGION_SHOWMASK;Show mask
-!TP_COLORTONING_LABREGION_SLOPE;Slope
-!TP_CROP_PPI;PPI
-!TP_CROP_RESETCROP;Reset
-!TP_CROP_SELECTCROP;Select
-!TP_DEHAZE_DEPTH;Depth
-!TP_DEHAZE_LABEL;Haze Removal
-!TP_DEHAZE_LUMINANCE;Luminance only
-!TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map
-!TP_DEHAZE_STRENGTH;Strength
-!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation.
-!TP_DIRPYRDENOISE_LABEL;Noise Reduction
-!TP_EXPOSURE_CLAMPOOG;Clip out-of-gamut colors
-!TP_EXPOSURE_HISTMATCHING;Auto-Matched Tone Curve
-!TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatically adjust sliders and curves (except exposure compensation) to match the look of the embedded JPEG thumbnail.
-!TP_FILMNEGATIVE_BLUE;Blue ratio
-!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
-!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards.
-!TP_FILMNEGATIVE_LABEL;Film Negative
-!TP_FILMNEGATIVE_PICK;Pick neutral spots
-!TP_FILMNEGATIVE_RED;Red ratio
-!TP_ICM_WORKING_TRC;Tone response curve:
-!TP_ICM_WORKING_TRC_CUSTOM;Custom
-!TP_ICM_WORKING_TRC_GAMMA;Gamma
-!TP_ICM_WORKING_TRC_NONE;None
-!TP_ICM_WORKING_TRC_SLOPE;Slope
-!TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles.
-!TP_LENSGEOM_LIN;Linear
-!TP_LENSGEOM_LOG;Logarithmic
-!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected
-!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file
-!TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected
-!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong.
-!TP_LENSPROFILE_MODE_HEADER;Lens Profile
-!TP_LENSPROFILE_USE_CA;Chromatic aberration
-!TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion
-!TP_LENSPROFILE_USE_HEADER;Correct
-!TP_LENSPROFILE_USE_VIGNETTING;Vignetting
-!TP_LOCALCONTRAST_AMOUNT;Amount
-!TP_LOCALCONTRAST_DARKNESS;Darkness level
-!TP_LOCALCONTRAST_LABEL;Local Contrast
-!TP_LOCALCONTRAST_LIGHTNESS;Lightness level
-!TP_LOCALCONTRAST_RADIUS;Radius
-!TP_METADATA_EDIT;Apply modifications
-!TP_METADATA_MODE;Metadata copy mode
-!TP_METADATA_STRIP;Strip all metadata
-!TP_METADATA_TUNNEL;Copy unchanged
-!TP_PDSHARPENING_LABEL;Capture Sharpening
-!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction
-!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both
-!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal
-!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows
-!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical
-!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
-!TP_RAWCACORR_AUTOIT;Iterations
-!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time.
-!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift
-!TP_RAW_2PASS;1-pass+fast
-!TP_RAW_4PASS;3-pass+fast
-!TP_RAW_AMAZEVNG4;AMaZE+VNG4
-!TP_RAW_BORDER;Border
-!TP_RAW_DCBVNG4;DCB+VNG4
-!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold
-!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image).
-!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold
-!TP_RAW_IMAGENUM_SN;SN mode
-!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts.
-!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion
-!TP_RAW_PIXELSHIFTEPERISO;Sensitivity
-!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images.
-!TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;Equalize per channel
-!TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Enabled: Equalize the RGB channels individually.\nDisabled: Use same equalization factor for all channels.
-!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion.
-!TP_RAW_RCD;RCD
-!TP_RAW_RCDVNG4;RCD+VNG4
-!TP_RAW_XTRANS;X-Trans
-!TP_RAW_XTRANSFAST;Fast X-Trans
-!TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling
-!TP_RETINEX_CONTEDIT_MAP;Equalizer
-!TP_RETINEX_GAINOFFS;Gain and Offset (brightness)
-!TP_RETINEX_GAINTRANSMISSION;Gain transmission
-!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain.
-!TP_RETINEX_MAP;Method
-!TP_SHARPENING_BLUR;Blur radius
-!TP_SHARPENING_CONTRAST;Contrast threshold
-!TP_SHARPENING_ITERCHECK;Auto limit iterations
-!TP_SHARPENING_RADIUS_BOOST;Corner radius boost
-!TP_SHARPENMICRO_CONTRAST;Contrast threshold
-!TP_SOFTLIGHT_LABEL;Soft Light
-!TP_SOFTLIGHT_STRENGTH;Strength
-!TP_TM_FATTAL_AMOUNT;Amount
-!TP_TM_FATTAL_ANCHOR;Anchor
-!TP_TM_FATTAL_LABEL;Dynamic Range Compression
-!TP_TM_FATTAL_THRESHOLD;Detail
-!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
-!TP_WBALANCE_PICKER;Pick
+ADJUSTER_RESET_TO_DEFAULT;Klik - terug naar standaardwaarde.\nCtrl+klik - terug naar laatst opgeslagen waarde.
+CURVEEDITOR_CATMULLROM;Flexibel
+DONT_SHOW_AGAIN;Dit bericht niet meer tonen
+DYNPROFILEEDITOR_IMGTYPE_ANY;Alles
+DYNPROFILEEDITOR_IMGTYPE_HDR;HDR
+DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift
+DYNPROFILEEDITOR_IMGTYPE_STD;Standaard
+EXIFFILTER_IMAGETYPE;Type afbeelding
+EXIFPANEL_SHOWALL;Toon alles
+FILEBROWSER_BROWSEPATHBUTTONHINT;Klik om de opgegeven map te laden, en het zoekfilter opnieuw toe te passen.
+FILEBROWSER_CACHECLEARFROMFULL;Wis alles inclusief opgeslagen profielen
+FILEBROWSER_CACHECLEARFROMPARTIAL;Wis alles behalve opgeslagen profielen
+FILEBROWSER_DELETEDIALOG_ALL;Alle %1 bestanden in de prullenbak definitief verwijderen?
+FILEBROWSER_DELETEDIALOG_SELECTED;Geselecteerde %1 bestanden definitief verwijderen?
+FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Geselecteerde %1 bestanden inclusief een versie die door de verwerkingsrij is gemaakt verwijderen?
+FILEBROWSER_EMPTYTRASHHINT;Alle bestanden in de prullenbak permanent verwijderen
+FILEBROWSER_POPUPREMOVE;Permanent verwijderen
+FILEBROWSER_POPUPREMOVEINCLPROC;Verwijder definitief, inclusief met uitvoer in de verwerkingsrij
+FILEBROWSER_SHOWNOTTRASHHINT;Toon alleen niet-verwijderde afbeeldingen.
+GENERAL_CURRENT;Huidig
+GENERAL_HELP;Help
+GENERAL_RESET;Terugzetten
+GENERAL_SAVE_AS;Bewaren als...
+GENERAL_SLIDER;Schuifregelaar
+GIMP_PLUGIN_INFO;Welkom bij de RawTherapee GIMP plug-in!\nAls uw bewerking gereed is, sluit dan het hoofdvenster van RawTherapee en uw afbeelding wordt automatisch in GIMP geladen.
+HISTOGRAM_TOOLTIP_MODE;Wissel tussen lineair, log-lineair and log-log schalen van het histogram.
+HISTORY_MSG_173;NR - Detailbehoud
+HISTORY_MSG_203;NR - Kleurruimte
+HISTORY_MSG_235;B&W - CM - Auto
+HISTORY_MSG_237;B&W - CM
+HISTORY_MSG_256;NR - Mediaan - Type
+HISTORY_MSG_273;CT - Kleurbalans SMH
+HISTORY_MSG_297;NR - Modus
+HISTORY_MSG_392;W - Overblijvend - Kleurbalans
+HISTORY_MSG_441;Retinex - Toename transmissie
+HISTORY_MSG_475;PS - Kanaalbalans
+HISTORY_MSG_476;CAM02 - Temp uit
+HISTORY_MSG_477;CAM02 - Groen uit
+HISTORY_MSG_478;CAM02 - Yb uit
+HISTORY_MSG_479;CAM02 - CAT02 aanpassing uit
+HISTORY_MSG_480;CAM02 - Automatische CAT02 uit
+HISTORY_MSG_481;CAM02 - Temp scène
+HISTORY_MSG_482;CAM02 - Groen scène
+HISTORY_MSG_483;CAM02 - Yb scène
+HISTORY_MSG_484;CAM02 - Auto Yb scène
+HISTORY_MSG_485;Lenscorrectie
+HISTORY_MSG_486;Lenscorrectie - Camera
+HISTORY_MSG_487;Lenscorrectie - Lens
+HISTORY_MSG_488;Compressie Dynamisch Bereik
+HISTORY_MSG_489;DRC - Detail
+HISTORY_MSG_490;DRC - Hoeveelheid
+HISTORY_MSG_491;Witbalans
+HISTORY_MSG_492;RGB Curven
+HISTORY_MSG_493;L*a*b* Adjustments
+HISTORY_MSG_494;verscherpen
+HISTORY_MSG_CLAMPOOG;Kleuren afkappen die buiten het gamma vallen
+HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Kleurcorrectie
+HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Kleurcorrectie
+HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Kanaal
+HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - gebied C masker
+HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H masker
+HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Licht
+HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L masker
+HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - Lijst
+HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - verzachtingsmasker gebied
+HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - offset gebied
+HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - sterkte gebied
+HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Verzadiging
+HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - toon gebiedsmasker
+HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - hellingsgebied
+HISTORY_MSG_DEHAZE_DEPTH;Nevelvermindering - Diepte
+HISTORY_MSG_DEHAZE_ENABLED;Nevelvermindering
+HISTORY_MSG_DEHAZE_LUMINANCE;Nevelvermindering - Alleen Luminantie
+HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Nevelvermindering - Toon dieptemap
+HISTORY_MSG_DEHAZE_STRENGTH;Nevelvermindering - Sterkte
+HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual-demozaïek - auto-drempel
+HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual-demozaïek - Contrastdrempel
+HISTORY_MSG_FILMNEGATIVE_ENABLED;Filmnegatief
+HISTORY_MSG_FILMNEGATIVE_VALUES;Filmnegatief waarden
+HISTORY_MSG_HISTMATCHING;Auto-matched tooncurve
+HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Uitvoer - Primaries
+HISTORY_MSG_ICM_OUTPUT_TEMP;Uitvoer - ICC-v4 illuminant D
+HISTORY_MSG_ICM_OUTPUT_TYPE;Uitvoer - Type
+HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma
+HISTORY_MSG_ICM_WORKING_SLOPE;Working - Helling
+HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC methode
+HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Hoeveelheid
+HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Donker
+HISTORY_MSG_LOCALCONTRAST_ENABLED;Lokaal Contrast
+HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Lokaal Contrast - Licht
+HISTORY_MSG_LOCALCONTRAST_RADIUS;Lokaal Contrast - Radius
+HISTORY_MSG_METADATA_MODE;Metadata kopieermodus
+HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrastdrempel
+HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto drempel
+HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius
+HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limiet herhalingen
+HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrastdrempel
+HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Herhalingen
+HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius
+HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Toename hoekradius
+HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demozaïekmethode voor beweging
+HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;lijnruisfilter richting
+HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lijnfilter
+HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrastdrempel
+HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correctie - Herhalingen
+HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correctie - Vermijd kleurverschuiving
+HISTORY_MSG_RAW_BORDER;Raw rand
+HISTORY_MSG_RESIZE_ALLOWUPSCALING;Schalen - sta vergroting toe
+HISTORY_MSG_SHARPENING_BLUR;Verscherpen - Vervagingsradius
+HISTORY_MSG_SHARPENING_CONTRAST;Verscherpen - Contrastdrempel
+HISTORY_MSG_SH_COLORSPACE;S/H - Kleurruimte
+HISTORY_MSG_SOFTLIGHT_ENABLED;Zacht licht
+HISTORY_MSG_SOFTLIGHT_STRENGTH;Zacht licht - Sterkte
+HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anker
+HISTORY_MSG_TRANS_Method;Geometrie - Methode
+ICCPROFCREATOR_COPYRIGHT;Copyright:
+ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Zet terug naar standaard copyright, verleend aan "RawTherapee, CC0"
+ICCPROFCREATOR_CUSTOM;Handmatig
+ICCPROFCREATOR_DESCRIPTION;Beschriiving:
+ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Voeg gamma- en hellingwaarden toe aan de beschrijving
+ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Laat leeg voor de standaard beschrijving.
+ICCPROFCREATOR_GAMMA;Gamma
+ICCPROFCREATOR_ICCVERSION;ICC versie:
+ICCPROFCREATOR_ILL;Illuminant:
+ICCPROFCREATOR_ILL_41;D41
+ICCPROFCREATOR_ILL_50;D50
+ICCPROFCREATOR_ILL_55;D55
+ICCPROFCREATOR_ILL_60;D60
+ICCPROFCREATOR_ILL_65;D65
+ICCPROFCREATOR_ILL_80;D80
+ICCPROFCREATOR_ILL_DEF;Standaard
+ICCPROFCREATOR_ILL_INC;StdA 2856K
+ICCPROFCREATOR_ILL_TOOLTIP;U kunt alleen de illuminant instellen voor ICC v4-profielen.
+ICCPROFCREATOR_PRIMARIES;Primaire kleuren:
+ICCPROFCREATOR_PRIM_ACESP0;ACES AP0
+ICCPROFCREATOR_PRIM_ACESP1;ACES AP1
+ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998)
+ICCPROFCREATOR_PRIM_BEST;BestRGB
+ICCPROFCREATOR_PRIM_BETA;BetaRGB
+ICCPROFCREATOR_PRIM_BLUX;Blauw X
+ICCPROFCREATOR_PRIM_BLUY;Blauw Y
+ICCPROFCREATOR_PRIM_BRUCE;BruceRGB
+ICCPROFCREATOR_PRIM_GREX;Groen X
+ICCPROFCREATOR_PRIM_GREY;Groen Y
+ICCPROFCREATOR_PRIM_PROPH;Prophoto
+ICCPROFCREATOR_PRIM_REC2020;Rec2020
+ICCPROFCREATOR_PRIM_REDX;Rood X
+ICCPROFCREATOR_PRIM_REDY;Rood Y
+ICCPROFCREATOR_PRIM_SRGB;sRGB
+ICCPROFCREATOR_PRIM_TOOLTIP;U kunt alleen aangepaste primaries voor ICC v4-profielen instellen.
+ICCPROFCREATOR_PRIM_WIDEG;Widegamut
+ICCPROFCREATOR_PROF_V2;ICC v2
+ICCPROFCREATOR_PROF_V4;ICC v4
+ICCPROFCREATOR_SAVEDIALOG_TITLE;Bewaar ICC profiel als...
+ICCPROFCREATOR_SLOPE;Helling
+ICCPROFCREATOR_TRC_PRESET;Toonresponscurve:
+MAIN_BUTTON_ICCPROFCREATOR;ICC Profielmaker
+MAIN_FRAME_PLACES_DEL;Verwijderen
+MAIN_MSG_TOOMANYOPENEDITORS;Teveel open fotobewerkers.\nSluit er een om verder te kunnen.
+MAIN_TAB_ADVANCED;Geavanceerd
+MAIN_TAB_ADVANCED_TOOLTIP;Sneltoets: Alt-a
+MAIN_TAB_FAVORITES;Favorieten
+MAIN_TAB_FAVORITES_TOOLTIP;Sneltoets: Alt-u
+MAIN_TOOLTIP_BACKCOLOR3;Achtergrondkleur van het voorbeeld: middelgrijs\nSneltoets: 9
+MAIN_TOOLTIP_PREVIEWSHARPMASK;Bekijk het scherptecontrastmasker.\nSneltoets: p\nWerkt alleen als verscherping is geactiveerd en het zoomniveau >= 100%.
+OPTIONS_BUNDLED_MISSING;Het gebundelde profiel "%1" werd niet gevonden!\n\nUw installatie kan beschadigd zijn.\n\nDaarom worden interne standaardwaarden gebruikt.
+OPTIONS_DEFIMG_MISSING;Het standaardprofiel voor niet-raw- foto's werd niet gevonden of is niet ingesteld.\n\nControleer de profielenmap, het kan ontbreken of beschadigd zijn.\n\n"%1" wordt daarom gebruikt.
+OPTIONS_DEFRAW_MISSING;Het standaardprofiel voor raw-foto's werd niet gevonden of is niet ingesteld.\n\nControleer de profielenmap, het kan ontbreken of beschadigd zijn.\n\n"%1" wordt daarom gebruikt.
+PARTIALPASTE_ADVANCEDGROUP;Geavanceerd
+PARTIALPASTE_DEHAZE;Nevel verminderen
+PARTIALPASTE_FILMNEGATIVE;Film Negatief
+PARTIALPASTE_LOCALCONTRAST;Lokaal contrast
+PARTIALPASTE_METADATA;Metadata modus
+PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lijnfilter
+PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA vermijd kleurverschuiving
+PARTIALPASTE_RAW_BORDER;Raw rand
+PARTIALPASTE_SOFTLIGHT;Zacht licht
+PARTIALPASTE_TM_FATTAL;Compressie dynamisch bereik
+PREFERENCES_APPEARANCE;Uiterlijk
+PREFERENCES_APPEARANCE_COLORPICKERFONT;Lettertype kleurenkiezer
+PREFERENCES_APPEARANCE_CROPMASKCOLOR;Kleur bijsnijdmasker
+PREFERENCES_APPEARANCE_MAINFONT;Standaard lettertype
+PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI modus
+PREFERENCES_APPEARANCE_THEME;Thema
+PREFERENCES_AUTOSAVE_TP_OPEN;Bewaar positie gereedschappen (open/dicht) bij afsluiten
+PREFERENCES_CACHECLEAR;Wissen
+PREFERENCES_CACHECLEAR_ALL;Wis alle bestanden in de cache:
+PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Wis alle bestanden in de cache behalve verwerkingsprofielen:
+PREFERENCES_CACHECLEAR_ONLYPROFILES;Wis alleen verwerkingsprofielen in de cache:
+PREFERENCES_CACHECLEAR_SAFETY;Alleen bestanden in de cache worden gewist. Verwerkingsprofielen van de oorspronkelijke afbeeldingen blijven ongemoeid.
+PREFERENCES_CHUNKSIZES;Tegels per thread
+PREFERENCES_CHUNKSIZE_RAW_AMAZE;AMaZE demosaïek
+PREFERENCES_CHUNKSIZE_RAW_CA;Raw CA correctie
+PREFERENCES_CHUNKSIZE_RAW_RCD;RCD demosaïek
+PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demosaïek
+PREFERENCES_CHUNKSIZE_RGB;RGB verwerking
+PREFERENCES_CROP;Uitsnijden
+PREFERENCES_CROP_AUTO_FIT;Automatisch zoomen tot de uitsnede
+PREFERENCES_CROP_GUIDES;Getoonde hulplijnen als uitsnede niet bewerkt wordt
+PREFERENCES_CROP_GUIDES_FRAME;Frame
+PREFERENCES_CROP_GUIDES_FULL;Origineel
+PREFERENCES_CROP_GUIDES_NONE;Geen
+PREFERENCES_DIRECTORIES;Mappen
+PREFERENCES_EDITORCMDLINE;Aangepaste opdrachtregel
+PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compacte gereedschapsbalken in bestandsnavigator
+PREFERENCES_LANG;Taal
+PREFERENCES_PERFORMANCE_MEASURE;Meting
+PREFERENCES_PERFORMANCE_MEASURE_HINT;Log verwerkingstijden in de console
+PREFERENCES_PERFORMANCE_THREADS;Threads
+PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximaal aantal threads voor ruisvermindering and Wavelet Niveaus (0 = Automatisch)
+PREFERENCES_PROFILESAVEBOTH;Bewaar verwerkingsprofielen zowel in de cache als naast het invoerbestand
+PREFERENCES_PROFILESAVELOCATION;Opslaglocatie profielen
+PREFERENCES_SAVE_TP_OPEN_NOW;Bewaar open/dicht-status van de gereedschappen nu
+PREFERENCES_TAB_PERFORMANCE;Performantie
+PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Ingesloten JPEG voorbeeld
+PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Te tonen foto
+PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutrale raw rendering
+PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Ingesloten JPEG indien vol formaat, anders neutrale raw
+PROGRESSBAR_DECODING;Decoderen...
+PROGRESSBAR_GREENEQUIL;Groen blancering...
+PROGRESSBAR_HLREC;Reconstructie hoge lichten...
+PROGRESSBAR_HOTDEADPIXELFILTER;Hot/dead pixel filter...
+PROGRESSBAR_LINEDENOISE;Lijnruis filter...
+PROGRESSBAR_RAWCACORR;Raw CA correctie...
+QINFO_FRAMECOUNT;%2 frames
+QINFO_HDR;HDR / %2 frame(s)
+QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s)
+QUEUE_LOCATION_TITLE;Uitvoerlocatie
+QUEUE_STARTSTOP_TOOLTIP;;Start of stop de verwerking van foto's in de rij.\n\nSneltoets: Ctrl+s
+SAMPLEFORMAT_0;onbekend data formaat
+SAMPLEFORMAT_1;8-bit unsigned
+SAMPLEFORMAT_2;16-bit unsigned
+SAMPLEFORMAT_4;24-bit LogLuv
+SAMPLEFORMAT_8;32-bit LogLuv
+SAMPLEFORMAT_16;16-bit drijvendekomma
+SAMPLEFORMAT_32;24-bit drijvendekomma
+SAMPLEFORMAT_64;32-bit drijvendekomma
+SAVEDLG_FILEFORMAT_FLOAT; drijvendekomma
+SOFTPROOF_GAMUTCHECK_TOOLTIP;Markeer pixels waarvan de kleuren buiten het kleurgamma vallen, relatief aan:\n- het printerprofiel, indien opgegeven en soft-proofing is ingeschakeld,\n- het uitvoerprofiel, indien geen printerprofiel is gekozen en soft-proofing is ingeschakeld,\n- het beeldschermprofiel, indien soft-proofing is uitgeschakeld.
+SOFTPROOF_TOOLTIP;Soft-proofing simuleert hoe een foto wordt getoond:\n- als deze wordt afgedrukt, indien een printerprofiel is opgegeven in Voorkeuren > Kleurbeheer,\n- als de foto getoond wordt op een beeldscherm dat het huidige uitvoerprofiel gebruikt en een printerprofiel niet is opgegeven.
+TP_BWMIX_MIXC;Kanaal Mixer
+TP_BWMIX_NEUTRAL;Terugzetten
+TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminantie
+TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;Bij manuele aanpassing worden waardon boven 65 aanbevolen.
+TP_COLORAPP_FREE;Vrije temp+groen + CAT02 + [uitvoer]
+TP_COLORAPP_MEANLUMINANCE;Gemiddelde luminantie (Yb%)
+TP_COLORAPP_NEUTRAL;Terugzetten
+TP_COLORAPP_NEUTRAL_TIP;Zet alle regelaars, vinkjes en curves terug naar hun standaardwaarde
+TP_COLORAPP_TEMP_TOOLTIP;Zet altijd Tint=1 om een lichtbron te selecteren.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504
+TP_COLORTONING_LABGRID;L*a*b* kleurcorrectie raster
+TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4
+TP_COLORTONING_LABREGIONS;Kleurcorrectie gebieden
+TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2
+TP_COLORTONING_LABREGION_CHANNEL;Kanaal
+TP_COLORTONING_LABREGION_CHANNEL_ALL;Alle
+TP_COLORTONING_LABREGION_CHANNEL_B;Blauw
+TP_COLORTONING_LABREGION_CHANNEL_G;Groen
+TP_COLORTONING_LABREGION_CHANNEL_R;Rood
+TP_COLORTONING_LABREGION_CHROMATICITYMASK;C
+TP_COLORTONING_LABREGION_HUEMASK;H
+TP_COLORTONING_LABREGION_LIGHTNESS;Helderheid(L)
+TP_COLORTONING_LABREGION_LIGHTNESSMASK;L
+TP_COLORTONING_LABREGION_LIST_TITLE;Correctie
+TP_COLORTONING_LABREGION_MASK;Masker
+TP_COLORTONING_LABREGION_MASKBLUR;Verzachtingsmasker
+TP_COLORTONING_LABREGION_OFFSET;Offset
+TP_COLORTONING_LABREGION_POWER;Kracht
+TP_COLORTONING_LABREGION_SATURATION;Verzadiging
+TP_COLORTONING_LABREGION_SHOWMASK;Toon masker
+TP_COLORTONING_LABREGION_SLOPE;Helling
+TP_CROP_PPI;PPI
+TP_CROP_RESETCROP;Terugzetten
+TP_CROP_SELECTCROP;Selecteer
+TP_DEHAZE_DEPTH;Diepte
+TP_DEHAZE_LABEL;Nevel vermindering
+TP_DEHAZE_LUMINANCE;Luminantie alleen
+TP_DEHAZE_SHOW_DEPTH_MAP;Toon de dieptemap
+TP_DEHAZE_STRENGTH;Sterkte
+TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Verhoog (vermenigvuldig) de waarde van alle chrominantie regelaars.\nDeze curve regelt de sterkte van de chromatische ruisvermindering als een functie van de chromaticiteit, om bijvoorbeeld het effect te vergroten in gebieden met lage verzadiging en te verminderen in deze met lage verzadiging.
+TP_DIRPYRDENOISE_LABEL;Ruisvermindering
+TP_EXPOSURE_CLAMPOOG;Knip kleuren die buiten het gamma vallen
+TP_EXPOSURE_HISTMATCHING;Automatische Tooncurve
+TP_EXPOSURE_HISTMATCHING_TOOLTIP;Pas automatisch de curves en schuifregelaars aan (behalve belichtingscompensatie) om overeen te komen met de ingesloten JPEG miniatuur.
+TP_FILMNEGATIVE_BLUE;Blauw verhouding
+TP_FILMNEGATIVE_GREEN;Referentie exponent (contrast)
+TP_FILMNEGATIVE_GUESS_TOOLTIP;Zet automatisch de rood/groen verhouding door 2 gebieden te kiezen met een neutrale tint (geen kleur) in het origineel. De gebieden moeten verschillen in helderheid. Zet de witbalans nadien.
+TP_FILMNEGATIVE_LABEL;Film Negatief
+TP_FILMNEGATIVE_PICK;Kies neutrale punten
+TP_FILMNEGATIVE_RED;Rood verhouding
+TP_ICM_WORKING_TRC;Tooncurve:
+TP_ICM_WORKING_TRC_CUSTOM;Gebruiker gedefinieerd
+TP_ICM_WORKING_TRC_GAMMA;Gamma
+TP_ICM_WORKING_TRC_NONE;Geen
+TP_ICM_WORKING_TRC_SLOPE;Helling
+TP_ICM_WORKING_TRC_TOOLTIP;Enkel voor ingebouwde profielen.
+TP_LENSGEOM_LIN;Lineair
+TP_LENSGEOM_LOG;Logarithmisch
+TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatische selectie
+TP_LENSPROFILE_CORRECTION_LCPFILE;LCP bestand
+TP_LENSPROFILE_CORRECTION_MANUAL;Manuele selectie
+TP_LENSPROFILE_LENS_WARNING;Waarschuwing: de gebruikte lens profiel crop factor komt niet overeen met de camera crop factor, de resultaten kunnen verkeerd zijn.
+TP_LENSPROFILE_MODE_HEADER;Lens Profiel
+TP_LENSPROFILE_USE_CA;Chromatische afwijking
+TP_LENSPROFILE_USE_GEOMETRIC;Geometrische vervorming
+TP_LENSPROFILE_USE_HEADER;Lenscorrecties
+TP_LENSPROFILE_USE_VIGNETTING;Vignettering
+TP_LOCALCONTRAST_AMOUNT;Hoeveelheid
+TP_LOCALCONTRAST_DARKNESS;Donker niveau
+TP_LOCALCONTRAST_LABEL;Lokaal Contrast
+TP_LOCALCONTRAST_LIGHTNESS;helderheidsniveau
+TP_LOCALCONTRAST_RADIUS;Straal
+TP_METADATA_EDIT;Pas wijzigingen toe
+TP_METADATA_MODE;Metadata kopieermodus
+TP_METADATA_STRIP;Strip alle metadata
+TP_METADATA_TUNNEL;Kopieer ongewijzigd
+TP_PDSHARPENING_LABEL;Verscherpen
+TP_PREPROCESS_LINEDENOISE_DIRECTION;Richting
+TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Beide
+TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontaal
+TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontaal enkel op PDAF-rijen
+TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Verticaal
+TP_PREPROCESS_PDAFLINESFILTER;PDAF lijnfilter
+TP_RAWCACORR_AUTOIT;Herhalingen
+TP_RAWCACORR_AUTOIT_TOOLTIP;Deze schuif is alleen actief als Automatische CA-correctie is aangevinkt.\nAuto-correctie werkt conservatief en corrigeert meestal niet alle chromatische aberratie.\nOm de resterende CA te corrigeren, kunt u dit proces tot vijf keer herhalen.\nElke herhaling vermindert de CA van de vorige herhaling, maar gaat wel ten koste van extra rekentijd.
+TP_RAWCACORR_AVOIDCOLORSHIFT;Vermijd kleurverschuiving
+TP_RAW_2PASS;1-pass+snel
+TP_RAW_4PASS;3-pass+snel
+TP_RAW_AMAZEVNG4;AMaZE+VNG4
+TP_RAW_BORDER;Rand
+TP_RAW_DCBVNG4;DCB+VNG4
+TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto drempel
+TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;Als checkbox is aangevinkt (aanbevolen), berekent RT een optimale waarde gebaseerd op vlakke gebieden in de foto.\nIndien die niet gevonden worden of de foto bevat veel ruis, wordt de waarde op 0 gezet.\nOm de waarde handmatig in te voeren moet u eerst de checkbox uitvinken (redelijke waarden zijn afhankelijk van het soort foto).
+TP_RAW_DUALDEMOSAICCONTRAST;Contrast drempel
+TP_RAW_IMAGENUM_SN;SN modus
+TP_RAW_IMAGENUM_TOOLTIP;Sommige raw bestanden bestaan uit verschillende sub-afbeeldingen (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\n\Als een andere demozaïek methode dan Pixel Shift gebruikt wordt, selecteert dit de gebruikte sub-afbeelding.\n\nBij gebruik van de Pixel Shift demozaïek methode op een Pixel Shift raw, worden alle sub-afbeeldingen gebruikt, and dit selecteert de subafbeeldijg die gebruikt wordt voor bewegende moving gebieden.
+TP_RAW_PIXELSHIFTDMETHOD;Demozaïek voor beweging
+TP_RAW_PIXELSHIFTEPERISO;Gevoeligheid
+TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;De standaardwaarde 0 werkt goed voor lage ISO-waarden.\nHogere waarden vergroten de gevoeligheid van bewegingsdetectie.\nWijzig in kleine stappen en controleer het bewegingsmasker.\nVerhoog gevoeligheid voor onderbelichte foto's of foto's met hoge ISO-waarden.
+TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;Balanceer per kanaal
+TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Ingeschakeld: Balanceer elk RGB kanaal afzonderlijk.\nUitgeschakeld: Balanceer alle kanalen evenveel.
+TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Toont de foto met een groen masker dat de bewegingsgebieden toont.
+TP_RAW_RCD;RCD
+TP_RAW_RCDVNG4;RCD+VNG4
+TP_RAW_XTRANS;X-Trans
+TP_RAW_XTRANSFAST;Snelle X-Trans
+TP_RESIZE_ALLOW_UPSCALING;Sta opschalen toe
+TP_RETINEX_CONTEDIT_MAP;Equalizer
+TP_RETINEX_GAINOFFS;Versterking en Offset (helderheid)
+TP_RETINEX_GAINTRANSMISSION;Transmissie versterking
+TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Versterk of verzwak de transmssiemap om de gewenste luminantie te bekomen.\nThe x-as is the transmissie.\nThe y-as is the versterking.
+TP_RETINEX_MAP;Methode
+TP_SHARPENING_BLUR;Vervagen straal
+TP_SHARPENING_CONTRAST;Contrast drempel
+TP_SHARPENING_ITERCHECK;Automatische limiet herhalingen
+TP_SHARPENING_RADIUS_BOOST;Straalvergroting
+TP_SHARPENMICRO_CONTRAST;Contrast drempel
+TP_SOFTLIGHT_LABEL;Zacht licht
+TP_SOFTLIGHT_STRENGTH;Sterkte
+TP_TM_FATTAL_AMOUNT;Hoeveelheid
+TP_TM_FATTAL_ANCHOR;Anker
+TP_TM_FATTAL_LABEL;Dynamisch bereik compressie
+TP_TM_FATTAL_THRESHOLD;Detail
+TP_WAVELET_CB_TOOLTIP;Voor hoge waarden: kleurcorrectie door al of niet te combineren met niveau decompositie 'toning'\nVoor lage waarden de witbalans van de achtergrond (hemel, ...) wijzigen zonder die van de voorgrond, meestal meer contrastrijk
+TP_WBALANCE_PICKER;Kies
diff --git a/rtdata/languages/default b/rtdata/languages/default
index db92cc49e..0774e5494 100644
--- a/rtdata/languages/default
+++ b/rtdata/languages/default
@@ -22,7 +22,7 @@ CURVEEDITOR_EDITPOINT_HINT;Enable edition of node in/out values.\n\nRight-click
CURVEEDITOR_HIGHLIGHTS;Highlights
CURVEEDITOR_LIGHTS;Lights
CURVEEDITOR_LINEAR;Linear
-CURVEEDITOR_LOADDLGLABEL;Load curve...
+CURVEEDITOR_LOADDLGLABEL;Load curve
CURVEEDITOR_MINMAXCPOINTS;Equalizer
CURVEEDITOR_NURBS;Control cage
CURVEEDITOR_PARAMETRIC;Parametric
@@ -145,6 +145,7 @@ FILEBROWSER_POPUPCOLORLABEL4;Label: Blue
FILEBROWSER_POPUPCOLORLABEL5;Label: Purple
FILEBROWSER_POPUPCOPYTO;Copy to...
FILEBROWSER_POPUPFILEOPERATIONS;File operations
+FILEBROWSER_POPUPINSPECT;Inspect
FILEBROWSER_POPUPMOVEEND;Move to end of queue
FILEBROWSER_POPUPMOVEHEAD;Move to head of queue
FILEBROWSER_POPUPMOVETO;Move to...
@@ -220,8 +221,10 @@ GENERAL_BEFORE;Before
GENERAL_CANCEL;Cancel
GENERAL_CLOSE;Close
GENERAL_CURRENT;Current
+GENERAL_DELETE_ALL;Delete all
GENERAL_DISABLE;Disable
GENERAL_DISABLED;Disabled
+GENERAL_EDIT;Edit
GENERAL_ENABLE;Enable
GENERAL_ENABLED;Enabled
GENERAL_FILE;File
@@ -243,11 +246,20 @@ GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done edit
HISTOGRAM_TOOLTIP_B;Show/Hide blue histogram.
HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.
HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram.
+HISTOGRAM_TOOLTIP_CROSSHAIR;Show/Hide indicator crosshair.
HISTOGRAM_TOOLTIP_G;Show/Hide green histogram.
HISTOGRAM_TOOLTIP_L;Show/Hide CIELab luminance histogram.
HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram.
HISTOGRAM_TOOLTIP_R;Show/Hide red histogram.
HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram.
+HISTOGRAM_TOOLTIP_SHOW_OPTIONS;Toggle visibility of the scope option buttons.
+HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS;Adjust scope brightness.
+HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histogram
+HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw Histogram
+HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB Parade
+HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Hue-Chroma Vectorscope
+HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;Hue-Saturation Vectorscope
+HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Waveform
HISTORY_CHANGED;Changed
HISTORY_CUSTOMCURVE;Custom curve
HISTORY_FROMCLIPBOARD;From clipboard
@@ -567,10 +579,10 @@ HISTORY_MSG_314;W - Gamut - Reduce artifacts
HISTORY_MSG_315;W - Residual - Contrast
HISTORY_MSG_316;W - Gamut - Skin tar/prot
HISTORY_MSG_317;W - Gamut - Skin hue
-HISTORY_MSG_318;W - Contrast - Fine levels
-HISTORY_MSG_319;W - Contrast - Fine range
-HISTORY_MSG_320;W - Contrast - Coarse range
-HISTORY_MSG_321;W - Contrast - Coarse levels
+HISTORY_MSG_318;W - Contrast - Finer levels
+HISTORY_MSG_319;W - Contrast - Finer range
+HISTORY_MSG_320;W - Contrast - Coarser range
+HISTORY_MSG_321;W - Contrast - Coarser levels
HISTORY_MSG_322;W - Gamut - Avoid color shift
HISTORY_MSG_323;W - ES - Local contrast
HISTORY_MSG_324;W - Chroma - Pastel
@@ -634,14 +646,14 @@ HISTORY_MSG_381;PRS RLD - Radius
HISTORY_MSG_382;PRS RLD - Amount
HISTORY_MSG_383;PRS RLD - Damping
HISTORY_MSG_384;PRS RLD - Iterations
-HISTORY_MSG_385;W - Residual - Color Balance
+HISTORY_MSG_385;W - Residual - Color balance
HISTORY_MSG_386;W - Residual - CB green high
HISTORY_MSG_387;W - Residual - CB blue high
HISTORY_MSG_388;W - Residual - CB green mid
HISTORY_MSG_389;W - Residual - CB blue mid
HISTORY_MSG_390;W - Residual - CB green low
HISTORY_MSG_391;W - Residual - CB blue low
-HISTORY_MSG_392;W - Residual - Color Balance
+HISTORY_MSG_392;W - Residual - Color balance
HISTORY_MSG_393;DCP - Look table
HISTORY_MSG_394;DCP - Baseline exposure
HISTORY_MSG_395;DCP - Base table
@@ -694,21 +706,37 @@ HISTORY_MSG_441;Retinex - Gain transmission
HISTORY_MSG_442;Retinex - Scale
HISTORY_MSG_443;Output black point compensation
HISTORY_MSG_444;WB - Temp bias
-HISTORY_MSG_445;Raw sub-image
-HISTORY_MSG_449;PS - ISO adaption
-HISTORY_MSG_452;PS - Show motion
-HISTORY_MSG_453;PS - Show mask only
-HISTORY_MSG_457;PS - Check red/blue
-HISTORY_MSG_462;PS - Check green
-HISTORY_MSG_464;PS - Blur motion mask
-HISTORY_MSG_465;PS - Blur radius
-HISTORY_MSG_468;PS - Fill holes
-HISTORY_MSG_469;PS - Median
-HISTORY_MSG_471;PS - Motion correction
-HISTORY_MSG_472;PS - Smooth transitions
-HISTORY_MSG_473;PS - Use LMMSE
-HISTORY_MSG_474;PS - Equalize
-HISTORY_MSG_475;PS - Equalize channel
+HISTORY_MSG_445;Raw Sub-Image
+HISTORY_MSG_446;EvPixelShiftMotion
+HISTORY_MSG_447;EvPixelShiftMotionCorrection
+HISTORY_MSG_448;EvPixelShiftStddevFactorGreen
+HISTORY_MSG_449;PS ISO adaption
+HISTORY_MSG_450;EvPixelShiftNreadIso
+HISTORY_MSG_451;EvPixelShiftPrnu
+HISTORY_MSG_452;PS Show motion
+HISTORY_MSG_453;PS Show mask only
+HISTORY_MSG_454;EvPixelShiftAutomatic
+HISTORY_MSG_455;EvPixelShiftNonGreenHorizontal
+HISTORY_MSG_456;EvPixelShiftNonGreenVertical
+HISTORY_MSG_457;PS Check red/blue
+HISTORY_MSG_458;EvPixelShiftStddevFactorRed
+HISTORY_MSG_459;EvPixelShiftStddevFactorBlue
+HISTORY_MSG_460;EvPixelShiftGreenAmaze
+HISTORY_MSG_461;EvPixelShiftNonGreenAmaze
+HISTORY_MSG_462;PS Check green
+HISTORY_MSG_463;EvPixelShiftRedBlueWeight
+HISTORY_MSG_464;PS Blur motion mask
+HISTORY_MSG_465;PS Blur radius
+HISTORY_MSG_466;EvPixelShiftSum
+HISTORY_MSG_467;EvPixelShiftExp0
+HISTORY_MSG_468;PS Fill holes
+HISTORY_MSG_469;PS Median
+HISTORY_MSG_470;EvPixelShiftMedian3
+HISTORY_MSG_471;PS Motion correction
+HISTORY_MSG_472;PS Smooth transitions
+HISTORY_MSG_473;PS Use lmmse
+HISTORY_MSG_474;PS Equalize
+HISTORY_MSG_475;PS Equalize channel
HISTORY_MSG_476;CAM02 - Temp out
HISTORY_MSG_477;CAM02 - Green out
HISTORY_MSG_478;CAM02 - Yb out
@@ -726,9 +754,484 @@ HISTORY_MSG_489;DRC - Detail
HISTORY_MSG_490;DRC - Amount
HISTORY_MSG_491;White Balance
HISTORY_MSG_492;RGB Curves
-HISTORY_MSG_493;L*a*b* Adjustments
+HISTORY_MSG_493;Local Adjustments
HISTORY_MSG_494;Capture Sharpening
+HISTORY_MSG_496;Local Spot deleted
+HISTORY_MSG_497;Local Spot selected
+HISTORY_MSG_498;Local Spot name
+HISTORY_MSG_499;Local Spot visibility
+HISTORY_MSG_500;Local Spot shape
+HISTORY_MSG_501;Local Spot method
+HISTORY_MSG_502;Local Spot shape method
+HISTORY_MSG_503;Local Spot locX
+HISTORY_MSG_504;Local Spot locXL
+HISTORY_MSG_505;Local Spot locY
+HISTORY_MSG_506;Local Spot locYT
+HISTORY_MSG_507;Local Spot center
+HISTORY_MSG_508;Local Spot circrad
+HISTORY_MSG_509;Local Spot quality method
+HISTORY_MSG_510;Local Spot transition
+HISTORY_MSG_511;Local Spot thresh
+HISTORY_MSG_512;Local Spot ΔE -decay
+HISTORY_MSG_513;Local Spot scope
+HISTORY_MSG_514;Local Spot structure
+HISTORY_MSG_515;Local Adjustments
+HISTORY_MSG_516;Local - Color and light
+HISTORY_MSG_517;Local - Enable super
+HISTORY_MSG_518;Local - Lightness
+HISTORY_MSG_519;Local - Contrast
+HISTORY_MSG_520;Local - Chrominance
+HISTORY_MSG_521;Local - Scope
+HISTORY_MSG_522;Local - curve method
+HISTORY_MSG_523;Local - LL Curve
+HISTORY_MSG_524;Local - CC curve
+HISTORY_MSG_525;Local - LH Curve
+HISTORY_MSG_526;Local - H curve
+HISTORY_MSG_527;Local - Color Inverse
+HISTORY_MSG_528;Local - Exposure
+HISTORY_MSG_529;Local - Exp Compensation
+HISTORY_MSG_530;Local - Exp Hlcompr
+HISTORY_MSG_531;Local - Exp hlcomprthresh
+HISTORY_MSG_532;Local - Exp black
+HISTORY_MSG_533;Local - Exp Shcompr
+HISTORY_MSG_534;Local - Warm Cool
+HISTORY_MSG_535;Local - Exp Scope
+HISTORY_MSG_536;Local - Exp Contrast curve
+HISTORY_MSG_537;Local - Vibrance
+HISTORY_MSG_538;Local - Vib Saturated
+HISTORY_MSG_539;Local - Vib Pastel
+HISTORY_MSG_540;Local - Vib Threshold
+HISTORY_MSG_541;Local - Vib Protect skin tones
+HISTORY_MSG_542;Local - Vib avoid colorshift
+HISTORY_MSG_543;Local - Vib link
+HISTORY_MSG_544;Local - Vib Scope
+HISTORY_MSG_545;Local - Vib H curve
+HISTORY_MSG_546;Local - Blur and noise
+HISTORY_MSG_547;Local - Radius
+HISTORY_MSG_548;Local - Noise
+HISTORY_MSG_549;Local - Blur scope
+HISTORY_MSG_550;Local - Blur method
+HISTORY_MSG_551;Local - Blur Luminance only
+HISTORY_MSG_552;Local - Tone mapping
+HISTORY_MSG_553;Local - TM compression strength
+HISTORY_MSG_554;Local - TM gamma
+HISTORY_MSG_555;Local - TM edge stopping
+HISTORY_MSG_556;Local - TM scale
+HISTORY_MSG_557;Local - TM Reweighting
+HISTORY_MSG_558;Local - TM scope
+HISTORY_MSG_559;Local - Retinex
+HISTORY_MSG_560;Local - Retinex method
+HISTORY_MSG_561;Local - Retinex strength
+HISTORY_MSG_562;Local - Retinex chroma
+HISTORY_MSG_563;Local - Retinex radius
+HISTORY_MSG_564;Local - Retinex contrast
+HISTORY_MSG_565;Local - scope
+HISTORY_MSG_566;Local - Retinex Gain curve
+HISTORY_MSG_567;Local - Retinex Inverse
+HISTORY_MSG_568;Local - Sharpening
+HISTORY_MSG_569;Local - Sh Radius
+HISTORY_MSG_570;Local - Sh Amount
+HISTORY_MSG_571;Local - Sh Damping
+HISTORY_MSG_572;Local - Sh Iterations
+HISTORY_MSG_573;Local - Sh Scope
+HISTORY_MSG_574;Local - Sh Inverse
+HISTORY_MSG_575;Local - CBDL
+HISTORY_MSG_576;Local - cbdl mult
+HISTORY_MSG_577;Local - cbdl chroma
+HISTORY_MSG_578;Local - cbdl threshold
+HISTORY_MSG_579;Local - cbdl scope
+HISTORY_MSG_580;Local - Denoise
+HISTORY_MSG_581;Local - deNoise lum f 1
+HISTORY_MSG_582;Local - deNoise lum c
+HISTORY_MSG_583;Local - deNoise lum detail
+HISTORY_MSG_584;Local - deNoise equalizer White-Black
+HISTORY_MSG_585;Local - deNoise chro f
+HISTORY_MSG_586;Local - deNoise chro c
+HISTORY_MSG_587;Local - deNoise chro detail
+HISTORY_MSG_588;Local - deNoise equalizer Blue-Red
+HISTORY_MSG_589;Local - deNoise bilateral
+HISTORY_MSG_590;Local - deNoise Scope
+HISTORY_MSG_591;Local - Avoid color shift
+HISTORY_MSG_592;Local - Sh Contrast
+HISTORY_MSG_593;Local - Local contrast
+HISTORY_MSG_594;Local - Local contrast radius
+HISTORY_MSG_595;Local - Local contrast amount
+HISTORY_MSG_596;Local - Local contrast darkness
+HISTORY_MSG_597;Local - Local contrast lightness
+HISTORY_MSG_598;Local - Local contrast scope
+HISTORY_MSG_599;Local - Retinex dehaze
+HISTORY_MSG_600;Local - Soft Light enable
+HISTORY_MSG_601;Local - Soft Light strength
+HISTORY_MSG_602;Local - Soft Light scope
+HISTORY_MSG_603;Local - Sh Blur radius
+HISTORY_MSG_605;Local - Mask preview choice
+HISTORY_MSG_606;Local Spot selected
+HISTORY_MSG_607;Local - Color Mask C
+HISTORY_MSG_608;Local - Color Mask L
+HISTORY_MSG_609;Local - Exp Mask C
+HISTORY_MSG_610;Local - Exp Mask L
+HISTORY_MSG_611;Local - Color Mask H
+HISTORY_MSG_612;Local - Color Structure
+HISTORY_MSG_613;Local - Exp Structure
+HISTORY_MSG_614;Local - Exp Mask H
+HISTORY_MSG_615;Local - Blend color
+HISTORY_MSG_616;Local - Blend Exp
+HISTORY_MSG_617;Local - Blur Exp
+HISTORY_MSG_618;Local - Use Color Mask
+HISTORY_MSG_619;Local - Use Exp Mask
+HISTORY_MSG_620;Local - Blur col
+HISTORY_MSG_621;Local - Exp inverse
+HISTORY_MSG_622;Local - Exclude structure
+HISTORY_MSG_623;Local - Exp Chroma compensation
+HISTORY_MSG_624;Local - Color correction grid
+HISTORY_MSG_625;Local - Color correction strength
+HISTORY_MSG_626;Local - Color correction Method
+HISTORY_MSG_627;Local - Shadow Highlight
+HISTORY_MSG_628;Local - SH Highlight
+HISTORY_MSG_629;Local - SH H tonalwidth
+HISTORY_MSG_630;Local - SH Shadows
+HISTORY_MSG_631;Local - SH S tonalwidth
+HISTORY_MSG_632;Local - SH radius
+HISTORY_MSG_633;Local - SH Scope
+HISTORY_MSG_634;Local - radius color
+HISTORY_MSG_635;Local - radius Exp
+HISTORY_MSG_636;Local - Tool added
+HISTORY_MSG_637;Local - SH Mask C
+HISTORY_MSG_638;Local - SH Mask L
+HISTORY_MSG_639;Local - SH Mask H
+HISTORY_MSG_640;Local - SH blend
+HISTORY_MSG_641;Local - Use SH mask
+HISTORY_MSG_642;Local - radius SH
+HISTORY_MSG_643;Local - Blur SH
+HISTORY_MSG_644;Local - inverse SH
+HISTORY_MSG_645;Local - balance ΔE ab-L
+HISTORY_MSG_646;Local - Exp mask chroma
+HISTORY_MSG_647;Local - Exp mask gamma
+HISTORY_MSG_648;Local - Exp mask slope
+HISTORY_MSG_649;Local - Exp soft radius
+HISTORY_MSG_650;Local - Color mask chroma
+HISTORY_MSG_651;Local - Color mask gamma
+HISTORY_MSG_652;Local - Color mask slope
+HISTORY_MSG_653;Local - SH mask chroma
+HISTORY_MSG_654;Local - SH mask gamma
+HISTORY_MSG_655;Local - SH mask slope
+HISTORY_MSG_656;Local - Color soft radius
+HISTORY_MSG_657;Local - Retinex Reduce artifacts
+HISTORY_MSG_658;Local - CBDL soft radius
+HISTORY_MSG_659;Local Spot transition-decay
+HISTORY_MSG_660;Local - cbdl clarity
+HISTORY_MSG_661;Local - cbdl contrast residual
+HISTORY_MSG_662;Local - deNoise lum f 0
+HISTORY_MSG_663;Local - deNoise lum f 2
+HISTORY_MSG_664;Local - cbdl Blur
+HISTORY_MSG_665;Local - cbdl mask Blend
+HISTORY_MSG_666;Local - cbdl mask radius
+HISTORY_MSG_667;Local - cbdl mask chroma
+HISTORY_MSG_668;Local - cbdl mask gamma
+HISTORY_MSG_669;Local - cbdl mask slope
+HISTORY_MSG_670;Local - cbdl mask C
+HISTORY_MSG_671;Local - cbdl mask L
+HISTORY_MSG_672;Local - cbdl mask CL
+HISTORY_MSG_673;Local - Use cbdl mask
+HISTORY_MSG_674;Local - Tool removed
+HISTORY_MSG_675;Local - TM soft radius
+HISTORY_MSG_676;Local Spot transition-differentiation
+HISTORY_MSG_677;Local - TM amount
+HISTORY_MSG_678;Local - TM saturation
+HISTORY_MSG_679;Local - Retinex mask C
+HISTORY_MSG_680;Local - Retinex mask L
+HISTORY_MSG_681;Local - Retinex mask CL
+HISTORY_MSG_682;Local - Retinex mask
+HISTORY_MSG_683;Local - Retinex mask Blend
+HISTORY_MSG_684;Local - Retinex mask radius
+HISTORY_MSG_685;Local - Retinex mask chroma
+HISTORY_MSG_686;Local - Retinex mask gamma
+HISTORY_MSG_687;Local - Retinex mask slope
+HISTORY_MSG_688;Local - Tool removed
+HISTORY_MSG_689;Local - Retinex mask transmission map
+HISTORY_MSG_690;Local - Retinex scale
+HISTORY_MSG_691;Local - Retinex darkness
+HISTORY_MSG_692;Local - Retinex lightness
+HISTORY_MSG_693;Local - Retinex threshold
+HISTORY_MSG_694;Local - Retinex Laplacian threshold
+HISTORY_MSG_695;Local - Soft method
+HISTORY_MSG_696;Local - Retinex Normalize
+HISTORY_MSG_697;Local - TM Normalize
+HISTORY_MSG_698;Local - Local contrast Fast Fourier
+HISTORY_MSG_699;Local - Retinex Fast Fourier
+HISTORY_MSG_701;Local - Exp Shadows
+HISTORY_MSG_702;Local - Exp Method
+HISTORY_MSG_703;Local - Exp Laplacian threshold
+HISTORY_MSG_704;Local - Exp PDE balance
+HISTORY_MSG_705;Local - Exp linearity
+HISTORY_MSG_706;Local - TM mask C
+HISTORY_MSG_707;Local - TM mask L
+HISTORY_MSG_708;Local - TM mask CL
+HISTORY_MSG_709;Local - use TM mask
+HISTORY_MSG_710;Local - TM mask Blend
+HISTORY_MSG_711;Local - TM mask radius
+HISTORY_MSG_712;Local - TM mask chroma
+HISTORY_MSG_713;Local - TM mask gamma
+HISTORY_MSG_714;Local - TM mask slope
+HISTORY_MSG_716;Local - Local method
+HISTORY_MSG_717;Local - Local contrast
+HISTORY_MSG_718;Local - Local contrast levels
+HISTORY_MSG_719;Local - Local contrast residual L
+HISTORY_MSG_720;Local - Blur mask C
+HISTORY_MSG_721;Local - Blur mask L
+HISTORY_MSG_722;Local - Blur mask CL
+HISTORY_MSG_723;Local - use Blur mask
+HISTORY_MSG_725;Local - Blur mask Blend
+HISTORY_MSG_726;Local - Blur mask radius
+HISTORY_MSG_727;Local - Blur mask chroma
+HISTORY_MSG_728;Local - Blur mask gamma
+HISTORY_MSG_729;Local - Blur mask slope
+HISTORY_MSG_730;Local - Blur method
+HISTORY_MSG_731;Local - median method
+HISTORY_MSG_732;Local - median iterations
+HISTORY_MSG_733;Local - soft radius
+HISTORY_MSG_734;Local - detail
+HISTORY_MSG_738;Local - Local contrast Merge L
+HISTORY_MSG_739;Local - Local contrast Soft radius
+HISTORY_MSG_740;Local - Local contrast Merge C
+HISTORY_MSG_741;Local - Local contrast Residual C
+HISTORY_MSG_742;Local - Exp Laplacian gamma
+HISTORY_MSG_743;Local - Exp Fattal Amount
+HISTORY_MSG_744;Local - Exp Fattal Detail
+HISTORY_MSG_745;Local - Exp Fattal Offset
+HISTORY_MSG_746;Local - Exp Fattal Sigma
+HISTORY_MSG_747;Local Spot created
+HISTORY_MSG_748;Local - Exp Denoise
+HISTORY_MSG_749;Local - Reti Depth
+HISTORY_MSG_750;Local - Reti Mode log - lin
+HISTORY_MSG_751;Local - Reti Dehaze saturation
+HISTORY_MSG_752;Local - Reti Offset
+HISTORY_MSG_753;Local - Reti Transmission map
+HISTORY_MSG_754;Local - Reti Clip
+HISTORY_MSG_755;Local - TM use tm mask
+HISTORY_MSG_756;Local - Exp use algo exposure mask
+HISTORY_MSG_757;Local - Exp Laplacian mask
+HISTORY_MSG_758;Local - Reti Laplacian mask
+HISTORY_MSG_759;Local - Exp Laplacian mask
+HISTORY_MSG_760;Local - Color Laplacian mask
+HISTORY_MSG_761;Local - SH Laplacian mask
+HISTORY_MSG_762;Local - cbdl Laplacian mask
+HISTORY_MSG_763;Local - Blur Laplacian mask
+HISTORY_MSG_764;Local - Solve PDE Laplacian mask
+HISTORY_MSG_765;Local - deNoise Detail threshold
+HISTORY_MSG_766;Local - Blur Fast Fourier
+HISTORY_MSG_767;Local - Grain Iso
+HISTORY_MSG_768;Local - Grain Strength
+HISTORY_MSG_769;Local - Grain Scale
+HISTORY_MSG_770;Local - Color Mask contrast curve
+HISTORY_MSG_771;Local - Exp Mask contrast curve
+HISTORY_MSG_772;Local - SH Mask contrast curve
+HISTORY_MSG_773;Local - TM Mask contrast curve
+HISTORY_MSG_774;Local - Reti Mask contrast curve
+HISTORY_MSG_775;Local - CBDL Mask contrast curve
+HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve
+HISTORY_MSG_777;Local - Blur Mask local contrast curve
+HISTORY_MSG_778;Local - Mask highlights
+HISTORY_MSG_779;Local - Color Mask local contrast curve
+HISTORY_MSG_780;Local - Color Mask shadows
+HISTORY_MSG_781;Local - Contrast Mask Wavelet level
+HISTORY_MSG_782;Local - Blur Denoise Mask Wavelet levels
+HISTORY_MSG_783;Local - Color Wavelet levels
+HISTORY_MSG_784;Local - Mask ΔE
+HISTORY_MSG_785;Local - Mask Scope ΔE
+HISTORY_MSG_786;Local - SH method
+HISTORY_MSG_787;Local - Equalizer multiplier
+HISTORY_MSG_788;Local - Equalizer detail
+HISTORY_MSG_789;Local - SH mask amount
+HISTORY_MSG_790;Local - SH mask anchor
+HISTORY_MSG_791;Local - Mask Short L curves
+HISTORY_MSG_792;Local - Mask Luminance Background
+HISTORY_MSG_793;Local - SH TRC gamma
+HISTORY_MSG_794;Local - SH TRC slope
+HISTORY_MSG_795;Local - Mask save restore image
+HISTORY_MSG_796;Local - Recursive references
+HISTORY_MSG_797;Local - Merge Original method
+HISTORY_MSG_798;Local - Opacity
+HISTORY_MSG_799;Local - Color RGB ToneCurve
+HISTORY_MSG_800;Local - Color ToneCurve Method
+HISTORY_MSG_801;Local - Color ToneCurve Special
+HISTORY_MSG_802;Local - Contrast threshold
+HISTORY_MSG_803;Local - Color Merge
+HISTORY_MSG_804;Local - Color mask Structure
+HISTORY_MSG_805;Local - Blur Noise mask Structure
+HISTORY_MSG_806;Local - Color mask Structure as tool
+HISTORY_MSG_807;Local - Blur Noise mask Structure as tool
+HISTORY_MSG_808;Local - Color mask curve H(H)
+HISTORY_MSG_809;Local - Vib mask curve C(C)
+HISTORY_MSG_810;Local - Vib mask curve L(L)
+HISTORY_MSG_811;Local - Vib mask curve LC(H)
+HISTORY_MSG_813;Local - Use Vib mask
+HISTORY_MSG_814;Local - Vib mask Blend
+HISTORY_MSG_815;Local - Vib mask radius
+HISTORY_MSG_816;Local - Vib mask chroma
+HISTORY_MSG_817;Local - Vib mask gamma
+HISTORY_MSG_818;Local - Vib mask slope
+HISTORY_MSG_819;Local - Vib mask laplacian
+HISTORY_MSG_820;Local - Vib mask contrast curve
+HISTORY_MSG_821;Local - color grid background
+HISTORY_MSG_822;Local - color background merge
+HISTORY_MSG_823;Local - color background luminance
+HISTORY_MSG_824;Local - Exp gradient mask strength
+HISTORY_MSG_825;Local - Exp gradient mask angle
+HISTORY_MSG_826;Local - Exp gradient strength
+HISTORY_MSG_827;Local - Exp gradient angle
+HISTORY_MSG_828;Local - SH gradient strength
+HISTORY_MSG_829;Local - SH gradient angle
+HISTORY_MSG_830;Local - Color gradient strength L
+HISTORY_MSG_831;Local - Color gradient angle
+HISTORY_MSG_832;Local - Color gradient strength C
+HISTORY_MSG_833;Local - Gradient feather
+HISTORY_MSG_834;Local - Color gradient strength H
+HISTORY_MSG_835;Local - Vib gradient strength L
+HISTORY_MSG_836;Local - Vib gradient angle
+HISTORY_MSG_837;Local - Vib gradient strength C
+HISTORY_MSG_838;Local - Vib gradient strength H
+HISTORY_MSG_839;Local - Software complexity
+HISTORY_MSG_840;Local - CL Curve
+HISTORY_MSG_841;Local - LC curve
+HISTORY_MSG_842;Local - Contrast Threshold
+HISTORY_MSG_843;Local - Radius
+HISTORY_MSG_845;Local - Log encoding
+HISTORY_MSG_846;Local - Log encoding auto
+HISTORY_MSG_847;Local - Log encoding Source
+HISTORY_MSG_849;Local - Log encoding Source auto
+HISTORY_MSG_850;Local - Log encoding B_Ev
+HISTORY_MSG_851;Local - Log encoding W_Ev
+HISTORY_MSG_852;Local - Log encoding Target
+HISTORY_MSG_853;Local - Log encodind loc contrast
+HISTORY_MSG_854;Local - Log encodind Scope
+HISTORY_MSG_855;Local - Log encoding Whole image
+HISTORY_MSG_856;Local - Log encoding Shadows range
+HISTORY_MSG_857;Local - Wavelet blur residual
+HISTORY_MSG_858;Local - Wavelet blur luminance only
+HISTORY_MSG_859;Local - Wavelet max blur
+HISTORY_MSG_860;Local - Wavelet blur levels
+HISTORY_MSG_861;Local - Wavelet contrast levels
+HISTORY_MSG_862;Local - Wavelet contrast attenuation
+HISTORY_MSG_863;Local - Wavelet merge original image
+HISTORY_MSG_864;Local - Wavelet dir contrast attenuation
+HISTORY_MSG_865;Local - Wavelet dir contrast delta
+HISTORY_MSG_866;Local - Wavelet dir compression
+HISTORY_MSG_869;Local - Denoise by level
+HISTORY_MSG_870;Local - Wavelet mask curve H
+HISTORY_MSG_871;Local - Wavelet mask curve C
+HISTORY_MSG_872;Local - Wavelet mask curve L
+HISTORY_MSG_873;Local - Wavelet mask
+HISTORY_MSG_875;Local - Wavelet mask blend
+HISTORY_MSG_876;Local - Wavelet mask smooth
+HISTORY_MSG_877;Local - Wavelet mask chroma
+HISTORY_MSG_878;Local - Wavelet mask contrast curve
+HISTORY_MSG_879;Local - Wavelet contrast chroma
+HISTORY_MSG_880;Local - Wavelet blur chroma
+HISTORY_MSG_881;Local - Wavelet contrast offset
+HISTORY_MSG_882;Local - Wavelet blur
+HISTORY_MSG_883;Local - Wavelet contrast by level
+HISTORY_MSG_884;Local - Wavelet dir contrast
+HISTORY_MSG_885;Local - Wavelet tone mapping
+HISTORY_MSG_886;Local - Wavelet tone mapping compress
+HISTORY_MSG_887;Local - Wavelet tone mapping compress residual
+HISTORY_MSG_888;Local - Contrast Wavelet Balance Threshold
+HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength
+HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle
+HISTORY_MSG_891;Local - Contrast Wavelet Graduated
+HISTORY_MSG_892;Local - Log Encoding Graduated Strength
+HISTORY_MSG_893;Local - Log Encoding Graduated angle
+HISTORY_MSG_894;Local - Color Preview dE
+HISTORY_MSG_897;Local - Contrast Wavelet ES strength
+HISTORY_MSG_898;Local - Contrast Wavelet ES radius
+HISTORY_MSG_899;Local - Contrast Wavelet ES detail
+HISTORY_MSG_900;Local - Contrast Wavelet ES gradient
+HISTORY_MSG_901;Local - Contrast Wavelet ES threshold low
+HISTORY_MSG_902;Local - Contrast Wavelet ES threshold high
+HISTORY_MSG_903;Local - Contrast Wavelet ES local contrast
+HISTORY_MSG_904;Local - Contrast Wavelet ES first level
+HISTORY_MSG_905;Local - Contrast Wavelet Edge Sharpness
+HISTORY_MSG_906;Local - Contrast Wavelet ES sensitivity
+HISTORY_MSG_907;Local - Contrast Wavelet ES amplification
+HISTORY_MSG_908;Local - Contrast Wavelet ES neighboring
+HISTORY_MSG_909;Local - Contrast Wavelet ES show
+HISTORY_MSG_910;Local - Wavelet Edge performance
+HISTORY_MSG_911;Local - Blur Chroma Luma
+HISTORY_MSG_912;Local - Blur Guide filter strength
+HISTORY_MSG_913;Local - Contrast Wavelet Sigma DR
+HISTORY_MSG_914;Local - Blur Wavelet Sigma BL
+HISTORY_MSG_915;Local - Edge Wavelet Sigma ED
+HISTORY_MSG_916;Local - Residual wavelet shadows
+HISTORY_MSG_917;Local - Residual wavelet shadows threshold
+HISTORY_MSG_918;Local - Residual wavelet highlights
+HISTORY_MSG_919;Local - Residual wavelet highlights threshold
+HISTORY_MSG_920;Local - Wavelet sigma LC
+HISTORY_MSG_921;Local - Wavelet Graduated sigma LC2
+HISTORY_MSG_922;Local - changes In Black and White
+HISTORY_MSG_923;Local - Tool complexity mode
+HISTORY_MSG_924;Local - Tool complexity mode
+HISTORY_MSG_925;Local - Scope color tools
+HISTORY_MSG_926;Local - Show mask type
+HISTORY_MSG_927;Local - Shadow
+HISTORY_MSG_928;Local - Common color mask
+HISTORY_MSG_929;Local - Mask common scope
+HISTORY_MSG_930;Local - Mask Common blend luma
+HISTORY_MSG_931;Local - Mask Common enable
+HISTORY_MSG_932;Local - Mask Common radius soft
+HISTORY_MSG_933;Local - Mask Common laplacian
+HISTORY_MSG_934;Local - Mask Common chroma
+HISTORY_MSG_935;Local - Mask Common gamma
+HISTORY_MSG_936;Local - Mask Common slope
+HISTORY_MSG_937;Local - Mask Common curve C(C)
+HISTORY_MSG_938;Local - Mask Common curve L(L)
+HISTORY_MSG_939;Local - Mask Common curve LC(H)
+HISTORY_MSG_940;Local - Mask Common structure as tool
+HISTORY_MSG_941;Local - Mask Common structure strength
+HISTORY_MSG_942;Local - Mask Common H(H) curve
+HISTORY_MSG_943;Local - Mask Common FFT
+HISTORY_MSG_944;Local - Mask Common Blur radius
+HISTORY_MSG_945;Local - Mask Common contrast threshold
+HISTORY_MSG_946;Local - Mask Common shadows
+HISTORY_MSG_947;Local - Mask Common Contrast curve
+HISTORY_MSG_948;Local - Mask Common Wavelet curve
+HISTORY_MSG_949;Local - Mask Common Threshold levels
+HISTORY_MSG_950;Local - Mask Common GF strength
+HISTORY_MSG_951;Local - Mask Common GF angle
+HISTORY_MSG_952;Local - Mask Common soft radius
+HISTORY_MSG_953;Local - Mask Common blend chroma
+HISTORY_MSG_954;Local - Show-hide tools
+HISTORY_MSG_955;Local - Enable Spot
+HISTORY_MSG_956;Local - CH Curve
+HISTORY_MSG_957;Local - Denoise mode
+HISTORY_MSG_958;Local - Show/hide settings
+HISTORY_MSG_959;Local - Inverse blur
+HISTORY_MSG_960;Local - Log encoding - cat02
+HISTORY_MSG_961;Local - Log encoding Ciecam
+HISTORY_MSG_962;Local - Log encoding Absolute luminance source
+HISTORY_MSG_963;Local - Log encoding Absolute luminance target
+HISTORY_MSG_964;Local - Log encoding Surround
+HISTORY_MSG_965;Local - Log encoding Saturation s
+HISTORY_MSG_966;Local - Log encoding Contrast J
+HISTORY_MSG_967;Local - Log encoding Mask curve C
+HISTORY_MSG_968;Local - Log encoding Mask curve L
+HISTORY_MSG_969;Local - Log encoding Mask curve H
+HISTORY_MSG_970;Local - Log encoding Mask enable
+HISTORY_MSG_971;Local - Log encoding Mask blend
+HISTORY_MSG_972;Local - Log encoding Mask radius
+HISTORY_MSG_973;Local - Log encoding Mask chroma
+HISTORY_MSG_974;Local - Log encoding Mask contrast
+HISTORY_MSG_975;Local - Log encoding Lightness J
+HISTORY_MSG_977;Local - Log encoding Contrast Q
+HISTORY_MSG_978;Local - Log encoding Sursource
+HISTORY_MSG_979;Local - Log encoding Brightness Q
+HISTORY_MSG_980;Local - Log encoding Colorfulness M
+HISTORY_MSG_981;Local - Log encoding Strength
+HISTORY_MSG_BLSHAPE;Blur by level
+HISTORY_MSG_BLURCWAV;Blur chroma
+HISTORY_MSG_BLURWAV;Blur luminance
+HISTORY_MSG_BLUWAV;Attenuation response
HISTORY_MSG_CAT02PRESET;Cat02 automatic preset
+HISTORY_MSG_CATCOMPLEX;Ciecam complexity
HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors
HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction
HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction
@@ -744,15 +1247,20 @@ HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power
HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation
HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask
HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope
+HISTORY_MSG_COMPLEX;Wavelet complexity
+HISTORY_MSG_COMPLEXRETI;Retinex complexity
HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth
HISTORY_MSG_DEHAZE_ENABLED;Haze Removal
-HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only
+HISTORY_MSG_DEHAZE_SATURATION;Dehaze - Saturation
HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map
HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength
HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold
+HISTORY_MSG_EDGEFFECT;Edge Attenuation response
+HISTORY_MSG_FILMNEGATIVE_BALANCE;FN - Reference output
+HISTORY_MSG_FILMNEGATIVE_COLORSPACE;Film negative color space
HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
-HISTORY_MSG_FILMNEGATIVE_FILMBASE;Film base color
+HISTORY_MSG_FILMNEGATIVE_REF_SPOT;FN - Reference input
HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
HISTORY_MSG_HISTMATCHING;Auto-matched tone curve
HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries
@@ -776,11 +1284,21 @@ HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold
HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations
HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius
HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost
+HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera
+HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera
+HISTORY_MSG_PERSP_CAM_SHIFT;Perspective - Camera
+HISTORY_MSG_PERSP_CTRL_LINE;Perspective - Control lines
+HISTORY_MSG_PERSP_METHOD;Perspective - Method
+HISTORY_MSG_PERSP_PROJ_ANGLE;Perspective - Recovery
+HISTORY_MSG_PERSP_PROJ_ROTATE;Perspective - PCA rotation
+HISTORY_MSG_PERSP_PROJ_SHIFT;Perspective - PCA
HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion
HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction
HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
HISTORY_MSG_PREPROCWB_MODE;Preprocess WB Mode
+HISTORY_MSG_PROTAB;Protection
HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold
+HISTORY_MSG_RANGEAB;Range ab
HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations
HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift
HISTORY_MSG_RAW_BORDER;Raw border
@@ -788,44 +1306,54 @@ HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling
HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius
HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold
HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace
+HISTORY_MSG_SIGMACOL;Chroma Attenuation response
+HISTORY_MSG_SIGMADIR;Dir Attenuation response
+HISTORY_MSG_SIGMAFIN;Final contrast Attenuation response
+HISTORY_MSG_SIGMATON;Toning Attenuation response
HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light
HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength
HISTORY_MSG_SPOT;Spot removal
HISTORY_MSG_SPOT_ENTRY;Spot removal - Point modif.
HISTORY_MSG_TEMPOUT;CAM02 automatic temperature
+HISTORY_MSG_THRESWAV;Balance threshold
HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor
HISTORY_MSG_TRANS_Method;Geometry - Method
HISTORY_MSG_WAVBALCHROM;Equalizer chrominance
HISTORY_MSG_WAVBALLUM;Equalizer luminance
-HISTORY_MSG_WAVCHROMFI;Chroma fine
+HISTORY_MSG_WAVBL;Blur levels
HISTORY_MSG_WAVCHROMCO;Chroma coarse
+HISTORY_MSG_WAVCHROMFI;Chroma fine
HISTORY_MSG_WAVCLARI;Clarity
+HISTORY_MSG_WAVDENLH;Level 5
+HISTORY_MSG_WAVDENMET;Local equalizer
+HISTORY_MSG_WAVDENOISE;Local contrast
+HISTORY_MSG_WAVDENOISEH;High levels Local contrast
+HISTORY_MSG_WAVDETEND;Details soft
HISTORY_MSG_WAVEDGS;Edge stopping
+HISTORY_MSG_WAVGUIDH;Local contrast-Hue equalizer
+HISTORY_MSG_WAVHUE;Equalizer hue
+HISTORY_MSG_WAVLEVDEN;High level local contrast
+HISTORY_MSG_WAVLEVSIGM;Radius
+HISTORY_MSG_WAVLIMDEN;Interaction 56 14
+HISTORY_MSG_WAVLOWTHR;Threshold low contrast
HISTORY_MSG_WAVMERGEC;Merge C
HISTORY_MSG_WAVMERGEL;Merge L
-HISTORY_MSG_WAVRADIUS;Radius Shadows-Highlight
+HISTORY_MSG_WAVMIXMET;Reference local contrast
+HISTORY_MSG_WAVOFFSET;Offset
+HISTORY_MSG_WAVOLDSH;Old algorithm
+HISTORY_MSG_WAVQUAMET;Denoise mode
+HISTORY_MSG_WAVRADIUS;Radius shadows-highlights
HISTORY_MSG_WAVSCALE;Scale
HISTORY_MSG_WAVSHOWMASK;Show wavelet mask
-HISTORY_MSG_WAVSIGMA;Damper
+HISTORY_MSG_WAVSIGM;Sigma
+HISTORY_MSG_WAVSIGMA;Attenuation response
+HISTORY_MSG_WAVSLIMET;Method
HISTORY_MSG_WAVSOFTRAD;Soft radius clarity
HISTORY_MSG_WAVSOFTRADEND;Soft radius final
+HISTORY_MSG_WAVSTREND;Strength soft
+HISTORY_MSG_WAVTHRDEN;Threshold local contrast
+HISTORY_MSG_WAVTHREND;Threshold local contrast
HISTORY_MSG_WAVUSHAMET;Clarity method
-HISTORY_MSG_THRESWAV;Balance threshold
-HISTORY_MSG_BLUWAV;Damper
-HISTORY_MSG_WAVOLDSH;Old algorithm
-HISTORY_MSG_WAVOFFSET;Offset
-HISTORY_MSG_WAVLOWTHR;Threshold low contrast
-HISTORY_MSG_BLSHAPE;Blur by level
-HISTORY_MSG_WAVBL;Blur levels
-HISTORY_MSG_BLURWAV;Blur luminance
-HISTORY_MSG_BLURCWAV;Blur chroma
-HISTORY_MSG_EDGEFFECT;Edge Damper
-HISTORY_MSG_SIGMAFIN;Final contrast Damper
-HISTORY_MSG_SIGMATON;Toning Damper
-HISTORY_MSG_SIGMACOL;Chroma Damper
-HISTORY_MSG_SIGMADIR;Dir Damper
-HISTORY_MSG_RANGEAB;Range ab
-HISTORY_MSG_PROTAB;Protection
HISTORY_NEWSNAPSHOT;Add
HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
HISTORY_SNAPSHOT;Snapshot
@@ -847,7 +1375,7 @@ ICCPROFCREATOR_ILL_65;D65
ICCPROFCREATOR_ILL_80;D80
ICCPROFCREATOR_ILL_DEF;Default
ICCPROFCREATOR_ILL_INC;StdA 2856K
-ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles.
+ICCPROFCREATOR_ILL_TOOLTIP;You can set the illuminant for ICC v4 profiles and also for ICC v2 profiles.
ICCPROFCREATOR_PRIMARIES;Primaries:
ICCPROFCREATOR_PRIM_ACESP0;ACES AP0
ICCPROFCREATOR_PRIM_ACESP1;ACES AP1
@@ -864,7 +1392,7 @@ ICCPROFCREATOR_PRIM_REC2020;Rec2020
ICCPROFCREATOR_PRIM_REDX;Red X
ICCPROFCREATOR_PRIM_REDY;Red Y
ICCPROFCREATOR_PRIM_SRGB;sRGB
-ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles.
+ICCPROFCREATOR_PRIM_TOOLTIP;You can set custom primaries for ICC v4 profiles and also for ICC v2 profiles.
ICCPROFCREATOR_PRIM_WIDEG;Widegamut
ICCPROFCREATOR_PROF_V2;ICC v2
ICCPROFCREATOR_PROF_V4;ICC v4
@@ -965,6 +1493,8 @@ MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u
MAIN_TAB_FILTER; Filter
MAIN_TAB_INSPECT; Inspect
MAIN_TAB_IPTC;IPTC
+MAIN_TAB_LOCALLAB;Local
+MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o
MAIN_TAB_METADATA;Metadata
MAIN_TAB_METADATA_TOOLTIP;Shortcut: Alt-m
MAIN_TAB_RAW;Raw
@@ -1033,7 +1563,7 @@ PARTIALPASTE_EQUALIZER;Wavelet levels
PARTIALPASTE_EVERYTHING;Everything
PARTIALPASTE_EXIFCHANGES;Exif
PARTIALPASTE_EXPOSURE;Exposure
-PARTIALPASTE_FILMNEGATIVE;Film Negative
+PARTIALPASTE_FILMNEGATIVE;Film negative
PARTIALPASTE_FILMSIMULATION;Film simulation
PARTIALPASTE_FLATFIELDAUTOSELECT;Flat-field auto-selection
PARTIALPASTE_FLATFIELDBLURRADIUS;Flat-field blur radius
@@ -1049,6 +1579,9 @@ PARTIALPASTE_LABCURVE;L*a*b* adjustments
PARTIALPASTE_LENSGROUP;Lens Related Settings
PARTIALPASTE_LENSPROFILE;Profiled lens correction
PARTIALPASTE_LOCALCONTRAST;Local contrast
+PARTIALPASTE_LOCALLAB;Local Adjustments
+PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings
+PARTIALPASTE_LOCGROUP;Local
PARTIALPASTE_METADATA;Metadata mode
PARTIALPASTE_METAGROUP;Metadata settings
PARTIALPASTE_PCVIGNETTE;Vignette filter
@@ -1124,6 +1657,10 @@ PREFERENCES_CLUTSCACHE;HaldCLUT Cache
PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs
PREFERENCES_CLUTSDIR;HaldCLUT directory
PREFERENCES_CMMBPC;Black point compensation
+PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments
+PREFERENCES_COMPLEXITY_EXP;Advanced
+PREFERENCES_COMPLEXITY_NORM;Standard
+PREFERENCES_COMPLEXITY_SIMP;Basic
PREFERENCES_CROP;Crop Editing
PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop
PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop
@@ -1172,6 +1709,7 @@ PREFERENCES_HISTOGRAM_TOOLTIP;If enabled, the working profile is used for render
PREFERENCES_HLTHRESHOLD;Threshold for clipped highlights
PREFERENCES_ICCDIR;Directory containing color profiles
PREFERENCES_IMPROCPARAMS;Default Processing Profile
+PREFERENCES_INSPECTORWINDOW;Open inspector in own window or fullscreen
PREFERENCES_INSPECT_LABEL;Inspect
PREFERENCES_INSPECT_MAXBUFFERS_LABEL;Maximum number of cached images
PREFERENCES_INSPECT_MAXBUFFERS_TOOLTIP;Set the maximum number of images stored in cache when hovering over them in the File Browser; systems with little RAM (2GB) should keep this value set to 1 or 2.
@@ -1240,6 +1778,7 @@ PREFERENCES_SHOWBASICEXIF;Show basic Exif info
PREFERENCES_SHOWDATETIME;Show date and time
PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation
PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar
+PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips
PREFERENCES_SHTHRESHOLD;Threshold for clipped shadows
PREFERENCES_SINGLETAB;Single Editor Tab Mode
PREFERENCES_SINGLETABVERTAB;Single Editor Tab Mode, Vertical Tabs
@@ -1263,6 +1802,7 @@ PREFERENCES_TP_LABEL;Tool panel:
PREFERENCES_TP_VSCROLLBAR;Hide vertical scrollbar
PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles
PREFERENCES_WORKFLOW;Layout
+PREFERENCES_ZOOMONSCROLL;Zoom images by scrolling
PROFILEPANEL_COPYPPASTE;Parameters to copy
PROFILEPANEL_GLOBALPROFILES;Bundled profiles
PROFILEPANEL_LABEL;Processing Profiles
@@ -1354,6 +1894,7 @@ THRESHOLDSELECTOR_TR;Top-right
TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker.
TOOLBAR_TOOLTIP_CROP;Crop selection.\nShortcut: c\nMove the crop using Shift+mouse drag.
TOOLBAR_TOOLTIP_HAND;Hand tool.\nShortcut: h
+TOOLBAR_TOOLTIP_PERSPECTIVE;Perspective Correction\n\nEdit control lines to correct perspective distortion. Click this button again to apply correction.
TOOLBAR_TOOLTIP_STRAIGHTEN;Straighten / fine rotation.\nShortcut: s\n\nIndicate the vertical or horizontal by drawing a guide line over the image preview. Angle of rotation will be shown next to the guide line. Center of rotation is the geometrical center of the image.
TOOLBAR_TOOLTIP_WB;Spot white balance.\nShortcut: w
TP_BWMIX_ALGO;Algorithm OYCPM
@@ -1430,6 +1971,7 @@ TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotate left.\n\nShortcuts:\n[ - Multiple Ed
TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotate right.\n\nShortcuts:\n] - Multiple Editor Tabs Mode,\nAlt-] - Single Editor Tab Mode.
TP_COARSETRAF_TOOLTIP_VFLIP;Flip vertically.
TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance
+TP_COLORAPP_ADAPSCEN_TOOLTIP;Corresponds to the luminance in candelas per m2 at the time of shooting, calculated automatically from the exif data.
TP_COLORAPP_ALGO;Algorithm
TP_COLORAPP_ALGO_ALL;All
TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC)
@@ -1439,63 +1981,70 @@ TP_COLORAPP_ALGO_TOOLTIP;Lets you choose between parameter subsets or all parame
TP_COLORAPP_BADPIXSL;Hot/bad pixel filter
TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression of hot/bad (brightly colored) pixels.\n0 = No effect\n1 = Median\n2 = Gaussian.\nAlternatively, adjust the image to avoid very dark shadows.\n\nThese artifacts are due to limitations of CIECAM02.
TP_COLORAPP_BRIGHT;Brightness (Q)
-TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 takes into account the white's luminosity and differs from L*a*b* and RGB brightness.
+TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 is the amount of perceived light emanating from a stimulus and differs from L*a*b* and RGB brightness.
TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended.
TP_COLORAPP_CHROMA;Chroma (C)
TP_COLORAPP_CHROMA_M;Colorfulness (M)
-TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 differs from L*a*b* and RGB colorfulness.
+TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 is the perceived amount of hue in relation to gray, an indicator that a stimulus appears to be more or less colored.
TP_COLORAPP_CHROMA_S;Saturation (S)
-TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 differs from L*a*b* and RGB saturation.
-TP_COLORAPP_CHROMA_TOOLTIP;Chroma in CIECAM02 differs from L*a*b* and RGB chroma.
+TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 corresponds to the color of a stimulus in relation to its own brightness, differs from L*a*b* and RGB saturation.
+TP_COLORAPP_CHROMA_TOOLTIP;Chroma in CIECAM02 corresponds to the color of a stimulus relative to the clarity of a stimulus that appears white under identical conditions, differs from L*a*b* and RGB chroma.
TP_COLORAPP_CIECAT_DEGREE;CAT02 adaptation
-TP_COLORAPP_CONTRAST;Contrast (J)
+TP_COLORAPP_CONTRAST;Contrast (J),
TP_COLORAPP_CONTRAST_Q;Contrast (Q)
-TP_COLORAPP_CONTRAST_Q_TOOLTIP;Differs from L*a*b* and RGB contrast.
-TP_COLORAPP_CONTRAST_TOOLTIP;Differs from L*a*b* and RGB contrast.
+TP_COLORAPP_CONTRAST_Q_TOOLTIP;Contrast (Q) based on brightness, differs from L*a*b* and RGB contrast.
+TP_COLORAPP_CONTRAST_TOOLTIP;Contrast (J) based on lightness, differs from L*a*b* and RGB contrast.
TP_COLORAPP_CURVEEDITOR1;Tone curve 1
-TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Shows the histogram of L* (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of J or Q after CIECAM02.\n\nJ and Q are not shown in the main histogram panel.\n\nFor final output refer to the main histogram panel.
+TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Shows the histogram of L* (L*a*b*) before CIECAM02.\nIf the "CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of J or Q after CIECAM02.\n\nJ and Q are not shown in the main histogram panel.\n\nFor final output refer to the main histogram panel.
TP_COLORAPP_CURVEEDITOR2;Tone curve 2
TP_COLORAPP_CURVEEDITOR2_TOOLTIP;Same usage as with the second exposure tone curve.
TP_COLORAPP_CURVEEDITOR3;Color curve
-TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel.
+TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, S or M after CIECAM02.\n\nC, S and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel.
TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves
TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments.
+TP_COLORAPP_DEGREE_TOOLTIP;CAT02 is a chromatic adaptation, it converts the values of an image whose white point is that of a given illuminant (for example D65), into new values whose white point is that of the new illuminant - see WP Model (for example D50 or D55).
+TP_COLORAPP_DEGREOUT_TOOLTIP;CAT02 is a chromatic adaptation, it converts the values of an image whose white point is that of a given illuminant (for example D50), into new values whose white point is that of the new illuminant - see WP model (for example D75).
TP_COLORAPP_FREE;Free temp+green + CAT02 + [output]
TP_COLORAPP_GAMUT;Gamut control (L*a*b*)
TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode.
+TP_COLORAPP_GEN;Settings - Preset
+TP_COLORAPP_GEN_TOOLTIP;This module is based on the CIECAM02 color appearance model, which was designed to better simulate how human vision perceives colors under different lighting conditions, e.g., against different backgrounds.\nIt takes into account the environment of each color and modifies its appearance to get as close as possible to human perception.\nIt also adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic appearance is preserved across the scene and display environments.
TP_COLORAPP_HUE;Hue (h)
-TP_COLORAPP_HUE_TOOLTIP;Hue (h) - angle between 0° and 360°.
-TP_COLORAPP_ILLUM;Illuminant
-TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and lattitude.
-TP_COLORAPP_ILA;Incandescent StdA 2856K
+TP_COLORAPP_HUE_TOOLTIP;Hue (h) is the degree to which a stimulus can be described as similar to a color described as red, green, blue and yellow.
TP_COLORAPP_IL41;D41
TP_COLORAPP_IL50;D50
TP_COLORAPP_IL55;D55
TP_COLORAPP_IL60;D60
TP_COLORAPP_IL65;D65
TP_COLORAPP_IL75;D75
+TP_COLORAPP_ILA;Incandescent StdA 2856K
TP_COLORAPP_ILFREE;Free
-TP_COLORAPP_LABEL;CIE Color Appearance Model 2002
+TP_COLORAPP_ILLUM;Illuminant
+TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and lattitude.
+TP_COLORAPP_LABEL;Color Appearance & Lighting (CIECAM02)
TP_COLORAPP_LABEL_CAM02;Image Adjustments
TP_COLORAPP_LABEL_SCENE;Scene Conditions
TP_COLORAPP_LABEL_VIEWING;Viewing Conditions
TP_COLORAPP_LIGHT;Lightness (J)
-TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 differs from L*a*b* and RGB lightness.
+TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 is the clarity of a stimulus relative to the clarity of a stimulus that appears white under similar viewing conditions, differs from L*a*b* and RGB lightness.
TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%)
TP_COLORAPP_MODEL;WP Model
TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected by the user, the output device's white balance is set in Viewing Conditions.
TP_COLORAPP_NEUTRAL;Reset
TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values
-TP_COLORAPP_PRESETCAT02;Preset cat02 automatic
-TP_COLORAPP_PRESETCAT02_TIP;Set combobox, sliders, temp, green so that Cat02 automatic is preset.\nYou can change illuminant shooting conditions.\nYou must change Cat02 adaptation Viewing conditions if need.\nYou can change Temperature and Tint Viewing conditions if need, and other settings if need.
+TP_COLORAPP_PRESETCAT02;Preset cat02 automatic - Symetric mode
+TP_COLORAPP_PRESETCAT02_TIP;Set combobox, sliders, temp, green so that Cat02 automatic is preset.\nYou can change illuminant shooting conditions.\nYou must change Cat02 adaptation Viewing conditions if needed.\nYou can change Temperature and Tint Viewing conditions if needed, and other settings if needed.
TP_COLORAPP_RSTPRO;Red & skin-tones protection
TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves.
+TP_COLORAPP_SOURCEF_TOOLTIP;Corresponds to the shooting conditions and how to bring the conditions and data back to a "normal" area. Normal" means average or standard conditions and data, i.e. without taking into account CIECAM corrections.
TP_COLORAPP_SURROUND;Surround
+TP_COLORAPP_SURROUNDSRC;Surround - Scene Lighting
TP_COLORAPP_SURROUND_AVER;Average
TP_COLORAPP_SURROUND_DARK;Dark
TP_COLORAPP_SURROUND_DIM;Dim
TP_COLORAPP_SURROUND_EXDARK;Extremly Dark (Cutsheet)
TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slightly dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark.
+TP_COLORAPP_SURSOURCE_TOOLTIP;Changes tones and colors to take into account the Scene conditions.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment. The image will become slightly bright.\n\nDark: Dark environment. The image will become more bright.\n\nExtremly Dark: Extremly dark environment. The image will become very bright.
TP_COLORAPP_TCMODE_BRIGHTNESS;Brightness
TP_COLORAPP_TCMODE_CHROMA;Chroma
TP_COLORAPP_TCMODE_COLORF;Colorfulness
@@ -1504,14 +2053,17 @@ TP_COLORAPP_TCMODE_LABEL2;Curve mode 2
TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode
TP_COLORAPP_TCMODE_LIGHTNESS;Lightness
TP_COLORAPP_TCMODE_SATUR;Saturation
-TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504
TP_COLORAPP_TEMP2_TOOLTIP;Either symmetrical mode temp = White balance.\nEither select illuminant always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504
-TP_COLORAPP_TEMPOUT_TOOLTIP;Disable to chnage temperature and tint
+TP_COLORAPP_TEMPOUT_TOOLTIP;Disable to change temperature and tint
+TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504
TP_COLORAPP_TONECIE;Tone mapping using CIECAM02
TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect.
+TP_COLORAPP_VIEWINGF_TOOLTIP;Takes into account the support on which the final image will be viewed (monitor, TV, projector, printer, ...), as well as its environment. This process will take the data coming from process "Image Adjustments" and "bring" it to the support in such a way that the viewing conditions and its environment are taken into account.
TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16 cd/m²).
TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output]
TP_COLORAPP_WBRT;WB [RT] + [output]
+TP_COLORAPP_YBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. A gray at 18% corresponds to a background luminance expressed in CIE L of 50%.\nThis data must take into account the average luminance of the image
+TP_COLORAPP_YBSCEN_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. A gray at 18% corresponds to a background luminance expressed in CIE L of 50%.\nThis data is calculated from the average luminance of the image
TP_COLORTONING_AB;o C/L
TP_COLORTONING_AUTOSAT;Automatic
TP_COLORTONING_BALANCE;Balance
@@ -1595,7 +2147,7 @@ TP_DEFRINGE_RADIUS;Radius
TP_DEFRINGE_THRESHOLD;Threshold
TP_DEHAZE_DEPTH;Depth
TP_DEHAZE_LABEL;Haze Removal
-TP_DEHAZE_LUMINANCE;Luminance only
+TP_DEHAZE_SATURATION;Saturation
TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map
TP_DEHAZE_STRENGTH;Strength
TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones
@@ -1705,12 +2257,19 @@ TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Weighted Standard
TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points
TP_EXPOS_WHITEPOINT_LABEL;Raw White Points
TP_FILMNEGATIVE_BLUE;Blue ratio
-TP_FILMNEGATIVE_FILMBASE_PICK;Pick film base color
-TP_FILMNEGATIVE_FILMBASE_TOOLTIP;Pick a spot of unexposed film (eg. the border between frames), to get the actual film base color values, and save them in the processing profile.\nThis makes it easy to get a more consistent color balance when batch-processing multiple pictures from the same roll.\nAlso use this when the converted image is extremely dark, bright, or color-unbalanced.
-TP_FILMNEGATIVE_FILMBASE_VALUES;Film base RGB:
-TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
-TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards.
+TP_FILMNEGATIVE_BLUEBALANCE;Cool/Warm
+TP_FILMNEGATIVE_COLORSPACE;Inversion color space:
+TP_FILMNEGATIVE_COLORSPACE_INPUT;Input color space
+TP_FILMNEGATIVE_COLORSPACE_TOOLTIP;Select the color space used to perform the negative inversion:\nInput color space : perform inversion before the input profile is applied, as in the previous versions of RT.\nWorking color space : perform inversion after input profile, using the currently selected working profile.
+TP_FILMNEGATIVE_COLORSPACE_WORKING;Working color space
+TP_FILMNEGATIVE_REF_LABEL;Input RGB: %1
+TP_FILMNEGATIVE_REF_PICK;Pick white balance spot
+TP_FILMNEGATIVE_REF_TOOLTIP;Pick a gray patch for white-balancing the output, positive image.
+TP_FILMNEGATIVE_GREEN;Reference exponent
+TP_FILMNEGATIVE_GREENBALANCE;Magenta/Green
+TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness.
TP_FILMNEGATIVE_LABEL;Film Negative
+TP_FILMNEGATIVE_OUT_LEVEL;Output level
TP_FILMNEGATIVE_PICK;Pick neutral spots
TP_FILMNEGATIVE_RED;Red ratio
TP_FILMSIMULATION_LABEL;Film Simulation
@@ -1850,6 +2409,669 @@ TP_LOCALCONTRAST_DARKNESS;Darkness level
TP_LOCALCONTRAST_LABEL;Local Contrast
TP_LOCALCONTRAST_LIGHTNESS;Lightness level
TP_LOCALCONTRAST_RADIUS;Radius
+TP_LOCALLAB_ACTIV;Luminance only
+TP_LOCALLAB_ACTIVSPOT;Enable Spot
+TP_LOCALLAB_ADJ;Equalizer Blue-Yellow/Red-Green
+TP_LOCALLAB_ALL;All rubrics
+TP_LOCALLAB_AMOUNT;Amount
+TP_LOCALLAB_ARTIF;Shape detection
+TP_LOCALLAB_ARTIF_TOOLTIP;ΔE scope threshold increases the range of deltaE scope. High values are for very wide gamut images.\nIncreasing deltaE decay can improve shape detection, but can also reduce the scope.
+TP_LOCALLAB_AUTOGRAY;Auto mean luminance (Yb%)
+TP_LOCALLAB_AVOID;Avoid color shift
+TP_LOCALLAB_BALAN;ab-L balance (ΔE)
+TP_LOCALLAB_BALANEXP;Laplacian balance
+TP_LOCALLAB_BALANH;C-H balance (ΔE)
+TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less a*b* or L*, or more or less C or H.\nNot for Denoise
+TP_LOCALLAB_BASELOG;Shadows range (logarithm base)
+TP_LOCALLAB_BILATERAL;Bilateral filter
+TP_LOCALLAB_BLACK_EV;Black Ev
+TP_LOCALLAB_BLCO;Chrominance only
+TP_LOCALLAB_BLENDMASKCOL;Blend
+TP_LOCALLAB_BLENDMASKMASK;Add/subtract luminance mask
+TP_LOCALLAB_BLENDMASKMASKAB;Add/subtract chrominance mask
+TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;If this slider = 0 no action.\nAdd or subtract the mask from the original image
+TP_LOCALLAB_BLENDMASK_TOOLTIP;If blend = 0 only shape detection is improved.\nIf blend > 0 the mask is added to the image. If blend < 0 the mask is subtracted from the image
+TP_LOCALLAB_BLGUID;Guided Filter
+TP_LOCALLAB_BLINV;Inverse
+TP_LOCALLAB_BLLC;Luminance & Chrominance
+TP_LOCALLAB_BLLO;Luminance only
+TP_LOCALLAB_BLMED;Median
+TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal - direct blur and noise with all settings.\nInverse blur and noise with all settings. Be careful some results may be curious
+TP_LOCALLAB_BLNOI_EXP;Blur & Noise
+TP_LOCALLAB_BLNORM;Normal
+TP_LOCALLAB_BLSYM;Symmetric
+TP_LOCALLAB_BLUFR;Blur/Grain & Denoise
+TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n-blur the background by completely covering the image with an an RT-spot (high values for scope and transition and ‘Normal’ or ‘Inverse’ in checkbox).\n-Isolate the foreground by using one or more ‘Excluding’ RT-spot(s) and increase the scope.\n\nThis module (including the "median" and "Guided filter") can be used in addition to the main-menu noise reduction.
+TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain
+TP_LOCALLAB_BLURCBDL;Blur levels 0-1-2-3-4
+TP_LOCALLAB_BLURCOL;Radius
+TP_LOCALLAB_BLURCOLDE_TOOLTIP;The image used to calculate dE is blurred slightly to avoid taking isolated pixels into account.
+TP_LOCALLAB_BLURDE;Blur shape detection
+TP_LOCALLAB_BLURLC;Luminance only
+TP_LOCALLAB_BLURLEVELFRA;Blur levels
+TP_LOCALLAB_BLURMASK_TOOLTIP;Uses a large-radius blur to create a mask that allows you to vary the contrast of the image and/or darken/lighten parts of it.
+TP_LOCALLAB_BLURRESIDFRA;Blur Residual
+TP_LOCALLAB_BLURRMASK_TOOLTIP;Allows you to vary the "radius" of the Gaussian blur (0 to 1000)
+TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise - 1
+TP_LOCALLAB_BLWH;All changes forced in Black-and-White
+TP_LOCALLAB_BLWH_TOOLTIP;Force color components "a" and "b" to zero.\nUseful for black and white processing, or film simulation.
+TP_LOCALLAB_BUTTON_ADD;Add
+TP_LOCALLAB_BUTTON_DEL;Delete
+TP_LOCALLAB_BUTTON_DUPL;Duplicate
+TP_LOCALLAB_BUTTON_REN;Rename
+TP_LOCALLAB_BUTTON_VIS;Show/Hide
+TP_LOCALLAB_CATAD;Chromatic adaptation - Cat02
+TP_LOCALLAB_CBDL;Contrast by Detail Levels
+TP_LOCALLAB_CBDLCLARI_TOOLTIP;Enhances local contrast of the midtones.
+TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Same as wavelets.\nThe first level (0) acts on 2x2 pixel details.\nThe last level (5) acts on 64x64 pixel details.
+TP_LOCALLAB_CBDL_THRES_TOOLTIP;Prevents the sharpening of noise
+TP_LOCALLAB_CBDL_TOOLNAME;CBDL - 2
+TP_LOCALLAB_CENTER_X;Center X
+TP_LOCALLAB_CENTER_Y;Center Y
+TP_LOCALLAB_CH;Curves CL - LC
+TP_LOCALLAB_CHROMA;Chrominance
+TP_LOCALLAB_CHROMABLU;Chroma levels
+TP_LOCALLAB_CHROMABLU_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect.
+TP_LOCALLAB_CHROMACBDL;Chroma
+TP_LOCALLAB_CHROMACB_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect.
+TP_LOCALLAB_CHROMALEV;Chroma levels
+TP_LOCALLAB_CHROMASKCOL;Chroma
+TP_LOCALLAB_CHROMASK_TOOLTIP;Changes the chroma of the mask if one exists (i.e. C(C) or LC(H) is activated).
+TP_LOCALLAB_CHRRT;Chroma
+TP_LOCALLAB_CIEC;Use Ciecam environment parameters
+TP_LOCALLAB_CIECAMLOG_TOOLTIP;This module is based on the CIECAM02 color appearance model which was designed to better simulate how human vision perceives colors under different lighting conditions.\nThe first Ciecam process 'Scene conditions' is carried out by Log encoding, it also uses 'Absolute luminance' at the time of shooting.\nThe second Ciecam process 'Image adjustments' is simplified and uses only 3 variables (local contrast, contrast J, saturation s).\nThe third Ciecam process 'Viewing conditions' adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic and contrast appearance is preserved across the display environment.
+TP_LOCALLAB_CIRCRADIUS;Spot size
+TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for treating foliage.\nHigh values may be useful for treating skin
+TP_LOCALLAB_CLARICRES;Merge chroma
+TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask - Blend & Soften Images
+TP_LOCALLAB_CLARILRES;Merge luma
+TP_LOCALLAB_CLARISOFT;Soft radius
+TP_LOCALLAB_CLARISOFT_TOOLTIP;The "Soft radius" slider (guided filter algorithm) reduces halos and irregularities for both Clarity and Sharp Mask and for all pyramid wavelet processes. To deactivate, set slider to zero.
+TP_LOCALLAB_CLARITYML;Clarity
+TP_LOCALLAB_CLARI_TOOLTIP;Levels 0 to 4 (included): ‘Sharp mask’ is enabled\nLevels 5 and above: 'Clarity' is enabled.\nUseful if you use 'Wavelet level tone mapping'
+TP_LOCALLAB_CLIPTM;Clip restored data (gain)
+TP_LOCALLAB_COFR;Color & Light
+TP_LOCALLAB_COLORDE;ΔE preview color - intensity
+TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in "Add tool to current spot" menu.\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE
+TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color-preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modified areas without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative.
+TP_LOCALLAB_COLORSCOPE;Scope (color tools)
+TP_LOCALLAB_COLORSCOPE_TOOLTIP;Common Scope slider for Color and Light, Shadows/Highlights, Vibrance.\nOther tools have their own scope controls.
+TP_LOCALLAB_COLOR_TOOLNAME;Color & Light - 11
+TP_LOCALLAB_COL_NAME;Name
+TP_LOCALLAB_COL_VIS;Status
+TP_LOCALLAB_COMPFRA;Directional contrast
+TP_LOCALLAB_COMPFRAME_TOOLTIP;Allows special effects. You can reduce artifacts with 'Clarity & Sharp mask - Blend & Soften Images".\nUses a lot of resources
+TP_LOCALLAB_COMPLEX_METHOD;Software Complexity
+TP_LOCALLAB_COMPLEX_TOOLTIP; Allow user to select Local adjustments rubrics.
+TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping
+TP_LOCALLAB_COMPRESS_TOOLTIP;Use if necessary the module 'Clarity & Sharp mask and Blend & Soften Images' by adjusting 'Soft radius' to reduce artifacts.
+TP_LOCALLAB_CONTCOL;Contrast threshold
+TP_LOCALLAB_CONTFRA;Contrast by level
+TP_LOCALLAB_CONTL;Contrast (J)
+TP_LOCALLAB_CONTRAST;Contrast
+TP_LOCALLAB_CONTRASTCURVMASK1_TOOLTIP;Allows you to freely modify the contrast of the mask (gamma & slope), instead of using a continuous & progressive curve. However it can create artifacts that have to be dealt with using the “Smooth radius” or “Laplacian threshold sliders”.
+TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Allows you to freely change the contrast of the mask. May create artifacts.
+TP_LOCALLAB_CONTRESID;Contrast
+TP_LOCALLAB_CONTTHMASK_TOOLTIP;Allows you to determine which parts of the image will be impacted based on the texture.
+TP_LOCALLAB_CONTTHR;Contrast Threshold
+TP_LOCALLAB_CONTWFRA;Local contrast
+TP_LOCALLAB_CSTHRESHOLD;Ψ Wavelet levels
+TP_LOCALLAB_CSTHRESHOLDBLUR;Ψ Wavelet level selection
+TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance "Super"
+TP_LOCALLAB_CURVCURR;Normal
+TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;If curves at the top, mask is completely black no transformation is made by the mask on the image.\nAs you go down the curve, the mask gradually more colorful and brilliant, the image is changing more and more.\n\nThe gray transition line which represents the references (chroma, luma, hue).\nYou can choose or not to position the top of the curves on this transition.
+TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot.
+TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the ‘Curve type’ combobox to ‘Normal’
+TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tone curve
+TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and Light
+TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) uses the same algorithm as the lightness slider.
+TP_LOCALLAB_CURVENCONTRAST;Super+Contrast threshold (experimental)
+TP_LOCALLAB_CURVENH;Super
+TP_LOCALLAB_CURVENHSU;Combined HueChroma (experimental)
+TP_LOCALLAB_CURVENSOB2;Combined HueChroma + Contrast threshold (experimental)
+TP_LOCALLAB_CURVNONE;Disable curves
+TP_LOCALLAB_DARKRETI;Darkness
+TP_LOCALLAB_DEHAFRA;Dehaze
+TP_LOCALLAB_DEHAZ;Strength
+TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Removes atmospheric haze. Increases overall saturation and detail.\nCan remove color casts, but may also introduce a blue cast which can be corrected with other tools.
+TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values add haze
+TP_LOCALLAB_DELTAD;Delta balance
+TP_LOCALLAB_DELTAEC;ΔE Image mask
+TP_LOCALLAB_DENOIBILAT_TOOLTIP;Allows you to reduce impulse or ‘salt & pepper’ noise.
+TP_LOCALLAB_DENOICHROC_TOOLTIP;Allows you to deal with blotches and packets of noise.
+TP_LOCALLAB_DENOICHRODET_TOOLTIP;Allows you to recover chrominance detail by progressively applying a Fourier transform (DCT).
+TP_LOCALLAB_DENOICHROF_TOOLTIP;Allows you to adjust fine-detail chrominance noise
+TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Allows you to direct the chroma noise reduction towards either the blue-yellow or red-green colors.
+TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Allows you to carry out more or less noise reduction in either the shadows or the highlights.
+TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Allows you to recover luminance detail by progressively applying a Fourier transform (DCT).
+TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservative mode preserves low frequency detail. “Aggressive” mode removes low frequency detail.
+TP_LOCALLAB_DENOIS;Ψ Denoise
+TP_LOCALLAB_DENOITHR_TOOLTIP;Adjusts edge detection to help reduce noise in uniform, low-contrast areas.
+TP_LOCALLAB_DENOI_EXP;Denoise
+TP_LOCALLAB_DENOI_TOOLTIP;This module can be used for noise reduction either on its own (at the end of the processing pipeline) or in addition to the Noise Reduction module in the Detail tab (which works at the beginning of the pipeline).\n Scope allows you to differentiate the action based on color (deltaE).\n\n You can refine the result with a "Median filter" or a "Guided Filter" (Soft radius).
+TP_LOCALLAB_DEPTH;Depth
+TP_LOCALLAB_DETAIL;Local contrast
+TP_LOCALLAB_DETAILSH;Details
+TP_LOCALLAB_DETAILTHR;Luminance & chroma detail threshold (DCT ƒ)
+TP_LOCALLAB_DUPLSPOTNAME;Copy
+TP_LOCALLAB_EDGFRA;Edge sharpness
+TP_LOCALLAB_EDGSHOW;Show all tools
+TP_LOCALLAB_ELI;Ellipse
+TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping
+TP_LOCALLAB_ENABLE_MASK;Enable mask
+TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure
+TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled Mask uses Restored Datas after Transmission Map instead of Original datas
+TP_LOCALLAB_ENH;Enhanced
+TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise
+TP_LOCALLAB_EPSBL;Detail
+TP_LOCALLAB_EQUIL;Normalize luminance
+TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image are identical to those of the original.
+TP_LOCALLAB_ESTOP;Edge stopping
+TP_LOCALLAB_EV_DUPL;Copy of
+TP_LOCALLAB_EV_NVIS;Hide
+TP_LOCALLAB_EV_NVIS_ALL;Hide all
+TP_LOCALLAB_EV_VIS;Show
+TP_LOCALLAB_EV_VIS_ALL;Show all
+TP_LOCALLAB_EXCLUF;Excluding
+TP_LOCALLAB_EXCLUF_TOOLTIP;‘Excluding’ mode prevents adjacent spots from influencing certain parts of the image. Adjusting ‘Scope’ will extend the range of colors.\n You can also add tools to an Excluding spot and use them in the same way as for a normal spot.
+TP_LOCALLAB_EXCLUTYPE;Spot method
+TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode
+TP_LOCALLAB_EXECLU;Excluding spot
+TP_LOCALLAB_EXNORM;Normal spot
+TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens by reducing the contrast on the appropriate detail level(s).
+TP_LOCALLAB_EXPCHROMA;Chroma compensation
+TP_LOCALLAB_EXPCHROMA_TOOLTIP;Use in association with ‘Exposure compensation f’ and ‘Contrast Attenuator f’ to avoid desaturating colors.
+TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small defects such as red-eye, sensor dust etc.
+TP_LOCALLAB_EXPCOMP;Exposure compensation ƒ
+TP_LOCALLAB_EXPCOMPINV;Exposure compensation
+TP_LOCALLAB_EXPCOMP_TOOLTIP;For portraits or images with a low color gradient. You can change "Shape detection" in "Settings":\n\nIncrease 'ΔE scope threshold'\nReduce 'ΔE decay'\nIncrease 'ab-L balance (ΔE)’
+TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Locallab version: more tools and more possibilities for working on individual detail levels.\ne.g. Wavelet-level tone mapping.
+TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small ( < 32x32 pixels).\nUse low ‘Transition value’ and high ‘Transition decay’ and ‘Scope’ to simulate small RT-spots and deal wth defects.\nUse 'Clarity & Sharp mask and Blend & Soften Images' if necessary by adjusting 'Soft radius' to reduce artifacts.
+TP_LOCALLAB_EXPCURV;Curves
+TP_LOCALLAB_EXPGRAD;Graduated Filter
+TP_LOCALLAB_EXPGRADCOL_TOOLTIP;A graduated filter is available in Color and Light (luminance, chrominance & hue gradients, and "Merge file") Exposure (luminance grad.), Exposure Mask (luminance grad.), Shadows/Highlights (luminance grad.), Vibrance (luminance, chrominance & hue gradients), Local contrast & wavelet pyramid (local contrast grad.).\nFeather is located in Settings.
+TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Changes the transformed/original image blend
+TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Changes the behaviour for images with too much or too little contrast by adding a gamma curve before and after the Laplace transform
+TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Changes the behaviour for underexposed images by adding a linear component prior to applying the Laplace transform
+TP_LOCALLAB_EXPLAP_TOOLTIP;Moving the slider to the right progressively reduces the contrast.
+TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows you to use GIMP or Photoshop (c) layer blend modes i.e. Difference, Multiply, Soft Light, Overlay etc., with opacity control.\nOriginal Image : merge current RT-spot with Original.\nPrevious spot : merge current Rt-spot with previous - if there is only one spot previous = original.\nBackground : merge current RT-spot with a color and luminance background (fewer possibilties)
+TP_LOCALLAB_EXPMETHOD_TOOLTIP;Standard : use an algorithm similar as main Exposure but in L*a*b* and taking account of deltaE.\n\nContrast attenuator : use another algorithm also with deltaE and with Poisson equation to solve Laplacian in Fourier space.\nContrast attenuator, Dynamic range compression and Standard can be combined.\nFFTW Fourier Transform is optimized in size to reduce processing time.\nReduce artifacts and noise.
+TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Applies a median filter before the Laplace transform to prevent artifacts (noise).\nYou can also use the "Denoise" tool.
+TP_LOCALLAB_EXPOSE;Dynamic Range & Exposure
+TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts.
+TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools
+TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high ‘Transition decay’ and ‘Scope’ values to simulate smaller RT-spots.
+TP_LOCALLAB_EXPTOOL;Exposure Tools
+TP_LOCALLAB_EXPTRC;Tone Response Curve - TRC
+TP_LOCALLAB_EXP_TOOLNAME;Dynamic Range & Exposure - 10
+TP_LOCALLAB_FATAMOUNT;Amount
+TP_LOCALLAB_FATANCHOR;Anchor
+TP_LOCALLAB_FATANCHORA;Offset
+TP_LOCALLAB_FATDETAIL;Detail
+TP_LOCALLAB_FATFRA;Dynamic Range Compression ƒ
+TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal – uses the Fattal Tone-mapping algorithm.
+TP_LOCALLAB_FATLEVEL;Sigma
+TP_LOCALLAB_FATRES;Amount Residual Image
+TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ
+TP_LOCALLAB_FEATH_TOOLTIP;Gradient width as a percentage of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn’t been activated.
+TP_LOCALLAB_FEATVALUE;Feather gradient (Graduated Filters)
+TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ
+TP_LOCALLAB_FFTMASK_TOOLTIP;Use a Fourier transform for better quality (increased processing time and memory requirements)
+TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform
+TP_LOCALLAB_FFTW2;ƒ - Use Fast Fourier Transform (TIF, JPG,..)
+TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform
+TP_LOCALLAB_FULLIMAGE;Dark-Ev & white-Ev for the whole image
+TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calculates the Ev levels for the whole image.
+TP_LOCALLAB_GAM;Gamma
+TP_LOCALLAB_GAMFRA;Tone response curve (TRC)
+TP_LOCALLAB_GAMM;Gamma
+TP_LOCALLAB_GAMMASKCOL;Gamma
+TP_LOCALLAB_GAMMASK_TOOLTIP;Gamma and Slope allow a soft and artifact-free transformation of the mask by progressively modifying “L” to avoid any discontinuities.
+TP_LOCALLAB_GAMSH;Gamma
+TP_LOCALLAB_GRADANG;Gradient angle
+TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees : -180 0 +180
+TP_LOCALLAB_GRADFRA;Graduated Filter Mask
+TP_LOCALLAB_GRADGEN_TOOLTIP;Adjusts luminance gradient strength
+TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance
+TP_LOCALLAB_GRADSTR;Gradient strength
+TP_LOCALLAB_GRADSTRAB_TOOLTIP;Adjusts chroma gradient strength
+TP_LOCALLAB_GRADSTRCHRO;Chrominance gradient strength
+TP_LOCALLAB_GRADSTRHUE;Hue gradient strength
+TP_LOCALLAB_GRADSTRHUE2;Hue gradient strength
+TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Adjusts hue gradient strength
+TP_LOCALLAB_GRADSTRLUM;Luminance gradient strength
+TP_LOCALLAB_GRADSTR_TOOLTIP;Filter strength in stops
+TP_LOCALLAB_GRAINFRA;Film Grain 1:1
+TP_LOCALLAB_GRAIN_TOOLTIP;Adds film-like grain to the image
+TP_LOCALLAB_GRALWFRA;Graduated filter (local contrast)
+TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use small spot and adapt transition and transition decay\nOnly mode NORMAL and eventually Hue, Saturation, Color, Luminosity are concerned by Merge background (ΔE)
+TP_LOCALLAB_GRIDMETH_TOOLTIP;Color toning: the luminance is taken into account when varying chroma. Equivalent to H=f(H) if the "white dot" on the grid remains at zero and you only vary the "black dot". Equivalent to "Color toning" if you vary the 2 dots.\n\nDirect: acts directly on the chroma
+TP_LOCALLAB_GRIDONE;Color Toning
+TP_LOCALLAB_GRIDTWO;Direct
+TP_LOCALLAB_GUIDBL;Soft radius
+TP_LOCALLAB_GUIDBL_TOOLTIP;Applies a guided filter with adjustable radius. Allows you to reduce artifacts or blur the image.
+TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Changes the distribution function of the guided filter. Negative values simulate a Gaussian blur.
+TP_LOCALLAB_GUIDFILTER;Guided filter radius
+TP_LOCALLAB_GUIDFILTER_TOOLTIP;Can reduce or increase artifacts.
+TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Intensity of the guided filter
+TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin.
+TP_LOCALLAB_HIGHMASKCOL;Highlights
+TP_LOCALLAB_HLH;Curves H
+TP_LOCALLAB_IND;Independent (mouse)
+TP_LOCALLAB_INDSL;Independent (mouse + sliders)
+TP_LOCALLAB_INVBL;Inverse
+TP_LOCALLAB_INVBL_TOOLTIP;Alternative to ‘Inverse’ mode: use two spots\nFirst Spot:\n full image - delimiter outside preview\n RT-spot shape: rectangle. Transition 100\n\nSecond spot : Excluding spot
+TP_LOCALLAB_INVERS;Inverse
+TP_LOCALLAB_INVERS_TOOLTIP;Fewer possibilities if selected (Inverse).\n\nAlternative: use two spots\nFirst Spot:\n full image - delimiter outside preview\n RT-spot shape: rectangle. Transition 100\n\nSecond spot: Excluding spot
+TP_LOCALLAB_ISOGR;Coarseness (ISO)
+TP_LOCALLAB_LABBLURM;Blur Mask
+TP_LOCALLAB_LABEL;Local Adjustments
+TP_LOCALLAB_LABGRID;Color correction grid
+TP_LOCALLAB_LABGRIDMERG;Background
+TP_LOCALLAB_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4
+TP_LOCALLAB_LABSTRUM;Structure Mask
+TP_LOCALLAB_LAPLACC;ΔØ Mask Laplacian solve PDE
+TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE
+TP_LOCALLAB_LAPLACEXP;Laplacian threshold
+TP_LOCALLAB_LAPMASKCOL;Laplacian threshold
+TP_LOCALLAB_LAPRAD1_TOOLTIP;Avoid using “Smooth radius” and “Laplacian threshold” (advanced) together.\nTransforms the mask to eliminate values lower than the threshold.\nReduces artifacts and noise, and allows local contrast to be modified.
+TP_LOCALLAB_LAPRAD2_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition
+TP_LOCALLAB_LAPRAD_TOOLTIP;Avoid using “Smooth radius” and “Laplacian threshold” (advanced) together.\nSmooth radius uses a guided filter to decrease artifacts and smooth out the transition
+TP_LOCALLAB_LAP_MASK_TOOLTIP;Solve PDE for all Laplacian masks.\nIf enabled Laplacian threshold mask reduce artifacts and smooth result.\nIf disabled linear response.
+TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improves quality and allows the use of large radii, but increases processing time (depends on the area to be processed). Preferable to use only for large radii. The size of the area can be reduced by a few pixels to optimize the FFTW. This can reduce the processing time by a factor of 1.5 to 10.
+TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets - 7
+TP_LOCALLAB_LEVELBLUR;Maximum blur levels
+TP_LOCALLAB_LEVELWAV;Ψ Wavelet levels
+TP_LOCALLAB_LEVELWAV_TOOLTIP;The Level is automatically adapted to the size of the spot and the preview.\nFrom level 9 size max 512 to level 1 size max = 4
+TP_LOCALLAB_LEVFRA;Levels
+TP_LOCALLAB_LIGHTNESS;Lightness
+TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse mode: selection = -100 forces luminance to zero
+TP_LOCALLAB_LIGHTRETI;Lightness
+TP_LOCALLAB_LINEAR;Linearity
+TP_LOCALLAB_LIST_NAME;Add tool to current spot...
+TP_LOCALLAB_LIST_TOOLTIP;You can select 3 levels of complexity for each tool: Basic, Standard & Advanced.\nThe default setting for all tools is Basic but this can be changed in the Preferences window.\nYou can also change the level of complexity on a per-tool basis while you are editing
+TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Give priority to action on midtones and high lights and by choosing the concerned wavelet levels
+TP_LOCALLAB_LMASK_LL_TOOLTIP;Allows you to freely change the contrast of the mask. May create artifacts.
+TP_LOCALLAB_LOCCONT;Unsharp Mask
+TP_LOCALLAB_LOC_CONTRAST;Local Contrast & Wavelets
+TP_LOCALLAB_LOC_CONTRASTPYR;Ψ Pyramid 1:
+TP_LOCALLAB_LOC_CONTRASTPYR2;Ψ Pyramid 2:
+TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contrast by level- Tone Mapping - Dir.Contrast
+TP_LOCALLAB_LOC_CONTRASTPYRLAB; Graduated Filter - Edge Sharpness - Blur
+TP_LOCALLAB_LOC_RESIDPYR;Residual image (Main)
+TP_LOCALLAB_LOG;Log Encoding
+TP_LOCALLAB_LOG1FRA;Image Adjustments
+TP_LOCALLAB_LOG2FRA;Viewing Conditions
+TP_LOCALLAB_LOGAUTO;Automatic
+TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;Automatically calculates the 'mean luminance' for the scene conditons when the ‘Automatic’ button in Relative Exposure Levels is pressed.
+TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will calculate the 'dynamic range' and 'mean luminance' for the scene conditions if the "Auto mean luminance (Yb%)” is checked).\nAlso calculates the absolute luminance at the time of shooting.\nPress the button again to adjust the automatically calculated values.
+TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm making the shadows darker and the highlights brighter.\nWith values greater than 2, the shadows are grayer and the highlights become more washed out.
+TP_LOCALLAB_LOGBLACKWHEV_TOOLTIP;Estimated values of Dynamic Range i.e. Black Ev and White Ev
+TP_LOCALLAB_LOGCATAD_TOOLTIP;The chromatic adaptation allows us to interpret a color according to its spatio-temporal environment.\nUseful when the white balance is far from reference D50.\nAdapts colors to the illuminant of the output device.
+TP_LOCALLAB_LOGCOLORFL;Colorfulness (M)
+TP_LOCALLAB_LOGCOLORF_TOOLTIP;Perceived amount of hue in relation to gray.\nIndicator that a stimulus appears more or less colored.
+TP_LOCALLAB_LOGCONQL;Contrast (Q)
+TP_LOCALLAB_LOGCONTL;Contrast (J)
+TP_LOCALLAB_LOGCONTL_TOOLTIP;Contrast (J) in CIECAM02 takes into account the increase in perceived coloration with luminance.
+TP_LOCALLAB_LOGCONTQ_TOOLTIP;Contrast (Q) in CIECAM02 takes into account the increase in perceived coloration with brightness.
+TP_LOCALLAB_LOGDETAIL_TOOLTIP;Acts mainly on high frequencies.
+TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUseful for underexposed images or images with high dynamic range.\n\nTwo-step process : 1) Dynamic Range calculation 2) Manual adjustment
+TP_LOCALLAB_LOGEXP;All tools
+TP_LOCALLAB_LOGFRA;Scene Conditions
+TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the 'Mean luminance Yb%' (source gray point) for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\nTakes into account exposure compensation in the main-menu Exposure tab.\nAlso calculates the absolute luminance at the time of shooting.
+TP_LOCALLAB_LOGIMAGE_TOOLTIP;Takes into account corresponding Ciecam variables (mainly Contrast 'J' and Saturation 's', and also 'advanced' Contrast 'Q' , Brightness 'Q', Lightness (J), Colorfulness (M)).
+TP_LOCALLAB_LOGLIGHTL;Lightness (J)
+TP_LOCALLAB_LOGLIGHTL_TOOLTIP;Close to lightness (L*a*b*), takes into account the increase in perceived coloration.
+TP_LOCALLAB_LOGLIGHTQ;Brightness (Q)
+TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;Perceived amount of light emanating from a stimulus.\nIndicator that a stimulus appears to be more or less bright, clear.
+TP_LOCALLAB_LOGLIN;Logarithm mode
+TP_LOCALLAB_LOGPFRA;Relative Exposure Levels
+TP_LOCALLAB_LOGREPART;Strength
+TP_LOCALLAB_LOGREPART_TOOLTIP;Allows you to adjust the relative strength of the log-encoded image with respect to the original image.\nDoes not affect the Ciecam component.
+TP_LOCALLAB_LOGSATURL_TOOLTIP;Saturation (s) in CIECAM02 corresponds to the color of a stimulus in relation to its own brightness.\nActs mainly on medium and highlights tones
+TP_LOCALLAB_LOGSCENE_TOOLTIP;Corresponds to the shooting conditions.
+TP_LOCALLAB_LOGSRCGREY_TOOLTIP;Estimated gray point value of the image.
+TP_LOCALLAB_LOGSURSOUR_TOOLTIP;Changes tones and colors to take into account the Scene conditions.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment. The image will become slightly bright.
+TP_LOCALLAB_LOGTARGGREY_TOOLTIP;You can adjust this value to suit.
+TP_LOCALLAB_LOGVIEWING_TOOLTIP;Corresponds to the medium on which the final image will be viewed (monitor, TV, projector, printer,..), as well as its environment.
+TP_LOCALLAB_LOG_TOOLNAME;Log Encoding - 0
+TP_LOCALLAB_LUM;Curves LL - CC
+TP_LOCALLAB_LUMADARKEST;Darkest
+TP_LOCALLAB_LUMASK;Background color for luminance and color masks
+TP_LOCALLAB_LUMASK_TOOLTIP;Adjusts the shade of gray or color of the mask background in Show Mask (Mask and modifications)
+TP_LOCALLAB_LUMAWHITESEST;Lightest
+TP_LOCALLAB_LUMFRA;L*a*b* standard
+TP_LOCALLAB_LUMONLY;Luminance only
+TP_LOCALLAB_MASFRAME;Mask and Merge
+TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the deltaE image to avoid modifying the selection area when the following Mask Tools are used: Gamma , Slope , Chroma, Contrast curve , Local contrast (by wavelet level), Blur Mask and Structure Mask (if enabled ) .\nDisabled when Inverse mode is used
+TP_LOCALLAB_MASK;Mask
+TP_LOCALLAB_MASK2;Contrast curve
+TP_LOCALLAB_MASKCOL;Mask Curves
+TP_LOCALLAB_MASKCOM;Common Color Mask
+TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask - 13
+TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope.
+TP_LOCALLAB_MASKCURVE_TOOLTIP;The 3 curves are set to 1 (maximum) by default:\nC=f(C) the chroma varies according to the chrominance. You can decrease the chroma to improve the selection. By setting this curve close to zero (with a low value of C to activate the curve) you can desaturate the background in Inverse mode.\nL=f(L) the luminance varies according to the luminance, so you can decrease the brightness to improve the selection.\nL and C = f(H) luminance and chroma vary with hue, so you can decrease luminance and chroma to improve selection
+TP_LOCALLAB_MASKH;Hue curve
+TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ).\n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allows you to make fine adjustments.
+TP_LOCALLAB_MED;Medium
+TP_LOCALLAB_MEDIAN;Median Low
+TP_LOCALLAB_MEDIANITER_TOOLTIP;The number of successive iterations carried out by the median filter.
+TP_LOCALLAB_MEDIAN_TOOLTIP;You can choose a median value in the range 3x3 to 9x9 pixels. Higher values increase noise reduction and blur.
+TP_LOCALLAB_MEDNONE;None
+TP_LOCALLAB_MERCOL;Color
+TP_LOCALLAB_MERDCOL;Merge background (ΔE)
+TP_LOCALLAB_MERELE;Lighten only
+TP_LOCALLAB_MERFIV;Addition
+TP_LOCALLAB_MERFOR;Color Dodge
+TP_LOCALLAB_MERFOU;Multiply
+TP_LOCALLAB_MERGE1COLFRA;Merge with Original or Previous or Background
+TP_LOCALLAB_MERGECOLFRA;Mask: LCH & Structure
+TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Allows you to create masks based on the 3 LCH curves and/or a structure-detection algorithm
+TP_LOCALLAB_MERGEFIV;Previous Spot(Mask 7) + Mask LCH
+TP_LOCALLAB_MERGEFOU;Previous Spot(Mask 7)
+TP_LOCALLAB_MERGEMER_TOOLTIP;Takes ΔE into account when merging files (equivalent of scope in this case)
+TP_LOCALLAB_MERGENONE;None
+TP_LOCALLAB_MERGEONE;Short Curves 'L' Mask
+TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity = % of current spot to be merged with original or previous Spot.\nContrast threshold : adjusts result as a function of contrast in original image.
+TP_LOCALLAB_MERGETHR;Original(Mask 7) + Mask LCH
+TP_LOCALLAB_MERGETWO;Original(Mask 7)
+TP_LOCALLAB_MERGETYPE;Merge image and mask
+TP_LOCALLAB_MERGETYPE_TOOLTIP;None, use all mask in LCH mode.\nShort curves 'L' mask, use a short circuit for mask 2, 3, 4, 6, 7.\nOriginal mask 8, blend current image with original
+TP_LOCALLAB_MERHEI;Overlay
+TP_LOCALLAB_MERHUE;Hue
+TP_LOCALLAB_MERLUCOL;Luminance
+TP_LOCALLAB_MERLUM;Luminosity
+TP_LOCALLAB_MERNIN;Screen
+TP_LOCALLAB_MERONE;Normal
+TP_LOCALLAB_MERSAT;Saturation
+TP_LOCALLAB_MERSEV;Soft Light (legacy)
+TP_LOCALLAB_MERSEV0;Soft Light Illusion
+TP_LOCALLAB_MERSEV1;Soft Light W3C
+TP_LOCALLAB_MERSEV2;Hard Light
+TP_LOCALLAB_MERSIX;Divide
+TP_LOCALLAB_MERTEN;Darken only
+TP_LOCALLAB_MERTHI;Color Burn
+TP_LOCALLAB_MERTHR;Difference
+TP_LOCALLAB_MERTWE;Exclusion
+TP_LOCALLAB_MERTWO;Subtract
+TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts.
+TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 (Clip - Offset)
+TP_LOCALLAB_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust ‘Clip restored data (gain)’ and ‘Offset’ to normalize.\nRecovers image data without blending.
+TP_LOCALLAB_MODE_EXPERT;Advanced
+TP_LOCALLAB_MODE_NORMAL;Standard
+TP_LOCALLAB_MODE_SIMPLE;Basic
+TP_LOCALLAB_MRFIV;Background
+TP_LOCALLAB_MRFOU;Previous Spot
+TP_LOCALLAB_MRONE;None
+TP_LOCALLAB_MRTHR;Original Image
+TP_LOCALLAB_MRTWO;Short Curves 'L' Mask
+TP_LOCALLAB_MULTIPL_TOOLTIP;Wide-range tone adjustment: -18EV to +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts on light tones up to 4EV
+TP_LOCALLAB_NEIGH;Radius
+TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav)
+TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02
+TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery (DCT ƒ)
+TP_LOCALLAB_NOISECHROFINE;Fine chroma (Wav)
+TP_LOCALLAB_NOISEDETAIL_TOOLTIP;Disabled if slider = 100
+TP_LOCALLAB_NOISELEQUAL;Equalizer white-black
+TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav)
+TP_LOCALLAB_NOISELUMDETAIL;Luminance detail recovery (DCT ƒ)
+TP_LOCALLAB_NOISELUMFINE;Luminance fine 1 (Wav)
+TP_LOCALLAB_NOISELUMFINETWO;Luminance fine 2 (Wav)
+TP_LOCALLAB_NOISELUMFINEZERO;Luminance fine 0 (Wav)
+TP_LOCALLAB_NOISEMETH;Denoise
+TP_LOCALLAB_NOISE_TOOLTIP;Adds luminance noise
+TP_LOCALLAB_NONENOISE;None
+TP_LOCALLAB_NUL_TOOLTIP;.
+TP_LOCALLAB_OFFS;Offset
+TP_LOCALLAB_OFFSETWAV;Offset
+TP_LOCALLAB_OPACOL;Opacity
+TP_LOCALLAB_ORIGLC;Merge only with original image
+TP_LOCALLAB_ORRETILAP_TOOLTIP;Modifies ΔE prior to any changes made by ‘Scope’. This allows you to differentiate the action for different parts of the image (with respect to the background for example).
+TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the action, the more the differences in contrast will be reduced
+TP_LOCALLAB_PASTELS2;Vibrance
+TP_LOCALLAB_PDE;Contrast Attenuator - Dynamic Range compression
+TP_LOCALLAB_PDEFRA;Contrast Attenuator ƒ
+TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL algorithm adapted for Rawtherapee : gives different results and requires different settings compared to main-menu ‘Exposure’.\nMay be useful for under-exposed or high dynamic range images.
+TP_LOCALLAB_PREVHIDE;Hide additional settings
+TP_LOCALLAB_PREVIEW;Preview ΔE
+TP_LOCALLAB_PREVSHOW;Show additional settings
+TP_LOCALLAB_PROXI;ΔE decay
+TP_LOCALLAB_QUALCURV_METHOD;Curve type
+TP_LOCALLAB_QUAL_METHOD;Global quality
+TP_LOCALLAB_RADIUS;Radius
+TP_LOCALLAB_RADIUS_TOOLTIP;Uses a Fast Fourier Transform for radius > 30
+TP_LOCALLAB_RADMASKCOL;Smooth radius
+TP_LOCALLAB_RECT;Rectangle
+TP_LOCALLAB_RECURS;Recursive references
+TP_LOCALLAB_RECURS_TOOLTIP;Forces the algorithm to recalculate the references after each tool is applied.\nAlso useful for working with masks.
+TP_LOCALLAB_REFLABEL;Ref. (0..1) Chroma=%1 Luma=%2 Hue=%3
+TP_LOCALLAB_REN_DIALOG_LAB;Enter the new Control Spot name
+TP_LOCALLAB_REN_DIALOG_NAME;Renaming Control Spot
+TP_LOCALLAB_RESETSHOW;Reset All Show Modifications
+TP_LOCALLAB_RESID;Residual Image
+TP_LOCALLAB_RESIDBLUR;Blur residual image
+TP_LOCALLAB_RESIDCHRO;Residual image Chroma
+TP_LOCALLAB_RESIDCOMP;Compress residual image
+TP_LOCALLAB_RESIDCONT;Residual image Contrast
+TP_LOCALLAB_RESIDHI;Highlights
+TP_LOCALLAB_RESIDHITHR;Highlights threshold
+TP_LOCALLAB_RESIDSHA;Shadows
+TP_LOCALLAB_RESIDSHATHR;Shadows threshold
+TP_LOCALLAB_RETI;Dehaze & Retinex
+TP_LOCALLAB_RETIFRA;Retinex
+TP_LOCALLAB_RETIFRAME_TOOLTIP;Retinex can be useful for processing images: \nthat are blurred, foggy or hazy (in addition to Dehaze).\nthat contain large differences in luminance.\nIt can also be used for special effects (tone mapping).
+TP_LOCALLAB_RETIM;Original Retinex
+TP_LOCALLAB_RETITOOLFRA;Retinex Tools
+TP_LOCALLAB_RETI_FFTW_TOOLTIP;FFT improve quality and allow big radius, but increases the treatment time.\nThe treatment time depends on the surface to be treated\nThe treatment time depends on the value of scale (be carefull to high values).\nTo be used preferably for large radius.\n\nDimensions can be reduced by a few pixels to optimize FFTW.\nThis optimization can reduce the treatment time by a factor of 1.5 to 10.\nOptimization not used in Preview
+TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Has no effect when the value of "Lightness = 1" or "Darkness =2".\nFor other values, the last step of a "Multiple scale Retinex" algorithm (similar to "local contrast") is applied. These 2 cursors, associated with "Strength" allow you to make adjustments upstream of local contrast
+TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Adjusts the internal parameters to optimize the response.\nPreferable to keep the "Restored data" values close to Min=0 and Max=32768 (log mode), but other values are possible.
+TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm mode introduces more contrast but will also generate more halos.
+TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;The radius and variance sliders allow you adjust haze and target either the foreground or the background.
+TP_LOCALLAB_RETI_SCALE_TOOLTIP;If Scale=1, Retinex behaves like local contrast with additional possibilities.\nIncreasing the value of Scale increases the intensity of the recursive action at the expense of processing time.
+TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex - 9
+TP_LOCALLAB_REWEI;Reweighting iterates
+TP_LOCALLAB_RGB;RGB Tone Curve
+TP_LOCALLAB_RGBCURVE_TOOLTIP;In RGB mode you have 4 choices : Standard, Weighted standard, Luminance & Film-like.
+TP_LOCALLAB_ROW_NVIS;Not visible
+TP_LOCALLAB_ROW_VIS;Visible
+TP_LOCALLAB_SATUR;Saturation
+TP_LOCALLAB_SATURV;Saturation (s)
+TP_LOCALLAB_SAVREST;Save - Restore Current Image
+TP_LOCALLAB_SCALEGR;Scale
+TP_LOCALLAB_SCALERETI;Scale
+TP_LOCALLAB_SCALTM;Scale
+TP_LOCALLAB_SCOPEMASK;Scope (ΔE image mask)
+TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if DeltaE Image Mask is enabled.\nLow values avoid retouching selected area
+TP_LOCALLAB_SENSI;Scope
+TP_LOCALLAB_SENSIEXCLU;Scope
+TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust the colors to be excluded
+TP_LOCALLAB_SENSIMASK_TOOLTIP;Scope adjustment specific to common mask tool.\nActs on the difference between the original image and the mask.\nUses the luma, chroma & hue references from the center of the RT-spot\n\nYou can also adjust the deltaE of the mask itself by using 'Scope (deltaE image mask)' in 'Settings' > ‘Mask & Merge’
+TP_LOCALLAB_SENSI_TOOLTIP;Adjusts the scope of the action:\nSmall values limit the action to colors similar to those in the center of the spot.\nHigh values let the tool act on a wider range of colors
+TP_LOCALLAB_SETTINGS;Settings
+TP_LOCALLAB_SH1;Shadows Highlights
+TP_LOCALLAB_SH2;Equalizer
+TP_LOCALLAB_SHADEX;Shadows
+TP_LOCALLAB_SHADEXCOMP;Shadow compression & tonal width
+TP_LOCALLAB_SHADHIGH;Shadows/Highlights & Tone equalizer
+TP_LOCALLAB_SHADHMASK_TOOLTIP;Lowers the highlights of the mask in the same way as the shadows/highlights algorithm
+TP_LOCALLAB_SHADMASK_TOOLTIP;Lifts the shadows of the mask in the same way as the shadows/highlights algorithm
+TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows & highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter.
+TP_LOCALLAB_SHAMASKCOL;Shadows
+TP_LOCALLAB_SHAPETYPE;RT-spot shape
+TP_LOCALLAB_SHAPE_TOOLTIP;”Ellipse” is the normal mode.\n “Rectangle” can be used in certain cases, for example to work in full-image mode by placing the delimiters outside the preview area. In this case, set transition = 100.\n\nFuture developments will include polygon shapes and Bezier curves.
+TP_LOCALLAB_SHARAMOUNT;Amount
+TP_LOCALLAB_SHARBLUR;Blur radius
+TP_LOCALLAB_SHARDAMPING;Damping
+TP_LOCALLAB_SHARFRAME;Modifications
+TP_LOCALLAB_SHARITER;Iterations
+TP_LOCALLAB_SHARP;Sharpening
+TP_LOCALLAB_SHARP_TOOLNAME;Sharpening - 8
+TP_LOCALLAB_SHARRADIUS;Radius
+TP_LOCALLAB_SHORTC;Short Curves 'L' Mask
+TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7
+TP_LOCALLAB_SHOWC;Mask and modifications
+TP_LOCALLAB_SHOWC1;Merge file
+TP_LOCALLAB_SHOWCB;Mask and modifications
+TP_LOCALLAB_SHOWDCT;Show Fourier (ƒ) process
+TP_LOCALLAB_SHOWE;Mask and modifications
+TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct)
+TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first)
+TP_LOCALLAB_SHOWLC;Mask and modifications
+TP_LOCALLAB_SHOWMASK;Show mask
+TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Displays masks and modifications.\nBeware, you can only view one tool mask at a time.\nShow modified image: shows the modified image including the effect of any adjustments and masks.\nShow modified areas without mask: shows the modifications before any masks are applied.\nShow modified areas with mask: shows the modifications after a mask has been applied.\nShow mask: shows the aspect of the mask including the effect of any curves and filters.\nShow spot structure: allows you to see the structure-detection mask when the "Spot structure" cursor is activated (when available).\nNote: The mask is applied before the shape detection algorithm.
+TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Allows you to visualize the different stages of the Fourier process.\n Laplace - calculates the second derivative of the Laplace transform as a function of the threshold.\nFourier - shows the Laplacian transform with DCT.\nPoisson - shows the solution of the Poisson DCE.\nNo luminance normalization - shows result without any luminance normalization.
+TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise
+TP_LOCALLAB_SHOWMASKTYP2;Denoise
+TP_LOCALLAB_SHOWMASKTYP3;Blur & Noise + Denoise
+TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Mask and modifications can be chosen.\nBlur and noise : in this case it is not used for 'denoise'.\nDenoise : in this case it is not used for 'blur and noise'.\n\nBlur and noise + denoise : mask is shared, be carefull to 'show modifications' and 'scope'
+TP_LOCALLAB_SHOWMNONE;Show modified image
+TP_LOCALLAB_SHOWMODIF;Show modified areas without mask
+TP_LOCALLAB_SHOWMODIFMASK;Show modified areas with mask
+TP_LOCALLAB_SHOWNORMAL;No luminance normalization
+TP_LOCALLAB_SHOWPLUS;Mask and modifications (Blur & Denoise)
+TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ)
+TP_LOCALLAB_SHOWR;Mask and modifications
+TP_LOCALLAB_SHOWREF;Preview ΔE
+TP_LOCALLAB_SHOWS;Mask and modifications
+TP_LOCALLAB_SHOWSTRUC;Show spot structure(advanced)
+TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(advanced)
+TP_LOCALLAB_SHOWT;Mask and modifications
+TP_LOCALLAB_SHOWVI;Mask and modifications
+TP_LOCALLAB_SHRESFRA;Shadows/Highlights
+TP_LOCALLAB_SHTRC_TOOLTIP;Based on 'working profile' (only those provided), modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones.\nIt is recommended that the TRC of both devices (monitor and output profile) be sRGB (default).
+TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer - 5
+TP_LOCALLAB_SIGMAWAV;Attenuation response
+TP_LOCALLAB_SIM;Simple
+TP_LOCALLAB_SLOMASKCOL;Slope
+TP_LOCALLAB_SLOMASK_TOOLTIP;Gamma and Slope allow a soft and artifact-free transformation of the mask by progressively modifying “L” to avoid any discontinuities.
+TP_LOCALLAB_SLOSH;Slope
+TP_LOCALLAB_SOFT;Soft Light & Original Retinex
+TP_LOCALLAB_SOFTM;Soft Light
+TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm.
+TP_LOCALLAB_SOFTRADIUSCOL;Soft radius
+TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applies a guided filter to the output image to reduce possible artifacts.
+TP_LOCALLAB_SOFTRETI;Reduce ΔE artifacts
+TP_LOCALLAB_SOFTRETI_TOOLTIP;Take into account deltaE to improve Transmission map
+TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex - 6
+TP_LOCALLAB_SOURCE_ABS;Absolute luminance
+TP_LOCALLAB_SOURCE_GRAY;Mean luminance (Yb%)
+TP_LOCALLAB_SPECCASE;Specific cases
+TP_LOCALLAB_SPECIAL;Special use of RGB curves
+TP_LOCALLAB_SPECIAL_TOOLTIP;The checkbox allows you to remove all other actions i.e. “Scope”, masks, sliders etc., (except for transitions) and use just the effect of the RGB tone-curve.
+TP_LOCALLAB_SPOTNAME;New Spot
+TP_LOCALLAB_STD;Standard
+TP_LOCALLAB_STR;Strength
+TP_LOCALLAB_STRBL;Strength
+TP_LOCALLAB_STREN;Compression strength
+TP_LOCALLAB_STRENG;Strength
+TP_LOCALLAB_STRENGR;Strength
+TP_LOCALLAB_STRENGRID_TOOLTIP;You can adjust the desired effect with "strength", but you can also use the "scope" function which allows you to delimit the action (e.g. to isolate a particular color).
+TP_LOCALLAB_STRENGTH;Noise
+TP_LOCALLAB_STRGRID;Strength
+TP_LOCALLAB_STRRETI_TOOLTIP;if Strength Retinex < 0.2 only Dehaze is enabled.\nif Strength Retinex >= 0.1 Dehaze is in luminance mode.
+TP_LOCALLAB_STRUC;Structure
+TP_LOCALLAB_STRUCCOL;Spot structure
+TP_LOCALLAB_STRUCCOL1;Spot structure
+TP_LOCALLAB_STRUCT_TOOLTIP;Uses the Sobel algorithm to take into account structure for shape detection.\nActivate "Mask and modifications” > “Show spot structure" (advanced mode) to see a preview of the mask (without modifications).\n\nCan be used in conjunction with the Structure Mask, Blur Mask and “Local contrast (by wavelet level)” to improve edge detection.\n\nEffects of adjustments using Lightness, Contrast, Chrominance, Exposure or other non-mask-related tools visible using either ‘Show modified image” or “Show modified areas with mask ”.
+TP_LOCALLAB_STRUMASKCOL;Structure mask strength
+TP_LOCALLAB_STRUMASK_TOOLTIP;Structure mask (slider) with the checkbox "Structure mask as tool" unchecked: In this case a mask showing the structure will be generated even if none of the 3 curves is activated. Structure masks are available for mask 1 (Blur and denoise") and mask 7 (Color & Light).
+TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Moderate use of this slider is recommended!
+TP_LOCALLAB_STYPE;Shape method
+TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent.
+TP_LOCALLAB_SYM;Symmetrical (mouse)
+TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders)
+TP_LOCALLAB_TARGET_GRAY;Mean luminance (Yb%)
+TP_LOCALLAB_THRES;Threshold structure
+TP_LOCALLAB_THRESDELTAE;ΔE scope threshold
+TP_LOCALLAB_THRESRETI;Threshold
+TP_LOCALLAB_THRESWAV;Balance threshold
+TP_LOCALLAB_TLABEL;TM Data Min=%1 Max=%2 Mean=%3 Sigma=%4 (Threshold)
+TP_LOCALLAB_TLABEL2;TM Effective Tm=%1 TM=%2
+TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider.
+TP_LOCALLAB_TM;Tone Mapping
+TP_LOCALLAB_TM_MASK;Use transmission map
+TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This slider affects edge sensitivity.\n The greater the value, the more likely a change in contrast will be interpreted as an "edge".\n If set to zero the tone mapping will have an effect similar to unsharp masking.
+TP_LOCALLAB_TONEMAPGAM_TOOLTIP;The Gamma slider shifts the tone-mapping effect towards either the shadows or the highlights.
+TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems.
+TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe main-menu tool must be deactivated if this tool is used.
+TP_LOCALLAB_TONEMASCALE_TOOLTIP;This slider allows you to adjust the transition between "local" and "global" contrast.\nThe greater the value, the larger a detail needs to be for it to be boosted
+TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping - 4
+TP_LOCALLAB_TOOLCOL;Structure mask as tool
+TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Allows you to modify the mask, if one exists
+TP_LOCALLAB_TOOLMASK;Mask Tools
+TP_LOCALLAB_TOOLMASK_TOOLTIP;Structure mask (slider) with the checkbox "Structure mask as tool" checked: in this case a mask showing the structure will be generated after one or more of the 2 curves L(L) or LC(H) has been modified.\n Here, the "Structure mask" behaves like the other Mask tools : Gamma, Slope, etc.\n It allows you to vary the action on the mask according to the structure of the image.
+TP_LOCALLAB_TRANSIT;Transition Gradient
+TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY
+TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Allows you to vary the y-axis transition
+TP_LOCALLAB_TRANSITVALUE;Transition value
+TP_LOCALLAB_TRANSITWEAK;Transition decay (linear-log)
+TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light)
+TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas as a percentage of the "radius"
+TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain
+TP_LOCALLAB_TRANSMISSIONMAP;Transmission map
+TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positive values (max).\nOrdinate: amplification or reduction.\nYou can adjust this curve to change the Transmission and reduce artifacts
+TP_LOCALLAB_USEMASK;Use mask
+TP_LOCALLAB_VART;Variance (contrast)
+TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool
+TP_LOCALLAB_VIBRA_TOOLTIP;Adjusts vibrance (essentially the same as the global adjustment).\nCarries out the equivalent of a white-balance adjustment using a CIECAM algorithm.
+TP_LOCALLAB_VIB_TOOLNAME;Vibrance & Warm/Cool - 3
+TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot.
+TP_LOCALLAB_WAMASKCOL;Ψ Mask Wavelet level
+TP_LOCALLAB_WARM;Warm/Cool & Color artifacts
+TP_LOCALLAB_WARM_TOOLTIP;This slider uses the CIECAM algorithm and acts as a White Balance control to make the color temperature of the selected area warmer or cooler.\nIt can also reduce color artifacts in some cases.
+TP_LOCALLAB_WASDEN_TOOLTIP;Luminance noise reduction: the left-hand side of the curve corresponds to the first 3 levels 0,1 &2 (fine detail). The right hand side of the curve corresponds to the coarser details (level 3 and beyond).
+TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Balances the action within each level.
+TP_LOCALLAB_WAT_BLURLC_TOOLTIP;The default blur setting affects all 3 L*a* b* components (luminance and colour).\nWhen checked, only luminance is blurred.
+TP_LOCALLAB_WAT_CLARIC_TOOLTIP;“Merge chroma” is used to select the intensity of the desired effect on chrominance.
+TP_LOCALLAB_WAT_CLARIL_TOOLTIP;“Merge luma” is used to select the intensity of the desired effect on luminance.
+TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;“Chroma levels”: adjusts the “a” and “b” components of Lab* as a proportion of the luminance value.
+TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;Offset modifies the balance between low-contrast and high-contrast details.\nHigh values will amplify contrast changes to the higher-contrast details, whereas low values will amplify contrast changes to low-contrast details.\nBy using a low “Attenuation response” value you can select which contrast values will be enhanced.
+TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;By moving the slider to the left, the lower levels are accentuated. To the right, the lower levels are reduced and the higher levels accentuated.
+TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;The residual image behaves in the same way as the main image when making adjustments to contrast, chroma etc.
+TP_LOCALLAB_WAT_GRADW_TOOLTIP;The more you move the slider to the right, the more effective the detection algorithm will be and the less noticeable the effects of local contrast.
+TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Low to high local contrast from left to right on the x-axis.\nIncrease or decrease local contrast on the y-axis.
+TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;You can adjust the distribution of local contrast by wavelet level based on the initial intensity of the contrast. This will modify the effects of perspective and relief in the image, and/or reduce the contrast values for very low initial contrast levels.
+TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;“Merge only with original image”, prevents the “Wavelet Pyramid” settings from interfering with “Clarity” and “Sharp mask”.
+TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Blurs the residual image, independent of the levels.
+TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Compresses the residual image to increase or reduce contrast.
+TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;The effect of the local contrast adjustment is stronger for medium-contrast details, and weaker for high and low-contrast details.\n This slider controls how quickly the effect dampens towards the extreme contrasts.\nThe higher the value of the slider, the wider the range of contrasts that will receive the full effect of the local contrast adjustment, and the higher the risk of generating artifacts.\nThe lower the value, the more the effect will be pinpointed towards a narrow range of contrast values.
+TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensity of edge-effect detection.
+TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance.
+TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Range of wavelet levels used throughout the "Wavelets" module.
+TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Allows you to blur each level of decomposition.\nThe finest to coarsest levels of decomposition are from left to right.
+TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis.
+TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Acts on the balance of the three directions (horizontal, vertical and diagonal) based on the luminance of the image.\nBy default the shadows or highlights are reduced to avoid artifacts.
+TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Shows all of the "Edge sharpness" tools. It is advisable to read the Wavelet Levels documentation.
+TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Allows you to adjust the maximum effect of blurring on the levels.
+TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Low to high local contrast from left to right on the x-axis\nIncrease or decrease local contrast on the y-axis.
+TP_LOCALLAB_WAT_WAVTM_TOOLTIP;The lower (negative) part compresses each level of decomposition creating a tone mapping effect.\nThe upper (positive) part attenuates the contrast by level.\nThe finest to coarsest levels of decomposition are from left to right on the x-axis.
+TP_LOCALLAB_WAV;Local contrast
+TP_LOCALLAB_WAVBLUR_TOOLTIP;Allows you to blur each level of the decomposition, as well as the residual image.
+TP_LOCALLAB_WAVCOMP;Compression by level
+TP_LOCALLAB_WAVCOMPRE;Compression by level
+TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Allows you to apply tone mapping or reduce local contrast on individual levels.\nFine to coarse detail levels from left to right on the x-axis.
+TP_LOCALLAB_WAVCOMP_TOOLTIP;Allows you to apply local contrast based on the direction of the wavelet decomposition : horizontal, vertical, diagonal
+TP_LOCALLAB_WAVCON;Contrast by level
+TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis.
+TP_LOCALLAB_WAVDEN;Luminance denoise by level
+TP_LOCALLAB_WAVE;Ψ Wavelets
+TP_LOCALLAB_WAVEDG;Local contrast
+TP_LOCALLAB_WAVEEDG_TOOLTIP;Improves sharpness by targeting the action of local contrast on the edges. It has the same functions as the corresponding module in Wavelet Levels and uses the same settings.
+TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Range of wavelet levels used in “Local contrast (by wavelet level)”
+TP_LOCALLAB_WAVGRAD_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance.
+TP_LOCALLAB_WAVHIGH;Ψ Wavelet high
+TP_LOCALLAB_WAVLEV;Blur by level
+TP_LOCALLAB_WAVLOW;Ψ Wavelet low
+TP_LOCALLAB_WAVMASK;Ψ Local contrast (by wavelet level)
+TP_LOCALLAB_WAVMASK_TOOLTIP;Uses wavelets to modify the local contrast of the mask and reinforce or reduce the structure (skin, buildings...)
+TP_LOCALLAB_WAVMED;Ψ Wavelet normal
+TP_LOCALLAB_WEDIANHI;Median Hi
+TP_LOCALLAB_WHITE_EV;White Ev
+TP_LOCAL_HEIGHT;Bottom
+TP_LOCAL_HEIGHT_T;Top
+TP_LOCAL_WIDTH;Right
+TP_LOCAL_WIDTH_L;Left
+TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Evenly distributed.\nHigh = Reinforce strong light.\n
TP_METADATA_EDIT;Apply modifications
TP_METADATA_MODE;Metadata copy mode
TP_METADATA_STRIP;Strip all metadata
@@ -1864,8 +3086,28 @@ TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,
TP_PCVIGNETTE_STRENGTH;Strength
TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners).
TP_PDSHARPENING_LABEL;Capture Sharpening
+TP_PERSPECTIVE_CAMERA_CROP_FACTOR;Crop factor
+TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Focal length
+TP_PERSPECTIVE_CAMERA_FRAME;Correction
+TP_PERSPECTIVE_CAMERA_PITCH;Vertical
+TP_PERSPECTIVE_CAMERA_ROLL;Rotation
+TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontal shift
+TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertical shift
+TP_PERSPECTIVE_CAMERA_YAW;Horizontal
+TP_PERSPECTIVE_CONTROL_LINES;Control lines
+TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Ctrl+drag: Draw new line\nRight-click: Delete line
TP_PERSPECTIVE_HORIZONTAL;Horizontal
TP_PERSPECTIVE_LABEL;Perspective
+TP_PERSPECTIVE_METHOD;Method
+TP_PERSPECTIVE_METHOD_CAMERA_BASED;Camera-based
+TP_PERSPECTIVE_METHOD_SIMPLE;Simple
+TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Post-correction adjustment
+TP_PERSPECTIVE_PROJECTION_PITCH;Vertical
+TP_PERSPECTIVE_PROJECTION_ROTATE;Rotation
+TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Horizontal shift
+TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Vertical shift
+TP_PERSPECTIVE_PROJECTION_YAW;Horizontal
+TP_PERSPECTIVE_RECOVERY_FRAME;Recovery
TP_PERSPECTIVE_VERTICAL;Vertical
TP_PFCURVE_CURVEEDITOR_CH;Hue
TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controls defringe strength by color.\nHigher = more,\nLower = less.
@@ -1912,9 +3154,11 @@ TP_RAW_3PASSBEST;3-pass (Markesteijn)
TP_RAW_4PASS;3-pass+fast
TP_RAW_AHD;AHD
TP_RAW_AMAZE;AMaZE
+TP_RAW_AMAZEBILINEAR;AMaZE+Bilinear
TP_RAW_AMAZEVNG4;AMaZE+VNG4
TP_RAW_BORDER;Border
TP_RAW_DCB;DCB
+TP_RAW_DCBBILINEAR;DCB+Bilinear
TP_RAW_DCBENHANCE;DCB enhancement
TP_RAW_DCBITERATIONS;Number of DCB iterations
TP_RAW_DCBVNG4;DCB+VNG4
@@ -1969,6 +3213,7 @@ TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for b
TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions
TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected.
TP_RAW_RCD;RCD
+TP_RAW_RCDBILINEAR;RCD+Bilinear
TP_RAW_RCDVNG4;RCD+VNG4
TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix
TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster.\n+fast gives less artifacts in flat areas
@@ -2006,7 +3251,7 @@ TP_RETINEX_FREEGAMMA;Free gamma
TP_RETINEX_GAIN;Gain
TP_RETINEX_GAINOFFS;Gain and Offset (brightness)
TP_RETINEX_GAINTRANSMISSION;Gain transmission
-TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain.
+TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Increase or reduce the transmission map to achieve the desired luminance. The x-axis is the transmission. The y-axis is the gain.
TP_RETINEX_GAMMA;Gamma
TP_RETINEX_GAMMA_FREE;Free
TP_RETINEX_GAMMA_HIGH;High
@@ -2040,8 +3285,8 @@ TP_RETINEX_MAP_NONE;None
TP_RETINEX_MEDIAN;Transmission median filter
TP_RETINEX_METHOD;Method
TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Equalize action.\nHigh = Reinforce high light.\nHighlights = Remove magenta in highlights.
-TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
-TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+TP_RETINEX_MLABEL;Restored data Min=%1 Max=%2
+TP_RETINEX_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust ‘Clip restored data (gain)’ and ‘Offset’ to normalize.\nRecovers image data without blending
TP_RETINEX_NEIGHBOR;Radius
TP_RETINEX_NEUTRAL;Reset
TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
@@ -2054,11 +3299,11 @@ TP_RETINEX_SLOPE;Free gamma slope
TP_RETINEX_STRENGTH;Strength
TP_RETINEX_THRESHOLD;Threshold
TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
-TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
-TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
-TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map.
+TP_RETINEX_TLABEL;TM Datas Min=%1 Max=%2 Mean=%3 Sigma=%4
+TP_RETINEX_TLABEL2;TM Effective Tm=%1 TM=%2
+TP_RETINEX_TLABEL_TOOLTIP;ransmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider.
TP_RETINEX_TRANF;Transmission
-TP_RETINEX_TRANSMISSION;Transmission map
+TP_RETINEX_TRANSMISSION;Transmission map
TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
TP_RETINEX_UNIFORM;Uniform
TP_RETINEX_VARIANCE;Contrast
@@ -2134,7 +3379,7 @@ TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE3;Red/Yellow
TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE4;Yellow
TP_VIBRANCE_CURVEEDITOR_SKINTONES_TOOLTIP;Hue according to hue H=f(H)
TP_VIBRANCE_LABEL;Vibrance
-TP_VIBRANCE_PASTELS;Pastel Tones
+TP_VIBRANCE_PASTELS;Pastel tones
TP_VIBRANCE_PASTSATTOG;Link pastel and saturated tones
TP_VIBRANCE_PROTECTSKINS;Protect skin-tones
TP_VIBRANCE_PSTHRESHOLD;Pastel/saturated tones threshold
@@ -2158,27 +3403,28 @@ TP_WAVELET_6;Level 6
TP_WAVELET_7;Level 7
TP_WAVELET_8;Level 8
TP_WAVELET_9;Level 9
-TP_WAVELET_APPLYTO;Apply To
+TP_WAVELET_APPLYTO;Apply to
TP_WAVELET_AVOID;Avoid color shift
TP_WAVELET_B0;Black
-TP_WAVELET_B1;Grey
+TP_WAVELET_B1;Gray
TP_WAVELET_B2;Residual
TP_WAVELET_BACKGROUND;Background
TP_WAVELET_BACUR;Curve
TP_WAVELET_BALANCE;Contrast balance d/v-h
TP_WAVELET_BALANCE_TOOLTIP;Alters the balance between the wavelet directions: vertical-horizontal and diagonal.\nIf contrast, chroma or residual tone mapping are activated, the effect due to balance is amplified.
-TP_WAVELET_BALCHRO;Chrominance balance
+TP_WAVELET_BALCHRO;Chroma balance
+TP_WAVELET_BALCHROM;Denoise equalizer Blue-Yellow/Red-Green
TP_WAVELET_BALCHRO_TOOLTIP;If enabled, the 'Contrast balance' curve or slider also modifies chroma balance.
-TP_WAVELET_BALCHROM;Denoise Equalizer Blue-Red
-TP_WAVELET_BALLUM;Denoise Equalizer White-Black
+TP_WAVELET_BALLUM;Denoise equalizer White-Black
TP_WAVELET_BANONE;None
TP_WAVELET_BASLI;Slider
TP_WAVELET_BATYPE;Contrast balance method
+TP_WAVELET_BL;Blur levels
TP_WAVELET_BLCURVE;Blur by levels
TP_WAVELET_BLURFRAME;Blur
-TP_WAVELET_BLUWAV;Damper
-TP_WAVELET_CBENAB;Toning and Color Balance
-TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
+TP_WAVELET_BLUWAV;Attenuation response
+TP_WAVELET_CBENAB;Toning and Color balance
+TP_WAVELET_CB_TOOLTIP;With high values you can create special effects, similar to those achieved with the Chroma Module, but focused on the residual image\nWith moderate values you can manually correct the white balance
TP_WAVELET_CCURVE;Local contrast
TP_WAVELET_CH1;Whole chroma range
TP_WAVELET_CH2;Saturated/pastel
@@ -2186,21 +3432,25 @@ TP_WAVELET_CH3;Link contrast levels
TP_WAVELET_CHCU;Curve
TP_WAVELET_CHR;Chroma-contrast link strength
TP_WAVELET_CHRO;Saturated/pastel threshold
-TP_WAVELET_CHROFRAME;Denoise Chrominance
+TP_WAVELET_CHROFRAME;Denoise chrominance
TP_WAVELET_CHROMAFRAME;Chroma
TP_WAVELET_CHROMCO;Chrominance Coarse
TP_WAVELET_CHROMFI;Chrominance Fine
TP_WAVELET_CHRO_TOOLTIP;Sets the wavelet level which will be the threshold between saturated and pastel colors.\n1-x: saturated\nx-9: pastel\n\nIf the value exceeds the amount of wavelet levels you are using then it will be ignored.
-TP_WAVELET_CHR_TOOLTIP;Adjusts chroma as a function of "contrast levels" and "chroma-contrast link strength"
TP_WAVELET_CHRWAV;Blur chroma
+TP_WAVELET_CHR_TOOLTIP;Adjusts chroma as a function of "contrast levels" and "chroma-contrast link strength"
TP_WAVELET_CHSL;Sliders
TP_WAVELET_CHTYPE;Chrominance method
TP_WAVELET_CLA;Clarity
TP_WAVELET_CLARI;Sharp-mask and Clarity
-TP_WAVELET_COLORT;Opacity Red-Green
+TP_WAVELET_COLORT;Opacity red-green
TP_WAVELET_COMPCONT;Contrast
+TP_WAVELET_COMPEXPERT;Advanced
TP_WAVELET_COMPGAMMA;Compression gamma
TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
+TP_WAVELET_COMPLEXLAB;Complexity
+TP_WAVELET_COMPLEX_TOOLTIP;Standard: shows a reduced set of tools suitable for most processing operations.\nAdvanced: shows the complete set of tools for advanced processing operations
+TP_WAVELET_COMPNORMAL;Standard
TP_WAVELET_COMPTM;Tone mapping
TP_WAVELET_CONTEDIT;'After' contrast curve
TP_WAVELET_CONTFRAME;Contrast - Compression
@@ -2209,16 +3459,16 @@ TP_WAVELET_CONTRA;Contrast
TP_WAVELET_CONTRASTEDIT;Finer - Coarser levels
TP_WAVELET_CONTRAST_MINUS;Contrast -
TP_WAVELET_CONTRAST_PLUS;Contrast +
-TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
+TP_WAVELET_CONTRA_TOOLTIP;Changes the residual image contrast.
TP_WAVELET_CTYPE;Chrominance control
TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Disabled if zoom > about 300%
TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
TP_WAVELET_CURVEEDITOR_CL;L
-TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
+TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast-luminance curve at the end of the wavelet processing.
TP_WAVELET_CURVEEDITOR_HH;HH
-TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image's hue as a function of hue.
+TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image hue as a function of hue.
TP_WAVELET_DALL;All directions
TP_WAVELET_DAUB;Edge performance
TP_WAVELET_DAUB2;D2 - low
@@ -2226,61 +3476,94 @@ TP_WAVELET_DAUB4;D4 - standard
TP_WAVELET_DAUB6;D6 - standard plus
TP_WAVELET_DAUB10;D10 - medium
TP_WAVELET_DAUB14;D14 - high
-TP_WAVELET_DAUB_TOOLTIP;Changes Daubechies coefficients:\nD4 = Standard,\nD14 = Often best performance, 10% more time-intensive.\n\nAffects edge detection as well as the general quality of the firsts levels. However the quality is not strictly related to this coefficient and can vary with images and uses.
+TP_WAVELET_DAUBLOCAL;Wavelet Edge performance
+TP_WAVELET_DAUB_TOOLTIP;Changes Daubechies coefficients:\nD4 = Standard,\nD14 = Often best performance, 10% more time-intensive.\n\nAffects edge detection as well as the general quality of the first levels. However the quality is not strictly related to this coefficient and can vary depending on image and use.
+TP_WAVELET_DEN5THR;Guided threshold
+TP_WAVELET_DEN12LOW;1 2 Low
+TP_WAVELET_DEN12PLUS;1 2 High
+TP_WAVELET_DEN14LOW;1 4 Low
+TP_WAVELET_DEN14PLUS;1 4 High
+TP_WAVELET_DENCONTRAST;Local contrast Equalizer
+TP_WAVELET_DENCURV;Curve
+TP_WAVELET_DENEQUAL;1 2 3 4 Equal
+TP_WAVELET_DENH;Threshold
+TP_WAVELET_DENL;Correction structure
+TP_WAVELET_DENLH;Guided threshold by detail levels 1-4
+TP_WAVELET_DENLOCAL_TOOLTIP;Use a curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained
+TP_WAVELET_DENMIX_TOOLTIP;Balances the action of the guide taking into account the original image and the denoised image
+TP_WAVELET_DENOISE;Guide curve based on Local contrast
+TP_WAVELET_DENOISEGUID;Guided threshold based on hue
+TP_WAVELET_DENOISEH;High levels Curve Local contrast
+TP_WAVELET_DENOISEHUE;Denoise equalizer Hue
+TP_WAVELET_DENQUA;Mode
+TP_WAVELET_DENSIGMA_TOOLTIP;Adapts the shape of the guide
+TP_WAVELET_DENSLI;Slider
+TP_WAVELET_DENSLILAB;Method
+TP_WAVELET_DENWAVGUID_TOOLTIP;Uses hue to reduce or increase the action of the guided filter
+TP_WAVELET_DENWAVHUE_TOOLTIP;Amplify or reduce denoising depending on the color
+TP_WAVELET_DETEND;Details
TP_WAVELET_DIRFRAME;Directional contrast
TP_WAVELET_DONE;Vertical
TP_WAVELET_DTHR;Diagonal
TP_WAVELET_DTWO;Horizontal
TP_WAVELET_EDCU;Curve
+TP_WAVELET_EDEFFECT;Attenuation response
+TP_WAVELET_EDEFFECT_TOOLTIP;This slider selects the range of contrast values that will receive the full effect of any adjustment
TP_WAVELET_EDGCONT;Local contrast
-TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima.
-TP_WAVELET_EDGE;Edge Sharpness
+TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+std. dev. and maxima.
+TP_WAVELET_EDGE;Edge sharpness
TP_WAVELET_EDGEAMPLI;Base amplification
TP_WAVELET_EDGEDETECT;Gradient sensitivity
TP_WAVELET_EDGEDETECTTHR;Threshold low (noise)
-TP_WAVELET_EDGEDETECTTHR2;Threshold high (detection)
-TP_WAVELET_EDGEDETECTTHR_TOOLTIP;This adjuster lets you target edge detection for example to avoid applying edge sharpness to fine details, such as noise in the sky.
+TP_WAVELET_EDGEDETECTTHR2;Edge enhancement
+TP_WAVELET_EDGEDETECTTHR_TOOLTIP;This slider sets a threshold below which finer details won't be considered as an edge
TP_WAVELET_EDGEDETECT_TOOLTIP;Moving the slider to the right increases edge sensitivity. This affects local contrast, edge settings and noise.
-TP_WAVELET_EDEFFECT;Damper
-TP_WAVELET_EDEFFECT_TOOLTIP;This slider controls how wide the range of contrast values are that receive the maximum effect from the tool.\nMaximum value (2.5) disabled the tool
TP_WAVELET_EDGESENSI;Edge sensitivity
TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged.
TP_WAVELET_EDGTHRESH;Detail
TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts.
TP_WAVELET_EDRAD;Radius
-TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect.
-TP_WAVELET_EDSL;Threshold Sliders
+TP_WAVELET_EDRAD_TOOLTIP;This adjustment controls the local enhancement. A value of zero still has an effect
+TP_WAVELET_EDSL;Threshold sliders
TP_WAVELET_EDTYPE;Local contrast method
TP_WAVELET_EDVAL;Strength
TP_WAVELET_FINAL;Final Touchup
-TP_WAVELET_FINCFRAME;Final Local Contrast
-TP_WAVELET_FINEST;Finest
-TP_WAVELET_HIGHLIGHT;Finer levels luminance range
+TP_WAVELET_FINCFRAME;Final local contrast
TP_WAVELET_FINCOAR_TOOLTIP;The left (positive) part of the curve acts on the finer levels (increase).\nThe 2 points on the abscissa represent the respective action limits of finer and coarser levels 5 and 6 (default).\nThe right (negative) part of the curve acts on the coarser levels (increase).\nAvoid moving the left part of the curve with negative values. Avoid moving the right part of the curve with positives values
+TP_WAVELET_FINEST;Finest
+TP_WAVELET_FINTHR_TOOLTIP;Uses local contrast to reduce or increase the action of the guided filter
+TP_WAVELET_GUIDFRAME;Final smoothing (guided filter)
+TP_WAVELET_HIGHLIGHT;Finer levels luminance range
TP_WAVELET_HS1;Whole luminance range
TP_WAVELET_HS2;Selective luminance range
TP_WAVELET_HUESKIN;Skin hue
TP_WAVELET_HUESKIN_TOOLTIP;The bottom points set the beginning of the transition zone, and the upper points the end of it, where the effect is at its maximum.\n\nIf you need to move the area significantly, or if there are artifacts, then the white balance is incorrect.
-TP_WAVELET_HUESKY;Sky hue
+TP_WAVELET_HUESKY;Hue range
TP_WAVELET_HUESKY_TOOLTIP;The bottom points set the beginning of the transition zone, and the upper points the end of it, where the effect is at its maximum.\n\nIf you need to move the area significantly, or if there are artifacts, then the white balance is incorrect.
TP_WAVELET_ITER;Delta balance levels
TP_WAVELET_ITER_TOOLTIP;Left: increase low levels and reduce high levels,\nRight: reduce low levels and increase high levels.
-TP_WAVELET_LABEL;Wavelet Levels
+TP_WAVELET_LABEL;Wavelet levels
TP_WAVELET_LARGEST;Coarsest
TP_WAVELET_LEVCH;Chroma
+TP_WAVELET_LEVDEN;Level 5-6 denoise
TP_WAVELET_LEVDIR_ALL;All levels, in all directions
-TP_WAVELET_LEVDIR_INF;Finer details levels, with selected level
+TP_WAVELET_LEVDIR_INF;Finer detail levels, including selected level
TP_WAVELET_LEVDIR_ONE;One level
-TP_WAVELET_LEVDIR_SUP;Coarser details levels, without selected level
+TP_WAVELET_LEVDIR_SUP;Coarser detail levels, excluding selected level
+TP_WAVELET_LEVELHIGH;Radius 5-6
+TP_WAVELET_LEVELLOW;Radius 1-4
TP_WAVELET_LEVELS;Wavelet levels
-TP_WAVELET_LEVELS_TOOLTIP;Choose the number of detail levels the image is to be decomposed into. More levels require more RAM and require a longer processing time.
+TP_WAVELET_LEVELSIGM;Radius
+TP_WAVELET_LEVELS_TOOLTIP;Choose the number of wavelet decomposition levels for the image.\nMore levels require more RAM and require a longer processing time.
TP_WAVELET_LEVF;Contrast
+TP_WAVELET_LEVFOUR;Level 5-6 denoise and guided threshold
TP_WAVELET_LEVLABEL;Preview maximum possible levels = %1
TP_WAVELET_LEVONE;Level 2
TP_WAVELET_LEVTHRE;Level 4
TP_WAVELET_LEVTWO;Level 3
TP_WAVELET_LEVZERO;Level 1
-TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
+TP_WAVELET_LIMDEN;Interaction levels 5-6 on levels 1-4
+TP_WAVELET_LINKEDG;Link to Edge Sharpness Strength
TP_WAVELET_LIPST;Enhanced algoritm
TP_WAVELET_LOWLIGHT;Coarser levels luminance range
TP_WAVELET_LOWTHR_TOOLTIP;Prevents amplification of fine textures and noise
@@ -2288,34 +3571,42 @@ TP_WAVELET_MEDGREINF;First level
TP_WAVELET_MEDI;Reduce artifacts in blue sky
TP_WAVELET_MEDILEV;Edge detection
TP_WAVELET_MEDILEV_TOOLTIP;When you enable Edge Detection, it is recommanded:\n- to disabled low contrast levels to avoid artifacts,\n- to use high values of gradient sensitivity.\n\nYou can modulate the strength with 'refine' from Denoise and Refine.
-TP_WAVELET_MERGEC;Merge Chroma
-TP_WAVELET_MERGEL;Merge Luma
+TP_WAVELET_MERGEC;Merge chroma
+TP_WAVELET_MERGEL;Merge luma
+TP_WAVELET_MIXCONTRAST;Reference local contrast
+TP_WAVELET_MIXDENOISE;Denoise
+TP_WAVELET_MIXMIX;Mixed 50% noise - 50% denoise
+TP_WAVELET_MIXMIX70;Mixed 30% noise - 70% denoise
+TP_WAVELET_MIXNOISE;Noise
TP_WAVELET_NEUTRAL;Neutral
TP_WAVELET_NOIS;Denoise
TP_WAVELET_NOISE;Denoise and Refine
-TP_WAVELET_NOISE_TOOLTIP;If level 4 luminance denoise superior to 20, mode Agressive is used.\nIf chrominance coarse superior to 20, mode Agressive is used.
+TP_WAVELET_NOISE_TOOLTIP;If level 4 luminance denoise superior to 50, mode Agressive is used.\nIf chrominance coarse superior to 20, mode Agressive is used.
TP_WAVELET_NPHIGH;High
TP_WAVELET_NPLOW;Low
TP_WAVELET_NPNONE;None
TP_WAVELET_NPTYPE;Neighboring pixels
TP_WAVELET_NPTYPE_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
+TP_WAVELET_OFFSET_TOOLTIP;Offset modifies the balance between low contrast and high contrast details.\nHigh values will amplify contrast changes to the higher contrast details, whereas low values will amplify contrast changes to low contrast details.\nBy using a low Attenuation response value you can select which contrast values will be enhanced.
TP_WAVELET_OLDSH;Algorithm using negatives values
-TP_WAVELET_OPACITY;Opacity Blue-Yellow
+TP_WAVELET_OPACITY;Opacity blue-yellow
TP_WAVELET_OPACITYW;Contrast balance d/v-h curve
TP_WAVELET_OPACITYWL;Local contrast
TP_WAVELET_OPACITYWL_TOOLTIP;Modify the final local contrast at the end of the wavelet treatment.\n\nThe left side represents the smallest local contrast, progressing to the largest local contrast on the right.
TP_WAVELET_PASTEL;Pastel chroma
TP_WAVELET_PROC;Process
TP_WAVELET_PROTAB;Protection
-TP_WAVELET_RADIUS;Radius Shadows - Highlight
+TP_WAVELET_QUAAGRES;Agressive
+TP_WAVELET_QUACONSER;Conservative
+TP_WAVELET_RADIUS;Radius shadows - highlight
TP_WAVELET_RANGEAB;Range a and b %
TP_WAVELET_RE1;Reinforced
TP_WAVELET_RE2;Unchanged
TP_WAVELET_RE3;Reduced
-TP_WAVELET_RESBLUR;Blur Luminance
-TP_WAVELET_RESBLURC;Blur Chroma
+TP_WAVELET_RESBLUR;Blur luminance
+TP_WAVELET_RESBLURC;Blur chroma
TP_WAVELET_RESBLUR_TOOLTIP;Disabled if zoom > about 500%
-TP_WAVELET_RESCHRO;Intensity
+TP_WAVELET_RESCHRO;Strength
TP_WAVELET_RESCON;Shadows
TP_WAVELET_RESCONH;Highlights
TP_WAVELET_RESID;Residual Image
@@ -2324,45 +3615,46 @@ TP_WAVELET_SETTINGS;Wavelet Settings
TP_WAVELET_SHA;Sharp mask
TP_WAVELET_SHFRAME;Shadows/Highlights
TP_WAVELET_SHOWMASK;Show wavelet 'mask'
-TP_WAVELET_SIGMA;Damper
-TP_WAVELET_SIGMAFIN;Damper
-TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n The lower it is, the more pinpoint will the effect be applied to a narrow range of contrast values.
+TP_WAVELET_SIGM;Radius
+TP_WAVELET_SIGMA;Attenuation response
+TP_WAVELET_SIGMAFIN;Attenuation response
+TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n .The lower it is, the more the effect will be pinpointed towards a narrow range of contrast values
TP_WAVELET_SKIN;Skin targetting/protection
TP_WAVELET_SKIN_TOOLTIP;At -100 skin-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 skin-tones are protected while all other tones are affected.
-TP_WAVELET_SKY;Sky targetting/protection
-TP_WAVELET_SKY_TOOLTIP;At -100 sky-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 sky-tones are protected while all other tones are affected.
-TP_WAVELET_SOFTRAD;Soft Radius
-TP_WAVELET_STREN;Strength
+TP_WAVELET_SKY;Hue targetting/protection
+TP_WAVELET_SKY_TOOLTIP;Allows you to target or protect a range of hues.\nAt -100 selected hues are targetted.\nAt 0 all hues are treated equally.\nAt +100 selected hues are protected while all other hues are targetted.
+TP_WAVELET_SOFTRAD;Soft radius
+TP_WAVELET_STREN;Refine
+TP_WAVELET_STREND;Strength
TP_WAVELET_STRENGTH;Strength
TP_WAVELET_SUPE;Extra
TP_WAVELET_THR;Shadows threshold
+TP_WAVELET_THRDEN_TOOLTIP;Generates a stepped curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained
+TP_WAVELET_THREND;Local contrast threshold
TP_WAVELET_THRESHOLD;Finer levels
TP_WAVELET_THRESHOLD2;Coarser levels
-TP_WAVELET_THRESHOLD_TOOLTIP;Only levels beyond the chosen value will be affected by the highlight luminance range. Other levels will be fully treated. The chosen value here limits the highest possible value of the shadow levels. : All levels from level 1 up to the chosen value will only be affected within the Finer levels luminance range.\nAll other levels will have the whole range of luminances affected, unless the Coarser levels setting limits it.\nThe chosen value in this slider becomes the minimum possible value of the Coarser levels.
-TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels between 9 and 9 minus the value will be affected by the shadow luminance range. Other levels will be fully treated. The highest level possible is limited by the highlight level value (9 minus highlight level value). : Only levels between the chosen value and level 9/Extra will be affected by the Coarser levels luminance range.\nAll other levels will have the whole range of luminances affected, unless the Finer levels setting limits it.\nThe lower level possible that will be considered by the algorithm is limited by the Finer levels value.
-TP_WAVELET_THRESWAV;Balance Threshold
+TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels from the chosen value to the selected number of ‘wavelet levels’ will be affected by the Shadow luminance range.
+TP_WAVELET_THRESHOLD_TOOLTIP;Only levels below and including the chosen value will be affected by the Highlight luminance range.
+TP_WAVELET_THRESWAV;Balance threshold
TP_WAVELET_THRH;Highlights threshold
TP_WAVELET_TILESBIG;Tiles
TP_WAVELET_TILESFULL;Full image
TP_WAVELET_TILESIZE;Tiling method
TP_WAVELET_TILESLIT;Little tiles
TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-TP_WAVELET_BL;Blur levels
TP_WAVELET_TMEDGS;Edge stopping
TP_WAVELET_TMSCALE;Scale
TP_WAVELET_TMSTRENGTH;Compression strength
TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image.
-TP_WAVELET_TMEDGS;Edge stopping
-TP_WAVELET_TON;Toning
-TP_WAVELET_TONFRAME;Excluded Colors
TP_WAVELET_TMTYPE;Compression method
+TP_WAVELET_TON;Toning
+TP_WAVELET_TONFRAME;Excluded colors
TP_WAVELET_USH;None
TP_WAVELET_USHARP;Clarity method
TP_WAVELET_USHARP_TOOLTIP;Origin : the source file is the file before Wavelet.\nWavelet : the source file is the file including wavelet threatment
-TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, wavelet settings will be automatically positioned :\nBackground=black, Process=below, level=3...you can change level between 1 and 4.\n\nIf you select Clarity, wavelet settings will be automatically positioned :\nBackground=residual, Process=above, level=7..you can change level between 5 and 10 and wavelet levels.
+TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, you can choose any level (in Settings) from 1 to 4 for processing.\nIf you select Clarity, you can choose any level (in Settings) between 5 and Extra.
TP_WAVELET_WAVLOWTHR;Low contrast threshold
TP_WAVELET_WAVOFFSET;Offset
-TP_WAVELET_OFFSET_TOOLTIP;Offset modifies the balance between shadows and highlights.\nHigh values here will amplify the contrast change of the highlights, whereas low values will amplify the contrast change of the shadows.\nAlong with a low Damper value you will able to select the contrasts that will be enhanced.
TP_WBALANCE_AUTO;Auto
TP_WBALANCE_AUTOITCGREEN;Temperature correlation
TP_WBALANCE_AUTOOLD;RGB grey
@@ -2424,3 +3716,7 @@ ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f
ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: Alt-f
ZOOMPANEL_ZOOMIN;Zoom In\nShortcut: +
ZOOMPANEL_ZOOMOUT;Zoom Out\nShortcut: -
+//TP_LOCALLAB_CIECAMLOG_TOOLTIP;This module is based on the CIECAM02 color appearance model which was designed to better simulate how human vision perceives colors under different lighting conditions.\nOnly the third Ciecam process (Viewing conditions - Target) is taken into account, as well as part of the second (contrast J, saturation s) , as well as some data from the first process (Scene conditions - Source) which is used for the Log encoding.\nIt also adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic and contrast appearance is preserved across the display environment.
+//TP_WAVELET_DENH;Low levels (1234)- Finest details
+//TP_WAVELET_DENL;High levels - Coarsest details
+//TP_WAVELET_DENLH;Guided threshold by detail levels 1-4
diff --git a/rtdata/profiles/Film Negative.pp3 b/rtdata/profiles/Film Negative.pp3
new file mode 100644
index 000000000..c298a6ea9
--- /dev/null
+++ b/rtdata/profiles/Film Negative.pp3
@@ -0,0 +1,35 @@
+[Exposure]
+Auto=false
+Compensation=0
+HistogramMatching=false
+CurveFromHistogramMatching=false
+ClampOOG=false
+CurveMode=Standard
+CurveMode2=Standard
+Curve=1;0;0;0.88544601940051371;1;
+Curve2=1;0;0;0.0397505754145333;0.020171771436200074;0.54669745433149319;0.69419974733677647;1;1;
+
+[HLRecovery]
+Enabled=false
+Method=Blend
+
+[Color Management]
+InputProfile=(camera)
+ToneCurve=false
+ApplyLookTable=false
+ApplyHueSatMap=false
+WorkingProfile=Rec2020
+WorkingTRC=none
+
+[RAW Bayer]
+Method=rcd
+
+[Film Negative]
+Enabled=true
+RedRatio=1.360
+GreenExponent=1.5
+BlueRatio=0.86
+ColorSpace=1
+RefInput=0;0;0;
+RefOutput=0;0;0;
+BackCompat=0
diff --git a/rtdata/themes/RawTherapee-GTK3-20_.css b/rtdata/themes/RawTherapee-GTK3-20_.css
index bdadc00db..f4f9ddb7f 100644
--- a/rtdata/themes/RawTherapee-GTK3-20_.css
+++ b/rtdata/themes/RawTherapee-GTK3-20_.css
@@ -720,6 +720,36 @@ flowboxchild:selected {
margin: 0;
}
+/* Vertical version of slider. */
+#histScale {
+ min-height: 4em;
+ min-width: 0.4166666666666666em;
+ margin: 0.5833333333333333em 0 0 0;
+}
+#histScale trough {
+ padding: 0.583333333333333333em 0;
+}
+#histScale trough highlight {
+ margin: -0.583333333333333333em 0;
+ padding: 0.1em 0 0 0.1em;
+}
+#histScale.fine-tune trough highlight {
+ padding: 0.5em 0 0 0.5em;
+}
+
+/* Copied from button.flat style. */
+button.radio#histButton {
+ background-image: none;
+}
+
+button.radio#histButton:checked {
+ background-image: linear-gradient(#343434, #2E2E2E, #292929);
+}
+
+button.radio#histButton:hover {
+ background-image: linear-gradient(shade(#343434,1.3), shade(#2E2E2E,1.3), shade(#292929,1.3));
+}
+
/*** end ***************************************************************************************/
#MyExpander {
@@ -745,6 +775,7 @@ flowboxchild:selected {
background-color: #363636;
}
+#LocallabToolPanel frame,
#ExpanderBox frame,
#ExpanderBox2 frame,
#ExpanderBox3 frame {
@@ -761,18 +792,22 @@ flowboxchild:selected {
padding: 0.25em;
}
+#LocallabToolPanel frame > label, #LocallabToolPanel frame frame > label,
#ExpanderBox frame > label, #ExpanderBox frame frame > label,
#ExpanderBox2 frame > label, #ExpanderBox2 frame frame > label,
#ExpanderBox3 frame > label, #ExpanderBox3 frame frame > label {
margin-left: 7pt;
margin-top: 0;
}
+
+#LocallabToolPanel frame > box, #LocallabToolPanel frame frame > box, #LocallabToolPanel frame > grid, #LocallabToolPanel frame frame > grid,
#ExpanderBox frame > box, #ExpanderBox frame frame > box, #ExpanderBox frame > grid, #ExpanderBox frame frame > grid,
#ExpanderBox2 frame > box, #ExpanderBox2 frame frame > box, #ExpanderBox2 frame > grid, #ExpanderBox2 frame frame > grid,
#ExpanderBox3 frame > box, #ExpanderBox3 frame frame > box, #ExpanderBox3 frame > grid, #ExpanderBox3 frame frame > grid {
margin: 0.1666666666666666em;
}
+#LocallabToolPanel > box > checkbutton, #LocallabToolPanel > box > box, #LocallabToolPanel > grid > checkbutton, #LocallabToolPanel > box > grid, #LocallabToolPanel > grid > grid, #LocallabToolPanel frame > box > grid, #LocallabToolPanel frame > grid > grid, #LocallabToolPanel frame > grid > box,
#ExpanderBox > box > checkbutton, #ExpanderBox > box > box, #ExpanderBox > grid > checkbutton, #ExpanderBox > box > grid, #ExpanderBox > grid > grid, #ExpanderBox frame > box > grid, #ExpanderBox frame > grid > grid, #ExpanderBox frame > grid > box,
#ExpanderBox2 > box > checkbutton, #ExpanderBox2 > box > box, #ExpanderBox2 > grid > checkbutton, #ExpanderBox2 > box > grid, #ExpanderBox2 > grid > grid, #ExpanderBox2 frame > box > grid, #ExpanderBox2 frame > grid > grid, #ExpanderBox2 frame > grid > box,
#ExpanderBox3 > box > checkbutton, #ExpanderBox3 > box > box, #ExpanderBox3 > grid > checkbutton, #ExpanderBox3 > box > grid, #ExpanderBox3 > grid > grid, #ExpanderBox3 frame > box > grid, #ExpanderBox3 frame > grid > grid, #ExpanderBox3 frame > grid > box {
@@ -796,6 +831,7 @@ flowboxchild:selected {
}
/* Sub-tool (MyExpander) background */
+#LocallabToolPanel > box, #LocallabToolPanel > grid,
#ExpanderBox2 > box, #ExpanderBox2 > grid {
background-color: #3B3B3B;
border: 0.0833333333333333em solid #2A2A2A;
@@ -804,10 +840,12 @@ flowboxchild:selected {
padding: 0.25em;
}
+#LocallabToolPanel drawingarea,
#ExpanderBox2 drawingarea {
background-color: #3B3B3B;
}
+#LocallabToolPanel frame > border,
#ExpanderBox2 frame > border {
background-color: #414141;
border: 0.0833333333333333em solid #373737;
@@ -816,10 +854,12 @@ flowboxchild:selected {
padding: 0.25em;
}
+#LocallabToolPanel frame drawingarea,
#ExpanderBox2 frame drawingarea {
background-color: #414141;
}
+#LocallabToolPanel frame frame > border,
#ExpanderBox2 frame frame > border {
background-color: #474747;
border: 0.0833333333333333em solid #3D3D3D;
@@ -828,6 +868,7 @@ flowboxchild:selected {
padding: 0.25em;
}
+#LocallabToolPanel frame frame drawingarea,
#ExpanderBox2 frame frame drawingarea {
background-color: #474747;
}
@@ -854,7 +895,7 @@ flowboxchild:selected {
color: #D8D8D8;
}
-#ExpanderBox2 separator, #ExpanderBox3 separator {
+#LocallabToolPanel separator, #ExpanderBox2 separator, #ExpanderBox3 separator {
color: #292929;
}
diff --git a/rtdata/themes/TooWaBlue-GTK3-20_.css b/rtdata/themes/TooWaBlue-GTK3-20_.css
index ce4bb8d28..c4300413e 100644
--- a/rtdata/themes/TooWaBlue-GTK3-20_.css
+++ b/rtdata/themes/TooWaBlue-GTK3-20_.css
@@ -454,6 +454,47 @@ filechooser placessidebar list row:selected {
margin: 0;
}
+/* Vertical version of slider. */
+#histScale {
+ min-height: 4em;
+ min-width: 1.833333333333333333em;
+ margin: -0.333333333333333333em 0;
+}
+#histScale trough {
+ padding: 0.583333333333333333em 0;
+}
+#histScale highlight {
+ background-image: linear-gradient(to right, shade (@accent-color2,1.22), shade(@accent-color2,.88));
+ margin: -0.583333333333333333em 0;
+ padding: 0.333333333333333333em 0 0 0.333333333333333333em;
+}
+#histScale slider {
+}
+#histScale.fine-tune highlight {
+ padding: 0.5em 0 0 0.5em;
+}
+
+/* Copied from button.flat style. */
+button.radio#histButton {
+ border: 0.083333333333333333em solid transparent;
+ box-shadow: none;
+ background-image: none;
+ background-color: transparent;
+}
+button.radio#histButton:hover {
+ border-color: @bg-button-border;
+ box-shadow: inset 0 0.083333333333333333em rgba(242, 242, 242, 0.1);
+ background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3));
+ background-color: @bg-button-hover;
+}
+button.radio#histButton:active,
+button.radio#histButton:checked {
+ border-color: @bg-button-border;
+ box-shadow: inset 0 0.1em rgba(242, 242, 242, 0.08);
+ background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3));
+ background-color: @bg-button-active;
+}
+
/*** end ***************************************************************************************/
/*** Separator *********************************************************************************/
diff --git a/rtengine/CA_correct_RT.cc b/rtengine/CA_correct_RT.cc
index fa9788af0..c17826623 100644
--- a/rtengine/CA_correct_RT.cc
+++ b/rtengine/CA_correct_RT.cc
@@ -123,7 +123,7 @@ float* RawImageSource::CA_correct_RT(
double cared,
double cablue,
bool avoidColourshift,
- const array2D &rawData,
+ array2D &rawData,
double* fitParamsTransfer,
bool fitParamsIn,
bool fitParamsOut,
@@ -1291,7 +1291,7 @@ float* RawImageSource::CA_correct_RT(
for (int i = 0; i < H - 2 * cb; ++i) {
const int firstCol = fc(cfa, i, 0) & 1;
const int colour = fc(cfa, i, firstCol);
- const array2D* nonGreen = colour == 0 ? redFactor : blueFactor;
+ array2D* nonGreen = colour == 0 ? redFactor : blueFactor;
int j = firstCol;
#ifdef __SSE2__
for (; j < W - 7 - 2 * cb; j += 8) {
@@ -1325,7 +1325,7 @@ float* RawImageSource::CA_correct_RT(
const int ngRow = 1 - (fc(cfa, 0, 0) & 1);
const int ngCol = fc(cfa, ngRow, 0) & 1;
const int colour = fc(cfa, ngRow, ngCol);
- const array2D* nonGreen = colour == 0 ? redFactor : blueFactor;
+ array2D* nonGreen = colour == 0 ? redFactor : blueFactor;
for (int i = 0; i < (H + 1 - 2 * cb) / 2; ++i) {
(*nonGreen)[i][(W - 2 * cb + 1) / 2 - 1] = (*nonGreen)[i][(W - 2* cb + 1) / 2 - 2];
}
diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt
index c687c1cb1..c5b18d2fb 100644
--- a/rtengine/CMakeLists.txt
+++ b/rtengine/CMakeLists.txt
@@ -64,6 +64,7 @@ set(RTENGINESOURCEFILES
ahd_demosaic_RT.cc
amaze_demosaic_RT.cc
badpixels.cc
+ bayer_bilinear_demosaic.cc
boxblur.cc
canon_cr3_decoder.cc
CA_correct_RT.cc
@@ -94,7 +95,6 @@ set(RTENGINESOURCEFILES
fast_demo.cc
ffmanager.cc
filmnegativeproc.cc
- filmnegativethumb.cc
flatcurves.cc
FTblockDN.cc
gamutwarning.cc
@@ -118,7 +118,9 @@ set(RTENGINESOURCEFILES
impulse_denoise.cc
init.cc
ipdehaze.cc
+ ipgrain.cc
iplab2rgb.cc
+ iplocallab.cc
iplabregions.cc
iplocalcontrast.cc
ipresize.cc
@@ -141,6 +143,7 @@ set(RTENGINESOURCEFILES
myfile.cc
panasonic_decoders.cc
pdaflinesfilter.cc
+ perspectivecorrection.cc
PF_correct_RT.cc
pipettebuffer.cc
pixelshift.cc
diff --git a/rtengine/EdgePreservingDecomposition.cc b/rtengine/EdgePreservingDecomposition.cc
index 04459e88a..5ae023122 100644
--- a/rtengine/EdgePreservingDecomposition.cc
+++ b/rtengine/EdgePreservingDecomposition.cc
@@ -4,6 +4,7 @@
#ifdef _OPENMP
#include
#endif
+#include "rt_algo.h"
#include "sleef.h"
#define DIAGONALS 5
@@ -42,21 +43,13 @@ float *SparseConjugateGradient(void Ax(float *Product, float *x, void *Pass), fl
//s is preconditionment of r. Without, direct to r.
float *s = r;
- double rs = 0.0; // use double precision for large summations
if(Preconditioner != nullptr) {
s = new float[n];
-
Preconditioner(s, r, Pass);
}
-#ifdef _OPENMP
- #pragma omp parallel for reduction(+:rs) // removed schedule(dynamic,10)
-#endif
-
- for(int ii = 0; ii < n; ii++) {
- rs += static_cast(r[ii]) * static_cast(s[ii]);
- }
+ double rs = rtengine::accumulateProduct(r, s, n);
//Search direction d.
float *d = (buffer + n + 32);
@@ -77,16 +70,9 @@ float *SparseConjugateGradient(void Ax(float *Product, float *x, void *Pass), fl
for(iterate = 0; iterate < MaximumIterates; iterate++) {
//Get step size alpha, store ax while at it.
- double ab = 0.0; // use double precision for large summations
Ax(ax, d, Pass);
-#ifdef _OPENMP
- #pragma omp parallel for reduction(+:ab)
-#endif
-
- for(int ii = 0; ii < n; ii++) {
- ab += static_cast(d[ii]) * static_cast(ax[ii]);
- }
+ double ab = rtengine::accumulateProduct(d, ax, n);
if(ab == 0.0) {
break; //So unlikely. It means perfectly converged or singular, stop either way.
}
@@ -118,22 +104,7 @@ float *SparseConjugateGradient(void Ax(float *Product, float *x, void *Pass), fl
//Get beta.
ab = rs;
- rs = 0.0f;
-
-#ifdef _OPENMP
- #pragma omp parallel
-#endif
- {
-#ifdef _OPENMP
- #pragma omp for reduction(+:rs)
-#endif
-
- for(int ii = 0; ii < n; ii++) {
- rs += static_cast(r[ii]) * static_cast(s[ii]);
- }
-
- }
-
+ rs = rtengine::accumulateProduct(r, s, n);
ab = rs / ab;
abf = ab;
//Update search direction p.
@@ -916,7 +887,7 @@ void EdgePreservingDecomposition::CompressDynamicRange(float *Source, float Scal
float temp;
if(DetailBoost > 0.f) {
- float betemp = expf(-(2.f - DetailBoost + 0.694f)) - 1.f; //0.694 = log(2)
+ float betemp = expf(-(2.f - DetailBoost + 0.693147f)) - 1.f; //0.694 = log(2)
temp = 1.2f * xlogf( -betemp);
} else {
temp = CompressionExponent - 1.0f;
@@ -939,7 +910,7 @@ void EdgePreservingDecomposition::CompressDynamicRange(float *Source, float Scal
cev = xexpf(LVFU(Source[i]) + LVFU(u[i]) * (tempv)) - epsv;
uev = xexpf(LVFU(u[i])) - epsv;
sourcev = xexpf(LVFU(Source[i])) - epsv;
- _mm_storeu_ps( &Source[i], cev + DetailBoostv * (sourcev - uev) );
+ _mm_storeu_ps( &Source[i], cev + DetailBoostv * (sourcev - uev));
}
}
diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc
index 89e4c1b8d..66f12b668 100644
--- a/rtengine/FTblockDN.cc
+++ b/rtengine/FTblockDN.cc
@@ -43,7 +43,6 @@
#include "procparams.h"
#include "rt_math.h"
#include "sleef.h"
-
#include "../rtgui/threadutils.h"
#include "../rtgui/options.h"
@@ -483,11 +482,9 @@ enum nrquality {QUALITY_STANDARD, QUALITY_HIGH};
void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagefloat * dst, Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, const NoiseCurve & noiseLCurve, const NoiseCurve & noiseCCurve, float &nresi, float &highresi)
{
BENCHFUN
-//#ifdef _DEBUG
MyTime t1e, t2e;
t1e.set();
-//#endif
if (dnparams.luma == 0 && dnparams.chroma == 0 && !dnparams.median && !noiseLCurve && !noiseCCurve) {
//nothing to do; copy src to dst or do nothing in case src == dst
if (src != dst) {
@@ -955,13 +952,8 @@ BENCHFUN
labdn->b[i1][j1] = B_ < 65535.f ? gamcurve[B_] : Color::gammanf(B_ / 65535.f, gam) * 32768.f;
if (((i1 | j1) & 1) == 0) {
- if (numTries == 1) {
- noisevarlum[(i1 >> 1) * width2 + (j1 >> 1)] = useNoiseLCurve ? lumcalc[i >> 1][j >> 1] : noisevarL;
- noisevarchrom[(i1 >> 1) * width2 + (j1 >> 1)] = useNoiseCCurve ? maxNoiseVarab * ccalc[i >> 1][j >> 1] : 1.f;
- } else {
- noisevarlum[(i1 >> 1) * width2 + (j1 >> 1)] = lumcalc[i >> 1][j >> 1];
- noisevarchrom[(i1 >> 1) * width2 + (j1 >> 1)] = ccalc[i >> 1][j >> 1];
- }
+ noisevarlum[(i1 >> 1) * width2 + (j1 >> 1)] = useNoiseLCurve ? lumcalc[i >> 1][j >> 1] : noisevarL;
+ noisevarchrom[(i1 >> 1) * width2 + (j1 >> 1)] = useNoiseCCurve ? maxNoiseVarab * ccalc[i >> 1][j >> 1] : 1.f;
}
//end chroma
@@ -993,13 +985,8 @@ BENCHFUN
labdn->b[i1][j1] = (Y - Z);
if (((i1 | j1) & 1) == 0) {
- if (numTries == 1) {
- noisevarlum[(i1 >> 1)*width2 + (j1 >> 1)] = useNoiseLCurve ? lumcalc[i >> 1][j >> 1] : noisevarL;
- noisevarchrom[(i1 >> 1)*width2 + (j1 >> 1)] = useNoiseCCurve ? maxNoiseVarab * ccalc[i >> 1][j >> 1] : 1.f;
- } else {
- noisevarlum[(i1 >> 1)*width2 + (j1 >> 1)] = lumcalc[i >> 1][j >> 1];
- noisevarchrom[(i1 >> 1)*width2 + (j1 >> 1)] = ccalc[i >> 1][j >> 1];
- }
+ noisevarlum[(i1 >> 1)*width2 + (j1 >> 1)] = useNoiseLCurve ? lumcalc[i >> 1][j >> 1] : noisevarL;
+ noisevarchrom[(i1 >> 1)*width2 + (j1 >> 1)] = useNoiseCCurve ? maxNoiseVarab * ccalc[i >> 1][j >> 1] : 1.f;
}
}
}
@@ -1111,9 +1098,6 @@ BENCHFUN
}
if (execwavelet) {//gain time if user choose only median sliders L <=1 slider chrom master < 1
- wavelet_decomposition* Ldecomp;
- wavelet_decomposition* adecomp;
-
int levwav = 5;
float maxreal = max(realred, realblue);
@@ -1154,9 +1138,9 @@ BENCHFUN
levwav = min(maxlev2, levwav);
// if (settings->verbose) printf("levwavelet=%i noisevarA=%f noisevarB=%f \n",levwav, noisevarab_r, noisevarab_b);
- Ldecomp = new wavelet_decomposition(labdn->L[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels));
+ const std::unique_ptr Ldecomp(new wavelet_decomposition(labdn->L[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels)));
- if (Ldecomp->memoryAllocationFailed) {
+ if (Ldecomp->memory_allocation_failed()) {
memoryAllocationFailed = true;
}
@@ -1175,7 +1159,7 @@ BENCHFUN
int Wlvl_L = Ldecomp->level_W(lvl);
int Hlvl_L = Ldecomp->level_H(lvl);
- float ** WavCoeffs_L = Ldecomp->level_coeffs(lvl);
+ const float* const* WavCoeffs_L = Ldecomp->level_coeffs(lvl);
if (!denoiseMethodRgb) {
madL[lvl][dir - 1] = SQR(Mad(WavCoeffs_L[dir], Wlvl_L * Hlvl_L));
@@ -1192,9 +1176,9 @@ BENCHFUN
float chmaxresid = 0.f;
float chmaxresidtemp = 0.f;
- adecomp = new wavelet_decomposition(labdn->a[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels));
+ std::unique_ptr adecomp(new wavelet_decomposition(labdn->a[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels)));
- if (adecomp->memoryAllocationFailed) {
+ if (adecomp->memory_allocation_failed()) {
memoryAllocationFailed = true;
}
@@ -1226,12 +1210,12 @@ BENCHFUN
adecomp->reconstruct(labdn->a[0]);
}
- delete adecomp;
+ adecomp.reset();
if (!memoryAllocationFailed) {
- wavelet_decomposition* bdecomp = new wavelet_decomposition(labdn->b[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels));
+ std::unique_ptr bdecomp(new wavelet_decomposition(labdn->b[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels)));
- if (bdecomp->memoryAllocationFailed) {
+ if (bdecomp->memory_allocation_failed()) {
memoryAllocationFailed = true;
}
@@ -1266,7 +1250,7 @@ BENCHFUN
bdecomp->reconstruct(labdn->b[0]);
}
- delete bdecomp;
+ bdecomp.reset();
if (!memoryAllocationFailed) {
if (denoiseLuminance) {
@@ -1306,8 +1290,6 @@ BENCHFUN
}
}
}
-
- delete Ldecomp;
}
if (!memoryAllocationFailed) {
@@ -2035,14 +2017,10 @@ BENCHFUN
delete[] ccalc;
}
-//#ifdef _DEBUG
if (settings->verbose) {
t2e.set();
printf("Denoise performed in %d usec:\n", t2e.etime(t1e));
}
-
-//#endif
-
}//end of main RGB_denoise
@@ -2121,26 +2099,26 @@ float ImProcFunctions::Mad(const float * DataList, const int datalen)
}
//computes Median Absolute Deviation
- //DataList values should mostly have abs val < 256 because we are in Lab mode
- int histo[256] ALIGNED64 = {0};
+ //DataList values should mostly have abs val < 256 because we are in Lab mode (32768)
+ int histo[32768] ALIGNED64 = {0};
//calculate histogram of absolute values of wavelet coeffs
for (int i = 0; i < datalen; ++i) {
- histo[static_cast(rtengine::min(255.f, fabsf(DataList[i])))]++;
+ histo[static_cast(rtengine::min(32768.f, fabsf(DataList[i])))]++;
}
//find median of histogram
- int median = 0, count = 0;
+ int lmedian = 0, count = 0;
while (count < datalen / 2) {
- count += histo[median];
- ++median;
+ count += histo[lmedian];
+ ++lmedian;
}
- int count_ = count - histo[median - 1];
+ int count_ = count - histo[lmedian - 1];
// interpolate
- return (((median - 1) + (datalen / 2 - count_) / (static_cast(count - count_))) / 0.6745f);
+ return ((lmedian - 1) + (datalen / 2 - count_) / (static_cast(count - count_))) / 0.6745f;
}
float ImProcFunctions::MadRgb(const float * DataList, const int datalen)
@@ -2163,18 +2141,18 @@ float ImProcFunctions::MadRgb(const float * DataList, const int datalen)
}
//find median of histogram
- int median = 0, count = 0;
+ int lmedian = 0, count = 0;
while (count < datalen / 2) {
- count += histo[median];
- ++median;
+ count += histo[lmedian];
+ ++lmedian;
}
- int count_ = count - histo[median - 1];
+ int count_ = count - histo[lmedian - 1];
// interpolate
delete[] histo;
- return (((median - 1) + (datalen / 2 - count_) / (static_cast(count - count_))) / 0.6745f);
+ return ((lmedian - 1) + (datalen / 2 - count_) / (static_cast(count - count_))) / 0.6745f;
}
@@ -2194,7 +2172,7 @@ void ImProcFunctions::Noise_residualAB(const wavelet_decomposition &WaveletCoeff
const int Wlvl_ab = WaveletCoeffs_ab.level_W(lvl);
const int Hlvl_ab = WaveletCoeffs_ab.level_H(lvl);
- float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl);
+ const float* const* WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl);
const float madC = SQR(denoiseMethodRgb ? MadRgb(WavCoeffs_ab[dir], Wlvl_ab * Hlvl_ab) : Mad(WavCoeffs_ab[dir], Wlvl_ab * Hlvl_ab));
resid += madC;
@@ -2209,7 +2187,7 @@ void ImProcFunctions::Noise_residualAB(const wavelet_decomposition &WaveletCoeff
chmaxresid = maxresid;
}
-bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge, int denoiseNestedLevels)
+bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposition& WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge, int denoiseNestedLevels)
{
int maxlvl = min(WaveletCoeffs_L.maxlevel(), 5);
const float eps = 0.01f;
@@ -2218,6 +2196,10 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &W
maxlvl = 4; //for refine denoise edge wavelet
}
+ if (edge == 6) {
+ maxlvl = 6; //for wavelet denoise
+ }
+
if (edge == 2) {
maxlvl = 7; //for locallab denoise
}
@@ -2260,7 +2242,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &W
int Wlvl_L = WaveletCoeffs_L.level_W(lvl);
int Hlvl_L = WaveletCoeffs_L.level_H(lvl);
- float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl);
+ float* const* WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl);
if (lvl == maxlvl - 1) {
// int edge = 0;
@@ -2286,7 +2268,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &W
for (int i = 0; i < Hlvl_L * Wlvl_L; ++i) {
nvl[i] = 0.f;
}
- if ((edge == 1 || edge == 2 || edge == 3 || edge == 5) && vari) {
+ if ((edge == 1 || edge == 2 || edge == 3 || edge == 5 || edge == 6) && vari) {
// nvl = blurBuffer; // we need one buffer, but fortunately we don't have to allocate a new one because we can use blurBuffer
if ((edge == 1 || edge == 3)) {
for (int i = 0; i < Hlvl_L * Wlvl_L; ++i) {
@@ -2294,7 +2276,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &W
}
}
- if (edge == 2 || edge == 4 || edge == 5) {
+ if (edge == 2 || edge == 4 || edge == 5 || edge == 6) {
for (int i = 0; i < Hlvl_L * Wlvl_L; ++i) {
nvl[i] = vari[lvl] * SQR(noisevarlum[i]);
}
@@ -2392,10 +2374,15 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &W
}
-bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float *variC, int local, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, int denoiseNestedLevels)
-
+bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposition& WaveletCoeffs_L, wavelet_decomposition& WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float *variC, int local, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, int denoiseNestedLevels)
{
int maxlvl = WaveletCoeffs_L.maxlevel();
+ printf("Ftblockdn ab bishrink\n");
+
+ if (local == 1) {
+ maxlvl = 6; //for local denoise
+ }
+
if (local == 2) {
maxlvl = 7; //for local denoise
@@ -2449,7 +2436,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition &
// compute median absolute deviation (MAD) of detail coefficients as robust noise estimator
int Wlvl_ab = WaveletCoeffs_ab.level_W(lvl);
int Hlvl_ab = WaveletCoeffs_ab.level_H(lvl);
- float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl);
+ const float* const* WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl);
if (!denoiseMethodRgb) {
madab[lvl][dir - 1] = SQR(Mad(WavCoeffs_ab[dir], Wlvl_ab * Hlvl_ab));
@@ -2468,10 +2455,11 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition &
int Wlvl_ab = WaveletCoeffs_ab.level_W(lvl);
int Hlvl_ab = WaveletCoeffs_ab.level_H(lvl);
- float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl);
- float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl);
+ float* const* WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl);
+ float* const* WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl);
if (lvl == maxlvl - 1) {
+ //printf("Shrink ab bis\n");
ShrinkAllAB(WaveletCoeffs_L, WaveletCoeffs_ab, buffer, lvl, dir, noisevarchrom, noisevar_ab, useNoiseCCurve, autoch, denoiseMethodRgb, madL[lvl], nullptr, 0, madab[lvl], true);
} else {
//simple wavelet shrinkage
@@ -2563,7 +2551,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition &
}
-bool ImProcFunctions::WaveletDenoiseAllL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge, int denoiseNestedLevels)//mod JD
+bool ImProcFunctions::WaveletDenoiseAllL(wavelet_decomposition& WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge, int denoiseNestedLevels)//mod JD
{
@@ -2573,6 +2561,10 @@ bool ImProcFunctions::WaveletDenoiseAllL(const wavelet_decomposition &WaveletCoe
maxlvl = 4; //for refine denoise edge wavelet
}
+ if (edge == 6) {
+ maxlvl = 6; //for wavelet denoise
+ }
+
if (edge == 2) {
maxlvl = 7; //for locallab denoise
}
@@ -2588,7 +2580,6 @@ bool ImProcFunctions::WaveletDenoiseAllL(const wavelet_decomposition &WaveletCoe
maxHL = WaveletCoeffs_L.level_H(lvl);
}
}
-
bool memoryAllocationFailed = false;
#ifdef _OPENMP
#pragma omp parallel num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1)
@@ -2624,13 +2615,17 @@ bool ImProcFunctions::WaveletDenoiseAllL(const wavelet_decomposition &WaveletCoe
}
-bool ImProcFunctions::WaveletDenoiseAllAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab,
+bool ImProcFunctions::WaveletDenoiseAllAB(wavelet_decomposition& WaveletCoeffs_L, wavelet_decomposition& WaveletCoeffs_ab,
float *noisevarchrom, float madL[8][3], float *variC, int local, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, int denoiseNestedLevels)//mod JD
{
-
int maxlvl = WaveletCoeffs_L.maxlevel();
+ if (local == 1) {
+ maxlvl = 6; //for local denoise
+ }
+
+
if (local == 2) {
maxlvl = 7; //for local denoise
}
@@ -2688,7 +2683,7 @@ bool ImProcFunctions::WaveletDenoiseAllAB(const wavelet_decomposition &WaveletCo
-void ImProcFunctions::ShrinkAllL(const wavelet_decomposition &WaveletCoeffs_L, float **buffer, int level, int dir,
+void ImProcFunctions::ShrinkAllL(wavelet_decomposition& WaveletCoeffs_L, float **buffer, int level, int dir,
float *noisevarlum, float * madL, float * vari, int edge)
{
@@ -2702,7 +2697,7 @@ void ImProcFunctions::ShrinkAllL(const wavelet_decomposition &WaveletCoeffs_L, f
const int W_L = WaveletCoeffs_L.level_W(level);
const int H_L = WaveletCoeffs_L.level_H(level);
- float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(level);
+ float* const* WavCoeffs_L = WaveletCoeffs_L.level_coeffs(level);
const float mad_L = madL[dir - 1] ;
const float levelFactor = mad_L * 5.f / static_cast(level + 1);
@@ -2713,15 +2708,15 @@ void ImProcFunctions::ShrinkAllL(const wavelet_decomposition &WaveletCoeffs_L, f
nvl[i] = 0.f;
}
- if ((edge == 1 || edge == 2 || edge == 3 || edge == 5) && vari) {
+ if ((edge == 1 || edge == 2 || edge == 3 || edge == 5 || edge == 6) && vari) {
// nvl = blurBuffer; // we need one buffer, but fortunately we don't have to allocate a new one because we can use blurBuffer
if ((edge == 1 || edge == 3)) {
for (int i = 0; i < W_L * H_L; ++i) {
nvl[i] = vari[level]; //* SQR(1.f + 4.f * noisevarchrom[p]);
}
- }
+ }
- if (edge == 2 || edge == 4 || edge == 5) {
+ if (edge == 2 || edge == 4 || edge == 5 || edge == 6) {
for (int i = 0; i < W_L * H_L; ++i) {
nvl[i] = vari[level] * SQR(noisevarlum[i]);
}
@@ -2779,7 +2774,7 @@ void ImProcFunctions::ShrinkAllL(const wavelet_decomposition &WaveletCoeffs_L, f
}
-void ImProcFunctions::ShrinkAllAB(const wavelet_decomposition & WaveletCoeffs_L, const wavelet_decomposition & WaveletCoeffs_ab, float **buffer, int level, int dir,
+void ImProcFunctions::ShrinkAllAB(wavelet_decomposition& WaveletCoeffs_L, wavelet_decomposition& WaveletCoeffs_ab, float **buffer, int level, int dir,
float * noisevarchrom, float noisevar_ab, const bool useNoiseCCurve, bool autoch,
bool denoiseMethodRgb, float * madL, float * variC, int local, float * madaab, bool madCalculated)
@@ -2798,8 +2793,8 @@ void ImProcFunctions::ShrinkAllAB(const wavelet_decomposition & WaveletCoeffs_L,
int W_ab = WaveletCoeffs_ab.level_W(level);
int H_ab = WaveletCoeffs_ab.level_H(level);
- float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(level);
- float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(level);
+ float* const* WavCoeffs_L = WaveletCoeffs_L.level_coeffs(level);
+ float* const* WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(level);
float madab;
float mad_L = madL[dir - 1];
@@ -2918,7 +2913,7 @@ void ImProcFunctions::ShrinkAllAB(const wavelet_decomposition & WaveletCoeffs_L,
delete [] nvc;
}
-void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** WavCoeffs_b,
+void ImProcFunctions::ShrinkAll_info(const float* const* WavCoeffs_a, const float* const* WavCoeffs_b,
int W_ab, int H_ab, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float & chaut, int &Nb, float & redaut, float & blueaut,
float & maxredaut, float & maxblueaut, float & minredaut, float & minblueaut, int schoice, int lvl, float & chromina, float & sigma, float & lumema, float & sigma_L, float & redyel, float & skinc, float & nsknc,
float & maxchred, float & maxchblue, float & minchred, float & minchblue, int &nb, float & chau, float & chred, float & chblue, bool denoiseMethodRgb)
@@ -3048,8 +3043,8 @@ void ImProcFunctions::WaveletDenoiseAll_info(int levwav, const wavelet_decomposi
int Wlvl_ab = WaveletCoeffs_a.level_W(lvl);
int Hlvl_ab = WaveletCoeffs_a.level_H(lvl);
- float ** WavCoeffs_a = WaveletCoeffs_a.level_coeffs(lvl);
- float ** WavCoeffs_b = WaveletCoeffs_b.level_coeffs(lvl);
+ const float* const* WavCoeffs_a = WaveletCoeffs_a.level_coeffs(lvl);
+ const float* const* WavCoeffs_b = WaveletCoeffs_b.level_coeffs(lvl);
ShrinkAll_info(WavCoeffs_a, WavCoeffs_b, Wlvl_ab, Hlvl_ab,
noisevarlum, noisevarchrom, noisevarhue, chaut, Nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut,
diff --git a/rtengine/LUT.h b/rtengine/LUT.h
index 6ba7d570f..416ae689a 100644
--- a/rtengine/LUT.h
+++ b/rtengine/LUT.h
@@ -58,9 +58,11 @@
#pragma once
+#include
#include
#include
#include
+#include
#ifndef NDEBUG
#include
@@ -138,6 +140,33 @@ public:
clear();
}
}
+
+ LUT(const std::vector& input, int flags = LUT_CLIP_BELOW | LUT_CLIP_ABOVE) :
+ maxs(input.size() - 2),
+ maxsf(maxs),
+ data(new T[input.size() + 3]), // Add a few extra elements so [](vfloat) won't access out-of-bounds memory.
+ clip(flags),
+ size(input.size()),
+ upperBound(size - 1),
+ owner(1),
+#ifdef __SSE2__
+ maxsv(F2V(maxs)),
+ sizev(F2V(size - 1)),
+ sizeiv(_mm_set1_epi32(size - 1)),
+#endif
+ dirty(true)
+ {
+#ifndef NDEBUG
+
+ if (input.empty()) {
+ printf("s=0!\n");
+ }
+
+ assert(!input.empty());
+#endif
+ std::copy_n(input.begin(), input.size(), data);
+ }
+
void operator ()(int s, int flags = LUT_CLIP_BELOW | LUT_CLIP_ABOVE, bool initZero = false)
{
#ifndef NDEBUG
@@ -223,7 +252,7 @@ public:
return size > 0 ? upperBound : 0;
}
- LUT & operator=(const LUT& rhs)
+ LUT& operator=(const LUT& rhs)
{
if (this != &rhs) {
if (rhs.size > this->size) {
@@ -254,7 +283,7 @@ public:
}
// handy to sum up per thread histograms. #pragma omp simd speeds up the loop by about factor 3 for LUTu (uint32_t).
- LUT & operator+=(const LUT& rhs)
+ LUT& operator+=(const LUT& rhs)
{
if (rhs.size == this->size) {
#ifdef _OPENMP
@@ -271,7 +300,7 @@ public:
// multiply all elements of LUT with a constant float value
template::value>::type>
- LUT & operator*=(float factor)
+ LUT& operator*=(float factor)
{
#ifdef _OPENMP
#pragma omp simd
@@ -286,7 +315,7 @@ public:
// divide all elements of LUT by a constant float value
template::value>::type>
- LUT & operator/=(float divisor)
+ LUT& operator/=(float divisor)
{
#ifdef _OPENMP
#pragma omp simd
@@ -456,7 +485,7 @@ public:
// Return the value for "index" that is in the [0-1] range.
template::value>::type>
- T getVal01 (float index) const
+ T getVal01(float index) const
{
index *= (float)upperBound;
int idx = (int)index; // don't use floor! The difference in negative space is no problems here
@@ -481,19 +510,19 @@ public:
return (p1 + p2 * diff);
}
- operator bool (void) const
+ operator bool() const // FIXME: Should be explicit
{
return size > 0;
}
- void clear(void)
+ void clear()
{
if (data && size) {
memset(data, 0, size * sizeof(T));
}
}
- void reset(void)
+ void reset()
{
if (data) {
delete[] data;
diff --git a/rtengine/array2D.h b/rtengine/array2D.h
index de6381aeb..ca4db3d06 100644
--- a/rtengine/array2D.h
+++ b/rtengine/array2D.h
@@ -27,7 +27,7 @@
*
* creates an array which is valid within the normal C/C++ scope "{ ... }"
*
- * access to elements is a simple as:
+ * access to elements is as simple as:
*
* array2D my_array (10,10); // creates 10x10 array of floats
* value = my_array[3][5];
@@ -48,275 +48,216 @@
* array2D my_array ; // empty container.
* my_array(10,10) ; // resize to 10x10 array
* my_array(10,10,ARRAY2D_CLEAR_DATA) ; // resize to 10x10 and clear data
- * my_array(10,10,ARRAY2D_CLEAR_DATA|ARRAY2D_LOCK_DATA) ; same but set a lock on changes
*
- * !! locked arrays cannot be resized and cannot be unlocked again !!
*/
#pragma once
-#include // for raise()
#include
-
-// flags for use
-#define ARRAY2D_LOCK_DATA 1
-#define ARRAY2D_CLEAR_DATA 2
-#define ARRAY2D_BYREFERENCE 4
-#define ARRAY2D_VERBOSE 8
-
#include
-#include
-
+#include
+#include
#include "noncopyable.h"
+// flags for use
+constexpr unsigned int ARRAY2D_CLEAR_DATA = 1;
+constexpr unsigned int ARRAY2D_BYREFERENCE = 2;
+
+
template
-class array2D :
- public rtengine::NonCopyable
+class array2D
{
private:
- int x, y, owner;
- unsigned int flags;
- T ** ptr;
- T * data;
- bool lock; // useful lock to ensure data is not changed anymore.
- void ar_realloc(int w, int h, int offset = 0)
+ ssize_t width;
+ std::vector rows;
+ std::vector buffer;
+
+ void initRows(ssize_t h, int offset = 0)
{
- if ((ptr) && ((h > y) || (4 * h < y))) {
- delete[] ptr;
- ptr = nullptr;
+ rows.resize(h);
+ T* start = buffer.data() + offset;
+ for (ssize_t i = 0; i < h; ++i) {
+ rows[i] = start + width * i;
}
+ }
- if ((data) && (((h * w) > (x * y)) || ((h * w) < ((x * y) / 4)))) {
- delete[] data;
- data = nullptr;
- }
-
- if (ptr == nullptr) {
- ptr = new T*[h];
- }
-
- if (data == nullptr) {
- data = new T[h * w + offset];
- }
-
- x = w;
- y = h;
-
- for (int i = 0; i < h; i++) {
- ptr[i] = data + offset + w * i;
- }
-
- owner = 1;
+ void ar_realloc(ssize_t w, ssize_t h, int offset = 0)
+ {
+ width = w;
+ buffer.resize(h * width + offset);
+ initRows(h, offset);
}
public:
// use as empty declaration, resize before use!
// very useful as a member object
- array2D() :
- x(0), y(0), owner(0), flags(0), ptr(nullptr), data(nullptr), lock(false)
- {
- //printf("got empty array2D init\n");
- }
+ array2D() : width(0) {}
// creator type1
- array2D(int w, int h, unsigned int flgs = 0)
+ array2D(int w, int h, unsigned int flags = 0) : width(w)
{
- flags = flgs;
- lock = flags & ARRAY2D_LOCK_DATA;
- data = new T[h * w];
- owner = 1;
- x = w;
- y = h;
- ptr = new T*[h];
-
- for (int i = 0; i < h; i++) {
- ptr[i] = data + i * w;
- }
-
if (flags & ARRAY2D_CLEAR_DATA) {
- memset(data, 0, w * h * sizeof(T));
+ buffer.resize(h * width, 0);
+ } else {
+ buffer.resize(h * width);
}
+ initRows(h);
}
// creator type 2
- array2D(int w, int h, T ** source, unsigned int flgs = 0)
+ array2D(int w, int h, T ** source, unsigned int flags = 0) : width(w)
{
- flags = flgs;
- //if (lock) { printf("array2D attempt to overwrite data\n");raise(SIGSEGV);}
- lock = flags & ARRAY2D_LOCK_DATA;
- // when by reference
- // TODO: improve this code with ar_realloc()
- owner = (flags & ARRAY2D_BYREFERENCE) ? 0 : 1;
-
- if (owner) {
- data = new T[h * w];
- } else {
- data = nullptr;
- }
-
- x = w;
- y = h;
- ptr = new T*[h];
-
- for (int i = 0; i < h; i++) {
- if (owner) {
- ptr[i] = data + i * w;
-
- for (int j = 0; j < w; j++) {
- ptr[i][j] = source[i][j];
+ rows.resize(h);
+ if (!(flags & ARRAY2D_BYREFERENCE)) {
+ buffer.resize(h * width);
+ T* start = buffer.data();
+ for (ssize_t i = 0; i < h; ++i) {
+ rows[i] = start + i * width;
+ for (ssize_t j = 0; j < width; ++j) {
+ rows[i][j] = source[i][j];
}
- } else {
- ptr[i] = source[i];
+ }
+ } else {
+ for (ssize_t i = 0; i < h; ++i) {
+ rows[i] = source[i];
}
}
}
- // destructor
- ~array2D()
+ array2D(const array2D& other) :
+ width(other.width),
+ buffer(other.buffer)
{
+ initRows(other.rows.size());
+ }
- if (flags & ARRAY2D_VERBOSE) {
- printf(" deleting array2D size %dx%d \n", x, y);
+ array2D& operator =(const array2D& other)
+ {
+ if (this != &other) {
+ free();
+ width = other.width;
+ buffer = other.buffer;
+ initRows(other.rows.size());
}
- if ((owner) && (data)) {
- delete[] data;
- }
-
- if (ptr) {
- delete[] ptr;
- }
+ return *this;
}
void fill(const T val, bool multiThread = false)
{
+ const ssize_t height = rows.size();
#ifdef _OPENMP
#pragma omp parallel for if(multiThread)
#endif
- for (int i = 0; i < x * y; ++i) {
- data[i] = val;
+ for (ssize_t i = 0; i < width * height; ++i) {
+ buffer[i] = val;
}
}
void free()
{
- if ((owner) && (data)) {
- delete[] data;
- data = nullptr;
- }
-
- if (ptr) {
- delete [] ptr;
- ptr = nullptr;
- }
+ buffer.clear();
+ rows.clear();
+ width = 0;
}
// use with indices
- T * operator[](int index) const
+ T * operator[](int index)
{
- assert((index >= 0) && (index < y));
- return ptr[index];
+ assert((index >= 0) && (index < rows.size()));
+ return rows[index];
+ }
+
+ const T * operator[](int index) const
+ {
+ assert((index >= 0) && (index < rows.size()));
+ return rows[index];
}
// use as pointer to T**
operator T**()
{
- return ptr;
+ return rows.data();
}
// use as pointer to T**
- operator const T* const *()
+ operator const T* const *() const
{
- return ptr;
+ return rows.data();
}
- // use as pointer to data
+ // use as pointer to buffer
operator T*()
{
// only if owner this will return a valid pointer
- return data;
+ return buffer.data();
+ }
+
+ operator const T*() const
+ {
+ // only if owner this will return a valid pointer
+ return buffer.data();
}
// useful within init of parent object
// or use as resize of 2D array
- void operator()(int w, int h, unsigned int flgs = 0, int offset = 0)
+ void operator()(int w, int h, unsigned int flags = 0, int offset = 0)
{
- flags = flgs;
-
- if (flags & ARRAY2D_VERBOSE) {
- printf("got init request %dx%d flags=%u\n", w, h, flags);
- printf("previous was data %p ptr %p \n", data, ptr);
- }
-
- if (lock) { // our object was locked so don't allow a change.
- printf("got init request but object was locked!\n");
- raise( SIGSEGV);
- }
-
- lock = flags & ARRAY2D_LOCK_DATA;
-
ar_realloc(w, h, offset);
if (flags & ARRAY2D_CLEAR_DATA) {
- memset(data + offset, 0, static_cast(w) * h * sizeof(T));
+ fill(0);
}
}
- // import from flat data
- void operator()(int w, int h, T* copy, unsigned int flgs = 0)
+ array2D& operator+=(const array2D& rhs)
{
- flags = flgs;
+ if (rhs.getWidth() == this->getWidth() && rhs.getHeight() == this->getHeight()) {
+ for (int i = 0; i < getHeight(); ++i) {
+#ifdef _OPENMP
+ #pragma omp simd
+#endif
- if (flags & ARRAY2D_VERBOSE) {
- printf("got init request %dx%d flags=%u\n", w, h, flags);
- printf("previous was data %p ptr %p \n", data, ptr);
+ for (int j = 0; j < getWidth(); ++j) {
+ rows[i][j] += rhs[i][j];
+ }
+ }
}
- if (lock) { // our object was locked so don't allow a change.
- printf("got init request but object was locked!\n");
- raise( SIGSEGV);
- }
-
- lock = flags & ARRAY2D_LOCK_DATA;
-
- ar_realloc(w, h);
- memcpy(data, copy, w * h * sizeof(T));
+ return *this;
}
- int width() const
+
+
+ int getWidth() const
{
- return x;
+ return width;
}
- int height() const
+ int getHeight() const
{
- return y;
+ return rows.size();
}
operator bool()
{
- return (x > 0 && y > 0);
+ return (width > 0 && !rows.empty());
}
};
template
-class multi_array2D
+class multi_array2D : public rtengine::NonCopyable
{
private:
array2D list[num];
public:
- multi_array2D(int x, int y, int flags = 0, int offset = 0)
+ multi_array2D(int width, int height, int flags = 0, int offset = 0)
{
- for (size_t i = 0; i < num; i++) {
- list[i](x, y, flags, (i + 1) * offset);
+ for (size_t i = 0; i < num; ++i) {
+ list[i](width, height, flags, (i + 1) * offset);
}
}
- ~multi_array2D()
- {
- //printf("trying to delete the list of array2D objects\n");
- }
-
array2D & operator[](int index)
{
assert(static_cast(index) < num);
diff --git a/rtengine/ashift_dt.c b/rtengine/ashift_dt.c
new file mode 100644
index 000000000..ce19b6808
--- /dev/null
+++ b/rtengine/ashift_dt.c
@@ -0,0 +1,5132 @@
+/* -*- C++ -*-
+ *
+ * This file is part of RawTherapee.
+ *
+ * Copyright (c) 2019 Alberto Griggio
+ *
+ * RawTherapee is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * RawTherapee is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with RawTherapee. If not, see .
+ */
+
+using namespace std;
+
+// taken from darktable (src/iop/ashift.c)
+/*
+ This file is part of darktable,
+ copyright (c) 2016 Ulrich Pegelow.
+
+ darktable is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ darktable is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with darktable. If not, see .
+*/
+
+// Inspiration to this module comes from the program ShiftN (http://www.shiftn.de) by
+// Marcus Hebel.
+
+// Thanks to Marcus for his support when implementing part of the ShiftN functionality
+// to darktable.
+
+#define ROTATION_RANGE 10 // allowed min/max default range for rotation parameter
+#define ROTATION_RANGE_SOFT 20 // allowed min/max range for rotation parameter with manual adjustment
+#define LENSSHIFT_RANGE 0.5 // allowed min/max default range for lensshift parameters
+#define LENSSHIFT_RANGE_SOFT 1 // allowed min/max range for lensshift parameters with manual adjustment
+#define SHEAR_RANGE 0.2 // allowed min/max range for shear parameter
+#define SHEAR_RANGE_SOFT 0.5 // allowed min/max range for shear parameter with manual adjustment
+#define CAMERA_ANGLE_RANGE_SOFT 80
+#define MIN_LINE_LENGTH 5 // the minimum length of a line in pixels to be regarded as relevant
+#define MAX_TANGENTIAL_DEVIATION 30 // by how many degrees a line may deviate from the +/-180 and +/-90 to be regarded as relevant
+#define LSD_SCALE 0.99 // LSD: scaling factor for line detection
+#define LSD_SIGMA_SCALE 0.6 // LSD: sigma for Gaussian filter is computed as sigma = sigma_scale/scale
+#define LSD_QUANT 2.0 // LSD: bound to the quantization error on the gradient norm
+#define LSD_ANG_TH 22.5 // LSD: gradient angle tolerance in degrees
+#define LSD_LOG_EPS 0.0 // LSD: detection threshold: -log10(NFA) > log_eps
+#define LSD_DENSITY_TH 0.7 // LSD: minimal density of region points in rectangle
+#define LSD_N_BINS 1024 // LSD: number of bins in pseudo-ordering of gradient modulus
+#define LSD_GAMMA 0.45 // gamma correction to apply on raw images prior to line detection
+#define RANSAC_RUNS 400 // how many iterations to run in ransac
+#define RANSAC_EPSILON 2 // starting value for ransac epsilon (in -log10 units)
+#define RANSAC_EPSILON_STEP 1 // step size of epsilon optimization (log10 units)
+#define RANSAC_ELIMINATION_RATIO 60 // percentage of lines we try to eliminate as outliers
+#define RANSAC_OPTIMIZATION_STEPS 5 // home many steps to optimize epsilon
+#define RANSAC_OPTIMIZATION_DRY_RUNS 50 // how man runs per optimization steps
+#define RANSAC_HURDLE 5 // hurdle rate: the number of lines below which we do a complete permutation instead of random sampling
+#define MINIMUM_FITLINES 4 // minimum number of lines needed for automatic parameter fit
+#define NMS_EPSILON 1e-3 // break criterion for Nelder-Mead simplex
+#define NMS_SCALE 1.0 // scaling factor for Nelder-Mead simplex
+#define NMS_ITERATIONS 400 // number of iterations for Nelder-Mead simplex
+#define NMS_CROP_EPSILON 100.0 // break criterion for Nelder-Mead simplex on crop fitting
+#define NMS_CROP_SCALE 0.5 // scaling factor for Nelder-Mead simplex on crop fitting
+#define NMS_CROP_ITERATIONS 100 // number of iterations for Nelder-Mead simplex on crop fitting
+#define NMS_ALPHA 1.0 // reflection coefficient for Nelder-Mead simplex
+#define NMS_BETA 0.5 // contraction coefficient for Nelder-Mead simplex
+#define NMS_GAMMA 2.0 // expansion coefficient for Nelder-Mead simplex
+#define DEFAULT_F_LENGTH 28.0 // focal length we assume if no exif data are available
+
+/* // define to get debugging output */
+/* #undef ASHIFT_DEBUG */
+
+#define SQR(a) ((a) * (a))
+
+// For line detection we use the LSD algorithm as published by Rafael Grompone:
+//
+// "LSD: a Line Segment Detector" by Rafael Grompone von Gioi,
+// Jeremie Jakubowicz, Jean-Michel Morel, and Gregory Randall,
+// Image Processing On Line, 2012. DOI:10.5201/ipol.2012.gjmr-lsd
+// http://dx.doi.org/10.5201/ipol.2012.gjmr-lsd
+#include "ashift_lsd.c"
+
+// For parameter optimization we are using the Nelder-Mead simplex method
+// implemented by Michael F. Hutt.
+#include "ashift_nmsimplex.c"
+
+#include "homogeneouscoordinates.h"
+
+
+//-----------------------------------------------------------------------------
+// RT: BEGIN COMMENT
+#if 0
+DT_MODULE_INTROSPECTION(4, dt_iop_ashift_params_t)
+
+
+const char *name()
+{
+ return _("perspective correction");
+}
+
+int flags()
+{
+ return IOP_FLAGS_ALLOW_TILING | IOP_FLAGS_TILING_FULL_ROI | IOP_FLAGS_ONE_INSTANCE;
+}
+
+int groups()
+{
+ return dt_iop_get_group("perspective correction", IOP_GROUP_CORRECT);
+}
+
+int operation_tags()
+{
+ return IOP_TAG_DISTORT;
+}
+
+int operation_tags_filter()
+{
+ // switch off clipping and decoration, we want to see the full image.
+ return IOP_TAG_DECORATION | IOP_TAG_CLIPPING;
+}
+#endif // if 0
+//-----------------------------------------------------------------------------
+
+typedef enum dt_iop_ashift_homodir_t
+{
+ ASHIFT_HOMOGRAPH_FORWARD,
+ ASHIFT_HOMOGRAPH_INVERTED
+} dt_iop_ashift_homodir_t;
+
+//typedef enum dt_iop_ashift_linetype_t
+enum
+{
+ ASHIFT_LINE_IRRELEVANT = 0, // the line is found to be not interesting
+ // eg. too short, or not horizontal or vertical
+ ASHIFT_LINE_RELEVANT = 1 << 0, // the line is relevant for us
+ ASHIFT_LINE_DIRVERT = 1 << 1, // the line is (mostly) vertical, else (mostly) horizontal
+ ASHIFT_LINE_SELECTED = 1 << 2, // the line is selected for fitting
+ ASHIFT_LINE_VERTICAL_NOT_SELECTED = ASHIFT_LINE_RELEVANT | ASHIFT_LINE_DIRVERT,
+ ASHIFT_LINE_HORIZONTAL_NOT_SELECTED = ASHIFT_LINE_RELEVANT,
+ ASHIFT_LINE_VERTICAL_SELECTED = ASHIFT_LINE_RELEVANT | ASHIFT_LINE_DIRVERT | ASHIFT_LINE_SELECTED,
+ ASHIFT_LINE_HORIZONTAL_SELECTED = ASHIFT_LINE_RELEVANT | ASHIFT_LINE_SELECTED,
+ ASHIFT_LINE_MASK = ASHIFT_LINE_RELEVANT | ASHIFT_LINE_DIRVERT | ASHIFT_LINE_SELECTED
+}; //dt_iop_ashift_linetype_t;
+typedef unsigned int dt_iop_ashift_linetype_t;
+
+typedef enum dt_iop_ashift_linecolor_t
+{
+ ASHIFT_LINECOLOR_GREY = 0,
+ ASHIFT_LINECOLOR_GREEN = 1,
+ ASHIFT_LINECOLOR_RED = 2,
+ ASHIFT_LINECOLOR_BLUE = 3,
+ ASHIFT_LINECOLOR_YELLOW = 4
+} dt_iop_ashift_linecolor_t;
+
+//typedef enum dt_iop_ashift_fitaxis_t
+enum
+{
+ ASHIFT_FIT_NONE = 0, // none
+ ASHIFT_FIT_ROTATION = 1 << 0, // flag indicates to fit rotation angle
+ ASHIFT_FIT_LENS_VERT = 1 << 1, // flag indicates to fit vertical lens shift
+ ASHIFT_FIT_LENS_HOR = 1 << 2, // flag indicates to fit horizontal lens shift
+ ASHIFT_FIT_SHEAR = 1 << 3, // flag indicates to fit shear parameter
+ ASHIFT_FIT_LINES_VERT = 1 << 4, // use vertical lines for fitting
+ ASHIFT_FIT_LINES_HOR = 1 << 5, // use horizontal lines for fitting
+ ASHIFT_FIT_LENS_BOTH = ASHIFT_FIT_LENS_VERT | ASHIFT_FIT_LENS_HOR,
+ ASHIFT_FIT_LINES_BOTH = ASHIFT_FIT_LINES_VERT | ASHIFT_FIT_LINES_HOR,
+ ASHIFT_FIT_VERTICALLY = ASHIFT_FIT_ROTATION | ASHIFT_FIT_LENS_VERT | ASHIFT_FIT_LINES_VERT,
+ ASHIFT_FIT_HORIZONTALLY = ASHIFT_FIT_ROTATION | ASHIFT_FIT_LENS_HOR | ASHIFT_FIT_LINES_HOR,
+ ASHIFT_FIT_BOTH = ASHIFT_FIT_ROTATION | ASHIFT_FIT_LENS_VERT | ASHIFT_FIT_LENS_HOR |
+ ASHIFT_FIT_LINES_VERT | ASHIFT_FIT_LINES_HOR,
+ ASHIFT_FIT_VERTICALLY_NO_ROTATION = ASHIFT_FIT_LENS_VERT | ASHIFT_FIT_LINES_VERT,
+ ASHIFT_FIT_HORIZONTALLY_NO_ROTATION = ASHIFT_FIT_LENS_HOR | ASHIFT_FIT_LINES_HOR,
+ ASHIFT_FIT_BOTH_NO_ROTATION = ASHIFT_FIT_LENS_VERT | ASHIFT_FIT_LENS_HOR |
+ ASHIFT_FIT_LINES_VERT | ASHIFT_FIT_LINES_HOR,
+ ASHIFT_FIT_BOTH_SHEAR = ASHIFT_FIT_ROTATION | ASHIFT_FIT_LENS_VERT | ASHIFT_FIT_LENS_HOR |
+ ASHIFT_FIT_SHEAR | ASHIFT_FIT_LINES_VERT | ASHIFT_FIT_LINES_HOR,
+ ASHIFT_FIT_ROTATION_VERTICAL_LINES = ASHIFT_FIT_ROTATION | ASHIFT_FIT_LINES_VERT,
+ ASHIFT_FIT_ROTATION_HORIZONTAL_LINES = ASHIFT_FIT_ROTATION | ASHIFT_FIT_LINES_HOR,
+ ASHIFT_FIT_ROTATION_BOTH_LINES = ASHIFT_FIT_ROTATION | ASHIFT_FIT_LINES_VERT | ASHIFT_FIT_LINES_HOR,
+ ASHIFT_FIT_FLIP = ASHIFT_FIT_LENS_VERT | ASHIFT_FIT_LENS_HOR | ASHIFT_FIT_LINES_VERT | ASHIFT_FIT_LINES_HOR
+}; //dt_iop_ashift_fitaxis_t;
+typedef unsigned int dt_iop_ashift_fitaxis_t;
+
+typedef enum dt_iop_ashift_nmsresult_t
+{
+ NMS_SUCCESS = 0,
+ NMS_NOT_ENOUGH_LINES = 1,
+ NMS_DID_NOT_CONVERGE = 2,
+ NMS_INSANE = 3
+} dt_iop_ashift_nmsresult_t;
+
+typedef enum dt_iop_ashift_enhance_t
+{
+ ASHIFT_ENHANCE_NONE = 0,
+ ASHIFT_ENHANCE_EDGES = 1 << 0,
+ ASHIFT_ENHANCE_DETAIL = 1 << 1,
+ ASHIFT_ENHANCE_HORIZONTAL = 0x100,
+ ASHIFT_ENHANCE_VERTICAL = 0x200
+} dt_iop_ashift_enhance_t;
+
+typedef enum dt_iop_ashift_mode_t
+{
+ ASHIFT_MODE_GENERIC = 0,
+ ASHIFT_MODE_SPECIFIC = 1
+} dt_iop_ashift_mode_t;
+
+typedef enum dt_iop_ashift_crop_t
+{
+ ASHIFT_CROP_OFF = 0,
+ ASHIFT_CROP_LARGEST = 1,
+ ASHIFT_CROP_ASPECT = 2
+} dt_iop_ashift_crop_t;
+
+typedef enum dt_iop_ashift_bounding_t
+{
+ ASHIFT_BOUNDING_OFF = 0,
+ ASHIFT_BOUNDING_SELECT = 1,
+ ASHIFT_BOUNDING_DESELECT = 2
+} dt_iop_ashift_bounding_t;
+
+typedef enum dt_iop_ashift_jobcode_t
+{
+ ASHIFT_JOBCODE_NONE = 0,
+ ASHIFT_JOBCODE_GET_STRUCTURE = 1,
+ ASHIFT_JOBCODE_FIT = 2
+} dt_iop_ashift_jobcode_t;
+
+typedef struct dt_iop_ashift_params1_t
+{
+ float rotation;
+ float lensshift_v;
+ float lensshift_h;
+ int toggle;
+} dt_iop_ashift_params1_t;
+
+typedef struct dt_iop_ashift_params2_t
+{
+ float rotation;
+ float lensshift_v;
+ float lensshift_h;
+ float f_length;
+ float crop_factor;
+ float orthocorr;
+ float aspect;
+ dt_iop_ashift_mode_t mode;
+ int toggle;
+} dt_iop_ashift_params2_t;
+
+typedef struct dt_iop_ashift_params3_t
+{
+ float rotation;
+ float lensshift_v;
+ float lensshift_h;
+ float f_length;
+ float crop_factor;
+ float orthocorr;
+ float aspect;
+ dt_iop_ashift_mode_t mode;
+ int toggle;
+ dt_iop_ashift_crop_t cropmode;
+ float cl;
+ float cr;
+ float ct;
+ float cb;
+} dt_iop_ashift_params3_t;
+
+typedef struct dt_iop_ashift_params_t
+{
+ float rotation;
+ float lensshift_v;
+ float lensshift_h;
+ float shear;
+ float f_length;
+ float crop_factor;
+ float orthocorr;
+ float aspect;
+ dt_iop_ashift_mode_t mode;
+ int toggle;
+ dt_iop_ashift_crop_t cropmode;
+ float cl;
+ float cr;
+ float ct;
+ float cb;
+ float camera_pitch;
+ float camera_yaw;
+} dt_iop_ashift_params_t;
+
+typedef struct dt_iop_ashift_line_t
+{
+ float p1[3];
+ float p2[3];
+ float length;
+ float width;
+ float weight;
+ dt_iop_ashift_linetype_t type;
+ // homogeneous coordinates:
+ float L[3];
+} dt_iop_ashift_line_t;
+
+typedef struct dt_iop_ashift_points_idx_t
+{
+ size_t offset;
+ int length;
+ int near;
+ int bounded;
+ dt_iop_ashift_linetype_t type;
+ dt_iop_ashift_linecolor_t color;
+ // bounding box:
+ float bbx, bby, bbX, bbY;
+} dt_iop_ashift_points_idx_t;
+
+typedef struct dt_iop_ashift_fit_params_t
+{
+ int params_count;
+ dt_iop_ashift_linetype_t linetype;
+ dt_iop_ashift_linetype_t linemask;
+ dt_iop_ashift_line_t *lines;
+ int lines_count;
+ int width;
+ int height;
+ float weight;
+ float f_length_kb;
+ float orthocorr;
+ float aspect;
+ float rotation;
+ float lensshift_v;
+ float lensshift_h;
+ float shear;
+ float camera_pitch;
+ float camera_yaw;
+ float rotation_range;
+ float lensshift_v_range;
+ float lensshift_h_range;
+ float shear_range;
+ float camera_pitch_range;
+ float camera_yaw_range;
+} dt_iop_ashift_fit_params_t;
+
+typedef struct dt_iop_ashift_cropfit_params_t
+{
+ int width;
+ int height;
+ float x;
+ float y;
+ float alpha;
+ float homograph[3][3];
+ float edges[4][3];
+} dt_iop_ashift_cropfit_params_t;
+
+typedef struct dt_iop_ashift_gui_data_t
+{
+ /* GtkWidget *rotation; */
+ /* GtkWidget *lensshift_v; */
+ /* GtkWidget *lensshift_h; */
+ /* GtkWidget *shear; */
+ /* GtkWidget *guide_lines; */
+ /* GtkWidget *cropmode; */
+ /* GtkWidget *mode; */
+ /* GtkWidget *f_length; */
+ /* GtkWidget *crop_factor; */
+ /* GtkWidget *orthocorr; */
+ /* GtkWidget *aspect; */
+ /* GtkWidget *fit_v; */
+ /* GtkWidget *fit_h; */
+ /* GtkWidget *fit_both; */
+ /* GtkWidget *structure; */
+ /* GtkWidget *clean; */
+ /* GtkWidget *eye; */
+ int lines_suppressed;
+ int fitting;
+ int isflipped;
+ int show_guides;
+ int isselecting;
+ int isdeselecting;
+ dt_iop_ashift_bounding_t isbounding;
+ float near_delta;
+ int selecting_lines_version;
+ float rotation_range;
+ float lensshift_v_range;
+ float lensshift_h_range;
+ float shear_range;
+ float camera_pitch_range;
+ float camera_yaw_range;
+ dt_iop_ashift_line_t *lines;
+ int lines_in_width;
+ int lines_in_height;
+ int lines_x_off;
+ int lines_y_off;
+ int lines_count;
+ int vertical_count;
+ int horizontal_count;
+ int lines_version;
+ float vertical_weight;
+ float horizontal_weight;
+ float *points;
+ dt_iop_ashift_points_idx_t *points_idx;
+ int points_lines_count;
+ int points_version;
+ float *buf;
+ int buf_width;
+ int buf_height;
+ int buf_x_off;
+ int buf_y_off;
+ float buf_scale;
+ uint64_t lines_hash;
+ uint64_t grid_hash;
+ uint64_t buf_hash;
+ dt_iop_ashift_fitaxis_t lastfit;
+ float lastx;
+ float lasty;
+ float crop_cx;
+ float crop_cy;
+ dt_iop_ashift_jobcode_t jobcode;
+ int jobparams;
+ /* dt_pthread_mutex_t lock; */
+ MyMutex lock;
+ gboolean adjust_crop;
+} dt_iop_ashift_gui_data_t;
+
+typedef struct dt_iop_ashift_data_t
+{
+ float rotation;
+ float lensshift_v;
+ float lensshift_h;
+ float shear;
+ float f_length_kb;
+ float orthocorr;
+ float aspect;
+ float cl;
+ float cr;
+ float ct;
+ float cb;
+} dt_iop_ashift_data_t;
+
+typedef struct dt_iop_ashift_global_data_t
+{
+ int kernel_ashift_bilinear;
+ int kernel_ashift_bicubic;
+ int kernel_ashift_lanczos2;
+ int kernel_ashift_lanczos3;
+} dt_iop_ashift_global_data_t;
+
+typedef struct dt_iop_module_t
+{
+ dt_iop_ashift_gui_data_t *gui_data;
+ int is_raw;
+} dt_iop_module_t;
+
+//-----------------------------------------------------------------------------
+// RT: BEGIN COMMENT
+#if 0
+int legacy_params(dt_iop_module_t *self, const void *const old_params, const int old_version,
+ void *new_params, const int new_version)
+{
+ if(old_version == 1 && new_version == 4)
+ {
+ const dt_iop_ashift_params1_t *old = old_params;
+ dt_iop_ashift_params_t *new = new_params;
+ new->rotation = old->rotation;
+ new->lensshift_v = old->lensshift_v;
+ new->lensshift_h = old->lensshift_h;
+ new->shear = 0.0f;
+ new->toggle = old->toggle;
+ new->f_length = DEFAULT_F_LENGTH;
+ new->crop_factor = 1.0f;
+ new->orthocorr = 100.0f;
+ new->aspect = 1.0f;
+ new->mode = ASHIFT_MODE_GENERIC;
+ new->cropmode = ASHIFT_CROP_OFF;
+ new->cl = 0.0f;
+ new->cr = 1.0f;
+ new->ct = 0.0f;
+ new->cb = 1.0f;
+ return 0;
+ }
+ if(old_version == 2 && new_version == 4)
+ {
+ const dt_iop_ashift_params2_t *old = old_params;
+ dt_iop_ashift_params_t *new = new_params;
+ new->rotation = old->rotation;
+ new->lensshift_v = old->lensshift_v;
+ new->lensshift_h = old->lensshift_h;
+ new->shear = 0.0f;
+ new->toggle = old->toggle;
+ new->f_length = old->f_length;
+ new->crop_factor = old->crop_factor;
+ new->orthocorr = old->orthocorr;
+ new->aspect = old->aspect;
+ new->mode = old->mode;
+ new->cropmode = ASHIFT_CROP_OFF;
+ new->cl = 0.0f;
+ new->cr = 1.0f;
+ new->ct = 0.0f;
+ new->cb = 1.0f;
+ return 0;
+ }
+ if(old_version == 3 && new_version == 4)
+ {
+ const dt_iop_ashift_params3_t *old = old_params;
+ dt_iop_ashift_params_t *new = new_params;
+ new->rotation = old->rotation;
+ new->lensshift_v = old->lensshift_v;
+ new->lensshift_h = old->lensshift_h;
+ new->shear = 0.0f;
+ new->toggle = old->toggle;
+ new->f_length = old->f_length;
+ new->crop_factor = old->crop_factor;
+ new->orthocorr = old->orthocorr;
+ new->aspect = old->aspect;
+ new->mode = old->mode;
+ new->cropmode = old->cropmode;
+ new->cl = old->cl;
+ new->cr = old->cr;
+ new->ct = old->ct;
+ new->cb = old->cb;
+ return 0;
+ }
+
+ return 1;
+}
+
+void init_key_accels(dt_iop_module_so_t *self)
+{
+ dt_accel_register_slider_iop(self, FALSE, NC_("accel", "rotation"));
+ dt_accel_register_slider_iop(self, FALSE, NC_("accel", "lens shift (v)"));
+ dt_accel_register_slider_iop(self, FALSE, NC_("accel", "lens shift (h)"));
+ dt_accel_register_slider_iop(self, FALSE, NC_("accel", "shear"));
+}
+
+void connect_key_accels(dt_iop_module_t *self)
+{
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+
+ dt_accel_connect_slider_iop(self, "rotation", GTK_WIDGET(g->rotation));
+ dt_accel_connect_slider_iop(self, "lens shift (v)", GTK_WIDGET(g->lensshift_v));
+ dt_accel_connect_slider_iop(self, "lens shift (h)", GTK_WIDGET(g->lensshift_h));
+ dt_accel_connect_slider_iop(self, "shear", GTK_WIDGET(g->shear));
+}
+#endif // if 0
+//-----------------------------------------------------------------------------
+
+// multiply 3x3 matrix with 3x1 vector
+// dst needs to be different from v
+static inline void mat3mulv(float *dst, const float *const mat, const float *const v)
+{
+ for(int k = 0; k < 3; k++)
+ {
+ float x = 0.0f;
+ for(int i = 0; i < 3; i++) x += mat[3 * k + i] * v[i];
+ dst[k] = x;
+ }
+}
+
+// multiply two 3x3 matrices
+// dst needs to be different from m1 and m2
+static inline void mat3mul(float *dst, const float *const m1, const float *const m2)
+{
+ for(int k = 0; k < 3; k++)
+ {
+ for(int i = 0; i < 3; i++)
+ {
+ float x = 0.0f;
+ for(int j = 0; j < 3; j++) x += m1[3 * k + j] * m2[3 * j + i];
+ dst[3 * k + i] = x;
+ }
+ }
+}
+
+// normalized product of two 3x1 vectors
+// dst needs to be different from v1 and v2
+static inline void vec3prodn(float *dst, const float *const v1, const float *const v2)
+{
+ const float l1 = v1[1] * v2[2] - v1[2] * v2[1];
+ const float l2 = v1[2] * v2[0] - v1[0] * v2[2];
+ const float l3 = v1[0] * v2[1] - v1[1] * v2[0];
+
+ // normalize so that l1^2 + l2^2 + l3^3 = 1
+ const float sq = sqrt(l1 * l1 + l2 * l2 + l3 * l3);
+
+ const float f = sq > 0.0f ? 1.0f / sq : 1.0f;
+
+ dst[0] = l1 * f;
+ dst[1] = l2 * f;
+ dst[2] = l3 * f;
+}
+
+// normalize a 3x1 vector so that x^2 + y^2 + z^2 = 1
+// dst and v may be the same
+static inline void vec3norm(float *dst, const float *const v)
+{
+ const float sq = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
+
+ // special handling for an all-zero vector
+ const float f = sq > 0.0f ? 1.0f / sq : 1.0f;
+
+ dst[0] = v[0] * f;
+ dst[1] = v[1] * f;
+ dst[2] = v[2] * f;
+}
+
+// normalize a 3x1 vector so that x^2 + y^2 = 1; a useful normalization for
+// lines in homogeneous coordinates
+// dst and v may be the same
+static inline void vec3lnorm(float *dst, const float *const v)
+{
+ const float sq = sqrt(v[0] * v[0] + v[1] * v[1]);
+
+ // special handling for a point vector of the image center
+ const float f = sq > 0.0f ? 1.0f / sq : 1.0f;
+
+ dst[0] = v[0] * f;
+ dst[1] = v[1] * f;
+ dst[2] = v[2] * f;
+}
+
+
+// scalar product of two 3x1 vectors
+static inline float vec3scalar(const float *const v1, const float *const v2)
+{
+ return (v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2]);
+}
+
+// check if 3x1 vector is (very close to) null
+static inline int vec3isnull(const float *const v)
+{
+ const float eps = 1e-10f;
+ return (fabs(v[0]) < eps && fabs(v[1]) < eps && fabs(v[2]) < eps);
+}
+
+#ifdef ASHIFT_DEBUG
+static void print_roi(const dt_iop_roi_t *roi, const char *label)
+{
+ printf("{ %5d %5d %5d %5d %.6f } %s\n", roi->x, roi->y, roi->width, roi->height, roi->scale, label);
+}
+#endif
+
+#define MAT3SWAP(a, b) { float (*tmp)[3] = (a); (a) = (b); (b) = tmp; }
+
+/*
+static void homography(float *homograph, const float angle, const float shift_v, const float shift_h,
+ const float shear, const float f_length_kb, const float orthocorr, const float aspect,
+ const int width, const int height, dt_iop_ashift_homodir_t dir)
+*/
+static void homography(float *homograph, const float angle, const float shift_v,
+ const float shift_h, const float shear, const float camera_pitch, const
+ float camera_yaw, const float f_length_kb, const float orthocorr, const
+ float aspect, const int width, const int height, dt_iop_ashift_homodir_t
+ dir)
+{
+ // calculate homograph that combines all translations, rotations
+ // and warping into one single matrix operation.
+ // this is heavily leaning on ShiftN where the homographic matrix expects
+ // input in (y : x : 1) format. in the darktable world we want to keep the
+ // (x : y : 1) convention. therefore we need to flip coordinates first and
+ // make sure that output is in correct format after corrections are applied.
+
+ const float u = width;
+ const float v = height;
+ const float rot = -M_PI * angle / 180.0f;
+ const float pitch = M_PI * camera_pitch / 180.0f;
+ const float yaw = M_PI * camera_yaw / 180.0f;
+
+ /*
+ const float phi = M_PI * angle / 180.0f;
+ const float cosi = cos(phi);
+ const float sini = sin(phi);
+ const float ascale = sqrt(aspect);
+
+ // most of this comes from ShiftN
+ const float f_global = f_length_kb;
+ const float horifac = 1.0f - orthocorr / 100.0f;
+ const float exppa_v = exp(shift_v);
+ const float fdb_v = f_global / (14.4f + (v / u - 1) * 7.2f);
+ const float rad_v = fdb_v * (exppa_v - 1.0f) / (exppa_v + 1.0f);
+ const float alpha_v = CLAMP(atan(rad_v), -1.5f, 1.5f);
+ const float rt_v = sin(0.5f * alpha_v);
+ const float r_v = fmax(0.1f, 2.0f * (horifac - 1.0f) * rt_v * rt_v + 1.0f);
+
+ const float vertifac = 1.0f - orthocorr / 100.0f;
+ const float exppa_h = exp(shift_h);
+ const float fdb_h = f_global / (14.4f + (u / v - 1) * 7.2f);
+ const float rad_h = fdb_h * (exppa_h - 1.0f) / (exppa_h + 1.0f);
+ const float alpha_h = CLAMP(atan(rad_h), -1.5f, 1.5f);
+ const float rt_h = sin(0.5f * alpha_h);
+ const float r_h = fmax(0.1f, 2.0f * (vertifac - 1.0f) * rt_h * rt_h + 1.0f);
+ */
+
+ const float f = f_length_kb * (sqrt(u*u + v*v) / sqrt(36.0*36.0 + 24.0*24.0));
+
+ // three intermediate buffers for matrix calculation ...
+ float m1[3][3]/*, m2[3][3]*/, m3[3][3];
+
+ // ... and some pointers to handle them more intuitively
+ float (*mwork)[3] = m1;
+ //float (*minput)[3] = m2;
+ float (*moutput)[3] = m3;
+
+ /*
+ // Step 1: flip x and y coordinates (see above)
+ memset(minput, 0, 9 * sizeof(float));
+ minput[0][1] = 1.0f;
+ minput[1][0] = 1.0f;
+ minput[2][2] = 1.0f;
+
+
+ // Step 2: rotation of image around its center
+ memset(mwork, 0, 9 * sizeof(float));
+ mwork[0][0] = cosi;
+ mwork[0][1] = -sini;
+ mwork[1][0] = sini;
+ mwork[1][1] = cosi;
+ mwork[0][2] = -0.5f * v * cosi + 0.5f * u * sini + 0.5f * v;
+ mwork[1][2] = -0.5f * v * sini - 0.5f * u * cosi + 0.5f * u;
+ mwork[2][2] = 1.0f;
+
+ // multiply mwork * minput -> moutput
+ mat3mul((float *)moutput, (float *)mwork, (float *)minput);
+
+
+ // Step 3: apply shearing
+ memset(mwork, 0, 9 * sizeof(float));
+ mwork[0][0] = 1.0f;
+ mwork[0][1] = shear;
+ mwork[1][1] = 1.0f;
+ mwork[1][0] = shear;
+ mwork[2][2] = 1.0f;
+
+ // moutput (of last calculation) -> minput
+ MAT3SWAP(minput, moutput);
+ // multiply mwork * minput -> moutput
+ mat3mul((float *)moutput, (float *)mwork, (float *)minput);
+
+
+ // Step 4: apply vertical lens shift effect
+ memset(mwork, 0, 9 * sizeof(float));
+ mwork[0][0] = exppa_v;
+ mwork[1][0] = 0.5f * ((exppa_v - 1.0f) * u) / v;
+ mwork[1][1] = 2.0f * exppa_v / (exppa_v + 1.0f);
+ mwork[1][2] = -0.5f * ((exppa_v - 1.0f) * u) / (exppa_v + 1.0f);
+ mwork[2][0] = (exppa_v - 1.0f) / v;
+ mwork[2][2] = 1.0f;
+
+ // moutput (of last calculation) -> minput
+ MAT3SWAP(minput, moutput);
+ // multiply mwork * minput -> moutput
+ mat3mul((float *)moutput, (float *)mwork, (float *)minput);
+
+
+ // Step 5: horizontal compression
+ memset(mwork, 0, 9 * sizeof(float));
+ mwork[0][0] = 1.0f;
+ mwork[1][1] = r_v;
+ mwork[1][2] = 0.5f * u * (1.0f - r_v);
+ mwork[2][2] = 1.0f;
+
+ // moutput (of last calculation) -> minput
+ MAT3SWAP(minput, moutput);
+ // multiply mwork * minput -> moutput
+ mat3mul((float *)moutput, (float *)mwork, (float *)minput);
+
+
+ // Step 6: flip x and y back again
+ memset(mwork, 0, 9 * sizeof(float));
+ mwork[0][1] = 1.0f;
+ mwork[1][0] = 1.0f;
+ mwork[2][2] = 1.0f;
+
+ // moutput (of last calculation) -> minput
+ MAT3SWAP(minput, moutput);
+ // multiply mwork * minput -> moutput
+ mat3mul((float *)moutput, (float *)mwork, (float *)minput);
+
+
+ // from here output vectors would be in (x : y : 1) format
+
+ // Step 7: now we can apply horizontal lens shift with the same matrix format as above
+ memset(mwork, 0, 9 * sizeof(float));
+ mwork[0][0] = exppa_h;
+ mwork[1][0] = 0.5f * ((exppa_h - 1.0f) * v) / u;
+ mwork[1][1] = 2.0f * exppa_h / (exppa_h + 1.0f);
+ mwork[1][2] = -0.5f * ((exppa_h - 1.0f) * v) / (exppa_h + 1.0f);
+ mwork[2][0] = (exppa_h - 1.0f) / u;
+ mwork[2][2] = 1.0f;
+
+ // moutput (of last calculation) -> minput
+ MAT3SWAP(minput, moutput);
+ // multiply mwork * minput -> moutput
+ mat3mul((float *)moutput, (float *)mwork, (float *)minput);
+
+
+ // Step 8: vertical compression
+ memset(mwork, 0, 9 * sizeof(float));
+ mwork[0][0] = 1.0f;
+ mwork[1][1] = r_h;
+ mwork[1][2] = 0.5f * v * (1.0f - r_h);
+ mwork[2][2] = 1.0f;
+
+ // moutput (of last calculation) -> minput
+ MAT3SWAP(minput, moutput);
+ // multiply mwork * minput -> moutput
+ mat3mul((float *)moutput, (float *)mwork, (float *)minput);
+
+
+ // Step 9: apply aspect ratio scaling
+ memset(mwork, 0, 9 * sizeof(float));
+ mwork[0][0] = 1.0f * ascale;
+ mwork[1][1] = 1.0f / ascale;
+ mwork[2][2] = 1.0f;
+
+ // moutput (of last calculation) -> minput
+ MAT3SWAP(minput, moutput);
+ // multiply mwork * minput -> moutput
+ mat3mul((float *)moutput, (float *)mwork, (float *)minput);
+ */
+
+ rtengine::homogeneous::Vector center;
+ center[0] = 0.0f;
+ center[1] = 0.0f;
+ center[2] = f;
+ center[3] = 1.0f;
+
+ using rtengine::operator*;
+
+ // Location of image center after rotations.
+ const rtengine::homogeneous::Vector camera_center_yaw_pitch =
+ rtengine::homogeneous::rotationMatrix(pitch, rtengine::homogeneous::Axis::X) *
+ rtengine::homogeneous::rotationMatrix(yaw, rtengine::homogeneous::Axis::Y) *
+ center;
+
+ const rtengine::homogeneous::Matrix matrix =
+ // Perspective correction.
+ rtengine::homogeneous::projectionMatrix(camera_center_yaw_pitch[2], rtengine::homogeneous::Axis::Z) *
+ rtengine::homogeneous::rotationMatrix(yaw, rtengine::homogeneous::Axis::Y) *
+ rtengine::homogeneous::rotationMatrix(pitch, rtengine::homogeneous::Axis::X) *
+ // Rotation.
+ rtengine::homogeneous::rotationMatrix(rot, rtengine::homogeneous::Axis::Z) *
+ // Lens/sensor shift and move to z == camera_focal_length.
+ rtengine::homogeneous::translationMatrix((0.01f * shift_h - 0.5f) * u, (-0.01f * shift_v - 0.5f) * v, f);
+
+ m3[0][0] = matrix[0][0];
+ m3[0][1] = matrix[0][1];
+ m3[0][2] = matrix[0][3];
+ m3[1][0] = matrix[1][0];
+ m3[1][1] = matrix[1][1];
+ m3[1][2] = matrix[1][3];
+ m3[2][0] = matrix[3][0];
+ m3[2][1] = matrix[3][1];
+ m3[2][2] = matrix[3][3];
+
+ /*
+ // Step 10: find x/y offsets and apply according correction so that
+ // no negative coordinates occur in output vector
+ float umin = FLT_MAX, vmin = FLT_MAX;
+ // visit all four corners
+ for(int y = 0; y < height; y += height - 1)
+ for(int x = 0; x < width; x += width - 1)
+ {
+ float pi[3], po[3];
+ pi[0] = x;
+ pi[1] = y;
+ pi[2] = 1.0f;
+ // moutput expects input in (x:y:1) format and gives output as (x:y:1)
+ mat3mulv(po, (float *)moutput, pi);
+ umin = fmin(umin, po[0] / po[2]);
+ vmin = fmin(vmin, po[1] / po[2]);
+ }
+
+ memset(mwork, 0, 9 * sizeof(float));
+ mwork[0][0] = 1.0f;
+ mwork[1][1] = 1.0f;
+ mwork[2][2] = 1.0f;
+ mwork[0][2] = -umin;
+ mwork[1][2] = -vmin;
+
+ // moutput (of last calculation) -> minput
+ MAT3SWAP(minput, moutput);
+ // multiply mwork * minput -> moutput
+ mat3mul((float *)moutput, (float *)mwork, (float *)minput);
+ */
+
+
+ // on request we either keep the final matrix for forward conversions
+ // or produce an inverted matrix for backward conversions
+ if(dir == ASHIFT_HOMOGRAPH_FORWARD)
+ {
+ // we have what we need -> copy it to the right place
+ memcpy(homograph, moutput, 9 * sizeof(float));
+ }
+ else
+ {
+ // generate inverted homograph (mat3inv function defined in colorspaces.c)
+ if(mat3inv((float *)homograph, (float *)moutput))
+ {
+ // in case of error we set to unity matrix
+ memset(mwork, 0, 9 * sizeof(float));
+ mwork[0][0] = 1.0f;
+ mwork[1][1] = 1.0f;
+ mwork[2][2] = 1.0f;
+ memcpy(homograph, mwork, 9 * sizeof(float));
+ }
+ }
+}
+#undef MAT3SWAP
+
+
+// check if module parameters are set to all neutral values in which case the module's
+// output is identical to its input
+static inline int isneutral(dt_iop_ashift_data_t *data)
+{
+ // values lower than this have no visible effect
+ const float eps = 1.0e-4f;
+
+ return(fabs(data->rotation) < eps &&
+ fabs(data->lensshift_v) < eps &&
+ fabs(data->lensshift_h) < eps &&
+ fabs(data->shear) < eps &&
+ fabs(data->aspect - 1.0f) < eps &&
+ data->cl < eps &&
+ 1.0f - data->cr < eps &&
+ data->ct < eps &&
+ 1.0f - data->cb < eps);
+}
+
+
+//-----------------------------------------------------------------------------
+// RT: BEGIN COMMENT
+#if 0
+int distort_transform(dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, float *points, size_t points_count)
+{
+ dt_iop_ashift_data_t *data = (dt_iop_ashift_data_t *)piece->data;
+
+ // nothing to be done if parameters are set to neutral values
+ if(isneutral(data)) return 1;
+
+ float homograph[3][3];
+ homography((float *)homograph, data->rotation, data->lensshift_v, data->lensshift_h, data->shear, data->f_length_kb,
+ data->orthocorr, data->aspect, piece->buf_in.width, piece->buf_in.height, ASHIFT_HOMOGRAPH_FORWARD);
+
+ // clipping offset
+ const float fullwidth = (float)piece->buf_out.width / (data->cr - data->cl);
+ const float fullheight = (float)piece->buf_out.height / (data->cb - data->ct);
+ const float cx = fullwidth * data->cl;
+ const float cy = fullheight * data->ct;
+
+#ifdef _OPENMP
+#pragma omp parallel for schedule(static) shared(points, points_count, homograph)
+#endif
+ for(size_t i = 0; i < points_count * 2; i += 2)
+ {
+ float pi[3] = { points[i], points[i + 1], 1.0f };
+ float po[3];
+ mat3mulv(po, (float *)homograph, pi);
+ points[i] = po[0] / po[2] - cx;
+ points[i + 1] = po[1] / po[2] - cy;
+ }
+
+ return 1;
+}
+
+
+int distort_backtransform(dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, float *points,
+ size_t points_count)
+{
+ dt_iop_ashift_data_t *data = (dt_iop_ashift_data_t *)piece->data;
+
+ // nothing to be done if parameters are set to neutral values
+ if(isneutral(data)) return 1;
+
+ float ihomograph[3][3];
+ homography((float *)ihomograph, data->rotation, data->lensshift_v, data->lensshift_h, data->shear, data->f_length_kb,
+ data->orthocorr, data->aspect, piece->buf_in.width, piece->buf_in.height, ASHIFT_HOMOGRAPH_INVERTED);
+
+ // clipping offset
+ const float fullwidth = (float)piece->buf_out.width / (data->cr - data->cl);
+ const float fullheight = (float)piece->buf_out.height / (data->cb - data->ct);
+ const float cx = fullwidth * data->cl;
+ const float cy = fullheight * data->ct;
+
+#ifdef _OPENMP
+#pragma omp parallel for schedule(static) shared(points, points_count, ihomograph)
+#endif
+ for(size_t i = 0; i < points_count * 2; i += 2)
+ {
+ float pi[3] = { points[i] + cx, points[i + 1] + cy, 1.0f };
+ float po[3];
+ mat3mulv(po, (float *)ihomograph, pi);
+ points[i] = po[0] / po[2];
+ points[i + 1] = po[1] / po[2];
+ }
+
+ return 1;
+}
+
+void modify_roi_out(struct dt_iop_module_t *self, struct dt_dev_pixelpipe_iop_t *piece, dt_iop_roi_t *roi_out,
+ const dt_iop_roi_t *roi_in)
+{
+ dt_iop_ashift_data_t *data = (dt_iop_ashift_data_t *)piece->data;
+ *roi_out = *roi_in;
+
+ // nothing more to be done if parameters are set to neutral values
+ if(isneutral(data)) return;
+
+ float homograph[3][3];
+ homography((float *)homograph, data->rotation, data->lensshift_v, data->lensshift_h, data->shear, data->f_length_kb,
+ data->orthocorr, data->aspect, piece->buf_in.width, piece->buf_in.height, ASHIFT_HOMOGRAPH_FORWARD);
+
+ float xm = FLT_MAX, xM = -FLT_MAX, ym = FLT_MAX, yM = -FLT_MAX;
+
+ // go through all four vertices of input roi and convert coordinates to output
+ for(int y = 0; y < roi_in->height; y += roi_in->height - 1)
+ {
+ for(int x = 0; x < roi_in->width; x += roi_in->width - 1)
+ {
+ float pin[3], pout[3];
+
+ // convert from input coordinates to original image coordinates
+ pin[0] = roi_in->x + x;
+ pin[1] = roi_in->y + y;
+ pin[0] /= roi_in->scale;
+ pin[1] /= roi_in->scale;
+ pin[2] = 1.0f;
+
+ // apply homograph
+ mat3mulv(pout, (float *)homograph, pin);
+
+ // convert to output image coordinates
+ pout[0] /= pout[2];
+ pout[1] /= pout[2];
+ pout[0] *= roi_out->scale;
+ pout[1] *= roi_out->scale;
+ xm = MIN(xm, pout[0]);
+ xM = MAX(xM, pout[0]);
+ ym = MIN(ym, pout[1]);
+ yM = MAX(yM, pout[1]);
+ }
+ }
+ float width = xM - xm + 1;
+ float height = yM - ym + 1;
+
+ // clipping adjustments
+ width *= data->cr - data->cl;
+ height *= data->cb - data->ct;
+
+ roi_out->width = floorf(width);
+ roi_out->height = floorf(height);
+
+#ifdef ASHIFT_DEBUG
+ print_roi(roi_in, "roi_in (going into modify_roi_out)");
+ print_roi(roi_out, "roi_out (after modify_roi_out)");
+#endif
+}
+
+void modify_roi_in(struct dt_iop_module_t *self, struct dt_dev_pixelpipe_iop_t *piece,
+ const dt_iop_roi_t *const roi_out, dt_iop_roi_t *roi_in)
+{
+ dt_iop_ashift_data_t *data = (dt_iop_ashift_data_t *)piece->data;
+ *roi_in = *roi_out;
+
+ // nothing more to be done if parameters are set to neutral values
+ if(isneutral(data)) return;
+
+ float ihomograph[3][3];
+ homography((float *)ihomograph, data->rotation, data->lensshift_v, data->lensshift_h, data->shear, data->f_length_kb,
+ data->orthocorr, data->aspect, piece->buf_in.width, piece->buf_in.height, ASHIFT_HOMOGRAPH_INVERTED);
+
+ const float orig_w = roi_in->scale * piece->buf_in.width;
+ const float orig_h = roi_in->scale * piece->buf_in.height;
+
+ // clipping offset
+ const float fullwidth = (float)piece->buf_out.width / (data->cr - data->cl);
+ const float fullheight = (float)piece->buf_out.height / (data->cb - data->ct);
+ const float cx = roi_out->scale * fullwidth * data->cl;
+ const float cy = roi_out->scale * fullheight * data->ct;
+
+ float xm = FLT_MAX, xM = -FLT_MAX, ym = FLT_MAX, yM = -FLT_MAX;
+
+ // go through all four vertices of output roi and convert coordinates to input
+ for(int y = 0; y < roi_out->height; y += roi_out->height - 1)
+ {
+ for(int x = 0; x < roi_out->width; x += roi_out->width - 1)
+ {
+ float pin[3], pout[3];
+
+ // convert from output image coordinates to original image coordinates
+ pout[0] = roi_out->x + x + cx;
+ pout[1] = roi_out->y + y + cy;
+ pout[0] /= roi_out->scale;
+ pout[1] /= roi_out->scale;
+ pout[2] = 1.0f;
+
+ // apply homograph
+ mat3mulv(pin, (float *)ihomograph, pout);
+
+ // convert to input image coordinates
+ pin[0] /= pin[2];
+ pin[1] /= pin[2];
+ pin[0] *= roi_in->scale;
+ pin[1] *= roi_in->scale;
+ xm = MIN(xm, pin[0]);
+ xM = MAX(xM, pin[0]);
+ ym = MIN(ym, pin[1]);
+ yM = MAX(yM, pin[1]);
+ }
+ }
+
+ const struct dt_interpolation *interpolation = dt_interpolation_new(DT_INTERPOLATION_USERPREF);
+ roi_in->x = fmaxf(0.0f, xm - interpolation->width);
+ roi_in->y = fmaxf(0.0f, ym - interpolation->width);
+ roi_in->width = fminf(ceilf(orig_w) - roi_in->x, xM - roi_in->x + 1 + interpolation->width);
+ roi_in->height = fminf(ceilf(orig_h) - roi_in->y, yM - roi_in->y + 1 + interpolation->width);
+
+ // sanity check.
+ roi_in->x = CLAMP(roi_in->x, 0, (int)floorf(orig_w));
+ roi_in->y = CLAMP(roi_in->y, 0, (int)floorf(orig_h));
+ roi_in->width = CLAMP(roi_in->width, 1, (int)floorf(orig_w) - roi_in->x);
+ roi_in->height = CLAMP(roi_in->height, 1, (int)floorf(orig_h) - roi_in->y);
+#ifdef ASHIFT_DEBUG
+ print_roi(roi_out, "roi_out (going into modify_roi_in)");
+ print_roi(roi_in, "roi_in (after modify_roi_in)");
+#endif
+}
+#endif // if 0
+//-----------------------------------------------------------------------------
+
+// simple conversion of rgb image into greyscale variant suitable for line segment detection
+// the lsd routines expect input as *double, roughly in the range [0.0; 256.0]
+static void rgb2grey256(const float *in, double *out, const int width, const int height)
+{
+ const int ch = 4;
+
+#ifdef _OPENMP
+#pragma omp parallel for schedule(static) shared(in, out)
+#endif
+ for(int j = 0; j < height; j++)
+ {
+ const float *inp = in + (size_t)ch * j * width;
+ double *outp = out + (size_t)j * width;
+ for(int i = 0; i < width; i++, inp += ch, outp++)
+ {
+ *outp = (0.3f * inp[0] + 0.59f * inp[1] + 0.11f * inp[2]) * 256.0;
+ }
+ }
+}
+
+// sobel edge enhancement in one direction
+static void edge_enhance_1d(const double *in, double *out, const int width, const int height,
+ dt_iop_ashift_enhance_t dir)
+{
+ // Sobel kernels for both directions
+ const double hkernel[3][3] = { { 1.0, 0.0, -1.0 }, { 2.0, 0.0, -2.0 }, { 1.0, 0.0, -1.0 } };
+ const double vkernel[3][3] = { { 1.0, 2.0, 1.0 }, { 0.0, 0.0, 0.0 }, { -1.0, -2.0, -1.0 } };
+ const int kwidth = 3;
+ const int khwidth = kwidth / 2;
+
+ // select kernel
+ const double *kernel = (dir == ASHIFT_ENHANCE_HORIZONTAL) ? (const double *)hkernel : (const double *)vkernel;
+
+#ifdef _OPENMP
+#pragma omp parallel for schedule(static) shared(in, out, kernel)
+#endif
+ // loop over image pixels and perform sobel convolution
+ for(int j = khwidth; j < height - khwidth; j++)
+ {
+ const double *inp = in + (size_t)j * width + khwidth;
+ double *outp = out + (size_t)j * width + khwidth;
+ for(int i = khwidth; i < width - khwidth; i++, inp++, outp++)
+ {
+ double sum = 0.0f;
+ for(int jj = 0; jj < kwidth; jj++)
+ {
+ const int k = jj * kwidth;
+ const int l = (jj - khwidth) * width;
+ for(int ii = 0; ii < kwidth; ii++)
+ {
+ sum += inp[l + ii - khwidth] * kernel[k + ii];
+ }
+ }
+ *outp = sum;
+ }
+ }
+
+#ifdef _OPENMP
+#pragma omp parallel for schedule(static) shared(out)
+#endif
+ // border fill in output buffer, so we don't get pseudo lines at image frame
+ for(int j = 0; j < height; j++)
+ for(int i = 0; i < width; i++)
+ {
+ double val = out[j * width + i];
+
+ if(j < khwidth)
+ val = out[(khwidth - j) * width + i];
+ else if(j >= height - khwidth)
+ val = out[(j - khwidth) * width + i];
+ else if(i < khwidth)
+ val = out[j * width + (khwidth - i)];
+ else if(i >= width - khwidth)
+ val = out[j * width + (i - khwidth)];
+
+ out[j * width + i] = val;
+
+ // jump over center of image
+ if(i == khwidth && j >= khwidth && j < height - khwidth) i = width - khwidth;
+ }
+}
+
+// edge enhancement in both directions
+static int edge_enhance(const double *in, double *out, const int width, const int height)
+{
+ double *Gx = NULL;
+ double *Gy = NULL;
+
+ Gx = (double *)malloc((size_t)width * height * sizeof(double));
+ if(Gx == NULL) goto error;
+
+ Gy = (double *)malloc((size_t)width * height * sizeof(double));
+ if(Gy == NULL) goto error;
+
+ // perform edge enhancement in both directions
+ edge_enhance_1d(in, Gx, width, height, ASHIFT_ENHANCE_HORIZONTAL);
+ edge_enhance_1d(in, Gy, width, height, ASHIFT_ENHANCE_VERTICAL);
+
+// calculate absolute values
+#ifdef _OPENMP
+#pragma omp parallel for schedule(static) shared(Gx, Gy, out)
+#endif
+ for(size_t k = 0; k < (size_t)width * height; k++)
+ {
+ out[k] = sqrt(Gx[k] * Gx[k] + Gy[k] * Gy[k]);
+ }
+
+ free(Gx);
+ free(Gy);
+ return TRUE;
+
+error:
+ if(Gx) free(Gx);
+ if(Gy) free(Gy);
+ return FALSE;
+}
+
+//-----------------------------------------------------------------------------
+// RT: BEGIN COMMENT
+#if 0
+// XYZ -> sRGB matrix
+static void XYZ_to_sRGB(const float *XYZ, float *sRGB)
+{
+ sRGB[0] = 3.1338561f * XYZ[0] - 1.6168667f * XYZ[1] - 0.4906146f * XYZ[2];
+ sRGB[1] = -0.9787684f * XYZ[0] + 1.9161415f * XYZ[1] + 0.0334540f * XYZ[2];
+ sRGB[2] = 0.0719453f * XYZ[0] - 0.2289914f * XYZ[1] + 1.4052427f * XYZ[2];
+}
+
+// sRGB -> XYZ matrix
+static void sRGB_to_XYZ(const float *sRGB, float *XYZ)
+{
+ XYZ[0] = 0.4360747f * sRGB[0] + 0.3850649f * sRGB[1] + 0.1430804f * sRGB[2];
+ XYZ[1] = 0.2225045f * sRGB[0] + 0.7168786f * sRGB[1] + 0.0606169f * sRGB[2];
+ XYZ[2] = 0.0139322f * sRGB[0] + 0.0971045f * sRGB[1] + 0.7141733f * sRGB[2];
+}
+#endif // if 0
+//-----------------------------------------------------------------------------
+
+// detail enhancement via bilateral grid (function arguments in and out may represent identical buffers)
+static int detail_enhance(const float *in, float *out, const int width, const int height)
+{
+ return TRUE;
+//-----------------------------------------------------------------------------
+// RT: BEGIN COMMENT
+#if 0
+ const float sigma_r = 5.0f;
+ const float sigma_s = fminf(width, height) * 0.02f;
+ const float detail = 10.0f;
+
+ int success = TRUE;
+
+ // we need to convert from RGB to Lab first;
+ // as colors don't matter we are safe to assume data to be sRGB
+
+ // convert RGB input to Lab, use output buffer for intermediate storage
+#ifdef _OPENMP
+#pragma omp parallel for schedule(static) shared(in, out)
+#endif
+ for(int j = 0; j < height; j++)
+ {
+ const float *inp = in + (size_t)4 * j * width;
+ float *outp = out + (size_t)4 * j * width;
+ for(int i = 0; i < width; i++, inp += 4, outp += 4)
+ {
+ float XYZ[3];
+ sRGB_to_XYZ(inp, XYZ);
+ dt_XYZ_to_Lab(XYZ, outp);
+ }
+ }
+
+ // bilateral grid detail enhancement
+ dt_bilateral_t *b = dt_bilateral_init(width, height, sigma_s, sigma_r);
+
+ if(b != NULL)
+ {
+ dt_bilateral_splat(b, out);
+ dt_bilateral_blur(b);
+ dt_bilateral_slice_to_output(b, out, out, detail);
+ dt_bilateral_free(b);
+ }
+ else
+ success = FALSE;
+
+ // convert resulting Lab to RGB output
+#ifdef _OPENMP
+#pragma omp parallel for schedule(static) shared(out)
+#endif
+ for(int j = 0; j < height; j++)
+ {
+ float *outp = out + (size_t)4 * j * width;
+ for(int i = 0; i < width; i++, outp += 4)
+ {
+ float XYZ[3];
+ dt_Lab_to_XYZ(outp, XYZ);
+ XYZ_to_sRGB(XYZ, outp);
+ }
+ }
+
+ return success;
+#endif // if 0
+//-----------------------------------------------------------------------------
+}
+
+// apply gamma correction to RGB buffer (function arguments in and out may represent identical buffers)
+static void gamma_correct(const float *in, float *out, const int width, const int height)
+{
+#ifdef _OPENMP
+#pragma omp parallel for schedule(static) shared(in, out)
+#endif
+ for(int j = 0; j < height; j++)
+ {
+ const float *inp = in + (size_t)4 * j * width;
+ float *outp = out + (size_t)4 * j * width;
+ for(int i = 0; i < width; i++, inp += 4, outp += 4)
+ {
+ for(int c = 0; c < 3; c++)
+ outp[c] = powf(inp[c], LSD_GAMMA);
+ }
+ }
+}
+
+// do actual line_detection based on LSD algorithm and return results according
+// to this module's conventions
+static int line_detect(float *in, const int width, const int height, const int x_off, const int y_off,
+ const float scale, dt_iop_ashift_line_t **alines, int *lcount, int *vcount, int *hcount,
+ float *vweight, float *hweight, dt_iop_ashift_enhance_t enhance, const int is_raw)
+{
+ double *greyscale = NULL;
+ double *lsd_lines = NULL;
+ dt_iop_ashift_line_t *ashift_lines = NULL;
+
+ int vertical_count = 0;
+ int horizontal_count = 0;
+ float vertical_weight = 0.0f;
+ float horizontal_weight = 0.0f;
+ //
+ int lines_count;
+ // we count the lines that we really want to use
+ int lct = 0;
+
+ // apply gamma correction if image is raw
+ if(is_raw)
+ {
+ gamma_correct(in, in, width, height);
+ }
+
+ // if requested perform an additional detail enhancement step
+ if(enhance & ASHIFT_ENHANCE_DETAIL)
+ {
+ (void)detail_enhance(in, in, width, height);
+ }
+
+ // allocate intermediate buffers
+ greyscale = (double *)malloc((size_t)width * height * sizeof(double));
+ if(greyscale == NULL) goto error;
+
+ // convert to greyscale image
+ rgb2grey256(in, greyscale, width, height);
+
+ // if requested perform an additional edge enhancement step
+ if(enhance & ASHIFT_ENHANCE_EDGES)
+ {
+ (void)edge_enhance(greyscale, greyscale, width, height);
+ }
+
+ // call the line segment detector LSD;
+ // LSD stores the number of found lines in lines_count.
+ // it returns structural details as vector 'double lines[7 * lines_count]'
+ lsd_lines = LineSegmentDetection(&lines_count, greyscale, width, height,
+ LSD_SCALE, LSD_SIGMA_SCALE, LSD_QUANT,
+ LSD_ANG_TH, LSD_LOG_EPS, LSD_DENSITY_TH,
+ LSD_N_BINS, NULL, NULL, NULL);
+
+ if(lines_count > 0)
+ {
+ // aggregate lines data into our own structures
+ ashift_lines = (dt_iop_ashift_line_t *)malloc((size_t)lines_count * sizeof(dt_iop_ashift_line_t));
+ if(ashift_lines == NULL) goto error;
+
+ for(int n = 0; n < lines_count; n++)
+ {
+ float x1 = lsd_lines[n * 7 + 0];
+ float y1 = lsd_lines[n * 7 + 1];
+ float x2 = lsd_lines[n * 7 + 2];
+ float y2 = lsd_lines[n * 7 + 3];
+
+ // check for lines running along image borders and skip them.
+ // these would likely be false-positives which could result
+ // from any kind of processing artifacts
+ if((fabs(x1 - x2) < 1 && fmax(x1, x2) < 2) ||
+ (fabs(x1 - x2) < 1 && fmin(x1, x2) > width - 3) ||
+ (fabs(y1 - y2) < 1 && fmax(y1, y2) < 2) ||
+ (fabs(y1 - y2) < 1 && fmin(y1, y2) > height - 3))
+ continue;
+
+ // line position in absolute coordinates
+ float px1 = x_off + x1;
+ float py1 = y_off + y1;
+ float px2 = x_off + x2;
+ float py2 = y_off + y2;
+
+ // scale back to input buffer
+ px1 /= scale;
+ py1 /= scale;
+ px2 /= scale;
+ py2 /= scale;
+
+ // store as homogeneous coordinates
+ ashift_lines[lct].p1[0] = px1;
+ ashift_lines[lct].p1[1] = py1;
+ ashift_lines[lct].p1[2] = 1.0f;
+ ashift_lines[lct].p2[0] = px2;
+ ashift_lines[lct].p2[1] = py2;
+ ashift_lines[lct].p2[2] = 1.0f;
+
+ // calculate homogeneous coordinates of connecting line (defined by the two points)
+ vec3prodn(ashift_lines[lct].L, ashift_lines[lct].p1, ashift_lines[lct].p2);
+
+ // normalaze line coordinates so that x^2 + y^2 = 1
+ // (this will always succeed as L is a real line connecting two real points)
+ vec3lnorm(ashift_lines[lct].L, ashift_lines[lct].L);
+
+ // length and width of rectangle (see LSD)
+ ashift_lines[lct].length = sqrt((px2 - px1) * (px2 - px1) + (py2 - py1) * (py2 - py1));
+ ashift_lines[lct].width = lsd_lines[n * 7 + 4] / scale;
+
+ // ... and weight (= angle precision * length * width)
+ const float weight = lsd_lines[n * 7 + 5] * ashift_lines[lct].length * ashift_lines[lct].width;
+ ashift_lines[lct].weight = weight;
+
+
+ const float angle = atan2(py2 - py1, px2 - px1) / M_PI * 180.0f;
+ const int vertical = fabs(fabs(angle) - 90.0f) < MAX_TANGENTIAL_DEVIATION ? 1 : 0;
+ const int horizontal = fabs(fabs(fabs(angle) - 90.0f) - 90.0f) < MAX_TANGENTIAL_DEVIATION ? 1 : 0;
+
+ const int relevant = ashift_lines[lct].length > MIN_LINE_LENGTH ? 1 : 0;
+
+ // register type of line
+ dt_iop_ashift_linetype_t type = ASHIFT_LINE_IRRELEVANT;
+ if(vertical && relevant)
+ {
+ type = ASHIFT_LINE_VERTICAL_SELECTED;
+ vertical_count++;
+ vertical_weight += weight;
+ }
+ else if(horizontal && relevant)
+ {
+ type = ASHIFT_LINE_HORIZONTAL_SELECTED;
+ horizontal_count++;
+ horizontal_weight += weight;
+ }
+ ashift_lines[lct].type = type;
+
+ // the next valid line
+ lct++;
+ }
+ }
+#ifdef ASHIFT_DEBUG
+ printf("%d lines (vertical %d, horizontal %d, not relevant %d)\n", lines_count, vertical_count,
+ horizontal_count, lct - vertical_count - horizontal_count);
+ float xmin = FLT_MAX, xmax = FLT_MIN, ymin = FLT_MAX, ymax = FLT_MIN;
+ for(int n = 0; n < lct; n++)
+ {
+ xmin = fmin(xmin, fmin(ashift_lines[n].p1[0], ashift_lines[n].p2[0]));
+ xmax = fmax(xmax, fmax(ashift_lines[n].p1[0], ashift_lines[n].p2[0]));
+ ymin = fmin(ymin, fmin(ashift_lines[n].p1[1], ashift_lines[n].p2[1]));
+ ymax = fmax(ymax, fmax(ashift_lines[n].p1[1], ashift_lines[n].p2[1]));
+ printf("x1 %.0f, y1 %.0f, x2 %.0f, y2 %.0f, length %.0f, width %f, X %f, Y %f, Z %f, type %d, scalars %f %f\n",
+ ashift_lines[n].p1[0], ashift_lines[n].p1[1], ashift_lines[n].p2[0], ashift_lines[n].p2[1],
+ ashift_lines[n].length, ashift_lines[n].width,
+ ashift_lines[n].L[0], ashift_lines[n].L[1], ashift_lines[n].L[2], ashift_lines[n].type,
+ vec3scalar(ashift_lines[n].p1, ashift_lines[n].L),
+ vec3scalar(ashift_lines[n].p2, ashift_lines[n].L));
+ }
+ printf("xmin %.0f, xmax %.0f, ymin %.0f, ymax %.0f\n", xmin, xmax, ymin, ymax);
+#endif
+
+ // store results in provided locations
+ *lcount = lct;
+ *vcount = vertical_count;
+ *vweight = vertical_weight;
+ *hcount = horizontal_count;
+ *hweight = horizontal_weight;
+ *alines = ashift_lines;
+
+ // free intermediate buffers
+ free(lsd_lines);
+ free(greyscale);
+ return lct > 0 ? TRUE : FALSE;
+
+error:
+ free(lsd_lines);
+ free(greyscale);
+ return FALSE;
+}
+
+// get image from buffer, analyze for structure and save results
+static int get_structure(dt_iop_module_t *module, dt_iop_ashift_enhance_t enhance)
+{
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)module->gui_data;
+
+ float *buffer = NULL;
+ int width = 0;
+ int height = 0;
+ int x_off = 0;
+ int y_off = 0;
+ float scale = 0.0f;
+
+ { //dt_pthread_mutex_lock(&g->lock);
+ MyMutex::MyLock lock(g->lock);
+
+ // read buffer data if they are available
+ if(g->buf != NULL)
+ {
+ width = g->buf_width;
+ height = g->buf_height;
+ x_off = g->buf_x_off;
+ y_off = g->buf_y_off;
+ scale = g->buf_scale;
+
+ // create a temporary buffer to hold image data
+ buffer = (float *)malloc((size_t)width * height * 4 * sizeof(float));
+ if(buffer != NULL)
+ memcpy(buffer, g->buf, (size_t)width * height * 4 * sizeof(float));
+ }
+ } /* dt_pthread_mutex_unlock(&g->lock); */
+
+ if(buffer == NULL) goto error;
+
+ // get rid of old structural data
+ g->lines_count = 0;
+ g->vertical_count = 0;
+ g->horizontal_count = 0;
+ free(g->lines);
+ g->lines = NULL;
+
+ dt_iop_ashift_line_t *lines;
+ int lines_count;
+ int vertical_count;
+ int horizontal_count;
+ float vertical_weight;
+ float horizontal_weight;
+
+ // get new structural data
+ if(!line_detect(buffer, width, height, x_off, y_off, scale, &lines, &lines_count,
+ &vertical_count, &horizontal_count, &vertical_weight, &horizontal_weight,
+ enhance, module->is_raw))//dt_image_is_raw(&module->dev->image_storage)))
+ goto error;
+
+ // save new structural data
+ g->lines_in_width = width;
+ g->lines_in_height = height;
+ g->lines_x_off = x_off;
+ g->lines_y_off = y_off;
+ g->lines_count = lines_count;
+ g->vertical_count = vertical_count;
+ g->horizontal_count = horizontal_count;
+ g->vertical_weight = vertical_weight;
+ g->horizontal_weight = horizontal_weight;
+ g->lines_version++;
+ g->lines_suppressed = 0;
+ g->lines = lines;
+
+ free(buffer);
+ return TRUE;
+
+error:
+ free(buffer);
+ return FALSE;
+}
+
+
+// swap two integer values
+static inline void swap(int *a, int *b)
+{
+ int tmp = *a;
+ *a = *b;
+ *b = tmp;
+}
+
+// do complete permutations
+static int quickperm(int *a, int *p, const int N, int *i)
+{
+ if(*i >= N) return FALSE;
+
+ p[*i]--;
+ int j = (*i % 2 == 1) ? p[*i] : 0;
+ swap(&a[j], &a[*i]);
+ *i = 1;
+ while(p[*i] == 0)
+ {
+ p[*i] = *i;
+ (*i)++;
+ }
+ return TRUE;
+}
+
+// Fisher-Yates shuffle
+static void shuffle(int *a, const int N)
+{
+ for(int i = 0; i < N; i++)
+ {
+ int j = i + rand() % (N - i);
+ swap(&a[j], &a[i]);
+ }
+}
+
+// factorial function
+static int fact(const int n)
+{
+ return (n == 1 ? 1 : n * fact(n - 1));
+}
+
+// We use a pseudo-RANSAC algorithm to elminiate ouliers from our set of lines. The
+// original RANSAC works on linear optimization problems. Our model is nonlinear. We
+// take advantage of the fact that lines interesting for our model are vantage lines
+// that meet in one vantage point for each subset of lines (vertical/horizontal).
+// Stragegy: we construct a model by (random) sampling within the subset of lines and
+// calculate the vantage point. Then we check the "distance" of all other lines to the
+// vantage point. The model that gives highest number of lines combined with the highest
+// total weight and lowest overall "distance" wins.
+// Disadvantage: compared to the original RANSAC we don't get any model parameters that
+// we could use for the following NMS fit.
+// Self-tuning: we optimize "epsilon", the hurdle rate to reject a line as an outlier,
+// by a number of dry runs first. The target average percentage value of lines to eliminate as
+// outliers (without judging on the quality of the model) is given by RANSAC_ELIMINATION_RATIO,
+// note: the actual percentage of outliers removed in the final run will be lower because we
+// will finally look for the best quality model with the optimized epsilon and that quality value also
+// encloses the number of good lines
+static void ransac(const dt_iop_ashift_line_t *lines, int *index_set, int *inout_set,
+ const int set_count, const float total_weight, const int xmin, const int xmax,
+ const int ymin, const int ymax)
+{
+ if(set_count < 3) return;
+
+ const size_t set_size = set_count * sizeof(int);
+ int *best_set = (int *)malloc(set_size);
+ memcpy(best_set, index_set, set_size);
+ int *best_inout = (int *)calloc(1, set_size);
+
+ float best_quality = 0.0f;
+
+ // hurdle value epsilon for rejecting a line as an outlier will be self-tuning
+ // in a number of dry runs
+ float epsilon = pow(10.0f, -RANSAC_EPSILON);
+ float epsilon_step = RANSAC_EPSILON_STEP;
+ // some accounting variables for self-tuning
+ int lines_eliminated = 0;
+ int valid_runs = 0;
+
+ // number of runs to optimize epsilon
+ const int optiruns = RANSAC_OPTIMIZATION_STEPS * RANSAC_OPTIMIZATION_DRY_RUNS;
+ // go for complete permutations on small set sizes, else for random sample consensus
+ const int riter = (set_count > RANSAC_HURDLE) ? RANSAC_RUNS : fact(set_count);
+
+ // some data needed for quickperm
+ int *perm = (int *)malloc((set_count + 1) * sizeof(int));
+ for(int n = 0; n < set_count + 1; n++) perm[n] = n;
+ int piter = 1;
+
+ // inout holds good/bad qualification for each line
+ int *inout = (int *)malloc(set_size);
+
+ for(int r = 0; r < optiruns + riter; r++)
+ {
+ // get random or systematic variation of index set
+ if(set_count > RANSAC_HURDLE || r < optiruns)
+ shuffle(index_set, set_count);
+ else
+ (void)quickperm(index_set, perm, set_count, &piter);
+
+ // summed quality evaluation of this run
+ float quality = 0.0f;
+
+ // we build a model ouf of the first two lines
+ const float *L1 = lines[index_set[0]].L;
+ const float *L2 = lines[index_set[1]].L;
+
+ // get intersection point (ideally a vantage point)
+ float V[3];
+ vec3prodn(V, L1, L2);
+
+ // catch special cases:
+ // a) L1 and L2 are identical -> V is NULL -> no valid vantage point
+ // b) vantage point lies inside image frame (no chance to correct for this case)
+ if(vec3isnull(V) ||
+ (fabs(V[2]) > 0.0f &&
+ V[0]/V[2] >= xmin &&
+ V[1]/V[2] >= ymin &&
+ V[0]/V[2] <= xmax &&
+ V[1]/V[2] <= ymax))
+ {
+ // no valid model
+ quality = 0.0f;
+ }
+ else
+ {
+ // valid model
+
+ // normalize V so that x^2 + y^2 + z^2 = 1
+ vec3norm(V, V);
+
+ // the two lines constituting the model are part of the set
+ inout[0] = 1;
+ inout[1] = 1;
+
+ // go through all remaining lines, check if they are within the model, and
+ // mark that fact in inout[].
+ // summarize a quality parameter for all lines within the model
+ for(int n = 2; n < set_count; n++)
+ {
+ // L is normalized so that x^2 + y^2 = 1
+ const float *L3 = lines[index_set[n]].L;
+
+ // we take the absolute value of the dot product of V and L as a measure
+ // of the "distance" between point and line. Note that this is not the real euclidian
+ // distance but - with the given normalization - just a pragmatically selected number
+ // that goes to zero if V lies on L and increases the more V and L are apart
+ const float d = fabs(vec3scalar(V, L3));
+
+ // depending on d we either include or exclude the point from the set
+ inout[n] = (d < epsilon) ? 1 : 0;
+
+ float q;
+
+ if(inout[n] == 1)
+ {
+ // a quality parameter that depends 1/3 on the number of lines within the model,
+ // 1/3 on their weight, and 1/3 on their weighted distance d to the vantage point
+ q = 0.33f / (float)set_count
+ + 0.33f * lines[index_set[n]].weight / total_weight
+ + 0.33f * (1.0f - d / epsilon) * (float)set_count * lines[index_set[n]].weight / total_weight;
+ }
+ else
+ {
+ q = 0.0f;
+ lines_eliminated++;
+ }
+
+ quality += q;
+ }
+ valid_runs++;
+ }
+
+ if(r < optiruns)
+ {
+ // on last run of each self-tuning step
+ if((r % RANSAC_OPTIMIZATION_DRY_RUNS) == (RANSAC_OPTIMIZATION_DRY_RUNS - 1) && (valid_runs > 0))
+ {
+#ifdef ASHIFT_DEBUG
+ printf("ransac self-tuning (run %d): epsilon %f", r, epsilon);
+#endif
+ // average ratio of lines that we eliminated with the given epsilon
+ float ratio = 100.0f * (float)lines_eliminated / ((float)set_count * valid_runs);
+ // adjust epsilon accordingly
+ if(ratio < RANSAC_ELIMINATION_RATIO)
+ epsilon = pow(10.0f, log10(epsilon) - epsilon_step);
+ else if(ratio > RANSAC_ELIMINATION_RATIO)
+ epsilon = pow(10.0f, log10(epsilon) + epsilon_step);
+#ifdef ASHIFT_DEBUG
+ printf(" (elimination ratio %f) -> %f\n", ratio, epsilon);
+#endif
+ // reduce step-size for next optimization round
+ epsilon_step /= 2.0f;
+ lines_eliminated = 0;
+ valid_runs = 0;
+ }
+ }
+ else
+ {
+ // in the "real" runs check against the best model found so far
+ if(quality > best_quality)
+ {
+ memcpy(best_set, index_set, set_size);
+ memcpy(best_inout, inout, set_size);
+ best_quality = quality;
+ }
+ }
+
+#ifdef ASHIFT_DEBUG
+ // report some statistics
+ int count = 0, lastcount = 0;
+ for(int n = 0; n < set_count; n++) count += best_inout[n];
+ for(int n = 0; n < set_count; n++) lastcount += inout[n];
+ printf("ransac run %d: best qual %.6f, eps %.6f, line count %d of %d (this run: qual %.5f, count %d (%2f%%))\n", r,
+ best_quality, epsilon, count, set_count, quality, lastcount, 100.0f * lastcount / (float)set_count);
+#endif
+ }
+
+ // store back best set
+ memcpy(index_set, best_set, set_size);
+ memcpy(inout_set, best_inout, set_size);
+
+ free(inout);
+ free(perm);
+ free(best_inout);
+ free(best_set);
+}
+
+
+// try to clean up structural data by eliminating outliers and thereby increasing
+// the chance of a convergent fitting
+static int remove_outliers(dt_iop_module_t *module)
+{
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)module->gui_data;
+
+ const int width = g->lines_in_width;
+ const int height = g->lines_in_height;
+ const int xmin = g->lines_x_off;
+ const int ymin = g->lines_y_off;
+ const int xmax = xmin + width;
+ const int ymax = ymin + height;
+
+ // holds the index set of lines we want to work on
+ int *lines_set = (int *)malloc(g->lines_count * sizeof(int));
+ // holds the result of ransac
+ int *inout_set = (int *)malloc(g->lines_count * sizeof(int));
+
+ // some accounting variables
+ int vnb = 0, vcount = 0;
+ int hnb = 0, hcount = 0;
+
+ // just to be on the safe side
+ if(g->lines == NULL) goto error;
+
+ // generate index list for the vertical lines
+ for(int n = 0; n < g->lines_count; n++)
+ {
+ // is this a selected vertical line?
+ if((g->lines[n].type & ASHIFT_LINE_MASK) != ASHIFT_LINE_VERTICAL_SELECTED)
+ continue;
+
+ lines_set[vnb] = n;
+ inout_set[vnb] = 0;
+ vnb++;
+ }
+
+ // it only makes sense to call ransac if we have more than two lines
+ if(vnb > 2)
+ ransac(g->lines, lines_set, inout_set, vnb, g->vertical_weight,
+ xmin, xmax, ymin, ymax);
+
+ // adjust line selected flag according to the ransac results
+ for(int n = 0; n < vnb; n++)
+ {
+ const int m = lines_set[n];
+ if(inout_set[n] == 1)
+ {
+ g->lines[m].type |= ASHIFT_LINE_SELECTED;
+ vcount++;
+ }
+ else
+ g->lines[m].type &= ~ASHIFT_LINE_SELECTED;
+ }
+ // update number of vertical lines
+ g->vertical_count = vcount;
+ g->lines_version++;
+
+ // now generate index list for the horizontal lines
+ for(int n = 0; n < g->lines_count; n++)
+ {
+ // is this a selected horizontal line?
+ if((g->lines[n].type & ASHIFT_LINE_MASK) != ASHIFT_LINE_HORIZONTAL_SELECTED)
+ continue;
+
+ lines_set[hnb] = n;
+ inout_set[hnb] = 0;
+ hnb++;
+ }
+
+ // it only makes sense to call ransac if we have more than two lines
+ if(hnb > 2)
+ ransac(g->lines, lines_set, inout_set, hnb, g->horizontal_weight,
+ xmin, xmax, ymin, ymax);
+
+ // adjust line selected flag according to the ransac results
+ for(int n = 0; n < hnb; n++)
+ {
+ const int m = lines_set[n];
+ if(inout_set[n] == 1)
+ {
+ g->lines[m].type |= ASHIFT_LINE_SELECTED;
+ hcount++;
+ }
+ else
+ g->lines[m].type &= ~ASHIFT_LINE_SELECTED;
+ }
+ // update number of horizontal lines
+ g->horizontal_count = hcount;
+ g->lines_version++;
+
+ free(inout_set);
+ free(lines_set);
+
+ return TRUE;
+
+error:
+ free(inout_set);
+ free(lines_set);
+ return FALSE;
+}
+
+// utility function to map a variable in [min; max] to [-INF; + INF]
+static inline double logit(double x, double min, double max)
+{
+ const double eps = 1.0e-6;
+ // make sure p does not touch the borders of its definition area,
+ // not critical for data accuracy as logit() is only used on initial fit parameters
+ double p = CLAMP((x - min) / (max - min), eps, 1.0 - eps);
+
+ return (2.0 * atanh(2.0 * p - 1.0));
+}
+
+// inverted function to logit()
+static inline double ilogit(double L, double min, double max)
+{
+ double p = 0.5 * (1.0 + tanh(0.5 * L));
+
+ return (p * (max - min) + min);
+}
+
+// helper function for simplex() return quality parameter for the given model
+// strategy:
+// * generate homography matrix out of fixed parameters and fitting parameters
+// * apply homography to all end points of affected lines
+// * generate new line out of transformed end points
+// * calculate scalar product s of line with perpendicular axis
+// * sum over weighted s^2 values
+static double model_fitness(double *params, void *data)
+{
+ dt_iop_ashift_fit_params_t *fit = (dt_iop_ashift_fit_params_t *)data;
+
+ // just for convenience: get shorter names
+ dt_iop_ashift_line_t *lines = fit->lines;
+ const int lines_count = fit->lines_count;
+ const int width = fit->width;
+ const int height = fit->height;
+ const float f_length_kb = fit->f_length_kb;
+ const float orthocorr = fit->orthocorr;
+ const float aspect = fit->aspect;
+
+ float rotation = fit->rotation;
+ float lensshift_v = fit->lensshift_v;
+ float lensshift_h = fit->lensshift_h;
+ float shear = fit->shear;
+ float camera_pitch = fit->camera_pitch;
+ float camera_yaw = fit->camera_yaw;
+ float rotation_range = fit->rotation_range;
+ /*
+ float lensshift_v_range = fit->lensshift_v_range;
+ float lensshift_h_range = fit->lensshift_h_range;
+ float shear_range = fit->shear_range;
+ */
+ float camera_pitch_range = fit->camera_pitch_range;
+ float camera_yaw_range = fit->camera_yaw_range;
+
+ int pcount = 0;
+
+ // fill in fit parameters from params[]. Attention: order matters!!!
+ if(isnan(rotation))
+ {
+ rotation = ilogit(params[pcount], -rotation_range, rotation_range);
+ pcount++;
+ }
+
+ /*
+ if(isnan(lensshift_v))
+ {
+ lensshift_v = ilogit(params[pcount], -lensshift_v_range, lensshift_v_range);
+ pcount++;
+ }
+
+ if(isnan(lensshift_h))
+ {
+ lensshift_h = ilogit(params[pcount], -lensshift_h_range, lensshift_h_range);
+ pcount++;
+ }
+
+ if(isnan(shear))
+ {
+ shear = ilogit(params[pcount], -shear_range, shear_range);
+ pcount++;
+ }
+ */
+
+ if(isnan(camera_pitch))
+ {
+ camera_pitch = ilogit(params[pcount], -camera_pitch_range, camera_pitch_range);
+ pcount++;
+ }
+
+ if(isnan(camera_yaw))
+ {
+ camera_yaw = ilogit(params[pcount], -camera_yaw_range, camera_yaw_range);
+ pcount++;
+ }
+
+ assert(pcount == fit->params_count);
+
+ // the possible reference axes
+ const float Av[3] = { 1.0f, 0.0f, 0.0f };
+ const float Ah[3] = { 0.0f, 1.0f, 0.0f };
+
+ // generate homograph out of the parameters
+ float homograph[3][3];
+ homography((float *)homograph, rotation, lensshift_v, lensshift_h, shear, camera_pitch, camera_yaw, f_length_kb,
+ orthocorr, aspect, width, height, ASHIFT_HOMOGRAPH_FORWARD);
+
+ // accounting variables
+ double sumsq_v = 0.0;
+ double sumsq_h = 0.0;
+ double weight_v = 0.0;
+ double weight_h = 0.0;
+ int count_v = 0;
+ int count_h = 0;
+ int count = 0;
+
+ // iterate over all lines
+ for(int n = 0; n < lines_count; n++)
+ {
+ // check if this is a line which we must skip
+ if((lines[n].type & fit->linemask) != fit->linetype)
+ continue;
+
+ // the direction of this line (vertical?)
+ const int isvertical = lines[n].type & ASHIFT_LINE_DIRVERT;
+
+ // select the perpendicular reference axis
+ const float *A = isvertical ? Ah : Av;
+
+ // apply homographic transformation to the end points
+ float P1[3], P2[3];
+ mat3mulv(P1, (float *)homograph, lines[n].p1);
+ mat3mulv(P2, (float *)homograph, lines[n].p2);
+
+ // get line connecting the two points
+ float L[3];
+ vec3prodn(L, P1, P2);
+
+ // normalize L so that x^2 + y^2 = 1; makes sure that
+ // y^2 = 1 / (1 + m^2) and x^2 = m^2 / (1 + m^2) with m defining the slope of the line
+ vec3lnorm(L, L);
+
+ // get scalar product of line L with orthogonal axis A -> gives 0 if line is perpendicular
+ float s = vec3scalar(L, A);
+
+ // sum up weighted s^2 for both directions individually
+ sumsq_v += isvertical ? (double)s * s * lines[n].weight : 0.0;
+ weight_v += isvertical ? lines[n].weight : 0.0;
+ count_v += isvertical ? 1 : 0;
+ sumsq_h += !isvertical ? (double)s * s * lines[n].weight : 0.0;
+ weight_h += !isvertical ? lines[n].weight : 0.0;
+ count_h += !isvertical ? 1 : 0;
+ count++;
+ }
+
+ const double v = weight_v > 0.0f && count > 0 ? sumsq_v / weight_v * (float)count_v / count : 0.0;
+ const double h = weight_h > 0.0f && count > 0 ? sumsq_h / weight_h * (float)count_h / count : 0.0;
+
+ double sum = sqrt(1.0 - (1.0 - v) * (1.0 - h)) * 1.0e6;
+ //double sum = sqrt(v + h) * 1.0e6;
+
+#ifdef ASHIFT_DEBUG
+ /*
+ printf("fitness with rotation %f, lensshift_v %f, lensshift_h %f, shear %f -> lines %d, quality %10f\n",
+ rotation, lensshift_v, lensshift_h, shear, count, sum);
+ */
+ printf("fitness with rotation %f, camera_pitch %f, camera_yaw %f -> lines %d, quality %10f\n",
+ rotation, camera_pitch, camera_yaw, count, sum);
+#endif
+
+ return sum;
+}
+
+// setup all data structures for fitting and call NM simplex
+static dt_iop_ashift_nmsresult_t nmsfit(dt_iop_module_t *module, dt_iop_ashift_params_t *p, dt_iop_ashift_fitaxis_t dir, int min_line_count)
+{
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)module->gui_data;
+
+ if(!g->lines) return NMS_NOT_ENOUGH_LINES;
+ if(dir == ASHIFT_FIT_NONE) return NMS_SUCCESS;
+
+ double params[4];
+ int pcount = 0;
+ int enough_lines = TRUE;
+
+ // initialize fit parameters
+ dt_iop_ashift_fit_params_t fit;
+ fit.lines = g->lines;
+ fit.lines_count = g->lines_count;
+ fit.width = g->lines_in_width;
+ fit.height = g->lines_in_height;
+ fit.f_length_kb = (p->mode == ASHIFT_MODE_GENERIC) ? (float)DEFAULT_F_LENGTH : p->f_length * p->crop_factor;
+ fit.orthocorr = (p->mode == ASHIFT_MODE_GENERIC) ? 0.0f : p->orthocorr;
+ fit.aspect = (p->mode == ASHIFT_MODE_GENERIC) ? 1.0f : p->aspect;
+ fit.rotation = p->rotation;
+ fit.lensshift_v = p->lensshift_v;
+ fit.lensshift_h = p->lensshift_h;
+ fit.shear = p->shear;
+ fit.camera_pitch = p->camera_pitch;
+ fit.camera_yaw = p->camera_yaw;
+ fit.rotation_range = g->rotation_range;
+ fit.lensshift_v_range = g->lensshift_v_range;
+ fit.lensshift_h_range = g->lensshift_h_range;
+ fit.shear_range = g->shear_range;
+ fit.camera_pitch_range = g->camera_pitch_range;
+ fit.camera_yaw_range = g->camera_yaw_range;
+ fit.linetype = ASHIFT_LINE_RELEVANT | ASHIFT_LINE_SELECTED;
+ fit.linemask = ASHIFT_LINE_MASK;
+ fit.params_count = 0;
+ fit.weight = 0.0f;
+
+ // if the image is flipped and if we do not want to fit both lens shift
+ // directions or none at all, then we need to change direction
+ dt_iop_ashift_fitaxis_t mdir = dir;
+ if((mdir & ASHIFT_FIT_LENS_BOTH) != ASHIFT_FIT_LENS_BOTH &&
+ (mdir & ASHIFT_FIT_LENS_BOTH) != 0)
+ {
+ // flip all directions
+ mdir ^= g->isflipped ? ASHIFT_FIT_FLIP : 0;
+ // special case that needs to be corrected
+ mdir |= (mdir & ASHIFT_FIT_LINES_BOTH) == 0 ? ASHIFT_FIT_LINES_BOTH : 0;
+ }
+
+
+ // prepare fit structure and starting parameters for simplex fit.
+ // note: the sequence of parameters in params[] needs to match the
+ // respective order in dt_iop_ashift_fit_params_t. Parameters which are
+ // to be fittet are marked with NAN in the fit structure. Non-NAN
+ // parameters are assumed to be constant.
+ if(mdir & ASHIFT_FIT_ROTATION)
+ {
+ // we fit rotation
+ fit.params_count++;
+ params[pcount] = logit(0, -fit.rotation_range, fit.rotation_range);
+ pcount++;
+ fit.rotation = NAN;
+ }
+
+ /*
+ if(mdir & ASHIFT_FIT_LENS_VERT)
+ {
+ // we fit vertical lens shift
+ fit.params_count++;
+ params[pcount] = logit(fit.lensshift_v, -fit.lensshift_v_range, fit.lensshift_v_range);
+ pcount++;
+ fit.lensshift_v = NAN;
+ }
+
+ if(mdir & ASHIFT_FIT_LENS_HOR)
+ {
+ // we fit horizontal lens shift
+ fit.params_count++;
+ params[pcount] = logit(fit.lensshift_h, -fit.lensshift_h_range, fit.lensshift_h_range);
+ pcount++;
+ fit.lensshift_h = NAN;
+ }
+
+ if(mdir & ASHIFT_FIT_SHEAR)
+ {
+ // we fit the shear parameter
+ fit.params_count++;
+ params[pcount] = logit(fit.shear, -fit.shear_range, fit.shear_range);
+ pcount++;
+ fit.shear = NAN;
+ }
+ */
+
+ if(mdir & ASHIFT_FIT_LENS_VERT)
+ {
+ // we fit pitch
+ fit.params_count++;
+ params[pcount] = logit(0, -fit.camera_pitch_range, fit.camera_pitch_range);
+ pcount++;
+ fit.camera_pitch = NAN;
+ }
+
+ if(mdir & ASHIFT_FIT_LENS_HOR)
+ {
+ // we fit yaw
+ fit.params_count++;
+ params[pcount] = logit(0, -fit.camera_yaw_range, fit.camera_yaw_range);
+ pcount++;
+ fit.camera_yaw = NAN;
+ }
+
+ if(mdir & ASHIFT_FIT_LINES_VERT)
+ {
+ // we use vertical lines for fitting
+ fit.linetype |= ASHIFT_LINE_DIRVERT;
+ fit.weight += g->vertical_weight;
+ enough_lines = enough_lines && (g->vertical_count >= min_line_count);
+ }
+
+ if(mdir & ASHIFT_FIT_LINES_HOR)
+ {
+ // we use horizontal lines for fitting
+ fit.linetype |= 0;
+ fit.weight += g->horizontal_weight;
+ enough_lines = enough_lines && (g->horizontal_count >= min_line_count);
+ }
+
+ // this needs to come after ASHIFT_FIT_LINES_VERT and ASHIFT_FIT_LINES_HOR
+ if((mdir & ASHIFT_FIT_LINES_BOTH) == ASHIFT_FIT_LINES_BOTH)
+ {
+ // if we use fitting in both directions we need to
+ // adjust fit.linetype and fit.linemask to match all selected lines
+ fit.linetype = ASHIFT_LINE_RELEVANT | ASHIFT_LINE_SELECTED;
+ fit.linemask = ASHIFT_LINE_RELEVANT | ASHIFT_LINE_SELECTED;
+ }
+
+ // error case: we do not run simplex if there are not enough lines
+ if(!enough_lines)
+ {
+#ifdef ASHIFT_DEBUG
+ printf("optimization not possible: insufficient number of lines\n");
+#endif
+ return NMS_NOT_ENOUGH_LINES;
+ }
+
+ // start the simplex fit
+ int iter = simplex(model_fitness, params, fit.params_count, NMS_EPSILON, NMS_SCALE, NMS_ITERATIONS, NULL, (void*)&fit);
+
+ // error case: the fit did not converge
+ if(iter >= NMS_ITERATIONS)
+ {
+#ifdef ASHIFT_DEBUG
+ printf("optimization not successful: maximum number of iterations reached (%d)\n", iter);
+#endif
+ return NMS_DID_NOT_CONVERGE;
+ }
+
+ // fit was successful: now consolidate the results (order matters!!!)
+ pcount = 0;
+ fit.rotation = isnan(fit.rotation) ? ilogit(params[pcount++], -fit.rotation_range, fit.rotation_range) : fit.rotation;
+ /*
+ fit.lensshift_v = isnan(fit.lensshift_v) ? ilogit(params[pcount++], -fit.lensshift_v_range, fit.lensshift_v_range) : fit.lensshift_v;
+ fit.lensshift_h = isnan(fit.lensshift_h) ? ilogit(params[pcount++], -fit.lensshift_h_range, fit.lensshift_h_range) : fit.lensshift_h;
+ fit.shear = isnan(fit.shear) ? ilogit(params[pcount++], -fit.shear_range, fit.shear_range) : fit.shear;
+ */
+ fit.camera_pitch = isnan(fit.camera_pitch) ? ilogit(params[pcount++], -fit.camera_pitch_range, fit.camera_pitch_range) : fit.camera_pitch;
+ fit.camera_yaw = isnan(fit.camera_yaw) ? ilogit(params[pcount++], -fit.camera_yaw_range, fit.camera_yaw_range) : fit.camera_yaw;
+#ifdef ASHIFT_DEBUG
+ /*
+ printf("params after optimization (%d iterations): rotation %f, lensshift_v %f, lensshift_h %f, shear %f\n",
+ iter, fit.rotation, fit.lensshift_v, fit.lensshift_h, fit.shear);
+ */
+ printf("params after optimization (%d iterations): rotation %f, camera_pitch %f, camera_yaw %f\n",
+ iter, fit.rotation, fit.camera_pitch, fit.camera_yaw);
+#endif
+
+ /*
+ // sanity check: in case of extreme values the image gets distorted so strongly that it spans an insanely huge area. we check that
+ // case and assume values that increase the image area by more than a factor of 4 as being insane.
+ float homograph[3][3];
+ homography((float *)homograph, fit.rotation, fit.lensshift_v, fit.lensshift_h, fit.shear, fit.f_length_kb,
+ fit.orthocorr, fit.aspect, fit.width, fit.height, ASHIFT_HOMOGRAPH_FORWARD);
+
+ // visit all four corners and find maximum span
+ float xm = FLT_MAX, xM = -FLT_MAX, ym = FLT_MAX, yM = -FLT_MAX;
+ for(int y = 0; y < fit.height; y += fit.height - 1)
+ for(int x = 0; x < fit.width; x += fit.width - 1)
+ {
+ float pi[3], po[3];
+ pi[0] = x;
+ pi[1] = y;
+ pi[2] = 1.0f;
+ mat3mulv(po, (float *)homograph, pi);
+ po[0] /= po[2];
+ po[1] /= po[2];
+ xm = fmin(xm, po[0]);
+ ym = fmin(ym, po[1]);
+ xM = fmax(xM, po[0]);
+ yM = fmax(yM, po[1]);
+ }
+
+ if((xM - xm) * (yM - ym) > 4.0f * fit.width * fit.height)
+ {
+#ifdef ASHIFT_DEBUG
+ printf("optimization not successful: degenerate case with area growth factor (%f) exceeding limits\n",
+ (xM - xm) * (yM - ym) / (fit.width * fit.height));
+#endif
+ return NMS_INSANE;
+ }
+ */
+
+ // now write the results into structure p
+ p->rotation = fit.rotation;
+ /*
+ p->lensshift_v = fit.lensshift_v;
+ p->lensshift_h = fit.lensshift_h;
+ p->shear = fit.shear;
+ */
+ p->camera_pitch = fit.camera_pitch;
+ p->camera_yaw = fit.camera_yaw;
+ return NMS_SUCCESS;
+}
+
+//-----------------------------------------------------------------------------
+// RT: BEGIN COMMENT
+#if 0
+#ifdef ASHIFT_DEBUG
+// only used in development phase. call model_fitness() with current parameters and
+// print some useful information
+static void model_probe(dt_iop_module_t *module, dt_iop_ashift_params_t *p, dt_iop_ashift_fitaxis_t dir)
+{
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)module->gui_data;
+
+ if(!g->lines) return;
+ if(dir == ASHIFT_FIT_NONE) return;
+
+ double params[4];
+ int enough_lines = TRUE;
+
+ // initialize fit parameters
+ dt_iop_ashift_fit_params_t fit;
+ fit.lines = g->lines;
+ fit.lines_count = g->lines_count;
+ fit.width = g->lines_in_width;
+ fit.height = g->lines_in_height;
+ fit.f_length_kb = (p->mode == ASHIFT_MODE_GENERIC) ? DEFAULT_F_LENGTH : p->f_length * p->crop_factor;
+ fit.orthocorr = (p->mode == ASHIFT_MODE_GENERIC) ? 0.0f : p->orthocorr;
+ fit.aspect = (p->mode == ASHIFT_MODE_GENERIC) ? 1.0f : p->aspect;
+ fit.rotation = p->rotation;
+ fit.lensshift_v = p->lensshift_v;
+ fit.lensshift_h = p->lensshift_h;
+ fit.shear = p->shear;
+ fit.linetype = ASHIFT_LINE_RELEVANT | ASHIFT_LINE_SELECTED;
+ fit.linemask = ASHIFT_LINE_MASK;
+ fit.params_count = 0;
+ fit.weight = 0.0f;
+
+ // if the image is flipped and if we do not want to fit both lens shift
+ // directions or none at all, then we need to change direction
+ dt_iop_ashift_fitaxis_t mdir = dir;
+ if((mdir & ASHIFT_FIT_LENS_BOTH) != ASHIFT_FIT_LENS_BOTH &&
+ (mdir & ASHIFT_FIT_LENS_BOTH) != 0)
+ {
+ // flip all directions
+ mdir ^= g->isflipped ? ASHIFT_FIT_FLIP : 0;
+ // special case that needs to be corrected
+ mdir |= (mdir & ASHIFT_FIT_LINES_BOTH) == 0 ? ASHIFT_FIT_LINES_BOTH : 0;
+ }
+
+ if(mdir & ASHIFT_FIT_LINES_VERT)
+ {
+ // we use vertical lines for fitting
+ fit.linetype |= ASHIFT_LINE_DIRVERT;
+ fit.weight += g->vertical_weight;
+ enough_lines = enough_lines && (g->vertical_count >= MINIMUM_FITLINES);
+ }
+
+ if(mdir & ASHIFT_FIT_LINES_HOR)
+ {
+ // we use horizontal lines for fitting
+ fit.linetype |= 0;
+ fit.weight += g->horizontal_weight;
+ enough_lines = enough_lines && (g->horizontal_count >= MINIMUM_FITLINES);
+ }
+
+ // this needs to come after ASHIFT_FIT_LINES_VERT and ASHIFT_FIT_LINES_HOR
+ if((mdir & ASHIFT_FIT_LINES_BOTH) == ASHIFT_FIT_LINES_BOTH)
+ {
+ // if we use fitting in both directions we need to
+ // adjust fit.linetype and fit.linemask to match all selected lines
+ fit.linetype = ASHIFT_LINE_RELEVANT | ASHIFT_LINE_SELECTED;
+ fit.linemask = ASHIFT_LINE_RELEVANT | ASHIFT_LINE_SELECTED;
+ }
+
+ double quality = model_fitness(params, (void *)&fit);
+
+ printf("model fitness: %.8f (rotation %f, lensshift_v %f, lensshift_h %f, shear %f)\n",
+ quality, p->rotation, p->lensshift_v, p->lensshift_h, p->shear);
+}
+#endif
+#endif // if 0
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// RT: BEGIN COMMENT (no crop support yet)
+//-----------------------------------------------------------------------------
+#if 0
+// function to keep crop fitting parameters within constraints
+static void crop_constraint(double *params, int pcount)
+{
+ if(pcount > 0) params[0] = fabs(params[0]);
+ if(pcount > 1) params[1] = fabs(params[1]);
+ if(pcount > 2) params[2] = fabs(params[2]);
+
+ if(pcount > 0 && params[0] > 1.0) params[0] = 1.0 - params[0];
+ if(pcount > 1 && params[1] > 1.0) params[1] = 1.0 - params[1];
+ if(pcount > 2 && params[2] > 0.5*M_PI) params[2] = 0.5*M_PI - params[2];
+}
+
+// helper function for getting the best fitting crop area;
+// returns the negative area of the largest rectangle that fits within the
+// defined image with a given rectangle's center and its aspect angle;
+// the trick: the rectangle center coordinates are given in the input
+// image coordinates so we know for sure that it also lies within the image after
+// conversion to the output coordinates
+static double crop_fitness(double *params, void *data)
+{
+ dt_iop_ashift_cropfit_params_t *cropfit = (dt_iop_ashift_cropfit_params_t *)data;
+
+ const float wd = cropfit->width;
+ const float ht = cropfit->height;
+
+ // get variable and constant parameters, respectively
+ const float x = isnan(cropfit->x) ? params[0] : cropfit->x;
+ const float y = isnan(cropfit->y) ? params[1] : cropfit->y;
+ const float alpha = isnan(cropfit->alpha) ? params[2] : cropfit->alpha;
+
+ // the center of the rectangle in input image coordinates
+ const float Pc[3] = { x * wd, y * ht, 1.0f };
+
+ // convert to the output image coordinates and normalize
+ float P[3];
+ mat3mulv(P, (float *)cropfit->homograph, Pc);
+ P[0] /= P[2];
+ P[1] /= P[2];
+ P[2] = 1.0f;
+
+ // two auxiliary points (some arbitrary distance away from P) to construct the diagonals
+ const float Pa[2][3] = { { P[0] + 10.0f * cos(alpha), P[1] + 10.0f * sin(alpha), 1.0f },
+ { P[0] + 10.0f * cos(alpha), P[1] - 10.0f * sin(alpha), 1.0f } };
+
+ // the two diagonals: D = P x Pa
+ float D[2][3];
+ vec3prodn(D[0], P, Pa[0]);
+ vec3prodn(D[1], P, Pa[1]);
+
+ // find all intersection points of all four edges with both diagonals (I = E x D);
+ // the shortest distance d2min of the intersection point I to the crop area center P determines
+ // the size of the crop area that still fits into the image (for the given center and aspect angle)
+ float d2min = FLT_MAX;
+ for(int k = 0; k < 4; k++)
+ for(int l = 0; l < 2; l++)
+ {
+ // the intersection point
+ float I[3];
+ vec3prodn(I, cropfit->edges[k], D[l]);
+
+ // special case: I is all null -> E and D are identical -> P lies on E -> d2min = 0
+ if(vec3isnull(I))
+ {
+ d2min = 0.0f;
+ break;
+ }
+
+ // special case: I[2] is 0.0f -> E and D are parallel and intersect at infinity -> no relevant point
+ if(I[2] == 0.0f)
+ continue;
+
+ // the default case -> normalize I
+ I[0] /= I[2];
+ I[1] /= I[2];
+
+ // calculate distance from I to P
+ const float d2 = SQR(P[0] - I[0]) + SQR(P[1] - I[1]);
+
+ // the minimum distance over all intersection points
+ d2min = MIN(d2min, d2);
+ }
+
+ // calculate the area of the rectangle
+ const float A = 2.0f * d2min * sin(2.0f * alpha);
+
+#ifdef ASHIFT_DEBUG
+ printf("crop fitness with x %f, y %f, angle %f -> distance %f, area %f\n",
+ x, y, alpha, d2min, A);
+#endif
+ // and return -A to allow Nelder-Mead simplex to search for the minimum
+ return -A;
+}
+#endif // if 0
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// RT: BEGIN COMMENT
+#if 0
+// strategy: for a given center of the crop area and a specific aspect angle
+// we calculate the largest crop area that still lies within the output image;
+// now we allow a Nelder-Mead simplex to search for the center coordinates
+// (and optionally the aspect angle) that delivers the largest overall crop area.
+static void do_crop(dt_iop_module_t *module, dt_iop_ashift_params_t *p)
+{
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)module->gui_data;
+
+ // skip if fitting is still running
+ if(g->fitting) return;
+
+ // reset fit margins if auto-cropping is off
+ if(p->cropmode == ASHIFT_CROP_OFF)
+ {
+ p->cl = 0.0f;
+ p->cr = 1.0f;
+ p->ct = 0.0f;
+ p->cb = 1.0f;
+ return;
+ }
+
+ g->fitting = 1;
+
+ double params[3];
+ int pcount;
+
+ // get parameters for the homograph
+ const float f_length_kb = (p->mode == ASHIFT_MODE_GENERIC) ? DEFAULT_F_LENGTH : p->f_length * p->crop_factor;
+ const float orthocorr = (p->mode == ASHIFT_MODE_GENERIC) ? 0.0f : p->orthocorr;
+ const float aspect = (p->mode == ASHIFT_MODE_GENERIC) ? 1.0f : p->aspect;
+ const float rotation = p->rotation;
+ const float lensshift_v = p->lensshift_v;
+ const float lensshift_h = p->lensshift_h;
+ const float shear = p->shear;
+
+ // prepare structure of constant parameters
+ dt_iop_ashift_cropfit_params_t cropfit;
+ cropfit.width = g->buf_width;
+ cropfit.height = g->buf_height;
+ homography((float *)cropfit.homograph, rotation, lensshift_v, lensshift_h, shear, f_length_kb,
+ orthocorr, aspect, cropfit.width, cropfit.height, ASHIFT_HOMOGRAPH_FORWARD);
+
+ const float wd = cropfit.width;
+ const float ht = cropfit.height;
+
+ // the four vertices of the image in input image coordinates
+ const float Vc[4][3] = { { 0.0f, 0.0f, 1.0f },
+ { 0.0f, ht, 1.0f },
+ { wd, ht, 1.0f },
+ { wd, 0.0f, 1.0f } };
+
+ // convert the vertices to output image coordinates
+ float V[4][3];
+ for(int n = 0; n < 4; n++)
+ mat3mulv(V[n], (float *)cropfit.homograph, Vc[n]);
+
+ // get width and height of output image for later use
+ float xmin = FLT_MAX, ymin = FLT_MAX, xmax = FLT_MIN, ymax = FLT_MIN;
+ for(int n = 0; n < 4; n++)
+ {
+ // normalize V
+ V[n][0] /= V[n][2];
+ V[n][1] /= V[n][2];
+ V[n][2] = 1.0f;
+ xmin = MIN(xmin, V[n][0]);
+ xmax = MAX(xmax, V[n][0]);
+ ymin = MIN(ymin, V[n][1]);
+ ymax = MAX(ymax, V[n][1]);
+ }
+ const float owd = xmax - xmin;
+ const float oht = ymax - ymin;
+
+ // calculate the lines defining the four edges of the image area: E = V[n] x V[n+1]
+ for(int n = 0; n < 4; n++)
+ vec3prodn(cropfit.edges[n], V[n], V[(n + 1) % 4]);
+
+ // initial fit parameters: crop area is centered and aspect angle is that of the original image
+ // number of parameters: fit only crop center coordinates with a fixed aspect ratio, or fit all three variables
+ if(p->cropmode == ASHIFT_CROP_LARGEST)
+ {
+ params[0] = 0.5;
+ params[1] = 0.5;
+ params[2] = atan2((float)cropfit.height, (float)cropfit.width);
+ cropfit.x = NAN;
+ cropfit.y = NAN;
+ cropfit.alpha = NAN;
+ pcount = 3;
+ }
+ else //(p->cropmode == ASHIFT_CROP_ASPECT)
+ {
+ params[0] = 0.5;
+ params[1] = 0.5;
+ cropfit.x = NAN;
+ cropfit.y = NAN;
+ cropfit.alpha = atan2((float)cropfit.height, (float)cropfit.width);
+ pcount = 2;
+ }
+
+ // start the simplex fit
+ const int iter = simplex(crop_fitness, params, pcount, NMS_CROP_EPSILON, NMS_CROP_SCALE, NMS_CROP_ITERATIONS,
+ crop_constraint, (void*)&cropfit);
+
+ float A; // RT
+ float d; // RT
+ float Pc[3] = { 0.f, 0.f, 1.f }; // RT
+
+ // in case the fit did not converge -> failed
+ if(iter >= NMS_CROP_ITERATIONS) goto failed;
+
+ // the fit did converge -> get clipping margins out of params:
+ cropfit.x = isnan(cropfit.x) ? params[0] : cropfit.x;
+ cropfit.y = isnan(cropfit.y) ? params[1] : cropfit.y;
+ cropfit.alpha = isnan(cropfit.alpha) ? params[2] : cropfit.alpha;
+
+ // the area of the best fitting rectangle
+ /*RT const float*/ A = fabs(crop_fitness(params, (void*)&cropfit));
+
+ // unlikely to happen but we need to catch this case
+ if(A == 0.0f) goto failed;
+
+ // we need the half diagonal of that rectangle (this is in output image dimensions);
+ // no need to check for division by zero here as this case implies A == 0.0f, caught above
+ /*RT const float*/ d = sqrt(A / (2.0f * sin(2.0f * cropfit.alpha)));
+
+ // the rectangle's center in input image (homogeneous) coordinates
+ // RT const float Pc[3] = { cropfit.x * wd, cropfit.y * ht, 1.0f };
+ Pc[0] = cropfit.x * wd; // RT
+ Pc[1] = cropfit.y * ht; // RT
+
+ // convert rectangle center to output image coordinates and normalize
+ float P[3];
+ mat3mulv(P, (float *)cropfit.homograph, Pc);
+ P[0] /= P[2];
+ P[1] /= P[2];
+
+ // calculate clipping margins relative to output image dimensions
+ p->cl = CLAMP((P[0] - d * cos(cropfit.alpha)) / owd, 0.0f, 1.0f);
+ p->cr = CLAMP((P[0] + d * cos(cropfit.alpha)) / owd, 0.0f, 1.0f);
+ p->ct = CLAMP((P[1] - d * sin(cropfit.alpha)) / oht, 0.0f, 1.0f);
+ p->cb = CLAMP((P[1] + d * sin(cropfit.alpha)) / oht, 0.0f, 1.0f);
+
+ // final sanity check
+ if(p->cr - p->cl <= 0.0f || p->cb - p->ct <= 0.0f) goto failed;
+
+ g->fitting = 0;
+
+#ifdef ASHIFT_DEBUG
+ printf("margins after crop fitting: iter %d, x %f, y %f, angle %f, crop area (%f %f %f %f), width %f, height %f\n",
+ iter, cropfit.x, cropfit.y, cropfit.alpha, p->cl, p->cr, p->ct, p->cb, wd, ht);
+#endif
+//-----------------------------------------------------------------------------
+// RT: BEGIN COMMENT
+#if 0
+ dt_control_queue_redraw_center();
+#endif // if 0
+//-----------------------------------------------------------------------------
+
+ return;
+
+failed:
+ // in case of failure: reset clipping margins, set "automatic cropping" parameter
+ // to "off" state, and display warning message
+ p->cl = 0.0f;
+ p->cr = 1.0f;
+ p->ct = 0.0f;
+ p->cb = 1.0f;
+ p->cropmode = ASHIFT_CROP_OFF;
+//-----------------------------------------------------------------------------
+// RT: BEGIN COMMENT
+#if 0
+ dt_bauhaus_combobox_set(g->cropmode, p->cropmode);
+#endif // if 0
+//-----------------------------------------------------------------------------
+ g->fitting = 0;
+ dt_control_log(_("automatic cropping failed"));
+ return;
+}
+#endif // if 0
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// RT: BEGIN COMMENT (no crop support yet)
+//-----------------------------------------------------------------------------
+#if 0
+// manually adjust crop area by shifting its center
+static void crop_adjust(dt_iop_module_t *module, dt_iop_ashift_params_t *p, const float newx, const float newy)
+{
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)module->gui_data;
+
+ // skip if fitting is still running
+ if(g->fitting) return;
+
+ // get parameters for the homograph
+ const float f_length_kb = (p->mode == ASHIFT_MODE_GENERIC) ? DEFAULT_F_LENGTH : p->f_length * p->crop_factor;
+ const float orthocorr = (p->mode == ASHIFT_MODE_GENERIC) ? 0.0f : p->orthocorr;
+ const float aspect = (p->mode == ASHIFT_MODE_GENERIC) ? 1.0f : p->aspect;
+ const float rotation = p->rotation;
+ const float lensshift_v = p->lensshift_v;
+ const float lensshift_h = p->lensshift_h;
+ const float shear = p->shear;
+
+ const float wd = g->buf_width;
+ const float ht = g->buf_height;
+
+ const float alpha = atan2(ht, wd);
+
+ float homograph[3][3];
+ homography((float *)homograph, rotation, lensshift_v, lensshift_h, shear, f_length_kb,
+ orthocorr, aspect, wd, ht, ASHIFT_HOMOGRAPH_FORWARD);
+
+ // the four vertices of the image in input image coordinates
+ const float Vc[4][3] = { { 0.0f, 0.0f, 1.0f },
+ { 0.0f, ht, 1.0f },
+ { wd, ht, 1.0f },
+ { wd, 0.0f, 1.0f } };
+
+ // convert the vertices to output image coordinates
+ float V[4][3];
+ for(int n = 0; n < 4; n++)
+ mat3mulv(V[n], (float *)homograph, Vc[n]);
+
+ // get width and height of output image
+ float xmin = FLT_MAX, ymin = FLT_MAX, xmax = FLT_MIN, ymax = FLT_MIN;
+ for(int n = 0; n < 4; n++)
+ {
+ // normalize V
+ V[n][0] /= V[n][2];
+ V[n][1] /= V[n][2];
+ V[n][2] = 1.0f;
+ xmin = MIN(xmin, V[n][0]);
+ xmax = MAX(xmax, V[n][0]);
+ ymin = MIN(ymin, V[n][1]);
+ ymax = MAX(ymax, V[n][1]);
+ }
+ const float owd = xmax - xmin;
+ const float oht = ymax - ymin;
+
+ // calculate the lines defining the four edges of the image area: E = V[n] x V[n+1]
+ float E[4][3];
+ for(int n = 0; n < 4; n++)
+ vec3prodn(E[n], V[n], V[(n + 1) % 4]);
+
+ // the center of the rectangle in output image coordinates
+ const float P[3] = { newx * owd, newy * oht, 1.0f };
+
+ // two auxiliary points (some arbitrary distance away from P) to construct the diagonals
+ const float Pa[2][3] = { { P[0] + 10.0f * cos(alpha), P[1] + 10.0f * sin(alpha), 1.0f },
+ { P[0] + 10.0f * cos(alpha), P[1] - 10.0f * sin(alpha), 1.0f } };
+
+ // the two diagonals: D = P x Pa
+ float D[2][3];
+ vec3prodn(D[0], P, Pa[0]);
+ vec3prodn(D[1], P, Pa[1]);
+
+ // find all intersection points of all four edges with both diagonals (I = E x D);
+ // the shortest distance d2min of the intersection point I to the crop area center P determines
+ // the size of the crop area that still fits into the image (for the given center and aspect angle)
+ float d2min = FLT_MAX;
+ for(int k = 0; k < 4; k++)
+ for(int l = 0; l < 2; l++)
+ {
+ // the intersection point
+ float I[3];
+ vec3prodn(I, E[k], D[l]);
+
+ // special case: I is all null -> E and D are identical -> P lies on E -> d2min = 0
+ if(vec3isnull(I))
+ {
+ d2min = 0.0f;
+ break;
+ }
+
+ // special case: I[2] is 0.0f -> E and D are parallel and intersect at infinity -> no relevant point
+ if(I[2] == 0.0f)
+ continue;
+
+ // the default case -> normalize I
+ I[0] /= I[2];
+ I[1] /= I[2];
+
+ // calculate distance from I to P
+ const float d2 = SQR(P[0] - I[0]) + SQR(P[1] - I[1]);
+
+ // the minimum distance over all intersection points
+ d2min = MIN(d2min, d2);
+ }
+
+ const float d = sqrt(d2min);
+
+ // do not allow crop area to drop below 1% of input image area
+ const float A = 2.0f * d * d * sin(2.0f * alpha);
+ if(A < 0.01f * wd * ht) return;
+
+ // calculate clipping margins relative to output image dimensions
+ p->cl = CLAMP((P[0] - d * cos(alpha)) / owd, 0.0f, 1.0f);
+ p->cr = CLAMP((P[0] + d * cos(alpha)) / owd, 0.0f, 1.0f);
+ p->ct = CLAMP((P[1] - d * sin(alpha)) / oht, 0.0f, 1.0f);
+ p->cb = CLAMP((P[1] + d * sin(alpha)) / oht, 0.0f, 1.0f);
+
+#ifdef ASHIFT_DEBUG
+ printf("margins after crop adjustment: x %f, y %f, angle %f, crop area (%f %f %f %f), width %f, height %f\n",
+ 0.5f * (p->cl + p->cr), 0.5f * (p->ct + p->cb), alpha, p->cl, p->cr, p->ct, p->cb, wd, ht);
+#endif
+ dt_control_queue_redraw_center();
+ return;
+}
+#endif // if 0
+//-----------------------------------------------------------------------------
+
+// helper function to start analysis for structural data and report about errors
+static int do_get_structure(dt_iop_module_t *module, dt_iop_ashift_params_t *p,
+ dt_iop_ashift_enhance_t enhance)
+{
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)module->gui_data;
+
+ if(g->fitting) return FALSE;
+
+ g->fitting = 1;
+
+ float *b = NULL;
+ {
+ MyMutex::MyLock lock(g->lock);
+ b = g->buf;
+ }
+ /* dt_pthread_mutex_lock(&g->lock); */
+ /* float *b = g->buf; */
+ /* dt_pthread_mutex_unlock(&g->lock); */
+
+ if(b == NULL)
+ {
+ dt_control_log(_("data pending - please repeat"));
+ goto error;
+ }
+
+ if(!get_structure(module, enhance))
+ {
+ dt_control_log(_("could not detect structural data in image"));
+#ifdef ASHIFT_DEBUG
+ // find out more
+ printf("do_get_structure: buf %p, buf_hash %lu, buf_width %d, buf_height %d, lines %p, lines_count %d\n",
+ g->buf, g->buf_hash, g->buf_width, g->buf_height, g->lines, g->lines_count);
+#endif
+ goto error;
+ }
+
+ if(!remove_outliers(module))
+ {
+ dt_control_log(_("could not run outlier removal"));
+#ifdef ASHIFT_DEBUG
+ // find out more
+ printf("remove_outliers: buf %p, buf_hash %lu, buf_width %d, buf_height %d, lines %p, lines_count %d\n",
+ g->buf, g->buf_hash, g->buf_width, g->buf_height, g->lines, g->lines_count);
+#endif
+ goto error;
+ }
+
+ g->fitting = 0;
+ return TRUE;
+
+error:
+ g->fitting = 0;
+ return FALSE;
+}
+
+//-----------------------------------------------------------------------------
+// RT: BEGIN COMMENT
+#if 0
+// helper function to clean structural data
+static int do_clean_structure(dt_iop_module_t *module, dt_iop_ashift_params_t *p)
+{
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)module->gui_data;
+
+ if(g->fitting) return FALSE;
+
+ g->fitting = 1;
+ g->lines_count = 0;
+ g->vertical_count = 0;
+ g->horizontal_count = 0;
+ free(g->lines);
+ g->lines = NULL;
+ g->lines_version++;
+ g->lines_suppressed = 0;
+ g->fitting = 0;
+ return TRUE;
+}
+#endif // if 0
+//-----------------------------------------------------------------------------
+
+// helper function to start parameter fit and report about errors
+static int do_fit(dt_iop_module_t *module, dt_iop_ashift_params_t *p, dt_iop_ashift_fitaxis_t dir, int min_line_count = MINIMUM_FITLINES)
+{
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)module->gui_data;
+ dt_iop_ashift_nmsresult_t res;
+
+ if(g->fitting) return FALSE;
+
+ // if no structure available get it
+ if(g->lines == NULL)
+ if(!do_get_structure(module, p, ASHIFT_ENHANCE_NONE)) goto error;
+
+ g->fitting = 1;
+
+ res = nmsfit(module, p, dir, min_line_count);
+
+ switch(res)
+ {
+ case NMS_NOT_ENOUGH_LINES:
+ dt_control_log(_("not enough structure for automatic correction"));
+ goto error;
+ break;
+ case NMS_DID_NOT_CONVERGE:
+ case NMS_INSANE:
+ dt_control_log(_("automatic correction failed, please correct manually"));
+ goto error;
+ break;
+ case NMS_SUCCESS:
+ default:
+ break;
+ }
+
+ g->fitting = 0;
+
+ /*
+ // finally apply cropping
+ do_crop(module, p);
+ */
+
+ return TRUE;
+
+error:
+ g->fitting = 0;
+ return FALSE;
+}
+
+//-----------------------------------------------------------------------------
+// RT: BEGIN COMMENT
+#if 0
+//-----------------------------------------------------------------------------
+void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const void *const ivoid,
+ void *const ovoid, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out)
+{
+ dt_iop_ashift_data_t *data = (dt_iop_ashift_data_t *)piece->data;
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+
+ const int ch = piece->colors;
+ const int ch_width = ch * roi_in->width;
+
+ // only for preview pipe: collect input buffer data and do some other evaluations
+ if(self->dev->gui_attached && g && piece->pipe->type == DT_DEV_PIXELPIPE_PREVIEW)
+ {
+ // we want to find out if the final output image is flipped in relation to this iop
+ // so we can adjust the gui labels accordingly
+
+ const int width = roi_in->width;
+ const int height = roi_in->height;
+ const int x_off = roi_in->x;
+ const int y_off = roi_in->y;
+ const float scale = roi_in->scale;
+
+ // origin of image and opposite corner as reference points
+ float points[4] = { 0.0f, 0.0f, (float)piece->buf_in.width, (float)piece->buf_in.height };
+ float ivec[2] = { points[2] - points[0], points[3] - points[1] };
+ float ivecl = sqrt(ivec[0] * ivec[0] + ivec[1] * ivec[1]);
+
+ // where do they go?
+ dt_dev_distort_backtransform_plus(self->dev, self->dev->preview_pipe, self->priority + 1, 9999999, points,
+ 2);
+
+ float ovec[2] = { points[2] - points[0], points[3] - points[1] };
+ float ovecl = sqrt(ovec[0] * ovec[0] + ovec[1] * ovec[1]);
+
+ // angle between input vector and output vector
+ float alpha = acos(CLAMP((ivec[0] * ovec[0] + ivec[1] * ovec[1]) / (ivecl * ovecl), -1.0f, 1.0f));
+
+ // we are interested if |alpha| is in the range of 90° +/- 45° -> we assume the image is flipped
+ int isflipped = fabs(fmod(alpha + M_PI, M_PI) - M_PI / 2.0f) < M_PI / 4.0f ? 1 : 0;
+
+ // did modules prior to this one in pixelpipe have changed? -> check via hash value
+ uint64_t hash = dt_dev_hash_plus(self->dev, self->dev->preview_pipe, 0, self->priority - 1);
+
+ dt_pthread_mutex_lock(&g->lock);
+ g->isflipped = isflipped;
+
+ // save a copy of preview input buffer for parameter fitting
+ if(g->buf == NULL || (size_t)g->buf_width * g->buf_height < (size_t)width * height)
+ {
+ // if needed to allocate buffer
+ free(g->buf); // a no-op if g->buf is NULL
+ // only get new buffer if no old buffer available or old buffer does not fit in terms of size
+ g->buf = malloc((size_t)width * height * 4 * sizeof(float));
+ }
+
+ if(g->buf /* && hash != g->buf_hash */)
+ {
+ // copy data
+ memcpy(g->buf, ivoid, (size_t)width * height * ch * sizeof(float));
+
+ g->buf_width = width;
+ g->buf_height = height;
+ g->buf_x_off = x_off;
+ g->buf_y_off = y_off;
+ g->buf_scale = scale;
+ g->buf_hash = hash;
+ }
+
+ dt_pthread_mutex_unlock(&g->lock);
+ }
+
+ // if module is set to neutral parameters we just copy input->output and are done
+ if(isneutral(data))
+ {
+ memcpy(ovoid, ivoid, (size_t)roi_out->width * roi_out->height * ch * sizeof(float));
+ return;
+ }
+
+ const struct dt_interpolation *interpolation = dt_interpolation_new(DT_INTERPOLATION_USERPREF);
+
+ float ihomograph[3][3];
+ homography((float *)ihomograph, data->rotation, data->lensshift_v, data->lensshift_h, data->shear, data->f_length_kb,
+ data->orthocorr, data->aspect, piece->buf_in.width, piece->buf_in.height, ASHIFT_HOMOGRAPH_INVERTED);
+
+ // clipping offset
+ const float fullwidth = (float)piece->buf_out.width / (data->cr - data->cl);
+ const float fullheight = (float)piece->buf_out.height / (data->cb - data->ct);
+ const float cx = roi_out->scale * fullwidth * data->cl;
+ const float cy = roi_out->scale * fullheight * data->ct;
+
+
+#ifdef _OPENMP
+//#pragma omp parallel for schedule(static) shared(ihomograph, interpolation)
+#endif
+ // go over all pixels of output image
+ for(int j = 0; j < roi_out->height; j++)
+ {
+ float *out = ((float *)ovoid) + (size_t)ch * j * roi_out->width;
+ for(int i = 0; i < roi_out->width; i++, out += ch)
+ {
+ float pin[3], pout[3];
+
+ /* if (j == roi_out->height - 1) { */
+ /* printf("HERE\n"); */
+ /* } */
+
+ // convert output pixel coordinates to original image coordinates
+ pout[0] = roi_out->x + i + cx;
+ pout[1] = roi_out->y + j + cy;
+ pout[0] /= roi_out->scale;
+ pout[1] /= roi_out->scale;
+ pout[2] = 1.0f;
+
+ // apply homograph
+ mat3mulv(pin, (float *)ihomograph, pout);
+
+ // convert to input pixel coordinates
+ pin[0] /= pin[2];
+ pin[1] /= pin[2];
+ pin[0] *= roi_in->scale;
+ pin[1] *= roi_in->scale;
+
+ /* if (pin[0] < 0 || pin[1] < 0) { */
+ /* printf("NEGATIVE: %f %f -> %f %f\n", pout[0], pout[1], pin[0], pin[1]); */
+ /* fflush(stdout); */
+ /* } */
+
+
+ pin[0] -= roi_in->x;
+ pin[1] -= roi_in->y;
+
+ // get output values by interpolation from input image
+ dt_interpolation_compute_pixel4c(interpolation, (float *)ivoid, out, pin[0], pin[1], roi_in->width,
+ roi_in->height, ch_width);
+ }
+ }
+}
+
+#ifdef HAVE_OPENCL
+int process_cl(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, cl_mem dev_in, cl_mem dev_out,
+ const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out)
+{
+ dt_iop_ashift_data_t *d = (dt_iop_ashift_data_t *)piece->data;
+ dt_iop_ashift_global_data_t *gd = (dt_iop_ashift_global_data_t *)self->data;
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+
+ const int devid = piece->pipe->devid;
+ const int iwidth = roi_in->width;
+ const int iheight = roi_in->height;
+ const int width = roi_out->width;
+ const int height = roi_out->height;
+
+ cl_int err = -999;
+ cl_mem dev_homo = NULL;
+
+ // only for preview pipe: collect input buffer data and do some other evaluations
+ if(self->dev->gui_attached && g && piece->pipe->type == DT_DEV_PIXELPIPE_PREVIEW)
+ {
+ // we want to find out if the final output image is flipped in relation to this iop
+ // so we can adjust the gui labels accordingly
+
+ const int x_off = roi_in->x;
+ const int y_off = roi_in->y;
+ const float scale = roi_in->scale;
+
+ // origin of image and opposite corner as reference points
+ float points[4] = { 0.0f, 0.0f, (float)piece->buf_in.width, (float)piece->buf_in.height };
+ float ivec[2] = { points[2] - points[0], points[3] - points[1] };
+ float ivecl = sqrt(ivec[0] * ivec[0] + ivec[1] * ivec[1]);
+
+ // where do they go?
+ dt_dev_distort_backtransform_plus(self->dev, self->dev->preview_pipe, self->priority + 1, 9999999, points,
+ 2);
+
+ float ovec[2] = { points[2] - points[0], points[3] - points[1] };
+ float ovecl = sqrt(ovec[0] * ovec[0] + ovec[1] * ovec[1]);
+
+ // angle between input vector and output vector
+ float alpha = acos(CLAMP((ivec[0] * ovec[0] + ivec[1] * ovec[1]) / (ivecl * ovecl), -1.0f, 1.0f));
+
+ // we are interested if |alpha| is in the range of 90° +/- 45° -> we assume the image is flipped
+ int isflipped = fabs(fmod(alpha + M_PI, M_PI) - M_PI / 2.0f) < M_PI / 4.0f ? 1 : 0;
+
+ // do modules coming before this one in pixelpipe have changed? -> check via hash value
+ uint64_t hash = dt_dev_hash_plus(self->dev, self->dev->preview_pipe, 0, self->priority - 1);
+
+ dt_pthread_mutex_lock(&g->lock);
+ g->isflipped = isflipped;
+
+ // save a copy of preview input buffer for parameter fitting
+ if(g->buf == NULL || (size_t)g->buf_width * g->buf_height < (size_t)iwidth * iheight)
+ {
+ // if needed allocate buffer
+ free(g->buf); // a no-op if g->buf is NULL
+ // only get new buffer if no old buffer or old buffer does not fit in terms of size
+ g->buf = malloc((size_t)iwidth * iheight * 4 * sizeof(float));
+ }
+
+ if(g->buf /* && hash != g->buf_hash */)
+ {
+ // copy data
+ err = dt_opencl_copy_device_to_host(devid, g->buf, dev_in, iwidth, iheight, 4 * sizeof(float));
+
+ g->buf_width = iwidth;
+ g->buf_height = iheight;
+ g->buf_x_off = x_off;
+ g->buf_y_off = y_off;
+ g->buf_scale = scale;
+ g->buf_hash = hash;
+ }
+ dt_pthread_mutex_unlock(&g->lock);
+ if(err != CL_SUCCESS) goto error;
+ }
+
+ // if module is set to neutral parameters we just copy input->output and are done
+ if(isneutral(d))
+ {
+ size_t origin[] = { 0, 0, 0 };
+ size_t region[] = { width, height, 1 };
+ err = dt_opencl_enqueue_copy_image(devid, dev_in, dev_out, origin, origin, region);
+ if(err != CL_SUCCESS) goto error;
+ return TRUE;
+ }
+
+ float ihomograph[3][3];
+ homography((float *)ihomograph, d->rotation, d->lensshift_v, d->lensshift_h, d->shear, d->f_length_kb, d->camera_pitch, d->camera_yaw,
+ d->orthocorr, d->aspect, piece->buf_in.width, piece->buf_in.height, ASHIFT_HOMOGRAPH_INVERTED);
+
+ // clipping offset
+ const float fullwidth = (float)piece->buf_out.width / (d->cr - d->cl);
+ const float fullheight = (float)piece->buf_out.height / (d->cb - d->ct);
+ const float cx = roi_out->scale * fullwidth * d->cl;
+ const float cy = roi_out->scale * fullheight * d->ct;
+
+ dev_homo = dt_opencl_copy_host_to_device_constant(devid, sizeof(float) * 9, ihomograph);
+ if(dev_homo == NULL) goto error;
+
+ const int iroi[2] = { roi_in->x, roi_in->y };
+ const int oroi[2] = { roi_out->x, roi_out->y };
+ const float in_scale = roi_in->scale;
+ const float out_scale = roi_out->scale;
+ const float clip[2] = { cx, cy };
+
+ size_t sizes[] = { ROUNDUPWD(width), ROUNDUPHT(height), 1 };
+
+ const struct dt_interpolation *interpolation = dt_interpolation_new(DT_INTERPOLATION_USERPREF);
+
+ int ldkernel = -1;
+
+ switch(interpolation->id)
+ {
+ case DT_INTERPOLATION_BILINEAR:
+ ldkernel = gd->kernel_ashift_bilinear;
+ break;
+ case DT_INTERPOLATION_BICUBIC:
+ ldkernel = gd->kernel_ashift_bicubic;
+ break;
+ case DT_INTERPOLATION_LANCZOS2:
+ ldkernel = gd->kernel_ashift_lanczos2;
+ break;
+ case DT_INTERPOLATION_LANCZOS3:
+ ldkernel = gd->kernel_ashift_lanczos3;
+ break;
+ default:
+ goto error;
+ }
+
+ dt_opencl_set_kernel_arg(devid, ldkernel, 0, sizeof(cl_mem), (void *)&dev_in);
+ dt_opencl_set_kernel_arg(devid, ldkernel, 1, sizeof(cl_mem), (void *)&dev_out);
+ dt_opencl_set_kernel_arg(devid, ldkernel, 2, sizeof(int), (void *)&width);
+ dt_opencl_set_kernel_arg(devid, ldkernel, 3, sizeof(int), (void *)&height);
+ dt_opencl_set_kernel_arg(devid, ldkernel, 4, sizeof(int), (void *)&iwidth);
+ dt_opencl_set_kernel_arg(devid, ldkernel, 5, sizeof(int), (void *)&iheight);
+ dt_opencl_set_kernel_arg(devid, ldkernel, 6, 2 * sizeof(int), (void *)iroi);
+ dt_opencl_set_kernel_arg(devid, ldkernel, 7, 2 * sizeof(int), (void *)oroi);
+ dt_opencl_set_kernel_arg(devid, ldkernel, 8, sizeof(float), (void *)&in_scale);
+ dt_opencl_set_kernel_arg(devid, ldkernel, 9, sizeof(float), (void *)&out_scale);
+ dt_opencl_set_kernel_arg(devid, ldkernel, 10, 2 * sizeof(float), (void *)clip);
+ dt_opencl_set_kernel_arg(devid, ldkernel, 11, sizeof(cl_mem), (void *)&dev_homo);
+ err = dt_opencl_enqueue_kernel_2d(devid, ldkernel, sizes);
+ if(err != CL_SUCCESS) goto error;
+
+ dt_opencl_release_mem_object(dev_homo);
+ return TRUE;
+
+error:
+ dt_opencl_release_mem_object(dev_homo);
+ dt_print(DT_DEBUG_OPENCL, "[opencl_ashift] couldn't enqueue kernel! %d\n", err);
+ return FALSE;
+}
+#endif
+
+// gather information about "near"-ness in g->points_idx
+static void get_near(const float *points, dt_iop_ashift_points_idx_t *points_idx, const int lines_count,
+ float pzx, float pzy, float delta)
+{
+ const float delta2 = delta * delta;
+
+ for(int n = 0; n < lines_count; n++)
+ {
+ points_idx[n].near = 0;
+
+ // skip irrelevant lines
+ if(points_idx[n].type == ASHIFT_LINE_IRRELEVANT)
+ continue;
+
+ // first check if the mouse pointer is outside the bounding box of the line -> skip this line
+ if(pzx < points_idx[n].bbx - delta &&
+ pzx > points_idx[n].bbX + delta &&
+ pzy < points_idx[n].bby - delta &&
+ pzy > points_idx[n].bbY + delta)
+ continue;
+
+ // pointer is inside bounding box
+ size_t offset = points_idx[n].offset;
+ const int length = points_idx[n].length;
+
+ // sanity check (this should not happen)
+ if(length < 2) continue;
+
+ // check line point by point
+ for(int l = 0; l < length; l++, offset++)
+ {
+ float dx = pzx - points[offset * 2];
+ float dy = pzy - points[offset * 2 + 1];
+
+ if(dx * dx + dy * dy < delta2)
+ {
+ points_idx[n].near = 1;
+ break;
+ }
+ }
+ }
+}
+
+// mark lines which are inside a rectangular area in isbounding mode
+static void get_bounded_inside(const float *points, dt_iop_ashift_points_idx_t *points_idx,
+ const int points_lines_count, float pzx, float pzy, float pzx2, float pzy2,
+ dt_iop_ashift_bounding_t mode)
+{
+ // get bounding box coordinates
+ float ax = pzx;
+ float ay = pzy;
+ float bx = pzx2;
+ float by = pzy2;
+ if(pzx > pzx2)
+ {
+ ax = pzx2;
+ bx = pzx;
+ }
+ if(pzy > pzy2)
+ {
+ ay = pzy2;
+ by = pzy;
+ }
+
+ // we either look for the selected or the deselected lines
+ dt_iop_ashift_linetype_t mask = ASHIFT_LINE_SELECTED;
+ dt_iop_ashift_linetype_t state = (mode == ASHIFT_BOUNDING_DESELECT) ? ASHIFT_LINE_SELECTED : 0;
+
+ for(int n = 0; n < points_lines_count; n++)
+ {
+ // mark line as "not near" and "not bounded"
+ points_idx[n].near = 0;
+ points_idx[n].bounded = 0;
+
+ // skip irrelevant lines
+ if(points_idx[n].type == ASHIFT_LINE_IRRELEVANT)
+ continue;
+
+ // is the line inside the box ?
+ if(points_idx[n].bbx >= ax && points_idx[n].bbx <= bx && points_idx[n].bbX >= ax
+ && points_idx[n].bbX <= bx && points_idx[n].bby >= ay && points_idx[n].bby <= by
+ && points_idx[n].bbY >= ay && points_idx[n].bbY <= by)
+ {
+ points_idx[n].bounded = 1;
+ // only mark "near"-ness of those lines we are interested in
+ points_idx[n].near = ((points_idx[n].type & mask) != state) ? 0 : 1;
+ }
+ }
+}
+
+// generate hash value for lines taking into account only the end point coordinates
+static uint64_t get_lines_hash(const dt_iop_ashift_line_t *lines, const int lines_count)
+{
+ uint64_t hash = 5381;
+ for(int n = 0; n < lines_count; n++)
+ {
+ float v[4] = { lines[n].p1[0], lines[n].p1[1], lines[n].p2[0], lines[n].p2[1] };
+
+ for(int i = 0; i < 4; i++)
+ hash = ((hash << 5) + hash) ^ ((uint32_t *)v)[i];
+ }
+ return hash;
+}
+
+// update color information in points_idx if lines have changed in terms of type (but not in terms
+// of number or position)
+static int update_colors(struct dt_iop_module_t *self, dt_iop_ashift_points_idx_t *points_idx,
+ int points_lines_count)
+{
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+
+ // is the display flipped relative to the original image?
+ const int isflipped = g->isflipped;
+
+ // go through all lines
+ for(int n = 0; n < points_lines_count; n++)
+ {
+ const dt_iop_ashift_linetype_t type = points_idx[n].type;
+
+ // set line color according to line type/orientation
+ // note: if the screen display is flipped versus the original image we need
+ // to respect that fact in the color selection
+ if((type & ASHIFT_LINE_MASK) == ASHIFT_LINE_VERTICAL_SELECTED)
+ points_idx[n].color = isflipped ? ASHIFT_LINECOLOR_BLUE : ASHIFT_LINECOLOR_GREEN;
+ else if((type & ASHIFT_LINE_MASK) == ASHIFT_LINE_VERTICAL_NOT_SELECTED)
+ points_idx[n].color = isflipped ? ASHIFT_LINECOLOR_YELLOW : ASHIFT_LINECOLOR_RED;
+ else if((type & ASHIFT_LINE_MASK) == ASHIFT_LINE_HORIZONTAL_SELECTED)
+ points_idx[n].color = isflipped ? ASHIFT_LINECOLOR_GREEN : ASHIFT_LINECOLOR_BLUE;
+ else if((type & ASHIFT_LINE_MASK) == ASHIFT_LINE_HORIZONTAL_NOT_SELECTED)
+ points_idx[n].color = isflipped ? ASHIFT_LINECOLOR_RED : ASHIFT_LINECOLOR_YELLOW;
+ else
+ points_idx[n].color = ASHIFT_LINECOLOR_GREY;
+ }
+
+ return TRUE;
+}
+
+// get all the points to display lines in the gui
+static int get_points(struct dt_iop_module_t *self, const dt_iop_ashift_line_t *lines, const int lines_count,
+ const int lines_version, float **points, dt_iop_ashift_points_idx_t **points_idx,
+ int *points_lines_count)
+{
+ dt_develop_t *dev = self->dev;
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+
+ dt_iop_ashift_points_idx_t *my_points_idx = NULL;
+ float *my_points = NULL;
+
+ // is the display flipped relative to the original image?
+ const int isflipped = g->isflipped;
+
+ // allocate new index array
+ my_points_idx = (dt_iop_ashift_points_idx_t *)malloc(lines_count * sizeof(dt_iop_ashift_points_idx_t));
+ if(my_points_idx == NULL) goto error;
+
+ // account for total number of points
+ size_t total_points = 0;
+
+ // first step: basic initialization of my_points_idx and counting of total_points
+ for(int n = 0; n < lines_count; n++)
+ {
+ const int length = lines[n].length;
+
+ total_points += length;
+
+ my_points_idx[n].length = length;
+ my_points_idx[n].near = 0;
+ my_points_idx[n].bounded = 0;
+
+ const dt_iop_ashift_linetype_t type = lines[n].type;
+ my_points_idx[n].type = type;
+
+ // set line color according to line type/orientation
+ // note: if the screen display is flipped versus the original image we need
+ // to respect that fact in the color selection
+ if((type & ASHIFT_LINE_MASK) == ASHIFT_LINE_VERTICAL_SELECTED)
+ my_points_idx[n].color = isflipped ? ASHIFT_LINECOLOR_BLUE : ASHIFT_LINECOLOR_GREEN;
+ else if((type & ASHIFT_LINE_MASK) == ASHIFT_LINE_VERTICAL_NOT_SELECTED)
+ my_points_idx[n].color = isflipped ? ASHIFT_LINECOLOR_YELLOW : ASHIFT_LINECOLOR_RED;
+ else if((type & ASHIFT_LINE_MASK) == ASHIFT_LINE_HORIZONTAL_SELECTED)
+ my_points_idx[n].color = isflipped ? ASHIFT_LINECOLOR_GREEN : ASHIFT_LINECOLOR_BLUE;
+ else if((type & ASHIFT_LINE_MASK) == ASHIFT_LINE_HORIZONTAL_NOT_SELECTED)
+ my_points_idx[n].color = isflipped ? ASHIFT_LINECOLOR_RED : ASHIFT_LINECOLOR_YELLOW;
+ else
+ my_points_idx[n].color = ASHIFT_LINECOLOR_GREY;
+ }
+
+ // now allocate new points buffer
+ my_points = (float *)malloc((size_t)2 * total_points * sizeof(float));
+ if(my_points == NULL) goto error;
+
+ // second step: generate points for each line
+ for(int n = 0, offset = 0; n < lines_count; n++)
+ {
+ my_points_idx[n].offset = offset;
+
+ float x = lines[n].p1[0];
+ float y = lines[n].p1[1];
+ const int length = lines[n].length;
+
+ const float dx = (lines[n].p2[0] - x) / (float)(length - 1);
+ const float dy = (lines[n].p2[1] - y) / (float)(length - 1);
+
+ for(int l = 0; l < length && offset < total_points; l++, offset++)
+ {
+ my_points[2 * offset] = x;
+ my_points[2 * offset + 1] = y;
+
+ x += dx;
+ y += dy;
+ }
+ }
+
+ // third step: transform all points
+ if(!dt_dev_distort_transform_plus(dev, dev->preview_pipe, self->priority, 9999999, my_points, total_points))
+ goto error;
+
+ // fourth step: get bounding box in final coordinates (used later for checking "near"-ness to mouse pointer)
+ for(int n = 0; n < lines_count; n++)
+ {
+ float xmin = FLT_MAX, xmax = FLT_MIN, ymin = FLT_MAX, ymax = FLT_MIN;
+
+ size_t offset = my_points_idx[n].offset;
+ int length = my_points_idx[n].length;
+
+ for(int l = 0; l < length; l++)
+ {
+ xmin = fmin(xmin, my_points[2 * offset]);
+ xmax = fmax(xmax, my_points[2 * offset]);
+ ymin = fmin(ymin, my_points[2 * offset + 1]);
+ ymax = fmax(ymax, my_points[2 * offset + 1]);
+ }
+
+ my_points_idx[n].bbx = xmin;
+ my_points_idx[n].bbX = xmax;
+ my_points_idx[n].bby = ymin;
+ my_points_idx[n].bbY = ymax;
+ }
+
+ // check if lines_version has changed in-between -> too bad: we can forget about all we did :(
+ if(g->lines_version > lines_version)
+ goto error;
+
+ *points = my_points;
+ *points_idx = my_points_idx;
+ *points_lines_count = lines_count;
+
+ return TRUE;
+
+error:
+ if(my_points_idx != NULL) free(my_points_idx);
+ if(my_points != NULL) free(my_points);
+ return FALSE;
+}
+
+// does this gui have focus?
+static int gui_has_focus(struct dt_iop_module_t *self)
+{
+ return self->dev->gui_module == self;
+}
+
+void gui_post_expose(struct dt_iop_module_t *self, cairo_t *cr, int32_t width, int32_t height,
+ int32_t pointerx, int32_t pointery)
+{
+ dt_develop_t *dev = self->dev;
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+ dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params;
+
+ // the usual rescaling stuff
+ const float wd = dev->preview_pipe->backbuf_width;
+ const float ht = dev->preview_pipe->backbuf_height;
+ if(wd < 1.0 || ht < 1.0) return;
+ const float zoom_y = dt_control_get_dev_zoom_y();
+ const float zoom_x = dt_control_get_dev_zoom_x();
+ const dt_dev_zoom_t zoom = dt_control_get_dev_zoom();
+ const int closeup = dt_control_get_dev_closeup();
+ const float zoom_scale = dt_dev_get_zoom_scale(dev, zoom, 1<buf has been processed
+ if(g->buf && (p->cropmode != ASHIFT_CROP_OFF) && self->enabled)
+ {
+ // roi data of the preview pipe input buffer
+ const float iwd = g->buf_width;
+ const float iht = g->buf_height;
+ const float ixo = g->buf_x_off;
+ const float iyo = g->buf_y_off;
+
+ // the four corners of the input buffer of this module
+ const float V[4][2] = { { ixo, iyo },
+ { ixo, iyo + iht },
+ { ixo + iwd, iyo + iht },
+ { ixo + iwd, iyo } };
+
+ // convert coordinates of corners to coordinates of this module's output
+ if(!dt_dev_distort_transform_plus(self->dev, self->dev->preview_pipe, self->priority, self->priority + 1,
+ (float *)V, 4))
+ return;
+
+ // get x/y-offset as well as width and height of output buffer
+ float xmin = FLT_MAX, ymin = FLT_MAX, xmax = FLT_MIN, ymax = FLT_MIN;
+ for(int n = 0; n < 4; n++)
+ {
+ xmin = MIN(xmin, V[n][0]);
+ xmax = MAX(xmax, V[n][0]);
+ ymin = MIN(ymin, V[n][1]);
+ ymax = MAX(ymax, V[n][1]);
+ }
+ const float owd = xmax - xmin;
+ const float oht = ymax - ymin;
+
+ // the four clipping corners
+ const float C[4][2] = { { xmin + p->cl * owd, ymin + p->ct * oht },
+ { xmin + p->cl * owd, ymin + p->cb * oht },
+ { xmin + p->cr * owd, ymin + p->cb * oht },
+ { xmin + p->cr * owd, ymin + p->ct * oht } };
+
+ // convert clipping corners to final output image
+ if(!dt_dev_distort_transform_plus(self->dev, self->dev->preview_pipe, self->priority + 1, 9999999,
+ (float *)C, 4))
+ return;
+
+ cairo_save(cr);
+
+ double dashes = DT_PIXEL_APPLY_DPI(5.0) / zoom_scale;
+ cairo_set_dash(cr, &dashes, 0, 0);
+
+ cairo_rectangle(cr, 0, 0, width, height);
+ cairo_clip(cr);
+
+ // mask parts of image outside of clipping area in dark grey
+ cairo_set_source_rgba(cr, .2, .2, .2, .8);
+ cairo_set_fill_rule(cr, CAIRO_FILL_RULE_EVEN_ODD);
+ cairo_rectangle(cr, 0, 0, width, height);
+ cairo_translate(cr, width / 2.0, height / 2.0);
+ cairo_scale(cr, zoom_scale, zoom_scale);
+ cairo_translate(cr, -.5f * wd - zoom_x * wd, -.5f * ht - zoom_y * ht);
+ cairo_move_to(cr, C[0][0], C[0][1]);
+ cairo_line_to(cr, C[1][0], C[1][1]);
+ cairo_line_to(cr, C[2][0], C[2][1]);
+ cairo_line_to(cr, C[3][0], C[3][1]);
+ cairo_close_path(cr);
+ cairo_fill(cr);
+
+ // draw white outline around clipping area
+ cairo_set_source_rgb(cr, .7, .7, .7);
+ cairo_move_to(cr, C[0][0], C[0][1]);
+ cairo_line_to(cr, C[1][0], C[1][1]);
+ cairo_line_to(cr, C[2][0], C[2][1]);
+ cairo_line_to(cr, C[3][0], C[3][1]);
+ cairo_close_path(cr);
+ cairo_stroke(cr);
+
+ // if adjusting crop, draw indicator
+ if (g->adjust_crop && p->cropmode == ASHIFT_CROP_ASPECT)
+ {
+ const double xpos = (C[1][0] + C[2][0]) / 2.0f;
+ const double ypos = (C[0][1] + C[1][1]) / 2.0f;
+ const double size_circle = (C[2][0] - C[1][0]) / 30.0f;
+ const double size_line = (C[2][0] - C[1][0]) / 5.0f;
+ const double size_arrow = (C[2][0] - C[1][0]) / 25.0f;
+
+ cairo_set_line_width(cr, 2.0 / zoom_scale);
+ cairo_set_source_rgb(cr, .7, .7, .7);
+ cairo_arc (cr, xpos, ypos, size_circle, 0, 2.0 * M_PI);
+ cairo_stroke(cr);
+ cairo_fill(cr);
+
+ cairo_set_line_width(cr, 2.0 / zoom_scale);
+ cairo_set_source_rgb(cr, .7, .7, .7);
+
+ // horizontal line
+ cairo_move_to(cr, xpos - size_line, ypos);
+ cairo_line_to(cr, xpos + size_line, ypos);
+
+ cairo_move_to(cr, xpos - size_line, ypos);
+ cairo_rel_line_to(cr, size_arrow, size_arrow);
+ cairo_move_to(cr, xpos - size_line, ypos);
+ cairo_rel_line_to(cr, size_arrow, -size_arrow);
+
+ cairo_move_to(cr, xpos + size_line, ypos);
+ cairo_rel_line_to(cr, -size_arrow, size_arrow);
+ cairo_move_to(cr, xpos + size_line, ypos);
+ cairo_rel_line_to(cr, -size_arrow, -size_arrow);
+
+ // vertical line
+ cairo_move_to(cr, xpos, ypos - size_line);
+ cairo_line_to(cr, xpos, ypos + size_line);
+
+ cairo_move_to(cr, xpos, ypos - size_line);
+ cairo_rel_line_to(cr, -size_arrow, size_arrow);
+ cairo_move_to(cr, xpos, ypos - size_line);
+ cairo_rel_line_to(cr, size_arrow, size_arrow);
+
+ cairo_move_to(cr, xpos, ypos + size_line);
+ cairo_rel_line_to(cr, -size_arrow, -size_arrow);
+ cairo_move_to(cr, xpos, ypos + size_line);
+ cairo_rel_line_to(cr, size_arrow, -size_arrow);
+
+ cairo_stroke(cr);
+ }
+
+ cairo_restore(cr);
+ }
+
+ // show guide lines on request
+ if(g->show_guides)
+ {
+ dt_guides_t *guide = (dt_guides_t *)g_list_nth_data(darktable.guides, 0);
+ double dashes = DT_PIXEL_APPLY_DPI(5.0);
+ cairo_save(cr);
+ cairo_rectangle(cr, 0, 0, width, height);
+ cairo_clip(cr);
+ cairo_set_line_width(cr, DT_PIXEL_APPLY_DPI(1.0));
+ cairo_set_source_rgb(cr, .8, .8, .8);
+ cairo_set_dash(cr, &dashes, 1, 0);
+ guide->draw(cr, 0, 0, width, height, 1.0, guide->user_data);
+ cairo_stroke_preserve(cr);
+ cairo_set_dash(cr, &dashes, 0, 0);
+ cairo_set_source_rgba(cr, 0.3, .3, .3, .8);
+ cairo_stroke(cr);
+ cairo_restore(cr);
+ }
+
+ // structural data are currently being collected or fit procedure is running? -> skip
+ if(g->fitting) return;
+
+ // no structural data or visibility switched off? -> stop here
+ if(g->lines == NULL || g->lines_suppressed || !gui_has_focus(self)) return;
+
+ // get hash value that changes if distortions from here to the end of the pixelpipe changed
+ uint64_t hash = dt_dev_hash_distort(dev);
+ // get hash value that changes if coordinates of lines have changed
+ uint64_t lines_hash = get_lines_hash(g->lines, g->lines_count);
+
+ // points data are missing or outdated, or distortion has changed?
+ if(g->points == NULL || g->points_idx == NULL || hash != g->grid_hash ||
+ (g->lines_version > g->points_version && g->lines_hash != lines_hash))
+ {
+ // we need to reprocess points
+ free(g->points);
+ g->points = NULL;
+ free(g->points_idx);
+ g->points_idx = NULL;
+ g->points_lines_count = 0;
+
+ if(!get_points(self, g->lines, g->lines_count, g->lines_version, &g->points, &g->points_idx,
+ &g->points_lines_count))
+ return;
+
+ g->points_version = g->lines_version;
+ g->grid_hash = hash;
+ g->lines_hash = lines_hash;
+ }
+ else if(g->lines_hash == lines_hash)
+ {
+ // update line type information in points_idx
+ for(int n = 0; n < g->points_lines_count; n++)
+ g->points_idx[n].type = g->lines[n].type;
+
+ // coordinates of lines are unchanged -> we only need to update colors
+ if(!update_colors(self, g->points_idx, g->points_lines_count))
+ return;
+
+ g->points_version = g->lines_version;
+ }
+
+ // a final check
+ if(g->points == NULL || g->points_idx == NULL) return;
+
+ cairo_save(cr);
+ cairo_rectangle(cr, 0, 0, width, height);
+ cairo_clip(cr);
+ cairo_translate(cr, width / 2.0, height / 2.0);
+ cairo_scale(cr, zoom_scale, zoom_scale);
+ cairo_translate(cr, -.5f * wd - zoom_x * wd, -.5f * ht - zoom_y * ht);
+
+ // this must match the sequence of enum dt_iop_ashift_linecolor_t!
+ const float line_colors[5][4] =
+ { { 0.3f, 0.3f, 0.3f, 0.8f }, // grey (misc. lines)
+ { 0.0f, 1.0f, 0.0f, 0.8f }, // green (selected vertical lines)
+ { 0.8f, 0.0f, 0.0f, 0.8f }, // red (de-selected vertical lines)
+ { 0.0f, 0.0f, 1.0f, 0.8f }, // blue (selected horizontal lines)
+ { 0.8f, 0.8f, 0.0f, 0.8f } }; // yellow (de-selected horizontal lines)
+
+ cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND);
+
+ // now draw all lines
+ for(int n = 0; n < g->points_lines_count; n++)
+ {
+ // is the near flag set? -> draw line a bit thicker
+ if(g->points_idx[n].near)
+ cairo_set_line_width(cr, DT_PIXEL_APPLY_DPI(3.0) / zoom_scale);
+ else
+ cairo_set_line_width(cr, DT_PIXEL_APPLY_DPI(1.5) / zoom_scale);
+
+ // the color of this line
+ const float *color = line_colors[g->points_idx[n].color];
+ cairo_set_source_rgba(cr, color[0], color[1], color[2], color[3]);
+
+ size_t offset = g->points_idx[n].offset;
+ const int length = g->points_idx[n].length;
+
+ // sanity check (this should not happen)
+ if(length < 2) continue;
+
+ // set starting point of multi-segment line
+ cairo_move_to(cr, g->points[offset * 2], g->points[offset * 2 + 1]);
+
+ offset++;
+ // draw individual line segments
+ for(int l = 1; l < length; l++, offset++)
+ {
+ cairo_line_to(cr, g->points[offset * 2], g->points[offset * 2 + 1]);
+ }
+
+ // finally stroke the line
+ cairo_stroke(cr);
+ }
+
+ // and we draw the selection box if any
+ if(g->isbounding != ASHIFT_BOUNDING_OFF)
+ {
+ float pzx, pzy;
+ dt_dev_get_pointer_zoom_pos(dev, pointerx, pointery, &pzx, &pzy);
+ pzx += 0.5f;
+ pzy += 0.5f;
+
+ double dashed[] = { 4.0, 4.0 };
+ dashed[0] /= zoom_scale;
+ dashed[1] /= zoom_scale;
+ int len = sizeof(dashed) / sizeof(dashed[0]);
+
+ cairo_rectangle(cr, g->lastx * wd, g->lasty * ht, (pzx - g->lastx) * wd, (pzy - g->lasty) * ht);
+
+ cairo_set_source_rgba(cr, .3, .3, .3, .8);
+ cairo_set_line_width(cr, 1.0 / zoom_scale);
+ cairo_set_dash(cr, dashed, len, 0);
+ cairo_stroke_preserve(cr);
+ cairo_set_source_rgba(cr, .8, .8, .8, .8);
+ cairo_set_dash(cr, dashed, len, 4);
+ cairo_stroke(cr);
+ }
+
+ // indicate which area is used for "near"-ness detection when selecting/deselecting lines
+ if(g->near_delta > 0)
+ {
+ float pzx, pzy;
+ dt_dev_get_pointer_zoom_pos(dev, pointerx, pointery, &pzx, &pzy);
+ pzx += 0.5f;
+ pzy += 0.5f;
+
+ double dashed[] = { 4.0, 4.0 };
+ dashed[0] /= zoom_scale;
+ dashed[1] /= zoom_scale;
+ int len = sizeof(dashed) / sizeof(dashed[0]);
+
+ cairo_arc(cr, pzx * wd, pzy * ht, g->near_delta, 0, 2.0 * M_PI);
+
+ cairo_set_source_rgba(cr, .3, .3, .3, .8);
+ cairo_set_line_width(cr, 1.0 / zoom_scale);
+ cairo_set_dash(cr, dashed, len, 0);
+ cairo_stroke_preserve(cr);
+ cairo_set_source_rgba(cr, .8, .8, .8, .8);
+ cairo_set_dash(cr, dashed, len, 4);
+ cairo_stroke(cr);
+ }
+
+ cairo_restore(cr);
+}
+#endif // if 0
+//-----------------------------------------------------------------------------
+
+// update the number of selected vertical and horizontal lines
+static void update_lines_count(const dt_iop_ashift_line_t *lines, const int lines_count,
+ int *vertical_count, int *horizontal_count)
+{
+ int vlines = 0;
+ int hlines = 0;
+
+ for(int n = 0; n < lines_count; n++)
+ {
+ if((lines[n].type & ASHIFT_LINE_MASK) == ASHIFT_LINE_VERTICAL_SELECTED)
+ vlines++;
+ else if((lines[n].type & ASHIFT_LINE_MASK) == ASHIFT_LINE_HORIZONTAL_SELECTED)
+ hlines++;
+ }
+
+ *vertical_count = vlines;
+ *horizontal_count = hlines;
+}
+
+//-----------------------------------------------------------------------------
+// RT: BEGIN COMMENT
+#if 0
+int mouse_moved(struct dt_iop_module_t *self, double x, double y, double pressure, int which)
+{
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+ int handled = 0;
+
+ const float wd = self->dev->preview_pipe->backbuf_width;
+ const float ht = self->dev->preview_pipe->backbuf_height;
+ if(wd < 1.0 || ht < 1.0) return 1;
+
+ float pzx, pzy;
+ dt_dev_get_pointer_zoom_pos(self->dev, x, y, &pzx, &pzy);
+ pzx += 0.5f;
+ pzy += 0.5f;
+
+ if (g->adjust_crop)
+ {
+ dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params;
+ const float newx = g->crop_cx + pzx - g->lastx;
+ const float newy = g->crop_cy + pzy - g->lasty;
+ crop_adjust(self, p, newx, newy);
+ dt_dev_add_history_item(darktable.develop, self, TRUE);
+ return TRUE;
+ }
+
+ // if in rectangle selecting mode adjust "near"-ness of lines according to
+ // the rectangular selection
+ if(g->isbounding != ASHIFT_BOUNDING_OFF)
+ {
+ if(wd >= 1.0 && ht >= 1.0)
+ {
+ // mark lines inside the rectangle
+ get_bounded_inside(g->points, g->points_idx, g->points_lines_count, pzx * wd, pzy * ht, g->lastx * wd,
+ g->lasty * ht, g->isbounding);
+ }
+
+ dt_control_queue_redraw_center();
+ return FALSE;
+ }
+
+ // gather information about "near"-ness in g->points_idx
+ get_near(g->points, g->points_idx, g->points_lines_count, pzx * wd, pzy * ht, g->near_delta);
+
+ // if we are in sweeping mode iterate over lines as we move the pointer and change "selected" state.
+ if(g->isdeselecting || g->isselecting)
+ {
+ for(int n = 0; g->selecting_lines_version == g->lines_version && n < g->points_lines_count; n++)
+ {
+ if(g->points_idx[n].near == 0)
+ continue;
+
+ if(g->isdeselecting)
+ g->lines[n].type &= ~ASHIFT_LINE_SELECTED;
+ else if(g->isselecting)
+ g->lines[n].type |= ASHIFT_LINE_SELECTED;
+
+ handled = 1;
+ }
+ }
+
+ if(handled)
+ {
+ update_lines_count(g->lines, g->lines_count, &g->vertical_count, &g->horizontal_count);
+ g->lines_version++;
+ g->selecting_lines_version++;
+ }
+
+ dt_control_queue_redraw_center();
+
+ // if not in sweeping mode we need to pass the event
+ return (g->isdeselecting || g->isselecting);
+}
+
+int button_pressed(struct dt_iop_module_t *self, double x, double y, double pressure, int which, int type,
+ uint32_t state)
+{
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+ int handled = 0;
+
+ float pzx, pzy;
+ dt_dev_get_pointer_zoom_pos(self->dev, x, y, &pzx, &pzy);
+ pzx += 0.5f;
+ pzy += 0.5f;
+
+ const float wd = self->dev->preview_pipe->backbuf_width;
+ const float ht = self->dev->preview_pipe->backbuf_height;
+ if(wd < 1.0 || ht < 1.0) return 1;
+
+
+ // if visibility of lines is switched off or no lines available -> potentially adjust crop area
+ if(g->lines_suppressed || g->lines == NULL)
+ {
+ dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params;
+ if (p->cropmode == ASHIFT_CROP_ASPECT)
+ {
+ dt_control_change_cursor(GDK_HAND1);
+ g->adjust_crop = TRUE;
+ g->lastx = pzx;
+ g->lasty = pzy;
+ g->crop_cx = 0.5f * (p->cl + p->cr);
+ g->crop_cy = 0.5f * (p->ct + p->cb);
+ return TRUE;
+ }
+ else
+ return FALSE;
+ }
+
+ // remember lines version at this stage so we can continuously monitor if the
+ // lines have changed in-between
+ g->selecting_lines_version = g->lines_version;
+
+ // if shift button is pressed go into bounding mode (selecting or deselecting
+ // in a rectangle area)
+ if((state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK)
+ {
+ g->lastx = pzx;
+ g->lasty = pzy;
+
+ g->isbounding = (which == 3) ? ASHIFT_BOUNDING_DESELECT : ASHIFT_BOUNDING_SELECT;
+ dt_control_change_cursor(GDK_CROSS);
+
+ return TRUE;
+ }
+
+ dt_dev_zoom_t zoom = dt_control_get_dev_zoom();
+ const int closeup = dt_control_get_dev_closeup();
+ const float min_scale = dt_dev_get_zoom_scale(self->dev, DT_ZOOM_FIT, 1<dev, zoom, 1<points_lines_count > 0);
+
+ g->near_delta = dt_conf_get_float("plugins/darkroom/ashift/near_delta");
+
+ // gather information about "near"-ness in g->points_idx
+ get_near(g->points, g->points_idx, g->points_lines_count, pzx * wd, pzy * ht, g->near_delta);
+
+ // iterate over all lines close to the pointer and change "selected" state.
+ // left-click selects and right-click deselects the line
+ for(int n = 0; g->selecting_lines_version == g->lines_version && n < g->points_lines_count; n++)
+ {
+ if(g->points_idx[n].near == 0)
+ continue;
+
+ if(which == 3)
+ g->lines[n].type &= ~ASHIFT_LINE_SELECTED;
+ else
+ g->lines[n].type |= ASHIFT_LINE_SELECTED;
+
+ handled = 1;
+ }
+
+ // we switch into sweeping mode either if we anyhow take control
+ // or if cursor was close to a line when button was pressed. in other
+ // cases we hand over the event (for image panning)
+ if((take_control || handled) && which == 3)
+ {
+ dt_control_change_cursor(GDK_PIRATE);
+ g->isdeselecting = 1;
+ }
+ else if(take_control || handled)
+ {
+ dt_control_change_cursor(GDK_PLUS);
+ g->isselecting = 1;
+ }
+
+ if(handled)
+ {
+ update_lines_count(g->lines, g->lines_count, &g->vertical_count, &g->horizontal_count);
+ g->lines_version++;
+ g->selecting_lines_version++;
+ }
+
+ return (take_control || handled);
+}
+
+int button_released(struct dt_iop_module_t *self, double x, double y, int which, uint32_t state)
+{
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+
+ // stop adjust crop
+ g->adjust_crop = FALSE;
+ dt_control_change_cursor(GDK_LEFT_PTR);
+
+ // finalize the isbounding mode
+ // if user has released the shift button in-between -> do nothing
+ if(g->isbounding != ASHIFT_BOUNDING_OFF && (state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK)
+ {
+ int handled = 0;
+
+ // we compute the rectangle selection
+ float pzx, pzy;
+ dt_dev_get_pointer_zoom_pos(self->dev, x, y, &pzx, &pzy);
+
+ pzx += 0.5f;
+ pzy += 0.5f;
+
+ const float wd = self->dev->preview_pipe->backbuf_width;
+ const float ht = self->dev->preview_pipe->backbuf_height;
+
+ if(wd >= 1.0 && ht >= 1.0)
+ {
+ // mark lines inside the rectangle
+ get_bounded_inside(g->points, g->points_idx, g->points_lines_count, pzx * wd, pzy * ht, g->lastx * wd,
+ g->lasty * ht, g->isbounding);
+
+ // select or deselect lines within the rectangle according to isbounding state
+ for(int n = 0; g->selecting_lines_version == g->lines_version && n < g->points_lines_count; n++)
+ {
+ if(g->points_idx[n].bounded == 0) continue;
+
+ if(g->isbounding == ASHIFT_BOUNDING_DESELECT)
+ g->lines[n].type &= ~ASHIFT_LINE_SELECTED;
+ else
+ g->lines[n].type |= ASHIFT_LINE_SELECTED;
+
+ handled = 1;
+ }
+
+ if(handled)
+ {
+ update_lines_count(g->lines, g->lines_count, &g->vertical_count, &g->horizontal_count);
+ g->lines_version++;
+ g->selecting_lines_version++;
+ }
+
+ dt_control_queue_redraw_center();
+ }
+ }
+
+ // end of sweeping/isbounding mode
+ dt_control_change_cursor(GDK_LEFT_PTR);
+ g->isselecting = g->isdeselecting = 0;
+ g->isbounding = ASHIFT_BOUNDING_OFF;
+ g->near_delta = 0;
+ g->lastx = g->lasty = -1.0f;
+ g->crop_cx = g->crop_cy = -1.0f;
+
+ return 0;
+}
+
+int scrolled(struct dt_iop_module_t *self, double x, double y, int up, uint32_t state)
+{
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+
+ // do nothing if visibility of lines is switched off or no lines available
+ if(g->lines_suppressed || g->lines == NULL)
+ return FALSE;
+
+ if(g->near_delta > 0 && (g->isdeselecting || g->isselecting))
+ {
+ int handled = 0;
+
+ float pzx, pzy;
+ dt_dev_get_pointer_zoom_pos(self->dev, x, y, &pzx, &pzy);
+ pzx += 0.5f;
+ pzy += 0.5f;
+
+ const float wd = self->dev->preview_pipe->backbuf_width;
+ const float ht = self->dev->preview_pipe->backbuf_height;
+
+ float near_delta = dt_conf_get_float("plugins/darkroom/ashift/near_delta");
+ const float amount = up ? 0.8f : 1.25f;
+ near_delta = MAX(4.0f, MIN(near_delta * amount, 100.0f));
+ dt_conf_set_float("plugins/darkroom/ashift/near_delta", near_delta);
+ g->near_delta = near_delta;
+
+ // gather information about "near"-ness in g->points_idx
+ get_near(g->points, g->points_idx, g->points_lines_count, pzx * wd, pzy * ht, g->near_delta);
+
+ // iterate over all lines close to the pointer and change "selected" state.
+ for(int n = 0; g->selecting_lines_version == g->lines_version && n < g->points_lines_count; n++)
+ {
+ if(g->points_idx[n].near == 0)
+ continue;
+
+ if(g->isdeselecting)
+ g->lines[n].type &= ~ASHIFT_LINE_SELECTED;
+ else if(g->isselecting)
+ g->lines[n].type |= ASHIFT_LINE_SELECTED;
+
+ handled = 1;
+ }
+
+ if(handled)
+ {
+ update_lines_count(g->lines, g->lines_count, &g->vertical_count, &g->horizontal_count);
+ g->lines_version++;
+ g->selecting_lines_version++;
+ }
+
+ dt_control_queue_redraw_center();
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void rotation_callback(GtkWidget *slider, gpointer user_data)
+{
+ dt_iop_module_t *self = (dt_iop_module_t *)user_data;
+ if(self->dt->gui->reset) return;
+ dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params;
+ p->rotation = dt_bauhaus_slider_get(slider);
+#ifdef ASHIFT_DEBUG
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+ model_probe(self, p, g->lastfit);
+#endif
+ do_crop(self, p);
+ dt_dev_add_history_item(darktable.develop, self, TRUE);
+}
+
+static void lensshift_v_callback(GtkWidget *slider, gpointer user_data)
+{
+ dt_iop_module_t *self = (dt_iop_module_t *)user_data;
+ if(self->dt->gui->reset) return;
+ dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params;
+ p->lensshift_v = dt_bauhaus_slider_get(slider);
+#ifdef ASHIFT_DEBUG
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+ model_probe(self, p, g->lastfit);
+#endif
+ do_crop(self, p);
+ dt_dev_add_history_item(darktable.develop, self, TRUE);
+}
+
+static void lensshift_h_callback(GtkWidget *slider, gpointer user_data)
+{
+ dt_iop_module_t *self = (dt_iop_module_t *)user_data;
+ if(self->dt->gui->reset) return;
+ dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params;
+ p->lensshift_h = dt_bauhaus_slider_get(slider);
+#ifdef ASHIFT_DEBUG
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+ model_probe(self, p, g->lastfit);
+#endif
+ do_crop(self, p);
+ dt_dev_add_history_item(darktable.develop, self, TRUE);
+}
+
+static void shear_callback(GtkWidget *slider, gpointer user_data)
+{
+ dt_iop_module_t *self = (dt_iop_module_t *)user_data;
+ if(self->dt->gui->reset) return;
+ dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params;
+ p->shear = dt_bauhaus_slider_get(slider);
+#ifdef ASHIFT_DEBUG
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+ model_probe(self, p, g->lastfit);
+#endif
+ do_crop(self, p);
+ dt_dev_add_history_item(darktable.develop, self, TRUE);
+}
+
+static void guide_lines_callback(GtkWidget *widget, gpointer user_data)
+{
+ dt_iop_module_t *self = (dt_iop_module_t *)user_data;
+ if(self->dt->gui->reset) return;
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+ g->show_guides = dt_bauhaus_combobox_get(widget);
+ dt_iop_request_focus(self);
+ dt_dev_reprocess_all(self->dev);
+}
+
+static void cropmode_callback(GtkWidget *widget, gpointer user_data)
+{
+ dt_iop_module_t *self = (dt_iop_module_t *)user_data;
+ if(self->dt->gui->reset) return;
+ dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params;
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+ p->cropmode = dt_bauhaus_combobox_get(widget);
+ if(g->lines != NULL && !g->lines_suppressed)
+ {
+ g->lines_suppressed = 1;
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g->eye), g->lines_suppressed);
+ }
+ do_crop(self, p);
+ dt_dev_add_history_item(darktable.develop, self, TRUE);
+}
+
+static void mode_callback(GtkWidget *widget, gpointer user_data)
+{
+ dt_iop_module_t *self = (dt_iop_module_t *)user_data;
+ if(self->dt->gui->reset) return;
+ dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params;
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+ p->mode = dt_bauhaus_combobox_get(widget);
+
+ switch(p->mode)
+ {
+ case ASHIFT_MODE_GENERIC:
+ gtk_widget_hide(g->f_length);
+ gtk_widget_hide(g->crop_factor);
+ gtk_widget_hide(g->orthocorr);
+ gtk_widget_hide(g->aspect);
+ break;
+ case ASHIFT_MODE_SPECIFIC:
+ default:
+ gtk_widget_show(g->f_length);
+ gtk_widget_show(g->crop_factor);
+ gtk_widget_show(g->orthocorr);
+ gtk_widget_show(g->aspect);
+ break;
+ }
+
+ do_crop(self, p);
+ dt_dev_add_history_item(darktable.develop, self, TRUE);
+}
+
+static void f_length_callback(GtkWidget *slider, gpointer user_data)
+{
+ dt_iop_module_t *self = (dt_iop_module_t *)user_data;
+ if(self->dt->gui->reset) return;
+ dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params;
+ p->f_length = dt_bauhaus_slider_get(slider);
+ do_crop(self, p);
+ dt_dev_add_history_item(darktable.develop, self, TRUE);
+}
+
+static void crop_factor_callback(GtkWidget *slider, gpointer user_data)
+{
+ dt_iop_module_t *self = (dt_iop_module_t *)user_data;
+ if(self->dt->gui->reset) return;
+ dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params;
+ p->crop_factor = dt_bauhaus_slider_get(slider);
+ do_crop(self, p);
+ dt_dev_add_history_item(darktable.develop, self, TRUE);
+}
+
+static void orthocorr_callback(GtkWidget *slider, gpointer user_data)
+{
+ dt_iop_module_t *self = (dt_iop_module_t *)user_data;
+ if(self->dt->gui->reset) return;
+ dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params;
+ p->orthocorr = dt_bauhaus_slider_get(slider);
+ do_crop(self, p);
+ dt_dev_add_history_item(darktable.develop, self, TRUE);
+}
+
+static void aspect_callback(GtkWidget *slider, gpointer user_data)
+{
+ dt_iop_module_t *self = (dt_iop_module_t *)user_data;
+ if(self->dt->gui->reset) return;
+ dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params;
+ p->aspect = dt_bauhaus_slider_get(slider);
+ do_crop(self, p);
+ dt_dev_add_history_item(darktable.develop, self, TRUE);
+}
+
+static int fit_v_button_clicked(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
+{
+ dt_iop_module_t *self = (dt_iop_module_t *)user_data;
+ if(darktable.gui->reset) return FALSE;
+
+ if(event->button == 1)
+ {
+ dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params;
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+
+ const int control = (event->state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK;
+ const int shift = (event->state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK;
+
+ dt_iop_ashift_fitaxis_t fitaxis = ASHIFT_FIT_NONE;
+
+ if(control)
+ g->lastfit = fitaxis = ASHIFT_FIT_ROTATION_VERTICAL_LINES;
+ else if(shift)
+ g->lastfit = fitaxis = ASHIFT_FIT_VERTICALLY_NO_ROTATION;
+ else
+ g->lastfit = fitaxis = ASHIFT_FIT_VERTICALLY;
+
+ dt_iop_request_focus(self);
+ dt_dev_reprocess_all(self->dev);
+
+ if(self->enabled)
+ {
+ // module is enable -> we process directly
+ if(do_fit(self, p, fitaxis))
+ {
+ darktable.gui->reset = 1;
+ dt_bauhaus_slider_set_soft(g->rotation, p->rotation);
+ dt_bauhaus_slider_set_soft(g->lensshift_v, p->lensshift_v);
+ dt_bauhaus_slider_set_soft(g->lensshift_h, p->lensshift_h);
+ dt_bauhaus_slider_set_soft(g->shear, p->shear);
+ darktable.gui->reset = 0;
+ }
+ }
+ else
+ {
+ // module is not enabled -> invoke it and queue the job to be processed once
+ // the preview image is ready
+ g->jobcode = ASHIFT_JOBCODE_FIT;
+ g->jobparams = g->lastfit = fitaxis;
+ p->toggle ^= 1;
+ }
+
+ dt_dev_add_history_item(darktable.develop, self, TRUE);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static int fit_h_button_clicked(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
+{
+ dt_iop_module_t *self = (dt_iop_module_t *)user_data;
+ if(darktable.gui->reset) return FALSE;
+
+ if(event->button == 1)
+ {
+ dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params;
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+
+ const int control = (event->state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK;
+ const int shift = (event->state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK;
+
+ dt_iop_ashift_fitaxis_t fitaxis = ASHIFT_FIT_NONE;
+
+ if(control)
+ g->lastfit = fitaxis = ASHIFT_FIT_ROTATION_HORIZONTAL_LINES;
+ else if(shift)
+ g->lastfit = fitaxis = ASHIFT_FIT_HORIZONTALLY_NO_ROTATION;
+ else
+ g->lastfit = fitaxis = ASHIFT_FIT_HORIZONTALLY;
+
+ dt_iop_request_focus(self);
+ dt_dev_reprocess_all(self->dev);
+
+ if(self->enabled)
+ {
+ // module is enable -> we process directly
+ if(do_fit(self, p, fitaxis))
+ {
+ darktable.gui->reset = 1;
+ dt_bauhaus_slider_set_soft(g->rotation, p->rotation);
+ dt_bauhaus_slider_set_soft(g->lensshift_v, p->lensshift_v);
+ dt_bauhaus_slider_set_soft(g->lensshift_h, p->lensshift_h);
+ dt_bauhaus_slider_set_soft(g->shear, p->shear);
+ darktable.gui->reset = 0;
+ }
+ }
+ else
+ {
+ // module is not enabled -> invoke it and queue the job to be processed once
+ // the preview image is ready
+ g->jobcode = ASHIFT_JOBCODE_FIT;
+ g->jobparams = g->lastfit = fitaxis;
+ p->toggle ^= 1;
+ }
+
+ dt_dev_add_history_item(darktable.develop, self, TRUE);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static int fit_both_button_clicked(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
+{
+ dt_iop_module_t *self = (dt_iop_module_t *)user_data;
+ if(darktable.gui->reset) return FALSE;
+
+ if(event->button == 1)
+ {
+ dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params;
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+
+ const int control = (event->state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK;
+ const int shift = (event->state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK;
+
+ dt_iop_ashift_fitaxis_t fitaxis = ASHIFT_FIT_NONE;
+
+ if(control && shift)
+ fitaxis = ASHIFT_FIT_BOTH;
+ else if(control)
+ fitaxis = ASHIFT_FIT_ROTATION_BOTH_LINES;
+ else if(shift)
+ fitaxis = ASHIFT_FIT_BOTH_NO_ROTATION;
+ else
+ fitaxis = ASHIFT_FIT_BOTH_SHEAR;
+
+ dt_iop_request_focus(self);
+ dt_dev_reprocess_all(self->dev);
+
+ if(self->enabled)
+ {
+ // module is enable -> we process directly
+ if(do_fit(self, p, fitaxis))
+ {
+ darktable.gui->reset = 1;
+ dt_bauhaus_slider_set_soft(g->rotation, p->rotation);
+ dt_bauhaus_slider_set_soft(g->lensshift_v, p->lensshift_v);
+ dt_bauhaus_slider_set_soft(g->lensshift_h, p->lensshift_h);
+ dt_bauhaus_slider_set_soft(g->shear, p->shear);
+ darktable.gui->reset = 0;
+ }
+ }
+ else
+ {
+ // module is not enabled -> invoke it and queue the job to be processed once
+ // the preview image is ready
+ g->jobcode = ASHIFT_JOBCODE_FIT;
+ g->jobparams = g->lastfit = fitaxis;
+ p->toggle ^= 1;
+ }
+
+ dt_dev_add_history_item(darktable.develop, self, TRUE);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static int structure_button_clicked(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
+{
+ dt_iop_module_t *self = (dt_iop_module_t *)user_data;
+ if(darktable.gui->reset) return FALSE;
+
+ if(event->button == 1)
+ {
+ dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params;
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+
+ const int control = (event->state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK;
+ const int shift = (event->state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK;
+
+ dt_iop_ashift_enhance_t enhance;
+
+ if(control && shift)
+ enhance = ASHIFT_ENHANCE_EDGES | ASHIFT_ENHANCE_DETAIL;
+ else if(shift)
+ enhance = ASHIFT_ENHANCE_DETAIL;
+ else if(control)
+ enhance = ASHIFT_ENHANCE_EDGES;
+ else
+ enhance = ASHIFT_ENHANCE_NONE;
+
+ dt_iop_request_focus(self);
+ dt_dev_reprocess_all(self->dev);
+
+ if(self->enabled)
+ {
+ // module is enabled -> process directly
+ (void)do_get_structure(self, p, enhance);
+ }
+ else
+ {
+ // module is not enabled -> invoke it and queue the job to be processed once
+ // the preview image is ready
+ g->jobcode = ASHIFT_JOBCODE_GET_STRUCTURE;
+ g->jobparams = enhance;
+ p->toggle ^= 1;
+ }
+
+ dt_dev_add_history_item(darktable.develop, self, TRUE);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void clean_button_clicked(GtkButton *button, gpointer user_data)
+{
+ dt_iop_module_t *self = (dt_iop_module_t *)user_data;
+ if(darktable.gui->reset) return;
+ dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params;
+ (void)do_clean_structure(self, p);
+ dt_iop_request_focus(self);
+ dt_control_queue_redraw_center();
+}
+
+static void eye_button_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+ dt_iop_module_t *self = (dt_iop_module_t *)user_data;
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+ if(darktable.gui->reset) return;
+ if(g->lines == NULL)
+ {
+ g->lines_suppressed = 0;
+ gtk_toggle_button_set_active(togglebutton, 0);
+ }
+ else
+ {
+ g->lines_suppressed = gtk_toggle_button_get_active(togglebutton);
+ }
+ dt_iop_request_focus(self);
+ dt_control_queue_redraw_center();
+}
+
+// routine that is called after preview image has been processed. we use it
+// to perform structure collection or fitting in case those have been triggered while
+// the module had not yet been enabled
+static void process_after_preview_callback(gpointer instance, gpointer user_data)
+{
+ dt_iop_module_t *self = (dt_iop_module_t *)user_data;
+ dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params;
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+
+ dt_iop_ashift_jobcode_t jobcode = g->jobcode;
+ int jobparams = g->jobparams;
+
+ // purge
+ g->jobcode = ASHIFT_JOBCODE_NONE;
+ g->jobparams = 0;
+
+ if(darktable.gui->reset) return;
+
+ switch(jobcode)
+ {
+ case ASHIFT_JOBCODE_GET_STRUCTURE:
+ (void)do_get_structure(self, p, (dt_iop_ashift_enhance_t)jobparams);
+ break;
+
+ case ASHIFT_JOBCODE_FIT:
+ if(do_fit(self, p, (dt_iop_ashift_fitaxis_t)jobparams))
+ {
+ darktable.gui->reset = 1;
+ dt_bauhaus_slider_set_soft(g->rotation, p->rotation);
+ dt_bauhaus_slider_set_soft(g->lensshift_v, p->lensshift_v);
+ dt_bauhaus_slider_set_soft(g->lensshift_h, p->lensshift_h);
+ dt_bauhaus_slider_set_soft(g->shear, p->shear);
+ darktable.gui->reset = 0;
+ }
+ dt_dev_add_history_item(darktable.develop, self, TRUE);
+ break;
+
+ case ASHIFT_JOBCODE_NONE:
+ default:
+ break;
+ }
+
+ dt_control_queue_redraw_center();
+}
+
+void commit_params(struct dt_iop_module_t *self, dt_iop_params_t *p1, dt_dev_pixelpipe_t *pipe,
+ dt_dev_pixelpipe_iop_t *piece)
+{
+ dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)p1;
+ dt_iop_ashift_data_t *d = (dt_iop_ashift_data_t *)piece->data;
+
+ d->rotation = p->rotation;
+ d->lensshift_v = p->lensshift_v;
+ d->lensshift_h = p->lensshift_h;
+ d->shear = p->shear;
+ d->f_length_kb = (p->mode == ASHIFT_MODE_GENERIC) ? DEFAULT_F_LENGTH : p->f_length * p->crop_factor;
+ d->orthocorr = (p->mode == ASHIFT_MODE_GENERIC) ? 0.0f : p->orthocorr;
+ d->aspect = (p->mode == ASHIFT_MODE_GENERIC) ? 1.0f : p->aspect;
+
+ if(gui_has_focus(self))
+ {
+ // if gui has focus we want to see the full uncropped image
+ d->cl = 0.0f;
+ d->cr = 1.0f;
+ d->ct = 0.0f;
+ d->cb = 1.0f;
+ }
+ else
+ {
+ d->cl = p->cl;
+ d->cr = p->cr;
+ d->ct = p->ct;
+ d->cb = p->cb;
+ }
+}
+
+void init_pipe(struct dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
+{
+ dt_iop_ashift_data_t *d = (dt_iop_ashift_data_t *)calloc(1, sizeof(dt_iop_ashift_data_t));
+ piece->data = (void *)d;
+ self->commit_params(self, self->default_params, pipe, piece);
+}
+
+void cleanup_pipe(struct dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
+{
+ free(piece->data);
+ piece->data = NULL;
+}
+
+void gui_update(struct dt_iop_module_t *self)
+{
+ dt_iop_module_t *module = (dt_iop_module_t *)self;
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+ dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)module->params;
+ dt_bauhaus_slider_set_soft(g->rotation, p->rotation);
+ dt_bauhaus_slider_set_soft(g->lensshift_v, p->lensshift_v);
+ dt_bauhaus_slider_set_soft(g->lensshift_h, p->lensshift_h);
+ dt_bauhaus_slider_set_soft(g->shear, p->shear);
+ dt_bauhaus_slider_set_soft(g->f_length, p->f_length);
+ dt_bauhaus_slider_set_soft(g->crop_factor, p->crop_factor);
+ dt_bauhaus_slider_set(g->orthocorr, p->orthocorr);
+ dt_bauhaus_slider_set(g->aspect, p->aspect);
+ dt_bauhaus_combobox_set(g->mode, p->mode);
+ dt_bauhaus_combobox_set(g->guide_lines, g->show_guides);
+ dt_bauhaus_combobox_set(g->cropmode, p->cropmode);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g->eye), 0);
+
+ switch(p->mode)
+ {
+ case ASHIFT_MODE_GENERIC:
+ gtk_widget_hide(g->f_length);
+ gtk_widget_hide(g->crop_factor);
+ gtk_widget_hide(g->orthocorr);
+ gtk_widget_hide(g->aspect);
+ break;
+ case ASHIFT_MODE_SPECIFIC:
+ default:
+ gtk_widget_show(g->f_length);
+ gtk_widget_show(g->crop_factor);
+ gtk_widget_show(g->orthocorr);
+ gtk_widget_show(g->aspect);
+ break;
+ }
+}
+
+void init(dt_iop_module_t *module)
+{
+ module->params = calloc(1, sizeof(dt_iop_ashift_params_t));
+ module->default_params = calloc(1, sizeof(dt_iop_ashift_params_t));
+ module->default_enabled = 0;
+ module->priority = 214; // module order created by iop_dependencies.py, do not edit!
+ module->params_size = sizeof(dt_iop_ashift_params_t);
+ module->gui_data = NULL;
+ dt_iop_ashift_params_t tmp = (dt_iop_ashift_params_t){ 0.0f, 0.0f, 0.0f, 0.0f, DEFAULT_F_LENGTH, 1.0f, 100.0f, 1.0f, ASHIFT_MODE_GENERIC, 0,
+ ASHIFT_CROP_OFF, 0.0f, 1.0f, 0.0f, 1.0f };
+ memcpy(module->params, &tmp, sizeof(dt_iop_ashift_params_t));
+ memcpy(module->default_params, &tmp, sizeof(dt_iop_ashift_params_t));
+}
+
+void reload_defaults(dt_iop_module_t *module)
+{
+ // our module is disabled by default
+ module->default_enabled = 0;
+
+ int isflipped = 0;
+ float f_length = DEFAULT_F_LENGTH;
+ float crop_factor = 1.0f;
+
+ // try to get information on orientation, focal length and crop factor from image data
+ if(module->dev)
+ {
+ const dt_image_t *img = &module->dev->image_storage;
+ // orientation only needed as a-priori information to correctly label some sliders
+ // before pixelpipe has been set up. later we will get a definite result by
+ // assessing the pixelpipe
+ isflipped = (img->orientation == ORIENTATION_ROTATE_CCW_90_DEG
+ || img->orientation == ORIENTATION_ROTATE_CW_90_DEG)
+ ? 1
+ : 0;
+
+ // focal length should be available in exif data if lens is electronically coupled to the camera
+ f_length = isfinite(img->exif_focal_length) && img->exif_focal_length > 0.0f ? img->exif_focal_length : f_length;
+ // crop factor of the camera is often not available and user will need to set it manually in the gui
+ crop_factor = isfinite(img->exif_crop) && img->exif_crop > 0.0f ? img->exif_crop : crop_factor;
+ }
+
+ // init defaults:
+ dt_iop_ashift_params_t tmp = (dt_iop_ashift_params_t){ 0.0f, 0.0f, 0.0f, 0.0f, f_length, crop_factor, 100.0f, 1.0f, ASHIFT_MODE_GENERIC, 0,
+ ASHIFT_CROP_OFF, 0.0f, 1.0f, 0.0f, 1.0f };
+ memcpy(module->params, &tmp, sizeof(dt_iop_ashift_params_t));
+ memcpy(module->default_params, &tmp, sizeof(dt_iop_ashift_params_t));
+
+ // reset gui elements
+ if(module->gui_data)
+ {
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)module->gui_data;
+
+ char string_v[256];
+ char string_h[256];
+
+ snprintf(string_v, sizeof(string_v), _("lens shift (%s)"), isflipped ? _("horizontal") : _("vertical"));
+ snprintf(string_h, sizeof(string_h), _("lens shift (%s)"), isflipped ? _("vertical") : _("horizontal"));
+
+ dt_bauhaus_widget_set_label(g->lensshift_v, NULL, string_v);
+ dt_bauhaus_widget_set_label(g->lensshift_h, NULL, string_h);
+
+ dt_bauhaus_slider_set_default(g->f_length, tmp.f_length);
+ dt_bauhaus_slider_set_default(g->crop_factor, tmp.crop_factor);
+
+ dt_pthread_mutex_lock(&g->lock);
+ free(g->buf);
+ g->buf = NULL;
+ g->buf_width = 0;
+ g->buf_height = 0;
+ g->buf_x_off = 0;
+ g->buf_y_off = 0;
+ g->buf_scale = 1.0f;
+ g->buf_hash = 0;
+ g->isflipped = -1;
+ g->lastfit = ASHIFT_FIT_NONE;
+ dt_pthread_mutex_unlock(&g->lock);
+
+ g->fitting = 0;
+ free(g->lines);
+ g->lines = NULL;
+ g->lines_count =0;
+ g->horizontal_count = 0;
+ g->vertical_count = 0;
+ g->grid_hash = 0;
+ g->lines_hash = 0;
+ g->rotation_range = ROTATION_RANGE_SOFT;
+ g->lensshift_v_range = LENSSHIFT_RANGE_SOFT;
+ g->lensshift_h_range = LENSSHIFT_RANGE_SOFT;
+ g->shear_range = SHEAR_RANGE_SOFT;
+ g->lines_suppressed = 0;
+ g->lines_version = 0;
+ g->show_guides = 0;
+ g->isselecting = 0;
+ g->isdeselecting = 0;
+ g->isbounding = ASHIFT_BOUNDING_OFF;
+ g->near_delta = 0;
+ g->selecting_lines_version = 0;
+
+ free(g->points);
+ g->points = NULL;
+ free(g->points_idx);
+ g->points_idx = NULL;
+ g->points_lines_count = 0;
+ g->points_version = 0;
+
+ g->jobcode = ASHIFT_JOBCODE_NONE;
+ g->jobparams = 0;
+ g->adjust_crop = FALSE;
+ g->lastx = g->lasty = -1.0f;
+ g->crop_cx = g->crop_cy = 1.0f;
+ }
+}
+
+
+void init_global(dt_iop_module_so_t *module)
+{
+ dt_iop_ashift_global_data_t *gd
+ = (dt_iop_ashift_global_data_t *)malloc(sizeof(dt_iop_ashift_global_data_t));
+ module->data = gd;
+
+ const int program = 2; // basic.cl, from programs.conf
+ gd->kernel_ashift_bilinear = dt_opencl_create_kernel(program, "ashift_bilinear");
+ gd->kernel_ashift_bicubic = dt_opencl_create_kernel(program, "ashift_bicubic");
+ gd->kernel_ashift_lanczos2 = dt_opencl_create_kernel(program, "ashift_lanczos2");
+ gd->kernel_ashift_lanczos3 = dt_opencl_create_kernel(program, "ashift_lanczos3");
+}
+
+void cleanup(dt_iop_module_t *module)
+{
+ free(module->params);
+ module->params = NULL;
+}
+
+void cleanup_global(dt_iop_module_so_t *module)
+{
+ dt_iop_ashift_global_data_t *gd = (dt_iop_ashift_global_data_t *)module->data;
+ dt_opencl_free_kernel(gd->kernel_ashift_bilinear);
+ dt_opencl_free_kernel(gd->kernel_ashift_bicubic);
+ dt_opencl_free_kernel(gd->kernel_ashift_lanczos2);
+ dt_opencl_free_kernel(gd->kernel_ashift_lanczos3);
+ free(module->data);
+ module->data = NULL;
+}
+
+// adjust labels of lens shift parameters according to flip status of image
+static gboolean draw(GtkWidget *widget, cairo_t *cr, dt_iop_module_t *self)
+{
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+ if(darktable.gui->reset) return FALSE;
+
+ dt_pthread_mutex_lock(&g->lock);
+ const int isflipped = g->isflipped;
+ dt_pthread_mutex_unlock(&g->lock);
+
+ if(isflipped == -1) return FALSE;
+
+ char string_v[256];
+ char string_h[256];
+
+ snprintf(string_v, sizeof(string_v), _("lens shift (%s)"), isflipped ? _("horizontal") : _("vertical"));
+ snprintf(string_h, sizeof(string_h), _("lens shift (%s)"), isflipped ? _("vertical") : _("horizontal"));
+
+ darktable.gui->reset = 1;
+ dt_bauhaus_widget_set_label(g->lensshift_v, NULL, string_v);
+ dt_bauhaus_widget_set_label(g->lensshift_h, NULL, string_h);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g->eye), g->lines_suppressed);
+ darktable.gui->reset = 0;
+
+ return FALSE;
+}
+
+void gui_focus(struct dt_iop_module_t *self, gboolean in)
+{
+ if(self->enabled)
+ dt_dev_reprocess_all(self->dev);
+}
+
+static float log10_callback(GtkWidget *self, float inval, dt_bauhaus_callback_t dir)
+{
+ float outval;
+ switch(dir)
+ {
+ case DT_BAUHAUS_SET:
+ outval = log10(fmax(inval, 1e-15f));
+ break;
+ case DT_BAUHAUS_GET:
+ outval = exp(M_LN10 * inval);
+ break;
+ default:
+ outval = inval;
+ }
+ return outval;
+}
+
+static float log2_callback(GtkWidget *self, float inval, dt_bauhaus_callback_t dir)
+{
+ float outval;
+ switch(dir)
+ {
+ case DT_BAUHAUS_SET:
+ outval = log(fmax(inval, 1e-15f)) / M_LN2;
+ break;
+ case DT_BAUHAUS_GET:
+ outval = exp(M_LN2 * inval);
+ break;
+ default:
+ outval = inval;
+ }
+ return outval;
+}
+
+void gui_init(struct dt_iop_module_t *self)
+{
+ self->gui_data = malloc(sizeof(dt_iop_ashift_gui_data_t));
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+ dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params;
+
+ dt_pthread_mutex_init(&g->lock, NULL);
+ dt_pthread_mutex_lock(&g->lock);
+ g->buf = NULL;
+ g->buf_width = 0;
+ g->buf_height = 0;
+ g->buf_x_off = 0;
+ g->buf_y_off = 0;
+ g->buf_scale = 1.0f;
+ g->buf_hash = 0;
+ g->isflipped = -1;
+ g->lastfit = ASHIFT_FIT_NONE;
+ dt_pthread_mutex_unlock(&g->lock);
+
+ g->fitting = 0;
+ g->lines = NULL;
+ g->lines_count = 0;
+ g->vertical_count = 0;
+ g->horizontal_count = 0;
+ g->lines_version = 0;
+ g->lines_suppressed = 0;
+ g->points = NULL;
+ g->points_idx = NULL;
+ g->points_lines_count = 0;
+ g->points_version = 0;
+ g->grid_hash = 0;
+ g->lines_hash = 0;
+ g->rotation_range = ROTATION_RANGE_SOFT;
+ g->lensshift_v_range = LENSSHIFT_RANGE_SOFT;
+ g->lensshift_h_range = LENSSHIFT_RANGE_SOFT;
+ g->shear_range = SHEAR_RANGE_SOFT;
+ g->show_guides = 0;
+ g->isselecting = 0;
+ g->isdeselecting = 0;
+ g->isbounding = ASHIFT_BOUNDING_OFF;
+ g->near_delta = 0;
+ g->selecting_lines_version = 0;
+
+ g->jobcode = ASHIFT_JOBCODE_NONE;
+ g->jobparams = 0;
+ g->adjust_crop = FALSE;
+ g->lastx = g->lasty = -1.0f;
+ g->crop_cx = g->crop_cy = 1.0f;
+
+ self->widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, DT_BAUHAUS_SPACE);
+ dt_gui_add_help_link(self->widget, dt_get_help_url(self->op));
+
+ g->rotation = dt_bauhaus_slider_new_with_range(self, -ROTATION_RANGE, ROTATION_RANGE, 0.01*ROTATION_RANGE, p->rotation, 2);
+ dt_bauhaus_widget_set_label(g->rotation, NULL, _("rotation"));
+ dt_bauhaus_slider_set_format(g->rotation, "%.2f°");
+ dt_bauhaus_slider_enable_soft_boundaries(g->rotation, -ROTATION_RANGE_SOFT, ROTATION_RANGE_SOFT);
+ gtk_box_pack_start(GTK_BOX(self->widget), g->rotation, TRUE, TRUE, 0);
+
+ g->lensshift_v = dt_bauhaus_slider_new_with_range(self, -LENSSHIFT_RANGE, LENSSHIFT_RANGE, 0.01*LENSSHIFT_RANGE, p->lensshift_v, 3);
+ dt_bauhaus_widget_set_label(g->lensshift_v, NULL, _("lens shift (vertical)"));
+ dt_bauhaus_slider_enable_soft_boundaries(g->lensshift_v, -LENSSHIFT_RANGE_SOFT, LENSSHIFT_RANGE_SOFT);
+ gtk_box_pack_start(GTK_BOX(self->widget), g->lensshift_v, TRUE, TRUE, 0);
+
+ g->lensshift_h = dt_bauhaus_slider_new_with_range(self, -LENSSHIFT_RANGE, LENSSHIFT_RANGE, 0.01*LENSSHIFT_RANGE, p->lensshift_h, 3);
+ dt_bauhaus_widget_set_label(g->lensshift_h, NULL, _("lens shift (horizontal)"));
+ dt_bauhaus_slider_enable_soft_boundaries(g->lensshift_h, -LENSSHIFT_RANGE_SOFT, LENSSHIFT_RANGE_SOFT);
+ gtk_box_pack_start(GTK_BOX(self->widget), g->lensshift_h, TRUE, TRUE, 0);
+
+ g->shear = dt_bauhaus_slider_new_with_range(self, -SHEAR_RANGE, SHEAR_RANGE, 0.01*SHEAR_RANGE, p->shear, 3);
+ dt_bauhaus_widget_set_label(g->shear, NULL, _("shear"));
+ dt_bauhaus_slider_enable_soft_boundaries(g->shear, -SHEAR_RANGE_SOFT, SHEAR_RANGE_SOFT);
+ gtk_box_pack_start(GTK_BOX(self->widget), g->shear, TRUE, TRUE, 0);
+
+ g->guide_lines = dt_bauhaus_combobox_new(self);
+ dt_bauhaus_widget_set_label(g->guide_lines, NULL, _("guides"));
+ dt_bauhaus_combobox_add(g->guide_lines, _("off"));
+ dt_bauhaus_combobox_add(g->guide_lines, _("on"));
+ gtk_box_pack_start(GTK_BOX(self->widget), g->guide_lines, TRUE, TRUE, 0);
+
+ g->cropmode = dt_bauhaus_combobox_new(self);
+ dt_bauhaus_widget_set_label(g->cropmode, NULL, _("automatic cropping"));
+ dt_bauhaus_combobox_add(g->cropmode, _("off"));
+ dt_bauhaus_combobox_add(g->cropmode, _("largest area"));
+ dt_bauhaus_combobox_add(g->cropmode, _("original format"));
+ gtk_box_pack_start(GTK_BOX(self->widget), g->cropmode, TRUE, TRUE, 0);
+
+ g->mode = dt_bauhaus_combobox_new(self);
+ dt_bauhaus_widget_set_label(g->mode, NULL, _("lens model"));
+ dt_bauhaus_combobox_add(g->mode, _("generic"));
+ dt_bauhaus_combobox_add(g->mode, _("specific"));
+ gtk_box_pack_start(GTK_BOX(self->widget), g->mode, TRUE, TRUE, 0);
+
+ g->f_length = dt_bauhaus_slider_new_with_range(self, 1.0f, 3.0f, 0.01f, 1.0f, 2);
+ dt_bauhaus_widget_set_label(g->f_length, NULL, _("focal length"));
+ dt_bauhaus_slider_set_callback(g->f_length, log10_callback);
+ dt_bauhaus_slider_set_format(g->f_length, "%.0fmm");
+ dt_bauhaus_slider_set_default(g->f_length, DEFAULT_F_LENGTH);
+ dt_bauhaus_slider_set(g->f_length, DEFAULT_F_LENGTH);
+ dt_bauhaus_slider_enable_soft_boundaries(g->f_length, 1.0f, 2000.0f);
+ gtk_box_pack_start(GTK_BOX(self->widget), g->f_length, TRUE, TRUE, 0);
+
+ g->crop_factor = dt_bauhaus_slider_new_with_range(self, 1.0f, 2.0f, 0.01f, p->crop_factor, 2);
+ dt_bauhaus_widget_set_label(g->crop_factor, NULL, _("crop factor"));
+ dt_bauhaus_slider_enable_soft_boundaries(g->crop_factor, 0.5f, 10.0f);
+ gtk_box_pack_start(GTK_BOX(self->widget), g->crop_factor, TRUE, TRUE, 0);
+
+ g->orthocorr = dt_bauhaus_slider_new_with_range(self, 0.0f, 100.0f, 1.0f, p->orthocorr, 2);
+ dt_bauhaus_widget_set_label(g->orthocorr, NULL, _("lens dependence"));
+ dt_bauhaus_slider_set_format(g->orthocorr, "%.0f%%");
+#if 0
+ // this parameter could serve to finetune between generic model (0%) and specific model (100%).
+ // however, users can more easily get the same effect with the aspect adjust parameter so we keep
+ // this one hidden.
+ gtk_box_pack_start(GTK_BOX(self->widget), g->orthocorr, TRUE, TRUE, 0);
+#endif
+
+ g->aspect = dt_bauhaus_slider_new_with_range(self, -1.0f, 1.0f, 0.01f, 0.0f, 2);
+ dt_bauhaus_widget_set_label(g->aspect, NULL, _("aspect adjust"));
+ dt_bauhaus_slider_set_callback(g->aspect, log2_callback);
+ dt_bauhaus_slider_set_default(g->aspect, 1.0f);
+ dt_bauhaus_slider_set(g->aspect, 1.0f);
+ gtk_box_pack_start(GTK_BOX(self->widget), g->aspect, TRUE, TRUE, 0);
+
+ GtkWidget *grid = gtk_grid_new();
+ gtk_grid_set_row_spacing(GTK_GRID(grid), 2 * DT_BAUHAUS_SPACE);
+ gtk_grid_set_column_spacing(GTK_GRID(grid), DT_PIXEL_APPLY_DPI(10));
+
+ GtkWidget *label1 = gtk_label_new(_("automatic fit"));
+ gtk_widget_set_halign(label1, GTK_ALIGN_START);
+ gtk_grid_attach(GTK_GRID(grid), label1, 0, 0, 1, 1);
+
+ g->fit_v = dtgtk_button_new(dtgtk_cairo_paint_perspective, CPF_STYLE_FLAT | CPF_DO_NOT_USE_BORDER | 1, NULL);
+ gtk_widget_set_hexpand(GTK_WIDGET(g->fit_v), TRUE);
+ gtk_widget_set_size_request(g->fit_v, -1, DT_PIXEL_APPLY_DPI(24));
+ gtk_grid_attach_next_to(GTK_GRID(grid), g->fit_v, label1, GTK_POS_RIGHT, 1, 1);
+
+ g->fit_h = dtgtk_button_new(dtgtk_cairo_paint_perspective, CPF_STYLE_FLAT | CPF_DO_NOT_USE_BORDER | 2, NULL);
+ gtk_widget_set_hexpand(GTK_WIDGET(g->fit_h), TRUE);
+ gtk_widget_set_size_request(g->fit_h, -1, DT_PIXEL_APPLY_DPI(24));
+ gtk_grid_attach_next_to(GTK_GRID(grid), g->fit_h, g->fit_v, GTK_POS_RIGHT, 1, 1);
+
+ g->fit_both = dtgtk_button_new(dtgtk_cairo_paint_perspective, CPF_STYLE_FLAT | CPF_DO_NOT_USE_BORDER | 3, NULL);
+ gtk_widget_set_hexpand(GTK_WIDGET(g->fit_both), TRUE);
+ gtk_widget_set_size_request(g->fit_both, -1, DT_PIXEL_APPLY_DPI(24));
+ gtk_grid_attach_next_to(GTK_GRID(grid), g->fit_both, g->fit_h, GTK_POS_RIGHT, 1, 1);
+
+ GtkWidget *label2 = gtk_label_new(_("get structure"));
+ gtk_widget_set_halign(label2, GTK_ALIGN_START);
+ gtk_grid_attach(GTK_GRID(grid), label2, 0, 1, 1, 1);
+
+ g->structure = dtgtk_button_new(dtgtk_cairo_paint_structure, CPF_STYLE_FLAT | CPF_DO_NOT_USE_BORDER, NULL);
+ gtk_widget_set_hexpand(GTK_WIDGET(g->structure), TRUE);
+ gtk_grid_attach_next_to(GTK_GRID(grid), g->structure, label2, GTK_POS_RIGHT, 1, 1);
+
+ g->clean = dtgtk_button_new(dtgtk_cairo_paint_cancel, CPF_STYLE_FLAT | CPF_DO_NOT_USE_BORDER, NULL);
+ gtk_widget_set_hexpand(GTK_WIDGET(g->clean), TRUE);
+ gtk_grid_attach_next_to(GTK_GRID(grid), g->clean, g->structure, GTK_POS_RIGHT, 1, 1);
+
+ g->eye = dtgtk_togglebutton_new(dtgtk_cairo_paint_eye_toggle, CPF_STYLE_FLAT | CPF_DO_NOT_USE_BORDER, NULL);
+ gtk_widget_set_hexpand(GTK_WIDGET(g->eye), TRUE);
+ gtk_grid_attach_next_to(GTK_GRID(grid), g->eye, g->clean, GTK_POS_RIGHT, 1, 1);
+
+ gtk_box_pack_start(GTK_BOX(self->widget), grid, TRUE, TRUE, 0);
+
+ gtk_widget_show_all(g->f_length);
+ gtk_widget_set_no_show_all(g->f_length, TRUE);
+ gtk_widget_show_all(g->crop_factor);
+ gtk_widget_set_no_show_all(g->crop_factor, TRUE);
+ gtk_widget_show_all(g->orthocorr);
+ gtk_widget_set_no_show_all(g->orthocorr, TRUE);
+ gtk_widget_show_all(g->aspect);
+ gtk_widget_set_no_show_all(g->aspect, TRUE);
+
+
+ switch(p->mode)
+ {
+ case ASHIFT_MODE_GENERIC:
+ gtk_widget_hide(g->f_length);
+ gtk_widget_hide(g->crop_factor);
+ gtk_widget_hide(g->orthocorr);
+ gtk_widget_hide(g->aspect);
+ break;
+ case ASHIFT_MODE_SPECIFIC:
+ default:
+ gtk_widget_show(g->f_length);
+ gtk_widget_show(g->crop_factor);
+ gtk_widget_show(g->orthocorr);
+ gtk_widget_show(g->aspect);
+ break;
+ }
+
+ gtk_widget_set_tooltip_text(g->rotation, _("rotate image"));
+ gtk_widget_set_tooltip_text(g->lensshift_v, _("apply lens shift correction in one direction"));
+ gtk_widget_set_tooltip_text(g->lensshift_h, _("apply lens shift correction in one direction"));
+ gtk_widget_set_tooltip_text(g->shear, _("shear the image along one diagonal"));
+ gtk_widget_set_tooltip_text(g->guide_lines, _("display guide lines overlay"));
+ gtk_widget_set_tooltip_text(g->cropmode, _("automatically crop to avoid black edges"));
+ gtk_widget_set_tooltip_text(g->mode, _("lens model of the perspective correction: "
+ "generic or according to the focal length"));
+ gtk_widget_set_tooltip_text(g->f_length, _("focal length of the lens, "
+ "default value set from exif data if available"));
+ gtk_widget_set_tooltip_text(g->crop_factor, _("crop factor of the camera sensor, "
+ "default value set from exif data if available, "
+ "manual setting is often required"));
+ gtk_widget_set_tooltip_text(g->orthocorr, _("the level of lens dependent correction, set to maximum for full lens dependency, "
+ "set to zero for the generic case"));
+ gtk_widget_set_tooltip_text(g->aspect, _("adjust aspect ratio of image by horizontal and vertical scaling"));
+ gtk_widget_set_tooltip_text(g->fit_v, _("automatically correct for vertical perspective distortion\n"
+ "ctrl-click to only fit rotation\n"
+ "shift-click to only fit lens shift"));
+ gtk_widget_set_tooltip_text(g->fit_h, _("automatically correct for horizontal perspective distortion\n"
+ "ctrl-click to only fit rotation\n"
+ "shift-click to only fit lens shift"));
+ gtk_widget_set_tooltip_text(g->fit_both, _("automatically correct for vertical and "
+ "horizontal perspective distortions; fitting rotation,"
+ "lens shift in both directions, and shear\n"
+ "ctrl-click to only fit rotation\n"
+ "shift-click to only fit lens shift\n"
+ "ctrl-shift-click to only fit rotation and lens shift"));
+ gtk_widget_set_tooltip_text(g->structure, _("analyse line structure in image\n"
+ "ctrl-click for an additional edge enhancement\n"
+ "shift-click for an additional detail enhancement\n"
+ "ctrl-shift-click for a combination of both methods"));
+ gtk_widget_set_tooltip_text(g->clean, _("remove line structure information"));
+ gtk_widget_set_tooltip_text(g->eye, _("toggle visibility of structure lines"));
+
+ g_signal_connect(G_OBJECT(g->rotation), "value-changed", G_CALLBACK(rotation_callback), self);
+ g_signal_connect(G_OBJECT(g->lensshift_v), "value-changed", G_CALLBACK(lensshift_v_callback), self);
+ g_signal_connect(G_OBJECT(g->lensshift_h), "value-changed", G_CALLBACK(lensshift_h_callback), self);
+ g_signal_connect(G_OBJECT(g->shear), "value-changed", G_CALLBACK(shear_callback), self);
+ g_signal_connect(G_OBJECT(g->guide_lines), "value-changed", G_CALLBACK(guide_lines_callback), self);
+ g_signal_connect(G_OBJECT(g->cropmode), "value-changed", G_CALLBACK(cropmode_callback), self);
+ g_signal_connect(G_OBJECT(g->mode), "value-changed", G_CALLBACK(mode_callback), self);
+ g_signal_connect(G_OBJECT(g->f_length), "value-changed", G_CALLBACK(f_length_callback), self);
+ g_signal_connect(G_OBJECT(g->crop_factor), "value-changed", G_CALLBACK(crop_factor_callback), self);
+ g_signal_connect(G_OBJECT(g->orthocorr), "value-changed", G_CALLBACK(orthocorr_callback), self);
+ g_signal_connect(G_OBJECT(g->aspect), "value-changed", G_CALLBACK(aspect_callback), self);
+ g_signal_connect(G_OBJECT(g->fit_v), "button-press-event", G_CALLBACK(fit_v_button_clicked), (gpointer)self);
+ g_signal_connect(G_OBJECT(g->fit_h), "button-press-event", G_CALLBACK(fit_h_button_clicked), (gpointer)self);
+ g_signal_connect(G_OBJECT(g->fit_both), "button-press-event", G_CALLBACK(fit_both_button_clicked), (gpointer)self);
+ g_signal_connect(G_OBJECT(g->structure), "button-press-event", G_CALLBACK(structure_button_clicked), (gpointer)self);
+ g_signal_connect(G_OBJECT(g->clean), "clicked", G_CALLBACK(clean_button_clicked), (gpointer)self);
+ g_signal_connect(G_OBJECT(g->eye), "toggled", G_CALLBACK(eye_button_toggled), (gpointer)self);
+ g_signal_connect(G_OBJECT(self->widget), "draw", G_CALLBACK(draw), self);
+
+ /* add signal handler for preview pipe finish to redraw the overlay */
+ dt_control_signal_connect(darktable.signals, DT_SIGNAL_DEVELOP_PREVIEW_PIPE_FINISHED,
+ G_CALLBACK(process_after_preview_callback), self);
+
+}
+
+void gui_cleanup(struct dt_iop_module_t *self)
+{
+ dt_control_signal_disconnect(darktable.signals, G_CALLBACK(process_after_preview_callback), self);
+
+ dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data;
+ dt_pthread_mutex_destroy(&g->lock);
+ free(g->lines);
+ free(g->buf);
+ free(g->points);
+ free(g->points_idx);
+ free(self->gui_data);
+ self->gui_data = NULL;
+}
+#endif // if 0
+//-----------------------------------------------------------------------------
+
+// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.sh
+// vim: shiftwidth=2 expandtab tabstop=2 cindent
+// kate: tab-indents: off; indent-width 2; replace-tabs on; indent-mode cstyle; remove-trailing-spaces modified;
diff --git a/rtengine/ashift_lsd.c b/rtengine/ashift_lsd.c
new file mode 100644
index 000000000..3a0ec5aba
--- /dev/null
+++ b/rtengine/ashift_lsd.c
@@ -0,0 +1,2335 @@
+/*
+ This file is part of darktable,
+ copyright (c) 2016 Ulrich Pegelow.
+
+ darktable is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ darktable is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with darktable. If not, see .
+*/
+
+
+/* For line detection we are using the LSD code as published below.
+ * Changes versus the original code:
+ * do not include "lsd.h" (not needed)
+ * make all interface functions static
+ * comment out unsused interface functions
+ * catch (unlikely) division by zero near line 2035
+ * rename rad1 and rad2 to radius1 and radius2 in reduce_region_radius()
+ * to avoid naming conflict in windows build
+ *
+ */
+
+/* TODO: LSD employs intensive sanity checks of input data and allocation
+ * results. In case of errors it will terminate the program. On the one side
+ * this is not optimal for a module within darktable - it should better
+ * report errors upstream where they should be handled properly. On the other
+ * hand the kind of error which could be triggered in LSD would make it very unlikely
+ * that the darktable process could survive anyhow.
+ */
+
+// clang-format off
+
+/*==================================================================================
+ * begin LSD code version 1.6. downloaded on January 30, 2016
+ *==================================================================================*/
+
+/*----------------------------------------------------------------------------
+
+ LSD - Line Segment Detector on digital images
+
+ This code is part of the following publication and was subject
+ to peer review:
+
+ "LSD: a Line Segment Detector" by Rafael Grompone von Gioi,
+ Jeremie Jakubowicz, Jean-Michel Morel, and Gregory Randall,
+ Image Processing On Line, 2012. DOI:10.5201/ipol.2012.gjmr-lsd
+ http://dx.doi.org/10.5201/ipol.2012.gjmr-lsd
+
+ Copyright (c) 2007-2011 rafael grompone von gioi
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+
+ ----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------*/
+/** @file lsd.c
+ LSD module code
+ @author rafael grompone von gioi
+ */
+/*----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------*/
+/** @mainpage LSD code documentation
+
+ This is an implementation of the Line Segment Detector described
+ in the paper:
+
+ "LSD: A Fast Line Segment Detector with a False Detection Control"
+ by Rafael Grompone von Gioi, Jeremie Jakubowicz, Jean-Michel Morel,
+ and Gregory Randall, IEEE Transactions on Pattern Analysis and
+ Machine Intelligence, vol. 32, no. 4, pp. 722-732, April, 2010.
+
+ and in more details in the CMLA Technical Report:
+
+ "LSD: A Line Segment Detector, Technical Report",
+ by Rafael Grompone von Gioi, Jeremie Jakubowicz, Jean-Michel Morel,
+ Gregory Randall, CMLA, ENS Cachan, 2010.
+
+ The version implemented here includes some further improvements
+ described in the following publication, of which this code is part:
+
+ "LSD: a Line Segment Detector" by Rafael Grompone von Gioi,
+ Jeremie Jakubowicz, Jean-Michel Morel, and Gregory Randall,
+ Image Processing On Line, 2012. DOI:10.5201/ipol.2012.gjmr-lsd
+ http://dx.doi.org/10.5201/ipol.2012.gjmr-lsd
+
+ The module's main function is lsd().
+
+ The source code is contained in two files: lsd.h and lsd.c.
+
+ HISTORY:
+ - version 1.6 - nov 2011:
+ - changes in the interface,
+ - max_grad parameter removed,
+ - the factor 11 was added to the number of test
+ to consider the different precision values
+ tested,
+ - a minor bug corrected in the gradient sorting
+ code,
+ - the algorithm now also returns p and log_nfa
+ for each detection,
+ - a minor bug was corrected in the image scaling,
+ - the angle comparison in "isaligned" changed
+ from < to <=,
+ - "eps" variable renamed "log_eps",
+ - "lsd_scale_region" interface was added,
+ - minor changes to comments.
+ - version 1.5 - dec 2010: Changes in 'refine', -W option added,
+ and more comments added.
+ - version 1.4 - jul 2010: lsd_scale interface added and doxygen doc.
+ - version 1.3 - feb 2010: Multiple bug correction and improved code.
+ - version 1.2 - dec 2009: First full Ansi C Language version.
+ - version 1.1 - sep 2009: Systematic subsampling to scale 0.8 and
+ correction to partially handle "angle problem".
+ - version 1.0 - jan 2009: First complete Megawave2 and Ansi C Language
+ version.
+
+ @author rafael grompone von gioi
+ */
+/*----------------------------------------------------------------------------*/
+
+#include
+#include
+#include
+#include
+#include
+//#include "lsd.h"
+
+/** ln(10) */
+#ifndef M_LN10
+#define M_LN10 2.30258509299404568402
+#endif /* !M_LN10 */
+
+/** PI */
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif /* !M_PI */
+
+#ifndef FALSE
+#define FALSE 0
+#endif /* !FALSE */
+
+#ifndef TRUE
+#define TRUE 1
+#endif /* !TRUE */
+
+/** Label for pixels with undefined gradient. */
+#define NOTDEF -1024.0
+
+/** 3/2 pi */
+#define M_3_2_PI 4.71238898038
+
+/** 2 pi */
+#define M_2__PI 6.28318530718
+
+/** Label for pixels not used in yet. */
+#define NOTUSED 0
+
+/** Label for pixels already used in detection. */
+#define USED 1
+
+/*----------------------------------------------------------------------------*/
+/** Chained list of coordinates.
+ */
+struct coorlist
+{
+ int x,y;
+ struct coorlist * next;
+};
+
+/*----------------------------------------------------------------------------*/
+/** A point (or pixel).
+ */
+struct point {int x,y;};
+
+
+/*----------------------------------------------------------------------------*/
+/*------------------------- Miscellaneous functions --------------------------*/
+/*----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------*/
+/** Fatal error, print a message to standard-error output and exit.
+ */
+static void error(const char * msg)
+{
+ fprintf(stderr,"LSD Error: %s\n",msg);
+ exit(EXIT_FAILURE);
+}
+
+/*----------------------------------------------------------------------------*/
+/** Doubles relative error factor
+ */
+#define RELATIVE_ERROR_FACTOR 100.0
+
+/*----------------------------------------------------------------------------*/
+/** Compare doubles by relative error.
+
+ The resulting rounding error after floating point computations
+ depend on the specific operations done. The same number computed by
+ different algorithms could present different rounding errors. For a
+ useful comparison, an estimation of the relative rounding error
+ should be considered and compared to a factor times EPS. The factor
+ should be related to the cumulated rounding error in the chain of
+ computation. Here, as a simplification, a fixed factor is used.
+ */
+static int double_equal(double a, double b)
+{
+ double abs_diff,aa,bb,abs_max;
+
+ /* trivial case */
+ if( a == b ) return TRUE;
+
+ abs_diff = fabs(a-b);
+ aa = fabs(a);
+ bb = fabs(b);
+ abs_max = aa > bb ? aa : bb;
+
+ /* DBL_MIN is the smallest normalized number, thus, the smallest
+ number whose relative error is bounded by DBL_EPSILON. For
+ smaller numbers, the same quantization steps as for DBL_MIN
+ are used. Then, for smaller numbers, a meaningful "relative"
+ error should be computed by dividing the difference by DBL_MIN. */
+ if( abs_max < DBL_MIN ) abs_max = DBL_MIN;
+
+ /* equal if relative error <= factor x eps */
+ return (abs_diff / abs_max) <= (RELATIVE_ERROR_FACTOR * DBL_EPSILON);
+}
+
+/*----------------------------------------------------------------------------*/
+/** Computes Euclidean distance between point (x1,y1) and point (x2,y2).
+ */
+static double dist(double x1, double y1, double x2, double y2)
+{
+ return sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) );
+}
+
+
+/*----------------------------------------------------------------------------*/
+/*----------------------- 'list of n-tuple' data type ------------------------*/
+/*----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------*/
+/** 'list of n-tuple' data type
+
+ The i-th component of the j-th n-tuple of an n-tuple list 'ntl'
+ is accessed with:
+
+ ntl->values[ i + j * ntl->dim ]
+
+ The dimension of the n-tuple (n) is:
+
+ ntl->dim
+
+ The number of n-tuples in the list is:
+
+ ntl->size
+
+ The maximum number of n-tuples that can be stored in the
+ list with the allocated memory at a given time is given by:
+
+ ntl->max_size
+ */
+typedef struct ntuple_list_s
+{
+ unsigned int size;
+ unsigned int max_size;
+ unsigned int dim;
+ double * values;
+} * ntuple_list;
+
+/*----------------------------------------------------------------------------*/
+/** Free memory used in n-tuple 'in'.
+ */
+static void free_ntuple_list(ntuple_list in)
+{
+ if( in == NULL || in->values == NULL )
+ error("free_ntuple_list: invalid n-tuple input.");
+ free( (void *) in->values );
+ free( (void *) in );
+}
+
+/*----------------------------------------------------------------------------*/
+/** Create an n-tuple list and allocate memory for one element.
+ @param dim the dimension (n) of the n-tuple.
+ */
+static ntuple_list new_ntuple_list(unsigned int dim)
+{
+ ntuple_list n_tuple;
+
+ /* check parameters */
+ if( dim == 0 ) error("new_ntuple_list: 'dim' must be positive.");
+
+ /* get memory for list structure */
+ n_tuple = (ntuple_list) malloc( sizeof(struct ntuple_list_s) );
+ if( n_tuple == NULL ) error("not enough memory.");
+
+ /* initialize list */
+ n_tuple->size = 0;
+ n_tuple->max_size = 1;
+ n_tuple->dim = dim;
+
+ /* get memory for tuples */
+ n_tuple->values = (double *) malloc( sizeof(double) * dim*n_tuple->max_size );
+ if( n_tuple->values == NULL ) error("not enough memory.");
+
+ return n_tuple;
+}
+
+/*----------------------------------------------------------------------------*/
+/** Enlarge the allocated memory of an n-tuple list.
+ */
+static void enlarge_ntuple_list(ntuple_list n_tuple)
+{
+ /* check parameters */
+ if( n_tuple == NULL || n_tuple->values == NULL || n_tuple->max_size == 0 )
+ error("enlarge_ntuple_list: invalid n-tuple.");
+
+ /* duplicate number of tuples */
+ n_tuple->max_size *= 2;
+
+ /* realloc memory */
+ n_tuple->values = (double *) realloc( (void *) n_tuple->values,
+ sizeof(double) * n_tuple->dim * n_tuple->max_size );
+ if( n_tuple->values == NULL ) error("not enough memory.");
+}
+
+/*----------------------------------------------------------------------------*/
+/** Add a 7-tuple to an n-tuple list.
+ */
+static void add_7tuple( ntuple_list out, double v1, double v2, double v3,
+ double v4, double v5, double v6, double v7 )
+{
+ /* check parameters */
+ if( out == NULL ) error("add_7tuple: invalid n-tuple input.");
+ if( out->dim != 7 ) error("add_7tuple: the n-tuple must be a 7-tuple.");
+
+ /* if needed, alloc more tuples to 'out' */
+ if( out->size == out->max_size ) enlarge_ntuple_list(out);
+ if( out->values == NULL ) error("add_7tuple: invalid n-tuple input.");
+
+ /* add new 7-tuple */
+ out->values[ out->size * out->dim + 0 ] = v1;
+ out->values[ out->size * out->dim + 1 ] = v2;
+ out->values[ out->size * out->dim + 2 ] = v3;
+ out->values[ out->size * out->dim + 3 ] = v4;
+ out->values[ out->size * out->dim + 4 ] = v5;
+ out->values[ out->size * out->dim + 5 ] = v6;
+ out->values[ out->size * out->dim + 6 ] = v7;
+
+ /* update number of tuples counter */
+ out->size++;
+}
+
+
+/*----------------------------------------------------------------------------*/
+/*----------------------------- Image Data Types -----------------------------*/
+/*----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------*/
+/** char image data type
+
+ The pixel value at (x,y) is accessed by:
+
+ image->data[ x + y * image->xsize ]
+
+ with x and y integer.
+ */
+typedef struct image_char_s
+{
+ unsigned char * data;
+ unsigned int xsize,ysize;
+} * image_char;
+
+/*----------------------------------------------------------------------------*/
+/** Free memory used in image_char 'i'.
+ */
+static void free_image_char(image_char i)
+{
+ if( i == NULL || i->data == NULL )
+ error("free_image_char: invalid input image.");
+ free( (void *) i->data );
+ free( (void *) i );
+}
+
+/*----------------------------------------------------------------------------*/
+/** Create a new image_char of size 'xsize' times 'ysize'.
+ */
+static image_char new_image_char(unsigned int xsize, unsigned int ysize)
+{
+ image_char image;
+
+ /* check parameters */
+ if( xsize == 0 || ysize == 0 ) error("new_image_char: invalid image size.");
+
+ /* get memory */
+ image = (image_char) malloc( sizeof(struct image_char_s) );
+ if( image == NULL ) error("not enough memory.");
+ image->data = (unsigned char *) calloc( (size_t) (xsize*ysize),
+ sizeof(unsigned char) );
+ if( image->data == NULL ) error("not enough memory.");
+
+ /* set image size */
+ image->xsize = xsize;
+ image->ysize = ysize;
+
+ return image;
+}
+
+/*----------------------------------------------------------------------------*/
+/** Create a new image_char of size 'xsize' times 'ysize',
+ initialized to the value 'fill_value'.
+ */
+static image_char new_image_char_ini( unsigned int xsize, unsigned int ysize,
+ unsigned char fill_value )
+{
+ image_char image = new_image_char(xsize,ysize); /* create image */
+ unsigned int N = xsize*ysize;
+ unsigned int i;
+
+ /* check parameters */
+ if( image == NULL || image->data == NULL )
+ error("new_image_char_ini: invalid image.");
+
+ /* initialize */
+ for(i=0; idata[i] = fill_value;
+
+ return image;
+}
+
+/*----------------------------------------------------------------------------*/
+/** int image data type
+
+ The pixel value at (x,y) is accessed by:
+
+ image->data[ x + y * image->xsize ]
+
+ with x and y integer.
+ */
+typedef struct image_int_s
+{
+ int * data;
+ unsigned int xsize,ysize;
+} * image_int;
+
+/*----------------------------------------------------------------------------*/
+/** Create a new image_int of size 'xsize' times 'ysize'.
+ */
+static image_int new_image_int(unsigned int xsize, unsigned int ysize)
+{
+ image_int image;
+
+ /* check parameters */
+ if( xsize == 0 || ysize == 0 ) error("new_image_int: invalid image size.");
+
+ /* get memory */
+ image = (image_int) malloc( sizeof(struct image_int_s) );
+ if( image == NULL ) error("not enough memory.");
+ image->data = (int *) calloc( (size_t) (xsize*ysize), sizeof(int) );
+ if( image->data == NULL ) error("not enough memory.");
+
+ /* set image size */
+ image->xsize = xsize;
+ image->ysize = ysize;
+
+ return image;
+}
+
+/*----------------------------------------------------------------------------*/
+/** Create a new image_int of size 'xsize' times 'ysize',
+ initialized to the value 'fill_value'.
+ */
+static image_int new_image_int_ini( unsigned int xsize, unsigned int ysize,
+ int fill_value )
+{
+ image_int image = new_image_int(xsize,ysize); /* create image */
+ unsigned int N = xsize*ysize;
+ unsigned int i;
+
+ /* initialize */
+ for(i=0; idata[i] = fill_value;
+
+ return image;
+}
+
+/*----------------------------------------------------------------------------*/
+/** double image data type
+
+ The pixel value at (x,y) is accessed by:
+
+ image->data[ x + y * image->xsize ]
+
+ with x and y integer.
+ */
+typedef struct image_double_s
+{
+ double * data;
+ unsigned int xsize,ysize;
+} * image_double;
+
+/*----------------------------------------------------------------------------*/
+/** Free memory used in image_double 'i'.
+ */
+static void free_image_double(image_double i)
+{
+ if( i == NULL || i->data == NULL )
+ error("free_image_double: invalid input image.");
+ free( (void *) i->data );
+ free( (void *) i );
+}
+
+/*----------------------------------------------------------------------------*/
+/** Create a new image_double of size 'xsize' times 'ysize'.
+ */
+static image_double new_image_double(unsigned int xsize, unsigned int ysize)
+{
+ image_double image;
+
+ /* check parameters */
+ if( xsize == 0 || ysize == 0 ) error("new_image_double: invalid image size.");
+
+ /* get memory */
+ image = (image_double) malloc( sizeof(struct image_double_s) );
+ if( image == NULL ) error("not enough memory.");
+ image->data = (double *) calloc( (size_t) (xsize*ysize), sizeof(double) );
+ if( image->data == NULL ) error("not enough memory.");
+
+ /* set image size */
+ image->xsize = xsize;
+ image->ysize = ysize;
+
+ return image;
+}
+
+/*----------------------------------------------------------------------------*/
+/** Create a new image_double of size 'xsize' times 'ysize'
+ with the data pointed by 'data'.
+ */
+static image_double new_image_double_ptr( unsigned int xsize,
+ unsigned int ysize, double * data )
+{
+ image_double image;
+
+ /* check parameters */
+ if( xsize == 0 || ysize == 0 )
+ error("new_image_double_ptr: invalid image size.");
+ if( data == NULL ) error("new_image_double_ptr: NULL data pointer.");
+
+ /* get memory */
+ image = (image_double) malloc( sizeof(struct image_double_s) );
+ if( image == NULL ) error("not enough memory.");
+
+ /* set image */
+ image->xsize = xsize;
+ image->ysize = ysize;
+ image->data = data;
+
+ return image;
+}
+
+
+/*----------------------------------------------------------------------------*/
+/*----------------------------- Gaussian filter ------------------------------*/
+/*----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------*/
+/** Compute a Gaussian kernel of length 'kernel->dim',
+ standard deviation 'sigma', and centered at value 'mean'.
+
+ For example, if mean=0.5, the Gaussian will be centered
+ in the middle point between values 'kernel->values[0]'
+ and 'kernel->values[1]'.
+ */
+static void gaussian_kernel(ntuple_list kernel, double sigma, double mean)
+{
+ double sum = 0.0;
+ double val;
+ unsigned int i;
+
+ /* check parameters */
+ if( kernel == NULL || kernel->values == NULL )
+ error("gaussian_kernel: invalid n-tuple 'kernel'.");
+ if( sigma <= 0.0 ) error("gaussian_kernel: 'sigma' must be positive.");
+
+ /* compute Gaussian kernel */
+ if( kernel->max_size < 1 ) enlarge_ntuple_list(kernel);
+ kernel->size = 1;
+ for(i=0;idim;i++)
+ {
+ val = ( (double) i - mean ) / sigma;
+ kernel->values[i] = exp( -0.5 * val * val );
+ sum += kernel->values[i];
+ }
+
+ /* normalization */
+ if( sum >= 0.0 ) for(i=0;idim;i++) kernel->values[i] /= sum;
+}
+
+/*----------------------------------------------------------------------------*/
+/** Scale the input image 'in' by a factor 'scale' by Gaussian sub-sampling.
+
+ For example, scale=0.8 will give a result at 80% of the original size.
+
+ The image is convolved with a Gaussian kernel
+ @f[
+ G(x,y) = \frac{1}{2\pi\sigma^2} e^{-\frac{x^2+y^2}{2\sigma^2}}
+ @f]
+ before the sub-sampling to prevent aliasing.
+
+ The standard deviation sigma given by:
+ - sigma = sigma_scale / scale, if scale < 1.0
+ - sigma = sigma_scale, if scale >= 1.0
+
+ To be able to sub-sample at non-integer steps, some interpolation
+ is needed. In this implementation, the interpolation is done by
+ the Gaussian kernel, so both operations (filtering and sampling)
+ are done at the same time. The Gaussian kernel is computed
+ centered on the coordinates of the required sample. In this way,
+ when applied, it gives directly the result of convolving the image
+ with the kernel and interpolated to that particular position.
+
+ A fast algorithm is done using the separability of the Gaussian
+ kernel. Applying the 2D Gaussian kernel is equivalent to applying
+ first a horizontal 1D Gaussian kernel and then a vertical 1D
+ Gaussian kernel (or the other way round). The reason is that
+ @f[
+ G(x,y) = G(x) * G(y)
+ @f]
+ where
+ @f[
+ G(x) = \frac{1}{\sqrt{2\pi}\sigma} e^{-\frac{x^2}{2\sigma^2}}.
+ @f]
+ The algorithm first applies a combined Gaussian kernel and sampling
+ in the x axis, and then the combined Gaussian kernel and sampling
+ in the y axis.
+ */
+static image_double gaussian_sampler( image_double in, double scale,
+ double sigma_scale )
+{
+ image_double aux,out;
+ ntuple_list kernel;
+ unsigned int N,M,h,n,x,y,i;
+ int xc,yc,j,double_x_size,double_y_size;
+ double sigma,xx,yy,sum,prec;
+
+ /* check parameters */
+ if( in == NULL || in->data == NULL || in->xsize == 0 || in->ysize == 0 )
+ error("gaussian_sampler: invalid image.");
+ if( scale <= 0.0 ) error("gaussian_sampler: 'scale' must be positive.");
+ if( sigma_scale <= 0.0 )
+ error("gaussian_sampler: 'sigma_scale' must be positive.");
+
+ /* compute new image size and get memory for images */
+ if( in->xsize * scale > (double) UINT_MAX ||
+ in->ysize * scale > (double) UINT_MAX )
+ error("gaussian_sampler: the output image size exceeds the handled size.");
+ N = (unsigned int) ceil( in->xsize * scale );
+ M = (unsigned int) ceil( in->ysize * scale );
+ aux = new_image_double(N,in->ysize);
+ out = new_image_double(N,M);
+
+ /* sigma, kernel size and memory for the kernel */
+ sigma = scale < 1.0 ? sigma_scale / scale : sigma_scale;
+ /*
+ The size of the kernel is selected to guarantee that the
+ the first discarded term is at least 10^prec times smaller
+ than the central value. For that, h should be larger than x, with
+ e^(-x^2/2sigma^2) = 1/10^prec.
+ Then,
+ x = sigma * sqrt( 2 * prec * ln(10) ).
+ */
+ prec = 3.0;
+ h = (unsigned int) ceil( sigma * sqrt( 2.0 * prec * log(10.0) ) );
+ n = 1+2*h; /* kernel size */
+ kernel = new_ntuple_list(n);
+
+ /* auxiliary double image size variables */
+ double_x_size = (int) (2 * in->xsize);
+ double_y_size = (int) (2 * in->ysize);
+
+ /* First subsampling: x axis */
+ for(x=0;xxsize;x++)
+ {
+ /*
+ x is the coordinate in the new image.
+ xx is the corresponding x-value in the original size image.
+ xc is the integer value, the pixel coordinate of xx.
+ */
+ xx = (double) x / scale;
+ /* coordinate (0.0,0.0) is in the center of pixel (0,0),
+ so the pixel with xc=0 get the values of xx from -0.5 to 0.5 */
+ xc = (int) floor( xx + 0.5 );
+ gaussian_kernel( kernel, sigma, (double) h + xx - (double) xc );
+ /* the kernel must be computed for each x because the fine
+ offset xx-xc is different in each case */
+
+ for(y=0;yysize;y++)
+ {
+ sum = 0.0;
+ for(i=0;idim;i++)
+ {
+ j = xc - h + i;
+
+ /* symmetry boundary condition */
+ while( j < 0 ) j += double_x_size;
+ while( j >= double_x_size ) j -= double_x_size;
+ if( j >= (int) in->xsize ) j = double_x_size-1-j;
+
+ sum += in->data[ j + y * in->xsize ] * kernel->values[i];
+ }
+ aux->data[ x + y * aux->xsize ] = sum;
+ }
+ }
+
+ /* Second subsampling: y axis */
+ for(y=0;yysize;y++)
+ {
+ /*
+ y is the coordinate in the new image.
+ yy is the corresponding x-value in the original size image.
+ yc is the integer value, the pixel coordinate of xx.
+ */
+ yy = (double) y / scale;
+ /* coordinate (0.0,0.0) is in the center of pixel (0,0),
+ so the pixel with yc=0 get the values of yy from -0.5 to 0.5 */
+ yc = (int) floor( yy + 0.5 );
+ gaussian_kernel( kernel, sigma, (double) h + yy - (double) yc );
+ /* the kernel must be computed for each y because the fine
+ offset yy-yc is different in each case */
+
+ for(x=0;xxsize;x++)
+ {
+ sum = 0.0;
+ for(i=0;idim;i++)
+ {
+ j = yc - h + i;
+
+ /* symmetry boundary condition */
+ while( j < 0 ) j += double_y_size;
+ while( j >= double_y_size ) j -= double_y_size;
+ if( j >= (int) in->ysize ) j = double_y_size-1-j;
+
+ sum += aux->data[ x + j * aux->xsize ] * kernel->values[i];
+ }
+ out->data[ x + y * out->xsize ] = sum;
+ }
+ }
+
+ /* free memory */
+ free_ntuple_list(kernel);
+ free_image_double(aux);
+
+ return out;
+}
+
+
+/*----------------------------------------------------------------------------*/
+/*--------------------------------- Gradient ---------------------------------*/
+/*----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------*/
+/** Computes the direction of the level line of 'in' at each point.
+
+ The result is:
+ - an image_double with the angle at each pixel, or NOTDEF if not defined.
+ - the image_double 'modgrad' (a pointer is passed as argument)
+ with the gradient magnitude at each point.
+ - a list of pixels 'list_p' roughly ordered by decreasing
+ gradient magnitude. (The order is made by classifying points
+ into bins by gradient magnitude. The parameters 'n_bins' and
+ 'max_grad' specify the number of bins and the gradient modulus
+ at the highest bin. The pixels in the list would be in
+ decreasing gradient magnitude, up to a precision of the size of
+ the bins.)
+ - a pointer 'mem_p' to the memory used by 'list_p' to be able to
+ free the memory when it is not used anymore.
+ */
+static image_double ll_angle( image_double in, double threshold,
+ struct coorlist ** list_p, void ** mem_p,
+ image_double * modgrad, unsigned int n_bins )
+{
+ image_double g;
+ unsigned int n,p,x,y,adr,i;
+ double com1,com2,gx,gy,norm,norm2;
+ /* the rest of the variables are used for pseudo-ordering
+ the gradient magnitude values */
+ int list_count = 0;
+ struct coorlist * list;
+ struct coorlist ** range_l_s; /* array of pointers to start of bin list */
+ struct coorlist ** range_l_e; /* array of pointers to end of bin list */
+ struct coorlist * start;
+ struct coorlist * end;
+ double max_grad = 0.0;
+
+ /* check parameters */
+ if( in == NULL || in->data == NULL || in->xsize == 0 || in->ysize == 0 )
+ error("ll_angle: invalid image.");
+ if( threshold < 0.0 ) error("ll_angle: 'threshold' must be positive.");
+ if( list_p == NULL ) error("ll_angle: NULL pointer 'list_p'.");
+ if( mem_p == NULL ) error("ll_angle: NULL pointer 'mem_p'.");
+ if( modgrad == NULL ) error("ll_angle: NULL pointer 'modgrad'.");
+ if( n_bins == 0 ) error("ll_angle: 'n_bins' must be positive.");
+
+ /* image size shortcuts */
+ n = in->ysize;
+ p = in->xsize;
+
+ /* allocate output image */
+ g = new_image_double(in->xsize,in->ysize);
+
+ /* get memory for the image of gradient modulus */
+ *modgrad = new_image_double(in->xsize,in->ysize);
+
+ /* get memory for "ordered" list of pixels */
+ list = (struct coorlist *) calloc( (size_t) (n*p), sizeof(struct coorlist) );
+ *mem_p = (void *) list;
+ range_l_s = (struct coorlist **) calloc( (size_t) n_bins,
+ sizeof(struct coorlist *) );
+ range_l_e = (struct coorlist **) calloc( (size_t) n_bins,
+ sizeof(struct coorlist *) );
+ if( list == NULL || range_l_s == NULL || range_l_e == NULL )
+ error("not enough memory.");
+ for(i=0;idata[(n-1)*p+x] = NOTDEF;
+ for(y=0;ydata[p*y+p-1] = NOTDEF;
+
+ /* compute gradient on the remaining pixels */
+ for(x=0;xdata[adr+p+1] - in->data[adr];
+ com2 = in->data[adr+1] - in->data[adr+p];
+
+ gx = com1+com2; /* gradient x component */
+ gy = com1-com2; /* gradient y component */
+ norm2 = gx*gx+gy*gy;
+ norm = sqrt( norm2 / 4.0 ); /* gradient norm */
+
+ (*modgrad)->data[adr] = norm; /* store gradient norm */
+
+ if( norm <= threshold ) /* norm too small, gradient no defined */
+ g->data[adr] = NOTDEF; /* gradient angle not defined */
+ else
+ {
+ /* gradient angle computation */
+ g->data[adr] = atan2(gx,-gy);
+
+ /* look for the maximum of the gradient */
+ if( norm > max_grad ) max_grad = norm;
+ }
+ }
+
+ /* compute histogram of gradient values */
+ for(x=0;xdata[y*p+x];
+
+ /* store the point in the right bin according to its norm */
+ i = (unsigned int) (norm * (double) n_bins / max_grad);
+ if( i >= n_bins ) i = n_bins-1;
+ if( range_l_e[i] == NULL )
+ range_l_s[i] = range_l_e[i] = list+list_count++;
+ else
+ {
+ range_l_e[i]->next = list+list_count;
+ range_l_e[i] = list+list_count++;
+ }
+ range_l_e[i]->x = (int) x;
+ range_l_e[i]->y = (int) y;
+ range_l_e[i]->next = NULL;
+ }
+
+ /* Make the list of pixels (almost) ordered by norm value.
+ It starts by the larger bin, so the list starts by the
+ pixels with the highest gradient value. Pixels would be ordered
+ by norm value, up to a precision given by max_grad/n_bins.
+ */
+ for(i=n_bins-1; i>0 && range_l_s[i]==NULL; i--);
+ start = range_l_s[i];
+ end = range_l_e[i];
+ if( start != NULL )
+ while(i>0)
+ {
+ --i;
+ if( range_l_s[i] != NULL )
+ {
+ end->next = range_l_s[i];
+ end = range_l_e[i];
+ }
+ }
+ *list_p = start;
+
+ /* free memory */
+ free( (void *) range_l_s );
+ free( (void *) range_l_e );
+
+ return g;
+}
+
+/*----------------------------------------------------------------------------*/
+/** Is point (x,y) aligned to angle theta, up to precision 'prec'?
+ */
+static int isaligned( int x, int y, image_double angles, double theta,
+ double prec )
+{
+ double a;
+
+ /* check parameters */
+ if( angles == NULL || angles->data == NULL )
+ error("isaligned: invalid image 'angles'.");
+ if( x < 0 || y < 0 || x >= (int) angles->xsize || y >= (int) angles->ysize )
+ error("isaligned: (x,y) out of the image.");
+ if( prec < 0.0 ) error("isaligned: 'prec' must be positive.");
+
+ /* angle at pixel (x,y) */
+ a = angles->data[ x + y * angles->xsize ];
+
+ /* pixels whose level-line angle is not defined
+ are considered as NON-aligned */
+ if( a == NOTDEF ) return FALSE; /* there is no need to call the function
+ 'double_equal' here because there is
+ no risk of problems related to the
+ comparison doubles, we are only
+ interested in the exact NOTDEF value */
+
+ /* it is assumed that 'theta' and 'a' are in the range [-pi,pi] */
+ theta -= a;
+ if( theta < 0.0 ) theta = -theta;
+ if( theta > M_3_2_PI )
+ {
+ theta -= M_2__PI;
+ if( theta < 0.0 ) theta = -theta;
+ }
+
+ return theta <= prec;
+}
+
+/*----------------------------------------------------------------------------*/
+/** Absolute value angle difference.
+ */
+static double angle_diff(double a, double b)
+{
+ a -= b;
+ while( a <= -M_PI ) a += M_2__PI;
+ while( a > M_PI ) a -= M_2__PI;
+ if( a < 0.0 ) a = -a;
+ return a;
+}
+
+/*----------------------------------------------------------------------------*/
+/** Signed angle difference.
+ */
+static double angle_diff_signed(double a, double b)
+{
+ a -= b;
+ while( a <= -M_PI ) a += M_2__PI;
+ while( a > M_PI ) a -= M_2__PI;
+ return a;
+}
+
+
+/*----------------------------------------------------------------------------*/
+/*----------------------------- NFA computation ------------------------------*/
+/*----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------*/
+/** Computes the natural logarithm of the absolute value of
+ the gamma function of x using the Lanczos approximation.
+ See http://www.rskey.org/gamma.htm
+
+ The formula used is
+ @f[
+ \Gamma(x) = \frac{ \sum_{n=0}^{N} q_n x^n }{ \Pi_{n=0}^{N} (x+n) }
+ (x+5.5)^{x+0.5} e^{-(x+5.5)}
+ @f]
+ so
+ @f[
+ \log\Gamma(x) = \log\left( \sum_{n=0}^{N} q_n x^n \right)
+ + (x+0.5) \log(x+5.5) - (x+5.5) - \sum_{n=0}^{N} \log(x+n)
+ @f]
+ and
+ q0 = 75122.6331530,
+ q1 = 80916.6278952,
+ q2 = 36308.2951477,
+ q3 = 8687.24529705,
+ q4 = 1168.92649479,
+ q5 = 83.8676043424,
+ q6 = 2.50662827511.
+ */
+static double log_gamma_lanczos(double x)
+{
+ static double q[7] = { 75122.6331530, 80916.6278952, 36308.2951477,
+ 8687.24529705, 1168.92649479, 83.8676043424,
+ 2.50662827511 };
+ double a = (x+0.5) * log(x+5.5) - (x+5.5);
+ double b = 0.0;
+ int n;
+
+ for(n=0;n<7;n++)
+ {
+ a -= log( x + (double) n );
+ b += q[n] * pow( x, (double) n );
+ }
+ return a + log(b);
+}
+
+/*----------------------------------------------------------------------------*/
+/** Computes the natural logarithm of the absolute value of
+ the gamma function of x using Windschitl method.
+ See http://www.rskey.org/gamma.htm
+
+ The formula used is
+ @f[
+ \Gamma(x) = \sqrt{\frac{2\pi}{x}} \left( \frac{x}{e}
+ \sqrt{ x\sinh(1/x) + \frac{1}{810x^6} } \right)^x
+ @f]
+ so
+ @f[
+ \log\Gamma(x) = 0.5\log(2\pi) + (x-0.5)\log(x) - x
+ + 0.5x\log\left( x\sinh(1/x) + \frac{1}{810x^6} \right).
+ @f]
+ This formula is a good approximation when x > 15.
+ */
+static double log_gamma_windschitl(double x)
+{
+ return 0.918938533204673 + (x-0.5)*log(x) - x
+ + 0.5*x*log( x*sinh(1/x) + 1/(810.0*pow(x,6.0)) );
+}
+
+/*----------------------------------------------------------------------------*/
+/** Computes the natural logarithm of the absolute value of
+ the gamma function of x. When x>15 use log_gamma_windschitl(),
+ otherwise use log_gamma_lanczos().
+ */
+#define log_gamma(x) ((x)>15.0?log_gamma_windschitl(x):log_gamma_lanczos(x))
+
+/*----------------------------------------------------------------------------*/
+/** Size of the table to store already computed inverse values.
+ */
+#define TABSIZE 100000
+
+// clang-format on
+
+static double *inv = NULL; /* table to keep computed inverse values */
+
+__attribute__((constructor)) static void invConstructor()
+{
+ if(inv) return;
+ inv = (double *)malloc(sizeof(double) * TABSIZE);
+}
+
+__attribute__((destructor)) static void invDestructor()
+{
+ free(inv);
+ inv = NULL;
+}
+
+// clang-format off
+
+/*----------------------------------------------------------------------------*/
+/** Computes -log10(NFA).
+
+ NFA stands for Number of False Alarms:
+ @f[
+ \mathrm{NFA} = NT \cdot B(n,k,p)
+ @f]
+
+ - NT - number of tests
+ - B(n,k,p) - tail of binomial distribution with parameters n,k and p:
+ @f[
+ B(n,k,p) = \sum_{j=k}^n
+ \left(\begin{array}{c}n\\j\end{array}\right)
+ p^{j} (1-p)^{n-j}
+ @f]
+
+ The value -log10(NFA) is equivalent but more intuitive than NFA:
+ - -1 corresponds to 10 mean false alarms
+ - 0 corresponds to 1 mean false alarm
+ - 1 corresponds to 0.1 mean false alarms
+ - 2 corresponds to 0.01 mean false alarms
+ - ...
+
+ Used this way, the bigger the value, better the detection,
+ and a logarithmic scale is used.
+
+ @param n,k,p binomial parameters.
+ @param logNT logarithm of Number of Tests
+
+ The computation is based in the gamma function by the following
+ relation:
+ @f[
+ \left(\begin{array}{c}n\\k\end{array}\right)
+ = \frac{ \Gamma(n+1) }{ \Gamma(k+1) \cdot \Gamma(n-k+1) }.
+ @f]
+ We use efficient algorithms to compute the logarithm of
+ the gamma function.
+
+ To make the computation faster, not all the sum is computed, part
+ of the terms are neglected based on a bound to the error obtained
+ (an error of 10% in the result is accepted).
+ */
+static double nfa(int n, int k, double p, double logNT)
+{
+ double tolerance = 0.1; /* an error of 10% in the result is accepted */
+ double log1term,term,bin_term,mult_term,bin_tail,err,p_term;
+ int i;
+
+ /* check parameters */
+ if( n<0 || k<0 || k>n || p<=0.0 || p>=1.0 )
+ error("nfa: wrong n, k or p values.");
+
+ /* trivial cases */
+ if( n==0 || k==0 ) return -logNT;
+ if( n==k ) return -logNT - (double) n * log10(p);
+
+ /* probability term */
+ p_term = p / (1.0-p);
+
+ /* compute the first term of the series */
+ /*
+ binomial_tail(n,k,p) = sum_{i=k}^n bincoef(n,i) * p^i * (1-p)^{n-i}
+ where bincoef(n,i) are the binomial coefficients.
+ But
+ bincoef(n,k) = gamma(n+1) / ( gamma(k+1) * gamma(n-k+1) ).
+ We use this to compute the first term. Actually the log of it.
+ */
+ log1term = log_gamma( (double) n + 1.0 ) - log_gamma( (double) k + 1.0 )
+ - log_gamma( (double) (n-k) + 1.0 )
+ + (double) k * log(p) + (double) (n-k) * log(1.0-p);
+ term = exp(log1term);
+
+ /* in some cases no more computations are needed */
+ if( double_equal(term,0.0) ) /* the first term is almost zero */
+ {
+ if( (double) k > (double) n * p ) /* at begin or end of the tail? */
+ return -log1term / M_LN10 - logNT; /* end: use just the first term */
+ else
+ return -logNT; /* begin: the tail is roughly 1 */
+ }
+
+ /* compute more terms if needed */
+ bin_tail = term;
+ for(i=k+1;i<=n;i++)
+ {
+ /*
+ As
+ term_i = bincoef(n,i) * p^i * (1-p)^(n-i)
+ and
+ bincoef(n,i)/bincoef(n,i-1) = n-1+1 / i,
+ then,
+ term_i / term_i-1 = (n-i+1)/i * p/(1-p)
+ and
+ term_i = term_i-1 * (n-i+1)/i * p/(1-p).
+ 1/i is stored in a table as they are computed,
+ because divisions are expensive.
+ p/(1-p) is computed only once and stored in 'p_term'.
+ */
+ bin_term = (double) (n-i+1) * ( ii.
+ Then, the error on the binomial tail when truncated at
+ the i term can be bounded by a geometric series of form
+ term_i * sum mult_term_i^j. */
+ err = term * ( ( 1.0 - pow( mult_term, (double) (n-i+1) ) ) /
+ (1.0-mult_term) - 1.0 );
+
+ /* One wants an error at most of tolerance*final_result, or:
+ tolerance * abs(-log10(bin_tail)-logNT).
+ Now, the error that can be accepted on bin_tail is
+ given by tolerance*final_result divided by the derivative
+ of -log10(x) when x=bin_tail. that is:
+ tolerance * abs(-log10(bin_tail)-logNT) / (1/bin_tail)
+ Finally, we truncate the tail if the error is less than:
+ tolerance * abs(-log10(bin_tail)-logNT) * bin_tail */
+ if( err < tolerance * fabs(-log10(bin_tail)-logNT) * bin_tail ) break;
+ }
+ }
+ return -log10(bin_tail) - logNT;
+}
+
+
+/*----------------------------------------------------------------------------*/
+/*--------------------------- Rectangle structure ----------------------------*/
+/*----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------*/
+/** Rectangle structure: line segment with width.
+ */
+struct rect
+{
+ double x1,y1,x2,y2; /* first and second point of the line segment */
+ double width; /* rectangle width */
+ double x,y; /* center of the rectangle */
+ double theta; /* angle */
+ double dx,dy; /* (dx,dy) is vector oriented as the line segment */
+ double prec; /* tolerance angle */
+ double p; /* probability of a point with angle within 'prec' */
+};
+
+/*----------------------------------------------------------------------------*/
+/** Copy one rectangle structure to another.
+ */
+static void rect_copy(struct rect * in, struct rect * out)
+{
+ /* check parameters */
+ if( in == NULL || out == NULL ) error("rect_copy: invalid 'in' or 'out'.");
+
+ /* copy values */
+ out->x1 = in->x1;
+ out->y1 = in->y1;
+ out->x2 = in->x2;
+ out->y2 = in->y2;
+ out->width = in->width;
+ out->x = in->x;
+ out->y = in->y;
+ out->theta = in->theta;
+ out->dx = in->dx;
+ out->dy = in->dy;
+ out->prec = in->prec;
+ out->p = in->p;
+}
+
+/*----------------------------------------------------------------------------*/
+/** Rectangle points iterator.
+
+ The integer coordinates of pixels inside a rectangle are
+ iteratively explored. This structure keep track of the process and
+ functions ri_ini(), ri_inc(), ri_end(), and ri_del() are used in
+ the process. An example of how to use the iterator is as follows:
+ \code
+
+ struct rect * rec = XXX; // some rectangle
+ rect_iter * i;
+ for( i=ri_ini(rec); !ri_end(i); ri_inc(i) )
+ {
+ // your code, using 'i->x' and 'i->y' as coordinates
+ }
+ ri_del(i); // delete iterator
+
+ \endcode
+ The pixels are explored 'column' by 'column', where we call
+ 'column' a set of pixels with the same x value that are inside the
+ rectangle. The following is an schematic representation of a
+ rectangle, the 'column' being explored is marked by colons, and
+ the current pixel being explored is 'x,y'.
+ \verbatim
+
+ vx[1],vy[1]
+ * *
+ * *
+ * *
+ * ye
+ * : *
+ vx[0],vy[0] : *
+ * : *
+ * x,y *
+ * : *
+ * : vx[2],vy[2]
+ * : *
+ y ys *
+ ^ * *
+ | * *
+ | * *
+ +---> x vx[3],vy[3]
+
+ \endverbatim
+ The first 'column' to be explored is the one with the smaller x
+ value. Each 'column' is explored starting from the pixel of the
+ 'column' (inside the rectangle) with the smallest y value.
+
+ The four corners of the rectangle are stored in order that rotates
+ around the corners at the arrays 'vx[]' and 'vy[]'. The first
+ point is always the one with smaller x value.
+
+ 'x' and 'y' are the coordinates of the pixel being explored. 'ys'
+ and 'ye' are the start and end values of the current column being
+ explored. So, 'ys' < 'ye'.
+ */
+typedef struct
+{
+ double vx[4]; /* rectangle's corner X coordinates in circular order */
+ double vy[4]; /* rectangle's corner Y coordinates in circular order */
+ double ys,ye; /* start and end Y values of current 'column' */
+ int x,y; /* coordinates of currently explored pixel */
+} rect_iter;
+
+/*----------------------------------------------------------------------------*/
+/** Interpolate y value corresponding to 'x' value given, in
+ the line 'x1,y1' to 'x2,y2'; if 'x1=x2' return the smaller
+ of 'y1' and 'y2'.
+
+ The following restrictions are required:
+ - x1 <= x2
+ - x1 <= x
+ - x <= x2
+ */
+static double inter_low(double x, double x1, double y1, double x2, double y2)
+{
+ /* check parameters */
+ if( x1 > x2 || x < x1 || x > x2 )
+ error("inter_low: unsuitable input, 'x1>x2' or 'xx2'.");
+
+ /* interpolation */
+ if( double_equal(x1,x2) && y1y2 ) return y2;
+ return y1 + (x-x1) * (y2-y1) / (x2-x1);
+}
+
+/*----------------------------------------------------------------------------*/
+/** Interpolate y value corresponding to 'x' value given, in
+ the line 'x1,y1' to 'x2,y2'; if 'x1=x2' return the larger
+ of 'y1' and 'y2'.
+
+ The following restrictions are required:
+ - x1 <= x2
+ - x1 <= x
+ - x <= x2
+ */
+static double inter_hi(double x, double x1, double y1, double x2, double y2)
+{
+ /* check parameters */
+ if( x1 > x2 || x < x1 || x > x2 )
+ error("inter_hi: unsuitable input, 'x1>x2' or 'xx2'.");
+
+ /* interpolation */
+ if( double_equal(x1,x2) && y1y2 ) return y1;
+ return y1 + (x-x1) * (y2-y1) / (x2-x1);
+}
+
+/*----------------------------------------------------------------------------*/
+/** Free memory used by a rectangle iterator.
+ */
+static void ri_del(rect_iter * iter)
+{
+ if( iter == NULL ) error("ri_del: NULL iterator.");
+ free( (void *) iter );
+}
+
+/*----------------------------------------------------------------------------*/
+/** Check if the iterator finished the full iteration.
+
+ See details in \ref rect_iter
+ */
+static int ri_end(rect_iter * i)
+{
+ /* check input */
+ if( i == NULL ) error("ri_end: NULL iterator.");
+
+ /* if the current x value is larger than the largest
+ x value in the rectangle (vx[2]), we know the full
+ exploration of the rectangle is finished. */
+ return (double)(i->x) > i->vx[2];
+}
+
+/*----------------------------------------------------------------------------*/
+/** Increment a rectangle iterator.
+
+ See details in \ref rect_iter
+ */
+static void ri_inc(rect_iter * i)
+{
+ /* check input */
+ if( i == NULL ) error("ri_inc: NULL iterator.");
+
+ /* if not at end of exploration,
+ increase y value for next pixel in the 'column' */
+ if( !ri_end(i) ) i->y++;
+
+ /* if the end of the current 'column' is reached,
+ and it is not the end of exploration,
+ advance to the next 'column' */
+ while( (double) (i->y) > i->ye && !ri_end(i) )
+ {
+ /* increase x, next 'column' */
+ i->x++;
+
+ /* if end of exploration, return */
+ if( ri_end(i) ) return;
+
+ /* update lower y limit (start) for the new 'column'.
+
+ We need to interpolate the y value that corresponds to the
+ lower side of the rectangle. The first thing is to decide if
+ the corresponding side is
+
+ vx[0],vy[0] to vx[3],vy[3] or
+ vx[3],vy[3] to vx[2],vy[2]
+
+ Then, the side is interpolated for the x value of the
+ 'column'. But, if the side is vertical (as it could happen if
+ the rectangle is vertical and we are dealing with the first
+ or last 'columns') then we pick the lower value of the side
+ by using 'inter_low'.
+ */
+ if( (double) i->x < i->vx[3] )
+ i->ys = inter_low((double)i->x,i->vx[0],i->vy[0],i->vx[3],i->vy[3]);
+ else
+ i->ys = inter_low((double)i->x,i->vx[3],i->vy[3],i->vx[2],i->vy[2]);
+
+ /* update upper y limit (end) for the new 'column'.
+
+ We need to interpolate the y value that corresponds to the
+ upper side of the rectangle. The first thing is to decide if
+ the corresponding side is
+
+ vx[0],vy[0] to vx[1],vy[1] or
+ vx[1],vy[1] to vx[2],vy[2]
+
+ Then, the side is interpolated for the x value of the
+ 'column'. But, if the side is vertical (as it could happen if
+ the rectangle is vertical and we are dealing with the first
+ or last 'columns') then we pick the lower value of the side
+ by using 'inter_low'.
+ */
+ if( (double)i->x < i->vx[1] )
+ i->ye = inter_hi((double)i->x,i->vx[0],i->vy[0],i->vx[1],i->vy[1]);
+ else
+ i->ye = inter_hi((double)i->x,i->vx[1],i->vy[1],i->vx[2],i->vy[2]);
+
+ /* new y */
+ i->y = (int) ceil(i->ys);
+ }
+}
+
+/*----------------------------------------------------------------------------*/
+/** Create and initialize a rectangle iterator.
+
+ See details in \ref rect_iter
+ */
+static rect_iter * ri_ini(struct rect * r)
+{
+ double vx[4],vy[4];
+ int n,offset;
+ rect_iter * i;
+
+ /* check parameters */
+ if( r == NULL ) error("ri_ini: invalid rectangle.");
+
+ /* get memory */
+ i = (rect_iter *) malloc(sizeof(rect_iter));
+ if( i == NULL ) error("ri_ini: Not enough memory.");
+
+ /* build list of rectangle corners ordered
+ in a circular way around the rectangle */
+ vx[0] = r->x1 - r->dy * r->width / 2.0;
+ vy[0] = r->y1 + r->dx * r->width / 2.0;
+ vx[1] = r->x2 - r->dy * r->width / 2.0;
+ vy[1] = r->y2 + r->dx * r->width / 2.0;
+ vx[2] = r->x2 + r->dy * r->width / 2.0;
+ vy[2] = r->y2 - r->dx * r->width / 2.0;
+ vx[3] = r->x1 + r->dy * r->width / 2.0;
+ vy[3] = r->y1 - r->dx * r->width / 2.0;
+
+ /* compute rotation of index of corners needed so that the first
+ point has the smaller x.
+
+ if one side is vertical, thus two corners have the same smaller x
+ value, the one with the largest y value is selected as the first.
+ */
+ if( r->x1 < r->x2 && r->y1 <= r->y2 ) offset = 0;
+ else if( r->x1 >= r->x2 && r->y1 < r->y2 ) offset = 1;
+ else if( r->x1 > r->x2 && r->y1 >= r->y2 ) offset = 2;
+ else offset = 3;
+
+ /* apply rotation of index. */
+ for(n=0; n<4; n++)
+ {
+ i->vx[n] = vx[(offset+n)%4];
+ i->vy[n] = vy[(offset+n)%4];
+ }
+
+ /* Set an initial condition.
+
+ The values are set to values that will cause 'ri_inc' (that will
+ be called immediately) to initialize correctly the first 'column'
+ and compute the limits 'ys' and 'ye'.
+
+ 'y' is set to the integer value of vy[0], the starting corner.
+
+ 'ys' and 'ye' are set to very small values, so 'ri_inc' will
+ notice that it needs to start a new 'column'.
+
+ The smallest integer coordinate inside of the rectangle is
+ 'ceil(vx[0])'. The current 'x' value is set to that value minus
+ one, so 'ri_inc' (that will increase x by one) will advance to
+ the first 'column'.
+ */
+ i->x = (int) ceil(i->vx[0]) - 1;
+ i->y = (int) ceil(i->vy[0]);
+ i->ys = i->ye = -DBL_MAX;
+
+ /* advance to the first pixel */
+ ri_inc(i);
+
+ return i;
+}
+
+/*----------------------------------------------------------------------------*/
+/** Compute a rectangle's NFA value.
+ */
+static double rect_nfa(struct rect * rec, image_double angles, double logNT)
+{
+ rect_iter * i;
+ int pts = 0;
+ int alg = 0;
+
+ /* check parameters */
+ if( rec == NULL ) error("rect_nfa: invalid rectangle.");
+ if( angles == NULL ) error("rect_nfa: invalid 'angles'.");
+
+ /* compute the total number of pixels and of aligned points in 'rec' */
+ for(i=ri_ini(rec); !ri_end(i); ri_inc(i)) /* rectangle iterator */
+ if( i->x >= 0 && i->y >= 0 &&
+ i->x < (int) angles->xsize && i->y < (int) angles->ysize )
+ {
+ ++pts; /* total number of pixels counter */
+ if( isaligned(i->x, i->y, angles, rec->theta, rec->prec) )
+ ++alg; /* aligned points counter */
+ }
+ ri_del(i); /* delete iterator */
+
+ return nfa(pts,alg,rec->p,logNT); /* compute NFA value */
+}
+
+
+/*----------------------------------------------------------------------------*/
+/*---------------------------------- Regions ---------------------------------*/
+/*----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------*/
+/** Compute region's angle as the principal inertia axis of the region.
+
+ The following is the region inertia matrix A:
+ @f[
+
+ A = \left(\begin{array}{cc}
+ Ixx & Ixy \\
+ Ixy & Iyy \\
+ \end{array}\right)
+
+ @f]
+ where
+
+ Ixx = sum_i G(i).(y_i - cx)^2
+
+ Iyy = sum_i G(i).(x_i - cy)^2
+
+ Ixy = - sum_i G(i).(x_i - cx).(y_i - cy)
+
+ and
+ - G(i) is the gradient norm at pixel i, used as pixel's weight.
+ - x_i and y_i are the coordinates of pixel i.
+ - cx and cy are the coordinates of the center of th region.
+
+ lambda1 and lambda2 are the eigenvalues of matrix A,
+ with lambda1 >= lambda2. They are found by solving the
+ characteristic polynomial:
+
+ det( lambda I - A) = 0
+
+ that gives:
+
+ lambda1 = ( Ixx + Iyy + sqrt( (Ixx-Iyy)^2 + 4.0*Ixy*Ixy) ) / 2
+
+ lambda2 = ( Ixx + Iyy - sqrt( (Ixx-Iyy)^2 + 4.0*Ixy*Ixy) ) / 2
+
+ To get the line segment direction we want to get the angle the
+ eigenvector associated to the smallest eigenvalue. We have
+ to solve for a,b in:
+
+ a.Ixx + b.Ixy = a.lambda2
+
+ a.Ixy + b.Iyy = b.lambda2
+
+ We want the angle theta = atan(b/a). It can be computed with
+ any of the two equations:
+
+ theta = atan( (lambda2-Ixx) / Ixy )
+
+ or
+
+ theta = atan( Ixy / (lambda2-Iyy) )
+
+ When |Ixx| > |Iyy| we use the first, otherwise the second (just to
+ get better numeric precision).
+ */
+static double get_theta( struct point * reg, int reg_size, double x, double y,
+ image_double modgrad, double reg_angle, double prec )
+{
+ double lambda,theta,weight;
+ double Ixx = 0.0;
+ double Iyy = 0.0;
+ double Ixy = 0.0;
+ int i;
+
+ /* check parameters */
+ if( reg == NULL ) error("get_theta: invalid region.");
+ if( reg_size <= 1 ) error("get_theta: region size <= 1.");
+ if( modgrad == NULL || modgrad->data == NULL )
+ error("get_theta: invalid 'modgrad'.");
+ if( prec < 0.0 ) error("get_theta: 'prec' must be positive.");
+
+ /* compute inertia matrix */
+ for(i=0; idata[ reg[i].x + reg[i].y * modgrad->xsize ];
+ Ixx += ( (double) reg[i].y - y ) * ( (double) reg[i].y - y ) * weight;
+ Iyy += ( (double) reg[i].x - x ) * ( (double) reg[i].x - x ) * weight;
+ Ixy -= ( (double) reg[i].x - x ) * ( (double) reg[i].y - y ) * weight;
+ }
+ if( double_equal(Ixx,0.0) && double_equal(Iyy,0.0) && double_equal(Ixy,0.0) )
+ error("get_theta: null inertia matrix.");
+
+ /* compute smallest eigenvalue */
+ lambda = 0.5 * ( Ixx + Iyy - sqrt( (Ixx-Iyy)*(Ixx-Iyy) + 4.0*Ixy*Ixy ) );
+
+ /* compute angle */
+ theta = fabs(Ixx)>fabs(Iyy) ? atan2(lambda-Ixx,Ixy) : atan2(Ixy,lambda-Iyy);
+
+ /* The previous procedure doesn't cares about orientation,
+ so it could be wrong by 180 degrees. Here is corrected if necessary. */
+ if( angle_diff(theta,reg_angle) > prec ) theta += M_PI;
+
+ return theta;
+}
+
+/*----------------------------------------------------------------------------*/
+/** Computes a rectangle that covers a region of points.
+ */
+static void region2rect( struct point * reg, int reg_size,
+ image_double modgrad, double reg_angle,
+ double prec, double p, struct rect * rec )
+{
+ double x,y,dx,dy,l,w,theta,weight,sum,l_min,l_max,w_min,w_max;
+ int i;
+
+ /* check parameters */
+ if( reg == NULL ) error("region2rect: invalid region.");
+ if( reg_size <= 1 ) error("region2rect: region size <= 1.");
+ if( modgrad == NULL || modgrad->data == NULL )
+ error("region2rect: invalid image 'modgrad'.");
+ if( rec == NULL ) error("region2rect: invalid 'rec'.");
+
+ /* center of the region:
+
+ It is computed as the weighted sum of the coordinates
+ of all the pixels in the region. The norm of the gradient
+ is used as the weight of a pixel. The sum is as follows:
+ cx = \sum_i G(i).x_i
+ cy = \sum_i G(i).y_i
+ where G(i) is the norm of the gradient of pixel i
+ and x_i,y_i are its coordinates.
+ */
+ x = y = sum = 0.0;
+ for(i=0; idata[ reg[i].x + reg[i].y * modgrad->xsize ];
+ x += (double) reg[i].x * weight;
+ y += (double) reg[i].y * weight;
+ sum += weight;
+ }
+ if( sum <= 0.0 ) error("region2rect: weights sum equal to zero.");
+ x /= sum;
+ y /= sum;
+
+ /* theta */
+ theta = get_theta(reg,reg_size,x,y,modgrad,reg_angle,prec);
+
+ /* length and width:
+
+ 'l' and 'w' are computed as the distance from the center of the
+ region to pixel i, projected along the rectangle axis (dx,dy) and
+ to the orthogonal axis (-dy,dx), respectively.
+
+ The length of the rectangle goes from l_min to l_max, where l_min
+ and l_max are the minimum and maximum values of l in the region.
+ Analogously, the width is selected from w_min to w_max, where
+ w_min and w_max are the minimum and maximum of w for the pixels
+ in the region.
+ */
+ dx = cos(theta);
+ dy = sin(theta);
+ l_min = l_max = w_min = w_max = 0.0;
+ for(i=0; i l_max ) l_max = l;
+ if( l < l_min ) l_min = l;
+ if( w > w_max ) w_max = w;
+ if( w < w_min ) w_min = w;
+ }
+
+ /* store values */
+ rec->x1 = x + l_min * dx;
+ rec->y1 = y + l_min * dy;
+ rec->x2 = x + l_max * dx;
+ rec->y2 = y + l_max * dy;
+ rec->width = w_max - w_min;
+ rec->x = x;
+ rec->y = y;
+ rec->theta = theta;
+ rec->dx = dx;
+ rec->dy = dy;
+ rec->prec = prec;
+ rec->p = p;
+
+ /* we impose a minimal width of one pixel
+
+ A sharp horizontal or vertical step would produce a perfectly
+ horizontal or vertical region. The width computed would be
+ zero. But that corresponds to a one pixels width transition in
+ the image.
+ */
+ if( rec->width < 1.0 ) rec->width = 1.0;
+}
+
+/*----------------------------------------------------------------------------*/
+/** Build a region of pixels that share the same angle, up to a
+ tolerance 'prec', starting at point (x,y).
+ */
+static void region_grow( int x, int y, image_double angles, struct point * reg,
+ int * reg_size, double * reg_angle, image_char used,
+ double prec )
+{
+ double sumdx,sumdy;
+ int xx,yy,i;
+
+ /* check parameters */
+ if( angles == NULL || angles->data == NULL )
+ error("region_grow: invalid image 'angles'.");
+ if( x < 0 || y < 0 || x >= (int) angles->xsize || y >= (int) angles->ysize )
+ error("region_grow: (x,y) out of the image.");
+ if( reg == NULL ) error("region_grow: invalid 'reg'.");
+ if( reg_size == NULL ) error("region_grow: invalid pointer 'reg_size'.");
+ if( reg_angle == NULL ) error("region_grow: invalid pointer 'reg_angle'.");
+ if( used == NULL || used->data == NULL )
+ error("region_grow: invalid image 'used'.");
+
+ /* first point of the region */
+ *reg_size = 1;
+ reg[0].x = x;
+ reg[0].y = y;
+ *reg_angle = angles->data[x+y*angles->xsize]; /* region's angle */
+ sumdx = cos(*reg_angle);
+ sumdy = sin(*reg_angle);
+ used->data[x+y*used->xsize] = USED;
+
+ /* try neighbors as new region points */
+ for(i=0; i<*reg_size; i++)
+ for(xx=reg[i].x-1; xx<=reg[i].x+1; xx++)
+ for(yy=reg[i].y-1; yy<=reg[i].y+1; yy++)
+ if( xx>=0 && yy>=0 && xx<(int)used->xsize && yy<(int)used->ysize &&
+ used->data[xx+yy*used->xsize] != USED &&
+ isaligned(xx,yy,angles,*reg_angle,prec) )
+ {
+ /* add point */
+ used->data[xx+yy*used->xsize] = USED;
+ reg[*reg_size].x = xx;
+ reg[*reg_size].y = yy;
+ ++(*reg_size);
+
+ /* update region's angle */
+ sumdx += cos( angles->data[xx+yy*angles->xsize] );
+ sumdy += sin( angles->data[xx+yy*angles->xsize] );
+ *reg_angle = atan2(sumdy,sumdx);
+ }
+}
+
+/*----------------------------------------------------------------------------*/
+/** Try some rectangles variations to improve NFA value. Only if the
+ rectangle is not meaningful (i.e., log_nfa <= log_eps).
+ */
+static double rect_improve( struct rect * rec, image_double angles,
+ double logNT, double log_eps )
+{
+ struct rect r;
+ double log_nfa,log_nfa_new;
+ double delta = 0.5;
+ double delta_2 = delta / 2.0;
+ int n;
+
+ log_nfa = rect_nfa(rec,angles,logNT);
+
+ if( log_nfa > log_eps ) return log_nfa;
+
+ /* try finer precisions */
+ rect_copy(rec,&r);
+ for(n=0; n<5; n++)
+ {
+ r.p /= 2.0;
+ r.prec = r.p * M_PI;
+ log_nfa_new = rect_nfa(&r,angles,logNT);
+ if( log_nfa_new > log_nfa )
+ {
+ log_nfa = log_nfa_new;
+ rect_copy(&r,rec);
+ }
+ }
+
+ if( log_nfa > log_eps ) return log_nfa;
+
+ /* try to reduce width */
+ rect_copy(rec,&r);
+ for(n=0; n<5; n++)
+ {
+ if( (r.width - delta) >= 0.5 )
+ {
+ r.width -= delta;
+ log_nfa_new = rect_nfa(&r,angles,logNT);
+ if( log_nfa_new > log_nfa )
+ {
+ rect_copy(&r,rec);
+ log_nfa = log_nfa_new;
+ }
+ }
+ }
+
+ if( log_nfa > log_eps ) return log_nfa;
+
+ /* try to reduce one side of the rectangle */
+ rect_copy(rec,&r);
+ for(n=0; n<5; n++)
+ {
+ if( (r.width - delta) >= 0.5 )
+ {
+ r.x1 += -r.dy * delta_2;
+ r.y1 += r.dx * delta_2;
+ r.x2 += -r.dy * delta_2;
+ r.y2 += r.dx * delta_2;
+ r.width -= delta;
+ log_nfa_new = rect_nfa(&r,angles,logNT);
+ if( log_nfa_new > log_nfa )
+ {
+ rect_copy(&r,rec);
+ log_nfa = log_nfa_new;
+ }
+ }
+ }
+
+ if( log_nfa > log_eps ) return log_nfa;
+
+ /* try to reduce the other side of the rectangle */
+ rect_copy(rec,&r);
+ for(n=0; n<5; n++)
+ {
+ if( (r.width - delta) >= 0.5 )
+ {
+ r.x1 -= -r.dy * delta_2;
+ r.y1 -= r.dx * delta_2;
+ r.x2 -= -r.dy * delta_2;
+ r.y2 -= r.dx * delta_2;
+ r.width -= delta;
+ log_nfa_new = rect_nfa(&r,angles,logNT);
+ if( log_nfa_new > log_nfa )
+ {
+ rect_copy(&r,rec);
+ log_nfa = log_nfa_new;
+ }
+ }
+ }
+
+ if( log_nfa > log_eps ) return log_nfa;
+
+ /* try even finer precisions */
+ rect_copy(rec,&r);
+ for(n=0; n<5; n++)
+ {
+ r.p /= 2.0;
+ r.prec = r.p * M_PI;
+ log_nfa_new = rect_nfa(&r,angles,logNT);
+ if( log_nfa_new > log_nfa )
+ {
+ log_nfa = log_nfa_new;
+ rect_copy(&r,rec);
+ }
+ }
+
+ return log_nfa;
+}
+
+/*----------------------------------------------------------------------------*/
+/** Reduce the region size, by elimination the points far from the
+ starting point, until that leads to rectangle with the right
+ density of region points or to discard the region if too small.
+ */
+static int reduce_region_radius( struct point * reg, int * reg_size,
+ image_double modgrad, double reg_angle,
+ double prec, double p, struct rect * rec,
+ image_char used, image_double angles,
+ double density_th )
+{
+ double density,radius1,radius2,rad,xc,yc;
+ int i;
+
+ /* check parameters */
+ if( reg == NULL ) error("reduce_region_radius: invalid pointer 'reg'.");
+ if( reg_size == NULL )
+ error("reduce_region_radius: invalid pointer 'reg_size'.");
+ if( prec < 0.0 ) error("reduce_region_radius: 'prec' must be positive.");
+ if( rec == NULL ) error("reduce_region_radius: invalid pointer 'rec'.");
+ if( used == NULL || used->data == NULL )
+ error("reduce_region_radius: invalid image 'used'.");
+ if( angles == NULL || angles->data == NULL )
+ error("reduce_region_radius: invalid image 'angles'.");
+
+ /* compute region points density */
+ density = (double) *reg_size /
+ ( dist(rec->x1,rec->y1,rec->x2,rec->y2) * rec->width );
+
+ /* if the density criterion is satisfied there is nothing to do */
+ if( density >= density_th ) return TRUE;
+
+ /* compute region's radius */
+ xc = (double) reg[0].x;
+ yc = (double) reg[0].y;
+ radius1 = dist( xc, yc, rec->x1, rec->y1 );
+ radius2 = dist( xc, yc, rec->x2, rec->y2 );
+ rad = radius1 > radius2 ? radius1 : radius2;
+
+ /* while the density criterion is not satisfied, remove farther pixels */
+ while( density < density_th )
+ {
+ rad *= 0.75; /* reduce region's radius to 75% of its value */
+
+ /* remove points from the region and update 'used' map */
+ for(i=0; i<*reg_size; i++)
+ if( dist( xc, yc, (double) reg[i].x, (double) reg[i].y ) > rad )
+ {
+ /* point not kept, mark it as NOTUSED */
+ used->data[ reg[i].x + reg[i].y * used->xsize ] = NOTUSED;
+ /* remove point from the region */
+ reg[i].x = reg[*reg_size-1].x; /* if i==*reg_size-1 copy itself */
+ reg[i].y = reg[*reg_size-1].y;
+ --(*reg_size);
+ --i; /* to avoid skipping one point */
+ }
+
+ /* reject if the region is too small.
+ 2 is the minimal region size for 'region2rect' to work. */
+ if( *reg_size < 2 ) return FALSE;
+
+ /* re-compute rectangle */
+ region2rect(reg,*reg_size,modgrad,reg_angle,prec,p,rec);
+
+ /* re-compute region points density */
+ density = (double) *reg_size /
+ ( dist(rec->x1,rec->y1,rec->x2,rec->y2) * rec->width );
+ }
+
+ /* if this point is reached, the density criterion is satisfied */
+ return TRUE;
+}
+
+/*----------------------------------------------------------------------------*/
+/** Refine a rectangle.
+
+ For that, an estimation of the angle tolerance is performed by the
+ standard deviation of the angle at points near the region's
+ starting point. Then, a new region is grown starting from the same
+ point, but using the estimated angle tolerance. If this fails to
+ produce a rectangle with the right density of region points,
+ 'reduce_region_radius' is called to try to satisfy this condition.
+ */
+static int refine( struct point * reg, int * reg_size, image_double modgrad,
+ double reg_angle, double prec, double p, struct rect * rec,
+ image_char used, image_double angles, double density_th )
+{
+ double angle,ang_d,mean_angle,tau,density,xc,yc,ang_c,sum,s_sum;
+ int i,n;
+
+ /* check parameters */
+ if( reg == NULL ) error("refine: invalid pointer 'reg'.");
+ if( reg_size == NULL ) error("refine: invalid pointer 'reg_size'.");
+ if( prec < 0.0 ) error("refine: 'prec' must be positive.");
+ if( rec == NULL ) error("refine: invalid pointer 'rec'.");
+ if( used == NULL || used->data == NULL )
+ error("refine: invalid image 'used'.");
+ if( angles == NULL || angles->data == NULL )
+ error("refine: invalid image 'angles'.");
+
+ /* compute region points density */
+ density = (double) *reg_size /
+ ( dist(rec->x1,rec->y1,rec->x2,rec->y2) * rec->width );
+
+ /* if the density criterion is satisfied there is nothing to do */
+ if( density >= density_th ) return TRUE;
+
+ /*------ First try: reduce angle tolerance ------*/
+
+ /* compute the new mean angle and tolerance */
+ xc = (double) reg[0].x;
+ yc = (double) reg[0].y;
+ ang_c = angles->data[ reg[0].x + reg[0].y * angles->xsize ];
+ sum = s_sum = 0.0;
+ n = 0;
+ for(i=0; i<*reg_size; i++)
+ {
+ used->data[ reg[i].x + reg[i].y * used->xsize ] = NOTUSED;
+ if( dist( xc, yc, (double) reg[i].x, (double) reg[i].y ) < rec->width )
+ {
+ angle = angles->data[ reg[i].x + reg[i].y * angles->xsize ];
+ ang_d = angle_diff_signed(angle,ang_c);
+ sum += ang_d;
+ s_sum += ang_d * ang_d;
+ ++n;
+ }
+ }
+
+ /* should not happen */
+ if(n == 0) return FALSE;
+
+ mean_angle = sum / (double) n;
+ tau = 2.0 * sqrt( (s_sum - 2.0 * mean_angle * sum) / (double) n
+ + mean_angle*mean_angle ); /* 2 * standard deviation */
+
+ /* find a new region from the same starting point and new angle tolerance */
+ region_grow(reg[0].x,reg[0].y,angles,reg,reg_size,®_angle,used,tau);
+
+ /* if the region is too small, reject */
+ if( *reg_size < 2 ) return FALSE;
+
+ /* re-compute rectangle */
+ region2rect(reg,*reg_size,modgrad,reg_angle,prec,p,rec);
+
+ /* re-compute region points density */
+ density = (double) *reg_size /
+ ( dist(rec->x1,rec->y1,rec->x2,rec->y2) * rec->width );
+
+ /*------ Second try: reduce region radius ------*/
+ if( density < density_th )
+ return reduce_region_radius( reg, reg_size, modgrad, reg_angle, prec, p,
+ rec, used, angles, density_th );
+
+ /* if this point is reached, the density criterion is satisfied */
+ return TRUE;
+}
+
+
+/*----------------------------------------------------------------------------*/
+/*-------------------------- Line Segment Detector ---------------------------*/
+/*----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------*/
+/** LSD full interface.
+ */
+static
+double * LineSegmentDetection( int * n_out,
+ double * img, int X, int Y,
+ double scale, double sigma_scale, double quant,
+ double ang_th, double log_eps, double density_th,
+ int n_bins,
+ int ** reg_img, int * reg_x, int * reg_y )
+{
+ image_double image;
+ ntuple_list out = new_ntuple_list(7);
+ double * return_value;
+ image_double scaled_image,angles,modgrad;
+ image_char used;
+ image_int region = NULL;
+ struct coorlist * list_p;
+ void * mem_p;
+ struct rect rec;
+ struct point * reg;
+ int reg_size,min_reg_size,i;
+ unsigned int xsize,ysize;
+ double rho,reg_angle,prec,p,log_nfa,logNT;
+ int ls_count = 0; /* line segments are numbered 1,2,3,... */
+
+
+ /* check parameters */
+ if( img == NULL || X <= 0 || Y <= 0 ) error("invalid image input.");
+ if( scale <= 0.0 ) error("'scale' value must be positive.");
+ if( sigma_scale <= 0.0 ) error("'sigma_scale' value must be positive.");
+ if( quant < 0.0 ) error("'quant' value must be positive.");
+ if( ang_th <= 0.0 || ang_th >= 180.0 )
+ error("'ang_th' value must be in the range (0,180).");
+ if( density_th < 0.0 || density_th > 1.0 )
+ error("'density_th' value must be in the range [0,1].");
+ if( n_bins <= 0 ) error("'n_bins' value must be positive.");
+
+
+ /* angle tolerance */
+ prec = M_PI * ang_th / 180.0;
+ p = ang_th / 180.0;
+ rho = quant / sin(prec); /* gradient magnitude threshold */
+
+
+ /* load and scale image (if necessary) and compute angle at each pixel */
+ image = new_image_double_ptr( (unsigned int) X, (unsigned int) Y, img );
+ if( scale != 1.0 )
+ {
+ scaled_image = gaussian_sampler( image, scale, sigma_scale );
+ angles = ll_angle( scaled_image, rho, &list_p, &mem_p,
+ &modgrad, (unsigned int) n_bins );
+ free_image_double(scaled_image);
+ }
+ else
+ angles = ll_angle( image, rho, &list_p, &mem_p, &modgrad,
+ (unsigned int) n_bins );
+ xsize = angles->xsize;
+ ysize = angles->ysize;
+
+ /* Number of Tests - NT
+
+ The theoretical number of tests is Np.(XY)^(5/2)
+ where X and Y are number of columns and rows of the image.
+ Np corresponds to the number of angle precisions considered.
+ As the procedure 'rect_improve' tests 5 times to halve the
+ angle precision, and 5 more times after improving other factors,
+ 11 different precision values are potentially tested. Thus,
+ the number of tests is
+ 11 * (X*Y)^(5/2)
+ whose logarithm value is
+ log10(11) + 5/2 * (log10(X) + log10(Y)).
+ */
+ logNT = 5.0 * ( log10( (double) xsize ) + log10( (double) ysize ) ) / 2.0
+ + log10(11.0);
+ min_reg_size = (int) (-logNT/log10(p)); /* minimal number of points in region
+ that can give a meaningful event */
+
+
+ /* initialize some structures */
+ if( reg_img != NULL && reg_x != NULL && reg_y != NULL ) /* save region data */
+ region = new_image_int_ini(angles->xsize,angles->ysize,0);
+ used = new_image_char_ini(xsize,ysize,NOTUSED);
+ reg = (struct point *) calloc( (size_t) (xsize*ysize), sizeof(struct point) );
+ if( reg == NULL ) error("not enough memory!");
+
+
+ /* search for line segments */
+ for(; list_p != NULL; list_p = list_p->next )
+ if( used->data[ list_p->x + list_p->y * used->xsize ] == NOTUSED &&
+ angles->data[ list_p->x + list_p->y * angles->xsize ] != NOTDEF )
+ /* there is no risk of double comparison problems here
+ because we are only interested in the exact NOTDEF value */
+ {
+ /* find the region of connected point and ~equal angle */
+ region_grow( list_p->x, list_p->y, angles, reg, ®_size,
+ ®_angle, used, prec );
+
+ /* reject small regions */
+ if( reg_size < min_reg_size ) continue;
+
+ /* construct rectangular approximation for the region */
+ region2rect(reg,reg_size,modgrad,reg_angle,prec,p,&rec);
+
+ /* Check if the rectangle exceeds the minimal density of
+ region points. If not, try to improve the region.
+ The rectangle will be rejected if the final one does
+ not fulfill the minimal density condition.
+ This is an addition to the original LSD algorithm published in
+ "LSD: A Fast Line Segment Detector with a False Detection Control"
+ by R. Grompone von Gioi, J. Jakubowicz, J.M. Morel, and G. Randall.
+ The original algorithm is obtained with density_th = 0.0.
+ */
+ if( !refine( reg, ®_size, modgrad, reg_angle,
+ prec, p, &rec, used, angles, density_th ) ) continue;
+
+ /* compute NFA value */
+ log_nfa = rect_improve(&rec,angles,logNT,log_eps);
+ if( log_nfa <= log_eps ) continue;
+
+ /* A New Line Segment was found! */
+ ++ls_count; /* increase line segment counter */
+
+ /*
+ The gradient was computed with a 2x2 mask, its value corresponds to
+ points with an offset of (0.5,0.5), that should be added to output.
+ The coordinates origin is at the center of pixel (0,0).
+ */
+ rec.x1 += 0.5; rec.y1 += 0.5;
+ rec.x2 += 0.5; rec.y2 += 0.5;
+
+ /* scale the result values if a subsampling was performed */
+ if( scale != 1.0 )
+ {
+ rec.x1 /= scale; rec.y1 /= scale;
+ rec.x2 /= scale; rec.y2 /= scale;
+ rec.width /= scale;
+ }
+
+ /* add line segment found to output */
+ add_7tuple( out, rec.x1, rec.y1, rec.x2, rec.y2,
+ rec.width, rec.p, log_nfa );
+
+ /* add region number to 'region' image if needed */
+ if( region != NULL )
+ for(i=0; idata[ reg[i].x + reg[i].y * region->xsize ] = ls_count;
+ }
+
+
+ /* free memory */
+ free( (void *) image ); /* only the double_image structure should be freed,
+ the data pointer was provided to this functions
+ and should not be destroyed. */
+ free_image_double(angles);
+ free_image_double(modgrad);
+ free_image_char(used);
+ free( (void *) reg );
+ free( (void *) mem_p );
+
+ /* return the result */
+ if( reg_img != NULL && reg_x != NULL && reg_y != NULL )
+ {
+ if( region == NULL ) error("'region' should be a valid image.");
+ *reg_img = region->data;
+ if( region->xsize > (unsigned int) INT_MAX ||
+ region->ysize > (unsigned int) INT_MAX )
+ error("region image to big to fit in INT sizes.");
+ *reg_x = (int) (region->xsize);
+ *reg_y = (int) (region->ysize);
+
+ /* free the 'region' structure.
+ we cannot use the function 'free_image_int' because we need to keep
+ the memory with the image data to be returned by this function. */
+ free( (void *) region );
+ }
+ if( out->size > (unsigned int) INT_MAX )
+ error("too many detections to fit in an INT.");
+ *n_out = (int) (out->size);
+
+ return_value = out->values;
+ free( (void *) out ); /* only the 'ntuple_list' structure must be freed,
+ but the 'values' pointer must be keep to return
+ as a result. */
+
+ return return_value;
+}
+#if 0
+/*----------------------------------------------------------------------------*/
+/** LSD Simple Interface with Scale and Region output.
+ */
+static
+double * lsd_scale_region( int * n_out,
+ double * img, int X, int Y, double scale,
+ int ** reg_img, int * reg_x, int * reg_y )
+{
+ /* LSD parameters */
+ double sigma_scale = 0.6; /* Sigma for Gaussian filter is computed as
+ sigma = sigma_scale/scale. */
+ double quant = 2.0; /* Bound to the quantization error on the
+ gradient norm. */
+ double ang_th = 22.5; /* Gradient angle tolerance in degrees. */
+ double log_eps = 0.0; /* Detection threshold: -log10(NFA) > log_eps */
+ double density_th = 0.7; /* Minimal density of region points in rectangle. */
+ int n_bins = 1024; /* Number of bins in pseudo-ordering of gradient
+ modulus. */
+
+ return LineSegmentDetection( n_out, img, X, Y, scale, sigma_scale, quant,
+ ang_th, log_eps, density_th, n_bins,
+ reg_img, reg_x, reg_y );
+}
+
+/*----------------------------------------------------------------------------*/
+/** LSD Simple Interface with Scale.
+ */
+static
+double * lsd_scale(int * n_out, double * img, int X, int Y, double scale)
+{
+ return lsd_scale_region(n_out,img,X,Y,scale,NULL,NULL,NULL);
+}
+
+/*----------------------------------------------------------------------------*/
+/** LSD Simple Interface.
+ */
+static
+double * lsd(int * n_out, double * img, int X, int Y)
+{
+ /* LSD parameters */
+ double scale = 0.8; /* Scale the image by Gaussian filter to 'scale'. */
+
+ return lsd_scale(n_out,img,X,Y,scale);
+}
+/*----------------------------------------------------------------------------*/
+#endif
+/*==================================================================================
+ * end of LSD code
+ *==================================================================================*/
+
+// clang-format on
+
+#undef NOTDEF
+#undef NOTUSED
+#undef USED
+#undef RELATIVE_ERROR_FACTOR
+#undef TABSIZE
+
+// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.sh
+// vim: shiftwidth=2 expandtab tabstop=2 cindent
+// kate: tab-indents: off; indent-width 2; replace-tabs on; indent-mode cstyle; remove-trailing-spaces modified;
diff --git a/rtengine/ashift_nmsimplex.c b/rtengine/ashift_nmsimplex.c
new file mode 100644
index 000000000..512bac878
--- /dev/null
+++ b/rtengine/ashift_nmsimplex.c
@@ -0,0 +1,425 @@
+/*
+ This file is part of darktable,
+ copyright (c) 2016 Ulrich Pegelow.
+
+ darktable is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ darktable is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with darktable. If not, see .
+*/
+
+/* For parameter optimization we are using the Nelder-Mead simplex method
+ * implemented by Michael F. Hutt.
+ * Changes versus the original code:
+ * do not include "nmsimplex.h" (not needed)
+ * renamed configuration variables to NMS_*
+ * add additional argument to objfun for arbitrary parameters
+ * simplex() returns number of used iterations instead of min value
+ * maximum number of iterations as function parameter
+ * make interface function simplex() static
+ * initialize i and j to avoid compiler warnings
+ * comment out printing of status inormation
+ * reformat according to darktable's clang standards
+ */
+
+/*==================================================================================
+ * begin nmsimplex code downloaded from http://www.mikehutt.com/neldermead.html
+ * on February 6, 2016
+ *==================================================================================*/
+/*
+ * Program: nmsimplex.c
+ * Author : Michael F. Hutt
+ * http://www.mikehutt.com
+ * 11/3/97
+ *
+ * An implementation of the Nelder-Mead simplex method.
+ *
+ * Copyright (c) 1997-2011
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ *
+ * Jan. 6, 1999
+ * Modified to conform to the algorithm presented
+ * in Margaret H. Wright's paper on Direct Search Methods.
+ *
+ * Jul. 23, 2007
+ * Fixed memory leak.
+ *
+ * Mar. 1, 2011
+ * Added constraints.
+ */
+
+//#include "nmsimplex.h"
+
+static int simplex(double (*objfunc)(double[], void *params), double start[], int n, double EPSILON, double scale,
+ int maxiter, void (*constrain)(double[], int n), void *params)
+{
+
+ int vs; /* vertex with smallest value */
+ int vh; /* vertex with next smallest value */
+ int vg; /* vertex with largest value */
+
+ int i = 0, j = 0, m, row;
+ int k; /* track the number of function evaluations */
+ int itr; /* track the number of iterations */
+
+ double **v; /* holds vertices of simplex */
+ double pn, qn; /* values used to create initial simplex */
+ double *f; /* value of function at each vertex */
+ double fr; /* value of function at reflection point */
+ double fe; /* value of function at expansion point */
+ double fc; /* value of function at contraction point */
+ double *vr; /* reflection - coordinates */
+ double *ve; /* expansion - coordinates */
+ double *vc; /* contraction - coordinates */
+ double *vm; /* centroid - coordinates */
+ //double min;
+
+ double fsum, favg, s, cent;
+
+ /* dynamically allocate arrays */
+
+ /* allocate the rows of the arrays */
+ v = (double **)malloc((n + 1) * sizeof(double *));
+ f = (double *)malloc((n + 1) * sizeof(double));
+ vr = (double *)malloc(n * sizeof(double));
+ ve = (double *)malloc(n * sizeof(double));
+ vc = (double *)malloc(n * sizeof(double));
+ vm = (double *)malloc(n * sizeof(double));
+
+ /* allocate the columns of the arrays */
+ for(i = 0; i <= n; i++)
+ {
+ v[i] = (double *)malloc(n * sizeof(double));
+ }
+
+ /* create the initial simplex */
+ /* assume one of the vertices is 0,0 */
+
+ pn = scale * (sqrt(n + 1) - 1 + n) / (n * sqrt(2));
+ qn = scale * (sqrt(n + 1) - 1) / (n * sqrt(2));
+
+ for(i = 0; i < n; i++)
+ {
+ v[0][i] = start[i];
+ }
+
+ for(i = 1; i <= n; i++)
+ {
+ for(j = 0; j < n; j++)
+ {
+ if(i - 1 == j)
+ {
+ v[i][j] = pn + start[j];
+ }
+ else
+ {
+ v[i][j] = qn + start[j];
+ }
+ }
+ }
+
+ if(constrain != NULL)
+ {
+ constrain(v[j], n);
+ }
+ /* find the initial function values */
+ for(j = 0; j <= n; j++)
+ {
+ f[j] = objfunc(v[j], params);
+ }
+
+ k = n + 1;
+#if 0
+ /* print out the initial values */
+ printf("Initial Values\n");
+ for(j = 0; j <= n; j++)
+ {
+ for(i = 0; i < n; i++)
+ {
+ printf("%f %f\n", v[j][i], f[j]);
+ }
+ }
+#endif
+
+ /* begin the main loop of the minimization */
+ for(itr = 1; itr <= maxiter; itr++)
+ {
+ /* find the index of the largest value */
+ vg = 0;
+ for(j = 0; j <= n; j++)
+ {
+ if(f[j] > f[vg])
+ {
+ vg = j;
+ }
+ }
+
+ /* find the index of the smallest value */
+ vs = 0;
+ for(j = 0; j <= n; j++)
+ {
+ if(f[j] < f[vs])
+ {
+ vs = j;
+ }
+ }
+
+ /* find the index of the second largest value */
+ vh = vs;
+ for(j = 0; j <= n; j++)
+ {
+ if(f[j] > f[vh] && f[j] < f[vg])
+ {
+ vh = j;
+ }
+ }
+
+ /* calculate the centroid */
+ for(j = 0; j <= n - 1; j++)
+ {
+ cent = 0.0;
+ for(m = 0; m <= n; m++)
+ {
+ if(m != vg)
+ {
+ cent += v[m][j];
+ }
+ }
+ vm[j] = cent / n;
+ }
+
+ /* reflect vg to new vertex vr */
+ for(j = 0; j <= n - 1; j++)
+ {
+ /*vr[j] = (1+NMS_ALPHA)*vm[j] - NMS_ALPHA*v[vg][j];*/
+ vr[j] = vm[j] + NMS_ALPHA * (vm[j] - v[vg][j]);
+ }
+ if(constrain != NULL)
+ {
+ constrain(vr, n);
+ }
+ fr = objfunc(vr, params);
+ k++;
+
+ if(fr < f[vh] && fr >= f[vs])
+ {
+ for(j = 0; j <= n - 1; j++)
+ {
+ v[vg][j] = vr[j];
+ }
+ f[vg] = fr;
+ }
+
+ /* investigate a step further in this direction */
+ if(fr < f[vs])
+ {
+ for(j = 0; j <= n - 1; j++)
+ {
+ /*ve[j] = NMS_GAMMA*vr[j] + (1-NMS_GAMMA)*vm[j];*/
+ ve[j] = vm[j] + NMS_GAMMA * (vr[j] - vm[j]);
+ }
+ if(constrain != NULL)
+ {
+ constrain(ve, n);
+ }
+ fe = objfunc(ve, params);
+ k++;
+
+ /* by making fe < fr as opposed to fe < f[vs],
+ Rosenbrocks function takes 63 iterations as opposed
+ to 64 when using double variables. */
+
+ if(fe < fr)
+ {
+ for(j = 0; j <= n - 1; j++)
+ {
+ v[vg][j] = ve[j];
+ }
+ f[vg] = fe;
+ }
+ else
+ {
+ for(j = 0; j <= n - 1; j++)
+ {
+ v[vg][j] = vr[j];
+ }
+ f[vg] = fr;
+ }
+ }
+
+ /* check to see if a contraction is necessary */
+ if(fr >= f[vh])
+ {
+ if(fr < f[vg] && fr >= f[vh])
+ {
+ /* perform outside contraction */
+ for(j = 0; j <= n - 1; j++)
+ {
+ /*vc[j] = NMS_BETA*v[vg][j] + (1-NMS_BETA)*vm[j];*/
+ vc[j] = vm[j] + NMS_BETA * (vr[j] - vm[j]);
+ }
+ if(constrain != NULL)
+ {
+ constrain(vc, n);
+ }
+ fc = objfunc(vc, params);
+ k++;
+ }
+ else
+ {
+ /* perform inside contraction */
+ for(j = 0; j <= n - 1; j++)
+ {
+ /*vc[j] = NMS_BETA*v[vg][j] + (1-NMS_BETA)*vm[j];*/
+ vc[j] = vm[j] - NMS_BETA * (vm[j] - v[vg][j]);
+ }
+ if(constrain != NULL)
+ {
+ constrain(vc, n);
+ }
+ fc = objfunc(vc, params);
+ k++;
+ }
+
+
+ if(fc < f[vg])
+ {
+ for(j = 0; j <= n - 1; j++)
+ {
+ v[vg][j] = vc[j];
+ }
+ f[vg] = fc;
+ }
+ /* at this point the contraction is not successful,
+ we must halve the distance from vs to all the
+ vertices of the simplex and then continue.
+ 10/31/97 - modified to account for ALL vertices.
+ */
+ else
+ {
+ for(row = 0; row <= n; row++)
+ {
+ if(row != vs)
+ {
+ for(j = 0; j <= n - 1; j++)
+ {
+ v[row][j] = v[vs][j] + (v[row][j] - v[vs][j]) / 2.0;
+ }
+ }
+ }
+ if(constrain != NULL)
+ {
+ constrain(v[vg], n);
+ }
+ f[vg] = objfunc(v[vg], params);
+ k++;
+ if(constrain != NULL)
+ {
+ constrain(v[vh], n);
+ }
+ f[vh] = objfunc(v[vh], params);
+ k++;
+ }
+ }
+#if 0
+ /* print out the value at each iteration */
+ printf("Iteration %d\n", itr);
+ for(j = 0; j <= n; j++)
+ {
+ for(i = 0; i < n; i++)
+ {
+ printf("%f %f\n", v[j][i], f[j]);
+ }
+ }
+#endif
+ /* test for convergence */
+ fsum = 0.0;
+ for(j = 0; j <= n; j++)
+ {
+ fsum += f[j];
+ }
+ favg = fsum / (n + 1);
+ s = 0.0;
+ for(j = 0; j <= n; j++)
+ {
+ s += pow((f[j] - favg), 2.0) / (n);
+ }
+ s = sqrt(s);
+ if(s < EPSILON) break;
+ }
+ /* end main loop of the minimization */
+
+ /* find the index of the smallest value */
+ vs = 0;
+ for(j = 0; j <= n; j++)
+ {
+ if(f[j] < f[vs])
+ {
+ vs = j;
+ }
+ }
+#if 0
+ printf("The minimum was found at\n");
+ for(j = 0; j < n; j++)
+ {
+ printf("%e\n", v[vs][j]);
+ start[j] = v[vs][j];
+ }
+ double min = objfunc(v[vs], params);
+ k++;
+ printf("The minimum value is %f\n", min);
+ printf("%d Function Evaluations\n", k);
+ printf("%d Iterations through program\n", itr);
+#else
+ for(j = 0; j < n; j++)
+ {
+ start[j] = v[vs][j];
+ }
+#endif
+ free(f);
+ free(vr);
+ free(ve);
+ free(vc);
+ free(vm);
+ for(i = 0; i <= n; i++)
+ {
+ free(v[i]);
+ }
+ free(v);
+ return itr;
+}
+
+/*==================================================================================
+ * end of nmsimplex code
+ *==================================================================================*/
+
+// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.sh
+// vim: shiftwidth=2 expandtab tabstop=2 cindent
+// kate: tab-indents: off; indent-width 2; replace-tabs on; indent-mode cstyle; remove-trailing-spaces modified;
diff --git a/rtengine/bayer_bilinear_demosaic.cc b/rtengine/bayer_bilinear_demosaic.cc
new file mode 100644
index 000000000..5b3835ce9
--- /dev/null
+++ b/rtengine/bayer_bilinear_demosaic.cc
@@ -0,0 +1,56 @@
+////////////////////////////////////////////////////////////////
+//
+// Bilinear bayer demosaic, optimized for speed, intended use is for flat regions of dual-demosaic
+//
+// copyright (c) 2020 Ingo Weyrich
+//
+//
+// code dated: May 09, 2020
+//
+// bayer_bilinear_demosaic.cc is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+//
+////////////////////////////////////////////////////////////////
+
+#include "rawimagesource.h"
+#include "rt_math.h"
+
+using namespace rtengine;
+
+void RawImageSource::bayer_bilinear_demosaic(const float* const * blend, const array2D &rawData, array2D &red, array2D &green, array2D &blue)
+{
+
+#ifdef _OPENMP
+ #pragma omp parallel for
+#endif
+ for (int i = 1; i < H - 1; ++i) {
+ float **nonGreen1 = red;
+ float **nonGreen2 = blue;
+ if (FC(i, 0) == 2 || FC(i, 1) == 2) { // blue row => swap pointers
+ std::swap(nonGreen1, nonGreen2);
+ }
+#if defined(__clang__)
+ #pragma clang loop vectorize(assume_safety)
+#elif defined(__GNUC__)
+ #pragma GCC ivdep
+#endif
+ for (int j = 2 - (FC(i, 1) & 1); j < W - 2; j += 2) { // always begin with a green pixel
+ green[i][j] = intp(blend[i][j], green[i][j], rawData[i][j]);
+ nonGreen1[i][j] = intp(blend[i][j], nonGreen1[i][j], (rawData[i][j - 1] + rawData[i][j + 1]) * 0.5f);
+ nonGreen2[i][j] = intp(blend[i][j], nonGreen2[i][j], (rawData[i - 1][j] + rawData[i + 1][j]) * 0.5f);
+ green[i][j + 1] = intp(blend[i][j + 1], green[i][j + 1], ((rawData[i - 1][j + 1] + rawData[i][j]) + (rawData[i][j + 2] + rawData[i + 1][j + 1])) * 0.25f);
+ nonGreen1[i][j + 1] = intp(blend[i][j + 1], nonGreen1[i][j + 1], rawData[i][j + 1]);
+ nonGreen2[i][j + 1] = intp(blend[i][j + 1], nonGreen2[i][j + 1], ((rawData[i - 1][j] + rawData[i - 1][j + 2]) + (rawData[i + 1][j] + rawData[i + 1][j + 2])) * 0.25f);
+ }
+ }
+}
diff --git a/rtengine/camconst.json b/rtengine/camconst.json
index 5fc7d4062..22270bfe2 100644
--- a/rtengine/camconst.json
+++ b/rtengine/camconst.json
@@ -430,6 +430,7 @@ Camera constants:
{ // Quality B, some intermediate ISO samples missing, LENR samples missing so White Levels not properly indicated, some aperture scaling missing
"make_model": "Canon EOS 5D Mark IV",
+ "global_green_equilibration" : true,
"dcraw_matrix": [ 6446,-366,-864,-4436,12204,2513,-952,2496,6348 ], // DNG_V9.7 D65
"raw_crop": [ 136, 42, 6740, 4500 ], // full size 6880x4544, official crop 148,54,6867,4533
"masked_areas": [ 54, 4, 4534, 132 ],
@@ -1143,11 +1144,30 @@ Camera constants:
"raw_crop": [ 144, 72, 6984, 4660 ]
},
- { // Quality C, only raw crop
+ { // Quality B, samples by jonathanBieler (#5922). No dual-pixel information.
"make_model": [ "Canon EOS R" ],
- "raw_crop": [ 144, 46, 6744, 4500 ]
+ "dcraw_matrix" : [ 8293, -1789, -1094, -5025, 12925, 2327, -1199, 2769, 6108 ], // DNG v2 style
+ "raw_crop": [ 144, 46, 6744, 4500 ],
+ "masked_areas": [ 50, 40, 4540, 140 ], // Taken from ART
+ "ranges" : { "white" : 16367 } // Typically 16383 without LENR, with LENR safest value is 15800 for ISO 25600
},
+ { // Quality C
+ "make_model": "Canon EOS R5",
+ "dcraw_matrix" : [9766, -2953, -1254, -4276, 12116, 2433, -437, 1336, 5131],
+ "raw_crop" : [ 124, 92, 8220, 5486 ],
+ "masked_areas" : [ 94, 20, 5578, 122 ],
+ "ranges" : { "white" : 16382 }
+ },
+
+ { // Quality C
+ "make_model": "Canon EOS R6",
+ "dcraw_matrix" : [8293, -1611, -1132, -4759, 12710, 2275, -1013, 2415, 5508],
+ "raw_crop": [ 72, 38, 5496, 3670 ],
+ "masked_areas" : [ 40, 10, 5534, 70 ],
+ "ranges" : { "white" : 16382 }
+ },
+
// Canon Powershot
{ // Quality C, CHDK DNGs, raw frame correction
"make_model": "Canon PowerShot A3100 IS",
@@ -1259,15 +1279,18 @@ Camera constants:
{ // Quality C
"make_model": [ "DJI FC2103" ],
- "ranges": {
- "black": 4080
- }
+ "ranges": { "black": 4080 }
},
{ // Quality C
"make_model": "DJI FC6310",
"ranges": { "white": 64886 }
},
+
+ { // Quality C
+ "make_model": "DJI FC3170",
+ "ranges": { "white": 65472 }
+ },
{ // Quality C
"make_model": "FUJIFILM GFX 100",
@@ -1295,12 +1318,6 @@ Camera constants:
"ranges": { "white": 16100 }
},
- { // Quality C
- "make_model": [ "FUJIFILM X100V", "FUJIFILM X-T4" ],
- "dcraw_matrix": [ 13426,-6334,-1177,-4244,12136,2371,-580,1303,5980 ], // DNG_v12.2 D65
- "raw_crop": [ 0, 5, 6252, 4140 ]
- },
-
{ // Quality C
"make_model": "Fujifilm X10",
"ranges": { "white": 3788 }
@@ -1349,12 +1366,20 @@ Camera constants:
},
{ // Quality B
- "make_model": [ "FUJIFILM X-T1", "FUJIFILM X-T10", "FUJIFILM X-E2" ],
+ "make_model": [ "FUJIFILM X-T10", "FUJIFILM X-E2" ],
"dcraw_matrix": [ 8458,-2451,-855,-4597,12447,2407,-1475,2482,6526 ], // DNG D65
//"dcraw_matrix": [ 9289,-3279,-632,-3539,11137,2758,-1049,1950,6544 ], // X-RITE D55
- //"raw_crop": [ 4, 0, 4936, 3296 ], // full raw 4992,3296, fuji official 4936,3296 - experimental crop
+ //"raw_crop": [ 4, 0, 4936, 3296 ], // full raw 4992,3296, fuji official 4936,3296
"ranges": { "white": 16100 }
},
+
+ { // Quality B, samples provided by Claes
+ "make_model": "FUJIFILM X-T1",
+ "dcraw_matrix": [ 8458,-2451,-855,-4597,12447,2407,-1475,2482,6526 ], // DNG D65
+ "raw_crop": [ 4, 0, 4936, 3296 ], // full raw 4992,3296, fuji official 4936,3296
+ "ranges": { "white": [ 16202, 16277, 16232 ] } // LENR on from ISO4000+ negligibly underestimates white level
+ // No aperture scaling data provided, but likely negligible
+ },
{ // Quality C
"make_model": [ "FUJIFILM X-T100" ],
@@ -1375,16 +1400,40 @@ Camera constants:
},
{ // Quality B
- "make_model": [ "FUJIFILM X-T2", "FUJIFILM X-T20", "FUJIFILM X-E3", "FUJIFILM X100F", "FUJIFILM X-PRO2", "FUJIFILM X-H1" ],
+ "make_model": [ "FUJIFILM X-T20", "FUJIFILM X-E3", "FUJIFILM X100F", "FUJIFILM X-H1" ],
"dcraw_matrix": [ 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 ], // DNG_v9.4 D65
// "raw_crop": [ 0, 5, 6032, 4032 ], // full raw 6160,4032, Usable 6032,4032 - for lossless compressed files
// "raw_crop": [ 0, 0, 6032, 4032 ], // full raw 6160,4032, Usable 6032,4032 - for uncompressed files
"raw_crop": [ 0, 5, 6032, 4026 ], // full raw 6160,4032, Usable 6032,4026 - for uncompressed and lossless compressed files (but reduces height by 6 pixels)
"ranges": { "white": 16100 }
},
-
- { // Quality C, only raw crop
- "make_model": [ "FUJIFILM X-T3", "FUJIFILM X-T30", "FUJIFILM X-PRO3" ],
+
+ { // Quality B, samples provided by Daniel Catalina #5824
+ "make_model": "FUJIFILM X-T2",
+ "dcraw_matrix": [ 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 ], // DNG_v9.4 D65
+ "raw_crop": [ 0, 5, 6032, 4026 ], // xee X-T20
+ "ranges": { "white": [ 16195, 16270, 16195 ] } // With LENR on and ISO4000+ starts to overestimate white level, more realistic would be 16090
+ // Negligible aperture scaling effect
+ },
+
+ { // Quality B, samples provided by Claes
+ "make_model": "FUJIFILM X-PRO2",
+ "dcraw_matrix": [ 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 ], // DNG_v9.4 D65
+ "raw_crop": [ 0, 5, 6032, 4026 ], // see X-T2
+ "ranges": { "white": [ 16105, 16270, 16082 ] } // These values are the lowest pixel values >16000 for all ISOs. LENR has a negligble effect.
+ // No aperture scaling data provided, but likely negligible
+ },
+
+ { // Quality A, samples provided by Daniel Catalina (#5839) and pi99y (#5860)
+ "make_model": [ "FUJIFILM X-T3", "FUJIFILM X-PRO3" ],
+ "dcraw_matrix": [ 13426,-6334,-1177,-4244,12136,2371,-580,1303,5980 ], // DNG_v11, standard_v2 d65
+ "raw_crop": [ 0, 5, 6252, 4176],
+ "white": [ 16170, 16275, 16170 ] // typical safe-margins with LENR
+ // negligible aperture scaling effect
+ },
+
+ { // Quality B
+ "make_model": [ "FUJIFILM X-T30", "FUJIFILM X100V", "FUJIFILM X-T4" ],
"dcraw_matrix": [ 13426,-6334,-1177,-4244,12136,2371,-580,1303,5980 ], // DNG_v11, standard_v2 d65
"raw_crop": [ 0, 5, 6252, 4176]
},
@@ -1537,10 +1586,14 @@ Camera constants:
}
},
- { // Quality B
+ { // Quality A, samples provided by dimonoid (#5842)
"make_model": "NIKON COOLPIX P1000",
"dcraw_matrix": [ 14294, -6116, -1333, -1628, 10219, 1637, -14, 1158, 5022 ], // ColorMatrix2 from Adobe DNG Converter 11.4
- "ranges": { "black": 200, "white": 4087 }
+ "ranges": {
+ "black": 200,
+ "white": [ 4000, 4050, 3950 ] // Typical values without LENR: 4009, 4093, 3963
+ } // No significant influence of ISO
+ // No aperture scaling reported
},
{ // Quality B, no LENR samples
@@ -1698,6 +1751,60 @@ Camera constants:
"pdaf_offset" : 32
},
+ { // Quality C, only dcraw looted from ART commit ad88c7d97
+ "make_model" : "NIKON Z 5",
+ "dcraw_matrix" : [8695, -2558, -648, -5015, 12711, 2575, -1279, 2215, 7514]
+ },
+
+ { // Quality A, white levels and PDAF lines measured by Yann Leprince #5851
+ "make_model" : "Nikon Z 50",
+ "dcraw_matrix" : [11640, -4829, -1079, -5107, 13006, 2325, -972, 1711, 7380], // Adobe DNG Converter 12.2.1 ColorMatrix2 (D65)
+ "ranges": {
+ "white": [
+ // White level was consistently measured at 16383 for non-LENR images. These values are computed using
+ // 16383 - 6 * read_noise (where read_noise values are extracted from
+ // https://www.photonstophotos.net/Charts/RN_ADU.htm#Nikon%20Z%2050_14 for iso < 1600, fitted in the
+ // 1600-10183 range, and extrapolated from that fit into the 12800-204800 range, where the read noise
+ // provided by photonstophotos is underestimated due to in-body noise reduction. These values were
+ // verified to be below the 1st percentile of the distribution, on LENR white frames taken with a 2 s
+ // shutter in a variety of conditions (apertures from 1.8 to 6.3).
+ {"iso": 100, "levels": 16374},
+ {"iso": 126, "levels": 16371},
+ {"iso": 159, "levels": 16367},
+ {"iso": 200, "levels": 16367},
+ {"iso": 251, "levels": 16364},
+ {"iso": 318, "levels": 16360},
+ {"iso": 400, "levels": 16366},
+ {"iso": 503, "levels": 16364},
+ {"iso": 636, "levels": 16362},
+ {"iso": 800, "levels": 16358},
+ {"iso": 1006, "levels": 16349},
+ {"iso": 1273, "levels": 16345},
+ {"iso": 1600, "levels": 16337},
+ {"iso": 2011, "levels": 16327},
+ {"iso": 2546, "levels": 16313},
+ {"iso": 3200, "levels": 16298},
+ {"iso": 4022, "levels": 16278},
+ {"iso": 5091, "levels": 16253},
+ {"iso": 6400, "levels": 16223},
+ {"iso": 8045, "levels": 16186},
+ {"iso": 10183, "levels": 16139},
+ {"iso": 12800, "levels": 16082},
+ {"iso": 16090, "levels": 16013},
+ {"iso": 20366, "levels": 15924},
+ {"iso": 25600, "levels": 15818},
+ {"iso": 32180, "levels": 15687},
+ {"iso": 40731, "levels": 15521},
+ {"iso": 51200, "levels": 15321},
+ {"iso": 102400, "levels": 14388},
+ {"iso": 204800, "levels": 12633}
+ ]
+ },
+ "pdaf_offset": 0,
+ // Every 12th line from 285 to 3441. These lines (specifically, the blue subpixels) have a lower standard deviation on a black frame.
+ "pdaf_pattern": [285, 297, 309, 321, 333, 345, 357, 369, 381, 393, 405, 417, 429, 441, 453, 465, 477, 489, 501, 513, 525, 537, 549, 561, 573, 585, 597, 609, 621, 633, 645, 657, 669, 681, 693, 705, 717, 729, 741, 753, 765, 777, 789, 801, 813, 825, 837, 849, 861, 873, 885, 897, 909, 921, 933, 945, 957, 969, 981, 993, 1005, 1017, 1029, 1041, 1053, 1065, 1077, 1089, 1101, 1113, 1125, 1137, 1149, 1161, 1173, 1185, 1197, 1209, 1221, 1233, 1245, 1257, 1269, 1281, 1293, 1305, 1317, 1329, 1341, 1353, 1365, 1377, 1389, 1401, 1413, 1425, 1437, 1449, 1461, 1473, 1485, 1497, 1509, 1521, 1533, 1545, 1557, 1569, 1581, 1593, 1605, 1617, 1629, 1641, 1653, 1665, 1677, 1689, 1701, 1713, 1725, 1737, 1749, 1761, 1773, 1785, 1797, 1809, 1821, 1833, 1845, 1857, 1869, 1881, 1893, 1905, 1917, 1929, 1941, 1953, 1965, 1977, 1989, 2001, 2013, 2025, 2037, 2049, 2061, 2073, 2085, 2097, 2109, 2121, 2133, 2145, 2157, 2169, 2181, 2193, 2205, 2217, 2229, 2241, 2253, 2265, 2277, 2289, 2301, 2313, 2325, 2337, 2349, 2361, 2373, 2385, 2397, 2409, 2421, 2433, 2445, 2457, 2469, 2481, 2493, 2505, 2517, 2529, 2541, 2553, 2565, 2577, 2589, 2601, 2613, 2625, 2637, 2649, 2661, 2673, 2685, 2697, 2709, 2721, 2733, 2745, 2757, 2769, 2781, 2793, 2805, 2817, 2829, 2841, 2853, 2865, 2877, 2889, 2901, 2913, 2925, 2937, 2949, 2961, 2973, 2985, 2997, 3009, 3021, 3033, 3045, 3057, 3069, 3081, 3093, 3105, 3117, 3129, 3141, 3153, 3165, 3177, 3189, 3201, 3213, 3225, 3237, 3249, 3261, 3273, 3285, 3297, 3309, 3321, 3333, 3345, 3357, 3369, 3381, 3393, 3405, 3417, 3429, 3441]
+ },
+
{ // Quality B, 16Mp and 64Mp raw frames
"make_model": "OLYMPUS E-M5MarkII",
"dcraw_matrix": [ 9422,-3258,-711,-2655,10898,2015,-512,1354,5512 ], // DNG_v8.8 D65
@@ -2675,6 +2782,12 @@ Camera constants:
"ranges": { "black": 0, "white": 64400 }
},
+ { // Quality B
+ "make_model": ["HASSELBLAD NEX-7", "SONY NEX-7"], // Hasselblad NEX-7 also known as Hasselblad Lunar
+ "dcraw_matrix": [ 5491,-1192,-363,-4951,12342,2948,-911,1722,7192 ], // adobe DNGv12.2 d65
+ "ranges": { "black": 512, "white": 16372 } // Typical white level (samples provided by @ggc on Pixls, influence from LENR unknown
+ },
+
{ // Quality A for tested CFV, the other models have the same sensor (16 megapixel square sensor)
"make_model": [ "Hasselblad V96C", "Hasselblad CFV", "Hasselblad CFV-II" ],
"dcraw_matrix": [ 8519, -3260, -280, -5081, 13459, 1738, -1449, 2960, 7809 ] // borrowed from Adobe's DNG converter
diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc
index f9850189c..e3097ad2e 100644
--- a/rtengine/canon_cr3_decoder.cc
+++ b/rtengine/canon_cr3_decoder.cc
@@ -602,7 +602,9 @@ int DCraw::parseCR3(
relpos_inBox += lTag;
}
}
-
+ if (!szItem) {
+ goto fin;
+ }
relpos_inDir += szItem;
}
@@ -3130,7 +3132,8 @@ void DCraw::crxLoadRaw()
hdr.tileHeight >>= 1;
}
-// /*imgdata.color.*/maximum = (1 << hdr.nBits) - 1;
+ // /*imgdata.color.*/maximum = (1 << hdr.nBits) - 1;
+ tiff_bps = hdr.nBits;
std::uint8_t* const hdrBuf = static_cast(malloc(hdr.mdatHdrSize));
diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc
index 4dcdd0734..83c44aa18 100644
--- a/rtengine/capturesharpening.cc
+++ b/rtengine/capturesharpening.cc
@@ -127,12 +127,8 @@ void compute3x3kernel(float sigma, float kernel[3][3]) {
float sum = 0.f;
for (int i = -1; i <= 1; ++i) {
for (int j = -1; j <= 1; ++j) {
- if((rtengine::SQR(i) + rtengine::SQR(j)) <= rtengine::SQR(3.0 * 0.84)) {
- kernel[i + 1][j + 1] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp);
- sum += kernel[i + 1][j + 1];
- } else {
- kernel[i + 1][j + 1] = 0.f;
- }
+ kernel[i + 1][j + 1] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp);
+ sum += kernel[i + 1][j + 1];
}
}
@@ -647,7 +643,7 @@ float calcRadiusBayer(const float * const *rawData, int W, int H, float lowerLim
}
}
}
- return std::sqrt((1.f / (std::log(1.f / maxRatio) / 2.f)) / -2.f);
+ return std::sqrt(1.f / std::log(maxRatio));
}
float calcRadiusXtrans(const float * const *rawData, int W, int H, float lowerLimit, float upperLimit, unsigned int starty, unsigned int startx)
@@ -738,7 +734,7 @@ float calcRadiusXtrans(const float * const *rawData, int W, int H, float lowerLi
}
}
}
- return std::sqrt((1.f / (std::log(1.f / maxRatio) / 2.f)) / -2.f);
+ return std::sqrt(1.f / std::log(maxRatio));
}
bool checkForStop(float** tmpIThr, float** iterCheck, int fullTileSize, int border)
@@ -1116,23 +1112,23 @@ BENCHFUN
return;
}
- array2D* Lbuffer = nullptr;
+ std::unique_ptr> Lbuffer;
if (!redCache) {
- Lbuffer = new array2D(W, H);
+ Lbuffer.reset(new array2D(W, H));
}
- array2D* YOldbuffer = nullptr;
+ std::unique_ptr> YOldbuffer;
if (!greenCache) {
- YOldbuffer = new array2D(W, H);
+ YOldbuffer.reset(new array2D(W, H));
}
- array2D* YNewbuffer = nullptr;
+ std::unique_ptr> YNewbuffer;
if (!blueCache) {
- YNewbuffer = new array2D(W, H);
+ YNewbuffer.reset(new array2D(W, H));
}
- array2D& L = Lbuffer ? *Lbuffer : red;
- array2D& YOld = YOldbuffer ? * YOldbuffer : green;
- array2D& YNew = YNewbuffer ? * YNewbuffer : blue;
+ array2D& L = Lbuffer.get() ? *Lbuffer.get() : red;
+ array2D& YOld = YOldbuffer.get() ? *YOldbuffer.get() : green;
+ array2D& YNew = YNewbuffer.get() ? *YNewbuffer.get() : blue;
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic, 16)
@@ -1160,17 +1156,12 @@ BENCHFUN
#pragma omp parallel for schedule(dynamic, 16)
#endif
for (int i = 0; i < H; ++i) {
- int j = 0;
-#ifdef __SSE2__
- for (; j < W - 3; j += 4) {
- const vfloat factor = LVFU(YNew[i][j]) / vmaxf(LVFU(YOld[i][j]), F2V(0.00001f));
- STVFU(red[i][j], LVFU(redVals[i][j]) * factor);
- STVFU(green[i][j], LVFU(greenVals[i][j]) * factor);
- STVFU(blue[i][j], LVFU(blueVals[i][j]) * factor);
- }
-
+#if defined(__clang__)
+ #pragma clang loop vectorize(assume_safety)
+#elif defined(__GNUC__)
+ #pragma GCC ivdep
#endif
- for (; j < W; ++j) {
+ for (int j = 0; j < W; ++j) {
const float factor = YNew[i][j] / std::max(YOld[i][j], 0.00001f);
red[i][j] = redVals[i][j] * factor;
green[i][j] = greenVals[i][j] * factor;
@@ -1178,9 +1169,6 @@ BENCHFUN
}
}
- delete Lbuffer;
- delete YOldbuffer;
- delete YNewbuffer;
if (plistener) {
plistener->setProgress(1.0);
}
diff --git a/rtengine/ciecam02.cc b/rtengine/ciecam02.cc
index 208ed4366..c591bcb2c 100644
--- a/rtengine/ciecam02.cc
+++ b/rtengine/ciecam02.cc
@@ -22,11 +22,6 @@
#include
#include "sleef.h"
-#ifdef _DEBUG
-#include "settings.h"
-#include
-#endif
-
#undef CLIPD
#define CLIPD(a) ((a)>0.f?((a)<1.f?(a):1.f):0.f)
#define MAXR(a,b) ((a) > (b) ? (a) : (b))
@@ -420,13 +415,6 @@ void Ciecam02::initcam1float (float yb, float pilotd, float f, float la, float x
aw = achromatic_response_to_whitefloat ( xw, yw, zw, d, fl, nbb);
wh = ( 4.0f / c ) * ( aw + 4.0f ) * pow_F ( fl, 0.25f );
pfl = pow_F ( fl, 0.25f );
-#ifdef _DEBUG
-
- if (settings->verbose) {
- printf ("Source float d=%f aw=%f fl=%f wh=%f c=%f awc=%f\n", d, aw, fl, wh, c, (4.f / c) * (aw + 4.f));
- }
-
-#endif
}
void Ciecam02::initcam2float (float yb, float pilotd, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb,
@@ -445,13 +433,6 @@ void Ciecam02::initcam2float (float yb, float pilotd, float f, float la, float x
nbb = ncb = 0.725f * pow_F ( 1.0f / n, 0.2f );
cz = 1.48f + sqrt ( n );
aw = achromatic_response_to_whitefloat ( xw, yw, zw, d, fl, nbb);
-#ifdef _DEBUG
-
- if (settings->verbose) {
- printf ("Viewing float d=%f aw=%f fl=%f n=%f\n", d, aw, fl, n);
- }
-
-#endif
}
void Ciecam02::xyz2jchqms_ciecam02float ( float &J, float &C, float &h, float &Q, float &M, float &s, float aw, float fl, float wh,
diff --git a/rtengine/color.cc b/rtengine/color.cc
index 89be69e9d..11a94d1dc 100644
--- a/rtengine/color.cc
+++ b/rtengine/color.cc
@@ -25,10 +25,6 @@
#include "opthelper.h"
#include "iccstore.h"
-#ifdef _DEBUG
-#include "mytime.h"
-#endif
-
using namespace std;
namespace rtengine
@@ -45,6 +41,9 @@ LUTf Color::igammatab_srgb;
LUTf Color::igammatab_srgb1;
LUTf Color::gammatab_srgb;
LUTf Color::gammatab_srgb1;
+LUTf Color::gammatab_srgb327;
+LUTf Color::gammatab_bt709;
+LUTf Color::igammatab_bt709;
LUTf Color::denoiseGammaTab;
LUTf Color::denoiseIGammaTab;
@@ -103,20 +102,6 @@ LUTf Color::_10GY30, Color::_10GY40, Color::_10GY50, Color::_10GY60, Color::_10G
LUTf Color::_75GY30, Color::_75GY40, Color::_75GY50, Color::_75GY60, Color::_75GY70, Color::_75GY80;
LUTf Color::_5GY30, Color::_5GY40, Color::_5GY50, Color::_5GY60, Color::_5GY70, Color::_5GY80;
-#ifdef _DEBUG
-MunsellDebugInfo::MunsellDebugInfo()
-{
- reinitValues();
-}
-void MunsellDebugInfo::reinitValues()
-{
- maxdhue[0] = maxdhue[1] = maxdhue[2] = maxdhue[3] = 0.0f;
- maxdhuelum[0] = maxdhuelum[1] = maxdhuelum[2] = maxdhuelum[3] = 0.0f;
- depass = depassLum = 0;
-}
-#endif
-
-
void Color::init ()
{
@@ -130,9 +115,12 @@ void Color::init ()
gammatabThumb(maxindex, 0);
igammatab_srgb(maxindex, 0);
+ igammatab_bt709(maxindex, 0);
igammatab_srgb1(maxindex, 0);
gammatab_srgb(maxindex, 0);
+ gammatab_bt709(maxindex, 0);
gammatab_srgb1(maxindex, 0);
+ gammatab_srgb327(32768, 0);
denoiseGammaTab(maxindex, 0);
denoiseIGammaTab(maxindex, 0);
@@ -197,6 +185,18 @@ void Color::init ()
}
#ifdef _OPENMP
#pragma omp section
+#endif
+ {
+ for (int i = 0; i < 32768; i++)
+ {
+ gammatab_srgb327[i] = gamma2(i / 32767.0);
+ }
+
+ gammatab_srgb327 *= 32767.f;
+ // gamma2curve.share(gammatab_srgb, LUT_CLIP_BELOW | LUT_CLIP_ABOVE); // shares the buffer with gammatab_srgb but has different clip flags
+ }
+#ifdef _OPENMP
+ #pragma omp section
#endif
{
for (int i = 0; i < maxindex; i++)
@@ -206,6 +206,7 @@ void Color::init ()
igammatab_srgb *= 65535.f;
}
+
#ifdef _OPENMP
#pragma omp section
#endif
@@ -282,6 +283,22 @@ void Color::init ()
break;
}
+#ifdef _OPENMP
+ #pragma omp section
+#endif
+
+ for (int i = 0; i < maxindex; i++) {
+ gammatab_bt709[i] = 65535.0 * gamma709(i / 65535.0);
+ }
+
+#ifdef _OPENMP
+ #pragma omp section
+#endif
+
+ for (int i = 0; i < maxindex; i++) {
+ igammatab_bt709[i] = 65535.0 * igamma709(i / 65535.0);
+ }
+
#ifdef _OPENMP
#pragma omp section
#endif
@@ -998,23 +1015,6 @@ void Color::xyz2r (float x, float y, float z, float &r, const double rgb_xyz[3][
r = ((rgb_xyz[0][0] * x + rgb_xyz[0][1] * y + rgb_xyz[0][2] * z)) ;
}
-// same for float
-void Color::xyz2rgb (float x, float y, float z, float &r, float &g, float &b, const float rgb_xyz[3][3])
-{
- r = ((rgb_xyz[0][0] * x + rgb_xyz[0][1] * y + rgb_xyz[0][2] * z)) ;
- g = ((rgb_xyz[1][0] * x + rgb_xyz[1][1] * y + rgb_xyz[1][2] * z)) ;
- b = ((rgb_xyz[2][0] * x + rgb_xyz[2][1] * y + rgb_xyz[2][2] * z)) ;
-}
-
-#ifdef __SSE2__
-void Color::xyz2rgb (vfloat x, vfloat y, vfloat z, vfloat &r, vfloat &g, vfloat &b, const vfloat rgb_xyz[3][3])
-{
- r = ((rgb_xyz[0][0] * x + rgb_xyz[0][1] * y + rgb_xyz[0][2] * z)) ;
- g = ((rgb_xyz[1][0] * x + rgb_xyz[1][1] * y + rgb_xyz[1][2] * z)) ;
- b = ((rgb_xyz[2][0] * x + rgb_xyz[2][1] * y + rgb_xyz[2][2] * z)) ;
-}
-#endif // __SSE2__
-
#ifdef __SSE2__
void Color::trcGammaBW (float &r, float &g, float &b, float gammabwr, float gammabwg, float gammabwb)
{
@@ -1172,48 +1172,26 @@ void Color::computeBWMixerConstants (const Glib::ustring &setting, const Glib::u
float koymcp = 0.f;
if(setting == "ROYGCBPM-Abs" || setting == "ROYGCBPM-Rel") {
- float obM = 0.f;
- float ogM = 0.f;
- float orM = 0.f;
-
- float ybM = 0.f;
- float yrM = 0.f;
- float ygM = 0.f;
-
- float mgM = 0.f;
- float mrM = 0.f;
- float mbM = 0.f;
-
- float pgM = 0.f;
- float prM = 0.f;
- float pbM = 0.f;
-
- float crM = 0.f;
- float cgM = 0.f;
- float cbM = 0.f;
- //printf("mixred=%f\n",mixerRed);
-
float fcompl = 1.f;
- if(complement && algo == "SP") {
+ if (complement && algo == "SP") {
fcompl = 3.f; //special
- } else if(complement && algo == "LI") {
+ } else if (complement && algo == "LI") {
fcompl = 1.5f; //linear
}
// ponderate filters: report to R=G=B=33
// I ponder RGB channel, not only orange or yellow or cyan, etc...it's my choice !
- if(mixerOrange != 33) {
- if (algo == "SP") { //special
- if (mixerOrange >= 33) {
- orM = fcompl * (mixerOrange * 0.67f - 22.11f) / 100.f;
- } else {
- orM = fcompl * (-0.3f * mixerOrange + 9.9f) / 100.f;
- }
+ if (mixerOrange != 33.f) {
+ float ogM = 0.f;
+ float orM = 0.f;
- if (mixerOrange >= 33) {
+ if (algo == "SP") { //special
+ if (mixerOrange > 33.f) {
+ orM = fcompl * (mixerOrange * 0.67f - 22.11f) / 100.f;
ogM = fcompl * (-0.164f * mixerOrange + 5.412f) / 100.f;
} else {
+ orM = fcompl * (-0.3f * mixerOrange + 9.9f) / 100.f;
ogM = fcompl * (0.4f * mixerOrange - 13.2f) / 100.f;
}
} else if (algo == "LI") { //linear
@@ -1221,30 +1199,24 @@ void Color::computeBWMixerConstants (const Glib::ustring &setting, const Glib::u
ogM = fcompl * (0.5f * mixerOrange - 16.5f) / 100.f;
}
- if(complement) {
- obM = (-0.492f * mixerOrange + 16.236f) / 100.f;
- }
+ const float obM = complement ? (-0.492f * mixerOrange + 16.236f) / 100.f : 0.f;
- mixerRed += orM;
+ mixerRed += orM;
mixerGreen += ogM;
- mixerBlue += obM;
+ mixerBlue += obM;
koymcp += (orM + ogM + obM);
- // printf("mixred+ORange=%f\n",mixerRed);
-
}
- if(mixerYellow != 33) {
+ if (mixerYellow != 33.f) {
+ float yrM = 0.f;
if (algo == "SP") {
yrM = fcompl * (-0.134f * mixerYellow + 4.422f) / 100.f; //22.4
} else if (algo == "LI") {
yrM = fcompl * (0.5f * mixerYellow - 16.5f) / 100.f; //22.4
}
- ygM = fcompl * (0.5f * mixerYellow - 16.5f ) / 100.f;
-
- if(complement) {
- ybM = (-0.492f * mixerYellow + 16.236f) / 100.f;
- }
+ const float ygM = fcompl * (0.5f * mixerYellow - 16.5f ) / 100.f;
+ const float ybM = complement ? (-0.492f * mixerYellow + 16.236f) / 100.f : 0.f;
mixerRed += yrM;
mixerGreen += ygM;
@@ -1252,17 +1224,15 @@ void Color::computeBWMixerConstants (const Glib::ustring &setting, const Glib::u
koymcp += (yrM + ygM + ybM);
}
- if(mixerMagenta != 33) {
+ if (mixerMagenta != 33.f) {
+ float mrM = 0.f;
+ float mbM = 0.f;
if (algo == "SP") {
- if(mixerMagenta >= 33) {
+ if (mixerMagenta > 33.f) {
mrM = fcompl * ( 0.67f * mixerMagenta - 22.11f) / 100.f;
- } else {
- mrM = fcompl * (-0.3f * mixerMagenta + 9.9f) / 100.f;
- }
-
- if(mixerMagenta >= 33) {
mbM = fcompl * (-0.164f * mixerMagenta + 5.412f) / 100.f;
} else {
+ mrM = fcompl * (-0.3f * mixerMagenta + 9.9f) / 100.f;
mbM = fcompl * ( 0.4f * mixerMagenta - 13.2f) / 100.f;
}
} else if (algo == "LI") {
@@ -1270,9 +1240,7 @@ void Color::computeBWMixerConstants (const Glib::ustring &setting, const Glib::u
mbM = fcompl * (0.5f * mixerMagenta - 16.5f) / 100.f;
}
- if(complement) {
- mgM = (-0.492f * mixerMagenta + 16.236f) / 100.f;
- }
+ const float mgM = complement ? (-0.492f * mixerMagenta + 16.236f) / 100.f : 0.f;
mixerRed += mrM;
mixerGreen += mgM;
@@ -1280,18 +1248,16 @@ void Color::computeBWMixerConstants (const Glib::ustring &setting, const Glib::u
koymcp += (mrM + mgM + mbM);
}
- if(mixerPurple != 33) {
+ if (mixerPurple != 33.f) {
+ float prM = 0.f;
if (algo == "SP") {
prM = fcompl * (-0.134f * mixerPurple + 4.422f) / 100.f;
} else if (algo == "LI") {
prM = fcompl * (0.5f * mixerPurple - 16.5f) / 100.f;
}
- pbM = fcompl * (0.5f * mixerPurple - 16.5f) / 100.f;
-
- if(complement) {
- pgM = (-0.492f * mixerPurple + 16.236f) / 100.f;
- }
+ const float pbM = fcompl * (0.5f * mixerPurple - 16.5f) / 100.f;
+ const float pgM = complement ? (-0.492f * mixerPurple + 16.236f) / 100.f : 0.f;
mixerRed += prM;
mixerGreen += pgM;
@@ -1299,18 +1265,16 @@ void Color::computeBWMixerConstants (const Glib::ustring &setting, const Glib::u
koymcp += (prM + pgM + pbM);
}
- if(mixerCyan != 33) {
+ if (mixerCyan != 33.f) {
+ float cgM = 0.f;
if (algo == "SP") {
cgM = fcompl * (-0.134f * mixerCyan + 4.422f) / 100.f;
} else if (algo == "LI") {
cgM = fcompl * (0.5f * mixerCyan - 16.5f) / 100.f;
}
- cbM = fcompl * (0.5f * mixerCyan - 16.5f) / 100.f;
-
- if(complement) {
- crM = (-0.492f * mixerCyan + 16.236f) / 100.f;
- }
+ const float cbM = fcompl * (0.5f * mixerCyan - 16.5f) / 100.f;
+ const float crM = complement ? (-0.492f * mixerCyan + 16.236f) / 100.f : 0.f;
mixerRed += crM;
mixerGreen += cgM;
@@ -1330,7 +1294,7 @@ void Color::computeBWMixerConstants (const Glib::ustring &setting, const Glib::u
filblue = 1.f;
filcor = 1.f;
- if (filter == "None") {
+ if (filter == "None") {
filred = 1.f;
filgreen = 1.f;
filblue = 1.f;
@@ -1421,15 +1385,7 @@ void Color::interpolateRGBColor (const float balance, const float r1, const floa
Color::Lab2Lch(a_1, b_1, c1, h1);
Lr = L1 / 327.68f; //for gamutlch
//gamut control on r1 g1 b1
-#ifndef NDEBUG
- bool neg = false;
- bool more_rgb = false;
-
- //gamut control : Lab values are in gamut
- Color::gamutLchonly(h1, Lr, c1, RR, GG, BB, xyz_rgb, false, 0.15f, 0.96f, neg, more_rgb);
-#else
Color::gamutLchonly(h1, Lr, c1, RR, GG, BB, xyz_rgb, false, 0.15f, 0.96f);
-#endif
L1 = Lr * 327.68f;
@@ -1440,14 +1396,7 @@ void Color::interpolateRGBColor (const float balance, const float r1, const floa
Lr = L2 / 327.68f; //for gamutlch
//gamut control on r2 g2 b2
-#ifndef NDEBUG
- neg = false;
- more_rgb = false;
- //gamut control : Lab values are in gamut
- Color::gamutLchonly(h2, Lr, c2, RR, GG, BB, xyz_rgb, false, 0.15f, 0.96f, neg, more_rgb);
-#else
Color::gamutLchonly(h2, Lr, c2, RR, GG, BB, xyz_rgb, false, 0.15f, 0.96f);
-#endif
L2 = Lr * 327.68f;
// interpolating Lch values
@@ -1477,15 +1426,8 @@ void Color::interpolateRGBColor (const float balance, const float r1, const floa
// here I have put gamut control with gamutlchonly on final process
Lr = L1 / 327.68f; //for gamutlch
-#ifndef NDEBUG
- neg = false;
- more_rgb = false;
- //gamut control : Lab values are in gamut
- Color::gamutLchonly(h1, Lr, c1, RR, GG, BB, xyz_rgb, false, 0.15f, 0.96f, neg, more_rgb);
-#else
//gamut control : Lab values are in gamut
Color::gamutLchonly(h1, Lr, c1, RR, GG, BB, xyz_rgb, false, 0.15f, 0.96f);
-#endif
//convert CH ==> ab
L1 = Lr * 327.68f;
@@ -1501,101 +1443,79 @@ void Color::interpolateRGBColor (float realL, float iplow, float iphigh, int alg
const float xl, const float yl, const float zl, const float x2, const float y2, const float z2,
const double xyz_rgb[3][3], const double rgb_xyz[3][3], float &ro, float &go, float &bo)
{
- float X1, Y1, Z1, X2, Y2, Z2, X, Y, Z, XL, YL, ZL;
- float L1 = 0.f, L2, LL, a_1 = 0.f, b_1 = 0.f, a_2 = 0.f, b_2 = 0.f, a_L, b_L;
+ float L1 = 0.f, a_1 = 0.f, b_1 = 0.f, a_2 = 0.f, b_2 = 0.f, a_L = 0.f, b_L = 0.f;
- // converting color 1 to Lab (image)
- Color::rgbxyz(r1, g1, b1, X1, Y1, Z1, xyz_rgb);
-
- if(algm == 1) {//use H interpolate
+ if (algm == 1) {//use H interpolate
+ // converting color 1 to Lab (image)
+ float X1, Y1, Z1;
+ Color::rgbxyz(r1, g1, b1, X1, Y1, Z1, xyz_rgb);
Color::XYZ2Lab(X1, Y1, Z1, L1, a_1, b_1);
- //Color::Lab2Lch(a_1, b_1, c_1, h_1) ;
}
// converting color l lab(low) first color
- if(twoc == 0) { // 2 colours
- //Color::rgbxyz(rl, gl, bl, XL, YL, ZL, xyz_rgb);
- XL = xl;
- YL = yl;
- ZL = zl;
-
- if(algm <= 1) {//use H interpolate
- Color::XYZ2Lab(XL, YL, ZL, LL, a_L, b_L);
+ if (twoc == 0) { // 2 colours
+ if (algm == 1) {//use H interpolate
+ float unused;
+ Color::XYZ2Lab(xl, yl, zl, unused, a_L, b_L);
}
}
// converting color 2 to lab (universal or high)
- X2 = x2;
- Y2 = y2;
- Z2 = z2;
-
- if(algm == 1 ) {
- Color::XYZ2Lab(X2, Y2, Z2, L2, a_2, b_2);
- //Color::Lab2Lch(a_2, b_2, c_2, h_2) ;
+ if (algm == 1) {
+ float unused;
+ Color::XYZ2Lab(x2, y2, z2, unused, a_2, b_2);
}
- float cal, calH, calm;
- cal = calH = calm = 1.f - chromat;
- float med = 1.f;
- float medH = 0.f;
-
- float calan;
- calan = chromat;
-
- float calby;
- calby = luma;
-
- if(twoc == 0) { // 2 colours
- calan = chromat;
+ float cal, calH;
+ cal = calH = 1.f - chromat;
+ if (twoc == 0) { // 2 colours
//calculate new balance chroma
- if (realL > iplow && realL <= med) {
- cal = realL * calan / (iplow - med) - med * calan / (iplow - med);
+ constexpr float med = 1.f;
+ if (realL > iplow && realL <= med) {
+ cal = realL * chromat / (iplow - med) - chromat / (iplow - med);
} else if (realL <= iplow) {
- cal = realL * calan / iplow;
+ cal = realL * chromat / iplow;
}
- if (realL > medH && realL <= iphigh) {
- calH = realL * calan / (iphigh - medH) - medH * calan / (iphigh - medH);
+ if (realL > 0.f && realL <= iphigh) {
+ calH = realL * chromat / iphigh;
} else if (realL > iphigh) {
- calH = realL * calan; //*(iphigh-1.f) - calan*(iphigh-1.f);//it is better without transition in highlight
+ calH = realL * chromat; //*(iphigh-1.f) - chromat*(iphigh-1.f);//it is better without transition in highlight
}
}
- float aaH, bbH;
-
- if(algm <= 1) {
- if(twoc == 0 && metchrom == 3) { // 2 colours only with special "ab"
- if(algm == 1) {
- aaH = a_1 + (a_2 - a_1) * calH;
- bbH = b_1 + (b_2 - b_1) * calH; //pass to line after
+ if (algm <= 1) {
+ if (twoc == 0 && metchrom == 3) { // 2 colours only with special "ab"
+ if (algm == 1) {
+ const float aaH = a_1 + (a_2 - a_1) * calH;
+ const float bbH = b_1 + (b_2 - b_1) * calH; //pass to line after
a_1 = aaH + (a_L - aaH) * cal * balance;
b_1 = bbH + (b_L - bbH) * cal * balance;
}
- } else if(twoc == 1) {
- if(metchrom == 0) {
+ } else if (twoc == 1) {
+ if (metchrom == 0) {
a_1 = a_1 + (a_2 - a_1) * balance;
b_1 = b_1 + (b_2 - b_1) * balance;
- } else if(metchrom == 1) {
- a_1 = a_1 + (a_2 - a_1) * calan * balance;
- b_1 = b_1 + (b_2 - b_1) * calan * balance;
- } else if(metchrom == 2) {
- a_1 = a_1 + (a_2 - a_1) * calan * balance;
- b_1 = b_1 + (b_2 - b_1) * calby * balance;
+ } else if (metchrom == 1) {
+ a_1 = a_1 + (a_2 - a_1) * chromat * balance;
+ b_1 = b_1 + (b_2 - b_1) * chromat * balance;
+ } else if (metchrom == 2) {
+ a_1 = a_1 + (a_2 - a_1) * chromat * balance;
+ b_1 = b_1 + (b_2 - b_1) * luma * balance;
}
}
}
+ float X, Y, Z;
Color::Lab2XYZ(L1, a_1, b_1, X, Y, Z);
-
Color::xyz2rgb(X, Y, Z, ro, go, bo, rgb_xyz);// ro go bo in gamut
}
-void Color::calcGamma (double pwr, double ts, int mode, GammaValues &gamma)
+void Color::calcGamma (double pwr, double ts, GammaValues &gamma)
{
//from Dcraw (D.Coffin)
- int i;
- double g[6], bnd[2] = {0., 0.};
+ double g[6], bnd[2] = {};
g[0] = pwr;
g[1] = ts;
@@ -1603,7 +1523,7 @@ void Color::calcGamma (double pwr, double ts, int mode, GammaValues &gamma)
bnd[g[1] >= 1.] = 1.;
if (g[1] && (g[1] - 1.) * (g[0] - 1.) <= 0.) {
- for (i = 0; i < 99; i++) {
+ for (int i = 0; i < 99; i++) {
g[2] = (bnd[0] + bnd[1]) / 2.;
if (g[0]) {
@@ -1626,16 +1546,16 @@ void Color::calcGamma (double pwr, double ts, int mode, GammaValues &gamma)
g[5] = 1. / (g[1] * SQR(g[3]) / 2. + 1. - g[2] - g[3] - g[2] * g[3] * (log(g[3]) - 1.)) - 1.;
}
- if (!mode--) {
- gamma[0] = g[0];
- gamma[1] = g[1];
- gamma[2] = g[2];
- gamma[3] = g[3];
- gamma[4] = g[4];
- gamma[5] = g[5];
- gamma[6] = 0.;
- return;
- }
+ gamma[0] = g[0];
+ gamma[1] = g[1];
+ gamma[2] = g[2];
+ gamma[3] = g[3];
+ gamma[4] = g[4];
+ gamma[5] = g[5];
+ gamma[6] = 0.;
+ // if (rtengine::settings->verbose) {
+ // printf("g0=%f g1=%f g2=%f g3=%f g4=%f g5=%f\n", g[0], g[1], g[2], g[3], g[4], g[5]);
+ // }
}
void Color::gammaf2lut (LUTf &gammacurve, float gamma, float start, float slope, float divisor, float factor)
{
@@ -1712,19 +1632,6 @@ void Color::gammanf2lut (LUTf &gammacurve, float gamma, float divisor, float fac
#endif
}
-void Color::Lab2XYZ(float L, float a, float b, float &x, float &y, float &z)
-{
- float LL = L / 327.68f;
- float aa = a / 327.68f;
- float bb = b / 327.68f;
- float fy = (c1By116 * LL) + c16By116; // (L+16)/116
- float fx = (0.002f * aa) + fy;
- float fz = fy - (0.005f * bb);
- x = 65535.0f * f2xyz(fx) * D50x;
- z = 65535.0f * f2xyz(fz) * D50z;
- y = (LL > epskap) ? 65535.0f * fy * fy * fy : 65535.0f * LL / kappa;
-}
-
float Color::L2Y(float L)
{
const float LL = L / 327.68f;
@@ -1742,27 +1649,6 @@ void Color::L2XYZ(float L, float &x, float &y, float &z) // for black & white
y = (LL > epskap) ? 65535.0f * fy * fy * fy : 65535.0f * LL / kappa;
}
-
-#ifdef __SSE2__
-void Color::Lab2XYZ(vfloat L, vfloat a, vfloat b, vfloat &x, vfloat &y, vfloat &z)
-{
- vfloat c327d68 = F2V(327.68f);
- L /= c327d68;
- a /= c327d68;
- b /= c327d68;
- vfloat fy = F2V(c1By116) * L + F2V(c16By116);
- vfloat fx = F2V(0.002f) * a + fy;
- vfloat fz = fy - (F2V(0.005f) * b);
- vfloat c65535 = F2V(65535.f);
- x = c65535 * f2xyz(fx) * F2V(D50x);
- z = c65535 * f2xyz(fz) * F2V(D50z);
- vfloat res1 = fy * fy * fy;
- vfloat res2 = L / F2V(kappa);
- y = vself(vmaskf_gt(L, F2V(epskap)), res1, res2);
- y *= c65535;
-}
-#endif // __SSE2__
-
inline float Color::computeXYZ2Lab(float f)
{
if (f < 0.f) {
@@ -1838,7 +1724,7 @@ void Color::RGB2Lab(float *R, float *G, float *B, float *L, float *a, float *b,
}
}
-void Color::RGB2L(float *R, float *G, float *B, float *L, const float wp[3][3], int width)
+void Color::RGB2L(const float *R, const float *G, const float *B, float *L, const float wp[3][3], int width)
{
#ifdef __SSE2__
@@ -2044,7 +1930,7 @@ void Color::Lch2Luv(float c, float h, float &u, float &v)
* columns of the matrix p=xyz_rgb are RGB tristimulus primaries in XYZ
* c is the color fixed on the boundary; and m=0 for c=0, m=1 for c=255
*/
-void Color::gamutmap(float &X, float &Y, float &Z, const double p[3][3])
+void Color::gamutmap(float &X, float Y, float &Z, const double p[3][3])
{
float u = 4 * X / (X + 15 * Y + 3 * Z) - u0;
float v = 9 * Y / (X + 15 * Y + 3 * Z) - v0;
@@ -2081,96 +1967,33 @@ void Color::gamutmap(float &X, float &Y, float &Z, const double p[3][3])
Z = (12 - 3 * u - 20 * v) * Y / (4 * v);
}
-void Color::skinred ( double J, double h, double sres, double Sp, float dred, float protect_red, int sk, float rstprotection, float ko, double &s)
-{
- float factorskin, factorsat, factor, factorskinext, interm;
- float scale = 100.0f / 100.1f; //reduction in normal zone
- float scaleext = 1.0f; //reduction in transition zone
- float deltaHH = 0.3f; //HH value transition : I have choice 0.3 radians
- float HH;
- bool doskin = false;
-
- //rough correspondence between h (JC) and H (lab) that has relatively little importance because transitions that blur the correspondence is not linear
- if ((float)h > 8.6f && (float)h <= 74.f ) {
- HH = (1.15f / 65.4f) * (float)h - 0.0012f; //H > 0.15 H<1.3
- doskin = true;
- } else if((float)h > 0.f && (float)h <= 8.6f ) {
- HH = (0.19f / 8.6f ) * (float)h - 0.04f; //H>-0.04 H < 0.15
- doskin = true;
- } else if((float)h > 355.f && (float)h <= 360.f) {
- HH = (0.11f / 5.0f ) * (float)h - 7.96f; //H>-0.15 <-0.04
- doskin = true;
- } else if((float)h > 74.f && (float)h < 95.f ) {
- HH = (0.30f / 21.0f) * (float)h + 0.24285f; //H>1.3 H<1.6
- doskin = true;
- }
-
- if(doskin) {
- float chromapro = sres / Sp;
-
- if(sk == 1) { //in C mode to adapt dred to J
- if (J < 16.0) {
- dred = 40.0f;
- } else if(J < 22.0) {
- dred = 2.5f * (float)J;
- } else if(J < 60.0) {
- dred = 55.0f;
- } else if(J < 70.0) {
- dred = -1.5f * (float)J + 145.0f;
- } else {
- dred = 40.0f;
- }
- }
-
- if(chromapro > 0.0) {
- Color::scalered ( rstprotection, chromapro, 0.0, HH, deltaHH, scale, scaleext); //Scale factor
- }
-
- if(chromapro > 1.0) {
- interm = (chromapro - 1.0f) * 100.0f;
- factorskin = 1.0f + (interm * scale) / 100.0f;
- factorskinext = 1.0f + (interm * scaleext) / 100.0f;
- } else {
- factorskin = chromapro ;
- factorskinext = chromapro ;
- }
-
- factorsat = chromapro;
- factor = factorsat;
- Color::transitred ( HH, s, dred, factorskin, protect_red, factorskinext, deltaHH, factorsat, factor); //transition
- s *= factor;
- } else {
- s = ko * sres;
- }
-
-}
void Color::skinredfloat ( float J, float h, float sres, float Sp, float dred, float protect_red, int sk, float rstprotection, float ko, float &s)
{
float HH;
bool doskin = false;
//rough correspondence between h (JC) and H (lab) that has relatively little importance because transitions that blur the correspondence is not linear
- if ((float)h > 8.6f && (float)h <= 74.f ) {
- HH = (1.15f / 65.4f) * (float)h - 0.0012f; //H > 0.15 H<1.3
+ if (h > 8.6f && h <= 74.f) {
+ HH = (1.15f / 65.4f) * h - 0.0012f; //H > 0.15 H<1.3
doskin = true;
- } else if((float)h > 0.f && (float)h <= 8.6f ) {
- HH = (0.19f / 8.6f ) * (float)h - 0.04f; //H>-0.04 H < 0.15
+ } else if(h > 0.f && h <= 8.6f) {
+ HH = (0.19f / 8.6f) * h - 0.04f; //H>-0.04 H < 0.15
doskin = true;
- } else if((float)h > 355.f && (float)h <= 360.f) {
- HH = (0.11f / 5.0f ) * (float)h - 7.96f; //H>-0.15 <-0.04
+ } else if(h > 355.f && h <= 360.f) {
+ HH = (0.11f / 5.0f) * h - 7.96f; //H>-0.15 <-0.04
doskin = true;
- } else if((float)h > 74.f && (float)h < 95.f ) {
- HH = (0.30f / 21.0f) * (float)h + 0.24285f; //H>1.3 H<1.6
+ } else if(h > 74.f && h < 95.f ) {
+ HH = (0.30f / 21.0f) * h + 0.24285f; //H>1.3 H<1.6
doskin = true;
}
if(doskin) {
- float factorskin, factorsat, factor, factorskinext;
+ float factorskin, factor, factorskinext;
float deltaHH = 0.3f; //HH value transition : I have choice 0.3 radians
float chromapro = sres / Sp;
if(sk == 1) { //in C mode to adapt dred to J
- if (J < 16.f) {
+ if (J < 16.f) {
dred = 40.f;
} else if(J < 22.f) {
dred = 2.5f * J;
@@ -2187,7 +2010,7 @@ void Color::skinredfloat ( float J, float h, float sres, float Sp, float dred, f
float scale = 0.999000999f; // 100.0f/100.1f; reduction in normal zone
float scaleext = 1.0f; //reduction in transition zone
Color::scalered ( rstprotection, chromapro, 0.0, HH, deltaHH, scale, scaleext);//Scale factor
- float interm = (chromapro - 1.0f);
+ const float interm = chromapro - 1.0f;
factorskin = 1.0f + (interm * scale);
factorskinext = 1.0f + (interm * scaleext);
} else {
@@ -2195,21 +2018,14 @@ void Color::skinredfloat ( float J, float h, float sres, float Sp, float dred, f
factorskinext = chromapro ;
}
- factorsat = chromapro;
- factor = factorsat;
- Color::transitred ( HH, s, dred, factorskin, protect_red, factorskinext, deltaHH, factorsat, factor); //transition
+ factor = chromapro;
+ Color::transitred ( HH, s, dred, factorskin, protect_red, factorskinext, deltaHH, chromapro, factor); //transition
s *= factor;
} else {
s = ko * sres;
}
-
}
-
-
-
-
-
void Color::scalered ( const float rstprotection, const float param, const float limit, const float HH, const float deltaHH, float &scale, float &scaleext)
{
if(rstprotection < 99.9999f) {
@@ -2264,55 +2080,24 @@ void Color::transitred (const float HH, float const Chprov1, const float dred, c
* float correctlum : correction Hue for luminance (brigtness, contrast,...)
* MunsellDebugInfo* munsDbgInfo: (Debug target only) object to collect information.
*/
-#ifdef _DEBUG
-void Color::AllMunsellLch(bool lumaMuns, float Lprov1, float Loldd, float HH, float Chprov1, float CC, float &correctionHuechroma, float &correctlum, MunsellDebugInfo* munsDbgInfo)
-#else
void Color::AllMunsellLch(bool lumaMuns, float Lprov1, float Loldd, float HH, float Chprov1, float CC, float &correctionHuechroma, float &correctlum)
-#endif
{
- bool contin1, contin2;
- float correctionHue = 0.0, correctionHueLum = 0.0;
- bool correctL;
+ if (CC >= 6.f && CC < 140.f) { //if C > 140 we say C=140 (only in Prophoto ...with very large saturation)
+ constexpr float huelimit[8] = { -2.48f, -0.55f, 0.44f, 1.52f, 1.87f, 3.09f, -0.27f, 0.44f}; //limits hue of blue-purple, red-yellow, green-yellow, red-purple
- if(CC >= 6.0 && CC < 140) { //if C > 140 we say C=140 (only in Prophoto ...with very large saturation)
- static const float huelimit[8] = { -2.48, -0.55, 0.44, 1.52, 1.87, 3.09, -0.27, 0.44}; //limits hue of blue-purple, red-yellow, green-yellow, red-purple
+ Chprov1 = rtengine::LIM(Chprov1, 6.f, 140.f);
- if (Chprov1 > 140.f) {
- Chprov1 = 139.f; //limits of LUTf
- }
-
- if (Chprov1 < 6.f) {
- Chprov1 = 6.f;
- }
-
- for(int zo = 1; zo <= 4; zo++) {
- if(HH > huelimit[2 * zo - 2] && HH < huelimit[2 * zo - 1]) {
- //zone=zo;
- contin1 = contin2 = false;
- correctL = false;
+ for (int zo = 1; zo <= 4; ++zo) {
+ if (HH > huelimit[2 * zo - 2] && HH < huelimit[2 * zo - 1]) {
+ bool correctL = false;
+ float correctionHue = 0.f, correctionHueLum = 0.f;
MunsellLch (Lprov1, HH, Chprov1, CC, correctionHue, zo, correctionHueLum, correctL); //munsell chroma correction
-#ifdef _DEBUG
- float absCorrectionHue = fabs(correctionHue);
-
- if(correctionHue != 0.0) {
- int idx = zo - 1;
- #pragma omp critical (maxdhue)
- {
- munsDbgInfo->maxdhue[idx] = MAX(munsDbgInfo->maxdhue[idx], absCorrectionHue);
- }
- }
-
- if(absCorrectionHue > 0.45)
- #pragma omp atomic
- munsDbgInfo->depass++; //verify if no bug in calculation
-
-#endif
correctionHuechroma = correctionHue; //preserve
if(lumaMuns) {
+ bool contin1 = false;
float correctlumprov = 0.f;
- float correctlumprov2 = 0.f;
if(correctL) {
//for Munsell luminance correction
@@ -2321,64 +2106,22 @@ void Color::AllMunsellLch(bool lumaMuns, float Lprov1, float Loldd, float HH, fl
correctL = false;
}
- correctionHueLum = 0.0;
- correctionHue = 0.0;
-
- if(fabs(Lprov1 - Loldd) > 6.0) {
+ if (std::fabs(Lprov1 - Loldd) > 6.f) {
+ correctionHueLum = 0.f;
+ correctionHue = 0.f;
// correction if delta L significative..Munsell luminance
MunsellLch (Loldd, HH, Chprov1, Chprov1, correctionHue, zo, correctionHueLum, correctL);
-
if(correctL) {
- correctlumprov2 = correctionHueLum;
- contin2 = true;
- correctL = false;
- }
-
- correctionHueLum = 0.0;
-
- if(contin1 && contin2) {
- correctlum = correctlumprov2 - correctlumprov;
- }
-
-#ifdef _DEBUG
- float absCorrectLum = fabs(correctlum);
-
- if(correctlum != 0.0) {
- int idx = zo - 1;
- #pragma omp critical (maxdhuelum)
- {
- munsDbgInfo->maxdhuelum[idx] = MAX(munsDbgInfo->maxdhuelum[idx], absCorrectLum);
+ if(contin1) {
+ correctlum = correctionHueLum - correctlumprov;
}
}
-
- if(absCorrectLum > 0.35)
- #pragma omp atomic
- munsDbgInfo->depassLum++; //verify if no bug in calculation
-
-#endif
}
}
+ break;
}
}
-
}
-
-#ifdef _DEBUG
-
- if (correctlum < -0.35f) {
- correctlum = -0.35f;
- } else if(correctlum > 0.35f) {
- correctlum = 0.35f;
- }
-
- if (correctionHuechroma < -0.45f) {
- correctionHuechroma = -0.45f;
- } else if(correctionHuechroma > 0.45f) {
- correctionHuechroma = 0.45f;
- }
-
-#endif
-
}
/*
@@ -2397,9 +2140,6 @@ void Color::AllMunsellLch(bool lumaMuns, float Lprov1, float Loldd, float HH, fl
void Color::AllMunsellLch(float Lprov1, float HH, float Chprov1, float CC, float &correctionHuechroma)
{
- float correctionHue = 0.f, correctionHueLum = 0.f;
- bool correctL;
-
if(CC >= 6.f && CC < 140.f) { //if C > 140 we say C=140 (only in Prophoto ...with very large saturation)
static const float huelimit[8] = { -2.48f, -0.55f, 0.44f, 1.52f, 1.87f, 3.09f, -0.27f, 0.44f}; //limits hue of blue-purple, red-yellow, green-yellow, red-purple
@@ -2412,7 +2152,8 @@ void Color::AllMunsellLch(float Lprov1, float HH, float Chprov1, float CC, float
for(int zo = 1; zo <= 4; zo++) {
if(HH > huelimit[2 * zo - 2] && HH < huelimit[2 * zo - 1]) {
//zone=zo;
- correctL = false;
+ float correctionHue = 0.f, correctionHueLum = 0.f;
+ bool correctL = false;
MunsellLch (Lprov1, HH, Chprov1, CC, correctionHue, zo, correctionHueLum, correctL); //munsell chroma correction
correctionHuechroma = correctionHue; //preserve
break;
@@ -2437,17 +2178,10 @@ void Color::AllMunsellLch(float Lprov1, float HH, float Chprov1, float CC, float
* float coef : a float number between [0.95 ; 1.0[... the nearest it is from 1.0, the more precise it will be... and the longer too as more iteration will be necessary)
* bool neg and moreRGB : only in DEBUG mode to calculate iterations for negatives values and > 65535
*/
-#ifdef _DEBUG
-void Color::gamutLchonly (float HH, float &Lprov1, float &Chprov1, float &R, float &G, float &B, const double wip[3][3], const bool isHLEnabled, const float lowerCoef, const float higherCoef, bool &neg, bool &more_rgb)
-#else
void Color::gamutLchonly (float HH, float &Lprov1, float &Chprov1, float &R, float &G, float &B, const double wip[3][3], const bool isHLEnabled, const float lowerCoef, const float higherCoef)
-#endif
{
const float ClipLevel = 65535.0f;
bool inGamut;
-#ifdef _DEBUG
- neg = false, more_rgb = false;
-#endif
float2 sincosval = xsincosf(HH);
do {
@@ -2471,10 +2205,6 @@ void Color::gamutLchonly (float HH, float &Lprov1, float &Chprov1, float &R, flo
// gamut control before saturation to put Lab values in future gamut, but not RGB
if (R < 0.0f || G < 0.0f || B < 0.0f) {
-#ifdef _DEBUG
- neg = true;
-#endif
-
if (Lprov1 < 0.1f) {
Lprov1 = 0.1f;
}
@@ -2520,10 +2250,6 @@ void Color::gamutLchonly (float HH, float &Lprov1, float &Chprov1, float &R, flo
} else if (!isHLEnabled && rtengine::max(R, G, B) > ClipLevel && rtengine::min(R, G, B) <= ClipLevel) {
// if "highlight reconstruction" is enabled or the point is completely white (clipped, no color), don't control Gamut
-#ifdef _DEBUG
- more_rgb = true;
-#endif
-
if (Lprov1 > 99.999f) {
Lprov1 = 99.98f;
}
@@ -2558,17 +2284,10 @@ void Color::gamutLchonly (float HH, float &Lprov1, float &Chprov1, float &R, flo
* float coef : a float number between [0.95 ; 1.0[... the nearest it is from 1.0, the more precise it will be... and the longer too as more iteration will be necessary)
* bool neg and moreRGB : only in DEBUG mode to calculate iterations for negatives values and > 65535
*/
-#ifdef _DEBUG
-void Color::gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chprov1, float &R, float &G, float &B, const double wip[3][3], const bool isHLEnabled, const float lowerCoef, const float higherCoef, bool &neg, bool &more_rgb)
-#else
void Color::gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chprov1, float &R, float &G, float &B, const double wip[3][3], const bool isHLEnabled, const float lowerCoef, const float higherCoef)
-#endif
{
constexpr float ClipLevel = 65535.0f;
bool inGamut;
-#ifdef _DEBUG
- neg = false, more_rgb = false;
-#endif
float ChprovSave = Chprov1;
do {
@@ -2590,9 +2309,6 @@ void Color::gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chpr
// gamut control before saturation to put Lab values in future gamut, but not RGB
if (R < 0.0f || G < 0.0f || B < 0.0f) {
-#ifdef _DEBUG
- neg = true;
-#endif
if (isnan(HH)) {
float atemp = ChprovSave * sincosval.y * 327.68;
@@ -2645,10 +2361,6 @@ void Color::gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chpr
} else if (!isHLEnabled && rtengine::max(R, G, B) > ClipLevel && rtengine::min(R, G, B) <= ClipLevel) {
// if "highlight reconstruction" is enabled or the point is completely white (clipped, no color), don't control Gamut
-#ifdef _DEBUG
- more_rgb = true;
-#endif
-
if (Lprov1 > 99.999f) {
Lprov1 = 99.98f;
}
@@ -2770,17 +2482,10 @@ void Color::gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chpr
}
-#ifdef _DEBUG
-void Color::gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const float wip[3][3], const bool isHLEnabled, const float lowerCoef, const float higherCoef, bool &neg, bool &more_rgb)
-#else
void Color::gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const float wip[3][3], const bool isHLEnabled, const float lowerCoef, const float higherCoef)
-#endif
{
const float ClipLevel = 65535.0f;
bool inGamut;
-#ifdef _DEBUG
- neg = false, more_rgb = false;
-#endif
do {
inGamut = true;
@@ -2804,10 +2509,6 @@ void Color::gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const
// gamut control before saturation to put Lab values in future gamut, but not RGB
if (R < 0.0f || G < 0.0f || B < 0.0f) {
-#ifdef _DEBUG
- neg = true;
-#endif
-
if (Lprov1 < 0.01f) {
Lprov1 = 0.01f;
}
@@ -2822,10 +2523,6 @@ void Color::gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const
} else if (!isHLEnabled && rtengine::max(R, G, B) > ClipLevel && rtengine::min(R, G, B) <= ClipLevel) {
// if "highlight reconstruction" is enabled or the point is completely white (clipped, no color), don't control Gamut
-#ifdef _DEBUG
- more_rgb = true;
-#endif
-
if (Lprov1 > 99.999f) {
Lprov1 = 99.98f;
}
@@ -2865,19 +2562,6 @@ void Color::gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const
*/
void Color::LabGamutMunsell(float *labL, float *laba, float *labb, const int N, bool corMunsell, bool lumaMuns, bool isHLEnabled, bool gamut, const double wip[3][3])
{
-#ifdef _DEBUG
- MyTime t1e, t2e;
- t1e.set();
- int negat = 0, moreRGB = 0;
- MunsellDebugInfo* MunsDebugInfo = nullptr;
-
- if (corMunsell) {
- MunsDebugInfo = new MunsellDebugInfo();
- }
-
-#endif
- float correctlum = 0.f;
- float correctionHuechroma = 0.f;
#ifdef __SSE2__
// precalculate H and C using SSE
float HHBuffer[N];
@@ -2914,9 +2598,6 @@ void Color::LabGamutMunsell(float *labL, float *laba, float *labb, const int N,
float2 sincosval;
if(gamut) {
-#ifdef _DEBUG
- bool neg, more_rgb;
-#endif
// According to mathematical laws we can get the sin and cos of HH by simple operations
float R, G, B;
@@ -2929,36 +2610,15 @@ void Color::LabGamutMunsell(float *labL, float *laba, float *labb, const int N,
}
//gamut control : Lab values are in gamut
-#ifdef _DEBUG
- gamutLchonly(HH, sincosval, Lprov1, Chprov1, R, G, B, wip, isHLEnabled, 0.15f, 0.96f, neg, more_rgb);
-#else
gamutLchonly(HH, sincosval, Lprov1, Chprov1, R, G, B, wip, isHLEnabled, 0.15f, 0.96f);
-#endif
-
-#ifdef _DEBUG
-
- if(neg) {
- negat++;
- }
-
- if(more_rgb) {
- moreRGB++;
- }
-
-#endif
}
labL[j] = Lprov1 * 327.68f;
- correctionHuechroma = 0.f;
- correctlum = 0.f;
+ float correctionHuechroma = 0.f;
+ float correctlum = 0.f;
if(corMunsell)
-#ifdef _DEBUG
- AllMunsellLch(lumaMuns, Lprov1, Loldd, HH, Chprov1, Coldd, correctionHuechroma, correctlum, MunsDebugInfo);
-
-#else
AllMunsellLch(lumaMuns, Lprov1, Loldd, HH, Chprov1, Coldd, correctionHuechroma, correctlum);
-#endif
if(correctlum == 0.f && correctionHuechroma == 0.f) {
if(!gamut) {
@@ -2979,28 +2639,6 @@ void Color::LabGamutMunsell(float *labL, float *laba, float *labb, const int N,
laba[j] = Chprov1 * sincosval.y * 327.68f;
labb[j] = Chprov1 * sincosval.x * 327.68f;
}
-
-#ifdef _DEBUG
- t2e.set();
-
- if (settings->verbose) {
- printf("Color::LabGamutMunsell (correction performed in %d usec):\n", t2e.etime(t1e));
- printf(" Gamut : G1negat=%iiter G165535=%iiter \n", negat, moreRGB);
-
- if (MunsDebugInfo) {
- printf(" Munsell chrominance: MaxBP=%1.2frad MaxRY=%1.2frad MaxGY=%1.2frad MaxRP=%1.2frad depass=%u\n", MunsDebugInfo->maxdhue[0], MunsDebugInfo->maxdhue[1], MunsDebugInfo->maxdhue[2], MunsDebugInfo->maxdhue[3], MunsDebugInfo->depass);
- printf(" Munsell luminance : MaxBP=%1.2frad MaxRY=%1.2frad MaxGY=%1.2frad MaxRP=%1.2frad depass=%u\n", MunsDebugInfo->maxdhuelum[0] , MunsDebugInfo->maxdhuelum[1], MunsDebugInfo->maxdhuelum[2], MunsDebugInfo->maxdhuelum[3], MunsDebugInfo->depassLum);
- } else {
- printf(" Munsell correction wasn't requested\n");
- }
- }
-
- if (MunsDebugInfo) {
- delete MunsDebugInfo;
- }
-
-#endif
-
}
/*
@@ -3105,11 +2743,6 @@ void Color::SkinSat (float lum, float hue, float chrom, float &satreduc)
*/
void Color::initMunsell ()
{
-#ifdef _DEBUG
- MyTime t1e, t2e;
- t1e.set();
-#endif
-
const int maxInd = 140;
const int maxInd2 = 90;
const int maxInd3 = 50;
@@ -5710,14 +5343,6 @@ void Color::initMunsell ()
//printf("5GY %1.2f %1.2f %1.2f\n",_5GY80[44],_5GY80[84],_5GY80[125] );
-#ifdef _DEBUG
- t2e.set();
-
- if (settings->verbose) {
- printf("Lutf Munsell %d usec\n", t2e.etime(t1e));
- }
-
-#endif
}
}
diff --git a/rtengine/color.h b/rtengine/color.h
index 045e062ad..b6bf60818 100644
--- a/rtengine/color.h
+++ b/rtengine/color.h
@@ -36,23 +36,6 @@ namespace rtengine
typedef std::array GammaValues;
-#ifdef _DEBUG
-
-class MunsellDebugInfo
-{
-public:
- float maxdhuelum[4];
- float maxdhue[4];
- unsigned int depass;
- unsigned int depassLum;
-
- MunsellDebugInfo();
- void reinitValues();
-};
-
-#endif
-
-
class Color
{
@@ -162,12 +145,15 @@ public:
static LUTf igammatab_srgb;
static LUTf igammatab_srgb1;
static LUTf gammatab_srgb;
+ static LUTf gammatab_srgb327;
static LUTf gammatab_srgb1;
+ static LUTf gammatab_bt709;
static LUTf denoiseGammaTab;
static LUTf denoiseIGammaTab;
static LUTf igammatab_24_17;
+ static LUTf igammatab_bt709;
static LUTf gammatab_24_17a;
static LUTf gammatab_13_2;
static LUTf igammatab_13_2;
@@ -584,9 +570,20 @@ public:
*/
static void xyz2rgb (float x, float y, float z, float &r, float &g, float &b, const double rgb_xyz[3][3]);
static void xyz2r (float x, float y, float z, float &r, const double rgb_xyz[3][3]);
- static void xyz2rgb (float x, float y, float z, float &r, float &g, float &b, const float rgb_xyz[3][3]);
+ static inline void xyz2rgb (float x, float y, float z, float &r, float &g, float &b, const float rgb_xyz[3][3])
+ {
+ r = ((rgb_xyz[0][0] * x + rgb_xyz[0][1] * y + rgb_xyz[0][2] * z)) ;
+ g = ((rgb_xyz[1][0] * x + rgb_xyz[1][1] * y + rgb_xyz[1][2] * z)) ;
+ b = ((rgb_xyz[2][0] * x + rgb_xyz[2][1] * y + rgb_xyz[2][2] * z)) ;
+ }
+
#ifdef __SSE2__
- static void xyz2rgb (vfloat x, vfloat y, vfloat z, vfloat &r, vfloat &g, vfloat &b, const vfloat rgb_xyz[3][3]);
+ static inline void xyz2rgb (vfloat x, vfloat y, vfloat z, vfloat &r, vfloat &g, vfloat &b, const vfloat rgb_xyz[3][3])
+ {
+ r = ((rgb_xyz[0][0] * x + rgb_xyz[0][1] * y + rgb_xyz[0][2] * z)) ;
+ g = ((rgb_xyz[1][0] * x + rgb_xyz[1][1] * y + rgb_xyz[1][2] * z)) ;
+ b = ((rgb_xyz[2][0] * x + rgb_xyz[2][1] * y + rgb_xyz[2][2] * z)) ;
+ }
#endif
@@ -617,12 +614,40 @@ public:
* @param y Y coordinate [0 ; 65535] ; can be negative! (return value)
* @param z Z coordinate [0 ; 65535] ; can be negative! (return value)
*/
- static void Lab2XYZ(float L, float a, float b, float &x, float &y, float &z);
+ static inline void Lab2XYZ(float L, float a, float b, float &x, float &y, float &z)
+ {
+ float LL = L / 327.68f;
+ float aa = a / 327.68f;
+ float bb = b / 327.68f;
+ float fy = (c1By116 * LL) + c16By116; // (L+16)/116
+ float fx = (0.002f * aa) + fy;
+ float fz = fy - (0.005f * bb);
+ x = 65535.f * f2xyz(fx) * D50x;
+ z = 65535.f * f2xyz(fz) * D50z;
+ y = (LL > epskapf) ? 65535.f * fy * fy * fy : 65535.f * LL / kappaf;
+ }
+
static void L2XYZ(float L, float &x, float &y, float &z);
static float L2Y(float L);
#ifdef __SSE2__
- static void Lab2XYZ(vfloat L, vfloat a, vfloat b, vfloat &x, vfloat &y, vfloat &z);
+static inline void Lab2XYZ(vfloat L, vfloat a, vfloat b, vfloat &x, vfloat &y, vfloat &z)
+{
+ vfloat c327d68 = F2V(327.68f);
+ L /= c327d68;
+ a /= c327d68;
+ b /= c327d68;
+ vfloat fy = F2V(c1By116) * L + F2V(c16By116);
+ vfloat fx = F2V(0.002f) * a + fy;
+ vfloat fz = fy - (F2V(0.005f) * b);
+ vfloat c65535 = F2V(65535.f);
+ x = c65535 * f2xyz(fx) * F2V(D50x);
+ z = c65535 * f2xyz(fz) * F2V(D50z);
+ vfloat res1 = fy * fy * fy;
+ vfloat res2 = L / F2V(kappa);
+ y = vself(vmaskf_gt(L, F2V(epskap)), res1, res2);
+ y *= c65535;
+}
#endif // __SSE2__
/**
@@ -637,7 +662,7 @@ public:
static void XYZ2Lab(float x, float y, float z, float &L, float &a, float &b);
static void RGB2Lab(float *X, float *Y, float *Z, float *L, float *a, float *b, const float wp[3][3], int width);
static void Lab2RGBLimit(float *L, float *a, float *b, float *R, float *G, float *B, const float wp[3][3], float limit, float afactor, float bfactor, int width);
- static void RGB2L(float *X, float *Y, float *Z, float *L, const float wp[3][3], int width);
+ static void RGB2L(const float *R, const float *G, const float *B, float *L, const float wp[3][3], int width);
/**
* @brief Convert Lab in Yuv
@@ -1020,8 +1045,6 @@ public:
* @brief Get the gamma curves' parameters used by LCMS2
* @param pwr gamma value [>1]
* @param ts slope [0 ; 20]
- * @param mode [always 0]
- * @imax imax [always 0]
* @param gamma a pointer to an array of 6 double gamma values:
* gamma0 used in ip2Lab2rgb [0 ; 1], usually near 0.5 (return value)
* gamma1 used in ip2Lab2rgb [0 ; 20], can be superior to 20, but it's quite unusual(return value)
@@ -1030,7 +1053,7 @@ public:
* gamma4 used in ip2Lab2rgb [0 ; 1], usually near 0.03(return value)
* gamma5 used in ip2Lab2rgb [0 ; 1], usually near 0.5 (return value)
*/
- static void calcGamma (double pwr, double ts, int mode, GammaValues &gamma);
+ static void calcGamma (double pwr, double ts, GammaValues &gamma);
/**
@@ -1150,23 +1173,25 @@ public:
}
- /*
+/*
* @brief Get the gamma value for Gamma=2.2 Slope=4.5
* @param x red, green or blue channel's value [0 ; 1]
* @return the gamma modified's value [0 ; 1]
*
+*/
static inline double gamma709 (double x) {
return x <= 0.0176 ? x*4.5 : 1.0954*exp(log(x)/2.2)-0.0954;
}
-
+/*
* @brief Get the inverse gamma value for Gamma=2.2 Slope=4.5
* @param x red, green or blue channel's value [0 ; 1]
* @return the inverse gamma modified's value [0 ; 1]
*
+*/
static inline double igamma709 (double x) {
return x <= 0.0795 ? x/4.5 : exp(log((x+0.0954)/1.0954)*2.2);
}
- */
+
@@ -1390,11 +1415,7 @@ public:
* @param munsDbgInfo (Debug target only) object to collect information
*/
-#ifdef _DEBUG
- static void AllMunsellLch (bool lumaMuns, float Lprov1, float Loldd, float HH, float Chprov1, float CC, float &correctionHueChroma, float &correctlum, MunsellDebugInfo* munsDbgInfo);
-#else
static void AllMunsellLch (bool lumaMuns, float Lprov1, float Loldd, float HH, float Chprov1, float CC, float &correctionHueChroma, float &correctlum);
-#endif
static void AllMunsellLch (float Lprov1, float HH, float Chprov1, float CC, float &correctionHueChroma);
@@ -1419,15 +1440,9 @@ public:
* @param neg (Debug target only) to calculate iterations for negatives values
* @param moreRGB (Debug target only) to calculate iterations for values >65535
*/
-#ifdef _DEBUG
- static void gamutLchonly (float HH, float &Lprov1, float &Chprov1, float &R, float &G, float &B, const double wip[3][3], bool isHLEnabled, float lowerCoef, float higherCoef, bool &neg, bool &more_rgb);
- static void gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chprov1, float &R, float &G, float &B, const double wip[3][3], bool isHLEnabled, float lowerCoef, float higherCoef, bool &neg, bool &more_rgb);
- static void gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const float wip[3][3], bool isHLEnabled, float lowerCoef, float higherCoef, bool &neg, bool &more_rgb);
-#else
static void gamutLchonly (float HH, float &Lprov1, float &Chprov1, float &R, float &G, float &B, const double wip[3][3], bool isHLEnabled, float lowerCoef, float higherCoef);
static void gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chprov1, float &R, float &G, float &B, const double wip[3][3], bool isHLEnabled, float lowerCoef, float higherCoef);
static void gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const float wip[3][3], bool isHLEnabled, float lowerCoef, float higherCoef);
-#endif
static void gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chprov1, float &saturation, const float wip[3][3], bool isHLEnabled, float lowerCoef, float higherCoef);
@@ -1490,9 +1505,58 @@ public:
static void scalered ( float rstprotection, float param, float limit, float HH, float deltaHH, float &scale, float &scaleext);
static void transitred (float HH, float Chprov1, float dred, float factorskin, float protect_red, float factorskinext, float deltaHH, float factorsat, float &factor);
- static void skinred ( double J, double h, double sres, double Sp, float dred, float protect_red, int sk, float rstprotection, float ko, double &s);
static void skinredfloat ( float J, float h, float sres, float Sp, float dred, float protect_red, int sk, float rstprotection, float ko, float &s);
-// static void scaleredcdbl ( float skinprot, float param, float limit, float HH, float deltaHH, float &scale,float &scaleext);
+
+ static inline void pregamutlab(float lum, float hue, float &chr) //big approximation to limit gamut (Prophoto) before good gamut procedure for locallab chroma, to avoid crash
+ {
+ if (lum >= 95.0f) {
+ if (hue > 1.5f && hue < 2.f) {
+ chr = 120.f;
+ } else if (hue > 0.7f && hue <= 1.5f) {
+ chr = 60.f;
+ } else {
+ chr = 40.f;
+ }
+ } else if (lum > 75.f) {
+ if (hue > 1.f && hue < 3.14f) {
+ chr = 130.f;
+ } else if (hue > -0.4f && hue <= 1.f) {
+ chr = 80.f;
+ } else if (hue > -3.15f && hue < -2.f) {
+ chr = 80.f;
+ } else {
+ chr = 60.f;
+ }
+
+ } else if (lum > 35.f) {
+ chr = 100.f;
+ } else if (lum > 20.f) {
+ if (hue < -1.f && hue > -2.f) {
+ chr = 120.f;
+ } else {
+ chr = 80.f;
+ }
+ } else if (lum > 7.f) {
+ if (hue < -1.f && hue > -1.8f) {
+ chr = 120.f;
+ } else {
+ chr = 60.f;
+ }
+
+ } else {
+ if (hue < -1.f && hue > -1.6f) {
+ chr = 80.f;
+ } else {
+ chr = 40.f;
+ }
+
+ }
+
+ // if(lum < 4.f) {
+ // chr = 0.1f;
+ // }
+ }
+
static inline void SkinSatCbdl (float lum, float hue, float chrom, float skinprot, float &scale, bool neg, float b_l, float t_l, float t_r)
{
@@ -1772,11 +1836,11 @@ public:
/**
* @brief Gamut correction in the XYZ color space
* @param X X channel input value and corrected output value [0 ; 65535]
- * @param Y Y channel input value and corrected output value [0 ; 65535]
+ * @param Y Y channel input value[0 ; 65535]
* @param Z Z channel input value and corrected output value [0 ; 65535]
* @param p working profile
*/
- static void gamutmap(float &X, float &Y, float &Z, const double p[3][3]);
+ static void gamutmap(float &X, float Y, float &Z, const double p[3][3]);
/**
@@ -1810,7 +1874,6 @@ public:
} else if (HH >= -0.1f && HH < 0.f ) {
hr = 0.1 * double(HH) + 0.93; //hr 0.92 0.93 red
}
-
// in case of !
if (hr < 0.0) {
hr += 1.0;
diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc
index 2780fcc84..417476876 100644
--- a/rtengine/colortemp.cc
+++ b/rtengine/colortemp.cc
@@ -2898,15 +2898,15 @@ void ColorTemp::icieCAT02float(float Xw, float Yw, float Zw, float &iCAM02BB00,
float D = adap / 2.;
//white destination Wd : RT use always D50
- cam_dest[0] = INVCAT02[0][0] * whiteD50p[0] + INVCAT02[0][1] * whiteD50p[1] + INVCAT02[0][2] * whiteD50p[2]; //Cone reponse RoD
+ cam_dest[0] = INVCAT02[0][0] * whiteD50p[0] + INVCAT02[0][1] * whiteD50p[1] + INVCAT02[0][2] * whiteD50p[2]; //Cone response RoD
cam_dest[1] = INVCAT02[1][0] * whiteD50p[0] + INVCAT02[1][1] * whiteD50p[1] + INVCAT02[1][2] * whiteD50p[2]; //GaD
cam_dest[2] = INVCAT02[2][0] * whiteD50p[0] + INVCAT02[2][1] * whiteD50p[1] + INVCAT02[2][2] * whiteD50p[2]; //BeD
//origin white Ws : A, D65, custom, etc.
- cam_orig[0] = INVCAT02[0][0] * Xw + INVCAT02[0][1] * Yw + INVCAT02[0][2] * Zw; //Cone reponse RoS
+ cam_orig[0] = INVCAT02[0][0] * Xw + INVCAT02[0][1] * Yw + INVCAT02[0][2] * Zw; //Cone response RoS
cam_orig[1] = INVCAT02[1][0] * Xw + INVCAT02[1][1] * Yw + INVCAT02[1][2] * Zw;
cam_orig[2] = INVCAT02[2][0] * Xw + INVCAT02[2][1] * Yw + INVCAT02[2][2] * Zw;
-// cam_orig[0] = CAT02[0][0] * Xw + CAT02[0][1] * Yw + CAT02[0][2] * Zw; //Cone reponse RoS
+// cam_orig[0] = CAT02[0][0] * Xw + CAT02[0][1] * Yw + CAT02[0][2] * Zw; //Cone response RoS
// cam_orig[1] = CAT02[1][0] * Xw + CAT02[1][1] * Yw + CAT02[1][2] * Zw;
// cam_orig[2] = CAT02[2][0] * Xw + CAT02[2][1] * Yw + CAT02[2][2] * Zw;
@@ -3624,7 +3624,7 @@ void ColorTemp::tempxy(bool separated, int repref, float **Tx, float **Ty, float
double XX;
double ZZ;
} WbTxyz;
- //probbaly can be "passed" with rawimagesource.cc but I don't know how to do.
+ //probably can be "passed" with rawimagesource.cc but I don't know how to do this.
constexpr WbTxyz Txyz[118] = {//temperature Xwb Zwb 118 values - same table as in Rawimagesource.cc x wb and y wb are calculated after
{2001., 1.273842, 0.145295},
{2101., 1.244008, 0.167533},
diff --git a/rtengine/cplx_wavelet_dec.h b/rtengine/cplx_wavelet_dec.h
index c127a7adf..592bd2f37 100644
--- a/rtengine/cplx_wavelet_dec.h
+++ b/rtengine/cplx_wavelet_dec.h
@@ -33,37 +33,38 @@ class wavelet_decomposition :
public NonCopyable
{
public:
-
- typedef float internal_type;
- float *coeff0;
- bool memoryAllocationFailed;
-
-private:
-
- static const int maxlevels = 10;//should be greater than any conceivable order of decimation
-
- int lvltot, subsamp;
- int m_w, m_h;//dimensions
-
- int wavfilt_len, wavfilt_offset;
- float *wavfilt_anal;
- float *wavfilt_synth;
-
-
- wavelet_level * wavelet_decomp[maxlevels];
-
-public:
+ using internal_type = float;
template
wavelet_decomposition(E * src, int width, int height, int maxlvl, int subsampling, int skipcrop = 1, int numThreads = 1, int Daub4Len = 6);
~wavelet_decomposition();
- internal_type ** level_coeffs(int level) const
+ bool memory_allocation_failed() const
+ {
+ return memoryAllocationFailed;
+ }
+
+ const internal_type* const* level_coeffs(int level) const
{
return wavelet_decomp[level]->subbands();
}
+ internal_type* const* level_coeffs(int level)
+ {
+ return wavelet_decomp[level]->subbands();
+ }
+
+ const internal_type* get_coeff0() const
+ {
+ return coeff0;
+ }
+
+ internal_type* get_coeff0()
+ {
+ return coeff0;
+ }
+
int level_W(int level) const
{
return wavelet_decomp[level]->width();
@@ -88,13 +89,47 @@ public:
{
return subsamp;
}
+
template
void reconstruct(E * dst, const float blend = 1.f);
+
+private:
+ static const int maxlevels = 10; // should be greater than any conceivable order of decimation
+
+ int lvltot;
+ int subsamp;
+ // Dimensions
+ int m_w;
+ int m_h;
+
+ int wavfilt_len;
+ int wavfilt_offset;
+ internal_type* wavfilt_anal;
+ internal_type* wavfilt_synth;
+
+ internal_type* coeff0;
+ bool memoryAllocationFailed;
+
+ wavelet_level* wavelet_decomp[maxlevels];
};
template
-wavelet_decomposition::wavelet_decomposition(E * src, int width, int height, int maxlvl, int subsampling, int skipcrop, int numThreads, int Daub4Len)
- : coeff0(nullptr), memoryAllocationFailed(false), lvltot(0), subsamp(subsampling), m_w(width), m_h(height)
+wavelet_decomposition::wavelet_decomposition(
+ E * src,
+ int width,
+ int height,
+ int maxlvl,
+ int subsampling,
+ int skipcrop,
+ int numThreads,
+ int Daub4Len
+) :
+ lvltot(0),
+ subsamp(subsampling),
+ m_w(width),
+ m_h(height),
+ coeff0(nullptr),
+ memoryAllocationFailed(false)
{
//initialize wavelet filters
@@ -135,6 +170,14 @@ wavelet_decomposition::wavelet_decomposition(E * src, int width, int height, int
//n=0 lopass, n=1 hipass
}
}
+/* } else if(wavfilt_len == 22) {
+ for (int n = 0; n < 2; n++) {
+ for (int i = 0; i < wavfilt_len; i++) {
+ wavfilt_anal[wavfilt_len * (n) + i] = Daub4_anal22[n][i];
+ wavfilt_synth[wavfilt_len * (n) + i] = Daub4_anal22[n][wavfilt_len - 1 - i];
+ //n=0 lopass, n=1 hipass
+ }
+ } */
} else if(wavfilt_len == 4) {
for (int n = 0; n < 2; n++) {
for (int i = 0; i < wavfilt_len; i++) {
@@ -144,7 +187,7 @@ wavelet_decomposition::wavelet_decomposition(E * src, int width, int height, int
}
}
}
-
+//printf("OK cplx\n");
// after coefficient rotation, data structure is:
// wavelet_decomp[scale][channel={lo,hi1,hi2,hi3}][pixel_array]
diff --git a/rtengine/cplx_wavelet_filter_coeffs.h b/rtengine/cplx_wavelet_filter_coeffs.h
index 5d191e50c..3386be8d0 100644
--- a/rtengine/cplx_wavelet_filter_coeffs.h
+++ b/rtengine/cplx_wavelet_filter_coeffs.h
@@ -48,11 +48,14 @@ const float Daub4_anal16[2][16] ALIGNED16 = {//Daub 14
{0.f, 0.f, 0.055049715f, 0.28039564f, 0.515574245f, 0.33218624f, -0.10175691f, -0.158417505f, 0.05042335f, 0.057001725f, -0.026891225f, -0.01171997f, 0.008874895f, 0.0003037575f, -0.0012739524f, 0.0002501134f},
{ -0.0002501134f, -0.0012739524f, -0.0003037575f, 0.008874895f, 0.01171997f , -0.026891225f, -0.057001725f, 0.05042335f, 0.158417505f, -0.10175691f, -0.33218624f, 0.515574245f, -0.28039564f, 0.055049715f, 0.f, 0.f}
};
-/*
-const double Daub4_anal22[2][22] ALIGNED16 = {//Daub 20
- {0., 0., 0.01885858, 0.13306109, 0.37278754, 0.48681406, 0.19881887, -0.1766681, -0.13855494, 0.09006372, 0.0658015, -0.05048328, -0.02082962, 0.0234849, 0.0025502185, -0.0075895, 0.0009866625, 0.0014088433, -0.00048497392, -0.0000823545, 0.00006617718, -0.000009379205},
- {0.000009379205, -0.00006617718, 0.0000823545, 0.00048497392, -0.0014088433, -0.0009866627, 0.0075895, -0.0025502185, -0.0234849, 0.02082962, 0.05048328, -0.0658015, -0.09006372, 0.13855494, 0.1766681, -0.19881887, -0.48681406, -0.37278754, -0.13306109, -0.01885858, 0., 0.}
+
+const float Daub4_anal22[2][22] ALIGNED16 = {//Daub 20
+ {0.f, 0.f, 0.01885858f, 0.13306109f, 0.37278535f, 0.48681406f, 0.19881887f, -0.1766681f, -0.13855494f, 0.09006372f, 0.0658015f, -0.05048328f, -0.02082962f,
+ 0.0234849f, 0.002550218f, -0.0075895f, 0.0009866627f, 0.001408843f, -0.000484973f, -0.0000823545f, 0.0000661271f, -0.00000939f},
+ {0.00000939f, -0.0000661271f, 0.0000823545f, 0.000484973f, -0.001408843f, -0.0009866627f, 0.0075895f, -0.002550218f, -0.0234849f,
+ 0.02082962f, 0.05048328f, -0.0658015f, -0.09006372f, 0.13855494f, 0.1766681f, -0.19881887f, -0.48681406f, -0.37278535f, -0.13306109f, -0.01885858f, 0.f, 0.f}
};
-*/
+
+// if necessary ?? we can add D20 !!
}
diff --git a/rtengine/curves.cc b/rtengine/curves.cc
index ebb23e754..640074075 100644
--- a/rtengine/curves.cc
+++ b/rtengine/curves.cc
@@ -37,9 +37,35 @@
using namespace std;
+namespace {
+void fillCurveArray(const rtengine::DiagonalCurve* diagCurve, LUTf &outCurve, int skip, bool needed)
+{
+ if (needed) {
+ for (int i = 0; i <= 0xffff; i += i < 0xffff - skip ? skip : 1) {
+ // change to [0,1] range
+ // apply custom/parametric/NURBS curve, if any
+ outCurve[i] = diagCurve->getVal(i / 65535.f);
+ }
+
+ // if skip > 1, let apply linear interpolation in the skipped points of the curve
+ if (skip > 1) {
+ const float skipmul = 1.f / skip;
+
+ for (int i = 0; i <= 0x10000 - skip; i += skip) {
+ for (int j = 1; j < skip; j++) {
+ outCurve[i + j] = (outCurve[i] * (skip - j) + outCurve[i + skip] * j) * skipmul;
+ }
+ }
+ }
+
+ outCurve *= 65535.f;
+ } else {
+ outCurve.makeIdentity();
+ }
+}
+}
namespace rtengine
{
-
bool sanitizeCurve(std::vector& curve)
{
// A curve is valid under one of the following conditions:
@@ -47,19 +73,19 @@ bool sanitizeCurve(std::vector& curve)
// 2) Number of curve entries is > 3 and odd
// 3) curve[0] == DCT_Parametric and curve size is >= 8 and curve[1] .. curve[3] are ordered ascending and are distinct
if (curve.empty()) {
- curve.push_back (DCT_Linear);
+ curve.push_back(DCT_Linear);
return true;
- } else if(curve.size() == 1 && curve[0] != DCT_Linear) {
+ } else if (curve.size() == 1 && curve[0] != DCT_Linear) {
curve[0] = DCT_Linear;
return true;
- } else if((curve.size() % 2 == 0 || curve.size() < 5) && curve[0] != DCT_Parametric) {
+ } else if ((curve.size() % 2 == 0 || curve.size() < 5) && curve[0] != DCT_Parametric) {
curve.clear();
- curve.push_back (DCT_Linear);
+ curve.push_back(DCT_Linear);
return true;
- } else if(curve[0] == DCT_Parametric) {
+ } else if (curve[0] == DCT_Parametric) {
if (curve.size() < 8) {
curve.clear();
- curve.push_back (DCT_Linear);
+ curve.push_back(DCT_Linear);
return true;
} else {
// curve[1] to curve[3] must be ordered ascending and distinct
@@ -73,12 +99,13 @@ bool sanitizeCurve(std::vector& curve)
}
}
}
+
return false;
}
-Curve::Curve () : N(0), ppn(0), x(nullptr), y(nullptr), mc(0.0), mfc(0.0), msc(0.0), mhc(0.0), hashSize(1000 /* has to be initialized to the maximum value */), ypp(nullptr), x1(0.0), y1(0.0), x2(0.0), y2(0.0), x3(0.0), y3(0.0), firstPointIncluded(false), increment(0.0), nbr_points(0) {}
+Curve::Curve() : N(0), ppn(0), x(nullptr), y(nullptr), mc(0.0), mfc(0.0), msc(0.0), mhc(0.0), hashSize(1000 /* has to be initialized to the maximum value */), ypp(nullptr), x1(0.0), y1(0.0), x2(0.0), y2(0.0), x3(0.0), y3(0.0), firstPointIncluded(false), increment(0.0), nbr_points(0) {}
-void Curve::AddPolygons ()
+void Curve::AddPolygons()
{
if (firstPointIncluded) {
poly_x.push_back(x1);
@@ -93,8 +120,8 @@ void Curve::AddPolygons ()
double tr2t = tr * 2 * t;
// adding a point to the polyline
- poly_x.push_back( tr2 * x1 + tr2t * x2 + t2 * x3);
- poly_y.push_back( tr2 * y1 + tr2t * y2 + t2 * y3);
+ poly_x.push_back(tr2 * x1 + tr2t * x2 + t2 * x3);
+ poly_y.push_back(tr2 * y1 + tr2t * y2 + t2 * y3);
}
// adding the last point of the sub-curve
@@ -102,11 +129,11 @@ void Curve::AddPolygons ()
poly_y.push_back(y3);
}
-void Curve::fillDyByDx ()
+void Curve::fillDyByDx()
{
dyByDx.resize(poly_x.size() - 1);
- for(unsigned int i = 0; i < poly_x.size() - 1; i++) {
+ for (unsigned int i = 0; i < poly_x.size() - 1; i++) {
double dx = poly_x[i + 1] - poly_x[i];
double dy = poly_y[i + 1] - poly_y[i];
dyByDx[i] = dy / dx;
@@ -123,7 +150,7 @@ void Curve::fillHash()
double milestone = 0.;
for (unsigned short i = 0; i < (hashSize + 1);) {
- while(poly_x[polyIter] <= milestone) {
+ while (poly_x[polyIter] <= milestone) {
++polyIter;
}
@@ -136,7 +163,7 @@ void Curve::fillHash()
polyIter = 0;
for (unsigned int i = 0; i < hashSize + 1u;) {
- while(poly_x[polyIter] < (milestone + increment)) {
+ while (poly_x[polyIter] < (milestone + increment)) {
++polyIter;
}
@@ -173,7 +200,7 @@ void Curve::fillHash()
* This method return the number of control points of a curve. Not suitable for parametric curves.
* @return number of control points of the curve. 0 will be sent back for Parametric curves
*/
-int Curve::getSize () const
+int Curve::getSize() const
{
return N;
}
@@ -200,37 +227,7 @@ void Curve::getControlPoint(int cpNum, double &x, double &y) const
const double CurveFactory::sRGBGamma = 2.2;
const double CurveFactory::sRGBGammaCurve = 2.4;
-void fillCurveArray(DiagonalCurve* diagCurve, LUTf &outCurve, int skip, bool needed)
-{
- if (needed) {
-
- for (int i = 0; i <= 0xffff; i += i < 0xffff - skip ? skip : 1 ) {
- // change to [0,1] range
- float val = (float)i / 65535.f;
- // apply custom/parametric/NURBS curve, if any
- val = diagCurve->getVal (val);
- // store result in a temporary array
- outCurve[i] = val;
- }
-
- // if skip>1, let apply linear interpolation in the skipped points of the curve
- if (skip > 1) {
- float skipmul = 1.f / (float) skip;
-
- for (int i = 0; i <= 0x10000 - skip; i += skip) {
- for(int j = 1; j < skip; j++) {
- outCurve[i + j] = ( outCurve[i] * (skip - j) + outCurve[i + skip] * j ) * skipmul;
- }
- }
- }
-
- outCurve *= 65535.f;
- } else {
- outCurve.makeIdentity();
- }
-}
-
-void CurveFactory::curveLightBrightColor (const std::vector& curvePoints1, const std::vector& curvePoints2, const std::vector& curvePoints3,
+void CurveFactory::curveLightBrightColor(const std::vector& curvePoints1, const std::vector& curvePoints2, const std::vector& curvePoints3,
const LUTu & histogram, LUTu & outBeforeCCurveHistogram,//for Luminance
const LUTu & histogramC, LUTu & outBeforeCCurveHistogramC,//for chroma
ColorAppearance & customColCurve1, ColorAppearance & customColCurve2, ColorAppearance & customColCurve3, int skip)
@@ -289,9 +286,9 @@ void CurveFactory::curveLightBrightColor (const std::vector& curvePoints
}
}
-void CurveFactory::curveBW ( const std::vector& curvePointsbw, const std::vector& curvePointsbw2,
- const LUTu & histogrambw, LUTu & outBeforeCCurveHistogrambw,//for Luminance
- ToneCurve & customToneCurvebw1, ToneCurve & customToneCurvebw2, int skip)
+void CurveFactory::curveBW(const std::vector& curvePointsbw, const std::vector& curvePointsbw2,
+ const LUTu & histogrambw, LUTu & outBeforeCCurveHistogrambw,//for Luminance
+ ToneCurve & customToneCurvebw1, ToneCurve & customToneCurvebw2, int skip)
{
const float gamma_ = Color::sRGBGammaCurve;
@@ -319,7 +316,7 @@ void CurveFactory::curveBW ( const std::vector& curvePointsbw, const std
if (!curvePointsbw.empty() && curvePointsbw[0] > DCT_Linear && curvePointsbw[0] < DCT_Unchanged) {
DiagonalCurve tcurve(curvePointsbw, CURVES_MIN_POLY_POINTS / skip);
- if (outBeforeCCurveHistogrambw ) {
+ if (outBeforeCCurveHistogrambw) {
histNeeded = true;
}
@@ -335,32 +332,15 @@ void CurveFactory::curveBW ( const std::vector& curvePointsbw, const std
}
}
-// add curve Lab : C=f(L)
-void CurveFactory::curveCL ( bool & clcutili, const std::vector& clcurvePoints, LUTf & clCurve, int skip)
-{
- clcutili = false;
- std::unique_ptr dCurve;
-
- if (!clcurvePoints.empty() && clcurvePoints[0] != 0) {
- dCurve = std::unique_ptr(new DiagonalCurve(clcurvePoints, CURVES_MIN_POLY_POINTS / skip));
-
- if (dCurve && !dCurve->isIdentity()) {
- clcutili = true;
- }
- }
-
- fillCurveArray(dCurve.get(), clCurve, skip, clcutili);
-}
-
-void CurveFactory::mapcurve ( bool & mapcontlutili, const std::vector& mapcurvePoints, LUTf & mapcurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram)
+bool CurveFactory::diagonalCurve2Lut(const std::vector& curvePoints, LUTf & curve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram)
{
bool needed = false;
std::unique_ptr dCurve;
outBeforeCurveHistogram.clear();
bool histNeeded = false;
- if (!mapcurvePoints.empty() && mapcurvePoints[0] != 0) {
- dCurve = std::unique_ptr(new DiagonalCurve(mapcurvePoints, CURVES_MIN_POLY_POINTS / skip));
+ if (!curvePoints.empty() && curvePoints[0] != 0) {
+ dCurve.reset(new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip));
if (outBeforeCurveHistogram) {
histNeeded = true;
@@ -368,7 +348,6 @@ void CurveFactory::mapcurve ( bool & mapcontlutili, const std::vector& m
if (dCurve && !dCurve->isIdentity()) {
needed = true;
- mapcontlutili = true;
}
}
@@ -376,77 +355,32 @@ void CurveFactory::mapcurve ( bool & mapcontlutili, const std::vector& m
histogram.compressTo(outBeforeCurveHistogram, 32768);
}
- fillCurveArray(dCurve.get(), mapcurve, skip, needed);
+ fillCurveArray(dCurve.get(), curve, skip, needed);
+ return needed;
}
-void CurveFactory::curveDehaContL ( bool & dehacontlutili, const std::vector& dehaclcurvePoints, LUTf & dehaclCurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram)
-{
- bool needed = false;
- std::unique_ptr dCurve;
- outBeforeCurveHistogram.clear();
- bool histNeeded = false;
-
- if (!dehaclcurvePoints.empty() && dehaclcurvePoints[0] != 0) {
- dCurve = std::unique_ptr(new DiagonalCurve(dehaclcurvePoints, CURVES_MIN_POLY_POINTS / skip));
-
- if (outBeforeCurveHistogram) {
- histNeeded = true;
- }
-
- if (dCurve && !dCurve->isIdentity()) {
- needed = true;
- dehacontlutili = true;
- }
- }
-
- if (histNeeded) {
- histogram.compressTo(outBeforeCurveHistogram, 32768);
- }
-
- fillCurveArray(dCurve.get(), dehaclCurve, skip, needed);
-}
-
-// add curve Lab wavelet : Cont=f(L)
-void CurveFactory::curveWavContL ( bool & wavcontlutili, const std::vector& wavclcurvePoints, LUTf & wavclCurve, /*LUTu & histogramwavcl, LUTu & outBeforeWavCLurveHistogram,*/int skip)
-{
- bool needed = false;
- std::unique_ptr dCurve;
-
- if (!wavclcurvePoints.empty() && wavclcurvePoints[0] != 0) {
- dCurve = std::unique_ptr(new DiagonalCurve(wavclcurvePoints, CURVES_MIN_POLY_POINTS / skip));
-
- if (dCurve && !dCurve->isIdentity()) {
- needed = true;
- wavcontlutili = true;
- }
- }
-
- fillCurveArray(dCurve.get(), wavclCurve, skip, needed);
-}
-
-// add curve Colortoning : C=f(L) and CLf(L)
-void CurveFactory::curveToning ( const std::vector& curvePoints, LUTf & ToningCurve, int skip)
+bool CurveFactory::diagonalCurve2Lut(const std::vector& curvePoints, LUTf& curve, int skip)
{
bool needed = false;
std::unique_ptr dCurve;
if (!curvePoints.empty() && curvePoints[0] != 0) {
- dCurve = std::unique_ptr(new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip));
+ dCurve.reset(new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip));
if (dCurve && !dCurve->isIdentity()) {
needed = true;
}
}
- fillCurveArray(dCurve.get(), ToningCurve, skip, needed);
+ fillCurveArray(dCurve.get(), curve, skip, needed);
+ return needed;
+
}
-
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-void CurveFactory::complexsgnCurve (bool & autili, bool & butili, bool & ccutili, bool & cclutili,
- const std::vector& acurvePoints, const std::vector& bcurvePoints, const std::vector& cccurvePoints,
- const std::vector& lccurvePoints, LUTf & aoutCurve, LUTf & boutCurve, LUTf & satCurve, LUTf & lhskCurve,
- int skip)
+void CurveFactory::complexsgnCurve(bool & autili, bool & butili, bool & ccutili, bool & cclutili,
+ const std::vector& acurvePoints, const std::vector& bcurvePoints, const std::vector& cccurvePoints,
+ const std::vector& lccurvePoints, LUTf & aoutCurve, LUTf & boutCurve, LUTf & satCurve, LUTf & lhskCurve,
+ int skip)
{
autili = butili = ccutili = cclutili = false;
@@ -454,7 +388,7 @@ void CurveFactory::complexsgnCurve (bool & autili, bool & butili, bool & ccutil
// create a curve if needed
if (!acurvePoints.empty() && acurvePoints[0] != 0) {
- dCurve = std::unique_ptr(new DiagonalCurve(acurvePoints, CURVES_MIN_POLY_POINTS / skip));
+ dCurve.reset(new DiagonalCurve(acurvePoints, CURVES_MIN_POLY_POINTS / skip));
if (dCurve && !dCurve->isIdentity()) {
autili = true;
@@ -463,12 +397,12 @@ void CurveFactory::complexsgnCurve (bool & autili, bool & butili, bool & ccutil
fillCurveArray(dCurve.get(), aoutCurve, skip, autili);
- dCurve = nullptr;
+ dCurve.reset();
//-----------------------------------------------------
if (!bcurvePoints.empty() && bcurvePoints[0] != 0) {
- dCurve = std::unique_ptr(new DiagonalCurve(bcurvePoints, CURVES_MIN_POLY_POINTS / skip));
+ dCurve.reset(new DiagonalCurve(bcurvePoints, CURVES_MIN_POLY_POINTS / skip));
if (dCurve && !dCurve->isIdentity()) {
butili = true;
@@ -477,12 +411,12 @@ void CurveFactory::complexsgnCurve (bool & autili, bool & butili, bool & ccutil
fillCurveArray(dCurve.get(), boutCurve, skip, butili);
- dCurve = nullptr;
+ dCurve.reset();
//-----------------------------------------------
if (!cccurvePoints.empty() && cccurvePoints[0] != 0) {
- dCurve = std::unique_ptr(new DiagonalCurve(cccurvePoints, CURVES_MIN_POLY_POINTS / skip));
+ dCurve.reset(new DiagonalCurve(cccurvePoints, CURVES_MIN_POLY_POINTS / skip));
if (dCurve && !dCurve->isIdentity()) {
ccutili = true;
@@ -491,12 +425,12 @@ void CurveFactory::complexsgnCurve (bool & autili, bool & butili, bool & ccutil
fillCurveArray(dCurve.get(), satCurve, skip, ccutili);
- dCurve = nullptr;
+ dCurve.reset();
//----------------------------
if (!lccurvePoints.empty() && lccurvePoints[0] != 0) {
- dCurve = std::unique_ptr(new DiagonalCurve(lccurvePoints, CURVES_MIN_POLY_POINTS / skip));
+ dCurve.reset(new DiagonalCurve(lccurvePoints, CURVES_MIN_POLY_POINTS / skip));
if (dCurve && !dCurve->isIdentity()) {
cclutili = true;
@@ -522,20 +456,19 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
// the curve shapes are defined in sRGB gamma, but the output curves will operate on linear floating point data,
// hence we do both forward and inverse gamma conversions here.
const float gamma_ = Color::sRGBGammaCurve;
- const float start = expf(gamma_ * logf( -0.055 / ((1.0 / gamma_ - 1.0) * 1.055 )));
- const float slope = 1.055 * powf (start, 1.0 / gamma_ - 1) - 0.055 / start;
+ const float start = expf(gamma_ * logf(-0.055 / ((1.0 / gamma_ - 1.0) * 1.055)));
+ const float slope = 1.055 * powf(start, 1.0 / gamma_ - 1) - 0.055 / start;
const float mul = 1.055;
const float add = 0.055;
+
// a: slope of the curve, black: starting point at the x axis
- const float a = powf (2.0, ecomp);
+ const float a = powf(2.0, ecomp);
// clear array that stores histogram valid before applying the custom curve
outBeforeCCurveHistogram.clear();
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// tone curve base. a: slope (from exp.comp.), b: black, def_mul: max. x value (can be>1), hr,sr: highlight,shadow recovery
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
std::unique_ptr brightcurve;
@@ -548,14 +481,14 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
brightcurvePoints[1] = 0.; //black point. Value in [0 ; 1] range
brightcurvePoints[2] = 0.; //black point. Value in [0 ; 1] range
- if(br > 0) {
+ if (br > 0) {
brightcurvePoints[3] = 0.1; //toe point
brightcurvePoints[4] = 0.1 + br / 150.0; //value at toe point
brightcurvePoints[5] = 0.7; //shoulder point
- brightcurvePoints[6] = min(1.0, 0.7 + br / 300.0); //value at shoulder point
+ brightcurvePoints[6] = min(1.0, 0.7 + br / 300.0); //value at shoulder point
} else {
- brightcurvePoints[3] = max(0.0, 0.1 - br / 150.0); //toe point
+ brightcurvePoints[3] = max(0.0, 0.1 - br / 150.0); //toe point
brightcurvePoints[4] = 0.1; //value at toe point
brightcurvePoints[5] = 0.7 - br / 300.0; //shoulder point
@@ -565,12 +498,10 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
brightcurvePoints[7] = 1.; // white point
brightcurvePoints[8] = 1.; // value at white point
- brightcurve = std::unique_ptr(new DiagonalCurve(brightcurvePoints, CURVES_MIN_POLY_POINTS / skip));
+ brightcurve.reset(new DiagonalCurve(brightcurvePoints, CURVES_MIN_POLY_POINTS / skip));
}
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- hlCurve.setClip(LUT_CLIP_BELOW); // used LUT_CLIP_BELOW, because we want to have a baseline of 2^expcomp in this curve. If we don't clip the lut we get wrong values, see Issue 2621 #14 for details
+ hlCurve.setClip(LUT_CLIP_BELOW); // used LUT_CLIP_BELOW, because we want to have a baseline of 2^expcomp in this curve. If we don't clip the lut we get wrong values, see Issue 2621 #14 for details
float exp_scale = a;
float scale = 65536.0;
float comp = (max(0.0, ecomp) + 1.0) * hlcompr / 100.0;
@@ -586,11 +517,11 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
#ifdef __SSE2__
int i = shoulder + 1;
- if(i & 1) { // original formula, slower than optimized formulas below but only used once or none, so I let it as is for reference
+ if (i & 1) { // original formula, slower than optimized formulas below but only used once or none, so I let it as is for reference
// change to [0,1] range
float val = (float)i - shoulder;
float R = val * comp / (scalemshoulder);
- hlCurve[i] = xlog(1.0 + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision
+ hlCurve[i] = xlog(1.0 + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision
i++;
}
@@ -615,7 +546,7 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
for (int i = shoulder + 1; i < 0x10000; i++) {
// change to [0,1] range
- hlCurve[i] = xlog(1.0 + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision
+ hlCurve[i] = xlog(1.0 + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision
R += increment;
}
@@ -627,9 +558,8 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
// curve without contrast
LUTf dcurve(0x10000);
- //%%%%%%%%%%%%%%%%%%%%%%%%%%
// change to [0,1] range
- shCurve.setClip(LUT_CLIP_ABOVE); // used LUT_CLIP_ABOVE, because the curve converges to 1.0 at the upper end and we don't want to exceed this value.
+ shCurve.setClip(LUT_CLIP_ABOVE); // used LUT_CLIP_ABOVE, because the curve converges to 1.0 at the upper end and we don't want to exceed this value.
if (black == 0.0) {
shCurve.makeConstant(1.f);
} else {
@@ -667,11 +597,7 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
dcurve[i] = val;
}
- brightcurve = nullptr;
-
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ brightcurve.reset();
// check if contrast curve is needed
if (contr > 0.00001 || contr < -0.00001) {
@@ -688,7 +614,6 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
avg /= sum;
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
std::vector contrastcurvePoints(9);
contrastcurvePoints[0] = DCT_NURBS;
@@ -706,15 +631,12 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
const DiagonalCurve contrastcurve(contrastcurvePoints, CURVES_MIN_POLY_POINTS / skip);
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// apply contrast enhancement
for (int i = 0; i <= 0xffff; i++) {
- dcurve[i] = contrastcurve.getVal (dcurve[i]);
+ dcurve[i] = contrastcurve.getVal(dcurve[i]);
}
}
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
// create second curve if needed
bool histNeeded = false;
customToneCurve2.Reset();
@@ -726,15 +648,11 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
customToneCurve2.Set(tcurve, gamma_);
}
- if (outBeforeCCurveHistogram ) {
+ if (outBeforeCCurveHistogram) {
histNeeded = true;
}
}
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
// create first curve if needed
customToneCurve1.Reset();
@@ -750,8 +668,6 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
}
}
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
#ifdef __SSE2__
vfloat gamma_v = F2V(gamma_);
vfloat startv = F2V(start);
@@ -762,7 +678,7 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
for (int i = 0; i <= 0xffff; i += 4) {
vfloat valv = LVFU(dcurve[i]);
- valv = igamma (valv, gamma_v, startv, slopev, mulv, addv);
+ valv = igamma(valv, gamma_v, startv, slopev, mulv, addv);
STVFU(outCurve[i], c65535v * valv);
}
@@ -770,7 +686,7 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
for (int i = 0; i <= 0xffff; i++) {
float val = dcurve[i];
- val = igamma (val, gamma_, start, slope, mul, add);
+ val = igamma(val, gamma_, start, slope, mul, add);
outCurve[i] = (65535.f * val);
}
@@ -788,55 +704,116 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
}
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-void CurveFactory::complexLCurve (double br, double contr, const std::vector& curvePoints,
- const LUTu & histogram, LUTf & outCurve,
- LUTu & outBeforeCCurveHistogram, int skip, bool & utili)
+void CurveFactory::Curvelocalhl(double ecomp, double hlcompr, double hlcomprthresh, LUTf & hlCurve)
{
- utili = false;
- // clear array that stores histogram valid before applying the custom curve
- if (outBeforeCCurveHistogram) {
- outBeforeCCurveHistogram.clear();
- }
+ // a: slope of the curve
+ const float a = powf(2.0f, ecomp);
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- // tone curve base. a: slope (from exp.comp.), b: black, def_mul: max. x value (can be>1), hr,sr: highlight,shadow recovery
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+ hlCurve.setClip(LUT_CLIP_BELOW); // used LUT_CLIP_BELOW, because we want to have a baseline of 2^expcomp in this curve. If we don't clip the lut we get wrong values, see Issue 2621 #14 for details
+ float exp_scale = a;
+ float maxran = 65536.f;
+ float scale = maxran;
+ float comp = (max(0.0, ecomp) + 1.0) * hlcompr / 100.0;
+ float shoulder = ((scale / max(1.0f, exp_scale)) * (hlcomprthresh / 200.0)) + 0.1;
+
+ if (comp <= 0.0f) {
+ hlCurve.makeConstant(exp_scale);
+ } else {
+ hlCurve.makeConstant(exp_scale, shoulder + 1);
+
+ float scalemshoulder = scale - shoulder;
+
+#ifdef __SSE2__
+ int i = shoulder + 1;
+
+ if (i & 1) { // original formula, slower than optimized formulas below but only used once or none, so I let it as is for reference
+ // change to [0,1] range
+ float val = (float)i - shoulder;
+ float R = val * comp / (scalemshoulder);
+ hlCurve[i] = xlog(1.0f + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision
+ i++;
+ }
+
+ vdouble onev = _mm_set1_pd(1.0);
+ vdouble Rv = _mm_set_pd((i + 1 - shoulder) * (double)comp / scalemshoulder, (i - shoulder) * (double)comp / scalemshoulder);
+ vdouble incrementv = _mm_set1_pd(2.0 * comp / scalemshoulder);
+ vdouble exp_scalev = _mm_set1_pd(exp_scale);
+
+ // for (; i < 0x10000; i += 2) {
+ for (; i < maxran; i += 2) {
+ // change to [0,1] range
+ vdouble resultv = xlog(onev + Rv * exp_scalev) / Rv;
+ vfloat resultfv = _mm_cvtpd_ps(resultv);
+ _mm_store_ss(&hlCurve[i], resultfv);
+ resultfv = PERMUTEPS(resultfv, _MM_SHUFFLE(1, 1, 1, 1));
+ _mm_store_ss(&hlCurve[i + 1], resultfv);
+ Rv += incrementv;
+ }
+
+#else
+ float R = comp / scalemshoulder;
+ float increment = R;
+
+ // for (int i = shoulder + 1; i < 0x10000; i++) {
+ for (int i = shoulder + 1; i < maxran; i++) {
+ // change to [0,1] range
+ hlCurve[i] = xlog(1.0f + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision
+ R += increment;
+ }
+
+#endif
+
+ }
+}
+
+void CurveFactory::complexCurvelocal(double ecomp, double black, double hlcompr, double hlcomprthresh,
+ double shcompr, double br, double cont, double lumare,
+ LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, LUTf & lightCurveloc, float avg,
+ int skip)
+{
+
+ const float gamma_ = 2.22; //BT 709
+ const float start = expf(gamma_ * logf(-0.0954f / ((1.0f / gamma_ - 1.0f) * 1.0954f)));
+ const float slope = 1.0954f * powf(start, 1.0f / gamma_ - 1.f) - 0.0954f / start;
+ const float mul = 1.0954f;
+ const float add = 0.0954f;
+ float maxran = 65536.f; //65536
// check if brightness curve is needed
if (br > 0.00001 || br < -0.00001) {
- utili = true;
-
+ // utili = true;
+ if(br > 0) {
+ br /= 4.f;//to avoid artifacts in some cases
+ }
std::vector brightcurvePoints;
brightcurvePoints.resize(9);
- brightcurvePoints.at(0) = double(DCT_NURBS);
+ brightcurvePoints.at(0) = double (DCT_NURBS);
- brightcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range
- brightcurvePoints.at(2) = 0.; // black point. Value in [0 ; 1] range
+ brightcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range
+ brightcurvePoints.at(2) = 0.; // black point. Value in [0 ; 1] range
if (br > 0) {
- brightcurvePoints.at(3) = 0.1; // toe point
- brightcurvePoints.at(4) = 0.1 + br / 150.0; //value at toe point
+ brightcurvePoints.at(3) = 0.2; // toe point
+ brightcurvePoints.at(4) = 0.2 + br / 250.0; //value at toe point
- brightcurvePoints.at(5) = 0.7; // shoulder point
- brightcurvePoints.at(6) = min(1.0, 0.7 + br / 300.0); //value at shoulder point
+ brightcurvePoints.at(5) = 0.6; // shoulder point
+ brightcurvePoints.at(6) = min(1.0, 0.6 + br / 200.0); //value at shoulder point
} else {
- brightcurvePoints.at(3) = 0.1 - br / 150.0; // toe point
- brightcurvePoints.at(4) = 0.1; // value at toe point
+ brightcurvePoints.at(3) = 0.1 - br / 150.0; // toe point
+ brightcurvePoints.at(4) = 0.1; // value at toe point
- brightcurvePoints.at(5) = min(1.0, 0.7 - br / 300.0); // shoulder point
- brightcurvePoints.at(6) = 0.7; // value at shoulder point
+ brightcurvePoints.at(5) = min(1.0, 0.7 - br / 300.0); // shoulder point
+ brightcurvePoints.at(6) = 0.7; // value at shoulder point
}
- brightcurvePoints.at(7) = 1.; // white point
- brightcurvePoints.at(8) = 1.; // value at white point
+ brightcurvePoints.at(7) = 1.; // white point
+ brightcurvePoints.at(8) = 1.; // value at white point
DiagonalCurve brightcurve(brightcurvePoints, CURVES_MIN_POLY_POINTS / skip);
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// Applying brightness curve
for (int i = 0; i < 32768; i++) { // L values range up to 32767, higher values are for highlight overflow
@@ -845,7 +822,211 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vector 0.00001 || cont < -0.00001) {
+
+
+ int k = avg * 32768;
+ avg = lightCurveloc[k];
+ std::vector contrastcurvePoints;
+ contrastcurvePoints.resize(9);
+ contrastcurvePoints.at(0) = double (DCT_NURBS);
+
+ contrastcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range
+ contrastcurvePoints.at(2) = 0.; // black point. Value in [0 ; 1] range
+
+ contrastcurvePoints.at(3) = avg - avg * (0.6 - cont / 250.0); // toe point
+ contrastcurvePoints.at(4) = avg - avg * (0.6 + cont / 250.0); // value at toe point
+
+ contrastcurvePoints.at(5) = avg + (1 - avg) * (0.6 - cont / 250.0); // shoulder point
+ contrastcurvePoints.at(6) = avg + (1 - avg) * (0.6 + cont / 250.0); // value at shoulder point
+
+ contrastcurvePoints.at(7) = 1.; // white point
+ contrastcurvePoints.at(8) = 1.; // value at white point
+
+ DiagonalCurve contrastcurve(contrastcurvePoints, CURVES_MIN_POLY_POINTS / skip);
+
+ // apply contrast enhancement
+ for (int i = 0; i < 32768; i++) {
+ lightCurveloc[i] = contrastcurve.getVal(lightCurveloc[i]);
+ }
+
+ }
+
+ lightCurveloc *= 32767.f;
+
+ for (int i = 32768; i < 32770; i++) { // set last two elements of lut to 32768 and 32769 to allow linear interpolation
+ lightCurveloc[i] = (float)i;
+ }
+
+ // a: slope of the curve, black: starting point at the x axis
+ const float a = powf(2.0f, ecomp);
+
+ // tone curve base. a: slope (from exp.comp.), b: black, def_mul: max. x value (can be>1), hr,sr: highlight,shadow recovery
+ hlCurve.setClip(LUT_CLIP_BELOW); // used LUT_CLIP_BELOW, because we want to have a baseline of 2^expcomp in this curve. If we don't clip the lut we get wrong values, see Issue 2621 #14 for details
+ float exp_scale = a;
+ float scale = maxran;
+ float comp = (max(0.0, ecomp) + 1.0) * hlcompr / 100.0;
+ float shoulder = ((scale / max(1.0f, exp_scale)) * (hlcomprthresh / 200.0)) + 0.1;
+
+ if (comp <= 0.0f) {
+ hlCurve.makeConstant(exp_scale);
+ } else {
+ hlCurve.makeConstant(exp_scale, shoulder + 1);
+
+ float scalemshoulder = scale - shoulder;
+
+#ifdef __SSE2__
+ int i = shoulder + 1;
+
+ if (i & 1) { // original formula, slower than optimized formulas below but only used once or none, so I let it as is for reference
+ // change to [0,1] range
+ float val = (float)i - shoulder;
+ float R = val * comp / (scalemshoulder);
+ hlCurve[i] = xlog(1.0f + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision
+ i++;
+ }
+
+ vdouble onev = _mm_set1_pd(1.0);
+ vdouble Rv = _mm_set_pd((i + 1 - shoulder) * (double)comp / scalemshoulder, (i - shoulder) * (double)comp / scalemshoulder);
+ vdouble incrementv = _mm_set1_pd(2.0 * comp / scalemshoulder);
+ vdouble exp_scalev = _mm_set1_pd(exp_scale);
+
+ // for (; i < 0x10000; i += 2) {
+ for (; i < maxran; i += 2) {
+ // change to [0,1] range
+ vdouble resultv = xlog(onev + Rv * exp_scalev) / Rv;
+ vfloat resultfv = _mm_cvtpd_ps(resultv);
+ _mm_store_ss(&hlCurve[i], resultfv);
+ resultfv = PERMUTEPS(resultfv, _MM_SHUFFLE(1, 1, 1, 1));
+ _mm_store_ss(&hlCurve[i + 1], resultfv);
+ Rv += incrementv;
+ }
+
+#else
+ float R = comp / scalemshoulder;
+ float increment = R;
+
+ // for (int i = shoulder + 1; i < 0x10000; i++) {
+ for (int i = shoulder + 1; i < maxran; i++) {
+ // change to [0,1] range
+ hlCurve[i] = xlog(1.0f + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision
+ R += increment;
+ }
+
+#endif
+
+ }
+
+ // curve without contrast
+ LUTf dcurve(maxran);
+
+ // change to [0,1] range
+ shCurve.setClip(LUT_CLIP_ABOVE); // used LUT_CLIP_ABOVE, because the curve converges to 1.0 at the upper end and we don't want to exceed this value.
+ if (black == 0.0) {
+ shCurve.makeConstant(1.f);
+ } else {
+ const float val = 1.f / (maxran - 1.f);
+ shCurve[0] = simplebasecurve(val, black, 0.015 * shcompr) / val;
+ }
+
+ // gamma correction
+ float val = Color::gammatab_bt709[0] / maxran;
+ // store result in a temporary array
+ dcurve[0] = LIM01(val);
+
+ for (int i = 1; i < maxran; i++) {
+ if (black != 0.0) {
+ const float bval = i / 65535.f;
+ shCurve[i] = simplebasecurve(bval, black, 0.015 * shcompr) / bval;
+ }
+
+ // gamma correction
+ dcurve[i] = Color::gammatab_bt709[i] / maxran;
+ }
+
+#ifdef __SSE2__
+ vfloat gamma_v = F2V(gamma_);
+ vfloat startv = F2V(start);
+ vfloat slopev = F2V(slope);
+ vfloat mulv = F2V(mul);
+ vfloat addv = F2V(add);
+ // vfloat c65535v = F2V (65535.f);
+ vfloat c65535v = F2V(maxran - 1.f);
+
+ for (int i = 0; i <= (maxran - 1.f); i += 4) {
+ vfloat valv = LVFU(dcurve[i]);
+ valv = igamma(valv, gamma_v, startv, slopev, mulv, addv);
+ STVFU(outCurve[i], c65535v * valv);
+ }
+#else
+ for (int i = 0; i <= (maxran - 1.f); i++) {
+ outCurve[i] = (maxran - 1.f) * igamma(dcurve[i], gamma_, start, slope, mul, add);
+ }
+#endif
+}
+
+void CurveFactory::complexLCurve(double br, double contr, const std::vector& curvePoints,
+ const LUTu & histogram, LUTf & outCurve,
+ LUTu & outBeforeCCurveHistogram, int skip, bool & utili)
+{
+
+ utili = false;
+
+ // clear array that stores histogram valid before applying the custom curve
+ if (outBeforeCCurveHistogram) {
+ outBeforeCCurveHistogram.clear();
+ }
+
+ // tone curve base. a: slope (from exp.comp.), b: black, def_mul: max. x value (can be>1), hr,sr: highlight,shadow recovery
+
+ // check if brightness curve is needed
+ if (br > 0.00001 || br < -0.00001) {
+ utili = true;
+
+ std::vector brightcurvePoints;
+ brightcurvePoints.resize(9);
+ brightcurvePoints.at(0) = double (DCT_NURBS);
+
+ brightcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range
+ brightcurvePoints.at(2) = 0.; // black point. Value in [0 ; 1] range
+
+ if (br > 0) {
+ brightcurvePoints.at(3) = 0.1; // toe point
+ brightcurvePoints.at(4) = 0.1 + br / 150.0; //value at toe point
+
+ brightcurvePoints.at(5) = 0.7; // shoulder point
+ brightcurvePoints.at(6) = min(1.0, 0.7 + br / 300.0); //value at shoulder point
+ } else {
+ brightcurvePoints.at(3) = 0.1 - br / 150.0; // toe point
+ brightcurvePoints.at(4) = 0.1; // value at toe point
+
+ brightcurvePoints.at(5) = min(1.0, 0.7 - br / 300.0); // shoulder point
+ brightcurvePoints.at(6) = 0.7; // value at shoulder point
+ }
+
+ brightcurvePoints.at(7) = 1.; // white point
+ brightcurvePoints.at(8) = 1.; // value at white point
+
+ DiagonalCurve brightcurve(brightcurvePoints, CURVES_MIN_POLY_POINTS / skip);
+
+ // Applying brightness curve
+ for (int i = 0; i < 32768; i++) { // L values range up to 32767, higher values are for highlight overflow
+
+ // change to [0,1] range
+ float val = (float)i / 32767.0;
+
+ // apply brightness curve
+ val = brightcurve.getVal(val);
// store result in a temporary array
outCurve[i] = LIM01(val);
@@ -855,10 +1036,6 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vector 0.00001 || contr < -0.00001) {
utili = true;
@@ -874,69 +1051,57 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vector contrastcurvePoints;
- if(sum) {
+ if (sum) {
avg /= sum;
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
contrastcurvePoints.resize(9);
- contrastcurvePoints.at(0) = double(DCT_NURBS);
+ contrastcurvePoints.at(0) = double (DCT_NURBS);
- contrastcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range
- contrastcurvePoints.at(2) = 0.; // black point. Value in [0 ; 1] range
+ contrastcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range
+ contrastcurvePoints.at(2) = 0.; // black point. Value in [0 ; 1] range
- contrastcurvePoints.at(3) = avg - avg * (0.6 - contr / 250.0); // toe point
- contrastcurvePoints.at(4) = avg - avg * (0.6 + contr / 250.0); // value at toe point
+ contrastcurvePoints.at(3) = avg - avg * (0.6 - contr / 250.0); // toe point
+ contrastcurvePoints.at(4) = avg - avg * (0.6 + contr / 250.0); // value at toe point
- contrastcurvePoints.at(5) = avg + (1 - avg) * (0.6 - contr / 250.0); // shoulder point
- contrastcurvePoints.at(6) = avg + (1 - avg) * (0.6 + contr / 250.0); // value at shoulder point
+ contrastcurvePoints.at(5) = avg + (1 - avg) * (0.6 - contr / 250.0); // shoulder point
+ contrastcurvePoints.at(6) = avg + (1 - avg) * (0.6 + contr / 250.0); // value at shoulder point
- contrastcurvePoints.at(7) = 1.; // white point
- contrastcurvePoints.at(8) = 1.; // value at white point
-
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ contrastcurvePoints.at(7) = 1.; // white point
+ contrastcurvePoints.at(8) = 1.; // value at white point
} else {
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// sum has an invalid value (next to 0, producing a division by zero, so we create a fake contrast curve, producing a white image
contrastcurvePoints.resize(5);
- contrastcurvePoints.at(0) = double(DCT_NURBS);
+ contrastcurvePoints.at(0) = double (DCT_NURBS);
- contrastcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range
- contrastcurvePoints.at(2) = 1.; // black point. Value in [0 ; 1] range
+ contrastcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range
+ contrastcurvePoints.at(2) = 1.; // black point. Value in [0 ; 1] range
- contrastcurvePoints.at(3) = 1.; // white point
- contrastcurvePoints.at(4) = 1.; // value at white point
-
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ contrastcurvePoints.at(3) = 1.; // white point
+ contrastcurvePoints.at(4) = 1.; // value at white point
}
DiagonalCurve contrastcurve(contrastcurvePoints, CURVES_MIN_POLY_POINTS / skip);
// apply contrast enhancement
for (int i = 0; i < 32768; i++) {
- outCurve[i] = contrastcurve.getVal (outCurve[i]);
+ outCurve[i] = contrastcurve.getVal(outCurve[i]);
}
}
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
// create a curve if needed
std::unique_ptr tcurve;
bool histNeeded = false;
if (!curvePoints.empty() && curvePoints[0] != 0) {
- tcurve = std::unique_ptr(new DiagonalCurve (curvePoints, CURVES_MIN_POLY_POINTS / skip));
+ tcurve.reset(new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip));
if (outBeforeCCurveHistogram) {
histNeeded = true;
}
}
- if (tcurve && tcurve->isIdentity()) {
- tcurve = nullptr;
- }
-
- if (tcurve) {
+ if (tcurve && !tcurve->isIdentity()) {
utili = true; //if active
// L values go up to 32767, last stop is for highlight overflow
@@ -950,15 +1115,15 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vectorgetVal (outCurve[i]);
+ val = tcurve->getVal(outCurve[i]);
- outCurve[i] = (32767.f * val);
+ outCurve[i] = 32767.f * val;
}
} else {
// Skip the slow getval method if no curve is used (or an identity curve)
// L values go up to 32767, last stop is for highlight overflow
- if(histNeeded) {
+ if (histNeeded) {
histogram.compressTo(outBeforeCCurveHistogram, 32768, outCurve);
}
@@ -967,30 +1132,22 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vector& curvePoints, LUTf & outCurve, int skip)
+void CurveFactory::RGBCurve(const std::vector& curvePoints, LUTf & outCurve, int skip)
{
// create a curve if needed
std::unique_ptr tcurve;
if (!curvePoints.empty() && curvePoints[0] != 0) {
- tcurve = std::unique_ptr(new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip));
+ tcurve.reset(new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip));
}
- if (tcurve && tcurve->isIdentity()) {
- tcurve = nullptr;
- }
-
- if (tcurve) {
+ if (tcurve && !tcurve->isIdentity()) {
if (!outCurve) {
outCurve(65536, 0);
}
@@ -1007,6 +1164,1328 @@ void CurveFactory::RGBCurve (const std::vector& curvePoints, LUTf & outC
}
}
+LocretigainCurverab::LocretigainCurverab() : sum(0.f) {};
+
+void LocretigainCurverab::Reset()
+{
+ lutLocretigainCurverab.reset();
+ sum = 0.f;
+}
+
+void LocretigainCurverab::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocretigainCurverab(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocretigainCurverab[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocretigainCurverab[i] < 0.02f) {
+ lutLocretigainCurverab[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocretigainCurverab[i];
+ }
+
+ //lutLocCurve.dump("wav");
+}
+
+void LocretigainCurverab::Set(const std::vector &curvePoints)
+{
+
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve tcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ tcurve.setIdentityValue(0.);
+ Set(tcurve);
+ } else {
+ Reset();
+ }
+}
+LocHHmaskblCurve::LocHHmaskblCurve() : sum(0.f) {};
+
+void LocHHmaskblCurve::Reset()
+{
+ lutLocHHmaskblCurve.reset();
+ sum = 0.f;
+}
+
+
+void LocHHmaskblCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocHHmaskblCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocHHmaskblCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocHHmaskblCurve[i] < 0.02f) {
+ lutLocHHmaskblCurve[i] = 0.02f;
+ }
+
+ sum += lutLocHHmaskblCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+void LocHHmaskblCurve::Set(const std::vector &curvePoints, bool & lhmasblutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ lhmasblutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+LocLLmaskblCurve::LocLLmaskblCurve() : sum(0.f) {};
+
+void LocLLmaskblCurve::Reset()
+{
+ lutLocLLmaskblCurve.reset();
+ sum = 0.f;
+}
+
+void LocLLmaskblCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocLLmaskblCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocLLmaskblCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocLLmaskblCurve[i] < 0.02f) {
+ lutLocLLmaskblCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocLLmaskblCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocLLmaskblCurve::Set(const std::vector &curvePoints, bool & llmasblutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ llmasblutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+LocCCmaskblCurve::LocCCmaskblCurve() : sum(0.f) {};
+
+void LocCCmaskblCurve::Reset()
+{
+ lutLocCCmaskblCurve.reset();
+ sum = 0.f;
+}
+
+void LocCCmaskblCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocCCmaskblCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocCCmaskblCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocCCmaskblCurve[i] < 0.02f) {
+ lutLocCCmaskblCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocCCmaskblCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocCCmaskblCurve::Set(const std::vector &curvePoints, bool & lcmasblutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ lcmasblutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+
+
+LocHHmasktmCurve::LocHHmasktmCurve() : sum(0.f) {};
+
+void LocHHmasktmCurve::Reset()
+{
+ lutLocHHmasktmCurve.reset();
+ sum = 0.f;
+}
+
+
+void LocHHmasktmCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocHHmasktmCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocHHmasktmCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocHHmasktmCurve[i] < 0.02f) {
+ lutLocHHmasktmCurve[i] = 0.02f;
+ }
+
+ sum += lutLocHHmasktmCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+void LocHHmasktmCurve::Set(const std::vector &curvePoints, bool & lhmastmutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ lhmastmutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+LocLLmasktmCurve::LocLLmasktmCurve() : sum(0.f) {};
+
+void LocLLmasktmCurve::Reset()
+{
+ lutLocLLmasktmCurve.reset();
+ sum = 0.f;
+}
+
+void LocLLmasktmCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocLLmasktmCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocLLmasktmCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocLLmasktmCurve[i] < 0.02f) {
+ lutLocLLmasktmCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocLLmasktmCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocLLmasktmCurve::Set(const std::vector &curvePoints, bool & llmastmutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ llmastmutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+LocCCmasktmCurve::LocCCmasktmCurve() : sum(0.f) {};
+
+void LocCCmasktmCurve::Reset()
+{
+ lutLocCCmasktmCurve.reset();
+ sum = 0.f;
+}
+
+void LocCCmasktmCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocCCmasktmCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocCCmasktmCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocCCmasktmCurve[i] < 0.02f) {
+ lutLocCCmasktmCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocCCmasktmCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocCCmasktmCurve::Set(const std::vector &curvePoints, bool & lcmastmutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ lcmastmutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+
+
+
+LocHHmaskretiCurve::LocHHmaskretiCurve() : sum(0.f) {};
+
+void LocHHmaskretiCurve::Reset()
+{
+ lutLocHHmaskretiCurve.reset();
+ sum = 0.f;
+}
+
+
+void LocHHmaskretiCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocHHmaskretiCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocHHmaskretiCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocHHmaskretiCurve[i] < 0.02f) {
+ lutLocHHmaskretiCurve[i] = 0.02f;
+ }
+
+ sum += lutLocHHmaskretiCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+void LocHHmaskretiCurve::Set(const std::vector &curvePoints, bool & lhmasretiutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ lhmasretiutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+LocLLmaskretiCurve::LocLLmaskretiCurve() : sum(0.f) {};
+
+void LocLLmaskretiCurve::Reset()
+{
+ lutLocLLmaskretiCurve.reset();
+ sum = 0.f;
+}
+
+void LocLLmaskretiCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocLLmaskretiCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocLLmaskretiCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocLLmaskretiCurve[i] < 0.02f) {
+ lutLocLLmaskretiCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocLLmaskretiCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocLLmaskretiCurve::Set(const std::vector &curvePoints, bool & llmasretiutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ llmasretiutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+LocCCmaskretiCurve::LocCCmaskretiCurve() : sum(0.f) {};
+
+void LocCCmaskretiCurve::Reset()
+{
+ lutLocCCmaskretiCurve.reset();
+ sum = 0.f;
+}
+
+void LocCCmaskretiCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocCCmaskretiCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocCCmaskretiCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocCCmaskretiCurve[i] < 0.02f) {
+ lutLocCCmaskretiCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocCCmaskretiCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocCCmaskretiCurve::Set(const std::vector &curvePoints, bool & lcmasretiutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ lcmasretiutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+
+
+
+
+
+
+
+LocHHmaskcbCurve::LocHHmaskcbCurve() : sum(0.f) {};
+
+void LocHHmaskcbCurve::Reset()
+{
+ lutLocHHmaskcbCurve.reset();
+ sum = 0.f;
+}
+
+
+void LocHHmaskcbCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocHHmaskcbCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocHHmaskcbCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocHHmaskcbCurve[i] < 0.02f) {
+ lutLocHHmaskcbCurve[i] = 0.02f;
+ }
+
+ sum += lutLocHHmaskcbCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+void LocHHmaskcbCurve::Set(const std::vector &curvePoints, bool & lhmascbutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ lhmascbutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+LocLLmaskcbCurve::LocLLmaskcbCurve() : sum(0.f) {};
+
+void LocLLmaskcbCurve::Reset()
+{
+ lutLocLLmaskcbCurve.reset();
+ sum = 0.f;
+}
+
+void LocLLmaskcbCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocLLmaskcbCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocLLmaskcbCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocLLmaskcbCurve[i] < 0.02f) {
+ lutLocLLmaskcbCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocLLmaskcbCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocLLmaskcbCurve::Set(const std::vector &curvePoints, bool & llmascbutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ llmascbutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+LocCCmaskcbCurve::LocCCmaskcbCurve() : sum(0.f) {};
+
+void LocCCmaskcbCurve::Reset()
+{
+ lutLocCCmaskcbCurve.reset();
+ sum = 0.f;
+}
+
+void LocCCmaskcbCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocCCmaskcbCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocCCmaskcbCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocCCmaskcbCurve[i] < 0.02f) {
+ lutLocCCmaskcbCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocCCmaskcbCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocCCmaskcbCurve::Set(const std::vector &curvePoints, bool & lcmascbutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ lcmascbutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+
+
+
+LocHHmaskSHCurve::LocHHmaskSHCurve() : sum(0.f) {};
+
+void LocHHmaskSHCurve::Reset()
+{
+ lutLocHHmaskSHCurve.reset();
+ sum = 0.f;
+}
+
+
+void LocHHmaskSHCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocHHmaskSHCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocHHmaskSHCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocHHmaskSHCurve[i] < 0.02f) {
+ lutLocHHmaskSHCurve[i] = 0.02f;
+ }
+
+ sum += lutLocHHmaskSHCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocHHmaskSHCurve::Set(const std::vector &curvePoints, bool & lhmasSHutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ lhmasSHutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+
+
+LocLLmaskSHCurve::LocLLmaskSHCurve() : sum(0.f) {};
+
+void LocLLmaskSHCurve::Reset()
+{
+ lutLocLLmaskSHCurve.reset();
+ sum = 0.f;
+}
+
+void LocLLmaskSHCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocLLmaskSHCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocLLmaskSHCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocLLmaskSHCurve[i] < 0.02f) {
+ lutLocLLmaskSHCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocLLmaskSHCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocLLmaskSHCurve::Set(const std::vector &curvePoints, bool & llmasSHutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ llmasSHutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+
+
+
+LocCCmaskSHCurve::LocCCmaskSHCurve() : sum(0.f) {};
+
+void LocCCmaskSHCurve::Reset()
+{
+ lutLocCCmaskSHCurve.reset();
+ sum = 0.f;
+}
+
+void LocCCmaskSHCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocCCmaskSHCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocCCmaskSHCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocCCmaskSHCurve[i] < 0.02f) {
+ lutLocCCmaskSHCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocCCmaskSHCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocCCmaskSHCurve::Set(const std::vector &curvePoints, bool & lcmasSHutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ lcmasSHutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+
+
+
+
+LocHHmaskexpCurve::LocHHmaskexpCurve() : sum(0.f) {};
+
+void LocHHmaskexpCurve::Reset()
+{
+ lutLocHHmaskexpCurve.reset();
+ sum = 0.f;
+}
+
+
+void LocHHmaskexpCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocHHmaskexpCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocHHmaskexpCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocHHmaskexpCurve[i] < 0.02f) {
+ lutLocHHmaskexpCurve[i] = 0.02f;
+ }
+
+ sum += lutLocHHmaskexpCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocHHmaskexpCurve::Set(const std::vector &curvePoints, bool & lhmasexputili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ lhmasexputili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+
+
+LocLLmaskexpCurve::LocLLmaskexpCurve() : sum(0.f) {};
+
+void LocLLmaskexpCurve::Reset()
+{
+ lutLocLLmaskexpCurve.reset();
+ sum = 0.f;
+}
+
+void LocLLmaskexpCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocLLmaskexpCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocLLmaskexpCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocLLmaskexpCurve[i] < 0.02f) {
+ lutLocLLmaskexpCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocLLmaskexpCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocLLmaskexpCurve::Set(const std::vector &curvePoints, bool & llmasexputili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ llmasexputili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+
+
+
+LocCCmaskexpCurve::LocCCmaskexpCurve() : sum(0.f) {};
+
+void LocCCmaskexpCurve::Reset()
+{
+ lutLocCCmaskexpCurve.reset();
+ sum = 0.f;
+}
+
+void LocCCmaskexpCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocCCmaskexpCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocCCmaskexpCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocCCmaskexpCurve[i] < 0.02f) {
+ lutLocCCmaskexpCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocCCmaskexpCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocCCmaskexpCurve::Set(const std::vector &curvePoints, bool & lcmasexputili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ lcmasexputili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+LocHHmaskCurve::LocHHmaskCurve() : sum(0.f) {};
+
+void LocHHmaskCurve::Reset()
+{
+ lutLocHHmaskCurve.reset();
+ sum = 0.f;
+}
+
+
+void LocHHmaskCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocHHmaskCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocHHmaskCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocHHmaskCurve[i] < 0.02f) {
+ lutLocHHmaskCurve[i] = 0.02f;
+ }
+
+ sum += lutLocHHmaskCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+bool LocHHmaskCurve::Set(const std::vector &curvePoints)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ Set(ttcurve);
+ return true;
+ } else {
+ Reset();
+ return false;
+ }
+}
+
+
+
+
+LocCCmaskCurve::LocCCmaskCurve() : sum(0.f) {};
+
+void LocCCmaskCurve::Reset()
+{
+ lutLocCCmaskCurve.reset();
+ sum = 0.f;
+}
+
+
+void LocCCmaskCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocCCmaskCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocCCmaskCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocCCmaskCurve[i] < 0.02f) {
+ lutLocCCmaskCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocCCmaskCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+bool LocCCmaskCurve::Set(const std::vector &curvePoints)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ Set(ttcurve);
+ return true;
+ } else {
+ Reset();
+ return false;
+ }
+}
+
+LocLLmaskCurve::LocLLmaskCurve() : sum(0.f) {};
+
+void LocLLmaskCurve::Reset()
+{
+ lutLocLLmaskCurve.reset();
+ sum = 0.f;
+}
+
+void LocLLmaskCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocLLmaskCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocLLmaskCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocLLmaskCurve[i] < 0.02f) {
+ lutLocLLmaskCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocLLmaskCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+bool LocLLmaskCurve::Set(const std::vector &curvePoints)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ Set(ttcurve);
+ return true;
+ } else {
+ Reset();
+ return false;
+ }
+}
+
+
+
+
+LocHHCurve::LocHHCurve() : sum(0.f) {};
+
+void LocHHCurve::Reset()
+{
+ lutLocHHCurve.reset();
+ sum = 0.f;
+}
+void LocHHCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocHHCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocHHCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocHHCurve[i] < 0.02f) {
+ lutLocHHCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocHHCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+bool LocHHCurve::Set(const std::vector &curvePoints)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ Set(ttcurve);
+ return true;
+ } else {
+ Reset();
+ return false;
+ }
+}
+
+
+LocLHCurve::LocLHCurve() : sum(0.f) {};
+
+void LocLHCurve::Reset()
+{
+ lutLocLHCurve.reset();
+ sum = 0.f;
+}
+
+void LocLHCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocLHCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocLHCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocLHCurve[i] < 0.02f) {
+ lutLocLHCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocLHCurve[i];
+ }
+
+ //lutLocCurve.dump("wav");
+}
+
+
+
+
+bool LocLHCurve::Set(const std::vector &curvePoints)
+{
+
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+// if (LHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve tcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ tcurve.setIdentityValue(0.);
+ Set(tcurve);
+ return true;
+ } else {
+ Reset();
+ return false;
+ }
+}
+
+LocCHCurve::LocCHCurve() : sum(0.f) {};
+
+void LocCHCurve::Reset()
+{
+ lutLocCHCurve.reset();
+ sum = 0.f;
+}
+void LocCHCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocCHCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocCHCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocCHCurve[i] < 0.02f) {
+ lutLocCHCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocCHCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+bool LocCHCurve::Set(const std::vector &curvePoints)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ Set(ttcurve);
+ return true;
+ } else {
+ Reset();
+ return false;
+ }
+}
+
+
+
+
+
+LocwavCurve::LocwavCurve() : sum(0.f) {};
+
+void LocwavCurve::Reset()
+{
+ lutLocwavCurve.reset();
+ sum = 0.f;
+}
+
+void LocwavCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocwavCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocwavCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocwavCurve[i] < 0.02f) {
+ lutLocwavCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocwavCurve[i];
+ }
+
+ //lutLocCurve.dump("wav");
+}
+bool LocwavCurve::Set(const std::vector &curvePoints)
+{
+
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve tcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ tcurve.setIdentityValue(0.);
+ Set(tcurve);
+ return true;
+ } else {
+ Reset();
+ return false;
+ }
+}
+
+LocretitransCurve::LocretitransCurve() : sum(0.f) {};
+
+void LocretitransCurve::Reset()
+{
+ lutLocretitransCurve.reset();
+ sum = 0.f;
+}
+
+void LocretitransCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocretitransCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocretitransCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocretitransCurve[i] < 0.02f) {
+ lutLocretitransCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocretitransCurve[i];
+ }
+
+ //lutLocCurve.dump("wav");
+}
+void LocretitransCurve::Set(const std::vector &curvePoints)
+{
+
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve tcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ tcurve.setIdentityValue(0.);
+ Set(tcurve);
+ } else {
+ Reset();
+ }
+}
+
+
+LocretigainCurve::LocretigainCurve() : sum(0.f) {};
+
+void LocretigainCurve::Reset()
+{
+ lutLocretigainCurve.reset();
+ sum = 0.f;
+}
+
+void LocretigainCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocretigainCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocretigainCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocretigainCurve[i] < 0.02f) {
+ lutLocretigainCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocretigainCurve[i];
+ }
+
+ //lutLocCurve.dump("wav");
+}
+void LocretigainCurve::Set(const std::vector &curvePoints)
+{
+
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve tcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ tcurve.setIdentityValue(0.);
+ Set(tcurve);
+ } else {
+ Reset();
+ }
+}
+
+
void ColorAppearance::Reset()
{
@@ -1019,7 +2498,7 @@ void ColorAppearance::Set(const Curve &pCurve)
lutColCurve(65536);
for (int i = 0; i < 65536; i++) {
- lutColCurve[i] = pCurve.getVal(double(i) / 65535.) * 65535.;
+ lutColCurve[i] = pCurve.getVal(double (i) / 65535.) * 65535.;
}
}
@@ -1038,10 +2517,10 @@ void RetinextransmissionCurve::Set(const Curve &pCurve)
return;
}
- luttransmission(501); // raise this value if the quality suffers from this number of samples
+ luttransmission(501); // raise this value if the quality suffers from this number of samples
for (int i = 0; i < 501; i++) {
- luttransmission[i] = pCurve.getVal(double(i) / 500.);
+ luttransmission[i] = pCurve.getVal(double (i) / 500.);
}
}
@@ -1071,10 +2550,10 @@ void RetinexgaintransmissionCurve::Set(const Curve &pCurve)
return;
}
- lutgaintransmission(501); // raise this value if the quality suffers from this number of samples
+ lutgaintransmission(501); // raise this value if the quality suffers from this number of samples
for (int i = 0; i < 501; i++) {
- lutgaintransmission[i] = pCurve.getVal(double(i) / 500.);
+ lutgaintransmission[i] = pCurve.getVal(double (i) / 500.);
}
}
@@ -1101,9 +2580,9 @@ void ToneCurve::Set(const Curve &pCurve, float gamma)
if (gamma <= 0.0 || gamma == 1.) {
for (int i = 0; i < 65536; i++) {
- lutToneCurve[i] = (float)pCurve.getVal(float(i) / 65535.f) * 65535.f;
+ lutToneCurve[i] = (float)pCurve.getVal(float (i) / 65535.f) * 65535.f;
}
- } else if(gamma == (float)Color::sRGBGammaCurve) {
+ } else if (gamma == (float)Color::sRGBGammaCurve) {
// for sRGB gamma we can use luts, which is much faster
for (int i = 0; i < 65536; i++) {
float val = Color::gammatab_srgb[i] / 65535.f;
@@ -1113,17 +2592,17 @@ void ToneCurve::Set(const Curve &pCurve, float gamma)
}
} else {
- const float start = expf(gamma * logf( -0.055 / ((1.0 / gamma - 1.0) * 1.055 )));
- const float slope = 1.055 * powf (start, 1.0 / gamma - 1) - 0.055 / start;
+ const float start = expf(gamma * logf(-0.055 / ((1.0 / gamma - 1.0) * 1.055)));
+ const float slope = 1.055 * powf(start, 1.0 / gamma - 1) - 0.055 / start;
const float mul = 1.055;
const float add = 0.055;
// apply gamma, that is 'pCurve' is defined with the given gamma and here we convert it to a curve in linear space
for (int i = 0; i < 65536; i++) {
- float val = float(i) / 65535.f;
- val = CurveFactory::gamma (val, gamma, start, slope, mul, add);
+ float val = float (i) / 65535.f;
+ val = CurveFactory::gamma(val, gamma, start, slope, mul, add);
val = pCurve.getVal(val);
- val = CurveFactory::igamma (val, gamma, start, slope, mul, add);
+ val = CurveFactory::igamma(val, gamma, start, slope, mul, add);
lutToneCurve[i] = val * 65535.f;
}
}
@@ -1141,10 +2620,10 @@ void OpacityCurve::Set(const Curve *pCurve)
return;
}
- lutOpacityCurve(501); // raise this value if the quality suffers from this number of samples
+ lutOpacityCurve(501); // raise this value if the quality suffers from this number of samples
for (int i = 0; i < 501; i++) {
- lutOpacityCurve[i] = pCurve->getVal(double(i) / 500.);
+ lutOpacityCurve[i] = pCurve->getVal(double (i) / 500.);
}
//lutOpacityCurve.dump("opacity");
@@ -1155,18 +2634,13 @@ void OpacityCurve::Set(const std::vector &curvePoints, bool &opautili)
std::unique_ptr tcurve;
if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
- tcurve = std::unique_ptr(new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2));
+ tcurve.reset(new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2));
tcurve->setIdentityValue(0.);
- }
-
- if (tcurve) {
Set(tcurve.get());
opautili = true;
- tcurve = nullptr;
}
}
-
WavCurve::WavCurve() : sum(0.f) {}
void WavCurve::Reset()
@@ -1182,13 +2656,13 @@ void WavCurve::Set(const Curve &pCurve)
return;
}
- lutWavCurve(501); // raise this value if the quality suffers from this number of samples
+ lutWavCurve(501); // raise this value if the quality suffers from this number of samples
sum = 0.f;
for (int i = 0; i < 501; i++) {
- lutWavCurve[i] = pCurve.getVal(double(i) / 500.);
+ lutWavCurve[i] = pCurve.getVal(double (i) / 500.);
- if(lutWavCurve[i] < 0.02f) {
+ if (lutWavCurve[i] < 0.02f) {
lutWavCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
}
@@ -1259,10 +2733,10 @@ void WavOpacityCurveRG::Set(const Curve &pCurve)
return;
}
- lutOpacityCurveRG(501); // raise this value if the quality suffers from this number of samples
+ lutOpacityCurveRG(501); // raise this value if the quality suffers from this number of samples
for (int i = 0; i < 501; i++) {
- lutOpacityCurveRG[i] = pCurve.getVal(double(i) / 500.);
+ lutOpacityCurveRG[i] = pCurve.getVal(double (i) / 500.);
}
}
@@ -1329,10 +2803,10 @@ void WavOpacityCurveBY::Set(const Curve &pCurve)
return;
}
- lutOpacityCurveBY(501); // raise this value if the quality suffers from this number of samples
+ lutOpacityCurveBY(501); // raise this value if the quality suffers from this number of samples
for (int i = 0; i < 501; i++) {
- lutOpacityCurveBY[i] = pCurve.getVal(double(i) / 500.);
+ lutOpacityCurveBY[i] = pCurve.getVal(double (i) / 500.);
}
}
@@ -1361,10 +2835,10 @@ void WavOpacityCurveW::Set(const Curve &pCurve)
return;
}
- lutOpacityCurveW(501); // raise this value if the quality suffers from this number of samples
+ lutOpacityCurveW(501); // raise this value if the quality suffers from this number of samples
for (int i = 0; i < 501; i++) {
- lutOpacityCurveW[i] = pCurve.getVal(double(i) / 500.);
+ lutOpacityCurveW[i] = pCurve.getVal(double (i) / 500.);
}
}
@@ -1393,10 +2867,10 @@ void WavOpacityCurveWL::Set(const Curve &pCurve)
return;
}
- lutOpacityCurveWL(501); // raise this value if the quality suffers from this number of samples
+ lutOpacityCurveWL(501); // raise this value if the quality suffers from this number of samples
for (int i = 0; i < 501; i++) {
- lutOpacityCurveWL[i] = pCurve.getVal(double(i) / 500.);
+ lutOpacityCurveWL[i] = pCurve.getVal(double (i) / 500.);
}
}
@@ -1427,13 +2901,13 @@ void NoiseCurve::Set(const Curve &pCurve)
return;
}
- lutNoiseCurve(501); // raise this value if the quality suffers from this number of samples
+ lutNoiseCurve(501); // raise this value if the quality suffers from this number of samples
sum = 0.f;
for (int i = 0; i < 501; i++) {
- lutNoiseCurve[i] = pCurve.getVal(double(i) / 500.);
+ lutNoiseCurve[i] = pCurve.getVal(double (i) / 500.);
- if(lutNoiseCurve[i] < 0.01f) {
+ if (lutNoiseCurve[i] < 0.01f) {
lutNoiseCurve[i] = 0.01f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
}
@@ -1507,7 +2981,7 @@ void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3],
//lr1=low;
for (int i = 0; i <= upperBound; ++i) {
- double x = double(i) / double(upperBound);
+ double x = double (i) / double (upperBound);
if (x > nextX) {
++ptNum;
@@ -1523,13 +2997,13 @@ void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3],
}
if (!ptNum) {
- Color::hsv2rgb(float(prevY), satur, lr1, r, g, b);
+ Color::hsv2rgb(float (prevY), satur, lr1, r, g, b);
Color::rgbxyz(r, g, b, xx, yy, zz, xyz_rgb);
lut1[i] = xx;
lut2[i] = yy;
lut3[i] = zz;
} else if (ptNum >= nPoints) {
- Color::hsv2rgb(float(nextY), satur, lr2, r, g, b);
+ Color::hsv2rgb(float (nextY), satur, lr2, r, g, b);
Color::rgbxyz(r, g, b, xx, yy, zz, xyz_rgb);
lut1[i] = xx;
lut2[i] = yy;
@@ -1539,8 +3013,8 @@ void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3],
if (dY > 0.000001 || dY < -0.000001) {
float r1, g1, b1, r2, g2, b2;
- Color::hsv2rgb(float(prevY), satur, lr1, r1, g1, b1);
- Color::hsv2rgb(float(nextY), satur, lr2, r2, g2, b2);
+ Color::hsv2rgb(float (prevY), satur, lr1, r1, g1, b1);
+ Color::hsv2rgb(float (nextY), satur, lr2, r2, g2, b2);
LUTf dum;
float X1, X2, Y1, Y2, Z1, Z2, L1, a_1, b_1, c1, h1;
Color::rgbxyz(r2, g2, b2, X2, Y2, Z2, xyz_rgb);
@@ -1548,34 +3022,27 @@ void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3],
//I use XYZ to mix color 1 and 2 rather than rgb (gamut) and rather than Lab artifacts
X1 = X1 + (X2 - X1) * currY / dY;
- if(X1 < 0.f) {
+ if (X1 < 0.f) {
X1 = 0.f; //negative value not good
}
Y1 = Y1 + (Y2 - Y1) * currY / dY;
- if(Y1 < 0.f) {
+ if (Y1 < 0.f) {
Y1 = 0.f;
}
Z1 = Z1 + (Z2 - Z1) * currY / dY;
- if(Z1 < 0.f) {
+ if (Z1 < 0.f) {
Z1 = 0.f;
}
- Color::XYZ2Lab(X1, Y1, Z1, L1, a_1, b_1);//prepare to gamut control
+ Color::XYZ2Lab(X1, Y1, Z1, L1, a_1, b_1); //prepare to gamut control
Color::Lab2Lch(a_1, b_1, c1, h1);
float Lr = L1 / 327.68f;
float RR, GG, BB;
-#ifndef NDEBUG
- bool neg = false;
- bool more_rgb = false;
- //gamut control : Lab values are in gamut
- Color::gamutLchonly(h1, Lr, c1, RR, GG, BB, xyz_rgb, false, 0.15f, 0.96f, neg, more_rgb);
-#else
Color::gamutLchonly(h1, Lr, c1, RR, GG, BB, xyz_rgb, false, 0.15f, 0.96f);
-#endif
L1 = Lr * 327.68f;
float La, Lb, X, Y, Z;
// converting back to rgb
@@ -1585,7 +3052,7 @@ void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3],
lut2[i] = Y;
lut3[i] = Z;
} else {
- Color::hsv2rgb(float(nextY), satur, lumin, r, g, b);
+ Color::hsv2rgb(float (nextY), satur, lumin, r, g, b);
Color::rgbxyz(r, g, b, xx, yy, zz, xyz_rgb);
lut1[i] = xx;
lut2[i] = yy;
@@ -1593,14 +3060,6 @@ void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3],
}
}
}
-
- /*
- #ifndef NDEBUG
- lutRed.dump("red");
- lutGreen.dump("green");
- lutBlue.dump("blue");
- #endif
- */
}
void ColorGradientCurve::SetXYZ(const std::vector &curvePoints, const double xyz_rgb[3][3], float satur, float lumin)
@@ -1608,10 +3067,7 @@ void ColorGradientCurve::SetXYZ(const std::vector &curvePoints, const do
std::unique_ptr tcurve;
if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
- tcurve = std::unique_ptr(new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2));
- }
-
- if (tcurve) {
+ tcurve.reset(new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2));
SetXYZ(tcurve.get(), xyz_rgb, satur, lumin);
}
}
@@ -1644,7 +3100,7 @@ void ColorGradientCurve::SetRGB(const Curve *pCurve)
Color::eInterpolationDirection dir = Color::ID_DOWN;
for (int i = 0; i <= upperBound; ++i) {
- double x = double(i) / double(upperBound);
+ double x = double (i) / double (upperBound);
if (x > nextX) {
++ptNum;
@@ -1658,12 +3114,12 @@ void ColorGradientCurve::SetRGB(const Curve *pCurve)
}
if (!ptNum) {
- Color::hsv2rgb(float(prevY), 1.f, 1.f, r, g, b);
+ Color::hsv2rgb(float (prevY), 1.f, 1.f, r, g, b);
lut1[i] = r;
lut2[i] = g;
lut3[i] = b;
} else if (ptNum >= nPoints) {
- Color::hsv2rgb(float(nextY), 1.f, 1.f, r, g, b);
+ Color::hsv2rgb(float (nextY), 1.f, 1.f, r, g, b);
lut1[i] = r;
lut2[i] = g;
lut3[i] = b;
@@ -1677,29 +3133,21 @@ void ColorGradientCurve::SetRGB(const Curve *pCurve)
Color::hsv2rgb(h2, 1.f, 1.f, ro, go, bo);
#else
float r1, g1, b1, r2, g2, b2, ro, go, bo;
- Color::hsv2rgb(float(prevY), 1., 1., r1, g1, b1);
- Color::hsv2rgb(float(nextY), 1., 1., r2, g2, b2);
+ Color::hsv2rgb(float (prevY), 1., 1., r1, g1, b1);
+ Color::hsv2rgb(float (nextY), 1., 1., r2, g2, b2);
Color::interpolateRGBColor(currY / dY, r1, g1, b1, r2, g2, b2, Color::CHANNEL_LIGHTNESS | Color::CHANNEL_CHROMATICITY | Color::CHANNEL_HUE, xyz_rgb, rgb_xyz, ro, go, bo);
#endif
lut1[i] = ro;
lut2[i] = go;
lut3[i] = bo;
} else {
- Color::hsv2rgb(float(nextY), 1.f, 1.f, r, g, b);
+ Color::hsv2rgb(float (nextY), 1.f, 1.f, r, g, b);
lut1[i] = r;
lut2[i] = g;
lut3[i] = b;
}
}
}
-
- /*
- #ifndef NDEBUG
- lut1.dump("red");
- lut2.dump("green");
- lut3.dump("blue");
- #endif
- */
}
void ColorGradientCurve::SetRGB(const std::vector &curvePoints)
@@ -1707,10 +3155,7 @@ void ColorGradientCurve::SetRGB(const std::vector &curvePoints)
std::unique_ptr tcurve;
if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
- tcurve = std::unique_ptr(new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2));
- }
-
- if (tcurve) {
+ tcurve.reset(new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2));
SetRGB(tcurve.get());
}
}
@@ -1753,18 +3198,18 @@ void PerceptualToneCurve::cubic_spline(const float x[], const float y[], const i
A[i][len - 1] = 6 * (b[i + 1] - b[i]);
}
- for(i = 1; i < len - 2; i++) {
+ for (i = 1; i < len - 2; i++) {
float v = A[i + 1][i] / A[i][i];
- for(j = 1; j <= len - 1; j++) {
+ for (j = 1; j <= len - 1; j++) {
A[i + 1][j] -= v * A[i][j];
}
}
- for(i = len - 2; i > 0; i--) {
+ for (i = len - 2; i > 0; i--) {
float acc = 0;
- for(j = i; j <= len - 2; j++) {
+ for (j = i; j <= len - 2; j++) {
acc += A[i][j] * c[j];
}
@@ -1884,7 +3329,7 @@ float PerceptualToneCurve::calculateToneCurveContrastValue() const
// Note: the analysis is made on the gamma encoded curve, as the LUT is linear we make backwards gamma to
struct find_tc_slope_fun_arg arg = { this };
- float k = find_minimum_interval_halving(find_tc_slope_fun, &arg, 0.1, 5.0, 0.01, 20); // normally found in 8 iterations
+ float k = find_minimum_interval_halving(find_tc_slope_fun, &arg, 0.1, 5.0, 0.01, 20); // normally found in 8 iterations
//fprintf(stderr, "average slope: %f\n", k);
float maxslope = 0;
@@ -1941,7 +3386,7 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float
if (oog_r && oog_g && oog_b) {
continue;
}
-
+
float r = CLIP(rc[i]);
float g = CLIP(gc[i]);
float b = CLIP(bc[i]);
@@ -1964,17 +3409,35 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float
if (ar >= 65535.f && ag >= 65535.f && ab >= 65535.f) {
// clip fast path, will also avoid strange colours of clipped highlights
//rc[i] = gc[i] = bc[i] = 65535.f;
- if (!oog_r) rc[i] = 65535.f;
- if (!oog_g) gc[i] = 65535.f;
- if (!oog_b) bc[i] = 65535.f;
+ if (!oog_r) {
+ rc[i] = 65535.f;
+ }
+
+ if (!oog_g) {
+ gc[i] = 65535.f;
+ }
+
+ if (!oog_b) {
+ bc[i] = 65535.f;
+ }
+
continue;
}
if (ar <= 0.f && ag <= 0.f && ab <= 0.f) {
//rc[i] = gc[i] = bc[i] = 0;
- if (!oog_r) rc[i] = 0.f;
- if (!oog_g) gc[i] = 0.f;
- if (!oog_b) bc[i] = 0.f;
+ if (!oog_r) {
+ rc[i] = 0.f;
+ }
+
+ if (!oog_g) {
+ gc[i] = 0.f;
+ }
+
+ if (!oog_b) {
+ bc[i] = 0.f;
+ }
+
continue;
}
@@ -1997,11 +3460,11 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float
Color::Prophotoxyz(r, g, b, x, y, z);
float J, C, h;
- Ciecam02::xyz2jch_ciecam02float( J, C, h,
- aw, fl,
- x * 0.0015259022f, y * 0.0015259022f, z * 0.0015259022f,
- xw, yw, zw,
- c, nc, pow1, nbb, ncb, cz, d);
+ Ciecam02::xyz2jch_ciecam02float(J, C, h,
+ aw, fl,
+ x * 0.0015259022f, y * 0.0015259022f, z * 0.0015259022f,
+ xw, yw, zw,
+ c, nc, pow1, nbb, ncb, cz, d);
if (!isfinite(J) || !isfinite(C) || !isfinite(h)) {
@@ -2014,9 +3477,18 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float
g = newg;
b = newb;
}
- if (!oog_r) rc[i] = r;
- if (!oog_g) gc[i] = g;
- if (!oog_b) bc[i] = b;
+
+ if (!oog_r) {
+ rc[i] = r;
+ }
+
+ if (!oog_g) {
+ gc[i] = g;
+ }
+
+ if (!oog_b) {
+ bc[i] = b;
+ }
continue;
}
@@ -2108,10 +3580,10 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float
C *= cmul;
- Ciecam02::jch2xyz_ciecam02float( x, y, z,
- J, C, h,
- xw, yw, zw,
- c, nc, pow1, nbb, ncb, fl, cz, d, aw );
+ Ciecam02::jch2xyz_ciecam02float(x, y, z,
+ J, C, h,
+ xw, yw, zw,
+ c, nc, pow1, nbb, ncb, fl, cz, d, aw);
if (!isfinite(x) || !isfinite(y) || !isfinite(z)) {
// can happen for colours on the rim of being outside gamut, that worked without chroma scaling but not with. Then we return only the curve's result.
@@ -2124,9 +3596,17 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float
b = newb;
}
- if (!oog_r) rc[i] = r;
- if (!oog_g) gc[i] = g;
- if (!oog_b) bc[i] = b;
+ if (!oog_r) {
+ rc[i] = r;
+ }
+
+ if (!oog_g) {
+ gc[i] = g;
+ }
+
+ if (!oog_b) {
+ bc[i] = b;
+ }
continue;
}
@@ -2187,9 +3667,18 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float
g = newg;
b = newb;
}
- if (!oog_r) rc[i] = r;
- if (!oog_g) gc[i] = g;
- if (!oog_b) bc[i] = b;
+
+ if (!oog_r) {
+ rc[i] = r;
+ }
+
+ if (!oog_g) {
+ gc[i] = g;
+ }
+
+ if (!oog_b) {
+ bc[i] = b;
+ }
}
}
float PerceptualToneCurve::cf_range[2];
@@ -2212,7 +3701,7 @@ void PerceptualToneCurve::init()
Ciecam02::initcam1float(yb, 1.f, f, la, xw, yw, zw, n, d, nbb, ncb,
cz, aw, wh, pfl, fl, c);
- pow1 = pow_F( 1.64f - pow_F( 0.29f, n ), 0.73f );
+ pow1 = pow_F(1.64f - pow_F(0.29f, n), 0.73f);
{
// init contrast-value-to-chroma-scaling conversion curve
@@ -2280,7 +3769,7 @@ void PerceptualToneCurve::initApplyState(PerceptualToneCurveState & state, const
state.Working2Prophoto[i][j] += prophoto_xyz[i][k] * Work[k][j];
}
- Work = ICCStore::getInstance()->workingSpaceInverseMatrix (workingSpace);
+ Work = ICCStore::getInstance()->workingSpaceInverseMatrix(workingSpace);
memset(state.Prophoto2Working, 0, sizeof(state.Prophoto2Working));
for (int i = 0; i < 3; i++)
diff --git a/rtengine/curves.h b/rtengine/curves.h
index 0fb58cc9e..8800e54db 100644
--- a/rtengine/curves.h
+++ b/rtengine/curves.h
@@ -74,7 +74,8 @@ inline void setUnlessOOG(vfloat &r, vfloat &g, vfloat &b, const vfloat rr, const
bool sanitizeCurve(std::vector& curve);
-namespace curves {
+namespace curves
+{
inline void setLutVal(const LUTf &lut, float &val)
{
@@ -124,33 +125,33 @@ class CurveFactory
protected:
// functions calculating the parameters of the contrast curve based on the desired slope at the center
- static double solve_upper (double m, double c, double deriv);
- static double solve_lower (double m, double c, double deriv);
- static double dupper (const double b, const double m, const double c);
- static double dlower (const double b, const double m, const double c);
+ static double solve_upper(double m, double c, double deriv);
+ static double solve_lower(double m, double c, double deriv);
+ static double dupper(const double b, const double m, const double c);
+ static double dlower(const double b, const double m, const double c);
// basic convex function between (0,0) and (1,1). m1 and m2 controls the slope at the start and end point
- static inline double basel (double x, double m1, double m2)
+ static inline double basel(double x, double m1, double m2)
{
if (x == 0.0) {
return 0.0;
}
- double k = sqrt ((m1 - 1.0) * (m1 - m2) * 0.5) / (1.0 - m2);
+ double k = sqrt((m1 - 1.0) * (m1 - m2) * 0.5) / (1.0 - m2);
double l = (m1 - m2) / (1.0 - m2) + k;
double lx = xlog(x);
return m2 * x + (1.0 - m2) * (2.0 - xexp(k * lx)) * xexp(l * lx);
}
// basic concave function between (0,0) and (1,1). m1 and m2 controls the slope at the start and end point
- static inline double baseu (double x, double m1, double m2)
+ static inline double baseu(double x, double m1, double m2)
{
return 1.0 - basel(1.0 - x, m1, m2);
}
// convex curve between (0,0) and (1,1) with slope m at (0,0). hr controls the highlight recovery
- static inline double cupper (double x, double m, double hr)
+ static inline double cupper(double x, double m, double hr)
{
if (hr > 1.0) {
- return baseu (x, m, 2.0 * (hr - 1.0) / m);
+ return baseu(x, m, 2.0 * (hr - 1.0) / m);
}
double x1 = (1.0 - hr) / m;
@@ -167,12 +168,12 @@ protected:
return 1.0 - hr + hr * baseu((x - x1) / hr, m, 0);
}
// concave curve between (0,0) and (1,1) with slope m at (1,1). sr controls the shadow recovery
- static inline double clower (double x, double m, double sr)
+ static inline double clower(double x, double m, double sr)
{
return 1.0 - cupper(1.0 - x, m, sr);
}
// convex curve between (0,0) and (1,1) with slope m at (0,0). hr controls the highlight recovery
- static inline double cupper2 (double x, double m, double hr)
+ static inline double cupper2(double x, double m, double hr)
{
double x1 = (1.0 - hr) / m;
double x2 = x1 + hr;
@@ -187,7 +188,7 @@ protected:
return 1.0 - hr + hr * baseu((x - x1) / hr, m, 0.3 * hr);
}
- static inline double clower2 (double x, double m, double sr)
+ static inline double clower2(double x, double m, double sr)
{
//curve for b<0; starts with positive slope and then rolls over toward straight line to x=y=1
double x1 = sr / 1.5 + 0.00001;
@@ -201,7 +202,7 @@ protected:
}
// tone curve base. a: slope (from exp.comp.), b: black point normalized by 65535,
// D: max. x value (can be>1), hr,sr: highlight,shadow recovery
- static inline double basecurve (double x, double a, double b, double D, double hr, double sr)
+ static inline double basecurve(double x, double a, double b, double D, double hr, double sr)
{
if (b < 0) {
double m = 0.5;//midpoint
@@ -219,7 +220,7 @@ protected:
double y = a * D > 1.0 ? 0.25 : (m - b / a) * slope;
if (x <= m) {
- return b == 0 ? x * slope : clower (x / m, slope * m / y, sr) * y;
+ return b == 0 ? x * slope : clower(x / m, slope * m / y, sr) * y;
} else if (a * D > 1.0) {
return y + (1.0 - y) * cupper2((x - m) / (D - m), slope * (D - m) / (1.0 - y), hr);
} else {
@@ -227,7 +228,7 @@ protected:
}
}
}
- static inline double simplebasecurve (double x, double b, double sr)
+ static inline double simplebasecurve(double x, double b, double sr)
{
// a = 1, D = 1, hr = 0 (unused for a = D = 1)
if (b == 0.0) {
@@ -248,7 +249,7 @@ protected:
double y = (m - b) * slope;
if (x <= m) {
- return clower (x / m, slope * m / y, sr) * y;
+ return clower(x / m, slope * m / y, sr) * y;
} else {
return y + (x - m) * slope;
}
@@ -281,58 +282,58 @@ public:
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- static inline double centercontrast (double x, double b, double m);
+ static inline double centercontrast(double x, double b, double m);
// standard srgb gamma and its inverse
- static inline double gamma2 (double x)
+ static inline double gamma2(double x)
{
return x <= 0.00304 ? x * 12.92310 : 1.055 * exp(log(x) / sRGBGammaCurve) - 0.055;
}
- static inline double igamma2 (double x)
+ static inline double igamma2(double x)
{
return x <= 0.03928 ? x / 12.92310 : exp(log((x + 0.055) / 1.055) * sRGBGammaCurve);
}
- static inline float gamma2 (float x)
+ static inline float gamma2(float x)
{
return x <= 0.00304f ? x * 12.92310f : 1.055f * expf(logf(x) / static_cast