diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 000000000..6ef54e62a
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,41 @@
+sudo: required
+dist: trusty
+
+language: cpp
+
+compiler:
+ - gcc
+
+os:
+ - linux
+
+branches:
+ only:
+ - master
+
+notifications:
+ irc:
+ channels:
+ - "chat.freenode.net#rawtherapee"
+ template:
+ - "%{repository}/%{branch} (%{commit} - %{author}): %{build_url}: %{message}"
+ email:
+ on_success: change
+ on_failure: always
+
+env:
+ global:
+ - OMP_NUM_THREADS=4
+
+before_install:
+ - sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y
+ - sudo apt-get -qq update
+ - sudo apt-get install build-essential cmake curl g++-6 gcc-6 git libbz2-dev libcanberra-gtk-dev libexiv2-dev libexpat-dev libfftw3-dev libglibmm-2.4-dev libgtk2.0-dev libgtkmm-2.4-dev libiptcdata0-dev libjpeg8-dev liblcms2-dev libpng12-dev libsigc++-2.0-dev libtiff5-dev zlib1g-dev
+ - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-6
+
+before_script:
+ - mkdir build
+ - cd build
+ - cmake -DCMAKE_CXX_FLAGS="-Wno-deprecated-declarations" -DWITH_LTO="OFF" -DPROC_TARGET_NUMBER="2" ..
+
+script: make
diff --git a/clean.sh b/clean.sh
deleted file mode 100755
index 5500bf28e..000000000
--- a/clean.sh
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/sh
-find -name CMakeCache.txt -delete
-rm install_manifest.txt
-
-rm -r ./CMakeFiles
-rm -r ./rtengine/CMakeFiles
-rm -r ./rtexif/CMakeFiles
-rm -r ./rtgui/CMakeFiles
-rm -r ./rtdata/CMakeFiles
-
-rm ./cmake*
-rm ./rtengine/cmake*
-rm ./rtexif/cmake*
-rm ./rtgui/cmake*
-rm ./rtdata/cmake*
-
-rm ./Makefile
-rm ./rtengine/Makefile
-rm ./rtexif/Makefile
-rm ./rtgui/Makefile
-rm ./rtdata/Makefile
-
-rm ./rtengine/librtengine.so
-rm ./rtengine/librtengine.a
-rm ./rtgui/rawtherapee
-rm ./rtexif/librtexif.so
-rm ./rtexif/librtexif.a
-exit 0
diff --git a/rtdata/images/Dark/actions/colorPickers-hide.png b/rtdata/images/Dark/actions/colorPickers-hide.png
new file mode 100644
index 000000000..54b33a7fb
Binary files /dev/null and b/rtdata/images/Dark/actions/colorPickers-hide.png differ
diff --git a/rtdata/images/Dark/actions/colorPickers-show.png b/rtdata/images/Dark/actions/colorPickers-show.png
new file mode 100644
index 000000000..d9d039c2b
Binary files /dev/null and b/rtdata/images/Dark/actions/colorPickers-show.png differ
diff --git a/rtdata/images/Dark/actions/gtk-color-picker-add.png b/rtdata/images/Dark/actions/gtk-color-picker-add.png
new file mode 100644
index 000000000..77a30c250
Binary files /dev/null and b/rtdata/images/Dark/actions/gtk-color-picker-add.png differ
diff --git a/rtdata/images/Dark/actions/spGamutCheck.png b/rtdata/images/Dark/actions/spGamutCheck.png
new file mode 100644
index 000000000..ab812272a
Binary files /dev/null and b/rtdata/images/Dark/actions/spGamutCheck.png differ
diff --git a/rtdata/images/Dark/actions/unchanged-18.png b/rtdata/images/Dark/actions/unchanged-18.png
new file mode 100644
index 000000000..9d08dda26
Binary files /dev/null and b/rtdata/images/Dark/actions/unchanged-18.png differ
diff --git a/rtdata/images/Dark/actions/unchanged-22.png b/rtdata/images/Dark/actions/unchanged-22.png
new file mode 100644
index 000000000..db03d456a
Binary files /dev/null and b/rtdata/images/Dark/actions/unchanged-22.png differ
diff --git a/rtdata/images/Light/actions/colorPickers-hide.png b/rtdata/images/Light/actions/colorPickers-hide.png
new file mode 100644
index 000000000..434087f1c
Binary files /dev/null and b/rtdata/images/Light/actions/colorPickers-hide.png differ
diff --git a/rtdata/images/Light/actions/colorPickers-show.png b/rtdata/images/Light/actions/colorPickers-show.png
new file mode 100644
index 000000000..d93deb3eb
Binary files /dev/null and b/rtdata/images/Light/actions/colorPickers-show.png differ
diff --git a/rtdata/images/Light/actions/gtk-color-picker-add.png b/rtdata/images/Light/actions/gtk-color-picker-add.png
new file mode 100644
index 000000000..01d2b6a0b
Binary files /dev/null and b/rtdata/images/Light/actions/gtk-color-picker-add.png differ
diff --git a/rtdata/images/Light/actions/spGamutCheck.png b/rtdata/images/Light/actions/spGamutCheck.png
new file mode 100644
index 000000000..b1ae3e423
Binary files /dev/null and b/rtdata/images/Light/actions/spGamutCheck.png differ
diff --git a/rtdata/images/Light/actions/unchanged-18.png b/rtdata/images/Light/actions/unchanged-18.png
new file mode 100644
index 000000000..9d08dda26
Binary files /dev/null and b/rtdata/images/Light/actions/unchanged-18.png differ
diff --git a/rtdata/images/Light/actions/unchanged-22.png b/rtdata/images/Light/actions/unchanged-22.png
new file mode 100644
index 000000000..db03d456a
Binary files /dev/null and b/rtdata/images/Light/actions/unchanged-22.png differ
diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala
index d54566400..f73df46a7 100644
--- a/rtdata/languages/Catala
+++ b/rtdata/languages/Catala
@@ -1306,6 +1306,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: -
!HISTORY_MSG_440;CbDL - Method
!HISTORY_MSG_441;Retinex - Gain transmission
!HISTORY_MSG_442;Retinex - Scale
+!HISTORY_MSG_443;Output Black Point Compensation
!HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
!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
@@ -1380,7 +1381,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: -
!PREFERENCES_FLUOF2;Fluorescent F2
!PREFERENCES_FLUOF7;Fluorescent F7
!PREFERENCES_FLUOF11;Fluorescent F11
-!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Editor's panel and the File Browser
+!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser
!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser.
!PREFERENCES_GREY;Output device's Yb luminance (%)
!PREFERENCES_GREY05;Yb=05 CIE L#30
@@ -1406,6 +1407,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: -
!PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders
!PREFERENCES_MED;Medium (Tile/2)
!PREFERENCES_MIN;Mini (100x115)
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
!PREFERENCES_MONINTENT;Default monitor intent
!PREFERENCES_MONPROFILE;Default monitor profile
!PREFERENCES_NAVGUIDEBRUSH;Navigator guide color
@@ -1423,6 +1425,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: -
!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_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels
!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements.
+!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings
!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files
!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation.
@@ -1449,6 +1452,9 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: -
!PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added
!SAVEDLG_FORCEFORMATOPTS;Force saving options
!SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling.
+!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
+!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
!TP_BWMIX_ALGO;Algorithm OYCPM
!TP_BWMIX_ALGO_LI;Linear
!TP_BWMIX_ALGO_SP;Special effects
@@ -1644,7 +1650,6 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: -
!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma
!TP_DIRPYRDENOISE_CURVEEDITOR_CC_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_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise
-!TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Can be used on raw and non-raw images.\n\nFor non-raw images noise reduction of luminance depends on the gamma of the input color profile. An sRGB gamma is assumed, thus if the image uses an input color profile of a different gamma, the effects of luminance noise reduction will differ.
!TP_DIRPYRDENOISE_ENH;Enhanced mode
!TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase.
!TP_DIRPYRDENOISE_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.
@@ -1655,13 +1660,11 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: -
!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal)
!TP_DIRPYRDENOISE_LTYPE;Luminance control
!TP_DIRPYRDENOISE_LUMAFR;Luminance
-!TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail
!TP_DIRPYRDENOISE_MAN;Manual
!TP_DIRPYRDENOISE_MANU;Manual
!TP_DIRPYRDENOISE_MED;Median Filter
!TP_DIRPYRDENOISE_MEDMETHOD;Median method
!TP_DIRPYRDENOISE_MEDTYPE;Median type
-!TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising
!TP_DIRPYRDENOISE_METHOD;Method
!TP_DIRPYRDENOISE_METHOD11;Quality
!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time.
@@ -1724,6 +1727,8 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: -
!TP_ICM_APPLYHUESATMAP_TOOLTIP;Employ the embedded DCP base table (HueSatMap). The setting is only enabled 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 enabled if the selected DCP has one.
+!TP_ICM_BPC;Black Point Compensation
+!TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
!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 enabled if a Dual-Illuminant DCP with interpolation support is selected.
@@ -1858,7 +1863,6 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: -
!TP_RGBCURVES_LUMAMODE_TOOLTIP;Luminosity mode allows to vary the contribution of R, G and B channels to the luminosity of the image, without altering image color.
!TP_SAVEDIALOG_OK_TIP;Shortcut: Ctrl-Enter
!TP_SHADOWSHLIGHTS_SHARPMASK;Sharp mask
-!TP_SHARPENING_TOOLTIP;Expect a slightly different effect when using with CIECAM02. If difference is observed, adjust to taste.
!TP_WAVELET_1;Level 1
!TP_WAVELET_2;Level 2
!TP_WAVELET_3;Level 3
diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified)
index 9b6385249..72753272c 100644
--- a/rtdata/languages/Chinese (Simplified)
+++ b/rtdata/languages/Chinese (Simplified)
@@ -1223,6 +1223,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: -
!HISTORY_MSG_440;CbDL - Method
!HISTORY_MSG_441;Retinex - Gain transmission
!HISTORY_MSG_442;Retinex - Scale
+!HISTORY_MSG_443;Output Black Point Compensation
!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).
@@ -1318,7 +1319,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: -
!PREFERENCES_FLUOF2;Fluorescent F2
!PREFERENCES_FLUOF7;Fluorescent F7
!PREFERENCES_FLUOF11;Fluorescent F11
-!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Editor's panel and the File Browser
+!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser
!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser.
!PREFERENCES_GREY;Output device's Yb luminance (%)
!PREFERENCES_GREY05;Yb=05 CIE L#30
@@ -1353,6 +1354,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: -
!PREFERENCES_MENUOPTIONS;Context Menu Options
!PREFERENCES_METADATA;Metadata
!PREFERENCES_MIN;Mini (100x115)
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
!PREFERENCES_MONINTENT;Default monitor intent
!PREFERENCES_MONPROFILE;Default monitor profile
!PREFERENCES_MULTITAB;Multiple Editor Tabs Mode
@@ -1375,7 +1377,8 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: -
!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_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels
!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements.
-!PREFERENCES_SELECTFONT;Select font
+!PREFERENCES_SELECTFONT;Select global font
+!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings
!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files
!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation.
@@ -1417,6 +1420,8 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: -
!PROGRESSDLG_PROFILECHANGEDINBROWSER;Processing profile changed in browser
!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;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
!THRESHOLDSELECTOR_B;Bottom
!THRESHOLDSELECTOR_BL;Bottom-left
!THRESHOLDSELECTOR_BR;Bottom-right
@@ -1424,6 +1429,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: -
!THRESHOLDSELECTOR_T;Top
!THRESHOLDSELECTOR_TL;Top-left
!THRESHOLDSELECTOR_TR;Top-right
+!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
!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_AUTOCH_TIP;Calculate values optimizing Channel Mixer.
@@ -1579,7 +1585,6 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: -
!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma
!TP_DIRPYRDENOISE_CURVEEDITOR_CC_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_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise
-!TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Can be used on raw and non-raw images.\n\nFor non-raw images noise reduction of luminance depends on the gamma of the input color profile. An sRGB gamma is assumed, thus if the image uses an input color profile of a different gamma, the effects of luminance noise reduction will differ.
!TP_DIRPYRDENOISE_ENH;Enhanced mode
!TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase.
!TP_DIRPYRDENOISE_GAMMA;Gamma
@@ -1591,13 +1596,11 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: -
!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal)
!TP_DIRPYRDENOISE_LTYPE;Luminance control
!TP_DIRPYRDENOISE_LUMAFR;Luminance
-!TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail
!TP_DIRPYRDENOISE_MAN;Manual
!TP_DIRPYRDENOISE_MANU;Manual
!TP_DIRPYRDENOISE_MED;Median Filter
!TP_DIRPYRDENOISE_MEDMETHOD;Median method
!TP_DIRPYRDENOISE_MEDTYPE;Median type
-!TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising
!TP_DIRPYRDENOISE_METHOD;Method
!TP_DIRPYRDENOISE_METHOD11;Quality
!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time.
@@ -1660,6 +1663,8 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: -
!TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is only enabled if the selected DCP has one.
!TP_ICM_BLENDCMSMATRIX;Blend ICC highlights with matrix
!TP_ICM_BLENDCMSMATRIX_TOOLTIP;Enable to recover clipped highlights when using LUT-based ICC profiles.
+!TP_ICM_BPC;Black Point Compensation
+!TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
!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 enabled if a Dual-Illuminant DCP with interpolation support is selected.
@@ -1824,7 +1829,6 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: -
!TP_RETINEX_VIEW_TRAN;Transmission - Auto
!TP_RETINEX_VIEW_TRAN2;Transmission - Fixed
!TP_RETINEX_VIEW_UNSHARP;Unsharp mask
-!TP_SHARPENING_TOOLTIP;Expect a slightly different effect when using with CIECAM02. If difference is observed, adjust to taste.
!TP_SHARPENMICRO_LABEL;Microcontrast
!TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5
!TP_SHARPENMICRO_UNIFORMITY;Uniformity
diff --git a/rtdata/languages/Chinese (Traditional) b/rtdata/languages/Chinese (Traditional)
index c797a80d8..a8101c373 100644
--- a/rtdata/languages/Chinese (Traditional)
+++ b/rtdata/languages/Chinese (Traditional)
@@ -958,6 +958,7 @@ TP_WBALANCE_TEMPERATURE;色溫
!HISTORY_MSG_440;CbDL - Method
!HISTORY_MSG_441;Retinex - Gain transmission
!HISTORY_MSG_442;Retinex - Scale
+!HISTORY_MSG_443;Output Black Point Compensation
!HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!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
@@ -1124,7 +1125,7 @@ TP_WBALANCE_TEMPERATURE;色溫
!PREFERENCES_FLUOF2;Fluorescent F2
!PREFERENCES_FLUOF7;Fluorescent F7
!PREFERENCES_FLUOF11;Fluorescent F11
-!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Editor's panel and the File Browser
+!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser
!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser.
!PREFERENCES_GREY;Output device's Yb luminance (%)
!PREFERENCES_GREY05;Yb=05 CIE L#30
@@ -1160,6 +1161,7 @@ TP_WBALANCE_TEMPERATURE;色溫
!PREFERENCES_MENUOPTIONS;Context Menu Options
!PREFERENCES_METADATA;Metadata
!PREFERENCES_MIN;Mini (100x115)
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
!PREFERENCES_MONINTENT;Default monitor intent
!PREFERENCES_MONPROFILE;Default monitor profile
!PREFERENCES_MULTITAB;Multiple Editor Tabs Mode
@@ -1183,7 +1185,8 @@ TP_WBALANCE_TEMPERATURE;色溫
!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_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels
!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements.
-!PREFERENCES_SELECTFONT;Select font
+!PREFERENCES_SELECTFONT;Select global font
+!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings
!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files
!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation.
@@ -1240,6 +1243,8 @@ TP_WBALANCE_TEMPERATURE;色溫
!SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF
!SAVEDLG_WARNFILENAME;File will be named
!SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders.
+!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
!THRESHOLDSELECTOR_B;Bottom
!THRESHOLDSELECTOR_BL;Bottom-left
!THRESHOLDSELECTOR_BR;Bottom-right
@@ -1247,6 +1252,7 @@ TP_WBALANCE_TEMPERATURE;色溫
!THRESHOLDSELECTOR_T;Top
!THRESHOLDSELECTOR_TL;Top-left
!THRESHOLDSELECTOR_TR;Top-right
+!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
!TP_BWMIX_ALGO;Algorithm OYCPM
!TP_BWMIX_ALGO_LI;Linear
!TP_BWMIX_ALGO_SP;Special effects
@@ -1453,7 +1459,6 @@ TP_WBALANCE_TEMPERATURE;色溫
!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma
!TP_DIRPYRDENOISE_CURVEEDITOR_CC_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_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise
-!TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Can be used on raw and non-raw images.\n\nFor non-raw images noise reduction of luminance depends on the gamma of the input color profile. An sRGB gamma is assumed, thus if the image uses an input color profile of a different gamma, the effects of luminance noise reduction will differ.
!TP_DIRPYRDENOISE_ENH;Enhanced mode
!TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase.
!TP_DIRPYRDENOISE_GAMMA;Gamma
@@ -1468,13 +1473,11 @@ TP_WBALANCE_TEMPERATURE;色溫
!TP_DIRPYRDENOISE_LTYPE;Luminance control
!TP_DIRPYRDENOISE_LUMA;Luminance
!TP_DIRPYRDENOISE_LUMAFR;Luminance
-!TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail
!TP_DIRPYRDENOISE_MAN;Manual
!TP_DIRPYRDENOISE_MANU;Manual
!TP_DIRPYRDENOISE_MED;Median Filter
!TP_DIRPYRDENOISE_MEDMETHOD;Median method
!TP_DIRPYRDENOISE_MEDTYPE;Median type
-!TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising
!TP_DIRPYRDENOISE_METHOD;Method
!TP_DIRPYRDENOISE_METHOD11;Quality
!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time.
@@ -1584,6 +1587,8 @@ TP_WBALANCE_TEMPERATURE;色溫
!TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is only enabled if the selected DCP has one.
!TP_ICM_BLENDCMSMATRIX;Blend ICC highlights with matrix
!TP_ICM_BLENDCMSMATRIX_TOOLTIP;Enable to recover clipped highlights when using LUT-based ICC profiles.
+!TP_ICM_BPC;Black Point Compensation
+!TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
!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 enabled if a Dual-Illuminant DCP with interpolation support is selected.
@@ -1799,7 +1804,6 @@ TP_WBALANCE_TEMPERATURE;色溫
!TP_SHARPENEDGE_LABEL;Edges
!TP_SHARPENEDGE_PASSES;Iterations
!TP_SHARPENEDGE_THREE;Luminance only
-!TP_SHARPENING_TOOLTIP;Expect a slightly different effect when using with CIECAM02. If difference is observed, adjust to taste.
!TP_SHARPENMICRO_AMOUNT;Quantity
!TP_SHARPENMICRO_LABEL;Microcontrast
!TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5
diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech
index f3142f30d..015dc1a7d 100644
--- a/rtdata/languages/Czech
+++ b/rtdata/languages/Czech
@@ -33,7 +33,8 @@
#32 2014-10-24 updated by mkyral
#33 2015-02-22 updated by mkyral
#34 2015-07-09 updated by mkyral
-#38 2015-11-24 updated by mkyral
+#35 2015-11-24 updated by mkyral
+#36 2016-10-18 updated by mkyral
ABOUT_TAB_BUILD;Verze
ABOUT_TAB_CREDITS;Zásluhy
@@ -203,6 +204,7 @@ 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 nesmazané obrázky.
+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říponve Volby > 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
FILEBROWSER_SHOWRANK3HINT;Ukázat obrázky hodnocené třemi hvězdičkami.\nZkratka: 3
@@ -231,6 +233,7 @@ FILECHOOSER_FILTER_SAME;Stejný formát jako aktuální fotka
FILECHOOSER_FILTER_TIFF;Soubory TIFF
GENERAL_ABOUT;O programu
GENERAL_AFTER;Poté
+GENERAL_APPLY;Použít
GENERAL_ASIMAGE;Jako obrázek
GENERAL_AUTO;Automaticky
GENERAL_BEFORE;Před
@@ -246,6 +249,7 @@ GENERAL_NA;n/a
GENERAL_NO;Ne
GENERAL_NONE;Nic
GENERAL_OK;OK
+GENERAL_OPEN;Otevřít
GENERAL_PORTRAIT;Na výšku
GENERAL_SAVE;Uložit
GENERAL_UNCHANGED;(Beze změny)
@@ -289,8 +293,8 @@ HISTORY_MSG_23;Doostření - Práh
HISTORY_MSG_24;Doostření - Pouze okraje
HISTORY_MSG_25;Doostření - Poloměr detekce okrajů
HISTORY_MSG_26;Doostření - Tolerance okrajů
-HISTORY_MSG_27;Doostření - Omezení haló art.
-HISTORY_MSG_28;Doostření - Míra omezení haló art.
+HISTORY_MSG_27;Doostření - Omezení halo efektu
+HISTORY_MSG_28;Doostření - Míra omezení halo efektu
HISTORY_MSG_29;Doostření - Metoda
HISTORY_MSG_30;RLD - Poloměr
HISTORY_MSG_31;RLD - Míra
@@ -428,6 +432,7 @@ HISTORY_MSG_162;Mapování tónů
HISTORY_MSG_163;RGB křivky - Červená
HISTORY_MSG_164;RGB křivky - Zelená
HISTORY_MSG_165;RGB křivky - Modrá
+HISTORY_MSG_166;Expozice - Obnovení
HISTORY_MSG_167;Metoda demozajkování
HISTORY_MSG_168;L*a*b* - CC křivka
HISTORY_MSG_169;L*a*b* - CH Křivka
@@ -627,7 +632,7 @@ HISTORY_MSG_363;Vlnka - Zůstatek - Síla komprese
HISTORY_MSG_364;Vlnka - Dokončení - Vyrovnání kontrastu
HISTORY_MSG_365;Vlnka - Dokončení - Vyvážení rozdílů
HISTORY_MSG_366;Vlnka - Zůstatek - Gama komprese
-HISTORY_MSG_367;Vlnka - DH - Křivka místního kontrastu
+HISTORY_MSG_367;Vlnka - Finální "Po" křivka kontrastu
HISTORY_MSG_368;Vlnka - Dokončení - Vyrovnání kontrastu
HISTORY_MSG_369;Vlnka - Dokončení - Metoda vyvážení
HISTORY_MSG_370;Vlnka - Dokončení - Křivka místního kontrastu
@@ -638,8 +643,8 @@ HISTORY_MSG_374;Doostření MR - Práh
HISTORY_MSG_375;Doostření MR - Pouze hrany
HISTORY_MSG_376;Doostření MR- Poloměr detekce hran
HISTORY_MSG_377;Doostření MR - Tolerance hran
-HISTORY_MSG_378;Doostření MR - Omezení haló art.
-HISTORY_MSG_379;Doostření MR - Míra omezení haló art.
+HISTORY_MSG_378;Doostření MR - Omezení halo efektu
+HISTORY_MSG_379;Doostření MR - Míra omezení halo efektu
HISTORY_MSG_380;Doostření - Metoda
HISTORY_MSG_381;Doostření RDL - Poloměr
HISTORY_MSG_382;Doostření RDL - Míra
@@ -668,14 +673,14 @@ HISTORY_MSG_404;Vlnka - DH - Základní zesílení
HISTORY_MSG_405;Vlnka - Odšumění - Úroveň 4
HISTORY_MSG_406;Vlnka - DH - Sousední pixely
HISTORY_MSG_407;Retinex - Metoda
-HISTORY_MSG_408;Retinex - Sousední
-HISTORY_MSG_409;Retinex - Zisk
+HISTORY_MSG_408;Retinex - Poloměr
+HISTORY_MSG_409;Retinex - Kontrast
HISTORY_MSG_410;Retinex - Posun
HISTORY_MSG_411;Retinex - Síla
-HISTORY_MSG_412;Retinex - Míra
-HISTORY_MSG_413;Retinex - odchylka
+HISTORY_MSG_412;Retinex - Gaussův gradient
+HISTORY_MSG_413;Retinex - Kontrast
HISTORY_MSG_414;Retinex - Histogram - Lab
-HISTORY_MSG_415;Retinex - přenos
+HISTORY_MSG_415;Retinex - Přenos
HISTORY_MSG_416;Retinex
HISTORY_MSG_417;Retinex - Medián přenosu
HISTORY_MSG_418;Retinex - Práh
@@ -685,8 +690,25 @@ HISTORY_MSG_421;Retinex - Gama
HISTORY_MSG_422;Retinex - Gama
HISTORY_MSG_423;Retinex - Sklon gamy
HISTORY_MSG_424;Retinex - Práh zachování jasů
-HISTORY_MSG_425;Retinex - Základní log
+HISTORY_MSG_425;Retinex - Základ log.
HISTORY_MSG_426;Retinex - Korekce odstínu
+HISTORY_MSG_427;Výstupní záměr reprodukce
+HISTORY_MSG_428;Záměr reprodukce monitoru
+HISTORY_MSG_429;Retinex - Průchody
+HISTORY_MSG_430;Retinex - Přenos gradientu
+HISTORY_MSG_431;Retinex - Síla gradientu
+HISTORY_MSG_432;Retinex - M - Světla
+HISTORY_MSG_433;Retinex - M - Světla tóny
+HISTORY_MSG_434;Retinex - M - Stíny
+HISTORY_MSG_435;Retinex - M - Stíny tóny
+HISTORY_MSG_436;Retinex - M - poloměr
+HISTORY_MSG_437;Retinex - M - Metoda
+HISTORY_MSG_438;Retinex - M - Korekce
+HISTORY_MSG_439;Retinex - Zpracování
+HISTORY_MSG_440;Metoda KdDÚ
+HISTORY_MSG_441;Retinex - Přenos zisku
+HISTORY_MSG_442;Retinex - Měřítko
+HISTORY_MSG_443;Kompenzace výstupního černého bodu
HISTORY_NEWSNAPSHOT;Přidat
HISTORY_NEWSNAPSHOT_TOOLTIP;Zkratka: Alt-s
HISTORY_SNAPSHOT;Snímek
@@ -739,6 +761,7 @@ MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronizovat prohlížeč souborů s editorem pro
MAIN_BUTTON_PREFERENCES;Volby
MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Vložit současný obrázek do fronty zpracování.\nZkratka: Ctrl+b
MAIN_BUTTON_SAVE_TOOLTIP;Uložit současný obrázek.\nZkratka: Ctrl+s
+MAIN_BUTTON_SENDTOEDITOR;Upravit obrázek v externím editoru
MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Editovat současný obrázek v externím editoru.\nZkratka: Ctrl+e
MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Zobrazit/skrýt všechny postranní panely.\nZkratka: m
MAIN_BUTTON_UNFULLSCREEN;Ukončit mód celé obrazovky
@@ -803,6 +826,7 @@ MAIN_TOOLTIP_SHOWHIDERP1;Zobrazit/skrýt pravý panel.\nZkratka: Alt-l
MAIN_TOOLTIP_SHOWHIDETP1;Zobrazit/skrýt horní panel.\nZkratka: Shift-l
MAIN_TOOLTIP_THRESHOLD;Práh
MAIN_TOOLTIP_TOGGLE;Přepnout pohled Před a Po.\nZkratka: Shift-b
+MONITOR_PROFILE_SYSTEM;Nastavení systému
NAVIGATOR_B;B:
NAVIGATOR_G;G:
NAVIGATOR_H;H:
@@ -862,6 +886,7 @@ PARTIALPASTE_PREPROCESS_DEADPIXFILT;Filtr mrtvých pixelů
PARTIALPASTE_PREPROCESS_GREENEQUIL;Vyrovnání zelené
PARTIALPASTE_PREPROCESS_HOTPIXFILT;Filtr vypálených pixelů
PARTIALPASTE_PREPROCESS_LINEDENOISE;Filtrovat linkové rušení
+PARTIALPASTE_PRSHARPENING;Doostření po změně velikosti
PARTIALPASTE_RAWCACORR_AUTO;Automatická korekce CA
PARTIALPASTE_RAWCACORR_CABLUE;CA modrá
PARTIALPASTE_RAWCACORR_CARED;CA červená
@@ -1010,6 +1035,9 @@ PREFERENCES_MENUGROUPRANK;Skupina "Hodnocení"
PREFERENCES_MENUOPTIONS;Volby místní nabídky
PREFERENCES_METADATA;Metadata
PREFERENCES_MIN;Velmi malá (100x115)
+PREFERENCES_MONBPC;Kompenzace černého bodu pro L*a*b*->Přizpůsobení pro monitor
+PREFERENCES_MONINTENT;Výchozí záměr monitoru
+PREFERENCES_MONPROFILE;Výchozí profil monitoru
PREFERENCES_MULTITAB;Mód více karet editoru
PREFERENCES_MULTITABDUALMON;Mód více karet editoru ve vlastním okně
PREFERENCES_NAVGUIDEBRUSH;Barva vodítek navigátoru
@@ -1024,10 +1052,12 @@ PREFERENCES_OVERLAY_FILENAMES;Překrýt jména souborů na náhledech v prohlí
PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Překrýt jména souborů na náhledech v editoru
PREFERENCES_OVERWRITEOUTPUTFILE;Přepsat existující soubory
PREFERENCES_PANFACTORLABEL;Zrychlení posunu výřezu
-PREFERENCES_PARSEDEXT;Zachytávané přípony
+PREFERENCES_PARSEDEXT;Analyzované přípony
PREFERENCES_PARSEDEXTADD;Přidat příponu
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_PREVDEMO;Metoda demozajkování náhledu
PREFERENCES_PREVDEMO_FAST;Rychlá
PREFERENCES_PREVDEMO_LABEL;Metoda demozajkování pro náhled při přiblížení menším než 100%:
@@ -1038,13 +1068,15 @@ PREFERENCES_PROFILEPRCACHE;Profil v mezipaměti
PREFERENCES_PROFILEPRFILE;Profil uložený se zdrojovým souborem
PREFERENCES_PROFILESAVECACHE;Ukládat parametry zpracování do mezipaměti
PREFERENCES_PROFILESAVEINPUT;Ukládat parametry zpracování spolu se zdrojovým souborem
+PREFERENCES_PROFILE_NONE;Nic
PREFERENCES_PROPERTY;Vlastnost
PREFERENCES_PSPATH;Instalační složka Adobe Photoshop
PREFERENCES_REMEMBERZOOMPAN;Zapamatovat si procento přiblížení a posun obrázku
PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Zapamatovat si procento přiblížení a posun aktuálního obrázku a použít tyto hodnoty při otevírání nového obrázku.\n\nTato volba funguje pouze v režimu "Mód jedné karty editoru" a volba "Metoda demozajkování pro náhled při přiblížení menším než 100%" je nastavena na "Stejně jako v PP3".
PREFERENCES_RGBDTL_LABEL;Maximální počet vláken pro redukci šumu a úrovně vlnky
PREFERENCES_RGBDTL_TOOLTIP;Pro automatické nastavení maximálního možného počtu vláken ponechte nastaveno na "0". Čím více vláken běží paralelně, tím rychlejší je výpočet. Paměťové nároky najdete na RawPedii.
-PREFERENCES_SELECTFONT;Vybrat písmo
+PREFERENCES_SELECTFONT;Vyberte globální písmo
+PREFERENCES_SELECTFONT_COLPICKER;Vybrat písmo pro Průzkumníka barev
PREFERENCES_SELECTLANG;Volba jazyka
PREFERENCES_SELECTTHEME;Zvolit vzhled
PREFERENCES_SERIALIZE_TIFF_READ;Nastavení čtení Tiff
@@ -1140,6 +1172,8 @@ SAVEDLG_SUBSAMP_TOOLTIP;Nejlepší komprese:\nJ:a:b 4:2:0\nh/v 2/2\nO polovinu s
SAVEDLG_TIFFUNCOMPRESSED;Nekomprimovaný TIFF
SAVEDLG_WARNFILENAME;Soubor bude pojmenován
SHCSELECTOR_TOOLTIP;Klikněte pravým tlačítkem myši pro obnovení výchozí pozice těchto tří posuvníků.
+SOFTPROOF_GAMUTCHECK_TOOLTIP;Pokud je aktivní, indikuje šedou barvou pixely, které se dostaly mimo paletu výstupního profilu.
+SOFTPROOF_TOOLTIP;Jemně korekční\nPokud je aktivní. můžete simulovat vykreslení generované výstupním profilem nástroje ICM. Velmi užitečné pro simulaci tiskových výstupů.
THRESHOLDSELECTOR_B;Dole
THRESHOLDSELECTOR_BL;Dole vlevo
THRESHOLDSELECTOR_BR;Dole vpravo
@@ -1147,8 +1181,9 @@ 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 povolen:\nPřidáte průzkumníka barev kliknutím levým tlačítkem myši do náhledu\nPodržením levého tlačítka myši a tažením průzkumníka přesunete\nPokud na průzkumníka kliknete pravým tlačítkem, dojde k jeho smazání\nSmazání všech průzkumníků po stisknutí klávesy Shift a pravého tlačítka myši\nKliknutím pravým tlačítkem kdekoli mimo průzkumníka přepne zpět na nástroj posunu
TOOLBAR_TOOLTIP_CROP;Oříznutí výběru.\nZkratka: c\nOblast výřezu posunete pomocí Shift + tažení myši
-TOOLBAR_TOOLTIP_HAND;Nástroj ruka.\nZkratka: h
+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.
TOOLBAR_TOOLTIP_WB;Bodové vyvážení bílé.\nZkratka: w
TP_BWMIX_ALGO;Algoritmus OYCPM
@@ -1214,6 +1249,10 @@ TP_BWMIX_VAL;L
TP_CACORRECTION_BLUE;Modrá
TP_CACORRECTION_LABEL;Korekce chromatické aberace
TP_CACORRECTION_RED;Červená
+TP_CBDL_AFT;Po černobílé
+TP_CBDL_BEF;Před černobílou
+TP_CBDL_METHOD;Umístění procesu
+TP_CBDL_METHOD_TOOLTIP;Vyberte, zda bude nástroj Kontrast dle detailu úrovní po nástroji Černobílá, což znamená, že bude pracovat v prostoru L*a*b, nebo před ním, což znamená, že bude pracovat v RGB prostoru.
TP_CHMIXER_BLUE;Modrý kanál
TP_CHMIXER_GREEN;Zelený kanál
TP_CHMIXER_LABEL;Míchání kanálů
@@ -1235,7 +1274,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 = Gaussový.\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 = Gaussovo.\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_CHROMA;Barevnost (C)
@@ -1354,6 +1393,12 @@ TP_DARKFRAME_LABEL;Tmavý snímek
TP_DEFRINGE_LABEL;Odstranění lemu
TP_DEFRINGE_RADIUS;Poloměr
TP_DEFRINGE_THRESHOLD;Práh
+TP_DIRPYRDENOISE_3X3;3×3
+TP_DIRPYRDENOISE_3X3_SOFT;3×3 jemný
+TP_DIRPYRDENOISE_5X5;5×5
+TP_DIRPYRDENOISE_5X5_SOFT;5×5 jemný
+TP_DIRPYRDENOISE_7X7;7×7
+TP_DIRPYRDENOISE_9X9;9×9
TP_DIRPYRDENOISE_ABM;Pouze barevnost
TP_DIRPYRDENOISE_AUT;Automatická celková
TP_DIRPYRDENOISE_AUTO;Automatická celková
@@ -1369,7 +1414,6 @@ TP_DIRPYRDENOISE_CUR;Křivka
TP_DIRPYRDENOISE_CURVEEDITOR_CC;Barevnost
TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Zvýší (násobí) hodnoty všech barevných posuvníků.\nKřivka vám umožní nastavit sílu redukce barevného šumu jako funkci barvy. Například pro zvýšení účinku v oblastech s nízkým nasycení a snížení v oblastech s vysokým nasycením.
TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Moduluje akci 'jasového' odstranění šumu
-TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Může být použito jak pro raw tak i pro ostatní obrázky.\n\nPokud je použito pro ostatní obrázky, závisí redukce šumu dle jasu na gamě vstupního barevného profilu. Předpokládá se sRGB gama a proto se může výsledek u obrázků s rozdílnou gamou barevného profilu lišit.
TP_DIRPYRDENOISE_ENH;Vylepšený režim
TP_DIRPYRDENOISE_ENH_TOOLTIP;Zvýší kvalitu odstranění šumu, ale zároveň prodlouží dobu zpracování o 20%.
TP_DIRPYRDENOISE_GAMMA;Gama
@@ -1384,22 +1428,22 @@ TP_DIRPYRDENOISE_LPLABM;Vyvážená L* (trochu) + a*b* (normální)
TP_DIRPYRDENOISE_LTYPE;Ovládání jasu
TP_DIRPYRDENOISE_LUMA;Jas
TP_DIRPYRDENOISE_LUMAFR;Jas
-TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Vlnková transformace na svítivost a Fourierova transformace pro detail svítivosti
TP_DIRPYRDENOISE_MAN;Ručně
TP_DIRPYRDENOISE_MANU;Ručně
TP_DIRPYRDENOISE_MED;Filtr medián
TP_DIRPYRDENOISE_MEDMETHOD;Metoda mediánu
TP_DIRPYRDENOISE_MEDTYPE;Typ mediánu
-TP_DIRPYRDENOISE_MED_TOOLTIP;Povolit odstranění šumu Medián
TP_DIRPYRDENOISE_METHOD;Metoda
TP_DIRPYRDENOISE_METHOD11;Kvalita
TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Kvalita může být přizpůsobena vzoru šumu. Nastavení "Vysoká" vylepší efekt redukce šumu za cenu navýšení času zpracování.
TP_DIRPYRDENOISE_METHOD_TOOLTIP;Pro raw obrázky může být použita jak RGB tak i L*a*b* metoda.\n\nPro ostatní obrázky bude vždy použita metoda L*a*b* bez ohledu na výběr.
TP_DIRPYRDENOISE_METM_TOOLTIP;Pokud je použito 'Pouze Jas' a 'L*a*b*' metody, bude při odstranění šumu použit filtr medián hned po vlnkové transformaci.\nPokud je použit "RGB" mód, bude filtr použit až na úplný závěr procesu redukce šumu.
+TP_DIRPYRDENOISE_MET_TOOLTIP;Aplikuje filtr medián požadované velikosti okna. Čím větší velikost okna, tím déle bude zpracování trvat.\n\n3×3 jemný: upraví 5 pixelů v okně 3x3 pixely.\n3×3: upraví 9 pixelů v okně 3x3 pixely.\n5×5 jemný; upraví 13 pixelů v okně 5x5 pixelů.\n5×5: upraví 25 pixelů v okně 5x5 pixelů.\n7×7: upraví 49 pixelů v okně 7x7 pixelů.\n9×9: upraví 81 pixelů v okně 9x9 pixelů.\n\nV některých případech může být větší kvality dosaženo pomocí několika průběhů s menšími okny než jedním průběhem s velkým oknem.
TP_DIRPYRDENOISE_NOISELABEL;Náhled šumu: Průměr=%1 Výšky=%2
TP_DIRPYRDENOISE_NOISELABELEMPTY;Náhled šumu: Průměr= - Výšky= -
TP_DIRPYRDENOISE_NRESID_TOOLTIP;Zobrazuje zbývající úroveň zašumění části obrázku viditelného v náhledu po vlnkové transformaci.\n\n>300 Hodně šumu\n100-300 Šum\n50-100 Málo šumu\n<50 Velmi málo šumu\n\nUpozornění: hodnoty RGB a L*a*b* režimu se budou lišit. Protože v RGB režimu nedochází ke kompletnímu oddělení jasu a barev jsou RGB hodnoty jméně přesné
TP_DIRPYRDENOISE_PASSES;Počet průchodů mediánu
+TP_DIRPYRDENOISE_PASSES_TOOLTIP;Aplikování tří průchodů filtru medián s oknem 3×3 často vede k lepšímu výsledku než jednou aplikovaný filtr medián s oknem 7×7.
TP_DIRPYRDENOISE_PON;Více zónová automatika
TP_DIRPYRDENOISE_PRE;Více zónový náhled
TP_DIRPYRDENOISE_PREV;Náhled
@@ -1464,6 +1508,7 @@ TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Běžný vážený
TP_EXPOS_BLACKPOINT_LABEL;Raw černé body
TP_EXPOS_WHITEPOINT_LABEL;Raw bílé body
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
TP_FILMSIMULATION_ZEROCLUTSFOUND;Nastavte složku HaldCLUT v nastaveních
TP_FLATFIELD_AUTOSELECT;Automatický výběr
@@ -1513,6 +1558,8 @@ TP_ICM_APPLYLOOKTABLE;Tabulka vzhledu
TP_ICM_APPLYLOOKTABLE_TOOLTIP;Použije vloženou DCP tabulku vzhledu. Nastavení je dostupné pouze pokud ji vybrané DCP obsahuje.
TP_ICM_BLENDCMSMATRIX;Smísení ICC světel s matici
TP_ICM_BLENDCMSMATRIX_TOOLTIP;Povolit obnovení vypálených jasů při použití ICC profilů založených na LUT.
+TP_ICM_BPC;Kompenzace černého bodu
+TP_ICM_BPC_TOOLTIP;Povolte pokud chcete, aby se kanál svítivosti vešel do výstupního barevného prostoru s pevným bílým bodem
TP_ICM_DCPILLUMINANT;Osvětlení
TP_ICM_DCPILLUMINANT_INTERPOLATED;Interpolované
TP_ICM_DCPILLUMINANT_TOOLTIP;Vyberte které vložené DCP osvětlení se má použít. Ve výchozím stavu se použije "interpolované", což je mix mezi dvěma osvětleními založenými na vyvážení bílé. Nastavené je dostupné pouze v případě, že je povoleno dvojité DCP osvětlení s podporou interpolace.
@@ -1531,6 +1578,7 @@ TP_ICM_INPUTPROFILE;Vstupní profil
TP_ICM_LABEL;Správa barev
TP_ICM_NOICM;Bez ICM: sRGB výstup
TP_ICM_OUTPUTPROFILE;Výstupní barevný prostor
+TP_ICM_PROFILEINTENT;Záměr reprodukce
TP_ICM_SAVEREFERENCE;Uložit referenční obrázek pro profilování
TP_ICM_SAVEREFERENCE_APPLYWB;Aplikovat vyvážení bílé
TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;Obecně se vyvážení bílé aplikuje při ukládání obrázku pro vytvoření ICC profilů a neaplikuje při vytváření DCP profilů.
@@ -1584,6 +1632,7 @@ TP_LENSPROFILE_LABEL;Korekční profil objektivu
TP_LENSPROFILE_USECA;Korekce chromatické aberace
TP_LENSPROFILE_USEDIST;Korekce zkreslení
TP_LENSPROFILE_USEVIGN;Korekce vinětace
+TP_NEUTRAL;Obnovit
TP_NEUTRAL_TIP;Nastaví posuvníky expozice na neutrální hodnoty,\nPoužije stejné kontroly jako volba "Automatické úrovně" bez ohledu na to, zda jsou nebo nejsou Automatické úrovně použity.
TP_PCVIGNETTE_FEATHER;Rozptyl
TP_PCVIGNETTE_FEATHER_TOOLTIP;Rozptyl:\n0 = pouze rohy,\n50 = napůl do středu,\n100 = do středu.
@@ -1610,6 +1659,7 @@ TP_PRSHARPENING_TOOLTIP;Obrázek po zmenšení doostří. Funguje pouze pokud je
TP_RAWCACORR_AUTO;Automatická korekce
TP_RAWCACORR_CABLUE;Modrá
TP_RAWCACORR_CARED;Červená
+TP_RAWCACORR_CASTR;Síla
TP_RAWEXPOS_BLACKS;Úrovně černé
TP_RAWEXPOS_BLACK_0;Zelená 1 (řídící)
TP_RAWEXPOS_BLACK_1;Červená
@@ -1654,51 +1704,83 @@ TP_RESIZE_WIDTH;Šířka
TP_RETINEX_CONTEDIT_HSL;HSV korekce histogramu
TP_RETINEX_CONTEDIT_LAB;Histogram korekce L*a*b*
TP_RETINEX_CONTEDIT_LH;Korekce odstínu
+TP_RETINEX_CONTEDIT_MAP;Korekce masky
TP_RETINEX_CURVEEDITOR_CD;L=f(L)
TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Jas dle jasu L=f(L).\nUpraví raw data pro snížení výskytu halo efektu a vzniku artefaktů.
TP_RETINEX_CURVEEDITOR_LH;Síla=f(O)
TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Síla dle odstínu Síla=f(O)\nPokud je použita retinex metoda "světla" působí tato křivka také na barevnost.
+TP_RETINEX_CURVEEDITOR_MAP;L=f(L)
+TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;Tato křivka může být aplikována samostatně, nebo spolu s Gaussovou nebo vlnkovou maskou.\nPozor na artefakty!
+TP_RETINEX_EQUAL;Korekce
TP_RETINEX_FREEGAMMA;Volná gama
TP_RETINEX_GAIN;Zisk
+TP_RETINEX_GAINOFFS;Zisk a posun (jasu)
+TP_RETINEX_GAINTRANSMISSION;Přenos zisku
+TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Zesílí nebo zeslabí mapu přenosu pro dosažení jasu.\nÚsečka: přenos -min od 0. průměr. a hodnot (max).\nPořadnice: zisk.
TP_RETINEX_GAIN_TOOLTIP;Působí na obnovený obrázek.\n\nToto je velmi odlišné od ostatních nastavení. Použito pro černé nebo bílé pixely a pro vyvážení histogramu.
TP_RETINEX_GAMMA;Gama
TP_RETINEX_GAMMA_FREE;Volná
TP_RETINEX_GAMMA_HIGH;Vysoká
TP_RETINEX_GAMMA_LOW;Nízká
TP_RETINEX_GAMMA_MID;Střední
-TP_RETINEX_GAMMA_NONE;Nic
+TP_RETINEX_GAMMA_NONE;Žádná
TP_RETINEX_GAMMA_TOOLTIP;Obnoví tóny aplikováním gamy před a po Retinex. To je odlišné od Retinex křivek nebo ostatních křivek (Lab, Expozice, atd.)
+TP_RETINEX_GRAD;Přenos gradientu
+TP_RETINEX_GRADS;Gradient síly
+TP_RETINEX_GRADS_TOOLTIP;Pokud je posuvník na nule jsou všechny průchody stejné,\nPokud je větší než nula, tak je Síla s přibývajícími průběhy omezována. A obráceně.
+TP_RETINEX_GRAD_TOOLTIP;Pokud je posuvník na nule jsou všechny průchody stejné,\nPokud je větší než nula, tak jsou Odchylka a Práh s přibývajícími průběhy omezovány. A obráceně.
TP_RETINEX_HIGH;Silné
TP_RETINEX_HIGHLIG;Světla
TP_RETINEX_HIGHLIGHT;Práh světel
TP_RETINEX_HIGHLIGHT_TOOLTIP;Zvýší působení algoritmu Silné.\nMůže vyžadovat nové přizpůsobení "Sousedních pixelů" a zvýšení "Korekce bílého bodu" v kartě Raw -> Raw bílé body.
TP_RETINEX_HSLSPACE_LIN;HSV - Lineární
TP_RETINEX_HSLSPACE_LOG;HSV - Logaritmická
+TP_RETINEX_ITER;Průchody (Mapování tónů)
+TP_RETINEX_ITERF;Mapování tónů
+TP_RETINEX_ITER_TOOLTIP;Simuluje operátor Mapování tónů.\nVyšší hodnoty prodlužují čas zpracování.
TP_RETINEX_LABEL;Retinex
+TP_RETINEX_LABEL_MASK;Maska
TP_RETINEX_LABSPACE;L*a*b*
TP_RETINEX_LOW;Slabé
+TP_RETINEX_MAP;Metoda masky
+TP_RETINEX_MAP_GAUS;Gaussova maska
+TP_RETINEX_MAP_MAPP;Ostrá maska (částečná vlnka)
+TP_RETINEX_MAP_MAPT;Ostrá maska (kompletní vlnka)
+TP_RETINEX_MAP_METHOD_TOOLTIP;Použít masku generovanou Gaussovou funkcí výše (poloměr, metoda) pro omezení halo efektu a artefaktů.\n\nPouze křivka: na masku je aplikována diagonální křivka kontrastu.\nPozor na artefakty!\n\nGaussova maska: originální maska je upravena Gaussovým rozostřením.\nRychlé.\n\nOstrá maska: na originální masku se použije vlnka.\nPomalé.
+TP_RETINEX_MAP_NONE;Žádná
TP_RETINEX_MEDIAN;Přenos filtru mediánu
TP_RETINEX_METHOD;Metoda
-TP_RETINEX_METHOD_TOOLTIP;Slabé = Posílí slabé světlo,\nJednolité = vyvážená akce,\nSilné = Posílí silné světlo,\nSvětla = Odstraní purpurovou ve světlech.
+TP_RETINEX_METHOD_TOOLTIP;Slabé = Posílí slabé světlo,\nJednolité = Vyvážená akce,\nSilné = Posílí silné světlo,\nSvětla = Odstraní purpurovou ve světlech.
TP_RETINEX_MLABEL;Obnovený bez závoje Min=%1 Max=%2
TP_RETINEX_MLABEL_TOOLTIP;Mělo by být poblíž min=0 max=32768\nObnovený obraz bez příměsí.
-TP_RETINEX_NEIGHBOR;Sousední pixely
+TP_RETINEX_NEIGHBOR;Poloměr
TP_RETINEX_NEUTRAL;Obnovit
TP_RETINEX_NEUTRAL_TIP;Obnoví původní hodnoty u všech posuvníků a křivek.
-TP_RETINEX_OFFSET;Posun
+TP_RETINEX_OFFSET;Posun (jasu)
+TP_RETINEX_SCALES;Gaussův gradient
+TP_RETINEX_SCALES_TOOLTIP;Pokud je posuvník na nule jsou všechny průchody stejné,\nPokud je větší než nula, tak jsou Rozsah a Průměr s přibývajícími průběhy omezovány. A obráceně.
TP_RETINEX_SETTINGS;Nastavení
+TP_RETINEX_SKAL;Měřítko
TP_RETINEX_SLOPE;Sklon volné gamy
TP_RETINEX_STRENGTH;Síla
TP_RETINEX_THRESHOLD;Práh
TP_RETINEX_THRESHOLD_TOOLTIP;Omezuje Vstup/Výstup.\nVstup = zdroj obrázku,\nVýstup = gauss obrázku.
TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Průměr=%3 Sigma=%4
TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
-TP_RETINEX_TLABEL_TOOLTIP;Výsledek Mapy přenosu .\nMin a Max jsou použity Odchylkou.\nPrůměr a Sigma\nTm=Min TM=Max Mapy přenosu.
+TP_RETINEX_TLABEL_TOOLTIP;Výsledek Mapy přenosu .\nMin a Max jsou použity Odchylkou.\nPrůměr a Sigma\nTm=Min TM=Max mapy přenosu.
+TP_RETINEX_TRANF;Přenos
TP_RETINEX_TRANSMISSION;Mapa přenosu
TP_RETINEX_TRANSMISSION_TOOLTIP;Přenos podle přenosu.\nÚsečka: přenos z negativních hodnot (min), průměru a kladných hodnot (max).\nPořadnice: zesílení nebo zeslabení.
TP_RETINEX_UNIFORM;Jednolité
-TP_RETINEX_VARIANCE;Odchylka
+TP_RETINEX_VARIANCE;Kontrast
TP_RETINEX_VARIANCE_TOOLTIP;Nízká odchylka zvyšuje místní kontrast a nasycení, ale může vést ke vzniku artefaktů.
+TP_RETINEX_VIEW;Zpracování
+TP_RETINEX_VIEW_MASK;Maska
+TP_RETINEX_VIEW_METHOD_TOOLTIP;Běžné - běžné zobrazení.\nMaska - zobrazí masku.\nNeostrá maska - zobrazí obrázek s neostrou maskou s velkým poloměrem.\nPřenos - Auto/Pevný - zobrazí soubor mapy přenosu před jakoukoli úpravou kontrastu a jasu.\n\nUpozornění: maska neodpovídá realitě. Je zesílena, aby byla lépe vidět.
+TP_RETINEX_VIEW_NONE;Běžné
+TP_RETINEX_VIEW_TRAN;Přenos - Automatický
+TP_RETINEX_VIEW_TRAN2;Přenos - Pevný
+TP_RETINEX_VIEW_UNSHARP;Maskování rozostření
TP_RGBCURVES_BLUE;B
TP_RGBCURVES_CHANNEL;Kanál
TP_RGBCURVES_GREEN;G
@@ -1725,7 +1807,7 @@ TP_SHARPENEDGE_THREE;Pouze jas
TP_SHARPENING_AMOUNT;Míra
TP_SHARPENING_EDRADIUS;Poloměr
TP_SHARPENING_EDTOLERANCE;Tolerance k hranám
-TP_SHARPENING_HALOCONTROL;Omezení haló artefatů
+TP_SHARPENING_HALOCONTROL;Omezení halo efektu
TP_SHARPENING_HCAMOUNT;Míra
TP_SHARPENING_LABEL;Doostření
TP_SHARPENING_METHOD;Metoda
@@ -1983,83 +2065,3 @@ ZOOMPANEL_ZOOMFITSCREEN;Přizpůsobit obrázek obrazovce\nZkratka: f
ZOOMPANEL_ZOOMIN;Přiblížit\nZkratka: +
ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: -
-!!!!!!!!!!!!!!!!!!!!!!!!!
-! Untranslated keys follow; remove the ! prefix after an entry is translated.
-!!!!!!!!!!!!!!!!!!!!!!!!!
-
-!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.
-!GENERAL_APPLY;Apply
-!GENERAL_OPEN;Open
-!HISTORY_MSG_166;Exposure - Reset
-!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
-!MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor
-!MONITOR_PROFILE_SYSTEM;System default
-!PARTIALPASTE_PRSHARPENING;Post-resize sharpening
-!PREFERENCES_MONINTENT;Default monitor intent
-!PREFERENCES_MONPROFILE;Default monitor profile
-!PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list.
-!PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list.
-!PREFERENCES_PROFILE_NONE;None
-!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_DIRPYRDENOISE_3X3;3×3
-!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft
-!TP_DIRPYRDENOISE_5X5;5×5
-!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft
-!TP_DIRPYRDENOISE_7X7;7×7
-!TP_DIRPYRDENOISE_9X9;9×9
-!TP_DIRPYRDENOISE_MET_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_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_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_ICM_PROFILEINTENT;Rendering Intent
-!TP_NEUTRAL;Reset
-!TP_RAWCACORR_CASTR;Strength
-!TP_RETINEX_CONTEDIT_MAP;Mask equalizer
-!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_GAINOFFS;Gain and Offset (brightness)
-!TP_RETINEX_GAINTRANSMISSION;Gain transmission
-!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain.
-!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_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_MASK;Mask
-!TP_RETINEX_MAP;Mask 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_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_SKAL;Scale
-!TP_RETINEX_TRANF;Transmission
-!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
diff --git a/rtdata/languages/Dansk b/rtdata/languages/Dansk
index 67ab884c8..43f10eacd 100644
--- a/rtdata/languages/Dansk
+++ b/rtdata/languages/Dansk
@@ -954,6 +954,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!HISTORY_MSG_440;CbDL - Method
!HISTORY_MSG_441;Retinex - Gain transmission
!HISTORY_MSG_442;Retinex - Scale
+!HISTORY_MSG_443;Output Black Point Compensation
!HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!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
@@ -1122,7 +1123,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!PREFERENCES_FLUOF2;Fluorescent F2
!PREFERENCES_FLUOF7;Fluorescent F7
!PREFERENCES_FLUOF11;Fluorescent F11
-!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Editor's panel and the File Browser
+!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser
!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser.
!PREFERENCES_GREY;Output device's Yb luminance (%)
!PREFERENCES_GREY05;Yb=05 CIE L#30
@@ -1158,6 +1159,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!PREFERENCES_MENUOPTIONS;Context Menu Options
!PREFERENCES_METADATA;Metadata
!PREFERENCES_MIN;Mini (100x115)
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
!PREFERENCES_MONINTENT;Default monitor intent
!PREFERENCES_MONPROFILE;Default monitor profile
!PREFERENCES_MULTITAB;Multiple Editor Tabs Mode
@@ -1181,7 +1183,8 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!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_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels
!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements.
-!PREFERENCES_SELECTFONT;Select font
+!PREFERENCES_SELECTFONT;Select global font
+!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings
!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files
!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation.
@@ -1238,6 +1241,8 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF
!SAVEDLG_WARNFILENAME;File will be named
!SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders.
+!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
!THRESHOLDSELECTOR_B;Bottom
!THRESHOLDSELECTOR_BL;Bottom-left
!THRESHOLDSELECTOR_BR;Bottom-right
@@ -1245,6 +1250,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!THRESHOLDSELECTOR_T;Top
!THRESHOLDSELECTOR_TL;Top-left
!THRESHOLDSELECTOR_TR;Top-right
+!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
!TP_BWMIX_ALGO;Algorithm OYCPM
!TP_BWMIX_ALGO_LI;Linear
!TP_BWMIX_ALGO_SP;Special effects
@@ -1451,7 +1457,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma
!TP_DIRPYRDENOISE_CURVEEDITOR_CC_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_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise
-!TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Can be used on raw and non-raw images.\n\nFor non-raw images noise reduction of luminance depends on the gamma of the input color profile. An sRGB gamma is assumed, thus if the image uses an input color profile of a different gamma, the effects of luminance noise reduction will differ.
!TP_DIRPYRDENOISE_ENH;Enhanced mode
!TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase.
!TP_DIRPYRDENOISE_GAMMA;Gamma
@@ -1466,13 +1471,11 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!TP_DIRPYRDENOISE_LTYPE;Luminance control
!TP_DIRPYRDENOISE_LUMA;Luminance
!TP_DIRPYRDENOISE_LUMAFR;Luminance
-!TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail
!TP_DIRPYRDENOISE_MAN;Manual
!TP_DIRPYRDENOISE_MANU;Manual
!TP_DIRPYRDENOISE_MED;Median Filter
!TP_DIRPYRDENOISE_MEDMETHOD;Median method
!TP_DIRPYRDENOISE_MEDTYPE;Median type
-!TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising
!TP_DIRPYRDENOISE_METHOD;Method
!TP_DIRPYRDENOISE_METHOD11;Quality
!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time.
@@ -1582,6 +1585,8 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is only enabled if the selected DCP has one.
!TP_ICM_BLENDCMSMATRIX;Blend ICC highlights with matrix
!TP_ICM_BLENDCMSMATRIX_TOOLTIP;Enable to recover clipped highlights when using LUT-based ICC profiles.
+!TP_ICM_BPC;Black Point Compensation
+!TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
!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 enabled if a Dual-Illuminant DCP with interpolation support is selected.
@@ -1798,7 +1803,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!TP_SHARPENEDGE_LABEL;Edges
!TP_SHARPENEDGE_PASSES;Iterations
!TP_SHARPENEDGE_THREE;Luminance only
-!TP_SHARPENING_TOOLTIP;Expect a slightly different effect when using with CIECAM02. If difference is observed, adjust to taste.
!TP_SHARPENMICRO_AMOUNT;Quantity
!TP_SHARPENMICRO_LABEL;Microcontrast
!TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5
diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch
index 9c7478cf7..8d1c44b60 100644
--- a/rtdata/languages/Deutsch
+++ b/rtdata/languages/Deutsch
@@ -1402,7 +1402,6 @@ TP_DIRPYRDENOISE_CUR;Kurve
TP_DIRPYRDENOISE_CURVEEDITOR_CC;Farbe
TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Erhöht den Wert aller Chrominanz-Regler und regelt die Chrominanz-Rauschreduzierung als Funktion der Chromatizität. Die Intensität kann über Kontrollpunkte für schwach bis intensiv gesättigte Farben unterschiedlich eingestellt werden.
TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Moduliert die Wirkung der Luminanz-Rauschreduzierung
-TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Kann für RAW und Nicht-RAW-Bilder verwendet werden.\n\nBei Nicht-Raw-Bildern hängt die Rauschreduzierung der Luminanz vom Gamma des Eingangsfarbprofils ab. Es wird ein sRGB-Gamma angenommen, daher wird die Luminanz-Rauschreduzierung variieren, wenn das Eingangsbild ein Farbprofil mit anderem Gamma verwendet.
TP_DIRPYRDENOISE_ENH;Erweiterter Modus
TP_DIRPYRDENOISE_ENH_TOOLTIP;Erhöht die Qualität der Rauschreduzierung auf Kosten einer um 20% erhöhten Verarbeitungszeit.
TP_DIRPYRDENOISE_GAMMA;Gamma
@@ -1417,13 +1416,11 @@ TP_DIRPYRDENOISE_LPLABM;Gewichtet L* (wenig) + a*b* (normal)
TP_DIRPYRDENOISE_LTYPE;Luminanzkontrolle
TP_DIRPYRDENOISE_LUMA;Luminanz
TP_DIRPYRDENOISE_LUMAFR;Luminanz
-TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet mit Luminanz- und Fourierumwandlung für Luminanzdetails.
TP_DIRPYRDENOISE_MAN;Benutzerdefiniert
TP_DIRPYRDENOISE_MANU;Benutzerdefiniert
TP_DIRPYRDENOISE_MED;Medianfilter
TP_DIRPYRDENOISE_MEDMETHOD;Medianmethode
TP_DIRPYRDENOISE_MEDTYPE;Mediantyp
-TP_DIRPYRDENOISE_MED_TOOLTIP;Medianrauschreduzierung einschalten
TP_DIRPYRDENOISE_METHOD;Methode
TP_DIRPYRDENOISE_METHOD11;Qualität
TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Einstellung der Qualität der Rauschreduzierung. Die Einstellung “Hoch“ verbessert die Rauschreduzierung auf Kosten der Verarbeitungszeit.
@@ -2054,3 +2051,15 @@ ZOOMPANEL_ZOOMFITSCREEN;An Bildschirm anpassen\nTaste: f
ZOOMPANEL_ZOOMIN;Hineinzoomen\nTaste: +
ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: -
+!!!!!!!!!!!!!!!!!!!!!!!!!
+! Untranslated keys follow; remove the ! prefix after an entry is translated.
+!!!!!!!!!!!!!!!!!!!!!!!!!
+
+!HISTORY_MSG_443;Output Black Point Compensation
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
+!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
+!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
+!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
+!TP_ICM_BPC;Black Point Compensation
+!TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK)
index f960286c8..083b4247e 100644
--- a/rtdata/languages/English (UK)
+++ b/rtdata/languages/English (UK)
@@ -37,7 +37,10 @@ PREFERENCES_INTENT_ABSOLUTE;Absolute Colourimetric
PREFERENCES_INTENT_RELATIVE;Relative Colourimetric
PREFERENCES_MENUGROUPLABEL;Group "Colour label"
PREFERENCES_NAVGUIDEBRUSH;Navigator guide colour
+PREFERENCES_SELECTFONT_COLPICKER;Select Colour Picker's font
PREFERENCES_TAB_COLORMGR;Colour Management
+SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colours from the output profile.
+TOOLBAR_TOOLTIP_COLORPICKER;Lockable Colour Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a colour picker\nDrag it around while pressing the left mouse button\nDelete the colour picker with a right mouse button click\nDelete all colour pickers with Shift + Right mouse button click\nRight click away from any colour picker to go back to the Hand tool
TOOLBAR_TOOLTIP_STRAIGHTEN;Straighten / fine rotation.\nShortcut: s\n\nIndicate the vertical or horizontal by drawing a guide line over the image preview. Angle of rotation will be shown next to the guide line. Centre of rotation is the geometrical centre of the image.
TP_BWMIX_CC_ENABLED;Adjust complementary colour
TP_BWMIX_CC_TOOLTIP;Enable to allow automatic adjustment of complementary colours in ROYGCBPM mode.
@@ -65,7 +68,6 @@ TP_COLORTONING_SPLITLR;Saturation 2 colours
TP_COLORTONING_TWO2;Special chroma '2 colours'
TP_COLORTONING_TWOCOLOR_TOOLTIP;Standard chroma:\nLinear response, a* = b*.\n\nSpecial chroma:\nLinear response, a* = b*, but unbound - try under the diagonal.\n\nSpecial a* and b*:\nLinear response unbound with separate curves for a* and b*. Intended for special effects.\n\nSpecial chroma 2 colours:\nMore predictable.
TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and centre to the preview size and centre you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
-TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Can be used on raw and non-raw images.\n\nFor non-raw images noise reduction of luminance depends on the gamma of the input colour profile. An sRGB gamma is assumed, thus if the image uses an input colour profile of a different gamma, the effects of luminance noise reduction will differ.
TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Centre: Px=%2 Py=%3
TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Centre: Tx=%2 Ty=%3
TP_DIRPYREQUALIZER_ALGO;Skin Colour Range
@@ -77,6 +79,7 @@ TP_GRADIENT_CENTER;Centre
TP_GRADIENT_CENTER_X;Centre X
TP_GRADIENT_CENTER_Y;Centre Y
TP_HLREC_COLOR;Colour Propagation
+TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output colour space with a fix White Point
TP_ICM_INPUTCAMERAICC_TOOLTIP;Use RawTherapee's camera-specific DCP or ICC input colour profiles. These profiles are more precise than simpler matrix ones. They are not available for all cameras. These profiles are stored in the /iccprofiles/input and /dcpprofiles folders and are automatically retrieved based on a file name matching to the exact model name of the camera.
TP_ICM_INPUTCAMERA_TOOLTIP;Use a simple colour matrix from dcraw, an enhanced RawTherapee version (whichever is available based on camera model) or one embedded in the DNG.
TP_ICM_INPUTCUSTOM_TOOLTIP;Select your own DCP/ICC colour profile file for the camera.
@@ -752,6 +755,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!HISTORY_MSG_440;CbDL - Method
!HISTORY_MSG_441;Retinex - Gain transmission
!HISTORY_MSG_442;Retinex - Scale
+!HISTORY_MSG_443;Output Black Point Compensation
!HISTORY_NEWSNAPSHOT;Add
!HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
!HISTORY_SNAPSHOT;Snapshot
@@ -1023,7 +1027,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!PREFERENCES_FLUOF11;Fluorescent F11
!PREFERENCES_FORIMAGE;For non-raw photos
!PREFERENCES_FORRAW;For raw photos
-!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Editor's panel and the File Browser
+!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser
!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser.
!PREFERENCES_GIMPPATH;GIMP installation directory
!PREFERENCES_GREY;Output device's Yb luminance (%)
@@ -1063,6 +1067,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!PREFERENCES_MENUOPTIONS;Context Menu Options
!PREFERENCES_METADATA;Metadata
!PREFERENCES_MIN;Mini (100x115)
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
!PREFERENCES_MONINTENT;Default monitor intent
!PREFERENCES_MONPROFILE;Default monitor profile
!PREFERENCES_MULTITAB;Multiple Editor Tabs Mode
@@ -1101,7 +1106,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!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_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels
!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements.
-!PREFERENCES_SELECTFONT;Select font
+!PREFERENCES_SELECTFONT;Select global font
!PREFERENCES_SELECTLANG;Select language
!PREFERENCES_SELECTTHEME;Select theme
!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings
@@ -1196,6 +1201,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF
!SAVEDLG_WARNFILENAME;File will be named
!SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
!THRESHOLDSELECTOR_B;Bottom
!THRESHOLDSELECTOR_BL;Bottom-left
!THRESHOLDSELECTOR_BR;Bottom-right
@@ -1422,13 +1428,11 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!TP_DIRPYRDENOISE_LTYPE;Luminance control
!TP_DIRPYRDENOISE_LUMA;Luminance
!TP_DIRPYRDENOISE_LUMAFR;Luminance
-!TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail
!TP_DIRPYRDENOISE_MAN;Manual
!TP_DIRPYRDENOISE_MANU;Manual
!TP_DIRPYRDENOISE_MED;Median Filter
!TP_DIRPYRDENOISE_MEDMETHOD;Median method
!TP_DIRPYRDENOISE_MEDTYPE;Median type
-!TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising
!TP_DIRPYRDENOISE_METHOD;Method
!TP_DIRPYRDENOISE_METHOD11;Quality
!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time.
@@ -1543,6 +1547,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is only enabled if the selected DCP has one.
!TP_ICM_BLENDCMSMATRIX;Blend ICC highlights with matrix
!TP_ICM_BLENDCMSMATRIX_TOOLTIP;Enable to recover clipped highlights when using LUT-based ICC profiles.
+!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 enabled if a Dual-Illuminant DCP with interpolation support is selected.
@@ -1789,7 +1794,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!TP_SHARPENING_RLD_DAMPING;Damping
!TP_SHARPENING_RLD_ITERATIONS;Iterations
!TP_SHARPENING_THRESHOLD;Threshold
-!TP_SHARPENING_TOOLTIP;Expect a slightly different effect when using with CIECAM02. If difference is observed, adjust to taste.
!TP_SHARPENING_USM;Unsharp Mask
!TP_SHARPENMICRO_AMOUNT;Quantity
!TP_SHARPENMICRO_LABEL;Microcontrast
diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US)
index f38615acd..de97d7721 100644
--- a/rtdata/languages/English (US)
+++ b/rtdata/languages/English (US)
@@ -675,6 +675,7 @@
!HISTORY_MSG_440;CbDL - Method
!HISTORY_MSG_441;Retinex - Gain transmission
!HISTORY_MSG_442;Retinex - Scale
+!HISTORY_MSG_443;Output Black Point Compensation
!HISTORY_NEWSNAPSHOT;Add
!HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
!HISTORY_SNAPSHOT;Snapshot
@@ -957,7 +958,7 @@
!PREFERENCES_FLUOF11;Fluorescent F11
!PREFERENCES_FORIMAGE;For non-raw photos
!PREFERENCES_FORRAW;For raw photos
-!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Editor's panel and the File Browser
+!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser
!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser.
!PREFERENCES_GIMPPATH;GIMP installation directory
!PREFERENCES_GREY;Output device's Yb luminance (%)
@@ -1001,6 +1002,7 @@
!PREFERENCES_MENUOPTIONS;Context Menu Options
!PREFERENCES_METADATA;Metadata
!PREFERENCES_MIN;Mini (100x115)
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
!PREFERENCES_MONINTENT;Default monitor intent
!PREFERENCES_MONPROFILE;Default monitor profile
!PREFERENCES_MULTITAB;Multiple Editor Tabs Mode
@@ -1040,7 +1042,8 @@
!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_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels
!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements.
-!PREFERENCES_SELECTFONT;Select font
+!PREFERENCES_SELECTFONT;Select global font
+!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
!PREFERENCES_SELECTLANG;Select language
!PREFERENCES_SELECTTHEME;Select theme
!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings
@@ -1136,6 +1139,8 @@
!SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF
!SAVEDLG_WARNFILENAME;File will be named
!SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders.
+!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
!THRESHOLDSELECTOR_B;Bottom
!THRESHOLDSELECTOR_BL;Bottom-left
!THRESHOLDSELECTOR_BR;Bottom-right
@@ -1143,6 +1148,7 @@
!THRESHOLDSELECTOR_T;Top
!THRESHOLDSELECTOR_TL;Top-left
!THRESHOLDSELECTOR_TR;Top-right
+!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
!TOOLBAR_TOOLTIP_CROP;Crop selection.\nShortcut: c\nMove the crop area using Shift-mouse drag
!TOOLBAR_TOOLTIP_HAND;Hand tool.\nShortcut: h
!TOOLBAR_TOOLTIP_STRAIGHTEN;Straighten / fine rotation.\nShortcut: s\n\nIndicate the vertical or horizontal by drawing a guide line over the image preview. Angle of rotation will be shown next to the guide line. Center of rotation is the geometrical center of the image.
@@ -1375,7 +1381,6 @@
!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma
!TP_DIRPYRDENOISE_CURVEEDITOR_CC_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_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise
-!TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Can be used on raw and non-raw images.\n\nFor non-raw images noise reduction of luminance depends on the gamma of the input color profile. An sRGB gamma is assumed, thus if the image uses an input color profile of a different gamma, the effects of luminance noise reduction will differ.
!TP_DIRPYRDENOISE_ENH;Enhanced mode
!TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase.
!TP_DIRPYRDENOISE_GAMMA;Gamma
@@ -1390,13 +1395,11 @@
!TP_DIRPYRDENOISE_LTYPE;Luminance control
!TP_DIRPYRDENOISE_LUMA;Luminance
!TP_DIRPYRDENOISE_LUMAFR;Luminance
-!TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail
!TP_DIRPYRDENOISE_MAN;Manual
!TP_DIRPYRDENOISE_MANU;Manual
!TP_DIRPYRDENOISE_MED;Median Filter
!TP_DIRPYRDENOISE_MEDMETHOD;Median method
!TP_DIRPYRDENOISE_MEDTYPE;Median type
-!TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising
!TP_DIRPYRDENOISE_METHOD;Method
!TP_DIRPYRDENOISE_METHOD11;Quality
!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time.
@@ -1522,6 +1525,8 @@
!TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is only enabled if the selected DCP has one.
!TP_ICM_BLENDCMSMATRIX;Blend ICC highlights with matrix
!TP_ICM_BLENDCMSMATRIX_TOOLTIP;Enable to recover clipped highlights when using LUT-based ICC profiles.
+!TP_ICM_BPC;Black Point Compensation
+!TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
!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 enabled if a Dual-Illuminant DCP with interpolation support is selected.
@@ -1780,7 +1785,6 @@
!TP_SHARPENING_RLD_DAMPING;Damping
!TP_SHARPENING_RLD_ITERATIONS;Iterations
!TP_SHARPENING_THRESHOLD;Threshold
-!TP_SHARPENING_TOOLTIP;Expect a slightly different effect when using with CIECAM02. If difference is observed, adjust to taste.
!TP_SHARPENING_USM;Unsharp Mask
!TP_SHARPENMICRO_AMOUNT;Quantity
!TP_SHARPENMICRO_LABEL;Microcontrast
diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol
index fc06babc8..54a2fde5b 100644
--- a/rtdata/languages/Espanol
+++ b/rtdata/languages/Espanol
@@ -1165,7 +1165,6 @@ TP_DEFRINGE_THRESHOLD;Umbral
TP_DIRPYRDENOISE_BLUE;Crominancia: Azul-Amarillo
TP_DIRPYRDENOISE_CHROMA;Crominancia: Maestra
TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modula la acción de eliminación de ruido 'de luminancia'
-TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Puede usarse en imágenes Raw y no Raw.\n\nPara imágenes no Raw la reducción del ruido en la luminancia depende de la gamma en el perfil de color de entrada. Se asume la gamma de sRGB, de manera que si la imagen tiene un perfil de color con otra gamma, la reducción del ruido en la luminancia va a variar.
TP_DIRPYRDENOISE_ENH;Modo mejorado
TP_DIRPYRDENOISE_ENH_TOOLTIP;Incrementa la calidad de la Reducción de Ruido a costa de un incremento de 20% en el tiempo de procesamiento
TP_DIRPYRDENOISE_GAMMA;Gamma
@@ -1179,7 +1178,6 @@ TP_DIRPYRDENOISE_LUMA;Luminancia
TP_DIRPYRDENOISE_MED;Median
TP_DIRPYRDENOISE_MEDMETHOD;Método Median
TP_DIRPYRDENOISE_MEDTYPE;Tipo Median
-TP_DIRPYRDENOISE_MED_TOOLTIP;Eliminador de ruido Median activado
TP_DIRPYRDENOISE_METHOD;Método
TP_DIRPYRDENOISE_METHOD11;Calidad
TP_DIRPYRDENOISE_METHOD11_TOOLTIP;La Calidad puede ser adaptada a un patrón de ruido. Al seleccionar "Alto" se incrementa el efecto de reducción de ruido a costa de prolongar el tiempo de procesamiento.
@@ -1702,6 +1700,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: -
!HISTORY_MSG_440;CbDL - Method
!HISTORY_MSG_441;Retinex - Gain transmission
!HISTORY_MSG_442;Retinex - Scale
+!HISTORY_MSG_443;Output Black Point Compensation
!MAIN_TAB_INSPECT; Inspect
!MAIN_TAB_WAVELET;Wavelet
!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w
@@ -1737,7 +1736,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: -
!PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4
!PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two.
!PREFERENCES_EXPAUT;Expert
-!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Editor's panel and the File Browser
+!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser
!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser.
!PREFERENCES_GREYSC;Scene Yb luminance (%)
!PREFERENCES_GREYSC18;Yb=18 CIE L#50
@@ -1753,6 +1752,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: -
!PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders
!PREFERENCES_MED;Medium (Tile/2)
!PREFERENCES_MIN;Mini (100x115)
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
!PREFERENCES_MONINTENT;Default monitor intent
!PREFERENCES_MONPROFILE;Default monitor profile
!PREFERENCES_NAVIGATIONFRAME;Navigation
@@ -1767,6 +1767,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: -
!PREFERENCES_PROFILE_NONE;None
!PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset
!PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3".
+!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings
!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files
!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation.
@@ -1783,6 +1784,9 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: -
!PREFERENCES_WLTWO;Two levels
!PREFERENCES_WLZER;No
!SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling.
+!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
+!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
!TP_CBDL_AFT;After Black-and-White
!TP_CBDL_BEF;Before Black-and-White
!TP_CBDL_METHOD;Process located
@@ -1812,7 +1816,6 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: -
!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal)
!TP_DIRPYRDENOISE_LTYPE;Luminance control
!TP_DIRPYRDENOISE_LUMAFR;Luminance
-!TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail
!TP_DIRPYRDENOISE_MAN;Manual
!TP_DIRPYRDENOISE_MANU;Manual
!TP_DIRPYRDENOISE_MET_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.
@@ -1837,6 +1840,8 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: -
!TP_ICM_APPLYHUESATMAP_TOOLTIP;Employ the embedded DCP base table (HueSatMap). The setting is only enabled 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 enabled if the selected DCP has one.
+!TP_ICM_BPC;Black Point Compensation
+!TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
!TP_ICM_PROFILEINTENT;Rendering Intent
!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.
diff --git a/rtdata/languages/Euskara b/rtdata/languages/Euskara
index 1d4df36ae..7ebb655f5 100644
--- a/rtdata/languages/Euskara
+++ b/rtdata/languages/Euskara
@@ -954,6 +954,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura
!HISTORY_MSG_440;CbDL - Method
!HISTORY_MSG_441;Retinex - Gain transmission
!HISTORY_MSG_442;Retinex - Scale
+!HISTORY_MSG_443;Output Black Point Compensation
!HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!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
@@ -1122,7 +1123,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura
!PREFERENCES_FLUOF2;Fluorescent F2
!PREFERENCES_FLUOF7;Fluorescent F7
!PREFERENCES_FLUOF11;Fluorescent F11
-!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Editor's panel and the File Browser
+!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser
!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser.
!PREFERENCES_GREY;Output device's Yb luminance (%)
!PREFERENCES_GREY05;Yb=05 CIE L#30
@@ -1158,6 +1159,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura
!PREFERENCES_MENUOPTIONS;Context Menu Options
!PREFERENCES_METADATA;Metadata
!PREFERENCES_MIN;Mini (100x115)
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
!PREFERENCES_MONINTENT;Default monitor intent
!PREFERENCES_MONPROFILE;Default monitor profile
!PREFERENCES_MULTITAB;Multiple Editor Tabs Mode
@@ -1181,7 +1183,8 @@ TP_WBALANCE_TEMPERATURE;Tenperatura
!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_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels
!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements.
-!PREFERENCES_SELECTFONT;Select font
+!PREFERENCES_SELECTFONT;Select global font
+!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings
!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files
!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation.
@@ -1238,6 +1241,8 @@ TP_WBALANCE_TEMPERATURE;Tenperatura
!SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF
!SAVEDLG_WARNFILENAME;File will be named
!SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders.
+!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
!THRESHOLDSELECTOR_B;Bottom
!THRESHOLDSELECTOR_BL;Bottom-left
!THRESHOLDSELECTOR_BR;Bottom-right
@@ -1245,6 +1250,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura
!THRESHOLDSELECTOR_T;Top
!THRESHOLDSELECTOR_TL;Top-left
!THRESHOLDSELECTOR_TR;Top-right
+!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
!TP_BWMIX_ALGO;Algorithm OYCPM
!TP_BWMIX_ALGO_LI;Linear
!TP_BWMIX_ALGO_SP;Special effects
@@ -1451,7 +1457,6 @@ TP_WBALANCE_TEMPERATURE;Tenperatura
!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma
!TP_DIRPYRDENOISE_CURVEEDITOR_CC_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_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise
-!TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Can be used on raw and non-raw images.\n\nFor non-raw images noise reduction of luminance depends on the gamma of the input color profile. An sRGB gamma is assumed, thus if the image uses an input color profile of a different gamma, the effects of luminance noise reduction will differ.
!TP_DIRPYRDENOISE_ENH;Enhanced mode
!TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase.
!TP_DIRPYRDENOISE_GAMMA;Gamma
@@ -1466,13 +1471,11 @@ TP_WBALANCE_TEMPERATURE;Tenperatura
!TP_DIRPYRDENOISE_LTYPE;Luminance control
!TP_DIRPYRDENOISE_LUMA;Luminance
!TP_DIRPYRDENOISE_LUMAFR;Luminance
-!TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail
!TP_DIRPYRDENOISE_MAN;Manual
!TP_DIRPYRDENOISE_MANU;Manual
!TP_DIRPYRDENOISE_MED;Median Filter
!TP_DIRPYRDENOISE_MEDMETHOD;Median method
!TP_DIRPYRDENOISE_MEDTYPE;Median type
-!TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising
!TP_DIRPYRDENOISE_METHOD;Method
!TP_DIRPYRDENOISE_METHOD11;Quality
!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time.
@@ -1582,6 +1585,8 @@ TP_WBALANCE_TEMPERATURE;Tenperatura
!TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is only enabled if the selected DCP has one.
!TP_ICM_BLENDCMSMATRIX;Blend ICC highlights with matrix
!TP_ICM_BLENDCMSMATRIX_TOOLTIP;Enable to recover clipped highlights when using LUT-based ICC profiles.
+!TP_ICM_BPC;Black Point Compensation
+!TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
!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 enabled if a Dual-Illuminant DCP with interpolation support is selected.
@@ -1798,7 +1803,6 @@ TP_WBALANCE_TEMPERATURE;Tenperatura
!TP_SHARPENEDGE_LABEL;Edges
!TP_SHARPENEDGE_PASSES;Iterations
!TP_SHARPENEDGE_THREE;Luminance only
-!TP_SHARPENING_TOOLTIP;Expect a slightly different effect when using with CIECAM02. If difference is observed, adjust to taste.
!TP_SHARPENMICRO_AMOUNT;Quantity
!TP_SHARPENMICRO_LABEL;Microcontrast
!TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5
diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais
index fa622202c..fe7b73832 100644
--- a/rtdata/languages/Francais
+++ b/rtdata/languages/Francais
@@ -632,7 +632,8 @@ HISTORY_MSG_403;O - NB - Sensibilité des bords
HISTORY_MSG_404;O - NB - Base amplification
HISTORY_MSG_405;O - Débruitage - Niveau 4
HISTORY_MSG_406;O - NB - Pixels voisins
-HISTORY_MSG_407;Retrait de taches
+HISTORY_MSG_443;Compensation du Point Noir de Sortie
+HISTORY_MSG_444;Retrait de taches
HISTORY_NEWSNAPSHOT;Ajouter
HISTORY_NEWSNAPSHOT_TOOLTIP;Raccourci: Alt-s
HISTORY_SNAPSHOT;Capture
@@ -955,6 +956,7 @@ PREFERENCES_MENUGROUPRANK;Classement
PREFERENCES_MENUOPTIONS;Options du menu
PREFERENCES_METADATA;Metadonnées
PREFERENCES_MIN;Mini (100x115)
+PREFERENCES_MONBPC;Compensation du Point Noir pour la transformation L*a*b*->Moniteur
PREFERENCES_MULTITAB;Éditeurs multiple
PREFERENCES_MULTITABDUALMON;Éditeurs multiple, si possible sur un second moniteur
PREFERENCES_NAVGUIDEBRUSH;Couleur du cadre dans le Navigateur
@@ -989,7 +991,8 @@ PREFERENCES_REMEMBERZOOMPAN;Se souvenir de niveau de zoom et de la position de l
PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Retient le niveau de zoom et la position de l'image courante lors de l'ouverture d'une nouvelle image.\n\nCette option ne fonctionne que dans le mode "Éditeur unique" et quand "Méthode de dématriçage utilisé pour l'aperçu à un zoom <100%" is set to "Idem PP3".
PREFERENCES_RGBDTL_LABEL;Nombre maximum d'unités de calcul pour la Réduction du bruit
PREFERENCES_RGBDTL_TOOLTIP;La réduction du bruit nécessite un minimum d'à peu près 128Mo de RAM pour une image de 10MPix ou 512Mo pour une image de 40MPix, ainsi que 128Mo de RAM supplémentaire par unité de calcul. Plus il y aura d'unités de calcul travaillant en parallèle, plus ce sera rapide. Laissez la valeur à "0" pour utiliser automatiquement autant d'unités de calcul que possible.
-PREFERENCES_SELECTFONT;Police de caractère
+PREFERENCES_SELECTFONT;Police générale
+PREFERENCES_SELECTFONT_COLPICKER;Police des pipette à couleur
PREFERENCES_SELECTLANG;Choix de la langue
PREFERENCES_SELECTTHEME;Choisissez un thème
PREFERENCES_SERIALIZE_TIFF_READ;Réglage de lecture des images TIFF
@@ -1083,6 +1086,8 @@ SAVEDLG_SUBSAMP_3;Meilleure qualité
SAVEDLG_TIFFUNCOMPRESSED;TIFF non compressé
SAVEDLG_WARNFILENAME;Le fichier sera nommé
SHCSELECTOR_TOOLTIP;Cliquez le bouton droit de la souris\npour réinitialiser la position de ces 3 curseurs
+SOFTPROOF_GAMUTCHECK_TOOLTIP;Si activé, indique en gris les pixels dont la couleurs est en dehors du gamut du profile de sortie
+SOFTPROOF_TOOLTIP;Épreuvage écran\nSi activé, simule le rendu généré par le profiles de sortie de l'outil ICM. Particulièrement utile pour simuler le rendu en sortie d'imprimante.
THRESHOLDSELECTOR_B;Bas
THRESHOLDSELECTOR_BL;Bas-gauche
THRESHOLDSELECTOR_BR;Bas-droite
@@ -1090,6 +1095,7 @@ THRESHOLDSELECTOR_HINT;Maintenez la touche Shift appuyée pour déplacer
THRESHOLDSELECTOR_T;Haut
THRESHOLDSELECTOR_TL;Haut-Gauche
THRESHOLDSELECTOR_TR;Haut-droite
+TOOLBAR_TOOLTIP_COLORPICKER;Ancre de Vérification Couleur\n\nLorque activé:\nCliquez la zone d'image avec le bouton gauche de la souris pour ajouter une ancre\nDéplacez-le en le "tirant" avec le bouton gauche de la souris\nSupprimez une ancre en cliquant dessus avec le bouton droit de la souris\nSupprimez toutes les ancres avec Shift + click avec le bouton droit\nCliquez avec le bouton droit de la souris en dehors de toute ancre pour revenir au mode Déplacement
TOOLBAR_TOOLTIP_CROP;Sélection du recadrage\nRaccourci: c\nDéplacez le recadrage en utilisant Shift + Glisser
TOOLBAR_TOOLTIP_HAND;Outil de navigation\nRaccourci: h
TOOLBAR_TOOLTIP_STRAIGHTEN;Sélection de la ligne d'horizon\nRaccourci: s\n\nIndiquez la verticale ou l'horizontale en dessinant une ligne à travers l'image de prévisualisation. L'angle de rotation sera affiché près de la ligne guide. Le centre de rotation est le centre géométrique de l'image.
@@ -1311,7 +1317,6 @@ TP_DIRPYRDENOISE_CUR;Courbe
TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma
TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Augmente (multiplie) la valeur de tousles curseurs de chrominance.\nCette courbe vous permet d'ajuster la force de la réduction de bruit chromatique en fonction de la chromaticité, par exemple pour augmenter l'action dans les zones peu saturées et pour la réduire dans ceux celles très saturées.
TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Module l'action du débruitage de 'Luminance'
-TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Peut être utilisé sur les images raw et non-raw.\n\nPour les images non-raw, la réduction de bruit de luminance dépend du gamma du profil couleur d'entée. Un gamma sRGB est supposé, c'est pourquoi si l'image a un profil couleur d'un gamma différent, la réduction de bruit de luminance variera.
TP_DIRPYRDENOISE_ENH;Mode amélioré
TP_DIRPYRDENOISE_ENH_TOOLTIP;Augmente la qualité du débruitage, mais augmente le temps de traitement d'environ 20%
TP_DIRPYRDENOISE_GAMMA;Gamma
@@ -1326,13 +1331,11 @@ TP_DIRPYRDENOISE_LPLABM;L* pondéré (faiblement) + a*b* (normal)
TP_DIRPYRDENOISE_LTYPE;Contrôle de luminance
TP_DIRPYRDENOISE_LUMA;Luminance
TP_DIRPYRDENOISE_LUMAFR;Luminance
-TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Ondelettes pour la luminance et transformé de Fourier pour les détails de luminance
TP_DIRPYRDENOISE_MAN;Manuel
TP_DIRPYRDENOISE_MANU;Manuel
TP_DIRPYRDENOISE_MED;Filtre Médian
TP_DIRPYRDENOISE_MEDMETHOD;Méthode
TP_DIRPYRDENOISE_MEDTYPE;Type de médiane
-TP_DIRPYRDENOISE_MED_TOOLTIP;Active le débruitage médian
TP_DIRPYRDENOISE_METHOD;Méthode
TP_DIRPYRDENOISE_METHOD11;Qualité
TP_DIRPYRDENOISE_METHOD11_TOOLTIP;La qualité peut être adapté à la trame du bruit. Régler sur "haut" augmentera l'effet de la réduction de bruit au prix d'un temps de traitement plus long.
@@ -1455,6 +1458,8 @@ TP_ICM_APPLYLOOKTABLE;Table de recherche
TP_ICM_APPLYLOOKTABLE_TOOLTIP;Utilise la table de recherche (LUT) contenu dans le profil DCP. Ce réglage n'est possible que si le profil DCP sélectionné en contient une.
TP_ICM_BLENDCMSMATRIX;Mélange des hautes lumières\ndu profil ICC avec la matrice
TP_ICM_BLENDCMSMATRIX_TOOLTIP;Activer la récupération des zones brûlées lorsque les profils ICC basés sur la LUT sont utilisés
+TP_ICM_BPC;Compensation du Point Noir
+TP_ICM_BPC_TOOLTIP;Activez ceci pour faire correspondre le canal Luminosité à l'espace couleur de sortie avec un Point Blanc fixe
TP_ICM_DCPILLUMINANT;Illuminant
TP_ICM_DCPILLUMINANT_INTERPOLATED;Interpolé
TP_ICM_DCPILLUMINANT_TOOLTIP;Sélectionne quel illuminant DCP inclus utiliser. La valeur par défaut est "Interpolé", qui est un mix entre les 2 profils inclus basé sur la Balance des Blancs choisie. Ce paramètre n'est actif que si un fichier DCP Bi-Illuminant avec support de l'interpolation est choisi.
diff --git a/rtdata/languages/Greek b/rtdata/languages/Greek
index 13d87c84c..4cb598b53 100644
--- a/rtdata/languages/Greek
+++ b/rtdata/languages/Greek
@@ -953,6 +953,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία
!HISTORY_MSG_440;CbDL - Method
!HISTORY_MSG_441;Retinex - Gain transmission
!HISTORY_MSG_442;Retinex - Scale
+!HISTORY_MSG_443;Output Black Point Compensation
!HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!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
@@ -1121,7 +1122,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία
!PREFERENCES_FLUOF2;Fluorescent F2
!PREFERENCES_FLUOF7;Fluorescent F7
!PREFERENCES_FLUOF11;Fluorescent F11
-!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Editor's panel and the File Browser
+!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser
!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser.
!PREFERENCES_GREY;Output device's Yb luminance (%)
!PREFERENCES_GREY05;Yb=05 CIE L#30
@@ -1157,6 +1158,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία
!PREFERENCES_MENUOPTIONS;Context Menu Options
!PREFERENCES_METADATA;Metadata
!PREFERENCES_MIN;Mini (100x115)
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
!PREFERENCES_MONINTENT;Default monitor intent
!PREFERENCES_MONPROFILE;Default monitor profile
!PREFERENCES_MULTITAB;Multiple Editor Tabs Mode
@@ -1180,7 +1182,8 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία
!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_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels
!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements.
-!PREFERENCES_SELECTFONT;Select font
+!PREFERENCES_SELECTFONT;Select global font
+!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings
!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files
!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation.
@@ -1237,6 +1240,8 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία
!SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF
!SAVEDLG_WARNFILENAME;File will be named
!SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders.
+!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
!THRESHOLDSELECTOR_B;Bottom
!THRESHOLDSELECTOR_BL;Bottom-left
!THRESHOLDSELECTOR_BR;Bottom-right
@@ -1244,6 +1249,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία
!THRESHOLDSELECTOR_T;Top
!THRESHOLDSELECTOR_TL;Top-left
!THRESHOLDSELECTOR_TR;Top-right
+!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
!TP_BWMIX_ALGO;Algorithm OYCPM
!TP_BWMIX_ALGO_LI;Linear
!TP_BWMIX_ALGO_SP;Special effects
@@ -1450,7 +1456,6 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία
!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma
!TP_DIRPYRDENOISE_CURVEEDITOR_CC_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_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise
-!TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Can be used on raw and non-raw images.\n\nFor non-raw images noise reduction of luminance depends on the gamma of the input color profile. An sRGB gamma is assumed, thus if the image uses an input color profile of a different gamma, the effects of luminance noise reduction will differ.
!TP_DIRPYRDENOISE_ENH;Enhanced mode
!TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase.
!TP_DIRPYRDENOISE_GAMMA;Gamma
@@ -1465,13 +1470,11 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία
!TP_DIRPYRDENOISE_LTYPE;Luminance control
!TP_DIRPYRDENOISE_LUMA;Luminance
!TP_DIRPYRDENOISE_LUMAFR;Luminance
-!TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail
!TP_DIRPYRDENOISE_MAN;Manual
!TP_DIRPYRDENOISE_MANU;Manual
!TP_DIRPYRDENOISE_MED;Median Filter
!TP_DIRPYRDENOISE_MEDMETHOD;Median method
!TP_DIRPYRDENOISE_MEDTYPE;Median type
-!TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising
!TP_DIRPYRDENOISE_METHOD;Method
!TP_DIRPYRDENOISE_METHOD11;Quality
!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time.
@@ -1581,6 +1584,8 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία
!TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is only enabled if the selected DCP has one.
!TP_ICM_BLENDCMSMATRIX;Blend ICC highlights with matrix
!TP_ICM_BLENDCMSMATRIX_TOOLTIP;Enable to recover clipped highlights when using LUT-based ICC profiles.
+!TP_ICM_BPC;Black Point Compensation
+!TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
!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 enabled if a Dual-Illuminant DCP with interpolation support is selected.
@@ -1797,7 +1802,6 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία
!TP_SHARPENEDGE_LABEL;Edges
!TP_SHARPENEDGE_PASSES;Iterations
!TP_SHARPENEDGE_THREE;Luminance only
-!TP_SHARPENING_TOOLTIP;Expect a slightly different effect when using with CIECAM02. If difference is observed, adjust to taste.
!TP_SHARPENMICRO_AMOUNT;Quantity
!TP_SHARPENMICRO_LABEL;Microcontrast
!TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5
diff --git a/rtdata/languages/Hebrew b/rtdata/languages/Hebrew
index f91ac1f95..89e7c0eae 100644
--- a/rtdata/languages/Hebrew
+++ b/rtdata/languages/Hebrew
@@ -954,6 +954,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום
!HISTORY_MSG_440;CbDL - Method
!HISTORY_MSG_441;Retinex - Gain transmission
!HISTORY_MSG_442;Retinex - Scale
+!HISTORY_MSG_443;Output Black Point Compensation
!HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!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
@@ -1122,7 +1123,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום
!PREFERENCES_FLUOF2;Fluorescent F2
!PREFERENCES_FLUOF7;Fluorescent F7
!PREFERENCES_FLUOF11;Fluorescent F11
-!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Editor's panel and the File Browser
+!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser
!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser.
!PREFERENCES_GREY;Output device's Yb luminance (%)
!PREFERENCES_GREY05;Yb=05 CIE L#30
@@ -1158,6 +1159,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום
!PREFERENCES_MENUOPTIONS;Context Menu Options
!PREFERENCES_METADATA;Metadata
!PREFERENCES_MIN;Mini (100x115)
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
!PREFERENCES_MONINTENT;Default monitor intent
!PREFERENCES_MONPROFILE;Default monitor profile
!PREFERENCES_MULTITAB;Multiple Editor Tabs Mode
@@ -1181,7 +1183,8 @@ TP_WBALANCE_TEMPERATURE;מידת חום
!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_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels
!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements.
-!PREFERENCES_SELECTFONT;Select font
+!PREFERENCES_SELECTFONT;Select global font
+!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings
!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files
!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation.
@@ -1238,6 +1241,8 @@ TP_WBALANCE_TEMPERATURE;מידת חום
!SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF
!SAVEDLG_WARNFILENAME;File will be named
!SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders.
+!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
!THRESHOLDSELECTOR_B;Bottom
!THRESHOLDSELECTOR_BL;Bottom-left
!THRESHOLDSELECTOR_BR;Bottom-right
@@ -1245,6 +1250,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום
!THRESHOLDSELECTOR_T;Top
!THRESHOLDSELECTOR_TL;Top-left
!THRESHOLDSELECTOR_TR;Top-right
+!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
!TP_BWMIX_ALGO;Algorithm OYCPM
!TP_BWMIX_ALGO_LI;Linear
!TP_BWMIX_ALGO_SP;Special effects
@@ -1451,7 +1457,6 @@ TP_WBALANCE_TEMPERATURE;מידת חום
!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma
!TP_DIRPYRDENOISE_CURVEEDITOR_CC_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_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise
-!TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Can be used on raw and non-raw images.\n\nFor non-raw images noise reduction of luminance depends on the gamma of the input color profile. An sRGB gamma is assumed, thus if the image uses an input color profile of a different gamma, the effects of luminance noise reduction will differ.
!TP_DIRPYRDENOISE_ENH;Enhanced mode
!TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase.
!TP_DIRPYRDENOISE_GAMMA;Gamma
@@ -1466,13 +1471,11 @@ TP_WBALANCE_TEMPERATURE;מידת חום
!TP_DIRPYRDENOISE_LTYPE;Luminance control
!TP_DIRPYRDENOISE_LUMA;Luminance
!TP_DIRPYRDENOISE_LUMAFR;Luminance
-!TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail
!TP_DIRPYRDENOISE_MAN;Manual
!TP_DIRPYRDENOISE_MANU;Manual
!TP_DIRPYRDENOISE_MED;Median Filter
!TP_DIRPYRDENOISE_MEDMETHOD;Median method
!TP_DIRPYRDENOISE_MEDTYPE;Median type
-!TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising
!TP_DIRPYRDENOISE_METHOD;Method
!TP_DIRPYRDENOISE_METHOD11;Quality
!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time.
@@ -1582,6 +1585,8 @@ TP_WBALANCE_TEMPERATURE;מידת חום
!TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is only enabled if the selected DCP has one.
!TP_ICM_BLENDCMSMATRIX;Blend ICC highlights with matrix
!TP_ICM_BLENDCMSMATRIX_TOOLTIP;Enable to recover clipped highlights when using LUT-based ICC profiles.
+!TP_ICM_BPC;Black Point Compensation
+!TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
!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 enabled if a Dual-Illuminant DCP with interpolation support is selected.
@@ -1798,7 +1803,6 @@ TP_WBALANCE_TEMPERATURE;מידת חום
!TP_SHARPENEDGE_LABEL;Edges
!TP_SHARPENEDGE_PASSES;Iterations
!TP_SHARPENEDGE_THREE;Luminance only
-!TP_SHARPENING_TOOLTIP;Expect a slightly different effect when using with CIECAM02. If difference is observed, adjust to taste.
!TP_SHARPENMICRO_AMOUNT;Quantity
!TP_SHARPENMICRO_LABEL;Microcontrast
!TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5
diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano
index eabb2ff60..70739f62d 100644
--- a/rtdata/languages/Italiano
+++ b/rtdata/languages/Italiano
@@ -1029,7 +1029,6 @@ TP_DEFRINGE_RADIUS;Raggio
TP_DEFRINGE_THRESHOLD;Soglia
TP_DIRPYRDENOISE_BLUE;Crominanza - Blu-Giallo
TP_DIRPYRDENOISE_CHROMA;Crominanza (Principale)
-TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Utilizzabile su immagini raw e non raw.\n\nPer immagini non raw, la riduzione rumore di luminanza dipende dal gamma del profilo colore di ingresso. Si presume un gamma sRGB, quindi se l'immagine di ingresso ha un profilo colore di un gamma diverso, la riduzione rumore di luminanza cambierà.
TP_DIRPYRDENOISE_ENH;Modalità Migliorata
TP_DIRPYRDENOISE_ENH_TOOLTIP;Aumenta la qualità della riduzione rumore al costo di un incremento del 20% del tempo di elaborazione.
TP_DIRPYRDENOISE_GAMMA;Gamma
@@ -1574,6 +1573,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: -
!HISTORY_MSG_440;CbDL - Method
!HISTORY_MSG_441;Retinex - Gain transmission
!HISTORY_MSG_442;Retinex - Scale
+!HISTORY_MSG_443;Output Black Point Compensation
!MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor
!MAIN_TAB_INSPECT; Inspect
!MAIN_TAB_WAVELET;Wavelet
@@ -1607,7 +1607,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: -
!PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two.
!PREFERENCES_EXPAUT;Expert
!PREFERENCES_FILMSIMULATION;Film Simulation
-!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Editor's panel and the File Browser
+!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser
!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser.
!PREFERENCES_GREYSC;Scene Yb luminance (%)
!PREFERENCES_GREYSC18;Yb=18 CIE L#50
@@ -1623,6 +1623,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: -
!PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders
!PREFERENCES_MED;Medium (Tile/2)
!PREFERENCES_MIN;Mini (100x115)
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
!PREFERENCES_MONINTENT;Default monitor intent
!PREFERENCES_MONPROFILE;Default monitor profile
!PREFERENCES_NAVIGATIONFRAME;Navigation
@@ -1637,6 +1638,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: -
!PREFERENCES_PROFILE_NONE;None
!PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset
!PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3".
+!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings
!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files
!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation.
@@ -1653,6 +1655,9 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: -
!PREFERENCES_WLTWO;Two levels
!PREFERENCES_WLZER;No
!SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling.
+!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
+!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
!TP_CBDL_AFT;After Black-and-White
!TP_CBDL_BEF;Before Black-and-White
!TP_CBDL_METHOD;Process located
@@ -1721,13 +1726,11 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: -
!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal)
!TP_DIRPYRDENOISE_LTYPE;Luminance control
!TP_DIRPYRDENOISE_LUMAFR;Luminance
-!TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail
!TP_DIRPYRDENOISE_MAN;Manual
!TP_DIRPYRDENOISE_MANU;Manual
!TP_DIRPYRDENOISE_MED;Median Filter
!TP_DIRPYRDENOISE_MEDMETHOD;Median method
!TP_DIRPYRDENOISE_MEDTYPE;Median type
-!TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising
!TP_DIRPYRDENOISE_METHOD11;Quality
!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time.
!TP_DIRPYRDENOISE_METM_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.
@@ -1764,6 +1767,8 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: -
!TP_ICM_APPLYHUESATMAP_TOOLTIP;Employ the embedded DCP base table (HueSatMap). The setting is only enabled 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 enabled if the selected DCP has one.
+!TP_ICM_BPC;Black Point Compensation
+!TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
!TP_ICM_PROFILEINTENT;Rendering Intent
!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.
diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese
index 34211dbb3..b13b2bd81 100644
--- a/rtdata/languages/Japanese
+++ b/rtdata/languages/Japanese
@@ -1344,7 +1344,6 @@ TP_DIRPYRDENOISE_CUR;カーブ
TP_DIRPYRDENOISE_CURVEEDITOR_CC;色度
TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;色度のスライダーの値を全て増やします(乗数)\nこれは色度に応じて色ノイズの低減効果の強弱を調節するカーブです。例えば、色度の低い部分で低減効果を高めるとか、色度の高い部分で低減効果を緩める、という具合です。
TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;‘輝度’の位置でノイズ低減の強さを加減します
-TP_DIRPYRDENOISE_ENABLED_TOOLTIP;rawと非raw画像に使用することができます\n\n非raw画像の場合、輝度ノイズ低減は、入力カラープロファイルのガンマを使って行います。その際sRGBのガンマが想定されていますので、入力画像が異なるガンマのカラープロファイルであれば、輝度ノイズ低減の結果も異なります。
TP_DIRPYRDENOISE_ENH;強化モード
TP_DIRPYRDENOISE_ENH_TOOLTIP;ノイズ低減の効果を髙めますが、代わりに演算時間が約20%増えます。
TP_DIRPYRDENOISE_GAMMA;ガンマ
@@ -1359,13 +1358,11 @@ TP_DIRPYRDENOISE_LPLABM;加重平均 L* (少なめ) + a*b* (普通)
TP_DIRPYRDENOISE_LTYPE;輝度ノイズの調整法
TP_DIRPYRDENOISE_LUMA;輝度
TP_DIRPYRDENOISE_LUMAFR;輝度ノイズ
-TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;輝度の低減で、全体的にはウェーブレット変換、ディテールにはフーリエ変換を使います
TP_DIRPYRDENOISE_MAN;手動
TP_DIRPYRDENOISE_MANU;手動
TP_DIRPYRDENOISE_MED;メディアンフィルター
TP_DIRPYRDENOISE_MEDMETHOD;方式
TP_DIRPYRDENOISE_MEDTYPE;フィルターの種類
-TP_DIRPYRDENOISE_MED_TOOLTIP;メディアンフィルターによるノイズ低減を有効にします
TP_DIRPYRDENOISE_METHOD;方式
TP_DIRPYRDENOISE_METHOD11;ノイズ低減の質
TP_DIRPYRDENOISE_METHOD11_TOOLTIP;ノイズの状態に応じて低減効果の質を選べます:1-標準 2-高い\n2の方がノイズ低減効果は高くなりますが、その分処理時間が増えます。
@@ -1954,17 +1951,23 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: -
!HISTORY_MSG_440;CbDL - Method
!HISTORY_MSG_441;Retinex - Gain transmission
!HISTORY_MSG_442;Retinex - Scale
+!HISTORY_MSG_443;Output Black Point Compensation
!MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor
!MONITOR_PROFILE_SYSTEM;System default
!PARTIALPASTE_PRSHARPENING;Post-resize sharpening
!PARTIALPASTE_RETINEX;Retinex
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
!PREFERENCES_MONINTENT;Default monitor intent
!PREFERENCES_MONPROFILE;Default monitor profile
!PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list.
!PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list.
!PREFERENCES_PROFILE_NONE;None
+!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
!PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file
!SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling.
+!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
+!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
!TP_CBDL_AFT;After Black-and-White
!TP_CBDL_BEF;Before Black-and-White
!TP_CBDL_METHOD;Process located
@@ -1978,6 +1981,8 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: -
!TP_DIRPYRDENOISE_MET_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_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_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_ICM_BPC;Black Point Compensation
+!TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
!TP_ICM_PROFILEINTENT;Rendering Intent
!TP_NEUTRAL;Reset
!TP_RAWCACORR_CASTR;Strength
diff --git a/rtdata/languages/Latvian b/rtdata/languages/Latvian
index 8e93725bb..a3022fab7 100644
--- a/rtdata/languages/Latvian
+++ b/rtdata/languages/Latvian
@@ -954,6 +954,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra
!HISTORY_MSG_440;CbDL - Method
!HISTORY_MSG_441;Retinex - Gain transmission
!HISTORY_MSG_442;Retinex - Scale
+!HISTORY_MSG_443;Output Black Point Compensation
!HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!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
@@ -1122,7 +1123,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra
!PREFERENCES_FLUOF2;Fluorescent F2
!PREFERENCES_FLUOF7;Fluorescent F7
!PREFERENCES_FLUOF11;Fluorescent F11
-!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Editor's panel and the File Browser
+!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser
!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser.
!PREFERENCES_GREY;Output device's Yb luminance (%)
!PREFERENCES_GREY05;Yb=05 CIE L#30
@@ -1158,6 +1159,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra
!PREFERENCES_MENUOPTIONS;Context Menu Options
!PREFERENCES_METADATA;Metadata
!PREFERENCES_MIN;Mini (100x115)
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
!PREFERENCES_MONINTENT;Default monitor intent
!PREFERENCES_MONPROFILE;Default monitor profile
!PREFERENCES_MULTITAB;Multiple Editor Tabs Mode
@@ -1181,7 +1183,8 @@ TP_WBALANCE_TEMPERATURE;Temperatūra
!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_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels
!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements.
-!PREFERENCES_SELECTFONT;Select font
+!PREFERENCES_SELECTFONT;Select global font
+!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings
!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files
!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation.
@@ -1238,6 +1241,8 @@ TP_WBALANCE_TEMPERATURE;Temperatūra
!SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF
!SAVEDLG_WARNFILENAME;File will be named
!SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders.
+!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
!THRESHOLDSELECTOR_B;Bottom
!THRESHOLDSELECTOR_BL;Bottom-left
!THRESHOLDSELECTOR_BR;Bottom-right
@@ -1245,6 +1250,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra
!THRESHOLDSELECTOR_T;Top
!THRESHOLDSELECTOR_TL;Top-left
!THRESHOLDSELECTOR_TR;Top-right
+!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
!TP_BWMIX_ALGO;Algorithm OYCPM
!TP_BWMIX_ALGO_LI;Linear
!TP_BWMIX_ALGO_SP;Special effects
@@ -1451,7 +1457,6 @@ TP_WBALANCE_TEMPERATURE;Temperatūra
!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma
!TP_DIRPYRDENOISE_CURVEEDITOR_CC_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_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise
-!TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Can be used on raw and non-raw images.\n\nFor non-raw images noise reduction of luminance depends on the gamma of the input color profile. An sRGB gamma is assumed, thus if the image uses an input color profile of a different gamma, the effects of luminance noise reduction will differ.
!TP_DIRPYRDENOISE_ENH;Enhanced mode
!TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase.
!TP_DIRPYRDENOISE_GAMMA;Gamma
@@ -1466,13 +1471,11 @@ TP_WBALANCE_TEMPERATURE;Temperatūra
!TP_DIRPYRDENOISE_LTYPE;Luminance control
!TP_DIRPYRDENOISE_LUMA;Luminance
!TP_DIRPYRDENOISE_LUMAFR;Luminance
-!TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail
!TP_DIRPYRDENOISE_MAN;Manual
!TP_DIRPYRDENOISE_MANU;Manual
!TP_DIRPYRDENOISE_MED;Median Filter
!TP_DIRPYRDENOISE_MEDMETHOD;Median method
!TP_DIRPYRDENOISE_MEDTYPE;Median type
-!TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising
!TP_DIRPYRDENOISE_METHOD;Method
!TP_DIRPYRDENOISE_METHOD11;Quality
!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time.
@@ -1582,6 +1585,8 @@ TP_WBALANCE_TEMPERATURE;Temperatūra
!TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is only enabled if the selected DCP has one.
!TP_ICM_BLENDCMSMATRIX;Blend ICC highlights with matrix
!TP_ICM_BLENDCMSMATRIX_TOOLTIP;Enable to recover clipped highlights when using LUT-based ICC profiles.
+!TP_ICM_BPC;Black Point Compensation
+!TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
!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 enabled if a Dual-Illuminant DCP with interpolation support is selected.
@@ -1798,7 +1803,6 @@ TP_WBALANCE_TEMPERATURE;Temperatūra
!TP_SHARPENEDGE_LABEL;Edges
!TP_SHARPENEDGE_PASSES;Iterations
!TP_SHARPENEDGE_THREE;Luminance only
-!TP_SHARPENING_TOOLTIP;Expect a slightly different effect when using with CIECAM02. If difference is observed, adjust to taste.
!TP_SHARPENMICRO_AMOUNT;Quantity
!TP_SHARPENMICRO_LABEL;Microcontrast
!TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5
diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar
index dc4129b8f..c102d9423 100644
--- a/rtdata/languages/Magyar
+++ b/rtdata/languages/Magyar
@@ -1235,6 +1235,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés -
!HISTORY_MSG_440;CbDL - Method
!HISTORY_MSG_441;Retinex - Gain transmission
!HISTORY_MSG_442;Retinex - Scale
+!HISTORY_MSG_443;Output Black Point Compensation
!HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
!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
@@ -1316,7 +1317,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés -
!PREFERENCES_FLUOF2;Fluorescent F2
!PREFERENCES_FLUOF7;Fluorescent F7
!PREFERENCES_FLUOF11;Fluorescent F11
-!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Editor's panel and the File Browser
+!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser
!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser.
!PREFERENCES_GREY;Output device's Yb luminance (%)
!PREFERENCES_GREY05;Yb=05 CIE L#30
@@ -1343,6 +1344,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés -
!PREFERENCES_MED;Medium (Tile/2)
!PREFERENCES_MENUGROUPEXTPROGS;Group "Open with"
!PREFERENCES_MIN;Mini (100x115)
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
!PREFERENCES_MONINTENT;Default monitor intent
!PREFERENCES_MONPROFILE;Default monitor profile
!PREFERENCES_NAVGUIDEBRUSH;Navigator guide color
@@ -1360,6 +1362,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés -
!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_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels
!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements.
+!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings
!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files
!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation.
@@ -1393,6 +1396,8 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés -
!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.
!SAVEDLG_WARNFILENAME;File will be named
!SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders.
+!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
!THRESHOLDSELECTOR_B;Bottom
!THRESHOLDSELECTOR_BL;Bottom-left
!THRESHOLDSELECTOR_BR;Bottom-right
@@ -1400,6 +1405,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés -
!THRESHOLDSELECTOR_T;Top
!THRESHOLDSELECTOR_TL;Top-left
!THRESHOLDSELECTOR_TR;Top-right
+!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
!TP_BWMIX_ALGO;Algorithm OYCPM
!TP_BWMIX_ALGO_LI;Linear
!TP_BWMIX_ALGO_SP;Special effects
@@ -1596,7 +1602,6 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés -
!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma
!TP_DIRPYRDENOISE_CURVEEDITOR_CC_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_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise
-!TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Can be used on raw and non-raw images.\n\nFor non-raw images noise reduction of luminance depends on the gamma of the input color profile. An sRGB gamma is assumed, thus if the image uses an input color profile of a different gamma, the effects of luminance noise reduction will differ.
!TP_DIRPYRDENOISE_ENH;Enhanced mode
!TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase.
!TP_DIRPYRDENOISE_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.
@@ -1608,13 +1613,11 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés -
!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal)
!TP_DIRPYRDENOISE_LTYPE;Luminance control
!TP_DIRPYRDENOISE_LUMAFR;Luminance
-!TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail
!TP_DIRPYRDENOISE_MAN;Manual
!TP_DIRPYRDENOISE_MANU;Manual
!TP_DIRPYRDENOISE_MED;Median Filter
!TP_DIRPYRDENOISE_MEDMETHOD;Median method
!TP_DIRPYRDENOISE_MEDTYPE;Median type
-!TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising
!TP_DIRPYRDENOISE_METHOD;Method
!TP_DIRPYRDENOISE_METHOD11;Quality
!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time.
@@ -1686,6 +1689,8 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés -
!TP_ICM_APPLYHUESATMAP_TOOLTIP;Employ the embedded DCP base table (HueSatMap). The setting is only enabled 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 enabled if the selected DCP has one.
+!TP_ICM_BPC;Black Point Compensation
+!TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
!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 enabled if a Dual-Illuminant DCP with interpolation support is selected.
@@ -1851,7 +1856,6 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés -
!TP_RGBCURVES_LUMAMODE_TOOLTIP;Luminosity mode allows to vary the contribution of R, G and B channels to the luminosity of the image, without altering image color.
!TP_SAVEDIALOG_OK_TIP;Shortcut: Ctrl-Enter
!TP_SHADOWSHLIGHTS_SHARPMASK;Sharp mask
-!TP_SHARPENING_TOOLTIP;Expect a slightly different effect when using with CIECAM02. If difference is observed, adjust to taste.
!TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH
!TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones
!TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Red/Purple
diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands
index 54e0a68e1..bf47b01ad 100644
--- a/rtdata/languages/Nederlands
+++ b/rtdata/languages/Nederlands
@@ -1375,7 +1375,6 @@ TP_DIRPYRDENOISE_CUR;Curve
TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma
TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Vergroot (vermenigvuldigt) de waarde van alle chrominantie schuifbalken.\nMet deze curve kun je de sterkte aanpassen van de chromatische ruisonderdrukking. Bijvoorbeeld door de werking te vergroten in gebieden met lage verzadiging en te verminderen in gebieden met hoge verzadiging.
TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Luminantie ruisonderdrukking. Werkt niet lineair maar modulerend
-TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Kan worden gebruikt op raw en niet-raw afbeeldingen.\n\nVoor niet-raw afbeeldingen geldt dat ruisonderdrukking van de luminantie afhangt van het gamma van het invoerprofiel. Standaard wordt uitgegaan van het gamma van sRGB. Als de afbeelding dus een kleurprofiel heeft met een afwijkend gamma, zal de luminantie ruisonderdrukking verschillen.
TP_DIRPYRDENOISE_ENH;Verbeteren
TP_DIRPYRDENOISE_ENH_TOOLTIP;Verbetert de ruisonderdrukking, maar vergroot de verwerkingstijd met ongeveer 20%
TP_DIRPYRDENOISE_GAMMA;Gamma
@@ -1390,13 +1389,11 @@ TP_DIRPYRDENOISE_LPLABM;Gewogen L* (weinig) + a*b* (normaal)
TP_DIRPYRDENOISE_LTYPE;Type gereedschap
TP_DIRPYRDENOISE_LUMA;Luminantie
TP_DIRPYRDENOISE_LUMAFR;Luminantie
-TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet voor Luminantie- en Fourier transformatie voor betere details bij luminantie
TP_DIRPYRDENOISE_MAN;Handmatig
TP_DIRPYRDENOISE_MANU;Handmatig
TP_DIRPYRDENOISE_MED;Mediaan filter
TP_DIRPYRDENOISE_MEDMETHOD;Methode
TP_DIRPYRDENOISE_MEDTYPE;Type
-TP_DIRPYRDENOISE_MED_TOOLTIP;Mediaan ruisonderdrukking
TP_DIRPYRDENOISE_METHOD;Methode
TP_DIRPYRDENOISE_METHOD11;Kwaliteit
TP_DIRPYRDENOISE_METHOD11_TOOLTIP;De kwaliteit kan worden aangepast aan de hoeveelheid ruis. \nHoog verbetert de ruisonderdrukking, maar verlengt de verwerkingstijd
@@ -2034,6 +2031,12 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: -
!HISTORY_MSG_439;Retinex - Process
!HISTORY_MSG_441;Retinex - Gain transmission
!HISTORY_MSG_442;Retinex - Scale
+!HISTORY_MSG_443;Output Black Point Compensation
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
+!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
+!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
+!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
!TP_BWMIX_AUTOCH;Auto
!TP_DIRPYRDENOISE_3X3;3×3
!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft
@@ -2043,6 +2046,8 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: -
!TP_DIRPYRDENOISE_9X9;9×9
!TP_DIRPYRDENOISE_MET_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_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_ICM_BPC;Black Point Compensation
+!TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
!TP_RETINEX_GAINOFFS;Gain and Offset (brightness)
!TP_RETINEX_GAINTRANSMISSION;Gain transmission
!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain.
diff --git a/rtdata/languages/Norsk BM b/rtdata/languages/Norsk BM
index a3554ca16..6b2901927 100644
--- a/rtdata/languages/Norsk BM
+++ b/rtdata/languages/Norsk BM
@@ -953,6 +953,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!HISTORY_MSG_440;CbDL - Method
!HISTORY_MSG_441;Retinex - Gain transmission
!HISTORY_MSG_442;Retinex - Scale
+!HISTORY_MSG_443;Output Black Point Compensation
!HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!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
@@ -1121,7 +1122,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!PREFERENCES_FLUOF2;Fluorescent F2
!PREFERENCES_FLUOF7;Fluorescent F7
!PREFERENCES_FLUOF11;Fluorescent F11
-!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Editor's panel and the File Browser
+!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser
!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser.
!PREFERENCES_GREY;Output device's Yb luminance (%)
!PREFERENCES_GREY05;Yb=05 CIE L#30
@@ -1157,6 +1158,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!PREFERENCES_MENUOPTIONS;Context Menu Options
!PREFERENCES_METADATA;Metadata
!PREFERENCES_MIN;Mini (100x115)
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
!PREFERENCES_MONINTENT;Default monitor intent
!PREFERENCES_MONPROFILE;Default monitor profile
!PREFERENCES_MULTITAB;Multiple Editor Tabs Mode
@@ -1180,7 +1182,8 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!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_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels
!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements.
-!PREFERENCES_SELECTFONT;Select font
+!PREFERENCES_SELECTFONT;Select global font
+!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings
!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files
!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation.
@@ -1237,6 +1240,8 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF
!SAVEDLG_WARNFILENAME;File will be named
!SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders.
+!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
!THRESHOLDSELECTOR_B;Bottom
!THRESHOLDSELECTOR_BL;Bottom-left
!THRESHOLDSELECTOR_BR;Bottom-right
@@ -1244,6 +1249,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!THRESHOLDSELECTOR_T;Top
!THRESHOLDSELECTOR_TL;Top-left
!THRESHOLDSELECTOR_TR;Top-right
+!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
!TP_BWMIX_ALGO;Algorithm OYCPM
!TP_BWMIX_ALGO_LI;Linear
!TP_BWMIX_ALGO_SP;Special effects
@@ -1450,7 +1456,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma
!TP_DIRPYRDENOISE_CURVEEDITOR_CC_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_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise
-!TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Can be used on raw and non-raw images.\n\nFor non-raw images noise reduction of luminance depends on the gamma of the input color profile. An sRGB gamma is assumed, thus if the image uses an input color profile of a different gamma, the effects of luminance noise reduction will differ.
!TP_DIRPYRDENOISE_ENH;Enhanced mode
!TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase.
!TP_DIRPYRDENOISE_GAMMA;Gamma
@@ -1465,13 +1470,11 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!TP_DIRPYRDENOISE_LTYPE;Luminance control
!TP_DIRPYRDENOISE_LUMA;Luminance
!TP_DIRPYRDENOISE_LUMAFR;Luminance
-!TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail
!TP_DIRPYRDENOISE_MAN;Manual
!TP_DIRPYRDENOISE_MANU;Manual
!TP_DIRPYRDENOISE_MED;Median Filter
!TP_DIRPYRDENOISE_MEDMETHOD;Median method
!TP_DIRPYRDENOISE_MEDTYPE;Median type
-!TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising
!TP_DIRPYRDENOISE_METHOD;Method
!TP_DIRPYRDENOISE_METHOD11;Quality
!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time.
@@ -1581,6 +1584,8 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is only enabled if the selected DCP has one.
!TP_ICM_BLENDCMSMATRIX;Blend ICC highlights with matrix
!TP_ICM_BLENDCMSMATRIX_TOOLTIP;Enable to recover clipped highlights when using LUT-based ICC profiles.
+!TP_ICM_BPC;Black Point Compensation
+!TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
!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 enabled if a Dual-Illuminant DCP with interpolation support is selected.
@@ -1797,7 +1802,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!TP_SHARPENEDGE_LABEL;Edges
!TP_SHARPENEDGE_PASSES;Iterations
!TP_SHARPENEDGE_THREE;Luminance only
-!TP_SHARPENING_TOOLTIP;Expect a slightly different effect when using with CIECAM02. If difference is observed, adjust to taste.
!TP_SHARPENMICRO_AMOUNT;Quantity
!TP_SHARPENMICRO_LABEL;Microcontrast
!TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5
diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish
index 584409e96..0b3bbe5f0 100644
--- a/rtdata/languages/Polish
+++ b/rtdata/languages/Polish
@@ -1120,7 +1120,6 @@ TP_DEFRINGE_THRESHOLD;Próg
TP_DIRPYRDENOISE_BLUE;Chrominancja - Błękit-żółć
TP_DIRPYRDENOISE_CHROMA;Chrominancja - Główna
TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Moduluje działanie usuwania szumów luminancji
-TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Działa z obrazami typu raw i nie-raw.\n\nDla obrazów typu raw, działanie redukcji szumów luminancji zależy od gammy wejściowego profilu ICC. Z góry założona jest gamma sRGB, zatem jeśli obraz wejściowy ma profil o innej gammie można się spodziewać zmian w działaniu rekucji szumów luminancji.
TP_DIRPYRDENOISE_ENH;Tryb ulepszony
TP_DIRPYRDENOISE_ENH_TOOLTIP;Ulepsza jakość usuwania szumów kosztem około 20% wzrostu czasu przetwarzania.
TP_DIRPYRDENOISE_GAMMA;Gamma
@@ -1134,7 +1133,6 @@ TP_DIRPYRDENOISE_LUMA;Luminacja
TP_DIRPYRDENOISE_MED;Filtr Mediana
TP_DIRPYRDENOISE_MEDMETHOD;Metoda mediana
TP_DIRPYRDENOISE_MEDTYPE;Rodzaj mediana
-TP_DIRPYRDENOISE_MED_TOOLTIP;Włącz odszumianie metodą mediana.
TP_DIRPYRDENOISE_METHOD;Metoda
TP_DIRPYRDENOISE_METHOD11;Jakość
TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Jakość może zostać dopasowana do wzoru szumów. Ustawienie "wysoka" ulepsza odszumianie około 20% wzrostu czasu przetwarzania.
@@ -1659,6 +1657,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: -
!HISTORY_MSG_440;CbDL - Method
!HISTORY_MSG_441;Retinex - Gain transmission
!HISTORY_MSG_442;Retinex - Scale
+!HISTORY_MSG_443;Output Black Point Compensation
!MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor
!MAIN_TAB_INSPECT; Inspect
!MAIN_TAB_WAVELET;Wavelet
@@ -1685,7 +1684,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: -
!PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4
!PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two.
!PREFERENCES_EXPAUT;Expert
-!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Editor's panel and the File Browser
+!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser
!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser.
!PREFERENCES_GREYSC;Scene Yb luminance (%)
!PREFERENCES_GREYSC18;Yb=18 CIE L#50
@@ -1701,6 +1700,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: -
!PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders
!PREFERENCES_MED;Medium (Tile/2)
!PREFERENCES_MIN;Mini (100x115)
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
!PREFERENCES_MONINTENT;Default monitor intent
!PREFERENCES_MONPROFILE;Default monitor profile
!PREFERENCES_NAVIGATIONFRAME;Navigation
@@ -1715,6 +1715,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: -
!PREFERENCES_PROFILE_NONE;None
!PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset
!PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3".
+!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings
!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files
!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation.
@@ -1731,6 +1732,9 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: -
!PREFERENCES_WLTWO;Two levels
!PREFERENCES_WLZER;No
!SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling.
+!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
+!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
!TP_CBDL_AFT;After Black-and-White
!TP_CBDL_BEF;Before Black-and-White
!TP_CBDL_METHOD;Process located
@@ -1760,7 +1764,6 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: -
!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal)
!TP_DIRPYRDENOISE_LTYPE;Luminance control
!TP_DIRPYRDENOISE_LUMAFR;Luminance
-!TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail
!TP_DIRPYRDENOISE_MAN;Manual
!TP_DIRPYRDENOISE_MANU;Manual
!TP_DIRPYRDENOISE_MET_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.
@@ -1785,6 +1788,8 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: -
!TP_ICM_APPLYHUESATMAP_TOOLTIP;Employ the embedded DCP base table (HueSatMap). The setting is only enabled 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 enabled if the selected DCP has one.
+!TP_ICM_BPC;Black Point Compensation
+!TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
!TP_ICM_PROFILEINTENT;Rendering Intent
!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.
diff --git a/rtdata/languages/Polish (Latin Characters) b/rtdata/languages/Polish (Latin Characters)
index 5ff2cc31b..e4bd5fc83 100644
--- a/rtdata/languages/Polish (Latin Characters)
+++ b/rtdata/languages/Polish (Latin Characters)
@@ -1120,7 +1120,6 @@ TP_DEFRINGE_THRESHOLD;Prog
TP_DIRPYRDENOISE_BLUE;Chrominancja - Blekit-zolc
TP_DIRPYRDENOISE_CHROMA;Chrominancja - Glowna
TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Moduluje dzialanie usuwania szumow luminancji
-TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Dziala z obrazami typu raw i nie-raw.\n\nDla obrazow typu raw, dzialanie redukcji szumow luminancji zalezy od gammy wejsciowego profilu ICC. Z gory zalozona jest gamma sRGB, zatem jesli obraz wejsciowy ma profil o innej gammie mozna sie spodziewac zmian w dzialaniu rekucji szumow luminancji.
TP_DIRPYRDENOISE_ENH;Tryb ulepszony
TP_DIRPYRDENOISE_ENH_TOOLTIP;Ulepsza jakosc usuwania szumow kosztem okolo 20% wzrostu czasu przetwarzania.
TP_DIRPYRDENOISE_GAMMA;Gamma
@@ -1134,7 +1133,6 @@ TP_DIRPYRDENOISE_LUMA;Luminacja
TP_DIRPYRDENOISE_MED;Filtr Mediana
TP_DIRPYRDENOISE_MEDMETHOD;Metoda mediana
TP_DIRPYRDENOISE_MEDTYPE;Rodzaj mediana
-TP_DIRPYRDENOISE_MED_TOOLTIP;Wlacz odszumianie metoda mediana.
TP_DIRPYRDENOISE_METHOD;Metoda
TP_DIRPYRDENOISE_METHOD11;Jakosc
TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Jakosc moze zostac dopasowana do wzoru szumow. Ustawienie "wysoka" ulepsza odszumianie okolo 20% wzrostu czasu przetwarzania.
@@ -1659,6 +1657,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: -
!HISTORY_MSG_440;CbDL - Method
!HISTORY_MSG_441;Retinex - Gain transmission
!HISTORY_MSG_442;Retinex - Scale
+!HISTORY_MSG_443;Output Black Point Compensation
!MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor
!MAIN_TAB_INSPECT; Inspect
!MAIN_TAB_WAVELET;Wavelet
@@ -1685,7 +1684,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: -
!PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4
!PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two.
!PREFERENCES_EXPAUT;Expert
-!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Editor's panel and the File Browser
+!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser
!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser.
!PREFERENCES_GREYSC;Scene Yb luminance (%)
!PREFERENCES_GREYSC18;Yb=18 CIE L#50
@@ -1701,6 +1700,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: -
!PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders
!PREFERENCES_MED;Medium (Tile/2)
!PREFERENCES_MIN;Mini (100x115)
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
!PREFERENCES_MONINTENT;Default monitor intent
!PREFERENCES_MONPROFILE;Default monitor profile
!PREFERENCES_NAVIGATIONFRAME;Navigation
@@ -1715,6 +1715,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: -
!PREFERENCES_PROFILE_NONE;None
!PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset
!PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3".
+!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings
!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files
!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation.
@@ -1731,6 +1732,9 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: -
!PREFERENCES_WLTWO;Two levels
!PREFERENCES_WLZER;No
!SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling.
+!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
+!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
!TP_CBDL_AFT;After Black-and-White
!TP_CBDL_BEF;Before Black-and-White
!TP_CBDL_METHOD;Process located
@@ -1760,7 +1764,6 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: -
!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal)
!TP_DIRPYRDENOISE_LTYPE;Luminance control
!TP_DIRPYRDENOISE_LUMAFR;Luminance
-!TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail
!TP_DIRPYRDENOISE_MAN;Manual
!TP_DIRPYRDENOISE_MANU;Manual
!TP_DIRPYRDENOISE_MET_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.
@@ -1785,6 +1788,8 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: -
!TP_ICM_APPLYHUESATMAP_TOOLTIP;Employ the embedded DCP base table (HueSatMap). The setting is only enabled 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 enabled if the selected DCP has one.
+!TP_ICM_BPC;Black Point Compensation
+!TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
!TP_ICM_PROFILEINTENT;Rendering Intent
!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.
diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil)
index 9891c07b3..f12205c7e 100644
--- a/rtdata/languages/Portugues (Brasil)
+++ b/rtdata/languages/Portugues (Brasil)
@@ -954,6 +954,7 @@ TP_WBALANCE_TEMPERATURE;Temperatura
!HISTORY_MSG_440;CbDL - Method
!HISTORY_MSG_441;Retinex - Gain transmission
!HISTORY_MSG_442;Retinex - Scale
+!HISTORY_MSG_443;Output Black Point Compensation
!HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!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
@@ -1122,7 +1123,7 @@ TP_WBALANCE_TEMPERATURE;Temperatura
!PREFERENCES_FLUOF2;Fluorescent F2
!PREFERENCES_FLUOF7;Fluorescent F7
!PREFERENCES_FLUOF11;Fluorescent F11
-!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Editor's panel and the File Browser
+!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser
!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser.
!PREFERENCES_GREY;Output device's Yb luminance (%)
!PREFERENCES_GREY05;Yb=05 CIE L#30
@@ -1158,6 +1159,7 @@ TP_WBALANCE_TEMPERATURE;Temperatura
!PREFERENCES_MENUOPTIONS;Context Menu Options
!PREFERENCES_METADATA;Metadata
!PREFERENCES_MIN;Mini (100x115)
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
!PREFERENCES_MONINTENT;Default monitor intent
!PREFERENCES_MONPROFILE;Default monitor profile
!PREFERENCES_MULTITAB;Multiple Editor Tabs Mode
@@ -1181,7 +1183,8 @@ TP_WBALANCE_TEMPERATURE;Temperatura
!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_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels
!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements.
-!PREFERENCES_SELECTFONT;Select font
+!PREFERENCES_SELECTFONT;Select global font
+!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings
!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files
!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation.
@@ -1238,6 +1241,8 @@ TP_WBALANCE_TEMPERATURE;Temperatura
!SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF
!SAVEDLG_WARNFILENAME;File will be named
!SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders.
+!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
!THRESHOLDSELECTOR_B;Bottom
!THRESHOLDSELECTOR_BL;Bottom-left
!THRESHOLDSELECTOR_BR;Bottom-right
@@ -1245,6 +1250,7 @@ TP_WBALANCE_TEMPERATURE;Temperatura
!THRESHOLDSELECTOR_T;Top
!THRESHOLDSELECTOR_TL;Top-left
!THRESHOLDSELECTOR_TR;Top-right
+!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
!TP_BWMIX_ALGO;Algorithm OYCPM
!TP_BWMIX_ALGO_LI;Linear
!TP_BWMIX_ALGO_SP;Special effects
@@ -1451,7 +1457,6 @@ TP_WBALANCE_TEMPERATURE;Temperatura
!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma
!TP_DIRPYRDENOISE_CURVEEDITOR_CC_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_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise
-!TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Can be used on raw and non-raw images.\n\nFor non-raw images noise reduction of luminance depends on the gamma of the input color profile. An sRGB gamma is assumed, thus if the image uses an input color profile of a different gamma, the effects of luminance noise reduction will differ.
!TP_DIRPYRDENOISE_ENH;Enhanced mode
!TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase.
!TP_DIRPYRDENOISE_GAMMA;Gamma
@@ -1466,13 +1471,11 @@ TP_WBALANCE_TEMPERATURE;Temperatura
!TP_DIRPYRDENOISE_LTYPE;Luminance control
!TP_DIRPYRDENOISE_LUMA;Luminance
!TP_DIRPYRDENOISE_LUMAFR;Luminance
-!TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail
!TP_DIRPYRDENOISE_MAN;Manual
!TP_DIRPYRDENOISE_MANU;Manual
!TP_DIRPYRDENOISE_MED;Median Filter
!TP_DIRPYRDENOISE_MEDMETHOD;Median method
!TP_DIRPYRDENOISE_MEDTYPE;Median type
-!TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising
!TP_DIRPYRDENOISE_METHOD;Method
!TP_DIRPYRDENOISE_METHOD11;Quality
!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time.
@@ -1582,6 +1585,8 @@ TP_WBALANCE_TEMPERATURE;Temperatura
!TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is only enabled if the selected DCP has one.
!TP_ICM_BLENDCMSMATRIX;Blend ICC highlights with matrix
!TP_ICM_BLENDCMSMATRIX_TOOLTIP;Enable to recover clipped highlights when using LUT-based ICC profiles.
+!TP_ICM_BPC;Black Point Compensation
+!TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
!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 enabled if a Dual-Illuminant DCP with interpolation support is selected.
@@ -1798,7 +1803,6 @@ TP_WBALANCE_TEMPERATURE;Temperatura
!TP_SHARPENEDGE_LABEL;Edges
!TP_SHARPENEDGE_PASSES;Iterations
!TP_SHARPENEDGE_THREE;Luminance only
-!TP_SHARPENING_TOOLTIP;Expect a slightly different effect when using with CIECAM02. If difference is observed, adjust to taste.
!TP_SHARPENMICRO_AMOUNT;Quantity
!TP_SHARPENMICRO_LABEL;Microcontrast
!TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5
diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian
index b792e92bc..139d87b49 100644
--- a/rtdata/languages/Russian
+++ b/rtdata/languages/Russian
@@ -973,7 +973,6 @@ TP_DEFRINGE_RADIUS;Радиус
TP_DEFRINGE_THRESHOLD;Порог
TP_DIRPYRDENOISE_BLUE;Цветность: синий-жёлтый
TP_DIRPYRDENOISE_CHROMA;Цветность
-TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Может использоваться как для raw, так и для обычных изображений.\n\nДля не-raw файлов подавление яркостного шума зависит от гаммы входящего цветового профиля, причём подразумевается гамма sRGB. Поэтому, если снимок имеет цветовой профиль с иной гаммой, результаты операции могут варьировать.
TP_DIRPYRDENOISE_ENH;Улучшенный режим
TP_DIRPYRDENOISE_ENH_TOOLTIP;Улучшает качество шумоподавления путём увеличения времени обработки на 20%.
TP_DIRPYRDENOISE_GAMMA;Гамма
@@ -1517,6 +1516,7 @@ ZOOMPANEL_ZOOMOUT;Удалить -
!HISTORY_MSG_440;CbDL - Method
!HISTORY_MSG_441;Retinex - Gain transmission
!HISTORY_MSG_442;Retinex - Scale
+!HISTORY_MSG_443;Output Black Point Compensation
!MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor
!MAIN_TAB_INSPECT; Inspect
!MAIN_TAB_WAVELET;Wavelet
@@ -1561,7 +1561,7 @@ ZOOMPANEL_ZOOMOUT;Удалить -
!PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two.
!PREFERENCES_EXPAUT;Expert
!PREFERENCES_FILMSIMULATION;Film Simulation
-!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Editor's panel and the File Browser
+!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser
!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser.
!PREFERENCES_GREYSC;Scene Yb luminance (%)
!PREFERENCES_GREYSC18;Yb=18 CIE L#50
@@ -1579,6 +1579,7 @@ ZOOMPANEL_ZOOMOUT;Удалить -
!PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders
!PREFERENCES_MED;Medium (Tile/2)
!PREFERENCES_MIN;Mini (100x115)
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
!PREFERENCES_MONINTENT;Default monitor intent
!PREFERENCES_MONPROFILE;Default monitor profile
!PREFERENCES_NAVGUIDEBRUSH;Navigator guide color
@@ -1594,6 +1595,7 @@ ZOOMPANEL_ZOOMOUT;Удалить -
!PREFERENCES_PROFILE_NONE;None
!PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset
!PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3".
+!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings
!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files
!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation.
@@ -1610,6 +1612,9 @@ ZOOMPANEL_ZOOMOUT;Удалить -
!PREFERENCES_WLTWO;Two levels
!PREFERENCES_WLZER;No
!SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling.
+!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
+!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
!TP_BWMIX_SET_RGBABS;Absolute RGB
!TP_BWMIX_SET_RGBREL;Relative RGB
!TP_BWMIX_SET_ROYGCBPMABS;Absolute ROYGCBPM
@@ -1715,13 +1720,11 @@ ZOOMPANEL_ZOOMOUT;Удалить -
!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal)
!TP_DIRPYRDENOISE_LTYPE;Luminance control
!TP_DIRPYRDENOISE_LUMAFR;Luminance
-!TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail
!TP_DIRPYRDENOISE_MAN;Manual
!TP_DIRPYRDENOISE_MANU;Manual
!TP_DIRPYRDENOISE_MED;Median Filter
!TP_DIRPYRDENOISE_MEDMETHOD;Median method
!TP_DIRPYRDENOISE_MEDTYPE;Median type
-!TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising
!TP_DIRPYRDENOISE_METHOD11;Quality
!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time.
!TP_DIRPYRDENOISE_METM_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.
@@ -1765,6 +1768,8 @@ ZOOMPANEL_ZOOMOUT;Удалить -
!TP_ICM_APPLYHUESATMAP_TOOLTIP;Employ the embedded DCP base table (HueSatMap). The setting is only enabled 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 enabled if the selected DCP has one.
+!TP_ICM_BPC;Black Point Compensation
+!TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
!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 enabled if a Dual-Illuminant DCP with interpolation support is selected.
!TP_ICM_PROFILEINTENT;Rendering Intent
!TP_ICM_SAVEREFERENCE_APPLYWB;Apply white balance
diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters)
index 5145322d2..89707bca4 100644
--- a/rtdata/languages/Serbian (Cyrilic Characters)
+++ b/rtdata/languages/Serbian (Cyrilic Characters)
@@ -1080,7 +1080,6 @@ TP_DEFRINGE_THRESHOLD;Праг
TP_DETAIL_AMOUNT;Количина
TP_DIRPYRDENOISE_BLUE;Хроминанса: Плава-Жута
TP_DIRPYRDENOISE_CHROMA;Боја
-TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Може се употребити за raw или не-raw слике.\n\nЗа слике које нису у raw формату уклањање шума луминансе зависи од гаме улазног профила боја. Подразумева се употреба sRGB профила, па ће ефекат уклањања шума луминансе бити различит уколико се користи профил боја са другом вредношћу гаме.
TP_DIRPYRDENOISE_ENH;Побољшани режим
TP_DIRPYRDENOISE_ENH_TOOLTIP;Повећава квалитет уклањања шума на уштрб око 20% времена за обраду.
TP_DIRPYRDENOISE_GAMMA;Гама
@@ -1684,6 +1683,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике -
!HISTORY_MSG_440;CbDL - Method
!HISTORY_MSG_441;Retinex - Gain transmission
!HISTORY_MSG_442;Retinex - Scale
+!HISTORY_MSG_443;Output Black Point Compensation
!MAIN_TAB_INSPECT; Inspect
!MAIN_TAB_WAVELET;Wavelet
!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w
@@ -1727,7 +1727,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике -
!PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two.
!PREFERENCES_EXPAUT;Expert
!PREFERENCES_FILMSIMULATION;Film Simulation
-!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Editor's panel and the File Browser
+!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser
!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser.
!PREFERENCES_GREYSC;Scene Yb luminance (%)
!PREFERENCES_GREYSC18;Yb=18 CIE L#50
@@ -1745,6 +1745,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике -
!PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders
!PREFERENCES_MED;Medium (Tile/2)
!PREFERENCES_MIN;Mini (100x115)
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
!PREFERENCES_MONINTENT;Default monitor intent
!PREFERENCES_MONPROFILE;Default monitor profile
!PREFERENCES_NAVGUIDEBRUSH;Navigator guide color
@@ -1760,6 +1761,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике -
!PREFERENCES_PROFILE_NONE;None
!PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset
!PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3".
+!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings
!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files
!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation.
@@ -1774,7 +1776,10 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике -
!PREFERENCES_WLONE;One level
!PREFERENCES_WLTWO;Two levels
!PREFERENCES_WLZER;No
+!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
!THRESHOLDSELECTOR_BL;Bottom-left
+!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
!TP_BWMIX_FILTER_TOOLTIP;The color filter simulates shots taken with a colored filter placed in front of the lens. Colored filters reduce the transmission of specific color ranges and therefore affect their lightness. E.g. a red filter darkens blue skies.
!TP_BWMIX_FILTER_YELLOW;Yellow
!TP_BWMIX_GAMMA;Gamma Correction
@@ -1848,13 +1853,11 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике -
!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal)
!TP_DIRPYRDENOISE_LTYPE;Luminance control
!TP_DIRPYRDENOISE_LUMAFR;Luminance
-!TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail
!TP_DIRPYRDENOISE_MAN;Manual
!TP_DIRPYRDENOISE_MANU;Manual
!TP_DIRPYRDENOISE_MED;Median Filter
!TP_DIRPYRDENOISE_MEDMETHOD;Median method
!TP_DIRPYRDENOISE_MEDTYPE;Median type
-!TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising
!TP_DIRPYRDENOISE_METHOD11;Quality
!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time.
!TP_DIRPYRDENOISE_METM_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.
@@ -1898,6 +1901,8 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике -
!TP_ICM_APPLYHUESATMAP_TOOLTIP;Employ the embedded DCP base table (HueSatMap). The setting is only enabled 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 enabled if the selected DCP has one.
+!TP_ICM_BPC;Black Point Compensation
+!TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
!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 enabled if a Dual-Illuminant DCP with interpolation support is selected.
!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_PROFILEINTENT;Rendering Intent
diff --git a/rtdata/languages/Serbian (Latin Characters) b/rtdata/languages/Serbian (Latin Characters)
index c770ad345..c40fb9577 100644
--- a/rtdata/languages/Serbian (Latin Characters)
+++ b/rtdata/languages/Serbian (Latin Characters)
@@ -1080,7 +1080,6 @@ TP_DEFRINGE_THRESHOLD;Prag
TP_DETAIL_AMOUNT;Količina
TP_DIRPYRDENOISE_BLUE;Hrominansa: Plava-Žuta
TP_DIRPYRDENOISE_CHROMA;Boja
-TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Može se upotrebiti za raw ili ne-raw slike.\n\nZa slike koje nisu u raw formatu uklanjanje šuma luminanse zavisi od game ulaznog profila boja. Podrazumeva se upotreba sRGB profila, pa će efekat uklanjanja šuma luminanse biti različit ukoliko se koristi profil boja sa drugom vrednošću game.
TP_DIRPYRDENOISE_ENH;Poboljšani režim
TP_DIRPYRDENOISE_ENH_TOOLTIP;Povećava kvalitet uklanjanja šuma na uštrb oko 20% vremena za obradu.
TP_DIRPYRDENOISE_GAMMA;Gama
@@ -1684,6 +1683,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike -
!HISTORY_MSG_440;CbDL - Method
!HISTORY_MSG_441;Retinex - Gain transmission
!HISTORY_MSG_442;Retinex - Scale
+!HISTORY_MSG_443;Output Black Point Compensation
!MAIN_TAB_INSPECT; Inspect
!MAIN_TAB_WAVELET;Wavelet
!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w
@@ -1727,7 +1727,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike -
!PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two.
!PREFERENCES_EXPAUT;Expert
!PREFERENCES_FILMSIMULATION;Film Simulation
-!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Editor's panel and the File Browser
+!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser
!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser.
!PREFERENCES_GREYSC;Scene Yb luminance (%)
!PREFERENCES_GREYSC18;Yb=18 CIE L#50
@@ -1745,6 +1745,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike -
!PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders
!PREFERENCES_MED;Medium (Tile/2)
!PREFERENCES_MIN;Mini (100x115)
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
!PREFERENCES_MONINTENT;Default monitor intent
!PREFERENCES_MONPROFILE;Default monitor profile
!PREFERENCES_NAVGUIDEBRUSH;Navigator guide color
@@ -1760,6 +1761,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike -
!PREFERENCES_PROFILE_NONE;None
!PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset
!PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3".
+!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings
!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files
!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation.
@@ -1774,7 +1776,10 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike -
!PREFERENCES_WLONE;One level
!PREFERENCES_WLTWO;Two levels
!PREFERENCES_WLZER;No
+!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
!THRESHOLDSELECTOR_BL;Bottom-left
+!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
!TP_BWMIX_FILTER_TOOLTIP;The color filter simulates shots taken with a colored filter placed in front of the lens. Colored filters reduce the transmission of specific color ranges and therefore affect their lightness. E.g. a red filter darkens blue skies.
!TP_BWMIX_FILTER_YELLOW;Yellow
!TP_BWMIX_GAMMA;Gamma Correction
@@ -1848,13 +1853,11 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike -
!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal)
!TP_DIRPYRDENOISE_LTYPE;Luminance control
!TP_DIRPYRDENOISE_LUMAFR;Luminance
-!TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail
!TP_DIRPYRDENOISE_MAN;Manual
!TP_DIRPYRDENOISE_MANU;Manual
!TP_DIRPYRDENOISE_MED;Median Filter
!TP_DIRPYRDENOISE_MEDMETHOD;Median method
!TP_DIRPYRDENOISE_MEDTYPE;Median type
-!TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising
!TP_DIRPYRDENOISE_METHOD11;Quality
!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time.
!TP_DIRPYRDENOISE_METM_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.
@@ -1898,6 +1901,8 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike -
!TP_ICM_APPLYHUESATMAP_TOOLTIP;Employ the embedded DCP base table (HueSatMap). The setting is only enabled 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 enabled if the selected DCP has one.
+!TP_ICM_BPC;Black Point Compensation
+!TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
!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 enabled if a Dual-Illuminant DCP with interpolation support is selected.
!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_PROFILEINTENT;Rendering Intent
diff --git a/rtdata/languages/Slovak b/rtdata/languages/Slovak
index 90eef3409..fc119da9b 100644
--- a/rtdata/languages/Slovak
+++ b/rtdata/languages/Slovak
@@ -1017,6 +1017,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť -
!HISTORY_MSG_440;CbDL - Method
!HISTORY_MSG_441;Retinex - Gain transmission
!HISTORY_MSG_442;Retinex - Scale
+!HISTORY_MSG_443;Output Black Point Compensation
!HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
!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
@@ -1172,7 +1173,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť -
!PREFERENCES_FLUOF2;Fluorescent F2
!PREFERENCES_FLUOF7;Fluorescent F7
!PREFERENCES_FLUOF11;Fluorescent F11
-!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Editor's panel and the File Browser
+!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser
!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser.
!PREFERENCES_GREY;Output device's Yb luminance (%)
!PREFERENCES_GREY05;Yb=05 CIE L#30
@@ -1208,6 +1209,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť -
!PREFERENCES_MENUOPTIONS;Context Menu Options
!PREFERENCES_METADATA;Metadata
!PREFERENCES_MIN;Mini (100x115)
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
!PREFERENCES_MONINTENT;Default monitor intent
!PREFERENCES_MONPROFILE;Default monitor profile
!PREFERENCES_MULTITABDUALMON;Multiple Editor Tabs In Own Window Mode
@@ -1228,6 +1230,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť -
!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_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels
!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements.
+!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings
!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files
!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation.
@@ -1277,6 +1280,8 @@ ZOOMPANEL_ZOOMOUT;Oddialiť -
!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.
!SAVEDLG_WARNFILENAME;File will be named
!SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders.
+!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
!THRESHOLDSELECTOR_B;Bottom
!THRESHOLDSELECTOR_BL;Bottom-left
!THRESHOLDSELECTOR_BR;Bottom-right
@@ -1284,6 +1289,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť -
!THRESHOLDSELECTOR_T;Top
!THRESHOLDSELECTOR_TL;Top-left
!THRESHOLDSELECTOR_TR;Top-right
+!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
!TP_BWMIX_ALGO;Algorithm OYCPM
!TP_BWMIX_ALGO_LI;Linear
!TP_BWMIX_ALGO_SP;Special effects
@@ -1489,7 +1495,6 @@ ZOOMPANEL_ZOOMOUT;Oddialiť -
!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma
!TP_DIRPYRDENOISE_CURVEEDITOR_CC_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_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise
-!TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Can be used on raw and non-raw images.\n\nFor non-raw images noise reduction of luminance depends on the gamma of the input color profile. An sRGB gamma is assumed, thus if the image uses an input color profile of a different gamma, the effects of luminance noise reduction will differ.
!TP_DIRPYRDENOISE_ENH;Enhanced mode
!TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase.
!TP_DIRPYRDENOISE_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.
@@ -1501,13 +1506,11 @@ ZOOMPANEL_ZOOMOUT;Oddialiť -
!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal)
!TP_DIRPYRDENOISE_LTYPE;Luminance control
!TP_DIRPYRDENOISE_LUMAFR;Luminance
-!TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail
!TP_DIRPYRDENOISE_MAN;Manual
!TP_DIRPYRDENOISE_MANU;Manual
!TP_DIRPYRDENOISE_MED;Median Filter
!TP_DIRPYRDENOISE_MEDMETHOD;Median method
!TP_DIRPYRDENOISE_MEDTYPE;Median type
-!TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising
!TP_DIRPYRDENOISE_METHOD;Method
!TP_DIRPYRDENOISE_METHOD11;Quality
!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time.
@@ -1610,6 +1613,8 @@ ZOOMPANEL_ZOOMOUT;Oddialiť -
!TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is only enabled if the selected DCP has one.
!TP_ICM_BLENDCMSMATRIX;Blend ICC highlights with matrix
!TP_ICM_BLENDCMSMATRIX_TOOLTIP;Enable to recover clipped highlights when using LUT-based ICC profiles.
+!TP_ICM_BPC;Black Point Compensation
+!TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
!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 enabled if a Dual-Illuminant DCP with interpolation support is selected.
@@ -1806,7 +1811,6 @@ ZOOMPANEL_ZOOMOUT;Oddialiť -
!TP_SHARPENEDGE_LABEL;Edges
!TP_SHARPENEDGE_PASSES;Iterations
!TP_SHARPENEDGE_THREE;Luminance only
-!TP_SHARPENING_TOOLTIP;Expect a slightly different effect when using with CIECAM02. If difference is observed, adjust to taste.
!TP_SHARPENMICRO_AMOUNT;Quantity
!TP_SHARPENMICRO_LABEL;Microcontrast
!TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5
diff --git a/rtdata/languages/Suomi b/rtdata/languages/Suomi
index 612df257d..e86128dbd 100644
--- a/rtdata/languages/Suomi
+++ b/rtdata/languages/Suomi
@@ -955,6 +955,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K]
!HISTORY_MSG_440;CbDL - Method
!HISTORY_MSG_441;Retinex - Gain transmission
!HISTORY_MSG_442;Retinex - Scale
+!HISTORY_MSG_443;Output Black Point Compensation
!HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!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
@@ -1123,7 +1124,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K]
!PREFERENCES_FLUOF2;Fluorescent F2
!PREFERENCES_FLUOF7;Fluorescent F7
!PREFERENCES_FLUOF11;Fluorescent F11
-!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Editor's panel and the File Browser
+!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser
!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser.
!PREFERENCES_GREY;Output device's Yb luminance (%)
!PREFERENCES_GREY05;Yb=05 CIE L#30
@@ -1159,6 +1160,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K]
!PREFERENCES_MENUOPTIONS;Context Menu Options
!PREFERENCES_METADATA;Metadata
!PREFERENCES_MIN;Mini (100x115)
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
!PREFERENCES_MONINTENT;Default monitor intent
!PREFERENCES_MONPROFILE;Default monitor profile
!PREFERENCES_MULTITAB;Multiple Editor Tabs Mode
@@ -1182,7 +1184,8 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K]
!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_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels
!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements.
-!PREFERENCES_SELECTFONT;Select font
+!PREFERENCES_SELECTFONT;Select global font
+!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings
!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files
!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation.
@@ -1238,6 +1241,8 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K]
!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.
!SAVEDLG_WARNFILENAME;File will be named
!SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders.
+!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
!THRESHOLDSELECTOR_B;Bottom
!THRESHOLDSELECTOR_BL;Bottom-left
!THRESHOLDSELECTOR_BR;Bottom-right
@@ -1245,6 +1250,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K]
!THRESHOLDSELECTOR_T;Top
!THRESHOLDSELECTOR_TL;Top-left
!THRESHOLDSELECTOR_TR;Top-right
+!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
!TP_BWMIX_ALGO;Algorithm OYCPM
!TP_BWMIX_ALGO_LI;Linear
!TP_BWMIX_ALGO_SP;Special effects
@@ -1451,7 +1457,6 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K]
!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma
!TP_DIRPYRDENOISE_CURVEEDITOR_CC_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_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise
-!TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Can be used on raw and non-raw images.\n\nFor non-raw images noise reduction of luminance depends on the gamma of the input color profile. An sRGB gamma is assumed, thus if the image uses an input color profile of a different gamma, the effects of luminance noise reduction will differ.
!TP_DIRPYRDENOISE_ENH;Enhanced mode
!TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase.
!TP_DIRPYRDENOISE_GAMMA;Gamma
@@ -1466,13 +1471,11 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K]
!TP_DIRPYRDENOISE_LTYPE;Luminance control
!TP_DIRPYRDENOISE_LUMA;Luminance
!TP_DIRPYRDENOISE_LUMAFR;Luminance
-!TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail
!TP_DIRPYRDENOISE_MAN;Manual
!TP_DIRPYRDENOISE_MANU;Manual
!TP_DIRPYRDENOISE_MED;Median Filter
!TP_DIRPYRDENOISE_MEDMETHOD;Median method
!TP_DIRPYRDENOISE_MEDTYPE;Median type
-!TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising
!TP_DIRPYRDENOISE_METHOD;Method
!TP_DIRPYRDENOISE_METHOD11;Quality
!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time.
@@ -1582,6 +1585,8 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K]
!TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is only enabled if the selected DCP has one.
!TP_ICM_BLENDCMSMATRIX;Blend ICC highlights with matrix
!TP_ICM_BLENDCMSMATRIX_TOOLTIP;Enable to recover clipped highlights when using LUT-based ICC profiles.
+!TP_ICM_BPC;Black Point Compensation
+!TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
!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 enabled if a Dual-Illuminant DCP with interpolation support is selected.
@@ -1798,7 +1803,6 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K]
!TP_SHARPENEDGE_LABEL;Edges
!TP_SHARPENEDGE_PASSES;Iterations
!TP_SHARPENEDGE_THREE;Luminance only
-!TP_SHARPENING_TOOLTIP;Expect a slightly different effect when using with CIECAM02. If difference is observed, adjust to taste.
!TP_SHARPENMICRO_AMOUNT;Quantity
!TP_SHARPENMICRO_LABEL;Microcontrast
!TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5
diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish
index fbdb4c3ae..5b7f64af3 100644
--- a/rtdata/languages/Swedish
+++ b/rtdata/languages/Swedish
@@ -1248,7 +1248,6 @@ TP_DIRPYRDENOISE_CHROMA;Kroma
TP_DIRPYRDENOISE_CHROMAFR;Krominans
TP_DIRPYRDENOISE_CUR;Kurva
TP_DIRPYRDENOISE_CURVEEDITOR_CC;Kroma
-TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Kan användas på rå- och icke-råbilder.\n\nFör icke-råbilder beror brusreduceringen (~luminans) på in-profilens gamma. Gamma hos sRGB antas, och således: om bildens profil har ett annat gammavärde, så kommer brusreduceringen att variera.
TP_DIRPYRDENOISE_ENH;Förbättrat läge
TP_DIRPYRDENOISE_ENH_TOOLTIP;Ökar kvaliteten på brusreduceringen till priset av 20 % längre beräkningstid
TP_DIRPYRDENOISE_GAMMA;Gamma
@@ -1787,6 +1786,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: -
!HISTORY_MSG_440;CbDL - Method
!HISTORY_MSG_441;Retinex - Gain transmission
!HISTORY_MSG_442;Retinex - Scale
+!HISTORY_MSG_443;Output Black Point Compensation
!MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor
!MONITOR_PROFILE_SYSTEM;System default
!PARTIALPASTE_COLORTONING;Color toning
@@ -1800,17 +1800,22 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: -
!PREFERENCES_MAX;Maxi (Tile)
!PREFERENCES_MED;Medium (Tile/2)
!PREFERENCES_MIN;Mini (100x115)
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
!PREFERENCES_MONINTENT;Default monitor intent
!PREFERENCES_MONPROFILE;Default monitor profile
!PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list.
!PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list.
!PREFERENCES_PROFILE_NONE;None
+!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings
!PREFERENCES_SIMPLAUT;Tool mode
!PREFERENCES_TINB;Number of tiles
!PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file
!SAVEDLG_SUBSAMP;Subsampling
!SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling.
+!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
+!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
!TP_CBDL_AFT;After Black-and-White
!TP_CBDL_BEF;Before Black-and-White
!TP_CBDL_METHOD;Process located
@@ -1841,11 +1846,9 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: -
!TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise
!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal)
!TP_DIRPYRDENOISE_LTYPE;Luminance control
-!TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail
!TP_DIRPYRDENOISE_MED;Median Filter
!TP_DIRPYRDENOISE_MEDMETHOD;Median method
!TP_DIRPYRDENOISE_MEDTYPE;Median type
-!TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising
!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time.
!TP_DIRPYRDENOISE_METM_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_MET_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.
@@ -1868,6 +1871,8 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: -
!TP_ICM_APPLYHUESATMAP_TOOLTIP;Employ the embedded DCP base table (HueSatMap). The setting is only enabled 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 enabled if the selected DCP has one.
+!TP_ICM_BPC;Black Point Compensation
+!TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
!TP_ICM_PROFILEINTENT;Rendering Intent
!TP_NEUTRAL;Reset
!TP_PRSHARPENING_LABEL;Post-Resize Sharpening
diff --git a/rtdata/languages/Turkish b/rtdata/languages/Turkish
index 0af0611d5..3003f459f 100644
--- a/rtdata/languages/Turkish
+++ b/rtdata/languages/Turkish
@@ -954,6 +954,7 @@ TP_WBALANCE_TEMPERATURE;Isı
!HISTORY_MSG_440;CbDL - Method
!HISTORY_MSG_441;Retinex - Gain transmission
!HISTORY_MSG_442;Retinex - Scale
+!HISTORY_MSG_443;Output Black Point Compensation
!HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!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
@@ -1122,7 +1123,7 @@ TP_WBALANCE_TEMPERATURE;Isı
!PREFERENCES_FLUOF2;Fluorescent F2
!PREFERENCES_FLUOF7;Fluorescent F7
!PREFERENCES_FLUOF11;Fluorescent F11
-!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Editor's panel and the File Browser
+!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser
!PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser.
!PREFERENCES_GREY;Output device's Yb luminance (%)
!PREFERENCES_GREY05;Yb=05 CIE L#30
@@ -1158,6 +1159,7 @@ TP_WBALANCE_TEMPERATURE;Isı
!PREFERENCES_MENUOPTIONS;Context Menu Options
!PREFERENCES_METADATA;Metadata
!PREFERENCES_MIN;Mini (100x115)
+!PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
!PREFERENCES_MONINTENT;Default monitor intent
!PREFERENCES_MONPROFILE;Default monitor profile
!PREFERENCES_MULTITAB;Multiple Editor Tabs Mode
@@ -1181,7 +1183,8 @@ TP_WBALANCE_TEMPERATURE;Isı
!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_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels
!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements.
-!PREFERENCES_SELECTFONT;Select font
+!PREFERENCES_SELECTFONT;Select global font
+!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings
!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files
!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation.
@@ -1237,6 +1240,8 @@ TP_WBALANCE_TEMPERATURE;Isı
!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.
!SAVEDLG_WARNFILENAME;File will be named
!SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders.
+!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
!THRESHOLDSELECTOR_B;Bottom
!THRESHOLDSELECTOR_BL;Bottom-left
!THRESHOLDSELECTOR_BR;Bottom-right
@@ -1244,6 +1249,7 @@ TP_WBALANCE_TEMPERATURE;Isı
!THRESHOLDSELECTOR_T;Top
!THRESHOLDSELECTOR_TL;Top-left
!THRESHOLDSELECTOR_TR;Top-right
+!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
!TP_BWMIX_ALGO;Algorithm OYCPM
!TP_BWMIX_ALGO_LI;Linear
!TP_BWMIX_ALGO_SP;Special effects
@@ -1450,7 +1456,6 @@ TP_WBALANCE_TEMPERATURE;Isı
!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma
!TP_DIRPYRDENOISE_CURVEEDITOR_CC_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_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise
-!TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Can be used on raw and non-raw images.\n\nFor non-raw images noise reduction of luminance depends on the gamma of the input color profile. An sRGB gamma is assumed, thus if the image uses an input color profile of a different gamma, the effects of luminance noise reduction will differ.
!TP_DIRPYRDENOISE_ENH;Enhanced mode
!TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase.
!TP_DIRPYRDENOISE_GAMMA;Gamma
@@ -1465,13 +1470,11 @@ TP_WBALANCE_TEMPERATURE;Isı
!TP_DIRPYRDENOISE_LTYPE;Luminance control
!TP_DIRPYRDENOISE_LUMA;Luminance
!TP_DIRPYRDENOISE_LUMAFR;Luminance
-!TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail
!TP_DIRPYRDENOISE_MAN;Manual
!TP_DIRPYRDENOISE_MANU;Manual
!TP_DIRPYRDENOISE_MED;Median Filter
!TP_DIRPYRDENOISE_MEDMETHOD;Median method
!TP_DIRPYRDENOISE_MEDTYPE;Median type
-!TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising
!TP_DIRPYRDENOISE_METHOD;Method
!TP_DIRPYRDENOISE_METHOD11;Quality
!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time.
@@ -1581,6 +1584,8 @@ TP_WBALANCE_TEMPERATURE;Isı
!TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is only enabled if the selected DCP has one.
!TP_ICM_BLENDCMSMATRIX;Blend ICC highlights with matrix
!TP_ICM_BLENDCMSMATRIX_TOOLTIP;Enable to recover clipped highlights when using LUT-based ICC profiles.
+!TP_ICM_BPC;Black Point Compensation
+!TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
!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 enabled if a Dual-Illuminant DCP with interpolation support is selected.
@@ -1797,7 +1802,6 @@ TP_WBALANCE_TEMPERATURE;Isı
!TP_SHARPENEDGE_LABEL;Edges
!TP_SHARPENEDGE_PASSES;Iterations
!TP_SHARPENEDGE_THREE;Luminance only
-!TP_SHARPENING_TOOLTIP;Expect a slightly different effect when using with CIECAM02. If difference is observed, adjust to taste.
!TP_SHARPENMICRO_AMOUNT;Quantity
!TP_SHARPENMICRO_LABEL;Microcontrast
!TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5
diff --git a/rtdata/languages/default b/rtdata/languages/default
index f349ebd56..d04487752 100644
--- a/rtdata/languages/default
+++ b/rtdata/languages/default
@@ -674,7 +674,8 @@ HISTORY_MSG_439;Retinex - Process
HISTORY_MSG_440;CbDL - Method
HISTORY_MSG_441;Retinex - Gain transmission
HISTORY_MSG_442;Retinex - Scale
-HISTORY_MSG_443;Spot removal
+HISTORY_MSG_443;Output Black Point Compensation
+HISTORY_MSG_444;Spot removal
HISTORY_NEWSNAPSHOT;Add
HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
HISTORY_SNAPSHOT;Snapshot
@@ -957,7 +958,7 @@ PREFERENCES_FLUOF7;Fluorescent F7
PREFERENCES_FLUOF11;Fluorescent F11
PREFERENCES_FORIMAGE;For non-raw photos
PREFERENCES_FORRAW;For raw photos
-PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Editor's panel and the File Browser
+PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser
PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser.
PREFERENCES_GIMPPATH;GIMP installation directory
PREFERENCES_GREY;Output device's Yb luminance (%)
@@ -1001,6 +1002,7 @@ PREFERENCES_MENUGROUPRANK;Group "Rank"
PREFERENCES_MENUOPTIONS;Context Menu Options
PREFERENCES_METADATA;Metadata
PREFERENCES_MIN;Mini (100x115)
+PREFERENCES_MONBPC;Black Point Compensation for the L*a*b*->Monitor transform
PREFERENCES_MONINTENT;Default monitor intent
PREFERENCES_MONPROFILE;Default monitor profile
PREFERENCES_MULTITAB;Multiple Editor Tabs Mode
@@ -1040,7 +1042,8 @@ PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset
PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3".
PREFERENCES_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels
PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements.
-PREFERENCES_SELECTFONT;Select font
+PREFERENCES_SELECTFONT;Select global font
+PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font
PREFERENCES_SELECTLANG;Select language
PREFERENCES_SELECTTHEME;Select theme
PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings
@@ -1136,6 +1139,8 @@ SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved h
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF
SAVEDLG_WARNFILENAME;File will be named
SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders.
+SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile.
+SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs.
THRESHOLDSELECTOR_B;Bottom
THRESHOLDSELECTOR_BL;Bottom-left
THRESHOLDSELECTOR_BR;Bottom-right
@@ -1143,6 +1148,7 @@ THRESHOLDSELECTOR_HINT;Hold the Shift key to move individual control poin
THRESHOLDSELECTOR_T;Top
THRESHOLDSELECTOR_TL;Top-left
THRESHOLDSELECTOR_TR;Top-right
+TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool
TOOLBAR_TOOLTIP_CROP;Crop selection.\nShortcut: c\nMove the crop area using Shift-mouse drag
TOOLBAR_TOOLTIP_HAND;Hand tool.\nShortcut: h
TOOLBAR_TOOLTIP_STRAIGHTEN;Straighten / fine rotation.\nShortcut: s\n\nIndicate the vertical or horizontal by drawing a guide line over the image preview. Angle of rotation will be shown next to the guide line. Center of rotation is the geometrical center of the image.
@@ -1375,7 +1381,6 @@ TP_DIRPYRDENOISE_CUR;Curve
TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma
TP_DIRPYRDENOISE_CURVEEDITOR_CC_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_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise
-TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Can be used on raw and non-raw images.\n\nFor non-raw images noise reduction of luminance depends on the gamma of the input color profile. An sRGB gamma is assumed, thus if the image uses an input color profile of a different gamma, the effects of luminance noise reduction will differ.
TP_DIRPYRDENOISE_ENH;Enhanced mode
TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase.
TP_DIRPYRDENOISE_GAMMA;Gamma
@@ -1390,13 +1395,11 @@ TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal)
TP_DIRPYRDENOISE_LTYPE;Luminance control
TP_DIRPYRDENOISE_LUMA;Luminance
TP_DIRPYRDENOISE_LUMAFR;Luminance
-TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail
TP_DIRPYRDENOISE_MAN;Manual
TP_DIRPYRDENOISE_MANU;Manual
TP_DIRPYRDENOISE_MED;Median Filter
TP_DIRPYRDENOISE_MEDMETHOD;Median method
TP_DIRPYRDENOISE_MEDTYPE;Median type
-TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising
TP_DIRPYRDENOISE_METHOD;Method
TP_DIRPYRDENOISE_METHOD11;Quality
TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time.
@@ -1522,6 +1525,8 @@ TP_ICM_APPLYLOOKTABLE;Look table
TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is only enabled if the selected DCP has one.
TP_ICM_BLENDCMSMATRIX;Blend ICC highlights with matrix
TP_ICM_BLENDCMSMATRIX_TOOLTIP;Enable to recover clipped highlights when using LUT-based ICC profiles.
+TP_ICM_BPC;Black Point Compensation
+TP_ICM_BPC_TOOLTIP;Enable this to fit the Luminosity channel to the output color space with a fix White Point
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 enabled if a Dual-Illuminant DCP with interpolation support is selected.
@@ -1780,7 +1785,6 @@ TP_SHARPENING_RLD_AMOUNT;Amount
TP_SHARPENING_RLD_DAMPING;Damping
TP_SHARPENING_RLD_ITERATIONS;Iterations
TP_SHARPENING_THRESHOLD;Threshold
-TP_SHARPENING_TOOLTIP;Expect a slightly different effect when using with CIECAM02. If difference is observed, adjust to taste.
TP_SHARPENING_USM;Unsharp Mask
TP_SHARPENMICRO_AMOUNT;Quantity
TP_SHARPENMICRO_LABEL;Microcontrast
diff --git a/rtdata/rt_splash_5.png b/rtdata/rt_splash_5.png
new file mode 100644
index 000000000..71486b132
Binary files /dev/null and b/rtdata/rt_splash_5.png differ
diff --git a/rtdata/rt_splash_5.svg b/rtdata/rt_splash_5.svg
new file mode 100644
index 000000000..78620dd68
--- /dev/null
+++ b/rtdata/rt_splash_5.svg
@@ -0,0 +1,1770 @@
+
+
+
+
diff --git a/rtengine/CA_correct_RT.cc b/rtengine/CA_correct_RT.cc
index 64bb19113..7c28801ae 100644
--- a/rtengine/CA_correct_RT.cc
+++ b/rtengine/CA_correct_RT.cc
@@ -156,11 +156,9 @@ void RawImageSource::CA_correct_RT(const double cared, const double cablue, cons
const int vblsz = ceil((float)(height + border2) / (ts - border2) + 2 + vz1);
const int hblsz = ceil((float)(width + border2) / (ts - border2) + 2 + hz1);
- char *buffer1 = (char *) calloc(vblsz * hblsz * (2 * 2 + 1), sizeof(float));
-
//block CA shift values and weight assigned to block
- float *blockwt = (float*)buffer1;
- float (*blockshifts)[2][2] = (float (*)[2][2])(buffer1 + (vblsz * hblsz * sizeof(float)));
+ float* const blockwt = static_cast(calloc(vblsz * hblsz * (2 * 2 + 1), sizeof(float)));
+ float (*blockshifts)[2][2] = (float (*)[2][2])(blockwt + vblsz * hblsz);
double fitparams[2][2][16];
@@ -1013,7 +1011,7 @@ void RawImageSource::CA_correct_RT(const double cared, const double cablue, cons
}
free(Gtmp);
- free(buffer1);
+ free(blockwt);
free(RawDataTmp);
if(plistener) {
diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt
index a1ab06657..cb484dead 100644
--- a/rtengine/CMakeLists.txt
+++ b/rtengine/CMakeLists.txt
@@ -14,7 +14,7 @@ set (RTENGINESOURCEFILES colortemp.cc curves.cc flatcurves.cc diagonalcurves.cc
stdimagesource.cc myfile.cc iccjpeg.cc improccoordinator.cc pipettebuffer.cc coord.cc alpha.cc spot.cc
processingjob.cc rtthumbnail.cc utils.cc labimage.cc slicer.cc cieimage.cc
iplab2rgb.cc ipsharpen.cc iptransform.cc ipresize.cc ipvibrance.cc
- imagedimensions.cc jpeg_memsrc.cc jdatasrc.cc iimage.cc
+ imagedimensions.cc jpeg_ijg/jpeg_memsrc.cc jdatasrc.cc iimage.cc
EdgePreservingDecomposition.cc cplx_wavelet_dec.cc FTblockDN.cc
PF_correct_RT.cc previewimage.cc ipwavelet.cc
dirpyr_equalizer.cc
diff --git a/rtengine/EdgePreserveLab.cc b/rtengine/EdgePreserveLab.cc
deleted file mode 100644
index 1f063ec0c..000000000
--- a/rtengine/EdgePreserveLab.cc
+++ /dev/null
@@ -1,264 +0,0 @@
-#include "EdgePreserveLab.h"
-#include "boxblur.h"
-#include
-
-#ifdef _OPENMP
-#include
-#endif
-
-//#define MAX(a,b) ((a)<(b)?(b):(a))
-//#define MIN(a,b) ((a)>(b)?(b):(a))
-
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-
-EdgePreserveLab::EdgePreserveLab(unsigned int width, unsigned int height)
-{
- w = width;
- h = height;
- n = w * h;
-
- //Initialize the matrix just once at construction.
- A = new MultiDiagonalSymmetricMatrix(n, 5);
-
- if(!(
- A->CreateDiagonal(0, 0) &&
- A->CreateDiagonal(1, 1) &&
- A->CreateDiagonal(2, w - 1) &&
- A->CreateDiagonal(3, w) &&
- A->CreateDiagonal(4, w + 1))) {
- delete A;
- A = NULL;
- printf("Error in EdgePreserveLab construction: out of memory.\n");
- } else {
- a0 = A->Diagonals[0];
- a_1 = A->Diagonals[1];
- a_w1 = A->Diagonals[2];
- a_w = A->Diagonals[3];
- a_w_1 = A->Diagonals[4];
- }
-}
-
-EdgePreserveLab::~EdgePreserveLab()
-{
- delete A;
-}
-
-float *EdgePreserveLab::CreateBlur(float *Source, float LScale, float abScale, float EdgeStoppingLuma, float EdgeStoppingChroma, unsigned int Iterates, float *Blur, bool UseBlurForEdgeStop)
-{
- if(Blur == NULL)
- UseBlurForEdgeStop = false, //Use source if there's no supplied Blur.
- Blur = new float[3 * n];
-
- if(LScale == 0.0f) {
- memcpy(Blur, Source, 3 * n * sizeof(float));
- return Blur;
- }
-
- //Create the edge stopping function a, rotationally symmetric and just one instead of (ax, ay). Maybe don't need Blur yet, so use its memory.
- float *a, *b, *g;
-
- if(UseBlurForEdgeStop) {
- a = new float[n], g = Blur;
- } else {
- a = Blur, g = Source;
- }
-
- //b = new float[n];
-
- unsigned int x, y, i;
- unsigned int w1 = w - 1, h1 = h - 1;
- float eps = 0.0001f;
- float scL = powf(100.0f, LScale);
- float scab = powf(200.0f, abScale);
-
- float * var = new float[w * h];
- rtengine::boxvar(g, var, 1, 1, w, h);
-
-#ifdef _OPENMP
- #pragma omp parallel for
-#endif
-
- for(y = 0; y < h1; y++) {
- float *rg = &g[w * y];
-
- for(x = 0; x < w1; x++) {
- //Estimate the central difference gradient in the center of a four pixel square. (gx, gy) is actually 2*gradient.
- /*float gx = (fabs((rg[x + 1] - rg[x]) + (rg[x + w + 1] - rg[x + w])));
- float gy = (fabs((rg[x + w] - rg[x]) + (rg[x + w + 1] - rg[x + 1])));
-
- //TODO: combine this with gx, gy if not needing separate quantities
- float hx = (fabs((rg[x + 1 + n] - rg[x + n]) + (rg[x + w + 1 + n] - rg[x + w + n])) + \
- fabs((rg[x + 1 + 2*n] - rg[x + 2*n]) + (rg[x + w + 1 + 2*n] - rg[x + w + 2*n])));
- float hy = (fabs((rg[x + w + n] - rg[x + n]) + (rg[x + w + 1 + n] - rg[x + 1 + n])) + \
- fabs((rg[x + w + 2*n] - rg[x + 2*n]) + (rg[x + w + 1 + 2*n] - rg[x + 1 + 2*n])));
- */
- //float gradtot = (gx+gy+hx+hy);
- //gradhisto[MAX(0,MIN(32767,(int)gradtot))] ++;
-
- //Apply power to the magnitude of the gradient to get the edge stopping function.
- //a[x + w*y] = scL*expf(-100.0f*(gx + gy + hx + hy)/(EdgeStoppingLuma));
- //a[x + w*y] = scL*expf(-var[y*w+x]/SQR(0.02*EdgeStoppingLuma));///(0.1+rg[x]);
- a[x + w * y] = scL * expf(-50.0f * sqrt(var[y * w + x]) / (EdgeStoppingLuma + eps)); ///(0.1+rg[x]);
-
- //b[x + w*y] = (scab)*expf(-20.0f*(gx + gy + Lave*(hx + hy))/(EdgeStoppingChroma));
- //b[x + w*y] = (scab)*expf(-400.0f*SQR(gx + gy + Lave*(hx + hy))/SQR(EdgeStoppingChroma));;
-
- }
- }
-
- /* Now setup the linear problem. I use the Maxima CAS, here's code for making an FEM formulation for the smoothness term:
- p(x, y) := (1 - x)*(1 - y);
- P(m, n) := A[m][n]*p(x, y) + A[m + 1][n]*p(1 - x, y) + A[m + 1][n + 1]*p(1 - x, 1 - y) + A[m][n + 1]*p(x, 1 - y);
- Integrate(f) := integrate(integrate(f, x, 0, 1), y, 0, 1);
-
- Integrate(diff(P(u, v), x)*diff(p(x, y), x) + diff(P(u, v), y)*diff(p(x, y), y));
- Integrate(diff(P(u - 1, v), x)*diff(p(1 - x, y), x) + diff(P(u - 1, v), y)*diff(p(1 - x, y), y));
- Integrate(diff(P(u - 1, v - 1), x)*diff(p(1 - x, 1 - y), x) + diff(P(u - 1, v - 1), y)*diff(p(1 - x, 1 - y), y));
- Integrate(diff(P(u, v - 1), x)*diff(p(x, 1 - y), x) + diff(P(u, v - 1), y)*diff(p(x, 1 - y), y));
- So yeah. Use the numeric results of that to fill the matrix A.*/
- memset(a_1, 0, A->DiagonalLength(1)*sizeof(float));
- memset(a_w1, 0, A->DiagonalLength(w - 1)*sizeof(float));
- memset(a_w, 0, A->DiagonalLength(w)*sizeof(float));
- memset(a_w_1, 0, A->DiagonalLength(w + 1)*sizeof(float));
-
-//TODO: OMP here?
- for(i = y = 0; y != h; y++) {
- for(x = 0; x != w; x++, i++) {
- float ac;
- a0[i] = 1.0;
-
- //Remember, only fill the lower triangle. Memory for upper is never made. It's symmetric. Trust.
- if(x > 0 && y > 0)
- ac = a[i - w - 1] / 6.0f,
- a_w_1[i - w - 1] -= 2.0f * ac, a_w[i - w] -= ac,
- a_1[i - 1] -= ac, a0[i] += 4.0f * ac;
-
- if(x < w1 && y > 0)
- ac = a[i - w] / 6.0f,
- a_w[i - w] -= ac, a_w1[i - w + 1] -= 2.0f * ac,
- a0[i] += 4.0f * ac;
-
- if(x > 0 && y < h1)
- ac = a[i - 1] / 6.0f,
- a_1[i - 1] -= ac, a0[i] += 4.0f * ac;
-
- if(x < w1 && y < h1) {
- a0[i] += 4.0f * a[i] / 6.0f;
- }
- }
- }
-
- if(UseBlurForEdgeStop) {
- delete[] a;
- }
-
-
- //Solve & return.
- A->CreateIncompleteCholeskyFactorization(1); //Fill-in of 1 seems to work really good. More doesn't really help and less hurts (slightly).
-
- if(!UseBlurForEdgeStop) {
- memcpy(Blur, Source, 3 * n * sizeof(float));
- }
-
- // blur L channel
- SparseConjugateGradient(A->PassThroughVectorProduct, Source, n, false, Blur, 0.0f, (void *)A, Iterates, A->PassThroughCholeskyBackSolve);
-
- //reset A for ab channels
- /*memset(a_1, 0, A->DiagonalLength(1)*sizeof(float));
- memset(a_w1, 0, A->DiagonalLength(w - 1)*sizeof(float));
- memset(a_w, 0, A->DiagonalLength(w)*sizeof(float));
- memset(a_w_1, 0, A->DiagonalLength(w + 1)*sizeof(float));
- for(i = y = 0; y != h; y++){
- for(x = 0; x != w; x++, i++){
- float ac;
- a0[i] = 1.0;
-
- //Remember, only fill the lower triangle. Memory for upper is never made. It's symmetric. Trust.
- if(x > 0 && y > 0)
- ac = b[i - w - 1]/6.0f,
- a_w_1[i - w - 1] -= 2.0f*ac, a_w[i - w] -= ac,
- a_1[i - 1] -= ac, a0[i] += 4.0f*ac;
-
- if(x < w1 && y > 0)
- ac = b[i - w]/6.0f,
- a_w[i - w] -= ac, a_w1[i - w + 1] -= 2.0f*ac,
- a0[i] += 4.0f*ac;
-
- if(x > 0 && y < h1)
- ac = b[i - 1]/6.0f,
- a_1[i - 1] -= ac, a0[i] += 4.0f*ac;
-
- if(x < w1 && y < h1)
- a0[i] += 4.0f*b[i]/6.0f;
- }
- }*/
- /*if(UseBlurForEdgeStop)*/ //delete[] b;
-
- // blur ab channels
- //A->CreateIncompleteCholeskyFactorization(1); //Fill-in of 1 seems to work really good. More doesn't really help and less hurts (slightly).
- //SparseConjugateGradient(A->PassThroughVectorProduct, Source+n, n, false, Blur+n, 0.0f, (void *)A, Iterates, A->PassThroughCholeskyBackSolve);
- //SparseConjugateGradient(A->PassThroughVectorProduct, Source+2*n, n, false, Blur+2*n, 0.0f, (void *)A, Iterates, A->PassThroughCholeskyBackSolve);
-
- A->KillIncompleteCholeskyFactorization();
- return Blur;
-}
-
-float *EdgePreserveLab::CreateIteratedBlur(float *Source, float LScale, float abScale, float EdgeStoppingLuma, float EdgeStoppingChroma, unsigned int Iterates, unsigned int Reweightings, float *Blur)
-{
- //Simpler outcome?
- if(Reweightings == 0) {
- return CreateBlur(Source, LScale, abScale, EdgeStoppingLuma, EdgeStoppingChroma, Iterates, Blur);
- }
-
- //Create a blur here, initialize.
- if(Blur == NULL) {
- Blur = new float[3 * n];
- }
-
- memcpy(Blur, Source, 3 * n * sizeof(float));
-
- //Iteratively improve the blur.
- Reweightings++;
-
- for(unsigned int i = 0; i != Reweightings; i++) {
- CreateBlur(Source, LScale, abScale, EdgeStoppingLuma, EdgeStoppingChroma, Iterates, Blur, true);
- }
-
- return Blur;
-}
-
-float *EdgePreserveLab::CompressDynamicRange(float *Source, float LScale, float abScale, float EdgeStoppingLuma, float EdgeStoppingChroma, float CompressionExponent, float DetailBoost, unsigned int Iterates, unsigned int Reweightings, float *Compressed)
-{
- //We're working with luminance, which does better logarithmic.
- unsigned int i;
- //for(i = 0; i != n; i++)
- // Source[i] = logf(Source[i] + 0.0001f);
-
- //Blur. Also setup memory for Compressed (we can just use u since each element of u is used in one calculation).
- float *u = CreateIteratedBlur(Source, LScale, abScale, EdgeStoppingLuma, EdgeStoppingChroma, Iterates, Reweightings);
-
- if(Compressed == NULL) {
- Compressed = u;
- }
-
- //Apply compression, detail boost, unlogging. Compression is done on the logged data and detail boost on unlogged.
- for(i = 0; i != n; i++) {
- //float ce = expf(Source[i] + u[i]*(CompressionExponent - 1.0f)) - 0.0001f;
- //float ue = expf(u[i]) - 0.0001f;
- //Source[i] = expf(Source[i]) - 0.0001f;
- //Compressed[i] = ce + DetailBoost*(Source[i] - ue);
- Compressed[i] = u[i];//ue;//for testing, to display blur
- }
-
- if(Compressed != u) {
- delete[] u;
- }
-
- return Compressed;
-}
-
-
-
-
diff --git a/rtengine/EdgePreserveLab.h b/rtengine/EdgePreserveLab.h
deleted file mode 100644
index e365956c5..000000000
--- a/rtengine/EdgePreserveLab.h
+++ /dev/null
@@ -1,77 +0,0 @@
-#pragma once
-/*
-The EdgePreserveLab files contain standard C++ (standard except the first line) code for creating and, to a
-limited extent (create your own uses!), messing with multi scale edge preserving decompositions of a 32 bit single channel
-image. As a byproduct it contains a lot of linear algebra which can be useful for optimization problems that
-you want to solve in rectangles on rectangular grids.
-
-Anyway. Basically, this is an implementation of what's presented in the following papers:
- Edge-Preserving Decompositions for Multi-Scale Tone and Detail Manipulation
- An Iterative Solution Method for Linear Systems of Which the Coefficient Matrix is a Symetric M-Matrix
- Color correction for tone mapping
- Wikipedia, the free encyclopedia
-
-First one is most of what matters, next two are details, last everything else. I did a few things differently, especially:
- Reformulated the minimization with finite elements instead of finite differences. This results in better conditioning,
- slightly better accuracy (less artifacts), the possibility of a better picked edge stopping function, but more memory consumption.
-
- A single rotationally invariant edge stopping function is used instead of two non-invariant ones.
-
- Incomplete Cholseky factorization instead of Szeliski's LAHBF. Slower, but not subject to any patents.
-
- For tone mapping, original images are decomposed instead of their logarithms, and just one decomposition is made;
- I find that this way works plenty good (theirs isn't better or worse... just different) and is simpler.
-
-Written by ben_pcc in Portland, Oregon, USA; code modified by Emil Martinec.
-
- // EdgePreserveLab.h and EdgePreserveLab.cpp are 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
-#include
-#include
-#include "EdgePreservingDecomposition.h"
-
-class EdgePreserveLab
-{
-public:
- EdgePreserveLab(unsigned int width, unsigned int height);
- ~EdgePreserveLab();
-
- //Create an edge preserving blur of Source. Will create and return, or fill into Blur if not NULL. In place not ok.
- //If UseBlurForEdgeStop is true, supplied not NULL Blur is used to calculate the edge stopping function instead of Source.
- float *CreateBlur(float *Source, float LScale, float abScale, float EdgeStoppingLuma, float EdgeStoppingChroma, unsigned int Iterates, float *Blur = NULL, bool UseBlurForEdgeStop = false);
-
- //Iterates CreateBlur such that the smoothness term approaches a specific norm via iteratively reweighted least squares. In place not ok.
- float *CreateIteratedBlur(float *Source, float LScale, float abScale, float EdgeStoppingLuma, float EdgeStoppingChroma, unsigned int Iterates, unsigned int Reweightings, float *Blur = NULL);
-
- /*Lowers global contrast while preserving or boosting local contrast. Can fill into Compressed. The smaller Compression
- the more compression is applied, with Compression = 1 giving no effect and above 1 the opposite effect. You can totally
- use Compression = 1 and play with DetailBoost for some really sweet unsharp masking. If working on luma/grey, consider giving it a logarithm.
- In place calculation to save memory (Source == Compressed) is totally ok. Reweightings > 0 invokes CreateIteratedBlur instead of CreateBlur. */
- float *CompressDynamicRange(float *Source, float LScale = 1.0f, float abScale = 5.0f, float EdgeStoppingLuma = 1.0f, float EdgeStoppingChroma = 1.0f,
- float CompressionExponent = 0.8f, float DetailBoost = 0.1f, unsigned int Iterates = 20,
- unsigned int Reweightings = 0, float *Compressed = NULL);
-
-private:
- MultiDiagonalSymmetricMatrix *A; //The equations are simple enough to not mandate a matrix class, but fast solution NEEDS a complicated preconditioner.
- unsigned int w, h, n;
-
- //Convenient access to the data in A.
- float *a0, *a_1, *a_w, *a_w_1, *a_w1;
-};
diff --git a/rtengine/EdgePreservingDecomposition.cc b/rtengine/EdgePreservingDecomposition.cc
index 927bfac2d..7bc292c3f 100644
--- a/rtengine/EdgePreservingDecomposition.cc
+++ b/rtengine/EdgePreservingDecomposition.cc
@@ -17,20 +17,20 @@ calculates A x where x is some vector. Stops when rms residual < RMSResidual or
Stops at n iterates if MaximumIterates = 0 since that many iterates gives exact solution. Applicable to symmetric positive
definite problems only, which is what unconstrained smooth optimization pretty much always is.
Parameter pass can be passed through, containing whatever info you like it to contain (matrix info?).
-Takes less memory with OkToModify_b = true, and Preconditioner = NULL. */
+Takes less memory with OkToModify_b = true, and Preconditioner = nullptr. */
float *SparseConjugateGradient(void Ax(float *Product, float *x, void *Pass), float *b, int n, bool OkToModify_b,
float *x, float RMSResidual, void *Pass, int MaximumIterates, void Preconditioner(float *Product, float *x, void *Pass))
{
int iterate, i;
- char* buffer = (char*)malloc(2 * n * sizeof(float) + 128);
- float *r = (float*)(buffer + 64);
+ float* buffer = (float*)malloc(2 * n * sizeof(float) + 128);
+ float *r = (buffer + 16);
//Start r and x.
- if(x == NULL) {
+ if(x == nullptr) {
x = new float[n];
- memset(x, 0, sizeof(float)*n); //Zero initial guess if x == NULL.
+ memset(x, 0, sizeof(float)*n); //Zero initial guess if x == nullptr.
memcpy(r, b, sizeof(float)*n);
} else {
Ax(r, x, Pass);
@@ -46,7 +46,7 @@ float *SparseConjugateGradient(void Ax(float *Product, float *x, void *Pass), fl
//s is preconditionment of r. Without, direct to r.
float *s = r, rs = 0.0f;
- if(Preconditioner != NULL) {
+ if(Preconditioner != nullptr) {
s = new float[n];
Preconditioner(s, r, Pass);
@@ -61,7 +61,7 @@ float *SparseConjugateGradient(void Ax(float *Product, float *x, void *Pass), fl
}
//Search direction d.
- float *d = (float*)(buffer + n * sizeof(float) + 128);
+ float *d = (buffer + n + 32);
memcpy(d, s, sizeof(float)*n);
@@ -114,7 +114,7 @@ float *SparseConjugateGradient(void Ax(float *Product, float *x, void *Pass), fl
break;
}
- if(Preconditioner != NULL) {
+ if(Preconditioner != nullptr) {
Preconditioner(s, r, Pass);
}
@@ -127,15 +127,13 @@ float *SparseConjugateGradient(void Ax(float *Product, float *x, void *Pass), fl
#endif
{
float c = 0.0f;
- float t;
- float temp;
#ifdef _OPENMP
#pragma omp for reduction(+:rs) // Summation with error correction
#endif
for(int ii = 0; ii < n; ii++) {
- temp = r[ii] * s[ii];
- t = rs + temp;
+ float temp = r[ii] * s[ii];
+ float t = rs + temp;
if( fabsf(rs) >= fabsf(temp) ) {
c += ((rs - t) + temp);
@@ -183,11 +181,11 @@ float *SparseConjugateGradient(void Ax(float *Product, float *x, void *Pass), fl
return x;
}
-MultiDiagonalSymmetricMatrix::MultiDiagonalSymmetricMatrix(int Dimension, int NumberOfDiagonalsInLowerTriangle)
+MultiDiagonalSymmetricMatrix::MultiDiagonalSymmetricMatrix(int Dimension, int NumberOfDiagonalsInLowerTriangle) : buffer(nullptr), DiagBuffer(nullptr)
{
n = Dimension;
m = NumberOfDiagonalsInLowerTriangle;
- IncompleteCholeskyFactorization = NULL;
+ IncompleteCholeskyFactorization = nullptr;
Diagonals = new float *[m];
StartRows = new int [m + 1];
@@ -198,7 +196,7 @@ MultiDiagonalSymmetricMatrix::MultiDiagonalSymmetricMatrix(int Dimension, int Nu
MultiDiagonalSymmetricMatrix::~MultiDiagonalSymmetricMatrix()
{
- if(DiagBuffer != NULL) {
+ if(DiagBuffer != nullptr) {
free(buffer);
} else
for(int i = 0; i < m; i++) {
@@ -218,12 +216,12 @@ bool MultiDiagonalSymmetricMatrix::CreateDiagonal(int index, int StartRow)
if(index == 0) {
buffer = (char*)calloc( (n + padding) * m * sizeof(float) + (m + 16) * 64 + 63, 1);
- if(buffer == NULL)
+ if(buffer == nullptr)
// no big memory block available => try to allocate smaller blocks
{
- DiagBuffer = NULL;
+ DiagBuffer = nullptr;
} else {
- DiagBuffer = (char*)( ( uintptr_t(buffer) + uintptr_t(63)) / 64 * 64);
+ DiagBuffer = (float*)( ( uintptr_t(buffer) + uintptr_t(63)) / 64 * 64);
}
}
@@ -238,12 +236,12 @@ bool MultiDiagonalSymmetricMatrix::CreateDiagonal(int index, int StartRow)
return false;
}
- if(DiagBuffer != NULL) {
- Diagonals[index] = (float*)(DiagBuffer + (index * (n + padding) * sizeof(float)) + ((index + 16) * 64));
+ if(DiagBuffer != nullptr) {
+ Diagonals[index] = (DiagBuffer + (index * (n + padding)) + ((index + 16) * 16));
} else {
Diagonals[index] = new float[DiagonalLength(StartRow)];
- if(Diagonals[index] == NULL) {
+ if(Diagonals[index] == nullptr) {
printf("Error in MultiDiagonalSymmetricMatrix::CreateDiagonal: memory allocation failed. Out of memory?\n");
return false;
}
@@ -305,9 +303,9 @@ SSEFUNCTION void MultiDiagonalSymmetricMatrix::VectorProduct(float* RESTRICT Pro
const int chunkSize = (lm - srm) / (omp_get_num_procs() * 32);
#else
const int chunkSize = (lm - srm) / (omp_get_num_procs() * 8);
-#endif
#endif
#pragma omp parallel
+#endif
{
// First fill the big part in the middle
// This can be done without intermediate stores to memory and it can be parallelized too
@@ -443,8 +441,8 @@ bool MultiDiagonalSymmetricMatrix::CreateIncompleteCholeskyFactorization(int Max
}
//It's all initialized? Uhkay. Do the actual math then.
- int sss, ss, s;
- int k, MaxStartRow = StartRows[m - 1]; //Handy number.
+ int sss, ss;
+ int MaxStartRow = StartRows[m - 1]; //Handy number.
float **l = ic->Diagonals;
float *d = ic->Diagonals[0]; //Describes D in LDLt.
int icm = ic->m;
@@ -506,8 +504,8 @@ bool MultiDiagonalSymmetricMatrix::CreateIncompleteCholeskyFactorization(int Max
//This is a loop over k from 1 to j, inclusive. We'll cover that by looping over the index of the diagonals (s), and get k from it.
//The first diagonal is d (k = 0), so skip that and have s start at 1. Cover all available s but stop if k exceeds j.
- s = 1;
- k = icStartRows[s];
+ int s = 1;
+ int k = icStartRows[s];
while(k <= j) {
d[j] -= l[s][j - k] * l[s][j - k] * d[j - k];
@@ -554,7 +552,7 @@ bool MultiDiagonalSymmetricMatrix::CreateIncompleteCholeskyFactorization(int Max
return true;
}
-void MultiDiagonalSymmetricMatrix::KillIncompleteCholeskyFactorization(void)
+void MultiDiagonalSymmetricMatrix::KillIncompleteCholeskyFactorization()
{
delete IncompleteCholeskyFactorization;
}
@@ -675,7 +673,7 @@ EdgePreservingDecomposition::EdgePreservingDecomposition(int width, int height)
A->CreateDiagonal(3, w) &&
A->CreateDiagonal(4, w + 1))) {
delete A;
- A = NULL;
+ A = nullptr;
printf("Error in EdgePreservingDecomposition construction: out of memory.\n");
} else {
a0 = A->Diagonals[0];
@@ -694,7 +692,7 @@ EdgePreservingDecomposition::~EdgePreservingDecomposition()
SSEFUNCTION float *EdgePreservingDecomposition::CreateBlur(float *Source, float Scale, float EdgeStopping, int Iterates, float *Blur, bool UseBlurForEdgeStop)
{
- if(Blur == NULL)
+ if(Blur == nullptr)
UseBlurForEdgeStop = false, //Use source if there's no supplied Blur.
Blur = new float[n];
@@ -713,9 +711,7 @@ SSEFUNCTION float *EdgePreservingDecomposition::CreateBlur(float *Source, float
a = Blur, g = Source;
}
- int i;
int w1 = w - 1, h1 = h - 1;
-// float eps = 0.02f;
const float sqreps = 0.0004f; // removed eps*eps from inner loop
@@ -868,7 +864,7 @@ float *EdgePreservingDecomposition::CreateIteratedBlur(float *Source, float Scal
}
//Create a blur here, initialize.
- if(Blur == NULL) {
+ if(Blur == nullptr) {
Blur = new float[n];
}
@@ -927,7 +923,7 @@ SSEFUNCTION float *EdgePreservingDecomposition::CompressDynamicRange(float *Sour
//Blur. Also setup memory for Compressed (we can just use u since each element of u is used in one calculation).
float *u = CreateIteratedBlur(Source, Scale, EdgeStopping, Iterates, Reweightings);
- if(Compressed == NULL) {
+ if(Compressed == nullptr) {
Compressed = u;
}
diff --git a/rtengine/EdgePreservingDecomposition.h b/rtengine/EdgePreservingDecomposition.h
index 04ebfe3b6..bf567f103 100644
--- a/rtengine/EdgePreservingDecomposition.h
+++ b/rtengine/EdgePreservingDecomposition.h
@@ -67,13 +67,16 @@ ben_s or nonbasketless. Enjoy!
#include
#include
#include
+
#include "opthelper.h"
+#include "noncopyable.h"
//This is for solving big symmetric positive definite linear problems.
-float *SparseConjugateGradient(void Ax(float *Product, float *x, void *Pass), float *b, int n, bool OkToModify_b = true, float *x = NULL, float RMSResidual = 0.0f, void *Pass = NULL, int MaximumIterates = 0, void Preconditioner(float *Product, float *x, void *Pass) = NULL);
+float *SparseConjugateGradient(void Ax(float *Product, float *x, void *Pass), float *b, int n, bool OkToModify_b = true, float *x = nullptr, float RMSResidual = 0.0f, void *Pass = nullptr, int MaximumIterates = 0, void Preconditioner(float *Product, float *x, void *Pass) = nullptr);
//Storage and use class for symmetric matrices, the nonzero contents of which are confined to diagonals.
-class MultiDiagonalSymmetricMatrix
+class MultiDiagonalSymmetricMatrix :
+ public rtengine::NonCopyable
{
public:
MultiDiagonalSymmetricMatrix(int Dimension, int NumberOfDiagonalsInLowerTriangle);
@@ -90,7 +93,7 @@ public:
*/
float **Diagonals;
char *buffer;
- char *DiagBuffer;
+ float *DiagBuffer;
int *StartRows;
bool CreateDiagonal(int index, int StartRow);
int n, m; //The matrix is n x n, with m diagonals on the lower triangle. Don't change these. They should be private but aren't for convenience.
@@ -131,7 +134,8 @@ public:
};
-class EdgePreservingDecomposition
+class EdgePreservingDecomposition :
+ public rtengine::NonCopyable
{
public:
EdgePreservingDecomposition(int width, int height);
@@ -139,16 +143,16 @@ public:
//Create an edge preserving blur of Source. Will create and return, or fill into Blur if not NULL. In place not ok.
//If UseBlurForEdgeStop is true, supplied not NULL Blur is used to calculate the edge stopping function instead of Source.
- float *CreateBlur(float *Source, float Scale, float EdgeStopping, int Iterates, float *Blur = NULL, bool UseBlurForEdgeStop = false);
+ float *CreateBlur(float *Source, float Scale, float EdgeStopping, int Iterates, float *Blur = nullptr, bool UseBlurForEdgeStop = false);
//Iterates CreateBlur such that the smoothness term approaches a specific norm via iteratively reweighted least squares. In place not ok.
- float *CreateIteratedBlur(float *Source, float Scale, float EdgeStopping, int Iterates, int Reweightings, float *Blur = NULL);
+ float *CreateIteratedBlur(float *Source, float Scale, float EdgeStopping, int Iterates, int Reweightings, float *Blur = nullptr);
/*Lowers global contrast while preserving or boosting local contrast. Can fill into Compressed. The smaller Compression
the more compression is applied, with Compression = 1 giving no effect and above 1 the opposite effect. You can totally
use Compression = 1 and play with DetailBoost for some really sweet unsharp masking. If working on luma/grey, consider giving it a logarithm.
In place calculation to save memory (Source == Compressed) is totally ok. Reweightings > 0 invokes CreateIteratedBlur instead of CreateBlur. */
- float *CompressDynamicRange(float *Source, float Scale = 1.0f, float EdgeStopping = 1.4f, float CompressionExponent = 0.8f, float DetailBoost = 0.1f, int Iterates = 20, int Reweightings = 0, float *Compressed = NULL);
+ float *CompressDynamicRange(float *Source, float Scale = 1.0f, float EdgeStopping = 1.4f, float CompressionExponent = 0.8f, float DetailBoost = 0.1f, int Iterates = 20, int Reweightings = 0, float *Compressed = nullptr);
private:
MultiDiagonalSymmetricMatrix *A; //The equations are simple enough to not mandate a matrix class, but fast solution NEEDS a complicated preconditioner.
diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc
index ba7ae693e..6bb0c4c3c 100644
--- a/rtengine/FTblockDN.cc
+++ b/rtengine/FTblockDN.cc
@@ -37,6 +37,7 @@
#include "opthelper.h"
#include "cplx_wavelet_dec.h"
#include "median.h"
+#include "iccstore.h"
#ifdef _OPENMP
#include
#endif
@@ -108,7 +109,7 @@ void ImProcFunctions::Median_Denoise(float **src, float **dst, const int width,
medBuffer[0] = src;
// we need a buffer if src == dst or if (src != dst && iterations > 1)
- if (src == dst || (src != dst && iterations > 1)) {
+ if (src == dst || iterations > 1) {
if (buffer == nullptr) { // we didn't get a buufer => create one
allocBuffer = new float*[height];
@@ -853,7 +854,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef
const float noisevarab_b = SQR(realblue);
//input L channel
- array2D *Lin;
+ array2D *Lin = nullptr;
//wavelet denoised image
LabImage * labdn = new LabImage(width, height);
@@ -1677,10 +1678,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef
}
delete labdn;
-
- if (denoiseLuminance) {
- delete Lin;
- }
+ delete Lin;
}//end of tile row
}//end of tile loop
@@ -2250,7 +2248,6 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit
float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl);
if (lvl == maxlvl - 1) {
- float vari[4];
int edge = 0;
ShrinkAllL(WaveletCoeffs_L, buffer, lvl, dir, noisevarlum, madL[lvl], nullptr, edge);
} else {
@@ -2613,7 +2610,7 @@ SSEFUNCTION void ImProcFunctions::ShrinkAllL(wavelet_decomposition &WaveletCoeff
// printf("OK lev=%d\n",level);
float mad_L = madL[dir - 1] ;
- if (edge == 1) {
+ if (edge == 1 && vari) {
noisevarlum = blurBuffer; // we need one buffer, but fortunately we don't have to allocate a new one because we can use blurBuffer
for (int i = 0; i < W_L * H_L; ++i) {
@@ -3044,7 +3041,7 @@ void ImProcFunctions::calcautodn_info (float &chaut, float &delta, int Nb, int l
delta *= 0.15f;
} else if (chaut < 650.f) {
delta *= 0.1f;
- } else if (chaut >= 650.f) {
+ } else /*if (chaut >= 650.f)*/ {
delta *= 0.07f;
}
@@ -3082,7 +3079,7 @@ void ImProcFunctions::calcautodn_info (float &chaut, float &delta, int Nb, int l
delta *= 0.3f;
} else if (chaut < 650.f) {
delta *= 0.2f;
- } else if (chaut >= 650.f) {
+ } else /*if (chaut >= 650.f)*/ {
delta *= 0.15f;
}
@@ -3107,7 +3104,7 @@ void ImProcFunctions::calcautodn_info (float &chaut, float &delta, int Nb, int l
}
-SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat * provicalc, const bool isRAW, LUTf &gamcurve, float gam, float gamthresh, float gamslope, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, float &nresi, float &highresi, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, bool multiThread)
+SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat * provicalc, const bool isRAW, LUTf &gamcurve, float gam, float gamthresh, float gamslope, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, bool multiThread)
{
if ((settings->leveldnautsimpl == 1 && dnparams.Cmethod == "MAN") || (settings->leveldnautsimpl == 0 && dnparams.C2method == "MANU")) {
//nothing to do
@@ -3546,9 +3543,6 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat
}
comptlevel += 1;
- float chresid, chmaxredresid, chmaxblueresid;
- nresi = chresid;
- highresi = chresid + 0.66f * (max(chmaxredresid, chmaxblueresid) - chresid); //evaluate sigma
delete adecomp;
delete bdecomp;
delete labdn;
diff --git a/rtengine/LUT.h b/rtengine/LUT.h
index 24f883766..d83a431ca 100644
--- a/rtengine/LUT.h
+++ b/rtengine/LUT.h
@@ -61,13 +61,16 @@
#include
#include
+#include
+
#ifndef NDEBUG
#include
#include
#endif
+
#include "opthelper.h"
-#include
#include "rt_math.h"
+#include "noncopyable.h"
// Bit representations of flags
enum {
@@ -85,7 +88,8 @@ using LUTd = LUT;
using LUTuc = LUT;
template
-class LUT
+class LUT :
+ public rtengine::NonCopyable
{
protected:
// list of variables ordered to improve cache speed
@@ -532,6 +536,8 @@ public:
size = 0;
upperBound = 0;
maxs = 0;
+ maxsf = 0.f;
+ clip = 0;
}
// create an identity LUT (LUT(x) = x) or a scaled identity LUT (LUT(x) = x / divisor)
diff --git a/rtengine/PF_correct_RT.cc b/rtengine/PF_correct_RT.cc
index 6864e28ec..6808fd4eb 100644
--- a/rtengine/PF_correct_RT.cc
+++ b/rtengine/PF_correct_RT.cc
@@ -47,7 +47,7 @@ SSEFUNCTION void ImProcFunctions::PF_correct_RT(LabImage * src, LabImage * dst,
{
const int halfwin = ceil(2 * radius) + 1;
- FlatCurve* chCurve = NULL;
+ FlatCurve* chCurve = nullptr;
if (params->defringe.huecurve.size() && FlatCurveType(params->defringe.huecurve.at(0)) > FCT_Linear) {
chCurve = new FlatCurve(params->defringe.huecurve);
@@ -289,7 +289,7 @@ SSEFUNCTION void ImProcFunctions::PF_correct_RTcam(CieImage * src, CieImage * ds
{
const int halfwin = ceil(2 * radius) + 1;
- FlatCurve* chCurve = NULL;
+ FlatCurve* chCurve = nullptr;
if (params->defringe.huecurve.size() && FlatCurveType(params->defringe.huecurve.at(0)) > FCT_Linear) {
chCurve = new FlatCurve(params->defringe.huecurve);
diff --git a/rtengine/StopWatch.h b/rtengine/StopWatch.h
index 2b3ff1baf..9e4400b94 100644
--- a/rtengine/StopWatch.h
+++ b/rtengine/StopWatch.h
@@ -26,18 +26,17 @@
#ifdef BENCHMARK
#define BENCHFUN StopWatch StopFun(__func__);
+ #define BENCHFUNMICRO StopWatch StopFun(__func__, true);
#else
#define BENCHFUN
+ #define BENCHFUNMICRO
#endif
class StopWatch
{
public:
- StopWatch( )
- {
- stopped = false;
- }
- StopWatch( const char* msg)
+
+ explicit StopWatch( const char* msg, bool microseconds = false ) : microseconds(microseconds)
{
message = msg;
start();
@@ -56,8 +55,13 @@ public:
void stop()
{
stopTime.set();
- long elapsedTime = stopTime.etime(startTime) / 1000;
- std::cout << message << " took " << elapsedTime << " ms" << std::endl;
+ if(!microseconds) {
+ long elapsedTime = stopTime.etime(startTime) / 1000;
+ std::cout << message << " took " << elapsedTime << " ms" << std::endl;
+ } else {
+ long elapsedTime = stopTime.etime(startTime);
+ std::cout << message << " took " << elapsedTime << " us" << std::endl;
+ }
stopped = true;
}
void stop(const char *msg)
@@ -66,6 +70,7 @@ public:
stop();
};
private:
+ bool microseconds;
MyTime startTime;
MyTime stopTime;
const char *message;
diff --git a/rtengine/alignedbuffer.h b/rtengine/alignedbuffer.h
index ac8471b7e..44fd43e81 100644
--- a/rtengine/alignedbuffer.h
+++ b/rtengine/alignedbuffer.h
@@ -43,7 +43,7 @@ public:
* @param size Number of elements of size T to allocate, i.e. allocated size will be sizeof(T)*size ; set it to 0 if you want to defer the allocation
* @param align Expressed in bytes; SSE instructions need 128 bits alignment, which mean 16 bytes, which is the default value
*/
- AlignedBuffer (size_t size = 0, size_t align = 16) : real(NULL), alignment(align), allocatedSize(0), unitSize(0), data(NULL), inUse(false)
+ AlignedBuffer (size_t size = 0, size_t align = 16) : real(nullptr), alignment(align), allocatedSize(0), unitSize(0), data(nullptr), inUse(false)
{
if (size) {
resize(size);
@@ -78,8 +78,8 @@ public:
free(real);
}
- real = NULL;
- data = NULL;
+ real = nullptr;
+ data = nullptr;
inUse = false;
allocatedSize = 0;
unitSize = 0;
@@ -93,7 +93,15 @@ public:
// we're freeing the memory and allocate it again if the new size is bigger.
if (allocatedSize < oldAllocatedSize) {
- real = realloc(real, allocatedSize + alignment);
+ void *temp = realloc(real, allocatedSize + alignment);
+ if (temp) { // realloc succeeded
+ real = temp;
+ } else { // realloc failed => free old buffer and allocate new one
+ if (real) {
+ free (real);
+ }
+ real = malloc(allocatedSize + alignment);
+ }
} else {
if (real) {
free (real);
@@ -109,7 +117,7 @@ public:
} else {
allocatedSize = 0;
unitSize = 0;
- data = NULL;
+ data = nullptr;
inUse = false;
return false;
}
@@ -143,7 +151,7 @@ private:
size_t size;
public:
- AlignedBufferMP(size_t sizeP)
+ explicit AlignedBufferMP(size_t sizeP)
{
size = sizeP;
}
diff --git a/rtengine/array2D.h b/rtengine/array2D.h
index f9d92ac36..2fe4ecad4 100644
--- a/rtengine/array2D.h
+++ b/rtengine/array2D.h
@@ -66,12 +66,16 @@
#include
#include
+#include "noncopyable.h"
+
template
-class array2D
+class array2D :
+ public rtengine::NonCopyable
{
private:
- int x, y, owner, flags;
+ int x, y, owner;
+ unsigned int flags;
T ** ptr;
T * data;
bool lock; // useful lock to ensure data is not changed anymore.
@@ -79,19 +83,19 @@ private:
{
if ((ptr) && ((h > y) || (4 * h < y))) {
delete[] ptr;
- ptr = NULL;
+ ptr = nullptr;
}
if ((data) && (((h * w) > (x * y)) || ((h * w) < ((x * y) / 4)))) {
delete[] data;
- data = NULL;
+ data = nullptr;
}
- if (ptr == NULL) {
+ if (ptr == nullptr) {
ptr = new T*[h];
}
- if (data == NULL) {
+ if (data == nullptr) {
data = new T[h * w + offset];
}
@@ -109,7 +113,7 @@ public:
// use as empty declaration, resize before use!
// very useful as a member object
array2D() :
- x(0), y(0), owner(0), ptr(NULL), data(NULL), lock(0)
+ x(0), y(0), owner(0), ptr(nullptr), data(nullptr), lock(0), flags(0)
{
//printf("got empty array2D init\n");
}
@@ -147,7 +151,7 @@ public:
if (owner) {
data = new T[h * w];
} else {
- data = NULL;
+ data = nullptr;
}
x = w;
@@ -188,12 +192,12 @@ public:
{
if ((owner) && (data)) {
delete[] data;
- data = NULL;
+ data = nullptr;
}
if (ptr) {
delete [] ptr;
- ptr = NULL;
+ ptr = nullptr;
}
}
@@ -282,6 +286,8 @@ public:
if (this != &rhs)
{
+ flags = rhs.flags;
+ lock = rhs.lock;
if (!owner) { // we can only copy same size data
if ((x != rhs.x) || (y != rhs.y)) {
printf(" assignment error in array2D\n");
diff --git a/rtengine/cache.h b/rtengine/cache.h
index ea567542c..f4c232673 100644
--- a/rtengine/cache.h
+++ b/rtengine/cache.h
@@ -64,7 +64,7 @@ public:
virtual void onDestroy() = 0;
};
- Cache(unsigned long _size, Hook* _hook = 0) :
+ Cache(unsigned long _size, Hook* _hook = nullptr) :
store_size(_size),
hook(_hook)
{
diff --git a/rtengine/camconst.cc b/rtengine/camconst.cc
index c7a6412be..5a155e051 100644
--- a/rtengine/camconst.cc
+++ b/rtengine/camconst.cc
@@ -41,7 +41,7 @@ CameraConst::parseApertureScaling(CameraConst *cc, void *ji_)
return false;
}
- for (ji = ji->child; ji != NULL; ji = ji->next) {
+ for (ji = ji->child; ji != nullptr; ji = ji->next) {
cJSON *js = cJSON_GetObjectItem(ji, "aperture");
if (!js) {
@@ -90,7 +90,7 @@ CameraConst::parseLevels(CameraConst *cc, int bw, void *ji_)
int i;
cJSON *js;
- for (js = ji->child, i = 0; js != NULL && i < 4; js = js->next, i++) {
+ for (js = ji->child, i = 0; js != nullptr && i < 4; js = js->next, i++) {
lvl.levels[i] = js->valueint;
}
@@ -98,7 +98,7 @@ CameraConst::parseLevels(CameraConst *cc, int bw, void *ji_)
lvl.levels[3] = lvl.levels[1]; // G2 = G1
} else if (i == 1) {
lvl.levels[3] = lvl.levels[2] = lvl.levels[1] = lvl.levels[0];
- } else if (i != 4 || js != NULL) {
+ } else if (i != 4 || js != nullptr) {
fprintf(stderr, "\"ranges\":\"%s\" array must have 1, 3 or 4 numbers.\n", bw ? "white" : "black");
return false;
}
@@ -107,7 +107,7 @@ CameraConst::parseLevels(CameraConst *cc, int bw, void *ji_)
return true;
}
- for (ji = ji->child; ji != NULL; ji = ji->next) {
+ for (ji = ji->child; ji != nullptr; ji = ji->next) {
int iso[1000] = { 0 };
int iso_count = 0;
cJSON *js = cJSON_GetObjectItem(ji, "iso");
@@ -121,7 +121,7 @@ CameraConst::parseLevels(CameraConst *cc, int bw, void *ji_)
} else if (js->type == cJSON_Array) {
int i;
- for (js = js->child, i = 0; js != NULL && i < 1000; js = js->next, i++) {
+ for (js = js->child, i = 0; js != nullptr && i < 1000; js = js->next, i++) {
if (js->type != cJSON_Number) {
fprintf(stderr, "\"ranges\":\"%s\":\"iso\" must be a number or an array of numbers.\n", bw ? "white" : "black");
return false;
@@ -150,7 +150,7 @@ CameraConst::parseLevels(CameraConst *cc, int bw, void *ji_)
} else if (js->type == cJSON_Array) {
int i;
- for (js = js->child, i = 0; js != NULL && i < 4; js = js->next, i++) {
+ for (js = js->child, i = 0; js != nullptr && i < 4; js = js->next, i++) {
if (js->type != cJSON_Number) {
fprintf(stderr, "\"ranges\":\"%s\":\"levels\" must be a number or an array of numbers.\n", bw ? "white" : "black");
return false;
@@ -163,7 +163,7 @@ CameraConst::parseLevels(CameraConst *cc, int bw, void *ji_)
lvl.levels[3] = lvl.levels[1]; // G2 = G1
} else if (i == 1) {
lvl.levels[3] = lvl.levels[2] = lvl.levels[1] = lvl.levels[0];
- } else if (i != 4 || js != NULL) {
+ } else if (i != 4 || js != nullptr) {
fprintf(stderr, "\"ranges\":\"%s\":\"levels\" array must have 1, 3 or 4 numbers.\n", bw ? "white" : "black");
return false;
}
@@ -183,7 +183,7 @@ CameraConst::parseLevels(CameraConst *cc, int bw, void *ji_)
CameraConst *
CameraConst::parseEntry(void *cJSON_, const char *make_model)
{
- CameraConst *cc = 0;
+ CameraConst *cc = nullptr;
cJSON *js, *ji, *jranges;
js = (cJSON *)cJSON_;
@@ -200,7 +200,7 @@ CameraConst::parseEntry(void *cJSON_, const char *make_model)
int i;
- for (i = 0, ji = ji->child; i < 12 && ji != NULL; i++, ji = ji->next) {
+ for (i = 0, ji = ji->child; i < 12 && ji != nullptr; i++, ji = ji->next) {
if (ji->type != cJSON_Number) {
fprintf(stderr, "\"dcraw_matrix\" array must contain numbers\n");
goto parse_error;
@@ -220,7 +220,7 @@ CameraConst::parseEntry(void *cJSON_, const char *make_model)
int i;
- for (i = 0, ji = ji->child; i < 4 && ji != NULL; i++, ji = ji->next) {
+ for (i = 0, ji = ji->child; i < 4 && ji != nullptr; i++, ji = ji->next) {
if (ji->type != cJSON_Number) {
fprintf(stderr, "\"raw_crop\" array must contain numbers\n");
goto parse_error;
@@ -229,7 +229,7 @@ CameraConst::parseEntry(void *cJSON_, const char *make_model)
cc->raw_crop[i] = ji->valueint;
}
- if (i != 4 || ji != NULL) {
+ if (i != 4 || ji != nullptr) {
fprintf(stderr, "\"raw_crop\" must contain 4 numbers\n");
goto parse_error;
}
@@ -245,7 +245,7 @@ CameraConst::parseEntry(void *cJSON_, const char *make_model)
int i;
- for (i = 0, ji = ji->child; i < 8 * 4 && ji != NULL; i++, ji = ji->next) {
+ for (i = 0, ji = ji->child; i < 8 * 4 && ji != nullptr; i++, ji = ji->next) {
if (ji->type != cJSON_Number) {
fprintf(stderr, "\"masked_areas\" array must contain numbers\n");
goto parse_error;
@@ -317,11 +317,11 @@ CameraConst::parseEntry(void *cJSON_, const char *make_model)
return cc;
parse_error:
- return 0;
+ return nullptr;
}
bool
-CameraConst::has_dcrawMatrix(void)
+CameraConst::has_dcrawMatrix()
{
return dcraw_matrix[0] != 0;
}
@@ -339,17 +339,17 @@ CameraConst::update_dcrawMatrix(const short *other)
}
const short *
-CameraConst::get_dcrawMatrix(void)
+CameraConst::get_dcrawMatrix()
{
if (!has_dcrawMatrix()) {
- return 0;
+ return nullptr;
}
return dcraw_matrix;
}
bool
-CameraConst::has_rawCrop(void)
+CameraConst::has_rawCrop()
{
return raw_crop[0] != 0 || raw_crop[1] != 0 || raw_crop[2] != 0 || raw_crop[3] != 0;
}
@@ -545,7 +545,7 @@ CameraConstantsStore::parse_camera_constants_file(Glib::ustring filename_)
const char *filename = filename_.c_str();
FILE *stream = fopen(filename, "rt");
- if (stream == NULL) {
+ if (stream == nullptr) {
fprintf(stderr, "Could not open camera constants file \"%s\": %s\n", filename, strerror(errno));
return false;
}
@@ -558,10 +558,20 @@ CameraConstantsStore::parse_camera_constants_file(Glib::ustring filename_)
while ((ret = fread(&buf[datasize], 1, bufsize - datasize, stream)) != 0) {
datasize += ret;
- if (datasize == bufsize) {
+ if (datasize == bufsize) { // we need more memory
bufsize += increment;
- buf = (char *)realloc(buf, bufsize);
- increment *= 2;
+ void *temp = realloc(buf, bufsize); // try to realloc buffer with new size
+ if(!temp) { // realloc failed
+ temp = malloc(bufsize); // alloc now buffer
+ if (temp) { // alloc worked
+ memcpy(temp, buf, bufsize - increment); // copy old buffer content to new buffer
+ free(buf); // free old buffer
+ } else { // alloc didn't work, break
+ break;
+ }
+ }
+ buf = (char *)temp; // assign new buffer
+ increment *= 2; // double increment
}
}
@@ -614,7 +624,7 @@ CameraConstantsStore::parse_camera_constants_file(Glib::ustring filename_)
goto parse_error;
}
- for (js = js->child; js != NULL; js = js->next) {
+ for (js = js->child; js != nullptr; js = js->next) {
cJSON *ji = cJSON_GetObjectItem(js, "make_model");
if (!ji) {
@@ -629,7 +639,7 @@ CameraConstantsStore::parse_camera_constants_file(Glib::ustring filename_)
is_array = true;
}
- while (ji != NULL) {
+ while (ji != nullptr) {
if (ji->type != cJSON_String) {
fprintf(stderr, "\"make_model\" must be a string or an array of strings\n");
goto parse_error;
@@ -667,7 +677,7 @@ CameraConstantsStore::parse_camera_constants_file(Glib::ustring filename_)
if (is_array) {
ji = ji->next;
} else {
- ji = NULL;
+ ji = nullptr;
}
}
}
@@ -698,7 +708,7 @@ void CameraConstantsStore::init(Glib::ustring baseDir, Glib::ustring userSetting
}
CameraConstantsStore *
-CameraConstantsStore::getInstance(void)
+CameraConstantsStore::getInstance()
{
static CameraConstantsStore instance_;
return &instance_;
@@ -715,7 +725,7 @@ CameraConstantsStore::get(const char make[], const char model[])
it = mCameraConstants.find(key);
if (it == mCameraConstants.end()) {
- return 0;
+ return nullptr;
}
return it->second;
diff --git a/rtengine/camconst.json b/rtengine/camconst.json
index cf3e976ce..7ddcefaba 100644
--- a/rtengine/camconst.json
+++ b/rtengine/camconst.json
@@ -1,105 +1,96 @@
/*
- DO NOT EDIT THIS FILE!
+DO NOT EDIT THIS FILE!
- All changes made here will be lost on software update.
- If you want to add custom values or changes existing ones,
- create a "camconst.json" file next to your personal "options" file.
- Its values will then override and/or complete the ones of this file.
+All changes made here will be lost on software update. If you want to add custom values or change existing ones, create
+a "camconst.json" file next to your personal "options" file. Its values will then override and/or complete the ones of
+this file.
- If you add values for your own camera and are okay to share them with
- RawTherapee's community, please drop a link on the user's forum
+If you add values for your own camera, consider sharing them with the community for everyone's benefit. You can do so
+via our forum or GitHub page:
+- https://discuss.pixls.us/c/software/rawtherapee
+- https://github.com/Beep6581/RawTherapee/issues
- IMPORTANT:
- ----------
+Value priority:
+1. If you set the dcraw matrix in your user camconst.json file for a camera entry which already exists in RT's file
+ (same camera, same model), your values will replace RT's ones.
+2. If you set the black level values in your user camconst.json file for a camera entry which already exists in RT's
+ file, your values will replace RT's ones, even if RT's ones are more complete and/or detailed. You might want to
+ copy/paste RT's levels first (if provided) to your user's file and complete/modify them.
+3. Same for the white levels, independent of the black levels.
- 1. If you set the dcraw matrix in your user file for an already existing entry
- in RT's file (same camera, same model), your values will replace RT's ones.
- 2. If you set the Black level(s) values in your user file for an already existing
- entry in RT's file, your values will replace RT's ones, even if RT's ones are
- more complete and/or detailed. You might want to copy/paste RT's levels first
- (if provided) to your user's file and complete/modify it.
+This file is in JSON format and contains camera constants which RawTherapee uses when parsing raw files.
- Same for the White level(s), independently from the Black level(s).
+Raw files themselves unfortunately do not contain all information needed for making a raw conversion. Typically color
+response information and black/white levels are missing. That's why this file is needed.
+This file is read once during startup, so if the file is updated you need to restart RawTherapee in order for changes to
+take effect. The file is not intended for modification by the casual user, but advanced users can add missing camera
+information to this file. If you do so, please report using the links above so that we can incorporate your changes for
+everyone's benefit.
-----------------------------------------------------------------------------------
+RawTherapee uses dcraw as the raw format parser. dcraw contains hard-coded camera constants, but not for all cameras,
+and the values are not always accurate. For example dcraw only supports one white level, while some cameras have
+different white levels per channel and per ISO. If a camera is not listed in this file the constants from dcraw will be
+used. If listed here this information will override the constants in dcraw (if any).
-
-This file is in JSON format and contains camera constants which RawTherapee uses
-when parsing raw files.
-
-Raw files themselves unfortunately do not contain all information needed for making
-a raw conversion, typically color response information and black/white levels are
-missing. That's why this file is needed.
-
-It's read once during startup, so if the file is updated you need to restart
-RawTherapee in order to take effect. The file is not intended for modification by
-the casual user, but advanced users can add missing camera information to this file.
-If you do so please report at https://github.com/Beep6581/RawTherapee/issues so we can
-extend the distributed version of this file so your provided camera information
-becomes available to all.
-
-RawTherapee uses DCRAW as the raw format parser. DCRAW contains hard-coded camera
-constants, but not for all cameras and not always accurate information. For example
-DCRAW only support one white level, while some cameras have different white levels
-per channel and per ISO. If a camera is not listed in this file the constants from
-DCRAW will be used, if listed here this information will override any constants in
-DCRAW (if any).
-
-Some cameras may only have partial information here, for example if the raw file
-itself contains a color matrix it's not entered here. A camera whose black level
-is measured on special pixels in the raw file should only have white levels here
-etc.
+Partial information is supported. For example if the raw file itself contains a color matrix then there is no need to
+enter it here. A camera whose black level is measured on special pixels in the raw file should only have white levels
+here. And so forth.
Examples:
{
- // make and model separated with single space, must match make
- // and model as provided by dcraw (case-insensitive).
+ // Make and model separated with single space, must match make and model as provided by dcraw (case-insensitive):
"make_model": "ManufacturerA ModelB",
- Some Panasonics and some Canon Dslrs (of the low category like Canon 550D) exist
- under alternate naming in various marketplaces (EOS 550D, EOS Rebel T2i, EOS Kiss X4).
- For new models that are still not supported by the Dcraw version used in current RT,
- we have to fill all the alternate names or else RT will not recognize the alternate model names
- For models supported by Dcraw, filling the alternate names is simply desired (for better user info).
- The format of multiple naming is to write all names in brackets i.e
- instead of .. "make_model": "Canon EOS 550D",
- type .. "make_model": [ "Canon EOS 550D", "Canon EOS Rebel T2i", "Canon EOS Kiss X4" ],
- // ColorMatrix with D65 Calibration Illuminant, in dcraw format
+ // Some Panasonic and Canon DSLRs (of the lower category, such as Canon 550D) exist/ under alternate naming in
+ // various marketplaces (EOS 550D, EOS Rebel T2i, EOS Kiss X4).
+ // For new models that are still not supported by the dcraw version used in current RT, we have to fill all the
+ // alternate names or else RT will not recognize the alternate model names.
+ // For models supported by dcraw, filling the alternate names is simply desired (for better user info).
+ // The format of multiple naming is to write all names in brackets i.e instead of
+ // "make_model": "Canon EOS 550D",
+ // type
+ // "make_model": [ "Canon EOS 550D", "Canon EOS Rebel T2i", "Canon EOS Kiss X4" ],
+
+ // ColorMatrix with CIE Standard Illuminant D65, in dcraw format:
"dcraw_matrix": [ 7530, -1942, -255, -4318, 11390, 3362, -926, 1694, 7649 ],
- // black level (or black offset if a base black is already extracted from exif by Dcraw, see Panasonic, resent Nikon )
- // For some rare cases where Dcraw detects wrong Black Level we need to correct it with absolute black i.e one that is not added up
- // the detected. For this job we have to define "black" as 65535+desired_black. For example to correct a wrongly detected black level
- of 9 instead of the correct 600 we define "black": 66135 i.e. 65535+600.
- // and white level same for all colors at all ISOs
+
+ // Black level (or black offset if a base black is already extracted from Exif by dcraw, see Panasonic,
+ // recent Nikon). For some rare cases where dcraw detects wrong black level we need to correct it with
+ // absolute black i.e one that is not added up the detected. For this job we have to define "black" as
+ // 65535+desired_black. For example to correct a wrongly detected black level of 9 instead of the correct
+ // 600 we define "black": 66135, i.e. 65535+600, and white level same for all colors at all ISOs.
"ranges": { "black": 10, "white": 1000 },
- // crop away masked sensor borders, 10 pixels left, 20 pixels top, resulting image width/height 4000x3000
- // instead of width/height you can write a negative number which specifies how much of right/bottom border
- that should be removed but keep in mind that sometimes after converting to DNG the borders are already
- cropped so the "negative number" way is not totally safe.
- "raw_crop": [ 10, 20, 4000, 3000 ],
- // Almost same as MaskedAreas DNG tag, used for black level measuring. Here up to two areas can be defined
- by tetrads of numbers
- "masked_areas": [ 51, 2, 3804, 156, 51, 5794, 3804, 5792 ], // two tetrads define two areas
- The difference vs "raw_crop" is the meaning of the numbers which here are expressing the absolute distance (in pixels)
- of each side of each rectangular "masked area" from the top and left side of the sensor
- - the first number is the distance of the top edge from the sensor's top
- - the second is the distance of the left side from the sensor's left
- - the third is the distance of the bottom side from the sensor's top
- - the fourth is the distance of the right side from the sensor's left
- It is useful after detecting the masked areas, to not fully use these areas but leave a border of
- 2-4 pixels instead, to take care of possible light leaks from the light sensing area to the optically
- black (masked) area or sensor imperfections at the outer borders.
+
+ // Crop away masked sensor borders, 10 pixels left, 20 pixels top, resulting image width/height 4000x3000.
+ // Instead of width/height you can write a negative number which specifies how much of right/bottom border
+ // that should be removed but keep in mind that sometimes after converting to DNG the borders are already
+ // cropped so the "negative number" way is not totally safe.
+ "raw_crop": [ 10, 20, 4000, 3000 ],
+
+ // Almost same as MaskedAreas DNG tag, used for black level measuring. Here up to two areas can be defined
+ // by tetrads of numbers:
+ "masked_areas": [ 51, 2, 3804, 156, 51, 5794, 3804, 5792 ],
+ // Two tetrads define two areas. The difference vs "raw_crop" is the meaning of the numbers which here are
+ // expressing the absolute distance (in pixels) of each side of each rectangular "masked area" from the top
+ // and left side of the sensor
+ // - the first number is the distance of the top edge from the sensor's top
+ // - the second is the distance of the left side from the sensor's left
+ // - the third is the distance of the bottom side from the sensor's top
+ // - the fourth is the distance of the right side from the sensor's left
+ // It is useful after detecting the masked areas, to not fully use these areas but leave a border of 2-4 pixels
+ // instead, to take care of possible light leaks from the light sensing area to the optically black (masked)
+ // area or sensor imperfections at the outer borders.
},
{
"make_model": "ManufacturerA ModelB",
"dcraw_matrix": [ 7530,-1942,-255,-4318,11390,3362,-926,1694,7649 ],
- // black and white levels per ISO per channel
- // this example only two ISOs, normally the list should be more populated.
- // When RawTherapee asks for black/white levels for a specific ISO the closest
- // match is picked.
+
+ // Black and white levels per ISO per channel.
+ // In this example there are only two ISOs - normally the list should be more populated.
+ // When RawTherapee asks for black/white levels for a specific ISO the closest match is picked.
"ranges": {
"black": [
{ "iso": 100, "levels": 10 }, // here only one level, same level for all channels
@@ -112,286 +103,212 @@ Examples:
}
}
-How to measure white levels:
+
+How to Measure White Levels:
----------------------------
-Dcraw which provides the default values to RawTherapee often provides too high
-white levels, and only provides a single value regardless of color channel, ISO
-or aperture. If you open an image with a large clipped area and that is
-rendered in a pink/magenta color rather than white it usually means that the
-white level constant is too high. You can fix this by adjusting the
-"Raw White Point" in the raw tab inside RawTherapee, or permanently fix it by
-measuring and providing a more exact white level in camconst.json so
-RawTherapee gets to know from start where the camera actually clips.
+ dcraw provides the default values used by RawTherapee, but often provides too high white levels, and only provides a
+ single value regardless of color channel, ISO or aperture. If you open an image with a large clipped area and that
+ is rendered in a pink/magenta color rather than white it usually means that the white level constant is too high. You can
+ fix this by adjusting the"Raw White Point" in the raw tab inside RawTherapee, or permanently fix it by measuring and
+ providing a more exact white level in camconst.json so RawTherapee gets to know from start where the camera actually
+ clips. Providing a complete and detailed white-level profile can be a quite large and complicated effort. As an
+ alternative you can provide a simpler profile.We suggest one of the following alternatives in rising difficulty
+ (and generally diminishing return):
+ A) Provide a single white-level value measured on the native ISO (base ISO). For many cameras this will actually be
+ complete information, those that don't vary on channel, ISO or aperture.
+ B) Check through all ISOs and if there are differences in white level provide an array with white level per ISO.
+ C) In addition to ISO, check for aperture scaling and add that.
+ D) In addition to ISO and aperture scaling check for color channel differences and add that.
-Providing a complete and detailed white-level profile can be a quite large
-and complicated effort. As an alternative you can provide a simpler profile.
-We suggest one of the following alternatives in rising difficulty (and
-generally diminishing return):
+ Doing A is often better than nothing, as dcraw's default is often too high.B can also be worthwhile for some cameras (or
+ else you'll get pink highlights for some ISOs), while C and D can generally be seen as fine-tuning.
-A) Provide a single white-level value measured on the native ISO (base ISO).
- For many cameras this will actually be complete information, those that
- don't vary on channel, ISO or aperture.
-B) Check through all ISOs and if there are differences in white level provide
- an array with white level per ISO.
-C) In addition to ISO, check for aperture scaling and add that.
-D) In addition to ISO and aperture scaling check for color channel
- differences and add that.
+ Here follows a guide how to measure white levels (clipping levels):
-Doing A) is often better than nothing, as dcraw's default is often too high.
-B) can also be worthwhile for some cameras (or else you'll get pink highlights
-for some ISOs), while C) and D) can generally be seen as fine-tuning.
+ Shoot with your camera into a bright light source, such as a lamp, and make sure the shutter speed is long enough to get
+ overexposure (we want clipping!). Preferably overexpose lightly, say 1 or 2 stops if you can. The reason for this is that
+ some cameras with fuzzy white levels may look less fuzzy than they actually are if over-exposure is heavy.
-Here follows a guide how to measure white levels (clipping levels):
+ Use f/5.6 or smaller aperture (=larger f-number) to avoid any raw scaling the camera might have for large apertures.
-Shoot with your camera into a bright light source, such as a lamp, and make
-sure the shutter speed is long enough to get overexposure (we want
-clipping!). Preferably overexpose lightly, say 1 or 2 stops if you can. The
-reason for this is that some cameras with fuzzy white levels may look less
-fuzzy than they actually are if over-exposure is heavy.
+ Open the file in a raw analyzer such as RawDigger and check the pixel values for the clipped areas (if you are using
+ RawDigger, make sure you have disabled"subtract black" in preferences or else sample values can be wrong). In
+ this stage we always look at white level before black level subtraction! White levels can be different on color
+ channel (R, G1, B, G2, note the two greens, most often both green channels have the same white level though) and
+ vary depending on ISO setting, so if you want to provide a complete profile make one shoot for each ISO (even 1/3
+ steps, so yes it can be quite a lot of pictures to shoot and check).
-Use f/5.6 or smaller aperture (=larger f-number) to avoid any raw scaling
-the camera might have for large apertures.
+ In addition, many cameras scale the raw values for large apertures. It's generally not that important to cover this, but
+ if you want to extract most out of the camera you should cover this too. Then you need to shoot with a wide aperture
+ lens (ideally the widest available from the manufacturer) and test each aperture (1/3 steps) from the widest (say f/1.2)
+ until the camera stops scaling the raw values (usually f/2.8 or f/4.0). If the camera also have ISO scaling you need to
+ shoot at these different ISOs to detect any differences in scaling, there can be a bit of variation. If you don't have
+ access to the widest lens available for the system (say only an f/1.8 lens instead of an f/1.2) it can still be valuable
+ to have the values down to what you can provide. Brands known to have models that have aperture scaling of white levels
+ include Canon and Nikon. Note that if white levels are not scaled the camera may have raw scaling anyway (Sony for
+ example), but as such scaling will not affect raw decoding we don't need to care about that.
-Open the file in a raw analyzer such as Rawdigger and check the pixel values
-for the clipped areas (if you are using Rawdigger, make sure you have disabled
-"subtract black" in preferences or else sample values can be wrong). In this
-stage we always look at white level before black level subtraction! White
-levels can be different on color channel (R, G1, B, G2, note the two greens,
-most often both green channels have the same white level though) and vary
-depending on ISO setting, so if you want to provide a complete profile make
-one shoot for each ISO (even 1/3 steps, so yes it can be quite a lot of
-pictures to shoot and check).
+ PROVIDE CONSERVATIVE VALUES. Most cameras have a little noise at the white level, and some can have a lot. In your raw
+ analyzer, move around and look at the values in the clipped areas to get a sense of the variation, and/or look at the
+ histogram. While it's common to with very little variation, say only +/-2 units, some can have +/-500 or more (some may
+ have different variation depending on ISO). There can also be camera-to-camera variation.
-In addition, many cameras scale the raw values for large apertures. It's
-generally not that important to cover this, but if you want to extract most
-out of the camera you should cover this too. Then you need to shoot with a
-wide aperture lens (ideally the widest available from the manufacturer) and
-test each aperture (1/3 steps) from the widest (say f/1.2) until the camera
-stops scaling the raw values (usually f/2.8 or f/4.0). If the camera also
-have ISO scaling you need to shoot at these different ISOs to detect any
-differences in scaling, there can be a bit of variation. If you don't have
-access to the widest lens available for the system (say only an f/1.8 lens
-instead of an f/1.2) it can still be valuable to have the values down to
-what you can provide. Brands known to have models that have aperture scaling
-of white levels include Canon and Nikon. Note that if white levels are not
-scaled the camera may have raw scaling anyway (Sony for example), but as
-such scaling will not affect raw decoding we don't need to care about that.
+ If the white level is set too high RawTherapee will not think the pixels are clipped and you can get discoloured
+ highlights (usually pink), this is what we want to avoid. If white level is set too low RawTherapee will clip early, ie
+ you lose a little highlight detail, but the color is rendered correctly and highlight reconstruction can work properly,
+ so this is not as bad. This is why we want conservative values.
-PROVIDE CONSERVATIVE VALUES. Most cameras have a little noise at the white
-level, and some can have a lot. In your raw analyzer, move around and look at
-the values in the clipped areas to get a sense of the variation, and/or look
-at the histogram. While it's common to with very little variation, say only
-+/-2 units, some can have +/-500 or more (some may have different variation
-depending on ISO). There can also be camera-to-camera variation.
+ By conservative values we mean that if you see a white level of most often 15760 and occasionally 15759 (i.e. very small
+ variation of white level which is a common case), you set the white level around 50-100 14-bit units below or
+ 10-20 12-bit units. Say at 15700 in this example, or 4080 instead of 4095 for 12-bit raws. This way we get a little margin
+ from noise and camera variation. Since sensor raw values are linear, you lose, for example,
+ log2(1-50/15760) = -0.005 stops of detail, i.e. irrelevant. Thus it is better to provide RawTherapee with knowledge
+ where the image clips rather than keeping that last 0.005 stop of highlight information and risking that clipping will
+ not be detected properly.
-If the white level is set too high RawTherapee will not think the pixels are
-clipped and you can get discoloured highlights (usually pink), this is what
-we want to avoid. If white level is set too low RawTherapee will clip early, ie
-you lose a little highlight detail, but the color is rendered correctly and
-highlight reconstruction can work properly, so this is not as bad. This is why
-we want conservative values.
+ It is very usual for white level to be a bell distribution instead of a candle when the camera applies long exposure
+ noise reduction (LENR) by subtracting a black frame and/or when the system is destabilized due to temperature. Some models have
+ always a bell distribution at WL. If you have a fuzzy white level look at the linear histogram; you will probably see a
+ normal/Gaussian distribution (bell shape) noise peak at clipping and probably also a peak at a hard raw data clip level
+ usually at or close to a power of two - 1, such as 4095 or 16383. Then you pick a value just before the bell shape
+ rises, i.e. to the left of the bell meaning that you cut away the whole fuzzy noise peak. If a little of the starting edge
+ of the noise will be included it's not harmful, but 99% of it should be above. This would mean that it's better to
+ measure white level on long exposure/high temp raws but since this if difficult and time consuming we choose to measure
+ on normal raws and cover the abnormalities with the conservative WL values. A more detailed approach when we only have
+ non-LENR measures is to subtract a value according to per ISO read noise. We can find data regarding read noise (stdev
+ of Gaussian distribution) at http://www.photonstophotos.net/Charts/RN_ADU.htm . We find the per ISO tead_noise and
+ subtract from the measured value 6*read_noise. This gives confidence that 99.5% of the bell is clipped out.
-By conservative values we mean that if you see a white level of most often
-15760 and occassionally 15759 (ie very small variation of white level which
-is a common case), you set the white level around 50-100 14-bit units below or
-10-20 12-bit units. Say at 15700 in this example, or 4080 instead of 4095 for
-12-bit raws. This way we get a little margin from noise and camera variation.
-Since sensor raw values are linear, you lose, for example,
-log2(1-50/15760) = -0.005 stops of detail, i.e. irrelevant. Thus it is better
-to provide RawTherapee with knowledge where the image clips rather than keeping
-that last 0.005 stop of highlight information and risking that clipping will
-not be detected properly.
+ If you have used Adobe's DNG Converter and analyzed it's output you may have noticed that it's very conservative
+ regarding white levels, i.e. it cuts away quite a lot from the top. While we also recommend to be conservative, you can
+ generally be a little bit less so than Adobe's DNG Converter. RawTherapee is meant to max out what you can get from your
+ camera, and the white levels should mirror that, within reason.
-It is very usual for white level to be a bell distribution instead of a candle
-when the camera applies long exposure noise reduction by subtracting a black frame
-and/or when the system is destabilized due to temperature. Some models have
-always a bell distribution at WL.
-If you have a fuzzy white level look at the linear histogram; you will probably
-see a normal/gaussian distribution (bell shape) noise peak at clipping and
-probably also a peak at a hard raw data clip level usually at or close to a
-power of two - 1, such as 4095 or 16383. Then you pick a value just before the
-bell shape rises, ie to the left of the bell meaning that you cut away the
-whole fuzzy noise peak. If a little of the starting edge of the noise will be
-included it's not harmful, but 99% of it should be above.
-This would mean that it's better to measure white level on long exposure/ high temp
-raws but since this if difficult and time consuming we choose to measure on normal
-raws and cover the abnormalities with the conservative WL values.
- A more detailed approach when we only have non LENR measures is to subtract
-a value according to per ISO read noise.
-We can find data regarding read noise (stdev of gaussian distribution) at
-http://www.photonstophotos.net/Charts/RN_ADU.htm . We find the per ISO tead_noise and
-subtract from the measured value 6*read_noise. This gives confidence that 99.5% of
-the bell is clipped out.
+ The aperture scaling feature is meant to raise the white level to not miss out on highlight detail when the camera has
+ scaled the raw values (and thus raised white levels). Many cameras do this, but not all, and can only do it for lenses
+ that report aperture to the camera (i.e. you see it in the Exif data). Providing proper aperture scaling values is a bit
+ more advanced task, so if you are unsure we recommend to skip that part.
-If you have used Adobe's DNG Converter and analyzed it's output you may have
-noticed that it's very conservative regarding white levels, ie it cuts away
-quite a lot from the top. While we also recommend to be conservative, you can
-generally be a little bit less so than Adobe's DNG Converter. RawTherapee is
-meant to max out what you can get from your camera, and the white levels should
-mirror that, within reason.
+ Beware that the raw format may have a ceiling so that it clips scaled values, for example the Canon 5D mark II maxes out
+ at 16383 which happens at f/1.8 for ISOs with the white level at 15750, but for ISO160 when the white level is 12800 it
+ does not max out. If there is such a raw limit it must also be provided ("ranges":"white_max"). Usually you will not
+ need a margin on white_max as it clips there as a result of an in-camera math operation.
-The aperture scaling feature is meant to raise the white level to not miss out
-on highlight detail when the camera has scaled the raw values (and thus
-raised white levels). Many cameras do this, but not all, and can only do it
-for lenses that report aperture to the camera (ie you see it in the EXIF
-data). Providing proper aperture scaling values is a bit more advanced task,
-so if you are unsure we recommend to skip that part.
+ Note that aperture scaling can be quite small, for the 5D mark II it's only 0.2 stop down to f/1.2 and then it can be
+ discussed if it's worthwhile to care. The "worst" cameras scale about 0.6 stops though, and then it's more valuable to
+ compensate. If you skip aperture scaling RawTherapee will clip the files a little bit too early and you miss that last
+ fraction of highlight detail, but you get no processing problems. Setting un-conservative scale factors can on the other
+ hand cause a too high white level and break highlight processing, so be careful.
-Beware that the raw format may have a ceiling so that it clips scaled values,
-for example the Canon 5D mark II maxes out at 16383 which happens at f/1.8
-for ISOs with the white level at 15750, but for ISO160 when the white level
-is 12800 it does not max out. If there is such a raw limit it must also be
-provided ("ranges":"white_max"). Usually you will not need a margin on
-white_max as it clips there as a result of an in-camera math operation.
+ Scaling can vary slightly depending on ISO (if white levels vary) so make sure to provide conservative scalings so
+ regardless of ISO you don't get a too high white level. We recommend to keep a small margin here also white levels,
+ i.e. 0.5% lower or so. For example if base (not conservative!) white level is 15750 and the scaled is 16221 we have a
+ scaling factor of 16221/15750=1.0299 i.e. +2.9% we set the factor to 1.025 to keep a margin. The abnormal cases are
+ already covered by setting conservative per ISO White levels.
-Note that aperture scaling can be quite small, for the 5D mark II it's only
-0.2 stop down to f/1.2 and then it can be discussed if it's worthwhile to care.
-The "worst" cameras scale about 0.6 stops though, and then it's more
-valuable to compensate. If you skip aperture scaling RawTherapee will clip the
-files a little bit too early and you miss that last fraction of highlight
-detail, but you get no processing problems. Setting unconservative scale
-factors can on the other hand cause a too high whitelevel and break highlight
-processing, so be careful.
+ The scale factor you provide here is applied on the white level before black level subtraction (if any), i.e. directly on
+ the white level value you provide in the camconst.json file. Black level (if provided) is not scaled. Please report to
+ us if you come across a camera which scales black levels, then we can add that as an option. Usually the camera applies
+ an offset to shift back the black level to the standard level after scaling.
-Scaling can vary sligthly depending on ISO (if white levels vary) so make
-sure to provide conservative scalings so regardless of ISO you don't get a
-too high white level. We recommend to keep a small margin here also
-white levels, ie 0.5% lower or so. For example if base (not conservative!)
-white level is 15750 and the scaled is 16221 we have a scaling factor of
-16221/15750=1.0299 ie +2.9% we set the factor to 1.025 to keep a margin.
-The abnormal cases are already covered by setting conservative per ISO White levels.
+ If RawTherapee doesn't find an entry for the aperture used in the image, it will pick the closest above, i.e. if the
+ apertures 1.0 and 2.0 is in the table and the image has aperture 1.2, it will pick scaling for 2.0, even if 1.0 is the
+ closer aperture. The reason for always checking the closest above is that we rather get a bit too low white level than
+ too high, as discussed before.
-The scale factor you provide here is applied on the white level before black
-level subtraction (if any), ie directly on the white level value you provide in
-the camconst.json file. Black level (if provided) is not scaled. Please report
-to us if you come across a camera which scales black levels, then we can add
-that as an option. Usually the camera applies an offset to shift back the
-black level to the standard level after scaling.
+ Some cameras have different white levels on different color channels. When this is the case the difference is often so
+ small so you can just provide a single value instead, i.e. a conservative value based on the lowest clipping.
-If RawTherapee doesn't find an entry for the aperture used in the image, it
-will pick the closest above. Ie if the apertures 1.0 and 2.0 is in the table
-and the image has aperture 1.2, it will pick scaling for 2.0, even if 1.0 is
-the closer aperture. The reason for always checking the closest above is that
-we rather get a bit too low white level than too high, as discussed before.
+ What we know at the time of writing about different brands/models (not complete info):
+ - Canon CR2: typically same clipping per channel, but significant variations on ISO and aperture. Maxes out at 16383,
+ black level measured on masked black pixels, i.e. don't provide that.
+ - Nikon NEF: sometimes different clipping per color (most often negligible though). Will do aperture and ISO scaling,
+ but often to a lesser extent than Canon files, i.e. not as much to gain.
+ - Sony ARW2: no scaling. Generally black level around 512, and white level 16350 and to be conservative say 16300.
-Some cameras have different white levels on different color channels. When
-this is the case the difference is often so small so you can just provide a
-single value instead, ie a conservative value based on the lowest clipping.
+ Note that some raw formats may go through a certain amount of pre-processing based on meta data, such as curve and
+ levels adjustments and various calibrations. The Phase One IIQ is one example, and this means that if you look at the
+ data in a raw analyzer such as RawDigger it may perform a different type of preprocessing than RawTherapee's loader
+ does, and you may end up providing incompatible black/white levels.
-What we know at the time of writing about different brands/models (not
-complete info):
+ You can use RawTherapee for analysis too, it's safer as you are using it's own raw decoder but it's not as
+ user-friendly: enable verbose mode in options so you get output on the console. When you load a file you will see a
+ message of current black and white levels and if they came from dcraw or camconst.json. If you're adjusting an existing
+ camconst.json value you can just read what it is in the file and not need to enable verbose output.
- - Canon CR2: typically same clipping per channel, but significant variations
- on ISO and aperture. Maxes out at 16383, black level measured on masked
- black pixels, ie don't provide that.
- - Nikon NEF: sometimes different clipping per color (most often negligible
- though). Will do aperture and ISO scaling, but often to a lesser extent
- than Canon files, ie not as much to gain.
- - Sony ARW2: no scaling. Generally black level around 512, and white level
- 16350 and to be conservative say 16300.
+ Reset exposure sliders to neutral, and zoom in on a large clipped highlight. Move around the mouse pointer within, it
+ should show stable 100% on R G B. If so, the white level is not too high, it could however be too low. To test that, go
+ to the raw tab and adjust the "white point linear correction factor", reduce it until one of the channels is no longer
+ 100%, and then increase in steps of 0.01 until all are 100 again. Usually you play around in the range 0.90 to 0.99, i.e.
+ a very small adjustment. When you've found this factor you should apply it on the old white level to find a new larger
+ one. As RT's "white point linear correction factor" work after black level subtraction and camconst.json want values
+ without it we need to do some math:
-Note that some raw formats may go through a certain amount of pre-processing
-based on meta data, such as curve and levels adjustments and various
-calibrations. The Phase One IIQ is one example, and this means that if you
-look at the data in a raw analyzer such as RawDigger it may perform a
-different type of preprocessing than RawTherapee's loader does, and you may
-end up providing incompatible black/white levels.
+ BL = black level (typically something near 0, 256, 512, 1024 or 2048 find it in the verbose output or if available in
+ camconst.json)
+ F = white point linear correction factor you just found out (typically in the range 0.90 to 0.99 if you need to
+ increase white level, 1.01 to 1.10 if decrease)
+ oldWL = old white level, found in verbose output or in camconst.json if available.
+ newWL = BL + (oldWL - BL) / F
-You can use RawTherapee for analysis too, it's safer as you are using it's
-own raw decoder but it's not as user-friendly: enable verbose mode in options
-so you get output on the console. When you load a file you will see a message
-of current black and white levels and if they came from dcraw or camconst.json.
-If you're adjusting an existing camconst.json value you can just read what it is in
-the file and not need to enable verbose output.
+ Note that if black level is 0 which it is for many cameras, the formula simplifies to: new white level = oldWL / F.
-Reset exposure sliders to neutral, and zoom in on a large clipped highlight.
-Move around the mouse pointer within, it should show stable 100% on R G B. If
-so, the white level is not too high, it could however be too low. To test that,
-go to the raw tab and adjust the "whitepoint linear correction factor", reduce
-it until one of the channels is no longer 100%, and then increase in steps of
-0.01 until all are 100 again. Usually you play around in the range 0.90 to
-0.99, ie a very small adjustment. When you've found this factor you should
-apply it on the old white level to find a new larger one. As RT's "whitepoint
-linear correction factor" work after blacklevel subtraction and camconst.json
-want values without it we need to do some math:
+ Here's an example from a Canon 1000D: black level is 256, old white level is 3651, white point correction factor becomes
+ 0.90, then new white level is 256 + (3651 - 256) / 0.9 = 4028.
-BL = black level (typically something near 0, 256, 512, 1024 or 2048 find it in the
- verbose output or if available in camconst.json)
-F = whitepoint linear correction factor you just found out (typically in the
- range 0.90 to 0.99 if you need to increase white level, 1.01 to 1.10 if
- decrease)
-oldWL = old white level, found in verbose output or in camconst.json if
- available.
+ If your camera have different black levels per channel use the one which yields the smallest white level (can be the
+ largest or smallest, test!).
-new white level = BL + (oldWL - BL) / F
+ This new white level you then enter in your camconst.json file. The same procedure can be used if the white level is too
+ high, i.e. if you see pink highlights, then increase the correction factor above 1.0 until you just start seeing stable
+ 100% on all channels, you use the same formula to calculate the new smaller white level.
-Note that if black level is 0 which it is for many cameras, the formula
-simplifies to: new white level = oldWL / F.
-
-Here's an example from a Canon 1000D: black level is 256, old white level is
-3651, whitepoint correction factor becomes 0.90, then new white level is
-256 + (3651 - 256) / 0.9 = 4028.
-
-If your camera have different black levels per channel use the one which
-yields the smallest white level (can be the largest or smallest, test!).
-
-This new white level you then enter in your camconst.json file. The same
-procedure can be used if the white level is too high, ie if you see pink
-highlights, then increase the correction factor above 1.0 until you just start
-seeing stable 100% on all channels, you use the same formula to calculate the
-new smaller white level.
About black levels:
-------------------
-Unlike for white levels it's much more common that black levels can be
-derived from the format. Either it's simply 0 (typical for old Nikon cameras,
-newer Nikons (year2013-14) have a BL at around 150 12-bit or 600/768 14-bit ),
-or it can be derived from masked pixels (typical for Canon cameras) or otherwise
-be extracted from some tag.
-Some formats have built-in subtraction information and are pre-processed by DCRaw
-to end up at a black level of zero(Phase One's IIQ).
-For Panasonic raws beginning from Dcraw v9.21 Dcraw/RT reads base BL from exif data
-(tags 0x001c BlackLevelRed, 0x001d BlackLevelGreen, 0x001e BlackLevelBlue)and we
-define in "ranges": { "black": the needed offset of around 15. The (total) BL RT displays is base+offset
-In all, you typically should not care about the black level in camconst.json,
-any information that can be derived from the raw file itself should not be specified in camconst.json!
-Sony's ARW2 is one of the few exceptions (with single black level around 512, or 800 for RX10/100 models),
-but DCraw generally has good constants for these already.
+ Unlike for white levels it's much more common that black levels can be derived from the format. Either it's simply
+ 0 (typical for old Nikon cameras, newer Nikons (year 2013-14) have a BL at around 150 12-bit or 600/768 14-bit ), or it
+ can be derived from masked pixels (typical for Canon cameras) or otherwise be extracted from some tag.
-Currently we have chosen not to provide any guide how to measure black levels
-as we don't think it will be a common task (it's also more difficult to do
-than measure white levels). If you experience a black level issue it's more
-likely due to a format parsing bug which should be fixed in DCRaw and/or
-RawTherapee's raw format parser.
+ Some formats have built-in subtraction information and are pre-processed by dcraw to end up at a black level of
+ zero (Phase One's IIQ). For Panasonic raws beginning from dcraw v9.21 dcraw/RT reads base BL from Exif data (tags 0x001c
+ BlackLevelRed, 0x001d BlackLevelGreen, 0x001e BlackLevelBlue) and we define in "ranges": { "black": the needed offset
+ of around 15. The (total) BL RT displays is base+offset In all, you typically should not care about the black
+ level in camconst.json, any information that can be derived from the raw file itself should not be specified in
+ camconst.json! Sony's ARW2 is one of the few exceptions (with single black level around 512, or 800 for
+ RX10/100 models), but dcraw generally has good constants for these already.
-How does a black level issue look? If the image has a color cast and is
-possibly duller than normal it's likely that black levels are off. The color
-cast is typically stronger in darker colors but it can be hard to see, it's
-more often experienced as a cast over the whole image.
+ Currently we have chosen not to provide any guide how to measure black levels as we don't think it will be a common task
+ (it's also more difficult to do than measure white levels). If you experience a black level issue it's more likely due
+ to a format parsing bug which should be fixed in dcraw and/or RawTherapee's raw format parser.
+
+ How does a black level issue look? If the image has a color cast and is possibly duller than normal it's likely that
+ black levels are off. The color cast is typically stronger in darker colors but it can be hard to see, it's more often
+ experienced as a cast over the whole image.
+
+
+Camera constants:
+-----------------
+
+ When adding camera constants please set a quality level so we know the status for future updates
+
+ Quality A: complete information, no need to add more, to the best of our knowledge
+ Quality B: not complete, but very little to gain from adding more
+ Quality C: complementing with additional information would provide significant gain
+ Quality X: unknown, i.e. we know too little about the camera properties to know if we have enough info.
*/
+
{"camera_constants": [
-/*
-
-When adding camera constants please set a quality level so we know the status for future updates
-
-Quality A: complete information, no need to add more, to the best of our knowledge
-Quality B: not complete, but very little to gain from adding more
-Quality C: complementing with additional information would provide significant gain
-Quality X: unknown, ie we knowing to little about the camera properties to know if
- we have enough info or not.
-
-*/
-
- { // quality A
+ { // Quality A
"make_model": "Canon EOS 5D Mark II",
"dcraw_matrix": [ 4716,603,-830,-7798,15474,2480,-1496,1937,6651 ],
"ranges": {
// black levels are read from raw masked pixels
- // white levels are same for all colors, but vary on ISO
+ // white levels are same for all colors, but vary on ISO
"white": [
{ "iso": 50, "levels": 15600 }, // typical: 15760
{ "iso": 100, "levels": 15600 },
@@ -416,98 +333,99 @@ Quality X: unknown, ie we knowing to little about the camera properties to know
{ "iso": 12800, "levels": 16200 },
{ "iso": 25600, "levels": 16200 }
],
- "white_max": 16383,
+ "white_max": 16383,
"aperture_scaling": [
- /* note: no scale factors known for and f/1.0 (had no lenses to test with), but the
- typical 15700 white level maxes out at "white_max" for f/1.8 and below anyway. */
- { "aperture": 1.2, "scale_factor": 1.100 }, // guessed by relative 5DIII data
- { "aperture": 1.4, "scale_factor": 1.077 },
- { "aperture": 1.6, "scale_factor": 1.054 },
- { "aperture": 1.8, "scale_factor": 1.039 },
- { "aperture": 2.0, "scale_factor": 1.031 },
- { "aperture": 2.2, "scale_factor": 1.021 },
- { "aperture": 2.5, "scale_factor": 1.016 },
- { "aperture": 2.8, "scale_factor": 1.010 },
- { "aperture": 3.2, "scale_factor": 1.004 },
- { "aperture": 3.5, "scale_factor": 1.003 }
+ // no scale factors known for and f/1.0 (had no lenses to test with), but the typical 15700 white level
+ // maxes out at "white_max" for f/1.8 and below anyway.
+ { "aperture": 1.2, "scale_factor": 1.100 }, // guessed by relative 5DIII data
+ { "aperture": 1.4, "scale_factor": 1.077 },
+ { "aperture": 1.6, "scale_factor": 1.054 },
+ { "aperture": 1.8, "scale_factor": 1.039 },
+ { "aperture": 2.0, "scale_factor": 1.031 },
+ { "aperture": 2.2, "scale_factor": 1.021 },
+ { "aperture": 2.5, "scale_factor": 1.016 },
+ { "aperture": 2.8, "scale_factor": 1.010 },
+ { "aperture": 3.2, "scale_factor": 1.004 },
+ { "aperture": 3.5, "scale_factor": 1.003 }
]
}
},
- { // quality C, INTERMEDIATE ISO SAMPLES MISSING
+
+ { // Quality C, INTERMEDIATE ISO SAMPLES MISSING
"make_model": "Canon EOS-1D X Mark II",
"dcraw_matrix": [ 7596,-978,-967,-4808,12571,2503,-1398,2567,5752 ],
- // "raw_crop": [ 192, 96, 8696, 5800 ], // Full sensor 5568x3708 top38, left72, official crop left84, top50, right5555, bottom3697, 5472X3648
- // "masked_areas": [ 50, 4, 3697, 68 ], // left out 4 first columns from calculations because possibly the BL is still imbalanced there
- "ranges": {
- // black levels are read from raw masked pixels
- // white levels are same for all colors all ISOs, but safety margin vary on ISO
- "white": [
+ //"raw_crop": [ 192, 96, 8696, 5800 ], // Full sensor 5568x3708 top38, left72, official crop left84, top50, right5555, bottom3697, 5472X3648
+ //"masked_areas": [ 50, 4, 3697, 68 ], // left out 4 first columns from calculations because possibly the BL is still imbalanced there
+ "ranges": {
+ // black levels are read from raw masked pixels
+ // white levels are same for all colors all ISOs, but safety margin vary on ISO
+ "white": [
{ "iso": 50, "levels": 16350 }, // typical for all ISOs: 16383, stdev 2.25
{ "iso": 100, "levels": 16350 }, // stdev 2.25
{ "iso": [ 125, 160, 200, 250 ], "levels": 16340 }, // stdev 2.5
{ "iso": [ 320, 400, 500 ], "levels": 16330 }, // stdev 2.95
- { "iso": [ 640, 800, 1000 ], "levels": 16320 },// stdev x, 4.0 , x
- { "iso": [ 1250, 1600, 2000 ], "levels": 16300 },// stdev x, 6.0 , x
+ { "iso": [ 640, 800, 1000 ], "levels": 16320 }, // stdev x, 4.0 , x
+ { "iso": [ 1250, 1600, 2000 ], "levels": 16300 }, // stdev x, 6.0 , x
{ "iso": [ 2500, 3200, 4000 ], "levels": 16250 }, // STDEV x, 9.8 , x
{ "iso": [ 5000, 6400, 8000 ], "levels": 16150 }, // stdev x, 17, x
- { "iso": [ 10000, 12800, 16000 ], "levels": 16100 },// stdev x, 34 , x
- { "iso": [ 20000, 25600, 32000 ], "levels": 16000 },// stdev x, 68 , x
- { "iso": [ 40000, 51200, 64000 ], "levels": 15700 },// stdev x, 125, x
- { "iso": [ 80000, 102400 ], "levels": 15100 },// stdev x, 245
+ { "iso": [ 10000, 12800, 16000 ], "levels": 16100 }, // stdev x, 34 , x
+ { "iso": [ 20000, 25600, 32000 ], "levels": 16000 }, // stdev x, 68 , x
+ { "iso": [ 40000, 51200, 64000 ], "levels": 15700 }, // stdev x, 125, x
+ { "iso": [ 80000, 102400 ], "levels": 15100 }, // stdev x, 245
{ "iso": [ 204800 ], "levels": 14000 },
{ "iso": [ 409600 ], "levels": 13000 }
- ],
- "white_max": 16383,
+ ],
+ "white_max": 16383,
"aperture_scaling": [
- /* no need for aperture scaling because typical WL is 16383 at all ISOs .. */
- { "aperture": 1.2, "scale_factor": 1.130 }, // guessed by relative 6D data
- { "aperture": 1.4, "scale_factor": 1.090 },
- { "aperture": 1.6, "scale_factor": 1.060 },
- { "aperture": 1.8, "scale_factor": 1.040 },
- { "aperture": 2.0, "scale_factor": 1.030 },
- { "aperture": 2.2, "scale_factor": 1.020 },
- { "aperture": 2.5, "scale_factor": 1.015 },
- { "aperture": 2.8, "scale_factor": 1.010 },
- { "aperture": 3.2, "scale_factor": 1.005 },
- { "aperture": 3.5, "scale_factor": 1.003 }
+ // no need for aperture scaling because typical WL is 16383 at all ISOs
+ { "aperture": 1.2, "scale_factor": 1.130 }, // guessed by relative 6D data
+ { "aperture": 1.4, "scale_factor": 1.090 },
+ { "aperture": 1.6, "scale_factor": 1.060 },
+ { "aperture": 1.8, "scale_factor": 1.040 },
+ { "aperture": 2.0, "scale_factor": 1.030 },
+ { "aperture": 2.2, "scale_factor": 1.020 },
+ { "aperture": 2.5, "scale_factor": 1.015 },
+ { "aperture": 2.8, "scale_factor": 1.010 },
+ { "aperture": 3.2, "scale_factor": 1.005 },
+ { "aperture": 3.5, "scale_factor": 1.003 }
]
}
},
- { // quality A,
+
+ { // Quality A
"make_model": "Canon EOS 5D Mark III",
"dcraw_matrix": [ 6722,-635,-963,-4287,12460,2028,-908,2162,5668 ],
"ranges": {
// black levels are read from raw masked pixels
- // white levels are same for all colors, but vary on ISO
+ // white levels are same for all colors, but vary on ISO
"white": [
{ "iso": [ 50, 100, 125, 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000, 6400, 8000, 12800, 16000, 20000 ], "levels": 15180 }, // typical: 15282
{ "iso": [ 160, 320, 640, 1250, 2500, 5000, 10000 ], "levels": 13200 }, // typical: 13306
{ "iso": [ 25600, 32000, 40000, 51200, 102400 ], "levels": 16200 }
],
- "white_max": 16383,
+ "white_max": 16383,
"aperture_scaling": [
- { "aperture": 1.2, "scale_factor": 1.130 },
- { "aperture": 1.4, "scale_factor": 1.090 },
- { "aperture": 1.6, "scale_factor": 1.065 },
- { "aperture": 1.8, "scale_factor": 1.040 },
- { "aperture": 2.0, "scale_factor": 1.025 },
- { "aperture": 2.2, "scale_factor": 1.020 },
- { "aperture": 2.5, "scale_factor": 1.015 },
- { "aperture": 2.8, "scale_factor": 1.010 },
- { "aperture": 3.2, "scale_factor": 1.005 },
- { "aperture": 3.5, "scale_factor": 1.002 }
- ]
- }
+ { "aperture": 1.2, "scale_factor": 1.130 },
+ { "aperture": 1.4, "scale_factor": 1.090 },
+ { "aperture": 1.6, "scale_factor": 1.065 },
+ { "aperture": 1.8, "scale_factor": 1.040 },
+ { "aperture": 2.0, "scale_factor": 1.025 },
+ { "aperture": 2.2, "scale_factor": 1.020 },
+ { "aperture": 2.5, "scale_factor": 1.015 },
+ { "aperture": 2.8, "scale_factor": 1.010 },
+ { "aperture": 3.2, "scale_factor": 1.005 },
+ { "aperture": 3.5, "scale_factor": 1.002 }
+ ]
+ }
},
- { // Quality B, some intermediate ISO samples missing, LENR samples missing
- // so White Levels not properly indicated, some aperture scaling missing
+ { // Quality B, some intermediate ISO samples missing, LENR samples missing so White Levels not properly indicated, some aperture scaling missing
"make_model": "Canon EOS 5D Mark IV",
"dcraw_matrix": [ 6446,-366,-864,-4436,12204,2513,-952,2496,6348 ], // DNG_V9.7 D65
"raw_crop": [ 136, 42, 6740, 4500 ], // full size 6880x4544, official crop 148,54,6867,4533
"masked_areas": [ 54, 4, 4534, 132 ],
"ranges": {
- "white": [
+ "white": [
{ "iso": [ 100, 125, 200, 250 ], "levels": 16100 }, // nominal 16383, LENR?
{ "iso": [ 160 ], "levels": 13000 }, // nominal f8-13105
{ "iso": [ 320, 640, 1250, 2500 ], "levels": 13300 }, // G1,G2 F4.0-13422-F2.8-13562-13616
@@ -515,57 +433,56 @@ Quality X: unknown, ie we knowing to little about the camera properties to know
{ "iso": [ 400, 500, 800, 1000, 1600, 2000, 3200, 4000 ], "levels": 16100 }, // nominal 16383,
{ "iso": [ 6400, 8000, 12800, 16000, 25600, 32000 ], "levels": 16000 }, // R,G1,G2 16383, LENR?
{ "iso": [ 40000, 51200, 102400 ], "levels": 15800 } // 16383, LENR?
- ],
- "white_max": 16383,
+ ],
+ "white_max": 16383,
"aperture_scaling": [
- /* note: need for more data to properly fill all scale factors */
- { "aperture": 1.4, "scale_factor": 1.130 }, //
- { "aperture": 1.6, "scale_factor": 1.100 }, //
- { "aperture": 1.8, "scale_factor": 1.070 }, //
- { "aperture": 2.0, "scale_factor": 1.050 }, // 14171/13422=1.055
- { "aperture": 2.2, "scale_factor": 1.035 }, // 13954/13422=1.039
- { "aperture": 2.5, "scale_factor": 1.025 }, // 11400/11000=1.028
- { "aperture": 2.8, "scale_factor": 1.015 }, // 13562/13422 - 13731,13688,13562
- { "aperture": 3.2, "scale_factor": 1.010 }, //
- { "aperture": 3.5, "scale_factor": 1.005 } // 13508/13422
- ]
- }
+ /* need more data to properly fill all scale factors */
+ { "aperture": 1.4, "scale_factor": 1.160 }, // guessed
+ { "aperture": 1.6, "scale_factor": 1.120 }, // guessed
+ { "aperture": 1.8, "scale_factor": 1.080 }, // guessed
+ { "aperture": 2.0, "scale_factor": 1.050 }, // 14171/13422=1.055
+ { "aperture": 2.2, "scale_factor": 1.035 }, // 13954/13422=1.039
+ { "aperture": 2.5, "scale_factor": 1.025 }, // 11400/11000=1.028
+ { "aperture": 2.8, "scale_factor": 1.015 }, // 13562/13422 - 13731,13688,13562
+ { "aperture": 3.2, "scale_factor": 1.010 }, //
+ { "aperture": 3.5, "scale_factor": 1.005 } // 13508/13422
+ ]
+ }
},
{ // Quality C, intermediate ISO samples missing but safely guessed, aperture scaling measures missing
"make_model": [ "Canon EOS 5DS R", "Canon EOS 5DS" ],
- // "dcraw_matrix": [ 6848,-1661,-221,-3904,10931,3434,-470,1251,6039 ], // DNG_V9.0 A
+ //"dcraw_matrix": [ 6848,-1661,-221,-3904,10931,3434,-470,1251,6039 ], // DNG_V9.0 A
"dcraw_matrix": [ 6250,-711,-808,-5153,12794,2636,-1249,2198,5610 ], // DNG_V9.0 D65
"raw_crop": [ 192, 96, 8696, 5800 ], // 800, 300, 7500, 4700 - 160,64,8730x5800 - sensor 8896x5920 top64, left160, official crop left196, top100, right 8883, bottom 5891, 8688X5792
"masked_areas": [ 100, 40, 5892, 158 ], // left out 40 first columns from calculations because possibly the BL is still imbalanced there
"ranges": {
- "white": [
- { "iso": [ 50, 100 ], "levels": 14650 }, // typical 14733
- { "iso": [ 160, 320, 640, 1250, 2500, 5000 ], "levels": 15280 }, // typical 15383
- { "iso": [ 125, 200, 250, 400, 500, 800, 1000, 1600, 2000 ], "levels": 15280 }, // typical R15330-GB15383
- { "iso": [ 3200, 4000, 6400, 8000, 10000, 12800, 16000, 20000, 25600 ], "levels": 15100 } // clippings at R 15200-15300, G1,G2,B 15360-15390
- ],
- "white_max": 16383,
+ "white": [
+ { "iso": [ 50, 100 ], "levels": 14650 }, // typical 14733
+ { "iso": [ 160, 320, 640, 1250, 2500, 5000 ], "levels": 15280 }, // typical 15383
+ { "iso": [ 125, 200, 250, 400, 500, 800, 1000, 1600, 2000 ], "levels": 15280 }, // typical R15330-GB15383
+ { "iso": [ 3200, 4000, 6400, 8000, 10000, 12800, 16000, 20000, 25600 ], "levels": 15100 } // clippings at R 15200-15300, G1,G2,B 15360-15390
+ ],
+ "white_max": 16383,
"aperture_scaling": [
- /* note: */
- { "aperture": 1.4, "scale_factor": 1.150 }, // 37/32 6-0-6-0-7-0-6-0-7-0
- { "aperture": 1.6, "scale_factor": 1.070 }, // guessed
- { "aperture": 1.8, "scale_factor": 1.040 }, // 15501/14733=1.0521, 15352/14733=1.042 16030/15390
- { "aperture": 2.0, "scale_factor": 1.025 }, // 15129/14733=1.0268 - 15800/15383=1.027
- { "aperture": 2.2, "scale_factor": 1.013 }, // 15591/15383, 14931/14733
- { "aperture": 2.5, "scale_factor": 1.008 }, // 14857/14733guessed
- { "aperture": 2.8, "scale_factor": 1.003 }, // 14783/14733 15435/15383
- { "aperture": 3.2, "scale_factor": 1.001 }, // 15409/15383
- { "aperture": 3.5, "scale_factor": 1.000 } // 14733/14733
- ]
- }
+ { "aperture": 1.4, "scale_factor": 1.150 }, // 37/32 6-0-6-0-7-0-6-0-7-0
+ { "aperture": 1.6, "scale_factor": 1.070 }, // guessed
+ { "aperture": 1.8, "scale_factor": 1.040 }, // 15501/14733=1.0521, 15352/14733=1.042 16030/15390
+ { "aperture": 2.0, "scale_factor": 1.025 }, // 15129/14733=1.0268 - 15800/15383=1.027
+ { "aperture": 2.2, "scale_factor": 1.013 }, // 15591/15383, 14931/14733
+ { "aperture": 2.5, "scale_factor": 1.008 }, // 14857/14733guessed
+ { "aperture": 2.8, "scale_factor": 1.003 }, // 14783/14733 15435/15383
+ { "aperture": 3.2, "scale_factor": 1.001 }, // 15409/15383
+ { "aperture": 3.5, "scale_factor": 1.000 } // 14733/14733
+ ]
+ }
},
{ // Quality A, some missing scaling factors are safely guessed - samples by sfink16 & RawConvert at RT forums
"make_model": "Canon EOS 6D",
"dcraw_matrix": [ 7034,-804,-1014,-4420,12564,2058,-851,1994,5758 ],
"ranges": {
- "white": [
+ "white": [
{ "iso": [ 50, 100, 125, 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200 ], "levels": 15180 }, // typical 15283
{ "iso": [ 4000, 6400, 8000, 12800 ], "levels": 15100 }, // typical 15283
{ "iso": [ 16000, 25600 ], "levels": 14900 }, // typical 15283
@@ -573,77 +490,78 @@ Quality X: unknown, ie we knowing to little about the camera properties to know
{ "iso": [ 5000, 10000 ], "levels": 13000 }, // typical 13225
{ "iso": [ 20000 ], "levels": 12800 }, // typical 13225
{ "iso": [ 51200, 102400 ], "levels": 15900 } // typical 16383
- ],
- "white_max": 16383,
+ ],
+ "white_max": 16383,
"aperture_scaling": [
- /* note: no scale factors known for f/1.0 (had no lenses to test with), but the
- ISO 160-320... 12650 white levels maxes out at "white_max" for f/1.2 and below anyway. */
- { "aperture": 1.2, "scale_factor": 1.130 }, // from histogramm 1 gap in every 7 levels
- { "aperture": 1.4, "scale_factor": 1.090 }, // histogram 3 gaps in every 32 levels
- { "aperture": 1.6, "scale_factor": 1.060 }, // 16213/15283
- { "aperture": 1.8, "scale_factor": 1.040 }, // 16004/15283
- { "aperture": 2.0, "scale_factor": 1.030 }, // 15800/15283
- { "aperture": 2.2, "scale_factor": 1.020 }, // guessed
- { "aperture": 2.5, "scale_factor": 1.015 }, // 15541/15283
- { "aperture": 2.8, "scale_factor": 1.010 }, // 15437/15283
- { "aperture": 3.2, "scale_factor": 1.005 }, // 15361/15283
- { "aperture": 3.5, "scale_factor": 1.000 } // no sample
+ // no scale factors known for f/1.0 (had no lenses to test with), but the
+ // ISO 160-320... 12650 white levels maxes out at "white_max" for f/1.2 and below anyway.
+ { "aperture": 1.2, "scale_factor": 1.130 }, // from histogramm 1 gap in every 7 levels
+ { "aperture": 1.4, "scale_factor": 1.090 }, // histogram 3 gaps in every 32 levels
+ { "aperture": 1.6, "scale_factor": 1.060 }, // 16213/15283
+ { "aperture": 1.8, "scale_factor": 1.040 }, // 16004/15283
+ { "aperture": 2.0, "scale_factor": 1.030 }, // 15800/15283
+ { "aperture": 2.2, "scale_factor": 1.020 }, // guessed
+ { "aperture": 2.5, "scale_factor": 1.015 }, // 15541/15283
+ { "aperture": 2.8, "scale_factor": 1.010 }, // 15437/15283
+ { "aperture": 3.2, "scale_factor": 1.005 }, // 15361/15283
+ { "aperture": 3.5, "scale_factor": 1.000 } // no sample
]
}
},
+
{ // Quality A, ISO and aperture WL data by CharlyW at RawTherapee forums, missing samples safely guessed
"make_model": "Canon EOS 7D",
"dcraw_matrix": [ 5962,-171,-732,-4189,12307,2099,-911,1981,6304 ], // Colin Walker
- // "dcraw_matrix": [ 6844,-996,-856,-3876,11761,2396,-593,1772,6198 ], // dcraw
+ //"dcraw_matrix": [ 6844,-996,-856,-3876,11761,2396,-593,1772,6198 ], // dcraw
"ranges": {
- "white": [
+ "white": [
{ "iso": [ 100, 125 ], "levels": 13480 }, // typical 13584
{ "iso": [ 160, 320, 640, 1250, 2500 ], "levels": 12550 }, // typical 12650
{ "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000, 5000, 6400, 12800 ], "levels": 15200 } // typical 15304
- ],
- "white_max": 16383,
+ ],
+ "white_max": 16383,
"aperture_scaling": [
- /* note: no scale factors known for f/1.2 and f/1.0 (no lenses to test with), but the
- typical 12650 white levels maxes out at "white_max" for f/1.4 and below anyway. */
- { "aperture": 1.4, "scale_factor": 1.250 }, // guessed
- { "aperture": 1.6, "scale_factor": 1.150 }, // guessed
- { "aperture": 1.8, "scale_factor": 1.110 }, // 15196/13584
- { "aperture": 2.0, "scale_factor": 1.080 }, // 14734/13584
- { "aperture": 2.2, "scale_factor": 1.050 }, // 14386/13584
- { "aperture": 2.5, "scale_factor": 1.040 }, // 14272/13584
- { "aperture": 2.8, "scale_factor": 1.030 }, // 14042/13584
- { "aperture": 3.2, "scale_factor": 1.015 }, // guessed
- { "aperture": 3.5, "scale_factor": 1.000 } // guessed negligible
- ]
- }
+ // no scale factors known for f/1.2 and f/1.0 (no lenses to test with), but the
+ // typical 12650 white levels maxes out at "white_max" for f/1.4 and below anyway.
+ { "aperture": 1.4, "scale_factor": 1.250 }, // guessed
+ { "aperture": 1.6, "scale_factor": 1.150 }, // guessed
+ { "aperture": 1.8, "scale_factor": 1.110 }, // 15196/13584
+ { "aperture": 2.0, "scale_factor": 1.080 }, // 14734/13584
+ { "aperture": 2.2, "scale_factor": 1.050 }, // 14386/13584
+ { "aperture": 2.5, "scale_factor": 1.040 }, // 14272/13584
+ { "aperture": 2.8, "scale_factor": 1.030 }, // 14042/13584
+ { "aperture": 3.2, "scale_factor": 1.015 }, // guessed
+ { "aperture": 3.5, "scale_factor": 1.000 } // guessed negligible
+ ]
+ }
},
{ // Quality A, f/1.6 aperture scale factor missing but safely guessed, ISO and aperture data by charlyw at RT forums
"make_model": "Canon EOS 7D Mark II",
"dcraw_matrix": [ 7268,-1082,-969,-4186,11839,2663,-825,2029,5839 ], // dng_v8.7 d65
- // "dcraw_matrix": [ 6285,-147,-821,-4080,11695,2714,-1045,2459,5497 ], // DXO D50
+ //"dcraw_matrix": [ 6285,-147,-821,-4080,11695,2714,-1045,2459,5497 ], // DXO D50
"ranges": {
- "white": [
- { "iso": [ 100, 125 ], "levels": 13500 }, // typical 13583 - LENR 13550
- { "iso": [ 160, 320, 640, 1250, 2500, 5000 ], "levels": 12500 }, // typical 12559
- { "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000 ], "levels": 15200 }, // typical 15303 - LENR 15270,15260,15240,15220,
- { "iso": [ 6400, 8000, 10000, 12800, 16000, 20000, 25600 ], "levels": 15100 }, // typical G1,G2 15303, R,B = 15430 LENR 15200 .. 15100
- { "iso": 51200, "levels": 16300 } // typical 16383 red 16371
- ],
- "white_max": 16383,
+ "white": [
+ { "iso": [ 100, 125 ], "levels": 13500 }, // typical 13583 - LENR 13550
+ { "iso": [ 160, 320, 640, 1250, 2500, 5000 ], "levels": 12500 }, // typical 12559
+ { "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000 ], "levels": 15200 }, // typical 15303 - LENR 15270,15260,15240,15220,
+ { "iso": [ 6400, 8000, 10000, 12800, 16000, 20000, 25600 ], "levels": 15100 }, // typical G1,G2 15303, R,B = 15430 LENR 15200 .. 15100
+ { "iso": 51200, "levels": 16300 } // typical 16383 red 16371
+ ],
+ "white_max": 16383,
"aperture_scaling": [
- /* note: no scale factors known for f/1.6, f/1.0 (had no lenses to test with) */
- { "aperture": 1.4, "scale_factor": 1.200 }, // 15100/12277 exif
- { "aperture": 1.6, "scale_factor": 1.100 }, // guessed
- { "aperture": 1.8, "scale_factor": 1.050 }, // 14372/13583 - 13283
- { "aperture": 2.0, "scale_factor": 1.030 }, // 14034/13583 - 12973
- { "aperture": 2.2, "scale_factor": 1.015 }, // 13808/13583 - 12766
- { "aperture": 2.5, "scale_factor": 1.007 }, // 13696/13583 - 12662
- { "aperture": 2.8, "scale_factor": 1.007 }, // 13696/13583 - 12663
- { "aperture": 3.2, "scale_factor": 1.000 }, // 13583/13583 - 12559
- { "aperture": 3.5, "scale_factor": 1.000 }
- ]
- }
+ /* no scale factors known for f/1.6, f/1.0 (had no lenses to test with) */
+ { "aperture": 1.4, "scale_factor": 1.200 }, // 15100/12277 Exif
+ { "aperture": 1.6, "scale_factor": 1.100 }, // guessed
+ { "aperture": 1.8, "scale_factor": 1.050 }, // 14372/13583 - 13283
+ { "aperture": 2.0, "scale_factor": 1.030 }, // 14034/13583 - 12973
+ { "aperture": 2.2, "scale_factor": 1.015 }, // 13808/13583 - 12766
+ { "aperture": 2.5, "scale_factor": 1.007 }, // 13696/13583 - 12662
+ { "aperture": 2.8, "scale_factor": 1.007 }, // 13696/13583 - 12663
+ { "aperture": 3.2, "scale_factor": 1.000 }, // 13583/13583 - 12559
+ { "aperture": 3.5, "scale_factor": 1.000 }
+ ]
+ }
},
{ // Quality A - ISO and aperture WL data by Ilias at Avclub gr forums
@@ -652,7 +570,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know
"raw_crop": [ 30, 18, 3908, 2602 ],
"masked_areas": [ 20, 2, 2616, 20 ],
"ranges": {
- "white": [
+ "white": [
{ "iso": 100, "levels": 13700 }, // typical 13825
{ "iso": [ 125, 250, 500, 1000, 3200 ], "levels": 16280 }, // typical 16383
{ "iso": [ 160, 320, 640 ], "levels": 12600 }, // typical 12744
@@ -660,118 +578,122 @@ Quality X: unknown, ie we knowing to little about the camera properties to know
{ "iso": 800, "levels": 15900 }, // gaussian histogram 15900-16224
{ "iso": 1600, "levels": 14900 }, // gaussian histogram 14900-15750
{ "iso": 1250, "levels": 11900 } // gaussian histogram 11900-12500
- ],
- "white_max": 16383,
+ ],
+ "white_max": 16383,
"aperture_scaling": [
- /* note: no scale factors known for f/1.2 and f/1.0 (had no lenses to test with), but the
- typical 12700 white levels maxes out at "white_max" for f/1.4 and below anyway. */
- { "aperture": 1.4, "scale_factor": 1.265 }, // 16142/12744
- { "aperture": 1.6, "scale_factor": 1.145 }, // 15872/13825
- { "aperture": 1.8, "scale_factor": 1.090 }, // 15103/13825
- { "aperture": 2.0, "scale_factor": 1.035 }, // 14334/13825
- { "aperture": 2.2, "scale_factor": 1.005 }, // 13950/13825
- { "aperture": 2.5, "scale_factor": 1.000 } // 13825/13825
+ // no scale factors known for f/1.2 and f/1.0 (had no lenses to test with), but the
+ // typical 12700 white levels maxes out at "white_max" for f/1.4 and below anyway.
+ { "aperture": 1.4, "scale_factor": 1.265 }, // 16142/12744
+ { "aperture": 1.6, "scale_factor": 1.145 }, // 15872/13825
+ { "aperture": 1.8, "scale_factor": 1.090 }, // 15103/13825
+ { "aperture": 2.0, "scale_factor": 1.035 }, // 14334/13825
+ { "aperture": 2.2, "scale_factor": 1.005 }, // 13950/13825
+ { "aperture": 2.5, "scale_factor": 1.000 } // 13825/13825
]
- }
+ }
},
+
{ // Quality A, ISO and aperture WL data by Ayshih at Magic Lantern forums
"make_model": "Canon EOS 50D",
"dcraw_matrix": [ 4920,616,-593,-6493,13964,2784,-1774,3178,7005 ],
"ranges": {
- "white": [
+ "white": [
{ "iso": [ 100, 125 ], "levels": 13300 }, // typical 13432
{ "iso": [ 160, 320, 640, 1250 ], "levels": 12700 }, // typical 12790-12810
{ "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 2500, 3200 ], "levels": 15630 }, // typical 15763-15733
{ "iso": [ 6400, 12800 ], "levels": 16200 } // typical 16383
- ],
- "white_max": 16383,
+ ],
+ "white_max": 16383,
"aperture_scaling": [
- { "aperture": 1.4, "scale_factor": 1.270 },
- { "aperture": 1.6, "scale_factor": 1.150 },
- { "aperture": 1.8, "scale_factor": 1.090 },
- { "aperture": 2.0, "scale_factor": 1.040 },
- { "aperture": 2.2, "scale_factor": 1.020 },
- { "aperture": 2.5, "scale_factor": 1.010 },
- { "aperture": 2.8, "scale_factor": 1.000 },
- { "aperture": 3.2, "scale_factor": 1.000 }
+ { "aperture": 1.4, "scale_factor": 1.270 },
+ { "aperture": 1.6, "scale_factor": 1.150 },
+ { "aperture": 1.8, "scale_factor": 1.090 },
+ { "aperture": 2.0, "scale_factor": 1.040 },
+ { "aperture": 2.2, "scale_factor": 1.020 },
+ { "aperture": 2.5, "scale_factor": 1.010 },
+ { "aperture": 2.8, "scale_factor": 1.000 },
+ { "aperture": 3.2, "scale_factor": 1.000 }
]
- }
+ }
},
+
{ // Quality A, ISO and aperture WL data copyed from Shalrath's 60D data at RawTherapee forums
"make_model": "Canon EOS 60Da",
"dcraw_matrix": [ 17492,-7240,-2023,-1791,10323,1701,-186,1329,5406 ], // 60Da dng d65
"ranges": {
- "white": [
+ "white": [
{ "iso": [ 100, 125 ], "levels": 13480 }, // typical 13583
{ "iso": [ 160, 320, 640, 1250, 2500 ], "levels": 12550 }, // typical 12650
{ "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000, 5000, 6400, 12800 ], "levels": 15200 } // typical 15304
- ],
- "white_max": 16383,
+ ],
+ "white_max": 16383,
"aperture_scaling": [
- /* note: no scale factors known for f/1.2 and f/1.0 (had no lenses to test with), but the
- typical 12650 white levels maxes out at "white_max" for f/1.4 and below anyway. */
- { "aperture": 1.4, "scale_factor": 1.300 }, // gaps 81of301
- { "aperture": 1.6, "scale_factor": 1.200 },
- { "aperture": 1.8, "scale_factor": 1.140 },
- { "aperture": 2.0, "scale_factor": 1.080 }, // gaps 1of11
- { "aperture": 2.2, "scale_factor": 1.060 },
- { "aperture": 2.5, "scale_factor": 1.050 },
- { "aperture": 2.8, "scale_factor": 1.030 },
- { "aperture": 3.2, "scale_factor": 1.015 },
- { "aperture": 3.5, "scale_factor": 1.000 } // no sample but it would be negligible
+ // no scale factors known for f/1.2 and f/1.0 (had no lenses to test with), but the
+ // typical 12650 white levels maxes out at "white_max" for f/1.4 and below anyway.
+ { "aperture": 1.4, "scale_factor": 1.300 }, // gaps 81of301
+ { "aperture": 1.6, "scale_factor": 1.200 },
+ { "aperture": 1.8, "scale_factor": 1.140 },
+ { "aperture": 2.0, "scale_factor": 1.080 }, // gaps 1of11
+ { "aperture": 2.2, "scale_factor": 1.060 },
+ { "aperture": 2.5, "scale_factor": 1.050 },
+ { "aperture": 2.8, "scale_factor": 1.030 },
+ { "aperture": 3.2, "scale_factor": 1.015 },
+ { "aperture": 3.5, "scale_factor": 1.000 } // no sample but it would be negligible
]
- }
+ }
},
+
{ // Quality A, ISO and aperture WL data by Shalrath at RawTherapee forums
"make_model": "Canon EOS 60D",
"dcraw_matrix": [ 6719,-994,-925,-4408,12426,2211,-887,2129,6051 ],
"ranges": {
- "white": [
+ "white": [
{ "iso": [ 100, 125 ], "levels": 13480 }, // typical 13583
{ "iso": [ 160, 320, 640, 1250, 2500 ], "levels": 12550 }, // typical 12650
{ "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000, 5000, 6400, 12800 ], "levels": 15200 } // typical 15304
- ],
- "white_max": 16383,
+ ],
+ "white_max": 16383,
"aperture_scaling": [
- /* note: no scale factors known for f/1.2 and f/1.0 (had no lenses to test with), but the
- typical 12650 white levels maxes out at "white_max" for f/1.4 and below anyway. */
- { "aperture": 1.4, "scale_factor": 1.300 }, // gaps 81of301
- { "aperture": 1.6, "scale_factor": 1.200 },
- { "aperture": 1.8, "scale_factor": 1.140 },
- { "aperture": 2.0, "scale_factor": 1.080 }, // gaps 1of11
- { "aperture": 2.2, "scale_factor": 1.060 },
- { "aperture": 2.5, "scale_factor": 1.050 },
- { "aperture": 2.8, "scale_factor": 1.030 },
- { "aperture": 3.2, "scale_factor": 1.015 },
- { "aperture": 3.5, "scale_factor": 1.000 } // no sample but it would be negligible
+ // no scale factors known for f/1.2 and f/1.0 (had no lenses to test with), but the
+ // typical 12650 white levels maxes out at "white_max" for f/1.4 and below anyway.
+ { "aperture": 1.4, "scale_factor": 1.300 }, // gaps 81of301
+ { "aperture": 1.6, "scale_factor": 1.200 },
+ { "aperture": 1.8, "scale_factor": 1.140 },
+ { "aperture": 2.0, "scale_factor": 1.080 }, // gaps 1of11
+ { "aperture": 2.2, "scale_factor": 1.060 },
+ { "aperture": 2.5, "scale_factor": 1.050 },
+ { "aperture": 2.8, "scale_factor": 1.030 },
+ { "aperture": 3.2, "scale_factor": 1.015 },
+ { "aperture": 3.5, "scale_factor": 1.000 } // no sample but it would be negligible
]
- }
+ }
},
+
{ // Quality B, more aperture scale factors needed
"make_model": "Canon EOS 70D",
"dcraw_matrix": [ 7034,-804,-1014,-4420,12564,2058,-851,1994,5758 ], // DNG D65
"ranges": {
- "white": [
+ "white": [
{ "iso": [ 100, 125 ], "levels": 13480 }, // typical 13583
{ "iso": [ 160, 320, 640, 1250, 2500, 5000 ], "levels": 12450 }, // typical 12559
{ "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000, 6400, 8000, 10000 ], "levels": 15200 }, // typical 15303 - ISO 8000-10000 guessed
{ "iso": [ 12800, 25600 ], "levels": 16200 } // typical 16383
- ],
- "white_max": 16383,
+ ],
+ "white_max": 16383,
"aperture_scaling": [
- /* note: no scale factors known for f/1.2 and f/1.0 (had no lenses to test with), but even with the
- 12500 white levels nearly maxes out for f/1.4 and below anyway. */
- { "aperture": 1.4, "scale_factor": 1.240 }, // guessed
- { "aperture": 1.6, "scale_factor": 1.160 }, // guessed
- { "aperture": 1.8, "scale_factor": 1.110 }, // 31of35
- { "aperture": 2.0, "scale_factor": 1.060 }, // guessed
- { "aperture": 2.2, "scale_factor": 1.030 }, // guessed
- { "aperture": 2.5, "scale_factor": 1.015 }, // guessed
- { "aperture": 2.8, "scale_factor": 1.008 }, // 15432/15303
- { "aperture": 3.2, "scale_factor": 1.000 },
- { "aperture": 3.5, "scale_factor": 1.000 }
+ // no scale factors known for f/1.2 and f/1.0 (had no lenses to test with), but even with the
+ // 12500 white levels nearly maxes out for f/1.4 and below anyway.
+ { "aperture": 1.4, "scale_factor": 1.240 }, // guessed
+ { "aperture": 1.6, "scale_factor": 1.160 }, // guessed
+ { "aperture": 1.8, "scale_factor": 1.110 }, // 31of35
+ { "aperture": 2.0, "scale_factor": 1.060 }, // guessed
+ { "aperture": 2.2, "scale_factor": 1.030 }, // guessed
+ { "aperture": 2.5, "scale_factor": 1.015 }, // guessed
+ { "aperture": 2.8, "scale_factor": 1.008 }, // 15432/15303
+ { "aperture": 3.2, "scale_factor": 1.000 },
+ { "aperture": 3.5, "scale_factor": 1.000 }
]
- }
+ }
},
{ // Quality C, White Levels not properly indicated, aperture scaling..missing scaling factors are guessed
@@ -780,107 +702,110 @@ Quality X: unknown, ie we knowing to little about the camera properties to know
"raw_crop": [ 264, 34, 6024, 4022 ], // full size 6288x4056, official crop 276,46,6275,4045
"masked_areas": [ 40, 96, 4000, 260 ],
"ranges": {
- "white": [
- { "iso": [ 100, 125, 200, 250 ], "levels": 16200 }, // nominal 16383, LENR blue 16243
+ "white": [
+ { "iso": [ 100 ], "levels": 16100 }, // nominal 16383, LENR blue 16243
+ { "iso": [ 125, 200, 250, 400 ], "levels": 16200 }, // nominal 16383, LENR blue 16243
{ "iso": [ 160 ], "levels": 13000 }, // nominal 13097,
- { "iso": [ 320, 640, 1250, 2500, 5000, 10000 ], "levels": 13200 }, // G1,G2 13415
- { "iso": [ 400, 500, 800, 1000, 1600, 2000, 3200, 4000 ], "levels": 16150 }, // nominal 16383, LENR ISO3200 16150
- { "iso": [ 6400, 8000, 12800, 16000, 25600 ], "levels": 16000 } // R,G1,G2 16383, B 16243, LENR B 16000
- ],
- "white_max": 16383,
+ { "iso": [ 320, 640, 1250 ], "levels": 13250 }, // G1,G2 13415
+ { "iso": [ 500, 800, 1000 ], "levels": 16150 }, // nominal 16383, LENR ISO3200 16150
+ { "iso": [ 1600, 2000, 3200 ], "levels": 16100 }, // nominal 16383, LENR ISO3200 16150
+ { "iso": [ 2500, 5000 ], "levels": 13150 }, // G1,G2 13415
+ { "iso": [ 4000, 6400 ], "levels": 16050 }, // nominal 16383, LENR ISO6400 16050
+ { "iso": [ 8000, 10000 ], "levels": 16000 }, // R,G1,G2 16383, B 16243, LENR B 16000
+ { "iso": [ 12800, 16000, 25600 ], "levels": 15900 } // R,G1,G2 16383, B 16243, LENR BLUE 15750
+ ],
+ "white_max": 16383,
"aperture_scaling": [
- /* note: need for more data to properly fill all scale factors */
- { "aperture": 1.4, "scale_factor": 1.200 }, // guessed
- { "aperture": 1.6, "scale_factor": 1.080 }, // guessed
- { "aperture": 1.8, "scale_factor": 1.055 }, // guessed
- { "aperture": 2.0, "scale_factor": 1.030 }, // guessed
- { "aperture": 2.2, "scale_factor": 1.025 }, // guessed
- { "aperture": 2.5, "scale_factor": 1.020 }, // guessed
- { "aperture": 2.8, "scale_factor": 1.000 }, //
- { "aperture": 3.2, "scale_factor": 1.000 }, //
- { "aperture": 3.5, "scale_factor": 1.000 } //
- ]
- }
+ // need for more data to properly fill all scale factors
+ { "aperture": 1.4, "scale_factor": 1.200 }, // guessed
+ { "aperture": 1.6, "scale_factor": 1.130 }, // guessed
+ { "aperture": 1.8, "scale_factor": 1.090 }, // 14338/13097 = 1.094
+ { "aperture": 2.0, "scale_factor": 1.060 }, // 13934/13097 = 1.063
+ { "aperture": 2.2, "scale_factor": 1.025 }, // 13438/13097 = 1.026
+ { "aperture": 2.5, "scale_factor": 1.005 }, // 13190/13097 = 1.007
+ { "aperture": 2.8, "scale_factor": 1.000 } // 13097/13097
+ ]
+ }
},
-// Canon Mid category DSLRs (Rebels)
+// Canon mid-range DSLRs (Rebels)
- { // Quality b, ISO and aperture WL data by ..... at RawTherapee forums, missing samples safely guessed
+ { // Quality B, ISO and aperture WL data by ..... at RawTherapee forums, missing samples safely guessed
"make_model": [ "Canon EOS 550D", "Canon EOS Rebel T2i", "Canon EOS Kiss X4" ],
"dcraw_matrix": [ 6941,-1164,-857,-3825,11597,2534,-416,1540,6039 ], // dcraw 550d
"ranges": {
- "white": [
+ "white": [
{ "iso": [ 100, 125 ], "levels": 13480 }, // typical 13584
{ "iso": [ 160, 320, 640, 1250, 2500 ], "levels": 12550 }, // typical 12650
{ "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000, 5000, 6400, 12800 ], "levels": 15200 } // typical 15304
- ],
- "white_max": 16383,
+ ],
+ "white_max": 16383,
"aperture_scaling": [
- /* note: no scale factors known for f/1.2 and f/1.0 (no lenses to test with), but the
- typical 12650 white levels maxes out at "white_max" for f/1.4 and below anyway. */
- { "aperture": 1.4, "scale_factor": 1.250 }, // guessed
- { "aperture": 1.6, "scale_factor": 1.150 }, // guessed
- { "aperture": 1.8, "scale_factor": 1.110 }, // 15196/13584
- { "aperture": 2.0, "scale_factor": 1.080 }, // 14734/13584
- { "aperture": 2.2, "scale_factor": 1.050 }, // 14386/13584
- { "aperture": 2.5, "scale_factor": 1.040 }, // 14272/13584
- { "aperture": 2.8, "scale_factor": 1.030 }, // 14042/13584
- { "aperture": 3.2, "scale_factor": 1.015 }, // guessed
- { "aperture": 3.5, "scale_factor": 1.000 } // guessed negligible
- ]
- }
+ // no scale factors known for f/1.2 and f/1.0 (no lenses to test with), but the
+ // typical 12650 white levels maxes out at "white_max" for f/1.4 and below anyway.
+ { "aperture": 1.4, "scale_factor": 1.250 }, // guessed
+ { "aperture": 1.6, "scale_factor": 1.150 }, // guessed
+ { "aperture": 1.8, "scale_factor": 1.110 }, // 15196/13584
+ { "aperture": 2.0, "scale_factor": 1.080 }, // 14734/13584
+ { "aperture": 2.2, "scale_factor": 1.050 }, // 14386/13584
+ { "aperture": 2.5, "scale_factor": 1.040 }, // 14272/13584
+ { "aperture": 2.8, "scale_factor": 1.030 }, // 14042/13584
+ { "aperture": 3.2, "scale_factor": 1.015 }, // guessed
+ { "aperture": 3.5, "scale_factor": 1.000 } // guessed negligible
+ ]
+ }
},
- { // Quality b, scaling factors missing but guessed safely
+ { // Quality B, scaling factors missing but guessed safely
"make_model": [ "Canon EOS 600D", "Canon EOS Rebel T3i", "Canon EOS Kiss X5", "Canon EOS 1200D", "Canon EOS Rebel T5", "Canon EOS Kiss X70" ],
- // "dcraw_matrix": [ 13254,-6296,-1798,184,2753,90,1438,-566,1129 ], // Infrared guessed
+ //"dcraw_matrix": [ 13254,-6296,-1798,184,2753,90,1438,-566,1129 ], // Infrared guessed
"dcraw_matrix": [ 6461,-907,-882,-4300,12184,2378,-819,1944,5931 ], // dcp D65 colormatrix2
"ranges": {
- "white": [
+ "white": [
{ "iso": [ 100, 125 ], "levels": 13480 }, // typical 13583
{ "iso": [ 160, 320, 640, 1250, 2500, 5000, 10000 ], "levels": 12550 }, // typical 12650
{ "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000, 6400, 8000, 12800 ], "levels": 15200 } // typical 15303
- ],
- "white_max": 16383,
+ ],
+ "white_max": 16383,
"aperture_scaling": [
- /* note: no scale factors known for f/1.2 and f/1.0 (had no lenses to test with), but the
- typical 12650 white levels maxes out at "white_max" for f/1.4 and below anyway. */
- { "aperture": 1.4, "scale_factor": 1.290 }, // guessed from 60D data
- { "aperture": 1.6, "scale_factor": 1.190 }, // guessed
- { "aperture": 1.8, "scale_factor": 1.140 }, // guessed
- { "aperture": 2.0, "scale_factor": 1.090 }, // 12293/11222 = 1.095
- { "aperture": 2.2, "scale_factor": 1.060 }, // 11971/11222 = 1.066
- { "aperture": 2.5, "scale_factor": 1.050 }, // guessed
- { "aperture": 2.8, "scale_factor": 1.030 }, // iso100: 14042/13584=1.0336 - iso200 15820/15303 = 1.0348
- { "aperture": 3.2, "scale_factor": 1.000 } //
+ // no scale factors known for f/1.2 and f/1.0 (had no lenses to test with), but the
+ // typical 12650 white levels maxes out at "white_max" for f/1.4 and below anyway.
+ { "aperture": 1.4, "scale_factor": 1.290 }, // guessed from 60D data
+ { "aperture": 1.6, "scale_factor": 1.190 }, // guessed
+ { "aperture": 1.8, "scale_factor": 1.140 }, // guessed
+ { "aperture": 2.0, "scale_factor": 1.090 }, // 12293/11222 = 1.095
+ { "aperture": 2.2, "scale_factor": 1.060 }, // 11971/11222 = 1.066
+ { "aperture": 2.5, "scale_factor": 1.050 }, // guessed
+ { "aperture": 2.8, "scale_factor": 1.030 }, // iso100: 14042/13584=1.0336 - iso200 15820/15303 = 1.0348
+ { "aperture": 3.2, "scale_factor": 1.000 } //
]
- }
+ }
},
{ // Quality A, only one scaling factor missing and guessed safely, EOS 700D not tested but available samples look same as 650D
"make_model": [ "Canon EOS 650D", "Canon EOS Rebel T4i", "Canon EOS Kiss X6i", "Canon EOS 700D", "Canon EOS Rebel T5i", "Canon EOS Kiss X7i" ],
"dcraw_matrix": [ 6602,-841,-939,-4472,12458,2247,-975,2039,6148 ],
"ranges": {
- "white": [
+ "white": [
{ "iso": [ 100, 125 ], "levels": 13480 }, // typical 13583
{ "iso": [ 160, 320, 640, 1250, 2500, 5000, 10000 ], "levels": 12550 }, // typical 12650
{ "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000, 6400, 8000 ], "levels": 15200 }, // typical 15303
{ "iso": [ 12800, 25600 ], "levels": 16200 } // typical 16383
- ],
- "white_max": 16383,
+ ],
+ "white_max": 16383,
"aperture_scaling": [
- /* note: no scale factors known for f/1.2 and f/1.0 (had no lenses to test with), but the
- typical 12650 white levels maxes out at "white_max" for f/1.4 and below anyway. */
- { "aperture": 1.4, "scale_factor": 1.200 }, // 16332/13583
- { "aperture": 1.6, "scale_factor": 1.080 }, // guessed
- { "aperture": 1.8, "scale_factor": 1.055 }, // 14372/13583
- { "aperture": 2.0, "scale_factor": 1.030 }, // 14034/13583
- { "aperture": 2.2, "scale_factor": 1.025 }, // 13921/13583
- { "aperture": 2.5, "scale_factor": 1.020 }, //
- { "aperture": 2.8, "scale_factor": 1.000 }, //
- { "aperture": 3.2, "scale_factor": 1.000 } //
+ // no scale factors known for f/1.2 and f/1.0 (had no lenses to test with), but the
+ // typical 12650 white levels maxes out at "white_max" for f/1.4 and below anyway.
+ { "aperture": 1.4, "scale_factor": 1.200 }, // 16332/13583
+ { "aperture": 1.6, "scale_factor": 1.080 }, // guessed
+ { "aperture": 1.8, "scale_factor": 1.055 }, // 14372/13583
+ { "aperture": 2.0, "scale_factor": 1.030 }, // 14034/13583
+ { "aperture": 2.2, "scale_factor": 1.025 }, // 13921/13583
+ { "aperture": 2.5, "scale_factor": 1.020 }, //
+ { "aperture": 2.8, "scale_factor": 1.000 }, //
+ { "aperture": 3.2, "scale_factor": 1.000 } //
]
- }
+ }
},
{ // Quality C, aperture scale factors and intermediate ISOs missing but safely guessed
@@ -889,93 +814,93 @@ Quality X: unknown, ie we knowing to little about the camera properties to know
"raw_crop": [ 72, 34, 6024, 4022 ], // full size 6096x4056, official crop 84,46,6083,4045
"masked_areas": [ 40, 16, 4000, 54 ],
"ranges": {
- "white": [
- { "iso": [ 100, 125 ], "levels": 13300 }, // typical 13583
- { "iso": [ 160, 320, 640, 1250, 2500, 5000 ], "levels": 12500 }, // typical 12600
- { "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000 ], "levels": 15200 }, // typical 15303
- { "iso": [ 6400, 8000, 10000, 12800, 16000, 20000 ], "levels": 15100 }, // typical 15303
- { "iso": 25600, "levels": 16300 } // typical 16383
- ],
- "white_max": 16383,
+ "white": [
+ { "iso": [ 100, 125 ], "levels": 13300 }, // typical 13583
+ { "iso": [ 160, 320, 640, 1250, 2500, 5000 ], "levels": 12500 }, // typical 12600
+ { "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000 ], "levels": 15200 }, // typical 15303
+ { "iso": [ 6400, 8000, 10000, 12800, 16000, 20000 ], "levels": 15100 }, // typical 15303
+ { "iso": 25600, "levels": 16300 } // typical 16383
+ ],
+ "white_max": 16383,
"aperture_scaling": [
- /* note: all scale factors are guessed to be same as 7DII */
- { "aperture": 1.4, "scale_factor": 1.200 }, // guessed
- { "aperture": 1.6, "scale_factor": 1.100 }, // guessed
- { "aperture": 1.8, "scale_factor": 1.050 }, // guessed
- { "aperture": 2.0, "scale_factor": 1.030 }, // guessed
- { "aperture": 2.2, "scale_factor": 1.015 }, // guessed
- { "aperture": 2.5, "scale_factor": 1.007 }, // guessed
- { "aperture": 2.8, "scale_factor": 1.007 }, // guessed
- { "aperture": 3.2, "scale_factor": 1.000 }, // guessed
- { "aperture": 3.5, "scale_factor": 1.000 }
- ]
- }
+ // all scale factors are guessed to be same as 7DII
+ { "aperture": 1.4, "scale_factor": 1.200 }, // guessed
+ { "aperture": 1.6, "scale_factor": 1.100 }, // guessed
+ { "aperture": 1.8, "scale_factor": 1.050 }, // guessed
+ { "aperture": 2.0, "scale_factor": 1.030 }, // guessed
+ { "aperture": 2.2, "scale_factor": 1.015 }, // guessed
+ { "aperture": 2.5, "scale_factor": 1.007 }, // guessed
+ { "aperture": 2.8, "scale_factor": 1.007 }, // guessed
+ { "aperture": 3.2, "scale_factor": 1.000 }, // guessed
+ { "aperture": 3.5, "scale_factor": 1.000 }
+ ]
+ }
},
-// Canon Low End DSLRs
+// Canon low-range DSLRs
// Canon EOS 1200D/Rebel T5/Kiss X70" is upper at the same item as 600D/T3i/X5
{ // Quality B, integer ISOs measured, intermediate ISO samples missing,
- // scaling factors safely guessed to be same as 1200D ..
+ // scaling factors safely guessed to be same as 1200D
"make_model": [ "Canon EOS 1300D", "Canon EOS Rebel T6", "Canon EOS Kiss X80" ],
- "dcraw_matrix": [ 6939,-1016,-866,-4428,12473,2177,-1175,2178,6162 ], // Dcraw 9.27
+ "dcraw_matrix": [ 6939,-1016,-866,-4428,12473,2177,-1175,2178,6162 ], // dcraw 9.27
"ranges": {
- "white": [
+ "white": [
{ "iso": [ 100, 125 ], "levels": 13480 }, // typical 13584
{ "iso": [ 160, 320, 640, 1250, 2500, 5000, 10000 ], "levels": 12550 }, // typical 12650
{ "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000, 6400, 8000, 12800 ], "levels": 15200 } // typical 15303
- ],
- "white_max": 16383,
+ ],
+ "white_max": 16383,
"aperture_scaling": [
- /* note: no scale factors known for f/1.2 and f/1.0 (had no lenses to test with), but the
- typical 12650 white levels maxes out at "white_max" for f/1.4 and below anyway. */
- { "aperture": 1.4, "scale_factor": 1.290 }, // guessed from 60D data
- { "aperture": 1.6, "scale_factor": 1.190 }, // guessed
- { "aperture": 1.8, "scale_factor": 1.140 }, // guessed
- { "aperture": 2.0, "scale_factor": 1.090 }, // 12293/11222 = 1.095
- { "aperture": 2.2, "scale_factor": 1.060 }, // 11971/11222 = 1.066
- { "aperture": 2.5, "scale_factor": 1.050 }, // guessed
- { "aperture": 2.8, "scale_factor": 1.030 }, // iso100: 14042/13584=1.0336 - iso200 15820/15303 = 1.0348
- { "aperture": 3.2, "scale_factor": 1.000 }, //
- { "aperture": 3.5, "scale_factor": 1.000 } //
+ // no scale factors known for f/1.2 and f/1.0 (had no lenses to test with), but the
+ // typical 12650 white levels maxes out at "white_max" for f/1.4 and below anyway.
+ { "aperture": 1.4, "scale_factor": 1.290 }, // guessed from 60D data
+ { "aperture": 1.6, "scale_factor": 1.190 }, // guessed
+ { "aperture": 1.8, "scale_factor": 1.140 }, // guessed
+ { "aperture": 2.0, "scale_factor": 1.090 }, // 12293/11222 = 1.095
+ { "aperture": 2.2, "scale_factor": 1.060 }, // 11971/11222 = 1.066
+ { "aperture": 2.5, "scale_factor": 1.050 }, // guessed
+ { "aperture": 2.8, "scale_factor": 1.030 }, // iso100: 14042/13584=1.0336 - iso200 15820/15303 = 1.0348
+ { "aperture": 3.2, "scale_factor": 1.000 }, //
+ { "aperture": 3.5, "scale_factor": 1.000 } //
]
- }
+ }
},
-// Canon Mirrorless with Interchangable Lens
+// Canon MILC (mirrorless interchangeable-lens camera)
{ // Quality B, missing scaling factors are guessed safely from 650D relative data
"make_model": "Canon EOS M",
"dcraw_matrix": [ 6602,-841,-939,-4472,12458,2247,-975,2039,6148 ],
"ranges": {
- "white": [
+ "white": [
{ "iso": [ 100, 125 ], "levels": 13480 }, // typical 13583
{ "iso": [ 160, 320, 640, 1250, 2500, 5000, 10000 ], "levels": 12550 }, // typical 12650
{ "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000, 6400, 8000 ], "levels": 15200 }, // typical 15303
{ "iso": [ 12800, 25600 ], "levels": 16200 } // typical 16383
- ],
- "white_max": 16383,
+ ],
+ "white_max": 16383,
"aperture_scaling": [
- /* note: no scale factors known for f/1.2 and f/1.0 (had no lenses to test with), but the
- typical 12650 white levels maxes out at "white_max" for f/1.4 and below anyway. */
- { "aperture": 1.4, "scale_factor": 1.200 }, // guessed
- { "aperture": 1.6, "scale_factor": 1.080 }, // guessed
- { "aperture": 1.8, "scale_factor": 1.055 }, // guessed
- { "aperture": 2.0, "scale_factor": 1.030 }, // 15821/15303
- { "aperture": 2.2, "scale_factor": 1.025 }, // 15691/15303
- { "aperture": 2.5, "scale_factor": 1.020 }, // 12947/12650
- { "aperture": 2.8, "scale_factor": 1.000 }, //
- { "aperture": 3.2, "scale_factor": 1.000 }, //
- { "aperture": 3.5, "scale_factor": 1.000 } //
- ]
- }
+ // no scale factors known for f/1.2 and f/1.0 (had no lenses to test with), but the
+ // typical 12650 white levels maxes out at "white_max" for f/1.4 and below anyway.
+ { "aperture": 1.4, "scale_factor": 1.200 }, // guessed
+ { "aperture": 1.6, "scale_factor": 1.080 }, // guessed
+ { "aperture": 1.8, "scale_factor": 1.055 }, // guessed
+ { "aperture": 2.0, "scale_factor": 1.030 }, // 15821/15303
+ { "aperture": 2.2, "scale_factor": 1.025 }, // 15691/15303
+ { "aperture": 2.5, "scale_factor": 1.020 }, // 12947/12650
+ { "aperture": 2.8, "scale_factor": 1.000 }, //
+ { "aperture": 3.2, "scale_factor": 1.000 }, //
+ { "aperture": 3.5, "scale_factor": 1.000 } //
+ ]
+ }
},
{ // Quality C, inconsistent WL per ISO, missing scaling factors
"make_model": "Canon EOS M10",
"dcraw_matrix": [ 6400,-480,-888,-5294,13416,2047,-1296,2203,6137 ], // DNGv9.3 D65
"ranges": {
- "white": [
+ "white": [
{ "iso": [ 100, 125, 160, 320, 500, 2000, 4000, 6400 ], "levels": 16300 }, // typical 16383
{ "iso": 200, "levels": 12900 }, // typical 12940-15570-15376
{ "iso": 250, "levels": 14100 }, // typical 14200
@@ -987,93 +912,125 @@ Quality X: unknown, ie we knowing to little about the camera properties to know
{ "iso": 3200, "levels": 15000 }, // typical 15080-16383-16100-13660
{ "iso": 5000, "levels": 12800 }, // typical 12840
{ "iso": [ 12800, 25600 ], "levels": 16200 } // typical 16383
- ],
- "white_max": 16383,
+ ],
+ "white_max": 16383,
"aperture_scaling": [
- /* note: all scale factors are copied from EOS M3 */
- { "aperture": 1.4, "scale_factor": 1.200 }, // guessed
- { "aperture": 1.6, "scale_factor": 1.080 }, // guessed
- { "aperture": 1.8, "scale_factor": 1.055 }, // guessed
- { "aperture": 2.0, "scale_factor": 1.030 }, // guessed
- { "aperture": 2.2, "scale_factor": 1.025 }, // guessed
- { "aperture": 2.5, "scale_factor": 1.020 }, // guessed
- { "aperture": 2.8, "scale_factor": 1.000 }, //
- { "aperture": 3.2, "scale_factor": 1.000 }, //
- { "aperture": 3.5, "scale_factor": 1.000 } //
- ]
- }
+ // all scale factors are copied from EOS M3 */
+ { "aperture": 1.4, "scale_factor": 1.200 }, // guessed
+ { "aperture": 1.6, "scale_factor": 1.080 }, // guessed
+ { "aperture": 1.8, "scale_factor": 1.055 }, // guessed
+ { "aperture": 2.0, "scale_factor": 1.030 }, // guessed
+ { "aperture": 2.2, "scale_factor": 1.025 }, // guessed
+ { "aperture": 2.5, "scale_factor": 1.020 }, // guessed
+ { "aperture": 2.8, "scale_factor": 1.000 }, //
+ { "aperture": 3.2, "scale_factor": 1.000 }, //
+ { "aperture": 3.5, "scale_factor": 1.000 } //
+ ]
+ }
},
- { // Quality C, White Levels not properly indicated, aperture scaling..missing scaling factors are guessed
+ { // Quality C, white levels not properly indicated, aperture scaling..missing scaling factors are guessed
"make_model": "Canon EOS M3",
"dcraw_matrix": [ 6362,-823,-847,-4426,12109,2616,-743,1857,5635 ], // DNG_V8.8 D65
"raw_crop": [ 72, 34, 6024, 4022 ], // full size 6096x4056, official crop 84,46,6083,4045
"masked_areas": [ 40, 16, 4000, 54 ],
"ranges": {
- "white": [
+ "white": [
{ "iso": [ 100, 125, 160 ], "levels": 16300 }, // 16383
{ "iso": [ 320, 640, 1250, 2500, 5000, 10000 ], "levels": 12600 }, // 12632..14500
{ "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000 ], "levels": 15000 }, // 15095, 15488
{ "iso": [ 6400, 8000, 12800, 25600 ], "levels": 16200 } // 16383
- ],
- "white_max": 16383,
+ ],
+ "white_max": 16383,
"aperture_scaling": [
- /* note: need for more data to properly fill all scale factors */
- { "aperture": 1.4, "scale_factor": 1.200 }, // guessed
- { "aperture": 1.6, "scale_factor": 1.080 }, // guessed
- { "aperture": 1.8, "scale_factor": 1.055 }, // guessed
- { "aperture": 2.0, "scale_factor": 1.030 }, // guessed
- { "aperture": 2.2, "scale_factor": 1.025 }, // guessed
- { "aperture": 2.5, "scale_factor": 1.020 }, // guessed
- { "aperture": 2.8, "scale_factor": 1.000 }, //
- { "aperture": 3.2, "scale_factor": 1.000 }, //
- { "aperture": 3.5, "scale_factor": 1.000 } //
- ]
- }
+ // need for more data to properly fill all scale factors
+ { "aperture": 1.4, "scale_factor": 1.200 }, // guessed
+ { "aperture": 1.6, "scale_factor": 1.080 }, // guessed
+ { "aperture": 1.8, "scale_factor": 1.055 }, // guessed
+ { "aperture": 2.0, "scale_factor": 1.030 }, // guessed
+ { "aperture": 2.2, "scale_factor": 1.025 }, // guessed
+ { "aperture": 2.5, "scale_factor": 1.020 }, // guessed
+ { "aperture": 2.8, "scale_factor": 1.000 }, //
+ { "aperture": 3.2, "scale_factor": 1.000 }, //
+ { "aperture": 3.5, "scale_factor": 1.000 } //
+ ]
+ }
+ },
+
+ { // Quality C, White Levels not properly indicated, aperture scaling..missing factors are guessed
+ "make_model": "Canon EOS M5",
+ "dcraw_matrix": [ 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 ], // DNG_V9.8 D65
+ "raw_crop": [ 264, 36, 6024, 4020 ], // full size 6288x4056,
+ //"raw_crop": [ 272, 44, 6008, 4008 ], // matched to official crop 276,48,6275,4047 - official jpeg 6000X4000
+ "masked_areas": [ 40, 96, 4000, 260 ],
+ "ranges": {
+ "white": [
+ { "iso": [ 100, 125, 200, 250 ], "levels": 15600 }, // nominal 15660-15800
+ { "iso": [ 160 ], "levels": 13000 }, // guessed
+ { "iso": [ 320 ], "levels": 13200 }, // nominal green13528-14466-14380-14368 - blue13262-14186,
+ { "iso": [ 640, 1250 ], "levels": 13150 }, // iso 640 G1,G2 13260-13450 - blue13230-13430 -iso 1250 13430
+ { "iso": [ 2500, 5000, 10000 ], "levels": 13100 }, //
+ { "iso": [ 400, 500, 800, 1000, 1600, 2000, 3200, 4000, 6400 ], "levels": 16100 }, // 16383
+ { "iso": [ 8000, 12800, 16000, 25600 ], "levels": 16000 } // R,G1,G2 16383, B 16243
+ ],
+ "white_max": 16383,
+ "aperture_scaling": [
+ // need for more data to properly fill all scale factors
+ { "aperture": 1.4, "scale_factor": 1.200 }, // 31/25
+ { "aperture": 1.6, "scale_factor": 1.080 }, // guessed
+ { "aperture": 1.8, "scale_factor": 1.050 }, // guessed
+ { "aperture": 2.0, "scale_factor": 1.030 }, // 15292/ 14916/ 320-14466/ 320-13528/
+ { "aperture": 2.2, "scale_factor": 1.020 }, // guessed
+ { "aperture": 2.5, "scale_factor": 1.010 }, // guessed
+ { "aperture": 2.8, "scale_factor": 1.000 }, //
+ { "aperture": 3.2, "scale_factor": 1.000 }, //
+ { "aperture": 3.5, "scale_factor": 1.000 } //
+ ]
+ }
},
// Canon Powershot
- { // Quality C, CHDK DNGs, raw frame corrections, experimental infrared support commented out
+ { // Quality C, CHDK DNGs, raw frame corrections, experimental infrared support commented out
"make_model": "Canon PowerShot A480",
"dcraw_matrix": [ 8275,-2905,-1261,-128,5305,505,52,482,2450 ], // DNG_CHDK_V1.3.0 Daylight
- // "dcraw_matrix": [ 15906,-7425,-2014,-2010,5554,264,404,-265,2706 ], // Infrared guessed
+ //"dcraw_matrix": [ 15906,-7425,-2014,-2010,5554,264,404,-265,2706 ], // Infrared guessed
"raw_crop": [ 6, 12, 3684, 2760 ], // full size 3720X2772, official Canon crop 3648x2736
"masked_areas": [ 12, 3694, 2760, 3716 ], // only left side optically black area is considered
"ranges": { "white": 4080 }
},
- { // Quality B, experimental infrared support commented out
+ { // Quality B, experimental infrared support commented out
"make_model": "Canon PowerShot G9",
"dcraw_matrix": [ 7368,-2141,-598,-5621,13254,2625,-1419,1696,5743 ], // DNG_V8.7 D65
- // "dcraw_matrix": [ 8796,-3770,311,-4148,11362,3197,-598,983,5880 ], // DNG_V8.7 A
- // "dcraw_matrix": [ 15669,-8084,-2453,-2940,5756,101,126,-401,2463 ], // Infrared guessed 111
- // "dcraw_matrix": [ 13254,-6296,-1798,184,2753,90,1438,-566,1129 ], // Infrared guessed
- "ranges": { "white": 4080 }
+ //"dcraw_matrix": [ 8796,-3770,311,-4148,11362,3197,-598,983,5880 ], // DNG_V8.7 A
+ //"dcraw_matrix": [ 15669,-8084,-2453,-2940,5756,101,126,-401,2463 ], // Infrared guessed 111
+ //"dcraw_matrix": [ 13254,-6296,-1798,184,2753,90,1438,-566,1129 ], // Infrared guessed
+ "ranges": { "white": 4080 }
},
- { // Quality A, changes for raw crop which is optimistic in Dcraw
+ { // Quality A, changes for raw crop which is optimistic in dcraw
"make_model": "Canon PowerShot G12",
"dcraw_matrix": [ 13244,-5501,-1248,-1508,9858,1935,-270,1083,4366 ],
- // "raw_crop": [ 62, 18, 3666, 2748 ],// max usable
- "raw_crop": [ 68, 20, 3656, 2744 ],// equal to official Canon frame, 72,24,3719,2759 = 3648x2736
- "masked_areas": [ 24, 40, 2770, 44 ],// as declared in maker data
- "ranges": { "white": 4080 } //
+ //"raw_crop": [ 62, 18, 3666, 2748 ], // max usable
+ "raw_crop": [ 68, 20, 3656, 2744 ], // equal to official Canon frame, 72,24,3719,2759 = 3648x2736
+ "masked_areas": [ 24, 40, 2770, 44 ], // as declared in maker data
+ "ranges": { "white": 4080 }
},
- { /* Quality B, needs a way to auto apply 3/2 or 4/3 crops (read exif tags ..) to work better with auto distortion,
- for the moment just comment-uncomment the desired raw crop */
+ { // Quality B, needs a way to auto apply 3/2 or 4/3 crops (read Exif tags ..) to work better with auto distortion,
+ // for the moment just comment-uncomment the desired raw crop
"make_model": "Canon PowerShot G1 X Mark II",
"dcraw_matrix": [ 7378,-1255,-1043,-4088,12251,2048,-876,1946,5805 ], // D65 matrix from adobe dcp
- // "raw_crop": [ 80, 50, 4400, 3316 ], // full frame 4480x3366 borders 80,50 - much shade in corners, no/wrong auto distortion
- // "raw_crop": [ 104, 144, 4360, 3128 ], // Mixed best average frame, width is 4352 from 3/2, height 3120 from 4/3 - auto distortion does not work correctly
- // "raw_crop": [ 200, 144, 4168, 3128 ], // Optional official 4/3 frame 4160x3120, 4pix borders, Left Border 204-4, Top Border 148-4
- "raw_crop": [ 104, 252, 4360, 2912 ], // Default official 3/2 frame 4352X2904, 4pix borders, Left Border 108-4, Top border 256-4
+ //"raw_crop": [ 80, 50, 4400, 3316 ], // full frame 4480x3366 borders 80,50 - much shade in corners, no/wrong auto distortion
+ //"raw_crop": [ 104, 144, 4360, 3128 ], // Mixed best average frame, width is 4352 from 3/2, height 3120 from 4/3 - auto distortion does not work correctly
+ //"raw_crop": [ 200, 144, 4168, 3128 ], // Optional official 4/3 frame 4160x3120, 4pix borders, Left Border 204-4, Top Border 148-4
+ "raw_crop": [ 104, 252, 4360, 2912 ], // Default official 3/2 frame 4352x2904, 4pix borders, Left Border 108-4, Top border 256-4
"masked_areas": [ 148, 2, 3340, 78 ],
"ranges": { "white": 16300 }
},
- { // Quality B,
+ { // Quality B
"make_model": "Canon PowerShot G3 X",
"dcraw_matrix": [ 9701,-3857,-921,-3149,11537,1817,-786,1817,5147 ], // DNG_V9.1.1 D65
"raw_crop": [ 128, 36, 5480, 3656 ], // Default official 3/2 frame 5472X3648, 4pix borders, Left Border 132-4, Top border 40-4
@@ -1081,25 +1038,25 @@ Quality X: unknown, ie we knowing to little about the camera properties to know
"ranges": { "white": 16300 }
},
- { // Quality B,
- "make_model": [ "Canon PowerShot G7 X", "Canon PowerShot G7 X Mark II" ],
+ { // Quality B,
+ "make_model": "Canon PowerShot G7 X",
"dcraw_matrix": [ 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 ], // DNG_V8.7 D65
- // "raw_crop": [ 116, 24, 5504, 3680 ], // Sensor size 5632x3710. Largest useful frame 120-5616X28-3702 = 5504x3682, 4pix RTborders, Left Border 120-4, Top border 28-4
+ //"raw_crop": [ 116, 24, 5504, 3680 ], // Sensor size 5632x3710. Largest useful frame 120-5616X28-3702 = 5504x3682, 4pix RTborders, Left Border 120-4, Top border 28-4
"raw_crop": [ 128, 36, 5480, 3656 ], // Default official 3/2 frame 5472X3648, 4pix borders, Left Border 132-4, Top border 40-4
"masked_areas": [ 40, 4, 3680, 76 ],
"ranges": { "white": 4080 }
},
- { // Quality B,
- "make_model": [ "Canon PowerShot G5 X", "Canon PowerShot G9 X" ],
+ { // Quality B,
+ "make_model": [ "Canon PowerShot G5 X", "Canon PowerShot G9 X", "Canon PowerShot G7 X Mark II" ],
"dcraw_matrix": [ 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 ], // DNG_V8.7 D65
- // "raw_crop": [ 116, 24, 5504, 3680 ], // Sensor size 5632x3710. Largest useful frame 120-5616X28-3702 = 5504x3682, 4pix RTborders, Left Border 120-4, Top border 28-4
+ //"raw_crop": [ 116, 24, 5504, 3680 ], // Sensor size 5632x3710. Largest useful frame 120-5616X28-3702 = 5504x3682, 4pix RTborders, Left Border 120-4, Top border 28-4
"raw_crop": [ 128, 36, 5480, 3656 ], // Default official 3/2 frame 5472X3648, 4pix borders, Left Border 132-4, Top border 40-4
"masked_areas": [ 40, 4, 3680, 76 ],
"ranges": { "white": 16300 }
},
- { // Quality A, changes for raw crop which is wrong (larger) in Dcraw
+ { // Quality A, changes for raw crop which is wrong (larger) in dcraw
"make_model": "Canon PowerShot S120",
"dcraw_matrix": [ 6961,-1685,-695,-4625,12945,1836,-1114,2152,5518 ],
"raw_crop": [ 120, 30, 4024, 3030 ],
@@ -1120,48 +1077,55 @@ Quality X: unknown, ie we knowing to little about the camera properties to know
"dcraw_matrix": [ 12297,-4882,-1202,-2106,10691,1623,-88,1312,4790 ] // DNG_v8.5 D65
},
- { // Quality B,
+ { // Quality B
"make_model": [ "FUJIFILM X100S", "FUJIFILM X100T" ],
"dcraw_matrix": [ 10592,-4262,-1008,-3514,11355,2465,-870,2025,6386 ], // DNG_v8.7 D65
"ranges": { "white": 16100 }
- },
- { // Quality B,
+ },
+
+ { // Quality B
"make_model": "FUJIFILM X70",
"dcraw_matrix": [ 10450,-4329,-878,-3217,11105,2421,-752,1758,6519 ], // DNG_v9.4 D65
- // "raw_crop": [ 4, 0, 4988, 3296 ], // full raw 4992,3296, fuji official 4936,3296 - experimental crop
+ //"raw_crop": [ 4, 0, 4988, 3296 ], // full raw 4992,3296, fuji official 4936,3296 - experimental crop
"ranges": { "white": 16100 }
- },
+ },
- { // Quality B
+ { // Quality B
"make_model": "FUJIFILM X-A2",
"dcraw_matrix": [ 10763,-4560,-917,-3346,11311,2322,-475,1135,5843 ], // DNG D65
"ranges": { "white": 4050 }
},
- { // Quality B
+ { // Quality B
+ "make_model": "FUJIFILM X-A3",
+ "dcraw_matrix": [ 12407,-5222,-1086,-2971,11116,2120,-294,1029,5284 ], // DNGv9.8 D65
+ "ranges": { "white": 4050 }
+ },
+
+ { // Quality B
"make_model": [ "FUJIFILM X-T1", "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
+ //"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
"ranges": { "white": 16100 }
},
- { // Quality B
+ { // Quality B
"make_model": "FUJIFILM X-E2S",
"dcraw_matrix": [ 11562,-5118,-961,-3022,11007,2311,-525,1569,6097 ], // DNG_v9.4 D65
"ranges": { "white": 16100 }
},
- { // Quality B
+ { // Quality B
"make_model": "FUJIFILM X-PRO1",
"dcraw_matrix": [ 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 ], // DNG_v9.4 D65
"ranges": { "white": 4080 }
},
- { // Quality B
+ { // Quality B
"make_model": [ "FUJIFILM X-PRO2", "FUJIFILM X-T2" ],
"dcraw_matrix": [ 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 ], // DNG_v9.4 D65
- // "raw_crop": [ 0, 0, 6032, 4032 ], // full raw 6160,4032, Usable 6032,4032 - experimental crop
+ //"raw_crop": [ 0, 0, 6032, 4032 ], // full raw 6160,4032, Usable 6032,4032 - experimental crop
"ranges": { "white": 16100 }
},
@@ -1182,6 +1146,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know
"dcraw_matrix": [ 10068,-4043,-1068,-5319,14268,1044,-765,1701,6522 ], // DCP D65
"raw_crop": [ 4, 4, -4, -4 ] // full raw 6016x4016, Official 6000x4000
},
+
{ // Quality B, Matrix from Adobe's dcp D65 instead of the internal in Leica's DNG
"make_model": "LEICA SL (Typ 601)",
"dcraw_matrix": [ 11492,-4930,-1188,-5593,14673,873,-609,1474,6343 ], // DNGv9.3 D65
@@ -1198,224 +1163,245 @@ Quality X: unknown, ie we knowing to little about the camera properties to know
{ // Quality A
"make_model": [ "Nikon 1 V3", "Nikon 1 J4" ], // Same format
"dcraw_matrix": [ 5958,-1559,-571,-4021,11453,2939,-634,1548,5087 ], // matrix from DNG_v8.5 d65
- // "dcraw_matrix": [ 5306,-1066,-469,-3865,11189,3076,-399,1341,5120 ], // matrix dXo D50,
- "ranges": { "white": 4080 } // Black is auto extracted from exif, lower WL to 4080 from 4095 due to some non linearity detected at raw highlights
+ //"dcraw_matrix": [ 5306,-1066,-469,-3865,11189,3076,-399,1341,5120 ], // matrix dXo D50,
+ "ranges": { "white": 4080 } // Black is auto extracted from Exif, lower WL to 4080 from 4095 due to some non linearity detected at raw highlights
},
- { // Quality B,
+ { // Quality B
"make_model": "Nikon 1 J5", //
"dcraw_matrix": [ 7520,-2518,-645,-3844,12102,1945,-913,2249,6835 ], // DNG_v9.1 D65
- // "dcraw_matrix": [ 7651,-2102,-751,-3299,11101,1651,-1011,2242,5770 ], // matrix from ICC converted to Dcraw format XYZ on ImagingResource stillife sample
+ //"dcraw_matrix": [ 7651,-2102,-751,-3299,11101,1651,-1011,2242,5770 ], // matrix from ICC converted to dcraw format XYZ on ImagingResource still life sample
"ranges": {
- "white": [
- { "iso": [ 160, 200 ], "levels": 4000 }, // typical G1/G2 4020-4028, R/B 4088
- { "iso": [ 400, 800, 1600, 3200 ], "levels": 4000 }, // g1/g2 4030-4040, r/b 4088
- { "iso": [ 6400, 12800 ], "levels": 4080 } // 4090
- ]
- }
+ "white": [
+ { "iso": [ 160, 200 ], "levels": 4000 }, // typical G1/G2 4020-4028, R/B 4088
+ { "iso": [ 400, 800, 1600, 3200 ], "levels": 4000 }, // g1/g2 4030-4040, r/b 4088
+ { "iso": [ 6400, 12800 ], "levels": 4080 } // 4090
+ ]
+ }
},
- { // Quality A,
+ { // Quality A
"make_model": "Nikon 1 S2", //
"dcraw_matrix": [ 6612,-1342,-618,-3338,11055,2623,-174,1792,5075 ], // matrix from DNG_v8.5 d65
- "ranges": { "white": 4080 } // BL autodetected from exif
+ "ranges": { "white": 4080 } // BL autodetected from Exif
},
-// For all Nikon Dslrs which have multiple bitdepth options (14 and 12 bit) we define the 14-bit value and RT adapts it to 12-bit
+// For all Nikon DSLRs which have multiple bitdepth options (14- and 12-bit) we define the 14-bit value and RT adapts it to 12-bit
// when a 12-bit bitdepth is detected (WL12 = WL14*4095/16383)
- { // quality B, samples by Johan Thor at RT.Issues, measures at long exposures with LENR are missing
- // but a safety margin is included - aperture scaling makes no significant difference
- "make_model": "Nikon D3S",
- "dcraw_matrix": [ 8828,-2406,-694,-4874,12603,2541,-660,1509,7587 ], // dcp d65
- "ranges": {
- "white": [
- { "iso": [ 100, 125, 160, 200, 250, 320, 400, 500 ], "levels": 15520 }, // typical G1,G2 15520-15800 R,B 16383
- { "iso": [ 640, 800, 1000, 1250 ], "levels": 15400 }, // typical G1,G2 15520-15800, R,B 16383
- { "iso": [ 1600, 2000, 2500 ], "levels": 15300 }, // typical G1,G2 15520-15800, R,B 16383
- { "iso": [ 3200, 4000, 5000, 6400 ], "levels": 15300 }, // typical G1/G2 15400-15800, R,B 16383
- { "iso": [ 8000, 10000 ], "levels": 15000 }, // typical G1/G2 15400-15800, R,B 16383
- { "iso": [ 12800, 16000 ], "levels": 14500 }, // typical G1/G2 15400-15800, R,B 16383
- { "iso": [ 20000, 25600 ], "levels": 13300 }, // typical G1/G2 15400-15800, R,B 16383
- { "iso": [ 51200, 102400 ], "levels": 12000 } // typical G1,G1 16270-16350, R,B 16383
- ],
- "white_max": 16383
- }
+ { // Quality B, samples by Johan Thor at RT.Issues, measures at long exposures with LENR are missing
+ // but a safety margin is included - aperture scaling makes no significant difference
+ "make_model": "Nikon D3S",
+ "dcraw_matrix": [ 8828,-2406,-694,-4874,12603,2541,-660,1509,7587 ], // dcp d65
+ "ranges": {
+ "white": [
+ { "iso": [ 100, 125, 160, 200, 250, 320, 400, 500 ], "levels": 15520 }, // typical G1,G2 15520-15800 R,B 16383
+ { "iso": [ 640, 800, 1000, 1250 ], "levels": 15400 }, // typical G1,G2 15520-15800, R,B 16383
+ { "iso": [ 1600, 2000, 2500 ], "levels": 15300 }, // typical G1,G2 15520-15800, R,B 16383
+ { "iso": [ 3200, 4000, 5000, 6400 ], "levels": 15300 }, // typical G1/G2 15400-15800, R,B 16383
+ { "iso": [ 8000, 10000 ], "levels": 15000 }, // typical G1/G2 15400-15800, R,B 16383
+ { "iso": [ 12800, 16000 ], "levels": 14500 }, // typical G1/G2 15400-15800, R,B 16383
+ { "iso": [ 20000, 25600 ], "levels": 13300 }, // typical G1/G2 15400-15800, R,B 16383
+ { "iso": [ 51200, 102400 ], "levels": 12000 } // typical G1,G1 16270-16350, R,B 16383
+ ],
+ "white_max": 16383
+ }
},
- { // quality B, intermediate ISO samples missing
+
+ { // Quality B, intermediate ISO samples missing
"make_model": "Nikon D500",
"dcraw_matrix": [ 8813,-3210,-1036,-4703,12868,2021,-1054,1940,6129 ], // DNG_v9.5 D65
"ranges": {
- "white": [ // measured at integer ISOs. Safety margin per ISO groups according to expected WL spread after LENR
- { "iso": [ 100, 200, 400, 800, 1600 ], "levels": [ 16300, 16100, 16300 ] }, // typical G1,G2 16180 R,B 16383
- { "iso": [ 3200, 6400 ], "levels": [ 16250, 16050, 16250 ] }, // typical G1,G2,16200 R,B 16383
- { "iso": [ 12800, 25600 ], "levels": 16000 }, // typical G1,G2, R,B 16383
- { "iso": [ 51200, 102400 ], "levels": 15800 }, // typical G1,G2, R,B 16383
- { "iso": [ 204800, 409600 ], "levels": 15500 }, // typical G1,G2,R,B 16383
- { "iso": [ 819200, 1638400 ], "levels": 15000 } // typical G1,G2, R,B 16383
- ],
- "white_max": 16383
- }
- },
+ "white": [ // measured at integer ISOs. Safety margin per ISO groups according to expected WL spread after LENR
+ { "iso": [ 100, 200, 400, 800, 1600 ], "levels": [ 16300, 16100, 16300 ] }, // typical G1,G2 16180 R,B 16383
+ { "iso": [ 3200, 6400 ], "levels": [ 16250, 16050, 16250 ] }, // typical G1,G2,16200 R,B 16383
+ { "iso": [ 12800, 25600 ], "levels": 16000 }, // typical G1,G2, R,B 16383
+ { "iso": [ 51200, 102400 ], "levels": 15800 }, // typical G1,G2, R,B 16383
+ { "iso": [ 204800, 409600 ], "levels": 15500 }, // typical G1,G2,R,B 16383
+ { "iso": [ 819200, 1638400 ], "levels": 15000 } // typical G1,G2, R,B 16383
+ ],
+ "white_max": 16383
+ }
+ },
- { // quality B, lacks aperture and ISO scaling, known to exist, but little to gain as the levels are so close to white_max
+ { // Quality B, lacks aperture and ISO scaling, known to exist, but little to gain as the levels are so close to white_max
"make_model": "Nikon D7000",
"dcraw_matrix": [ 7530,-1942,-255,-4318,11390,3362,-926,1694,7649 ], // matrix provided by Tanveer(tsk1979)
"ranges": {
- // measured at ISO 100. ISO differences not measured, but known to exist
- "white": [ 16300, 15700, 16300 ], // typical R 16383, G 15778, B 16383
- "white_max": 16383
- // aperture scaling not measured, but known to exist, at f/1.8 the G channels hits white_max
- }
+ // measured at ISO 100. ISO differences not measured, but known to exist
+ "white": [ 16300, 15700, 16300 ], // typical R 16383, G 15778, B 16383
+ "white_max": 16383
+ // aperture scaling not measured, but known to exist, at f/1.8 the G channels hits white_max
+ }
},
- { // quality B,
+
+ { // Quality B
"make_model": "NIKON COOLPIX A",
"dcraw_matrix": [ 8198,-2239,-724,-4871,12389,2798,-1043,2050,7181 ], // dng_d65
"ranges": {
- "white": [
- { "iso": [ 100, 125, 160, 200, 250, 320, 400, 500, 640, 800 ], "levels": [ 16300, 15700, 16300 ] }, // typical G1,G2 15760-15800 R,B 16383
- { "iso": [ 1000, 1250, 1600, 2000, 2500, 3200 ], "levels": 16300 }, // typical G1,G2, R,B 16383
- { "iso": [ 4000, 5000, 6400 ], "levels": 16200 }, // typical G1,G2, R,B 16383
- { "iso": [ 8000, 10000, 12800 ], "levels": 16000 }, // typical G1,G2,R,B 16383
- { "iso": [ 16000, 20000, 25600 ], "levels": 15700 } // typical G1,G2, R,B 16383
- ],
- "white_max": 16383
- }
+ "white": [
+ { "iso": [ 100, 125, 160, 200, 250, 320, 400, 500, 640, 800 ], "levels": [ 16300, 15700, 16300 ] }, // typical G1,G2 15760-15800 R,B 16383
+ { "iso": [ 1000, 1250, 1600, 2000, 2500, 3200 ], "levels": 16300 }, // typical G1,G2, R,B 16383
+ { "iso": [ 4000, 5000, 6400 ], "levels": 16200 }, // typical G1,G2, R,B 16383
+ { "iso": [ 8000, 10000, 12800 ], "levels": 16000 }, // typical G1,G2,R,B 16383
+ { "iso": [ 16000, 20000, 25600 ], "levels": 15700 } // typical G1,G2, R,B 16383
+ ],
+ "white_max": 16383
+ }
},
- { // Quality B, NO LENR SAMPLES
- "make_model": "Nikon D5",
- "dcraw_matrix": [ 9200,-3522,-992,-5755,13803,2117,-753,1486,6338 ], // adobe dng_v9.5 d65
- "ranges": { "black": 0, "white": 16300 } // WL typical 16383 set to 16300 for safety
+ { // Quality B, no LENR samples
+ "make_model": "Nikon D5",
+ "dcraw_matrix": [ 9200,-3522,-992,-5755,13803,2117,-753,1486,6338 ], // adobe dng_v9.5 d65
+ "ranges": { "black": 0, "white": 16300 } // WL typical 16383 set to 16300 for safety
},
{ // Quality B
- "make_model": "Nikon D3400",
- "dcraw_matrix": [ 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 ], // adobe dng_v9.7 d65
- "ranges": { "white": 16300 } // WL value is for 14-bit files, RT auto adapts it for 12-bit files. WL typical 16383 set to 16300 for safety
+ "make_model": "Nikon D3400",
+ "dcraw_matrix": [ 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 ], // adobe dng_v9.7 d65
+ "ranges": { "white": 16300 } // WL value is for 14-bit files, RT auto adapts it for 12-bit files. WL typical 16383 set to 16300 for safety
},
{ // Quality B
- "make_model": "Nikon D5300",
- "dcraw_matrix": [ 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 ], // adobe dng_v8.8 d65
- "ranges": { "white": 16300 } // WL value is for 14-bit files, RT auto adapts it for 12-bit files. WL typical 16383 set to 16300 for safety
+ "make_model": "Nikon D5300",
+ "dcraw_matrix": [ 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 ], // adobe dng_v8.8 d65
+ "ranges": { "white": 16300 } // WL value is for 14-bit files, RT auto adapts it for 12-bit files. WL typical 16383 set to 16300 for safety
},
{ // Quality B
- "make_model": "Nikon D5500",
- "dcraw_matrix": [ 8821,-2938,-785,-4178,12142,2287,-824,1651,6860 ], // adobe dng_v9.0 d65
- "ranges": { "white": 16300 } // WL value is for 14-bit files, RT auto adapts it for 12-bit files. WL typical 16383 set to 16300 for safety
+ "make_model": [ "Nikon D5500", "Nikon D5600" ],
+ "dcraw_matrix": [ 8821,-2938,-785,-4178,12142,2287,-824,1651,6860 ], // adobe dng_v9.8 d65
+ "ranges": { "white": 16300 } // WL value is for 14-bit files, RT auto adapts it for 12-bit files. WL typical 16383 set to 16300 for safety
},
{ // Quality B
- "make_model": "Nikon D7200",
- "dcraw_matrix": [ 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 ], // adobe dng_v9.0 d65
- "ranges": { "white": 16300 } // WL value is for 14-bit files, RT auto adapts it for 12-bit files. WL typical 16383 set to 16300 for safety,
+ "make_model": "Nikon D7200",
+ "dcraw_matrix": [ 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 ], // adobe dng_v9.0 d65
+ "ranges": { "white": 16300 } // WL value is for 14-bit files, RT auto adapts it for 12-bit files. WL typical 16383 set to 16300 for safety,
},
- { // quality B, samples by joachip at RT forums, are measures at long exposures with LongExposureNoiseReduction
- // aperture scaling known to exist, but little to gain as the levels are so close to white_max
+ { // Quality B, samples by joachip at RT forums, are measures at long exposures with LongExposureNoiseReduction
+ // aperture scaling known to exist, but little to gain as the levels are so close to white_max
"make_model": "Nikon D600",
"dcraw_matrix": [ 8178,-2245,-609,-4857,12394,2776,-1207,2086,7298 ], // dcp d65
- // "raw_crop": [ 0, 0, 6034, 4028 ], // dcraw
+ //"raw_crop": [ 0, 0, 6034, 4028 ], // dcraw
"ranges": {
"white": [
- { "iso": [ 50, 100 ], "levels": [ 15800, 15800, 15350 ] }, // typical G1/G2/R 15879, B 15395-15670 lowered to 15800, 15350, 3969 B3917
- { "iso": [ 200, 400, 800 ], "levels": [ 16300, 15700, 16300 ] }, // 15878, 16383
- { "iso": 1000, "levels": [ 16300, 16100, 16300 ] }, // 12-bit lossless r4095, 3981-10, b4041- 12-bit lossy r,g1,g2 3961 - b3917,
- { "iso": 1600, "levels": [ 16300, 16100, 16300 ] }, // 16145-165, 16383
- { "iso": [ 3200, 6400, 12800, 25600 ], "levels": [ 16300, 16300, 16300 ] } // 16383
- ],
- "white_max": 16383
- }
- },
- { // quality B, missing WL measures at intermediate ISOs (160-250-320 ..) and at long exposures with LongExposureNoiseReduction set to ON
- // aperture scaling known to exist, but little to gain as the levels are so close to white_max
+ { "iso": [ 50, 100 ], "levels": [ 15800, 15800, 15350 ] }, // typical G1/G2/R 15879, B 15395-15670 lowered to 15800, 15350, 3969 B3917
+ { "iso": [ 200, 400, 800 ], "levels": [ 16300, 15700, 16300 ] }, // 15878, 16383
+ { "iso": 1000, "levels": [ 16300, 16100, 16300 ] }, // 12-bit lossless r4095, 3981-10, b4041- 12-bit lossy r,g1,g2 3961 - b3917,
+ { "iso": 1600, "levels": [ 16300, 16100, 16300 ] }, // 16145-165, 16383
+ { "iso": [ 3200, 6400, 12800, 25600 ], "levels": [ 16300, 16300, 16300 ] } // 16383
+ ],
+ "white_max": 16383
+ }
+ },
+
+ { // Quality B, missing WL measures at intermediate ISOs (160-250-320 ..) and at long exposures with LongExposureNoiseReduction set to ON
+ // aperture scaling known to exist, but little to gain as the levels are so close to white_max
"make_model": "Nikon D610",
"dcraw_matrix": [ 8178,-2245,-609,-4857,12394,2776,-1207,2086,7298 ], // dcp d65
"raw_crop": [ 0, 0, 6034, 4028 ],
"ranges": {
"white": [
- { "iso": [ 50, 100 ], "levels": [ 15800, 15700, 15800 ] }, // typical G1/G2 15778, R/B 15879 lowered to 15700, 15800 for possible WL distribution under LENR
- { "iso": [ 200, 400, 800 ], "levels": [ 16300, 15700, 16300 ] }, // 15878, 16383
- { "iso": 1600, "levels": [ 16300, 16100, 16300 ] }, // 16145-165, 16383
- { "iso": [ 3200, 6400, 12800, 25600 ], "levels": [ 16300, 16300, 16300 ] } // 16383
- ],
- "white_max": 16383
- }
- },
+ { "iso": [ 50, 100 ], "levels": [ 15800, 15700, 15800 ] }, // typical G1/G2 15778, R/B 15879 lowered to 15700, 15800 for possible WL distribution under LENR
+ { "iso": [ 200, 400, 800 ], "levels": [ 16300, 15700, 16300 ] }, // 15878, 16383
+ { "iso": 1600, "levels": [ 16300, 16100, 16300 ] }, // 16145-165, 16383
+ { "iso": [ 3200, 6400, 12800, 25600 ], "levels": [ 16300, 16300, 16300 ] } // 16383
+ ],
+ "white_max": 16383
+ }
+ },
- { // quality B; Data from RusselCottrell at RT forums. sensor is not uniform
+ { // Quality B, data from RusselCottrell at RT forums. sensor is not uniform
"make_model": "Nikon D700",
"dcraw_matrix": [ 8139,-2171,-663,-8747,16541,2295,-1925,2008,8093 ],
- // "dcraw_matrix": [ 9336,-3405,14,-7321,14779,2764,-914,1171,8248 ], // illuminant A
+ //"dcraw_matrix": [ 9336,-3405,14,-7321,14779,2764,-914,1171,8248 ], // illuminant A
"ranges": { "white": [ 15500, 15500, 15500 ] }
- // Non linearities start at 15500 (hi ISOs) 15850 (low ISOs) with long exposures (>2sec) and LENR ON .. nominal 15892
- // white 15500 is correct for 14-bit files, for 12-bit files RT auto_calculates it 15500*4095/16383=3874
- },
+ // Non linearities start at 15500 (hi ISOs) 15850 (low ISOs) with long exposures (>2sec) and LENR ON .. nominal 15892
+ // white 15500 is correct for 14-bit files, for 12-bit files RT auto_calculates it 15500*4095/16383=3874
+ },
- { // Quality B,
- "make_model": "Nikon D750",
- "dcraw_matrix": [ 9020,-2890,-715,-4535,12436,2348,-934,1919,7086 ], // adobe dcp d65 DNGv8.7
- "ranges": { "white": 16300 } // WL values for 14-bit files, RT auto adapts it for 12-bit files. TypicalWL 16383 set to 16300 for safety
- },
+ { // Quality B,
+ "make_model": "Nikon D750",
+ "dcraw_matrix": [ 9020,-2890,-715,-4535,12436,2348,-934,1919,7086 ], // adobe dcp d65 DNGv8.7
+ "ranges": { "white": 16300 } // WL values for 14-bit files, RT auto adapts it for 12-bit files. TypicalWL 16383 set to 16300 for safety
+ },
- { // quality B; Data from RussellCottrell at RT forums. Largest aperture scale factor is 1.013, about 1/50th of a stop
+ { // Quality B, data from RussellCottrell at RT forums. Largest aperture scale factor is 1.013, about 1/50th of a stop
"make_model": "Nikon D800E",
"dcraw_matrix": [ 7866,-2108,-555,-4869,12483,2681,-1176,2069,7501 ], // D800/D800E from dcraw.c
"ranges": {
"white": [
- { "iso": [ 100, 125, 160, 200, 250, 320, 400, 500, 640, 800, 1000, 1250 ], "levels": [ 16300, 15700, 16300 ] }, // 15779-15781
- { "iso": [ 1600 ], "levels": 16000 }, // 16085-16113
- { "iso": [ 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 16300 } // 16383
- ]
- }
- },
- { // quality B, WL set at 16300 from nominal 16380 for possible non linearities with LENR
+ { "iso": [ 100, 125, 160, 200, 250, 320, 400, 500, 640, 800, 1000, 1250 ], "levels": [ 16300, 15700, 16300 ] }, // 15779-15781
+ { "iso": [ 1600 ], "levels": 16000 }, // 16085-16113
+ { "iso": [ 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 16300 } // 16383
+ ]
+ }
+ },
+
+ { // Quality B, WL set at 16300 from nominal 16380 for possible non linearities with LENR
"make_model": "Nikon D810",
"dcraw_matrix": [ 9369,-3195,-791,-4488,12430,2301,-893,1796,6872 ], // dcp_v8.6 d65
"raw_crop": [ 0, 0, 7380, 4928 ], // Official raw crop 7380x4928,
"ranges": { "white": 16300 } // WL values for 14-bit files, RT auto adapts it for 12-bit files. Typical WL at 16383
},
- { // Quality b, 16Mp and 64Mp raw frames
+ { // 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
"raw_crop": [ 0, 0, -6, -6 ], // largest valid, full 64Mp 9280x6938, official crop 0 0 9216 6912
"ranges": {
"white": [
- { "iso": [ 100, 200 ], "levels": 3950 }, // normal 4080-4095, HR Dpreview 4047, IR 3956
- { "iso": [ 400, 800, 1600, 3200 ], "levels": 4070 }, // 4070-4095
- { "iso": [ 6400, 12800, 25600 ], "levels": 4040 } // 4000-4095
- ]
- }
+ { "iso": [ 100, 200 ], "levels": 3950 }, // normal 4080-4095, HR Dpreview 4047, IR 3956
+ { "iso": [ 400, 800, 1600, 3200 ], "levels": 4070 }, // 4070-4095
+ { "iso": [ 6400, 12800, 25600 ], "levels": 4040 } // 4000-4095
+ ]
+ }
},
+
{ // Quality B, 20Mp and 80Mp raw frames
"make_model": "OLYMPUS PEN-F",
"dcraw_matrix": [ 9476,-3182,-765,-2613,10958,1893,-449,1315,5268 ], // dng_v9.5 D65
- // "raw_crop": [ 0, 0, 10372, -7780 ], // Highres mode largest valid, full 80Mp 10400X7796, official crop 10 10 10368 7776
+ //"raw_crop": [ 0, 0, 10372, -7780 ], // Highres mode largest valid, full 80Mp 10400X7796, official crop 10 10 10368 7776
"ranges": {
"white": [
- { "iso": [ 100, 200 ], "levels": 3950 }, // normal 4080-4095, HR Dpreview 4047, IR 3956
- { "iso": [ 400, 800, 1600, 3200 ], "levels": 4070 }, // 4070-4095
- { "iso": [ 6400, 12800, 25600 ], "levels": 4040 } // 4000-4095
- ]
- }
+ { "iso": [ 100, 200 ], "levels": 3950 }, // normal 4080-4095, HR Dpreview 4047, IR 3956
+ { "iso": [ 400, 800, 1600, 3200 ], "levels": 4070 }, // 4070-4095
+ { "iso": [ 6400, 12800, 25600 ], "levels": 4040 } // 4000-4095
+ ]
+ }
},
- { // Quality b, missing per ISO samples
+ { // Quality B, 20Mp and 80Mp raw frames,
+ "make_model": "OLYMPUS E-M1MarkII",
+ //"dcraw_matrix": [ 9422,-3258,-711,-2655,10898,2015,-512,1354,5512 ], // E-M5II dng_v9.5 D65
+ "dcraw_matrix": [ 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 ], // beta, dng_v9.8 D65
+ "raw_crop": [ 8, 8, -16, -8 ], // full raw 5240X3912, jpeg top12,left12,5184x3888, full hires 10400X7792, jpeg crop 8,8,10368x7776
+ "ranges": {
+ "white": [
+ { "iso": [ 64, 100, 125, 160, 200, 250, 320, 400 ], "levels": 4090 }, // normal 4095
+ { "iso": [ 500, 640, 800, 1000, 1600 ], "levels": 4080 }, // 4085-4095
+ { "iso": [ 2000, 2500, 3200, 4000, 5000, 6400 ], "levels": 4060 }, // 4085-4095
+ { "iso": [ 12800, 25600, 51200 ], "levels": 4060 } // guess
+ ]
+ }
+ },
+
+ { // Quality B, missing per ISO samples
"make_model": "OLYMPUS E-M1",
"dcraw_matrix": [ 7687,-1984,-606,-4327,11928,2721,-1381,2339,6452 ], // dng d65
"ranges": { "white": 4080 } // nominal 4095-4094, spread with some settings as long exposure
},
- { // Quality b, crop correction
- "make_model": [ "OLYMPUS E-M10", "OLYMPUS E-M10 Mark II" ],
+ { // Quality B, crop correction
+ "make_model": [ "OLYMPUS E-M10", "OLYMPUS E-M10MarkII" ],
"dcraw_matrix": [ 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 ],
"raw_crop": [ 0, 0, 4624, 3472 ], // largest valid - full frame is 4640x3472
-// "raw_crop": [ 4, 4, 4616, 3464 ], // olympus jpeg crop 8, 8, 4608, 3456
+ //"raw_crop": [ 4, 4, 4616, 3464 ], // olympus jpeg crop 8, 8, 4608, 3456
"ranges": { "white": 4080 }
},
+
{ // Quality A, white level correction
"make_model": "OLYMPUS E-PM2",
"dcraw_matrix": [ 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 ],
@@ -1423,8 +1409,8 @@ Quality X: unknown, ie we knowing to little about the camera properties to know
},
{ // Quality B, with long exposure noise reduction White Level gets WL-BL = around 256_12-bit levels less
- "make_model": "OLYMPUS E-PL7",
- "dcraw_matrix": [ 9197,-3190,-659,-2606,10830,2039,-458,1250,5458 ], // DNG_V8.7 D65
+ "make_model": [ "OLYMPUS E-PL7", "OLYMPUS E-PL8" ],
+ "dcraw_matrix": [ 9197,-3190,-659,-2606,10830,2039,-458,1250,5458 ], // DNG_v9.8 D65
"ranges": { "white": 4080 } // nominal 4093
},
@@ -1434,287 +1420,338 @@ Quality X: unknown, ie we knowing to little about the camera properties to know
"ranges": { "white": 4050 } // safe for worst case detected, nominal is 4093
},
- /* since Dcraw_v9.21 Panasonic base BL is read from exif (tags 0x001c BlackLevelRed15 is BL offset.
- Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset, 0x001d BlackLevelGreen, 0x001e BlackLevelBlue
- and we define here the needed offset of around 15. The total BL is base+offset */
+/* Since dcraw_v9.21 Panasonic base BL is read from Exif (tags 0x001c BlackLevelRed15 is BL offset.
+ dcraw/RT read the base black from Exif and calculates total BL = BLbase+BLoffset, 0x001d BlackLevelGreen, 0x001e BlackLevelBlue
+ and we define here the needed offset of around 15. The total BL is base+offset
+*/
- { // Quality B, CameraPhone, some samples are missing but has the same sensor as FZ1000 ..
+ { // Quality B, CameraPhone, some samples are missing but has the same sensor as FZ1000 ..
"make_model": [ "Panasonic DMC-CM1", "Panasonic DMC-CM10" ],
"dcraw_matrix": [ 8770,-3194,-820,-2871,11281,1803,-513,1552,4434 ], // dcp_v8.7 d65
"ranges": {
- "black": 15, // 15 is BL offset. Dcraw/RT read the base BL from exif and calculates total BL = BLbase+BLoffset
- "white": [
- { "iso": 80, "levels": 3600 }, // exif:3277 distribution peak at 3700 up to +/- 100
- { "iso": [ 100, 125, 200, 400, 800, 1600 ], "levels": 4050 }, // exif 4095 distribution 4050-4095
- { "iso": [ 3200, 6400, 12600, 25600 ], "levels": 4080 } // exif 4095 distribution 4080-4095
- ]
- }
+ "black": 15, // 15 is BL offset. dcraw/RT read the base BL from Exif and calculates total BL = BLbase+BLoffset
+ "white": [
+ { "iso": 80, "levels": 3600 }, // Exif:3277 distribution peak at 3700 up to +/- 100
+ { "iso": [ 100, 125, 200, 400, 800, 1600 ], "levels": 4050 }, // Exif 4095 distribution 4050-4095
+ { "iso": [ 3200, 6400, 12600, 25600 ], "levels": 4080 } // Exif 4095 distribution 4080-4095
+ ]
+ }
},
- { // Quality A , replicated from rawimage.cc
+ { // Quality A, replicated from rawimage.cc
"make_model": "Panasonic DMC-FZ150",
"dcraw_matrix": [ 10435,-3208,-72,-2293,10506,2067,-486,1725,4682 ], // RT, copy from custom dcp d55
- "ranges": { "black": 15, "white": 4050 } // 15 is BL offset. Dcraw/RT read the base offset from exif and calculates total BL = BLbase+BLoffset
+ "ranges": { "black": 15, "white": 4050 } // 15 is BL offset. dcraw/RT read the base offset from Exif and calculates total BL = BLbase+BLoffset
},
- { // Quality B,
+ { // Quality B,
"make_model": [ "Panasonic DMC-FZ300", "Panasonic DMC-FZ330" ],
"dcraw_matrix": [ 8378,-2798,-769,-3068,11410,1877,-538,1792,4623 ], // DNG-V9.1.1
- "ranges": { "black": 15, "white": 4050 } // 15 is BL offset. Dcraw/RT read the base offset from exif and calculates total BL = BLbase+BLoffset
+ "ranges": { "black": 15, "white": 4050 } // 15 is BL offset. dcraw/RT read the base offset from Exif and calculates total BL = BLbase+BLoffset
},
- { // Quality A, samples by helices at Rt forums
+ { // Quality A, samples by helices at RT forums
"make_model": [ "Panasonic DMC-FZ1000", "Leica V-LUX (Typ 114)" ],
"dcraw_matrix": [ 7830,-2696,-763,-3325,11667,1866,-641,1712,4824 ], // dcp_v8.6 d65
"ranges": {
- "black": 15, // 15 is BL offset. Dcraw/RT read the base BL from exif and calculates total BL = BLbase+BLoffset
- "white": [
- { "iso": 80, "levels": 3600 }, // exif:3277 distribution peak at 3700 up to +/- 100
- { "iso": [ 100, 125, 200, 400, 800, 1600 ], "levels": 4050 }, // exif 4095 distribution 4050-4095
- { "iso": [ 3200, 6400, 12600, 25600 ], "levels": 4080 } // exif 4095 distribution 4080-4095
- ]
- }
+ "black": 15, // 15 is BL offset. dcraw/RT read the base BL from Exif and calculates total BL = BLbase+BLoffset
+ "white": [
+ { "iso": 80, "levels": 3600 }, // Exif:3277 distribution peak at 3700 up to +/- 100
+ { "iso": [ 100, 125, 200, 400, 800, 1600 ], "levels": 4050 }, // Exif 4095 distribution 4050-4095
+ { "iso": [ 3200, 6400, 12600, 25600 ], "levels": 4080 } // Exif 4095 distribution 4080-4095
+ ]
+ }
},
- { // Quality A, samples by helices at Rt forums and Chris Power at github
+
+ { // Quality B,
+ "make_model": [ "Panasonic DMC-FZ2500", "Panasonic DMC-FZ2000", "Panasonic DMC-FZH1" ],
+ "dcraw_matrix": [ 7386,-2443,-743,-3437,11864,1757,-608,1660,4766 ], // dcp_v9.8 d65
+ "ranges": {
+ "black": 15, // 15 is BL offset. dcraw/RT read the base BL from Exif and calculates total BL = BLbase+BLoffset
+ "white": [
+ { "iso": 80, "levels": 3600 }, // Exif:3277 distribution peak at 3700 up to +/- 100
+ { "iso": [ 100, 125, 200, 400, 800, 1600 ], "levels": 4050 }, // Exif 4095 distribution 4050-4095
+ { "iso": [ 3200, 6400, 12600, 25600 ], "levels": 4080 } // Exif 4095 distribution 4080-4095
+ ]
+ }
+ },
+
+ { // Quality A, samples by helices at RT forums and Chris Power at github
"make_model": [ "Panasonic DMC-ZS100", "Panasonic DMC-ZS110", "Panasonic DMC-TZ100", "Panasonic DMC-TZ101", "Panasonic DMC-TZ110", "Panasonic DMC-TX1" ],
"dcraw_matrix": [ 7790,-2736,-755,-3452,11870,1769,-628,1647,4898 ], // dcp_v8.6 d65
- "raw_crop": [ 4, 4, -4, -4 ], // full raw frame 5488x3664 exif crop 5472X3648 with 8pixel borders. Set the borders at 4 pixels which added with RT's 4 pixels border gives exactly the official frame.
+ "raw_crop": [ 4, 4, -4, -4 ], // full raw frame 5488x3664 Exif crop 5472X3648 with 8pixel borders. Set the borders at 4 pixels which added with RT's 4 pixels border gives exactly the official frame.
"ranges": {
- "black": 15, // 15 is BL offset. Dcraw/RT read the base BL from exif and calculates total BL = BLbase+BLoffset
- "white": [
- { "iso": 80, "levels": 3600 }, // exif:3277 distribution peak at 3700 up to +/- 100
- { "iso": [ 100, 125, 200, 400, 800, 1600 ], "levels": 4050 }, // exif 4095 distribution 4050-4095
- { "iso": [ 3200, 6400, 12600, 25600 ], "levels": 4080 } // exif 4095 distribution 4080-4095
- ]
- }
+ "black": 15, // 15 is BL offset. dcraw/RT read the base BL from Exif and calculates total BL = BLbase+BLoffset
+ "white": [
+ { "iso": 80, "levels": 3600 }, // Exif:3277 distribution peak at 3700 up to +/- 100
+ { "iso": [ 100, 125, 200, 400, 800, 1600 ], "levels": 4050 }, // Exif 4095 distribution 4050-4095
+ { "iso": [ 3200, 6400, 12600, 25600 ], "levels": 4080 } // Exif 4095 distribution 4080-4095
+ ]
+ }
},
- { // Quality A
+
+ { // Quality A
"make_model": [ "Panasonic DMC-LF1", "Leica C (Typ 112)" ],
"dcraw_matrix": [ 9379,-3267,-816,-3227,11560,1881,-926,1928,5340 ],
- "ranges": { "black": 15, "white": 4050 } // 15 is BL offset. Dcraw/RT read the base offset from exif and calculates total BL = BLbase+BLoffset
+ "ranges": { "black": 15, "white": 4050 } // 15 is BL offset. dcraw/RT read the base offset from Exif and calculates total BL = BLbase+BLoffset
},
+
{ // Quality A
"make_model": [ "Panasonic DMC-TZ60", "Panasonic DMC-TZ61", "Panasonic DMC-ZS40", "Panasonic DMC-ZS41" ],
"dcraw_matrix": [ 8607,-2822,-808,-3755,11930,2049,-820,2060,5224 ], // matrix from Adobe dcp v8.4
- "raw_crop": [ 8, 8, -8, -8 ], // crop according to exif 4896 X 3672 plus 4 pixels borders. RT's frame gets smaller than Dcraw but works better with auto distortion
- "ranges": { "black": 14, "white": 4050 } // 15 is BL offset. Dcraw/RT read the base offset from exif and calculates total BL = BLbase+BLoffset
+ "raw_crop": [ 8, 8, -8, -8 ], // crop according to Exif 4896 X 3672 plus 4 pixels borders. RT's frame gets smaller than dcraw but works better with auto distortion
+ "ranges": { "black": 14, "white": 4050 } // 15 is BL offset. dcraw/RT read the base offset from Exif and calculates total BL = BLbase+BLoffset
},
- { // Quality B,
+
+ { // Quality B
"make_model": [ "Panasonic DMC-TZ70", "Panasonic DMC-TZ71", "Panasonic DMC-ZS50", "Panasonic DMC-ZS51" ],
"dcraw_matrix": [ 8802,-3135,-789,-3151,11468,1904,-550,1745,4810 ], // DNG_V8.8 D65
- "raw_crop": [ 4, 4, -4, -4 ], // full raw 4/3 4144x3016 8,8,3008,4008 = 4000X3000. RT's frame gets smaller than Dcraw but works better with auto distortion
+ "raw_crop": [ 4, 4, -4, -4 ], // full raw 4/3 4144x3016 8,8,3008,4008 = 4000X3000. RT's frame gets smaller than dcraw but works better with auto distortion
"ranges": { "black": 14, "white": 4050 } // 12+1+1 is BL offset
},
- // Panasonic DMC-FZ150,G10,G1,G2,G3,G5,GF1,GF2,GF3 are included as overwrites of the same items of rawimage.cc to test the Dcraw9.21 patch
+// Panasonic DMC-FZ150,G10,G1,G2,G3,G5,GF1,GF2,GF3 are included as overwrites of the same items of rawimage.cc to test the dcraw9.21 patch
- { // Quality A, Replicated from rawimage.cc
+ { // Quality A, Replicated from rawimage.cc
"make_model": [ "Panasonic DMC-G10", "Panasonic DMC-G2" ],
"dcraw_matrix": [ 8310,-1811,-960,-4941,12990,2151,-1378,2468,6860 ], // Colin Walker
"ranges": {
- "black": 15, // 15 is black offset, Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset
- "white": [
- { "iso": [ 100, 200, 400, 800 ], "levels": 3920 }, // exif:3967 distribution peak at 3967 +/- up to 50
- { "iso": [ 1600, 3200, 6400 ], "levels": 4060 } // exif 3967, histogram peak 4095 and distribution down to 4070
- ]
- }
- },
- { // Quality A, Replicated from rawimage.cc
+ "black": 15, // 15 is black offset, dcraw/RT read the base black from Exif and calculates total BL = BLbase+BLoffset
+ "white": [
+ { "iso": [ 100, 200, 400, 800 ], "levels": 3920 }, // Exif:3967 distribution peak at 3967 +/- up to 50
+ { "iso": [ 1600, 3200, 6400 ], "levels": 4060 } // Exif 3967, histogram peak 4095 and distribution down to 4070
+ ]
+ }
+ },
+
+ { // Quality A, Replicated from rawimage.cc
"make_model": "Panasonic DMC-G1",
"dcraw_matrix": [ 7477,-1615,-651,-5016,12769,2506,-1380,2475,7240 ], // Colin Walker
"ranges": {
- "black": 15, // 15 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset
- "white": [
- { "iso": [ 100, 200, 400, 800 ], "levels": 3920 }, // exif:4095 distribution peak at 3977 +/- up to 50
- { "iso": [ 1600, 3200 ], "levels": 4060 } // exif 4095, histogram peak 4095 and distribution down to 4070
- ]
- }
+ "black": 15, // 15 is BL offset. dcraw/RT read the base black from Exif and calculates total BL = BLbase+BLoffset
+ "white": [
+ { "iso": [ 100, 200, 400, 800 ], "levels": 3920 }, // Exif:4095 distribution peak at 3977 +/- up to 50
+ { "iso": [ 1600, 3200 ], "levels": 4060 } // Exif 4095, histogram peak 4095 and distribution down to 4070
+ ]
+ }
},
+
{ // Quality A, Replicated from rawimage.cc
"make_model": "Panasonic DMC-G3",
"dcraw_matrix": [ 6051,-1406,-671,-4015,11505,2868,-1654,2667,6219 ], // Colin Walker
"ranges": {
- "black": 15, // 15 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset
- "white": 4060 } // exif:4095 normal distribution 4080-4095, 4070-4095 on long exposure NR
+ "black": 15, // 15 is BL offset. dcraw/RT read the base black from Exif and calculates total BL = BLbase+BLoffset
+ "white": 4060 } // Exif:4095 normal distribution 4080-4095, 4070-4095 on long exposure NR
},
+
{ // Quality A, Replicated from rawimage.cc
"make_model": "Panasonic DMC-G5",
"dcraw_matrix": [ 7122,-2092,-419,-4643,11769,3283,-1363,2413,5944 ], // RT
"ranges": {
- "black": 15, // 15 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset
- "white": 4060 } // exif:4095 normal distribution 4080-4095, 4070-4095 on long exposure NR
+ "black": 15, // 15 is BL offset. dcraw/RT read the base black from Exif and calculates total BL = BLbase+BLoffset
+ "white": 4060 } // Exif:4095 normal distribution 4080-4095, 4070-4095 on long exposure NR
},
+
{ // Quality A, Replicated from rawimage.cc
"make_model": "Panasonic DMC-GF1",
"dcraw_matrix": [ 7863,-2080,-668,-4623,12331,2578,-1020,2066,7266 ], // Colin Walker
"ranges": {
- "black": 15, // 15 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset
- "white": [
- { "iso": [ 100, 200, 400, 800 ], "levels": 3920 }, // exif:4095 distribution peak at 3977 +/- up to 50
- { "iso": [ 1600, 3200 ], "levels": 4060 } // exif 4095, histogram peak 4095 and distribution down to 4070
- ]
- }
+ "black": 15, // 15 is BL offset. dcraw/RT read the base black from Exif and calculates total BL = BLbase+BLoffset
+ "white": [
+ { "iso": [ 100, 200, 400, 800 ], "levels": 3920 }, // Exif:4095 distribution peak at 3977 +/- up to 50
+ { "iso": [ 1600, 3200 ], "levels": 4060 } // Exif 4095, histogram peak 4095 and distribution down to 4070
+ ]
+ }
},
{ // Quality A, Replicated from rawimage.cc
"make_model": "Panasonic DMC-GF2",
"dcraw_matrix": [ 7694,-1791,-745,-4917,12818,2332,-1221,2322,7197 ], // Colin Walker
"ranges": {
- "black": 15, // 15 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset
- "white": 4050 } // exif:4095 normal distribution 4080-4095, 4050-4095 on long exposure NR
+ "black": 15, // 15 is BL offset. dcraw/RT read the base black from Exif and calculates total BL = BLbase+BLoffset
+ "white": 4050 } // Exif:4095 normal distribution 4080-4095, 4050-4095 on long exposure NR
},
+
{ // Quality A, Replicated from rawimage.cc
"make_model": "Panasonic DMC-GF3",
"dcraw_matrix": [ 8074,-1846,-861,-5026,12999,2239,-1320,2375,7422 ], // Colin Walker
"ranges": {
- "black": 15, // 15 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset
- "white": 4050 } // exif:4095 normal distribution 4080-4095, 4050-4095 on long exposure NR
+ "black": 15, // 15 is BL offset. dcraw/RT read the base black from Exif and calculates total BL = BLbase+BLoffset
+ "white": 4050 } // Exif:4095 normal distribution 4080-4095, 4050-4095 on long exposure NR
},
+
{ // Quality A, Replicated from rawimage.cc
"make_model": "Panasonic DMC-GH1",
"dcraw_matrix": [ 6360,-1557,-375,-4201,11504,3086,-1378,2518,5843 ], // Colin Walker
"ranges": {
- "black": 15, // 15 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset
- "white": [
- { "iso": [ 100, 200, 400, 800 ], "levels": 3930 }, // exif:4095 distribution peak at 3982 +/- up to 50
- { "iso": [ 1600, 3200 ], "levels": 4060 } // exif 4095, histogram peak 4095 and distribution down to 4070
- ]
- }
+ "black": 15, // 15 is BL offset. dcraw/RT read the base black from Exif and calculates total BL = BLbase+BLoffset
+ "white": [
+ { "iso": [ 100, 200, 400, 800 ], "levels": 3930 }, // Exif:4095 distribution peak at 3982 +/- up to 50
+ { "iso": [ 1600, 3200 ], "levels": 4060 } // Exif 4095, histogram peak 4095 and distribution down to 4070
+ ]
+ }
},
+
{ // Quality A, Replicated from rawimage.cc
"make_model": "Panasonic DMC-GH2",
- // "dcraw_matrix": [ 6855,-1765,-456,-4223,11600,2996,-1450,2602,5761 ], // Colin Walker - disabled due to problems with underwater
- "dcraw_matrix": [ 7780,-2410,-806,-3913,11724,2484,-1018,2390,5298 ], // Dcraw d65
+ // "dcraw_matrix": [ 6855,-1765,-456,-4223,11600,2996,-1450,2602,5761 ], // Colin Walker - disabled due to problems with underwater
+ "dcraw_matrix": [ 7780,-2410,-806,-3913,11724,2484,-1018,2390,5298 ], // dcraw d65
"ranges": {
- "black": 15, // 15 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset
- "white": [
- { "iso": [ 100, 200, 400, 800 ], "levels": 3930 }, // exif:4095 distribution peak at 3982 +/- up to 50
- { "iso": [ 1600, 3200, 6400, 12800 ], "levels": 4060 } // exif 4095, histogram peak 4095 and distribution down to 4070
- ]
- }
+ "black": 15, // 15 is BL offset. dcraw/RT read the base black from Exif and calculates total BL = BLbase+BLoffset
+ "white": [
+ { "iso": [ 100, 200, 400, 800 ], "levels": 3930 }, // Exif:4095 distribution peak at 3982 +/- up to 50
+ { "iso": [ 1600, 3200, 6400, 12800 ], "levels": 4060 } // Exif 4095, histogram peak 4095 and distribution down to 4070
+ ]
+ }
},
{ // Quality B, variable WL
"make_model": "Panasonic DMC-GH3",
"dcraw_matrix": [ 6559,-1752,-491,-3672,11407,2586,-962,1875,5130 ], // dcp d65
"ranges": {
- "black": 16, // 16 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset
- "white": [
- { "iso": 125, "levels": 3500 }, // gaussian 3600-4095
- { "iso": [ 160, 200, 250, 320, 400, 500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095
- ]
- }
+ "black": 16, // 16 is BL offset. dcraw/RT read the base black from Exif and calculates total BL = BLbase+BLoffset
+ "white": [
+ { "iso": 125, "levels": 3500 }, // gaussian 3600-4095
+ { "iso": [ 160, 200, 250, 320, 400, 500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095
+ ]
+ }
},
{ // Quality B, some ISO WLevels are safely guessed
"make_model": "Panasonic DMC-GH4",
"dcraw_matrix": [ 7122,-2108,-512,-3155,11201,2231,-541,1423,5045 ], // dng_v8.5 d65
"ranges": {
- "black": 16, // 16 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset
- "white": [
- { "iso": 100, "levels": 2700 }, // gaussian center at 2870-2920 range +/- 150, exif 2111
- { "iso": 125, "levels": 3100 }, // guessed
- { "iso": [ 160, 200, 250, 320, 400, 500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095
- ]
- }
+ "black": 16, // 16 is BL offset. dcraw/RT read the base black from Exif and calculates total BL = BLbase+BLoffset
+ "white": [
+ { "iso": 100, "levels": 2700 }, // gaussian center at 2870-2920 range +/- 150, Exif 2111
+ { "iso": 125, "levels": 3100 }, // guessed
+ { "iso": [ 160, 200, 250, 320, 400, 500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095
+ ]
+ }
},
- { // Quality A,
+ { // Quality A
"make_model": "Panasonic DMC-GM1",
"dcraw_matrix": [ 6770,-1895,-744,-5232,13145,2303,-1664,2691,5703 ],
"ranges": {
- "black": 15, // 15 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset
- "white": [
- { "iso": 125, "levels": 3100 }, // bell shape 3150-3650 - exif 2616
- { "iso": 160, "levels": 3600 }, // guessed from relative GX7 data
- { "iso": [ 200, 250, 320, 400, 500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095
- ]
- }
+ "black": 15, // 15 is BL offset. dcraw/RT read the base black from Exif and calculates total BL = BLbase+BLoffset
+ "white": [
+ { "iso": 125, "levels": 3100 }, // bell shape 3150-3650 - Exif 2616
+ { "iso": 160, "levels": 3600 }, // guessed from relative GX7 data
+ { "iso": [ 200, 250, 320, 400, 500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095
+ ]
+ }
},
{ // Quality B, uncertainty about ISO100 WL
"make_model": "Panasonic DMC-GM5",
"dcraw_matrix": [ 8238,-3244,-679,-3921,11814,2384,-836,2022,5852 ], // dng_v8.7 d65
"ranges": {
- "black": 15, // 15 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset
- "white": [
- { "iso": 100, "levels": 2800 }, // bell shape 2850-3250 - exif 2111
- { "iso": [ 200, 250, 320, 400, 500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095
- ]
- }
+ "black": 15, // 15 is BL offset. dcraw/RT read the base black from Exif and calculates total BL = BLbase+BLoffset
+ "white": [
+ { "iso": 100, "levels": 2800 }, // bell shape 2850-3250 - Exif 2111
+ { "iso": [ 200, 250, 320, 400, 500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095
+ ]
+ }
},
- { // Quality A,
+
+ { // Quality A
"make_model": [ "Panasonic DMC-GX7", "Panasonic DMC-GF7", "Panasonic DMC-GF8" ],
"dcraw_matrix": [ 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 ],
"ranges": {
- "black": 15, // 15 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset
- "white": [
- { "iso": 125, "levels": 3100 },
- { "iso": 160, "levels": 3600 },
- { "iso": [ 200, 250, 320, 400,500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095
- ]
- }
+ "black": 15, // 15 is BL offset. dcraw/RT read the base black from Exif and calculates total BL = BLbase+BLoffset
+ "white": [
+ { "iso": 125, "levels": 3100 },
+ { "iso": 160, "levels": 3600 },
+ { "iso": [ 200, 250, 320, 400,500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095
+ ]
+ }
},
- { // Quality A,
+ { // Quality A
"make_model": [ "Panasonic DMC-G7", "Panasonic DMC-G70" ],
- "dcraw_matrix": [ 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 ],// DNG_v9.1 D65
+ "dcraw_matrix": [ 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 ], // DNG_v9.1 D65
"ranges": {
- "black": 16, // 16 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset
- "white": [
- { "iso": 100, "levels": 2300 }, // gaussian 2300-2700 exif_linearitylimit 2111
- { "iso": 125, "levels": 3180 }, // gaussian 3200-3600 exif_linearitylimit 2626
- { "iso": [ 160, 200, 250, 320, 400,500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095
- ]
- }
+ "black": 16, // 16 is BL offset. dcraw/RT read the base black from Exif and calculates total BL = BLbase+BLoffset
+ "white": [
+ { "iso": 100, "levels": 2300 }, // gaussian 2300-2700 Exif_linearitylimit 2111
+ { "iso": 125, "levels": 3180 }, // gaussian 3200-3600 Exif_linearitylimit 2626
+ { "iso": [ 160, 200, 250, 320, 400,500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095
+ ]
+ }
},
- { // Quality B,
+
+ { // Quality B
"make_model": [ "Panasonic DMC-GX80", "Panasonic DMC-GX85", "Panasonic DMC-GX7MK2" ],
- "dcraw_matrix": [ 7771,-3020,-629,-4029,11950,2345,-821,1977,6119 ],// DNG_v9.6 D65
+ "dcraw_matrix": [ 7771,-3020,-629,-4029,11950,2345,-821,1977,6119 ], // DNG_v9.6 D65
"ranges": {
- "black": 16, // 16 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset
- "white": [
- { "iso": 100, "levels": 2300 }, // gaussian 2300-2700 exif_linearitylimit 2111
- { "iso": 125, "levels": 3180 }, // gaussian 3200-3600 exif_linearitylimit 2626
- { "iso": [ 160, 200, 250, 320, 400,500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095
- ]
- }
+ "black": 16, // 16 is BL offset. dcraw/RT read the base black from Exif and calculates total BL = BLbase+BLoffset
+ "white": [
+ { "iso": 100, "levels": 2300 }, // gaussian 2300-2700 Exif_linearitylimit 2111
+ { "iso": 125, "levels": 3180 }, // gaussian 3200-3600 Exif_linearitylimit 2626
+ { "iso": [ 160, 200, 250, 320, 400,500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095
+ ]
+ }
},
+
{ // Quality B, Same as Panasonic G7
"make_model": [ "Panasonic DMC-G8", "Panasonic DMC-G80", "Panasonic DMC-G81", "Panasonic DMC-G85" ],
- "dcraw_matrix": [ 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 ],// DNG_v9.7 D65
+ "dcraw_matrix": [ 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 ], // DNG_v9.7 D65
"ranges": {
- "black": 16, // 16 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset
- "white": [
- { "iso": 100, "levels": 2300 }, // gaussian 2300-2700 exif_linearitylimit 2111
- { "iso": 125, "levels": 3180 }, // gaussian 3200-3600 exif_linearitylimit 2626
- { "iso": [ 160, 200, 250, 320, 400,500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095
- ]
- }
+ "black": 16, // 16 is BL offset. dcraw/RT read the base black from Exif and calculates total BL = BLbase+BLoffset
+ "white": [
+ { "iso": 100, "levels": 2300 }, // gaussian 2300-2700 Exif_linearitylimit 2111
+ { "iso": 125, "levels": 3180 }, // gaussian 3200-3600 Exif_linearitylimit 2626
+ { "iso": [ 160, 200, 250, 320, 400,500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095
+ ]
+ }
},
- { // Quality B,
+
+ { // Quality B
"make_model": "Panasonic DMC-GX8",
"dcraw_matrix": [ 7564,-2263,-606,-3148,11239,2177,-540,1435,4853 ], // DNG_v9.1.1 D65
"ranges": {
- "black": 15, // 16 is BL offset. Dcraw/RT read the base BL from exif and calculates total BL = BLbase+BLoffset
- "white": [
- { "iso": 100, "levels": 2800 }, // gaussian 2900-3200 exif_linearitylimit 2111
- { "iso": 125, "levels": 3180 }, // guessed gaussian 3200-3600 exif_linearitylimit 2626
- { "iso": [ 160, 200, 250, 320, 400,500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095
- ]
- }
+ "black": 15, // 16 is BL offset. dcraw/RT read the base BL from Exif and calculates total BL = BLbase+BLoffset
+ "white": [
+ { "iso": 100, "levels": 2800 }, // gaussian 2900-3200 Exif_linearitylimit 2111
+ { "iso": 125, "levels": 3180 }, // guessed gaussian 3200-3600 Exif_linearitylimit 2626
+ { "iso": [ 160, 200, 250, 320, 400,500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095
+ ]
+ }
},
- { // Quality B, uncertainty about ISO 100 WL
+
+ { // Quality B, samples by Ingo, missing some long exposure at high ISO samples with LENR ON
"make_model": [ "Panasonic DMC-LX100", "Leica D-LUX (Typ 109)" ],
"dcraw_matrix": [ 8844,-3538,-768,-3709,11762,2200,-698,1792,5220 ], // DNG_V8.7 d65
- // "dcraw_matrix": [ 6538,-1614,-549,-5475,13096,2646,-1780,2799,5612 ], // calculated from DxO D50
+ //"dcraw_matrix": [ 6538,-1614,-549,-5475,13096,2646,-1780,2799,5612 ], // calculated from DxO D50
"ranges": {
- "black": 15, // 15 is BL offset. Dcraw/RT read the base BL from exif and calculates total BL = BLbase+BLoffset.
- "white": [
- { "iso": 100, "levels": 2300 }, // gaussian 2400-2700 exif_linearitylimit 2111
- { "iso": [ 160, 200, 250, 320, 400, 500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095
- ]
- }
+ "black": 15, // 15 is BL offset. dcraw/RT read the base BL from Exif and calculates total BL = BLbase+BLoffset.
+ "white": [
+ { "iso": 100, "levels": 2400 }, // gaussian R,B 2450-2700 G1,G2 2550-2800 Exif_linearitylimit 2111
+ { "iso": 125, "levels": 3000 }, // gaussian R,B 3050-3350 G1,G2 3170-3480 Exif_linearitylimit 2626
+ { "iso": 160, "levels": 3800 }, // gaussian R,B 3850-median 4020 G1,G2 3870-median 4050 Exif_linearitylimit 3277
+ { "iso": [ 200, 250, 320, 400 ], "levels": 4080 }, // nominal 4095
+ { "iso": [ 500, 640, 800, 1000, 1250, 1600 ], "levels": 4060 }, // nominal 4095
+ { "iso": [ 2000, 2500 ], "levels": 4040 }, // nominal 4095
+ { "iso": [ 3200, 4000, 5000 ], "levels": 3950 }, // nominal 4095
+ { "iso": [ 6400, 8000, 10000 ], "levels": 4020 }, // nominal 4095
+ { "iso": [ 12800, 16000, 20000, 25600 ], "levels": 4000 } // nominal 4095
+ ]
+ }
+ },
+
+ { // Quality B, Intermediate ISOs missing
+ "make_model": [ "Panasonic DMC-LX9", "Panasonic DMC-LX10", "Panasonic DMC-LX15" ],
+ "dcraw_matrix": [ 7790,-2736,-755,-3452,11870,1769,-628,1647,4898 ], // DNg_v9.8 d65
+ "raw_crop": [ 4, 4, -4, -4 ], // full raw frame 5488x3664 Exif crop 5472X3648 with 8pixel borders. Set the borders at 4 pixels which added with RT's 4 pixels border gives exactly the official frame.
+ "ranges": {
+ "black": 15, // 15 is BL offset. dcraw/RT read the base BL from Exif and calculates total BL = BLbase+BLoffset.
+ "white": [
+ { "iso": 80, "levels": 2800 }, // gaussian 2800-3000 Exif_linearitylimit 2626
+ { "iso": 100, "levels": 3500 }, // gaussian 3500-3700 Exif_linearitylimit 3277
+ { "iso": [ 125, 160, 200, 250, 320, 400, 500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4060 } // nominal 4095
+ ]
+ }
},
{ // Quality B, per ISO info missing
@@ -1723,70 +1760,107 @@ Quality X: unknown, ie we knowing to little about the camera properties to know
"ranges": { "white": 4080 } // nominal at ISO200 4094
},
+ { // Quality B, Intemediate ISO samples missing, Pentax_DNG WLtags are after BL sutraction and not valid
+ "make_model": [ "RICOH PENTAX K-70", "PENTAX K-70" ],
+ //"dcraw_matrix": [ 8050,-2061,-1264,-4359,12953,1515,-1096,1965,6075 ], // PENTAX DNG D65
+ "dcraw_matrix": [ 8766,-3149,-747,-3976,11943,2292,-517,1259,5552 ], // Adobe DNGv9.8 D65
+ "raw_crop": [ 58, 28, 6022, 4020 ], // full frame 6080x4064, usefull raw frame 56,28,6080,4049, official DNG raw_crop 58,28,6080,4052, official jpeg crop 58+8,28+4 6000x4000
+ // "raw_crop": [ 62, 28, 6000, 4000 ], // matched to official jpeg crop 58+8,28+4 6000x4000
+ "ranges": {
+ "white": [
+ { "iso": 100, "levels": 16300 }, // 16319-16377
+ { "iso": 200, "levels": 16250 }, // 16319-16315
+ { "iso": 400, "levels": 16200 }, // 16255-16251
+ { "iso": 800, "levels": 16050 }, // 16255-16120
+ { "iso": 1600, "levels": 15750 }, // 15860
+ { "iso": [ 3200, 6400 ], "levels": 16200 }, // 16350
+ { "iso": [ 12800, 25600 ], "levels": 16100 }, // 16300
+ { "iso": [ 51200, 102400 ], "levels": 16000 } // 16200
+ ]
+ }
+ },
+
+ { // Quality B, Intemediate ISO samples missing, Pentax_DNG WLtags are after BL sutraction and not valid
+ "make_model": [ "RICOH PENTAX K-1", "PENTAX K-1" ],
+ "dcraw_matrix": [ 8596,-2981,-639,-4202,12046,2431,-685,1424,6122 ], // adobe DNG v9.7 D65
+ //"dcraw_matrix": [ 8566,-2746,-1201,-3612,12204,1550,-893,1680,6264 ], // PENTAX DNG
+ "raw_crop": [ 6, 18, 7376, 4932 ], // full frame 7392x4950, cropped to official DNG raw_crop 6,18,7382,4950, official jpeg crop 8,10,7360x4912
+ "ranges": {
+ "white": [
+ { "iso": [ 100, 200, 400, 800 ], "levels": 16300 }, // 16380
+ { "iso": [ 1600, 3200 ], "levels": 16250 }, // 16360
+ { "iso": [ 6400, 12800 ], "levels": 16200 }, // 16330
+ { "iso": [ 25600, 51200 ], "levels": 16100 }, // 16300
+ { "iso": 102400, "levels": 16000 } // 16200
+ ]
+ }
+ },
+
{ // Quality B, intermediate ISOs info missing
"make_model": [ "RICOH PENTAX K-3", "PENTAX K-3" ],
"dcraw_matrix": [ 7415,-2052,-721,-5186,12788,2682,-1446,2157,6773 ], // adobe dcp d65
-// "dcraw_matrix": [ 8542,-2581,-1144,-3995,12301,1881,863,1514,5755 ], // pentax DNG
-// "dcraw_matrix": [ 6464,-1574,-422,-5324,12712,2934,-1129,1724,6900 ], // DxO
+ //"dcraw_matrix": [ 8542,-2581,-1144,-3995,12301,1881,863,1514,5755 ], // pentax DNG
+ //"dcraw_matrix": [ 6464,-1574,-422,-5324,12712,2934,-1129,1724,6900 ], // DxO
"raw_crop": [ 10, 4, 6028, 4024 ],
"ranges": {
- "white": [
- { "iso": 100, "levels": 16310 }, // 16317 or 16350
- { "iso": 200, "levels": 16120 }, // 16254 or 16125
- { "iso": 400, "levels": 15860 }, // 16125 or 15868
- { "iso": 800, "levels": 15360 }, // 15868 or 15364-15370
- { "iso": [ 1600, 3200, 6400, 12800, 25600, 51200 ], "levels": 16300 } // 16383 - pentax dng tag is 15868-15350
- ]
- }
+ "white": [
+ { "iso": 100, "levels": 16310 }, // 16317 or 16350
+ { "iso": 200, "levels": 16120 }, // 16254 or 16125
+ { "iso": 400, "levels": 15860 }, // 16125 or 15868
+ { "iso": 800, "levels": 15360 }, // 15868 or 15364-15370
+ { "iso": [ 1600, 3200, 6400, 12800, 25600, 51200 ], "levels": 16300 } // 16383 - pentax dng tag is 15868-15350
+ ]
+ }
},
{ // Quality B, intermediate ISOs info missing
"make_model": [ "RICOH PENTAX 645Z", "PENTAX 645Z" ],
"dcraw_matrix": [ 9519,-3591,-664,-4074,11725,2671,-624,1501,6653 ], // adobe dcp d65
- "raw_crop": [ 48, 0, 8276, 6208 ],// full sensor 8384x6208 - official jpeg 8256x6192
+ "raw_crop": [ 48, 0, 8276, 6208 ], // full sensor 8384x6208 - official jpeg 8256x6192
"ranges": {
- "white": [
- { "iso": 100, "levels": 16310 }, // 16317 or 16350
- { "iso": 200, "levels": 16120 }, // 16254 or 16125
- { "iso": 400, "levels": 15860 }, // 16125 or 15868
- { "iso": 800, "levels": 15360 }, // 15868 or 15364-15370
- { "iso": [ 1600, 3200, 6400, 12800, 25600, 51200 ], "levels": 16300 } // 16383 - pentax dng tag is 15868-15350
- ]
- }
+ "white": [
+ { "iso": 100, "levels": 16310 }, // 16317 or 16350
+ { "iso": 200, "levels": 16120 }, // 16254 or 16125
+ { "iso": 400, "levels": 15860 }, // 16125 or 15868
+ { "iso": 800, "levels": 15360 }, // 15868 or 15364-15370
+ { "iso": [ 1600, 3200, 6400, 12800, 25600, 51200 ], "levels": 16300 } // 16383 - pentax dng tag is 15868-15350
+ ]
+ }
},
{ // Quality B, intermediate ISOs info missing, spread due to blackframe subtraction guessed to be around 10levels
"make_model": "PENTAX K10D",
"dcraw_matrix": [ 9566,-2863,-803,-7170,15172,2112,-818,803,9705 ], // adobe DNG d65
- // "raw_crop": [ 0, , 3888, 2608 ],
+ //"raw_crop": [ 0, , 3888, 2608 ],
"ranges": {
- "white": [
- { "iso": 100, "levels": 4080 }, // R,G1,B = 4095 G2= 4087
- { "iso": 200, "levels": 4080 }, // R,G1,B = 4093-94 G2= 4087or94
- { "iso": 400, "levels": 4080 }, // R,G1 = 4093-94, B=4094 G2= 4087or93or94
- { "iso": 800, "levels": 4070 }, // R,G1 = 4091-4093, B=4091-92 G2= 4078or82or84-86
- { "iso": [ 1600, 3200 ], "levels": 4060 } // 4067or4073-76
- ]
- }
+ "white": [
+ { "iso": 100, "levels": 4080 }, // R,G1,B = 4095 G2= 4087
+ { "iso": 200, "levels": 4080 }, // R,G1,B = 4093-94 G2= 4087or94
+ { "iso": 400, "levels": 4080 }, // R,G1 = 4093-94, B=4094 G2= 4087or93or94
+ { "iso": 800, "levels": 4070 }, // R,G1 = 4091-4093, B=4091-92 G2= 4078or82or84-86
+ { "iso": [ 1600, 3200 ], "levels": 4060 } // 4067or4073-76
+ ]
+ }
},
- { // Quality B, corrections for raw crop vs Dcraw9.21, matched to Samsung's default
+ { // Quality B, corrections for raw crop vs dcraw9.21, matched to Samsung's default
"make_model": "Samsung NX mini",
"dcraw_matrix": [ 5222,-1196,-550,-6540,14649,2009,-1666,2819,5657 ], // dng 8.6 d65
"raw_crop": [ 128, 36, 5480, 3656 ], // jpeg 5472x3648 - full raw: 5664 x 3710 - Samsung's official crop: 132, 40, 5604, 3688
"ranges": { "white": 4030 } // double clipping point for each channel at a) 4095 and b) bell distribution with peak at 4038 .. used the conservative one
},
- { // Quality A, Conflict with "Samsung NX30" in Dcraw_v9.21_r1.414, frame corrections and color data
+
+ { // Quality A, Conflict with "Samsung NX30" in dcraw_v9.21_r1.414, frame corrections and color data
"make_model": [ "Samsung NX3000", "Samsung NX3300" ],
"dcraw_matrix": [ 8060,-2933,-761,-4504,12890,1762,-630,1489,5227 ], // DNG_v8.7.1 D65
"raw_crop": [ 92, 38, 5480, 3656 ] // jpeg 5472x3648 - full raw: 5600 x 3714 - Samsung's official crop: 96, 42, 5568, 3690
- },
+ },
{ // Quality B, RT normally use the embedded data with DNGs but because various DNG use different color matrix adobe_coeff setting is used in dcraw.cc to always use the data from camconst.json for NX1
"make_model": [ "Samsung NX1", "Samsung NX500" ],
"dcraw_matrix": [ 10686,-4042,-1052,-3595,13238,276,-464,1259,5931 ], // DNG_v8.7 D65
- // "dcraw_matrix": [ 13298,-6099,-296,-5243,16153,-1235,-508,1220,7758 ], // DNG_v8.7 Standard Light A
- // "dcraw_matrix": [ 9598,-3268,-634,-5678,14795,824,-1255,2675,4523 ], // SAMSUNG DNG CONVERTER v1.0
+ //"dcraw_matrix": [ 13298,-6099,-296,-5243,16153,-1235,-508,1220,7758 ], // DNG_v8.7 Standard Light A
+ //"dcraw_matrix": [ 9598,-3268,-634,-5678,14795,824,-1255,2675,4523 ], // SAMSUNG DNG CONVERTER v1.0
"ranges": {
"white": [
{ "iso": 100, "levels": 16000 }, // 16000 typical 16084, LE 16120 and 16383, LENR 16280
@@ -1796,47 +1870,51 @@ Quality X: unknown, ie we knowing to little about the camera properties to know
}
},
- { // Quality c, corrections for frame size, black and white levels not declared properly
+ { // Quality C, corrections for frame size, black and white levels not declared properly
"make_model": "Sigma SD9",
"dcraw_matrix": [ 14996,-3468,-1425,5576,3642,972,1761,3773,3720 ], // experimental calculated from sun0.icc data
- "ranges": { "black": 0, "white": 16383 },// black is already subtracted by dcraw, white copied from x3dump data
+ "ranges": { "black": 0, "white": 16383 }, // black is already subtracted by dcraw, white copied from x3dump data
"raw_crop": [ 20, 8, -18, -12 ]
},
- { // Quality c, corrections for frame size, black level not declared properly
+
+ { // Quality C, corrections for frame size, black level not declared properly
"make_model": "Sigma SD10",
"dcraw_matrix": [ 12555,-1865,-1125,5093,4120,867,1929,3810,3507 ], // experimental calculated from .icc data
- "ranges": { "black": 0, "white": 16383 },// black is already subtracted by dcraw, white copied from x3dump data
- // "raw_crop": [ 0, 0, -0, -0 ]
+ "ranges": { "black": 0, "white": 16383 }, // black is already subtracted by dcraw, white copied from x3dump data
+ //"raw_crop": [ 0, 0, -0, -0 ]
"raw_crop": [ 20, 8, -18, -12 ]
},
- { // Quality c, corrections for frame size, black and white levels not declared properly
+
+ { // Quality C, corrections for frame size, black and white levels not declared properly
"make_model": "Sigma SD14",
"dcraw_matrix": [ 16411,-4764,-2383,8110,2603,-645,3135,3878,1984 ], // experimental inverted icc wp12 - build with BL=15
- // "dcraw_matrix": [ 13804,-4156,-1896,6917,1909,-431,2768,2989,1741 ], // experimental inverted icc wp10 - build with BL=15
- "ranges": { "black": 0, "white": 16383 },// peripheral black stripes give BL around 37
+ //"dcraw_matrix": [ 13804,-4156,-1896,6917,1909,-431,2768,2989,1741 ], // experimental inverted icc wp10 - build with BL=15
+ "ranges": { "black": 0, "white": 16383 }, // peripheral black stripes give BL around 37
"raw_crop": [ 0, 0, -0, -0 ]
- // "raw_crop": [ 18, 12, 2652, 1768 ]
+ //"raw_crop": [ 18, 12, 2652, 1768 ]
},
- { // Quality c, correction for frame width
+ { // Quality C, correction for frame width
"make_model": "Sigma SD1",
"dcraw_matrix": [ 5270,42,-814,3737,5506,124,1112,9714,4510 ], // experimental from icm 1.04477,-0.74838,1.01617, -0.54028,2.52690,-3.83257, 0.54869,-0.69556,3.73746
- "ranges": { "black": 16, "white": 4070 },// BL is 16 or 31, should be measured at the horizontal black stripe at the top
+ "ranges": { "black": 16, "white": 4070 }, // BL is 16 or 31, should be measured at the horizontal black stripe at the top
"raw_crop": [ 12, 52, -110, -8 ]
},
+
{ // Quality C, correction for frame width, color matrix investigated ..
"make_model": "Sigma SD1 Merrill",
"dcraw_matrix": [ 7211,-1577,-769,4996,3428,440,2717,7117,4699 ], // experimental inverted icc cloudy8140 d65
- // "dcraw_matrix": [ 5666,139,-892,3780,5428,270,1366,9757,4526 ], // experimental inverted icc sunny8161
- // "dcraw_matrix": [ 10288,-2449,-1718,8976,1868,-1608,7011,5039,-249 ], // experimental inverted icc tungsten8130 wp11
- // "dcraw_matrix": [ 5864,679,-1491,2963,7635,-919,-640,13738,2790 ], // experimental inverted icc sunny8160
- // "dcraw_matrix": [ 14032,-2231,-1016,-5263,14816,170,-112,183,9113 ], // hardcoded
+ //"dcraw_matrix": [ 5666,139,-892,3780,5428,270,1366,9757,4526 ], // experimental inverted icc sunny8161
+ //"dcraw_matrix": [ 10288,-2449,-1718,8976,1868,-1608,7011,5039,-249 ], // experimental inverted icc tungsten8130 wp11
+ //"dcraw_matrix": [ 5864,679,-1491,2963,7635,-919,-640,13738,2790 ], // experimental inverted icc sunny8160
+ //"dcraw_matrix": [ 14032,-2231,-1016,-5263,14816,170,-112,183,9113 ], // hardcoded
"ranges": { "black": 16, "white": 4070 }, // BL is 16 or 31, should be measured at the horizontal black stripe at the top
"raw_crop": [ 12, 52, -110, -8 ] // for small size all numbers/2
},
+
{ // Quality C, correction for frame width, color matrix measured on a DP1 sample ..
"make_model": [ "Sigma DP1 Merrill", "Sigma DP2 Merrill", "Sigma DP3 Merrill" ],
- // "dcraw_matrix": [ 2149,1003,-530,-494,6073,344,-3935,10665,3608 ], // experimental, inverted icc DP1_Merrill_dpreview_daylight WP1.2
+ //"dcraw_matrix": [ 2149,1003,-530,-494,6073,344,-3935,10665,3608 ], // experimental, inverted icc DP1_Merrill_dpreview_daylight WP1.2
"dcraw_matrix": [ 2517,1175,-621,-587,7080,404,-4677,12402,4231 ], // experimental, inverted icc DP1_Merrill_dpreview_daylight WP1.4
"ranges": { "black": 16, "white": 4070 }, // BL is 16 or 31, should be measured at the horizontal black stripe at the bottom
"raw_crop": [ 12, 0, -110, -62 ] // for small size all numbers/2
@@ -1844,7 +1922,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know
{ // Quality A, correction for color matrix from Colin Walker's d50 to dng d65
"make_model": "Sony NEX-C3",
- // "dcraw_matrix": [ 5130,-1055,-269,-4473,11797,3050,-701,1310,7121 ], // Colin walker's d50 kept for possible consistency issues
+ //"dcraw_matrix": [ 5130,-1055,-269,-4473,11797,3050,-701,1310,7121 ], // Colin walker's d50 kept for possible consistency issues
"dcraw_matrix": [ 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 ],
"ranges": { "black": 512, "white": 16300 }
},
@@ -1855,49 +1933,62 @@ Quality X: unknown, ie we knowing to little about the camera properties to know
"raw_crop": [ 0, 0, 4920, 3276 ],
"ranges": { "black": 512, "white": 16300 }
},
- { // Quality A,
+
+ { // Quality A
"make_model": "Sony ILCA-77M2",
"dcraw_matrix": [ 5991,-1732,-443,-4100,11989,2381,-704,1467,5992 ], // adobe dcp d65
"raw_crop": [ 0, 0, 6024, 4024 ],
"ranges": { "black": 512, "white": 16300 }
},
- { // Quality B,
+ { // Quality B
"make_model": "Sony ILCA-68",
"dcraw_matrix": [ 6435,-1903,-536,-4722,12449,2550,-663,1363,6517 ], // adobe DNGv9.5 d65
"raw_crop": [ 0, 0, -30, 0 ],
"ranges": { "black": 512, "white": 16300 }
},
+ { // Quality B, correction for frame width, crop modes covered
+ "make_model": "Sony ILCA-99M2",
+ "dcraw_matrix": [ 6660,-1918,-471,-4613,12398,2485,-649,1433,6447 ], // DNG_v9.8 D65
+ "raw_crop": [ 0, 0, -36, 0 ], // full raw frame 8000x5320 - 36 rightmost columns are garbage
+ "ranges": { "black": 512, "white": 16300 }
+ },
+
{ // Quality A, correction for frame width
"make_model": [ "Sony ILCE-3000", "Sony ILCE-3500", "Sony ILCE-5000", "Sony ILCE-QX1" ],
"dcraw_matrix": [ 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 ], // adobe dcp d65
"ranges": { "black": 512, "white": 16300 },
"raw_crop": [ 0, 0, 5476, 3656 ]
},
- { // Quality A,
+
+ { // Quality A
"make_model": "Sony ILCE-5100",
"dcraw_matrix": [ 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 ], // adobe dcp d65
"raw_crop": [ 0, 0, 6024, 4024 ],
"ranges": { "black": 512, "white": 16300 }
},
+
{ // Quality A
"make_model": "Sony ILCE-6000",
"dcraw_matrix": [ 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 ], // adobe dcp d65
"raw_crop": [ 0, 0, 6024, 4024 ],
"ranges": { "black": 512, "white": 16300 }
},
+
{ // Quality A
- "make_model": "Sony ILCE-6300",
- "dcraw_matrix": [ 5973,-1695,-419,-3826,11797,2293,-639,1398,5789 ], // DNG_v9.5 D65
+ "make_model": [ "Sony ILCE-6300","Sony ILCE-6500" ],
+ "dcraw_matrix": [ 5973,-1695,-419,-3826,11797,2293,-639,1398,5789 ], // DNG_v9.8 D65
"raw_crop": [ 0, 0, 6024, 4024 ],
"ranges": { "black": 512, "white": 16300 }
},
+
{ // Quality A
"make_model": "Sony ILCE-7M2",
"dcraw_matrix": [ 5271,-712,-347,-6153,13653,2763,-1601,2366,7242 ], // DNGv8.7.1
"ranges": { "black": 512, "white": 16300 }
},
+
{ // Quality A, correction for frame width
"make_model": "Sony ILCE-7R",
"dcraw_matrix": [ 4913,-541,-202,-6130,13513,2906,-1564,2151,7183 ],
@@ -1918,106 +2009,138 @@ Quality X: unknown, ie we knowing to little about the camera properties to know
"raw_crop": [ 0, 0, 4254, 2848 ],
"ranges": { "black": 512, "white": 16300 }
},
- { // Quality A,
- "make_model": [ "Sony DSC-RX100M3", "Sony DSC-RX100M4" ],
- "dcraw_matrix": [ 6596,-2079,-562,-4782,13016,1933,-970,1581,5181 ], // DNG_v9.1.1 D65
+
+ { // Quality A
+ "make_model": [ "Sony DSC-RX100M2", "Sony DSC-RX100M3", "Sony DSC-RX100M4", "Sony DSC-RX100M5" ],
+ "dcraw_matrix": [ 6596,-2079,-562,-4782,13016,1933,-970,1581,5181 ], // DNG_v9.8 D65
"ranges": { "black": 800, "white": 16300 }
},
- { // Quality B,
+
+ { // Quality B
"make_model": [ "Sony DSC-RX10M2", "Sony DSC-RX10M3" ],
"dcraw_matrix": [ 6679,-1825,-745,-5047,13256,1953,-1580,2422,5183 ], // DNG_v9.6 D65
"ranges": { "black": 800, "white": 16300 }
},
- /* Phase One: color matrices borrowed from Adobe DNG Converter, black/white levels tested on actual raw files.
- Note: the dcraw decoder makes black level subtraction and various corrections to the raw values based on
- metadata embedded in the IIQ format, so what we see here is the result after that, ie black level is 0,
- and white level is typically at or close to 65535. However sensors vary a bit and can be noisy around clip
- so we cut away 0.05 stop from top down to 63300 to be a bit conservative. */
- { // quality A
+ { // Quality C, No proper color data, beta samples, frame set to official jpeg,
+ "make_model": "XIAOYI M1",
+ "dcraw_matrix": [ 7158,-1911,-606,-3603,10669,2530,-659,1236,5530 ], // XIAO YI DNG D65
+ "raw_crop": [ 4, 3, 5192, 3896 ], // full raw 5200x3902, official jpeg 5184X3888
+ "ranges": {
+ "white": [
+ { "iso": 100, "levels": 4080 }, // typical 4092-4094
+ { "iso": [ 200, 400, 800, 1600, 3200, 6400 ], "levels": 4080 }, // 4092-4095
+ { "iso": [ 12800, 25600, 51200 ], "levels": 4080 } // 4090-4095
+ ]
+ }
+ },
+
+/* Phase One: color matrices borrowed from Adobe DNG Converter, black/white levels tested on actual raw files.
+ Note: the dcraw decoder makes black level subtraction and various corrections to the raw values based on
+ metadata embedded in the IIQ format, so what we see here is the result after that, ie black level is 0,
+ and white level is typically at or close to 65535. However sensors vary a bit and can be noisy around clip
+ so we cut away 0.05 stop from top down to 63300 to be a bit conservative.
+*/
+
+ { // Quality A
"make_model": [ "Phase One P40+", "Phase One IQ140", "Leaf Credo 40", "Phase One P65+", "Phase One IQ160", "Leaf Credo 60", "Phase One IQ260", "Phase One IQ3 60MP" ],
"dcraw_matrix": [ 8035,435,-962,-6001,13872,2320,-1159,3065,5434 ],
"ranges": { "black": 0, "white": 63300 }
},
- { // quality A
+
+ { // Quality A
"make_model": [ "Phase One IQ180", "Leaf Credo 80", "Phase One IQ280", "Phase One IQ3 80MP" ],
"dcraw_matrix": [ 6294,686,-712,-5435,13417,2211,-1006,2435,5042 ],
"ranges": { "black": 0, "white": 63300 }
},
- { // quality A
+
+ { // Quality A
"make_model": [ "Phase One P20", "Phase One P20+", "Phase One P25", "Phase One P25+" ],
"dcraw_matrix": [ 2905,732,-237,-8135,16626,1476,-3038,4253,7517 ],
"ranges": { "black": 0, "white": 63300 }
},
- { // quality A
+
+ { // Quality A
"make_model": [ "Phase One P21", "Phase One P21+" ],
"dcraw_matrix": [ 6516,-2050,-507,-8217,16703,1479,-3492,4741,8489 ],
"ranges": { "black": 0, "white": 63300 }
},
- { // quality A
+
+ { // Quality A
"make_model": [ "Phase One P30", "Phase One P30+"],
"dcraw_matrix": [ 4516,-244,-36,-7020,14976,2174,-3206,4670,7087 ],
"ranges": { "black": 0, "white": 63300 }
},
- { // quality A
+
+ { // Quality A
"make_model": [ "Phase One P45", "Phase One P45+" ],
"dcraw_matrix": [ 5053,-24,-117,-5685,14077,1703,-2619,4491,5850 ],
"ranges": { "black": 0, "white": 63300 }
},
- { // quality X, matrix taken from H5D-50c which has the same sensor, probably with the same CFA. Color looks good to the eye with files tested.
+
+ { // Quality X, matrix taken from H5D-50c which has the same sensor, probably with the same CFA. Color looks good to the eye with files tested.
"make_model": [ "Phase One IQ250", "Leaf Credo 50", "Phase One IQ3 50MP" ],
- "dcraw_matrix": [ 4932, -835, 141, -4878, 11868, 3437, -1138, 1961, 7067 ],
+ "dcraw_matrix": [ 4932, -835, 141, -4878, 11868, 3437, -1138, 1961, 7067 ],
"ranges": { "black": 0, "white": 64400 } // CMOS sensor, we dare to set white level a bit higher than for the more varying Phase One CCDs
},
- { // quality C, matrix made from crappy cc24 photo
+
+ { // Quality C, matrix made from crappy cc24 photo
"make_model": [ "Phase One IQ3 100MP" ],
"dcraw_matrix": [ 4479,-895,-536,-5818,13569,2742,-1186,2190,7909],
"ranges": { "black": 0, "white": 64400 }
},
+
{ // 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
},
+
{ // Quality A for tested CF-22, the other models have the same sensor
"make_model": [ "Hasselblad CF-22", "Hasselblad CF-22MS", "Hasselblad CFH-22", "Hasselblad H3D-22", "Hasselblad H3DII-22" ],
"dcraw_matrix": [ 8519, -3260, -280, -5081, 13459, 1738, -1449, 2960, 7809 ] // borrowed from Adobe's DNG converter
},
+
{ // Quality A for tested H3D-31, the other models have the same sensor
"make_model": [ "Hasselblad H3D-31", "Hasselblad H3DII-31", "Hasselblad H4D-31" ],
"dcraw_matrix": [ 5458, -1448, 145, -4479, 12338, 2401, -1659, 3086, 6710 ] // borrowed from Adobe's DNG converter
},
+
{ // Quality A for tested CFV-39, the other models have the same sensor. Small filter differences may exist so some might do better with a slightly different profile
"make_model": [ "Hasselblad CF-39", "Hasselblad CF-39MS", "Hasselblad CFH-39", "Hasselblad CFV-39", "Hasselblad H3D-39", "Hasselblad H3DII-39", "Hasselblad H3DII-39MS" ],
"dcraw_matrix": [ 3857, 452, -46, -6008, 14477, 1596, -2627, 4481, 5718 ] // borrowed from Adobe's DNG converter
},
+
{ // Quality A for tested CFV-50, the other models have the same sensor
"make_model": [ "Hasselblad CFV-50", "Hasselblad H3DII-50", "Hasselblad H3DII-50MS", "Hasselblad H4D-50", "Hasselblad H4D-50MS", "Hasselblad H4D-200MS", "Hasselblad H5D-50", "Hasselblad H5D-50MS", "Hasselblad H5D-200MS" ],
- "dcraw_matrix": [ 5656, -659, -346, -3923, 12306, 1791, -1602, 3509, 5442 ] // borrowed from Adobe's DNG converter
- },
- { // Quality A
- "make_model": [ "Hasselblad H4D-40", "Hasselblad H5D-40" ],
- "dcraw_matrix": [ 6159, -1402, -177, -5439, 12762, 3007, -955, 2200, 7104 ] // borrowed from Adobe's DNG converter
- },
- { // Quality A for tested H4D-60, the other models have the same sensor
- "make_model": [ "Hasselblad H4D-60", "Hasselblad H5D-60" ],
- "dcraw_matrix": [ 9662, -684, -279, -4903, 12293, 2950, -344, 1669, 6024 ] // borrowed from Adobe's DNG converter
- },
- { // Quality A
- "make_model": [ "Hasselblad H5D-50c", "Hasselblad CFV-50c" ],
- "dcraw_matrix": [ 4932, -835, 141, -4878, 11868, 3437, -1138, 1961, 7067 ]
+ "dcraw_matrix": [ 5656, -659, -346, -3923, 12306, 1791, -1602, 3509, 5442 ] // borrowed from Adobe's DNG converter
},
- // dummy test entry to test the parser and show the format with all entries active
+ { // Quality A
+ "make_model": [ "Hasselblad H4D-40", "Hasselblad H5D-40" ],
+ "dcraw_matrix": [ 6159, -1402, -177, -5439, 12762, 3007, -955, 2200, 7104 ] // borrowed from Adobe's DNG converter
+ },
+
+ { // Quality A for tested H4D-60, the other models have the same sensor
+ "make_model": [ "Hasselblad H4D-60", "Hasselblad H5D-60" ],
+ "dcraw_matrix": [ 9662, -684, -279, -4903, 12293, 2950, -344, 1669, 6024 ] // borrowed from Adobe's DNG converter
+ },
+
+ { // Quality A
+ "make_model": [ "Hasselblad H5D-50c", "Hasselblad CFV-50c" ],
+ "dcraw_matrix": [ 4932, -835, 141, -4878, 11868, 3437, -1138, 1961, 7067 ]
+ },
+
+ // Dummy test entry to test the parser and show the format with all entries active
{
"make_model": "DummyMake DummyModel",
"dcraw_matrix": [ 7530,-1942,-255,-4318,11390,3362,-926,1694,7649 ],
- "raw_crop": [ 10, 20, 4000, 3000 ],
- "masked_areas": [ 51, 2, 3804, 156, 51, 5794, 3804, 5792 ],
+ "raw_crop": [ 10, 20, 4000, 3000 ],
+ "masked_areas": [ 51, 2, 3804, 156, 51, 5794, 3804, 5792 ],
"ranges": {
- "aperture_scaling": [
- { "aperture": 1.2, "scale_factor": 1.1 },
- { "aperture": 1.4, "scale_factor": 1.08 }
- ],
+ "aperture_scaling": [
+ { "aperture": 1.2, "scale_factor": 1.1 },
+ { "aperture": 1.4, "scale_factor": 1.08 }
+ ],
"black": [
{ "iso": 100 , "levels": [ 10, 20, 10, 20 ] },
{ "iso": [100, 200] , "levels": [ 30, 40, 30 ] },
@@ -2027,7 +2150,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know
{ "iso": 100 , "levels": [ 10000, 11000, 10000, 11000 ] },
{ "iso": 3200, "levels": [ 11000, 11000, 10000, 11000 ] }
],
- "white_max": 16383
+ "white_max": 16383
}
}
]}
diff --git a/rtengine/cfa_linedn_RT.cc b/rtengine/cfa_linedn_RT.cc
index 78da79bb5..21fcfb1e5 100644
--- a/rtengine/cfa_linedn_RT.cc
+++ b/rtengine/cfa_linedn_RT.cc
@@ -68,11 +68,10 @@ void RawImageSource::CLASS cfa_linedn(float noise)
{
// allocate memory and assure the arrays don't have same 64 byte boundary to avoid L1 conflict misses
- char *buffer = (char*)malloc(4 * TS * TS * sizeof(float) + 3 * 64);
- float *cfain = (float*)(buffer);
- float *cfablur = (float*)(buffer + (TS * TS * sizeof(float)) + 1 * 64);
- float *cfadiff = (float*)(buffer + (2 * TS * TS * sizeof(float)) + 2 * 64);
- float *cfadn = (float*)(buffer + (3 * TS * TS * sizeof(float)) + 3 * 64);
+ float *cfain = (float*)malloc(4 * TS * TS * sizeof(float) + 3 * 16 * sizeof(float));
+ float *cfablur = (cfain + (TS * TS) + 1 * 16);
+ float *cfadiff = (cfain + (2 * TS * TS) + 2 * 16);
+ float *cfadn = (cfain + (3 * TS * TS) + 3 * 16);
float linehvar[4], linevvar[4], noisefactor[4][8][2], coeffsq;
@@ -250,7 +249,7 @@ void RawImageSource::CLASS cfa_linedn(float noise)
}
// clean up
- free(buffer);
+ free(cfain);
// copy temporary buffer back to image matrix
#pragma omp for
diff --git a/rtengine/cieimage.cc b/rtengine/cieimage.cc
index 87954e1f0..be122febf 100644
--- a/rtengine/cieimage.cc
+++ b/rtengine/cieimage.cc
@@ -15,7 +15,7 @@ CieImage::CieImage (int w, int h) : fromImage(false), W(w), H(h)
// Initialize the pointers to zero
for (unsigned int c = 0; c < 6; ++c) {
- data[c] = NULL;
+ data[c] = nullptr;
}
// Trying to allocate all in one block
diff --git a/rtengine/cieimage.h b/rtengine/cieimage.h
index a97622325..23b080ae3 100644
--- a/rtengine/cieimage.h
+++ b/rtengine/cieimage.h
@@ -20,11 +20,13 @@
#define _CIEIMAGE_H_
#include "image16.h"
+#include "noncopyable.h"
namespace rtengine
{
-class CieImage
+class CieImage :
+ public NonCopyable
{
private:
bool fromImage;
diff --git a/rtengine/clutstore.h b/rtengine/clutstore.h
index 7383b597f..5e4930fa1 100644
--- a/rtengine/clutstore.h
+++ b/rtengine/clutstore.h
@@ -7,16 +7,16 @@
#include "cache.h"
#include "alignedbuffer.h"
+#include "noncopyable.h"
namespace rtengine
{
-class HaldCLUT
+class HaldCLUT final :
+ public NonCopyable
{
public:
HaldCLUT();
- HaldCLUT(const HaldCLUT& other) = delete;
- HaldCLUT& operator =(const HaldCLUT& other) = delete;
~HaldCLUT();
bool load(const Glib::ustring& filename);
@@ -51,14 +51,12 @@ private:
Glib::ustring clut_profile;
};
-class CLUTStore
+class CLUTStore final :
+ public NonCopyable
{
public:
static CLUTStore& getInstance();
- CLUTStore(const CLUTStore& other) = delete;
- CLUTStore& operator =(const CLUTStore& other) = delete;
-
std::shared_ptr getClut(const Glib::ustring& filename);
void clearCache();
diff --git a/rtengine/color.cc b/rtengine/color.cc
index 58dc60320..5cf1d45b1 100644
--- a/rtengine/color.cc
+++ b/rtengine/color.cc
@@ -23,6 +23,7 @@
#include "mytime.h"
#include "sleef.c"
#include "opthelper.h"
+#include "iccstore.h"
#define pow_F(a,b) (xexpf(b*xlogf(a)))
@@ -350,7 +351,7 @@ void Color::init ()
#ifdef _OPENMP
#pragma omp section
#endif
- linearGammaTRC = cmsBuildGamma(NULL, 1.0);
+ linearGammaTRC = cmsBuildGamma(nullptr, 1.0);
}
}
@@ -361,6 +362,153 @@ void Color::cleanup ()
}
}
+void Color::rgb2lab (Glib::ustring profile, Glib::ustring profileW, int r, int g, int b, float &LAB_l, float &LAB_a, float &LAB_b, bool workingSpace)
+{
+ double xyz_rgb[3][3];
+ const double ep = 216.0 / 24389.0;
+ const double ka = 24389.0 / 27.0;
+
+ double var_R = r / 65535.0;
+ double var_G = g / 65535.0;
+ double var_B = b / 65535.0;
+
+ Glib::ustring profileCalc;
+ profileCalc = "sRGB"; //default
+
+ if (workingSpace) {
+ profileCalc = profileW; //display working
+ }
+
+ else {// if you want display = output space
+ if (profile == "RT_sRGB" || profile == "RT_sRGB_gBT709" || profile == "RT_sRGB_g10") {
+ profileCalc = "sRGB";
+ }
+
+ if (profile == "ProPhoto" || profile == "RT_Large_gBT709" || profile == "RT_Large_g10" || profile == "RT_Large_gsRGB") {
+ profileCalc = "ProPhoto";
+ }
+
+ if (profile == "AdobeRGB1998" || profile == "RT_Medium_gsRGB") {
+ profileCalc = "Adobe RGB";
+ }
+
+ if (profile == "WideGamutRGB") {
+ profileCalc = "WideGamut";
+ }
+ }
+
+ if (workingSpace) {//display working
+ if (profileW == "sRGB") { //apply sRGB inverse gamma
+
+ if ( var_R > 0.04045 ) {
+ var_R = pow ( ( ( var_R + 0.055 ) / 1.055 ), rtengine::Color::sRGBGammaCurve);
+ } else {
+ var_R = var_R / 12.92;
+ }
+
+ if ( var_G > 0.04045 ) {
+ var_G = pow ( ( ( var_G + 0.055 ) / 1.055 ), rtengine::Color::sRGBGammaCurve);
+ } else {
+ var_G = var_G / 12.92;
+ }
+
+ if ( var_B > 0.04045 ) {
+ var_B = pow ( ( ( var_B + 0.055 ) / 1.055 ), rtengine::Color::sRGBGammaCurve);
+ } else {
+ var_B = var_B / 12.92;
+ }
+ } else if (profileW == "ProPhoto") { // apply inverse gamma 1.8
+ var_R = pow ( var_R, 1.8);
+ var_G = pow ( var_G, 1.8);
+ var_B = pow ( var_B, 1.8);
+ } else { // apply inverse gamma 2.2
+ var_R = pow ( var_R, 2.2);
+ var_G = pow ( var_G, 2.2);
+ var_B = pow ( var_B, 2.2);
+ }
+ } else { //display outout profile
+
+ if (profile == "RT_sRGB" || profile == "RT_Large_gsRGB" || profile == "RT_Medium_gsRGB") { //apply sRGB inverse gamma
+ if ( var_R > 0.04045 ) {
+ var_R = pow ( ( ( var_R + 0.055 ) / 1.055 ), rtengine::Color::sRGBGammaCurve);
+ } else {
+ var_R = var_R / 12.92;
+ }
+
+ if ( var_G > 0.04045 ) {
+ var_G = pow ( ( ( var_G + 0.055 ) / 1.055 ), rtengine::Color::sRGBGammaCurve);
+ } else {
+ var_G = var_G / 12.92;
+ }
+
+ if ( var_B > 0.04045 ) {
+ var_B = pow ( ( ( var_B + 0.055 ) / 1.055 ), rtengine::Color::sRGBGammaCurve);
+ } else {
+ var_B = var_B / 12.92;
+ }
+ }
+
+ else if (profile == "RT_sRGB_gBT709" || profile == "RT_Large_gBT709") { //
+ if ( var_R > 0.0795 ) {
+ var_R = pow ( ( ( var_R + 0.0954 ) / 1.0954 ), 2.2);
+ } else {
+ var_R = var_R / 4.5;
+ }
+
+ if ( var_G > 0.0795 ) {
+ var_G = pow ( ( ( var_G + 0.0954 ) / 1.0954 ), 2.2);
+ } else {
+ var_G = var_G / 4.5;
+ }
+
+ if ( var_B > 0.0795 ) {
+ var_B = pow ( ( ( var_B + 0.0954 ) / 1.0954 ), 2.2);
+ } else {
+ var_B = var_B / 4.5;
+ }
+
+ } else if (profile == "ProPhoto") { // apply inverse gamma 1.8
+
+ var_R = pow ( var_R, 1.8);
+ var_G = pow ( var_G, 1.8);
+ var_B = pow ( var_B, 1.8);
+ } else if (profile == "RT_sRGB_g10" || profile == "RT_Large_g10") { // apply inverse gamma 1.8
+
+ var_R = pow ( var_R, 1.);
+ var_G = pow ( var_G, 1.);
+ var_B = pow ( var_B, 1.);
+ }
+
+ else {// apply inverse gamma 2.2
+ var_R = pow ( var_R, 2.2);
+ var_G = pow ( var_G, 2.2);
+ var_B = pow ( var_B, 2.2);
+ }
+ }
+
+ // TMatrix wprof = rtengine::ICCStore::getInstance()->workingSpaceMatrix (profileW);
+
+ TMatrix wprof = rtengine::ICCStore::getInstance()->workingSpaceMatrix (profileCalc);
+
+ for (int m = 0; m < 3; m++)
+ for (int n = 0; n < 3; n++) {
+ xyz_rgb[m][n] = wprof[m][n];
+ }
+
+ double varxx, varyy, varzz;
+ double var_X = ( xyz_rgb[0][0] * var_R + xyz_rgb[0][1] * var_G + xyz_rgb[0][2] * var_B ) / Color::D50x;
+ double var_Y = ( xyz_rgb[1][0] * var_R + xyz_rgb[1][1] * var_G + xyz_rgb[1][2] * var_B ) ;
+ double var_Z = ( xyz_rgb[2][0] * var_R + xyz_rgb[2][1] * var_G + xyz_rgb[2][2] * var_B ) / Color::D50z;
+
+ varxx = var_X > ep ? cbrt(var_X) : ( ka * var_X + 16.0) / 116.0 ;
+ varyy = var_Y > ep ? cbrt(var_Y) : ( ka * var_Y + 16.0) / 116.0 ;
+ varzz = var_Z > ep ? cbrt(var_Z) : ( ka * var_Z + 16.0) / 116.0 ;
+ LAB_l = ( 116 * varyy ) - 16;
+ LAB_a = 500 * ( varxx - varyy );
+ LAB_b = 200 * ( varyy - varzz );
+
+}
+
void Color::rgb2hsl(float r, float g, float b, float &h, float &s, float &l)
{
@@ -395,7 +543,7 @@ void Color::rgb2hsl(float r, float g, float b, float &h, float &s, float &l)
h_ = 4. + (var_R - var_G) / C;
}
- h = float(h_ /= 6.0);
+ h = float(h_ / 6.0);
if ( h < 0.f ) {
h += 1.f;
@@ -776,7 +924,7 @@ void Color::hsv2rgb (float h, float s, float v, int &r, int &g, int &b)
r1 = t;
g1 = p;
b1 = v;
- } else if (i == 5) {
+ } else /*if (i == 5)*/ {
r1 = v;
g1 = p;
b1 = q;
@@ -1500,7 +1648,7 @@ void Color::interpolateRGBColor (float realL, float iplow, float iphigh, int alg
Color::xyz2rgb(X, Y, Z, ro, go, bo, rgb_xyz);// ro go bo in gamut
}
-void Color::calcGamma (double pwr, double ts, int mode, int imax, double &gamma0, double &gamma1, double &gamma2, double &gamma3, double &gamma4, double &gamma5)
+void Color::calcGamma (double pwr, double ts, int mode, int imax, GammaValues &gamma)
{
//from Dcraw (D.Coffin)
int i;
@@ -1536,12 +1684,13 @@ void Color::calcGamma (double pwr, double ts, int mode, int imax, double &gamma0
}
if (!mode--) {
- gamma0 = g[0];
- gamma1 = g[1];
- gamma2 = g[2];
- gamma3 = g[3];
- gamma4 = g[4];
- gamma5 = g[5];
+ 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;
}
}
@@ -1849,7 +1998,6 @@ void Color::skinred ( double J, double h, double sres, double Sp, float dred, fl
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 protect_redh;
float deltaHH = 0.3f; //HH value transition : I have choice 0.3 radians
float HH;
bool doskin = false;
@@ -1930,7 +2078,6 @@ void Color::skinredfloat ( float J, float h, float sres, float Sp, float dred, f
if(doskin) {
float factorskin, factorsat, factor, factorskinext;
- float protect_redh;
float deltaHH = 0.3f; //HH value transition : I have choice 0.3 radians
float chromapro = sres / Sp;
@@ -2101,7 +2248,7 @@ void Color::AllMunsellLch(bool lumaMuns, float Lprov1, float Loldd, float HH, fl
correctionHueLum = 0.0;
- if(contin1 == true && contin2 == true) {
+ if(contin1 && contin2) {
correctlum = correctlumprov2 - correctlumprov;
}
@@ -2491,7 +2638,7 @@ SSEFUNCTION void Color::LabGamutMunsell(float *labL, float *laba, float *labb,
MyTime t1e, t2e;
t1e.set();
int negat = 0, moreRGB = 0;
- MunsellDebugInfo* MunsDebugInfo = NULL;
+ MunsellDebugInfo* MunsDebugInfo = nullptr;
if (corMunsell) {
MunsDebugInfo = new MunsellDebugInfo();
@@ -2610,8 +2757,8 @@ SSEFUNCTION void Color::LabGamutMunsell(float *labL, float *laba, float *labb,
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=%i\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=%i\n", MunsDebugInfo->maxdhuelum[0] , MunsDebugInfo->maxdhuelum[1], MunsDebugInfo->maxdhuelum[2], MunsDebugInfo->maxdhuelum[3], MunsDebugInfo->depassLum);
+ 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");
}
diff --git a/rtengine/color.h b/rtengine/color.h
index 350cd3b2a..77db1f4f7 100644
--- a/rtengine/color.h
+++ b/rtengine/color.h
@@ -17,20 +17,23 @@
* along with RawTherapee. If not, see .
*/
-#ifndef _COLOR_H_
-#define _COLOR_H_
+#pragma once
+
+#include
#include "rt_math.h"
#include "LUT.h"
#include "labimage.h"
-#include "iccstore.h"
#include "iccmatrices.h"
#include "sleef.c"
+
#define SAT(a,b,c) ((float)max(a,b,c)-(float)min(a,b,c))/(float)max(a,b,c)
namespace rtengine
{
+typedef std::array GammaValues;
+
#ifdef _DEBUG
class MunsellDebugInfo
@@ -47,6 +50,7 @@ public:
#endif
+
class Color
{
@@ -175,6 +179,22 @@ public:
}
+ /**
+ * @brief Convert red/green/blue to L*a*b
+ * @brief Convert red/green/blue to hue/saturation/luminance
+ * @param profile output profile name
+ * @param profileW working profile name
+ * @param r red channel [0 ; 65535]
+ * @param g green channel [0 ; 65535]
+ * @param b blue channel [0 ; 65535]
+ * @param L Lab L channel [0 ; 1] (return value)
+ * @param a Lab a channel [0 ; 1] (return value)
+ * @param b Lab b channel [0; 1] (return value)
+ * @param workingSpace true: compute the Lab value using the Working color space ; false: use the Output color space
+ */
+ static void rgb2lab (Glib::ustring profile, Glib::ustring profileW, int r, int g, int b, float &LAB_l, float &LAB_a, float &LAB_b, bool workingSpace);
+
+
/**
* @brief Convert red/green/blue to hue/saturation/luminance
* @param r red channel [0 ; 65535]
@@ -864,21 +884,21 @@ public:
return h;
}
-
/**
* @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 gamma0 used in ip2Lab2rgb [0 ; 1], usually near 0.5 (return value)
- * @param gamma1 used in ip2Lab2rgb [0 ; 20], can be superior to 20, but it's quite unusual(return value)
- * @param gamma2 used in ip2Lab2rgb [0 ; 1], usually near 0.03(return value)
- * @param gamma3 used in ip2Lab2rgb [0 ; 1], usually near 0.003(return value)
- * @param gamma4 used in ip2Lab2rgb [0 ; 1], usually near 0.03(return value)
- * @param gamma5 used in ip2Lab2rgb [0 ; 1], usually near 0.5 (return value)
+ * @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)
+ * gamma2 used in ip2Lab2rgb [0 ; 1], usually near 0.03(return value)
+ * gamma3 used in ip2Lab2rgb [0 ; 1], usually near 0.003(return value)
+ * 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, int imax, double &gamma0, double &gamma1, double &gamma2, double &gamma3, double &gamma4, double &gamma5);
+ static void calcGamma (double pwr, double ts, int mode, int imax, GammaValues &gamma);
/**
@@ -1662,5 +1682,3 @@ public:
};
}
-
-#endif
diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc
index 1514357d8..5cf880b41 100644
--- a/rtengine/colortemp.cc
+++ b/rtengine/colortemp.cc
@@ -1025,7 +1025,7 @@ void ColorTemp::cieCAT02(double Xw, double Yw, double Zw, double &CAM02BB00, dou
}
-void ColorTemp::temp2mulxyz (double tem, double gree, std::string method , double &Xxyz, double &Zxyz)
+void ColorTemp::temp2mulxyz (double tem, double gree, const std::string &method, double &Xxyz, double &Zxyz)
{
double xD, yD, x_D, y_D, interm;
double x, y, z;
@@ -1100,7 +1100,7 @@ void ColorTemp::temp2mulxyz (double tem, double gree, std::string method , doubl
x_D = -4.6070e9 / (tem * tem * tem) + 2.9678e6 / (tem * tem) + 0.09911e3 / tem + 0.244063;
} else if (tem <= 25000) {
x_D = -2.0064e9 / (tem * tem * tem) + 1.9018e6 / (tem * tem) + 0.24748e3 / tem + 0.237040;
- } else if (tem > 25000) {
+ } else /*if (tem > 25000)*/ {
x_D = -2.0064e9 / (tem * tem * tem) + 1.9018e6 / (tem * tem) + 0.24748e3 / tem + 0.237040 - ((tem - 25000) / 25000) * 0.025; //Jacques empirical adjustemnt for very high temp (underwater !)
}
@@ -1135,12 +1135,10 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul,
//printf("temp=%d green=%.3f equal=%.3f\n", (int)temp, (float) green, (float) equal);
//variables for CRI and display Lab, and palette
- bool CRI_type = false;
double xD, yD, x_D, y_D, interm;
double m1, m2;
- double xp, yp;
- double x, y, z, xx, yy, zz;
+ double x, y, z;
double Xchk[50], Ychk[50], Zchk[50]; //50 : I think it's a good limit for number of color : for CRI and Palette
double Xcam02[50], Ycam02[50], Zcam02[50];
double Xcam02pal[50], Ycam02pal[50], Zcam02pal[50];
@@ -1148,16 +1146,12 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul,
double XchkLamp[50], YchkLamp[50], ZchkLamp[50];
double Xcam02Lamp[50], Ycam02Lamp[50], Zcam02Lamp[50];
double Xpal[50], Ypal[50], Zpal[50];
- double tempw;
const double epsilon = 0.008856; //Lab
const double whiteD50[3] = {0.9646019585, 1.0, 0.8244507152}; //calculate with this tool : spect 5nm
double CAM02BB00, CAM02BB01, CAM02BB02, CAM02BB10, CAM02BB11, CAM02BB12, CAM02BB20, CAM02BB21, CAM02BB22; //for CIECAT02
double xr[50], yr[50], zr[50];
double fx[50], fy[50], fz[50];
- double Llamp[50], alamp[50], blamp[50];
- double Lbb[50], abb[50], bbb[50];
- double Lpal[50], apal[50], bpal[50];
int palet = -1;
bool palette = false;
@@ -1263,7 +1257,7 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul,
x_D = -4.6070e9 / (temp * temp * temp) + 2.9678e6 / (temp * temp) + 0.09911e3 / temp + 0.244063;
} else if (temp <= 25000) {
x_D = -2.0064e9 / (temp * temp * temp) + 1.9018e6 / (temp * temp) + 0.24748e3 / temp + 0.237040;
- } else if (temp > 25000) { // above 25000 it's unknown..then I have modified to adjust for underwater
+ } else /*if (temp > 25000)*/ { // above 25000 it's unknown..then I have modified to adjust for underwater
x_D = -2.0064e9 / (temp * temp * temp) + 1.9018e6 / (temp * temp) + 0.24748e3 / temp + 0.237040 - ((temp - 25000) / 25000) * 0.025; //Jacques empirical adjustemnt for very high temp (underwater !)
}
@@ -1291,8 +1285,6 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul,
double Xwb = xD / yD;
double Ywb = 1.0;
double Zwb = (1.0 - xD - yD) / yD;
- double correl_temp;
-
if (settings->verbose) {
// double u=4*xD/(-2*xD+12*yD+3);
@@ -1335,11 +1327,6 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul,
{
double x_x, y_y, z_z;
// illuminants
- const double* spect_illummax[] = {
- Daylight5300_spect, Cloudy6200_spect, Shade7600_spect, A2856_spect, FluoF1_spect, FluoF2_spect, FluoF3_spect, FluoF4_spect, FluoF5_spect, FluoF6_spect, FluoF7_spect,
- FluoF8_spect, FluoF9_spect, FluoF10_spect, FluoF11_spect, FluoF12_spect, HMI_spect, GTI_spect, JudgeIII_spect, Solux3500_spect, Solux4100_spect, Solux4700_spect, NG_Solux4700_spect, NG_CRSSP12WWMR16_spect, NG_CRSSP12WWMR16_spect,
- Flash5500_spect, Flash6000_spect, Flash6500_spect
- };
// color
const double* spec_colorpalet[] = {
ColabSkin98_m2_10_spect, ColabSkin95_0_4_spect, ColabSkin91_4_14_spect, ColabSkin90_m1_20_spect,
@@ -1359,13 +1346,18 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul,
int N_col = sizeof(spec_colorpalet) / sizeof(spec_colorpalet[0]); //number of color
if(palet < 28) {
+ const double* spect_illummax[] = {
+ Daylight5300_spect, Cloudy6200_spect, Shade7600_spect, A2856_spect, FluoF1_spect, FluoF2_spect, FluoF3_spect, FluoF4_spect, FluoF5_spect, FluoF6_spect, FluoF7_spect,
+ FluoF8_spect, FluoF9_spect, FluoF10_spect, FluoF11_spect, FluoF12_spect, HMI_spect, GTI_spect, JudgeIII_spect, Solux3500_spect, Solux4100_spect, Solux4700_spect, NG_Solux4700_spect, NG_CRSSP12WWMR16_spect, NG_CRSSP12WWMR16_spect,
+ Flash5500_spect, Flash6000_spect, Flash6500_spect
+ };
for(int i = 0; i < N_col; i++) {
spectrum_to_color_xyz_preset(spec_colorpalet[i], spect_illummax[palet], x_x, y_y, z_z);
Xpal[i] = x_x;
Ypal[i] = y_y;
Zpal[i] = z_z;
}
- } else if(palet >= 28) {
+ } else /*if(palet >= 28)*/ {
if(temp < INITIALBLACKBODY) {
for(int i = 0; i < N_col; i++) {
spectrum_to_color_xyz_blackbody(spec_colorpalet[i], temp, x_x, y_y, z_z);
@@ -1387,8 +1379,8 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul,
}
}
- xp = xD;
- yp = yD;
+ double xp = xD;
+ double yp = yD;
double Xwbpal = xp / yp; //white balance
double Ywbpal = 1.0;
double Zwbpal = (1.0 - xp - yp) / yp;
@@ -1433,6 +1425,8 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul,
//Lab values in function of color and illuminant
//these values can be compared to preview values when using white-balance (skin / sky / BW)
+ double Lpal[50], apal[50], bpal[50];
+
for(int i = 0; i < N_col; i++) {
Lpal[i] = 116.0 * fy[i] - 16.0;
apal[i] = 500.0 * (fx[i] - fy[i]);
@@ -1464,12 +1458,6 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul,
int numero_color = settings->CRI_color - 1;
//spectral data illuminant (actually 21): only those necessary (lamp, fluorescent, LED) others CRI=100 (not Flash...)
- const double* spect_illum[] = {
- Daylight5300_spect, Cloudy6200_spect, Shade7600_spect, A2856_spect, FluoF1_spect, FluoF2_spect, FluoF3_spect,
- FluoF4_spect, FluoF5_spect, FluoF6_spect, FluoF7_spect, FluoF8_spect, FluoF9_spect, FluoF10_spect, FluoF11_spect,
- FluoF12_spect, HMI_spect, GTI_spect, JudgeIII_spect, Solux3500_spect, Solux4100_spect, Solux4700_spect,
- NG_Solux4700_spect, NG_CRSSP12WWMR16_spect, NG_CRSSP12WWMR16_spect
- };
const double* spec_color[] = {
ColorchechredC3_spect, ColorchechOraA2_spect, ColorchechYelD3_spect, ColorchechGreE2_spect, ColorchechGreB3_spect,
ColorchechCyaF3_spect, ColorchechPurD2_spect, ColorchechMagE3_spect, ColorchechSkiA138_13_14_spect, ColorchechGraC4_67_spect,
@@ -1480,6 +1468,9 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul,
int N_c = sizeof(spec_color) / sizeof(spec_color[0]); //number of color
+ bool CRI_type = false;
+ double tempw;
+
if (method == "Fluo F1") {
CRI_type = true;
tempw = 6430;
@@ -1569,25 +1560,26 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul,
}
if (CRI_type) {
+ const double* spect_illum[] = {
+ Daylight5300_spect, Cloudy6200_spect, Shade7600_spect, A2856_spect, FluoF1_spect, FluoF2_spect, FluoF3_spect,
+ FluoF4_spect, FluoF5_spect, FluoF6_spect, FluoF7_spect, FluoF8_spect, FluoF9_spect, FluoF10_spect, FluoF11_spect,
+ FluoF12_spect, HMI_spect, GTI_spect, JudgeIII_spect, Solux3500_spect, Solux4100_spect, Solux4700_spect,
+ NG_Solux4700_spect, NG_CRSSP12WWMR16_spect, NG_CRSSP12WWMR16_spect
+ };
+
float DeltaE[50], DeltaEs[8];
float quadCRI = 0.0f, quadCRIs = 0.0f;
float CRI_RT = 0.0, CRI[50];
float CRI_RTs = 0.0, CRIs[8];
for(int i = 0; i < N_c; i++) {
- spectrum_to_color_xyz_preset(spec_color[i], spect_illum[illum + 3], xx, yy, zz);
- XchkLamp[i] = xx;
- YchkLamp[i] = yy;
- ZchkLamp[i] = zz;
+ spectrum_to_color_xyz_preset(spec_color[i], spect_illum[illum + 3], XchkLamp[i], YchkLamp[i], ZchkLamp[i]);
}
//calculate XYZ for each color : for Blackbody and Daylight at tempw
if(tempw <= INITIALBLACKBODY) {
for(int i = 0; i < N_c; i++) {
- spectrum_to_color_xyz_blackbody(spec_color[i], tempw, xx, yy, zz);
- Xchk[i] = xx;
- Ychk[i] = yy;
- Zchk[i] = zz;
+ spectrum_to_color_xyz_blackbody(spec_color[i], tempw, Xchk[i], Ychk[i], Zchk[i]);
}
spectrum_to_xyz_blackbody(tempw, x, y, z);//for white point
@@ -1608,18 +1600,15 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul,
m22 = (0.03 - 31.4424 * x_DD + 30.0717 * y_DD) / interm2;
for(int i = 0; i < N_c; i++) {
- spectrum_to_color_xyz_daylight(spec_color[i], m11, m22, xx, yy, zz);
- Xchk[i] = xx;
- Ychk[i] = yy;
- Zchk[i] = zz;
+ spectrum_to_color_xyz_daylight(spec_color[i], m11, m22, Xchk[i], Ychk[i], Zchk[i]);
}
spectrum_to_xyz_daylight(m11, m22, x, y, z);
}
- XYZtoCorColorTemp(Xwb, Ywb, Zwb, correl_temp);
-
if (settings->verbose) {
+ double correl_temp;
+ XYZtoCorColorTemp(Xwb, Ywb, Zwb, correl_temp);
printf("Correlated temperature (lamp)=%i\n", (int) correl_temp); //use only for lamp...otherwise It give an information!!
}
@@ -1680,6 +1669,7 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul,
}
}
+ double Llamp[50], alamp[50], blamp[50];
for(int i = 0; i < N_c; i++) {
Llamp[i] = 116.0 * fy[i] - 16.0;
alamp[i] = 500.0 * (fx[i] - fy[i]);
@@ -1712,6 +1702,8 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul,
}
}
+ double Lbb[50], abb[50], bbb[50];
+
for(int i = 0; i < N_c; i++) {
Lbb[i] = 116.*fy[i] - 16.;
abb[i] = 500.*(fx[i] - fy[i]);
diff --git a/rtengine/colortemp.h b/rtengine/colortemp.h
index a1a805092..33a2b1b04 100644
--- a/rtengine/colortemp.h
+++ b/rtengine/colortemp.h
@@ -53,7 +53,7 @@ private:
public:
ColorTemp () : temp(-1.), green(-1.), equal (1.), method("Custom") {}
- ColorTemp (double e) : temp(-1.), green(-1.), equal (e), method("Custom") {}
+ explicit ColorTemp (double e) : temp(-1.), green(-1.), equal (e), method("Custom") {}
ColorTemp (double t, double g, double e, const Glib::ustring &m);
ColorTemp (double mulr, double mulg, double mulb, double e);
@@ -92,7 +92,7 @@ public:
}
void mul2temp (const double rmul, const double gmul, const double bmul, const double equal, double& temp, double& green) const;
- static void temp2mulxyz (double tem, double gree, std::string method, double &Xxyz, double &Zxyz);
+ static void temp2mulxyz (double tem, double gree, const std::string &method, double &Xxyz, double &Zxyz);
static void cieCAT02(double Xw, double Yw, double Zw, double &CAM02BB00, double &CAM02BB01, double &CAM02BB02, double &CAM02BB10, double &CAM02BB11, double &CAM02BB12, double &CAM02BB20, double &CAM02BB21, double &CAM02BB22, double adap );
//static void CAT02 (Imagefloat* baseImg, const ProcParams* params);
diff --git a/rtengine/coord.h b/rtengine/coord.h
index 2242cec1e..2f1325434 100644
--- a/rtengine/coord.h
+++ b/rtengine/coord.h
@@ -35,7 +35,7 @@ struct Coord
Coord () = default;
Coord (const int x, const int y);
Coord (const Coord& other) = default;
- Coord (const PolarCoord& other);
+ explicit Coord (const PolarCoord& other);
Coord& operator= (const Coord& other) = default;
Coord& operator= (const PolarCoord& other);
@@ -48,7 +48,10 @@ struct Coord
Coord& operator+= (const Coord& other);
Coord& operator-= (const Coord& other);
Coord& operator*= (const double scale);
-
+ bool operator< (const Coord& rhs) const;
+ bool operator> (const Coord& rhs) const;
+ bool operator<=(const Coord& rhs) const;
+ bool operator>=(const Coord& rhs) const;
};
bool operator== (const Coord& lhs, const Coord& rhs);
@@ -66,7 +69,7 @@ struct PolarCoord
PolarCoord () = default;
PolarCoord (const double radius, const double angle);
PolarCoord (const PolarCoord& other) = default;
- PolarCoord (const Coord& other);
+ explicit PolarCoord (const Coord& other);
PolarCoord& operator= (const PolarCoord& other) = default;
PolarCoord& operator= (const Coord& other);
@@ -130,6 +133,26 @@ inline Coord& Coord::operator*= (const double scale)
return *this;
}
+inline bool Coord::operator< (const Coord& rhs) const
+{
+ return x < rhs.x && y < rhs.y;
+}
+
+inline bool Coord::operator> (const Coord& rhs) const
+{
+ return x > rhs.x && y > rhs.y;
+}
+
+inline bool Coord::operator<=(const Coord& rhs) const
+{
+ return x <= rhs.x && y <= rhs.y;
+}
+
+inline bool Coord::operator>=(const Coord& rhs) const
+{
+ return x >= rhs.x && y >= rhs.y;
+}
+
inline bool operator== (const Coord& lhs, const Coord& rhs)
{
return lhs.x == rhs.x && lhs.y == rhs.y;
diff --git a/rtengine/cplx_wavelet_dec.cc b/rtengine/cplx_wavelet_dec.cc
index d9e72e6c5..eafadaa54 100644
--- a/rtengine/cplx_wavelet_dec.cc
+++ b/rtengine/cplx_wavelet_dec.cc
@@ -26,7 +26,7 @@ namespace rtengine
wavelet_decomposition::~wavelet_decomposition()
{
for(int i = 0; i <= lvltot; i++) {
- if(wavelet_decomp[i] != NULL) {
+ if(wavelet_decomp[i] != nullptr) {
delete wavelet_decomp[i];
}
}
diff --git a/rtengine/cplx_wavelet_dec.h b/rtengine/cplx_wavelet_dec.h
index 0ab01be57..45e829322 100644
--- a/rtengine/cplx_wavelet_dec.h
+++ b/rtengine/cplx_wavelet_dec.h
@@ -22,15 +22,17 @@
#define CPLX_WAVELET_DEC_H_INCLUDED
#include
-#include
+#include
#include "cplx_wavelet_level.h"
#include "cplx_wavelet_filter_coeffs.h"
+#include "noncopyable.h"
namespace rtengine
{
-class wavelet_decomposition
+class wavelet_decomposition :
+ public NonCopyable
{
public:
@@ -95,7 +97,7 @@ public:
template
wavelet_decomposition::wavelet_decomposition(E * src, int width, int height, int maxlvl, int subsampling, int skipcrop, int numThreads, int Daub4Len)
- : coeff0(NULL), memoryAllocationFailed(false), lvltot(0), subsamp(subsampling), numThreads(numThreads), m_w(width), m_h(height)
+ : coeff0(nullptr), memoryAllocationFailed(false), lvltot(0), subsamp(subsampling), numThreads(numThreads), m_w(width), m_h(height)
{
//initialize wavelet filters
@@ -153,17 +155,17 @@ wavelet_decomposition::wavelet_decomposition(E * src, int width, int height, int
E *buffer[2];
buffer[0] = new (std::nothrow) E[(m_w / 2 + 1) * (m_h / 2 + 1)];
- if(buffer[0] == NULL) {
+ if(buffer[0] == nullptr) {
memoryAllocationFailed = true;
return;
}
buffer[1] = new (std::nothrow) E[(m_w / 2 + 1) * (m_h / 2 + 1)];
- if(buffer[1] == NULL) {
+ if(buffer[1] == nullptr) {
memoryAllocationFailed = true;
delete[] buffer[0];
- buffer[0] = NULL;
+ buffer[0] = nullptr;
return;
}
@@ -208,7 +210,7 @@ void wavelet_decomposition::reconstruct(E * dst, const float blend)
E *tmpHi = new (std::nothrow) E[width * height];
- if(tmpHi == NULL) {
+ if(tmpHi == nullptr) {
memoryAllocationFailed = true;
return;
}
@@ -217,7 +219,7 @@ void wavelet_decomposition::reconstruct(E * dst, const float blend)
E *tmpLo = wavelet_decomp[lvl]->wavcoeffs[2]; // we can use this as buffer
wavelet_decomp[lvl]->reconstruct_level(tmpLo, tmpHi, coeff0, coeff0, wavfilt_synth, wavfilt_synth, wavfilt_len, wavfilt_offset);
delete wavelet_decomp[lvl];
- wavelet_decomp[lvl] = NULL;
+ wavelet_decomp[lvl] = nullptr;
}
delete[] tmpHi;
@@ -232,7 +234,7 @@ void wavelet_decomposition::reconstruct(E * dst, const float blend)
} else { // allocate new block of memory
tmpLo = new (std::nothrow) E[width * height];
- if(tmpLo == NULL) {
+ if(tmpLo == nullptr) {
memoryAllocationFailed = true;
return;
}
@@ -240,7 +242,7 @@ void wavelet_decomposition::reconstruct(E * dst, const float blend)
E *tmpHi = new (std::nothrow) E[width * height];
- if(tmpHi == NULL) {
+ if(tmpHi == nullptr) {
memoryAllocationFailed = true;
if(!wavelet_decomp[0]->bigBlockOfMemoryUsed()) {
@@ -259,9 +261,9 @@ void wavelet_decomposition::reconstruct(E * dst, const float blend)
delete[] tmpHi;
delete wavelet_decomp[0];
- wavelet_decomp[0] = NULL;
+ wavelet_decomp[0] = nullptr;
delete[] coeff0;
- coeff0 = NULL;
+ coeff0 = nullptr;
}
};
diff --git a/rtengine/cplx_wavelet_level.h b/rtengine/cplx_wavelet_level.h
index cbdb5a481..59c206f27 100644
--- a/rtengine/cplx_wavelet_level.h
+++ b/rtengine/cplx_wavelet_level.h
@@ -84,7 +84,7 @@ public:
template
wavelet_level(E * src, E * dst, int level, int subsamp, int w, int h, float *filterV, float *filterH, int len, int offset, int skipcrop, int numThreads)
- : lvl(level), subsamp_out((subsamp >> level) & 1), numThreads(numThreads), skip(1 << level), bigBlockOfMemory(true), memoryAllocationFailed(false), wavcoeffs(NULL), m_w(w), m_h(h), m_w2(w), m_h2(h)
+ : lvl(level), subsamp_out((subsamp >> level) & 1), numThreads(numThreads), skip(1 << level), bigBlockOfMemory(true), memoryAllocationFailed(false), wavcoeffs(nullptr), m_w(w), m_h(h), m_w2(w), m_h2(h)
{
if (subsamp) {
skip = 1;
@@ -159,7 +159,7 @@ T ** wavelet_level::create(int n)
{
T * data = new (std::nothrow) T[3 * n];
- if(data == NULL) {
+ if(data == nullptr) {
bigBlockOfMemory = false;
}
@@ -171,7 +171,7 @@ T ** wavelet_level::create(int n)
} else {
subbands[j] = new (std::nothrow) T[n];
- if(subbands[j] == NULL) {
+ if(subbands[j] == nullptr) {
printf("Couldn't allocate memory in level %d of wavelet\n", lvl);
memoryAllocationFailed = true;
}
@@ -189,7 +189,7 @@ void wavelet_level::destroy(T ** subbands)
delete[] subbands[1];
} else {
for(int j = 1; j < 4; j++) {
- if(subbands[j] != NULL) {
+ if(subbands[j] != nullptr) {
delete[] subbands[j];
}
}
diff --git a/rtengine/curves.cc b/rtengine/curves.cc
index 9b68cc9ee..cf2fd0d04 100644
--- a/rtengine/curves.cc
+++ b/rtengine/curves.cc
@@ -36,6 +36,7 @@
#include "opthelper.h"
#include "ciecam02.h"
#include "color.h"
+#include "iccstore.h"
#undef CLIPD
#define CLIPD(a) ((a)>0.0f?((a)<1.0f?(a):1.0f):0.0f)
@@ -44,7 +45,7 @@ using namespace std;
namespace rtengine
{
-Curve::Curve () : N(0), x(nullptr), y(nullptr), ypp(nullptr), hashSize(1000 /* has to be initialized to the maximum value */) {}
+Curve::Curve () : N(0), ppn(0), x(nullptr), y(nullptr), mc(0.0), mfc(0.0), msc(0.0), mhc(0.0), 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), hashSize(1000 /* has to be initialized to the maximum value */) {}
void Curve::AddPolygons ()
{
@@ -1434,11 +1435,9 @@ void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3],
double currY = pCurve->getVal(x) - prevY;
if (dY > 0.000001 || dY < -0.000001) {
- float r1, g1, b1, r2, g2, b2, ro, go, bo;
+ 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);
- bool chr = false;
- bool lum = true;
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);
@@ -1775,7 +1774,7 @@ float PerceptualToneCurve::get_curve_val(float x, float range[2], float lut[], s
}
// calculate a single value that represents the contrast of the tone curve
-float PerceptualToneCurve::calculateToneCurveContrastValue(void) const
+float PerceptualToneCurve::calculateToneCurveContrastValue() const
{
// find linear y = k*x the best approximates the curve, which is the linear scaling/exposure component that does not contribute any contrast
diff --git a/rtengine/dcp.h b/rtengine/dcp.h
index 11e368b80..8b781ce6b 100644
--- a/rtengine/dcp.h
+++ b/rtengine/dcp.h
@@ -26,11 +26,12 @@
#include
+#include "../rtgui/threadutils.h"
+
#include "imagefloat.h"
#include "curves.h"
#include "colortemp.h"
-
-#include "../rtgui/threadutils.h"
+#include "noncopyable.h"
namespace rtengine
{
@@ -63,7 +64,7 @@ public:
using Triple = std::array;
using Matrix = std::array;
- DCPProfile(const Glib::ustring& filename);
+ explicit DCPProfile(const Glib::ustring& filename);
~DCPProfile();
explicit operator bool() const;
@@ -145,14 +146,12 @@ private:
AdobeToneCurve tone_curve;
};
-class DCPStore final
+class DCPStore final :
+ public NonCopyable
{
public:
static DCPStore* getInstance();
- DCPStore(const DCPStore& other) = delete;
- DCPStore& operator =(const DCPStore& other) = delete;
-
void init(const Glib::ustring& rt_profile_dir);
bool isValidDCPFileName(const Glib::ustring& filename) const;
diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc
index 3593f2777..dcfe66ee5 100644
--- a/rtengine/dcraw.cc
+++ b/rtengine/dcraw.cc
@@ -4132,127 +4132,127 @@ mask_set:
}
}
-void CLASS remove_zeroes()
-{
- unsigned row, col, tot, n, r, c;
-
- for (row=0; row < height; row++)
- for (col=0; col < width; col++)
- if (BAYER(row,col) == 0) {
- tot = n = 0;
- for (r = row-2; r <= row+2; r++)
- for (c = col-2; c <= col+2; c++)
- if (r < height && c < width &&
- FC(r,c) == FC(row,col) && BAYER(r,c))
- tot += (n++,BAYER(r,c));
- if (n) BAYER(row,col) = tot/n;
- }
-}
+//void CLASS remove_zeroes()
+//{
+// unsigned row, col, tot, n, r, c;
+//
+// for (row=0; row < height; row++)
+// for (col=0; col < width; col++)
+// if (BAYER(row,col) == 0) {
+// tot = n = 0;
+// for (r = row-2; r <= row+2; r++)
+// for (c = col-2; c <= col+2; c++)
+// if (r < height && c < width &&
+// FC(r,c) == FC(row,col) && BAYER(r,c))
+// tot += (n++,BAYER(r,c));
+// if (n) BAYER(row,col) = tot/n;
+// }
+//}
/*
Seach from the current directory up to the root looking for
a ".badpixels" file, and fix those pixels now.
*/
-void CLASS bad_pixels (const char *cfname)
-{
- FILE *fp=0;
- char *fname, *cp, line[128];
- int len, time, row, col, r, c, rad, tot, n, fixed=0;
+//void CLASS bad_pixels (const char *cfname)
+//{
+// FILE *fp=0;
+// char *fname, *cp, line[128];
+// int len, time, row, col, r, c, rad, tot, n, fixed=0;
+//
+// if (!filters) return;
+// if (cfname)
+// fp = fopen (cfname, "r");
+// else {
+// for (len=32 ; ; len *= 2) {
+// fname = (char *) malloc (len);
+// if (!fname) return;
+// if (getcwd (fname, len-16)) break;
+// free (fname);
+// if (errno != ERANGE) return;
+// }
+//#if defined(WIN32) || defined(DJGPP)
+// if (fname[1] == ':')
+// memmove (fname, fname+2, len-2);
+// for (cp=fname; *cp; cp++)
+// if (*cp == '\\') *cp = '/';
+//#endif
+// cp = fname + strlen(fname);
+// if (cp[-1] == '/') cp--;
+// while (*fname == '/') {
+// strcpy (cp, "/.badpixels");
+// if ((fp = fopen (fname, "r"))) break;
+// if (cp == fname) break;
+// while (*--cp != '/');
+// }
+// free (fname);
+// }
+// if (!fp) return;
+// while (fgets (line, 128, fp)) {
+// cp = strchr (line, '#');
+// if (cp) *cp = 0;
+// if (sscanf (line, "%d %d %d", &col, &row, &time) != 3) continue;
+// if ((unsigned) col >= width || (unsigned) row >= height) continue;
+// if (time > timestamp) continue;
+// for (tot=n=0, rad=1; rad < 3 && n==0; rad++)
+// for (r = row-rad; r <= row+rad; r++)
+// for (c = col-rad; c <= col+rad; c++)
+// if ((unsigned) r < height && (unsigned) c < width &&
+// (r != row || c != col) && fcol(r,c) == fcol(row,col)) {
+// tot += BAYER2(r,c);
+// n++;
+// }
+// BAYER2(row,col) = tot/n;
+// if (verbose) {
+// if (!fixed++)
+// fprintf (stderr,_("Fixed dead pixels at:"));
+// fprintf (stderr, " %d,%d", col, row);
+// }
+// }
+// if (fixed) fputc ('\n', stderr);
+// fclose (fp);
+//}
- if (!filters) return;
- if (cfname)
- fp = fopen (cfname, "r");
- else {
- for (len=32 ; ; len *= 2) {
- fname = (char *) malloc (len);
- if (!fname) return;
- if (getcwd (fname, len-16)) break;
- free (fname);
- if (errno != ERANGE) return;
- }
-#if defined(WIN32) || defined(DJGPP)
- if (fname[1] == ':')
- memmove (fname, fname+2, len-2);
- for (cp=fname; *cp; cp++)
- if (*cp == '\\') *cp = '/';
-#endif
- cp = fname + strlen(fname);
- if (cp[-1] == '/') cp--;
- while (*fname == '/') {
- strcpy (cp, "/.badpixels");
- if ((fp = fopen (fname, "r"))) break;
- if (cp == fname) break;
- while (*--cp != '/');
- }
- free (fname);
- }
- if (!fp) return;
- while (fgets (line, 128, fp)) {
- cp = strchr (line, '#');
- if (cp) *cp = 0;
- if (sscanf (line, "%d %d %d", &col, &row, &time) != 3) continue;
- if ((unsigned) col >= width || (unsigned) row >= height) continue;
- if (time > timestamp) continue;
- for (tot=n=0, rad=1; rad < 3 && n==0; rad++)
- for (r = row-rad; r <= row+rad; r++)
- for (c = col-rad; c <= col+rad; c++)
- if ((unsigned) r < height && (unsigned) c < width &&
- (r != row || c != col) && fcol(r,c) == fcol(row,col)) {
- tot += BAYER2(r,c);
- n++;
- }
- BAYER2(row,col) = tot/n;
- if (verbose) {
- if (!fixed++)
- fprintf (stderr,_("Fixed dead pixels at:"));
- fprintf (stderr, " %d,%d", col, row);
- }
- }
- if (fixed) fputc ('\n', stderr);
- fclose (fp);
-}
-
-void CLASS subtract (const char *fname)
-{
- FILE *fp;
- int dim[3]={0,0,0}, comment=0, number=0, error=0, nd=0, c, row, col;
- ushort *pixel;
-
- if (!(fp = fopen (fname, "rb"))) {
- perror (fname); return;
- }
- if (fgetc(fp) != 'P' || fgetc(fp) != '5') error = 1;
- while (!error && nd < 3 && (c = fgetc(fp)) != EOF) {
- if (c == '#') comment = 1;
- if (c == '\n') comment = 0;
- if (comment) continue;
- if (isdigit(c)) number = 1;
- if (number) {
- if (isdigit(c)) dim[nd] = dim[nd]*10 + c -'0';
- else if (isspace(c)) {
- number = 0; nd++;
- } else error = 1;
- }
- }
- if (error || nd < 3) {
- fprintf (stderr,_("%s is not a valid PGM file!\n"), fname);
- fclose (fp); return;
- } else if (dim[0] != width || dim[1] != height || dim[2] != 65535) {
- fprintf (stderr,_("%s has the wrong dimensions!\n"), fname);
- fclose (fp); return;
- }
- pixel = (ushort *) calloc (width, sizeof *pixel);
- merror (pixel, "subtract()");
- for (row=0; row < height; row++) {
- fread (pixel, 2, width, fp);
- for (col=0; col < width; col++)
- BAYER(row,col) = MAX (BAYER(row,col) - ntohs(pixel[col]), 0);
- }
- free (pixel);
- fclose (fp);
- memset (cblack, 0, sizeof cblack);
- black = 0;
-}
+//void CLASS subtract (const char *fname)
+//{
+// FILE *fp;
+// int dim[3]={0,0,0}, comment=0, number=0, error=0, nd=0, c, row, col;
+// ushort *pixel;
+//
+// if (!(fp = fopen (fname, "rb"))) {
+// perror (fname); return;
+// }
+// if (fgetc(fp) != 'P' || fgetc(fp) != '5') error = 1;
+// while (!error && nd < 3 && (c = fgetc(fp)) != EOF) {
+// if (c == '#') comment = 1;
+// if (c == '\n') comment = 0;
+// if (comment) continue;
+// if (isdigit(c)) number = 1;
+// if (number) {
+// if (isdigit(c)) dim[nd] = dim[nd]*10 + c -'0';
+// else if (isspace(c)) {
+// number = 0; nd++;
+// } else error = 1;
+// }
+// }
+// if (error || nd < 3) {
+// fprintf (stderr,_("%s is not a valid PGM file!\n"), fname);
+// fclose (fp); return;
+// } else if (dim[0] != width || dim[1] != height || dim[2] != 65535) {
+// fprintf (stderr,_("%s has the wrong dimensions!\n"), fname);
+// fclose (fp); return;
+// }
+// pixel = (ushort *) calloc (width, sizeof *pixel);
+// merror (pixel, "subtract()");
+// for (row=0; row < height; row++) {
+// fread (pixel, 2, width, fp);
+// for (col=0; col < width; col++)
+// BAYER(row,col) = MAX (BAYER(row,col) - ntohs(pixel[col]), 0);
+// }
+// free (pixel);
+// fclose (fp);
+// memset (cblack, 0, sizeof cblack);
+// black = 0;
+//}
void CLASS gamma_curve (double pwr, double ts, int mode, int imax)
{
@@ -4417,94 +4417,94 @@ void CLASS colorcheck()
}
#endif
-void CLASS hat_transform (float *temp, float *base, int st, int size, int sc)
-{
- int i;
- for (i=0; i < sc; i++)
- temp[i] = 2*base[st*i] + base[st*(sc-i)] + base[st*(i+sc)];
- for (; i+sc < size; i++)
- temp[i] = 2*base[st*i] + base[st*(i-sc)] + base[st*(i+sc)];
- for (; i < size; i++)
- temp[i] = 2*base[st*i] + base[st*(i-sc)] + base[st*(2*size-2-(i+sc))];
-}
+//void CLASS hat_transform (float *temp, float *base, int st, int size, int sc)
+//{
+// int i;
+// for (i=0; i < sc; i++)
+// temp[i] = 2*base[st*i] + base[st*(sc-i)] + base[st*(i+sc)];
+// for (; i+sc < size; i++)
+// temp[i] = 2*base[st*i] + base[st*(i-sc)] + base[st*(i+sc)];
+// for (; i < size; i++)
+// temp[i] = 2*base[st*i] + base[st*(i-sc)] + base[st*(2*size-2-(i+sc))];
+//}
-void CLASS wavelet_denoise()
-{
- float *fimg=0, *temp, thold, mul[2], avg, diff;
- int scale=1, size, lev, hpass, lpass, row, col, nc, c, i, wlast, blk[2];
- ushort *window[4];
- static const float noise[] =
- { 0.8002,0.2735,0.1202,0.0585,0.0291,0.0152,0.0080,0.0044 };
-
- if (verbose) fprintf (stderr,_("Wavelet denoising...\n"));
-
- while (maximum << scale < 0x10000) scale++;
- maximum <<= --scale;
- black <<= scale;
- FORC4 cblack[c] <<= scale;
- if ((size = iheight*iwidth) < 0x15550000)
- fimg = (float *) malloc ((size*3 + iheight + iwidth) * sizeof *fimg);
- merror (fimg, "wavelet_denoise()");
- temp = fimg + size*3;
- if ((nc = colors) == 3 && filters) nc++;
- FORC(nc) { /* denoise R,G1,B,G3 individually */
- for (i=0; i < size; i++)
- fimg[i] = 256 * sqrt(image[i][c] << scale);
- for (hpass=lev=0; lev < 5; lev++) {
- lpass = size*((lev & 1)+1);
- for (row=0; row < iheight; row++) {
- hat_transform (temp, fimg+hpass+row*iwidth, 1, iwidth, 1 << lev);
- for (col=0; col < iwidth; col++)
- fimg[lpass + row*iwidth + col] = temp[col] * 0.25;
- }
- for (col=0; col < iwidth; col++) {
- hat_transform (temp, fimg+lpass+col, iwidth, iheight, 1 << lev);
- for (row=0; row < iheight; row++)
- fimg[lpass + row*iwidth + col] = temp[row] * 0.25;
- }
- thold = threshold * noise[lev];
- for (i=0; i < size; i++) {
- fimg[hpass+i] -= fimg[lpass+i];
- if (fimg[hpass+i] < -thold) fimg[hpass+i] += thold;
- else if (fimg[hpass+i] > thold) fimg[hpass+i] -= thold;
- else fimg[hpass+i] = 0;
- if (hpass) fimg[i] += fimg[hpass+i];
- }
- hpass = lpass;
- }
- for (i=0; i < size; i++)
- image[i][c] = CLIP(SQR(fimg[i]+fimg[lpass+i])/0x10000);
- }
- if (filters && colors == 3) { /* pull G1 and G3 closer together */
- for (row=0; row < 2; row++) {
- mul[row] = 0.125 * pre_mul[FC(row+1,0) | 1] / pre_mul[FC(row,0) | 1];
- blk[row] = cblack[FC(row,0) | 1];
- }
- for (i=0; i < 4; i++)
- window[i] = (ushort *) fimg + width*i;
- for (wlast=-1, row=1; row < height-1; row++) {
- while (wlast < row+1) {
- for (wlast++, i=0; i < 4; i++)
- window[(i+3) & 3] = window[i];
- for (col = FC(wlast,1) & 1; col < width; col+=2)
- window[2][col] = BAYER(wlast,col);
- }
- thold = threshold/512;
- for (col = (FC(row,0) & 1)+1; col < width-1; col+=2) {
- avg = ( window[0][col-1] + window[0][col+1] +
- window[2][col-1] + window[2][col+1] - blk[~row & 1]*4 )
- * mul[row & 1] + (window[1][col] + blk[row & 1]) * 0.5;
- avg = avg < 0 ? 0 : sqrt(avg);
- diff = sqrt(BAYER(row,col)) - avg;
- if (diff < -thold) diff += thold;
- else if (diff > thold) diff -= thold;
- else diff = 0;
- BAYER(row,col) = CLIP(SQR(avg+diff) + 0.5);
- }
- }
- }
- free (fimg);
-}
+//void CLASS wavelet_denoise()
+//{
+// float *fimg=0, *temp, thold, mul[2], avg, diff;
+// int scale=1, size, lev, hpass, lpass, row, col, nc, c, i, wlast, blk[2];
+// ushort *window[4];
+// static const float noise[] =
+// { 0.8002,0.2735,0.1202,0.0585,0.0291,0.0152,0.0080,0.0044 };
+//
+// if (verbose) fprintf (stderr,_("Wavelet denoising...\n"));
+//
+// while (maximum << scale < 0x10000) scale++;
+// maximum <<= --scale;
+// black <<= scale;
+// FORC4 cblack[c] <<= scale;
+// if ((size = iheight*iwidth) < 0x15550000)
+// fimg = (float *) malloc ((size*3 + iheight + iwidth) * sizeof *fimg);
+// merror (fimg, "wavelet_denoise()");
+// temp = fimg + size*3;
+// if ((nc = colors) == 3 && filters) nc++;
+// FORC(nc) { /* denoise R,G1,B,G3 individually */
+// for (i=0; i < size; i++)
+// fimg[i] = 256 * sqrt(image[i][c] << scale);
+// for (hpass=lev=0; lev < 5; lev++) {
+// lpass = size*((lev & 1)+1);
+// for (row=0; row < iheight; row++) {
+// hat_transform (temp, fimg+hpass+row*iwidth, 1, iwidth, 1 << lev);
+// for (col=0; col < iwidth; col++)
+// fimg[lpass + row*iwidth + col] = temp[col] * 0.25;
+// }
+// for (col=0; col < iwidth; col++) {
+// hat_transform (temp, fimg+lpass+col, iwidth, iheight, 1 << lev);
+// for (row=0; row < iheight; row++)
+// fimg[lpass + row*iwidth + col] = temp[row] * 0.25;
+// }
+// thold = threshold * noise[lev];
+// for (i=0; i < size; i++) {
+// fimg[hpass+i] -= fimg[lpass+i];
+// if (fimg[hpass+i] < -thold) fimg[hpass+i] += thold;
+// else if (fimg[hpass+i] > thold) fimg[hpass+i] -= thold;
+// else fimg[hpass+i] = 0;
+// if (hpass) fimg[i] += fimg[hpass+i];
+// }
+// hpass = lpass;
+// }
+// for (i=0; i < size; i++)
+// image[i][c] = CLIP(SQR(fimg[i]+fimg[lpass+i])/0x10000);
+// }
+// if (filters && colors == 3) { /* pull G1 and G3 closer together */
+// for (row=0; row < 2; row++) {
+// mul[row] = 0.125 * pre_mul[FC(row+1,0) | 1] / pre_mul[FC(row,0) | 1];
+// blk[row] = cblack[FC(row,0) | 1];
+// }
+// for (i=0; i < 4; i++)
+// window[i] = (ushort *) fimg + width*i;
+// for (wlast=-1, row=1; row < height-1; row++) {
+// while (wlast < row+1) {
+// for (wlast++, i=0; i < 4; i++)
+// window[(i+3) & 3] = window[i];
+// for (col = FC(wlast,1) & 1; col < width; col+=2)
+// window[2][col] = BAYER(wlast,col);
+// }
+// thold = threshold/512;
+// for (col = (FC(row,0) & 1)+1; col < width-1; col+=2) {
+// avg = ( window[0][col-1] + window[0][col+1] +
+// window[2][col-1] + window[2][col+1] - blk[~row & 1]*4 )
+// * mul[row & 1] + (window[1][col] + blk[row & 1]) * 0.5;
+// avg = avg < 0 ? 0 : sqrt(avg);
+// diff = sqrt(BAYER(row,col)) - avg;
+// if (diff < -thold) diff += thold;
+// else if (diff > thold) diff -= thold;
+// else diff = 0;
+// BAYER(row,col) = CLIP(SQR(avg+diff) + 0.5);
+// }
+// }
+// }
+// free (fimg);
+//}
void CLASS scale_colors()
{
@@ -4562,7 +4562,7 @@ skip_block: ;
if (pre_mul[3] == 0) pre_mul[3] = colors < 4 ? pre_mul[1] : 1;
dark = black;
sat = maximum;
- if (threshold) wavelet_denoise();
+// if (threshold) wavelet_denoise();
maximum -= black;
for (dmin=DBL_MAX, dmax=c=0; c < 4; c++) {
if (dmin > pre_mul[c])
@@ -4668,440 +4668,440 @@ void CLASS pre_interpolate()
if (half_size) filters = 0;
}
-void CLASS border_interpolate (int border)
-{
- unsigned row, col, y, x, f, c, sum[8];
-
- for (row=0; row < height; row++)
- for (col=0; col < width; col++) {
- if (col==border && row >= border && row < height-border)
- col = width-border;
- memset (sum, 0, sizeof sum);
- for (y=row-1; y != row+2; y++)
- for (x=col-1; x != col+2; x++)
- if (y < height && x < width) {
- f = fcol(y,x);
- sum[f] += image[y*width+x][f];
- sum[f+4]++;
- }
- f = fcol(row,col);
- FORCC if (c != f && sum[c+4])
- image[row*width+col][c] = sum[c] / sum[c+4];
- }
-}
+//void CLASS border_interpolate (int border)
+//{
+// unsigned row, col, y, x, f, c, sum[8];
+//
+// for (row=0; row < height; row++)
+// for (col=0; col < width; col++) {
+// if (col==border && row >= border && row < height-border)
+// col = width-border;
+// memset (sum, 0, sizeof sum);
+// for (y=row-1; y != row+2; y++)
+// for (x=col-1; x != col+2; x++)
+// if (y < height && x < width) {
+// f = fcol(y,x);
+// sum[f] += image[y*width+x][f];
+// sum[f+4]++;
+// }
+// f = fcol(row,col);
+// FORCC if (c != f && sum[c+4])
+// image[row*width+col][c] = sum[c] / sum[c+4];
+// }
+//}
/* RT: delete interpolation functions */
-void CLASS cielab (ushort rgb[3], short lab[3])
-{
- int c, i, j, k;
- float r, xyz[3];
- static float cbrt[0x10000], xyz_cam[3][4];
+//void CLASS cielab (ushort rgb[3], short lab[3])
+//{
+// int c, i, j, k;
+// float r, xyz[3];
+// static float cbrt[0x10000], xyz_cam[3][4];
+//
+// if (!rgb) {
+// for (i=0; i < 0x10000; i++) {
+// r = i / 65535.0;
+// cbrt[i] = r > 0.008856 ? pow(r,1/3.0) : 7.787*r + 16/116.0;
+// }
+// for (i=0; i < 3; i++)
+// for (j=0; j < colors; j++)
+// for (xyz_cam[i][j] = k=0; k < 3; k++)
+// xyz_cam[i][j] += xyz_rgb[i][k] * rgb_cam[k][j] / d65_white[i];
+// return;
+// }
+// xyz[0] = xyz[1] = xyz[2] = 0.5;
+// FORCC {
+// xyz[0] += xyz_cam[0][c] * rgb[c];
+// xyz[1] += xyz_cam[1][c] * rgb[c];
+// xyz[2] += xyz_cam[2][c] * rgb[c];
+// }
+// xyz[0] = cbrt[CLIP((int) xyz[0])];
+// xyz[1] = cbrt[CLIP((int) xyz[1])];
+// xyz[2] = cbrt[CLIP((int) xyz[2])];
+// lab[0] = 64 * (116 * xyz[1] - 16);
+// lab[1] = 64 * 500 * (xyz[0] - xyz[1]);
+// lab[2] = 64 * 200 * (xyz[1] - xyz[2]);
+//}
+//
+//#define TS 512 /* Tile Size */
+//#define fcol(row,col) xtrans[(row+6) % 6][(col+6) % 6]
+//
+///*
+// Frank Markesteijn's algorithm for Fuji X-Trans sensors
+// */
+//void CLASS xtrans_interpolate (int passes)
+//{
+// int c, d, f, g, h, i, v, ng, row, col, top, left, mrow, mcol;
+// int val, ndir, pass, hm[8], avg[4], color[3][8];
+// static const short orth[12] = { 1,0,0,1,-1,0,0,-1,1,0,0,1 },
+// patt[2][16] = { { 0,1,0,-1,2,0,-1,0,1,1,1,-1,0,0,0,0 },
+// { 0,1,0,-2,1,0,-2,0,1,1,-2,-2,1,-1,-1,1 } },
+// dir[4] = { 1,TS,TS+1,TS-1 };
+// short allhex[3][3][2][8], *hex;
+// ushort min, max, sgrow, sgcol;
+// ushort (*rgb)[TS][TS][3], (*rix)[3], (*pix)[4];
+// short (*lab) [TS][3], (*lix)[3];
+// float (*drv)[TS][TS], diff[6], tr;
+// char (*homo)[TS][TS], *buffer;
+//
+// if (verbose)
+// fprintf (stderr,_("%d-pass X-Trans interpolation...\n"), passes);
+//
+// cielab (0,0);
+// ndir = 4 << (passes > 1);
+// buffer = (char *) malloc (TS*TS*(ndir*11+6));
+// merror (buffer, "xtrans_interpolate()");
+// rgb = (ushort(*)[TS][TS][3]) buffer;
+// lab = (short (*) [TS][3])(buffer + TS*TS*(ndir*6));
+// drv = (float (*)[TS][TS]) (buffer + TS*TS*(ndir*6+6));
+// homo = (char (*)[TS][TS]) (buffer + TS*TS*(ndir*10+6));
+//
+///* Map a green hexagon around each non-green pixel and vice versa: */
+// for (row=0; row < 3; row++)
+// for (col=0; col < 3; col++)
+// for (ng=d=0; d < 10; d+=2) {
+// g = fcol(row,col) == 1;
+// if (fcol(row+orth[d],col+orth[d+2]) == 1) ng=0; else ng++;
+// if (ng == 4) { sgrow = row; sgcol = col; }
+// if (ng == g+1) FORC(8) {
+// v = orth[d ]*patt[g][c*2] + orth[d+1]*patt[g][c*2+1];
+// h = orth[d+2]*patt[g][c*2] + orth[d+3]*patt[g][c*2+1];
+// allhex[row][col][0][c^(g*2 & d)] = h + v*width;
+// allhex[row][col][1][c^(g*2 & d)] = h + v*TS;
+// }
+// }
+//
+///* Set green1 and green3 to the minimum and maximum allowed values: */
+// for (row=2; row < height-2; row++)
+// for (min=~(max=0), col=2; col < width-2; col++) {
+// if (fcol(row,col) == 1 && (min=~(max=0))) continue;
+// pix = image + row*width + col;
+// hex = allhex[row % 3][col % 3][0];
+// if (!max) FORC(6) {
+// val = pix[hex[c]][1];
+// if (min > val) min = val;
+// if (max < val) max = val;
+// }
+// pix[0][1] = min;
+// pix[0][3] = max;
+// switch ((row-sgrow) % 3) {
+// case 1: if (row < height-3) { row++; col--; } break;
+// case 2: if ((min=~(max=0)) && (col+=2) < width-3 && row > 2) row--;
+// }
+// }
+//
+// for (top=3; top < height-19; top += TS-16)
+// for (left=3; left < width-19; left += TS-16) {
+// mrow = MIN (top+TS, height-3);
+// mcol = MIN (left+TS, width-3);
+// for (row=top; row < mrow; row++)
+// for (col=left; col < mcol; col++)
+// memcpy (rgb[0][row-top][col-left], image[row*width+col], 6);
+// FORC3 memcpy (rgb[c+1], rgb[0], sizeof *rgb);
+//
+///* Interpolate green horizontally, vertically, and along both diagonals: */
+// for (row=top; row < mrow; row++)
+// for (col=left; col < mcol; col++) {
+// if ((f = fcol(row,col)) == 1) continue;
+// pix = image + row*width + col;
+// hex = allhex[row % 3][col % 3][0];
+// color[1][0] = 174 * (pix[ hex[1]][1] + pix[ hex[0]][1]) -
+// 46 * (pix[2*hex[1]][1] + pix[2*hex[0]][1]);
+// color[1][1] = 223 * pix[ hex[3]][1] + pix[ hex[2]][1] * 33 +
+// 92 * (pix[ 0 ][f] - pix[ -hex[2]][f]);
+// FORC(2) color[1][2+c] =
+// 164 * pix[hex[4+c]][1] + 92 * pix[-2*hex[4+c]][1] + 33 *
+// (2*pix[0][f] - pix[3*hex[4+c]][f] - pix[-3*hex[4+c]][f]);
+// FORC4 rgb[c^!((row-sgrow) % 3)][row-top][col-left][1] =
+// LIM(color[1][c] >> 8,pix[0][1],pix[0][3]);
+// }
+//
+// for (pass=0; pass < passes; pass++) {
+// if (pass == 1)
+// memcpy (rgb+=4, buffer, 4*sizeof *rgb);
+//
+///* Recalculate green from interpolated values of closer pixels: */
+// if (pass) {
+// for (row=top+2; row < mrow-2; row++)
+// for (col=left+2; col < mcol-2; col++) {
+// if ((f = fcol(row,col)) == 1) continue;
+// pix = image + row*width + col;
+// hex = allhex[row % 3][col % 3][1];
+// for (d=3; d < 6; d++) {
+// rix = &rgb[(d-2)^!((row-sgrow) % 3)][row-top][col-left];
+// val = rix[-2*hex[d]][1] + 2*rix[hex[d]][1]
+// - rix[-2*hex[d]][f] - 2*rix[hex[d]][f] + 3*rix[0][f];
+// rix[0][1] = LIM(val/3,pix[0][1],pix[0][3]);
+// }
+// }
+// }
+//
+///* Interpolate red and blue values for solitary green pixels: */
+// for (row=(top-sgrow+4)/3*3+sgrow; row < mrow-2; row+=3)
+// for (col=(left-sgcol+4)/3*3+sgcol; col < mcol-2; col+=3) {
+// rix = &rgb[0][row-top][col-left];
+// h = fcol(row,col+1);
+// memset (diff, 0, sizeof diff);
+// for (i=1, d=0; d < 6; d++, i^=TS^1, h^=2) {
+// for (c=0; c < 2; c++, h^=2) {
+// g = 2*rix[0][1] - rix[i< 1)
+// diff[d] += SQR (rix[i< 1 && (d & 1))
+// if (diff[d-1] < diff[d])
+// FORC(2) color[c*2][d] = color[c*2][d-1];
+// if (d < 2 || (d & 1)) {
+// FORC(2) rix[0][c*2] = CLIP(color[c*2][d]/2);
+// rix += TS*TS;
+// }
+// }
+// }
+//
+///* Interpolate red for blue pixels and vice versa: */
+// for (row=top+3; row < mrow-3; row++)
+// for (col=left+3; col < mcol-3; col++) {
+// if ((f = 2-fcol(row,col)) == 1) continue;
+// rix = &rgb[0][row-top][col-left];
+// c = (row-sgrow) % 3 ? TS:1;
+// h = 3 * (c ^ TS ^ 1);
+// for (d=0; d < 4; d++, rix += TS*TS) {
+// i = d > 1 || ((d ^ c) & 1) ||
+// ((ABS(rix[0][1]-rix[c][1])+ABS(rix[0][1]-rix[-c][1])) <
+// 2*(ABS(rix[0][1]-rix[h][1])+ABS(rix[0][1]-rix[-h][1]))) ? c:h;
+// rix[0][f] = CLIP((rix[i][f] + rix[-i][f] +
+// 2*rix[0][1] - rix[i][1] - rix[-i][1])/2);
+// }
+// }
+//
+///* Fill in red and blue for 2x2 blocks of green: */
+// for (row=top+2; row < mrow-2; row++) if ((row-sgrow) % 3)
+// for (col=left+2; col < mcol-2; col++) if ((col-sgcol) % 3) {
+// rix = &rgb[0][row-top][col-left];
+// hex = allhex[row % 3][col % 3][1];
+// for (d=0; d < ndir; d+=2, rix += TS*TS)
+// if (hex[d] + hex[d+1]) {
+// g = 3*rix[0][1] - 2*rix[hex[d]][1] - rix[hex[d+1]][1];
+// for (c=0; c < 4; c+=2) rix[0][c] =
+// CLIP((g + 2*rix[hex[d]][c] + rix[hex[d+1]][c])/3);
+// } else {
+// g = 2*rix[0][1] - rix[hex[d]][1] - rix[hex[d+1]][1];
+// for (c=0; c < 4; c+=2) rix[0][c] =
+// CLIP((g + rix[hex[d]][c] + rix[hex[d+1]][c])/2);
+// }
+// }
+// }
+// rgb = (ushort(*)[TS][TS][3]) buffer;
+// mrow -= top;
+// mcol -= left;
+//
+///* Convert to CIELab and differentiate in all directions: */
+// for (d=0; d < ndir; d++) {
+// for (row=2; row < mrow-2; row++)
+// for (col=2; col < mcol-2; col++)
+// cielab (rgb[d][row][col], lab[row][col]);
+// for (f=dir[d & 3],row=3; row < mrow-3; row++)
+// for (col=3; col < mcol-3; col++) {
+// lix = &lab[row][col];
+// g = 2*lix[0][0] - lix[f][0] - lix[-f][0];
+// drv[d][row][col] = SQR(g)
+// + SQR((2*lix[0][1] - lix[f][1] - lix[-f][1] + g*500/232))
+// + SQR((2*lix[0][2] - lix[f][2] - lix[-f][2] - g*500/580));
+// }
+// }
+//
+///* Build homogeneity maps from the derivatives: */
+// memset(homo, 0, ndir*TS*TS);
+// for (row=4; row < mrow-4; row++)
+// for (col=4; col < mcol-4; col++) {
+// for (tr=FLT_MAX, d=0; d < ndir; d++)
+// if (tr > drv[d][row][col])
+// tr = drv[d][row][col];
+// tr *= 8;
+// for (d=0; d < ndir; d++)
+// for (v=-1; v <= 1; v++)
+// for (h=-1; h <= 1; h++)
+// if (drv[d][row+v][col+h] <= tr)
+// homo[d][row][col]++;
+// }
+//
+///* Average the most homogenous pixels for the final result: */
+// if (height-top < TS+4) mrow = height-top+2;
+// if (width-left < TS+4) mcol = width-left+2;
+// for (row = MIN(top,8); row < mrow-8; row++)
+// for (col = MIN(left,8); col < mcol-8; col++) {
+// for (d=0; d < ndir; d++)
+// for (hm[d]=0, v=-2; v <= 2; v++)
+// for (h=-2; h <= 2; h++)
+// hm[d] += homo[d][row+v][col+h];
+// for (d=0; d < ndir-4; d++)
+// if (hm[d] < hm[d+4]) hm[d ] = 0; else
+// if (hm[d] > hm[d+4]) hm[d+4] = 0;
+// for (max=hm[0],d=1; d < ndir; d++)
+// if (max < hm[d]) max = hm[d];
+// max -= max >> 3;
+// memset (avg, 0, sizeof avg);
+// for (d=0; d < ndir; d++)
+// if (hm[d] >= max) {
+// FORC3 avg[c] += rgb[d][row][col][c];
+// avg[3]++;
+// }
+// FORC3 image[(row+top)*width+col+left][c] = avg[c]/avg[3];
+// }
+// }
+// free(buffer);
+// border_interpolate(8);
+//}
+//#undef fcol
+//
+//
+//#undef TS
- if (!rgb) {
- for (i=0; i < 0x10000; i++) {
- r = i / 65535.0;
- cbrt[i] = r > 0.008856 ? pow(r,1/3.0) : 7.787*r + 16/116.0;
- }
- for (i=0; i < 3; i++)
- for (j=0; j < colors; j++)
- for (xyz_cam[i][j] = k=0; k < 3; k++)
- xyz_cam[i][j] += xyz_rgb[i][k] * rgb_cam[k][j] / d65_white[i];
- return;
- }
- xyz[0] = xyz[1] = xyz[2] = 0.5;
- FORCC {
- xyz[0] += xyz_cam[0][c] * rgb[c];
- xyz[1] += xyz_cam[1][c] * rgb[c];
- xyz[2] += xyz_cam[2][c] * rgb[c];
- }
- xyz[0] = cbrt[CLIP((int) xyz[0])];
- xyz[1] = cbrt[CLIP((int) xyz[1])];
- xyz[2] = cbrt[CLIP((int) xyz[2])];
- lab[0] = 64 * (116 * xyz[1] - 16);
- lab[1] = 64 * 500 * (xyz[0] - xyz[1]);
- lab[2] = 64 * 200 * (xyz[1] - xyz[2]);
-}
-
-#define TS 512 /* Tile Size */
-#define fcol(row,col) xtrans[(row+6) % 6][(col+6) % 6]
-
-/*
- Frank Markesteijn's algorithm for Fuji X-Trans sensors
- */
-void CLASS xtrans_interpolate (int passes)
-{
- int c, d, f, g, h, i, v, ng, row, col, top, left, mrow, mcol;
- int val, ndir, pass, hm[8], avg[4], color[3][8];
- static const short orth[12] = { 1,0,0,1,-1,0,0,-1,1,0,0,1 },
- patt[2][16] = { { 0,1,0,-1,2,0,-1,0,1,1,1,-1,0,0,0,0 },
- { 0,1,0,-2,1,0,-2,0,1,1,-2,-2,1,-1,-1,1 } },
- dir[4] = { 1,TS,TS+1,TS-1 };
- short allhex[3][3][2][8], *hex;
- ushort min, max, sgrow, sgcol;
- ushort (*rgb)[TS][TS][3], (*rix)[3], (*pix)[4];
- short (*lab) [TS][3], (*lix)[3];
- float (*drv)[TS][TS], diff[6], tr;
- char (*homo)[TS][TS], *buffer;
-
- if (verbose)
- fprintf (stderr,_("%d-pass X-Trans interpolation...\n"), passes);
-
- cielab (0,0);
- ndir = 4 << (passes > 1);
- buffer = (char *) malloc (TS*TS*(ndir*11+6));
- merror (buffer, "xtrans_interpolate()");
- rgb = (ushort(*)[TS][TS][3]) buffer;
- lab = (short (*) [TS][3])(buffer + TS*TS*(ndir*6));
- drv = (float (*)[TS][TS]) (buffer + TS*TS*(ndir*6+6));
- homo = (char (*)[TS][TS]) (buffer + TS*TS*(ndir*10+6));
-
-/* Map a green hexagon around each non-green pixel and vice versa: */
- for (row=0; row < 3; row++)
- for (col=0; col < 3; col++)
- for (ng=d=0; d < 10; d+=2) {
- g = fcol(row,col) == 1;
- if (fcol(row+orth[d],col+orth[d+2]) == 1) ng=0; else ng++;
- if (ng == 4) { sgrow = row; sgcol = col; }
- if (ng == g+1) FORC(8) {
- v = orth[d ]*patt[g][c*2] + orth[d+1]*patt[g][c*2+1];
- h = orth[d+2]*patt[g][c*2] + orth[d+3]*patt[g][c*2+1];
- allhex[row][col][0][c^(g*2 & d)] = h + v*width;
- allhex[row][col][1][c^(g*2 & d)] = h + v*TS;
- }
- }
-
-/* Set green1 and green3 to the minimum and maximum allowed values: */
- for (row=2; row < height-2; row++)
- for (min=~(max=0), col=2; col < width-2; col++) {
- if (fcol(row,col) == 1 && (min=~(max=0))) continue;
- pix = image + row*width + col;
- hex = allhex[row % 3][col % 3][0];
- if (!max) FORC(6) {
- val = pix[hex[c]][1];
- if (min > val) min = val;
- if (max < val) max = val;
- }
- pix[0][1] = min;
- pix[0][3] = max;
- switch ((row-sgrow) % 3) {
- case 1: if (row < height-3) { row++; col--; } break;
- case 2: if ((min=~(max=0)) && (col+=2) < width-3 && row > 2) row--;
- }
- }
-
- for (top=3; top < height-19; top += TS-16)
- for (left=3; left < width-19; left += TS-16) {
- mrow = MIN (top+TS, height-3);
- mcol = MIN (left+TS, width-3);
- for (row=top; row < mrow; row++)
- for (col=left; col < mcol; col++)
- memcpy (rgb[0][row-top][col-left], image[row*width+col], 6);
- FORC3 memcpy (rgb[c+1], rgb[0], sizeof *rgb);
-
-/* Interpolate green horizontally, vertically, and along both diagonals: */
- for (row=top; row < mrow; row++)
- for (col=left; col < mcol; col++) {
- if ((f = fcol(row,col)) == 1) continue;
- pix = image + row*width + col;
- hex = allhex[row % 3][col % 3][0];
- color[1][0] = 174 * (pix[ hex[1]][1] + pix[ hex[0]][1]) -
- 46 * (pix[2*hex[1]][1] + pix[2*hex[0]][1]);
- color[1][1] = 223 * pix[ hex[3]][1] + pix[ hex[2]][1] * 33 +
- 92 * (pix[ 0 ][f] - pix[ -hex[2]][f]);
- FORC(2) color[1][2+c] =
- 164 * pix[hex[4+c]][1] + 92 * pix[-2*hex[4+c]][1] + 33 *
- (2*pix[0][f] - pix[3*hex[4+c]][f] - pix[-3*hex[4+c]][f]);
- FORC4 rgb[c^!((row-sgrow) % 3)][row-top][col-left][1] =
- LIM(color[1][c] >> 8,pix[0][1],pix[0][3]);
- }
-
- for (pass=0; pass < passes; pass++) {
- if (pass == 1)
- memcpy (rgb+=4, buffer, 4*sizeof *rgb);
-
-/* Recalculate green from interpolated values of closer pixels: */
- if (pass) {
- for (row=top+2; row < mrow-2; row++)
- for (col=left+2; col < mcol-2; col++) {
- if ((f = fcol(row,col)) == 1) continue;
- pix = image + row*width + col;
- hex = allhex[row % 3][col % 3][1];
- for (d=3; d < 6; d++) {
- rix = &rgb[(d-2)^!((row-sgrow) % 3)][row-top][col-left];
- val = rix[-2*hex[d]][1] + 2*rix[hex[d]][1]
- - rix[-2*hex[d]][f] - 2*rix[hex[d]][f] + 3*rix[0][f];
- rix[0][1] = LIM(val/3,pix[0][1],pix[0][3]);
- }
- }
- }
-
-/* Interpolate red and blue values for solitary green pixels: */
- for (row=(top-sgrow+4)/3*3+sgrow; row < mrow-2; row+=3)
- for (col=(left-sgcol+4)/3*3+sgcol; col < mcol-2; col+=3) {
- rix = &rgb[0][row-top][col-left];
- h = fcol(row,col+1);
- memset (diff, 0, sizeof diff);
- for (i=1, d=0; d < 6; d++, i^=TS^1, h^=2) {
- for (c=0; c < 2; c++, h^=2) {
- g = 2*rix[0][1] - rix[i< 1)
- diff[d] += SQR (rix[i< 1 && (d & 1))
- if (diff[d-1] < diff[d])
- FORC(2) color[c*2][d] = color[c*2][d-1];
- if (d < 2 || (d & 1)) {
- FORC(2) rix[0][c*2] = CLIP(color[c*2][d]/2);
- rix += TS*TS;
- }
- }
- }
-
-/* Interpolate red for blue pixels and vice versa: */
- for (row=top+3; row < mrow-3; row++)
- for (col=left+3; col < mcol-3; col++) {
- if ((f = 2-fcol(row,col)) == 1) continue;
- rix = &rgb[0][row-top][col-left];
- c = (row-sgrow) % 3 ? TS:1;
- h = 3 * (c ^ TS ^ 1);
- for (d=0; d < 4; d++, rix += TS*TS) {
- i = d > 1 || ((d ^ c) & 1) ||
- ((ABS(rix[0][1]-rix[c][1])+ABS(rix[0][1]-rix[-c][1])) <
- 2*(ABS(rix[0][1]-rix[h][1])+ABS(rix[0][1]-rix[-h][1]))) ? c:h;
- rix[0][f] = CLIP((rix[i][f] + rix[-i][f] +
- 2*rix[0][1] - rix[i][1] - rix[-i][1])/2);
- }
- }
-
-/* Fill in red and blue for 2x2 blocks of green: */
- for (row=top+2; row < mrow-2; row++) if ((row-sgrow) % 3)
- for (col=left+2; col < mcol-2; col++) if ((col-sgcol) % 3) {
- rix = &rgb[0][row-top][col-left];
- hex = allhex[row % 3][col % 3][1];
- for (d=0; d < ndir; d+=2, rix += TS*TS)
- if (hex[d] + hex[d+1]) {
- g = 3*rix[0][1] - 2*rix[hex[d]][1] - rix[hex[d+1]][1];
- for (c=0; c < 4; c+=2) rix[0][c] =
- CLIP((g + 2*rix[hex[d]][c] + rix[hex[d+1]][c])/3);
- } else {
- g = 2*rix[0][1] - rix[hex[d]][1] - rix[hex[d+1]][1];
- for (c=0; c < 4; c+=2) rix[0][c] =
- CLIP((g + rix[hex[d]][c] + rix[hex[d+1]][c])/2);
- }
- }
- }
- rgb = (ushort(*)[TS][TS][3]) buffer;
- mrow -= top;
- mcol -= left;
-
-/* Convert to CIELab and differentiate in all directions: */
- for (d=0; d < ndir; d++) {
- for (row=2; row < mrow-2; row++)
- for (col=2; col < mcol-2; col++)
- cielab (rgb[d][row][col], lab[row][col]);
- for (f=dir[d & 3],row=3; row < mrow-3; row++)
- for (col=3; col < mcol-3; col++) {
- lix = &lab[row][col];
- g = 2*lix[0][0] - lix[f][0] - lix[-f][0];
- drv[d][row][col] = SQR(g)
- + SQR((2*lix[0][1] - lix[f][1] - lix[-f][1] + g*500/232))
- + SQR((2*lix[0][2] - lix[f][2] - lix[-f][2] - g*500/580));
- }
- }
-
-/* Build homogeneity maps from the derivatives: */
- memset(homo, 0, ndir*TS*TS);
- for (row=4; row < mrow-4; row++)
- for (col=4; col < mcol-4; col++) {
- for (tr=FLT_MAX, d=0; d < ndir; d++)
- if (tr > drv[d][row][col])
- tr = drv[d][row][col];
- tr *= 8;
- for (d=0; d < ndir; d++)
- for (v=-1; v <= 1; v++)
- for (h=-1; h <= 1; h++)
- if (drv[d][row+v][col+h] <= tr)
- homo[d][row][col]++;
- }
-
-/* Average the most homogenous pixels for the final result: */
- if (height-top < TS+4) mrow = height-top+2;
- if (width-left < TS+4) mcol = width-left+2;
- for (row = MIN(top,8); row < mrow-8; row++)
- for (col = MIN(left,8); col < mcol-8; col++) {
- for (d=0; d < ndir; d++)
- for (hm[d]=0, v=-2; v <= 2; v++)
- for (h=-2; h <= 2; h++)
- hm[d] += homo[d][row+v][col+h];
- for (d=0; d < ndir-4; d++)
- if (hm[d] < hm[d+4]) hm[d ] = 0; else
- if (hm[d] > hm[d+4]) hm[d+4] = 0;
- for (max=hm[0],d=1; d < ndir; d++)
- if (max < hm[d]) max = hm[d];
- max -= max >> 3;
- memset (avg, 0, sizeof avg);
- for (d=0; d < ndir; d++)
- if (hm[d] >= max) {
- FORC3 avg[c] += rgb[d][row][col][c];
- avg[3]++;
- }
- FORC3 image[(row+top)*width+col+left][c] = avg[c]/avg[3];
- }
- }
- free(buffer);
- border_interpolate(8);
-}
-#undef fcol
-
-
-#undef TS
-
-void CLASS median_filter()
-{
- ushort (*pix)[4];
- int pass, c, i, j, k, med[9];
- static const uchar opt[] = /* Optimal 9-element median search */
- { 1,2, 4,5, 7,8, 0,1, 3,4, 6,7, 1,2, 4,5, 7,8,
- 0,3, 5,8, 4,7, 3,6, 1,4, 2,5, 4,7, 4,2, 6,4, 4,2 };
-
- for (pass=1; pass <= med_passes; pass++) {
- if (verbose)
- fprintf (stderr,_("Median filter pass %d...\n"), pass);
- for (c=0; c < 3; c+=2) {
- for (pix = image; pix < image+width*height; pix++)
- pix[0][3] = pix[0][c];
- for (pix = image+width; pix < image+width*(height-1); pix++) {
- if ((pix-image+1) % width < 2) continue;
- for (k=0, i = -width; i <= width; i += width)
- for (j = i-1; j <= i+1; j++)
- med[k++] = pix[j][3] - pix[j][1];
- for (i=0; i < sizeof opt; i+=2)
- if (med[opt[i]] > med[opt[i+1]])
- SWAP (med[opt[i]] , med[opt[i+1]]);
- pix[0][c] = CLIP(med[4] + pix[0][1]);
- }
- }
- }
-}
-
-void CLASS blend_highlights()
-{
- int clip=INT_MAX, row, col, c, i, j;
- static const float trans[2][4][4] =
- { { { 1,1,1 }, { 1.7320508,-1.7320508,0 }, { -1,-1,2 } },
- { { 1,1,1,1 }, { 1,-1,1,-1 }, { 1,1,-1,-1 }, { 1,-1,-1,1 } } };
- static const float itrans[2][4][4] =
- { { { 1,0.8660254,-0.5 }, { 1,-0.8660254,-0.5 }, { 1,0,1 } },
- { { 1,1,1,1 }, { 1,-1,1,-1 }, { 1,1,-1,-1 }, { 1,-1,-1,1 } } };
- float cam[2][4], lab[2][4], sum[2], chratio;
-
- if ((unsigned) (colors-3) > 1) return;
- if (verbose) fprintf (stderr,_("Blending highlights...\n"));
- FORCC if (clip > (i = 65535*pre_mul[c])) clip = i;
- for (row=0; row < height; row++)
- for (col=0; col < width; col++) {
- FORCC if (image[row*width+col][c] > clip) break;
- if (c == colors) continue;
- FORCC {
- cam[0][c] = image[row*width+col][c];
- cam[1][c] = MIN(cam[0][c],clip);
- }
- for (i=0; i < 2; i++) {
- FORCC for (lab[i][c]=j=0; j < colors; j++)
- lab[i][c] += trans[colors-3][c][j] * cam[i][j];
- for (sum[i]=0,c=1; c < colors; c++)
- sum[i] += SQR(lab[i][c]);
- }
- chratio = sqrt(sum[1]/sum[0]);
- for (c=1; c < colors; c++)
- lab[0][c] *= chratio;
- FORCC for (cam[0][c]=j=0; j < colors; j++)
- cam[0][c] += itrans[colors-3][c][j] * lab[0][j];
- FORCC image[row*width+col][c] = cam[0][c] / colors;
- }
-}
-
-#define SCALE (4 >> shrink)
-void CLASS recover_highlights()
-{
- float *map, sum, wgt, grow;
- int hsat[4], count, spread, change, val, i;
- unsigned high, wide, mrow, mcol, row, col, kc, c, d, y, x;
- ushort *pixel;
- static const signed char dir[8][2] =
- { {-1,-1}, {-1,0}, {-1,1}, {0,1}, {1,1}, {1,0}, {1,-1}, {0,-1} };
-
- if (verbose) fprintf (stderr,_("Rebuilding highlights...\n"));
-
- grow = pow (2, 4-highlight);
- FORCC hsat[c] = 32000 * pre_mul[c];
- for (kc=0, c=1; c < colors; c++)
- if (pre_mul[kc] < pre_mul[c]) kc = c;
- high = height / SCALE;
- wide = width / SCALE;
- map = (float *) calloc (high, wide*sizeof *map);
- merror (map, "recover_highlights()");
- FORCC if (c != kc) {
- memset (map, 0, high*wide*sizeof *map);
- for (mrow=0; mrow < high; mrow++)
- for (mcol=0; mcol < wide; mcol++) {
- sum = wgt = count = 0;
- for (row = mrow*SCALE; row < (mrow+1)*SCALE; row++)
- for (col = mcol*SCALE; col < (mcol+1)*SCALE; col++) {
- pixel = image[row*width+col];
- if (pixel[c] / hsat[c] == 1 && pixel[kc] > 24000) {
- sum += pixel[c];
- wgt += pixel[kc];
- count++;
- }
- }
- if (count == SCALE*SCALE)
- map[mrow*wide+mcol] = sum / wgt;
- }
- for (spread = 32/grow; spread--; ) {
- for (mrow=0; mrow < high; mrow++)
- for (mcol=0; mcol < wide; mcol++) {
- if (map[mrow*wide+mcol]) continue;
- sum = count = 0;
- for (d=0; d < 8; d++) {
- y = mrow + dir[d][0];
- x = mcol + dir[d][1];
- if (y < high && x < wide && map[y*wide+x] > 0) {
- sum += (1 + (d & 1)) * map[y*wide+x];
- count += 1 + (d & 1);
- }
- }
- if (count > 3)
- map[mrow*wide+mcol] = - (sum+grow) / (count+grow);
- }
- for (change=i=0; i < high*wide; i++)
- if (map[i] < 0) {
- map[i] = -map[i];
- change = 1;
- }
- if (!change) break;
- }
- for (i=0; i < high*wide; i++)
- if (map[i] == 0) map[i] = 1;
- for (mrow=0; mrow < high; mrow++)
- for (mcol=0; mcol < wide; mcol++) {
- for (row = mrow*SCALE; row < (mrow+1)*SCALE; row++)
- for (col = mcol*SCALE; col < (mcol+1)*SCALE; col++) {
- pixel = image[row*width+col];
- if (pixel[c] / hsat[c] > 1) {
- val = pixel[kc] * map[mrow*wide+mcol];
- if (pixel[c] < val) pixel[c] = CLIP(val);
- }
- }
- }
- }
- free (map);
-}
-#undef SCALE
+//void CLASS median_filter()
+//{
+// ushort (*pix)[4];
+// int pass, c, i, j, k, med[9];
+// static const uchar opt[] = /* Optimal 9-element median search */
+// { 1,2, 4,5, 7,8, 0,1, 3,4, 6,7, 1,2, 4,5, 7,8,
+// 0,3, 5,8, 4,7, 3,6, 1,4, 2,5, 4,7, 4,2, 6,4, 4,2 };
+//
+// for (pass=1; pass <= med_passes; pass++) {
+// if (verbose)
+// fprintf (stderr,_("Median filter pass %d...\n"), pass);
+// for (c=0; c < 3; c+=2) {
+// for (pix = image; pix < image+width*height; pix++)
+// pix[0][3] = pix[0][c];
+// for (pix = image+width; pix < image+width*(height-1); pix++) {
+// if ((pix-image+1) % width < 2) continue;
+// for (k=0, i = -width; i <= width; i += width)
+// for (j = i-1; j <= i+1; j++)
+// med[k++] = pix[j][3] - pix[j][1];
+// for (i=0; i < sizeof opt; i+=2)
+// if (med[opt[i]] > med[opt[i+1]])
+// SWAP (med[opt[i]] , med[opt[i+1]]);
+// pix[0][c] = CLIP(med[4] + pix[0][1]);
+// }
+// }
+// }
+//}
+//
+//void CLASS blend_highlights()
+//{
+// int clip=INT_MAX, row, col, c, i, j;
+// static const float trans[2][4][4] =
+// { { { 1,1,1 }, { 1.7320508,-1.7320508,0 }, { -1,-1,2 } },
+// { { 1,1,1,1 }, { 1,-1,1,-1 }, { 1,1,-1,-1 }, { 1,-1,-1,1 } } };
+// static const float itrans[2][4][4] =
+// { { { 1,0.8660254,-0.5 }, { 1,-0.8660254,-0.5 }, { 1,0,1 } },
+// { { 1,1,1,1 }, { 1,-1,1,-1 }, { 1,1,-1,-1 }, { 1,-1,-1,1 } } };
+// float cam[2][4], lab[2][4], sum[2], chratio;
+//
+// if ((unsigned) (colors-3) > 1) return;
+// if (verbose) fprintf (stderr,_("Blending highlights...\n"));
+// FORCC if (clip > (i = 65535*pre_mul[c])) clip = i;
+// for (row=0; row < height; row++)
+// for (col=0; col < width; col++) {
+// FORCC if (image[row*width+col][c] > clip) break;
+// if (c == colors) continue;
+// FORCC {
+// cam[0][c] = image[row*width+col][c];
+// cam[1][c] = MIN(cam[0][c],clip);
+// }
+// for (i=0; i < 2; i++) {
+// FORCC for (lab[i][c]=j=0; j < colors; j++)
+// lab[i][c] += trans[colors-3][c][j] * cam[i][j];
+// for (sum[i]=0,c=1; c < colors; c++)
+// sum[i] += SQR(lab[i][c]);
+// }
+// chratio = sqrt(sum[1]/sum[0]);
+// for (c=1; c < colors; c++)
+// lab[0][c] *= chratio;
+// FORCC for (cam[0][c]=j=0; j < colors; j++)
+// cam[0][c] += itrans[colors-3][c][j] * lab[0][j];
+// FORCC image[row*width+col][c] = cam[0][c] / colors;
+// }
+//}
+//
+//#define SCALE (4 >> shrink)
+//void CLASS recover_highlights()
+//{
+// float *map, sum, wgt, grow;
+// int hsat[4], count, spread, change, val, i;
+// unsigned high, wide, mrow, mcol, row, col, kc, c, d, y, x;
+// ushort *pixel;
+// static const signed char dir[8][2] =
+// { {-1,-1}, {-1,0}, {-1,1}, {0,1}, {1,1}, {1,0}, {1,-1}, {0,-1} };
+//
+// if (verbose) fprintf (stderr,_("Rebuilding highlights...\n"));
+//
+// grow = pow (2, 4-highlight);
+// FORCC hsat[c] = 32000 * pre_mul[c];
+// for (kc=0, c=1; c < colors; c++)
+// if (pre_mul[kc] < pre_mul[c]) kc = c;
+// high = height / SCALE;
+// wide = width / SCALE;
+// map = (float *) calloc (high, wide*sizeof *map);
+// merror (map, "recover_highlights()");
+// FORCC if (c != kc) {
+// memset (map, 0, high*wide*sizeof *map);
+// for (mrow=0; mrow < high; mrow++)
+// for (mcol=0; mcol < wide; mcol++) {
+// sum = wgt = count = 0;
+// for (row = mrow*SCALE; row < (mrow+1)*SCALE; row++)
+// for (col = mcol*SCALE; col < (mcol+1)*SCALE; col++) {
+// pixel = image[row*width+col];
+// if (pixel[c] / hsat[c] == 1 && pixel[kc] > 24000) {
+// sum += pixel[c];
+// wgt += pixel[kc];
+// count++;
+// }
+// }
+// if (count == SCALE*SCALE)
+// map[mrow*wide+mcol] = sum / wgt;
+// }
+// for (spread = 32/grow; spread--; ) {
+// for (mrow=0; mrow < high; mrow++)
+// for (mcol=0; mcol < wide; mcol++) {
+// if (map[mrow*wide+mcol]) continue;
+// sum = count = 0;
+// for (d=0; d < 8; d++) {
+// y = mrow + dir[d][0];
+// x = mcol + dir[d][1];
+// if (y < high && x < wide && map[y*wide+x] > 0) {
+// sum += (1 + (d & 1)) * map[y*wide+x];
+// count += 1 + (d & 1);
+// }
+// }
+// if (count > 3)
+// map[mrow*wide+mcol] = - (sum+grow) / (count+grow);
+// }
+// for (change=i=0; i < high*wide; i++)
+// if (map[i] < 0) {
+// map[i] = -map[i];
+// change = 1;
+// }
+// if (!change) break;
+// }
+// for (i=0; i < high*wide; i++)
+// if (map[i] == 0) map[i] = 1;
+// for (mrow=0; mrow < high; mrow++)
+// for (mcol=0; mcol < wide; mcol++) {
+// for (row = mrow*SCALE; row < (mrow+1)*SCALE; row++)
+// for (col = mcol*SCALE; col < (mcol+1)*SCALE; col++) {
+// pixel = image[row*width+col];
+// if (pixel[c] / hsat[c] > 1) {
+// val = pixel[kc] * map[mrow*wide+mcol];
+// if (pixel[c] < val) pixel[c] = CLIP(val);
+// }
+// }
+// }
+// }
+// free (map);
+//}
+//#undef SCALE
void CLASS tiff_get (unsigned base,
unsigned *tag, unsigned *type, unsigned *len, unsigned *save)
@@ -9482,12 +9482,14 @@ dng_skip:
adobe_coeff (make, model);
if(!strncmp(make, "Samsung", 7) && !strncmp(model, "NX1",3))
adobe_coeff (make, model);
- if(!strncmp(make, "Pentax", 6) && !strncmp(model, "K10D",4))
+ if(!strncmp(make, "Pentax", 6) && (!strncmp(model, "K10D",4) || !strncmp(model, "K-70",4)))
adobe_coeff (make, model);
if(!strncmp(make, "Leica", 5) && !strncmp(model, "Q",1))
adobe_coeff (make, model);
if(!strncmp(make, "Leica", 5) && !strncmp(model, "SL",2))
adobe_coeff (make, model);
+ if(!strncmp(make, "XIAOYI", 6) && !strncmp(model, "M1",2))
+ adobe_coeff (make, model);
if (raw_color) adobe_coeff (make, model);
if (load_raw == &CLASS kodak_radc_load_raw)
if (raw_color) adobe_coeff ("Apple","Quicktake");
@@ -9533,55 +9535,55 @@ notraw:
if (flip == UINT_MAX) flip = 0;
}
-#ifndef NO_LCMS
-void CLASS apply_profile (const char *input, const char *output)
-{
- char *prof;
- cmsHPROFILE hInProfile=0, hOutProfile=0;
- cmsHTRANSFORM hTransform;
- FILE *fp;
- unsigned size;
-
- if (strcmp (input, "embed"))
- hInProfile = cmsOpenProfileFromFile (input, "r");
- else if (profile_length) {
- prof = (char *) malloc (profile_length);
- merror (prof, "apply_profile()");
- fseek (ifp, profile_offset, SEEK_SET);
- fread (prof, 1, profile_length, ifp);
- hInProfile = cmsOpenProfileFromMem (prof, profile_length);
- free (prof);
- } else
- fprintf (stderr,_("%s has no embedded profile.\n"), ifname);
- if (!hInProfile) return;
- if (!output)
- hOutProfile = cmsCreate_sRGBProfile();
- else if ((fp = fopen (output, "rb"))) {
- fread (&size, 4, 1, fp);
- fseek (fp, 0, SEEK_SET);
- oprof = (unsigned *) malloc (size = ntohl(size));
- merror (oprof, "apply_profile()");
- fread (oprof, 1, size, fp);
- fclose (fp);
- if (!(hOutProfile = cmsOpenProfileFromMem (oprof, size))) {
- free (oprof);
- oprof = 0;
- }
- } else
- fprintf (stderr,_("Cannot open file %s!\n"), output);
- if (!hOutProfile) goto quit;
- if (verbose)
- fprintf (stderr,_("Applying color profile...\n"));
- hTransform = cmsCreateTransform (hInProfile, TYPE_RGBA_16,
- hOutProfile, TYPE_RGBA_16, INTENT_PERCEPTUAL, 0);
- cmsDoTransform (hTransform, image, image, width*height);
- raw_color = 1; /* Don't use rgb_cam with a profile */
- cmsDeleteTransform (hTransform);
- cmsCloseProfile (hOutProfile);
-quit:
- cmsCloseProfile (hInProfile);
-}
-#endif
+//#ifndef NO_LCMS
+//void CLASS apply_profile (const char *input, const char *output)
+//{
+// char *prof;
+// cmsHPROFILE hInProfile=0, hOutProfile=0;
+// cmsHTRANSFORM hTransform;
+// FILE *fp;
+// unsigned size;
+//
+// if (strcmp (input, "embed"))
+// hInProfile = cmsOpenProfileFromFile (input, "r");
+// else if (profile_length) {
+// prof = (char *) malloc (profile_length);
+// merror (prof, "apply_profile()");
+// fseek (ifp, profile_offset, SEEK_SET);
+// fread (prof, 1, profile_length, ifp);
+// hInProfile = cmsOpenProfileFromMem (prof, profile_length);
+// free (prof);
+// } else
+// fprintf (stderr,_("%s has no embedded profile.\n"), ifname);
+// if (!hInProfile) return;
+// if (!output)
+// hOutProfile = cmsCreate_sRGBProfile();
+// else if ((fp = fopen (output, "rb"))) {
+// fread (&size, 4, 1, fp);
+// fseek (fp, 0, SEEK_SET);
+// oprof = (unsigned *) malloc (size = ntohl(size));
+// merror (oprof, "apply_profile()");
+// fread (oprof, 1, size, fp);
+// fclose (fp);
+// if (!(hOutProfile = cmsOpenProfileFromMem (oprof, size))) {
+// free (oprof);
+// oprof = 0;
+// }
+// } else
+// fprintf (stderr,_("Cannot open file %s!\n"), output);
+// if (!hOutProfile) goto quit;
+// if (verbose)
+// fprintf (stderr,_("Applying color profile...\n"));
+// hTransform = cmsCreateTransform (hInProfile, TYPE_RGBA_16,
+// hOutProfile, TYPE_RGBA_16, INTENT_PERCEPTUAL, 0);
+// cmsDoTransform (hTransform, image, image, width*height);
+// raw_color = 1; /* Don't use rgb_cam with a profile */
+// cmsDeleteTransform (hTransform);
+// cmsCloseProfile (hOutProfile);
+//quit:
+// cmsCloseProfile (hInProfile);
+//}
+//#endif
/* RT: DNG Float */
diff --git a/rtengine/dcraw.h b/rtengine/dcraw.h
index 405f202bd..0a68b02cc 100644
--- a/rtengine/dcraw.h
+++ b/rtengine/dcraw.h
@@ -43,14 +43,14 @@ public:
:exif_base(-1)
,ciff_base(-1)
,ciff_len(0)
- ,ifp(NULL),ofp(NULL)
+ ,ifp(nullptr),ofp(nullptr)
,order(0x4949)
- ,ifname(NULL)
- ,meta_data(NULL)
+ ,ifname(nullptr)
+ ,meta_data(nullptr)
,shot_select(0),multi_out(0)
- ,float_raw_image(NULL)
- ,image(NULL)
- ,bright(1.),threshold(0.)
+ ,float_raw_image(nullptr)
+ ,image(nullptr)
+ ,bright(1.)
,half_size(0),four_color_rgb(0),document_mode(0),highlight(0)
,verbose(0)
,use_auto_wb(0),use_camera_wb(0),use_camera_matrix(1)
@@ -344,23 +344,23 @@ void foveon_make_curves(short **curvep, float dq[3], float div[3], float filt);
int foveon_apply_curve (short *curve, int i);
void foveon_interpolate();
-void xtrans_interpolate (int passes);
-void cielab (ushort rgb[3], short lab[3]);
+//void xtrans_interpolate (int passes);
+//void cielab (ushort rgb[3], short lab[3]);
-void remove_zeroes();
-void bad_pixels (const char *cfname);
-void subtract (const char *fname);
+//void remove_zeroes();
+//void bad_pixels (const char *cfname);
+//void subtract (const char *fname);
void gamma_curve (double pwr, double ts, int mode, int imax);
void pseudoinverse (double (*in)[3], double (*out)[3], int size);
void cam_xyz_coeff (float rgb_cam[3][4], double cam_xyz[4][3]);
-void hat_transform (float *temp, float *base, int st, int size, int sc);
-void wavelet_denoise();
+//void hat_transform (float *temp, float *base, int st, int size, int sc);
+//void wavelet_denoise();
void scale_colors();
void pre_interpolate();
-void border_interpolate (int border);
-void median_filter();
-void blend_highlights();
-void recover_highlights();
+//void border_interpolate (int border);
+//void median_filter();
+//void blend_highlights();
+//void recover_highlights();
void crop_masked_pixels();
void tiff_get (unsigned base, unsigned *tag, unsigned *type, unsigned *len, unsigned *save);
@@ -397,7 +397,6 @@ void simple_coeff (int index);
short guess_byte_order (int words);
float find_green (int bps, int bite, int off0, int off1);
void identify();
-void apply_profile (const char *input, const char *output);
void jpeg_thumb() {} // not needed
bool dcraw_coeff_overrides(const char make[], const char model[], int iso_speed, short trans[12], int *black_level, int *white_level);
void shiftXtransMatrix( const int offsy, const int offsx) {
diff --git a/rtengine/dcraw.patch b/rtengine/dcraw.patch
index 82f2ec9b8..22c53d831 100644
--- a/rtengine/dcraw.patch
+++ b/rtengine/dcraw.patch
@@ -1,5 +1,5 @@
---- dcraw.c 2016-09-30 21:19:28.312191811 +0200
-+++ dcraw.cc 2016-09-30 22:41:28.157442526 +0200
+--- dcraw.c 2016-10-28 13:45:27 +0000
++++ dcraw.cc 2016-10-31 13:35:15 +0000
@@ -1,3 +1,16 @@
+/*RT*/#include
+/*RT*/#include
@@ -833,10 +833,468 @@
if (mask[0][3] > 0) goto mask_set;
if (load_raw == &CLASS canon_load_raw ||
load_raw == &CLASS lossless_jpeg_load_raw) {
-@@ -4366,239 +4690,8 @@
- }
+@@ -3808,127 +4132,127 @@
+ }
}
+-void CLASS remove_zeroes()
+-{
+- unsigned row, col, tot, n, r, c;
+-
+- for (row=0; row < height; row++)
+- for (col=0; col < width; col++)
+- if (BAYER(row,col) == 0) {
+- tot = n = 0;
+- for (r = row-2; r <= row+2; r++)
+- for (c = col-2; c <= col+2; c++)
+- if (r < height && c < width &&
+- FC(r,c) == FC(row,col) && BAYER(r,c))
+- tot += (n++,BAYER(r,c));
+- if (n) BAYER(row,col) = tot/n;
+- }
+-}
++//void CLASS remove_zeroes()
++//{
++// unsigned row, col, tot, n, r, c;
++//
++// for (row=0; row < height; row++)
++// for (col=0; col < width; col++)
++// if (BAYER(row,col) == 0) {
++// tot = n = 0;
++// for (r = row-2; r <= row+2; r++)
++// for (c = col-2; c <= col+2; c++)
++// if (r < height && c < width &&
++// FC(r,c) == FC(row,col) && BAYER(r,c))
++// tot += (n++,BAYER(r,c));
++// if (n) BAYER(row,col) = tot/n;
++// }
++//}
+
+ /*
+ Seach from the current directory up to the root looking for
+ a ".badpixels" file, and fix those pixels now.
+ */
+-void CLASS bad_pixels (const char *cfname)
+-{
+- FILE *fp=0;
+- char *fname, *cp, line[128];
+- int len, time, row, col, r, c, rad, tot, n, fixed=0;
+-
+- if (!filters) return;
+- if (cfname)
+- fp = fopen (cfname, "r");
+- else {
+- for (len=32 ; ; len *= 2) {
+- fname = (char *) malloc (len);
+- if (!fname) return;
+- if (getcwd (fname, len-16)) break;
+- free (fname);
+- if (errno != ERANGE) return;
+- }
+-#if defined(WIN32) || defined(DJGPP)
+- if (fname[1] == ':')
+- memmove (fname, fname+2, len-2);
+- for (cp=fname; *cp; cp++)
+- if (*cp == '\\') *cp = '/';
+-#endif
+- cp = fname + strlen(fname);
+- if (cp[-1] == '/') cp--;
+- while (*fname == '/') {
+- strcpy (cp, "/.badpixels");
+- if ((fp = fopen (fname, "r"))) break;
+- if (cp == fname) break;
+- while (*--cp != '/');
+- }
+- free (fname);
+- }
+- if (!fp) return;
+- while (fgets (line, 128, fp)) {
+- cp = strchr (line, '#');
+- if (cp) *cp = 0;
+- if (sscanf (line, "%d %d %d", &col, &row, &time) != 3) continue;
+- if ((unsigned) col >= width || (unsigned) row >= height) continue;
+- if (time > timestamp) continue;
+- for (tot=n=0, rad=1; rad < 3 && n==0; rad++)
+- for (r = row-rad; r <= row+rad; r++)
+- for (c = col-rad; c <= col+rad; c++)
+- if ((unsigned) r < height && (unsigned) c < width &&
+- (r != row || c != col) && fcol(r,c) == fcol(row,col)) {
+- tot += BAYER2(r,c);
+- n++;
+- }
+- BAYER2(row,col) = tot/n;
+- if (verbose) {
+- if (!fixed++)
+- fprintf (stderr,_("Fixed dead pixels at:"));
+- fprintf (stderr, " %d,%d", col, row);
+- }
+- }
+- if (fixed) fputc ('\n', stderr);
+- fclose (fp);
+-}
+-
+-void CLASS subtract (const char *fname)
+-{
+- FILE *fp;
+- int dim[3]={0,0,0}, comment=0, number=0, error=0, nd=0, c, row, col;
+- ushort *pixel;
+-
+- if (!(fp = fopen (fname, "rb"))) {
+- perror (fname); return;
+- }
+- if (fgetc(fp) != 'P' || fgetc(fp) != '5') error = 1;
+- while (!error && nd < 3 && (c = fgetc(fp)) != EOF) {
+- if (c == '#') comment = 1;
+- if (c == '\n') comment = 0;
+- if (comment) continue;
+- if (isdigit(c)) number = 1;
+- if (number) {
+- if (isdigit(c)) dim[nd] = dim[nd]*10 + c -'0';
+- else if (isspace(c)) {
+- number = 0; nd++;
+- } else error = 1;
+- }
+- }
+- if (error || nd < 3) {
+- fprintf (stderr,_("%s is not a valid PGM file!\n"), fname);
+- fclose (fp); return;
+- } else if (dim[0] != width || dim[1] != height || dim[2] != 65535) {
+- fprintf (stderr,_("%s has the wrong dimensions!\n"), fname);
+- fclose (fp); return;
+- }
+- pixel = (ushort *) calloc (width, sizeof *pixel);
+- merror (pixel, "subtract()");
+- for (row=0; row < height; row++) {
+- fread (pixel, 2, width, fp);
+- for (col=0; col < width; col++)
+- BAYER(row,col) = MAX (BAYER(row,col) - ntohs(pixel[col]), 0);
+- }
+- free (pixel);
+- fclose (fp);
+- memset (cblack, 0, sizeof cblack);
+- black = 0;
+-}
++//void CLASS bad_pixels (const char *cfname)
++//{
++// FILE *fp=0;
++// char *fname, *cp, line[128];
++// int len, time, row, col, r, c, rad, tot, n, fixed=0;
++//
++// if (!filters) return;
++// if (cfname)
++// fp = fopen (cfname, "r");
++// else {
++// for (len=32 ; ; len *= 2) {
++// fname = (char *) malloc (len);
++// if (!fname) return;
++// if (getcwd (fname, len-16)) break;
++// free (fname);
++// if (errno != ERANGE) return;
++// }
++//#if defined(WIN32) || defined(DJGPP)
++// if (fname[1] == ':')
++// memmove (fname, fname+2, len-2);
++// for (cp=fname; *cp; cp++)
++// if (*cp == '\\') *cp = '/';
++//#endif
++// cp = fname + strlen(fname);
++// if (cp[-1] == '/') cp--;
++// while (*fname == '/') {
++// strcpy (cp, "/.badpixels");
++// if ((fp = fopen (fname, "r"))) break;
++// if (cp == fname) break;
++// while (*--cp != '/');
++// }
++// free (fname);
++// }
++// if (!fp) return;
++// while (fgets (line, 128, fp)) {
++// cp = strchr (line, '#');
++// if (cp) *cp = 0;
++// if (sscanf (line, "%d %d %d", &col, &row, &time) != 3) continue;
++// if ((unsigned) col >= width || (unsigned) row >= height) continue;
++// if (time > timestamp) continue;
++// for (tot=n=0, rad=1; rad < 3 && n==0; rad++)
++// for (r = row-rad; r <= row+rad; r++)
++// for (c = col-rad; c <= col+rad; c++)
++// if ((unsigned) r < height && (unsigned) c < width &&
++// (r != row || c != col) && fcol(r,c) == fcol(row,col)) {
++// tot += BAYER2(r,c);
++// n++;
++// }
++// BAYER2(row,col) = tot/n;
++// if (verbose) {
++// if (!fixed++)
++// fprintf (stderr,_("Fixed dead pixels at:"));
++// fprintf (stderr, " %d,%d", col, row);
++// }
++// }
++// if (fixed) fputc ('\n', stderr);
++// fclose (fp);
++//}
++
++//void CLASS subtract (const char *fname)
++//{
++// FILE *fp;
++// int dim[3]={0,0,0}, comment=0, number=0, error=0, nd=0, c, row, col;
++// ushort *pixel;
++//
++// if (!(fp = fopen (fname, "rb"))) {
++// perror (fname); return;
++// }
++// if (fgetc(fp) != 'P' || fgetc(fp) != '5') error = 1;
++// while (!error && nd < 3 && (c = fgetc(fp)) != EOF) {
++// if (c == '#') comment = 1;
++// if (c == '\n') comment = 0;
++// if (comment) continue;
++// if (isdigit(c)) number = 1;
++// if (number) {
++// if (isdigit(c)) dim[nd] = dim[nd]*10 + c -'0';
++// else if (isspace(c)) {
++// number = 0; nd++;
++// } else error = 1;
++// }
++// }
++// if (error || nd < 3) {
++// fprintf (stderr,_("%s is not a valid PGM file!\n"), fname);
++// fclose (fp); return;
++// } else if (dim[0] != width || dim[1] != height || dim[2] != 65535) {
++// fprintf (stderr,_("%s has the wrong dimensions!\n"), fname);
++// fclose (fp); return;
++// }
++// pixel = (ushort *) calloc (width, sizeof *pixel);
++// merror (pixel, "subtract()");
++// for (row=0; row < height; row++) {
++// fread (pixel, 2, width, fp);
++// for (col=0; col < width; col++)
++// BAYER(row,col) = MAX (BAYER(row,col) - ntohs(pixel[col]), 0);
++// }
++// free (pixel);
++// fclose (fp);
++// memset (cblack, 0, sizeof cblack);
++// black = 0;
++//}
+
+ void CLASS gamma_curve (double pwr, double ts, int mode, int imax)
+ {
+@@ -4093,94 +4417,94 @@
+ }
+ #endif
+
+-void CLASS hat_transform (float *temp, float *base, int st, int size, int sc)
+-{
+- int i;
+- for (i=0; i < sc; i++)
+- temp[i] = 2*base[st*i] + base[st*(sc-i)] + base[st*(i+sc)];
+- for (; i+sc < size; i++)
+- temp[i] = 2*base[st*i] + base[st*(i-sc)] + base[st*(i+sc)];
+- for (; i < size; i++)
+- temp[i] = 2*base[st*i] + base[st*(i-sc)] + base[st*(2*size-2-(i+sc))];
+-}
+-
+-void CLASS wavelet_denoise()
+-{
+- float *fimg=0, *temp, thold, mul[2], avg, diff;
+- int scale=1, size, lev, hpass, lpass, row, col, nc, c, i, wlast, blk[2];
+- ushort *window[4];
+- static const float noise[] =
+- { 0.8002,0.2735,0.1202,0.0585,0.0291,0.0152,0.0080,0.0044 };
+-
+- if (verbose) fprintf (stderr,_("Wavelet denoising...\n"));
+-
+- while (maximum << scale < 0x10000) scale++;
+- maximum <<= --scale;
+- black <<= scale;
+- FORC4 cblack[c] <<= scale;
+- if ((size = iheight*iwidth) < 0x15550000)
+- fimg = (float *) malloc ((size*3 + iheight + iwidth) * sizeof *fimg);
+- merror (fimg, "wavelet_denoise()");
+- temp = fimg + size*3;
+- if ((nc = colors) == 3 && filters) nc++;
+- FORC(nc) { /* denoise R,G1,B,G3 individually */
+- for (i=0; i < size; i++)
+- fimg[i] = 256 * sqrt(image[i][c] << scale);
+- for (hpass=lev=0; lev < 5; lev++) {
+- lpass = size*((lev & 1)+1);
+- for (row=0; row < iheight; row++) {
+- hat_transform (temp, fimg+hpass+row*iwidth, 1, iwidth, 1 << lev);
+- for (col=0; col < iwidth; col++)
+- fimg[lpass + row*iwidth + col] = temp[col] * 0.25;
+- }
+- for (col=0; col < iwidth; col++) {
+- hat_transform (temp, fimg+lpass+col, iwidth, iheight, 1 << lev);
+- for (row=0; row < iheight; row++)
+- fimg[lpass + row*iwidth + col] = temp[row] * 0.25;
+- }
+- thold = threshold * noise[lev];
+- for (i=0; i < size; i++) {
+- fimg[hpass+i] -= fimg[lpass+i];
+- if (fimg[hpass+i] < -thold) fimg[hpass+i] += thold;
+- else if (fimg[hpass+i] > thold) fimg[hpass+i] -= thold;
+- else fimg[hpass+i] = 0;
+- if (hpass) fimg[i] += fimg[hpass+i];
+- }
+- hpass = lpass;
+- }
+- for (i=0; i < size; i++)
+- image[i][c] = CLIP(SQR(fimg[i]+fimg[lpass+i])/0x10000);
+- }
+- if (filters && colors == 3) { /* pull G1 and G3 closer together */
+- for (row=0; row < 2; row++) {
+- mul[row] = 0.125 * pre_mul[FC(row+1,0) | 1] / pre_mul[FC(row,0) | 1];
+- blk[row] = cblack[FC(row,0) | 1];
+- }
+- for (i=0; i < 4; i++)
+- window[i] = (ushort *) fimg + width*i;
+- for (wlast=-1, row=1; row < height-1; row++) {
+- while (wlast < row+1) {
+- for (wlast++, i=0; i < 4; i++)
+- window[(i+3) & 3] = window[i];
+- for (col = FC(wlast,1) & 1; col < width; col+=2)
+- window[2][col] = BAYER(wlast,col);
+- }
+- thold = threshold/512;
+- for (col = (FC(row,0) & 1)+1; col < width-1; col+=2) {
+- avg = ( window[0][col-1] + window[0][col+1] +
+- window[2][col-1] + window[2][col+1] - blk[~row & 1]*4 )
+- * mul[row & 1] + (window[1][col] + blk[row & 1]) * 0.5;
+- avg = avg < 0 ? 0 : sqrt(avg);
+- diff = sqrt(BAYER(row,col)) - avg;
+- if (diff < -thold) diff += thold;
+- else if (diff > thold) diff -= thold;
+- else diff = 0;
+- BAYER(row,col) = CLIP(SQR(avg+diff) + 0.5);
+- }
+- }
+- }
+- free (fimg);
+-}
++//void CLASS hat_transform (float *temp, float *base, int st, int size, int sc)
++//{
++// int i;
++// for (i=0; i < sc; i++)
++// temp[i] = 2*base[st*i] + base[st*(sc-i)] + base[st*(i+sc)];
++// for (; i+sc < size; i++)
++// temp[i] = 2*base[st*i] + base[st*(i-sc)] + base[st*(i+sc)];
++// for (; i < size; i++)
++// temp[i] = 2*base[st*i] + base[st*(i-sc)] + base[st*(2*size-2-(i+sc))];
++//}
++
++//void CLASS wavelet_denoise()
++//{
++// float *fimg=0, *temp, thold, mul[2], avg, diff;
++// int scale=1, size, lev, hpass, lpass, row, col, nc, c, i, wlast, blk[2];
++// ushort *window[4];
++// static const float noise[] =
++// { 0.8002,0.2735,0.1202,0.0585,0.0291,0.0152,0.0080,0.0044 };
++//
++// if (verbose) fprintf (stderr,_("Wavelet denoising...\n"));
++//
++// while (maximum << scale < 0x10000) scale++;
++// maximum <<= --scale;
++// black <<= scale;
++// FORC4 cblack[c] <<= scale;
++// if ((size = iheight*iwidth) < 0x15550000)
++// fimg = (float *) malloc ((size*3 + iheight + iwidth) * sizeof *fimg);
++// merror (fimg, "wavelet_denoise()");
++// temp = fimg + size*3;
++// if ((nc = colors) == 3 && filters) nc++;
++// FORC(nc) { /* denoise R,G1,B,G3 individually */
++// for (i=0; i < size; i++)
++// fimg[i] = 256 * sqrt(image[i][c] << scale);
++// for (hpass=lev=0; lev < 5; lev++) {
++// lpass = size*((lev & 1)+1);
++// for (row=0; row < iheight; row++) {
++// hat_transform (temp, fimg+hpass+row*iwidth, 1, iwidth, 1 << lev);
++// for (col=0; col < iwidth; col++)
++// fimg[lpass + row*iwidth + col] = temp[col] * 0.25;
++// }
++// for (col=0; col < iwidth; col++) {
++// hat_transform (temp, fimg+lpass+col, iwidth, iheight, 1 << lev);
++// for (row=0; row < iheight; row++)
++// fimg[lpass + row*iwidth + col] = temp[row] * 0.25;
++// }
++// thold = threshold * noise[lev];
++// for (i=0; i < size; i++) {
++// fimg[hpass+i] -= fimg[lpass+i];
++// if (fimg[hpass+i] < -thold) fimg[hpass+i] += thold;
++// else if (fimg[hpass+i] > thold) fimg[hpass+i] -= thold;
++// else fimg[hpass+i] = 0;
++// if (hpass) fimg[i] += fimg[hpass+i];
++// }
++// hpass = lpass;
++// }
++// for (i=0; i < size; i++)
++// image[i][c] = CLIP(SQR(fimg[i]+fimg[lpass+i])/0x10000);
++// }
++// if (filters && colors == 3) { /* pull G1 and G3 closer together */
++// for (row=0; row < 2; row++) {
++// mul[row] = 0.125 * pre_mul[FC(row+1,0) | 1] / pre_mul[FC(row,0) | 1];
++// blk[row] = cblack[FC(row,0) | 1];
++// }
++// for (i=0; i < 4; i++)
++// window[i] = (ushort *) fimg + width*i;
++// for (wlast=-1, row=1; row < height-1; row++) {
++// while (wlast < row+1) {
++// for (wlast++, i=0; i < 4; i++)
++// window[(i+3) & 3] = window[i];
++// for (col = FC(wlast,1) & 1; col < width; col+=2)
++// window[2][col] = BAYER(wlast,col);
++// }
++// thold = threshold/512;
++// for (col = (FC(row,0) & 1)+1; col < width-1; col+=2) {
++// avg = ( window[0][col-1] + window[0][col+1] +
++// window[2][col-1] + window[2][col+1] - blk[~row & 1]*4 )
++// * mul[row & 1] + (window[1][col] + blk[row & 1]) * 0.5;
++// avg = avg < 0 ? 0 : sqrt(avg);
++// diff = sqrt(BAYER(row,col)) - avg;
++// if (diff < -thold) diff += thold;
++// else if (diff > thold) diff -= thold;
++// else diff = 0;
++// BAYER(row,col) = CLIP(SQR(avg+diff) + 0.5);
++// }
++// }
++// }
++// free (fimg);
++//}
+
+ void CLASS scale_colors()
+ {
+@@ -4238,7 +4562,7 @@
+ if (pre_mul[3] == 0) pre_mul[3] = colors < 4 ? pre_mul[1] : 1;
+ dark = black;
+ sat = maximum;
+- if (threshold) wavelet_denoise();
++// if (threshold) wavelet_denoise();
+ maximum -= black;
+ for (dmin=DBL_MAX, dmax=c=0; c < 4; c++) {
+ if (dmin > pre_mul[c])
+@@ -4344,776 +4668,440 @@
+ if (half_size) filters = 0;
+ }
+
+-void CLASS border_interpolate (int border)
+-{
+- unsigned row, col, y, x, f, c, sum[8];
+-
+- for (row=0; row < height; row++)
+- for (col=0; col < width; col++) {
+- if (col==border && row >= border && row < height-border)
+- col = width-border;
+- memset (sum, 0, sizeof sum);
+- for (y=row-1; y != row+2; y++)
+- for (x=col-1; x != col+2; x++)
+- if (y < height && x < width) {
+- f = fcol(y,x);
+- sum[f] += image[y*width+x][f];
+- sum[f+4]++;
+- }
+- f = fcol(row,col);
+- FORCC if (c != f && sum[c+4])
+- image[row*width+col][c] = sum[c] / sum[c+4];
+- }
+-}
+-
-void CLASS lin_interpolate()
-{
- int code[16][16][32], size=16, *ip, sum[4];
@@ -884,8 +1342,7 @@
- This algorithm is officially called:
-
- "Interpolation using a Threshold-based variable number of gradients"
-+/* RT: delete interpolation functions */
-
+-
- described in http://scien.stanford.edu/pages/labsite/1999/psych221/projects/99/tingchen/algodep/vargra.html
-
- I've extended the basic idea to work with non-Bayer filter arrays.
@@ -1071,13 +1528,271 @@
- pix[0][c] = CLIP((guess[0]+guess[1]) >> 2);
- }
-}
-
- void CLASS cielab (ushort rgb[3], short lab[3])
- {
-@@ -4864,112 +4957,7 @@
- }
- #undef fcol
-
+-
+-void CLASS cielab (ushort rgb[3], short lab[3])
+-{
+- int c, i, j, k;
+- float r, xyz[3];
+- static float cbrt[0x10000], xyz_cam[3][4];
+-
+- if (!rgb) {
+- for (i=0; i < 0x10000; i++) {
+- r = i / 65535.0;
+- cbrt[i] = r > 0.008856 ? pow(r,1/3.0) : 7.787*r + 16/116.0;
+- }
+- for (i=0; i < 3; i++)
+- for (j=0; j < colors; j++)
+- for (xyz_cam[i][j] = k=0; k < 3; k++)
+- xyz_cam[i][j] += xyz_rgb[i][k] * rgb_cam[k][j] / d65_white[i];
+- return;
+- }
+- xyz[0] = xyz[1] = xyz[2] = 0.5;
+- FORCC {
+- xyz[0] += xyz_cam[0][c] * rgb[c];
+- xyz[1] += xyz_cam[1][c] * rgb[c];
+- xyz[2] += xyz_cam[2][c] * rgb[c];
+- }
+- xyz[0] = cbrt[CLIP((int) xyz[0])];
+- xyz[1] = cbrt[CLIP((int) xyz[1])];
+- xyz[2] = cbrt[CLIP((int) xyz[2])];
+- lab[0] = 64 * (116 * xyz[1] - 16);
+- lab[1] = 64 * 500 * (xyz[0] - xyz[1]);
+- lab[2] = 64 * 200 * (xyz[1] - xyz[2]);
+-}
+-
+-#define TS 512 /* Tile Size */
+-#define fcol(row,col) xtrans[(row+6) % 6][(col+6) % 6]
+-
+-/*
+- Frank Markesteijn's algorithm for Fuji X-Trans sensors
+- */
+-void CLASS xtrans_interpolate (int passes)
+-{
+- int c, d, f, g, h, i, v, ng, row, col, top, left, mrow, mcol;
+- int val, ndir, pass, hm[8], avg[4], color[3][8];
+- static const short orth[12] = { 1,0,0,1,-1,0,0,-1,1,0,0,1 },
+- patt[2][16] = { { 0,1,0,-1,2,0,-1,0,1,1,1,-1,0,0,0,0 },
+- { 0,1,0,-2,1,0,-2,0,1,1,-2,-2,1,-1,-1,1 } },
+- dir[4] = { 1,TS,TS+1,TS-1 };
+- short allhex[3][3][2][8], *hex;
+- ushort min, max, sgrow, sgcol;
+- ushort (*rgb)[TS][TS][3], (*rix)[3], (*pix)[4];
+- short (*lab) [TS][3], (*lix)[3];
+- float (*drv)[TS][TS], diff[6], tr;
+- char (*homo)[TS][TS], *buffer;
+-
+- if (verbose)
+- fprintf (stderr,_("%d-pass X-Trans interpolation...\n"), passes);
+-
+- cielab (0,0);
+- ndir = 4 << (passes > 1);
+- buffer = (char *) malloc (TS*TS*(ndir*11+6));
+- merror (buffer, "xtrans_interpolate()");
+- rgb = (ushort(*)[TS][TS][3]) buffer;
+- lab = (short (*) [TS][3])(buffer + TS*TS*(ndir*6));
+- drv = (float (*)[TS][TS]) (buffer + TS*TS*(ndir*6+6));
+- homo = (char (*)[TS][TS]) (buffer + TS*TS*(ndir*10+6));
+-
+-/* Map a green hexagon around each non-green pixel and vice versa: */
+- for (row=0; row < 3; row++)
+- for (col=0; col < 3; col++)
+- for (ng=d=0; d < 10; d+=2) {
+- g = fcol(row,col) == 1;
+- if (fcol(row+orth[d],col+orth[d+2]) == 1) ng=0; else ng++;
+- if (ng == 4) { sgrow = row; sgcol = col; }
+- if (ng == g+1) FORC(8) {
+- v = orth[d ]*patt[g][c*2] + orth[d+1]*patt[g][c*2+1];
+- h = orth[d+2]*patt[g][c*2] + orth[d+3]*patt[g][c*2+1];
+- allhex[row][col][0][c^(g*2 & d)] = h + v*width;
+- allhex[row][col][1][c^(g*2 & d)] = h + v*TS;
+- }
+- }
+-
+-/* Set green1 and green3 to the minimum and maximum allowed values: */
+- for (row=2; row < height-2; row++)
+- for (min=~(max=0), col=2; col < width-2; col++) {
+- if (fcol(row,col) == 1 && (min=~(max=0))) continue;
+- pix = image + row*width + col;
+- hex = allhex[row % 3][col % 3][0];
+- if (!max) FORC(6) {
+- val = pix[hex[c]][1];
+- if (min > val) min = val;
+- if (max < val) max = val;
+- }
+- pix[0][1] = min;
+- pix[0][3] = max;
+- switch ((row-sgrow) % 3) {
+- case 1: if (row < height-3) { row++; col--; } break;
+- case 2: if ((min=~(max=0)) && (col+=2) < width-3 && row > 2) row--;
+- }
+- }
+-
+- for (top=3; top < height-19; top += TS-16)
+- for (left=3; left < width-19; left += TS-16) {
+- mrow = MIN (top+TS, height-3);
+- mcol = MIN (left+TS, width-3);
+- for (row=top; row < mrow; row++)
+- for (col=left; col < mcol; col++)
+- memcpy (rgb[0][row-top][col-left], image[row*width+col], 6);
+- FORC3 memcpy (rgb[c+1], rgb[0], sizeof *rgb);
+-
+-/* Interpolate green horizontally, vertically, and along both diagonals: */
+- for (row=top; row < mrow; row++)
+- for (col=left; col < mcol; col++) {
+- if ((f = fcol(row,col)) == 1) continue;
+- pix = image + row*width + col;
+- hex = allhex[row % 3][col % 3][0];
+- color[1][0] = 174 * (pix[ hex[1]][1] + pix[ hex[0]][1]) -
+- 46 * (pix[2*hex[1]][1] + pix[2*hex[0]][1]);
+- color[1][1] = 223 * pix[ hex[3]][1] + pix[ hex[2]][1] * 33 +
+- 92 * (pix[ 0 ][f] - pix[ -hex[2]][f]);
+- FORC(2) color[1][2+c] =
+- 164 * pix[hex[4+c]][1] + 92 * pix[-2*hex[4+c]][1] + 33 *
+- (2*pix[0][f] - pix[3*hex[4+c]][f] - pix[-3*hex[4+c]][f]);
+- FORC4 rgb[c^!((row-sgrow) % 3)][row-top][col-left][1] =
+- LIM(color[1][c] >> 8,pix[0][1],pix[0][3]);
+- }
+-
+- for (pass=0; pass < passes; pass++) {
+- if (pass == 1)
+- memcpy (rgb+=4, buffer, 4*sizeof *rgb);
+-
+-/* Recalculate green from interpolated values of closer pixels: */
+- if (pass) {
+- for (row=top+2; row < mrow-2; row++)
+- for (col=left+2; col < mcol-2; col++) {
+- if ((f = fcol(row,col)) == 1) continue;
+- pix = image + row*width + col;
+- hex = allhex[row % 3][col % 3][1];
+- for (d=3; d < 6; d++) {
+- rix = &rgb[(d-2)^!((row-sgrow) % 3)][row-top][col-left];
+- val = rix[-2*hex[d]][1] + 2*rix[hex[d]][1]
+- - rix[-2*hex[d]][f] - 2*rix[hex[d]][f] + 3*rix[0][f];
+- rix[0][1] = LIM(val/3,pix[0][1],pix[0][3]);
+- }
+- }
+- }
+-
+-/* Interpolate red and blue values for solitary green pixels: */
+- for (row=(top-sgrow+4)/3*3+sgrow; row < mrow-2; row+=3)
+- for (col=(left-sgcol+4)/3*3+sgcol; col < mcol-2; col+=3) {
+- rix = &rgb[0][row-top][col-left];
+- h = fcol(row,col+1);
+- memset (diff, 0, sizeof diff);
+- for (i=1, d=0; d < 6; d++, i^=TS^1, h^=2) {
+- for (c=0; c < 2; c++, h^=2) {
+- g = 2*rix[0][1] - rix[i< 1)
+- diff[d] += SQR (rix[i< 1 && (d & 1))
+- if (diff[d-1] < diff[d])
+- FORC(2) color[c*2][d] = color[c*2][d-1];
+- if (d < 2 || (d & 1)) {
+- FORC(2) rix[0][c*2] = CLIP(color[c*2][d]/2);
+- rix += TS*TS;
+- }
+- }
+- }
+-
+-/* Interpolate red for blue pixels and vice versa: */
+- for (row=top+3; row < mrow-3; row++)
+- for (col=left+3; col < mcol-3; col++) {
+- if ((f = 2-fcol(row,col)) == 1) continue;
+- rix = &rgb[0][row-top][col-left];
+- c = (row-sgrow) % 3 ? TS:1;
+- h = 3 * (c ^ TS ^ 1);
+- for (d=0; d < 4; d++, rix += TS*TS) {
+- i = d > 1 || ((d ^ c) & 1) ||
+- ((ABS(rix[0][1]-rix[c][1])+ABS(rix[0][1]-rix[-c][1])) <
+- 2*(ABS(rix[0][1]-rix[h][1])+ABS(rix[0][1]-rix[-h][1]))) ? c:h;
+- rix[0][f] = CLIP((rix[i][f] + rix[-i][f] +
+- 2*rix[0][1] - rix[i][1] - rix[-i][1])/2);
+- }
+- }
+-
+-/* Fill in red and blue for 2x2 blocks of green: */
+- for (row=top+2; row < mrow-2; row++) if ((row-sgrow) % 3)
+- for (col=left+2; col < mcol-2; col++) if ((col-sgcol) % 3) {
+- rix = &rgb[0][row-top][col-left];
+- hex = allhex[row % 3][col % 3][1];
+- for (d=0; d < ndir; d+=2, rix += TS*TS)
+- if (hex[d] + hex[d+1]) {
+- g = 3*rix[0][1] - 2*rix[hex[d]][1] - rix[hex[d+1]][1];
+- for (c=0; c < 4; c+=2) rix[0][c] =
+- CLIP((g + 2*rix[hex[d]][c] + rix[hex[d+1]][c])/3);
+- } else {
+- g = 2*rix[0][1] - rix[hex[d]][1] - rix[hex[d+1]][1];
+- for (c=0; c < 4; c+=2) rix[0][c] =
+- CLIP((g + rix[hex[d]][c] + rix[hex[d+1]][c])/2);
+- }
+- }
+- }
+- rgb = (ushort(*)[TS][TS][3]) buffer;
+- mrow -= top;
+- mcol -= left;
+-
+-/* Convert to CIELab and differentiate in all directions: */
+- for (d=0; d < ndir; d++) {
+- for (row=2; row < mrow-2; row++)
+- for (col=2; col < mcol-2; col++)
+- cielab (rgb[d][row][col], lab[row][col]);
+- for (f=dir[d & 3],row=3; row < mrow-3; row++)
+- for (col=3; col < mcol-3; col++) {
+- lix = &lab[row][col];
+- g = 2*lix[0][0] - lix[f][0] - lix[-f][0];
+- drv[d][row][col] = SQR(g)
+- + SQR((2*lix[0][1] - lix[f][1] - lix[-f][1] + g*500/232))
+- + SQR((2*lix[0][2] - lix[f][2] - lix[-f][2] - g*500/580));
+- }
+- }
+-
+-/* Build homogeneity maps from the derivatives: */
+- memset(homo, 0, ndir*TS*TS);
+- for (row=4; row < mrow-4; row++)
+- for (col=4; col < mcol-4; col++) {
+- for (tr=FLT_MAX, d=0; d < ndir; d++)
+- if (tr > drv[d][row][col])
+- tr = drv[d][row][col];
+- tr *= 8;
+- for (d=0; d < ndir; d++)
+- for (v=-1; v <= 1; v++)
+- for (h=-1; h <= 1; h++)
+- if (drv[d][row+v][col+h] <= tr)
+- homo[d][row][col]++;
+- }
+-
+-/* Average the most homogenous pixels for the final result: */
+- if (height-top < TS+4) mrow = height-top+2;
+- if (width-left < TS+4) mcol = width-left+2;
+- for (row = MIN(top,8); row < mrow-8; row++)
+- for (col = MIN(left,8); col < mcol-8; col++) {
+- for (d=0; d < ndir; d++)
+- for (hm[d]=0, v=-2; v <= 2; v++)
+- for (h=-2; h <= 2; h++)
+- hm[d] += homo[d][row+v][col+h];
+- for (d=0; d < ndir-4; d++)
+- if (hm[d] < hm[d+4]) hm[d ] = 0; else
+- if (hm[d] > hm[d+4]) hm[d+4] = 0;
+- for (max=hm[0],d=1; d < ndir; d++)
+- if (max < hm[d]) max = hm[d];
+- max -= max >> 3;
+- memset (avg, 0, sizeof avg);
+- for (d=0; d < ndir; d++)
+- if (hm[d] >= max) {
+- FORC3 avg[c] += rgb[d][row][col][c];
+- avg[3]++;
+- }
+- FORC3 image[(row+top)*width+col+left][c] = avg[c]/avg[3];
+- }
+- }
+- free(buffer);
+- border_interpolate(8);
+-}
+-#undef fcol
+-
-/*
- Adaptive Homogeneity-Directed interpolation is based on
- the work of Keigo Hirakawa, Thomas Parks, and Paul Lee.
@@ -1103,7 +1818,7 @@
-
- for (top=2; top < height-5; top += TS-6)
- for (left=2; left < width-5; left += TS-6) {
-
+-
-/* Interpolate green horizontally and vertically: */
- for (row=top; row < top+TS && row < height-2; row++) {
- col = left + (FC(row,left) & 1);
@@ -1184,9 +1899,587 @@
- }
- free (buffer);
-}
- #undef TS
+-#undef TS
+-
+-void CLASS median_filter()
+-{
+- ushort (*pix)[4];
+- int pass, c, i, j, k, med[9];
+- static const uchar opt[] = /* Optimal 9-element median search */
+- { 1,2, 4,5, 7,8, 0,1, 3,4, 6,7, 1,2, 4,5, 7,8,
+- 0,3, 5,8, 4,7, 3,6, 1,4, 2,5, 4,7, 4,2, 6,4, 4,2 };
+-
+- for (pass=1; pass <= med_passes; pass++) {
+- if (verbose)
+- fprintf (stderr,_("Median filter pass %d...\n"), pass);
+- for (c=0; c < 3; c+=2) {
+- for (pix = image; pix < image+width*height; pix++)
+- pix[0][3] = pix[0][c];
+- for (pix = image+width; pix < image+width*(height-1); pix++) {
+- if ((pix-image+1) % width < 2) continue;
+- for (k=0, i = -width; i <= width; i += width)
+- for (j = i-1; j <= i+1; j++)
+- med[k++] = pix[j][3] - pix[j][1];
+- for (i=0; i < sizeof opt; i+=2)
+- if (med[opt[i]] > med[opt[i+1]])
+- SWAP (med[opt[i]] , med[opt[i+1]]);
+- pix[0][c] = CLIP(med[4] + pix[0][1]);
+- }
+- }
+- }
+-}
+-
+-void CLASS blend_highlights()
+-{
+- int clip=INT_MAX, row, col, c, i, j;
+- static const float trans[2][4][4] =
+- { { { 1,1,1 }, { 1.7320508,-1.7320508,0 }, { -1,-1,2 } },
+- { { 1,1,1,1 }, { 1,-1,1,-1 }, { 1,1,-1,-1 }, { 1,-1,-1,1 } } };
+- static const float itrans[2][4][4] =
+- { { { 1,0.8660254,-0.5 }, { 1,-0.8660254,-0.5 }, { 1,0,1 } },
+- { { 1,1,1,1 }, { 1,-1,1,-1 }, { 1,1,-1,-1 }, { 1,-1,-1,1 } } };
+- float cam[2][4], lab[2][4], sum[2], chratio;
+-
+- if ((unsigned) (colors-3) > 1) return;
+- if (verbose) fprintf (stderr,_("Blending highlights...\n"));
+- FORCC if (clip > (i = 65535*pre_mul[c])) clip = i;
+- for (row=0; row < height; row++)
+- for (col=0; col < width; col++) {
+- FORCC if (image[row*width+col][c] > clip) break;
+- if (c == colors) continue;
+- FORCC {
+- cam[0][c] = image[row*width+col][c];
+- cam[1][c] = MIN(cam[0][c],clip);
+- }
+- for (i=0; i < 2; i++) {
+- FORCC for (lab[i][c]=j=0; j < colors; j++)
+- lab[i][c] += trans[colors-3][c][j] * cam[i][j];
+- for (sum[i]=0,c=1; c < colors; c++)
+- sum[i] += SQR(lab[i][c]);
+- }
+- chratio = sqrt(sum[1]/sum[0]);
+- for (c=1; c < colors; c++)
+- lab[0][c] *= chratio;
+- FORCC for (cam[0][c]=j=0; j < colors; j++)
+- cam[0][c] += itrans[colors-3][c][j] * lab[0][j];
+- FORCC image[row*width+col][c] = cam[0][c] / colors;
+- }
+-}
+-
+-#define SCALE (4 >> shrink)
+-void CLASS recover_highlights()
+-{
+- float *map, sum, wgt, grow;
+- int hsat[4], count, spread, change, val, i;
+- unsigned high, wide, mrow, mcol, row, col, kc, c, d, y, x;
+- ushort *pixel;
+- static const signed char dir[8][2] =
+- { {-1,-1}, {-1,0}, {-1,1}, {0,1}, {1,1}, {1,0}, {1,-1}, {0,-1} };
+-
+- if (verbose) fprintf (stderr,_("Rebuilding highlights...\n"));
+-
+- grow = pow (2, 4-highlight);
+- FORCC hsat[c] = 32000 * pre_mul[c];
+- for (kc=0, c=1; c < colors; c++)
+- if (pre_mul[kc] < pre_mul[c]) kc = c;
+- high = height / SCALE;
+- wide = width / SCALE;
+- map = (float *) calloc (high, wide*sizeof *map);
+- merror (map, "recover_highlights()");
+- FORCC if (c != kc) {
+- memset (map, 0, high*wide*sizeof *map);
+- for (mrow=0; mrow < high; mrow++)
+- for (mcol=0; mcol < wide; mcol++) {
+- sum = wgt = count = 0;
+- for (row = mrow*SCALE; row < (mrow+1)*SCALE; row++)
+- for (col = mcol*SCALE; col < (mcol+1)*SCALE; col++) {
+- pixel = image[row*width+col];
+- if (pixel[c] / hsat[c] == 1 && pixel[kc] > 24000) {
+- sum += pixel[c];
+- wgt += pixel[kc];
+- count++;
+- }
+- }
+- if (count == SCALE*SCALE)
+- map[mrow*wide+mcol] = sum / wgt;
+- }
+- for (spread = 32/grow; spread--; ) {
+- for (mrow=0; mrow < high; mrow++)
+- for (mcol=0; mcol < wide; mcol++) {
+- if (map[mrow*wide+mcol]) continue;
+- sum = count = 0;
+- for (d=0; d < 8; d++) {
+- y = mrow + dir[d][0];
+- x = mcol + dir[d][1];
+- if (y < high && x < wide && map[y*wide+x] > 0) {
+- sum += (1 + (d & 1)) * map[y*wide+x];
+- count += 1 + (d & 1);
+- }
+- }
+- if (count > 3)
+- map[mrow*wide+mcol] = - (sum+grow) / (count+grow);
+- }
+- for (change=i=0; i < high*wide; i++)
+- if (map[i] < 0) {
+- map[i] = -map[i];
+- change = 1;
+- }
+- if (!change) break;
+- }
+- for (i=0; i < high*wide; i++)
+- if (map[i] == 0) map[i] = 1;
+- for (mrow=0; mrow < high; mrow++)
+- for (mcol=0; mcol < wide; mcol++) {
+- for (row = mrow*SCALE; row < (mrow+1)*SCALE; row++)
+- for (col = mcol*SCALE; col < (mcol+1)*SCALE; col++) {
+- pixel = image[row*width+col];
+- if (pixel[c] / hsat[c] > 1) {
+- val = pixel[kc] * map[mrow*wide+mcol];
+- if (pixel[c] < val) pixel[c] = CLIP(val);
+- }
+- }
+- }
+- }
+- free (map);
+-}
+-#undef SCALE
++//void CLASS border_interpolate (int border)
++//{
++// unsigned row, col, y, x, f, c, sum[8];
++//
++// for (row=0; row < height; row++)
++// for (col=0; col < width; col++) {
++// if (col==border && row >= border && row < height-border)
++// col = width-border;
++// memset (sum, 0, sizeof sum);
++// for (y=row-1; y != row+2; y++)
++// for (x=col-1; x != col+2; x++)
++// if (y < height && x < width) {
++// f = fcol(y,x);
++// sum[f] += image[y*width+x][f];
++// sum[f+4]++;
++// }
++// f = fcol(row,col);
++// FORCC if (c != f && sum[c+4])
++// image[row*width+col][c] = sum[c] / sum[c+4];
++// }
++//}
++
++/* RT: delete interpolation functions */
++
++
++//void CLASS cielab (ushort rgb[3], short lab[3])
++//{
++// int c, i, j, k;
++// float r, xyz[3];
++// static float cbrt[0x10000], xyz_cam[3][4];
++//
++// if (!rgb) {
++// for (i=0; i < 0x10000; i++) {
++// r = i / 65535.0;
++// cbrt[i] = r > 0.008856 ? pow(r,1/3.0) : 7.787*r + 16/116.0;
++// }
++// for (i=0; i < 3; i++)
++// for (j=0; j < colors; j++)
++// for (xyz_cam[i][j] = k=0; k < 3; k++)
++// xyz_cam[i][j] += xyz_rgb[i][k] * rgb_cam[k][j] / d65_white[i];
++// return;
++// }
++// xyz[0] = xyz[1] = xyz[2] = 0.5;
++// FORCC {
++// xyz[0] += xyz_cam[0][c] * rgb[c];
++// xyz[1] += xyz_cam[1][c] * rgb[c];
++// xyz[2] += xyz_cam[2][c] * rgb[c];
++// }
++// xyz[0] = cbrt[CLIP((int) xyz[0])];
++// xyz[1] = cbrt[CLIP((int) xyz[1])];
++// xyz[2] = cbrt[CLIP((int) xyz[2])];
++// lab[0] = 64 * (116 * xyz[1] - 16);
++// lab[1] = 64 * 500 * (xyz[0] - xyz[1]);
++// lab[2] = 64 * 200 * (xyz[1] - xyz[2]);
++//}
++//
++//#define TS 512 /* Tile Size */
++//#define fcol(row,col) xtrans[(row+6) % 6][(col+6) % 6]
++//
++///*
++// Frank Markesteijn's algorithm for Fuji X-Trans sensors
++// */
++//void CLASS xtrans_interpolate (int passes)
++//{
++// int c, d, f, g, h, i, v, ng, row, col, top, left, mrow, mcol;
++// int val, ndir, pass, hm[8], avg[4], color[3][8];
++// static const short orth[12] = { 1,0,0,1,-1,0,0,-1,1,0,0,1 },
++// patt[2][16] = { { 0,1,0,-1,2,0,-1,0,1,1,1,-1,0,0,0,0 },
++// { 0,1,0,-2,1,0,-2,0,1,1,-2,-2,1,-1,-1,1 } },
++// dir[4] = { 1,TS,TS+1,TS-1 };
++// short allhex[3][3][2][8], *hex;
++// ushort min, max, sgrow, sgcol;
++// ushort (*rgb)[TS][TS][3], (*rix)[3], (*pix)[4];
++// short (*lab) [TS][3], (*lix)[3];
++// float (*drv)[TS][TS], diff[6], tr;
++// char (*homo)[TS][TS], *buffer;
++//
++// if (verbose)
++// fprintf (stderr,_("%d-pass X-Trans interpolation...\n"), passes);
++//
++// cielab (0,0);
++// ndir = 4 << (passes > 1);
++// buffer = (char *) malloc (TS*TS*(ndir*11+6));
++// merror (buffer, "xtrans_interpolate()");
++// rgb = (ushort(*)[TS][TS][3]) buffer;
++// lab = (short (*) [TS][3])(buffer + TS*TS*(ndir*6));
++// drv = (float (*)[TS][TS]) (buffer + TS*TS*(ndir*6+6));
++// homo = (char (*)[TS][TS]) (buffer + TS*TS*(ndir*10+6));
++//
++///* Map a green hexagon around each non-green pixel and vice versa: */
++// for (row=0; row < 3; row++)
++// for (col=0; col < 3; col++)
++// for (ng=d=0; d < 10; d+=2) {
++// g = fcol(row,col) == 1;
++// if (fcol(row+orth[d],col+orth[d+2]) == 1) ng=0; else ng++;
++// if (ng == 4) { sgrow = row; sgcol = col; }
++// if (ng == g+1) FORC(8) {
++// v = orth[d ]*patt[g][c*2] + orth[d+1]*patt[g][c*2+1];
++// h = orth[d+2]*patt[g][c*2] + orth[d+3]*patt[g][c*2+1];
++// allhex[row][col][0][c^(g*2 & d)] = h + v*width;
++// allhex[row][col][1][c^(g*2 & d)] = h + v*TS;
++// }
++// }
++//
++///* Set green1 and green3 to the minimum and maximum allowed values: */
++// for (row=2; row < height-2; row++)
++// for (min=~(max=0), col=2; col < width-2; col++) {
++// if (fcol(row,col) == 1 && (min=~(max=0))) continue;
++// pix = image + row*width + col;
++// hex = allhex[row % 3][col % 3][0];
++// if (!max) FORC(6) {
++// val = pix[hex[c]][1];
++// if (min > val) min = val;
++// if (max < val) max = val;
++// }
++// pix[0][1] = min;
++// pix[0][3] = max;
++// switch ((row-sgrow) % 3) {
++// case 1: if (row < height-3) { row++; col--; } break;
++// case 2: if ((min=~(max=0)) && (col+=2) < width-3 && row > 2) row--;
++// }
++// }
++//
++// for (top=3; top < height-19; top += TS-16)
++// for (left=3; left < width-19; left += TS-16) {
++// mrow = MIN (top+TS, height-3);
++// mcol = MIN (left+TS, width-3);
++// for (row=top; row < mrow; row++)
++// for (col=left; col < mcol; col++)
++// memcpy (rgb[0][row-top][col-left], image[row*width+col], 6);
++// FORC3 memcpy (rgb[c+1], rgb[0], sizeof *rgb);
++//
++///* Interpolate green horizontally, vertically, and along both diagonals: */
++// for (row=top; row < mrow; row++)
++// for (col=left; col < mcol; col++) {
++// if ((f = fcol(row,col)) == 1) continue;
++// pix = image + row*width + col;
++// hex = allhex[row % 3][col % 3][0];
++// color[1][0] = 174 * (pix[ hex[1]][1] + pix[ hex[0]][1]) -
++// 46 * (pix[2*hex[1]][1] + pix[2*hex[0]][1]);
++// color[1][1] = 223 * pix[ hex[3]][1] + pix[ hex[2]][1] * 33 +
++// 92 * (pix[ 0 ][f] - pix[ -hex[2]][f]);
++// FORC(2) color[1][2+c] =
++// 164 * pix[hex[4+c]][1] + 92 * pix[-2*hex[4+c]][1] + 33 *
++// (2*pix[0][f] - pix[3*hex[4+c]][f] - pix[-3*hex[4+c]][f]);
++// FORC4 rgb[c^!((row-sgrow) % 3)][row-top][col-left][1] =
++// LIM(color[1][c] >> 8,pix[0][1],pix[0][3]);
++// }
++//
++// for (pass=0; pass < passes; pass++) {
++// if (pass == 1)
++// memcpy (rgb+=4, buffer, 4*sizeof *rgb);
++//
++///* Recalculate green from interpolated values of closer pixels: */
++// if (pass) {
++// for (row=top+2; row < mrow-2; row++)
++// for (col=left+2; col < mcol-2; col++) {
++// if ((f = fcol(row,col)) == 1) continue;
++// pix = image + row*width + col;
++// hex = allhex[row % 3][col % 3][1];
++// for (d=3; d < 6; d++) {
++// rix = &rgb[(d-2)^!((row-sgrow) % 3)][row-top][col-left];
++// val = rix[-2*hex[d]][1] + 2*rix[hex[d]][1]
++// - rix[-2*hex[d]][f] - 2*rix[hex[d]][f] + 3*rix[0][f];
++// rix[0][1] = LIM(val/3,pix[0][1],pix[0][3]);
++// }
++// }
++// }
++//
++///* Interpolate red and blue values for solitary green pixels: */
++// for (row=(top-sgrow+4)/3*3+sgrow; row < mrow-2; row+=3)
++// for (col=(left-sgcol+4)/3*3+sgcol; col < mcol-2; col+=3) {
++// rix = &rgb[0][row-top][col-left];
++// h = fcol(row,col+1);
++// memset (diff, 0, sizeof diff);
++// for (i=1, d=0; d < 6; d++, i^=TS^1, h^=2) {
++// for (c=0; c < 2; c++, h^=2) {
++// g = 2*rix[0][1] - rix[i< 1)
++// diff[d] += SQR (rix[i< 1 && (d & 1))
++// if (diff[d-1] < diff[d])
++// FORC(2) color[c*2][d] = color[c*2][d-1];
++// if (d < 2 || (d & 1)) {
++// FORC(2) rix[0][c*2] = CLIP(color[c*2][d]/2);
++// rix += TS*TS;
++// }
++// }
++// }
++//
++///* Interpolate red for blue pixels and vice versa: */
++// for (row=top+3; row < mrow-3; row++)
++// for (col=left+3; col < mcol-3; col++) {
++// if ((f = 2-fcol(row,col)) == 1) continue;
++// rix = &rgb[0][row-top][col-left];
++// c = (row-sgrow) % 3 ? TS:1;
++// h = 3 * (c ^ TS ^ 1);
++// for (d=0; d < 4; d++, rix += TS*TS) {
++// i = d > 1 || ((d ^ c) & 1) ||
++// ((ABS(rix[0][1]-rix[c][1])+ABS(rix[0][1]-rix[-c][1])) <
++// 2*(ABS(rix[0][1]-rix[h][1])+ABS(rix[0][1]-rix[-h][1]))) ? c:h;
++// rix[0][f] = CLIP((rix[i][f] + rix[-i][f] +
++// 2*rix[0][1] - rix[i][1] - rix[-i][1])/2);
++// }
++// }
++//
++///* Fill in red and blue for 2x2 blocks of green: */
++// for (row=top+2; row < mrow-2; row++) if ((row-sgrow) % 3)
++// for (col=left+2; col < mcol-2; col++) if ((col-sgcol) % 3) {
++// rix = &rgb[0][row-top][col-left];
++// hex = allhex[row % 3][col % 3][1];
++// for (d=0; d < ndir; d+=2, rix += TS*TS)
++// if (hex[d] + hex[d+1]) {
++// g = 3*rix[0][1] - 2*rix[hex[d]][1] - rix[hex[d+1]][1];
++// for (c=0; c < 4; c+=2) rix[0][c] =
++// CLIP((g + 2*rix[hex[d]][c] + rix[hex[d+1]][c])/3);
++// } else {
++// g = 2*rix[0][1] - rix[hex[d]][1] - rix[hex[d+1]][1];
++// for (c=0; c < 4; c+=2) rix[0][c] =
++// CLIP((g + rix[hex[d]][c] + rix[hex[d+1]][c])/2);
++// }
++// }
++// }
++// rgb = (ushort(*)[TS][TS][3]) buffer;
++// mrow -= top;
++// mcol -= left;
++//
++///* Convert to CIELab and differentiate in all directions: */
++// for (d=0; d < ndir; d++) {
++// for (row=2; row < mrow-2; row++)
++// for (col=2; col < mcol-2; col++)
++// cielab (rgb[d][row][col], lab[row][col]);
++// for (f=dir[d & 3],row=3; row < mrow-3; row++)
++// for (col=3; col < mcol-3; col++) {
++// lix = &lab[row][col];
++// g = 2*lix[0][0] - lix[f][0] - lix[-f][0];
++// drv[d][row][col] = SQR(g)
++// + SQR((2*lix[0][1] - lix[f][1] - lix[-f][1] + g*500/232))
++// + SQR((2*lix[0][2] - lix[f][2] - lix[-f][2] - g*500/580));
++// }
++// }
++//
++///* Build homogeneity maps from the derivatives: */
++// memset(homo, 0, ndir*TS*TS);
++// for (row=4; row < mrow-4; row++)
++// for (col=4; col < mcol-4; col++) {
++// for (tr=FLT_MAX, d=0; d < ndir; d++)
++// if (tr > drv[d][row][col])
++// tr = drv[d][row][col];
++// tr *= 8;
++// for (d=0; d < ndir; d++)
++// for (v=-1; v <= 1; v++)
++// for (h=-1; h <= 1; h++)
++// if (drv[d][row+v][col+h] <= tr)
++// homo[d][row][col]++;
++// }
++//
++///* Average the most homogenous pixels for the final result: */
++// if (height-top < TS+4) mrow = height-top+2;
++// if (width-left < TS+4) mcol = width-left+2;
++// for (row = MIN(top,8); row < mrow-8; row++)
++// for (col = MIN(left,8); col < mcol-8; col++) {
++// for (d=0; d < ndir; d++)
++// for (hm[d]=0, v=-2; v <= 2; v++)
++// for (h=-2; h <= 2; h++)
++// hm[d] += homo[d][row+v][col+h];
++// for (d=0; d < ndir-4; d++)
++// if (hm[d] < hm[d+4]) hm[d ] = 0; else
++// if (hm[d] > hm[d+4]) hm[d+4] = 0;
++// for (max=hm[0],d=1; d < ndir; d++)
++// if (max < hm[d]) max = hm[d];
++// max -= max >> 3;
++// memset (avg, 0, sizeof avg);
++// for (d=0; d < ndir; d++)
++// if (hm[d] >= max) {
++// FORC3 avg[c] += rgb[d][row][col][c];
++// avg[3]++;
++// }
++// FORC3 image[(row+top)*width+col+left][c] = avg[c]/avg[3];
++// }
++// }
++// free(buffer);
++// border_interpolate(8);
++//}
++//#undef fcol
++//
++//
++//#undef TS
++
++//void CLASS median_filter()
++//{
++// ushort (*pix)[4];
++// int pass, c, i, j, k, med[9];
++// static const uchar opt[] = /* Optimal 9-element median search */
++// { 1,2, 4,5, 7,8, 0,1, 3,4, 6,7, 1,2, 4,5, 7,8,
++// 0,3, 5,8, 4,7, 3,6, 1,4, 2,5, 4,7, 4,2, 6,4, 4,2 };
++//
++// for (pass=1; pass <= med_passes; pass++) {
++// if (verbose)
++// fprintf (stderr,_("Median filter pass %d...\n"), pass);
++// for (c=0; c < 3; c+=2) {
++// for (pix = image; pix < image+width*height; pix++)
++// pix[0][3] = pix[0][c];
++// for (pix = image+width; pix < image+width*(height-1); pix++) {
++// if ((pix-image+1) % width < 2) continue;
++// for (k=0, i = -width; i <= width; i += width)
++// for (j = i-1; j <= i+1; j++)
++// med[k++] = pix[j][3] - pix[j][1];
++// for (i=0; i < sizeof opt; i+=2)
++// if (med[opt[i]] > med[opt[i+1]])
++// SWAP (med[opt[i]] , med[opt[i+1]]);
++// pix[0][c] = CLIP(med[4] + pix[0][1]);
++// }
++// }
++// }
++//}
++//
++//void CLASS blend_highlights()
++//{
++// int clip=INT_MAX, row, col, c, i, j;
++// static const float trans[2][4][4] =
++// { { { 1,1,1 }, { 1.7320508,-1.7320508,0 }, { -1,-1,2 } },
++// { { 1,1,1,1 }, { 1,-1,1,-1 }, { 1,1,-1,-1 }, { 1,-1,-1,1 } } };
++// static const float itrans[2][4][4] =
++// { { { 1,0.8660254,-0.5 }, { 1,-0.8660254,-0.5 }, { 1,0,1 } },
++// { { 1,1,1,1 }, { 1,-1,1,-1 }, { 1,1,-1,-1 }, { 1,-1,-1,1 } } };
++// float cam[2][4], lab[2][4], sum[2], chratio;
++//
++// if ((unsigned) (colors-3) > 1) return;
++// if (verbose) fprintf (stderr,_("Blending highlights...\n"));
++// FORCC if (clip > (i = 65535*pre_mul[c])) clip = i;
++// for (row=0; row < height; row++)
++// for (col=0; col < width; col++) {
++// FORCC if (image[row*width+col][c] > clip) break;
++// if (c == colors) continue;
++// FORCC {
++// cam[0][c] = image[row*width+col][c];
++// cam[1][c] = MIN(cam[0][c],clip);
++// }
++// for (i=0; i < 2; i++) {
++// FORCC for (lab[i][c]=j=0; j < colors; j++)
++// lab[i][c] += trans[colors-3][c][j] * cam[i][j];
++// for (sum[i]=0,c=1; c < colors; c++)
++// sum[i] += SQR(lab[i][c]);
++// }
++// chratio = sqrt(sum[1]/sum[0]);
++// for (c=1; c < colors; c++)
++// lab[0][c] *= chratio;
++// FORCC for (cam[0][c]=j=0; j < colors; j++)
++// cam[0][c] += itrans[colors-3][c][j] * lab[0][j];
++// FORCC image[row*width+col][c] = cam[0][c] / colors;
++// }
++//}
++//
++//#define SCALE (4 >> shrink)
++//void CLASS recover_highlights()
++//{
++// float *map, sum, wgt, grow;
++// int hsat[4], count, spread, change, val, i;
++// unsigned high, wide, mrow, mcol, row, col, kc, c, d, y, x;
++// ushort *pixel;
++// static const signed char dir[8][2] =
++// { {-1,-1}, {-1,0}, {-1,1}, {0,1}, {1,1}, {1,0}, {1,-1}, {0,-1} };
++//
++// if (verbose) fprintf (stderr,_("Rebuilding highlights...\n"));
++//
++// grow = pow (2, 4-highlight);
++// FORCC hsat[c] = 32000 * pre_mul[c];
++// for (kc=0, c=1; c < colors; c++)
++// if (pre_mul[kc] < pre_mul[c]) kc = c;
++// high = height / SCALE;
++// wide = width / SCALE;
++// map = (float *) calloc (high, wide*sizeof *map);
++// merror (map, "recover_highlights()");
++// FORCC if (c != kc) {
++// memset (map, 0, high*wide*sizeof *map);
++// for (mrow=0; mrow < high; mrow++)
++// for (mcol=0; mcol < wide; mcol++) {
++// sum = wgt = count = 0;
++// for (row = mrow*SCALE; row < (mrow+1)*SCALE; row++)
++// for (col = mcol*SCALE; col < (mcol+1)*SCALE; col++) {
++// pixel = image[row*width+col];
++// if (pixel[c] / hsat[c] == 1 && pixel[kc] > 24000) {
++// sum += pixel[c];
++// wgt += pixel[kc];
++// count++;
++// }
++// }
++// if (count == SCALE*SCALE)
++// map[mrow*wide+mcol] = sum / wgt;
++// }
++// for (spread = 32/grow; spread--; ) {
++// for (mrow=0; mrow < high; mrow++)
++// for (mcol=0; mcol < wide; mcol++) {
++// if (map[mrow*wide+mcol]) continue;
++// sum = count = 0;
++// for (d=0; d < 8; d++) {
++// y = mrow + dir[d][0];
++// x = mcol + dir[d][1];
++// if (y < high && x < wide && map[y*wide+x] > 0) {
++// sum += (1 + (d & 1)) * map[y*wide+x];
++// count += 1 + (d & 1);
++// }
++// }
++// if (count > 3)
++// map[mrow*wide+mcol] = - (sum+grow) / (count+grow);
++// }
++// for (change=i=0; i < high*wide; i++)
++// if (map[i] < 0) {
++// map[i] = -map[i];
++// change = 1;
++// }
++// if (!change) break;
++// }
++// for (i=0; i < high*wide; i++)
++// if (map[i] == 0) map[i] = 1;
++// for (mrow=0; mrow < high; mrow++)
++// for (mcol=0; mcol < wide; mcol++) {
++// for (row = mrow*SCALE; row < (mrow+1)*SCALE; row++)
++// for (col = mcol*SCALE; col < (mcol+1)*SCALE; col++) {
++// pixel = image[row*width+col];
++// if (pixel[c] / hsat[c] > 1) {
++// val = pixel[kc] * map[mrow*wide+mcol];
++// if (pixel[c] < val) pixel[c] = CLIP(val);
++// }
++// }
++// }
++// }
++// free (map);
++//}
++//#undef SCALE
- void CLASS median_filter()
+ void CLASS tiff_get (unsigned base,
+ unsigned *tag, unsigned *type, unsigned *len, unsigned *save)
@@ -5139,7 +5127,7 @@
}
}
@@ -1752,7 +3045,7 @@
} else if (!strcmp(model,"DSLR-A100")) {
if (width == 3880) {
height--;
-@@ -9357,6 +9476,18 @@
+@@ -9357,6 +9476,20 @@
memcpy (rgb_cam, cmatrix, sizeof cmatrix);
raw_color = 0;
}
@@ -1762,16 +3055,18 @@
+ adobe_coeff (make, model);
+ if(!strncmp(make, "Samsung", 7) && !strncmp(model, "NX1",3))
+ adobe_coeff (make, model);
-+ if(!strncmp(make, "Pentax", 6) && !strncmp(model, "K10D",4))
++ if(!strncmp(make, "Pentax", 6) && (!strncmp(model, "K10D",4) || !strncmp(model, "K-70",4)))
+ adobe_coeff (make, model);
+ if(!strncmp(make, "Leica", 5) && !strncmp(model, "Q",1))
+ adobe_coeff (make, model);
+ if(!strncmp(make, "Leica", 5) && !strncmp(model, "SL",2))
+ adobe_coeff (make, model);
++ if(!strncmp(make, "XIAOYI", 6) && !strncmp(model, "M1",2))
++ adobe_coeff (make, model);
if (raw_color) adobe_coeff (make, model);
if (load_raw == &CLASS kodak_radc_load_raw)
if (raw_color) adobe_coeff ("Apple","Quicktake");
-@@ -9371,9 +9502,9 @@
+@@ -9371,9 +9504,9 @@
if (raw_width < width ) raw_width = width;
}
if (!tiff_bps) tiff_bps = 12;
@@ -1783,9 +3078,141 @@
is_raw = 0;
#ifdef NO_JASPER
if (load_raw == &CLASS redcine_load_raw) {
-@@ -9452,199 +9583,250 @@
+@@ -9402,249 +9535,300 @@
+ if (flip == UINT_MAX) flip = 0;
}
- #endif
+
+-#ifndef NO_LCMS
+-void CLASS apply_profile (const char *input, const char *output)
+-{
+- char *prof;
+- cmsHPROFILE hInProfile=0, hOutProfile=0;
+- cmsHTRANSFORM hTransform;
+- FILE *fp;
+- unsigned size;
+-
+- if (strcmp (input, "embed"))
+- hInProfile = cmsOpenProfileFromFile (input, "r");
+- else if (profile_length) {
+- prof = (char *) malloc (profile_length);
+- merror (prof, "apply_profile()");
+- fseek (ifp, profile_offset, SEEK_SET);
+- fread (prof, 1, profile_length, ifp);
+- hInProfile = cmsOpenProfileFromMem (prof, profile_length);
+- free (prof);
+- } else
+- fprintf (stderr,_("%s has no embedded profile.\n"), ifname);
+- if (!hInProfile) return;
+- if (!output)
+- hOutProfile = cmsCreate_sRGBProfile();
+- else if ((fp = fopen (output, "rb"))) {
+- fread (&size, 4, 1, fp);
+- fseek (fp, 0, SEEK_SET);
+- oprof = (unsigned *) malloc (size = ntohl(size));
+- merror (oprof, "apply_profile()");
+- fread (oprof, 1, size, fp);
+- fclose (fp);
+- if (!(hOutProfile = cmsOpenProfileFromMem (oprof, size))) {
+- free (oprof);
+- oprof = 0;
++//#ifndef NO_LCMS
++//void CLASS apply_profile (const char *input, const char *output)
++//{
++// char *prof;
++// cmsHPROFILE hInProfile=0, hOutProfile=0;
++// cmsHTRANSFORM hTransform;
++// FILE *fp;
++// unsigned size;
++//
++// if (strcmp (input, "embed"))
++// hInProfile = cmsOpenProfileFromFile (input, "r");
++// else if (profile_length) {
++// prof = (char *) malloc (profile_length);
++// merror (prof, "apply_profile()");
++// fseek (ifp, profile_offset, SEEK_SET);
++// fread (prof, 1, profile_length, ifp);
++// hInProfile = cmsOpenProfileFromMem (prof, profile_length);
++// free (prof);
++// } else
++// fprintf (stderr,_("%s has no embedded profile.\n"), ifname);
++// if (!hInProfile) return;
++// if (!output)
++// hOutProfile = cmsCreate_sRGBProfile();
++// else if ((fp = fopen (output, "rb"))) {
++// fread (&size, 4, 1, fp);
++// fseek (fp, 0, SEEK_SET);
++// oprof = (unsigned *) malloc (size = ntohl(size));
++// merror (oprof, "apply_profile()");
++// fread (oprof, 1, size, fp);
++// fclose (fp);
++// if (!(hOutProfile = cmsOpenProfileFromMem (oprof, size))) {
++// free (oprof);
++// oprof = 0;
++// }
++// } else
++// fprintf (stderr,_("Cannot open file %s!\n"), output);
++// if (!hOutProfile) goto quit;
++// if (verbose)
++// fprintf (stderr,_("Applying color profile...\n"));
++// hTransform = cmsCreateTransform (hInProfile, TYPE_RGBA_16,
++// hOutProfile, TYPE_RGBA_16, INTENT_PERCEPTUAL, 0);
++// cmsDoTransform (hTransform, image, image, width*height);
++// raw_color = 1; /* Don't use rgb_cam with a profile */
++// cmsDeleteTransform (hTransform);
++// cmsCloseProfile (hOutProfile);
++//quit:
++// cmsCloseProfile (hInProfile);
++//}
++//#endif
++
++/* RT: DNG Float */
++
++#include
++#include
++
++static void decodeFPDeltaRow(Bytef * src, Bytef * dst, size_t tileWidth, size_t realTileWidth, int bytesps, int factor) {
++ // DecodeDeltaBytes
++ for (size_t col = factor; col < realTileWidth*bytesps; ++col) {
++ src[col] += src[col - factor];
++ }
++ // Reorder bytes into the image
++ // 16 and 32-bit versions depend on local architecture, 24-bit does not
++ if (bytesps == 3) {
++ for (size_t col = 0; col < tileWidth; ++col) {
++ dst[col*3] = src[col];
++ dst[col*3 + 1] = src[col + realTileWidth];
++ dst[col*3 + 2] = src[col + realTileWidth*2];
+ }
+- } else
+- fprintf (stderr,_("Cannot open file %s!\n"), output);
+- if (!hOutProfile) goto quit;
+- if (verbose)
+- fprintf (stderr,_("Applying color profile...\n"));
+- hTransform = cmsCreateTransform (hInProfile, TYPE_RGBA_16,
+- hOutProfile, TYPE_RGBA_16, INTENT_PERCEPTUAL, 0);
+- cmsDoTransform (hTransform, image, image, width*height);
+- raw_color = 1; /* Don't use rgb_cam with a profile */
+- cmsDeleteTransform (hTransform);
+- cmsCloseProfile (hOutProfile);
+-quit:
+- cmsCloseProfile (hInProfile);
++ } else {
++ union X { uint32_t x; uint8_t c; };
++ if (((union X){1}).c) {
++ for (size_t col = 0; col < tileWidth; ++col) {
++ for (size_t byte = 0; byte < bytesps; ++byte)
++ dst[col*bytesps + byte] = src[col + realTileWidth*(bytesps-byte-1)]; // Little endian
++ }
++ } else {
++ for (size_t col = 0; col < tileWidth; ++col) {
++ for (size_t byte = 0; byte < bytesps; ++byte)
++ dst[col*bytesps + byte] = src[col + realTileWidth*byte];
++ }
++ }
++ }
++
+ }
+-#endif
-void CLASS convert_to_rgb()
-{
@@ -1872,41 +3299,6 @@
- for (j=0; j < colors; j++)
- for (out_cam[i][j] = k=0; k < 3; k++)
- out_cam[i][j] += out_rgb[output_color-1][i][k] * rgb_cam[k][j];
-+/* RT: DNG Float */
-+
-+#include
-+#include
-+
-+static void decodeFPDeltaRow(Bytef * src, Bytef * dst, size_t tileWidth, size_t realTileWidth, int bytesps, int factor) {
-+ // DecodeDeltaBytes
-+ for (size_t col = factor; col < realTileWidth*bytesps; ++col) {
-+ src[col] += src[col - factor];
-+ }
-+ // Reorder bytes into the image
-+ // 16 and 32-bit versions depend on local architecture, 24-bit does not
-+ if (bytesps == 3) {
-+ for (size_t col = 0; col < tileWidth; ++col) {
-+ dst[col*3] = src[col];
-+ dst[col*3 + 1] = src[col + realTileWidth];
-+ dst[col*3 + 2] = src[col + realTileWidth*2];
-+ }
-+ } else {
-+ union X { uint32_t x; uint8_t c; };
-+ if (((union X){1}).c) {
-+ for (size_t col = 0; col < tileWidth; ++col) {
-+ for (size_t byte = 0; byte < bytesps; ++byte)
-+ dst[col*bytesps + byte] = src[col + realTileWidth*(bytesps-byte-1)]; // Little endian
-+ }
-+ } else {
-+ for (size_t col = 0; col < tileWidth; ++col) {
-+ for (size_t byte = 0; byte < bytesps; ++byte)
-+ dst[col*bytesps + byte] = src[col + realTileWidth*byte];
-+ }
-+ }
-+ }
-+
-+}
-+
+// From DNG SDK dng_utils.h
+static inline uint32_t DNG_HalfToFloat(uint16_t halfValue) {
+ int32_t sign = (halfValue >> 15) & 0x00000001;
@@ -2217,7 +3609,7 @@
struct tiff_tag {
ushort tag, type;
int count;
-@@ -9667,594 +9849,11 @@
+@@ -9667,594 +9851,11 @@
char desc[512], make[64], model[64], soft[32], date[20], artist[64];
};
diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc
index 8f855ff0f..8ec850b0b 100644
--- a/rtengine/dcrop.cc
+++ b/rtengine/dcrop.cc
@@ -31,15 +31,15 @@ namespace rtengine
extern const Settings* settings;
Crop::Crop (ImProcCoordinator* parent, EditDataProvider *editDataProvider, bool isDetailWindow)
- : PipetteBuffer(editDataProvider), origCrop(NULL), spotCrop(NULL), laboCrop(NULL), labnCrop(NULL),
- cropImg(NULL), cbuf_real(NULL), cshmap(NULL), transCrop(NULL), cieCrop(NULL), cbuffer(NULL),
- updating(false), newUpdatePending(false), skip(10),
+ : PipetteBuffer(editDataProvider), origCrop(nullptr), spotCrop(nullptr), laboCrop(nullptr), labnCrop(nullptr),
+ cropImg(nullptr), cbuf_real(nullptr), cshmap(nullptr), transCrop(nullptr), cieCrop(nullptr), cbuffer(nullptr),
+ updating(false), newUpdatePending(false), skip(10), padding(0),
cropx(0), cropy(0), cropw(-1), croph(-1),
trafx(0), trafy(0), trafw(-1), trafh(-1),
rqcropx(0), rqcropy(0), rqcropw(-1), rqcroph(-1),
borderRequested(32), upperBorder(0), leftBorder(0),
cropAllocated(false),
- cropImageListener(NULL), parent(parent), isDetailWindow(isDetailWindow)
+ cropImageListener(nullptr), parent(parent), isDetailWindow(isDetailWindow)
{
parent->crops.push_back (this);
}
@@ -77,7 +77,7 @@ void Crop::setListener (DetailedCropListener* il)
EditUniqueID Crop::getCurrEditID()
{
- EditSubscriber *subscriber = PipetteBuffer::dataProvider ? PipetteBuffer::dataProvider->getCurrSubscriber() : NULL;
+ EditSubscriber *subscriber = PipetteBuffer::dataProvider ? PipetteBuffer::dataProvider->getCurrSubscriber() : nullptr;
return subscriber ? subscriber->getEditID() : EUID_None;
}
@@ -90,17 +90,17 @@ void Crop::setEditSubscriber(EditSubscriber* newSubscriber)
MyMutex::MyLock lock(cropMutex);
// At this point, editCrop.dataProvider->currSubscriber is the old subscriber
- EditSubscriber *oldSubscriber = PipetteBuffer::dataProvider ? PipetteBuffer::dataProvider->getCurrSubscriber() : NULL;
+ EditSubscriber *oldSubscriber = PipetteBuffer::dataProvider ? PipetteBuffer::dataProvider->getCurrSubscriber() : nullptr;
- if (newSubscriber == NULL || (oldSubscriber != NULL && oldSubscriber->getPipetteBufferType() != newSubscriber->getPipetteBufferType())) {
- if (PipetteBuffer::imgFloatBuffer != NULL) {
+ if (newSubscriber == nullptr || (oldSubscriber != nullptr && oldSubscriber->getPipetteBufferType() != newSubscriber->getPipetteBufferType())) {
+ if (PipetteBuffer::imgFloatBuffer != nullptr) {
delete PipetteBuffer::imgFloatBuffer;
- PipetteBuffer::imgFloatBuffer = NULL;
+ PipetteBuffer::imgFloatBuffer = nullptr;
}
- if (PipetteBuffer::LabBuffer != NULL) {
+ if (PipetteBuffer::LabBuffer != nullptr) {
delete PipetteBuffer::LabBuffer;
- PipetteBuffer::LabBuffer = NULL;
+ PipetteBuffer::LabBuffer = nullptr;
}
if (PipetteBuffer::singlePlaneBuffer.getW() != -1) {
@@ -164,7 +164,7 @@ void Crop::update (int todo)
// printf("x=%d y=%d crow=%d croh=%d skip=%d\n",rqcropx, rqcropy, rqcropw, rqcroph, skip);
// printf("trafx=%d trafyy=%d trafwsk=%d trafHs=%d \n",trafx, trafy, trafw*skip, trafh*skip);
- Imagefloat *calclum = NULL;//for Luminance denoise curve
+ Imagefloat *calclum = nullptr;//for Luminance denoise curve
NoiseCurve noiseLCurve;
NoiseCurve noiseCCurve;
float autoNR = (float) settings->nrauto;//
@@ -321,7 +321,7 @@ void Crop::update (int todo)
float maxr = 0.f;
float maxb = 0.f;
- float chaut, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, nresi, highresi, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc;
+ float chaut, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc;
int Nb;
chaut = 0.f;
@@ -334,7 +334,7 @@ void Crop::update (int todo)
LUTf gamcurve(65536, 0);
float gam, gamthresh, gamslope;
parent->ipf.RGB_denoise_infoGamCurve(params.dirpyrDenoise, parent->imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope);
- parent->ipf.RGB_denoise_info(baseCrop, provicalc, parent->imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope, params.dirpyrDenoise, parent->imgsrc->getDirPyrDenoiseExpComp(), chaut, Nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, nresi, highresi, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc, true);
+ parent->ipf.RGB_denoise_info(baseCrop, provicalc, parent->imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope, params.dirpyrDenoise, parent->imgsrc->getDirPyrDenoiseExpComp(), chaut, Nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc, true);
// printf("redy=%f skin=%f pcskin=%f\n",redyel, skinc,nsknc);
// printf("DCROP skip=%d cha=%4.0f Nb=%d red=%4.0f bl=%4.0f redM=%4.0f bluM=%4.0f L=%4.0f sigL=%4.0f Ch=%4.0f Si=%4.0f\n",skip, chaut,Nb, redaut,blueaut, maxredaut, maxblueaut, lumema, sigma_L, chromina, sigma);
float multip = 1.f;
@@ -453,9 +453,9 @@ void Crop::update (int todo)
parent->imgsrc->convertColorSpace(provicalc, params.icm, parent->currWB);//for denoise luminance curve
float pondcorrec = 1.0f;
- float chaut = 0.f, redaut = 0.f, blueaut = 0.f, maxredaut = 0.f, maxblueaut = 0.f, minredaut = 0.f, minblueaut = 0.f, nresi = 0.f, highresi = 0.f, chromina = 0.f, sigma = 0.f, lumema = 0.f, sigma_L = 0.f, redyel = 0.f, skinc = 0.f, nsknc = 0.f;
+ float chaut = 0.f, redaut = 0.f, blueaut = 0.f, maxredaut = 0.f, maxblueaut = 0.f, minredaut = 0.f, minblueaut = 0.f, chromina = 0.f, sigma = 0.f, lumema = 0.f, sigma_L = 0.f, redyel = 0.f, skinc = 0.f, nsknc = 0.f;
int nb = 0;
- parent->ipf.RGB_denoise_info(origCropPart, provicalc, parent->imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope, params.dirpyrDenoise, parent->imgsrc->getDirPyrDenoiseExpComp(), chaut, nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, nresi, highresi, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc);
+ parent->ipf.RGB_denoise_info(origCropPart, provicalc, parent->imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope, params.dirpyrDenoise, parent->imgsrc->getDirPyrDenoiseExpComp(), chaut, nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc);
//printf("DCROP skip=%d cha=%f red=%f bl=%f redM=%f bluM=%f chrom=%f sigm=%f lum=%f\n",skip, chaut,redaut,blueaut, maxredaut, maxblueaut, chromina, sigma, lumema);
Nb[hcr * 3 + wcr] = nb;
@@ -678,15 +678,17 @@ void Crop::update (int todo)
createBuffer(cropw, croph);
// transform
- if (needstransform) {
+ if (needstransform || ((todo & (M_TRANSFORM | M_RGBCURVE)) && params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled && !params.colorappearance.enabled)) {
if (!transCrop) {
transCrop = new Imagefloat (cropw, croph);
}
- if ((todo & M_TRANSFORM) && needstransform)
+ if (needstransform)
parent->ipf.transform (baseCrop, transCrop, cropx / skip, cropy / skip, trafx / skip, trafy / skip, SKIPS(parent->fw, skip), SKIPS(parent->fh, skip), parent->getFullWidth(), parent->getFullHeight(),
parent->imgsrc->getMetaData()->getFocalLen(), parent->imgsrc->getMetaData()->getFocalLen35mm(),
parent->imgsrc->getMetaData()->getFocusDist(), parent->imgsrc->getRotateDegree(), false);
+ else
+ baseCrop->copyData(transCrop);
if (transCrop) {
baseCrop = transCrop;
@@ -696,10 +698,10 @@ void Crop::update (int todo)
delete transCrop;
}
- transCrop = NULL;
+ transCrop = nullptr;
}
- if ((todo & (M_TRANSFORM)) && params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled && !params.colorappearance.enabled) {
+ if ((todo & (M_TRANSFORM | M_RGBCURVE)) && params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled && !params.colorappearance.enabled) {
const int W = baseCrop->getWidth();
const int H = baseCrop->getHeight();
@@ -770,10 +772,11 @@ void Crop::update (int todo)
DCPProfile::ApplyState as;
DCPProfile *dcpProf = parent->imgsrc->getDCP(params.icm, parent->currWB, as);
+ LUTu histToneCurve;
parent->ipf.rgbProc (baseCrop, laboCrop, this, parent->hltonecurve, parent->shtonecurve, parent->tonecurve, cshmap,
params.toneCurve.saturation, parent->rCurve, parent->gCurve, parent->bCurve, parent->colourToningSatLimit , parent->colourToningSatLimitOpacity, parent->ctColorCurve, parent->ctOpacityCurve, parent->opautili, parent->clToningcurve, parent->cl2Toningcurve,
parent->customToneCurve1, parent->customToneCurve2, parent->beforeToneCurveBW, parent->afterToneCurveBW, rrm, ggm, bbm,
- parent->bwAutoR, parent->bwAutoG, parent->bwAutoB, dcpProf, as);
+ parent->bwAutoR, parent->bwAutoG, parent->bwAutoB, dcpProf, as, histToneCurve);
}
/*xref=000;yref=000;
@@ -976,31 +979,21 @@ void Crop::update (int todo)
delete cieCrop;
}
- cieCrop = NULL;
+ cieCrop = nullptr;
}
}
// all pipette buffer processing should be finished now
PipetteBuffer::setReady();
- // switch back to rgb
+ // Computing the preview image, i.e. converting from lab->Monitor color space (soft-proofing disabled) or lab->Output profile->Monitor color space (soft-proofing enabled)
parent->ipf.lab2monitorRgb (labnCrop, cropImg);
if (cropImageListener) {
- // this in output space held in parallel to allow analysis like shadow/highlight
- Glib::ustring outProfile = params.icm.output;
- Glib::ustring workProfile = params.icm.working;
- Image8 *cropImgtrue;
+ // Computing the internal image for analysis, i.e. conversion from lab->Output profile (rtSettings.HistogramWorking disabled) or lab->WCS (rtSettings.HistogramWorking enabled)
- if(settings->HistogramWorking) {
- cropImgtrue = parent->ipf.lab2rgb (labnCrop, 0, 0, cropw, croph, workProfile, RI_RELATIVE, false); // HOMBRE: was RELATIVE by default in lab2rgb, is it safe to assume we have to use it again ?
- } else {
- if (params.icm.output == "" || params.icm.output == ColorManagementParams::NoICMString) {
- outProfile = "sRGB";
- }
-
- cropImgtrue = parent->ipf.lab2rgb (labnCrop, 0, 0, cropw, croph, outProfile, params.icm.outputIntent, false);
- }
+ // internal image in output color space for analysis
+ Image8 *cropImgtrue = parent->ipf.lab2rgb (labnCrop, 0, 0, cropw, croph, params.icm);
int finalW = rqcropw;
@@ -1039,47 +1032,47 @@ void Crop::freeAll ()
if (cropAllocated) {
if (origCrop ) {
delete origCrop;
- origCrop = NULL;
+ origCrop = nullptr;
}
if (transCrop) {
delete transCrop;
- transCrop = NULL;
+ transCrop = nullptr;
}
if (laboCrop ) {
delete laboCrop;
- laboCrop = NULL;
+ laboCrop = nullptr;
}
if (labnCrop ) {
delete labnCrop;
- labnCrop = NULL;
+ labnCrop = nullptr;
}
if (cropImg ) {
delete cropImg;
- cropImg = NULL;
+ cropImg = nullptr;
}
if (cieCrop ) {
delete cieCrop;
- cieCrop = NULL;
+ cieCrop = nullptr;
}
if (cbuf_real) {
delete [] cbuf_real;
- cbuf_real = NULL;
+ cbuf_real = nullptr;
}
if (cbuffer ) {
delete [] cbuffer;
- cbuffer = NULL;
+ cbuffer = nullptr;
}
if (cshmap ) {
delete cshmap;
- cshmap = NULL;
+ cshmap = nullptr;
}
PipetteBuffer::flush();
@@ -1138,11 +1131,9 @@ bool Crop::setCropSizes (int rcx, int rcy, int rcw, int rch, int skip, bool inte
ProcParams& params = parent->params;
parent->ipf.transCoord (parent->fw, parent->fh, bx1, by1, bw, bh, orx, ory, orw, orh);
- int tr = getCoarseBitMask(params.coarse);
-
PreviewProps cp (orx, ory, orw, orh, skip);
int orW, orH;
- parent->imgsrc->getSize (tr, cp, orW, orH);
+ parent->imgsrc->getSize (cp, orW, orH);
int cw = SKIPS(bw, skip);
int ch = SKIPS(bh, skip);
@@ -1200,7 +1191,7 @@ bool Crop::setCropSizes (int rcx, int rcy, int rcw, int rch, int skip, bool inte
//cieCrop is only used in Crop::update, it is destroyed now but will be allocated on first use
if (cieCrop) {
delete cieCrop;
- cieCrop = NULL;
+ cieCrop = nullptr;
}
if (cbuffer ) {
@@ -1213,7 +1204,7 @@ bool Crop::setCropSizes (int rcx, int rcy, int rcw, int rch, int skip, bool inte
if (cshmap ) {
delete cshmap;
- cshmap = NULL;
+ cshmap = nullptr;
}
cbuffer = new float*[croph];
diff --git a/rtengine/dcrop.h b/rtengine/dcrop.h
index 9b2c3dbaf..3739d4561 100644
--- a/rtengine/dcrop.h
+++ b/rtengine/dcrop.h
@@ -45,7 +45,7 @@ protected:
Imagefloat* spotCrop; // "one chunk" allocation
LabImage* laboCrop; // "one chunk" allocation
LabImage* labnCrop; // "one chunk" allocation
- Image8* cropImg; // "one chunk" allocation
+ Image8* cropImg; // "one chunk" allocation ; displayed image in monitor color space, showing the output profile as well (soft-proofing enabled, which then correspond to workimg) or not
float * cbuf_real; // "one chunk" allocation
SHMap* cshmap; // per line allocation
diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc
index 405a34118..e641ed777 100644
--- a/rtengine/demosaic_algos.cc
+++ b/rtengine/demosaic_algos.cc
@@ -104,8 +104,8 @@ void RawImageSource::eahd_demosaic ()
interpolate_row_g (gh[0], gv[0], 0);
interpolate_row_g (gh[1], gv[1], 1);
interpolate_row_g (gh[2], gv[2], 2);
- interpolate_row_rb (rh[0], bh[0], NULL, gh[0], gh[1], 0);
- interpolate_row_rb (rv[0], bv[0], NULL, gv[0], gv[1], 0);
+ interpolate_row_rb (rh[0], bh[0], nullptr, gh[0], gh[1], 0);
+ interpolate_row_rb (rv[0], bv[0], nullptr, gv[0], gv[1], 0);
interpolate_row_rb (rh[1], bh[1], gh[0], gh[1], gh[2], 1);
interpolate_row_rb (rv[1], bv[1], gv[0], gv[1], gv[2], 1);
@@ -138,8 +138,8 @@ void RawImageSource::eahd_demosaic ()
interpolate_row_rb (rh[(i + 1) % 3], bh[(i + 1) % 3], gh[i % 4], gh[(i + 1) % 4], gh[(i + 2) % 4], i + 1);
interpolate_row_rb (rv[(i + 1) % 3], bv[(i + 1) % 3], gv[i % 4], gv[(i + 1) % 4], gv[(i + 2) % 4], i + 1);
} else {
- interpolate_row_rb (rh[(i + 1) % 3], bh[(i + 1) % 3], gh[i % 4], gh[(i + 1) % 4], NULL, i + 1);
- interpolate_row_rb (rv[(i + 1) % 3], bv[(i + 1) % 3], gv[i % 4], gv[(i + 1) % 4], NULL, i + 1);
+ interpolate_row_rb (rh[(i + 1) % 3], bh[(i + 1) % 3], gh[i % 4], gh[(i + 1) % 4], nullptr, i + 1);
+ interpolate_row_rb (rv[(i + 1) % 3], bv[(i + 1) % 3], gv[i % 4], gv[(i + 1) % 4], nullptr, i + 1);
}
convert_to_cielab_row (rh[(i + 1) % 3], gh[(i + 1) % 4], bh[(i + 1) % 3], lLh[(i + 1) % 3], lah[(i + 1) % 3], lbh[(i + 1) % 3]);
@@ -285,9 +285,9 @@ void RawImageSource::eahd_demosaic ()
// Interpolate R and B
for (int i = 0; i < H; i++) {
if (i == 0) {
- interpolate_row_rb_mul_pp (red[i], blue[i], NULL, green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1);
+ interpolate_row_rb_mul_pp (red[i], blue[i], nullptr, green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1);
} else if (i == H - 1) {
- interpolate_row_rb_mul_pp (red[i], blue[i], green[i - 1], green[i], NULL, i, 1.0, 1.0, 1.0, 0, W, 1);
+ interpolate_row_rb_mul_pp (red[i], blue[i], green[i - 1], green[i], nullptr, i, 1.0, 1.0, 1.0, 0, W, 1);
} else {
interpolate_row_rb_mul_pp (red[i], blue[i], green[i - 1], green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1);
}
@@ -521,10 +521,6 @@ void RawImageSource::hphd_demosaic ()
plistener->setProgress (0.33);
}
- for (int i = 0; i < H; i++) {
- memset(hpmap[i], 0, W * sizeof(char));
- }
-
#ifdef _OPENMP
#pragma omp parallel
{
@@ -550,9 +546,9 @@ void RawImageSource::hphd_demosaic ()
for (int i = 0; i < H; i++) {
if (i == 0) {
- interpolate_row_rb_mul_pp (red[i], blue[i], NULL, green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1);
+ interpolate_row_rb_mul_pp (red[i], blue[i], nullptr, green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1);
} else if (i == H - 1) {
- interpolate_row_rb_mul_pp (red[i], blue[i], green[i - 1], green[i], NULL, i, 1.0, 1.0, 1.0, 0, W, 1);
+ interpolate_row_rb_mul_pp (red[i], blue[i], green[i - 1], green[i], nullptr, i, 1.0, 1.0, 1.0, 0, W, 1);
} else {
interpolate_row_rb_mul_pp (red[i], blue[i], green[i - 1], green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1);
}
@@ -861,9 +857,9 @@ void RawImageSource::vng4_demosaic ()
// rm, gm, bm must be recovered
//interpolate_row_rb_mul_pp (red, blue, NULL, green[i], green[i+1], i, rm, gm, bm, 0, W, 1);
{
- interpolate_row_rb_mul_pp (red[i], blue[i], NULL, green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1);
+ interpolate_row_rb_mul_pp (red[i], blue[i], nullptr, green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1);
} else if (i == H - 1) {
- interpolate_row_rb_mul_pp (red[i], blue[i], green[i - 1], green[i], NULL, i, 1.0, 1.0, 1.0, 0, W, 1);
+ interpolate_row_rb_mul_pp (red[i], blue[i], green[i - 1], green[i], nullptr, i, 1.0, 1.0, 1.0, 0, W, 1);
} else {
interpolate_row_rb_mul_pp (red[i], blue[i], green[i - 1], green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1);
}
@@ -1368,7 +1364,7 @@ SSEFUNCTION void RawImageSource::lmmse_interpolate_omp(int winw, int winh, int i
float *qix[5];
float *buffer = (float *)calloc(rr1 * cc1 * 5 * sizeof(float), 1);
- if(buffer == NULL) { // allocation of big block of memory failed, try to get 5 smaller ones
+ if(buffer == nullptr) { // allocation of big block of memory failed, try to get 5 smaller ones
printf("lmmse_interpolate_omp: allocation of big memory block failed, try to get 5 smaller ones now...\n");
bool allocationFailed = false;
@@ -4047,7 +4043,7 @@ void RawImageSource::xtrans_interpolate (const int passes, const bool useCieLab)
double progressInc = 36.0 * (1.0 - progress) / ((H * W) / ((ts - 16) * (ts - 16)));
const int ndir = 4 << (passes > 1);
- cielab (0, 0, 0, 0, 0, 0, 0, 0);
+ cielab (nullptr, nullptr, nullptr, nullptr, 0, 0, 0, nullptr);
struct s_minmaxgreen {
float min;
float max;
diff --git a/rtengine/dfmanager.cc b/rtengine/dfmanager.cc
index e06ac27e2..728d40d53 100644
--- a/rtengine/dfmanager.cc
+++ b/rtengine/dfmanager.cc
@@ -36,16 +36,18 @@ extern const Settings* settings;
inline dfInfo& dfInfo::operator =(const dfInfo &o)
{
- pathname = o.pathname;
- maker = o.maker;
- model = o.model;
- iso = o.iso;
- shutter = o.shutter;
- timestamp = o.timestamp;
+ if (this != &o) {
+ pathname = o.pathname;
+ maker = o.maker;
+ model = o.model;
+ iso = o.iso;
+ shutter = o.shutter;
+ timestamp = o.timestamp;
- if( ri ) {
- delete ri;
- ri = NULL;
+ if( ri ) {
+ delete ri;
+ ri = nullptr;
+ }
}
return *this;
@@ -138,7 +140,7 @@ void dfInfo::updateRawImage()
if( ri->loadRaw(true)) {
delete ri;
- ri = NULL;
+ ri = nullptr;
} else {
int H = ri->get_height();
int W = ri->get_width();
@@ -200,7 +202,7 @@ void dfInfo::updateRawImage()
if( ri->loadRaw(true)) {
delete ri;
- ri = NULL;
+ ri = nullptr;
} else {
ri->compress_image();
}
@@ -332,11 +334,11 @@ dfInfo* DFManager::addFileInfo (const Glib::ustring& filename, bool pool)
auto file = Gio::File::create_for_path (filename);
if (!file) {
- return 0;
+ return nullptr;
}
if (!file->query_exists ()) {
- return 0;
+ return nullptr;
}
try {
@@ -344,11 +346,11 @@ dfInfo* DFManager::addFileInfo (const Glib::ustring& filename, bool pool)
auto info = file->query_info ();
if (!info && info->get_file_type () == Gio::FILE_TYPE_DIRECTORY) {
- return 0;
+ return nullptr;
}
if (!options.fbShowHidden && info->is_hidden ()) {
- return 0;
+ return nullptr;
}
Glib::ustring ext;
@@ -359,14 +361,14 @@ dfInfo* DFManager::addFileInfo (const Glib::ustring& filename, bool pool)
}
if (!options.is_extention_enabled (ext)) {
- return 0;
+ return nullptr;
}
RawImage ri (filename);
int res = ri.loadRaw (false); // Read informations about shot
if (res != 0) {
- return 0;
+ return nullptr;
}
dfList_t::iterator iter;
@@ -406,7 +408,7 @@ dfInfo* DFManager::addFileInfo (const Glib::ustring& filename, bool pool)
} catch(Gio::Error&) {}
- return 0;
+ return nullptr;
}
void DFManager::getStat( int &totFiles, int &totTemplates)
@@ -433,7 +435,7 @@ void DFManager::getStat( int &totFiles, int &totTemplates)
dfInfo* DFManager::find( const std::string &mak, const std::string &mod, int isospeed, double shut, time_t t )
{
if( dfList.empty() ) {
- return 0;
+ return nullptr;
}
std::string key( dfInfo::key(mak, mod, isospeed, shut) );
@@ -467,7 +469,7 @@ dfInfo* DFManager::find( const std::string &mak, const std::string &mod, int iso
}
}
- return bestD != INFINITY ? &(bestMatch->second) : 0 ;
+ return bestD != INFINITY ? &(bestMatch->second) : nullptr ;
}
}
@@ -478,7 +480,7 @@ RawImage* DFManager::searchDarkFrame( const std::string &mak, const std::string
if( df ) {
return df->getRawImage();
} else {
- return 0;
+ return nullptr;
}
}
@@ -496,7 +498,7 @@ RawImage* DFManager::searchDarkFrame( const Glib::ustring filename )
return df->getRawImage();
}
- return 0;
+ return nullptr;
}
std::vector *DFManager::getHotPixels ( const Glib::ustring filename )
{
@@ -506,7 +508,7 @@ std::vector *DFManager::getHotPixels ( const Glib::ustring filename )
}
}
- return 0;
+ return nullptr;
}
std::vector *DFManager::getHotPixels ( const std::string &mak, const std::string &mod, int iso, double shut, time_t t )
{
@@ -525,7 +527,7 @@ std::vector *DFManager::getHotPixels ( const std::string &mak, const std
return &df->getHotPixels();
} else {
- return 0;
+ return nullptr;
}
}
@@ -596,12 +598,13 @@ std::vector *DFManager::getBadPixels ( const std::string &mak, const std
found = true;
}
- if( settings->verbose )
+ if( settings->verbose ) {
if(found) {
printf("%s.badpixels found\n", s.str().c_str());
} else {
printf("%s.badpixels not found\n", s.str().c_str());
}
+ }
}
@@ -615,16 +618,17 @@ std::vector *DFManager::getBadPixels ( const std::string &mak, const std
found = true;
}
- if( settings->verbose )
+ if( settings->verbose ) {
if(found) {
printf("%s.badpixels found\n", s.str().c_str());
} else {
printf("%s.badpixels not found\n", s.str().c_str());
}
+ }
}
if(!found) {
- return 0;
+ return nullptr;
} else {
return &(iter->second);
}
diff --git a/rtengine/dfmanager.h b/rtengine/dfmanager.h
index befe67f5a..1cc22723b 100644
--- a/rtengine/dfmanager.h
+++ b/rtengine/dfmanager.h
@@ -39,10 +39,10 @@ public:
dfInfo(const Glib::ustring &name, const std::string &mak, const std::string &mod, int iso, double shut, time_t t)
- : pathname(name), maker(mak), model(mod), iso(iso), shutter(shut), timestamp(t), ri(NULL) {}
+ : pathname(name), maker(mak), model(mod), iso(iso), shutter(shut), timestamp(t), ri(nullptr) {}
dfInfo( const dfInfo &o)
- : pathname(o.pathname), maker(o.maker), model(o.model), iso(o.iso), shutter(o.shutter), timestamp(o.timestamp), ri(NULL) {}
+ : pathname(o.pathname), maker(o.maker), model(o.model), iso(o.iso), shutter(o.shutter), timestamp(o.timestamp), ri(nullptr) {}
~dfInfo()
{
if( ri ) {
diff --git a/rtengine/diagonalcurves.cc b/rtengine/diagonalcurves.cc
index a5505391e..2178e3dac 100644
--- a/rtengine/diagonalcurves.cc
+++ b/rtengine/diagonalcurves.cc
@@ -245,7 +245,7 @@ void DiagonalCurve::NURBS_set ()
printf("sc_length[%zu/3]=%f \n", it, sc_length[it / 3]);
}
- printf("NURBS diagonal curve: error detected!\n i=%d nbr_points=%d ppn=%d N=%d sc_length[i/3]=%f total_length=%f", i, nbr_points, ppn, N, sc_length[i / 3], total_length);
+ printf("NURBS diagonal curve: error detected!\n i=%u nbr_points=%d ppn=%d N=%d sc_length[i/3]=%f total_length=%f", i, nbr_points, ppn, N, sc_length[i / 3], total_length);
exit(0);
}
diff --git a/rtengine/dirpyrLab_equalizer.cc b/rtengine/dirpyrLab_equalizer.cc
deleted file mode 100644
index fc5fc70a0..000000000
--- a/rtengine/dirpyrLab_equalizer.cc
+++ /dev/null
@@ -1,521 +0,0 @@
-/*
- * This file is part of RawTherapee.
- *
- * 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 .
- *
- * (C) 2010 Emil Martinec
- *
- */
-
-#include
-#include
-#include "curves.h"
-#include "labimage.h"
-#include "improcfun.h"
-#include "rawimagesource.h"
-#include "rt_math.h"
-
-#ifdef _OPENMP
-#include
-#endif
-
-#define CLIPC(a) ((a)>-32000?((a)<32000?(a):32000):-32000)
-
-#define DIRWT(i1,j1,i,j) (rangefn[abs((int)data_fine->L[i1][j1]-data_fine->L[i][j])+abs((int)data_fine->a[i1][j1]-data_fine->a[i][j])+abs((int)data_fine->b[i1][j1]-data_fine->b[i][j])] )
-
-namespace rtengine
-{
-
-static const int maxlevel = 4;
-
-//sequence of scales
-static const int scales[8] = {1, 2, 4, 8, 16, 32, 64, 128};
-//sequence of pitches
-static const int pitches[8] = {1, 1, 1, 1, 1, 1, 1, 1};
-
-//sequence of scales
-//static const int scales[8] = {1,1,1,1,1,1,1,1};
-//sequence of pitches
-//static const int pitches[8] = {2,2,2,2,2,2,2,2};
-
-//sequence of scales
-//static const int scales[8] = {1,3,6,10,15,21,28,36};
-//sequence of pitches
-//static const int pitches[8] = {1,1,1,1,1,1,1,1};
-
-//sequence of scales
-//static const int scales[8] = {1,1,2,4,8,16,32,64};
-//sequence of pitches
-//static const int pitches[8] = {2,1,1,1,1,1,1,1};
-
-//pitch is spacing of subsampling
-//scale is spacing of directional averaging weights
-//example 1: no subsampling at any level -- pitch=1, scale=2^n
-//example 2: subsampling by 2 every level -- pitch=2, scale=1 at each level
-//example 3: no subsampling at first level, subsampling by 2 thereafter --
-// pitch =1, scale=1 at first level; pitch=2, scale=2 thereafter
-
-
-
-
-void ImProcFunctions :: dirpyrLab_equalizer(LabImage * src, LabImage * dst, /*float luma, float chroma, float gamma*/ const double * mult )
-{
-
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- LUTf rangefn(0x20000);
-
-
- //set up weights
- float noise = 1500;
-
-
- //set up range functions
-
- for (int i = 0; i < 0x20000; i++) {
- rangefn[i] = (int)((noise / ((double)i + noise)));
- }
-
-
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-
-
- int level;
- int ** buffer[3];
-
-
- LabImage * dirpyrLablo[maxlevel];
-
- int w = src->W;
- int h = src->H;
-
- buffer[0] = allocArray (w + 128, h + 128);
- buffer[1] = allocArray (w + 128, h + 128);
- buffer[2] = allocArray (w + 128, h + 128);
-
- for (int i = 0; i < h + 128; i++)
- for (int j = 0; j < w + 128; j++) {
- for (int c = 0; c < 3; c++) {
- buffer[c][i][j] = 0;
- }
- }
-
- w = (int)((w - 1) / pitches[0]) + 1;
- h = (int)((h - 1) / pitches[0]) + 1;
-
- dirpyrLablo[0] = new LabImage(w, h);
-
- for (level = 1; level < maxlevel; level++) {
- w = (int)((w - 1) / pitches[level]) + 1;
- h = (int)((h - 1) / pitches[level]) + 1;
- dirpyrLablo[level] = new LabImage(w, h);
- };
-
- //////////////////////////////////////////////////////////////////////////////
-
-
- // c[0] = luma = noise_L
- // c[1] = chroma = noise_ab
- // c[2] decrease of noise var with scale
- // c[3] radius of domain blur at each level
- // c[4] shadow smoothing
- // c[5] edge preservation
-
- level = 0;
-
- int scale = scales[level];
-
- int pitch = pitches[level];
-
- //int thresh = 10 * c[8];
- //impulse_nr (src, src, m_w1, m_h1, thresh, noisevar);
-
- dirpyr_eq(src, dirpyrLablo[0], rangefn, 0, pitch, scale, mult );
-
- level = 1;
-
- int totalpitch = pitches[0];
-
- while(level < maxlevel) {
- scale = scales[level];
- pitch = pitches[level];
-
- dirpyr_eq(dirpyrLablo[level - 1], dirpyrLablo[level], rangefn, level, pitch, scale, mult );
-
- level ++;
- totalpitch *= pitch;
- }
-
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- //initiate buffer for final image
- for(int i = 0, i1 = 0; i < src->H; i += totalpitch, i1++)
- for(int j = 0, j1 = 0; j < src->W; j += totalpitch, j1++) {
-
- //copy pixels
- buffer[0][i][j] = dirpyrLablo[maxlevel - 1]->L[i1][j1];
- buffer[1][i][j] = dirpyrLablo[maxlevel - 1]->a[i1][j1];
- buffer[2][i][j] = dirpyrLablo[maxlevel - 1]->b[i1][j1];
-
- }
-
- //if we are not subsampling, this is lots faster but does the typecasting work???
- //memcpy(buffer[0],dirpyrLablo[maxlevel-1]->L,sizeof(buffer[0]));
- //memcpy(buffer[1],dirpyrLablo[maxlevel-1]->a,sizeof(buffer[1]));
- //memcpy(buffer[2],dirpyrLablo[maxlevel-1]->b,sizeof(buffer[2]));
-
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-
-
- for(int level = maxlevel - 1; level > 0; level--) {
-
- //int scale = scales[level];
- int pitch = pitches[level];
-
- totalpitch /= pitch;
-
- idirpyr_eq(dirpyrLablo[level], dirpyrLablo[level - 1], buffer, level, pitch, totalpitch, mult );
-
- }
-
-
- scale = scales[0];
- pitch = pitches[0];
- totalpitch /= pitch;
-
- idirpyr_eq(dirpyrLablo[0], dst, buffer, 0, pitch, totalpitch, mult );
-
-
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-
- for (int i = 0; i < dst->H; i++)
- for (int j = 0; j < dst->W; j++) {
-
- // TODO: Is integer cast necessary here?
- dst->L[i][j] = CLIP((int)( buffer[0][i][j] ));
- dst->a[i][j] = CLIPC((int)( buffer[1][i][j] ));
- dst->b[i][j] = CLIPC((int)( buffer[2][i][j] ));
-
- }
-
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-
- for(int i = 0; i < maxlevel; i++) {
- delete dirpyrLablo[i];
- }
-
- for (int c = 0; c < 3; c++) {
- freeArray(buffer[c], h + 128);
- }
-
-
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-}
-
-void ImProcFunctions::dirpyr_eq(LabImage* data_fine, LabImage* data_coarse, LUTf & rangefn, int level, int pitch, int scale, const double * mult )
-{
-
- //pitch is spacing of subsampling
- //scale is spacing of directional averaging weights
- //example 1: no subsampling at any level -- pitch=1, scale=2^n
- //example 2: subsampling by 2 every level -- pitch=2, scale=1 at each level
- //example 3: no subsampling at first level, subsampling by 2 thereafter --
- // pitch =1, scale=1 at first level; pitch=2, scale=2 thereafter
-
-
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- // calculate weights, compute directionally weighted average
-
- int width = data_fine->W;
- int height = data_fine->H;
-
-
-
- //generate domain kernel
- int halfwin = 1;//min(ceil(2*sig),3);
- int scalewin = halfwin * scale;
-
-
-#ifdef _OPENMP
- #pragma omp parallel for
-#endif
-
- for(int i = 0; i < height; i += pitch) {
- int i1 = i / pitch;
-
- for(int j = 0, j1 = 0; j < width; j += pitch, j1++) {
- float Lout, aout, bout;
- float norm;
- norm = 0;//if we do want to include the input pixel in the sum
- Lout = 0;
- aout = 0;
- bout = 0;
-
- for(int inbr = max(0, i - scalewin); inbr <= min(height - 1, i + scalewin); inbr += scale) {
- for (int jnbr = max(0, j - scalewin); jnbr <= min(width - 1, j + scalewin); jnbr += scale) {
- float dirwt = DIRWT(inbr, jnbr, i, j);
- Lout += dirwt * data_fine->L[inbr][jnbr];
- aout += dirwt * data_fine->a[inbr][jnbr];
- bout += dirwt * data_fine->b[inbr][jnbr];
- norm += dirwt;
- }
- }
-
- data_coarse->L[i1][j1] = Lout / norm; //low pass filter
- data_coarse->a[i1][j1] = aout / norm;
- data_coarse->b[i1][j1] = bout / norm;
- }
- }
-
-
-
-
-}
-
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-void ImProcFunctions::idirpyr_eq(LabImage* data_coarse, LabImage* data_fine, int *** buffer, int level, int pitch, int scale, const double * mult )
-{
-
- int width = data_fine->W;
- int height = data_fine->H;
-
- float lumamult[4], chromamult[4];
-
- for (int i = 0; i < 4; i++) {
- lumamult[i] = mult[i];
- chromamult[i] = mult[i + 4];
- }
-
- float wtdsum[6], norm, dirwt;
- float hipass[3];
- int i1, j1;
-
-
- // for coarsest level, take non-subsampled lopass image and subtract from lopass_fine to generate hipass image
-
- // denoise hipass image, add back into lopass_fine to generate denoised image at fine scale
-
- // now iterate:
- // (1) take denoised image at level n, expand and smooth using gradient weights from lopass image at level n-1
- // the result is the smoothed image at level n-1
- // (2) subtract smoothed image at level n-1 from lopass image at level n-1 to make hipass image at level n-1
- // (3) denoise the hipass image at level n-1
- // (4) add the denoised image at level n-1 to the smoothed image at level n-1 to make the denoised image at level n-1
-
- // note that the coarsest level amounts to skipping step (1) and doing (2,3,4).
- // in other words, skip step one if pitch=1
-
-
-
- if (pitch == 1) {
- // step (1-2-3-4)
-#ifdef _OPENMP
- #pragma omp parallel for
-#endif
-
- for(int i = 0; i < height; i++)
- for(int j = 0; j < width; j++) {
-
- //luma
- float hipass0 = (float)data_fine->L[i][j] - data_coarse->L[i][j];
- buffer[0][i * scale][j * scale] += hipass0 * lumamult[level]; //*luma;
-
- //chroma
- float hipass1 = data_fine->a[i][j] - data_coarse->a[i][j];
- float hipass2 = data_fine->b[i][j] - data_coarse->b[i][j];
- buffer[1][i * scale][j * scale] += hipass1 * chromamult[level]; //*chroma;
- buffer[2][i * scale][j * scale] += hipass2 * chromamult[level]; //*chroma;
- }
-
- } else {
-
- // step (1)
- //if (pitch>1), pitch=2; expand coarse image, fill in missing data
-
- LabImage* smooth;
- smooth = new LabImage(width, height);
-#ifdef _OPENMP
- #pragma omp parallel
-#endif
-
- {
-#ifdef _OPENMP
- #pragma omp for
-#endif
-
- for(int i = 0; i < height; i += pitch) {
- int i2 = i / pitch;
-
- for(int j = 0, j2 = 0; j < width; j += pitch, j2++) {
-
- //copy common pixels
- smooth->L[i][j] = data_coarse->L[i2][j2];
- smooth->a[i][j] = data_coarse->a[i2][j2];
- smooth->b[i][j] = data_coarse->b[i2][j2];
- }
- }
-
-#ifdef _OPENMP
- #pragma omp for
-#endif
-
- for(int i = 0; i < height - 1; i += 2)
- for(int j = 0; j < width - 1; j += 2) {
- //do midpoint first
- norm = dirwt = 0;
- wtdsum[0] = wtdsum[1] = wtdsum[2] = wtdsum[3] = wtdsum[4] = wtdsum[5] = 0.0;
-
- for(i1 = i; i1 < min(height, i + 3); i1 += 2)
- for (j1 = j; j1 < min(width, j + 3); j1 += 2) {
- dirwt = 1;//IDIRWT(i1, j1, i, j);
- wtdsum[0] += dirwt * smooth->L[i1][j1];
- wtdsum[1] += dirwt * smooth->a[i1][j1];
- wtdsum[2] += dirwt * smooth->b[i1][j1];
- wtdsum[3] += dirwt * buffer[0][i1 * scale][j1 * scale]; // not completely right if j1*scale or i1*scale is out of bounds of original image ???
- wtdsum[4] += dirwt * buffer[1][i1 * scale][j1 * scale]; // also should we use directional average?
- wtdsum[5] += dirwt * buffer[2][i1 * scale][j1 * scale];
- norm += dirwt;
- }
-
- norm = 1 / norm;
- smooth->L[i + 1][j + 1] = wtdsum[0] * norm;
- smooth->a[i + 1][j + 1] = wtdsum[1] * norm;
- smooth->b[i + 1][j + 1] = wtdsum[2] * norm;
- buffer[0][(i + 1)*scale][(j + 1)*scale] = wtdsum[3] * norm;
- buffer[1][(i + 1)*scale][(j + 1)*scale] = wtdsum[4] * norm;
- buffer[2][(i + 1)*scale][(j + 1)*scale] = wtdsum[5] * norm;
- }
-
-#ifdef _OPENMP
- #pragma omp for
-#endif
-
- for(int i = 0; i < height - 1; i += 2)
- for(int j = 0; j < width - 1; j += 2) {
- //now right neighbor
- if (j + 1 == width) {
- continue;
- }
-
- norm = dirwt = 0;
- wtdsum[0] = wtdsum[1] = wtdsum[2] = wtdsum[3] = wtdsum[4] = wtdsum[5] = 0.0;
-
- for (j1 = j; j1 < min(width, j + 3); j1 += 2) {
- dirwt = 1;//IDIRWT(i, j1, i, j);
- wtdsum[0] += dirwt * smooth->L[i][j1];
- wtdsum[1] += dirwt * smooth->a[i][j1];
- wtdsum[2] += dirwt * smooth->b[i][j1];
- wtdsum[3] += dirwt * buffer[0][i * scale][j1 * scale];
- wtdsum[4] += dirwt * buffer[1][i * scale][j1 * scale];
- wtdsum[5] += dirwt * buffer[2][i * scale][j1 * scale];
- norm += dirwt;
- }
-
- for (i1 = max(0, i - 1); i1 < min(height, i + 2); i1 += 2) {
- dirwt = 1;//IDIRWT(i1, j+1, i, j);
- wtdsum[0] += dirwt * smooth->L[i1][j + 1];
- wtdsum[1] += dirwt * smooth->a[i1][j + 1];
- wtdsum[2] += dirwt * smooth->b[i1][j + 1];
- wtdsum[3] += dirwt * buffer[0][i1 * scale][(j + 1) * scale];
- wtdsum[4] += dirwt * buffer[1][i1 * scale][(j + 1) * scale];
- wtdsum[5] += dirwt * buffer[2][i1 * scale][(j + 1) * scale];
- norm += dirwt;
- }
-
- norm = 1 / norm;
- smooth->L[i][j + 1] = wtdsum[0] * norm;
- smooth->a[i][j + 1] = wtdsum[1] * norm;
- smooth->b[i][j + 1] = wtdsum[2] * norm;
- buffer[0][i][(j + 1)*scale] = wtdsum[3] * norm;
- buffer[1][i][(j + 1)*scale] = wtdsum[4] * norm;
- buffer[2][i][(j + 1)*scale] = wtdsum[5] * norm;
-
- //now down neighbor
- if (i + 1 == height) {
- continue;
- }
-
- norm = 0;
- wtdsum[0] = wtdsum[1] = wtdsum[2] = wtdsum[3] = wtdsum[4] = wtdsum[5] = 0.0;
-
- for (i1 = i; i1 < min(height, i + 3); i1 += 2) {
- dirwt = 1;//IDIRWT(i1, j, i, j);
- wtdsum[0] += dirwt * smooth->L[i1][j];
- wtdsum[1] += dirwt * smooth->a[i1][j];
- wtdsum[2] += dirwt * smooth->b[i1][j];
- wtdsum[3] += dirwt * buffer[0][i1 * scale][j * scale];
- wtdsum[4] += dirwt * buffer[1][i1 * scale][j * scale];
- wtdsum[5] += dirwt * buffer[2][i1 * scale][j * scale];
- norm += dirwt;
- }
-
- for (j1 = max(0, j - 1); j1 < min(width, j + 2); j1 += 2) {
- dirwt = 1;//IDIRWT(i+1, j1, i, j);
- wtdsum[0] += dirwt * smooth->L[i + 1][j1];
- wtdsum[1] += dirwt * smooth->a[i + 1][j1];
- wtdsum[2] += dirwt * smooth->b[i + 1][j1];
- wtdsum[3] += dirwt * buffer[0][(i + 1) * scale][j1 * scale];
- wtdsum[4] += dirwt * buffer[1][(i + 1) * scale][j1 * scale];
- wtdsum[5] += dirwt * buffer[2][(i + 1) * scale][j1 * scale];
- norm += dirwt;
- }
-
- norm = 1 / norm;
- smooth->L[i + 1][j] = wtdsum[0] * norm;
- smooth->a[i + 1][j] = wtdsum[1] * norm;
- smooth->b[i + 1][j] = wtdsum[2] * norm;
- buffer[0][(i + 1)*scale][j * scale] = wtdsum[3] * norm;
- buffer[1][(i + 1)*scale][j * scale] = wtdsum[4] * norm;
- buffer[2][(i + 1)*scale][j * scale] = wtdsum[5] * norm;
-
- }
-
-
- // step (2-3-4)
-#ifdef _OPENMP
- #pragma omp for
-#endif
-
- for(int i = 0; i < height; i++)
- for(int j = 0; j < width; j++) {
-
- //luma
- hipass[0] = (float)data_fine->L[i][j] - smooth->L[i][j];
- buffer[0][i * scale][j * scale] += hipass[0] * lumamult[level]; //*luma;
-
- //chroma
- hipass[1] = data_fine->a[i][j] - smooth->a[i][j];
- hipass[2] = data_fine->b[i][j] - smooth->b[i][j];
- buffer[1][i * scale][j * scale] += hipass[1] * chromamult[level]; //*chroma;
- buffer[2][i * scale][j * scale] += hipass[2] * chromamult[level]; //*chroma;
- }
- } // end parallel
- delete smooth;
-
- }
-}
-
-
-#undef DIRWT_L
-#undef DIRWT_AB
-
-#undef NRWT_L
-#undef NRWT_AB
-
-}
-
diff --git a/rtengine/ex2simple.cc b/rtengine/ex2simple.cc
deleted file mode 100644
index 1a83526e7..000000000
--- a/rtengine/ex2simple.cc
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * This file is part of RawTherapee.
- *
- * Copyright (c) 2004-2010 Gabor Horvath
- *
- * RawTherapee is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * RawTherapee is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
- */
-#include "rtengine.h"
-#include
-//#include
-#include
-
-class PListener : public rtengine::ProgressListener
-{
-
-public:
- void setProgressStr (Glib::ustring str)
- {
- std::cout << str << std::endl;
- }
- void setProgress (double p)
- {
- std::cout << p << std::endl;
- }
-};
-
-class MyPrevImgListener : public rtengine::PreviewImageListener
-{
-
- IImage8* i;
-
-public:
- // this method is called when the staged image processor creates a new image to store the resulting preview image (this does not happen too often)
- // usually you just have to store it
- void setImage (IImage8* img, double scale, procparams::CropParams cp)
- {
- i = img;
- }
- // if the staged image processor wants to delete the image that stores the preview image, it calls this method. You have to destroy the image.
- void delImage (IImage8* img)
- {
- if (img) {
- // make sure we dont use this image in an other thread
- IImage8* temp = i;
- i->getMutex().lock ();
- i = NULL;
- temp->getMutex().unlock ();
- // free it
- img->free ();
- }
- }
- // if the preview image changes, this method is called
- void imageReady (procparams::CropParams cp)
- {
- // initiate a redraw in the background and return as fast as possible
- }
- // a possible redraw function:
- //void redraw () {
- // if (i) {
- // i->lock ();
- // int w = i->getWidth ();
- // int h = i->getHeigt ();
- // const char* data = i->getData ();
- // ... draw it ...
- // i->unlock ();
- // }
- // }
-};
-
-int main (int argc, char* argv[])
-{
-
- if (argc < 4) {
- std::cout << "Usage: rtcmd " << std::endl;
- exit(1);
- }
-
- Glib::thread_init ();
-
- // create and fill settings
- rtengine::Settings* s = rtengine::Settings::create ();
- s->demosaicMethod = "hphd";
- s->colorCorrectionSteps = 2;
- s->iccDirectory = "";
- s->colorimetricIntent = 1;
- s->monitorProfile = "";
- // init rtengine
- rtengine::init (s);
- // the settings can be modified later through the "s" pointer without calling any api function
-
- // Create a listener object. Any class is appropriate that inherits from rtengine::ProgressListener
- PListener pl;
-
- // Load the image given in the first command line parameter
- rtengine::InitialImage* ii;
- int errorCode;
- ii = rtengine::InitialImage::load (argv[1], true, errorCode, &pl);
-
- if (!ii) {
- ii = rtengine::InitialImage::load (argv[1], false, errorCode, &pl);
- }
-
- if (!ii) {
- std::cout << "Input file not supported." << std::endl;
- exit(2);
- }
-
- /* Second scenario. Create a stagedimageprocessor with a preview scale of 1:5 and change few things */
- MyPrevImgListener myPrevImgListener;
-
- StagedImageProcessor* ipc = StagedImageProcessor::create (ii);
- ipc->setProgressListener (&pl);
- ipc->setPreviewImageListener (&myPrevImgListener);
- ipc->setPreviewScale (5); // preview scale = 1:5
- // you can add a histogram listener, too, that is notified when the histogram changes
- // ipc->setHistogramListener (...);
- // you can add autoexplistener that is notified about the exposure settings when the auto exp algorithm finishes
- // ipc->setAutoExpListener (curve);
- // you can add sizelistener if you want to be notified when the size of the final image changes (due to rotation/resize/etc)
- // ipc->setSizeListener (crop);
-
- // if you want to change the settings you have to ask for the procparams structure of the staged image processor
- // you have to tell it what has changed. At the first time tell it EvPhotoLoaded so a full processing will be performed
- rtengine::procparams::ProcParams* params = ipc->beginUpdateParams ();
- // change this and that...
- params->toneCurve.brightness = 1.0;
- // you can load it, too, from a file: params->load (argv[2]);
- // finally you have to call this non-blocking method, and the image processing starts in the background. When finished, the preview image listener will be notified
- ipc->endUpdateParams (rtengine::EvPhotoLoaded);
- // you can go on with changing of the settings, following the gui actions
- // now we know that only the brightness has changed compared to the previous settings, to only a part of the processing has to be repeated
- params = ipc->beginUpdateParams ();
- params->toneCurve.brightness = 1.2;
- ipc->endUpdateParams (rtengine::EvBrightness);
-
- // ... and so on. If you dont need it any more, you can destroy it (make sure that no processing is happening when you destroy it!)
- StagedImageProcessor::destroy (ipc);
-}
-
diff --git a/rtengine/ffmanager.cc b/rtengine/ffmanager.cc
index 8b26c3121..069bbf563 100644
--- a/rtengine/ffmanager.cc
+++ b/rtengine/ffmanager.cc
@@ -31,17 +31,19 @@ extern const Settings* settings;
inline ffInfo& ffInfo::operator =(const ffInfo &o)
{
- pathname = o.pathname;
- maker = o.maker;
- model = o.model;
- lens = o.lens;
- shutter = o.shutter;
- focallength = o.focallength;
- timestamp = o.timestamp;
+ if (this != &o) {
+ pathname = o.pathname;
+ maker = o.maker;
+ model = o.model;
+ lens = o.lens;
+ focallength = o.focallength;
+ timestamp = o.timestamp;
+ aperture = o.aperture;
- if( ri ) {
- delete ri;
- ri = NULL;
+ if( ri ) {
+ delete ri;
+ ri = nullptr;
+ }
}
return *this;
@@ -131,7 +133,7 @@ void ffInfo::updateRawImage()
if( ri->loadRaw(true)) {
delete ri;
- ri = NULL;
+ ri = nullptr;
} else {
int H = ri->get_height();
int W = ri->get_width();
@@ -193,7 +195,7 @@ void ffInfo::updateRawImage()
if( ri->loadRaw(true)) {
delete ri;
- ri = NULL;
+ ri = nullptr;
} else {
ri->compress_image();
}
@@ -291,11 +293,11 @@ ffInfo* FFManager::addFileInfo (const Glib::ustring& filename, bool pool)
auto file = Gio::File::create_for_path (filename);
if (!file ) {
- return 0;
+ return nullptr;
}
if (!file->query_exists ()) {
- return 0;
+ return nullptr;
}
try {
@@ -303,11 +305,11 @@ ffInfo* FFManager::addFileInfo (const Glib::ustring& filename, bool pool)
auto info = file->query_info ();
if (!info || info->get_file_type () == Gio::FILE_TYPE_DIRECTORY) {
- return 0;
+ return nullptr;
}
if (!options.fbShowHidden && info->is_hidden ()) {
- return 0;
+ return nullptr;
}
Glib::ustring ext;
@@ -319,7 +321,7 @@ ffInfo* FFManager::addFileInfo (const Glib::ustring& filename, bool pool)
}
if (!options.is_extention_enabled (ext)) {
- return 0;
+ return nullptr;
}
@@ -327,7 +329,7 @@ ffInfo* FFManager::addFileInfo (const Glib::ustring& filename, bool pool)
int res = ri.loadRaw (false); // Read informations about shot
if (res != 0) {
- return 0;
+ return nullptr;
}
ffList_t::iterator iter;
@@ -367,7 +369,7 @@ ffInfo* FFManager::addFileInfo (const Glib::ustring& filename, bool pool)
} catch (Gio::Error&) {}
- return 0;
+ return nullptr;
}
void FFManager::getStat( int &totFiles, int &totTemplates)
@@ -394,7 +396,7 @@ void FFManager::getStat( int &totFiles, int &totTemplates)
ffInfo* FFManager::find( const std::string &mak, const std::string &mod, const std::string &len, double focal, double apert, time_t t )
{
if( ffList.empty() ) {
- return 0;
+ return nullptr;
}
std::string key( ffInfo::key(mak, mod, len, focal, apert) );
@@ -428,7 +430,7 @@ ffInfo* FFManager::find( const std::string &mak, const std::string &mod, const s
}
}
- return bestD != INFINITY ? &(bestMatch->second) : 0 ;
+ return bestD != INFINITY ? &(bestMatch->second) : nullptr ;
}
}
@@ -439,7 +441,7 @@ RawImage* FFManager::searchFlatField( const std::string &mak, const std::string
if( ff ) {
return ff->getRawImage();
} else {
- return 0;
+ return nullptr;
}
}
@@ -457,7 +459,7 @@ RawImage* FFManager::searchFlatField( const Glib::ustring filename )
return ff->getRawImage();
}
- return 0;
+ return nullptr;
}
diff --git a/rtengine/ffmanager.h b/rtengine/ffmanager.h
index 5f6b2d267..4a65c2ed7 100644
--- a/rtengine/ffmanager.h
+++ b/rtengine/ffmanager.h
@@ -34,18 +34,16 @@ public:
std::string maker; ///< manufacturer
std::string model; ///< model
std::string lens; ///< lens
- int iso; ///< ISO (gain)
- double shutter; ///< shutter or exposure time in sec
double aperture; ///< aperture in stops
double focallength; ///< focal length in mm
time_t timestamp; ///< seconds since 1 Jan 1970
ffInfo(const Glib::ustring &name, const std::string &mak, const std::string &mod, const std::string & len, double focal, double apert, time_t t)
- : pathname(name), maker(mak), model(mod), lens(len), aperture(apert), focallength(focal), timestamp(t), ri(NULL) {}
+ : pathname(name), maker(mak), model(mod), lens(len), aperture(apert), focallength(focal), timestamp(t), ri(nullptr) {}
ffInfo( const ffInfo &o)
- : pathname(o.pathname), maker(o.maker), model(o.model), lens(o.lens), aperture(o.aperture), focallength(o.focallength), timestamp(o.timestamp), ri(NULL) {}
+ : pathname(o.pathname), maker(o.maker), model(o.model), lens(o.lens), aperture(o.aperture), focallength(o.focallength), timestamp(o.timestamp), ri(nullptr) {}
~ffInfo()
{
if( ri ) {
diff --git a/rtengine/flatcurves.cc b/rtengine/flatcurves.cc
index 5a4dfeacf..ae1a895ff 100644
--- a/rtengine/flatcurves.cc
+++ b/rtengine/flatcurves.cc
@@ -311,10 +311,10 @@ void FlatCurve::CtrlPoints_set ()
if (nbr_points < 0) {
for(size_t it = 0; it < sc_x.size(); it += 3) {
- printf("sc_length[%zd/3]=%f \n", it, sc_length[it / 3]);
+ printf("sc_length[%zu/3]=%f \n", it, sc_length[it / 3]);
}
- printf("Flat curve: error detected!\n i=%d k=%d periodic=%d nbr_points=%d ppn=%d N=%d sc_length[i/3]=%f total_length=%f\n", i, k, periodic, nbr_points, ppn, N, sc_length[i / 3], total_length);
+ printf("Flat curve: error detected!\n i=%u k=%u periodic=%d nbr_points=%d ppn=%d N=%d sc_length[i/3]=%f total_length=%f\n", i, k, periodic, nbr_points, ppn, N, sc_length[i / 3], total_length);
exit(0);
}
diff --git a/rtengine/hlmultipliers.cc b/rtengine/hlmultipliers.cc
deleted file mode 100644
index 35e1d3e87..000000000
--- a/rtengine/hlmultipliers.cc
+++ /dev/null
@@ -1,441 +0,0 @@
-/*
- * This file is part of RawTherapee.
- *
- * Copyright (c) 2004-2010 Gabor Horvath
- *
- * RawTherapee is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * RawTherapee is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
- */
-#include
-#include
-#include "rawimagesource.h"
-#include "rawimagesource_i.h"
-#include "jaggedarray.h"
-#include "../rtgui/options.h"
-
-namespace rtengine
-{
-
-// computes highlight recovery multipliers. Needs a possibly downscaled image where
-// the highlights are indicated by INT_MAX
-void hlmultipliers (int** rec[3], int max_3[3], int dh, int dw)
-{
-
- // STEP I. recover color with two-color information
- int phase = -1;
- int k = 0;
-
- for (k = 0; k < 1000; k++) {
- int changed = 0;
-
- for (int i = 1; i < dh - 1; i++)
- for (int j = 1; j < dw - 1; j++) {
- int co, c1, c2;
-
-// if (phase==2)
-// phase++;
-// if (phase>0)// && phase!=4)
-// continue;
- if (phase == -1 || phase == 0 || phase == 2) {
- if (rec[0][i][j] == INT_MAX && rec[1][i][j] != INT_MAX && rec[1][i][j] >= 0 && rec[2][i][j] != INT_MAX && rec[2][i][j] >= 0) {
- co = 0;
- c1 = 1;
- c2 = 2;
- } else if (rec[1][i][j] == INT_MAX && rec[0][i][j] != INT_MAX && rec[0][i][j] >= 0 && rec[2][i][j] != INT_MAX && rec[2][i][j] >= 0) {
- co = 1;
- c1 = 0;
- c2 = 2;
- } else if (rec[2][i][j] == INT_MAX && rec[1][i][j] != INT_MAX && rec[1][i][j] >= 0 && rec[0][i][j] != INT_MAX && rec[0][i][j] >= 0) {
- co = 2;
- c1 = 1;
- c2 = 0;
- } else {
- continue;
- }
-
- double ratio[2] = {0.0, 0.0};
- int count = 0;
- double rato = (double)rec[c1][i][j] / rec[c2][i][j];
- double arato = 0.0;
-
- if (phase == 2) {
- for (int x = -1; x <= 1; x++)
- for (int y = -1; y <= 1; y++) {
- // average m/c color ratios in the surrounding pixels
- if (rec[co][i + x][j + y] >= 0 && rec[co][i + x][j + y] != INT_MAX && rec[c1][i + x][j + y] >= 0 && rec[c1][i + x][j + y] != INT_MAX && rec[c2][i + x][j + y] > 0 && rec[c2][i + x][j + y] != INT_MAX) {
- double ratt = (double)rec[c1][i + x][j + y] / rec[c2][i + x][j + y];
-
- if (ratt > rato * 1.2 || ratt < rato / 1.2 || rec[co][i + x][j + y] < max_3[co] * 1 / 2) {
- continue;
- }
-
- ratio[0] += (double)rec[c1][i + x][j + y] / rec[co][i + x][j + y];
- ratio[1] += (double)rec[c2][i + x][j + y] / rec[co][i + x][j + y];
- count++;
- }
- }
- } else if (phase == -1) {
- for (int x = -1; x <= 1; x++)
- for (int y = -1; y <= 1; y++) {
- // average m/c color ratios in the surrounding pixels
- if (rec[co][i + x][j + y] >= 0 && rec[co][i + x][j + y] != INT_MAX && rec[c1][i + x][j + y] >= 0 && rec[c1][i + x][j + y] != INT_MAX && rec[c2][i + x][j + y] > 0 && rec[c2][i + x][j + y] != INT_MAX) {
- double ratt = (double)rec[c1][i + x][j + y] / rec[c2][i + x][j + y];
-
- if (ratt > rato * 1.05 || ratt < rato / 1.05 || rec[co][i + x][j + y] < max_3[co] * 4 / 5) {
- continue;
- }
-
- arato += ratt;
- ratio[0] += (double)rec[c1][i + x][j + y] / rec[co][i + x][j + y];
- ratio[1] += (double)rec[c2][i + x][j + y] / rec[co][i + x][j + y];
-
- count++;
- }
- }
- } else {
- for (int x = -1; x <= 1; x++)
- for (int y = -1; y <= 1; y++) {
- // average m/c color ratios in the surrounding pixels
- if (rec[co][i + x][j + y] >= 0 && rec[co][i + x][j + y] != INT_MAX && rec[c1][i + x][j + y] >= 0 && rec[c1][i + x][j + y] != INT_MAX && rec[c2][i + x][j + y] > 0 && rec[c2][i + x][j + y] != INT_MAX) {
- double ratt = (double)rec[c1][i + x][j + y] / rec[c2][i + x][j + y];
-
- if (ratt > rato * 1.1 || ratt < rato / 1.1 || rec[co][i + x][j + y] < max_3[co] * 3 / 4) {
- continue;
- }
-
- arato += ratt;
- ratio[0] += (double)rec[c1][i + x][j + y] / rec[co][i + x][j + y];
- ratio[1] += (double)rec[c2][i + x][j + y] / rec[co][i + x][j + y];
-
- count++;
- }
- }
- }
-
- // compute new pixel values from the surrounding color ratios
- if (count > 1) { //(phase==0 && count>1) || (phase==2 && count>1)) {
- rec[co][i][j] = -(int)((rec[c1][i][j] / ratio[0] * count + rec[c2][i][j] / ratio[1] * count) / 2);
- changed++;
- }
- } else if (phase == 1 || phase == 3) {
- if (rec[0][i][j] == INT_MAX && rec[1][i][j] == INT_MAX && rec[2][i][j] != INT_MAX && rec[2][i][j] >= 0) {
- co = 2;
- c1 = 0;
- c2 = 1;
- } else if (rec[0][i][j] == INT_MAX && rec[2][i][j] == INT_MAX && rec[1][i][j] != INT_MAX && rec[1][i][j] >= 0) {
- co = 1;
- c1 = 0;
- c2 = 2;
- } else if (rec[1][i][j] == INT_MAX && rec[2][i][j] == INT_MAX && rec[0][i][j] != INT_MAX && rec[0][i][j] >= 0) {
- co = 0;
- c1 = 1;
- c2 = 2;
- } else {
- continue;
- }
-
- double ratio[2] = {0.0, 0.0};
- int count[2] = {0, 0};
-
- for (int x = -1; x <= 1; x++)
- for (int y = -1; y <= 1; y++) {
- // average m/c color ratios in the surrounding pixels
- if (rec[co][i + x][j + y] >= 0 && rec[co][i + x][j + y] != INT_MAX && rec[c1][i + x][j + y] > 0 && rec[c1][i + x][j + y] != INT_MAX) {
- if ((phase == 1 && rec[c1][i + x][j + y] < max_3[c1] * 3 / 4) || (phase == 3 && rec[c1][i + x][j + y] < max_3[c1] * 1 / 2)) {
- continue;
- }
-
- ratio[0] += (double)rec[co][i + x][j + y] / rec[c1][i + x][j + y];
- count[0] ++;
- }
-
- if (rec[co][i + x][j + y] >= 0 && rec[co][i + x][j + y] != INT_MAX && rec[c2][i + x][j + y] > 0 && rec[c2][i + x][j + y] != INT_MAX) {
- if ((phase == 1 && rec[c2][i + x][j + y] < max_3[c2] * 3 / 4) || (phase == 3 && rec[c2][i + x][j + y] < max_3[c2] * 1 / 2))
-// if (/*phase!=3 && */rec[c2][i+x][j+y] 2) || (phase == 3 && count[0] > 1)) {
- rec[c1][i][j] = - (int) ((double)rec[co][i][j] / ratio[0] * count[0]);
- changed++;
- }
-
- if ((phase == 1 && count[1] > 2) || (phase == 3 && count[1] > 1)) {
- rec[c2][i][j] = - (int) ((double)rec[co][i][j] / ratio[1] * count[1]);
- changed++;
- }
- } else {
- int val = 0;
- int num = 0;
-
- for (int c = 0; c < 3; c++)
- if (rec[c][i][j] != INT_MAX) {
- val += rec[c][i][j];
- num++;
- }
-
- if (num < 3 && num > 0) {
- for (int c = 0; c < 3; c++) {
- rec[c][i][j] = val / num;
- }
- }
- }
- }
-
-
- bool change = false;
-
- for (int i = 1; i < dh - 1; i++)
- for (int j = 1; j < dw - 1; j++)
- for (int c = 0; c < 3; c++) {
- if (rec[c][i][j] < 0) {
- rec[c][i][j] = -rec[c][i][j];
- change = true;
- }
- }
-
- if (!change && phase < 4) {
- phase++;
-
- if( options.rtSettings.verbose ) {
- printf ("phc %d: %d\n", phase, k);
- }
- } else if (!change) {
- break;
- }
-
- if (k % 20 == 0 && options.rtSettings.verbose ) {
- printf ("changed %d\n", changed);
- }
- }
-
- if( options.rtSettings.verbose ) {
- printf ("Highlight recovery ends in %d iterations\n", k);
- }
-
- int maxval = max(max_3[0], max_3[1], max_3[2]);
-
- for (int i = 0; i < dh; i++)
- for (int j = 0; j < dw; j++)
- if (rec[0][i][j] == INT_MAX || rec[1][i][j] == INT_MAX || rec[2][i][j] == INT_MAX) {
- rec[0][i][j] = maxval;
- rec[1][i][j] = maxval;
- rec[2][i][j] = maxval;
-
- }
-}
-
-void RawImageSource::HLRecovery_ColorPropagation (float* red, float* green, float* blue, int i, int sx1, int width, int skip)
-{
-
- int blr = (i + HR_SCALE / 2) / HR_SCALE - 1;
-
- if (blr < 0 || blr >= H / HR_SCALE - 2) {
- return;
- }
-
- double mr1 = 1.0 - ((double)((i + HR_SCALE / 2) % HR_SCALE) / HR_SCALE + 0.5 / HR_SCALE);
- int maxcol = W / HR_SCALE - 2;
-
- for (int j = sx1, jx = 0; jx < width; j += skip, jx++) {
- if (needhr[i][j]) {
- int blc = (j + HR_SCALE / 2) / HR_SCALE - 1;
-
- if (blc < 0 || blc >= maxcol) {
- continue;
- }
-
- double mc1 = 1.0 - ((double)((j + HR_SCALE / 2) % HR_SCALE) / HR_SCALE + 0.5 / HR_SCALE);
- double mulr = mr1 * mc1 * hrmap[0][blr][blc] + mr1 * (1.0 - mc1) * hrmap[0][blr][blc + 1] + (1.0 - mr1) * mc1 * hrmap[0][blr + 1][blc] + (1.0 - mr1) * (1.0 - mc1) * hrmap[0][blr + 1][blc + 1];
- double mulg = mr1 * mc1 * hrmap[1][blr][blc] + mr1 * (1.0 - mc1) * hrmap[1][blr][blc + 1] + (1.0 - mr1) * mc1 * hrmap[1][blr + 1][blc] + (1.0 - mr1) * (1.0 - mc1) * hrmap[1][blr + 1][blc + 1];
- double mulb = mr1 * mc1 * hrmap[2][blr][blc] + mr1 * (1.0 - mc1) * hrmap[2][blr][blc + 1] + (1.0 - mr1) * mc1 * hrmap[2][blr + 1][blc] + (1.0 - mr1) * (1.0 - mc1) * hrmap[2][blr + 1][blc + 1];
- red[jx] = (red[jx] * mulr);
- green[jx] = (green[jx] * mulg);
- blue[jx] = (blue[jx] * mulb);
- } else {
- red[jx] = (red[jx]);
- green[jx] = (green[jx]);
- blue[jx] = (blue[jx]);
- }
- }
-}
-
-void RawImageSource::updateHLRecoveryMap_ColorPropagation ()
-{
-
- // detect maximal pixel values
- float* red = new float[W];
- float* blue = new float[W];
- int maxr = 0, maxg = 0, maxb = 0;
-
- for (int i = 32; i < H - 32; i++) {
- interpolate_row_rb (red, blue, green[i - 1], green[i], green[i + 1], i);
-
- for (int j = 32; j < W - 32; j++) {
- if ((ri->ISRED(i, j) || ri->getSensorType() != ST_BAYER) && red[j] > maxr) {
- maxr = red[j];
- }
-
- if ((ri->ISGREEN(i, j) || ri->getSensorType() != ST_BAYER) && green[i][j] > maxg) {
- maxg = green[i][j];
- }
-
- if ((ri->ISBLUE(i, j) || ri->getSensorType() != ST_BAYER) && blue[j] > maxb) {
- maxb = blue[j];
- }
- }
- }
-
- delete [] red;
- delete [] blue;
-
- maxr = maxr * 19 / 20;
- maxg = maxg * 19 / 20;
- maxb = maxb * 19 / 20;
- max_3[0] = maxr;
- max_3[1] = maxg;
- max_3[2] = maxb;
-
- // downscale image
- int dw = W / HR_SCALE;
- int dh = H / HR_SCALE;
- Image16* ds = new Image16 (dw, dh);
-
- // overburnt areas
- int** rec[3];
-
- for (int i = 0; i < 3; i++) {
- rec[i] = allocJaggedArray (dw, dh);
- }
-
- float* reds[HR_SCALE];
- float* blues[HR_SCALE];
-
- for (int i = 0; i < HR_SCALE; i++) {
- reds[i] = new float[W];
- blues[i] = new float[W];
- }
-
- if (needhr) {
- freeJaggedArray(needhr);
- }
-
- needhr = allocJaggedArray (W, H);
-
- for (int i = 0; i < dh; i++) {
- for (int j = 0; j < HR_SCALE; j++) {
- interpolate_row_rb (reds[j], blues[j], green[HR_SCALE * i + j - 1], green[HR_SCALE * i + j], green[HR_SCALE * i + j + 1], HR_SCALE * i + j);
-
- for (int k = 0; k < W; k++)
- if (reds[j][k] >= max_3[0] || green[HR_SCALE * i + j][k] >= max_3[1] || blues[j][k] >= max_3[2]) {
- needhr[HR_SCALE * i + j][k] = 1;
- } else {
- needhr[HR_SCALE * i + j][k] = 0;
- }
- }
-
- for (int j = 0; j < dw; j++) {
- int sumr = 0;
- int cr = 0;
- int sumg = 0;
- int cg = 0;
- int sumb = 0;
- int cb = 0;
-
- for (int x = 0; x < HR_SCALE; x++)
- for (int y = 0; y < HR_SCALE; y++) {
- int ix = HR_SCALE * i + x;
- int jy = HR_SCALE * j + y;
- sumr += reds[x][jy];
-
- if (reds[x][jy] < maxr) {
- cr++;
- }
-
- sumg += green[ix][jy];
-
- if (green[ix][jy] < maxg) {
- cg++;
- }
-
- sumb += blues[x][jy];
-
- if (blues[x][jy] < maxb) {
- cb++;
- }
- }
-
- if (cr < HR_SCALE * HR_SCALE) {
- rec[0][i][j] = INT_MAX;
- } else {
- rec[0][i][j] = sumr / HR_SCALE / HR_SCALE;
- }
-
- if (cg < HR_SCALE * HR_SCALE) {
- rec[1][i][j] = INT_MAX;
- } else {
- rec[1][i][j] = sumg / HR_SCALE / HR_SCALE;
- }
-
- if (cb < HR_SCALE * HR_SCALE) {
- rec[2][i][j] = INT_MAX;
- } else {
- rec[2][i][j] = sumb / HR_SCALE / HR_SCALE;
- }
-
- ds->r(i, j) = sumr / HR_SCALE / HR_SCALE;
- ds->g(i, j) = sumg / HR_SCALE / HR_SCALE;
- ds->b(i, j) = sumb / HR_SCALE / HR_SCALE;
- }
- }
-
- for (int i = 0; i < HR_SCALE; i++) {
- delete [] reds[i];
- delete [] blues[i];
- }
-
- hlmultipliers (rec, max_3, dh, dw);
-
- if (hrmap[0] != NULL) {
- freeJaggedArray (hrmap[0]);
- freeJaggedArray (hrmap[1]);
- freeJaggedArray (hrmap[2]);
- }
-
- hrmap[0] = allocJaggedArray (dw, dh);
- hrmap[1] = allocJaggedArray (dw, dh);
- hrmap[2] = allocJaggedArray (dw, dh);
-
- for (int i = 0; i < dh; i++)
- for (int j = 0; j < dw; j++) {
- hrmap[0][i][j] = ds->r(i, j) > 0 ? (double)rec[0][i][j] / ds->r(i, j) : 1.0;
- hrmap[1][i][j] = ds->g(i, j) > 0 ? (double)rec[1][i][j] / ds->g(i, j) : 1.0;
- hrmap[2][i][j] = ds->b(i, j) > 0 ? (double)rec[2][i][j] / ds->b(i, j) : 1.0;
- }
-
- delete ds;
-
- freeJaggedArray (rec[0]);
- freeJaggedArray (rec[1]);
- freeJaggedArray (rec[2]);
-}
-
-}
-
diff --git a/rtengine/hlrecovery.cc b/rtengine/hlrecovery.cc
deleted file mode 100644
index 4f527b660..000000000
--- a/rtengine/hlrecovery.cc
+++ /dev/null
@@ -1,397 +0,0 @@
-/*
- * This file is part of RawTherapee.
- *
- * Copyright (c) 2004-2010 Gabor Horvath
- *
- * RawTherapee is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * RawTherapee is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
- */
-
-namespace rtengine
-{
-
-template T** allocArray (int W, int H)
-{
-
- T** t = new T*[H];
-
- for (int i = 0; i < H; i++) {
- t[i] = new T[W];
- }
-
- return t;
-}
-
-void RawImageSource::updateHLRecoveryMap (bool needred, bool needgreen, bool needblue, bool full)
-{
-
- // detect maximal pixel values
- unsigned short* red = new unsigned short[W];
- unsigned short* blue = new unsigned short[W];
- int maxr = 0, maxg = 0, maxb = 0;
-
- for (int i = 32; i < H - 32; i++) {
- interpolate_row_rb (red, blue, green[i - 1], green[i], green[i + 1], i);
-
- for (int j = 32; j < W - 32; j++) {
- if (red[j] > maxr) {
- maxr = red[j];
- }
-
- if (green[i][j] > maxg) {
- maxg = green[i][j];
- }
-
- if (blue[j] > maxb) {
- maxb = blue[j];
- }
- }
- }
-
- delete [] red;
- delete [] blue;
-
- maxr = maxr * 19 / 20;
- maxg = maxg * 19 / 20;
- maxb = maxb * 19 / 20;
- int max[3];
- max[0] = maxr;
- max[1] = maxg;
- max[2] = maxb;
-
- if( options.rtSettings.verbose ) {
- printf ("HLRecoveryMap Maximum: R: %d, G: %d, B: %d\n", maxr, maxg, maxb);
- }
-
- // downscale image
- int dw = W / SCALE;
- int dh = H / SCALE;
- Image16* ds = new Image16 (dw, dh);
-
- // overburnt areas
- int** rec[3];
-
- for (int i = 0; i < 3; i++) {
- rec[i] = allocArray (dw, dh);
- }
-
- unsigned short* reds[SCALE];
- unsigned short* blues[SCALE];
-
- for (int i = 0; i < SCALE; i++) {
- reds[i] = new unsigned short[W];
- blues[i] = new unsigned short[W];
- }
-
- for (int i = 0; i < dh; i++) {
- for (int j = 0; j < SCALE; j++) {
- interpolate_row_rb (reds[j], blues[j], green[SCALE * i + j - 1], green[SCALE * i + j], green[SCALE * i + j + 1], SCALE * i + j);
- }
-
- for (int j = 0; j < dw; j++) {
- int sumr = 0;
- int cr = 0;
- int sumg = 0;
- int cg = 0;
- int sumb = 0;
- int cb = 0;
-
- for (int x = 0; x < SCALE; x++)
- for (int y = 0; y < SCALE; y++) {
- int ix = SCALE * i + x;
- int jy = SCALE * j + y;
- sumr += reds[x][jy];
-
- if (reds[x][jy] < maxr) {
- cr++;
- }
-
- sumg += green[ix][jy];
-
- if (green[ix][jy] < maxg) {
- cg++;
- }
-
- sumb += blues[x][jy];
-
- if (blues[x][jy] < maxb) {
- cb++;
- }
- }
-
- if (cr < SCALE * SCALE && needred) {
- rec[0][i][j] = INT_MAX;
- } else {
- rec[0][i][j] = sumr / SCALE / SCALE;
- }
-
- if (cg < SCALE * SCALE && needgreen) {
- rec[1][i][j] = INT_MAX;
- } else {
- rec[1][i][j] = sumg / SCALE / SCALE;
- }
-
- if (cb < SCALE * SCALE && needblue) {
- rec[2][i][j] = INT_MAX;
- } else {
- rec[2][i][j] = sumb / SCALE / SCALE;
- }
-
- ds->r(i, j) = sumr / SCALE / SCALE;
- ds->g(i, j) = sumg / SCALE / SCALE;
- ds->b(i, j) = sumb / SCALE / SCALE;
- }
- }
-
- for (int i = 0; i < SCALE; i++) {
- delete [] reds[i];
- delete [] blues[i];
- }
-
-
- // STEP I. recover color from the partially lost areas
- bool phase2 = false;
-
- for (int k = 0; k < 400; k++) {
- if (k > 200) {
- phase2 = true;
- }
-
- for (int i = 1; i < dh - 1; i++)
- for (int j = 1; j < dw - 1; j++) {
- for (int c = 0; c < 3; c++) {
- // if channel c is lost
- if (rec[c][i][j] == INT_MAX) {
- double ratio[2] = {0.0, 0.0};
- double w[2] = {0.0, 0.0};
- int count[2] = {0, 0};
- int ix = 0;
-
- for (int m = 0; m < 3; m++) {
- if (m == c) {
- continue;
- }
-
- // if channel m is not lost at this point (or already recovered)
- if (rec[m][i][j] != INT_MAX && rec[m][i][j] >= 0) {
- for (int x = -1; x <= 1; x++)
- for (int y = -1; y <= 1; y++)
-
- // average m/c color ratios in the surrounding pixels
- if (rec[m][i + x][j + y] >= 0 && rec[m][i + x][j + y] != INT_MAX && rec[c][i + x][j + y] > 0 && rec[c][i + x][j + y] != INT_MAX) {
- double ww = 1.0;
-
- if (!phase2 && (/*(double)(rec[m][i+x][j+y] - rec[m][i][j])/max[m]*(rec[m][i+x][j+y] - rec[m][i][j])/max[m] > 1.0/2 || */rec[c][i + x][j + y] < max[c] * 3 / 4)) {
- continue;
- }
-
- w[ix] += ww;
- ratio[ix] += ww * rec[m][i + x][j + y] / rec[c][i + x][j + y];
- count[ix] ++;
- }
- }
-
- ix++;
- }
-
- // compute new pixel values from the surrounding color ratios
- double newc = 0.0;
- int nc = 0;
- ix = 0;
-
- for (int m = 0; m < 3; m++) {
- if (c == m) {
- continue;
- }
-
- if (count[ix]) {
- newc += (double)rec[m][i][j] / ratio[ix] * w[ix];
- nc++;
- }
-
- ix++;
- }
-
- if (nc) {
- rec[c][i][j] = - (int) (newc / nc);
- }
- }
- }
- }
-
- bool change = false;
-
- for (int i = 0; i < dh; i++)
- for (int j = 0; j < dw; j++)
- for (int c = 0; c < 3; c++) {
- if (rec[c][i][j] < 0) {
- rec[c][i][j] = -rec[c][i][j];
- }
-
- change = true;
- }
-
- if (!change) {
- break;
- }
- }
-
- printf ("Phase1 vege\n");
-
- // STEP II. recover fully lost pixels
- if (full) {
- int maxY = (299 * max[0] + 587 * max[1] + 114 * max[2]) / 1000;
- phase2 = false;
-
- for (int k = 0; k < 600; k++) {
- if (k > 200) {
- phase2 = true;
- }
-
- for (int i = 1; i < dh - 1; i++)
- for (int j = 1; j < dw - 1; j++) {
- if (rec[0][i][j] == INT_MAX || rec[1][i][j] == INT_MAX || rec[2][i][j] == INT_MAX) {
- int count = 0;
- double yavg = 0, iavg = 0, qavg = 0, weight = 0.0;
-
- for (int x = -1; x <= 1; x++)
- for (int y = -1; y <= 1; y++)
- if (rec[0][i + x][j + y] > 0 && rec[0][i + x][j + y] != INT_MAX && rec[1][i + x][j + y] > 0 && rec[1][i + x][j + y] != INT_MAX && rec[2][i + x][j + y] > 0 && rec[2][i + x][j + y] != INT_MAX) {
- // convert to yiq
- double Y = 0.299 * rec[0][i + x][j + y] + 0.587 * rec[1][i + x][j + y] + 0.114 * rec[2][i + x][j + y];
- double I = 0.596 * rec[0][i + x][j + y] - 0.275 * rec[1][i + x][j + y] - 0.321 * rec[2][i + x][j + y];
- double Q = 0.212 * rec[0][i + x][j + y] - 0.523 * rec[1][i + x][j + y] + 0.311 * rec[2][i + x][j + y];
-
- if (Y > maxY * 7 / 10) {
- double w = 1.0;// / (I*I+Q*Q);
- yavg += Y * w;
- iavg += I * w;
- qavg += Q * w;
- weight += w;
- count++;
- }
- }
-
- if ((!phase2 && count > 5) || (phase2 && count > 3)) {
- double Y = yavg / weight;
- double I = iavg / weight;
- double Q = qavg / weight;
- rec[0][i][j] = - (Y + 0.956 * I + 0.621 * Q);
- rec[1][i][j] = - (Y - 0.272 * I - 0.647 * Q);
- rec[2][i][j] = - (Y - 1.105 * I + 1.702 * Q);
- }
- }
-
- }
-
- bool change = false;
-
- for (int i = 0; i < dh; i++)
- for (int j = 0; j < dw; j++)
- for (int c = 0; c < 3; c++) {
- if (rec[c][i][j] < 0) {
- rec[c][i][j] = -rec[c][i][j];
- }
-
- change = true;
- }
-
- if (!change) {
- break;
- }
- }
- }
-
- int maxval = 0;
-
- for (int i = 0; i < dh; i++)
- for (int j = 0; j < dw; j++)
- for (int c = 0; c < 3; c++)
- if (rec[c][i][j] != INT_MAX && rec[c][i][j] > maxval) {
- maxval = rec[c][i][j];
- }
-
- for (int i = 0; i < dh; i++)
- for (int j = 0; j < dw; j++)
- if (rec[0][i][j] == INT_MAX || rec[1][i][j] == INT_MAX || rec[2][i][j] == INT_MAX) {
- rec[0][i][j] = maxval;
- rec[1][i][j] = maxval;
- rec[2][i][j] = maxval;
- }
-
- if (hrmap[0] != NULL) {
- freeArray (hrmap[0], dh);
- freeArray (hrmap[1], dh);
- freeArray (hrmap[2], dh);
- }
-
- hrmap[0] = allocArray (dw, dh);
- hrmap[1] = allocArray (dw, dh);
- hrmap[2] = allocArray (dw, dh);
-
- this->full = full;
-
- for (int i = 0; i < dh; i++)
- for (int j = 0; j < dw; j++) {
- hrmap[0][i][j] = (double)rec[0][i][j] / ds->r(i, j);
- hrmap[1][i][j] = (double)rec[1][i][j] / ds->g(i, j);
- hrmap[2][i][j] = (double)rec[2][i][j] / ds->b(i, j);
- }
-
- /* for (int i=0; ir(i,j) = CLIP (rec[0][i][j]);
- ds->g(i,j) = CLIP (rec[1][i][j]);
- ds->b(i,j) = CLIP (rec[2][i][j]);
- }
- ds->save ("test.png");
- */
- delete ds;
- freeArray (rec[0], dh);
- freeArray (rec[1], dh);
- freeArray (rec[2], dh);
-
- printf ("HLMap vege\n");
-}
-
-void RawImageSource::hlRecovery (unsigned short* red, unsigned short* green, unsigned short* blue, int i, int sx1, int sx2, int skip)
-{
-
- int blr = (i + SCALE / 2) / SCALE - 1;
-
- if (blr < 0 || blr >= H / SCALE - 1) {
- return;
- }
-
- double mr1 = 1.0 - ((double)((i + SCALE / 2) % SCALE) / SCALE + 0.5 / SCALE);
- int jx = 0;
- int maxcol = W / SCALE;
-
- for (int j = sx1, jx = 0; j < sx2; j += skip, jx++) {
- int blc = (j + SCALE / 2) / SCALE - 1;
-
- if (blc < 0 || blc >= maxcol - 1) {
- continue;
- }
-
- double mc1 = 1.0 - ((double)((j + SCALE / 2) % SCALE) / SCALE + 0.5 / SCALE);
- double mulr = mr1 * mc1 * hrmap[0][blr][blc] + mr1 * (1.0 - mc1) * hrmap[0][blr][blc + 1] + (1.0 - mr1) * mc1 * hrmap[0][blr + 1][blc] + (1.0 - mr1) * (1.0 - mc1) * hrmap[0][blr + 1][blc + 1];
- double mulg = mr1 * mc1 * hrmap[1][blr][blc] + mr1 * (1.0 - mc1) * hrmap[1][blr][blc + 1] + (1.0 - mr1) * mc1 * hrmap[1][blr + 1][blc] + (1.0 - mr1) * (1.0 - mc1) * hrmap[1][blr + 1][blc + 1];
- double mulb = mr1 * mc1 * hrmap[2][blr][blc] + mr1 * (1.0 - mc1) * hrmap[2][blr][blc + 1] + (1.0 - mr1) * mc1 * hrmap[2][blr + 1][blc] + (1.0 - mr1) * (1.0 - mc1) * hrmap[2][blr + 1][blc + 1];
- red[jx] = CLIP(red[jx] * mulr);
- green[jx] = CLIP(green[jx] * mulg);
- blue[jx] = CLIP(blue[jx] * mulb);
- }
-}
-}
-
diff --git a/rtengine/iccjpeg.cc b/rtengine/iccjpeg.cc
index fef281c49..31aa0ec7c 100644
--- a/rtengine/iccjpeg.cc
+++ b/rtengine/iccjpeg.cc
@@ -142,7 +142,9 @@ marker_is_icc (jpeg_saved_marker_ptr marker)
GETJOCTET(marker->data[8]) == 0x49 &&
GETJOCTET(marker->data[9]) == 0x4C &&
GETJOCTET(marker->data[10]) == 0x45 &&
- GETJOCTET(marker->data[11]) == 0x0;
+ GETJOCTET(marker->data[11]) == 0x0
+ ? TRUE
+ : FALSE;
}
@@ -180,7 +182,7 @@ read_icc_profile (j_decompress_ptr cinfo,
unsigned int data_length[MAX_SEQ_NO + 1]; /* size of profile data in marker */
unsigned int data_offset[MAX_SEQ_NO + 1]; /* offset for data in marker */
- *icc_data_ptr = NULL; /* avoid confusion if FALSE return */
+ *icc_data_ptr = nullptr; /* avoid confusion if FALSE return */
*icc_data_len = 0;
/* This first pass over the saved markers discovers whether there are
@@ -191,7 +193,7 @@ read_icc_profile (j_decompress_ptr cinfo,
marker_present[seq_no] = 0;
}
- for (marker = cinfo->marker_list; marker != NULL; marker = marker->next) {
+ for (marker = cinfo->marker_list; marker != nullptr; marker = marker->next) {
if (marker_is_icc(marker)) {
if (num_markers == 0) {
num_markers = GETJOCTET(marker->data[13]);
@@ -236,12 +238,12 @@ read_icc_profile (j_decompress_ptr cinfo,
/* Allocate space for assembled data */
icc_data = (JOCTET *) malloc(total_length * sizeof(JOCTET));
- if (icc_data == NULL) {
+ if (icc_data == nullptr) {
return FALSE; /* oops, out of memory */
}
/* and fill it in */
- for (marker = cinfo->marker_list; marker != NULL; marker = marker->next) {
+ for (marker = cinfo->marker_list; marker != nullptr; marker = marker->next) {
if (marker_is_icc(marker)) {
JOCTET FAR *src_ptr;
JOCTET *dst_ptr;
diff --git a/rtengine/iccstore.cc b/rtengine/iccstore.cc
index 82f280e54..3cb9b4a71 100644
--- a/rtengine/iccstore.cc
+++ b/rtengine/iccstore.cc
@@ -32,14 +32,15 @@
#include "../rtgui/options.h"
-namespace
+namespace rtengine
{
+extern const Settings* settings;
void loadProfiles (const Glib::ustring& dirName,
std::map* profiles,
- std::map* profileContents,
+ std::map* profileContents,
std::map* profileNames,
- bool nameUpper, bool onlyRgb)
+ bool nameUpper)
{
if (dirName.empty ()) {
return;
@@ -76,10 +77,10 @@ void loadProfiles (const Glib::ustring& dirName,
}
if (profiles) {
- const rtengine::ProfileContent content (filePath);
+ const ProfileContent content (filePath);
const cmsHPROFILE profile = content.toProfile ();
- if (profile && (!onlyRgb || cmsGetColorSpace (profile) == cmsSigRgbData)) {
+ if (profile) {
profiles->insert (std::make_pair (name, profile));
if (profileContents) {
@@ -95,20 +96,20 @@ void loadProfiles (const Glib::ustring& dirName,
} catch (Glib::Exception&) {}
}
-inline void getSupportedIntent (cmsHPROFILE profile, cmsUInt32Number intent, cmsUInt32Number direction, std::uint8_t& result)
+inline void getSupportedIntent (cmsHPROFILE profile, cmsUInt32Number intent, cmsUInt32Number direction, uint8_t& result)
{
if (cmsIsIntentSupported (profile, intent, direction)) {
result |= 1 << intent;
}
}
-inline std::uint8_t getSupportedIntents (cmsHPROFILE profile, cmsUInt32Number direction)
+inline uint8_t getSupportedIntents (cmsHPROFILE profile, cmsUInt32Number direction)
{
if (!profile) {
return 0;
}
- std::uint8_t result = 0;
+ uint8_t result = 0;
getSupportedIntent (profile, INTENT_PERCEPTUAL, direction, result);
getSupportedIntent (profile, INTENT_RELATIVE_COLORIMETRIC, direction, result);
@@ -121,7 +122,7 @@ inline std::uint8_t getSupportedIntents (cmsHPROFILE profile, cmsUInt32Number di
inline cmsHPROFILE createXYZProfile ()
{
double mat[3][3] = { {1.0, 0, 0}, {0, 1.0, 0}, {0, 0, 1.0} };
- return rtengine::ICCStore::createFromMatrix (mat, false, "XYZ");
+ return ICCStore::createFromMatrix (mat, false, "XYZ");
}
const double (*wprofiles[])[3] = {xyz_sRGB, xyz_adobe, xyz_prophoto, xyz_widegamut, xyz_bruce, xyz_beta, xyz_best, xyz_rec2020};
@@ -164,7 +165,7 @@ std::vector getWorkingProfiles ()
return res;
}
-std::vector ICCStore::getProfiles () const
+std::vector ICCStore::getProfiles (const bool onlyRgb) const
{
MyMutex::MyLock lock(mutex_);
@@ -172,6 +173,7 @@ std::vector ICCStore::getProfiles () const
std::vector res;
for (ProfileMap::const_iterator profile = fileProfiles.begin (); profile != fileProfiles.end (); ++profile) {
+ if (!onlyRgb || (onlyRgb && cmsGetColorSpace (profile->second) == cmsSigRgbData))
res.push_back (profile->first);
}
@@ -187,8 +189,8 @@ std::vector ICCStore::getProfilesFromDir (const Glib::ustring& di
ProfileMap profiles;
- loadProfiles (profilesDir, &profiles, NULL, NULL, false, true);
- loadProfiles (dirName, &profiles, NULL, NULL, false, true);
+ loadProfiles (profilesDir, &profiles, nullptr, nullptr, false);
+ loadProfiles (dirName, &profiles, nullptr, nullptr, false);
for (ProfileMap::const_iterator profile = profiles.begin (); profile != profiles.end (); ++profile) {
res.push_back (profile->first);
@@ -201,14 +203,14 @@ cmsHPROFILE ICCStore::makeStdGammaProfile (cmsHPROFILE iprof)
{
// forgive me for the messy code, quick hack to change gamma of an ICC profile to the RT standard gamma
if (!iprof) {
- return NULL;
+ return nullptr;
}
cmsUInt32Number bytesNeeded = 0;
- cmsSaveProfileToMem(iprof, 0, &bytesNeeded);
+ cmsSaveProfileToMem(iprof, nullptr, &bytesNeeded);
if (bytesNeeded == 0) {
- return NULL;
+ return nullptr;
}
uint8_t *data = new uint8_t[bytesNeeded + 1];
@@ -362,6 +364,312 @@ cmsHPROFILE ICCStore::workingSpaceGamma (const Glib::ustring& name) const
}
}
+void ICCStore::getGammaArray(const procparams::ColorManagementParams &icm, GammaValues &ga)
+{
+ const double eps = 0.000000001; // not divide by zero
+ if (!icm.freegamma) {//if Free gamma not selected
+ // gamma : ga[0],ga[1],ga[2],ga[3],ga[4],ga[5] by calcul
+ if(icm.gamma == "BT709_g2.2_s4.5") {
+ ga[0] = 2.22; //BT709 2.2 4.5 - my preferred as D.Coffin
+ ga[1] = 0.909995;
+ ga[2] = 0.090005;
+ ga[3] = 0.222222;
+ ga[4] = 0.081071;
+ } else if (icm.gamma == "sRGB_g2.4_s12.92") {
+ ga[0] = 2.40; //sRGB 2.4 12.92 - RT default as Lightroom
+ ga[1] = 0.947858;
+ ga[2] = 0.052142;
+ ga[3] = 0.077399;
+ ga[4] = 0.039293;
+ } else if (icm.gamma == "High_g1.3_s3.35") {
+ ga[0] = 1.3 ; //for high dynamic images
+ ga[1] = 0.998279;
+ ga[2] = 0.001721;
+ ga[3] = 0.298507;
+ ga[4] = 0.005746;
+ } else if (icm.gamma == "Low_g2.6_s6.9") {
+ ga[0] = 2.6 ; //gamma 2.6 variable : for low contrast images
+ ga[1] = 0.891161;
+ ga[2] = 0.108839;
+ ga[3] = 0.144928;
+ ga[4] = 0.076332;
+ } else if (icm.gamma == "standard_g2.2") {
+ ga[0] = 2.2; //gamma=2.2 (as gamma of Adobe, Widegamut...)
+ ga[1] = 1.;
+ ga[2] = 0.;
+ ga[3] = 1. / eps;
+ ga[4] = 0.;
+ } else if (icm.gamma == "standard_g1.8") {
+ ga[0] = 1.8; //gamma=1.8 (as gamma of Prophoto)
+ ga[1] = 1.;
+ ga[2] = 0.;
+ ga[3] = 1. / eps;
+ ga[4] = 0.;
+ } else /* if (icm.gamma == "linear_g1.0") */ {
+ ga[0] = 1.0; //gamma=1 linear : for high dynamic images (cf : D.Coffin...)
+ ga[1] = 1.;
+ ga[2] = 0.;
+ ga[3] = 1. / eps;
+ ga[4] = 0.;
+ }
+ ga[5] = 0.0;
+ ga[6] = 0.0;
+ } else { //free gamma selected
+ GammaValues g_a; //gamma parameters
+ double pwr = 1.0 / icm.gampos;
+ double ts = icm.slpos;
+ double slope = icm.slpos == 0 ? eps : icm.slpos;
+
+ int mode = 0, imax = 0;
+ Color::calcGamma(pwr, ts, mode, imax, g_a); // call to calcGamma with selected gamma and slope : return parameters for LCMS2
+ ga[4] = g_a[3] * ts;
+ //printf("g_a.gamma0=%f g_a.gamma1=%f g_a.gamma2=%f g_a.gamma3=%f g_a.gamma4=%f\n", g_a.gamma0,g_a.gamma1,g_a.gamma2,g_a.gamma3,g_a.gamma4);
+ ga[0] = icm.gampos;
+ ga[1] = 1. / (1.0 + g_a[4]);
+ ga[2] = g_a[4] / (1.0 + g_a[4]);
+ ga[3] = 1. / slope;
+ ga[5] = 0.0;
+ ga[6] = 0.0;
+ //printf("ga[0]=%f ga[1]=%f ga[2]=%f ga[3]=%f ga[4]=%f\n", ga[0],ga[1],ga[2],ga[3],ga[4]);
+ }
+}
+
+// WARNING: the caller must lock lcmsMutex
+cmsHPROFILE ICCStore::createGammaProfile (const procparams::ColorManagementParams &icm, GammaValues &ga) {
+ float p[6]; //primaries
+ ga[6] = 0.0;
+
+ enum class ColorTemp {
+ D50 = 5003, // for Widegamut, Prophoto Best, Beta -> D50
+ D65 = 6504 // for sRGB, AdobeRGB, Bruce Rec2020 -> D65
+ };
+ ColorTemp temp = ColorTemp::D50;
+
+ //primaries for 7 working profiles ==> output profiles
+ // eventually to adapt primaries if RT used special profiles !
+ if (icm.output == "WideGamut") {
+ p[0] = 0.7350; //Widegamut primaries
+ p[1] = 0.2650;
+ p[2] = 0.1150;
+ p[3] = 0.8260;
+ p[4] = 0.1570;
+ p[5] = 0.0180;
+ } else if (icm.output == "Adobe RGB") {
+ p[0] = 0.6400; //Adobe primaries
+ p[1] = 0.3300;
+ p[2] = 0.2100;
+ p[3] = 0.7100;
+ p[4] = 0.1500;
+ p[5] = 0.0600;
+ temp = ColorTemp::D65;
+ } else if (icm.output == "sRGB") {
+ p[0] = 0.6400; // sRGB primaries
+ p[1] = 0.3300;
+ p[2] = 0.3000;
+ p[3] = 0.6000;
+ p[4] = 0.1500;
+ p[5] = 0.0600;
+ temp = ColorTemp::D65;
+ } else if (icm.output == "BruceRGB") {
+ p[0] = 0.6400; // Bruce primaries
+ p[1] = 0.3300;
+ p[2] = 0.2800;
+ p[3] = 0.6500;
+ p[4] = 0.1500;
+ p[5] = 0.0600;
+ temp = ColorTemp::D65;
+ } else if (icm.output == "Beta RGB") {
+ p[0] = 0.6888; // Beta primaries
+ p[1] = 0.3112;
+ p[2] = 0.1986;
+ p[3] = 0.7551;
+ p[4] = 0.1265;
+ p[5] = 0.0352;
+ } else if (icm.output == "BestRGB") {
+ p[0] = 0.7347; // Best primaries
+ p[1] = 0.2653;
+ p[2] = 0.2150;
+ p[3] = 0.7750;
+ p[4] = 0.1300;
+ p[5] = 0.0350;
+ } else if (icm.output == "Rec2020") {
+ p[0] = 0.7080; // Rec2020 primaries
+ p[1] = 0.2920;
+ p[2] = 0.1700;
+ p[3] = 0.7970;
+ p[4] = 0.1310;
+ p[5] = 0.0460;
+ temp = ColorTemp::D65;
+ } else {
+ p[0] = 0.7347; //ProPhoto and default primaries
+ p[1] = 0.2653;
+ p[2] = 0.1596;
+ p[3] = 0.8404;
+ p[4] = 0.0366;
+ p[5] = 0.0001;
+ }
+
+ cmsCIExyY xyD;
+ cmsCIExyYTRIPLE Primaries = {
+ {p[0], p[1], 1.0}, // red
+ {p[2], p[3], 1.0}, // green
+ {p[4], p[5], 1.0} // blue
+ };
+ cmsToneCurve* GammaTRC[3];
+
+ // 7 parameters for smoother curves
+ cmsFloat64Number Parameters[7] = { ga[0], ga[1], ga[2], ga[3], ga[4], ga[5], ga[6] } ;
+
+ //lcmsMutex->lock (); Mutex acquired by the caller
+ cmsWhitePointFromTemp(&xyD, (double)temp);
+ GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(nullptr, 5, Parameters); //5 = smoother than 4
+ cmsHPROFILE oprofdef = cmsCreateRGBProfile(&xyD, &Primaries, GammaTRC); //oprofdef become Outputprofile
+ cmsFreeToneCurve(GammaTRC[0]);
+ //lcmsMutex->unlock ();
+
+ return oprofdef;
+}
+
+// WARNING: the caller must lock lcmsMutex
+cmsHPROFILE ICCStore::createCustomGammaOutputProfile (const procparams::ColorManagementParams &icm, GammaValues &ga) {
+ bool pro = false;
+ Glib::ustring outProfile;
+ cmsHPROFILE outputProfile = nullptr;
+
+ if (icm.freegamma && icm.gampos < 1.35) {
+ pro = true; //select profil with gammaTRC modified :
+ } else if (icm.gamma == "linear_g1.0" || (icm.gamma == "High_g1.3_s3.35")) {
+ pro = true; //pro=0 RT_sRGB || Prophoto
+ }
+
+ // Check that output profiles exist, otherwise use LCMS2
+ // Use the icc/icm profiles associated to possible working profiles, set in "options"
+ if (icm.working == "ProPhoto" && iccStore->outputProfileExist(options.rtSettings.prophoto) && !pro) {
+ outProfile = options.rtSettings.prophoto;
+ } else if (icm.working == "Adobe RGB" && iccStore->outputProfileExist(options.rtSettings.adobe) ) {
+ outProfile = options.rtSettings.adobe;
+ } else if (icm.working == "WideGamut" && iccStore->outputProfileExist(options.rtSettings.widegamut) ) {
+ outProfile = options.rtSettings.widegamut;
+ } else if (icm.working == "Beta RGB" && iccStore->outputProfileExist(options.rtSettings.beta) ) {
+ outProfile = options.rtSettings.beta;
+ } else if (icm.working == "BestRGB" && iccStore->outputProfileExist(options.rtSettings.best) ) {
+ outProfile = options.rtSettings.best;
+ } else if (icm.working == "BruceRGB" && iccStore->outputProfileExist(options.rtSettings.bruce) ) {
+ outProfile = options.rtSettings.bruce;
+ } else if (icm.working == "sRGB" && iccStore->outputProfileExist(options.rtSettings.srgb) && !pro) {
+ outProfile = options.rtSettings.srgb;
+ } else if (icm.working == "sRGB" && iccStore->outputProfileExist(options.rtSettings.srgb10) && pro) {
+ outProfile = options.rtSettings.srgb10;
+ } else if (icm.working == "ProPhoto" && iccStore->outputProfileExist(options.rtSettings.prophoto10) && pro) {
+ outProfile = options.rtSettings.prophoto10;
+ } else if (icm.working == "Rec2020" && iccStore->outputProfileExist(options.rtSettings.rec2020) ) {
+ outProfile = options.rtSettings.rec2020;
+ } else {
+ // Should not occurs
+ if (settings->verbose) {
+ printf("\"%s\": unknown working profile! - use LCMS2 substitution\n", icm.working.c_str() );
+ }
+
+ return nullptr;
+ }
+
+ //begin adaptation rTRC gTRC bTRC
+ //"outputProfile" profile has the same characteristics than RGB values, but TRC are adapted... for applying profile
+ if (settings->verbose) {
+ printf("Output Gamma - profile: \"%s\"\n", outProfile.c_str() ); //c_str()
+ }
+
+ outputProfile = iccStore->getProfile(outProfile); //get output profile
+
+ if (outputProfile == nullptr) {
+
+ if (settings->verbose) {
+ printf("\"%s\" ICC output profile not found!\n", outProfile.c_str());
+ }
+ return nullptr;
+ }
+
+ // 7 parameters for smoother curves
+ cmsFloat64Number Parameters[7] = { ga[0], ga[1], ga[2], ga[3], ga[4], ga[5], ga[6] };
+
+ //change desc Tag , to "free gamma", or "BT709", etc.
+ cmsMLU *mlu;
+ cmsContext ContextID = cmsGetProfileContextID(outputProfile); // create context to modify some TAGs
+ mlu = cmsMLUalloc(ContextID, 1);
+
+ // instruction with //ICC are used to generate ICC profile
+ if (mlu == nullptr) {
+ printf("Description error\n");
+ } else {
+
+ // Description TAG : selection of gamma and Primaries
+ if (!icm.freegamma) {
+ std::wstring gammaStr;
+
+ if(icm.gamma == "High_g1.3_s3.35") {
+ gammaStr = std::wstring(L"GammaTRC: High g=1.3 s=3.35");
+ } else if (icm.gamma == "Low_g2.6_s6.9") {
+ gammaStr = std::wstring(L"GammaTRC: Low g=2.6 s=6.9");
+ } else if (icm.gamma == "sRGB_g2.4_s12.92") {
+ gammaStr = std::wstring(L"GammaTRC: sRGB g=2.4 s=12.92");
+ } else if (icm.gamma == "BT709_g2.2_s4.5") {
+ gammaStr = std::wstring(L"GammaTRC: BT709 g=2.2 s=4.5");
+ } else if (icm.gamma == "linear_g1.0") {
+ gammaStr = std::wstring(L"GammaTRC: Linear g=1.0");
+ } else if (icm.gamma == "standard_g2.2") {
+ gammaStr = std::wstring(L"GammaTRC: g=2.2");
+ } else if (icm.gamma == "standard_g1.8") {
+ gammaStr = std::wstring(L"GammaTRC: g=1.8");
+ }
+
+ cmsMLUsetWide(mlu, "en", "US", gammaStr.c_str());
+ } else {
+ // create description with gamma + slope + primaries
+ std::wostringstream gammaWs;
+ gammaWs.precision(2);
+ gammaWs << "Manual GammaTRC: g=" << (float)icm.gampos << " s=" << (float)icm.slpos;
+
+ cmsMLUsetWide(mlu, "en", "US", gammaWs.str().c_str());
+ }
+
+ cmsWriteTag(outputProfile, cmsSigProfileDescriptionTag, mlu);//desc changed
+
+ /*
+ cmsMLUsetWide(mlu, "en", "US", L"General Public License - AdobeRGB compatible");//adapt to profil
+ cmsWriteTag(outputProfile, cmsSigCopyrightTag, mlu);
+
+ cmsMLUsetWide(mlu, "en", "US", L"RawTherapee");
+ cmsWriteTag(outputProfile, cmsSigDeviceMfgDescTag, mlu);
+
+ cmsMLUsetWide(mlu, "en", "US", L"RTMedium"); //adapt to profil
+ cmsWriteTag(outputProfile, cmsSigDeviceModelDescTag, mlu);
+
+ */
+
+ cmsMLUfree (mlu);
+ }
+
+ // Calculate output profile's rTRC gTRC bTRC
+ cmsToneCurve* GammaTRC = nullptr;
+ GammaTRC = cmsBuildParametricToneCurve(nullptr, 5, Parameters);
+ cmsWriteTag(outputProfile, cmsSigRedTRCTag, (void*)GammaTRC );
+ cmsWriteTag(outputProfile, cmsSigGreenTRCTag, (void*)GammaTRC );
+ cmsWriteTag(outputProfile, cmsSigBlueTRCTag, (void*)GammaTRC );
+
+ if (GammaTRC) {
+ cmsFreeToneCurve(GammaTRC);
+ }
+
+ return outputProfile;
+}
+
+bool ICCStore::outputProfileExist (const Glib::ustring& name) const
+{
+
+ MyMutex::MyLock lock(mutex_);
+ return fileProfiles.find(name) != fileProfiles.end();
+}
+
cmsHPROFILE ICCStore::getProfile (const Glib::ustring& name) const
{
@@ -407,7 +715,7 @@ cmsHPROFILE ICCStore::getStdProfile (const Glib::ustring& name) const
// profile does not exist
if (f == fileStdProfilesFileNames.end ()) {
- return NULL;
+ return nullptr;
}
// but there exists one => load it
@@ -433,21 +741,21 @@ ProfileContent ICCStore::getContent (const Glib::ustring& name) const
return r != fileProfileContents.end () ? r->second : ProfileContent();
}
-std::uint8_t ICCStore::getInputIntents (cmsHPROFILE profile) const
+uint8_t ICCStore::getInputIntents (cmsHPROFILE profile) const
{
MyMutex::MyLock lock (mutex_);
return getSupportedIntents (profile, LCMS_USED_AS_INPUT);
}
-std::uint8_t ICCStore::getOutputIntents (cmsHPROFILE profile) const
+uint8_t ICCStore::getOutputIntents (cmsHPROFILE profile) const
{
MyMutex::MyLock lock (mutex_);
return getSupportedIntents (profile, LCMS_USED_AS_OUTPUT);
}
-std::uint8_t ICCStore::getProofIntents (cmsHPROFILE profile) const
+uint8_t ICCStore::getProofIntents (cmsHPROFILE profile) const
{
MyMutex::MyLock lock (mutex_);
@@ -464,15 +772,15 @@ void ICCStore::init (const Glib::ustring& usrICCDir, const Glib::ustring& rtICCD
profilesDir = Glib::build_filename (rtICCDir, "output");
fileProfiles.clear();
fileProfileContents.clear();
- loadProfiles (profilesDir, &fileProfiles, &fileProfileContents, NULL, false, true);
- loadProfiles (usrICCDir, &fileProfiles, &fileProfileContents, NULL, false, true);
+ loadProfiles (profilesDir, &fileProfiles, &fileProfileContents, nullptr, false);
+ loadProfiles (usrICCDir, &fileProfiles, &fileProfileContents, nullptr, false);
// Input profiles
// Load these to different areas, since the short name (e.g. "NIKON D700" may overlap between system/user and RT dir)
stdProfilesDir = Glib::build_filename (rtICCDir, "input");
fileStdProfiles.clear();
fileStdProfilesFileNames.clear();
- loadProfiles (stdProfilesDir, NULL, NULL, &fileStdProfilesFileNames, true, false);
+ loadProfiles (stdProfilesDir, nullptr, nullptr, &fileStdProfilesFileNames, true);
}
// Determine the first monitor default profile of operating system, if selected
@@ -515,7 +823,7 @@ void ICCStore::findDefaultMonitorProfile ()
}
}
-ProfileContent::ProfileContent (const Glib::ustring& fileName) : data(NULL), length(0)
+ProfileContent::ProfileContent (const Glib::ustring& fileName) : data(nullptr), length(0)
{
FILE* f = g_fopen (fileName.c_str (), "rb");
@@ -542,16 +850,16 @@ ProfileContent::ProfileContent (const ProfileContent& other)
data = new char[length + 1];
memcpy (data, other.data, length + 1);
} else {
- data = NULL;
+ data = nullptr;
}
}
-ProfileContent::ProfileContent (cmsHPROFILE hProfile) : data(NULL), length(0)
+ProfileContent::ProfileContent (cmsHPROFILE hProfile) : data(nullptr), length(0)
{
- if (hProfile != NULL) {
+ if (hProfile != nullptr) {
cmsUInt32Number bytesNeeded = 0;
- cmsSaveProfileToMem(hProfile, 0, &bytesNeeded);
+ cmsSaveProfileToMem(hProfile, nullptr, &bytesNeeded);
if (bytesNeeded > 0) {
data = new char[bytesNeeded + 1];
@@ -573,7 +881,7 @@ ProfileContent& ProfileContent::operator= (const ProfileContent& other)
data = new char[length + 1];
memcpy (data, other.data, length + 1);
} else {
- data = NULL;
+ data = nullptr;
}
return *this;
@@ -585,7 +893,7 @@ cmsHPROFILE ProfileContent::toProfile () const
if (data) {
return cmsOpenProfileFromMem (data, length);
} else {
- return NULL;
+ return nullptr;
}
}
diff --git a/rtengine/iccstore.h b/rtengine/iccstore.h
index 8b6e6465c..bb9693f1a 100644
--- a/rtengine/iccstore.h
+++ b/rtengine/iccstore.h
@@ -23,6 +23,9 @@
#include
#include